@@ -11,7 +11,7 @@ var randomBytes = require('randombytes');
11
11
// Generate an internal UID to make the regexp pattern harder to guess.
12
12
var UID_LENGTH = 16 ;
13
13
var UID = generateUID ( ) ;
14
- var PLACE_HOLDER_REGEXP = new RegExp ( '(\\\\)?"@__(F|R|D|M|S|U|I|B)-' + UID + '-(\\d+)__@"' , 'g' ) ;
14
+ var PLACE_HOLDER_REGEXP = new RegExp ( '(\\\\)?"@__(F|R|D|M|S|A| U|I|B)-' + UID + '-(\\d+)__@"' , 'g' ) ;
15
15
16
16
var IS_NATIVE_CODE_REGEXP = / \{ \s * \[ n a t i v e c o d e \] \s * \} / g;
17
17
var IS_PURE_FUNCTION = / f u n c t i o n .* ?\( / ;
@@ -68,6 +68,7 @@ module.exports = function serialize(obj, options) {
68
68
var dates = [ ] ;
69
69
var maps = [ ] ;
70
70
var sets = [ ] ;
71
+ var arrays = [ ] ;
71
72
var undefs = [ ] ;
72
73
var infinities = [ ] ;
73
74
var bigInts = [ ] ;
@@ -106,6 +107,13 @@ module.exports = function serialize(obj, options) {
106
107
if ( origValue instanceof Set ) {
107
108
return '@__S-' + UID + '-' + ( sets . push ( origValue ) - 1 ) + '__@' ;
108
109
}
110
+
111
+ if ( origValue instanceof Array ) {
112
+ var isSparse = origValue . filter ( function ( ) { return true } ) . length !== origValue . length ;
113
+ if ( isSparse ) {
114
+ return '@__A-' + UID + '-' + ( arrays . push ( origValue ) - 1 ) + '__@' ;
115
+ }
116
+ }
109
117
}
110
118
111
119
if ( type === 'function' ) {
@@ -197,7 +205,7 @@ module.exports = function serialize(obj, options) {
197
205
str = str . replace ( UNSAFE_CHARS_REGEXP , escapeUnsafeChars ) ;
198
206
}
199
207
200
- if ( functions . length === 0 && regexps . length === 0 && dates . length === 0 && maps . length === 0 && sets . length === 0 && undefs . length === 0 && infinities . length === 0 && bigInts . length === 0 ) {
208
+ if ( functions . length === 0 && regexps . length === 0 && dates . length === 0 && maps . length === 0 && sets . length === 0 && arrays . length === 0 && undefs . length === 0 && infinities . length === 0 && bigInts . length === 0 ) {
201
209
return str ;
202
210
}
203
211
@@ -228,6 +236,10 @@ module.exports = function serialize(obj, options) {
228
236
return "new Set(" + serialize ( Array . from ( sets [ valueIndex ] . values ( ) ) , options ) + ")" ;
229
237
}
230
238
239
+ if ( type === 'A' ) {
240
+ return "Array.prototype.slice.call(" + serialize ( Object . assign ( { length : arrays [ valueIndex ] . length } , arrays [ valueIndex ] ) , options ) + ")" ;
241
+ }
242
+
231
243
if ( type === 'U' ) {
232
244
return 'undefined'
233
245
}
0 commit comments