ngx-lift 1.4.0 → 1.4.2
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/esm2022/lib/operators/poll.operator.mjs +17 -11
- package/esm2022/lib/pipes/byte-converter.pipe.mjs +2 -8
- package/fesm2022/ngx-lift.mjs +18 -18
- package/fesm2022/ngx-lift.mjs.map +1 -1
- package/lib/operators/poll.operator.d.ts +2 -2
- package/lib/pipes/byte-converter.pipe.d.ts +2 -0
- package/package.json +1 -1
|
@@ -9,27 +9,33 @@ import { isPromise } from '../utils/is-promise.util';
|
|
|
9
9
|
* @param {object} options - The configuration options for polling.
|
|
10
10
|
* @param {number} options.interval - The interval in milliseconds between each poll.
|
|
11
11
|
* @param {(params: any) => Observable<Data> | Data} options.pollingFn - A function that returns an Observable, Promise, or primitive value.
|
|
12
|
-
* @param {(input: Input |
|
|
12
|
+
* @param {(input: Input | undefined) => any} [options.paramsBuilder] - An optional function that builds parameters for the polling function based on the input. The value emitted by the trigger observable will serve as the parameter.
|
|
13
13
|
* @param {Observable<Input> | Signal<Input>} [options.trigger] - An optional Observable or Signal that triggers a manual poll.
|
|
14
14
|
* @returns {Observable<AsyncState<Data>>} An Observable emitting objects representing the state of the asynchronous operation.
|
|
15
15
|
*/
|
|
16
16
|
export function poll(options) {
|
|
17
|
-
|
|
17
|
+
const timerEmitValue = '__timer__emission__';
|
|
18
|
+
const timer$ = timer(0, options.interval).pipe(map((i) => `${timerEmitValue}${i}`));
|
|
18
19
|
const trigger$ = options.trigger === undefined
|
|
19
20
|
? EMPTY
|
|
20
21
|
: isObservable(options.trigger)
|
|
21
22
|
? options.trigger
|
|
22
23
|
: toObservable(options.trigger);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
let inputByTrigger = undefined; // if trigger is not provided, input will be undefined
|
|
25
|
+
return merge(trigger$, timer$).pipe(exhaustMap((input) => {
|
|
26
|
+
// input can be either by trigger or timer
|
|
27
|
+
const isTimerTrigger = typeof input === 'string' && input.includes(timerEmitValue);
|
|
28
|
+
const isManualTrigger = !isTimerTrigger;
|
|
26
29
|
if (isManualTrigger) {
|
|
27
|
-
|
|
30
|
+
inputByTrigger = input;
|
|
28
31
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
32
|
+
// build params by trigger input
|
|
33
|
+
// if paramsBuilder is provided, params will be the value of this function call
|
|
34
|
+
// if paramsBuilder is not provided, params will be the value emitted by the trigger
|
|
35
|
+
const params = options.paramsBuilder ? options.paramsBuilder(inputByTrigger) : inputByTrigger;
|
|
36
|
+
// NOTE: using exhaustMap will NOT emit ${timerEmitValue}0 if trigger is not provided
|
|
37
|
+
// using concatMap will emit ${timerEmitValue}0 if trigger is not provided
|
|
38
|
+
const isFirstRequest = input === `${timerEmitValue}0`; // timer first emission when trigger is not provided
|
|
33
39
|
const shouldShowLoading = isManualTrigger || isFirstRequest;
|
|
34
40
|
const fnResult = options.pollingFn(params);
|
|
35
41
|
const fnResult$ = isObservable(fnResult) ? fnResult : isPromise(fnResult) ? from(fnResult) : of(fnResult);
|
|
@@ -40,4 +46,4 @@ export function poll(options) {
|
|
|
40
46
|
return observable$;
|
|
41
47
|
}), share());
|
|
42
48
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbC5vcGVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWZ0L3NyYy9saWIvb3BlcmF0b3JzL3BvbGwub3BlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxVQUFVLEVBQ1YsS0FBSyxFQUNMLFVBQVUsRUFDVixJQUFJLEVBQ0osWUFBWSxFQUNaLEdBQUcsRUFDSCxLQUFLLEVBRUwsRUFBRSxFQUNGLEtBQUssRUFDTCxTQUFTLEVBQ1QsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBR2QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRW5EOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBYyxPQUtqQztJQUNDLE1BQU0sY0FBYyxHQUFHLHFCQUFxQixDQUFDO0lBQzdDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVwRixNQUFNLFFBQVEsR0FDWixPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFDM0IsQ0FBQyxDQUFDLEtBQUs7UUFDUCxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQ2pCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLElBQUksY0FBYyxHQUFzQixTQUFTLENBQUMsQ0FBQyxzREFBc0Q7SUFFekcsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDakMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbkIsMENBQTBDO1FBQzFDLE1BQU0sY0FBYyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sZUFBZSxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ3hDLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsY0FBYyxHQUFHLEtBQWMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLCtFQUErRTtRQUMvRSxvRkFBb0Y7UUFDcEYsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBRTlGLHFGQUFxRjtRQUNyRiwwRUFBMEU7UUFDMUUsTUFBTSxjQUFjLEdBQUcsS0FBSyxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxvREFBb0Q7UUFDM0csTUFBTSxpQkFBaUIsR0FBRyxlQUFlLElBQUksY0FBYyxDQUFDO1FBRTVELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUcsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsRUFDcEQsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUMvRCxDQUFDO1FBRUYsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7U2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dG9PYnNlcnZhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBjYXRjaEVycm9yLFxuICBFTVBUWSxcbiAgZXhoYXVzdE1hcCxcbiAgZnJvbSxcbiAgaXNPYnNlcnZhYmxlLFxuICBtYXAsXG4gIG1lcmdlLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc2hhcmUsXG4gIHN0YXJ0V2l0aCxcbiAgdGltZXIsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0FzeW5jU3RhdGV9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge2lzUHJvbWlzZX0gZnJvbSAnLi4vdXRpbHMvaXMtcHJvbWlzZS51dGlsJztcblxuLyoqXG4gKiBQb2xscyBkYXRhIGF0IGEgc3BlY2lmaWVkIGludGVydmFsIGFuZCBjYW4gYmUgdHJpZ2dlcmVkIG1hbnVhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBEYXRhIC0gVGhlIHR5cGUgb2YgdGhlIGRhdGEgZW1pdHRlZCBieSB0aGUgcG9sbGluZyBmdW5jdGlvbi5cbiAqIEB0ZW1wbGF0ZSBJbnB1dCAtIFRoZSB0eXBlIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXIgdXNlZCB0byBidWlsZCBwb2xsaW5nIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHBvbGxpbmcuXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5pbnRlcnZhbCAtIFRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIHBvbGwuXG4gKiBAcGFyYW0geyhwYXJhbXM6IGFueSkgPT4gT2JzZXJ2YWJsZTxEYXRhPiB8IERhdGF9IG9wdGlvbnMucG9sbGluZ0ZuIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgb3IgcHJpbWl0aXZlIHZhbHVlLlxuICogQHBhcmFtIHsoaW5wdXQ6IElucHV0IHwgdW5kZWZpbmVkKSA9PiBhbnl9IFtvcHRpb25zLnBhcmFtc0J1aWxkZXJdIC0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBidWlsZHMgcGFyYW1ldGVycyBmb3IgdGhlIHBvbGxpbmcgZnVuY3Rpb24gYmFzZWQgb24gdGhlIGlucHV0LiBUaGUgdmFsdWUgZW1pdHRlZCBieSB0aGUgdHJpZ2dlciBvYnNlcnZhYmxlIHdpbGwgc2VydmUgYXMgdGhlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZTxJbnB1dD4gfCBTaWduYWw8SW5wdXQ+fSBbb3B0aW9ucy50cmlnZ2VyXSAtIEFuIG9wdGlvbmFsIE9ic2VydmFibGUgb3IgU2lnbmFsIHRoYXQgdHJpZ2dlcnMgYSBtYW51YWwgcG9sbC5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEFzeW5jU3RhdGU8RGF0YT4+fSBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGw8RGF0YSwgSW5wdXQ+KG9wdGlvbnM6IHtcbiAgaW50ZXJ2YWw6IG51bWJlcjtcbiAgcG9sbGluZ0ZuOiAocGFyYW1zOiBhbnkpID0+IE9ic2VydmFibGU8RGF0YT4gfCBQcm9taXNlPERhdGE+IHwgRGF0YTtcbiAgcGFyYW1zQnVpbGRlcj86IChpbnB1dD86IElucHV0IHwgdW5kZWZpbmVkKSA9PiBhbnk7XG4gIHRyaWdnZXI/OiBPYnNlcnZhYmxlPElucHV0PiB8IFNpZ25hbDxJbnB1dD47XG59KTogT2JzZXJ2YWJsZTxBc3luY1N0YXRlPERhdGE+PiB7XG4gIGNvbnN0IHRpbWVyRW1pdFZhbHVlID0gJ19fdGltZXJfX2VtaXNzaW9uX18nO1xuICBjb25zdCB0aW1lciQgPSB0aW1lcigwLCBvcHRpb25zLmludGVydmFsKS5waXBlKG1hcCgoaSkgPT4gYCR7dGltZXJFbWl0VmFsdWV9JHtpfWApKTtcblxuICBjb25zdCB0cmlnZ2VyJCA9XG4gICAgb3B0aW9ucy50cmlnZ2VyID09PSB1bmRlZmluZWRcbiAgICAgID8gRU1QVFlcbiAgICAgIDogaXNPYnNlcnZhYmxlKG9wdGlvbnMudHJpZ2dlcilcbiAgICAgICAgPyBvcHRpb25zLnRyaWdnZXJcbiAgICAgICAgOiB0b09ic2VydmFibGUob3B0aW9ucy50cmlnZ2VyKTtcblxuICBsZXQgaW5wdXRCeVRyaWdnZXI6IElucHV0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkOyAvLyBpZiB0cmlnZ2VyIGlzIG5vdCBwcm92aWRlZCwgaW5wdXQgd2lsbCBiZSB1bmRlZmluZWRcblxuICByZXR1cm4gbWVyZ2UodHJpZ2dlciQsIHRpbWVyJCkucGlwZShcbiAgICBleGhhdXN0TWFwKChpbnB1dCkgPT4ge1xuICAgICAgLy8gaW5wdXQgY2FuIGJlIGVpdGhlciBieSB0cmlnZ2VyIG9yIHRpbWVyXG4gICAgICBjb25zdCBpc1RpbWVyVHJpZ2dlciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuaW5jbHVkZXModGltZXJFbWl0VmFsdWUpO1xuICAgICAgY29uc3QgaXNNYW51YWxUcmlnZ2VyID0gIWlzVGltZXJUcmlnZ2VyO1xuICAgICAgaWYgKGlzTWFudWFsVHJpZ2dlcikge1xuICAgICAgICBpbnB1dEJ5VHJpZ2dlciA9IGlucHV0IGFzIElucHV0O1xuICAgICAgfVxuXG4gICAgICAvLyBidWlsZCBwYXJhbXMgYnkgdHJpZ2dlciBpbnB1dFxuICAgICAgLy8gaWYgcGFyYW1zQnVpbGRlciBpcyBwcm92aWRlZCwgcGFyYW1zIHdpbGwgYmUgdGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gY2FsbFxuICAgICAgLy8gaWYgcGFyYW1zQnVpbGRlciBpcyBub3QgcHJvdmlkZWQsIHBhcmFtcyB3aWxsIGJlIHRoZSB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSB0cmlnZ2VyXG4gICAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtc0J1aWxkZXIgPyBvcHRpb25zLnBhcmFtc0J1aWxkZXIoaW5wdXRCeVRyaWdnZXIpIDogaW5wdXRCeVRyaWdnZXI7XG5cbiAgICAgIC8vIE5PVEU6IHVzaW5nIGV4aGF1c3RNYXAgd2lsbCBOT1QgZW1pdCAke3RpbWVyRW1pdFZhbHVlfTAgaWYgdHJpZ2dlciBpcyBub3QgcHJvdmlkZWRcbiAgICAgIC8vIHVzaW5nIGNvbmNhdE1hcCB3aWxsIGVtaXQgJHt0aW1lckVtaXRWYWx1ZX0wIGlmIHRyaWdnZXIgaXMgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBpc0ZpcnN0UmVxdWVzdCA9IGlucHV0ID09PSBgJHt0aW1lckVtaXRWYWx1ZX0wYDsgLy8gdGltZXIgZmlyc3QgZW1pc3Npb24gd2hlbiB0cmlnZ2VyIGlzIG5vdCBwcm92aWRlZFxuICAgICAgY29uc3Qgc2hvdWxkU2hvd0xvYWRpbmcgPSBpc01hbnVhbFRyaWdnZXIgfHwgaXNGaXJzdFJlcXVlc3Q7XG5cbiAgICAgIGNvbnN0IGZuUmVzdWx0ID0gb3B0aW9ucy5wb2xsaW5nRm4ocGFyYW1zKTtcbiAgICAgIGNvbnN0IGZuUmVzdWx0JCA9IGlzT2JzZXJ2YWJsZShmblJlc3VsdCkgPyBmblJlc3VsdCA6IGlzUHJvbWlzZShmblJlc3VsdCkgPyBmcm9tKGZuUmVzdWx0KSA6IG9mKGZuUmVzdWx0KTtcblxuICAgICAgbGV0IG9ic2VydmFibGUkID0gZm5SZXN1bHQkLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YSkgPT4gKHtsb2FkaW5nOiBmYWxzZSwgZXJyb3I6IG51bGwsIGRhdGF9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiBvZih7bG9hZGluZzogZmFsc2UsIGVycm9yLCBkYXRhOiBudWxsfSkpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHNob3VsZFNob3dMb2FkaW5nKSB7XG4gICAgICAgIG9ic2VydmFibGUkID0gb2JzZXJ2YWJsZSQucGlwZShzdGFydFdpdGgoe2xvYWRpbmc6IHRydWUsIGVycm9yOiBudWxsLCBkYXRhOiBudWxsfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZSQ7XG4gICAgfSksXG4gICAgc2hhcmUoKSxcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -33,15 +33,9 @@ export class ByteConverterPipe {
|
|
|
33
33
|
constructor() {
|
|
34
34
|
this.locale = inject(LOCALE_ID);
|
|
35
35
|
}
|
|
36
|
-
// If using navigator.language directly in the pipe, this approach directly uses the browser's language at the moment the ByteConverterPipe is constructed. If the user changes the language while using the application, it won't be automatically reflected. If dynamic language changes are a requirement, using the LOCALE_ID provider as demonstrated in the AppModule is a more Angular-centric approach.
|
|
37
|
-
// private locale: string;
|
|
38
|
-
// constructor() {
|
|
39
|
-
// // Use navigator.language as the default locale
|
|
40
|
-
// this.locale = navigator.language || 'en';
|
|
41
|
-
// }
|
|
42
36
|
transform(value) {
|
|
43
37
|
if (value === null || value === undefined || isNaN(value)) {
|
|
44
|
-
return
|
|
38
|
+
return null;
|
|
45
39
|
}
|
|
46
40
|
const units = ['BYTE', 'KB', 'MB', 'GB', 'TB'];
|
|
47
41
|
let unitIndex = 0;
|
|
@@ -153,4 +147,4 @@ const translations = {
|
|
|
153
147
|
TB: 'ТБ',
|
|
154
148
|
},
|
|
155
149
|
};
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnl0ZS1jb252ZXJ0ZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWZ0L3NyYy9saWIvcGlwZXMvYnl0ZS1jb252ZXJ0ZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDOztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQU1ILE1BQU0sT0FBTyxpQkFBaUI7SUFKOUI7UUFLVSxXQUFNLEdBQUcsTUFBTSxDQUFTLFNBQVMsQ0FBQyxDQUFDO0tBaUM1QztJQXRCQyxTQUFTLENBQUMsS0FBaUM7UUFDekMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxLQUFLLElBQUksSUFBSSxDQUFDO1lBQ2QsU0FBUyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQWE7UUFDaEMsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFDLHFCQUFxQixFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RGLENBQUM7OEdBakNVLGlCQUFpQjs0R0FBakIsaUJBQWlCOzsyRkFBakIsaUJBQWlCO2tCQUo3QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxlQUFlO29CQUNyQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7O0FBcUNELE1BQU0sWUFBWSxHQUEyQztJQUMzRCxFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsR0FBRztRQUNULEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO0tBQ1Q7SUFDRCxPQUFPLEVBQUU7UUFDUCwwREFBMEQ7UUFDMUQsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLElBQUk7UUFDVixFQUFFLEVBQUUsS0FBSztRQUNULEVBQUUsRUFBRSxLQUFLO1FBQ1QsRUFBRSxFQUFFLE1BQU07UUFDVixFQUFFLEVBQUUsS0FBSztLQUNWO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLEtBQUs7UUFDWCxFQUFFLEVBQUUsTUFBTTtRQUNWLEVBQUUsRUFBRSxNQUFNO1FBQ1YsRUFBRSxFQUFFLE9BQU87UUFDWCxFQUFFLEVBQUUsTUFBTTtLQUNYO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLEdBQUc7UUFDVCxFQUFFLEVBQUUsSUFBSTtRQUNSLEVBQUUsRUFBRSxJQUFJO1FBQ1IsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsSUFBSTtLQUNUO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5qZWN0LCBMT0NBTEVfSUQsIFBpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIGltcG9ydCB7IExPQ0FMRV9JRCwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqIGltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbiAqIGltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gJy4vYXBwLmNvbXBvbmVudCc7XG4gKiBpbXBvcnQgeyByZWdpc3RlckxvY2FsZURhdGEgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuICpcbiAqIGltcG9ydCBsb2NhbGVFbiBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9lbic7XG4gKiBpbXBvcnQgbG9jYWxlRnIgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvZnInO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGxvY2FsZXNcbiAqIHJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVFbik7XG4gKiByZWdpc3RlckxvY2FsZURhdGEobG9jYWxlRnIpO1xuICpcbiAqIEBOZ01vZHVsZSh7XG4gKiAgIGRlY2xhcmF0aW9uczogW0FwcENvbXBvbmVudF0sXG4gKiAgIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlXSxcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogTE9DQUxFX0lELFxuICogICAgICAgdXNlRmFjdG9yeTogKCkgPT4ge1xuICogICAgICAgICAvLyBVc2UgdGhlIGJyb3dzZXIncyBsYW5ndWFnZSBvciBhIGRlZmF1bHQgbGFuZ3VhZ2VcbiAqICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5sYW5ndWFnZSB8fCAnZW4nO1xuICogICAgICAgfSxcbiAqICAgICB9LFxuICogICBdLFxuICogICBib290c3RyYXA6IFtBcHBDb21wb25lbnRdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqL1xuXG5AUGlwZSh7XG4gIG5hbWU6ICdieXRlQ29udmVydGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQnl0ZUNvbnZlcnRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSBsb2NhbGUgPSBpbmplY3Q8c3RyaW5nPihMT0NBTEVfSUQpO1xuICAvLyBJZiB1c2luZyBuYXZpZ2F0b3IubGFuZ3VhZ2UgZGlyZWN0bHkgaW4gdGhlIHBpcGUsIHRoaXMgYXBwcm9hY2ggZGlyZWN0bHkgdXNlcyB0aGUgYnJvd3NlcidzIGxhbmd1YWdlIGF0IHRoZSBtb21lbnQgdGhlIEJ5dGVDb252ZXJ0ZXJQaXBlIGlzIGNvbnN0cnVjdGVkLiBJZiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBsYW5ndWFnZSB3aGlsZSB1c2luZyB0aGUgYXBwbGljYXRpb24sIGl0IHdvbid0IGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkLiBJZiBkeW5hbWljIGxhbmd1YWdlIGNoYW5nZXMgYXJlIGEgcmVxdWlyZW1lbnQsIHVzaW5nIHRoZSBMT0NBTEVfSUQgcHJvdmlkZXIgYXMgZGVtb25zdHJhdGVkIGluIHRoZSBBcHBNb2R1bGUgaXMgYSBtb3JlIEFuZ3VsYXItY2VudHJpYyBhcHByb2FjaC5cbiAgLy8gcHJpdmF0ZSBsb2NhbGU6IHN0cmluZztcbiAgLy8gY29uc3RydWN0b3IoKSB7XG4gIC8vICAgLy8gVXNlIG5hdmlnYXRvci5sYW5ndWFnZSBhcyB0aGUgZGVmYXVsdCBsb2NhbGVcbiAgLy8gICB0aGlzLmxvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZSB8fCAnZW4nO1xuICAvLyB9XG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBudW1iZXIpOiBzdHJpbmc7XG4gIHRyYW5zZm9ybSh2YWx1ZT86IG51bWJlcik6IHN0cmluZyB8IG51bGw7XG4gIHRyYW5zZm9ybSh2YWx1ZT86IG51bWJlciB8IG51bGwpOiBzdHJpbmcgfCBudWxsO1xuICB0cmFuc2Zvcm0odmFsdWU/OiBudWxsIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB1bml0cyA9IFsnQllURScsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGxldCB1bml0SW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKHZhbHVlID49IDEwMjQgJiYgdW5pdEluZGV4IDwgdW5pdHMubGVuZ3RoIC0gMSkge1xuICAgICAgdmFsdWUgLz0gMTAyNDtcbiAgICAgIHVuaXRJbmRleCsrO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JqZWN0ID0gdHJhbnNsYXRpb25zW3RoaXMubG9jYWxlXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107XG4gICAgY29uc3Qga2V5ID0gdW5pdHNbdW5pdEluZGV4XTtcblxuICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZSkgKyAnICcgKyB0cmFuc2xhdGlvbk9iamVjdFtrZXldO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXROdW1iZXIodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwge21heGltdW1GcmFjdGlvbkRpZ2l0czogMn0pLmZvcm1hdCh2YWx1ZSk7XG4gIH1cbn1cblxuY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgZW46IHtcbiAgICBCWVRFOiAnQicsXG4gICAgS0I6ICdLQicsXG4gICAgTUI6ICdNQicsXG4gICAgR0I6ICdHQicsXG4gICAgVEI6ICdUQicsXG4gIH0sXG4gICdlbi1VUyc6IHtcbiAgICAvLyBZb3UgY2FuIHByb3ZpZGUgc3BlY2lmaWMgdmFyaWF0aW9ucyBmb3IgZW4tVVMgaWYgbmVlZGVkXG4gICAgQllURTogJ0InLFxuICAgIEtCOiAnS0InLFxuICAgIE1COiAnTUInLFxuICAgIEdCOiAnR0InLFxuICAgIFRCOiAnVEInLFxuICB9LFxuICBkZToge1xuICAgIEJZVEU6ICdCJyxcbiAgICBLQjogJ0tCJyxcbiAgICBNQjogJ01CJyxcbiAgICBHQjogJ0dCJyxcbiAgICBUQjogJ1RCJyxcbiAgfSxcbiAgZXM6IHtcbiAgICBCWVRFOiAnQicsXG4gICAgS0I6ICdLQicsXG4gICAgTUI6ICdNQicsXG4gICAgR0I6ICdHQicsXG4gICAgVEI6ICdUQicsXG4gIH0sXG4gIGZyOiB7XG4gICAgQllURTogJ28nLFxuICAgIEtCOiAnS28nLFxuICAgIE1COiAnTW8nLFxuICAgIEdCOiAnR28nLFxuICAgIFRCOiAnVG8nLFxuICB9LFxuICBpdDoge1xuICAgIEJZVEU6ICdCJyxcbiAgICBLQjogJ0tCJyxcbiAgICBNQjogJ01CJyxcbiAgICBHQjogJ0dCJyxcbiAgICBUQjogJ1RCJyxcbiAgfSxcbiAgamE6IHtcbiAgICBCWVRFOiAnQicsXG4gICAgS0I6ICdLQicsXG4gICAgTUI6ICdNQicsXG4gICAgR0I6ICdHQicsXG4gICAgVEI6ICdUQicsXG4gIH0sXG4gIGtvOiB7XG4gICAgQllURTogJ0InLFxuICAgIEtCOiAnS0InLFxuICAgIE1COiAnTUInLFxuICAgIEdCOiAnR0InLFxuICAgIFRCOiAnVEInLFxuICB9LFxuICAncHQtQlInOiB7XG4gICAgQllURTogJ0InLFxuICAgIEtCOiAnS0InLFxuICAgIE1COiAnTUInLFxuICAgIEdCOiAnR0InLFxuICAgIFRCOiAnVEInLFxuICB9LFxuICAnemgtQ04nOiB7XG4gICAgQllURTogJ+Wtl+iKgicsXG4gICAgS0I6ICfljYPlrZfoioInLFxuICAgIE1COiAn5YWG5a2X6IqCJyxcbiAgICBHQjogJ+WNg+WFhuWtl+iKgicsXG4gICAgVEI6ICflpKrlrZfoioInLFxuICB9LFxuICAnemgtVFcnOiB7XG4gICAgQllURTogJ+S9jeWFg+e1hCcsXG4gICAgS0I6ICfljYPkvY3lhYPntYQnLFxuICAgIE1COiAn5YWG5L2N5YWD57WEJyxcbiAgICBHQjogJ+WNg+WFhuS9jeWFg+e1hCcsXG4gICAgVEI6ICflpKrkvY3lhYPntYQnLFxuICB9LFxuICBydToge1xuICAgIEJZVEU6ICfQkScsXG4gICAgS0I6ICfQmtCRJyxcbiAgICBNQjogJ9Cc0JEnLFxuICAgIEdCOiAn0JPQkScsXG4gICAgVEI6ICfQotCRJyxcbiAgfSxcbn07XG4iXX0=
|
package/fesm2022/ngx-lift.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { startWith, Subject, combineLatest, pipe, tap, map, catchError, of, Observable, EMPTY, isObservable, merge,
|
|
1
|
+
import { startWith, Subject, combineLatest, pipe, tap, map, catchError, of, Observable, timer, EMPTY, isObservable, merge, exhaustMap, from, share, switchMap, identity, distinctUntilChanged, switchAll, mergeAll, concatAll, exhaustAll } from 'rxjs';
|
|
2
2
|
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { Pipe, inject, LOCALE_ID, assertInInjectionContext, isSignal, untracked, computed, DestroyRef, signal, effect } from '@angular/core';
|
|
@@ -215,27 +215,33 @@ function isPromise$1(obj) {
|
|
|
215
215
|
* @param {object} options - The configuration options for polling.
|
|
216
216
|
* @param {number} options.interval - The interval in milliseconds between each poll.
|
|
217
217
|
* @param {(params: any) => Observable<Data> | Data} options.pollingFn - A function that returns an Observable, Promise, or primitive value.
|
|
218
|
-
* @param {(input: Input |
|
|
218
|
+
* @param {(input: Input | undefined) => any} [options.paramsBuilder] - An optional function that builds parameters for the polling function based on the input. The value emitted by the trigger observable will serve as the parameter.
|
|
219
219
|
* @param {Observable<Input> | Signal<Input>} [options.trigger] - An optional Observable or Signal that triggers a manual poll.
|
|
220
220
|
* @returns {Observable<AsyncState<Data>>} An Observable emitting objects representing the state of the asynchronous operation.
|
|
221
221
|
*/
|
|
222
222
|
function poll(options) {
|
|
223
|
-
|
|
223
|
+
const timerEmitValue = '__timer__emission__';
|
|
224
|
+
const timer$ = timer(0, options.interval).pipe(map((i) => `${timerEmitValue}${i}`));
|
|
224
225
|
const trigger$ = options.trigger === undefined
|
|
225
226
|
? EMPTY
|
|
226
227
|
: isObservable(options.trigger)
|
|
227
228
|
? options.trigger
|
|
228
229
|
: toObservable(options.trigger);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
230
|
+
let inputByTrigger = undefined; // if trigger is not provided, input will be undefined
|
|
231
|
+
return merge(trigger$, timer$).pipe(exhaustMap((input) => {
|
|
232
|
+
// input can be either by trigger or timer
|
|
233
|
+
const isTimerTrigger = typeof input === 'string' && input.includes(timerEmitValue);
|
|
234
|
+
const isManualTrigger = !isTimerTrigger;
|
|
232
235
|
if (isManualTrigger) {
|
|
233
|
-
|
|
236
|
+
inputByTrigger = input;
|
|
234
237
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
const
|
|
238
|
+
// build params by trigger input
|
|
239
|
+
// if paramsBuilder is provided, params will be the value of this function call
|
|
240
|
+
// if paramsBuilder is not provided, params will be the value emitted by the trigger
|
|
241
|
+
const params = options.paramsBuilder ? options.paramsBuilder(inputByTrigger) : inputByTrigger;
|
|
242
|
+
// NOTE: using exhaustMap will NOT emit ${timerEmitValue}0 if trigger is not provided
|
|
243
|
+
// using concatMap will emit ${timerEmitValue}0 if trigger is not provided
|
|
244
|
+
const isFirstRequest = input === `${timerEmitValue}0`; // timer first emission when trigger is not provided
|
|
239
245
|
const shouldShowLoading = isManualTrigger || isFirstRequest;
|
|
240
246
|
const fnResult = options.pollingFn(params);
|
|
241
247
|
const fnResult$ = isObservable(fnResult) ? fnResult : isPromise$1(fnResult) ? from(fnResult) : of(fnResult);
|
|
@@ -345,15 +351,9 @@ class ByteConverterPipe {
|
|
|
345
351
|
constructor() {
|
|
346
352
|
this.locale = inject(LOCALE_ID);
|
|
347
353
|
}
|
|
348
|
-
// If using navigator.language directly in the pipe, this approach directly uses the browser's language at the moment the ByteConverterPipe is constructed. If the user changes the language while using the application, it won't be automatically reflected. If dynamic language changes are a requirement, using the LOCALE_ID provider as demonstrated in the AppModule is a more Angular-centric approach.
|
|
349
|
-
// private locale: string;
|
|
350
|
-
// constructor() {
|
|
351
|
-
// // Use navigator.language as the default locale
|
|
352
|
-
// this.locale = navigator.language || 'en';
|
|
353
|
-
// }
|
|
354
354
|
transform(value) {
|
|
355
355
|
if (value === null || value === undefined || isNaN(value)) {
|
|
356
|
-
return
|
|
356
|
+
return null;
|
|
357
357
|
}
|
|
358
358
|
const units = ['BYTE', 'KB', 'MB', 'GB', 'TB'];
|
|
359
359
|
let unitIndex = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-lift.mjs","sources":["../../../projects/ngx-lift/src/lib/operators/combine-latest-eager.operator.ts","../../../projects/ngx-lift/src/lib/operators/create-async-state.operator.ts","../../../projects/ngx-lift/src/lib/operators/distinct-on-change.operator.ts","../../../projects/ngx-lift/src/lib/operators/logger.operator.ts","../../../projects/ngx-lift/src/lib/utils/is-promise.util.ts","../../../projects/ngx-lift/src/lib/operators/poll.operator.ts","../../../projects/ngx-lift/src/lib/operators/start-with-tap.operator.ts","../../../projects/ngx-lift/src/lib/operators/switch-map-with-async-state.operator.ts","../../../projects/ngx-lift/src/lib/pipes/array-join.pipe.ts","../../../projects/ngx-lift/src/lib/pipes/byte-converter.pipe.ts","../../../projects/ngx-lift/src/lib/const.ts","../../../projects/ngx-lift/src/lib/pipes/is-https.pipe.ts","../../../projects/ngx-lift/src/lib/pipes/mask.pipe.ts","../../../projects/ngx-lift/src/lib/signals/combine-from.ts","../../../projects/ngx-lift/src/lib/signals/computed-async.ts","../../../projects/ngx-lift/src/lib/signals/create-trigger.ts","../../../projects/ngx-lift/src/lib/signals/inject-params.ts","../../../projects/ngx-lift/src/lib/signals/inject-query-params.ts","../../../projects/ngx-lift/src/lib/signals/merge-from.ts","../../../projects/ngx-lift/src/lib/utils/difference-in-days.util.ts","../../../projects/ngx-lift/src/lib/utils/form.util.ts","../../../projects/ngx-lift/src/lib/utils/is-empty.util.ts","../../../projects/ngx-lift/src/lib/utils/is-equal.util.ts","../../../projects/ngx-lift/src/lib/utils/pick-by.util.ts","../../../projects/ngx-lift/src/lib/validators/unique.validator.ts","../../../projects/ngx-lift/src/lib/validators/url.validator.ts","../../../projects/ngx-lift/src/public-api.ts","../../../projects/ngx-lift/src/ngx-lift.ts"],"sourcesContent":["import {combineLatest, Observable, startWith, Subject} from 'rxjs';\n\nexport function combineLatestEager<T extends Observable<unknown>[]>(\n sources: T,\n startWithNullForAll?: boolean,\n): Observable<{[K in keyof T]: T[K] extends Observable<infer U> ? U | null : never}>;\n\nexport function combineLatestEager<T extends Record<string, Observable<unknown>>>(\n sources: T,\n startWithNullForAll?: boolean,\n): Observable<{[K in keyof T]: T[K] extends Observable<infer U> ? U | null : never}>;\n\n/**\n * Combines multiple observables into a single observable emitting an array or dictionary\n * of the latest values from each source observable.\n * Adds startWith(null) for each Subject in combineLatest when the second parameter startWithNullForAll is false.\n * When startWithNullForAll is true, each observable will startWith null.\n *\n * @template T - The type of the data in the observables.\n *\n * @param {Array<Observable<T>> | Record<string, Observable<T>>} sources -\n * An array of observables or a dictionary of observables to be combined.\n *\n * @param {boolean} [startWithNullForAll=false] -\n * Determines whether to start each observable with a `null` value.\n *\n * @returns {Observable<Array<T | null> | Record<string, T | null>>} -\n * An observable emitting an array or dictionary of the latest values from each source observable.\n *\n * @throws {Error} -\n * Throws an error if the provided argument is not an array of observables or a dictionary of observables.\n */\nexport function combineLatestEager<T>(\n sources: Array<Observable<T>> | Record<string, Observable<T>>,\n startWithNullForAll = false,\n): Observable<Array<T | null> | Record<string, T | null>> {\n function observableMapper<T>(observable: Observable<T>) {\n if (startWithNullForAll) {\n return observable.pipe(startWith(null));\n } else {\n // Check if observable is a Subject, if true, apply startWith(null)\n return observable instanceof Subject ? observable.pipe(startWith(null)) : observable;\n }\n }\n\n if (Array.isArray(sources)) {\n // If sources is an array of observables\n return combineLatest(sources.map(observableMapper));\n } else if (typeof sources === 'object' && sources !== null) {\n // If sources is a dictionary of observables\n const observables: Record<string, Observable<T | null>> = {};\n\n for (const [key, value] of Object.entries(sources)) {\n observables[key] = observableMapper(value);\n }\n\n return combineLatest(observables);\n } else {\n throw new Error(\n `Invalid argument type. Please provide an array of observables or a dictionary of observables. Received: ${typeof sources}`,\n );\n }\n}\n","import {HttpErrorResponse} from '@angular/common/http';\nimport {catchError, map, Observable, of, pipe, startWith, tap, TapObserver, UnaryFunction} from 'rxjs';\n\nimport {AsyncState} from '../models/async-state.model';\n\n/**\n * createAsyncState transforms an Observable of type T into an Observable of AsyncState<T>.\n * AsyncState<T> represents the loading, error, and data states for asynchronous operations.\n *\n * @template T - The type of the data in the observable.\n * @template E - The type of the error that can occur.\n *\n * @param {Partial<Observer<T>> | ((value: T) => void)} [observerOrNextForOrigin] -\n * An optional parameter that can be a partial TapObserver<T> or a function to handle the next value or error in the original Observable.\n *\n * @returns {UnaryFunction<Observable<T>, Observable<AsyncState<T, E>>>} -\n * A function that transforms an observable stream into an asynchronous state.\n *\n * @example\n * Usage 1: Simple request\n * data$ = this.shopService.products$.pipe(\n * createAsyncState({\n * next: res => console.log('Side effect if success: ' + res),\n * error: error => console.error('Side effect if error: ' + error.message)\n * })\n * );\n *\n * Usage 2: Dependent requests\n * data$ = firstCall$.pipe(\n * switchMap(() => this.shopService.products$),\n * createAsyncState()\n * );\n *\n * Another implementation thought when refreshing the data: instead of startWith, `merge of` emit as the trigger\n *\n * subject.pipe(\n * switchMap(() => merge(\n * of({ loading: true, error: null, data: null }),\n * this.service.apiCall().pipe(\n * map(data => ({ loading: false, error: null, data })),\n * tap({\n * next: res => callback?.(res.data),\n * error: err => errorCallback?.(err),\n * }),\n * catchError(error => of({ loading: false, error, data: null })),\n * ),\n * ))\n * )\n *\n */\nexport function createAsyncState<T, E = HttpErrorResponse>(\n observerOrNextForOrigin?: Partial<TapObserver<T>> | ((value: T) => void),\n): UnaryFunction<Observable<T>, Observable<AsyncState<T, E>>> {\n return pipe(\n tap(observerOrNextForOrigin),\n map((data) => ({loading: false, error: null, data})),\n startWith({loading: true, error: null, data: null}),\n // retry(1), // if you want to add retry\n catchError((error: E) => of({loading: false, error, data: null})),\n );\n}\n","import {Observable, OperatorFunction, Subscriber, TeardownLogic} from 'rxjs';\n\n/**\n * Creates an operator function for RxJS Observables that filters out consecutive\n * values that are considered equal according to a provided comparator function,\n * and invokes a callback when a distinct value is encountered.\n *\n * @template T - The type of elements emitted by the observable.\n * @param {(previousValue: T, currentValue: T) => void} onChangeCallback\n * A callback function that will be invoked when a distinct value is encountered.\n * It receives the previous distinct value and the current value.\n * @param {(previousValue: T, currentValue: T) => boolean} [comparator]\n * A function that determines if two values are considered equal.\n * Defaults to a function that performs strict equality (===) comparison.\n * @returns {OperatorFunction<T, T>} - The RxJS operator function.\n *\n * @example\n * Example 1:\n * const source$ = new Observable<number>((observer) => {\n * observer.next(1);\n * observer.next(2);\n * observer.next(2);\n * observer.next(3);\n * observer.next(3);\n * observer.next(4);\n * observer.next(5);\n * observer.complete();\n * });\n *\n * const distinctOnChange$ = source$.pipe(\n * distinctOnChange(\n * (prev, curr) => console.log(`Value changed from ${prev} to: ${curr}`),\n * (prev, curr) => prev === curr,\n * ),\n * );\n * distinctOnChange$.subscribe((res) => console.log(res));\n *\n *\n * Example 2:\n * distinctOnChange<RDEValue<OseInstance>[]>(\n * () => {\n * this.store.dispatch(\n * addToast({\n * toast: {\n * type: ToastType.SUCCESS,\n * title: this.l10nService.getMessage('STATUS_CHANGE'),\n * description: this.l10nService.getMessage('STATUS_CHANGE_DESC'),\n * },\n * }),\n * );\n * },\n * (prev, current) =>\n * prev.every((prevInstance, index) => instanceComparator(prevInstance.entity, current[index].entity)),\n * );\n */\nexport function distinctOnChange<T>(\n onChangeCallback: (previousValue: T, currentValue: T) => void,\n comparator: (previousValue: T, currentValue: T) => boolean = (prev, curr) => prev === curr,\n): OperatorFunction<T, T> {\n return (source: Observable<T>) =>\n new Observable<T>((subscriber: Subscriber<T>): TeardownLogic => {\n let hasFirstValue = false;\n let previousValue: T;\n\n const subscription = source.subscribe({\n next: (currentValue: T) => {\n if (hasFirstValue) {\n if (!comparator(previousValue, currentValue)) {\n onChangeCallback(previousValue, currentValue);\n previousValue = currentValue;\n subscriber.next(currentValue);\n }\n } else {\n previousValue = currentValue;\n hasFirstValue = true;\n subscriber.next(currentValue);\n }\n },\n error: (err: unknown) => subscriber.error(err),\n complete: () => subscriber.complete(),\n });\n\n return () => subscription.unsubscribe();\n });\n}\n","import {OperatorFunction, pipe, tap} from 'rxjs';\n\n// Define a type for different logger functions\ntype LoggerType = 'count' | 'debug' | 'dir' | 'log' | 'table';\n\n// Define a more permissive type for console functions\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ConsoleFunction = (...args: any[]) => void;\n\n// Map each LoggerType to its corresponding console function\nconst loggerFunctions: Record<LoggerType, ConsoleFunction> = {\n count: console.count.bind(console),\n debug: console.debug.bind(console),\n dir: console.dir.bind(console),\n log: console.log.bind(console),\n table: console.table.bind(console),\n};\n\n/**\n * Logger operator for RxJS observables.\n *\n * @param loggerType The type of logger to be used: 'count', 'debug', 'dir', 'log', 'table'.\n * Defaults to 'log' if not provided or if an unknown type is specified.\n * @returns An RxJS operator function that logs values using the specified console function.\n */\nexport const logger = <T>(loggerType: LoggerType = 'log'): OperatorFunction<T, T> =>\n pipe(\n tap((value: T) => {\n const logFunction = loggerFunctions[loggerType] || console.log.bind(console);\n logFunction(value);\n }),\n );\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isPromise(obj: any): obj is Promise<any> {\n return !!obj && typeof obj.then === 'function';\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {Signal} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {\n catchError,\n EMPTY,\n exhaustMap,\n from,\n isObservable,\n map,\n merge,\n Observable,\n of,\n share,\n startWith,\n timer,\n} from 'rxjs';\n\nimport {AsyncState} from '../models';\nimport {isPromise} from '../utils/is-promise.util';\n\n/**\n * Polls data at a specified interval and can be triggered manually.\n *\n * @template Data - The type of the data emitted by the polling function.\n * @template Input - The type of the input parameter used to build polling parameters.\n * @param {object} options - The configuration options for polling.\n * @param {number} options.interval - The interval in milliseconds between each poll.\n * @param {(params: any) => Observable<Data> | Data} options.pollingFn - A function that returns an Observable, Promise, or primitive value.\n * @param {(input: Input | null) => any} [options.paramsBuilder] - An optional function that builds parameters for the polling function based on the input. The value emitted by the trigger observable will serve as the parameter.\n * @param {Observable<Input> | Signal<Input>} [options.trigger] - An optional Observable or Signal that triggers a manual poll.\n * @returns {Observable<AsyncState<Data>>} An Observable emitting objects representing the state of the asynchronous operation.\n */\nexport function poll<Data, Input>(options: {\n interval: number;\n pollingFn: (params: any) => Observable<Data> | Promise<Data> | Data;\n paramsBuilder?: (input: Input | null) => any;\n trigger?: Observable<Input> | Signal<Input>;\n}): Observable<AsyncState<Data>> {\n let latestInput: Input | null = null;\n\n const trigger$ =\n options.trigger === undefined\n ? EMPTY\n : isObservable(options.trigger)\n ? options.trigger\n : toObservable(options.trigger);\n\n return merge(trigger$, timer(0, options.interval)).pipe(\n exhaustMap((input) => {\n let params: any;\n\n const isManualTrigger = typeof input !== 'number';\n if (isManualTrigger) {\n latestInput = input;\n }\n if (options.paramsBuilder) {\n params = options.paramsBuilder(latestInput);\n }\n\n const isFirstRequest = input === 0;\n const shouldShowLoading = isManualTrigger || isFirstRequest;\n\n const fnResult = options.pollingFn(params);\n const fnResult$ = isObservable(fnResult) ? fnResult : isPromise(fnResult) ? from(fnResult) : of(fnResult);\n\n let observable$ = fnResult$.pipe(\n map((data) => ({loading: false, error: null, data})),\n catchError((error) => of({loading: false, error, data: null})),\n );\n\n if (shouldShowLoading) {\n observable$ = observable$.pipe(startWith({loading: true, error: null, data: null}));\n }\n\n return observable$;\n }),\n share(),\n );\n}\n","import {Observable} from 'rxjs';\n\n/**\n * Operator that taps into a callback before the source Observable starts emitting values.\n *\n * This operator is useful for triggering a side effect before the main Observable starts emitting.\n *\n * @param callback A function to be executed before the source Observable emits its first value.\n * @returns An RxJS operator function that taps into the callback and then switchMaps to the source Observable.\n */\nexport function startWithTap<T>(callback: () => void) {\n return (source: Observable<T>) => {\n callback();\n return source;\n };\n}\n","import {HttpErrorResponse} from '@angular/common/http';\nimport {Observable, OperatorFunction, switchMap} from 'rxjs';\n\nimport {AsyncState} from '../models';\nimport {createAsyncState} from './create-async-state.operator';\n\n/**\n * Custom RxJS operator that uses switchMap to handle asynchronous operations and\n * transforms the emitted values into an AsyncState object.\n *\n * @template T - The type of data emitted by the observable returned by the project.\n * @template K - The type of value emitted by the source observable.\n * @template E - The type of error that can be encountered during the asynchronous operation.\n *\n * @param {function(K): Observable<T>} project - A function that takes a value emitted by the source\n * observable and returns an observable representing an asynchronous operation.\n *\n * @returns {OperatorFunction<K, AsyncState<T, E>>} - An RxJS operator that transforms the source observable into\n * an observable of AsyncState objects.\n *\n * @example\n * // Usage of the switchMapWithAsyncState operator\n * const source$ = new BehaviorSubject<number>(1);\n *\n * const asyncOperation = (value: number) => {\n * return of(value * 2).pipe(delay(1000));\n * };\n *\n * const result$ = source$.pipe(switchMapWithAsyncState(asyncOperation));\n * result$.subscribe((state) => {\n * console.log(state); // Outputs AsyncState objects with loading, data, and error properties.\n * });\n */\nexport function switchMapWithAsyncState<T, K, E = HttpErrorResponse>(\n project: (value: K, index: number) => Observable<T>,\n): OperatorFunction<K, AsyncState<T, E>> {\n return (source: Observable<K>) =>\n source.pipe(switchMap((value, index) => project(value, index).pipe(createAsyncState<T, E>())));\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n name: 'arrayJoin',\n standalone: true,\n})\nexport class ArrayJoinPipe implements PipeTransform {\n transform(value: unknown, separator: string = ',') {\n if (Array.isArray(value)) {\n return value.join(separator);\n }\n\n // For non-array cases or unexpected types, return the value as is\n return value;\n }\n}\n","import {inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\n\n/**\n * import { LOCALE_ID, NgModule } from '@angular/core';\n * import { BrowserModule } from '@angular/platform-browser';\n * import { AppComponent } from './app.component';\n * import { registerLocaleData } from '@angular/common';\n *\n * import localeEn from '@angular/common/locales/en';\n * import localeFr from '@angular/common/locales/fr';\n *\n * // Register locales\n * registerLocaleData(localeEn);\n * registerLocaleData(localeFr);\n *\n * @NgModule({\n * declarations: [AppComponent],\n * imports: [BrowserModule],\n * providers: [\n * {\n * provide: LOCALE_ID,\n * useFactory: () => {\n * // Use the browser's language or a default language\n * return navigator.language || 'en';\n * },\n * },\n * ],\n * bootstrap: [AppComponent],\n * })\n * export class AppModule {}\n */\n\n@Pipe({\n name: 'byteConverter',\n standalone: true,\n})\nexport class ByteConverterPipe implements PipeTransform {\n private locale = inject<string>(LOCALE_ID);\n // If using navigator.language directly in the pipe, this approach directly uses the browser's language at the moment the ByteConverterPipe is constructed. If the user changes the language while using the application, it won't be automatically reflected. If dynamic language changes are a requirement, using the LOCALE_ID provider as demonstrated in the AppModule is a more Angular-centric approach.\n // private locale: string;\n // constructor() {\n // // Use navigator.language as the default locale\n // this.locale = navigator.language || 'en';\n // }\n\n transform(value: number): string {\n if (value === null || value === undefined || isNaN(value)) {\n return '-';\n }\n\n const units = ['BYTE', 'KB', 'MB', 'GB', 'TB'];\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n\n const translationObject = translations[this.locale] || translations['en'];\n const key = units[unitIndex];\n\n return this.formatNumber(value) + ' ' + translationObject[key];\n }\n\n private formatNumber(value: number): string {\n return new Intl.NumberFormat(this.locale, {maximumFractionDigits: 2}).format(value);\n }\n}\n\nconst translations: Record<string, Record<string, string>> = {\n en: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n 'en-US': {\n // You can provide specific variations for en-US if needed\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n de: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n es: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n fr: {\n BYTE: 'o',\n KB: 'Ko',\n MB: 'Mo',\n GB: 'Go',\n TB: 'To',\n },\n it: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n ja: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n ko: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n 'pt-BR': {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n 'zh-CN': {\n BYTE: '字节',\n KB: '千字节',\n MB: '兆字节',\n GB: '千兆字节',\n TB: '太字节',\n },\n 'zh-TW': {\n BYTE: '位元組',\n KB: '千位元組',\n MB: '兆位元組',\n GB: '千兆位元組',\n TB: '太位元組',\n },\n ru: {\n BYTE: 'Б',\n KB: 'КБ',\n MB: 'МБ',\n GB: 'ГБ',\n TB: 'ТБ',\n },\n};\n","// https://regex101.com/library/mX1xW0\nexport const emailPattern = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/;\n\nexport const urlPattern =\n /^https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/;\nexport const httpsPattern =\n /^https:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/;\n","import {Pipe, PipeTransform} from '@angular/core';\n\nimport {httpsPattern} from '../const';\n\n@Pipe({\n name: 'isHttps',\n standalone: true,\n})\nexport class IsHttpsPipe implements PipeTransform {\n transform(value: string): boolean {\n return httpsPattern.test(value);\n }\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\nconst unmaskNumber = 6;\nconst maskChar = '*';\n\nexport interface MaskOptions {\n unmaskedPrefixLength?: number;\n unmaskedSuffixLength?: number;\n masked?: boolean;\n}\n\n@Pipe({\n name: 'mask',\n standalone: true,\n})\nexport class MaskPipe implements PipeTransform {\n /**\n * Transforms the input string by masking characters based on the provided options.\n *\n * @param {string} value - The input string to be masked.\n * @param {MaskOptions} [options={}] - Options for customizing the masking behavior.\n * @returns {string} - The masked string.\n */\n transform(value: string, options: MaskOptions = {}): string {\n const {unmaskedPrefixLength = unmaskNumber, unmaskedSuffixLength = unmaskNumber, masked = true} = options;\n\n if (\n value.length <= unmaskedPrefixLength + unmaskedSuffixLength ||\n unmaskedPrefixLength < 0 ||\n unmaskedSuffixLength < 0 ||\n !masked\n ) {\n return value;\n }\n\n return value\n .split('')\n .map((char, i) => (i < unmaskedPrefixLength || i > value.length - unmaskedSuffixLength - 1 ? char : maskChar))\n .join('');\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {assertInInjectionContext, computed, Injector, isSignal, Signal, untracked} from '@angular/core';\nimport {toObservable, toSignal} from '@angular/core/rxjs-interop';\nimport {\n combineLatest,\n distinctUntilChanged,\n from,\n identity,\n isObservable,\n ObservableInput,\n ObservableInputTuple,\n OperatorFunction,\n startWith,\n} from 'rxjs';\n\ntype ObservableSignalInput<T> = ObservableInput<T> | Signal<T>;\n\ntype ObservableSignalInputTuple<T> = {\n [K in keyof T]: ObservableSignalInput<T[K]> | (() => T[K]);\n};\n\n// pick from ToSignalOptions\nexport type CombineFromOptions<IValue> = {\n readonly injector?: Injector;\n readonly initialValue?: IValue;\n};\n\n// array inputs only\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n): Signal<Output>;\n\n// ---------- 3 args with array inputs -------------\n// combineFrom([signal, obs$], pipeOperator, { initialValue: [1,2] }), Input is [signal, obs$]\n// 1. no initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\n// 2. initialValue is null, returning type should include null\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\n// 3. provide initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n// ---------- 2 args wit array inputs -------------\n// 1. no initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\n// 2. initialValue is null, returning type should include null\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\n// 3. provide initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n// object input only, e.g. Input is { a: signal, b: obs$ }\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n): Signal<Output>;\n\n// ----------------- 3 args with object input --------------------\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n// ----------------- 2 args with object input --------------------\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n/**\n * Combines multiple `Observable` or `Signal` sources into a `Signal` that emits their values. It's like combineLatest.\n *\n * @param {ObservableSignalInputTuple} sources - Array or object of `Observable` or `Signal` values\n * @param {OperatorFunction} [operator] - Operator to apply to the combined values\n * @param {CombineFromOptions} [options] - Options including `initialValue` and `injector`\n * @returns Signal emitting the combined values\n *\n * @example\n * ```ts\n * export class Component {\n * private readonly userService = inject(UserService);\n * page = signal(2);\n *\n * data = combineFrom(\n * [this.page, this.userService.users$],\n * pipe(\n * switchMap(([page, users]) => this.dataService.getData(page, users)),\n * startWith([])\n * )\n * );\n * }\n * ```\n */\nexport function combineFrom<Input = any, Output = Input>(...args: any[]): Signal<Output | null | undefined> {\n assertInInjectionContext(combineFrom);\n\n const {normalizedSources, hasInitValue, operator, options} = normalizeArgs<Input, Output>(args);\n\n const ret = hasInitValue\n ? toSignal(combineLatest(normalizedSources).pipe(operator), {\n initialValue: options!.initialValue!,\n injector: options?.injector,\n })\n : (toSignal(combineLatest(normalizedSources).pipe(operator), {\n injector: options?.injector,\n // requireSync: true,\n }) as Signal<Output | undefined>);\n\n return ret;\n}\n\nfunction normalizeArgs<Input, Output>(\n args: any[],\n): {\n normalizedSources: ObservableInputTuple<Input>;\n operator: OperatorFunction<Input, Output>;\n hasInitValue: boolean;\n options: CombineFromOptions<Output> | undefined;\n} {\n if (!args || args.length < 1 || typeof args[0] !== 'object') {\n throw new TypeError('combineFrom needs sources');\n }\n\n const hasOperator = typeof args[1] === 'function';\n\n if (args.length === 3 && !hasOperator) {\n throw new TypeError('combineFrom needs a pipe operator as the second argument');\n }\n\n // pass sources and options\n if (!hasOperator) {\n // add identity function to args at index 1 as operator function as x=>x\n args.splice(1, 0, identity);\n }\n\n // if no operator passed, identity will be operator\n const [sources, operator, options] = args;\n\n const hasInitValue = options?.initialValue !== undefined;\n\n const normalizedSources = Object.entries(sources).reduce(\n (acc, [keyOrIndex, source]) => {\n if (isSignal(source)) {\n acc[keyOrIndex] = toObservable(source, {injector: options?.injector}).pipe(\n // toObservable doesn't immediately emit initialValue of the signal\n startWith(untracked(source)),\n );\n } else if (isObservable(source)) {\n acc[keyOrIndex] = source.pipe(distinctUntilChanged());\n } else if (typeof source === 'function') {\n // seldom use: pass function like () => 5\n const computedRes = computed(source as () => unknown);\n acc[keyOrIndex] = toObservable(computedRes, {injector: options?.injector}).pipe(startWith(source()));\n } else {\n // seldom use: pass promise, Map, array, etc that from accepts\n acc[keyOrIndex] = from(source as any).pipe(distinctUntilChanged());\n }\n return acc;\n },\n (Array.isArray(sources) ? [] : {}) as any,\n );\n\n return {normalizedSources, operator, hasInitValue, options};\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {computed, CreateComputedOptions, DestroyRef, effect, inject, Signal, signal, untracked} from '@angular/core';\nimport {concatAll, exhaustAll, isObservable, mergeAll, Observable, Subject, switchAll} from 'rxjs';\n\ntype ComputedAsyncBehavior = 'switch' | 'merge' | 'concat' | 'exhaust';\n\n// { equal, behavior }\ntype BaseOptions<T> = CreateComputedOptions<T> & {behavior?: ComputedAsyncBehavior};\n\ntype OptionsWithInitialValue<T> = {initialValue: T} & BaseOptions<T>;\ntype OptionsWithOptionalInitialValue<T> = {initialValue?: undefined} & BaseOptions<T>;\ntype OptionsWithRequireSync<T> = {requireSync: true} & BaseOptions<T>;\n\n// without options\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n): Signal<T | undefined>;\n\n// with optional initialValue\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n options: OptionsWithOptionalInitialValue<T>,\n): Signal<T | undefined>;\n\n// with initialValue\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n options: OptionsWithInitialValue<T>,\n): Signal<T>;\n\n// for promise, without initialValue but set requireSync as true, throw error\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Promise<T>,\n options: OptionsWithOptionalInitialValue<T> & {requireSync: true},\n): never;\n\n// for observables, without initialValue, without requireSync, return T | undefined\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | T | undefined,\n options: {\n initialValue?: undefined;\n requireSync?: false;\n } & BaseOptions<T>,\n): Signal<T | undefined>;\n\n// for observables, without initialValue, but requireSync is true, return T\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | T,\n options: OptionsWithRequireSync<T> & {initialValue?: undefined | T},\n): Signal<T>;\n\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n options: any = {},\n): Signal<T | undefined> {\n const destroyRef = inject(DestroyRef);\n\n const sourceSubject = new Subject<Promise<T> | Observable<T>>();\n const source$ = flattenObservable(sourceSubject, options.behavior || 'switch');\n\n const sourceValue = signal<T | undefined>(options.initialValue);\n\n const sourceResult = source$.subscribe({\n next: (value) => sourceValue.set(value),\n error: (error) => {\n sourceValue.set(error);\n // Error should be handled by the user\n // throw error;\n },\n });\n\n destroyRef.onDestroy(() => sourceResult.unsubscribe());\n\n if (options.requireSync && options.initialValue === undefined) {\n const initialEmission = computeFn(undefined);\n\n if (isPromise(initialEmission)) {\n throw new Error(`Promises cannot work with requireSync. Set requireSync to false or pass an initialValue.`);\n }\n\n if (isObservable(initialEmission)) {\n sourceSubject.next(initialEmission);\n } else {\n // primitive value T\n sourceValue.set(initialEmission);\n }\n }\n\n if (options.requireSync && sourceValue() === undefined) {\n throw new Error(`The observable doesn't emit synchronously. Set requireSync to false or pass an initialValue.`);\n }\n\n let shouldSkipFirstComputation = options.requireSync === true;\n\n effect(() => {\n const currentValue = untracked(() => sourceValue());\n\n const newSource = computeFn(currentValue);\n\n if (shouldSkipFirstComputation) {\n shouldSkipFirstComputation = false;\n return;\n }\n\n if (isPromise(newSource) || isObservable(newSource)) {\n untracked(() => sourceSubject.next(newSource));\n } else {\n untracked(() => sourceValue.set(newSource));\n }\n });\n\n return computed(() => sourceValue() as T, {equal: options.equal});\n}\n\nfunction flattenObservable<T>(\n source: Subject<Promise<T> | Observable<T>>,\n behavior: ComputedAsyncBehavior,\n): Observable<T> {\n const behaviorMap = {\n switch: switchAll,\n merge: mergeAll,\n concat: concatAll,\n exhaust: exhaustAll,\n };\n\n return source.pipe(behaviorMap[behavior]());\n}\n\nfunction isPromise<T>(value: any): value is Promise<T> {\n return value && typeof value.then === 'function';\n}\n","import {signal} from '@angular/core';\n\nexport function createTrigger() {\n const sourceSignal = signal(0);\n\n return {\n next: () => {\n sourceSignal.update((v) => v + 1);\n },\n value: sourceSignal.asReadonly(),\n };\n}\n","import {assertInInjectionContext, inject, type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {ActivatedRoute, type Params} from '@angular/router';\nimport {map} from 'rxjs';\n\ntype ParamsTransformFn<Output> = (params: Params) => Output;\n\n/**\n * The `InputOptions` interface defines options for configuring the behavior of the `injectParams` function.\n *\n * @template Output - The expected type of the read value.\n */\nexport interface ParamsOptions<Output> {\n /**\n * A transformation function to convert the written value to the expected read value.\n *\n * @param v - The value to transform.\n * @returns The transformed value.\n */\n transform?: (v: string) => Output;\n\n /**\n * The initial value to use if the parameter is not present or undefined.\n */\n initialValue?: Output;\n}\n\n/**\n * Injects the params from the current route.\n * If a key is provided, returns the value of that key.\n * If a transform function is provided, returns the result of the function.\n * Otherwise, returns the entire params object.\n *\n * @example\n * const params = injectParams(); // Returns the entire params object\n * const userId = injectParams('id'); // Returns the value of the 'id' param\n * const userId = injectParams(p => p['id'] as string); // Returns the 'id' param using a custom transform function\n * const userId = injectParams('id', { transform: numberAttribute, initialValue: 1 });\n *\n * @param keyOrParamsTransform OPTIONAL The key of the param to return, or a transform function to apply to the params object\n */\nexport function injectParams(): Signal<Params>;\n\nexport function injectParams<Output>(fn: ParamsTransformFn<Output>): Signal<Output>;\n\nexport function injectParams(key: string): Signal<string | null>;\n\n// for boolean or number, if initialValue is provided, transform is a must\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue: boolean},\n): Signal<boolean>;\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => number; initialValue: number},\n): Signal<number>;\n// for string, transform is optional\nexport function injectParams(\n key: string,\n options: {transform?: (v: string) => string; initialValue: string},\n): Signal<string>;\n\n// initialValue not provided, must provide transform fn\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue?: undefined},\n): Signal<boolean | null>;\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => number; initialValue?: undefined},\n): Signal<number | null>;\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => string; initialValue?: undefined},\n): Signal<string | null>;\n\nexport function injectParams<Output>(\n keyOrParamsTransform?: string | ParamsTransformFn<Output>,\n options: ParamsOptions<Output> = {},\n): Signal<Output | Params | string | boolean | number | null> {\n assertInInjectionContext(injectParams);\n\n const route = inject(ActivatedRoute);\n const initialParams = route.snapshot.params;\n\n const {transform, initialValue} = options;\n\n // injectParams(): Signal<Params>\n if (!keyOrParamsTransform) {\n return toSignal(route.params, {initialValue: initialParams});\n }\n\n // injectParams<Output>(fn: ParamsTransformFn<Output>): Signal<Output>\n if (typeof keyOrParamsTransform === 'function') {\n return toSignal(route.params.pipe(map(keyOrParamsTransform)), {initialValue: keyOrParamsTransform(initialParams)});\n }\n\n // keyOrParamsTransform is string.\n // export function injectParams(key: string): Signal<string | null>;\n // export function injectParams(key: string, options: { transform: (v: string) => boolean; initialValue: boolean }): Signal<boolean>;\n // export function injectParams(key: string, options: { transform: (v: string) => number; initialValue: number }): Signal<number>;\n // export function injectParams(key: string, options: { transform?: (v: string) => string; initialValue: string }): Signal<string>;\n // export function injectParams(key: string, options: { transform: (v: string) => boolean; initialValue?: undefined }): Signal<boolean | null>;\n // export function injectParams(key: string, options: { transform: (v: string) => number; initialValue?: undefined }): Signal<number | null>;\n // export function injectParams(key: string, options: { transform: (v: string) => string; initialValue?: undefined }): Signal<string | null>;\n const getParam = (params: Params) => {\n const param = params?.[keyOrParamsTransform] as string | undefined;\n\n if (!param) {\n return initialValue ?? null;\n }\n\n return transform ? transform(param) : param;\n };\n\n return toSignal(route.params.pipe(map(getParam)), {initialValue: getParam(initialParams)});\n}\n","import {assertInInjectionContext, inject, type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {ActivatedRoute, type Params} from '@angular/router';\nimport {map} from 'rxjs';\n\ntype QueryParamsTransformFn<Output> = (params: Params) => Output;\n\n/**\n * The `InputOptions` interface defines options for configuring the behavior of the `injectQueryParams` function.\n *\n * @template Output - The expected type of the read value.\n */\nexport interface QueryParamsOptions<Output> {\n /**\n * A transformation function to convert the written value to the expected read value.\n *\n * @param v - The value to transform.\n * @returns The transformed value.\n */\n transform?: (v: string) => Output;\n\n /**\n * The initial value to use if the query parameter is not present or undefined.\n */\n initialValue?: Output;\n}\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n *\n * @returns A `Signal` that emits the entire query parameters object.\n */\nexport function injectQueryParams(): Signal<Params>;\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n * It retrieves the value of a query parameter based on a custom transform function applied to the query parameters object.\n *\n * @template Output - The expected type of the read value.\n * @param {QueryParamsTransformFn<Output>} fn - A transform function that takes the query parameters object (`params: Params`) and returns the desired value.\n * @returns {Signal} A `Signal` that emits the transformed value based on the provided custom transform function.\n *\n * @example\n * const searchValue = injectQueryParams((params) => params['search'] as string);\n */\nexport function injectQueryParams<Output>(fn: QueryParamsTransformFn<Output>): Signal<Output>;\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n *\n * @param {string} key - The name of the query parameter to retrieve.\n * @returns {Signal} A `Signal` that emits the value of the specified query parameter, or `null` if it's not present.\n */\nexport function injectQueryParams(key: string): Signal<string | null>;\n\n// for boolean or number, if initialValue is provided, transform is a must\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue: boolean},\n): Signal<boolean>;\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => number; initialValue: number},\n): Signal<number>;\n// for string, transform is optional\nexport function injectQueryParams(\n key: string,\n options: {transform?: (v: string) => string; initialValue: string},\n): Signal<string>;\n\n// initialValue not provided, must provide transform fn\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue?: undefined},\n): Signal<boolean | null>;\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => number; initialValue?: undefined},\n): Signal<number | null>;\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => string; initialValue?: undefined},\n): Signal<string | null>;\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n *\n * @template Output - The expected type of the read value.\n * @param {string} keyOrParamsTransform - The name of the query parameter to retrieve, or a transform function to apply to the query parameters object.\n * @param {QueryParamsOptions} options - Optional configuration options for the query parameter.\n * @returns {QueryParamsOptions} A `Signal` that emits the transformed value of the specified query parameter, or the entire query parameters object if no key is provided.\n *\n * @example\n * const search = injectQueryParams('search'); // returns the value of the 'search' query param\n * const search = injectQueryParams(p => p['search'] as string); // same as above but can be used with a custom transform function\n * const idParam = injectQueryParams('id', {transform: numberAttribute}); // returns the value fo the 'id' query params and transforms it into a number\n * const idParam = injectQueryParams(p => numberAttribute(p['id'])); // same as above but can be used with a custom transform function\n * const queryParams = injectQueryParams(); // returns the entire query params object\n */\nexport function injectQueryParams<Output>(\n keyOrParamsTransform?: string | QueryParamsTransformFn<Output>,\n options: QueryParamsOptions<Output> = {},\n): Signal<Output | Params | string | boolean | number | null> {\n assertInInjectionContext(injectQueryParams);\n\n const route = inject(ActivatedRoute);\n const initialQueryParams = route.snapshot.queryParams;\n\n const {transform, initialValue} = options;\n\n // injectQueryParams(): Signal<Params>\n if (!keyOrParamsTransform) {\n return toSignal(route.queryParams, {initialValue: initialQueryParams});\n }\n\n // injectQueryParams<Output>(fn: QueryParamsTransformFn<Output>): Signal<Output>\n if (typeof keyOrParamsTransform === 'function') {\n return toSignal(route.queryParams.pipe(map(keyOrParamsTransform)), {\n initialValue: keyOrParamsTransform(initialQueryParams),\n });\n }\n\n // keyOrParamsTransform is string.\n const getParam = (params: Params) => {\n const param = params?.[keyOrParamsTransform] as string | string[] | undefined;\n\n if (!param) {\n return initialValue ?? null;\n }\n\n if (Array.isArray(param)) {\n if (param.length < 1) {\n return initialValue ?? null;\n }\n return transform ? transform(param[0]) : param[0];\n }\n\n return transform ? transform(param) : param;\n };\n\n return toSignal(route.queryParams.pipe(map(getParam)), {\n initialValue: getParam(initialQueryParams),\n });\n}\n","import {assertInInjectionContext, Injector, isSignal, Signal, untracked} from '@angular/core';\nimport {toObservable, toSignal} from '@angular/core/rxjs-interop';\nimport {\n distinctUntilChanged,\n from,\n identity,\n isObservable,\n merge,\n ObservableInput,\n OperatorFunction,\n startWith,\n} from 'rxjs';\n\ntype ObservableSignalInput<T> = ObservableInput<T> | Signal<T>;\n\ntype ObservableSignalInputTuple<T> = {\n [K in keyof T]: ObservableSignalInput<T[K]>;\n};\n\n// pick from ToSignalOptions\nexport type MergeFromOptions<T> = {\n readonly injector?: Injector;\n readonly initialValue?: T | null;\n};\n\nexport function mergeFrom<Input extends readonly unknown[], Output = Input[number]>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input[number], Output>,\n options?: MergeFromOptions<Output>,\n): Signal<Output>;\n\nexport function mergeFrom<Input extends readonly unknown[], Output = Input[number]>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: MergeFromOptions<Output>,\n): Signal<Output>;\n\n// No object inputs\n\n/**\n * merge multiple `Observable` or `Signal` sources into a `Signal` that emits the last value. It's like merge.\n *\n * @param {ObservableSignalInputTuple} sources - Array of `Observable` or `Signal` values\n * @param {OperatorFunction} [operator] - Operator to apply to the merge\n * @param {MergeFromOptions} [options] - Options including `initialValue` and `injector`\n * @returns Signal emitting the latest merge result\n *\n * @example\n * ```ts\n * export class Component {\n * e$ = of(1).pipe(delay(1000));\n * f = signal(2);\n *\n * data = mergeFrom(\n * [this.e$, this.f],\n * pipe(\n * switchMap((res) => of(`${res} is coming~`)),\n * startWith(0),\n * ),\n * );\n * }\n * ```\n */\nexport function mergeFrom<Input extends readonly unknown[], Output = Input[number]>(...args: unknown[]) {\n assertInInjectionContext(mergeFrom);\n\n const [sources, operator = identity, options = {}] = parseArgs<Input, Output>(args);\n\n const normalizedSources = sources.map((source) => {\n if (isSignal(source)) {\n return toObservable(source, {injector: options.injector}).pipe(startWith(untracked(source)));\n }\n\n if (!isObservable(source)) {\n source = from(source);\n }\n\n return source.pipe(distinctUntilChanged());\n });\n\n const merged$ = merge(...normalizedSources).pipe(operator as OperatorFunction<Input[number], Output>);\n\n if (options.initialValue !== undefined) {\n return toSignal(merged$, {initialValue: options.initialValue as Output, injector: options.injector});\n }\n return toSignal(merged$, {requireSync: true, injector: options.injector});\n}\n\nfunction parseArgs<Input extends readonly unknown[], Output = Input[number]>(args: unknown[]) {\n if (!args || args.length < 1) {\n throw new TypeError('mergeFrom needs sources');\n }\n\n if (args.length === 1) {\n return [args[0] as readonly [...ObservableSignalInputTuple<Input>], undefined, undefined] as const;\n }\n\n if (args.length === 2) {\n const hasOperator = typeof args[1] === 'function';\n\n if (hasOperator) {\n return [\n args[0] as readonly [...ObservableSignalInputTuple<Input>],\n args[1] as OperatorFunction<Input[number], Output>,\n undefined,\n ] as const;\n }\n\n return [\n args[0] as readonly [...ObservableSignalInputTuple<Input>],\n undefined,\n args[1] as MergeFromOptions<Output>,\n ] as const;\n }\n\n return args as unknown as [\n readonly [...ObservableSignalInputTuple<Input>],\n OperatorFunction<Input[number], Output>,\n MergeFromOptions<Output>,\n ];\n}\n","/**\n * Calculates the difference in whole days between two dates.\n *\n * @param {Date | number | string} dateLeft - The date from which the difference is measured (the reference date).\n * Can be a Date object, a number representing milliseconds since the Unix epoch,\n * or a string in a format parseable by the Date constructor.\n * @param {Date | number | string} dateRight - The date to be compared against the reference date.\n * Can be a Date object, a number representing milliseconds since the Unix epoch,\n * or a string in a format parseable by the Date constructor.\n * @returns {number} The number of whole days between the reference date (dateLeft) and the compared date (dateRight).\n *\n * @example\n * // How many whole days are between '2022-09-08' and '2023-09-18'?\n * const result = differenceInDays('2022-09-08', new Date('2023-09-18'));\n */\nexport function differenceInDays(dateLeft: Date | number | string, dateRight: Date | number | string) {\n const _dateLeft = new Date(dateLeft);\n const _dateRight = new Date(dateRight);\n\n const difference = (_dateLeft.getTime() - _dateRight.getTime()) / (1000 * 60 * 60 * 24);\n\n return Math.floor(difference);\n}\n","import {AbstractControl, AsyncValidatorFn, ValidatorFn, Validators} from '@angular/forms';\nimport {of} from 'rxjs';\n\n/**\n * Provides a conditional validator that applies the specified validator functions only if the condition is met.\n *\n * @param condition A function that determines whether the validators should be applied.\n * @param trueValidatorFn The validator function or an array of validator functions to be applied when the condition is true.\n * @param falseValidatorFn Optional. The validator function or an array of validator functions to be applied when the condition is false.\n * @returns A validator function that can be used with Angular Reactive Forms.\n */\nexport function ifValidator(\n condition: (control: AbstractControl) => boolean,\n trueValidatorFn: ValidatorFn | ValidatorFn[],\n falseValidatorFn?: ValidatorFn | ValidatorFn[],\n): ValidatorFn {\n /**\n * @param control The AbstractControl to validate.\n * @returns Validation errors if the condition is met; otherwise, null.\n */\n return (control: AbstractControl): Validators | null => {\n if (!trueValidatorFn || !condition(control)) {\n return composeValidators(control, falseValidatorFn);\n }\n\n return composeValidators(control, trueValidatorFn);\n };\n}\n\n/**\n * Provides a conditional async validator that applies the specified async validator function only if the condition is met.\n *\n * @param condition A function that determines whether the async validator should be applied.\n * @param validatorFn The async validator function to be applied conditionally.\n * @returns An async validator function that can be used with Angular Reactive Forms.\n */\nexport function ifAsyncValidator(\n condition: (control: AbstractControl) => boolean,\n validatorFn: AsyncValidatorFn,\n): AsyncValidatorFn {\n /**\n * @param control The AbstractControl to validate asynchronously.\n * @returns An observable that emits validation errors if the condition is met; otherwise, emits null.\n */\n return (control: AbstractControl) => {\n if (!validatorFn || !condition(control)) {\n return of(null);\n }\n\n return validatorFn(control);\n };\n}\n\n/**\n * Composes and applies the provided validators to the given AbstractControl.\n *\n * @param control The AbstractControl to validate.\n * @param validatorFn The validator function or an array of validator functions to be applied.\n * @returns Validation errors if the validators are applicable; otherwise, null.\n */\nfunction composeValidators(\n control: AbstractControl,\n validatorFn: ValidatorFn | ValidatorFn[] | undefined,\n): Validators | null {\n if (!validatorFn) {\n return null;\n }\n\n const validatorFns = Array.isArray(validatorFn) ? validatorFn : [validatorFn];\n return Validators.compose(validatorFns)?.(control) || null;\n}\n","/**\n * Check if a value is empty.\n * @param {T | undefined | null} value - The value to check for emptiness.\n * @returns {boolean} - Returns true if the value is empty, otherwise false.\n */\nexport function isEmpty<T extends object | string | Array<unknown>>(value: T | undefined | null): value is null {\n if (value == null) return true;\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value as Record<string, unknown>).length === 0;\n }\n\n return false;\n}\n","/**\n * Check if two values are deeply equal.\n * @param {T} value1 - The first value to compare.\n * @param {T} value2 - The second value to compare.\n * @returns {boolean} - Returns true if the values are deeply equal, otherwise false.\n */\nexport function isEqual<T>(value1: T, value2: T): boolean {\n if (value1 === value2) return true;\n\n if (typeof value1 !== 'object' || typeof value2 !== 'object' || value1 === null || value2 === null) {\n return false;\n }\n\n const keys1 = Object.keys(value1) as Array<keyof T>;\n const keys2 = Object.keys(value2) as Array<keyof T>;\n\n if (keys1.length !== keys2.length) return false;\n\n for (const key of keys1) {\n if (!keys2.includes(key) || !isEqual(value1[key], value2[key])) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Create an object composed of object properties that satisfy a given condition.\n * @param {T} source - The object to pick properties from.\n * @param {(value: T[keyof T], key: string) => boolean} predicate - The function invoked per property.\n * @returns {Partial<T>} - Returns the new object.\n */\nexport function pickBy<T>(source: T, predicate: (value: T[keyof T], key: string) => boolean): Partial<T> {\n const result: Partial<T> = {};\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key) && predicate(source[key], key)) {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n","import {AbstractControl, FormArray, ValidationErrors, ValidatorFn} from '@angular/forms';\n\n/**\n * Validator for checking uniqueness across multiple fields in a FormArray or FormGroup.\n *\n * This validator can be applied to a FormArray or FormGroup containing the controls to be validated.\n * It ensures that each control's value is unique among all other controls within the array or group.\n */\nexport class UniqueValidator {\n /**\n * Validator function to be attached to a FormArray or FormGroup.\n *\n * This validator checks for uniqueness of each control's value within the array or group.\n *\n * @param keySelector A function to select the key control for comparison (default is the control itself).\n * @typeparam T The type of the control value.\n */\n static unique<T>(\n keySelector: (control: AbstractControl) => AbstractControl<T> = (control: AbstractControl<T>) => control,\n ): ValidatorFn {\n return (formArray: AbstractControl): ValidationErrors | null => {\n if (!(formArray instanceof FormArray)) {\n return null;\n }\n\n const targetControls = formArray.controls.map(keySelector);\n const valueControlMap = new Map<T, AbstractControl<T>>();\n const invalidControls: AbstractControl<T>[] = [];\n\n for (const control of targetControls) {\n const value = control.value;\n\n if (value == null || String(value) === '' || String(value) === 'NaN') {\n continue;\n }\n\n const controlInMap = valueControlMap.get(value);\n\n if (controlInMap) {\n if (!invalidControls.includes(controlInMap)) {\n invalidControls.push(controlInMap);\n }\n\n invalidControls.push(control);\n } else {\n valueControlMap.set(value, control);\n }\n }\n\n const notUniqueError = {notUnique: true};\n\n // set errors manually for target controls\n for (const control of targetControls) {\n const errors = control.errors;\n\n if (invalidControls.includes(control)) {\n // set not unique error for invalid controls\n control.setErrors(errors === null ? notUniqueError : {...errors, ...notUniqueError});\n } else {\n // remove not unique errors for valid controls\n if (errors === null) {\n control.setErrors(null);\n } else {\n delete errors['notUnique'];\n control.setErrors(Object.keys(errors).length > 0 ? errors : null);\n }\n }\n }\n\n return invalidControls.length > 0 ? notUniqueError : null;\n };\n }\n}\n","import {AbstractControl, ValidationErrors} from '@angular/forms';\n\nimport {httpsPattern, urlPattern} from '../const';\n\nexport function urlValidator(control: AbstractControl): ValidationErrors | null {\n if (!urlPattern.test(control.value)) {\n return {invalidUrl: true};\n }\n return null;\n}\n\nexport function httpsValidator(control: AbstractControl): ValidationErrors | null {\n if (!httpsPattern.test(control.value)) {\n return {invalidUrl: true};\n }\n return null;\n}\n","/*\n * Public API Surface of ngx-lift\n */\n\nexport * from './lib/models';\nexport * from './lib/operators';\nexport * from './lib/pipes';\nexport * from './lib/signals';\nexport * from './lib/utils';\nexport * from './lib/validators';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isPromise"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-lift.mjs","sources":["../../../projects/ngx-lift/src/lib/operators/combine-latest-eager.operator.ts","../../../projects/ngx-lift/src/lib/operators/create-async-state.operator.ts","../../../projects/ngx-lift/src/lib/operators/distinct-on-change.operator.ts","../../../projects/ngx-lift/src/lib/operators/logger.operator.ts","../../../projects/ngx-lift/src/lib/utils/is-promise.util.ts","../../../projects/ngx-lift/src/lib/operators/poll.operator.ts","../../../projects/ngx-lift/src/lib/operators/start-with-tap.operator.ts","../../../projects/ngx-lift/src/lib/operators/switch-map-with-async-state.operator.ts","../../../projects/ngx-lift/src/lib/pipes/array-join.pipe.ts","../../../projects/ngx-lift/src/lib/pipes/byte-converter.pipe.ts","../../../projects/ngx-lift/src/lib/const.ts","../../../projects/ngx-lift/src/lib/pipes/is-https.pipe.ts","../../../projects/ngx-lift/src/lib/pipes/mask.pipe.ts","../../../projects/ngx-lift/src/lib/signals/combine-from.ts","../../../projects/ngx-lift/src/lib/signals/computed-async.ts","../../../projects/ngx-lift/src/lib/signals/create-trigger.ts","../../../projects/ngx-lift/src/lib/signals/inject-params.ts","../../../projects/ngx-lift/src/lib/signals/inject-query-params.ts","../../../projects/ngx-lift/src/lib/signals/merge-from.ts","../../../projects/ngx-lift/src/lib/utils/difference-in-days.util.ts","../../../projects/ngx-lift/src/lib/utils/form.util.ts","../../../projects/ngx-lift/src/lib/utils/is-empty.util.ts","../../../projects/ngx-lift/src/lib/utils/is-equal.util.ts","../../../projects/ngx-lift/src/lib/utils/pick-by.util.ts","../../../projects/ngx-lift/src/lib/validators/unique.validator.ts","../../../projects/ngx-lift/src/lib/validators/url.validator.ts","../../../projects/ngx-lift/src/public-api.ts","../../../projects/ngx-lift/src/ngx-lift.ts"],"sourcesContent":["import {combineLatest, Observable, startWith, Subject} from 'rxjs';\n\nexport function combineLatestEager<T extends Observable<unknown>[]>(\n sources: T,\n startWithNullForAll?: boolean,\n): Observable<{[K in keyof T]: T[K] extends Observable<infer U> ? U | null : never}>;\n\nexport function combineLatestEager<T extends Record<string, Observable<unknown>>>(\n sources: T,\n startWithNullForAll?: boolean,\n): Observable<{[K in keyof T]: T[K] extends Observable<infer U> ? U | null : never}>;\n\n/**\n * Combines multiple observables into a single observable emitting an array or dictionary\n * of the latest values from each source observable.\n * Adds startWith(null) for each Subject in combineLatest when the second parameter startWithNullForAll is false.\n * When startWithNullForAll is true, each observable will startWith null.\n *\n * @template T - The type of the data in the observables.\n *\n * @param {Array<Observable<T>> | Record<string, Observable<T>>} sources -\n * An array of observables or a dictionary of observables to be combined.\n *\n * @param {boolean} [startWithNullForAll=false] -\n * Determines whether to start each observable with a `null` value.\n *\n * @returns {Observable<Array<T | null> | Record<string, T | null>>} -\n * An observable emitting an array or dictionary of the latest values from each source observable.\n *\n * @throws {Error} -\n * Throws an error if the provided argument is not an array of observables or a dictionary of observables.\n */\nexport function combineLatestEager<T>(\n sources: Array<Observable<T>> | Record<string, Observable<T>>,\n startWithNullForAll = false,\n): Observable<Array<T | null> | Record<string, T | null>> {\n function observableMapper<T>(observable: Observable<T>) {\n if (startWithNullForAll) {\n return observable.pipe(startWith(null));\n } else {\n // Check if observable is a Subject, if true, apply startWith(null)\n return observable instanceof Subject ? observable.pipe(startWith(null)) : observable;\n }\n }\n\n if (Array.isArray(sources)) {\n // If sources is an array of observables\n return combineLatest(sources.map(observableMapper));\n } else if (typeof sources === 'object' && sources !== null) {\n // If sources is a dictionary of observables\n const observables: Record<string, Observable<T | null>> = {};\n\n for (const [key, value] of Object.entries(sources)) {\n observables[key] = observableMapper(value);\n }\n\n return combineLatest(observables);\n } else {\n throw new Error(\n `Invalid argument type. Please provide an array of observables or a dictionary of observables. Received: ${typeof sources}`,\n );\n }\n}\n","import {HttpErrorResponse} from '@angular/common/http';\nimport {catchError, map, Observable, of, pipe, startWith, tap, TapObserver, UnaryFunction} from 'rxjs';\n\nimport {AsyncState} from '../models/async-state.model';\n\n/**\n * createAsyncState transforms an Observable of type T into an Observable of AsyncState<T>.\n * AsyncState<T> represents the loading, error, and data states for asynchronous operations.\n *\n * @template T - The type of the data in the observable.\n * @template E - The type of the error that can occur.\n *\n * @param {Partial<Observer<T>> | ((value: T) => void)} [observerOrNextForOrigin] -\n * An optional parameter that can be a partial TapObserver<T> or a function to handle the next value or error in the original Observable.\n *\n * @returns {UnaryFunction<Observable<T>, Observable<AsyncState<T, E>>>} -\n * A function that transforms an observable stream into an asynchronous state.\n *\n * @example\n * Usage 1: Simple request\n * data$ = this.shopService.products$.pipe(\n * createAsyncState({\n * next: res => console.log('Side effect if success: ' + res),\n * error: error => console.error('Side effect if error: ' + error.message)\n * })\n * );\n *\n * Usage 2: Dependent requests\n * data$ = firstCall$.pipe(\n * switchMap(() => this.shopService.products$),\n * createAsyncState()\n * );\n *\n * Another implementation thought when refreshing the data: instead of startWith, `merge of` emit as the trigger\n *\n * subject.pipe(\n * switchMap(() => merge(\n * of({ loading: true, error: null, data: null }),\n * this.service.apiCall().pipe(\n * map(data => ({ loading: false, error: null, data })),\n * tap({\n * next: res => callback?.(res.data),\n * error: err => errorCallback?.(err),\n * }),\n * catchError(error => of({ loading: false, error, data: null })),\n * ),\n * ))\n * )\n *\n */\nexport function createAsyncState<T, E = HttpErrorResponse>(\n observerOrNextForOrigin?: Partial<TapObserver<T>> | ((value: T) => void),\n): UnaryFunction<Observable<T>, Observable<AsyncState<T, E>>> {\n return pipe(\n tap(observerOrNextForOrigin),\n map((data) => ({loading: false, error: null, data})),\n startWith({loading: true, error: null, data: null}),\n // retry(1), // if you want to add retry\n catchError((error: E) => of({loading: false, error, data: null})),\n );\n}\n","import {Observable, OperatorFunction, Subscriber, TeardownLogic} from 'rxjs';\n\n/**\n * Creates an operator function for RxJS Observables that filters out consecutive\n * values that are considered equal according to a provided comparator function,\n * and invokes a callback when a distinct value is encountered.\n *\n * @template T - The type of elements emitted by the observable.\n * @param {(previousValue: T, currentValue: T) => void} onChangeCallback\n * A callback function that will be invoked when a distinct value is encountered.\n * It receives the previous distinct value and the current value.\n * @param {(previousValue: T, currentValue: T) => boolean} [comparator]\n * A function that determines if two values are considered equal.\n * Defaults to a function that performs strict equality (===) comparison.\n * @returns {OperatorFunction<T, T>} - The RxJS operator function.\n *\n * @example\n * Example 1:\n * const source$ = new Observable<number>((observer) => {\n * observer.next(1);\n * observer.next(2);\n * observer.next(2);\n * observer.next(3);\n * observer.next(3);\n * observer.next(4);\n * observer.next(5);\n * observer.complete();\n * });\n *\n * const distinctOnChange$ = source$.pipe(\n * distinctOnChange(\n * (prev, curr) => console.log(`Value changed from ${prev} to: ${curr}`),\n * (prev, curr) => prev === curr,\n * ),\n * );\n * distinctOnChange$.subscribe((res) => console.log(res));\n *\n *\n * Example 2:\n * distinctOnChange<RDEValue<OseInstance>[]>(\n * () => {\n * this.store.dispatch(\n * addToast({\n * toast: {\n * type: ToastType.SUCCESS,\n * title: this.l10nService.getMessage('STATUS_CHANGE'),\n * description: this.l10nService.getMessage('STATUS_CHANGE_DESC'),\n * },\n * }),\n * );\n * },\n * (prev, current) =>\n * prev.every((prevInstance, index) => instanceComparator(prevInstance.entity, current[index].entity)),\n * );\n */\nexport function distinctOnChange<T>(\n onChangeCallback: (previousValue: T, currentValue: T) => void,\n comparator: (previousValue: T, currentValue: T) => boolean = (prev, curr) => prev === curr,\n): OperatorFunction<T, T> {\n return (source: Observable<T>) =>\n new Observable<T>((subscriber: Subscriber<T>): TeardownLogic => {\n let hasFirstValue = false;\n let previousValue: T;\n\n const subscription = source.subscribe({\n next: (currentValue: T) => {\n if (hasFirstValue) {\n if (!comparator(previousValue, currentValue)) {\n onChangeCallback(previousValue, currentValue);\n previousValue = currentValue;\n subscriber.next(currentValue);\n }\n } else {\n previousValue = currentValue;\n hasFirstValue = true;\n subscriber.next(currentValue);\n }\n },\n error: (err: unknown) => subscriber.error(err),\n complete: () => subscriber.complete(),\n });\n\n return () => subscription.unsubscribe();\n });\n}\n","import {OperatorFunction, pipe, tap} from 'rxjs';\n\n// Define a type for different logger functions\ntype LoggerType = 'count' | 'debug' | 'dir' | 'log' | 'table';\n\n// Define a more permissive type for console functions\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ConsoleFunction = (...args: any[]) => void;\n\n// Map each LoggerType to its corresponding console function\nconst loggerFunctions: Record<LoggerType, ConsoleFunction> = {\n count: console.count.bind(console),\n debug: console.debug.bind(console),\n dir: console.dir.bind(console),\n log: console.log.bind(console),\n table: console.table.bind(console),\n};\n\n/**\n * Logger operator for RxJS observables.\n *\n * @param loggerType The type of logger to be used: 'count', 'debug', 'dir', 'log', 'table'.\n * Defaults to 'log' if not provided or if an unknown type is specified.\n * @returns An RxJS operator function that logs values using the specified console function.\n */\nexport const logger = <T>(loggerType: LoggerType = 'log'): OperatorFunction<T, T> =>\n pipe(\n tap((value: T) => {\n const logFunction = loggerFunctions[loggerType] || console.log.bind(console);\n logFunction(value);\n }),\n );\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isPromise(obj: any): obj is Promise<any> {\n return !!obj && typeof obj.then === 'function';\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {Signal} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {\n catchError,\n EMPTY,\n exhaustMap,\n from,\n isObservable,\n map,\n merge,\n Observable,\n of,\n share,\n startWith,\n timer,\n} from 'rxjs';\n\nimport {AsyncState} from '../models';\nimport {isPromise} from '../utils/is-promise.util';\n\n/**\n * Polls data at a specified interval and can be triggered manually.\n *\n * @template Data - The type of the data emitted by the polling function.\n * @template Input - The type of the input parameter used to build polling parameters.\n * @param {object} options - The configuration options for polling.\n * @param {number} options.interval - The interval in milliseconds between each poll.\n * @param {(params: any) => Observable<Data> | Data} options.pollingFn - A function that returns an Observable, Promise, or primitive value.\n * @param {(input: Input | undefined) => any} [options.paramsBuilder] - An optional function that builds parameters for the polling function based on the input. The value emitted by the trigger observable will serve as the parameter.\n * @param {Observable<Input> | Signal<Input>} [options.trigger] - An optional Observable or Signal that triggers a manual poll.\n * @returns {Observable<AsyncState<Data>>} An Observable emitting objects representing the state of the asynchronous operation.\n */\nexport function poll<Data, Input>(options: {\n interval: number;\n pollingFn: (params: any) => Observable<Data> | Promise<Data> | Data;\n paramsBuilder?: (input?: Input | undefined) => any;\n trigger?: Observable<Input> | Signal<Input>;\n}): Observable<AsyncState<Data>> {\n const timerEmitValue = '__timer__emission__';\n const timer$ = timer(0, options.interval).pipe(map((i) => `${timerEmitValue}${i}`));\n\n const trigger$ =\n options.trigger === undefined\n ? EMPTY\n : isObservable(options.trigger)\n ? options.trigger\n : toObservable(options.trigger);\n\n let inputByTrigger: Input | undefined = undefined; // if trigger is not provided, input will be undefined\n\n return merge(trigger$, timer$).pipe(\n exhaustMap((input) => {\n // input can be either by trigger or timer\n const isTimerTrigger = typeof input === 'string' && input.includes(timerEmitValue);\n const isManualTrigger = !isTimerTrigger;\n if (isManualTrigger) {\n inputByTrigger = input as Input;\n }\n\n // build params by trigger input\n // if paramsBuilder is provided, params will be the value of this function call\n // if paramsBuilder is not provided, params will be the value emitted by the trigger\n const params = options.paramsBuilder ? options.paramsBuilder(inputByTrigger) : inputByTrigger;\n\n // NOTE: using exhaustMap will NOT emit ${timerEmitValue}0 if trigger is not provided\n // using concatMap will emit ${timerEmitValue}0 if trigger is not provided\n const isFirstRequest = input === `${timerEmitValue}0`; // timer first emission when trigger is not provided\n const shouldShowLoading = isManualTrigger || isFirstRequest;\n\n const fnResult = options.pollingFn(params);\n const fnResult$ = isObservable(fnResult) ? fnResult : isPromise(fnResult) ? from(fnResult) : of(fnResult);\n\n let observable$ = fnResult$.pipe(\n map((data) => ({loading: false, error: null, data})),\n catchError((error) => of({loading: false, error, data: null})),\n );\n\n if (shouldShowLoading) {\n observable$ = observable$.pipe(startWith({loading: true, error: null, data: null}));\n }\n\n return observable$;\n }),\n share(),\n );\n}\n","import {Observable} from 'rxjs';\n\n/**\n * Operator that taps into a callback before the source Observable starts emitting values.\n *\n * This operator is useful for triggering a side effect before the main Observable starts emitting.\n *\n * @param callback A function to be executed before the source Observable emits its first value.\n * @returns An RxJS operator function that taps into the callback and then switchMaps to the source Observable.\n */\nexport function startWithTap<T>(callback: () => void) {\n return (source: Observable<T>) => {\n callback();\n return source;\n };\n}\n","import {HttpErrorResponse} from '@angular/common/http';\nimport {Observable, OperatorFunction, switchMap} from 'rxjs';\n\nimport {AsyncState} from '../models';\nimport {createAsyncState} from './create-async-state.operator';\n\n/**\n * Custom RxJS operator that uses switchMap to handle asynchronous operations and\n * transforms the emitted values into an AsyncState object.\n *\n * @template T - The type of data emitted by the observable returned by the project.\n * @template K - The type of value emitted by the source observable.\n * @template E - The type of error that can be encountered during the asynchronous operation.\n *\n * @param {function(K): Observable<T>} project - A function that takes a value emitted by the source\n * observable and returns an observable representing an asynchronous operation.\n *\n * @returns {OperatorFunction<K, AsyncState<T, E>>} - An RxJS operator that transforms the source observable into\n * an observable of AsyncState objects.\n *\n * @example\n * // Usage of the switchMapWithAsyncState operator\n * const source$ = new BehaviorSubject<number>(1);\n *\n * const asyncOperation = (value: number) => {\n * return of(value * 2).pipe(delay(1000));\n * };\n *\n * const result$ = source$.pipe(switchMapWithAsyncState(asyncOperation));\n * result$.subscribe((state) => {\n * console.log(state); // Outputs AsyncState objects with loading, data, and error properties.\n * });\n */\nexport function switchMapWithAsyncState<T, K, E = HttpErrorResponse>(\n project: (value: K, index: number) => Observable<T>,\n): OperatorFunction<K, AsyncState<T, E>> {\n return (source: Observable<K>) =>\n source.pipe(switchMap((value, index) => project(value, index).pipe(createAsyncState<T, E>())));\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n name: 'arrayJoin',\n standalone: true,\n})\nexport class ArrayJoinPipe implements PipeTransform {\n transform(value: unknown, separator: string = ',') {\n if (Array.isArray(value)) {\n return value.join(separator);\n }\n\n // For non-array cases or unexpected types, return the value as is\n return value;\n }\n}\n","import {inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\n\n/**\n * import { LOCALE_ID, NgModule } from '@angular/core';\n * import { BrowserModule } from '@angular/platform-browser';\n * import { AppComponent } from './app.component';\n * import { registerLocaleData } from '@angular/common';\n *\n * import localeEn from '@angular/common/locales/en';\n * import localeFr from '@angular/common/locales/fr';\n *\n * // Register locales\n * registerLocaleData(localeEn);\n * registerLocaleData(localeFr);\n *\n * @NgModule({\n * declarations: [AppComponent],\n * imports: [BrowserModule],\n * providers: [\n * {\n * provide: LOCALE_ID,\n * useFactory: () => {\n * // Use the browser's language or a default language\n * return navigator.language || 'en';\n * },\n * },\n * ],\n * bootstrap: [AppComponent],\n * })\n * export class AppModule {}\n */\n\n@Pipe({\n name: 'byteConverter',\n standalone: true,\n})\nexport class ByteConverterPipe implements PipeTransform {\n private locale = inject<string>(LOCALE_ID);\n // If using navigator.language directly in the pipe, this approach directly uses the browser's language at the moment the ByteConverterPipe is constructed. If the user changes the language while using the application, it won't be automatically reflected. If dynamic language changes are a requirement, using the LOCALE_ID provider as demonstrated in the AppModule is a more Angular-centric approach.\n // private locale: string;\n // constructor() {\n // // Use navigator.language as the default locale\n // this.locale = navigator.language || 'en';\n // }\n\n transform(value: number): string;\n transform(value?: number): string | null;\n transform(value?: number | null): string | null;\n transform(value?: null | number | undefined): string | null {\n if (value === null || value === undefined || isNaN(value)) {\n return null;\n }\n\n const units = ['BYTE', 'KB', 'MB', 'GB', 'TB'];\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n\n const translationObject = translations[this.locale] || translations['en'];\n const key = units[unitIndex];\n\n return this.formatNumber(value) + ' ' + translationObject[key];\n }\n\n private formatNumber(value: number): string {\n return new Intl.NumberFormat(this.locale, {maximumFractionDigits: 2}).format(value);\n }\n}\n\nconst translations: Record<string, Record<string, string>> = {\n en: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n 'en-US': {\n // You can provide specific variations for en-US if needed\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n de: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n es: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n fr: {\n BYTE: 'o',\n KB: 'Ko',\n MB: 'Mo',\n GB: 'Go',\n TB: 'To',\n },\n it: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n ja: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n ko: {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n 'pt-BR': {\n BYTE: 'B',\n KB: 'KB',\n MB: 'MB',\n GB: 'GB',\n TB: 'TB',\n },\n 'zh-CN': {\n BYTE: '字节',\n KB: '千字节',\n MB: '兆字节',\n GB: '千兆字节',\n TB: '太字节',\n },\n 'zh-TW': {\n BYTE: '位元組',\n KB: '千位元組',\n MB: '兆位元組',\n GB: '千兆位元組',\n TB: '太位元組',\n },\n ru: {\n BYTE: 'Б',\n KB: 'КБ',\n MB: 'МБ',\n GB: 'ГБ',\n TB: 'ТБ',\n },\n};\n","// https://regex101.com/library/mX1xW0\nexport const emailPattern = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/;\n\nexport const urlPattern =\n /^https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/;\nexport const httpsPattern =\n /^https:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/;\n","import {Pipe, PipeTransform} from '@angular/core';\n\nimport {httpsPattern} from '../const';\n\n@Pipe({\n name: 'isHttps',\n standalone: true,\n})\nexport class IsHttpsPipe implements PipeTransform {\n transform(value: string): boolean {\n return httpsPattern.test(value);\n }\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\nconst unmaskNumber = 6;\nconst maskChar = '*';\n\nexport interface MaskOptions {\n unmaskedPrefixLength?: number;\n unmaskedSuffixLength?: number;\n masked?: boolean;\n}\n\n@Pipe({\n name: 'mask',\n standalone: true,\n})\nexport class MaskPipe implements PipeTransform {\n /**\n * Transforms the input string by masking characters based on the provided options.\n *\n * @param {string} value - The input string to be masked.\n * @param {MaskOptions} [options={}] - Options for customizing the masking behavior.\n * @returns {string} - The masked string.\n */\n transform(value: string, options: MaskOptions = {}): string {\n const {unmaskedPrefixLength = unmaskNumber, unmaskedSuffixLength = unmaskNumber, masked = true} = options;\n\n if (\n value.length <= unmaskedPrefixLength + unmaskedSuffixLength ||\n unmaskedPrefixLength < 0 ||\n unmaskedSuffixLength < 0 ||\n !masked\n ) {\n return value;\n }\n\n return value\n .split('')\n .map((char, i) => (i < unmaskedPrefixLength || i > value.length - unmaskedSuffixLength - 1 ? char : maskChar))\n .join('');\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {assertInInjectionContext, computed, Injector, isSignal, Signal, untracked} from '@angular/core';\nimport {toObservable, toSignal} from '@angular/core/rxjs-interop';\nimport {\n combineLatest,\n distinctUntilChanged,\n from,\n identity,\n isObservable,\n ObservableInput,\n ObservableInputTuple,\n OperatorFunction,\n startWith,\n} from 'rxjs';\n\ntype ObservableSignalInput<T> = ObservableInput<T> | Signal<T>;\n\ntype ObservableSignalInputTuple<T> = {\n [K in keyof T]: ObservableSignalInput<T[K]> | (() => T[K]);\n};\n\n// pick from ToSignalOptions\nexport type CombineFromOptions<IValue> = {\n readonly injector?: Injector;\n readonly initialValue?: IValue;\n};\n\n// array inputs only\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n): Signal<Output>;\n\n// ---------- 3 args with array inputs -------------\n// combineFrom([signal, obs$], pipeOperator, { initialValue: [1,2] }), Input is [signal, obs$]\n// 1. no initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\n// 2. initialValue is null, returning type should include null\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\n// 3. provide initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n// ---------- 2 args wit array inputs -------------\n// 1. no initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\n// 2. initialValue is null, returning type should include null\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\n// 3. provide initialValue\nexport function combineFrom<Input extends readonly unknown[], Output = Input>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n// object input only, e.g. Input is { a: signal, b: obs$ }\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n): Signal<Output>;\n\n// ----------------- 3 args with object input --------------------\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n operator?: OperatorFunction<Input, Output>,\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n// ----------------- 2 args with object input --------------------\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n options?: CombineFromOptions<undefined>,\n): Signal<Output | undefined>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n options?: CombineFromOptions<null>,\n): Signal<Output | null>;\nexport function combineFrom<Input extends object, Output = Input>(\n sources: ObservableSignalInputTuple<Input>,\n options?: CombineFromOptions<Output>,\n): Signal<Output>;\n\n/**\n * Combines multiple `Observable` or `Signal` sources into a `Signal` that emits their values. It's like combineLatest.\n *\n * @param {ObservableSignalInputTuple} sources - Array or object of `Observable` or `Signal` values\n * @param {OperatorFunction} [operator] - Operator to apply to the combined values\n * @param {CombineFromOptions} [options] - Options including `initialValue` and `injector`\n * @returns Signal emitting the combined values\n *\n * @example\n * ```ts\n * export class Component {\n * private readonly userService = inject(UserService);\n * page = signal(2);\n *\n * data = combineFrom(\n * [this.page, this.userService.users$],\n * pipe(\n * switchMap(([page, users]) => this.dataService.getData(page, users)),\n * startWith([])\n * )\n * );\n * }\n * ```\n */\nexport function combineFrom<Input = any, Output = Input>(...args: any[]): Signal<Output | null | undefined> {\n assertInInjectionContext(combineFrom);\n\n const {normalizedSources, hasInitValue, operator, options} = normalizeArgs<Input, Output>(args);\n\n const ret = hasInitValue\n ? toSignal(combineLatest(normalizedSources).pipe(operator), {\n initialValue: options!.initialValue!,\n injector: options?.injector,\n })\n : (toSignal(combineLatest(normalizedSources).pipe(operator), {\n injector: options?.injector,\n // requireSync: true,\n }) as Signal<Output | undefined>);\n\n return ret;\n}\n\nfunction normalizeArgs<Input, Output>(\n args: any[],\n): {\n normalizedSources: ObservableInputTuple<Input>;\n operator: OperatorFunction<Input, Output>;\n hasInitValue: boolean;\n options: CombineFromOptions<Output> | undefined;\n} {\n if (!args || args.length < 1 || typeof args[0] !== 'object') {\n throw new TypeError('combineFrom needs sources');\n }\n\n const hasOperator = typeof args[1] === 'function';\n\n if (args.length === 3 && !hasOperator) {\n throw new TypeError('combineFrom needs a pipe operator as the second argument');\n }\n\n // pass sources and options\n if (!hasOperator) {\n // add identity function to args at index 1 as operator function as x=>x\n args.splice(1, 0, identity);\n }\n\n // if no operator passed, identity will be operator\n const [sources, operator, options] = args;\n\n const hasInitValue = options?.initialValue !== undefined;\n\n const normalizedSources = Object.entries(sources).reduce(\n (acc, [keyOrIndex, source]) => {\n if (isSignal(source)) {\n acc[keyOrIndex] = toObservable(source, {injector: options?.injector}).pipe(\n // toObservable doesn't immediately emit initialValue of the signal\n startWith(untracked(source)),\n );\n } else if (isObservable(source)) {\n acc[keyOrIndex] = source.pipe(distinctUntilChanged());\n } else if (typeof source === 'function') {\n // seldom use: pass function like () => 5\n const computedRes = computed(source as () => unknown);\n acc[keyOrIndex] = toObservable(computedRes, {injector: options?.injector}).pipe(startWith(source()));\n } else {\n // seldom use: pass promise, Map, array, etc that from accepts\n acc[keyOrIndex] = from(source as any).pipe(distinctUntilChanged());\n }\n return acc;\n },\n (Array.isArray(sources) ? [] : {}) as any,\n );\n\n return {normalizedSources, operator, hasInitValue, options};\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {computed, CreateComputedOptions, DestroyRef, effect, inject, Signal, signal, untracked} from '@angular/core';\nimport {concatAll, exhaustAll, isObservable, mergeAll, Observable, Subject, switchAll} from 'rxjs';\n\ntype ComputedAsyncBehavior = 'switch' | 'merge' | 'concat' | 'exhaust';\n\n// { equal, behavior }\ntype BaseOptions<T> = CreateComputedOptions<T> & {behavior?: ComputedAsyncBehavior};\n\ntype OptionsWithInitialValue<T> = {initialValue: T} & BaseOptions<T>;\ntype OptionsWithOptionalInitialValue<T> = {initialValue?: undefined} & BaseOptions<T>;\ntype OptionsWithRequireSync<T> = {requireSync: true} & BaseOptions<T>;\n\n// without options\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n): Signal<T | undefined>;\n\n// with optional initialValue\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n options: OptionsWithOptionalInitialValue<T>,\n): Signal<T | undefined>;\n\n// with initialValue\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n options: OptionsWithInitialValue<T>,\n): Signal<T>;\n\n// for promise, without initialValue but set requireSync as true, throw error\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Promise<T>,\n options: OptionsWithOptionalInitialValue<T> & {requireSync: true},\n): never;\n\n// for observables, without initialValue, without requireSync, return T | undefined\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | T | undefined,\n options: {\n initialValue?: undefined;\n requireSync?: false;\n } & BaseOptions<T>,\n): Signal<T | undefined>;\n\n// for observables, without initialValue, but requireSync is true, return T\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | T,\n options: OptionsWithRequireSync<T> & {initialValue?: undefined | T},\n): Signal<T>;\n\nexport function computedAsync<T>(\n computeFn: (previousValue?: T) => Observable<T> | Promise<T> | T | undefined,\n options: any = {},\n): Signal<T | undefined> {\n const destroyRef = inject(DestroyRef);\n\n const sourceSubject = new Subject<Promise<T> | Observable<T>>();\n const source$ = flattenObservable(sourceSubject, options.behavior || 'switch');\n\n const sourceValue = signal<T | undefined>(options.initialValue);\n\n const sourceResult = source$.subscribe({\n next: (value) => sourceValue.set(value),\n error: (error) => {\n sourceValue.set(error);\n // Error should be handled by the user\n // throw error;\n },\n });\n\n destroyRef.onDestroy(() => sourceResult.unsubscribe());\n\n if (options.requireSync && options.initialValue === undefined) {\n const initialEmission = computeFn(undefined);\n\n if (isPromise(initialEmission)) {\n throw new Error(`Promises cannot work with requireSync. Set requireSync to false or pass an initialValue.`);\n }\n\n if (isObservable(initialEmission)) {\n sourceSubject.next(initialEmission);\n } else {\n // primitive value T\n sourceValue.set(initialEmission);\n }\n }\n\n if (options.requireSync && sourceValue() === undefined) {\n throw new Error(`The observable doesn't emit synchronously. Set requireSync to false or pass an initialValue.`);\n }\n\n let shouldSkipFirstComputation = options.requireSync === true;\n\n effect(() => {\n const currentValue = untracked(() => sourceValue());\n\n const newSource = computeFn(currentValue);\n\n if (shouldSkipFirstComputation) {\n shouldSkipFirstComputation = false;\n return;\n }\n\n if (isPromise(newSource) || isObservable(newSource)) {\n untracked(() => sourceSubject.next(newSource));\n } else {\n untracked(() => sourceValue.set(newSource));\n }\n });\n\n return computed(() => sourceValue() as T, {equal: options.equal});\n}\n\nfunction flattenObservable<T>(\n source: Subject<Promise<T> | Observable<T>>,\n behavior: ComputedAsyncBehavior,\n): Observable<T> {\n const behaviorMap = {\n switch: switchAll,\n merge: mergeAll,\n concat: concatAll,\n exhaust: exhaustAll,\n };\n\n return source.pipe(behaviorMap[behavior]());\n}\n\nfunction isPromise<T>(value: any): value is Promise<T> {\n return value && typeof value.then === 'function';\n}\n","import {signal} from '@angular/core';\n\nexport function createTrigger() {\n const sourceSignal = signal(0);\n\n return {\n next: () => {\n sourceSignal.update((v) => v + 1);\n },\n value: sourceSignal.asReadonly(),\n };\n}\n","import {assertInInjectionContext, inject, type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {ActivatedRoute, type Params} from '@angular/router';\nimport {map} from 'rxjs';\n\ntype ParamsTransformFn<Output> = (params: Params) => Output;\n\n/**\n * The `InputOptions` interface defines options for configuring the behavior of the `injectParams` function.\n *\n * @template Output - The expected type of the read value.\n */\nexport interface ParamsOptions<Output> {\n /**\n * A transformation function to convert the written value to the expected read value.\n *\n * @param v - The value to transform.\n * @returns The transformed value.\n */\n transform?: (v: string) => Output;\n\n /**\n * The initial value to use if the parameter is not present or undefined.\n */\n initialValue?: Output;\n}\n\n/**\n * Injects the params from the current route.\n * If a key is provided, returns the value of that key.\n * If a transform function is provided, returns the result of the function.\n * Otherwise, returns the entire params object.\n *\n * @example\n * const params = injectParams(); // Returns the entire params object\n * const userId = injectParams('id'); // Returns the value of the 'id' param\n * const userId = injectParams(p => p['id'] as string); // Returns the 'id' param using a custom transform function\n * const userId = injectParams('id', { transform: numberAttribute, initialValue: 1 });\n *\n * @param keyOrParamsTransform OPTIONAL The key of the param to return, or a transform function to apply to the params object\n */\nexport function injectParams(): Signal<Params>;\n\nexport function injectParams<Output>(fn: ParamsTransformFn<Output>): Signal<Output>;\n\nexport function injectParams(key: string): Signal<string | null>;\n\n// for boolean or number, if initialValue is provided, transform is a must\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue: boolean},\n): Signal<boolean>;\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => number; initialValue: number},\n): Signal<number>;\n// for string, transform is optional\nexport function injectParams(\n key: string,\n options: {transform?: (v: string) => string; initialValue: string},\n): Signal<string>;\n\n// initialValue not provided, must provide transform fn\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue?: undefined},\n): Signal<boolean | null>;\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => number; initialValue?: undefined},\n): Signal<number | null>;\nexport function injectParams(\n key: string,\n options: {transform: (v: string) => string; initialValue?: undefined},\n): Signal<string | null>;\n\nexport function injectParams<Output>(\n keyOrParamsTransform?: string | ParamsTransformFn<Output>,\n options: ParamsOptions<Output> = {},\n): Signal<Output | Params | string | boolean | number | null> {\n assertInInjectionContext(injectParams);\n\n const route = inject(ActivatedRoute);\n const initialParams = route.snapshot.params;\n\n const {transform, initialValue} = options;\n\n // injectParams(): Signal<Params>\n if (!keyOrParamsTransform) {\n return toSignal(route.params, {initialValue: initialParams});\n }\n\n // injectParams<Output>(fn: ParamsTransformFn<Output>): Signal<Output>\n if (typeof keyOrParamsTransform === 'function') {\n return toSignal(route.params.pipe(map(keyOrParamsTransform)), {initialValue: keyOrParamsTransform(initialParams)});\n }\n\n // keyOrParamsTransform is string.\n // export function injectParams(key: string): Signal<string | null>;\n // export function injectParams(key: string, options: { transform: (v: string) => boolean; initialValue: boolean }): Signal<boolean>;\n // export function injectParams(key: string, options: { transform: (v: string) => number; initialValue: number }): Signal<number>;\n // export function injectParams(key: string, options: { transform?: (v: string) => string; initialValue: string }): Signal<string>;\n // export function injectParams(key: string, options: { transform: (v: string) => boolean; initialValue?: undefined }): Signal<boolean | null>;\n // export function injectParams(key: string, options: { transform: (v: string) => number; initialValue?: undefined }): Signal<number | null>;\n // export function injectParams(key: string, options: { transform: (v: string) => string; initialValue?: undefined }): Signal<string | null>;\n const getParam = (params: Params) => {\n const param = params?.[keyOrParamsTransform] as string | undefined;\n\n if (!param) {\n return initialValue ?? null;\n }\n\n return transform ? transform(param) : param;\n };\n\n return toSignal(route.params.pipe(map(getParam)), {initialValue: getParam(initialParams)});\n}\n","import {assertInInjectionContext, inject, type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {ActivatedRoute, type Params} from '@angular/router';\nimport {map} from 'rxjs';\n\ntype QueryParamsTransformFn<Output> = (params: Params) => Output;\n\n/**\n * The `InputOptions` interface defines options for configuring the behavior of the `injectQueryParams` function.\n *\n * @template Output - The expected type of the read value.\n */\nexport interface QueryParamsOptions<Output> {\n /**\n * A transformation function to convert the written value to the expected read value.\n *\n * @param v - The value to transform.\n * @returns The transformed value.\n */\n transform?: (v: string) => Output;\n\n /**\n * The initial value to use if the query parameter is not present or undefined.\n */\n initialValue?: Output;\n}\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n *\n * @returns A `Signal` that emits the entire query parameters object.\n */\nexport function injectQueryParams(): Signal<Params>;\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n * It retrieves the value of a query parameter based on a custom transform function applied to the query parameters object.\n *\n * @template Output - The expected type of the read value.\n * @param {QueryParamsTransformFn<Output>} fn - A transform function that takes the query parameters object (`params: Params`) and returns the desired value.\n * @returns {Signal} A `Signal` that emits the transformed value based on the provided custom transform function.\n *\n * @example\n * const searchValue = injectQueryParams((params) => params['search'] as string);\n */\nexport function injectQueryParams<Output>(fn: QueryParamsTransformFn<Output>): Signal<Output>;\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n *\n * @param {string} key - The name of the query parameter to retrieve.\n * @returns {Signal} A `Signal` that emits the value of the specified query parameter, or `null` if it's not present.\n */\nexport function injectQueryParams(key: string): Signal<string | null>;\n\n// for boolean or number, if initialValue is provided, transform is a must\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue: boolean},\n): Signal<boolean>;\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => number; initialValue: number},\n): Signal<number>;\n// for string, transform is optional\nexport function injectQueryParams(\n key: string,\n options: {transform?: (v: string) => string; initialValue: string},\n): Signal<string>;\n\n// initialValue not provided, must provide transform fn\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => boolean; initialValue?: undefined},\n): Signal<boolean | null>;\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => number; initialValue?: undefined},\n): Signal<number | null>;\nexport function injectQueryParams(\n key: string,\n options: {transform: (v: string) => string; initialValue?: undefined},\n): Signal<string | null>;\n\n/**\n * The `injectQueryParams` function allows you to access and manipulate query parameters from the current route.\n *\n * @template Output - The expected type of the read value.\n * @param {string} keyOrParamsTransform - The name of the query parameter to retrieve, or a transform function to apply to the query parameters object.\n * @param {QueryParamsOptions} options - Optional configuration options for the query parameter.\n * @returns {QueryParamsOptions} A `Signal` that emits the transformed value of the specified query parameter, or the entire query parameters object if no key is provided.\n *\n * @example\n * const search = injectQueryParams('search'); // returns the value of the 'search' query param\n * const search = injectQueryParams(p => p['search'] as string); // same as above but can be used with a custom transform function\n * const idParam = injectQueryParams('id', {transform: numberAttribute}); // returns the value fo the 'id' query params and transforms it into a number\n * const idParam = injectQueryParams(p => numberAttribute(p['id'])); // same as above but can be used with a custom transform function\n * const queryParams = injectQueryParams(); // returns the entire query params object\n */\nexport function injectQueryParams<Output>(\n keyOrParamsTransform?: string | QueryParamsTransformFn<Output>,\n options: QueryParamsOptions<Output> = {},\n): Signal<Output | Params | string | boolean | number | null> {\n assertInInjectionContext(injectQueryParams);\n\n const route = inject(ActivatedRoute);\n const initialQueryParams = route.snapshot.queryParams;\n\n const {transform, initialValue} = options;\n\n // injectQueryParams(): Signal<Params>\n if (!keyOrParamsTransform) {\n return toSignal(route.queryParams, {initialValue: initialQueryParams});\n }\n\n // injectQueryParams<Output>(fn: QueryParamsTransformFn<Output>): Signal<Output>\n if (typeof keyOrParamsTransform === 'function') {\n return toSignal(route.queryParams.pipe(map(keyOrParamsTransform)), {\n initialValue: keyOrParamsTransform(initialQueryParams),\n });\n }\n\n // keyOrParamsTransform is string.\n const getParam = (params: Params) => {\n const param = params?.[keyOrParamsTransform] as string | string[] | undefined;\n\n if (!param) {\n return initialValue ?? null;\n }\n\n if (Array.isArray(param)) {\n if (param.length < 1) {\n return initialValue ?? null;\n }\n return transform ? transform(param[0]) : param[0];\n }\n\n return transform ? transform(param) : param;\n };\n\n return toSignal(route.queryParams.pipe(map(getParam)), {\n initialValue: getParam(initialQueryParams),\n });\n}\n","import {assertInInjectionContext, Injector, isSignal, Signal, untracked} from '@angular/core';\nimport {toObservable, toSignal} from '@angular/core/rxjs-interop';\nimport {\n distinctUntilChanged,\n from,\n identity,\n isObservable,\n merge,\n ObservableInput,\n OperatorFunction,\n startWith,\n} from 'rxjs';\n\ntype ObservableSignalInput<T> = ObservableInput<T> | Signal<T>;\n\ntype ObservableSignalInputTuple<T> = {\n [K in keyof T]: ObservableSignalInput<T[K]>;\n};\n\n// pick from ToSignalOptions\nexport type MergeFromOptions<T> = {\n readonly injector?: Injector;\n readonly initialValue?: T | null;\n};\n\nexport function mergeFrom<Input extends readonly unknown[], Output = Input[number]>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n operator?: OperatorFunction<Input[number], Output>,\n options?: MergeFromOptions<Output>,\n): Signal<Output>;\n\nexport function mergeFrom<Input extends readonly unknown[], Output = Input[number]>(\n sources: readonly [...ObservableSignalInputTuple<Input>],\n options?: MergeFromOptions<Output>,\n): Signal<Output>;\n\n// No object inputs\n\n/**\n * merge multiple `Observable` or `Signal` sources into a `Signal` that emits the last value. It's like merge.\n *\n * @param {ObservableSignalInputTuple} sources - Array of `Observable` or `Signal` values\n * @param {OperatorFunction} [operator] - Operator to apply to the merge\n * @param {MergeFromOptions} [options] - Options including `initialValue` and `injector`\n * @returns Signal emitting the latest merge result\n *\n * @example\n * ```ts\n * export class Component {\n * e$ = of(1).pipe(delay(1000));\n * f = signal(2);\n *\n * data = mergeFrom(\n * [this.e$, this.f],\n * pipe(\n * switchMap((res) => of(`${res} is coming~`)),\n * startWith(0),\n * ),\n * );\n * }\n * ```\n */\nexport function mergeFrom<Input extends readonly unknown[], Output = Input[number]>(...args: unknown[]) {\n assertInInjectionContext(mergeFrom);\n\n const [sources, operator = identity, options = {}] = parseArgs<Input, Output>(args);\n\n const normalizedSources = sources.map((source) => {\n if (isSignal(source)) {\n return toObservable(source, {injector: options.injector}).pipe(startWith(untracked(source)));\n }\n\n if (!isObservable(source)) {\n source = from(source);\n }\n\n return source.pipe(distinctUntilChanged());\n });\n\n const merged$ = merge(...normalizedSources).pipe(operator as OperatorFunction<Input[number], Output>);\n\n if (options.initialValue !== undefined) {\n return toSignal(merged$, {initialValue: options.initialValue as Output, injector: options.injector});\n }\n return toSignal(merged$, {requireSync: true, injector: options.injector});\n}\n\nfunction parseArgs<Input extends readonly unknown[], Output = Input[number]>(args: unknown[]) {\n if (!args || args.length < 1) {\n throw new TypeError('mergeFrom needs sources');\n }\n\n if (args.length === 1) {\n return [args[0] as readonly [...ObservableSignalInputTuple<Input>], undefined, undefined] as const;\n }\n\n if (args.length === 2) {\n const hasOperator = typeof args[1] === 'function';\n\n if (hasOperator) {\n return [\n args[0] as readonly [...ObservableSignalInputTuple<Input>],\n args[1] as OperatorFunction<Input[number], Output>,\n undefined,\n ] as const;\n }\n\n return [\n args[0] as readonly [...ObservableSignalInputTuple<Input>],\n undefined,\n args[1] as MergeFromOptions<Output>,\n ] as const;\n }\n\n return args as unknown as [\n readonly [...ObservableSignalInputTuple<Input>],\n OperatorFunction<Input[number], Output>,\n MergeFromOptions<Output>,\n ];\n}\n","/**\n * Calculates the difference in whole days between two dates.\n *\n * @param {Date | number | string} dateLeft - The date from which the difference is measured (the reference date).\n * Can be a Date object, a number representing milliseconds since the Unix epoch,\n * or a string in a format parseable by the Date constructor.\n * @param {Date | number | string} dateRight - The date to be compared against the reference date.\n * Can be a Date object, a number representing milliseconds since the Unix epoch,\n * or a string in a format parseable by the Date constructor.\n * @returns {number} The number of whole days between the reference date (dateLeft) and the compared date (dateRight).\n *\n * @example\n * // How many whole days are between '2022-09-08' and '2023-09-18'?\n * const result = differenceInDays('2022-09-08', new Date('2023-09-18'));\n */\nexport function differenceInDays(dateLeft: Date | number | string, dateRight: Date | number | string) {\n const _dateLeft = new Date(dateLeft);\n const _dateRight = new Date(dateRight);\n\n const difference = (_dateLeft.getTime() - _dateRight.getTime()) / (1000 * 60 * 60 * 24);\n\n return Math.floor(difference);\n}\n","import {AbstractControl, AsyncValidatorFn, ValidatorFn, Validators} from '@angular/forms';\nimport {of} from 'rxjs';\n\n/**\n * Provides a conditional validator that applies the specified validator functions only if the condition is met.\n *\n * @param condition A function that determines whether the validators should be applied.\n * @param trueValidatorFn The validator function or an array of validator functions to be applied when the condition is true.\n * @param falseValidatorFn Optional. The validator function or an array of validator functions to be applied when the condition is false.\n * @returns A validator function that can be used with Angular Reactive Forms.\n */\nexport function ifValidator(\n condition: (control: AbstractControl) => boolean,\n trueValidatorFn: ValidatorFn | ValidatorFn[],\n falseValidatorFn?: ValidatorFn | ValidatorFn[],\n): ValidatorFn {\n /**\n * @param control The AbstractControl to validate.\n * @returns Validation errors if the condition is met; otherwise, null.\n */\n return (control: AbstractControl): Validators | null => {\n if (!trueValidatorFn || !condition(control)) {\n return composeValidators(control, falseValidatorFn);\n }\n\n return composeValidators(control, trueValidatorFn);\n };\n}\n\n/**\n * Provides a conditional async validator that applies the specified async validator function only if the condition is met.\n *\n * @param condition A function that determines whether the async validator should be applied.\n * @param validatorFn The async validator function to be applied conditionally.\n * @returns An async validator function that can be used with Angular Reactive Forms.\n */\nexport function ifAsyncValidator(\n condition: (control: AbstractControl) => boolean,\n validatorFn: AsyncValidatorFn,\n): AsyncValidatorFn {\n /**\n * @param control The AbstractControl to validate asynchronously.\n * @returns An observable that emits validation errors if the condition is met; otherwise, emits null.\n */\n return (control: AbstractControl) => {\n if (!validatorFn || !condition(control)) {\n return of(null);\n }\n\n return validatorFn(control);\n };\n}\n\n/**\n * Composes and applies the provided validators to the given AbstractControl.\n *\n * @param control The AbstractControl to validate.\n * @param validatorFn The validator function or an array of validator functions to be applied.\n * @returns Validation errors if the validators are applicable; otherwise, null.\n */\nfunction composeValidators(\n control: AbstractControl,\n validatorFn: ValidatorFn | ValidatorFn[] | undefined,\n): Validators | null {\n if (!validatorFn) {\n return null;\n }\n\n const validatorFns = Array.isArray(validatorFn) ? validatorFn : [validatorFn];\n return Validators.compose(validatorFns)?.(control) || null;\n}\n","/**\n * Check if a value is empty.\n * @param {T | undefined | null} value - The value to check for emptiness.\n * @returns {boolean} - Returns true if the value is empty, otherwise false.\n */\nexport function isEmpty<T extends object | string | Array<unknown>>(value: T | undefined | null): value is null {\n if (value == null) return true;\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value as Record<string, unknown>).length === 0;\n }\n\n return false;\n}\n","/**\n * Check if two values are deeply equal.\n * @param {T} value1 - The first value to compare.\n * @param {T} value2 - The second value to compare.\n * @returns {boolean} - Returns true if the values are deeply equal, otherwise false.\n */\nexport function isEqual<T>(value1: T, value2: T): boolean {\n if (value1 === value2) return true;\n\n if (typeof value1 !== 'object' || typeof value2 !== 'object' || value1 === null || value2 === null) {\n return false;\n }\n\n const keys1 = Object.keys(value1) as Array<keyof T>;\n const keys2 = Object.keys(value2) as Array<keyof T>;\n\n if (keys1.length !== keys2.length) return false;\n\n for (const key of keys1) {\n if (!keys2.includes(key) || !isEqual(value1[key], value2[key])) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Create an object composed of object properties that satisfy a given condition.\n * @param {T} source - The object to pick properties from.\n * @param {(value: T[keyof T], key: string) => boolean} predicate - The function invoked per property.\n * @returns {Partial<T>} - Returns the new object.\n */\nexport function pickBy<T>(source: T, predicate: (value: T[keyof T], key: string) => boolean): Partial<T> {\n const result: Partial<T> = {};\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key) && predicate(source[key], key)) {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n","import {AbstractControl, FormArray, ValidationErrors, ValidatorFn} from '@angular/forms';\n\n/**\n * Validator for checking uniqueness across multiple fields in a FormArray or FormGroup.\n *\n * This validator can be applied to a FormArray or FormGroup containing the controls to be validated.\n * It ensures that each control's value is unique among all other controls within the array or group.\n */\nexport class UniqueValidator {\n /**\n * Validator function to be attached to a FormArray or FormGroup.\n *\n * This validator checks for uniqueness of each control's value within the array or group.\n *\n * @param keySelector A function to select the key control for comparison (default is the control itself).\n * @typeparam T The type of the control value.\n */\n static unique<T>(\n keySelector: (control: AbstractControl) => AbstractControl<T> = (control: AbstractControl<T>) => control,\n ): ValidatorFn {\n return (formArray: AbstractControl): ValidationErrors | null => {\n if (!(formArray instanceof FormArray)) {\n return null;\n }\n\n const targetControls = formArray.controls.map(keySelector);\n const valueControlMap = new Map<T, AbstractControl<T>>();\n const invalidControls: AbstractControl<T>[] = [];\n\n for (const control of targetControls) {\n const value = control.value;\n\n if (value == null || String(value) === '' || String(value) === 'NaN') {\n continue;\n }\n\n const controlInMap = valueControlMap.get(value);\n\n if (controlInMap) {\n if (!invalidControls.includes(controlInMap)) {\n invalidControls.push(controlInMap);\n }\n\n invalidControls.push(control);\n } else {\n valueControlMap.set(value, control);\n }\n }\n\n const notUniqueError = {notUnique: true};\n\n // set errors manually for target controls\n for (const control of targetControls) {\n const errors = control.errors;\n\n if (invalidControls.includes(control)) {\n // set not unique error for invalid controls\n control.setErrors(errors === null ? notUniqueError : {...errors, ...notUniqueError});\n } else {\n // remove not unique errors for valid controls\n if (errors === null) {\n control.setErrors(null);\n } else {\n delete errors['notUnique'];\n control.setErrors(Object.keys(errors).length > 0 ? errors : null);\n }\n }\n }\n\n return invalidControls.length > 0 ? notUniqueError : null;\n };\n }\n}\n","import {AbstractControl, ValidationErrors} from '@angular/forms';\n\nimport {httpsPattern, urlPattern} from '../const';\n\nexport function urlValidator(control: AbstractControl): ValidationErrors | null {\n if (!urlPattern.test(control.value)) {\n return {invalidUrl: true};\n }\n return null;\n}\n\nexport function httpsValidator(control: AbstractControl): ValidationErrors | null {\n if (!httpsPattern.test(control.value)) {\n return {invalidUrl: true};\n }\n return null;\n}\n","/*\n * Public API Surface of ngx-lift\n */\n\nexport * from './lib/models';\nexport * from './lib/operators';\nexport * from './lib/pipes';\nexport * from './lib/signals';\nexport * from './lib/utils';\nexport * from './lib/validators';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isPromise"],"mappings":";;;;;;;AAYA;;;;;;;;;;;;;;;;;;;AAmBG;SACa,kBAAkB,CAChC,OAA6D,EAC7D,mBAAmB,GAAG,KAAK,EAAA;IAE3B,SAAS,gBAAgB,CAAI,UAAyB,EAAA;QACpD,IAAI,mBAAmB,EAAE;YACvB,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;SACzC;aAAM;;AAEL,YAAA,OAAO,UAAU,YAAY,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC;SACtF;KACF;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;;QAE1B,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;KACrD;SAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;;QAE1D,MAAM,WAAW,GAAyC,EAAE,CAAC;AAE7D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAClD,WAAW,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC5C;AAED,QAAA,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;KACnC;SAAM;QACL,MAAM,IAAI,KAAK,CACb,CAAA,wGAAA,EAA2G,OAAO,OAAO,CAAA,CAAE,CAC5H,CAAC;KACH;AACH;;ACzDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CG;AACG,SAAU,gBAAgB,CAC9B,uBAAwE,EAAA;IAExE,OAAO,IAAI,CACT,GAAG,CAAC,uBAAuB,CAAC,EAC5B,GAAG,CAAC,CAAC,IAAI,MAAM,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,EACpD,SAAS,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;;IAEnD,UAAU,CAAC,CAAC,KAAQ,KAAK,EAAE,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,CAClE,CAAC;AACJ;;AC1DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDG;AACa,SAAA,gBAAgB,CAC9B,gBAA6D,EAC7D,UAA6D,GAAA,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,EAAA;IAE1F,OAAO,CAAC,MAAqB,KAC3B,IAAI,UAAU,CAAI,CAAC,UAAyB,KAAmB;QAC7D,IAAI,aAAa,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,aAAgB,CAAC;AAErB,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;AACpC,YAAA,IAAI,EAAE,CAAC,YAAe,KAAI;gBACxB,IAAI,aAAa,EAAE;oBACjB,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE;AAC5C,wBAAA,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;wBAC9C,aAAa,GAAG,YAAY,CAAC;AAC7B,wBAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;qBAC/B;iBACF;qBAAM;oBACL,aAAa,GAAG,YAAY,CAAC;oBAC7B,aAAa,GAAG,IAAI,CAAC;AACrB,oBAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBAC/B;aACF;YACD,KAAK,EAAE,CAAC,GAAY,KAAK,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C,YAAA,QAAQ,EAAE,MAAM,UAAU,CAAC,QAAQ,EAAE;AACtC,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC;AAC1C,KAAC,CAAC,CAAC;AACP;;AC3EA;AACA,MAAM,eAAe,GAAwC;IAC3D,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;CACnC,CAAC;AAEF;;;;;;AAMG;AACU,MAAA,MAAM,GAAG,CAAI,aAAyB,KAAK,KACtD,IAAI,CACF,GAAG,CAAC,CAAC,KAAQ,KAAI;AACf,IAAA,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,WAAW,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC,CAAC;;AC9BN;AACM,SAAUA,WAAS,CAAC,GAAQ,EAAA;IAChC,OAAO,CAAC,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;AACjD;;ACkBA;;;;;;;;;;;AAWG;AACG,SAAU,IAAI,CAAc,OAKjC,EAAA;IACC,MAAM,cAAc,GAAG,qBAAqB,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,cAAc,CAAA,EAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAEpF,IAAA,MAAM,QAAQ,GACZ,OAAO,CAAC,OAAO,KAAK,SAAS;AAC3B,UAAE,KAAK;AACP,UAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;cAC3B,OAAO,CAAC,OAAO;AACjB,cAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtC,IAAA,IAAI,cAAc,GAAsB,SAAS,CAAC;AAElD,IAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CACjC,UAAU,CAAC,CAAC,KAAK,KAAI;;AAEnB,QAAA,MAAM,cAAc,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACnF,QAAA,MAAM,eAAe,GAAG,CAAC,cAAc,CAAC;QACxC,IAAI,eAAe,EAAE;YACnB,cAAc,GAAG,KAAc,CAAC;SACjC;;;;AAKD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;;;QAI9F,MAAM,cAAc,GAAG,KAAK,KAAK,GAAG,cAAc,CAAA,CAAA,CAAG,CAAC;AACtD,QAAA,MAAM,iBAAiB,GAAG,eAAe,IAAI,cAAc,CAAC;QAE5D,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3C,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAGA,WAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAE1G,IAAI,WAAW,GAAG,SAAS,CAAC,IAAI,CAC9B,GAAG,CAAC,CAAC,IAAI,MAAM,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,EACpD,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,CAC/D,CAAC;QAEF,IAAI,iBAAiB,EAAE;YACrB,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;SACrF;AAED,QAAA,OAAO,WAAW,CAAC;AACrB,KAAC,CAAC,EACF,KAAK,EAAE,CACR,CAAC;AACJ;;ACpFA;;;;;;;AAOG;AACG,SAAU,YAAY,CAAI,QAAoB,EAAA;IAClD,OAAO,CAAC,MAAqB,KAAI;AAC/B,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,OAAO,MAAM,CAAC;AAChB,KAAC,CAAC;AACJ;;ACTA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACG,SAAU,uBAAuB,CACrC,OAAmD,EAAA;AAEnD,IAAA,OAAO,CAAC,MAAqB,KAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAQ,CAAC,CAAC,CAAC,CAAC;AACnG;;MChCa,aAAa,CAAA;AACxB,IAAA,SAAS,CAAC,KAAc,EAAE,SAAA,GAAoB,GAAG,EAAA;AAC/C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC9B;;AAGD,QAAA,OAAO,KAAK,CAAC;KACd;8GARU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,CAAA,EAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;MAMU,iBAAiB,CAAA;AAJ9B,IAAA,WAAA,GAAA;AAKU,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAS,SAAS,CAAC,CAAC;AAiC5C,KAAA;AAtBC,IAAA,SAAS,CAAC,KAAiC,EAAA;AACzC,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;AACzD,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,QAAA,OAAO,KAAK,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpD,KAAK,IAAI,IAAI,CAAC;AACd,YAAA,SAAS,EAAE,CAAC;SACb;AAED,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AAC1E,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE7B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;KAChE;AAEO,IAAA,YAAY,CAAC,KAAa,EAAA;QAChC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAC,qBAAqB,EAAE,CAAC,EAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KACrF;8GAjCU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,CAAA,EAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;AAqCD,MAAM,YAAY,GAA2C;AAC3D,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,OAAO,EAAE;;AAEP,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,EAAE,EAAE,KAAK;AACT,QAAA,EAAE,EAAE,KAAK;AACT,QAAA,EAAE,EAAE,MAAM;AACV,QAAA,EAAE,EAAE,KAAK;AACV,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,EAAE,EAAE,MAAM;AACV,QAAA,EAAE,EAAE,MAAM;AACV,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,EAAE,EAAE,MAAM;AACX,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACT,KAAA;CACF;;AC9JD;AACO,MAAM,YAAY,GAAG,mFAAmF,CAAC;AAEzG,MAAM,UAAU,GACrB,0GAA0G,CAAC;AACtG,MAAM,YAAY,GACvB,yGAAyG;;MCE9F,WAAW,CAAA;AACtB,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACjC;8GAHU,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBAJvB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACLD,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,QAAQ,GAAG,GAAG,CAAC;MAYR,QAAQ,CAAA;AACnB;;;;;;AAMG;AACH,IAAA,SAAS,CAAC,KAAa,EAAE,OAAA,GAAuB,EAAE,EAAA;AAChD,QAAA,MAAM,EAAC,oBAAoB,GAAG,YAAY,EAAE,oBAAoB,GAAG,YAAY,EAAE,MAAM,GAAG,IAAI,EAAC,GAAG,OAAO,CAAC;AAE1G,QAAA,IACE,KAAK,CAAC,MAAM,IAAI,oBAAoB,GAAG,oBAAoB;AAC3D,YAAA,oBAAoB,GAAG,CAAC;AACxB,YAAA,oBAAoB,GAAG,CAAC;YACxB,CAAC,MAAM,EACP;AACA,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,OAAO,KAAK;aACT,KAAK,CAAC,EAAE,CAAC;AACT,aAAA,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,oBAAoB,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;aAC7G,IAAI,CAAC,EAAE,CAAC,CAAC;KACb;8GAxBU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAJpB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACdD;AA0GA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACa,SAAA,WAAW,CAA8B,GAAG,IAAW,EAAA;IACrE,wBAAwB,CAAC,WAAW,CAAC,CAAC;AAEtC,IAAA,MAAM,EAAC,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAC,GAAG,aAAa,CAAgB,IAAI,CAAC,CAAC;IAEhG,MAAM,GAAG,GAAG,YAAY;AACtB,UAAE,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxD,YAAY,EAAE,OAAQ,CAAC,YAAa;YACpC,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC;AACJ,UAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACzD,QAAQ,EAAE,OAAO,EAAE,QAAQ;;AAE5B,SAAA,CAAgC,CAAC;AAEtC,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CACpB,IAAW,EAAA;AAOX,IAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AAC3D,QAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;KAClD;IAED,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;IAElD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;AACrC,QAAA,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;KACjF;;IAGD,IAAI,CAAC,WAAW,EAAE;;QAEhB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC7B;;IAGD,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAE1C,IAAA,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,KAAK,SAAS,CAAC;IAEzD,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CACtD,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,KAAI;AAC5B,QAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpB,YAAA,GAAG,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAC,CAAC,CAAC,IAAI;;AAExE,YAAA,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAC7B,CAAC;SACH;AAAM,aAAA,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/B,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;SACvD;AAAM,aAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;;AAEvC,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAuB,CAAC,CAAC;YACtD,GAAG,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,WAAW,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACtG;aAAM;;AAEL,YAAA,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAa,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;SACpE;AACD,QAAA,OAAO,GAAG,CAAC;AACb,KAAC,GACA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAClC,CAAC;IAEF,OAAO,EAAC,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAC,CAAC;AAC9D;;ACxMA;SAmDgB,aAAa,CAC3B,SAA4E,EAC5E,UAAe,EAAE,EAAA;AAEjB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtC,IAAA,MAAM,aAAa,GAAG,IAAI,OAAO,EAA8B,CAAC;AAChE,IAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAE/E,MAAM,WAAW,GAAG,MAAM,CAAgB,OAAO,CAAC,YAAY,CAAC,CAAC;AAEhE,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;QACrC,IAAI,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,QAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,YAAA,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;;SAGxB;AACF,KAAA,CAAC,CAAC;IAEH,UAAU,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;AAC7D,QAAA,MAAM,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;AAE7C,QAAA,IAAI,SAAS,CAAC,eAAe,CAAC,EAAE;AAC9B,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,wFAAA,CAA0F,CAAC,CAAC;SAC7G;AAED,QAAA,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE;AACjC,YAAA,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;SACrC;aAAM;;AAEL,YAAA,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;SAClC;KACF;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,WAAW,EAAE,KAAK,SAAS,EAAE;AACtD,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,4FAAA,CAA8F,CAAC,CAAC;KACjH;AAED,IAAA,IAAI,0BAA0B,GAAG,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC;IAE9D,MAAM,CAAC,MAAK;QACV,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;AAEpD,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QAE1C,IAAI,0BAA0B,EAAE;YAC9B,0BAA0B,GAAG,KAAK,CAAC;YACnC,OAAO;SACR;QAED,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE;YACnD,SAAS,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAChD;aAAM;YACL,SAAS,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;SAC7C;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,QAAQ,CAAC,MAAM,WAAW,EAAO,EAAE,EAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA2C,EAC3C,QAA+B,EAAA;AAE/B,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,OAAO,EAAE,UAAU;KACpB,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAI,KAAU,EAAA;IAC9B,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;AACnD;;SChIgB,aAAa,GAAA;AAC3B,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE/B,OAAO;QACL,IAAI,EAAE,MAAK;AACT,YAAA,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;SACnC;AACD,QAAA,KAAK,EAAE,YAAY,CAAC,UAAU,EAAE;KACjC,CAAC;AACJ;;SCiEgB,YAAY,CAC1B,oBAAyD,EACzD,UAAiC,EAAE,EAAA;IAEnC,wBAAwB,CAAC,YAAY,CAAC,CAAC;AAEvC,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACrC,IAAA,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;AAE5C,IAAA,MAAM,EAAC,SAAS,EAAE,YAAY,EAAC,GAAG,OAAO,CAAC;;IAG1C,IAAI,CAAC,oBAAoB,EAAE;AACzB,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAC,YAAY,EAAE,aAAa,EAAC,CAAC,CAAC;KAC9D;;AAGD,IAAA,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE;QAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EAAE,EAAC,YAAY,EAAE,oBAAoB,CAAC,aAAa,CAAC,EAAC,CAAC,CAAC;KACpH;;;;;;;;;AAUD,IAAA,MAAM,QAAQ,GAAG,CAAC,MAAc,KAAI;AAClC,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,oBAAoB,CAAuB,CAAC;QAEnE,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,YAAY,IAAI,IAAI,CAAC;SAC7B;AAED,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC9C,KAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAC,YAAY,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAC,CAAC,CAAC;AAC7F;;AChCA;;;;;;;;;;;;;;AAcG;SACa,iBAAiB,CAC/B,oBAA8D,EAC9D,UAAsC,EAAE,EAAA;IAExC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;AAE5C,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACrC,IAAA,MAAM,kBAAkB,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;AAEtD,IAAA,MAAM,EAAC,SAAS,EAAE,YAAY,EAAC,GAAG,OAAO,CAAC;;IAG1C,IAAI,CAAC,oBAAoB,EAAE;AACzB,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAC,YAAY,EAAE,kBAAkB,EAAC,CAAC,CAAC;KACxE;;AAGD,IAAA,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE;AAC9C,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EAAE;AACjE,YAAA,YAAY,EAAE,oBAAoB,CAAC,kBAAkB,CAAC;AACvD,SAAA,CAAC,CAAC;KACJ;;AAGD,IAAA,MAAM,QAAQ,GAAG,CAAC,MAAc,KAAI;AAClC,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,oBAAoB,CAAkC,CAAC;QAE9E,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,YAAY,IAAI,IAAI,CAAC;SAC7B;AAED,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,OAAO,YAAY,IAAI,IAAI,CAAC;aAC7B;AACD,YAAA,OAAO,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SACnD;AAED,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC9C,KAAC,CAAC;AAEF,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE;AACrD,QAAA,YAAY,EAAE,QAAQ,CAAC,kBAAkB,CAAC;AAC3C,KAAA,CAAC,CAAC;AACL;;AC3GA;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACa,SAAA,SAAS,CAA2D,GAAG,IAAe,EAAA;IACpG,wBAAwB,CAAC,SAAS,CAAC,CAAC;AAEpC,IAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,GAAG,EAAE,CAAC,GAAG,SAAS,CAAgB,IAAI,CAAC,CAAC;IAEpF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AAC/C,QAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpB,OAAO,YAAY,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC9F;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;AACzB,YAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;SACvB;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC7C,KAAC,CAAC,CAAC;AAEH,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,QAAmD,CAAC,CAAC;AAEtG,IAAA,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;AACtC,QAAA,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAC,YAAY,EAAE,OAAO,CAAC,YAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAC,CAAC,CAAC;KACtG;AACD,IAAA,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,SAAS,CAA2D,IAAe,EAAA;IAC1F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,QAAA,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAC;KAChD;AAED,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAoD,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;KACpG;AAED,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;QAElD,IAAI,WAAW,EAAE;YACf,OAAO;gBACL,IAAI,CAAC,CAAC,CAAoD;gBAC1D,IAAI,CAAC,CAAC,CAA4C;gBAClD,SAAS;aACD,CAAC;SACZ;QAED,OAAO;YACL,IAAI,CAAC,CAAC,CAAoD;YAC1D,SAAS;YACT,IAAI,CAAC,CAAC,CAA6B;SAC3B,CAAC;KACZ;AAED,IAAA,OAAO,IAIN,CAAC;AACJ;;ACvHA;;;;;;;;;;;;;;AAcG;AACa,SAAA,gBAAgB,CAAC,QAAgC,EAAE,SAAiC,EAAA;AAClG,IAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AACrC,IAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAExF,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAChC;;ACnBA;;;;;;;AAOG;SACa,WAAW,CACzB,SAAgD,EAChD,eAA4C,EAC5C,gBAA8C,EAAA;AAE9C;;;AAGG;IACH,OAAO,CAAC,OAAwB,KAAuB;QACrD,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC3C,YAAA,OAAO,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;SACrD;AAED,QAAA,OAAO,iBAAiB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACrD,KAAC,CAAC;AACJ,CAAC;AAED;;;;;;AAMG;AACa,SAAA,gBAAgB,CAC9B,SAAgD,EAChD,WAA6B,EAAA;AAE7B;;;AAGG;IACH,OAAO,CAAC,OAAwB,KAAI;QAClC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AACvC,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;SACjB;AAED,QAAA,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,KAAC,CAAC;AACJ,CAAC;AAED;;;;;;AAMG;AACH,SAAS,iBAAiB,CACxB,OAAwB,EACxB,WAAoD,EAAA;IAEpD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9E,IAAA,OAAO,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC;AAC7D;;ACtEA;;;;AAIG;AACG,SAAU,OAAO,CAA6C,KAA2B,EAAA;IAC7F,IAAI,KAAK,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;AAE/B,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACrD,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;KACnE;AAED,IAAA,OAAO,KAAK,CAAC;AACf;;ACjBA;;;;;AAKG;AACa,SAAA,OAAO,CAAI,MAAS,EAAE,MAAS,EAAA;IAC7C,IAAI,MAAM,KAAK,MAAM;AAAE,QAAA,OAAO,IAAI,CAAC;AAEnC,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE;AAClG,QAAA,OAAO,KAAK,CAAC;KACd;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAmB,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAmB,CAAC;AAEpD,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK,CAAC;AAEhD,IAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;QACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;AAC9D,YAAA,OAAO,KAAK,CAAC;SACd;KACF;AAED,IAAA,OAAO,IAAI,CAAC;AACd;;ACzBA;;;;;AAKG;AACa,SAAA,MAAM,CAAI,MAAS,EAAE,SAAsD,EAAA;IACzF,MAAM,MAAM,GAAe,EAAE,CAAC;AAE9B,IAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;QACxB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE;YACpF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SAC3B;KACF;AAED,IAAA,OAAO,MAAM,CAAC;AAChB;;ACdA;;;;;AAKG;MACU,eAAe,CAAA;AAC1B;;;;;;;AAOG;IACH,OAAO,MAAM,CACX,WAAA,GAAgE,CAAC,OAA2B,KAAK,OAAO,EAAA;QAExG,OAAO,CAAC,SAA0B,KAA6B;AAC7D,YAAA,IAAI,EAAE,SAAS,YAAY,SAAS,CAAC,EAAE;AACrC,gBAAA,OAAO,IAAI,CAAC;aACb;YAED,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3D,YAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;YACzD,MAAM,eAAe,GAAyB,EAAE,CAAC;AAEjD,YAAA,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE;AACpC,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAE5B,gBAAA,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;oBACpE,SAAS;iBACV;gBAED,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEhD,IAAI,YAAY,EAAE;oBAChB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAC3C,wBAAA,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;qBACpC;AAED,oBAAA,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC/B;qBAAM;AACL,oBAAA,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;iBACrC;aACF;AAED,YAAA,MAAM,cAAc,GAAG,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC;;AAGzC,YAAA,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE;AACpC,gBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAE9B,gBAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;;oBAErC,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,cAAc,GAAG,EAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAC,CAAC,CAAC;iBACtF;qBAAM;;AAEL,oBAAA,IAAI,MAAM,KAAK,IAAI,EAAE;AACnB,wBAAA,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;qBACzB;yBAAM;AACL,wBAAA,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;wBAC3B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;qBACnE;iBACF;aACF;AAED,YAAA,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC;AAC5D,SAAC,CAAC;KACH;AACF;;ACpEK,SAAU,YAAY,CAAC,OAAwB,EAAA;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACnC,QAAA,OAAO,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC;KAC3B;AACD,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAEK,SAAU,cAAc,CAAC,OAAwB,EAAA;IACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACrC,QAAA,OAAO,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC;KAC3B;AACD,IAAA,OAAO,IAAI,CAAC;AACd;;AChBA;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -9,13 +9,13 @@ import { AsyncState } from '../models';
|
|
|
9
9
|
* @param {object} options - The configuration options for polling.
|
|
10
10
|
* @param {number} options.interval - The interval in milliseconds between each poll.
|
|
11
11
|
* @param {(params: any) => Observable<Data> | Data} options.pollingFn - A function that returns an Observable, Promise, or primitive value.
|
|
12
|
-
* @param {(input: Input |
|
|
12
|
+
* @param {(input: Input | undefined) => any} [options.paramsBuilder] - An optional function that builds parameters for the polling function based on the input. The value emitted by the trigger observable will serve as the parameter.
|
|
13
13
|
* @param {Observable<Input> | Signal<Input>} [options.trigger] - An optional Observable or Signal that triggers a manual poll.
|
|
14
14
|
* @returns {Observable<AsyncState<Data>>} An Observable emitting objects representing the state of the asynchronous operation.
|
|
15
15
|
*/
|
|
16
16
|
export declare function poll<Data, Input>(options: {
|
|
17
17
|
interval: number;
|
|
18
18
|
pollingFn: (params: any) => Observable<Data> | Promise<Data> | Data;
|
|
19
|
-
paramsBuilder?: (input
|
|
19
|
+
paramsBuilder?: (input?: Input | undefined) => any;
|
|
20
20
|
trigger?: Observable<Input> | Signal<Input>;
|
|
21
21
|
}): Observable<AsyncState<Data>>;
|
|
@@ -32,6 +32,8 @@ import * as i0 from "@angular/core";
|
|
|
32
32
|
export declare class ByteConverterPipe implements PipeTransform {
|
|
33
33
|
private locale;
|
|
34
34
|
transform(value: number): string;
|
|
35
|
+
transform(value?: number): string | null;
|
|
36
|
+
transform(value?: number | null): string | null;
|
|
35
37
|
private formatNumber;
|
|
36
38
|
static ɵfac: i0.ɵɵFactoryDeclaration<ByteConverterPipe, never>;
|
|
37
39
|
static ɵpipe: i0.ɵɵPipeDeclaration<ByteConverterPipe, "byteConverter", true>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-lift",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "A project has been crafted with the goal of enhancing and simplifying your Angular development experience.",
|
|
5
5
|
"author": "Guanghui Wang <guanghui-wang@foxmail.com>",
|
|
6
6
|
"peerDependencies": {
|