@@ -102,6 +102,39 @@ module.exports = function valiate(data, layout) {
102102 }
103103
104104 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+ }
105138 }
106139
107140 var layoutOut = gd . _fullLayout ,
@@ -121,6 +154,9 @@ function crawl(objIn, objOut, schema, list, base, path) {
121154 for ( var i = 0 ; i < keys . length ; i ++ ) {
122155 var k = keys [ i ] ;
123156
157+ // transforms are handled separately
158+ if ( k === 'transforms' ) continue ;
159+
124160 var p = path . slice ( ) ;
125161 p . push ( k ) ;
126162
@@ -184,7 +220,7 @@ var code2msgFunc = {
184220 var prefix ;
185221
186222 if ( base === 'layout' && astr === '' ) prefix = 'The layout argument' ;
187- else if ( base [ 0 ] === 'data' ) {
223+ else if ( base [ 0 ] === 'data' && astr === '' ) {
188224 prefix = 'Trace ' + base [ 1 ] + ' in the data argument' ;
189225 }
190226 else prefix = inBase ( base ) + 'key ' + astr ;
0 commit comments