@@ -179,10 +179,10 @@ const kArrayType = 1;
179
179
const kArrayExtrasType = 2 ;
180
180
181
181
/* eslint-disable no-control-regex */
182
- const strEscapeSequencesRegExp = / [ \x00 - \x1f \x27 \x5c \x7f - \x9f ] / ;
183
- const strEscapeSequencesReplacer = / [ \x00 - \x1f \x27 \x5c \x7f - \x9f ] / g;
184
- const strEscapeSequencesRegExpSingle = / [ \x00 - \x1f \x5c \x7f - \x9f ] / ;
185
- const strEscapeSequencesReplacerSingle = / [ \x00 - \x1f \x5c \x7f - \x9f ] / g;
182
+ const strEscapeSequencesRegExp = / [ \x00 - \x1f \x27 \x5c \x7f - \x9f ] | [ \ud800 - \udbff ] (? ! [ \udc00 - \udfff ] ) | (?< ! [ \ud800 - \udbff ] ) [ \udc00 - \udfff ] / ;
183
+ const strEscapeSequencesReplacer = / [ \x00 - \x1f \x27 \x5c \x7f - \x9f ] | [ \ud800 - \udbff ] (? ! [ \udc00 - \udfff ] ) | (?< ! [ \ud800 - \udbff ] ) [ \udc00 - \udfff ] / g;
184
+ const strEscapeSequencesRegExpSingle = / [ \x00 - \x1f \x5c \x7f - \x9f ] | [ \ud800 - \udbff ] (? ! [ \udc00 - \udfff ] ) | (?< ! [ \ud800 - \udbff ] ) [ \udc00 - \udfff ] / ;
185
+ const strEscapeSequencesReplacerSingle = / [ \x00 - \x1f \x5c \x7f - \x9f ] | [ \ud800 - \udbff ] (? ! [ \udc00 - \udfff ] ) | (?< ! [ \ud800 - \udbff ] ) [ \udc00 - \udfff ] / g;
186
186
/* eslint-enable no-control-regex */
187
187
188
188
const keyStrRegExp = / ^ [ a - z A - Z _ ] [ a - z A - Z _ 0 - 9 ] * $ / ;
@@ -463,7 +463,10 @@ function addQuotes(str, quotes) {
463
463
return `'${ str } '` ;
464
464
}
465
465
466
- const escapeFn = ( str ) => meta [ StringPrototypeCharCodeAt ( str ) ] ;
466
+ function escapeFn ( str ) {
467
+ const charCode = StringPrototypeCharCodeAt ( str ) ;
468
+ return meta . length > charCode ? meta [ charCode ] : `\\u${ charCode . toString ( 16 ) } ` ;
469
+ }
467
470
468
471
// Escape control characters, single quotes and the backslash.
469
472
// This is similar to JSON stringify escaping.
@@ -501,8 +504,7 @@ function strEscape(str) {
501
504
502
505
let result = '' ;
503
506
let last = 0 ;
504
- const lastIndex = str . length ;
505
- for ( let i = 0 ; i < lastIndex ; i ++ ) {
507
+ for ( let i = 0 ; i < str . length ; i ++ ) {
506
508
const point = StringPrototypeCharCodeAt ( str , i ) ;
507
509
if ( point === singleQuote ||
508
510
point === 92 ||
@@ -514,10 +516,20 @@ function strEscape(str) {
514
516
result += `${ StringPrototypeSlice ( str , last , i ) } ${ meta [ point ] } ` ;
515
517
}
516
518
last = i + 1 ;
519
+ } else if ( point >= 0xd800 && point <= 0xdfff ) {
520
+ if ( point <= 0xdbff && i + 1 < str . length ) {
521
+ const point = StringPrototypeCharCodeAt ( str , i + 1 ) ;
522
+ if ( point >= 0xdc00 && point <= 0xdfff ) {
523
+ i ++ ;
524
+ continue ;
525
+ }
526
+ }
527
+ result += `${ StringPrototypeSlice ( str , last , i ) } ${ `\\u${ point . toString ( 16 ) } ` } ` ;
528
+ last = i + 1 ;
517
529
}
518
530
}
519
531
520
- if ( last !== lastIndex ) {
532
+ if ( last !== str . length ) {
521
533
result += StringPrototypeSlice ( str , last ) ;
522
534
}
523
535
return addQuotes ( result , singleQuote ) ;
0 commit comments