diff --git a/modules/router-store/spec/router_selectors.spec.ts b/modules/router-store/spec/router_selectors.spec.ts new file mode 100644 index 0000000000..c52d1ac776 --- /dev/null +++ b/modules/router-store/spec/router_selectors.spec.ts @@ -0,0 +1,97 @@ +import * as fromRouter from '@ngrx/router-store'; +import { RouterStateSelectors } from '../src/models'; +import { getSelectors } from '../src/router_selectors'; + +let mockData = { + state: { + root: { + params: {}, + paramMap: { + params: {}, + }, + data: {}, + url: [], + outlet: 'primary', + routeConfig: null, + queryParams: {}, + queryParamMap: { + params: {}, + }, + fragment: null, + firstChild: { + params: {}, + paramMap: { + params: {}, + }, + data: {}, + url: [ + { + path: 'login', + parameters: {}, + }, + ], + outlet: 'primary', + routeConfig: { + path: 'login', + }, + queryParams: {}, + queryParamMap: { + params: {}, + }, + fragment: null, + children: [], + }, + children: [ + { + params: {}, + paramMap: { + params: {}, + }, + data: {}, + url: [ + { + path: 'login', + parameters: {}, + }, + ], + outlet: 'primary', + routeConfig: { + path: 'login', + }, + queryParams: {}, + queryParamMap: { + params: {}, + }, + fragment: null, + children: [], + }, + ], + }, + url: '/login', + }, + navigationId: 1, +}; +describe('Router State Selectors', () => { + describe('Composed Selectors', () => { + interface State { + router: fromRouter.RouterReducerState; + } + + let selectors: RouterStateSelectors; + let state: State; + + beforeEach(() => { + state = { + router: mockData, + }; + + selectors = getSelectors((state: State) => state.router); + }); + + it('should create a selector for selecting the url', () => { + const url = selectors.selectUrl(state); + + expect(url).toEqual(state.router.state.url); + }); + }); +}); diff --git a/modules/router-store/src/index.ts b/modules/router-store/src/index.ts index b0ed47f368..ae9d7eb0c1 100644 --- a/modules/router-store/src/index.ts +++ b/modules/router-store/src/index.ts @@ -31,4 +31,4 @@ export { SerializedRouterStateSnapshot, BaseRouterStoreState, } from './serializer'; -export { RouterAdapter } from './models'; +export * from './router_selectors'; diff --git a/modules/router-store/src/models.ts b/modules/router-store/src/models.ts index 83506a2fda..d4e916098e 100644 --- a/modules/router-store/src/models.ts +++ b/modules/router-store/src/models.ts @@ -1,15 +1,6 @@ -import { RouterReducerState } from '@ngrx/router-store'; - -export interface RouterSelectors { +export interface RouterStateSelectors { selectQueryParams: (state: V) => string[]; selectRouteParams: (state: V) => string[] | number[]; selectRouteData: (state: V) => T[]; selectUrl: (state: V) => string; } - -export interface RouterAdapter { - getSelectors(): RouterSelectors; - getSelectors( - selectState: (state: V) => RouterReducerState - ): RouterSelectors; -} diff --git a/modules/router-store/src/router_selectors.ts b/modules/router-store/src/router_selectors.ts index 982a357885..4ead7b3e6e 100644 --- a/modules/router-store/src/router_selectors.ts +++ b/modules/router-store/src/router_selectors.ts @@ -1,36 +1,37 @@ import { RouterReducerState } from '@ngrx/router-store'; import { createSelector } from '@ngrx/store'; -import { RouterSelectors } from './models'; +import { RouterStateSelectors } from './models'; -export function createSelectorsFactory() { - function getSelectors(): RouterSelectors; - function getSelectors( - selectState: (state: V) => RouterReducerState - ): RouterSelectors; - function getSelectors( - selectState?: (state: any) => RouterReducerState - ): RouterSelectors { - const selectQueryParams = (state: any) => state.queryParams; - const selectRouteParams = (state: any) => state.routeParams; - const selectRouteData = (state: any) => state.routeData; - const selectUrl = (state: any) => state.url; - - if (!selectState) { - return { - selectQueryParams, - selectRouteParams, - selectRouteData, - selectUrl, - }; - } +export function getSelectors(): RouterStateSelectors< + any, + RouterReducerState +>; +export function getSelectors( + selectState: (state: V) => RouterReducerState +): RouterStateSelectors; +export function getSelectors( + selectState?: (state: any) => RouterReducerState +): RouterStateSelectors { + const selectQueryParams = (state: any) => + state && state.state.root.queryParams; + const selectRouteParams = (state: any) => + state && state.state.root.routeParams; + const selectRouteData = (state: any) => state && state.state.root.data; + const selectUrl = (state: any) => state && state.state.url; + if (!selectState) { return { - selectQueryParams: createSelector(selectState, selectQueryParams), - selectRouteParams: createSelector(selectState, selectRouteParams), - selectRouteData: createSelector(selectState, selectRouteData), - selectUrl: createSelector(selectState, selectUrl), + selectQueryParams, + selectRouteParams, + selectRouteData, + selectUrl, }; } - return { getSelectors }; + return { + selectQueryParams: createSelector(selectState, selectQueryParams), + selectRouteParams: createSelector(selectState, selectRouteParams), + selectRouteData: createSelector(selectState, selectRouteData), + selectUrl: createSelector(selectState, selectUrl), + }; }