2
2
3
3
var Ajv = require ( 'ajv' )
4
4
var merge = require ( 'deepmerge' )
5
+ var util = require ( 'util' )
5
6
var validate = require ( './schema-validator' )
6
7
7
8
var uglify = null
@@ -310,7 +311,7 @@ function addPatternProperties (schema, externalSchema, fullSchema) {
310
311
}
311
312
var type = pp [ regex ] . type
312
313
code += `
313
- if (/${ regex } /.test(keys[i])) {
314
+ if (/${ regex . replace ( / \\ * \/ / g , '\\/' ) } /.test(keys[i])) {
314
315
`
315
316
if ( type === 'object' ) {
316
317
code += buildObject ( pp [ regex ] , '' , 'buildObjectPP' + index , externalSchema , fullSchema )
@@ -505,13 +506,27 @@ function refFinder (ref, schema, externalSchema) {
505
506
return dereferenced
506
507
} else {
507
508
for ( var i = 1 ; i < walk . length ; i ++ ) {
508
- code += `['${ walk [ i ] } ']`
509
+ code += `['${ sanitizeKey ( walk [ i ] ) } ']`
509
510
}
510
511
}
511
512
}
512
513
return ( new Function ( 'schema' , code ) ) ( schema )
513
514
}
514
515
516
+ function sanitizeKey ( key ) {
517
+ const rep = key . replace ( / ( \\ * ) ' / g, function ( match , p1 ) {
518
+ var base = ''
519
+ if ( p1 . length % 2 === 1 ) {
520
+ base = p1 . slice ( 2 )
521
+ } else {
522
+ base = p1
523
+ }
524
+ var rep = base + '\\\''
525
+ return rep
526
+ } )
527
+ return rep
528
+ }
529
+
515
530
function buildCode ( schema , code , laterCode , name , externalSchema , fullSchema ) {
516
531
Object . keys ( schema . properties || { } ) . forEach ( ( key , i , a ) => {
517
532
if ( schema . properties [ key ] [ '$ref' ] ) {
@@ -523,49 +538,51 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
523
538
524
539
var type = schema . properties [ key ] . type
525
540
var nullable = schema . properties [ key ] . nullable
541
+ var sanitized = sanitizeKey ( key )
542
+ var asString = sanitizeKey ( $asString ( key ) . replace ( / \\ / g, '\\\\' ) )
526
543
527
544
if ( nullable ) {
528
545
code += `
529
- if (obj['${ key } '] === null) {
546
+ if (obj['${ sanitized } '] === null) {
530
547
${ addComma }
531
- json += '${ $ asString( key ) } :null'
548
+ json += '${ asString } :null'
532
549
var rendered = true
533
550
} else {
534
551
`
535
552
}
536
553
537
554
if ( type === 'number' ) {
538
555
code += `
539
- var t = Number(obj['${ key } '])
556
+ var t = Number(obj['${ sanitized } '])
540
557
if (!isNaN(t)) {
541
558
${ addComma }
542
- json += '${ $ asString( key ) } :' + t
559
+ json += '${ asString } :' + t
543
560
`
544
561
} else if ( type === 'integer' ) {
545
562
code += `
546
563
var rendered = false
547
564
`
548
565
if ( isLong ) {
549
566
code += `
550
- if (isLong(obj['${ key } '])) {
567
+ if (isLong(obj['${ sanitized } '])) {
551
568
${ addComma }
552
- json += '${ $ asString( key ) } :' + obj['${ key } '].toString()
569
+ json += '${ asString } :' + obj['${ sanitized } '].toString()
553
570
rendered = true
554
571
} else {
555
- var t = Number(obj['${ key } '])
572
+ var t = Number(obj['${ sanitized } '])
556
573
if (!isNaN(t)) {
557
574
${ addComma }
558
- json += '${ $ asString( key ) } :' + t
575
+ json += '${ asString } :' + t
559
576
rendered = true
560
577
}
561
578
}
562
579
`
563
580
} else {
564
581
code += `
565
- var t = Number(obj['${ key } '])
582
+ var t = Number(obj['${ sanitized } '])
566
583
if (!isNaN(t)) {
567
584
${ addComma }
568
- json += '${ $ asString( key ) } :' + t
585
+ json += '${ asString } :' + t
569
586
rendered = true
570
587
}
571
588
`
@@ -575,9 +592,9 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
575
592
`
576
593
} else {
577
594
code += `
578
- if (obj['${ key } '] !== undefined) {
595
+ if (obj['${ sanitized } '] !== undefined) {
579
596
${ addComma }
580
- json += '${ $ asString( key ) } :'
597
+ json += '${ asString } :'
581
598
`
582
599
583
600
var result = nested ( laterCode , name , key , schema . properties [ key ] , externalSchema , fullSchema )
@@ -590,12 +607,12 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
590
607
code += `
591
608
} else {
592
609
${ addComma }
593
- json += '${ $ asString( key ) } :${ JSON . stringify ( defaultValue ) . replace ( / ' / g, '\'' ) } '
610
+ json += '${ asString } :${ sanitizeKey ( JSON . stringify ( defaultValue ) . replace ( / \\ / g, '\\\\' ) ) } '
594
611
`
595
612
} else if ( schema . required && schema . required . indexOf ( key ) !== - 1 ) {
596
613
code += `
597
614
} else {
598
- throw new Error('${ key } is required!')
615
+ throw new Error('${ sanitized } is required!')
599
616
`
600
617
}
601
618
@@ -658,7 +675,7 @@ function addIfThenElse (schema, name, externalSchema, fullSchema) {
658
675
var merged = merge ( copy , then )
659
676
660
677
code += `
661
- valid = ajv.validate(${ require ( ' util' ) . inspect ( i , { depth : null } ) } , obj)
678
+ valid = ajv.validate(${ util . inspect ( i , { depth : null } ) } , obj)
662
679
if (valid) {
663
680
`
664
681
if ( merged . if && merged . then ) {
@@ -856,6 +873,8 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema, subKe
856
873
var code = ''
857
874
var funcName
858
875
876
+ subKey = subKey || ''
877
+
859
878
if ( schema . type === undefined ) {
860
879
var inferedType = inferTypeByKeyword ( schema )
861
880
if ( inferedType ) {
@@ -866,7 +885,7 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema, subKe
866
885
var type = schema . type
867
886
var nullable = schema . nullable === true
868
887
869
- var accessor = key . indexOf ( '[' ) === 0 ? key : `['${ key } ']`
888
+ var accessor = key . indexOf ( '[' ) === 0 ? sanitizeKey ( key ) : `['${ sanitizeKey ( key ) } ']`
870
889
switch ( type ) {
871
890
case 'null' :
872
891
code += `
@@ -902,7 +921,7 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema, subKe
902
921
case undefined :
903
922
if ( 'anyOf' in schema ) {
904
923
schema . anyOf . forEach ( ( s , index ) => {
905
- var nestedResult = nested ( laterCode , name , key , s , externalSchema , fullSchema , subKey !== undefined ? subKey : 'i' + index )
924
+ var nestedResult = nested ( laterCode , name , key , s , externalSchema , fullSchema , subKey !== '' ? subKey : 'i' + index )
906
925
code += `
907
926
${ index === 0 ? 'if' : 'else if' } (ajv.validate(${ require ( 'util' ) . inspect ( s , { depth : null } ) } , obj${ accessor } ))
908
927
${ nestedResult . code }
0 commit comments