8000 Enhanced object literals support (#39) · dgtlmonk/serialize-javascript@734e8c7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 734e8c7

Browse files
kwolfyokuryu
authored andcommitted
Enhanced object literals support (yahoo#39)
1 parent 24b2b4b commit 734e8c7

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

index.js

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ var UID = Math.floor(Math.random() * 0x10000000000).toString(16)
1111
var PLACE_HOLDER_REGEXP = new RegExp('"@__(F|R|D)-' + UID + '-(\\d+)__@"', 'g');
1212

1313
var IS_NATIVE_CODE_REGEXP = /\{\s*\[native code\]\s*\}/g;
14+
var IS_PURE_FUNCTION = /function.*?\(/;
1415
var 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.
1821
var 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
}

test/unit/serialize.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,22 @@ describe('serialize( obj )', function () {
109109
try { serialize(Number); } catch (e) { err = e; }
110110
expect(err).to.be.an.instanceOf(TypeError);
111111
});
112+
113+
it('should serialize enhanced literal objects', function () {
114+
var obj = {
115+
foo() { return true; },
116+
*bar() { return true; }
117+
};
118+
119+
expect(serialize(obj)).to.equal('{"foo":function() { return true; },"bar":function*() { return true; }}');
120+
});
121+
122+
it('should deserialize enhanced literal objects', function () {
123+
var obj;
124+
eval('obj = ' + serialize({ hello() { return true; } }));
125+
126+
expect(obj.hello()).to.equal(true);
127+
});
112128
});
113129

114130
describe('regexps', function () {

0 commit comments

Comments
 (0)
0