Skip to content

Commit 455e53b

Browse files
authored
feat(router): add merge strategy config for route data service (#3443)
1 parent b20b7ce commit 455e53b

File tree

6 files changed

+44
-22
lines changed

6 files changed

+44
-22
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './token';
2+
export * from './type';

libs/router/src/data/config/token.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { createConfigInjectionToken } from '@daffodil/core';
2+
3+
import { DaffRouterDataServiceConfig } from './type';
4+
5+
export const {
6+
token: DAFF_ROUTER_DATA_SERVICE_CONFIG,
7+
provider: provideDaffRouterDataServiceConfig,
8+
} = createConfigInjectionToken<DaffRouterDataServiceConfig>({}, 'DAFF_ROUTER_DATA_SERVICE_CONFIG');

libs/router/src/data/config/type.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { ActivatedRouteSnapshot } from '@angular/router';
2+
3+
import { DaffMergeStrategy } from '@daffodil/core';
4+
5+
/**
6+
* Configuration for {@link DaffRouterDataService}.
7+
*/
8+
export interface DaffRouterDataServiceConfig<T extends ActivatedRouteSnapshot['data'] = ActivatedRouteSnapshot['data']> {
9+
/**
10+
* The strategy to use for merging route data.
11+
*/
12+
mergeStrategy?: DaffMergeStrategy<T>;
13+
}
+8-18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
1-
import {
2-
ActivatedRouteSnapshot,
3-
Route,
4-
} from '@angular/router';
1+
import { ActivatedRouteSnapshot } from '@angular/router';
52

6-
import { collect } from '@daffodil/core';
3+
import {
4+
collect,
5+
daffMerge,
6+
DaffMergeStrategy,
7+
} from '@daffodil/core';
78

89
/**
910
* Collects data defined in the entire tree of routes.
1011
* Shallow merges data, preferring fields of more deeply nested routes.
1112
*/
12-
export const daffRouterDataCollect = <T extends Route['data'] = Route['data']>(route: ActivatedRouteSnapshot): T => {
13-
const ary = collect(route, (r) => r.children);
14-
const ret = ary.reduce(
15-
(acc, r) => r.data
16-
? {
17-
...acc,
18-
...r.data,
19-
}
20-
: acc,
21-
<T>{},
22-
);
23-
return ret;
24-
};
13+
export const daffRouterDataCollect = <T extends ActivatedRouteSnapshot['data'] = ActivatedRouteSnapshot['data']>(route: ActivatedRouteSnapshot, mergeStrategy?: DaffMergeStrategy<T>): T =>
14+
daffMerge(collect(route, (r) => r.children).map((r) => <T>r.data), mergeStrategy);

libs/router/src/data/public_api.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './helpers/public_api';
2+
export * from './config/public_api';
23
export * from './service/data.service';

libs/router/src/data/service/data.service.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
import { Injectable } from '@angular/core';
1+
import {
2+
Inject,
3+
Injectable,
4+
} from '@angular/core';
25
import {
36
ActivatedRoute,
7+
ActivatedRouteSnapshot,
48
NavigationEnd,
5-
Route,
69
Router,
710
} from '@angular/router';
811
import {
@@ -12,12 +15,16 @@ import {
1215
merge,
1316
} from 'rxjs';
1417

18+
import {
19+
DAFF_ROUTER_DATA_SERVICE_CONFIG,
20+
DaffRouterDataServiceConfig,
21+
} from '../config/public_api';
1522
import { daffRouterDataCollect } from '../helpers/collect-data';
1623

1724
@Injectable({
1825
providedIn: 'root',
1926
})
20-
export class DaffRouterDataService<T extends Route['data'] = Route['data']> {
27+
export class DaffRouterDataService<T extends ActivatedRouteSnapshot['data'] = ActivatedRouteSnapshot['data']> {
2128
/**
2229
* A collection of all the route data defined in any part of the currently activated route's tree.
2330
* Child route's data takes precendence over parent data.
@@ -27,6 +34,7 @@ export class DaffRouterDataService<T extends Route['data'] = Route['data']> {
2734
constructor(
2835
private route: ActivatedRoute,
2936
private router: Router,
37+
@Inject(DAFF_ROUTER_DATA_SERVICE_CONFIG) private config: DaffRouterDataServiceConfig,
3038
) {
3139
/**
3240
* Because data won't reemit for route changes and
@@ -46,7 +54,7 @@ export class DaffRouterDataService<T extends Route['data'] = Route['data']> {
4654
this.route.url,
4755
).pipe(
4856
map(() => this.route.snapshot),
49-
map(daffRouterDataCollect<T>),
57+
map((r) => daffRouterDataCollect<T>(r, this.config.mergeStrategy)),
5058
);
5159
}
5260
}

0 commit comments

Comments
 (0)