Skip to content

Commit 831e1e4

Browse files
fix(router-store): selects should return selectors (#2517)
Closes #2516
1 parent 52125b7 commit 831e1e4

File tree

4 files changed

+139
-8
lines changed

4 files changed

+139
-8
lines changed

modules/router-store/spec/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ts_test_library(
1212
"//modules/store",
1313
"@npm//@angular/router",
1414
"@npm//rxjs",
15+
"@npm//ts-snippet",
1516
],
1617
)
1718

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import { expecter } from 'ts-snippet';
2+
import { compilerOptions } from './utils';
3+
4+
describe('router selectors', () => {
5+
const expectSnippet = expecter(
6+
code => `
7+
import * as fromRouter from '@ngrx/router-store';
8+
import { createSelector, createFeatureSelector } from '@ngrx/store';
9+
10+
export interface State {
11+
router: fromRouter.RouterReducerState<any>;
12+
}
13+
14+
export const selectRouter = createFeatureSelector<
15+
State,
16+
fromRouter.RouterReducerState<any>
17+
>('router');
18+
19+
export const {
20+
selectCurrentRoute,
21+
selectQueryParams,
22+
selectQueryParam,
23+
selectRouteParams,
24+
selectRouteParam,
25+
selectRouteData,
26+
selectUrl,
27+
} = fromRouter.getSelectors(selectRouter);
28+
29+
${code}
30+
`,
31+
compilerOptions()
32+
);
33+
34+
it('selectCurrentRoute should return any', () => {
35+
expectSnippet(`
36+
export const selector = createSelector(
37+
selectCurrentRoute,
38+
route => route
39+
);
40+
`).toInfer(
41+
'selector',
42+
'MemoizedSelector<State, any, DefaultProjectorFn<any>>'
43+
);
44+
});
45+
46+
it('selectQueryParams should return Params', () => {
47+
expectSnippet(`
48+
export const selector = createSelector(
49+
selectQueryParams,
50+
params => params
51+
);
52+
`).toInfer(
53+
'selector',
54+
'MemoizedSelector<State, Params, DefaultProjectorFn<Params>>'
55+
);
56+
});
57+
58+
it('selectQueryParam should return string', () => {
59+
expectSnippet(`
60+
export const selectIdFromRoute = selectQueryParam('id')
61+
export const selector = createSelector(
62+
selectIdFromRoute,
63+
id => id
64+
);
65+
`).toInfer(
66+
'selector',
67+
'MemoizedSelector<State, string, DefaultProjectorFn<string>>'
68+
);
69+
});
70+
71+
it('selectRouteParams should return Params', () => {
72+
expectSnippet(`
73+
export const selector = createSelector(
74+
selectRouteParams,
75+
params => params
76+
);
77+
`).toInfer(
78+
'selector',
79+
'MemoizedSelector<State, Params, DefaultProjectorFn<Params>>'
80+
);
81+
});
82+
83+
it('selectRouteParam should return string', () => {
84+
expectSnippet(`
85+
export const selectIdFromRoute = selectRouteParam('id')
86+
export const selector = createSelector(
87+
selectIdFromRoute,
88+
id => id
89+
);
90+
`).toInfer(
91+
'selector',
92+
'MemoizedSelector<State, string, DefaultProjectorFn<string>>'
93+
);
94+
});
95+
96+
it('selectRouteData should return Data', () => {
97+
expectSnippet(`
98+
export const selector = createSelector(
99+
selectRouteData,
100+
data => data
101+
);
102+
`).toInfer(
103+
'selector',
104+
'MemoizedSelector<State, Data, DefaultProjectorFn<Data>>'
105+
);
106+
});
107+
108+
it('selectUrl should return string', () => {
109+
expectSnippet(`
110+
export const selector = createSelector(
111+
selectUrl,
112+
url => url
113+
);
114+
`).toInfer(
115+
'selector',
116+
'MemoizedSelector<State, string, DefaultProjectorFn<string>>'
117+
);
118+
});
119+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export const compilerOptions = () => ({
2+
moduleResolution: 'node',
3+
target: 'es2015',
4+
baseUrl: '.',
5+
experimentalDecorators: true,
6+
paths: {
7+
'@ngrx/store': ['./modules/store'],
8+
'@ngrx/router-store': ['./modules/router-store'],
9+
},
10+
});

modules/router-store/src/models.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { Data, Params } from '@angular/router';
1+
import { Params, Data } from '@angular/router';
2+
import { MemoizedSelector } from '@ngrx/store';
23

34
export interface RouterStateSelectors<V> {
4-
selectCurrentRoute: (state: V) => any;
5-
selectQueryParams: (state: V) => Params;
6-
selectQueryParam: (param: string) => (state: V) => string | undefined;
7-
selectRouteParams: (state: V) => Params;
8-
selectRouteParam: (param: string) => (state: V) => string | undefined;
9-
selectRouteData: (state: V) => Data;
10-
selectUrl: (state: V) => string;
5+
selectCurrentRoute: MemoizedSelector<V, any>;
6+
selectQueryParams: MemoizedSelector<V, Params>;
7+
selectQueryParam: (param: string) => MemoizedSelector<V, string | undefined>;
8+
selectRouteParams: MemoizedSelector<V, Params>;
9+
selectRouteParam: (param: string) => MemoizedSelector<V, string | undefined>;
10+
selectRouteData: MemoizedSelector<V, Data>;
11+
selectUrl: MemoizedSelector<V, string>;
1112
}

0 commit comments

Comments
 (0)