Skip to content

Commit cf76164

Browse files
committed
better key stringification
1 parent 0c35c0e commit cf76164

File tree

4 files changed

+14
-5
lines changed

4 files changed

+14
-5
lines changed

src/stringify.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
get_type,
55
is_plain_object,
66
is_primitive,
7+
stringify_key,
78
stringify_string
89
} from './utils.js';
910
import {
@@ -154,7 +155,7 @@ export function stringify(value, reducers) {
154155
if (Object.getPrototypeOf(thing) === null) {
155156
str = '["null"';
156157
for (const key in thing) {
157-
keys.push(`.${key}`);
158+
keys.push(stringify_key(key));
158159
str += `,${stringify_string(key)},${flatten(thing[key])}`;
159160
keys.pop();
160161
}
@@ -165,7 +166,7 @@ export function stringify(value, reducers) {
165166
for (const key in thing) {
166167
if (started) str += ',';
167168
started = true;
168-
keys.push(`.${key}`);
169+
keys.push(stringify_key(key));
169170
str += `${stringify_string(key)}:${flatten(thing[key])}`;
170171
keys.pop();
171172
}

src/uneval.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
get_type,
66
is_plain_object,
77
is_primitive,
8+
stringify_key,
89
stringify_string
910
} from './utils.js';
1011

@@ -98,7 +99,7 @@ export function uneval(value, replacer) {
9899
}
99100

100101
for (const key in thing) {
101-
keys.push(`.${key}`);
102+
keys.push(stringify_key(key));
102103
walk(thing[key]);
103104
keys.pop();
104105
}

src/utils.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,10 @@ export function enumerable_symbols(object) {
104104
(symbol) => Object.getOwnPropertyDescriptor(object, symbol).enumerable
105105
);
106106
}
107+
108+
const is_identifier = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;
109+
110+
/** @param {string} key */
111+
export function stringify_key(key) {
112+
return is_identifier.test(key) ? '.' + key : '[' + JSON.stringify(key) + ']';
113+
}

test/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,13 +584,13 @@ for (const fn of [uneval, stringify]) {
584584
class Whatever {}
585585
fn({
586586
foo: {
587-
map: new Map([['key', new Whatever()]])
587+
['string-key']: new Map([['key', new Whatever()]])
588588
}
589589
});
590590
} catch (e) {
591591
assert.equal(e.name, 'DevalueError');
592592
assert.equal(e.message, 'Cannot stringify arbitrary non-POJOs');
593-
assert.equal(e.path, '.foo.map.get("key")');
593+
assert.equal(e.path, '.foo["string-key"].get("key")');
594594
}
595595
});
596596

0 commit comments

Comments
 (0)