@@ -102,6 +102,39 @@ module.exports = function valiate(data, layout) {
102
102
}
103
103
104
104
crawl ( traceIn , traceOut , traceSchema , errorList , base ) ;
105
+
106
+ var transformsIn = traceIn . transforms ,
107
+ transformsOut = traceOut . transforms ;
108
+
109
+ if ( transformsIn ) {
110
+ if ( ! isArray ( transformsIn ) ) {
111
+ errorList . push ( format ( 'array' , base , [ 'transforms' ] ) ) ;
112
+ }
113
+
114
+ base . push ( 'transforms' ) ;
115
+
116
+ for ( var j = 0 ; j < transformsIn . length ; j ++ ) {
117
+ var path = [ 'transforms' , j ] ,
118
+ transformType = transformsIn [ j ] . type ;
119
+
120
+ if ( ! isPlainObject ( transformsIn [ j ] ) ) {
121
+ errorList . push ( format ( 'object' , base , path ) ) ;
122
+ continue ;
123
+ }
124
+
125
+ var transformSchema = schema . transforms [ transformType ] ?
126
+ schema . transforms [ transformType ] . attributes :
127
+ { } ;
128
+
129
+ // add 'type' to transform schema to validate the transform type
130
+ transformSchema . type = {
131
+ valType : 'enumerated' ,
132
+ values : Object . keys ( schema . transforms )
133
+ } ;
134
+
135
+ crawl ( transformsIn [ j ] , transformsOut [ j ] , transformSchema , errorList , base , path ) ;
136
+ }
137
+ }
105
138
}
106
139
107
140
var layoutOut = gd . _fullLayout ,
@@ -121,6 +154,9 @@ function crawl(objIn, objOut, schema, list, base, path) {
121
154
for ( var i = 0 ; i < keys . length ; i ++ ) {
122
155
var k = keys [ i ] ;
123
156
157
+ // transforms are handled separately
158
+ if ( k === 'transforms' ) continue ;
159
+
124
160
var p = path . slice ( ) ;
125
161
p . push ( k ) ;
126
162
@@ -184,7 +220,7 @@ var code2msgFunc = {
184
220
var prefix ;
185
221
186
222
if ( base === 'layout' && astr === '' ) prefix = 'The layout argument' ;
187
- else if ( base [ 0 ] === 'data' ) {
223
+ else if ( base [ 0 ] === 'data' && astr === '' ) {
188
224
prefix = 'Trace ' + base [ 1 ] + ' in the data argument' ;
189
225
}
190
226
else prefix = inBase ( base ) + 'key ' + astr ;
0 commit comments