@signaltree/core 9.2.2 → 9.5.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/README.md +42 -27
- package/dist/Action.js +15 -0
- package/dist/AsyncAction.js +91 -0
- package/dist/AsyncScheduler.js +37 -0
- package/dist/ObjectUnsubscribedError.js +11 -0
- package/dist/Observable.js +103 -0
- package/dist/OperatorSubscriber.js +62 -0
- package/dist/Scheduler.js +17 -0
- package/dist/Subject.js +162 -0
- package/dist/Subscriber.js +153 -0
- package/dist/Subscription.js +144 -0
- package/dist/UnsubscriptionError.js +14 -0
- package/dist/args.js +10 -0
- package/dist/arrRemove.js +8 -0
- package/dist/async.js +6 -0
- package/dist/config.js +4 -0
- package/dist/createErrorClass.js +12 -0
- package/dist/dateTimestampProvider.js +6 -0
- package/dist/debounceTime.js +46 -0
- package/dist/distinctUntilChanged.js +25 -0
- package/dist/enhancers/devtools/devtools.js +11 -5
- package/dist/enhancers/time-travel/time-travel.js +11 -5
- package/dist/errorContext.js +7 -0
- package/dist/executeSchedule.js +19 -0
- package/dist/filter.js +11 -0
- package/dist/from.js +8 -0
- package/dist/identity.js +5 -0
- package/dist/index.js +4 -0
- package/dist/innerFrom.js +145 -0
- package/dist/intervalProvider.js +17 -0
- package/dist/isArrayLike.js +3 -0
- package/dist/isAsyncIterable.js +7 -0
- package/dist/isFunction.js +5 -0
- package/dist/isInteropObservable.js +8 -0
- package/dist/isIterable.js +8 -0
- package/dist/isObservable.js +8 -0
- package/dist/isPromise.js +7 -0
- package/dist/isReadableStreamLike.js +40 -0
- package/dist/isScheduler.js +7 -0
- package/dist/iterator.js +9 -0
- package/dist/lib/internals/intercept-leaf-signals.js +4 -2
- package/dist/lib/markers/async-query.js +134 -0
- package/dist/lib/markers/async-source.js +122 -0
- package/dist/lib/rxjs-interop/rx-method.js +50 -0
- package/dist/lib/write-context.js +15 -0
- package/dist/lift.js +22 -0
- package/dist/noop.js +3 -0
- package/dist/observable2.js +3 -0
- package/dist/observeOn.js +12 -0
- package/dist/of.js +13 -0
- package/dist/pipe.js +15 -0
- package/dist/reportUnhandledError.js +11 -0
- package/dist/rxjs-interop.js +1 -0
- package/dist/scheduleArray.js +20 -0
- package/dist/scheduleAsyncIterable.js +25 -0
- package/dist/scheduleIterable.js +34 -0
- package/dist/scheduleObservable.js +9 -0
- package/dist/schedulePromise.js +9 -0
- package/dist/scheduleReadableStreamLike.js +8 -0
- package/dist/scheduled.js +39 -0
- package/dist/subscribeOn.js +10 -0
- package/dist/switchMap.js +26 -0
- package/dist/tap.js +42 -0
- package/dist/throwUnobservableError.js +5 -0
- package/dist/timeoutProvider.js +17 -0
- package/package.json +6 -1
- package/src/index.d.ts +5 -1
- package/src/lib/internals/intercept-leaf-signals.d.ts +4 -1
- package/src/lib/markers/async-query.d.ts +31 -0
- package/src/lib/markers/async-source.d.ts +27 -0
- package/src/lib/markers/index.d.ts +2 -0
- package/src/lib/rxjs-interop/index.d.ts +1 -0
- package/src/lib/rxjs-interop/rx-method.d.ts +11 -0
- package/src/lib/types.d.ts +8 -0
- package/src/lib/write-context.d.ts +3 -0
- package/src/rxjs-interop.d.ts +1 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { __values, __awaiter, __generator, __asyncValues } from 'tslib';
|
|
2
|
+
import { isArrayLike } from './isArrayLike.js';
|
|
3
|
+
import { isPromise } from './isPromise.js';
|
|
4
|
+
import { Observable } from './Observable.js';
|
|
5
|
+
import { isInteropObservable } from './isInteropObservable.js';
|
|
6
|
+
import { isAsyncIterable } from './isAsyncIterable.js';
|
|
7
|
+
import { createInvalidObservableTypeError } from './throwUnobservableError.js';
|
|
8
|
+
import { isIterable } from './isIterable.js';
|
|
9
|
+
import { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from './isReadableStreamLike.js';
|
|
10
|
+
import { isFunction } from './isFunction.js';
|
|
11
|
+
import { reportUnhandledError } from './reportUnhandledError.js';
|
|
12
|
+
import { observable } from './observable2.js';
|
|
13
|
+
|
|
14
|
+
function innerFrom(input) {
|
|
15
|
+
if (input instanceof Observable) {
|
|
16
|
+
return input;
|
|
17
|
+
}
|
|
18
|
+
if (input != null) {
|
|
19
|
+
if (isInteropObservable(input)) {
|
|
20
|
+
return fromInteropObservable(input);
|
|
21
|
+
}
|
|
22
|
+
if (isArrayLike(input)) {
|
|
23
|
+
return fromArrayLike(input);
|
|
24
|
+
}
|
|
25
|
+
if (isPromise(input)) {
|
|
26
|
+
return fromPromise(input);
|
|
27
|
+
}
|
|
28
|
+
if (isAsyncIterable(input)) {
|
|
29
|
+
return fromAsyncIterable(input);
|
|
30
|
+
}
|
|
31
|
+
if (isIterable(input)) {
|
|
32
|
+
return fromIterable(input);
|
|
33
|
+
}
|
|
34
|
+
if (isReadableStreamLike(input)) {
|
|
35
|
+
return fromReadableStreamLike(input);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
throw createInvalidObservableTypeError(input);
|
|
39
|
+
}
|
|
40
|
+
function fromInteropObservable(obj) {
|
|
41
|
+
return new Observable(function (subscriber) {
|
|
42
|
+
var obs = obj[observable]();
|
|
43
|
+
if (isFunction(obs.subscribe)) {
|
|
44
|
+
return obs.subscribe(subscriber);
|
|
45
|
+
}
|
|
46
|
+
throw new TypeError('Provided object does not correctly implement Symbol.observable');
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function fromArrayLike(array) {
|
|
50
|
+
return new Observable(function (subscriber) {
|
|
51
|
+
for (var i = 0; i < array.length && !subscriber.closed; i++) {
|
|
52
|
+
subscriber.next(array[i]);
|
|
53
|
+
}
|
|
54
|
+
subscriber.complete();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function fromPromise(promise) {
|
|
58
|
+
return new Observable(function (subscriber) {
|
|
59
|
+
promise
|
|
60
|
+
.then(function (value) {
|
|
61
|
+
if (!subscriber.closed) {
|
|
62
|
+
subscriber.next(value);
|
|
63
|
+
subscriber.complete();
|
|
64
|
+
}
|
|
65
|
+
}, function (err) { return subscriber.error(err); })
|
|
66
|
+
.then(null, reportUnhandledError);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function fromIterable(iterable) {
|
|
70
|
+
return new Observable(function (subscriber) {
|
|
71
|
+
var e_1, _a;
|
|
72
|
+
try {
|
|
73
|
+
for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
|
|
74
|
+
var value = iterable_1_1.value;
|
|
75
|
+
subscriber.next(value);
|
|
76
|
+
if (subscriber.closed) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
82
|
+
finally {
|
|
83
|
+
try {
|
|
84
|
+
if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);
|
|
85
|
+
}
|
|
86
|
+
finally { if (e_1) throw e_1.error; }
|
|
87
|
+
}
|
|
88
|
+
subscriber.complete();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function fromAsyncIterable(asyncIterable) {
|
|
92
|
+
return new Observable(function (subscriber) {
|
|
93
|
+
process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function fromReadableStreamLike(readableStream) {
|
|
97
|
+
return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
|
|
98
|
+
}
|
|
99
|
+
function process(asyncIterable, subscriber) {
|
|
100
|
+
var asyncIterable_1, asyncIterable_1_1;
|
|
101
|
+
var e_2, _a;
|
|
102
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
103
|
+
var value, e_2_1;
|
|
104
|
+
return __generator(this, function (_b) {
|
|
105
|
+
switch (_b.label) {
|
|
106
|
+
case 0:
|
|
107
|
+
_b.trys.push([0, 5, 6, 11]);
|
|
108
|
+
asyncIterable_1 = __asyncValues(asyncIterable);
|
|
109
|
+
_b.label = 1;
|
|
110
|
+
case 1: return [4, asyncIterable_1.next()];
|
|
111
|
+
case 2:
|
|
112
|
+
if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];
|
|
113
|
+
value = asyncIterable_1_1.value;
|
|
114
|
+
subscriber.next(value);
|
|
115
|
+
if (subscriber.closed) {
|
|
116
|
+
return [2];
|
|
117
|
+
}
|
|
118
|
+
_b.label = 3;
|
|
119
|
+
case 3: return [3, 1];
|
|
120
|
+
case 4: return [3, 11];
|
|
121
|
+
case 5:
|
|
122
|
+
e_2_1 = _b.sent();
|
|
123
|
+
e_2 = { error: e_2_1 };
|
|
124
|
+
return [3, 11];
|
|
125
|
+
case 6:
|
|
126
|
+
_b.trys.push([6, , 9, 10]);
|
|
127
|
+
if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];
|
|
128
|
+
return [4, _a.call(asyncIterable_1)];
|
|
129
|
+
case 7:
|
|
130
|
+
_b.sent();
|
|
131
|
+
_b.label = 8;
|
|
132
|
+
case 8: return [3, 10];
|
|
133
|
+
case 9:
|
|
134
|
+
if (e_2) throw e_2.error;
|
|
135
|
+
return [7];
|
|
136
|
+
case 10: return [7];
|
|
137
|
+
case 11:
|
|
138
|
+
subscriber.complete();
|
|
139
|
+
return [2];
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export { fromArrayLike, fromAsyncIterable, fromInteropObservable, fromIterable, fromPromise, fromReadableStreamLike, innerFrom };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { __spreadArray, __read } from 'tslib';
|
|
2
|
+
|
|
3
|
+
var intervalProvider = {
|
|
4
|
+
setInterval: function (handler, timeout) {
|
|
5
|
+
var args = [];
|
|
6
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
7
|
+
args[_i - 2] = arguments[_i];
|
|
8
|
+
}
|
|
9
|
+
return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));
|
|
10
|
+
},
|
|
11
|
+
clearInterval: function (handle) {
|
|
12
|
+
return (clearInterval)(handle);
|
|
13
|
+
},
|
|
14
|
+
delegate: undefined,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { intervalProvider };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { __asyncGenerator, __generator, __await } from 'tslib';
|
|
2
|
+
import { isFunction } from './isFunction.js';
|
|
3
|
+
|
|
4
|
+
function readableStreamLikeToAsyncGenerator(readableStream) {
|
|
5
|
+
return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
|
|
6
|
+
var reader, _a, value, done;
|
|
7
|
+
return __generator(this, function (_b) {
|
|
8
|
+
switch (_b.label) {
|
|
9
|
+
case 0:
|
|
10
|
+
reader = readableStream.getReader();
|
|
11
|
+
_b.label = 1;
|
|
12
|
+
case 1:
|
|
13
|
+
_b.trys.push([1, , 9, 10]);
|
|
14
|
+
_b.label = 2;
|
|
15
|
+
case 2:
|
|
16
|
+
return [4, __await(reader.read())];
|
|
17
|
+
case 3:
|
|
18
|
+
_a = _b.sent(), value = _a.value, done = _a.done;
|
|
19
|
+
if (!done) return [3, 5];
|
|
20
|
+
return [4, __await(void 0)];
|
|
21
|
+
case 4: return [2, _b.sent()];
|
|
22
|
+
case 5: return [4, __await(value)];
|
|
23
|
+
case 6: return [4, _b.sent()];
|
|
24
|
+
case 7:
|
|
25
|
+
_b.sent();
|
|
26
|
+
return [3, 2];
|
|
27
|
+
case 8: return [3, 10];
|
|
28
|
+
case 9:
|
|
29
|
+
reader.releaseLock();
|
|
30
|
+
return [7];
|
|
31
|
+
case 10: return [2];
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function isReadableStreamLike(obj) {
|
|
37
|
+
return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { isReadableStreamLike, readableStreamLikeToAsyncGenerator };
|
package/dist/iterator.js
ADDED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getActiveWriteContext } from '../write-context.js';
|
|
2
|
+
|
|
1
3
|
function interceptLeafSignals(root, onWrite, options = {}) {
|
|
2
4
|
const restorers = [];
|
|
3
5
|
const seen = new WeakSet();
|
|
@@ -38,13 +40,13 @@ function interceptLeafSignals(root, onWrite, options = {}) {
|
|
|
38
40
|
const prev = original();
|
|
39
41
|
originalSet(value);
|
|
40
42
|
const next = original();
|
|
41
|
-
if (next !== prev) onWrite(childPath, next, prev);
|
|
43
|
+
if (next !== prev) onWrite(childPath, next, prev, getActiveWriteContext());
|
|
42
44
|
};
|
|
43
45
|
original.update = updater => {
|
|
44
46
|
const prev = original();
|
|
45
47
|
originalUpdate(updater);
|
|
46
48
|
const next = original();
|
|
47
|
-
if (next !== prev) onWrite(childPath, next, prev);
|
|
49
|
+
if (next !== prev) onWrite(childPath, next, prev, getActiveWriteContext());
|
|
48
50
|
};
|
|
49
51
|
continue;
|
|
50
52
|
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { signal, inject, DestroyRef, effect, untracked } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { registerMarkerProcessor } from '../internals/materialize-markers.js';
|
|
4
|
+
import { Subject } from '../../Subject.js';
|
|
5
|
+
import { debounceTime } from '../../debounceTime.js';
|
|
6
|
+
import { tap } from '../../tap.js';
|
|
7
|
+
import { filter } from '../../filter.js';
|
|
8
|
+
import { distinctUntilChanged } from '../../distinctUntilChanged.js';
|
|
9
|
+
import { switchMap } from '../../switchMap.js';
|
|
10
|
+
import { isObservable } from '../../isObservable.js';
|
|
11
|
+
import { Observable } from '../../Observable.js';
|
|
12
|
+
import { of } from '../../of.js';
|
|
13
|
+
|
|
14
|
+
const ASYNC_QUERY_MARKER = Symbol('ASYNC_QUERY_MARKER');
|
|
15
|
+
let asyncQueryRegistered = false;
|
|
16
|
+
function asyncQuery(config) {
|
|
17
|
+
if (!asyncQueryRegistered) {
|
|
18
|
+
asyncQueryRegistered = true;
|
|
19
|
+
registerMarkerProcessor(isAsyncQueryMarker, createAsyncQuerySignal);
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
[ASYNC_QUERY_MARKER]: true,
|
|
23
|
+
config
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function isAsyncQueryMarker(value) {
|
|
27
|
+
return value !== null && typeof value === 'object' && ASYNC_QUERY_MARKER in value && value[ASYNC_QUERY_MARKER] === true;
|
|
28
|
+
}
|
|
29
|
+
function createAsyncQuerySignal(marker) {
|
|
30
|
+
const {
|
|
31
|
+
initialInput,
|
|
32
|
+
initialResult,
|
|
33
|
+
query,
|
|
34
|
+
debounce = 0,
|
|
35
|
+
filter: predicate,
|
|
36
|
+
equal = Object.is
|
|
37
|
+
} = marker.config;
|
|
38
|
+
const inputSignal = signal(initialInput);
|
|
39
|
+
const resultsSignal = signal(initialResult);
|
|
40
|
+
const loadingSignal = signal(false);
|
|
41
|
+
const errorSignal = signal(null);
|
|
42
|
+
let destroyed = false;
|
|
43
|
+
const trigger$ = new Subject();
|
|
44
|
+
let destroyRef = null;
|
|
45
|
+
try {
|
|
46
|
+
destroyRef = inject(DestroyRef, {
|
|
47
|
+
optional: true
|
|
48
|
+
}) ?? null;
|
|
49
|
+
} catch {
|
|
50
|
+
destroyRef = null;
|
|
51
|
+
}
|
|
52
|
+
destroyRef?.onDestroy(() => {
|
|
53
|
+
destroyed = true;
|
|
54
|
+
trigger$.complete();
|
|
55
|
+
});
|
|
56
|
+
const pipeline$ = trigger$.pipe(debounce > 0 ? debounceTime(debounce) : tap(), predicate ? filter(predicate) : tap(), distinctUntilChanged(equal), tap(() => {
|
|
57
|
+
loadingSignal.set(true);
|
|
58
|
+
errorSignal.set(null);
|
|
59
|
+
}), switchMap(input => {
|
|
60
|
+
try {
|
|
61
|
+
const r = query(input);
|
|
62
|
+
if (isObservable(r)) {
|
|
63
|
+
return r;
|
|
64
|
+
}
|
|
65
|
+
return new Observable(subscriber => {
|
|
66
|
+
r.then(v => {
|
|
67
|
+
subscriber.next(v);
|
|
68
|
+
subscriber.complete();
|
|
69
|
+
}, err => subscriber.error(err));
|
|
70
|
+
});
|
|
71
|
+
} catch (err) {
|
|
72
|
+
return of(undefined).pipe(tap(() => {
|
|
73
|
+
errorSignal.set(err);
|
|
74
|
+
loadingSignal.set(false);
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
}), tap({
|
|
78
|
+
next: value => {
|
|
79
|
+
if (destroyed) return;
|
|
80
|
+
resultsSignal.set(value);
|
|
81
|
+
loadingSignal.set(false);
|
|
82
|
+
},
|
|
83
|
+
error: err => {
|
|
84
|
+
if (destroyed) return;
|
|
85
|
+
errorSignal.set(err);
|
|
86
|
+
loadingSignal.set(false);
|
|
87
|
+
}
|
|
88
|
+
}));
|
|
89
|
+
(destroyRef ? pipeline$.pipe(takeUntilDestroyed(destroyRef)) : pipeline$).subscribe({
|
|
90
|
+
error: err => {
|
|
91
|
+
if (destroyed) return;
|
|
92
|
+
errorSignal.set(err);
|
|
93
|
+
loadingSignal.set(false);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
try {
|
|
97
|
+
effect(() => {
|
|
98
|
+
const v = inputSignal();
|
|
99
|
+
if (v === undefined) return;
|
|
100
|
+
untracked(() => trigger$.next(v));
|
|
101
|
+
}, {
|
|
102
|
+
manualCleanup: false
|
|
103
|
+
});
|
|
104
|
+
} catch {}
|
|
105
|
+
const fn = () => resultsSignal();
|
|
106
|
+
Object.defineProperty(fn, 'input', {
|
|
107
|
+
value: inputSignal
|
|
108
|
+
});
|
|
109
|
+
Object.defineProperty(fn, 'results', {
|
|
110
|
+
value: resultsSignal.asReadonly()
|
|
111
|
+
});
|
|
112
|
+
Object.defineProperty(fn, 'data', {
|
|
113
|
+
value: resultsSignal.asReadonly()
|
|
114
|
+
});
|
|
115
|
+
Object.defineProperty(fn, 'loading', {
|
|
116
|
+
value: loadingSignal.asReadonly()
|
|
117
|
+
});
|
|
118
|
+
Object.defineProperty(fn, 'error', {
|
|
119
|
+
value: errorSignal.asReadonly()
|
|
120
|
+
});
|
|
121
|
+
fn.rerun = () => {
|
|
122
|
+
const cur = inputSignal();
|
|
123
|
+
if (cur !== undefined) trigger$.next(cur);
|
|
124
|
+
};
|
|
125
|
+
fn.reset = () => {
|
|
126
|
+
loadingSignal.set(false);
|
|
127
|
+
errorSignal.set(null);
|
|
128
|
+
resultsSignal.set(initialResult);
|
|
129
|
+
inputSignal.set(initialInput);
|
|
130
|
+
};
|
|
131
|
+
return fn;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export { ASYNC_QUERY_MARKER, asyncQuery, createAsyncQuerySignal, isAsyncQueryMarker };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { signal, inject, DestroyRef } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { registerMarkerProcessor } from '../internals/materialize-markers.js';
|
|
4
|
+
import { isObservable } from '../../isObservable.js';
|
|
5
|
+
|
|
6
|
+
const ASYNC_SOURCE_MARKER = Symbol('ASYNC_SOURCE_MARKER');
|
|
7
|
+
let asyncSourceRegistered = false;
|
|
8
|
+
function asyncSource(config) {
|
|
9
|
+
if (!asyncSourceRegistered) {
|
|
10
|
+
asyncSourceRegistered = true;
|
|
11
|
+
registerMarkerProcessor(isAsyncSourceMarker, createAsyncSourceSignal);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
[ASYNC_SOURCE_MARKER]: true,
|
|
15
|
+
config
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function isAsyncSourceMarker(value) {
|
|
19
|
+
return value !== null && typeof value === 'object' && ASYNC_SOURCE_MARKER in value && value[ASYNC_SOURCE_MARKER] === true;
|
|
20
|
+
}
|
|
21
|
+
function createAsyncSourceSignal(marker) {
|
|
22
|
+
const {
|
|
23
|
+
initial,
|
|
24
|
+
load,
|
|
25
|
+
lazy = false
|
|
26
|
+
} = marker.config;
|
|
27
|
+
const dataSignal = signal(initial);
|
|
28
|
+
const loadingSignal = signal(false);
|
|
29
|
+
const errorSignal = signal(null);
|
|
30
|
+
let currentSub = null;
|
|
31
|
+
let destroyed = false;
|
|
32
|
+
let destroyRef = null;
|
|
33
|
+
try {
|
|
34
|
+
destroyRef = inject(DestroyRef, {
|
|
35
|
+
optional: true
|
|
36
|
+
}) ?? null;
|
|
37
|
+
} catch {
|
|
38
|
+
destroyRef = null;
|
|
39
|
+
}
|
|
40
|
+
destroyRef?.onDestroy(() => {
|
|
41
|
+
destroyed = true;
|
|
42
|
+
currentSub?.unsubscribe();
|
|
43
|
+
currentSub = null;
|
|
44
|
+
});
|
|
45
|
+
function runLoad() {
|
|
46
|
+
if (destroyed) return;
|
|
47
|
+
currentSub?.unsubscribe();
|
|
48
|
+
currentSub = null;
|
|
49
|
+
loadingSignal.set(true);
|
|
50
|
+
errorSignal.set(null);
|
|
51
|
+
let result;
|
|
52
|
+
try {
|
|
53
|
+
result = load();
|
|
54
|
+
} catch (err) {
|
|
55
|
+
loadingSignal.set(false);
|
|
56
|
+
errorSignal.set(err);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (isObservable(result)) {
|
|
60
|
+
const obs = destroyRef ? result.pipe(takeUntilDestroyed(destroyRef)) : result;
|
|
61
|
+
currentSub = obs.subscribe({
|
|
62
|
+
next: value => {
|
|
63
|
+
if (destroyed) return;
|
|
64
|
+
dataSignal.set(value);
|
|
65
|
+
},
|
|
66
|
+
error: err => {
|
|
67
|
+
if (destroyed) return;
|
|
68
|
+
errorSignal.set(err);
|
|
69
|
+
loadingSignal.set(false);
|
|
70
|
+
},
|
|
71
|
+
complete: () => {
|
|
72
|
+
if (destroyed) return;
|
|
73
|
+
loadingSignal.set(false);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
result.then(value => {
|
|
78
|
+
if (destroyed) return;
|
|
79
|
+
dataSignal.set(value);
|
|
80
|
+
loadingSignal.set(false);
|
|
81
|
+
}, err => {
|
|
82
|
+
if (destroyed) return;
|
|
83
|
+
errorSignal.set(err);
|
|
84
|
+
loadingSignal.set(false);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!lazy) {
|
|
89
|
+
runLoad();
|
|
90
|
+
}
|
|
91
|
+
const fn = () => dataSignal();
|
|
92
|
+
Object.defineProperty(fn, 'data', {
|
|
93
|
+
value: dataSignal.asReadonly()
|
|
94
|
+
});
|
|
95
|
+
Object.defineProperty(fn, 'loading', {
|
|
96
|
+
value: loadingSignal.asReadonly()
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(fn, 'error', {
|
|
99
|
+
value: errorSignal.asReadonly()
|
|
100
|
+
});
|
|
101
|
+
fn.refresh = () => runLoad();
|
|
102
|
+
fn.set = value => {
|
|
103
|
+
currentSub?.unsubscribe();
|
|
104
|
+
currentSub = null;
|
|
105
|
+
loadingSignal.set(false);
|
|
106
|
+
errorSignal.set(null);
|
|
107
|
+
dataSignal.set(value);
|
|
108
|
+
};
|
|
109
|
+
fn.update = updater => {
|
|
110
|
+
dataSignal.update(updater);
|
|
111
|
+
};
|
|
112
|
+
fn.reset = () => {
|
|
113
|
+
currentSub?.unsubscribe();
|
|
114
|
+
currentSub = null;
|
|
115
|
+
loadingSignal.set(false);
|
|
116
|
+
errorSignal.set(null);
|
|
117
|
+
dataSignal.set(initial);
|
|
118
|
+
};
|
|
119
|
+
return fn;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export { ASYNC_SOURCE_MARKER, asyncSource, createAsyncSourceSignal, isAsyncSourceMarker };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { inject, DestroyRef, Injector, isSignal } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { Subject } from '../../Subject.js';
|
|
4
|
+
import { Subscription } from '../../Subscription.js';
|
|
5
|
+
import { isObservable } from '../../isObservable.js';
|
|
6
|
+
|
|
7
|
+
function rxMethod(generator, options) {
|
|
8
|
+
const destroyRef = options?.destroyRef ?? inject(DestroyRef);
|
|
9
|
+
const injector = options?.injector ?? inject(Injector);
|
|
10
|
+
const trigger$ = new Subject();
|
|
11
|
+
const sourceSubs = new Set();
|
|
12
|
+
let isDestroyed = false;
|
|
13
|
+
const masterSub = generator(trigger$.asObservable()).pipe(takeUntilDestroyed(destroyRef)).subscribe();
|
|
14
|
+
const fn = input => {
|
|
15
|
+
if (isDestroyed) return Subscription.EMPTY;
|
|
16
|
+
if (input === undefined) {
|
|
17
|
+
trigger$.next(undefined);
|
|
18
|
+
return Subscription.EMPTY;
|
|
19
|
+
}
|
|
20
|
+
if (isSignal(input)) {
|
|
21
|
+
const sub = toObservable(input, {
|
|
22
|
+
injector
|
|
23
|
+
}).pipe(takeUntilDestroyed(destroyRef)).subscribe(value => trigger$.next(value));
|
|
24
|
+
sourceSubs.add(sub);
|
|
25
|
+
sub.add(() => sourceSubs.delete(sub));
|
|
26
|
+
return sub;
|
|
27
|
+
}
|
|
28
|
+
if (isObservable(input)) {
|
|
29
|
+
const sub = input.pipe(takeUntilDestroyed(destroyRef)).subscribe(value => trigger$.next(value));
|
|
30
|
+
sourceSubs.add(sub);
|
|
31
|
+
sub.add(() => sourceSubs.delete(sub));
|
|
32
|
+
return sub;
|
|
33
|
+
}
|
|
34
|
+
trigger$.next(input);
|
|
35
|
+
return Subscription.EMPTY;
|
|
36
|
+
};
|
|
37
|
+
const method = fn;
|
|
38
|
+
method.destroy = () => {
|
|
39
|
+
if (isDestroyed) return;
|
|
40
|
+
isDestroyed = true;
|
|
41
|
+
masterSub.unsubscribe();
|
|
42
|
+
sourceSubs.forEach(s => s.unsubscribe());
|
|
43
|
+
sourceSubs.clear();
|
|
44
|
+
trigger$.complete();
|
|
45
|
+
};
|
|
46
|
+
destroyRef.onDestroy(() => method.destroy());
|
|
47
|
+
return method;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { rxMethod };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
let activeContext;
|
|
2
|
+
function withWriteContext(meta, fn) {
|
|
3
|
+
const previous = activeContext;
|
|
4
|
+
activeContext = meta;
|
|
5
|
+
try {
|
|
6
|
+
return fn();
|
|
7
|
+
} finally {
|
|
8
|
+
activeContext = previous;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function getActiveWriteContext() {
|
|
12
|
+
return activeContext;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { getActiveWriteContext, withWriteContext };
|
package/dist/lift.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { isFunction } from './isFunction.js';
|
|
2
|
+
|
|
3
|
+
function hasLift(source) {
|
|
4
|
+
return isFunction(source === null || source === void 0 ? void 0 : source.lift);
|
|
5
|
+
}
|
|
6
|
+
function operate(init) {
|
|
7
|
+
return function (source) {
|
|
8
|
+
if (hasLift(source)) {
|
|
9
|
+
return source.lift(function (liftedSource) {
|
|
10
|
+
try {
|
|
11
|
+
return init(liftedSource, this);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
this.error(err);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
throw new TypeError('Unable to lift unknown Observable type');
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { hasLift, operate };
|
package/dist/noop.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { executeSchedule } from './executeSchedule.js';
|
|
2
|
+
import { operate } from './lift.js';
|
|
3
|
+
import { createOperatorSubscriber } from './OperatorSubscriber.js';
|
|
4
|
+
|
|
5
|
+
function observeOn(scheduler, delay) {
|
|
6
|
+
if (delay === void 0) { delay = 0; }
|
|
7
|
+
return operate(function (source, subscriber) {
|
|
8
|
+
source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { observeOn };
|