@@ -11,8 +11,11 @@ var UID = Math.floor(Math.random() * 0x10000000000).toString(16)
1111var PLACE_HOLDER_REGEXP = new RegExp ( '"@__(F|R|D)-' + UID + '-(\\d+)__@"' , 'g' ) ;
1212
1313var 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 .* ?\( / ;
1415var UNSAFE_CHARS_REGEXP = / [ < > \/ \u2028 \u2029 ] / g;
1516
17+ var RESERVED_SYMBOLS = [ '*' , 'async' ] ;
18+
1619// Mapping of unsafe HTML and invalid JavaScript line terminator chars to their
1720// Unicode char counterparts which are safe to use in JavaScript strings.
1821var ESCAPED_CHARS = {
@@ -68,6 +71,32 @@ module.exports = function serialize(obj, options) {
6871 return value ;
6972 }
7073
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+
71100 var str ;
72101
73102 // Creates a JSON string representation of the value.
@@ -108,12 +137,7 @@ module.exports = function serialize(obj, options) {
108137 }
109138
110139 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- }
116140
117- return serializedFn ;
141+ return serializeFunc ( fn ) ;
118142 } ) ;
119143}
0 commit comments