@@ -25,7 +25,7 @@ function build (schema, options) {
2525 switch ( schema . type ) {
2626 case 'object' :
2727 main = '$main'
28- code = buildObject ( schema , code , main , options . schema )
28+ code = buildObject ( schema , code , main , options . schema , schema )
2929 break
3030 case 'string' :
3131 main = $asString . name
@@ -42,7 +42,7 @@ function build (schema, options) {
4242 break
4343 case 'array' :
4444 main = '$main'
45- code = buildArray ( schema , code , main , options . schema )
45+ code = buildArray ( schema , code , main , options . schema , schema )
4646 break
4747 default :
4848 throw new Error ( `${ schema . type } unsupported` )
@@ -72,7 +72,7 @@ function $asNumber (i) {
7272}
7373
7474function $asBoolean ( bool ) {
75- return bool && 'true' || 'false'
75+ return bool && 'true' || 'false' // eslint-disable-line
7676}
7777
7878function $asString ( str ) {
@@ -116,7 +116,7 @@ function $asStringSmall (str) {
116116 return point < 32 ? JSON . stringify ( str ) : '"' + result + '"'
117117}
118118
119- function addPatternProperties ( schema , externalSchema ) {
119+ function addPatternProperties ( schema , externalSchema , fullSchema ) {
120120 var pp = schema . patternProperties
121121 let code = `
122122 var keys = Object.keys(obj)
@@ -125,19 +125,19 @@ function addPatternProperties (schema, externalSchema) {
125125 `
126126 Object . keys ( pp ) . forEach ( ( regex , index ) => {
127127 if ( pp [ regex ] [ '$ref' ] ) {
128- pp [ regex ] = refFinder ( pp [ regex ] [ '$ref' ] , schema , externalSchema )
128+ pp [ regex ] = refFinder ( pp [ regex ] [ '$ref' ] , fullSchema , externalSchema , fullSchema )
129129 }
130130 var type = pp [ regex ] . type
131131 code += `
132132 if (/${ regex } /.test(keys[i])) {
133133 `
134134 if ( type === 'object' ) {
135- code += buildObject ( pp [ regex ] , '' , 'buildObjectPP' + index , externalSchema )
135+ code += buildObject ( pp [ regex ] , '' , 'buildObjectPP' + index , externalSchema , fullSchema )
136136 code += `
137137 json += $asString(keys[i]) + ':' + buildObjectPP${ index } (obj[keys[i]]) + ','
138138 `
139139 } else if ( type === 'array' ) {
140- code += buildArray ( pp [ regex ] , '' , 'buildArrayPP' + index , externalSchema )
140+ code += buildArray ( pp [ regex ] , '' , 'buildArrayPP' + index , externalSchema , fullSchema )
141141 code += `
142142 json += $asString(keys[i]) + ':' + buildArrayPP${ index } (obj[keys[i]]) + ','
143143 `
@@ -169,7 +169,7 @@ function addPatternProperties (schema, externalSchema) {
169169 `
170170 } )
171171 if ( schema . additionalProperties ) {
172- code += additionalProperty ( schema , externalSchema )
172+ code += additionalProperty ( schema , externalSchema , fullSchema )
173173 }
174174
175175 code += `
@@ -178,7 +178,7 @@ function addPatternProperties (schema, externalSchema) {
178178 return code
179179}
180180
181- function additionalProperty ( schema , externalSchema ) {
181+ function additionalProperty ( schema , externalSchema , fullSchema ) {
182182 var ap = schema . additionalProperties
183183 let code = ''
184184 if ( ap === true ) {
@@ -187,7 +187,7 @@ function additionalProperty (schema, externalSchema) {
187187 `
188188 }
189189 if ( ap [ '$ref' ] ) {
190- ap = refFinder ( ap [ '$ref' ] , schema , externalSchema )
190+ ap = refFinder ( ap [ '$ref' ] , fullSchema , externalSchema )
191191 }
192192
193193 let type = ap . type
@@ -197,7 +197,7 @@ function additionalProperty (schema, externalSchema) {
197197 json += $asString(keys[i]) + ':' + buildObjectAP(obj[keys[i]]) + ','
198198 `
199199 } else if ( type === 'array' ) {
200- code += buildArray ( ap , '' , 'buildArrayAP' , externalSchema )
200+ code += buildArray ( ap , '' , 'buildArrayAP' , externalSchema , fullSchema )
201201 code += `
202202 json += $asString(keys[i]) + ':' + buildArrayAP(obj[keys[i]]) + ','
203203 `
@@ -225,12 +225,12 @@ function additionalProperty (schema, externalSchema) {
225225 return code
226226}
227227
228- function addAdditionalProperties ( schema , externalSchema ) {
228+ function addAdditionalProperties ( schema , externalSchema , fullSchema ) {
229229 return `
230230 var keys = Object.keys(obj)
231231 for (var i = 0; i < keys.length; i++) {
232232 if (properties[keys[i]]) continue
233- ${ additionalProperty ( schema , externalSchema ) }
233+ ${ additionalProperty ( schema , externalSchema , fullSchema ) }
234234 }
235235 `
236236}
@@ -250,16 +250,16 @@ function refFinder (ref, schema, externalSchema) {
250250 return ( new Function ( 'schema' , code ) ) ( schema )
251251}
252252
253- function buildObject ( schema , code , name , externalSchema ) {
253+ function buildObject ( schema , code , name , externalSchema , fullSchema ) {
254254 code += `
255255 function ${ name } (obj) {
256256 var json = '{'
257257 `
258258
259259 if ( schema . patternProperties ) {
260- code += addPatternProperties ( schema , externalSchema )
260+ code += addPatternProperties ( schema , externalSchema , fullSchema )
261261 } else if ( schema . additionalProperties && ! schema . patternProperties ) {
262- code += addAdditionalProperties ( schema , externalSchema )
262+ code += addAdditionalProperties ( schema , externalSchema , fullSchema )
263263 }
264264
265265 var laterCode = ''
@@ -273,10 +273,10 @@ function buildObject (schema, code, name, externalSchema) {
273273 `
274274
275275 if ( schema . properties [ key ] [ '$ref' ] ) {
276- schema . properties [ key ] = refFinder ( schema . properties [ key ] [ '$ref' ] , schema , externalSchema )
276+ schema . properties [ key ] = refFinder ( schema . properties [ key ] [ '$ref' ] , fullSchema , externalSchema )
277277 }
278278
279- const result = nested ( laterCode , name , '.' + key , schema . properties [ key ] , externalSchema )
279+ const result = nested ( laterCode , name , '.' + key , schema . properties [ key ] , externalSchema , fullSchema )
280280
281281 code += result . code
282282 laterCode = result . laterCode
@@ -312,15 +312,19 @@ function buildObject (schema, code, name, externalSchema) {
312312 return code
313313}
314314
315- function buildArray ( schema , code , name , externalSchema ) {
315+ function buildArray ( schema , code , name , externalSchema , fullSchema ) {
316316 code += `
317317 function ${ name } (obj) {
318318 var json = '['
319319 `
320320
321321 var laterCode = ''
322322
323- const result = nested ( laterCode , name , '[i]' , schema . items , externalSchema )
323+ if ( schema . items [ '$ref' ] ) {
324+ schema . items = refFinder ( schema . items [ '$ref' ] , fullSchema , externalSchema )
325+ }
326+
327+ const result = nested ( laterCode , name , '[i]' , schema . items , externalSchema , fullSchema )
324328
325329 code += `
326330 const l = obj.length
@@ -346,7 +350,7 @@ function buildArray (schema, code, name, externalSchema) {
346350 return code
347351}
348352
349- function nested ( laterCode , name , key , schema , externalSchema ) {
353+ function nested ( laterCode , name , key , schema , externalSchema , fullSchema ) {
350354 var code = ''
351355 var funcName
352356 const type = schema . type
@@ -374,14 +378,14 @@ function nested (laterCode, name, key, schema, externalSchema) {
374378 break
375379 case 'object' :
376380 funcName = ( name + key ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
377- laterCode = buildObject ( schema , laterCode , funcName , externalSchema )
381+ laterCode = buildObject ( schema , laterCode , funcName , externalSchema , fullSchema )
378382 code += `
379383 json += ${ funcName } (obj${ key } )
380384 `
381385 break
382386 case 'array' :
383387 funcName = ( name + key ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
384- laterCode = buildArray ( schema , laterCode , funcName , externalSchema )
388+ laterCode = buildArray ( schema , laterCode , funcName , externalSchema , fullSchema )
385389 code += `
386390 json += ${ funcName } (obj${ key } )
387391 `
0 commit comments