@@ -8,7 +8,7 @@ See the accompanying LICENSE file for terms.
8
8
9
9
// Generate an internal UID to make the regexp pattern harder to guess.
10
10
var UID = Math . floor ( Math . random ( ) * 0x10000000000 ) . toString ( 16 ) ;
11
- var PLACE_HOLDER_REGEXP = new RegExp ( '"@__(F|R|D|M|S)-' + UID + '-(\\d+)__@"' , 'g' ) ;
11
+ var PLACE_HOLDER_REGEXP = new RegExp ( '"@__(F|R|D|M|S|U )-' + UID + '-(\\d+)__@"' , 'g' ) ;
12
12
13
13
var IS_NATIVE_CODE_REGEXP = / \{ \s * \[ n a t i v e c o d e \] \s * \} / g;
14
14
var IS_PURE_FUNCTION = / f u n c t i o n .* ?\( / ;
@@ -44,11 +44,13 @@ module.exports = function serialize(obj, options) {
44
44
var dates = [ ] ;
45
45
var maps = [ ] ;
46
46
var sets = [ ] ;
47
+ var undefs = [ ] ;
47
48
48
49
// Returns placeholders for functions and regexps (identified by index)
49
50
// which are later replaced by their string representation.
50
51
function replacer ( key , value ) {
51
- if ( ! value ) {
52
+
53
+ if ( ! value && value !== undefined ) {
52
54
return value ;
53
55
}
54
56
@@ -79,6 +81,10 @@ module.exports = function serialize(obj, options) {
79
81
return '@__F-' + UID + '-' + ( functions . push ( origValue ) - 1 ) + '__@' ;
80
82
}
81
83
84
+ if ( type === 'undefined' ) {
85
+ return '@__U-' + UID + '-' + ( undefs . push ( origValue ) - 1 ) + '__@' ;
86
+ }
87
+
82
88
return value ;
83
89
}
84
90
@@ -119,6 +125,12 @@ module.exports = function serialize(obj, options) {
119
125
return serializedFn ;
120
126
}
121
127
128
+ // Protects against `JSON.stringify()` returning `undefined`, by serializing
129
+ // to the literal string: "undefined".
130
+ if ( obj === undefined ) {
131
+ return String ( obj ) ;
132
+ }
133
+
122
134
var str ;
123
135
124
136
// Creates a JSON string representation of the value.
@@ -142,7 +154,7 @@ module.exports = function serialize(obj, options) {
142
154
str = str . replace ( UNSAFE_CHARS_REGEXP , escapeUnsafeChars ) ;
143
155
}
144
156
145
- if ( functions . length === 0 && regexps . length === 0 && dates . length === 0 && maps . length === 0 && sets . length === 0 ) {
157
+ if ( functions . length === 0 && regexps . length === 0 && dates . length === 0 && maps . length === 0 && sets . length === 0 && undefs . length === 0 ) {
146
158
return str ;
147
159
}
148
160
@@ -166,6 +178,10 @@ module.exports = function serialize(obj, options) {
166
178
return "new Set(" + serialize ( Array . from ( sets [ valueIndex ] . values ( ) ) , options ) + ")" ;
167
179
}
168
180
181
+ if ( type === 'U' ) {
182
+ return 'undefined'
183
+ }
184
+
169
185
var fn = functions [ valueIndex ] ;
170
186
171
187
return serializeFunc ( fn ) ;
0 commit comments