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