@vanya2h/utils-rxjs 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ StatusEnum: () => StatusEnum,
24
+ batcher: () => batcher,
25
+ createCache: () => createCache,
26
+ createFulfilled: () => createFulfilled,
27
+ createIdle: () => createIdle,
28
+ createPending: () => createPending,
29
+ createRejected: () => createRejected,
30
+ createWrappedPromise: () => createWrappedPromise,
31
+ getBehaviorSubjectPersistor: () => getBehaviorSubjectPersistor,
32
+ getPersistorFactory: () => getPersistorFactory,
33
+ getStubTransport: () => getStubTransport,
34
+ localStorageTransport: () => localStorageTransport,
35
+ toArrayPersistor: () => toArrayPersistor
36
+ });
37
+ module.exports = __toCommonJS(src_exports);
38
+
39
+ // src/batcher/index.ts
40
+ var import_rxjs = require("rxjs");
41
+ function batcher(waitTime) {
42
+ return (source$) => new import_rxjs.Observable((observer) => {
43
+ let buffer = [];
44
+ let timerId = null;
45
+ const emitBuffer = () => {
46
+ if (buffer.length > 0) {
47
+ observer.next([...buffer]);
48
+ buffer = [];
49
+ }
50
+ clearTimeout(timerId);
51
+ timerId = null;
52
+ };
53
+ const sub = source$.subscribe({
54
+ next: (value) => {
55
+ buffer.push(value);
56
+ if (!timerId) {
57
+ timerId = setTimeout(() => {
58
+ emitBuffer();
59
+ }, waitTime);
60
+ }
61
+ },
62
+ error: (err) => observer.error(err),
63
+ complete: () => {
64
+ emitBuffer();
65
+ observer.complete();
66
+ }
67
+ });
68
+ return () => {
69
+ clearTimeout(timerId);
70
+ sub.unsubscribe();
71
+ };
72
+ });
73
+ }
74
+
75
+ // src/createCache/index.ts
76
+ var import_rxjs2 = require("rxjs");
77
+ function createCache(buildSource, defaultValue$) {
78
+ const createFromSource = () => (0, import_rxjs2.of)(null).pipe(
79
+ (0, import_rxjs2.switchMap)(() => buildSource()),
80
+ (0, import_rxjs2.shareReplay)(1)
81
+ );
82
+ const source$ = new import_rxjs2.BehaviorSubject(defaultValue$ ?? createFromSource());
83
+ const value$ = source$.pipe((0, import_rxjs2.switchMap)(import_rxjs2.identity), (0, import_rxjs2.shareReplay)(1));
84
+ const next = () => {
85
+ const obs = createFromSource();
86
+ source$.next(obs);
87
+ return obs.pipe((0, import_rxjs2.take)(1));
88
+ };
89
+ return {
90
+ fresh: () => {
91
+ const obs = createFromSource();
92
+ source$.next(obs);
93
+ return obs;
94
+ },
95
+ value$,
96
+ next,
97
+ set: (value) => {
98
+ const obs = (0, import_rxjs2.of)(value);
99
+ source$.next(obs);
100
+ }
101
+ };
102
+ }
103
+
104
+ // src/persistBehaviorSubject/index.ts
105
+ var import_common = require("@vanya2h/utils/common");
106
+ var import_immutable = require("immutable");
107
+ var import_rxjs3 = require("rxjs");
108
+ function toArrayPersistor(persistor) {
109
+ return {
110
+ get: () => persistor.get(),
111
+ find: (predicate) => persistor.get().then((x) => x.filter(predicate)),
112
+ findAndRemove: (predicate) => persistor.get().then((x) => persistor.set(x.filter((x2) => !predicate(x2)))),
113
+ updateOne: (predicate, modifier) => persistor.get().then((x) => persistor.set(x.map((y) => predicate(y) ? modifier(y) : y))),
114
+ findOne: (predicate) => persistor.get().then((x) => {
115
+ const found = x.find(predicate);
116
+ if (found === void 0) throw new Error("Entity not found");
117
+ return found;
118
+ }),
119
+ findOneOrNull: async (predicate) => persistor.get().then((x) => x.find(predicate) ?? null),
120
+ add: (next) => persistor.get().then((x) => persistor.set([...x, next])).then(() => next)
121
+ };
122
+ }
123
+ var localStorageTransport = {
124
+ set: async (key, value) => {
125
+ if (typeof localStorage !== "undefined") {
126
+ try {
127
+ localStorage.setItem(key, value);
128
+ } catch (err) {
129
+ console.error("Can't set local storage value", err);
130
+ }
131
+ }
132
+ },
133
+ get: async (key) => {
134
+ if (typeof localStorage !== "undefined") {
135
+ return localStorage.getItem(key);
136
+ }
137
+ return null;
138
+ }
139
+ };
140
+ function getStubTransport() {
141
+ const map2 = (0, import_immutable.Map)();
142
+ return {
143
+ get: async (key) => map2.get(key) ?? null,
144
+ set: async (key, value) => {
145
+ map2.set(key, value);
146
+ }
147
+ };
148
+ }
149
+ function getPersistorFactory(prefix$, transport$) {
150
+ return (namespace, defaultValue$) => {
151
+ const path$ = prefix$.pipe((0, import_rxjs3.map)((x) => x + namespace));
152
+ const subject$ = new import_rxjs3.Subject();
153
+ const value$ = (0, import_rxjs3.combineLatest)([path$, transport$]).pipe(
154
+ (0, import_rxjs3.switchMap)(([path, transport]) => transport.get(path)),
155
+ (0, import_rxjs3.switchMap)((x) => x === null ? defaultValue$ : (0, import_rxjs3.of)(import_common.jsonSerializer.parse(x))),
156
+ (0, import_rxjs3.concatWith)(subject$)
157
+ );
158
+ return {
159
+ value$,
160
+ set: async (value) => {
161
+ await (0, import_rxjs3.lastValueFrom)(
162
+ (0, import_rxjs3.combineLatest)([path$, transport$]).pipe(
163
+ (0, import_rxjs3.tap)(([path, transport]) => transport.set(path, import_common.jsonSerializer.stringify(value))),
164
+ (0, import_rxjs3.take)(1)
165
+ )
166
+ );
167
+ return subject$.next(value);
168
+ },
169
+ get: () => (0, import_rxjs3.firstValueFrom)(value$)
170
+ };
171
+ };
172
+ }
173
+ function getBehaviorSubjectPersistor(initialValue) {
174
+ const subject = new import_rxjs3.BehaviorSubject(initialValue);
175
+ return {
176
+ value$: subject,
177
+ set: async (x) => subject.next(x),
178
+ get: async () => subject.getValue()
179
+ };
180
+ }
181
+
182
+ // src/wrapped/index.ts
183
+ var import_rxjs4 = require("rxjs");
184
+ var StatusEnum = /* @__PURE__ */ ((StatusEnum2) => {
185
+ StatusEnum2["IDLE"] = "IDLE";
186
+ StatusEnum2["PENDING"] = "PENDING";
187
+ StatusEnum2["FULFILLED"] = "FULFILLED";
188
+ StatusEnum2["REJECTED"] = "REJECTED";
189
+ return StatusEnum2;
190
+ })(StatusEnum || {});
191
+ function createIdle() {
192
+ return {
193
+ type: "IDLE" /* IDLE */
194
+ };
195
+ }
196
+ function createPending(args) {
197
+ return {
198
+ type: "PENDING" /* PENDING */,
199
+ args
200
+ };
201
+ }
202
+ function createFulfilled(args, value) {
203
+ return {
204
+ type: "FULFILLED" /* FULFILLED */,
205
+ value,
206
+ args
207
+ };
208
+ }
209
+ function createRejected(args, error) {
210
+ return {
211
+ type: "REJECTED" /* REJECTED */,
212
+ error,
213
+ args
214
+ };
215
+ }
216
+ function createWrappedPromise(fn) {
217
+ const status$ = new import_rxjs4.BehaviorSubject(createIdle());
218
+ return {
219
+ status$,
220
+ result$: status$.pipe(
221
+ (0, import_rxjs4.switchMap)((x) => x.type === "FULFILLED" /* FULFILLED */ ? (0, import_rxjs4.of)(x.value) : import_rxjs4.EMPTY),
222
+ (0, import_rxjs4.shareReplay)(1)
223
+ ),
224
+ reset: () => status$.next(createIdle()),
225
+ run: async (...args) => {
226
+ status$.next(createPending(args));
227
+ try {
228
+ const val = await fn(...args);
229
+ status$.next(createFulfilled(args, val));
230
+ return val;
231
+ } catch (error) {
232
+ status$.next(createRejected(args, error));
233
+ throw error;
234
+ }
235
+ }
236
+ };
237
+ }
238
+ // Annotate the CommonJS export names for ESM import in node:
239
+ 0 && (module.exports = {
240
+ StatusEnum,
241
+ batcher,
242
+ createCache,
243
+ createFulfilled,
244
+ createIdle,
245
+ createPending,
246
+ createRejected,
247
+ createWrappedPromise,
248
+ getBehaviorSubjectPersistor,
249
+ getPersistorFactory,
250
+ getStubTransport,
251
+ localStorageTransport,
252
+ toArrayPersistor
253
+ });
@@ -0,0 +1,77 @@
1
+ import { OperatorFunction, Observable } from 'rxjs';
2
+ import { JsonValue } from '@vanya2h/utils/common';
3
+
4
+ declare function batcher<T>(waitTime: number): OperatorFunction<T, T[]>;
5
+
6
+ type ICache<T> = {
7
+ next: () => Observable<T>;
8
+ set: (val: T) => void;
9
+ fresh: () => Observable<T>;
10
+ value$: Observable<T>;
11
+ };
12
+ declare function createCache<T>(buildSource: () => Observable<T>, defaultValue$?: Observable<T>): ICache<T>;
13
+
14
+ type IPersistorTransport = {
15
+ get: (key: string) => Promise<string | null>;
16
+ set: (key: string, value: string) => Promise<void>;
17
+ };
18
+ type IPersistor<T extends JsonValue> = {
19
+ value$: Observable<T>;
20
+ set: (value: T) => Promise<void>;
21
+ get: () => Promise<T>;
22
+ };
23
+ type IArrayPersistor<T extends JsonValue> = {
24
+ get: () => Promise<T[]>;
25
+ find: (predicate: (val: T) => boolean) => Promise<T[]>;
26
+ findAndRemove: (predicate: (val: T) => boolean) => Promise<void>;
27
+ updateOne: (predicate: (val: T) => boolean, modifier: (prev: T) => T) => Promise<void>;
28
+ findOne: (predicate: (val: T) => boolean) => Promise<T>;
29
+ findOneOrNull: (predicate: (val: T) => boolean) => Promise<T | null>;
30
+ add: (next: T) => Promise<T>;
31
+ };
32
+ declare function toArrayPersistor<T extends JsonValue>(persistor: IPersistor<T[]>): IArrayPersistor<T>;
33
+ declare const localStorageTransport: IPersistorTransport;
34
+ declare function getStubTransport(): IPersistorTransport;
35
+ declare function getPersistorFactory(prefix$: Observable<string>, transport$: Observable<IPersistorTransport>): <T extends JsonValue>(namespace: string, defaultValue$: Observable<T>) => IPersistor<T>;
36
+ declare function getBehaviorSubjectPersistor<T extends JsonValue>(initialValue: T): IPersistor<T>;
37
+
38
+ declare enum StatusEnum {
39
+ IDLE = "IDLE",
40
+ PENDING = "PENDING",
41
+ FULFILLED = "FULFILLED",
42
+ REJECTED = "REJECTED"
43
+ }
44
+ type IWrapped<Args extends any[], Result, K extends StatusEnum = StatusEnum> = {
45
+ [StatusEnum.IDLE]: {
46
+ type: StatusEnum.IDLE;
47
+ };
48
+ [StatusEnum.PENDING]: {
49
+ type: StatusEnum.PENDING;
50
+ args: Args;
51
+ };
52
+ [StatusEnum.FULFILLED]: {
53
+ type: StatusEnum.FULFILLED;
54
+ args: Args;
55
+ value: Result;
56
+ };
57
+ [StatusEnum.REJECTED]: {
58
+ type: StatusEnum.REJECTED;
59
+ args: Args;
60
+ error: unknown;
61
+ };
62
+ }[K] & {
63
+ type: K;
64
+ };
65
+ declare function createIdle<Args extends any[], Result>(): IWrapped<Args, Result, StatusEnum.IDLE>;
66
+ declare function createPending<Args extends any[], Result>(args: Args): IWrapped<Args, Result, StatusEnum.PENDING>;
67
+ declare function createFulfilled<Args extends any[], Result>(args: Args, value: Result): IWrapped<Args, Result, StatusEnum.FULFILLED>;
68
+ declare function createRejected<Args extends any[], Result>(args: Args, error: unknown): IWrapped<Args, Result, StatusEnum.REJECTED>;
69
+ type IWrappedPromise<Args extends any[], Result> = {
70
+ status$: Observable<IWrapped<Args, Result>>;
71
+ result$: Observable<Result>;
72
+ reset: () => void;
73
+ run: (...args: Args) => Promise<Result>;
74
+ };
75
+ declare function createWrappedPromise<Args extends any[], Result>(fn: (...args: Args) => Promise<Result>): IWrappedPromise<Args, Result>;
76
+
77
+ export { type IArrayPersistor, type ICache, type IPersistor, type IPersistorTransport, type IWrapped, type IWrappedPromise, StatusEnum, batcher, createCache, createFulfilled, createIdle, createPending, createRejected, createWrappedPromise, getBehaviorSubjectPersistor, getPersistorFactory, getStubTransport, localStorageTransport, toArrayPersistor };
@@ -0,0 +1,77 @@
1
+ import { OperatorFunction, Observable } from 'rxjs';
2
+ import { JsonValue } from '@vanya2h/utils/common';
3
+
4
+ declare function batcher<T>(waitTime: number): OperatorFunction<T, T[]>;
5
+
6
+ type ICache<T> = {
7
+ next: () => Observable<T>;
8
+ set: (val: T) => void;
9
+ fresh: () => Observable<T>;
10
+ value$: Observable<T>;
11
+ };
12
+ declare function createCache<T>(buildSource: () => Observable<T>, defaultValue$?: Observable<T>): ICache<T>;
13
+
14
+ type IPersistorTransport = {
15
+ get: (key: string) => Promise<string | null>;
16
+ set: (key: string, value: string) => Promise<void>;
17
+ };
18
+ type IPersistor<T extends JsonValue> = {
19
+ value$: Observable<T>;
20
+ set: (value: T) => Promise<void>;
21
+ get: () => Promise<T>;
22
+ };
23
+ type IArrayPersistor<T extends JsonValue> = {
24
+ get: () => Promise<T[]>;
25
+ find: (predicate: (val: T) => boolean) => Promise<T[]>;
26
+ findAndRemove: (predicate: (val: T) => boolean) => Promise<void>;
27
+ updateOne: (predicate: (val: T) => boolean, modifier: (prev: T) => T) => Promise<void>;
28
+ findOne: (predicate: (val: T) => boolean) => Promise<T>;
29
+ findOneOrNull: (predicate: (val: T) => boolean) => Promise<T | null>;
30
+ add: (next: T) => Promise<T>;
31
+ };
32
+ declare function toArrayPersistor<T extends JsonValue>(persistor: IPersistor<T[]>): IArrayPersistor<T>;
33
+ declare const localStorageTransport: IPersistorTransport;
34
+ declare function getStubTransport(): IPersistorTransport;
35
+ declare function getPersistorFactory(prefix$: Observable<string>, transport$: Observable<IPersistorTransport>): <T extends JsonValue>(namespace: string, defaultValue$: Observable<T>) => IPersistor<T>;
36
+ declare function getBehaviorSubjectPersistor<T extends JsonValue>(initialValue: T): IPersistor<T>;
37
+
38
+ declare enum StatusEnum {
39
+ IDLE = "IDLE",
40
+ PENDING = "PENDING",
41
+ FULFILLED = "FULFILLED",
42
+ REJECTED = "REJECTED"
43
+ }
44
+ type IWrapped<Args extends any[], Result, K extends StatusEnum = StatusEnum> = {
45
+ [StatusEnum.IDLE]: {
46
+ type: StatusEnum.IDLE;
47
+ };
48
+ [StatusEnum.PENDING]: {
49
+ type: StatusEnum.PENDING;
50
+ args: Args;
51
+ };
52
+ [StatusEnum.FULFILLED]: {
53
+ type: StatusEnum.FULFILLED;
54
+ args: Args;
55
+ value: Result;
56
+ };
57
+ [StatusEnum.REJECTED]: {
58
+ type: StatusEnum.REJECTED;
59
+ args: Args;
60
+ error: unknown;
61
+ };
62
+ }[K] & {
63
+ type: K;
64
+ };
65
+ declare function createIdle<Args extends any[], Result>(): IWrapped<Args, Result, StatusEnum.IDLE>;
66
+ declare function createPending<Args extends any[], Result>(args: Args): IWrapped<Args, Result, StatusEnum.PENDING>;
67
+ declare function createFulfilled<Args extends any[], Result>(args: Args, value: Result): IWrapped<Args, Result, StatusEnum.FULFILLED>;
68
+ declare function createRejected<Args extends any[], Result>(args: Args, error: unknown): IWrapped<Args, Result, StatusEnum.REJECTED>;
69
+ type IWrappedPromise<Args extends any[], Result> = {
70
+ status$: Observable<IWrapped<Args, Result>>;
71
+ result$: Observable<Result>;
72
+ reset: () => void;
73
+ run: (...args: Args) => Promise<Result>;
74
+ };
75
+ declare function createWrappedPromise<Args extends any[], Result>(fn: (...args: Args) => Promise<Result>): IWrappedPromise<Args, Result>;
76
+
77
+ export { type IArrayPersistor, type ICache, type IPersistor, type IPersistorTransport, type IWrapped, type IWrappedPromise, StatusEnum, batcher, createCache, createFulfilled, createIdle, createPending, createRejected, createWrappedPromise, getBehaviorSubjectPersistor, getPersistorFactory, getStubTransport, localStorageTransport, toArrayPersistor };
package/dist/index.js ADDED
@@ -0,0 +1,226 @@
1
+ // src/batcher/index.ts
2
+ import { Observable } from "rxjs";
3
+ function batcher(waitTime) {
4
+ return (source$) => new Observable((observer) => {
5
+ let buffer = [];
6
+ let timerId = null;
7
+ const emitBuffer = () => {
8
+ if (buffer.length > 0) {
9
+ observer.next([...buffer]);
10
+ buffer = [];
11
+ }
12
+ clearTimeout(timerId);
13
+ timerId = null;
14
+ };
15
+ const sub = source$.subscribe({
16
+ next: (value) => {
17
+ buffer.push(value);
18
+ if (!timerId) {
19
+ timerId = setTimeout(() => {
20
+ emitBuffer();
21
+ }, waitTime);
22
+ }
23
+ },
24
+ error: (err) => observer.error(err),
25
+ complete: () => {
26
+ emitBuffer();
27
+ observer.complete();
28
+ }
29
+ });
30
+ return () => {
31
+ clearTimeout(timerId);
32
+ sub.unsubscribe();
33
+ };
34
+ });
35
+ }
36
+
37
+ // src/createCache/index.ts
38
+ import { BehaviorSubject, identity, of, shareReplay, switchMap, take } from "rxjs";
39
+ function createCache(buildSource, defaultValue$) {
40
+ const createFromSource = () => of(null).pipe(
41
+ switchMap(() => buildSource()),
42
+ shareReplay(1)
43
+ );
44
+ const source$ = new BehaviorSubject(defaultValue$ ?? createFromSource());
45
+ const value$ = source$.pipe(switchMap(identity), shareReplay(1));
46
+ const next = () => {
47
+ const obs = createFromSource();
48
+ source$.next(obs);
49
+ return obs.pipe(take(1));
50
+ };
51
+ return {
52
+ fresh: () => {
53
+ const obs = createFromSource();
54
+ source$.next(obs);
55
+ return obs;
56
+ },
57
+ value$,
58
+ next,
59
+ set: (value) => {
60
+ const obs = of(value);
61
+ source$.next(obs);
62
+ }
63
+ };
64
+ }
65
+
66
+ // src/persistBehaviorSubject/index.ts
67
+ import { jsonSerializer } from "@vanya2h/utils/common";
68
+ import { Map } from "immutable";
69
+ import {
70
+ BehaviorSubject as BehaviorSubject2,
71
+ combineLatest,
72
+ concatWith,
73
+ firstValueFrom,
74
+ lastValueFrom,
75
+ map,
76
+ of as of2,
77
+ Subject,
78
+ switchMap as switchMap2,
79
+ take as take2,
80
+ tap
81
+ } from "rxjs";
82
+ function toArrayPersistor(persistor) {
83
+ return {
84
+ get: () => persistor.get(),
85
+ find: (predicate) => persistor.get().then((x) => x.filter(predicate)),
86
+ findAndRemove: (predicate) => persistor.get().then((x) => persistor.set(x.filter((x2) => !predicate(x2)))),
87
+ updateOne: (predicate, modifier) => persistor.get().then((x) => persistor.set(x.map((y) => predicate(y) ? modifier(y) : y))),
88
+ findOne: (predicate) => persistor.get().then((x) => {
89
+ const found = x.find(predicate);
90
+ if (found === void 0) throw new Error("Entity not found");
91
+ return found;
92
+ }),
93
+ findOneOrNull: async (predicate) => persistor.get().then((x) => x.find(predicate) ?? null),
94
+ add: (next) => persistor.get().then((x) => persistor.set([...x, next])).then(() => next)
95
+ };
96
+ }
97
+ var localStorageTransport = {
98
+ set: async (key, value) => {
99
+ if (typeof localStorage !== "undefined") {
100
+ try {
101
+ localStorage.setItem(key, value);
102
+ } catch (err) {
103
+ console.error("Can't set local storage value", err);
104
+ }
105
+ }
106
+ },
107
+ get: async (key) => {
108
+ if (typeof localStorage !== "undefined") {
109
+ return localStorage.getItem(key);
110
+ }
111
+ return null;
112
+ }
113
+ };
114
+ function getStubTransport() {
115
+ const map2 = Map();
116
+ return {
117
+ get: async (key) => map2.get(key) ?? null,
118
+ set: async (key, value) => {
119
+ map2.set(key, value);
120
+ }
121
+ };
122
+ }
123
+ function getPersistorFactory(prefix$, transport$) {
124
+ return (namespace, defaultValue$) => {
125
+ const path$ = prefix$.pipe(map((x) => x + namespace));
126
+ const subject$ = new Subject();
127
+ const value$ = combineLatest([path$, transport$]).pipe(
128
+ switchMap2(([path, transport]) => transport.get(path)),
129
+ switchMap2((x) => x === null ? defaultValue$ : of2(jsonSerializer.parse(x))),
130
+ concatWith(subject$)
131
+ );
132
+ return {
133
+ value$,
134
+ set: async (value) => {
135
+ await lastValueFrom(
136
+ combineLatest([path$, transport$]).pipe(
137
+ tap(([path, transport]) => transport.set(path, jsonSerializer.stringify(value))),
138
+ take2(1)
139
+ )
140
+ );
141
+ return subject$.next(value);
142
+ },
143
+ get: () => firstValueFrom(value$)
144
+ };
145
+ };
146
+ }
147
+ function getBehaviorSubjectPersistor(initialValue) {
148
+ const subject = new BehaviorSubject2(initialValue);
149
+ return {
150
+ value$: subject,
151
+ set: async (x) => subject.next(x),
152
+ get: async () => subject.getValue()
153
+ };
154
+ }
155
+
156
+ // src/wrapped/index.ts
157
+ import { BehaviorSubject as BehaviorSubject3, EMPTY, of as of3, shareReplay as shareReplay2, switchMap as switchMap3 } from "rxjs";
158
+ var StatusEnum = /* @__PURE__ */ ((StatusEnum2) => {
159
+ StatusEnum2["IDLE"] = "IDLE";
160
+ StatusEnum2["PENDING"] = "PENDING";
161
+ StatusEnum2["FULFILLED"] = "FULFILLED";
162
+ StatusEnum2["REJECTED"] = "REJECTED";
163
+ return StatusEnum2;
164
+ })(StatusEnum || {});
165
+ function createIdle() {
166
+ return {
167
+ type: "IDLE" /* IDLE */
168
+ };
169
+ }
170
+ function createPending(args) {
171
+ return {
172
+ type: "PENDING" /* PENDING */,
173
+ args
174
+ };
175
+ }
176
+ function createFulfilled(args, value) {
177
+ return {
178
+ type: "FULFILLED" /* FULFILLED */,
179
+ value,
180
+ args
181
+ };
182
+ }
183
+ function createRejected(args, error) {
184
+ return {
185
+ type: "REJECTED" /* REJECTED */,
186
+ error,
187
+ args
188
+ };
189
+ }
190
+ function createWrappedPromise(fn) {
191
+ const status$ = new BehaviorSubject3(createIdle());
192
+ return {
193
+ status$,
194
+ result$: status$.pipe(
195
+ switchMap3((x) => x.type === "FULFILLED" /* FULFILLED */ ? of3(x.value) : EMPTY),
196
+ shareReplay2(1)
197
+ ),
198
+ reset: () => status$.next(createIdle()),
199
+ run: async (...args) => {
200
+ status$.next(createPending(args));
201
+ try {
202
+ const val = await fn(...args);
203
+ status$.next(createFulfilled(args, val));
204
+ return val;
205
+ } catch (error) {
206
+ status$.next(createRejected(args, error));
207
+ throw error;
208
+ }
209
+ }
210
+ };
211
+ }
212
+ export {
213
+ StatusEnum,
214
+ batcher,
215
+ createCache,
216
+ createFulfilled,
217
+ createIdle,
218
+ createPending,
219
+ createRejected,
220
+ createWrappedPromise,
221
+ getBehaviorSubjectPersistor,
222
+ getPersistorFactory,
223
+ getStubTransport,
224
+ localStorageTransport,
225
+ toArrayPersistor
226
+ };
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@vanya2h/utils-rxjs",
3
+ "version": "0.1.0-rc.1",
4
+ "description": "RxJS utilities and operators",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.cjs"
12
+ }
13
+ },
14
+ "main": "./dist/index.js",
15
+ "module": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "files": [
18
+ "dist",
19
+ "package.json"
20
+ ],
21
+ "dependencies": {
22
+ "rxjs": "^7.8.1",
23
+ "immutable": "^5.1.5",
24
+ "@vanya2h/utils": "0.5.0-rc.1"
25
+ },
26
+ "devDependencies": {
27
+ "eslint": "^9.21.0",
28
+ "jiti": "^2.4.2",
29
+ "rimraf": "^6.0.1",
30
+ "tsup": "^8.3.6",
31
+ "tsx": "^4.19.2",
32
+ "vitest": "^3.0.5",
33
+ "@vanya2h/eslint-config": "0.5.0-rc.1",
34
+ "@vanya2h/typescript-config": "0.5.0-rc.1"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public",
38
+ "registry": "https://registry.npmjs.org"
39
+ },
40
+ "scripts": {
41
+ "build": "tsup",
42
+ "check-types": "tsc -b --noEmit",
43
+ "clean": "rimraf ./dist",
44
+ "dev": "tsup --watch --silent",
45
+ "lint": "eslint .",
46
+ "lint:fix": "eslint . --fix",
47
+ "test": "vitest run --passWithNoTests"
48
+ }
49
+ }