@@ -144,36 +144,53 @@ function eval$delay(params) {
144
144
* @return {Function } Function that returns Script or synchronous/asynchronous value
145
145
*/
146
146
function eval$func ( params ) {
147
- var funcBody = params . $func ;
148
- if ( typeof funcBody == 'string' ) {
149
- if ( Object . keys ( params ) . length > 1 )
150
- throw new Error ( 'reference to function "' + funcBody + '" has other properties' ) ;
151
- if ( ! ( funcBody in this . functions ) )
152
- throw new Error ( 'unknown function "' + funcBody + '"' ) ;
153
- return this . functions [ funcBody ] ;
154
- }
155
-
156
147
var self = this ;
157
- var valid = this . js . validate ( funcBody ) ;
148
+ if ( typeof params . $func == 'string' )
149
+ return funcByName ( params . $func ) ;
150
+
151
+ var valid = this . js . validate ( params . $func ) ;
152
+ var argNames , argValidate ;
158
153
if ( valid ) {
159
154
var pFunc = Promise . resolve ( func ) ;
160
155
if ( params . $name ) this . functions [ params . $name ] = pFunc ;
156
+ if ( params . $args ) {
157
+ argValidate = { } ;
158
+ argNames = params . $args . map ( function ( arg ) {
159
+ if ( typeof arg == 'string' ) return arg ;
160
+ var name = Object . keys ( arg ) [ 0 ] ;
161
+ argValidate [ name ] = self . ajv . compile ( arg [ name ] ) ;
162
+ return name ;
163
+ } ) ;
164
+ }
161
165
return pFunc ;
162
166
}
163
- throw new this . js . ajv . ValidationError ( this . js . validate . errors ) ;
167
+ throw new this . ajv . ValidationError ( this . js . validate . errors ) ;
164
168
165
169
function func ( ) {
166
- var data = params . $args ? prepareArguments ( arguments ) : self . data ;
167
- var script = JSON . parse ( JSON . stringify ( funcBody ) ) ;
170
+ var data = argNames ? prepareArguments ( arguments ) : self . data ;
171
+ var script = JSON . parse ( JSON . stringify ( params . $func ) ) ;
168
172
return self . js . evaluate ( script , data ) ;
169
173
}
170
174
175
+ function funcByName ( name ) {
176
+ if ( Object . keys ( params ) . length > 1 )
177
+ throw new Error ( 'reference to function "' + name + '" has other properties' ) ;
178
+ if ( ! ( name in self . functions ) )
179
+ throw new Error ( 'unknown function "' + name + '"' ) ;
180
+ return self . functions [ name ] ;
181
+ }
182
+
171
183
function prepareArguments ( args ) {
172
184
var data = { } ;
173
185
for ( var i = 0 ; i < args . length ; i ++ ) {
174
186
data [ i ] = args [ i ] ;
175
- var argName = params . $args [ i ] ;
176
- if ( argName ) data [ argName ] = args [ i ] ;
187
+ var argName = argNames [ i ] ;
188
+ if ( argName ) {
189
+ data [ argName ] = args [ i ] ;
190
+ var validate = argValidate [ argName ] ;
191
+ if ( validate && ! validate ( args [ i ] ) )
192
+ throw new self . ajv . ValidationError ( validate . errors ) ;
193
+ }
177
194
}
178
195
return data ;
179
196
}
0 commit comments