@@ -25,7 +25,7 @@ function build (schema, options) {
25
25
switch ( schema . type ) {
26
26
case 'object' :
27
27
main = '$main'
28
- code = buildObject ( schema , code , main , options . schema )
28
+ code = buildObject ( schema , code , main , options . schema , schema )
29
29
break
30
30
case 'string' :
31
31
main = $asString . name
@@ -42,7 +42,7 @@ function build (schema, options) {
42
42
break
43
43
case 'array' :
44
44
main = '$main'
45
- code = buildArray ( schema , code , main , options . schema )
45
+ code = buildArray ( schema , code , main , options . schema , schema )
46
46
break
47
47
default :
48
48
throw new Error ( `${ schema . type } unsupported` )
@@ -72,7 +72,7 @@ function $asNumber (i) {
72
72
}
73
73
74
74
function $asBoolean ( bool ) {
75
- return bool && 'true' || 'false'
75
+ return bool && 'true' || 'false' // eslint-disable-line
76
76
}
77
77
78
78
function $asString ( str ) {
@@ -116,7 +116,7 @@ function $asStringSmall (str) {
116
116
return point < 32 ? JSON . stringify ( str ) : '"' + result + '"'
117
117
}
118
118
119
- function addPatternProperties ( schema , externalSchema ) {
119
+ function addPatternProperties ( schema , externalSchema , fullSchema ) {
120
120
var pp = schema . patternProperties
121
121
let code = `
122
122
var keys = Object.keys(obj)
@@ -125,19 +125,19 @@ function addPatternProperties (schema, externalSchema) {
125
125
`
126
126
Object . keys ( pp ) . forEach ( ( regex , index ) => {
127
127
if ( pp [ regex ] [ '$ref' ] ) {
128
- pp [ regex ] = refFinder ( pp [ regex ] [ '$ref' ] , schema , externalSchema )
128
+ pp [ regex ] = refFinder ( pp [ regex ] [ '$ref' ] , fullSchema , externalSchema , fullSchema )
129
129
}
130
130
var type = pp [ regex ] . type
131
131
code += `
132
132
if (/${ regex } /.test(keys[i])) {
133
133
`
134
134
if ( type === 'object' ) {
135
- code += buildObject ( pp [ regex ] , '' , 'buildObjectPP' + index , externalSchema )
135
+ code += buildObject ( pp [ regex ] , '' , 'buildObjectPP' + index , externalSchema , fullSchema )
136
136
code += `
137
137
json += $asString(keys[i]) + ':' + buildObjectPP${ index } (obj[keys[i]]) + ','
138
138
`
139
139
} else if ( type === 'array' ) {
140
- code += buildArray ( pp [ regex ] , '' , 'buildArrayPP' + index , externalSchema )
140
+ code += buildArray ( pp [ regex ] , '' , 'buildArrayPP' + index , externalSchema , fullSchema )
141
141
code += `
142
142
json += $asString(keys[i]) + ':' + buildArrayPP${ index } (obj[keys[i]]) + ','
143
143
`
@@ -169,7 +169,7 @@ function addPatternProperties (schema, externalSchema) {
169
169
`
170
170
} )
171
171
if ( schema . additionalProperties ) {
172
- code += additionalProperty ( schema , externalSchema )
172
+ code += additionalProperty ( schema , externalSchema , fullSchema )
173
173
}
174
174
175
175
code += `
@@ -178,7 +178,7 @@ function addPatternProperties (schema, externalSchema) {
178
178
return code
179
179
}
180
180
181
- function additionalProperty ( schema , externalSchema ) {
181
+ function additionalProperty ( schema , externalSchema , fullSchema ) {
182
182
var ap = schema . additionalProperties
183
183
let code = ''
184
184
if ( ap === true ) {
@@ -187,7 +187,7 @@ function additionalProperty (schema, externalSchema) {
187
187
`
188
188
}
189
189
if ( ap [ '$ref' ] ) {
190
- ap = refFinder ( ap [ '$ref' ] , schema , externalSchema )
190
+ ap = refFinder ( ap [ '$ref' ] , fullSchema , externalSchema )
191
191
}
192
192
193
193
let type = ap . type
@@ -197,7 +197,7 @@ function additionalProperty (schema, externalSchema) {
197
197
json += $asString(keys[i]) + ':' + buildObjectAP(obj[keys[i]]) + ','
198
198
`
199
199
} else if ( type === 'array' ) {
200
- code += buildArray ( ap , '' , 'buildArrayAP' , externalSchema )
200
+ code += buildArray ( ap , '' , 'buildArrayAP' , externalSchema , fullSchema )
201
201
code += `
202
202
json += $asString(keys[i]) + ':' + buildArrayAP(obj[keys[i]]) + ','
203
203
`
@@ -225,12 +225,12 @@ function additionalProperty (schema, externalSchema) {
225
225
return code
226
226
}
227
227
228
- function addAdditionalProperties ( schema , externalSchema ) {
228
+ function addAdditionalProperties ( schema , externalSchema , fullSchema ) {
229
229
return `
230
230
var keys = Object.keys(obj)
231
231
for (var i = 0; i < keys.length; i++) {
232
232
if (properties[keys[i]]) continue
233
- ${ additionalProperty ( schema , externalSchema ) }
233
+ ${ additionalProperty ( schema , externalSchema , fullSchema ) }
234
234
}
235
235
`
236
236
}
@@ -250,16 +250,16 @@ function refFinder (ref, schema, externalSchema) {
250
250
return ( new Function ( 'schema' , code ) ) ( schema )
251
251
}
252
252
253
- function buildObject ( schema , code , name , externalSchema ) {
253
+ function buildObject ( schema , code , name , externalSchema , fullSchema ) {
254
254
code += `
255
255
function ${ name } (obj) {
256
256
var json = '{'
257
257
`
258
258
259
259
if ( schema . patternProperties ) {
260
- code += addPatternProperties ( schema , externalSchema )
260
+ code += addPatternProperties ( schema , externalSchema , fullSchema )
261
261
} else if ( schema . additionalProperties && ! schema . patternProperties ) {
262
- code += addAdditionalProperties ( schema , externalSchema )
262
+ code += addAdditionalProperties ( schema , externalSchema , fullSchema )
263
263
}
264
264
265
265
var laterCode = ''
@@ -273,10 +273,10 @@ function buildObject (schema, code, name, externalSchema) {
273
273
`
274
274
275
275
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 )
277
277
}
278
278
279
- const result = nested ( laterCode , name , '.' + key , schema . properties [ key ] , externalSchema )
279
+ const result = nested ( laterCode , name , '.' + key , schema . properties [ key ] , externalSchema , fullSchema )
280
280
281
281
code += result . code
282
282
laterCode = result . laterCode
@@ -312,15 +312,19 @@ function buildObject (schema, code, name, externalSchema) {
312
312
return code
313
313
}
314
314
315
- function buildArray ( schema , code , name , externalSchema ) {
315
+ function buildArray ( schema , code , name , externalSchema , fullSchema ) {
316
316
code += `
317
317
function ${ name } (obj) {
318
318
var json = '['
319
319
`
320
320
321
321
var laterCode = ''
322
322
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 )
324
328
325
329
code += `
326
330
const l = obj.length
@@ -346,7 +350,7 @@ function buildArray (schema, code, name, externalSchema) {
346
350
return code
347
351
}
348
352
349
- function nested ( laterCode , name , key , schema , externalSchema ) {
353
+ function nested ( laterCode , name , key , schema , externalSchema , fullSchema ) {
350
354
var code = ''
351
355
var funcName
352
356
const type = schema . type
@@ -374,14 +378,14 @@ function nested (laterCode, name, key, schema, externalSchema) {
374
378
break
375
379
case 'object' :
376
380
funcName = ( name + key ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
377
- laterCode = buildObject ( schema , laterCode , funcName , externalSchema )
381
+ laterCode = buildObject ( schema , laterCode , funcName , externalSchema , fullSchema )
378
382
code += `
379
383
json += ${ funcName } (obj${ key } )
380
384
`
381
385
break
382
386
case 'array' :
383
387
funcName = ( name + key ) . replace ( / [ - . \[ \] ] / g, '' ) // eslint-disable-line
384
- laterCode = buildArray ( schema , laterCode , funcName , externalSchema )
388
+ laterCode = buildArray ( schema , laterCode , funcName , externalSchema , fullSchema )
385
389
code += `
386
390
json += ${ funcName } (obj${ key } )
387
391
`
0 commit comments