@trpc/client 10.0.0-alpha.21 → 10.0.0-alpha.24
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.js +329 -276
- package/dist/index.mjs +317 -263
- package/dist/internals/TRPCClient.d.ts +12 -7
- package/dist/internals/TRPCClient.d.ts.map +1 -1
- package/dist/internals/dataLoader.d.ts +7 -6
- package/dist/internals/dataLoader.d.ts.map +1 -1
- package/dist/links/dedupeLink.d.ts.map +1 -1
- package/dist/links/httpBatchLink.d.ts +1 -1
- package/dist/links/httpBatchLink.d.ts.map +1 -1
- package/dist/links/index.d.ts +0 -2
- package/dist/links/index.d.ts.map +1 -1
- package/dist/links/internals/httpUtils.d.ts +15 -7
- package/dist/links/internals/httpUtils.d.ts.map +1 -1
- package/dist/links/internals/transformOperationResult.d.ts +17 -3
- package/dist/links/internals/transformOperationResult.d.ts.map +1 -1
- package/dist/links/loggerLink.d.ts.map +1 -1
- package/dist/links/retryLink.d.ts.map +1 -1
- package/dist/links/types.d.ts +10 -7
- package/dist/links/types.d.ts.map +1 -1
- package/dist/links/wsLink.d.ts +1 -1
- package/dist/links/wsLink.d.ts.map +1 -1
- package/links/wsLink/dist/trpc-client-links-wsLink.cjs.dev.js +2 -0
- package/links/wsLink/dist/trpc-client-links-wsLink.cjs.prod.js +2 -0
- package/links/wsLink/dist/trpc-client-links-wsLink.esm.js +2 -0
- package/package.json +5 -11
- package/src/internals/TRPCClient.ts +48 -24
- package/src/internals/dataLoader.ts +116 -54
- package/src/links/dedupeLink.test.ts +1 -1
- package/src/links/dedupeLink.ts +1 -2
- package/src/links/httpBatchLink.ts +54 -31
- package/src/links/httpLink.ts +3 -3
- package/src/links/index.ts +0 -2
- package/src/links/internals/createChain.test.ts +1 -1
- package/src/links/internals/createChain.ts +1 -1
- package/src/links/internals/httpUtils.ts +52 -31
- package/src/links/internals/transformOperationResult.ts +40 -12
- package/src/links/loggerLink.ts +1 -1
- package/src/links/retryLink.ts +1 -2
- package/src/links/splitLink.test.ts +1 -1
- package/src/links/splitLink.ts +4 -4
- package/src/links/types.ts +12 -7
- package/src/links/wsLink.ts +13 -10
- package/dist/links/transformerLink.d.ts +0 -4
- package/dist/links/transformerLink.d.ts.map +0 -1
- package/dist/observable/index.d.ts +0 -4
- package/dist/observable/index.d.ts.map +0 -1
- package/dist/observable/index.js +0 -38
- package/dist/observable/index.mjs +0 -31
- package/dist/observable/index.ts.js +0 -1
- package/dist/observable/internals/identity.d.ts +0 -2
- package/dist/observable/internals/identity.d.ts.map +0 -1
- package/dist/observable/internals/observableToPromise.d.ts +0 -10
- package/dist/observable/internals/observableToPromise.d.ts.map +0 -1
- package/dist/observable/internals/pipe.d.ts +0 -4
- package/dist/observable/internals/pipe.d.ts.map +0 -1
- package/dist/observable/observable.d.ts +0 -4
- package/dist/observable/observable.d.ts.map +0 -1
- package/dist/observable/operators/index.d.ts +0 -4
- package/dist/observable/operators/index.d.ts.map +0 -1
- package/dist/observable/operators/map.d.ts +0 -3
- package/dist/observable/operators/map.d.ts.map +0 -1
- package/dist/observable/operators/share.d.ts +0 -6
- package/dist/observable/operators/share.d.ts.map +0 -1
- package/dist/observable/operators/tap.d.ts +0 -3
- package/dist/observable/operators/tap.d.ts.map +0 -1
- package/dist/observable/types.d.ts +0 -29
- package/dist/observable/types.d.ts.map +0 -1
- package/dist/tap-0dcdee86.js +0 -243
- package/dist/tap-136a9a90.mjs +0 -239
- package/observable/dist/trpc-client-rx.cjs.d.ts +0 -1
- package/observable/dist/trpc-client-rx.cjs.dev.js +0 -9
- package/observable/dist/trpc-client-rx.cjs.js +0 -7
- package/observable/dist/trpc-client-rx.cjs.prod.js +0 -9
- package/observable/dist/trpc-client-rx.esm.js +0 -1
- package/observable/index.d.ts +0 -1
- package/observable/index.js +0 -1
- package/src/links/transformerLink.ts +0 -74
- package/src/observable/index.ts +0 -3
- package/src/observable/internals/identity.ts +0 -3
- package/src/observable/internals/observableToPromise.ts +0 -49
- package/src/observable/internals/pipe.ts +0 -22
- package/src/observable/observable.test.ts +0 -101
- package/src/observable/observable.ts +0 -70
- package/src/observable/operators/index.ts +0 -3
- package/src/observable/operators/map.test.ts +0 -92
- package/src/observable/operators/map.ts +0 -25
- package/src/observable/operators/share.test.ts +0 -60
- package/src/observable/operators/share.ts +0 -67
- package/src/observable/operators/tap.ts +0 -26
- package/src/observable/types.ts +0 -69
package/dist/tap-136a9a90.mjs
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
function identity(x) {
|
|
2
|
-
return x;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
/** @internal */
|
|
6
|
-
|
|
7
|
-
function pipeFromArray(fns) {
|
|
8
|
-
if (fns.length === 0) {
|
|
9
|
-
return identity;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
if (fns.length === 1) {
|
|
13
|
-
return fns[0];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return function piped(input) {
|
|
17
|
-
return fns.reduce(function (prev, fn) {
|
|
18
|
-
return fn(prev);
|
|
19
|
-
}, input);
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function observable(_subscribe) {
|
|
24
|
-
var self = {
|
|
25
|
-
subscribe: function subscribe(observer) {
|
|
26
|
-
var teardownRef = null;
|
|
27
|
-
var isDone = false;
|
|
28
|
-
var unsubscribed = false;
|
|
29
|
-
var teardownImmediately = false;
|
|
30
|
-
|
|
31
|
-
function unsubscribe() {
|
|
32
|
-
if (teardownRef === null) {
|
|
33
|
-
teardownImmediately = true;
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (unsubscribed) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
unsubscribed = true;
|
|
42
|
-
|
|
43
|
-
if (typeof teardownRef === 'function') {
|
|
44
|
-
teardownRef();
|
|
45
|
-
} else if (teardownRef) {
|
|
46
|
-
teardownRef.unsubscribe();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
teardownRef = _subscribe({
|
|
51
|
-
next: function next(value) {
|
|
52
|
-
var _observer$next;
|
|
53
|
-
|
|
54
|
-
if (isDone) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
(_observer$next = observer.next) === null || _observer$next === void 0 ? void 0 : _observer$next.call(observer, value);
|
|
59
|
-
},
|
|
60
|
-
error: function error(err) {
|
|
61
|
-
var _observer$error;
|
|
62
|
-
|
|
63
|
-
if (isDone) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
isDone = true;
|
|
68
|
-
(_observer$error = observer.error) === null || _observer$error === void 0 ? void 0 : _observer$error.call(observer, err);
|
|
69
|
-
unsubscribe();
|
|
70
|
-
},
|
|
71
|
-
complete: function complete() {
|
|
72
|
-
var _observer$complete;
|
|
73
|
-
|
|
74
|
-
if (isDone) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
isDone = true;
|
|
79
|
-
(_observer$complete = observer.complete) === null || _observer$complete === void 0 ? void 0 : _observer$complete.call(observer);
|
|
80
|
-
unsubscribe();
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
if (teardownImmediately) {
|
|
85
|
-
unsubscribe();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
unsubscribe: unsubscribe
|
|
90
|
-
};
|
|
91
|
-
},
|
|
92
|
-
pipe: function pipe() {
|
|
93
|
-
for (var _len = arguments.length, operations = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
94
|
-
operations[_key] = arguments[_key];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return pipeFromArray(operations)(self);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
return self;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
104
|
-
|
|
105
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
106
|
-
|
|
107
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
108
|
-
|
|
109
|
-
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
110
|
-
function share( // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
111
|
-
_opts) {
|
|
112
|
-
return function (originalObserver) {
|
|
113
|
-
var refCount = 0;
|
|
114
|
-
var subscription = null;
|
|
115
|
-
var observers = [];
|
|
116
|
-
|
|
117
|
-
function startIfNeeded() {
|
|
118
|
-
if (subscription) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
subscription = originalObserver.subscribe({
|
|
123
|
-
next: function next(value) {
|
|
124
|
-
var _iterator = _createForOfIteratorHelper(observers),
|
|
125
|
-
_step;
|
|
126
|
-
|
|
127
|
-
try {
|
|
128
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
129
|
-
var _observer$next;
|
|
130
|
-
|
|
131
|
-
var observer = _step.value;
|
|
132
|
-
(_observer$next = observer.next) === null || _observer$next === void 0 ? void 0 : _observer$next.call(observer, value);
|
|
133
|
-
}
|
|
134
|
-
} catch (err) {
|
|
135
|
-
_iterator.e(err);
|
|
136
|
-
} finally {
|
|
137
|
-
_iterator.f();
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
error: function error(_error) {
|
|
141
|
-
var _iterator2 = _createForOfIteratorHelper(observers),
|
|
142
|
-
_step2;
|
|
143
|
-
|
|
144
|
-
try {
|
|
145
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
146
|
-
var _observer$error;
|
|
147
|
-
|
|
148
|
-
var observer = _step2.value;
|
|
149
|
-
(_observer$error = observer.error) === null || _observer$error === void 0 ? void 0 : _observer$error.call(observer, _error);
|
|
150
|
-
}
|
|
151
|
-
} catch (err) {
|
|
152
|
-
_iterator2.e(err);
|
|
153
|
-
} finally {
|
|
154
|
-
_iterator2.f();
|
|
155
|
-
}
|
|
156
|
-
},
|
|
157
|
-
complete: function complete() {
|
|
158
|
-
var _iterator3 = _createForOfIteratorHelper(observers),
|
|
159
|
-
_step3;
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
163
|
-
var _observer$complete;
|
|
164
|
-
|
|
165
|
-
var observer = _step3.value;
|
|
166
|
-
(_observer$complete = observer.complete) === null || _observer$complete === void 0 ? void 0 : _observer$complete.call(observer);
|
|
167
|
-
}
|
|
168
|
-
} catch (err) {
|
|
169
|
-
_iterator3.e(err);
|
|
170
|
-
} finally {
|
|
171
|
-
_iterator3.f();
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function resetIfNeeded() {
|
|
178
|
-
// "resetOnRefCountZero"
|
|
179
|
-
if (refCount === 0 && subscription) {
|
|
180
|
-
var _sub = subscription;
|
|
181
|
-
subscription = null;
|
|
182
|
-
|
|
183
|
-
_sub.unsubscribe();
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return {
|
|
188
|
-
subscribe: function subscribe(observer) {
|
|
189
|
-
refCount++;
|
|
190
|
-
observers.push(observer);
|
|
191
|
-
startIfNeeded();
|
|
192
|
-
return {
|
|
193
|
-
unsubscribe: function unsubscribe() {
|
|
194
|
-
refCount--;
|
|
195
|
-
resetIfNeeded();
|
|
196
|
-
var index = observers.findIndex(function (v) {
|
|
197
|
-
return v === observer;
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
if (index > -1) {
|
|
201
|
-
observers.splice(index, 1);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function tap(observer) {
|
|
211
|
-
return function (originalObserver) {
|
|
212
|
-
return {
|
|
213
|
-
subscribe: function subscribe(observer2) {
|
|
214
|
-
return originalObserver.subscribe({
|
|
215
|
-
next: function next(v) {
|
|
216
|
-
var _observer$next, _observer2$next;
|
|
217
|
-
|
|
218
|
-
(_observer$next = observer.next) === null || _observer$next === void 0 ? void 0 : _observer$next.call(observer, v);
|
|
219
|
-
(_observer2$next = observer2.next) === null || _observer2$next === void 0 ? void 0 : _observer2$next.call(observer2, v);
|
|
220
|
-
},
|
|
221
|
-
error: function error(v) {
|
|
222
|
-
var _observer$error, _observer2$error;
|
|
223
|
-
|
|
224
|
-
(_observer$error = observer.error) === null || _observer$error === void 0 ? void 0 : _observer$error.call(observer, v);
|
|
225
|
-
(_observer2$error = observer2.error) === null || _observer2$error === void 0 ? void 0 : _observer2$error.call(observer2, v);
|
|
226
|
-
},
|
|
227
|
-
complete: function complete() {
|
|
228
|
-
var _observer$complete, _observer2$complete;
|
|
229
|
-
|
|
230
|
-
(_observer$complete = observer.complete) === null || _observer$complete === void 0 ? void 0 : _observer$complete.call(observer);
|
|
231
|
-
(_observer2$complete = observer2.complete) === null || _observer2$complete === void 0 ? void 0 : _observer2$complete.call(observer2);
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export { observable as o, share as s, tap as t };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "../../dist/declarations/src/rx/index";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { o as observable } from '../../dist/observable-01534ea8.esm.js';
|
package/observable/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '../dist/observable';
|
package/observable/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require('../dist/observable/index');
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AnyRouter,
|
|
3
|
-
ClientDataTransformerOptions,
|
|
4
|
-
DataTransformer,
|
|
5
|
-
} from '@trpc/server';
|
|
6
|
-
import { observable } from '../observable/observable';
|
|
7
|
-
import { OperationResult, TRPCLink } from './types';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @internal
|
|
11
|
-
*/
|
|
12
|
-
function transformOperationResult<TResult extends OperationResult<any, any>>(
|
|
13
|
-
result: TResult,
|
|
14
|
-
transformer: DataTransformer,
|
|
15
|
-
) {
|
|
16
|
-
if ('error' in result.data) {
|
|
17
|
-
return {
|
|
18
|
-
...result,
|
|
19
|
-
data: {
|
|
20
|
-
...result.data,
|
|
21
|
-
error: transformer.deserialize(result.data.error),
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
if (result.data.result.type !== 'data') {
|
|
26
|
-
return result;
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
29
|
-
...result,
|
|
30
|
-
data: {
|
|
31
|
-
...result.data,
|
|
32
|
-
result: {
|
|
33
|
-
...result.data.result,
|
|
34
|
-
data: transformer.deserialize(result.data.result.data),
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
export function transformerLink<TRouter extends AnyRouter = AnyRouter>(
|
|
40
|
-
transformer: ClientDataTransformerOptions,
|
|
41
|
-
): TRPCLink<TRouter> {
|
|
42
|
-
const _transformer: DataTransformer = transformer
|
|
43
|
-
? 'input' in transformer
|
|
44
|
-
? {
|
|
45
|
-
serialize: transformer.input.serialize,
|
|
46
|
-
deserialize: transformer.output.deserialize,
|
|
47
|
-
}
|
|
48
|
-
: transformer
|
|
49
|
-
: {
|
|
50
|
-
serialize: (data) => data,
|
|
51
|
-
deserialize: (data) => data,
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
return () => {
|
|
55
|
-
return (props) => {
|
|
56
|
-
const input = _transformer.serialize(props.op.input);
|
|
57
|
-
return observable((observer) => {
|
|
58
|
-
const subscription = props.next({ ...props.op, input }).subscribe({
|
|
59
|
-
next(value) {
|
|
60
|
-
const transformed = transformOperationResult(value, _transformer);
|
|
61
|
-
observer.next(transformed);
|
|
62
|
-
},
|
|
63
|
-
error(err) {
|
|
64
|
-
observer.error(err);
|
|
65
|
-
},
|
|
66
|
-
complete() {
|
|
67
|
-
observer.complete();
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
return subscription;
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
};
|
|
74
|
-
}
|
package/src/observable/index.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Observable } from '../types';
|
|
2
|
-
|
|
3
|
-
export class ObservableAbortError extends Error {
|
|
4
|
-
constructor(message: string) {
|
|
5
|
-
super(message);
|
|
6
|
-
this.name = 'ObservableAbortError';
|
|
7
|
-
Object.setPrototypeOf(this, ObservableAbortError.prototype);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/** @internal */
|
|
12
|
-
export function observableToPromise<TValue>(
|
|
13
|
-
observable: Observable<TValue, unknown>,
|
|
14
|
-
) {
|
|
15
|
-
let abort: () => void;
|
|
16
|
-
const promise = new Promise<TValue>((resolve, reject) => {
|
|
17
|
-
let isDone = false;
|
|
18
|
-
function onDone() {
|
|
19
|
-
if (isDone) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
isDone = true;
|
|
23
|
-
reject(new ObservableAbortError('This operation was cancelled.'));
|
|
24
|
-
obs$.unsubscribe();
|
|
25
|
-
}
|
|
26
|
-
const obs$ = observable.subscribe({
|
|
27
|
-
next(data) {
|
|
28
|
-
isDone = true;
|
|
29
|
-
resolve(data);
|
|
30
|
-
onDone();
|
|
31
|
-
},
|
|
32
|
-
error(data) {
|
|
33
|
-
isDone = true;
|
|
34
|
-
reject(data);
|
|
35
|
-
onDone();
|
|
36
|
-
},
|
|
37
|
-
complete() {
|
|
38
|
-
isDone = true;
|
|
39
|
-
onDone();
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
abort = onDone;
|
|
43
|
-
});
|
|
44
|
-
return {
|
|
45
|
-
promise,
|
|
46
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
47
|
-
abort: abort!,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { UnaryFunction } from '../types';
|
|
2
|
-
import { identity } from './identity';
|
|
3
|
-
|
|
4
|
-
/** @internal */
|
|
5
|
-
export function pipeFromArray<T, R>(
|
|
6
|
-
fns: Array<UnaryFunction<T, R>>,
|
|
7
|
-
): UnaryFunction<T, R> {
|
|
8
|
-
if (fns.length === 0) {
|
|
9
|
-
return identity as UnaryFunction<any, any>;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
if (fns.length === 1) {
|
|
13
|
-
return fns[0];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return function piped(input: T): R {
|
|
17
|
-
return fns.reduce(
|
|
18
|
-
(prev: any, fn: UnaryFunction<T, R>) => fn(prev),
|
|
19
|
-
input as any,
|
|
20
|
-
);
|
|
21
|
-
};
|
|
22
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
|
-
import { observable, share, tap } from './';
|
|
3
|
-
|
|
4
|
-
test('vanilla observable - complete()', () => {
|
|
5
|
-
const obs = observable<number, Error>((observer) => {
|
|
6
|
-
observer.next(1);
|
|
7
|
-
observer.complete();
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
const next = jest.fn();
|
|
11
|
-
const error = jest.fn();
|
|
12
|
-
const complete = jest.fn();
|
|
13
|
-
obs.subscribe({
|
|
14
|
-
next,
|
|
15
|
-
error,
|
|
16
|
-
complete,
|
|
17
|
-
});
|
|
18
|
-
expect(next.mock.calls).toHaveLength(1);
|
|
19
|
-
expect(complete.mock.calls).toHaveLength(1);
|
|
20
|
-
expect(error.mock.calls).toHaveLength(0);
|
|
21
|
-
expect(next.mock.calls[0][0]).toBe(1);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test('vanilla observable - unsubscribe()', () => {
|
|
25
|
-
const obs$ = observable<number, Error>((observer) => {
|
|
26
|
-
observer.next(1);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
const next = jest.fn();
|
|
30
|
-
const error = jest.fn();
|
|
31
|
-
const complete = jest.fn();
|
|
32
|
-
const sub = obs$.subscribe({
|
|
33
|
-
next,
|
|
34
|
-
error,
|
|
35
|
-
complete,
|
|
36
|
-
});
|
|
37
|
-
sub.unsubscribe();
|
|
38
|
-
expect(next.mock.calls).toHaveLength(1);
|
|
39
|
-
expect(complete.mock.calls).toHaveLength(0);
|
|
40
|
-
expect(error.mock.calls).toHaveLength(0);
|
|
41
|
-
expect(next.mock.calls[0][0]).toBe(1);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('pipe - combine operators', () => {
|
|
45
|
-
const taps = {
|
|
46
|
-
next: jest.fn(),
|
|
47
|
-
complete: jest.fn(),
|
|
48
|
-
error: jest.fn(),
|
|
49
|
-
};
|
|
50
|
-
const obs = observable<number, Error>((observer) => {
|
|
51
|
-
observer.next(1);
|
|
52
|
-
}).pipe(
|
|
53
|
-
// operators:
|
|
54
|
-
share(),
|
|
55
|
-
tap(taps),
|
|
56
|
-
);
|
|
57
|
-
{
|
|
58
|
-
const next = jest.fn();
|
|
59
|
-
const error = jest.fn();
|
|
60
|
-
const complete = jest.fn();
|
|
61
|
-
obs.subscribe({
|
|
62
|
-
next,
|
|
63
|
-
error,
|
|
64
|
-
complete,
|
|
65
|
-
});
|
|
66
|
-
expect(next.mock.calls).toHaveLength(1);
|
|
67
|
-
expect(complete.mock.calls).toHaveLength(0);
|
|
68
|
-
expect(error.mock.calls).toHaveLength(0);
|
|
69
|
-
expect(next.mock.calls[0][0]).toBe(1);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
{
|
|
73
|
-
const next = jest.fn();
|
|
74
|
-
const error = jest.fn();
|
|
75
|
-
const complete = jest.fn();
|
|
76
|
-
obs.subscribe({
|
|
77
|
-
next,
|
|
78
|
-
error,
|
|
79
|
-
complete,
|
|
80
|
-
});
|
|
81
|
-
expect(next.mock.calls).toHaveLength(0);
|
|
82
|
-
expect(complete.mock.calls).toHaveLength(0);
|
|
83
|
-
expect(error.mock.calls).toHaveLength(0);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
expect({
|
|
87
|
-
next: taps.next.mock.calls,
|
|
88
|
-
error: taps.error.mock.calls,
|
|
89
|
-
complete: taps.complete.mock.calls,
|
|
90
|
-
}).toMatchInlineSnapshot(`
|
|
91
|
-
Object {
|
|
92
|
-
"complete": Array [],
|
|
93
|
-
"error": Array [],
|
|
94
|
-
"next": Array [
|
|
95
|
-
Array [
|
|
96
|
-
1,
|
|
97
|
-
],
|
|
98
|
-
],
|
|
99
|
-
}
|
|
100
|
-
`);
|
|
101
|
-
});
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { pipeFromArray } from './internals/pipe';
|
|
2
|
-
import { Observable, Observer, OperatorFunction, TeardownLogic } from './types';
|
|
3
|
-
|
|
4
|
-
export type inferObservableValue<TObservable extends Observable<any, any>> =
|
|
5
|
-
TObservable extends Observable<infer TValue, any> ? TValue : never;
|
|
6
|
-
|
|
7
|
-
export function observable<TValue, TError = unknown>(
|
|
8
|
-
subscribe: (observer: Observer<TValue, TError>) => TeardownLogic,
|
|
9
|
-
): Observable<TValue, TError> {
|
|
10
|
-
const self: Observable<TValue, TError> = {
|
|
11
|
-
subscribe(observer) {
|
|
12
|
-
let teardownRef: TeardownLogic | null = null;
|
|
13
|
-
let isDone = false;
|
|
14
|
-
let unsubscribed = false;
|
|
15
|
-
let teardownImmediately = false;
|
|
16
|
-
function unsubscribe() {
|
|
17
|
-
if (teardownRef === null) {
|
|
18
|
-
teardownImmediately = true;
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
if (unsubscribed) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
unsubscribed = true;
|
|
25
|
-
|
|
26
|
-
if (typeof teardownRef === 'function') {
|
|
27
|
-
teardownRef();
|
|
28
|
-
} else if (teardownRef) {
|
|
29
|
-
teardownRef.unsubscribe();
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
teardownRef = subscribe({
|
|
33
|
-
next(value) {
|
|
34
|
-
if (isDone) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
observer.next?.(value);
|
|
38
|
-
},
|
|
39
|
-
error(err) {
|
|
40
|
-
if (isDone) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
isDone = true;
|
|
44
|
-
observer.error?.(err);
|
|
45
|
-
unsubscribe();
|
|
46
|
-
},
|
|
47
|
-
complete() {
|
|
48
|
-
if (isDone) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
isDone = true;
|
|
52
|
-
observer.complete?.();
|
|
53
|
-
unsubscribe();
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
if (teardownImmediately) {
|
|
57
|
-
unsubscribe();
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
unsubscribe,
|
|
61
|
-
};
|
|
62
|
-
},
|
|
63
|
-
pipe(
|
|
64
|
-
...operations: OperatorFunction<any, any, any, any>[]
|
|
65
|
-
): Observable<any, any> {
|
|
66
|
-
return pipeFromArray(operations)(self) as any;
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
return self;
|
|
70
|
-
}
|