1 | const _ = require('lodash');
|
2 |
|
3 | function omit(node, fields) {
|
4 | if (Array.isArray(node)) {
|
5 | return node.map(child => omit(child, fields));
|
6 | } else if (typeof node === 'object' && node !== null) {
|
7 | return Object.keys(node).reduce((acc, k) => {
|
8 | if (!fields.hasOwnProperty(k)) {
|
9 | acc[k] = omit(node[k], fields);
|
10 | }
|
11 | return acc;
|
12 | }, {});
|
13 | }
|
14 | return node;
|
15 | }
|
16 |
|
17 | function setTo(dst, src) {
|
18 | const keysPendingDelete = new Set(Object.keys(dst));
|
19 | Object.keys(src).forEach(key => {
|
20 | dst[key] = src[key];
|
21 | keysPendingDelete.delete(key);
|
22 | });
|
23 | keysPendingDelete.forEach(key => {
|
24 | delete dst[key];
|
25 | });
|
26 | return dst;
|
27 | }
|
28 |
|
29 | function collectAllNodes(node, predicate, output) {
|
30 | output = output || [];
|
31 | if (_.isObjectLike(node)) {
|
32 | if (predicate(node)) {
|
33 | output.push(node);
|
34 | }
|
35 | _.forEach(node, child => collectAllNodes(child, predicate, output));
|
36 | }
|
37 | return output;
|
38 | }
|
39 |
|
40 | module.exports = {omit, collectAllNodes, setTo};
|