@@ -402,7 +402,49 @@ function buildArray (schema, code, name, externalSchema, fullSchema) {
402402 schema . items = refFinder ( schema . items [ '$ref' ] , fullSchema , externalSchema )
403403 }
404404
405- var result = nested ( laterCode , name , '[i]' , schema . items , externalSchema , fullSchema )
405+ var result = { code : '' , laterCode : '' }
406+ if ( Array . isArray ( schema . items ) ) {
407+ result = schema . items . reduce ( ( res , item , i ) => {
408+ var accessor = '[i]'
409+ const tmpRes = nested ( laterCode , name , accessor , item , externalSchema , fullSchema , i )
410+ var condition
411+ switch ( item . type ) {
412+ case 'null' :
413+ condition = `obj${ accessor } === null`
414+ break
415+ case 'string' :
416+ condition = `typeof obj${ accessor } === 'string'`
417+ break
418+ case 'integer' :
419+ condition = `Number.isInteger(obj${ accessor } )`
420+ break
421+ case 'number' :
422+ condition = `!Number.isInteger(obj${ accessor } ) && Number.isFinite(obj${ accessor } )`
423+ break
424+ case 'boolean' :
425+ condition = `typeof obj${ accessor } === 'boolean'`
426+ break
427+ case 'object' :
428+ condition = `obj${ accessor } && typeof obj${ accessor } === 'object' && obj${ accessor } .constructor === Object`
429+ break
430+ case 'array' :
431+ condition = `Array.isArray(obj${ accessor } )`
432+ break
433+ default :
434+ throw new Error ( `${ item . type } unsupported` )
435+ }
436+ return {
437+ code : `${ res . code }
438+ if (${ condition } ) {
439+ ${ tmpRes . code }
440+ }` ,
441+ laterCode : `${ res . laterCode }
442+ ${ tmpRes . laterCode } `
443+ }
444+ } , result )
445+ } else {
446+ result = nested ( laterCode , name , '[i]' , schema . items , externalSchema , fullSchema )
447+ }
406448
407449 code += `
408450 var l = obj.length
@@ -428,7 +470,7 @@ function buildArray (schema, code, name, externalSchema, fullSchema) {
428470 return code
429471}
430472
431- function nested ( laterCode , name , key , schema , externalSchema , fullSchema ) {
473+ function nested ( laterCode , name , key , schema , externalSchema , fullSchema , subKey ) {
432474 var code = ''
433475 var funcName
434476 var type = schema . type
@@ -460,14 +502,14 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema) {
460502 `
461503 break
462504 case 'object' :
463- funcName = ( name + key ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
505+ funcName = ( name + key + subKey ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
464506 laterCode = buildObject ( schema , laterCode , funcName , externalSchema , fullSchema )
465507 code += `
466508 json += ${ funcName } (obj${ accessor } )
467509 `
468510 break
469511 case 'array' :
470- funcName = ( name + key ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
512+ funcName = ( name + key + subKey ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
471513 laterCode = buildArray ( schema , laterCode , funcName , externalSchema , fullSchema )
472514 code += `
473515 json += ${ funcName } (obj${ accessor } )
0 commit comments