11'use strict'
22
33var Ajv = require ( 'ajv' )
4+ var merge = require ( 'deepmerge' )
45
56var uglify = null
67var isLong
@@ -86,7 +87,7 @@ function build (schema, options) {
8687
8788 var dependencies = [ ]
8889 var dependenciesName = [ ]
89- if ( hasAnyOf ( schema ) || hasArrayOfTypes ( schema ) ) {
90+ if ( hasAnyOf ( schema ) || hasArrayOfTypes ( schema ) || hasIf ( schema ) ) {
9091 dependencies . push ( new Ajv ( ) )
9192 dependenciesName . push ( 'ajv' )
9293 }
@@ -143,6 +144,11 @@ function hasArrayOfTypes (schema) {
143144 return false
144145}
145146
147+ function hasIf ( schema ) {
148+ const str = JSON . stringify ( schema )
149+ return / " i f " : { / . test ( str ) && / " t h e n " : { / . test ( str )
150+ }
151+
146152function $asNull ( ) {
147153 return 'null'
148154}
@@ -475,21 +481,15 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
475481 return { code : code , laterCode : laterCode }
476482}
477483
478- function buildObject ( schema , code , name , externalSchema , fullSchema ) {
479- code += `
480- function ${ name } (obj) {
481- var json = '{'
482- var addComma = false
483- `
484-
484+ function buildInnerObject ( schema , name , externalSchema , fullSchema ) {
485+ var laterCode = ''
486+ var code = ''
485487 if ( schema . patternProperties ) {
486488 code += addPatternProperties ( schema , externalSchema , fullSchema )
487489 } else if ( schema . additionalProperties && ! schema . patternProperties ) {
488490 code += addAdditionalProperties ( schema , externalSchema , fullSchema )
489491 }
490492
491- var laterCode = ''
492-
493493 if ( schema . allOf ) {
494494 schema . allOf . forEach ( ( ss ) => {
495495 var builtCode = buildCode ( ss , code , laterCode , name , externalSchema , fullSchema )
@@ -504,6 +504,60 @@ function buildObject (schema, code, name, externalSchema, fullSchema) {
504504 laterCode = builtCode . laterCode
505505 }
506506
507+ return { code : code , laterCode : laterCode }
508+ }
509+
510+ function buildObject ( schema , code , name , externalSchema , fullSchema ) {
511+ code += `
512+ function ${ name } (obj) {
513+ var json = '{'
514+ var addComma = false
515+ `
516+
517+ var laterCode = ''
518+ var r , merged
519+ if ( schema . if && schema . then ) {
520+ merged = merge ( schema , schema . then )
521+ delete merged . if
522+ delete merged . then
523+ delete merged . else
524+
525+ code += `
526+ var valid = ajv.validate(${ require ( 'util' ) . inspect ( schema . if , { depth : null } ) } , obj)
527+ if (valid) {
528+ `
529+
530+ r = buildInnerObject ( merged , name , externalSchema , fullSchema )
531+ code += r . code
532+ laterCode = r . laterCode
533+
534+ code += `
535+ }
536+ `
537+ if ( schema . else ) {
538+ merged = merge ( schema , schema . else )
539+ delete merged . if
540+ delete merged . then
541+ delete merged . else
542+
543+ code += `
544+ else {
545+ `
546+
547+ r = buildInnerObject ( merged , name , externalSchema , fullSchema )
548+ code += r . code
549+ laterCode = r . laterCode
550+
551+ code += `
552+ }
553+ `
554+ }
555+ } else {
556+ r = buildInnerObject ( schema , name , externalSchema , fullSchema )
557+ code += r . code
558+ laterCode = r . laterCode
559+ }
560+
507561 // Removes the comma if is the last element of the string (in case there are not properties)
508562 code += `
509563 json += '}'
0 commit comments