22
33var Ajv = require ( 'ajv' )
44var merge = require ( 'deepmerge' )
5+ var util = require ( 'util' )
56var validate = require ( './schema-validator' )
67
78var uglify = null
@@ -310,7 +311,7 @@ function addPatternProperties (schema, externalSchema, fullSchema) {
310311 }
311312 var type = pp [ regex ] . type
312313 code += `
313- if (/${ regex } /.test(keys[i])) {
314+ if (/${ regex . replace ( / \\ * \/ / g , '\\/' ) } /.test(keys[i])) {
314315 `
315316 if ( type === 'object' ) {
316317 code += buildObject ( pp [ regex ] , '' , 'buildObjectPP' + index , externalSchema , fullSchema )
@@ -505,13 +506,27 @@ function refFinder (ref, schema, externalSchema) {
505506 return dereferenced
506507 } else {
507508 for ( var i = 1 ; i < walk . length ; i ++ ) {
508- code += `['${ walk [ i ] } ']`
509+ code += `['${ sanitizeKey ( walk [ i ] ) } ']`
509510 }
510511 }
511512 }
512513 return ( new Function ( 'schema' , code ) ) ( schema )
513514}
514515
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+
515530function buildCode ( schema , code , laterCode , name , externalSchema , fullSchema ) {
516531 Object . keys ( schema . properties || { } ) . forEach ( ( key , i , a ) => {
517532 if ( schema . properties [ key ] [ '$ref' ] ) {
@@ -523,49 +538,51 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
523538
524539 var type = schema . properties [ key ] . type
525540 var nullable = schema . properties [ key ] . nullable
541+ var sanitized = sanitizeKey ( key )
542+ var asString = sanitizeKey ( $asString ( key ) . replace ( / \\ / g, '\\\\' ) )
526543
527544 if ( nullable ) {
528545 code += `
529- if (obj['${ key } '] === null) {
546+ if (obj['${ sanitized } '] === null) {
530547 ${ addComma }
531- json += '${ $ asString( key ) } :null'
548+ json += '${ asString } :null'
532549 var rendered = true
533550 } else {
534551 `
535552 }
536553
537554 if ( type === 'number' ) {
538555 code += `
539- var t = Number(obj['${ key } '])
556+ var t = Number(obj['${ sanitized } '])
540557 if (!isNaN(t)) {
541558 ${ addComma }
542- json += '${ $ asString( key ) } :' + t
559+ json += '${ asString } :' + t
543560 `
544561 } else if ( type === 'integer' ) {
545562 code += `
546563 var rendered = false
547564 `
548565 if ( isLong ) {
549566 code += `
550- if (isLong(obj['${ key } '])) {
567+ if (isLong(obj['${ sanitized } '])) {
551568 ${ addComma }
552- json += '${ $ asString( key ) } :' + obj['${ key } '].toString()
569+ json += '${ asString } :' + obj['${ sanitized } '].toString()
553570 rendered = true
554571 } else {
555- var t = Number(obj['${ key } '])
572+ var t = Number(obj['${ sanitized } '])
556573 if (!isNaN(t)) {
557574 ${ addComma }
558- json += '${ $ asString( key ) } :' + t
575+ json += '${ asString } :' + t
559576 rendered = true
560577 }
561578 }
562579 `
563580 } else {
564581 code += `
565- var t = Number(obj['${ key } '])
582+ var t = Number(obj['${ sanitized } '])
566583 if (!isNaN(t)) {
567584 ${ addComma }
568- json += '${ $ asString( key ) } :' + t
585+ json += '${ asString } :' + t
569586 rendered = true
570587 }
571588 `
@@ -575,9 +592,9 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
575592 `
576593 } else {
577594 code += `
578- if (obj['${ key } '] !== undefined) {
595+ if (obj['${ sanitized } '] !== undefined) {
579596 ${ addComma }
580- json += '${ $ asString( key ) } :'
597+ json += '${ asString } :'
581598 `
582599
583600 var result = nested ( laterCode , name , key , schema . properties [ key ] , externalSchema , fullSchema )
@@ -590,12 +607,12 @@ function buildCode (schema, code, laterCode, name, externalSchema, fullSchema) {
590607 code += `
591608 } else {
592609 ${ addComma }
593- json += '${ $ asString( key ) } :${ JSON . stringify ( defaultValue ) . replace ( / ' / g, '\'' ) } '
610+ json += '${ asString } :${ sanitizeKey ( JSON . stringify ( defaultValue ) . replace ( / \\ / g, '\\\\' ) ) } '
594611 `
595612 } else if ( schema . required && schema . required . indexOf ( key ) !== - 1 ) {
596613 code += `
597614 } else {
598- throw new Error('${ key } is required!')
615+ throw new Error('${ sanitized } is required!')
599616 `
600617 }
601618
@@ -658,7 +675,7 @@ function addIfThenElse (schema, name, externalSchema, fullSchema) {
658675 var merged = merge ( copy , then )
659676
660677 code += `
661- valid = ajv.validate(${ require ( ' util' ) . inspect ( i , { depth : null } ) } , obj)
678+ valid = ajv.validate(${ util . inspect ( i , { depth : null } ) } , obj)
662679 if (valid) {
663680 `
664681 if ( merged . if && merged . then ) {
@@ -856,6 +873,8 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema, subKe
856873 var code = ''
857874 var funcName
858875
876+ subKey = subKey || ''
877+
859878 if ( schema . type === undefined ) {
860879 var inferedType = inferTypeByKeyword ( schema )
861880 if ( inferedType ) {
@@ -866,7 +885,7 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema, subKe
866885 var type = schema . type
867886 var nullable = schema . nullable === true
868887
869- var accessor = key . indexOf ( '[' ) === 0 ? key : `['${ key } ']`
888+ var accessor = key . indexOf ( '[' ) === 0 ? sanitizeKey ( key ) : `['${ sanitizeKey ( key ) } ']`
870889 switch ( type ) {
871890 case 'null' :
872891 code += `
@@ -902,7 +921,7 @@ function nested (laterCode, name, key, schema, externalSchema, fullSchema, subKe
902921 case undefined :
903922 if ( 'anyOf' in schema ) {
904923 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 )
906925 code += `
907926 ${ index === 0 ? 'if' : 'else if' } (ajv.validate(${ require ( 'util' ) . inspect ( s , { depth : null } ) } , obj${ accessor } ))
908927 ${ nestedResult . code }
0 commit comments