@@ -28,31 +28,65 @@ export const Utils = {
28
28
Utils . getHandlerFromString ( app , route )
29
29
30
30
route . config . pre = route . config . pre
31
- . map ( pre => this . getHandlerFromPrerequisite ( app , pre ) )
31
+ . map ( pre => Utils . getHandlerFromPrerequisite ( app , pre ) )
32
32
. filter ( handler => ! ! handler )
33
33
34
34
const routeHandlers = Object . keys ( route ) . filter ( value => - 1 !== Utils . methods . indexOf ( value ) )
35
35
36
- if ( ! routeHandlers . some ( v => Utils . methods . indexOf ( v ) >= 0 ) ) {
36
+ if ( ! routeHandlers . some ( v => Utils . methods . indexOf ( v ) >= 0 || ! ! route [ v ] ) ) {
37
37
app . log . error ( 'spool-router: route ' , path , ' handler [' , routeHandlers . join ( ', ' ) , ']' ,
38
38
'does not correspond to any defined Controller handler' )
39
39
return { }
40
40
}
41
+
42
+ routeHandlers . forEach ( method => {
43
+ if ( route [ method ] ) {
44
+ route [ method ] . config = route [ method ] . config || route . config
45
+ route [ method ] . config . pre = route [ method ] . config . pre || route . config . pre
46
+ route [ method ] . config . pre = route [ method ] . config . pre
47
+ . map ( pre => Utils . getHandlerFromPrerequisite ( app , pre ) )
48
+ . filter ( handler => ! ! handler )
49
+ }
50
+ } )
51
+
41
52
return { path, route }
42
53
} ,
43
54
55
+ /**
56
+ * Expands the search for the prefix to the route or config.* level
57
+ */
58
+ getRouteLevelPrefix ( app : FabrixApp , route ) {
59
+ const configuredPrefix = app . config . get ( route . config . prefix )
60
+ const routePrefix = route . config . prefix
61
+ if ( typeof configuredPrefix !== 'undefined' ) {
62
+ if ( configuredPrefix ) {
63
+ return ( configuredPrefix ) . replace ( / $ \/ / , '' )
64
+ }
65
+ else {
66
+ return
67
+ }
68
+ }
69
+ else {
70
+ return ( routePrefix || '' ) . replace ( / $ \/ / , '' )
71
+ }
72
+ } ,
73
+
74
+ /**
75
+ * Get's the prefix for a path
76
+ */
44
77
getPrefix ( app : FabrixApp , route ) : string {
45
78
if ( ! route || ! ( route instanceof Object ) ) {
46
79
throw new RangeError ( 'Expected a route object' )
47
80
}
48
81
49
82
const hasPrefix = route . config && route . config . hasOwnProperty ( 'prefix' ) && route . config . prefix !== false
50
83
const ignorePrefix = route . config && route . config . hasOwnProperty ( 'prefix' ) && route . config . prefix === false
51
- const routeLevelPrefix = hasPrefix ? app . config . get ( route . config . prefix ) || route . config . prefix . replace ( '$/' , '' ) : null
84
+ const routeLevelPrefix = hasPrefix ? Utils . getRouteLevelPrefix ( app , route ) : null
52
85
const prefix = ( app . config . get ( 'router.prefix' ) || '' ) . replace ( / $ \/ / , '' )
53
86
54
87
return `${ ignorePrefix ? '' : routeLevelPrefix || prefix } `
55
88
} ,
89
+
56
90
/**
57
91
* Build the Path from the Route config
58
92
*/
@@ -67,16 +101,23 @@ export const Utils = {
67
101
return `${ prefix } /${ path } `
68
102
} ,
69
103
104
+ getPolicyFromString ( app : FabrixApp , handler ) {
105
+ return get ( app . policies , handler )
106
+ } ,
107
+
70
108
/**
71
109
* Get handler method from a "hapi/hapi-like" prerequisite object/string
72
110
*/
73
111
getHandlerFromPrerequisite ( app : FabrixApp , pre ) {
74
112
let handler
75
113
if ( pre && typeof pre === 'string' ) {
76
- handler = get ( app . policies , pre )
114
+ handler = Utils . getPolicyFromString ( app , pre )
77
115
}
78
116
else if ( pre && typeof pre . method === 'string' ) {
79
- handler = get ( app . policies , pre . method )
117
+ handler = Utils . getPolicyFromString ( app , pre . method )
118
+ }
119
+ else if ( pre && typeof pre === 'function' ) {
120
+ handler = pre
80
121
}
81
122
82
123
if ( ! handler ) {
@@ -88,6 +129,10 @@ export const Utils = {
88
129
return handler
89
130
} ,
90
131
132
+ getControllerFromString ( app : FabrixApp , handler ) {
133
+ return get ( app . controllers , handler )
134
+ } ,
135
+
91
136
/**
92
137
* Get handler method from a controller.method string path
93
138
*/
@@ -103,7 +148,15 @@ export const Utils = {
103
148
Utils . methods . forEach ( method => {
104
149
if ( route [ method ] ) {
105
150
if ( typeof route [ method ] === 'string' ) {
106
- return route [ method ] = get ( app . controllers , route [ method ] )
151
+ return route [ method ] = { handler : Utils . getControllerFromString ( app , route [ method ] ) }
152
+ }
153
+ else if ( route [ method ] instanceof Object && route [ method ] . hasOwnProperty ( 'handler' ) ) {
154
+ if ( typeof route [ method ] . handler === 'string' ) {
155
+ return route [ method ] . handler = Utils . getControllerFromString ( app , route [ method ] . handler )
156
+ }
157
+ else {
158
+ return route [ method ] . handler
159
+ }
107
160
}
108
161
else {
109
162
return route [ method ]
@@ -112,6 +165,9 @@ export const Utils = {
112
165
} )
113
166
} ,
114
167
168
+ /**
169
+ * Build a route collection
170
+ */
115
171
buildRoutes ( app : FabrixApp , routes , toReturn = { } ) {
116
172
Object . keys ( routes ) . forEach ( r => {
117
173
const { path, route } = Utils . buildRoute ( app , r , routes [ r ] )
@@ -120,6 +176,9 @@ export const Utils = {
120
176
return Utils . sortRoutes ( toReturn , app . config . get ( 'router.sortOrder' ) )
121
177
} ,
122
178
179
+ /**
180
+ * Sort a route collection by object key
181
+ */
123
182
sortRoutes ( routes , order ) {
124
183
const toReturn = { }
125
184
const sorted = Object . keys ( routes ) . sort ( Utils . createSpecificityComparator ( { order : order } ) )
0 commit comments