@@ -11,7 +11,7 @@ var randomBytes = require('randombytes');
1111// Generate an internal UID to make the regexp pattern harder to guess.
1212var UID_LENGTH = 16 ;
1313var 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' ) ;
1515
1616var IS_NATIVE_CODE_REGEXP = / \{ \s * \[ n a t i v e c o d e \] \s * \} / g;
1717var IS_PURE_FUNCTION = / f u n c t i o n .* ?\( / ;
@@ -68,6 +68,7 @@ module.exports = function serialize(obj, options) {
6868 var dates = [ ] ;
6969 var maps = [ ] ;
7070 var sets = [ ] ;
71+ var arrays = [ ] ;
7172 var undefs = [ ] ;
7273 var infinities = [ ] ;
7374 var bigInts = [ ] ;
@@ -106,6 +107,13 @@ module.exports = function serialize(obj, options) {
106107 if ( origValue instanceof Set ) {
107108 return '@__S-' + UID + '-' + ( sets . push ( origValue ) - 1 ) + '__@' ;
108109 }
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+ }
109117 }
110118
111119 if ( type === 'function' ) {
@@ -197,7 +205,7 @@ module.exports = function serialize(obj, options) {
197205 str = str . replace ( UNSAFE_CHARS_REGEXP , escapeUnsafeChars ) ;
198206 }
199207
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 ) {
201209 return str ;
202210 }
203211
@@ -228,6 +236,10 @@ module.exports = function serialize(obj, options) {
228236 return "new Set(" + serialize ( Array . from ( sets [ valueIndex ] . values ( ) ) , options ) + ")" ;
229237 }
230238
239+ if ( type === 'A' ) {
240+ return "Array.prototype.slice.call(" + serialize ( Object . assign ( { length : arrays [ valueIndex ] . length } , arrays [ valueIndex ] ) , options ) + ")" ;
241+ }
242+
231243 if ( type === 'U' ) {
232244 return 'undefined'
233245 }
0 commit comments