Skip to content

Commit a07ce47

Browse files
5871d4dc chore: release 17.0.0-beta.0
1 parent b81356b commit a07ce47

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2366
-1
lines changed

LICENSE

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
The MIT License (MIT)
2+
3+
Copyright (c) 2017-2023 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.
22+
23+
This repository includes a file "debounceSync.ts" originially copied from
24+
https://github.com/cartant/rxjs-etc by Nicholas Jamieson, MIT licensed. See the
25+
file header for details.

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
# NgRx Operators Builds
1+
# @ngrx/operators
2+
3+
The sources for this package are in the main [NgRx](https://github.com/ngrx/platform) repo. Please file issues and pull requests against that repo.

commit_message

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5871d4dc chore: release 17.0.0-beta.0

esm2022/index.mjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* DO NOT EDIT
3+
*
4+
* This file is automatically generated at build
5+
*/
6+
export * from './src/index';
7+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL29wZXJhdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERPIE5PVCBFRElUXG4gKlxuICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGF0IGJ1aWxkXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9zcmMvaW5kZXgnO1xuIl19

esm2022/ngrx-operators.mjs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/**
2+
* Generated bundle index. Do not edit.
3+
*/
4+
export * from './index';
5+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdyeC1vcGVyYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL29wZXJhdG9ycy9uZ3J4LW9wZXJhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==

esm2022/src/concat_latest_from.mjs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { of, } from 'rxjs';
2+
import { concatMap, withLatestFrom } from 'rxjs/operators';
3+
/**
4+
* `concatLatestFrom` combines the source value
5+
* and the last available value from a lazily evaluated Observable
6+
* in a new array
7+
*
8+
* @usageNotes
9+
*
10+
* Select the active customer from the NgRx Store
11+
*
12+
* ```ts
13+
* import { concatLatestFrom } from '@ngrx/effects';
14+
* import * as fromCustomers from '../customers';
15+
*
16+
* this.actions$.pipe(
17+
* concatLatestFrom(() => this.store.select(fromCustomers.selectActiveCustomer))
18+
* )
19+
* ```
20+
*
21+
* Select a customer from the NgRx Store by its id that is available on the action
22+
*
23+
* ```ts
24+
* import { concatLatestFrom } from '@ngrx/effects';
25+
* import * fromCustomers from '../customers';
26+
*
27+
* this.actions$.pipe(
28+
* concatLatestFrom((action) => this.store.select(fromCustomers.selectCustomer(action.customerId)))
29+
* )
30+
* ```
31+
*/
32+
export function concatLatestFrom(observablesFactory) {
33+
return concatMap((value) => {
34+
const observables = observablesFactory(value);
35+
const observablesAsArray = Array.isArray(observables)
36+
? observables
37+
: [observables];
38+
return of(value).pipe(withLatestFrom(...observablesAsArray));
39+
});
40+
}
41+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X2xhdGVzdF9mcm9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9vcGVyYXRvcnMvc3JjL2NvbmNhdF9sYXRlc3RfZnJvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsRUFBRSxHQUdILE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FTOUIsa0JBQW1DO0lBQ25DLE9BQU8sU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDekIsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNuRCxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDbkIsY0FBYyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FDVixDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIE9ic2VydmFibGVJbnB1dCxcbiAgb2YsXG4gIE9ic2VydmVkVmFsdWVPZixcbiAgT3BlcmF0b3JGdW5jdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb25jYXRNYXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBUaGUgYXJyYXkgb3ZlcmxvYWQgaXMgbmVlZGVkIGZpcnN0IGJlY2F1c2Ugd2Ugd2FudCB0byBtYWludGFpbiB0aGUgcHJvcGVyIG9yZGVyIGluIHRoZSByZXN1bHRpbmcgdHVwbGVcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRMYXRlc3RGcm9tPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPHVua25vd24+W10sIFY+KFxuICBvYnNlcnZhYmxlc0ZhY3Rvcnk6ICh2YWx1ZTogVikgPT4gWy4uLlRdXG4pOiBPcGVyYXRvckZ1bmN0aW9uPFYsIFtWLCAuLi57IFtpIGluIGtleW9mIFRdOiBPYnNlcnZlZFZhbHVlT2Y8VFtpXT4gfV0+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdExhdGVzdEZyb208VCBleHRlbmRzIE9ic2VydmFibGU8dW5rbm93bj4sIFY+KFxuICBvYnNlcnZhYmxlRmFjdG9yeTogKHZhbHVlOiBWKSA9PiBUXG4pOiBPcGVyYXRvckZ1bmN0aW9uPFYsIFtWLCBPYnNlcnZlZFZhbHVlT2Y8VD5dPjtcbi8qKlxuICogYGNvbmNhdExhdGVzdEZyb21gIGNvbWJpbmVzIHRoZSBzb3VyY2UgdmFsdWVcbiAqIGFuZCB0aGUgbGFzdCBhdmFpbGFibGUgdmFsdWUgZnJvbSBhIGxhemlseSBldmFsdWF0ZWQgT2JzZXJ2YWJsZVxuICogaW4gYSBuZXcgYXJyYXlcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqIFNlbGVjdCB0aGUgYWN0aXZlIGN1c3RvbWVyIGZyb20gdGhlIE5nUnggU3RvcmVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29uY2F0TGF0ZXN0RnJvbSB9IGZyb20gJ0BuZ3J4L2VmZmVjdHMnO1xuICogaW1wb3J0ICogYXMgZnJvbUN1c3RvbWVycyBmcm9tICcuLi9jdXN0b21lcnMnO1xuICpcbiAqIHRoaXMuYWN0aW9ucyQucGlwZShcbiAqICBjb25jYXRMYXRlc3RGcm9tKCgpID0+IHRoaXMuc3RvcmUuc2VsZWN0KGZyb21DdXN0b21lcnMuc2VsZWN0QWN0aXZlQ3VzdG9tZXIpKVxuICogKVxuICogYGBgXG4gKlxuICogU2VsZWN0IGEgY3VzdG9tZXIgZnJvbSB0aGUgTmdSeCBTdG9yZSBieSBpdHMgaWQgdGhhdCBpcyBhdmFpbGFibGUgb24gdGhlIGFjdGlvblxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjb25jYXRMYXRlc3RGcm9tIH0gZnJvbSAnQG5ncngvZWZmZWN0cyc7XG4gKiBpbXBvcnQgKiBmcm9tQ3VzdG9tZXJzIGZyb20gJy4uL2N1c3RvbWVycyc7XG4gKlxuICogdGhpcy5hY3Rpb25zJC5waXBlKFxuICogIGNvbmNhdExhdGVzdEZyb20oKGFjdGlvbikgPT4gdGhpcy5zdG9yZS5zZWxlY3QoZnJvbUN1c3RvbWVycy5zZWxlY3RDdXN0b21lcihhY3Rpb24uY3VzdG9tZXJJZCkpKVxuICogKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRMYXRlc3RGcm9tPFxuICBUIGV4dGVuZHMgT2JzZXJ2YWJsZUlucHV0PHVua25vd24+W10gfCBPYnNlcnZhYmxlSW5wdXQ8dW5rbm93bj4sXG4gIFYsXG4gIFIgPSBbXG4gICAgVixcbiAgICAuLi4oVCBleHRlbmRzIE9ic2VydmFibGVJbnB1dDx1bmtub3duPltdXG4gICAgICA/IHsgW2kgaW4ga2V5b2YgVF06IE9ic2VydmVkVmFsdWVPZjxUW2ldPiB9XG4gICAgICA6IFtPYnNlcnZlZFZhbHVlT2Y8VD5dKVxuICBdXG4+KG9ic2VydmFibGVzRmFjdG9yeTogKHZhbHVlOiBWKSA9PiBUKTogT3BlcmF0b3JGdW5jdGlvbjxWLCBSPiB7XG4gIHJldHVybiBjb25jYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSBvYnNlcnZhYmxlc0ZhY3RvcnkodmFsdWUpO1xuICAgIGNvbnN0IG9ic2VydmFibGVzQXNBcnJheSA9IEFycmF5LmlzQXJyYXkob2JzZXJ2YWJsZXMpXG4gICAgICA/IG9ic2VydmFibGVzXG4gICAgICA6IFtvYnNlcnZhYmxlc107XG4gICAgcmV0dXJuIG9mKHZhbHVlKS5waXBlKFxuICAgICAgd2l0aExhdGVzdEZyb20oLi4ub2JzZXJ2YWJsZXNBc0FycmF5KVxuICAgICkgYXMgdW5rbm93biBhcyBPYnNlcnZhYmxlPFI+O1xuICB9KTtcbn1cbiJdfQ==

esm2022/src/index.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { concatLatestFrom } from './concat_latest_from';
2+
export { tapResponse } from './tap-response';
3+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL29wZXJhdG9ycy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY29uY2F0TGF0ZXN0RnJvbSB9IGZyb20gJy4vY29uY2F0X2xhdGVzdF9mcm9tJztcbmV4cG9ydCB7IHRhcFJlc3BvbnNlIH0gZnJvbSAnLi90YXAtcmVzcG9uc2UnO1xuIl19

esm2022/src/tap-response.mjs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { EMPTY } from 'rxjs';
2+
import { catchError, finalize, tap } from 'rxjs/operators';
3+
/**
4+
* Handles the response in ComponentStore effects in a safe way, without
5+
* additional boilerplate. It enforces that the error case is handled and
6+
* that the effect would still be running should an error occur.
7+
*
8+
* Takes optional callbacks for `complete` and `finalize`.
9+
*
10+
* @usageNotes
11+
*
12+
* ```ts
13+
* readonly dismissAlert = this.effect<Alert>((alert$) => {
14+
* return alert$.pipe(
15+
* concatMap(
16+
* (alert) => this.alertsService.dismissAlert(alert).pipe(
17+
* tapResponse(
18+
* (dismissedAlert) => this.alertDismissed(dismissedAlert),
19+
* (error: { message: string }) => this.logError(error.message)
20+
* )
21+
* )
22+
* )
23+
* );
24+
* });
25+
*
26+
* readonly loadUsers = this.effect<void>((trigger$) => {
27+
* return trigger$.pipe(
28+
* tap(() => this.patchState({ loading: true })),
29+
* exhaustMap(() =>
30+
* this.usersService.getAll().pipe(
31+
* tapResponse({
32+
* next: (users) => this.patchState({ users }),
33+
* error: (error: HttpErrorResponse) => this.logError(error.message),
34+
* finalize: () => this.patchState({ loading: false }),
35+
* })
36+
* )
37+
* )
38+
* );
39+
* });
40+
* ```
41+
*/
42+
export function tapResponse(observerOrNext, error, complete) {
43+
const observer = typeof observerOrNext === 'function'
44+
? {
45+
next: observerOrNext,
46+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
47+
error: error,
48+
complete,
49+
}
50+
: observerOrNext;
51+
return (source) => source.pipe(tap({ next: observer.next, complete: observer.complete }), catchError((error) => {
52+
observer.error(error);
53+
return EMPTY;
54+
}), observer.finalize ? finalize(observer.finalize) : (source$) => source$);
55+
}
56+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9vcGVyYXRvcnMvc3JjL3RhcC1yZXNwb25zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBaUIzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixjQUFnRSxFQUNoRSxLQUEwQixFQUMxQixRQUFxQjtJQUVyQixNQUFNLFFBQVEsR0FDWixPQUFPLGNBQWMsS0FBSyxVQUFVO1FBQ2xDLENBQUMsQ0FBQztZQUNFLElBQUksRUFBRSxjQUFjO1lBQ3BCLG9FQUFvRTtZQUNwRSxLQUFLLEVBQUUsS0FBTTtZQUNiLFFBQVE7U0FDVDtRQUNILENBQUMsQ0FBQyxjQUFjLENBQUM7SUFFckIsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUN6RCxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FDdkUsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxudHlwZSBUYXBSZXNwb25zZU9ic2VydmVyPFQsIEU+ID0ge1xuICBuZXh0OiAodmFsdWU6IFQpID0+IHZvaWQ7XG4gIGVycm9yOiAoZXJyb3I6IEUpID0+IHZvaWQ7XG4gIGNvbXBsZXRlPzogKCkgPT4gdm9pZDtcbiAgZmluYWxpemU/OiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhcFJlc3BvbnNlPFQsIEUgPSB1bmtub3duPihcbiAgb2JzZXJ2ZXI6IFRhcFJlc3BvbnNlT2JzZXJ2ZXI8VCwgRT5cbik6IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBPYnNlcnZhYmxlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHRhcFJlc3BvbnNlPFQsIEUgPSB1bmtub3duPihcbiAgbmV4dDogKHZhbHVlOiBUKSA9PiB2b2lkLFxuICBlcnJvcjogKGVycm9yOiBFKSA9PiB2b2lkLFxuICBjb21wbGV0ZT86ICgpID0+IHZvaWRcbik6IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBPYnNlcnZhYmxlPFQ+O1xuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXNwb25zZSBpbiBDb21wb25lbnRTdG9yZSBlZmZlY3RzIGluIGEgc2FmZSB3YXksIHdpdGhvdXRcbiAqIGFkZGl0aW9uYWwgYm9pbGVycGxhdGUuIEl0IGVuZm9yY2VzIHRoYXQgdGhlIGVycm9yIGNhc2UgaXMgaGFuZGxlZCBhbmRcbiAqIHRoYXQgdGhlIGVmZmVjdCB3b3VsZCBzdGlsbCBiZSBydW5uaW5nIHNob3VsZCBhbiBlcnJvciBvY2N1ci5cbiAqXG4gKiBUYWtlcyBvcHRpb25hbCBjYWxsYmFja3MgZm9yIGBjb21wbGV0ZWAgYW5kIGBmaW5hbGl6ZWAuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBgYGB0c1xuICogcmVhZG9ubHkgZGlzbWlzc0FsZXJ0ID0gdGhpcy5lZmZlY3Q8QWxlcnQ+KChhbGVydCQpID0+IHtcbiAqICAgcmV0dXJuIGFsZXJ0JC5waXBlKFxuICogICAgIGNvbmNhdE1hcChcbiAqICAgICAgIChhbGVydCkgPT4gdGhpcy5hbGVydHNTZXJ2aWNlLmRpc21pc3NBbGVydChhbGVydCkucGlwZShcbiAqICAgICAgICAgdGFwUmVzcG9uc2UoXG4gKiAgICAgICAgICAgKGRpc21pc3NlZEFsZXJ0KSA9PiB0aGlzLmFsZXJ0RGlzbWlzc2VkKGRpc21pc3NlZEFsZXJ0KSxcbiAqICAgICAgICAgICAoZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IHRoaXMubG9nRXJyb3IoZXJyb3IubWVzc2FnZSlcbiAqICAgICAgICAgKVxuICogICAgICAgKVxuICogICAgIClcbiAqICAgKTtcbiAqIH0pO1xuICpcbiAqIHJlYWRvbmx5IGxvYWRVc2VycyA9IHRoaXMuZWZmZWN0PHZvaWQ+KCh0cmlnZ2VyJCkgPT4ge1xuICogICByZXR1cm4gdHJpZ2dlciQucGlwZShcbiAqICAgICB0YXAoKCkgPT4gdGhpcy5wYXRjaFN0YXRlKHsgbG9hZGluZzogdHJ1ZSB9KSksXG4gKiAgICAgZXhoYXVzdE1hcCgoKSA9PlxuICogICAgICAgdGhpcy51c2Vyc1NlcnZpY2UuZ2V0QWxsKCkucGlwZShcbiAqICAgICAgICAgdGFwUmVzcG9uc2Uoe1xuICogICAgICAgICAgIG5leHQ6ICh1c2VycykgPT4gdGhpcy5wYXRjaFN0YXRlKHsgdXNlcnMgfSksXG4gKiAgICAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMubG9nRXJyb3IoZXJyb3IubWVzc2FnZSksXG4gKiAgICAgICAgICAgZmluYWxpemU6ICgpID0+IHRoaXMucGF0Y2hTdGF0ZSh7IGxvYWRpbmc6IGZhbHNlIH0pLFxuICogICAgICAgICB9KVxuICogICAgICAgKVxuICogICAgIClcbiAqICAgKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBSZXNwb25zZTxULCBFPihcbiAgb2JzZXJ2ZXJPck5leHQ6IFRhcFJlc3BvbnNlT2JzZXJ2ZXI8VCwgRT4gfCAoKHZhbHVlOiBUKSA9PiB2b2lkKSxcbiAgZXJyb3I/OiAoZXJyb3I6IEUpID0+IHZvaWQsXG4gIGNvbXBsZXRlPzogKCkgPT4gdm9pZFxuKTogKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IE9ic2VydmFibGU8VD4ge1xuICBjb25zdCBvYnNlcnZlcjogVGFwUmVzcG9uc2VPYnNlcnZlcjxULCBFPiA9XG4gICAgdHlwZW9mIG9ic2VydmVyT3JOZXh0ID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHtcbiAgICAgICAgICBuZXh0OiBvYnNlcnZlck9yTmV4dCxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgIGVycm9yOiBlcnJvciEsXG4gICAgICAgICAgY29tcGxldGUsXG4gICAgICAgIH1cbiAgICAgIDogb2JzZXJ2ZXJPck5leHQ7XG5cbiAgcmV0dXJuIChzb3VyY2UpID0+XG4gICAgc291cmNlLnBpcGUoXG4gICAgICB0YXAoeyBuZXh0OiBvYnNlcnZlci5uZXh0LCBjb21wbGV0ZTogb2JzZXJ2ZXIuY29tcGxldGUgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgIH0pLFxuICAgICAgb2JzZXJ2ZXIuZmluYWxpemUgPyBmaW5hbGl6ZShvYnNlcnZlci5maW5hbGl6ZSkgOiAoc291cmNlJCkgPT4gc291cmNlJFxuICAgICk7XG59XG4iXX0=

fesm2022/ngrx-operators.mjs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { of, EMPTY } from 'rxjs';
2+
import { concatMap, withLatestFrom, tap, catchError, finalize } from 'rxjs/operators';
3+
4+
/**
5+
* `concatLatestFrom` combines the source value
6+
* and the last available value from a lazily evaluated Observable
7+
* in a new array
8+
*
9+
* @usageNotes
10+
*
11+
* Select the active customer from the NgRx Store
12+
*
13+
* ```ts
14+
* import { concatLatestFrom } from '@ngrx/effects';
15+
* import * as fromCustomers from '../customers';
16+
*
17+
* this.actions$.pipe(
18+
* concatLatestFrom(() => this.store.select(fromCustomers.selectActiveCustomer))
19+
* )
20+
* ```
21+
*
22+
* Select a customer from the NgRx Store by its id that is available on the action
23+
*
24+
* ```ts
25+
* import { concatLatestFrom } from '@ngrx/effects';
26+
* import * fromCustomers from '../customers';
27+
*
28+
* this.actions$.pipe(
29+
* concatLatestFrom((action) => this.store.select(fromCustomers.selectCustomer(action.customerId)))
30+
* )
31+
* ```
32+
*/
33+
function concatLatestFrom(observablesFactory) {
34+
return concatMap((value) => {
35+
const observables = observablesFactory(value);
36+
const observablesAsArray = Array.isArray(observables)
37+
? observables
38+
: [observables];
39+
return of(value).pipe(withLatestFrom(...observablesAsArray));
40+
});
41+
}
42+
43+
/**
44+
* Handles the response in ComponentStore effects in a safe way, without
45+
* additional boilerplate. It enforces that the error case is handled and
46+
* that the effect would still be running should an error occur.
47+
*
48+
* Takes optional callbacks for `complete` and `finalize`.
49+
*
50+
* @usageNotes
51+
*
52+
* ```ts
53+
* readonly dismissAlert = this.effect<Alert>((alert$) => {
54+
* return alert$.pipe(
55+
* concatMap(
56+
* (alert) => this.alertsService.dismissAlert(alert).pipe(
57+
* tapResponse(
58+
* (dismissedAlert) => this.alertDismissed(dismissedAlert),
59+
* (error: { message: string }) => this.logError(error.message)
60+
* )
61+
* )
62+
* )
63+
* );
64+
* });
65+
*
66+
* readonly loadUsers = this.effect<void>((trigger$) => {
67+
* return trigger$.pipe(
68+
* tap(() => this.patchState({ loading: true })),
69+
* exhaustMap(() =>
70+
* this.usersService.getAll().pipe(
71+
* tapResponse({
72+
* next: (users) => this.patchState({ users }),
73+
* error: (error: HttpErrorResponse) => this.logError(error.message),
74+
* finalize: () => this.patchState({ loading: false }),
75+
* })
76+
* )
77+
* )
78+
* );
79+
* });
80+
* ```
81+
*/
82+
function tapResponse(observerOrNext, error, complete) {
83+
const observer = typeof observerOrNext === 'function'
84+
? {
85+
next: observerOrNext,
86+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
87+
error: error,
88+
complete,
89+
}
90+
: observerOrNext;
91+
return (source) => source.pipe(tap({ next: observer.next, complete: observer.complete }), catchError((error) => {
92+
observer.error(error);
93+
return EMPTY;
94+
}), observer.finalize ? finalize(observer.finalize) : (source$) => source$);
95+
}
96+
97+
/**
98+
* DO NOT EDIT
99+
*
100+
* This file is automatically generated at build
101+
*/
102+
103+
/**
104+
* Generated bundle index. Do not edit.
105+
*/
106+
107+
export { concatLatestFrom, tapResponse };
108+
//# sourceMappingURL=ngrx-operators.mjs.map

0 commit comments

Comments
 (0)