@@ -11,8 +11,11 @@ var UID = Math.floor(Math.random() * 0x10000000000).toString(16)
11
11
var PLACE_HOLDER_REGEXP = new RegExp ( '"@__(F|R|D)-' + 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
+ var IS_PURE_FUNCTION = / f u n c t i o n .* ?\( / ;
14
15
var UNSAFE_CHARS_REGEXP = / [ < > \/ \u2028 \u2029 ] / g;
15
16
17
+ var RESERVED_SYMBOLS = [ '*' , 'async' ] ;
18
+
16
19
// Mapping of unsafe HTML and invalid JavaScript line terminator chars to their
17
20
// Unicode char counterparts which are safe to use in JavaScript strings.
18
21
var ESCAPED_CHARS = {
@@ -68,6 +71,32 @@ module.exports = function serialize(obj, options) {
68
71
return value ;
69
72
}
70
73
74
+ function serializeFunc ( fn ) {
75
+ var serializedFn = fn . toString ( ) ;
76
+ if ( IS_NATIVE_CODE_REGEXP . test ( serializedFn ) ) {
77
+ throw new TypeError ( 'Serializing native function: ' + fn . name ) ;
78
+ }
79
+
80
+ // pure functions, example: {key: function() {}}
81
+ if ( IS_PURE_FUNCTION . test ( serializedFn ) ) {
82
+ return serializedFn ;
83
+ }
84
+
85
+ var argsStartsAt = serializedFn . indexOf ( '(' ) ;
86
+ var def = serializedFn . substr ( 0 , argsStartsAt ) . trim ( ) . split ( ' ' ) . filter ( val => val . length > 0 ) ;
87
+ var nonReservedSymbols = def . filter ( val => RESERVED_SYMBOLS . indexOf ( val ) === - 1 ) ;
88
+
89
+ // enhanced literal objects, example: {key() {}}
90
+ if ( nonReservedSymbols . length > 0 ) {
91
+ return ( def . indexOf ( 'async' ) > - 1 ? 'async ' : '' ) + 'function'
92
+ + ( def . join ( '' ) . indexOf ( '*' ) > - 1 ? '*' : '' )
93
+ + serializedFn . substr ( argsStartsAt ) ;
94
+ }
95
+
96
+ // arrow functions
97
+ return serializedFn ;
98
+ }
99
+
71
100
var str ;
72
101
73
102
// Creates a JSON string representation of the value.
@@ -108,12 +137,7 @@ module.exports = function serialize(obj, options) {
108
137
}
109
138
110
139
var fn = functions [ valueIndex ] ;
111
- var serializedFn = fn . toString ( ) ;
112
-
113
- if ( IS_NATIVE_CODE_REGEXP . test ( serializedFn ) ) {
114
- throw new TypeError ( 'Serializing native function: ' + fn . name ) ;
115
- }
116
140
117
- return serializedFn ;
141
+ return serializeFunc ( fn ) ;
118
142
} ) ;
119
143
}
0 commit comments