1
- /** @module state */ /** for typedoc */
2
- import { Obj , omit , noop , extend , inherit , values , applyPairs , tail , mapObj , identity } from '../common/common' ;
3
- import { isDefined , isFunction , isString , isArray } from '../common/predicates' ;
1
+ /** @module state */
2
+ /** for typedoc */
3
+ import { applyPairs , extend , identity , inherit , mapObj , noop , Obj , omit , tail , values } from '../common/common' ;
4
+ import { isArray , isDefined , isFunction , isString } from '../common/predicates' ;
4
5
import { stringify } from '../common/strings' ;
5
- import { prop , pattern , is , pipe , val } from '../common/hof' ;
6
+ import { is , pattern , pipe , prop , val } from '../common/hof' ;
6
7
import { StateDeclaration } from './interface' ;
7
8
8
9
import { StateObject } from './stateObject' ;
@@ -13,7 +14,8 @@ import { UrlMatcher } from '../url/urlMatcher';
13
14
import { Resolvable } from '../resolve/resolvable' ;
14
15
import { services } from '../common/coreservices' ;
15
16
import { ResolvePolicy } from '../resolve/interface' ;
16
- import { ParamFactory } from '../url/interface' ;
17
+ import { ParamDeclaration } from '../params' ;
18
+ import { ParamFactory } from '../url' ;
17
19
18
20
const parseUrl = ( url : string ) : any => {
19
21
if ( ! isString ( url ) ) return false ;
@@ -55,30 +57,21 @@ function dataBuilder(state: StateObject) {
55
57
}
56
58
57
59
const getUrlBuilder = ( $urlMatcherFactoryProvider : UrlMatcherFactory , root : ( ) => StateObject ) =>
58
- function urlBuilder ( state : StateObject ) {
59
- const stateDec : StateDeclaration = < any > state ;
60
+ function urlBuilder ( stateObject : StateObject ) {
61
+ const state : StateDeclaration = stateObject . self ;
60
62
61
63
// For future states, i.e., states whose name ends with `.**`,
62
64
// match anything that starts with the url prefix
63
- if ( stateDec && stateDec . url && stateDec . name && stateDec . name . match ( / \. \* \* $ / ) ) {
64
- stateDec . url += '{remainder:any}' ; // match any path (.*)
65
+ if ( state && state . url && state . name && state . name . match ( / \. \* \* $ / ) ) {
66
+ state . url += '{remainder:any}' ; // match any path (.*)
65
67
}
66
68
67
- const parsed = parseUrl ( stateDec . url ) ,
68
- parent = state . parent ;
69
- const url = ! parsed
70
- ? stateDec . url
71
- : $urlMatcherFactoryProvider . compile ( parsed . val , {
72
- params : state . params || { } ,
73
- paramMap : function ( paramConfig : any , isSearch : boolean ) {
74
- if ( stateDec . reloadOnSearch === false && isSearch )
75
- paramConfig = extend ( paramConfig || { } , { dynamic : true } ) ;
76
- return paramConfig ;
77
- } ,
78
- } ) ;
69
+ const parent = stateObject . parent ;
70
+ const parsed = parseUrl ( state . url ) ;
71
+ const url = ! parsed ? state . url : $urlMatcherFactoryProvider . compile ( parsed . val , { state } ) ;
79
72
80
73
if ( ! url ) return null ;
81
- if ( ! $urlMatcherFactoryProvider . isMatcher ( url ) ) throw new Error ( `Invalid url '${ url } ' in state '${ state } '` ) ;
74
+ if ( ! $urlMatcherFactoryProvider . isMatcher ( url ) ) throw new Error ( `Invalid url '${ url } ' in state '${ stateObject } '` ) ;
82
75
return parsed && parsed . root ? url : ( ( parent && parent . navigable ) || root ( ) ) . url . append ( < UrlMatcher > url ) ;
83
76
} ;
84
77
@@ -89,7 +82,7 @@ const getNavigableBuilder = (isRoot: (state: StateObject) => boolean) =>
89
82
90
83
const getParamsBuilder = ( paramFactory : ParamFactory ) =>
91
84
function paramsBuilder ( state : StateObject ) : { [ key : string ] : Param } {
92
- const makeConfigParam = ( config : any , id : string ) => paramFactory . fromConfig ( id , null , config ) ;
85
+ const makeConfigParam = ( config : ParamDeclaration , id : string ) => paramFactory . fromConfig ( id , null , state . self ) ;
93
86
const urlParams : Param [ ] = ( state . url && state . url . parameters ( { inherit : false } ) ) || [ ] ;
94
87
const nonUrlParams : Param [ ] = values ( mapObj ( omit ( state . params || { } , urlParams . map ( prop ( 'id' ) ) ) , makeConfigParam ) ) ;
95
88
return urlParams
@@ -189,7 +182,7 @@ export function resolvablesBuilder(state: StateObject): Resolvable[] {
189
182
/** extracts the token from a Provider or provide literal */
190
183
const getToken = ( p : any ) => p . provide || p . token ;
191
184
192
- /** Given a literal resolve or provider object, returns a Resolvable */
185
+ // prettier-ignore: Given a literal resolve or provider object, returns a Resolvable
193
186
const literal2Resolvable = pattern ( [
194
187
[ prop ( 'resolveFn' ) , p => new Resolvable ( getToken ( p ) , p . resolveFn , p . deps , p . policy ) ] ,
195
188
[ prop ( 'useFactory' ) , p => new Resolvable ( getToken ( p ) , p . useFactory , p . deps || p . dependencies , p . policy ) ] ,
@@ -198,29 +191,20 @@ export function resolvablesBuilder(state: StateObject): Resolvable[] {
198
191
[ prop ( 'useExisting' ) , p => new Resolvable ( getToken ( p ) , identity , [ p . useExisting ] , p . policy ) ] ,
199
192
] ) ;
200
193
194
+ // prettier-ignore
201
195
const tuple2Resolvable = pattern ( [
202
- [ pipe ( prop ( 'val' ) , isString ) , ( tuple : Tuple ) => new Resolvable ( tuple . token , identity , [ tuple . val ] , tuple . policy ) ] ,
203
- [
204
- pipe ( prop ( 'val' ) , isArray ) ,
205
- ( tuple : Tuple ) => new Resolvable ( tuple . token , tail ( < any [ ] > tuple . val ) , tuple . val . slice ( 0 , - 1 ) , tuple . policy ) ,
206
- ] ,
207
- [
208
- pipe ( prop ( 'val' ) , isFunction ) ,
209
- ( tuple : Tuple ) => new Resolvable ( tuple . token , tuple . val , annotate ( tuple . val ) , tuple . policy ) ,
210
- ] ,
196
+ [ pipe ( prop ( 'val' ) , isString ) , ( tuple : Tuple ) => new Resolvable ( tuple . token , identity , [ tuple . val ] , tuple . policy ) ] ,
197
+ [ pipe ( prop ( 'val' ) , isArray ) , ( tuple : Tuple ) => new Resolvable ( tuple . token , tail ( < any [ ] > tuple . val ) , tuple . val . slice ( 0 , - 1 ) , tuple . policy ) ] ,
198
+ [ pipe ( prop ( 'val' ) , isFunction ) , ( tuple : Tuple ) => new Resolvable ( tuple . token , tuple . val , annotate ( tuple . val ) , tuple . policy ) ] ,
211
199
] ) ;
212
200
201
+ // prettier-ignore
213
202
const item2Resolvable = < ( obj : any ) => Resolvable > pattern ( [
214
203
[ is ( Resolvable ) , ( r : Resolvable ) => r ] ,
215
204
[ isResolveLiteral , literal2Resolvable ] ,
216
205
[ isLikeNg2Provider , literal2Resolvable ] ,
217
206
[ isTupleFromObj , tuple2Resolvable ] ,
218
- [
219
- val ( true ) ,
220
- ( obj : any ) => {
221
- throw new Error ( 'Invalid resolve value: ' + stringify ( obj ) ) ;
222
- } ,
223
- ] ,
207
+ [ val ( true ) , ( obj : any ) => { throw new Error ( 'Invalid resolve value: ' + stringify ( obj ) ) ; } , ] ,
224
208
] ) ;
225
209
226
210
// If resolveBlock is already an array, use it as-is.
0 commit comments