Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,9 @@ Available also for **[Go](./golang/README.md)**.

- - -

## Announcement 📣
## ℹ️ JSON only values

There is a standard approach to recursion and more data-types than what JSON allows, and it's part of the [Structured Clone polyfill](https://github.com/ungap/structured-clone/#readme).

Beside acting as a polyfill, its `@ungap/structured-clone/json` export provides both `stringify` and `parse`, and it's been tested for being faster than *flatted*, but its produced output is also smaller than *flatted* in general.

The *@ungap/structured-clone* module is, in short, a drop in replacement for *flatted*, but it's not compatible with *flatted* specialized syntax.

However, if recursion, as well as more data-types, are what you are after, or interesting for your projects/use cases, consider switching to this new module whenever you can 👍
If you need anything more complex than values JSON understands, there is a standard approach to recursion and more data-types than what JSON allows, and it's part of the [Structured Clone polyfill](https://github.com/ungap/structured-clone/#readme).

- - -

Expand Down
31 changes: 19 additions & 12 deletions cjs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ const Primitives = (_, value) => (
typeof value === primitive ? new Primitive(value) : value
);

const revive = (input, parsed, output, $) => {
const lazy = [];
const resolver = (input, lazy, parsed, $) => output => {
for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) {
const k = ke[y];
const value = output[k];
Expand All @@ -32,18 +31,14 @@ const revive = (input, parsed, output, $) => {
if (typeof tmp === object && !parsed.has(tmp)) {
parsed.add(tmp);
output[k] = ignore;
lazy.push({k, a: [input, parsed, tmp, $]});
lazy.push({ o: output, k, r: tmp });
}
else
output[k] = $.call(output, k, tmp);
}
else if (output[k] !== ignore)
output[k] = $.call(output, k, value);
}
for (let {length} = lazy, i = 0; i < length; i++) {
const {k, a} = lazy[i];
output[k] = $.call(output, k, revive.apply(null, a));
}
return output;
};

Expand All @@ -61,12 +56,24 @@ const set = (known, input, value) => {
*/
const parse = (text, reviver) => {
const input = $parse(text, Primitives).map(primitives);
const value = input[0];
const $ = reviver || noop;
const tmp = typeof value === object && value ?
revive(input, new Set, value, $) :
value;
return $.call({'': tmp}, '', tmp);

let value = input[0];

if (typeof value === object && value) {
const lazy = [];
const revive = resolver(input, lazy, new Set, $);
value = revive(value);

let i = 0;
while (i < lazy.length) {
// it could be a lazy.shift() but that's costly
const {o, k, r} = lazy[i++];
o[k] = $.call(o, k, revive(r));
}
}

return $.call({'': value}, '', value);
};
exports.parse = parse;

Expand Down
2 changes: 1 addition & 1 deletion es.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion esm.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 19 additions & 12 deletions esm/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ const Primitives = (_, value) => (
typeof value === primitive ? new Primitive(value) : value
);

const revive = (input, parsed, output, $) => {
const lazy = [];
const resolver = (input, lazy, parsed, $) => output => {
for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) {
const k = ke[y];
const value = output[k];
Expand All @@ -31,18 +30,14 @@ const revive = (input, parsed, output, $) => {
if (typeof tmp === object && !parsed.has(tmp)) {
parsed.add(tmp);
output[k] = ignore;
lazy.push({k, a: [input, parsed, tmp, $]});
lazy.push({ o: output, k, r: tmp });
}
else
output[k] = $.call(output, k, tmp);
}
else if (output[k] !== ignore)
output[k] = $.call(output, k, value);
}
for (let {length} = lazy, i = 0; i < length; i++) {
const {k, a} = lazy[i];
output[k] = $.call(output, k, revive.apply(null, a));
}
return output;
};

Expand All @@ -60,12 +55,24 @@ const set = (known, input, value) => {
*/
export const parse = (text, reviver) => {
const input = $parse(text, Primitives).map(primitives);
const value = input[0];
const $ = reviver || noop;
const tmp = typeof value === object && value ?
revive(input, new Set, value, $) :
value;
return $.call({'': tmp}, '', tmp);

let value = input[0];

if (typeof value === object && value) {
const lazy = [];
const revive = resolver(input, lazy, new Set, $);
value = revive(value);

let i = 0;
while (i < lazy.length) {
// it could be a lazy.shift() but that's costly
const {o, k, r} = lazy[i++];
o[k] = $.call(o, k, revive(r));
}
}

return $.call({'': value}, '', value);
};

/**
Expand Down
65 changes: 37 additions & 28 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,30 +32,26 @@ self.Flatted = (function (exports) {
var Primitives = function Primitives(_, value) {
return _typeof(value) === primitive ? new Primitive(value) : value;
};
var _revive = function revive(input, parsed, output, $) {
var lazy = [];
for (var ke = keys(output), length = ke.length, y = 0; y < length; y++) {
var k = ke[y];
var value = output[k];
if (value instanceof Primitive) {
var tmp = input[value];
if (_typeof(tmp) === object && !parsed.has(tmp)) {
parsed.add(tmp);
output[k] = ignore;
lazy.push({
k: k,
a: [input, parsed, tmp, $]
});
} else output[k] = $.call(output, k, tmp);
} else if (output[k] !== ignore) output[k] = $.call(output, k, value);
}
for (var _length = lazy.length, i = 0; i < _length; i++) {
var _lazy$i = lazy[i],
_k = _lazy$i.k,
a = _lazy$i.a;
output[_k] = $.call(output, _k, _revive.apply(null, a));
}
return output;
var resolver = function resolver(input, lazy, parsed, $) {
return function (output) {
for (var ke = keys(output), length = ke.length, y = 0; y < length; y++) {
var k = ke[y];
var value = output[k];
if (value instanceof Primitive) {
var tmp = input[value];
if (_typeof(tmp) === object && !parsed.has(tmp)) {
parsed.add(tmp);
output[k] = ignore;
lazy.push({
o: output,
k: k,
r: tmp
});
} else output[k] = $.call(output, k, tmp);
} else if (output[k] !== ignore) output[k] = $.call(output, k, value);
}
return output;
};
};
var set = function set(known, input, value) {
var index = Primitive(input.push(value) - 1);
Expand All @@ -71,12 +67,25 @@ self.Flatted = (function (exports) {
*/
var parse = function parse(text, reviver) {
var input = $parse(text, Primitives).map(primitives);
var value = input[0];
var $ = reviver || noop;
var tmp = _typeof(value) === object && value ? _revive(input, new Set(), value, $) : value;
var value = input[0];
if (_typeof(value) === object && value) {
var lazy = [];
var revive = resolver(input, lazy, new Set(), $);
value = revive(value);
var i = 0;
while (i < lazy.length) {
// it could be a lazy.shift() but that's costly
var _lazy$i = lazy[i++],
o = _lazy$i.o,
k = _lazy$i.k,
r = _lazy$i.r;
o[k] = $.call(o, k, revive(r));
}
}
return $.call({
'': tmp
}, '', tmp);
'': value
}, '', value);
};

/**
Expand Down
2 changes: 1 addition & 1 deletion min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading