@pirireis/react-carto-map-gl
Version:
81 lines (67 loc) • 1.73 kB
JavaScript
import {isEqual, cloneDeep} from 'lodash-es';
import objectFromEntries from './objectFromEntries';
const vizForbiddenFields = [
'classifierUID',
'inlineMaker',
'_shaderBindings',
'notify',
'parent',
];
const variablesForbiddenFields = [
'classifierUID',
'inlineMaker',
'_metadata',
'_variableName',
'type',
'_shaderBindings',
'notify',
'parent',
'_input',
'_value',
'childrenNames',
'preface',
'_originalInput',
'_paused',
'progress',
];
const metadataForbiddenFields = ['categories', 'codec'];
function decycleAndClear(
obj,
// eslint-disable-next-line no-use-before-define
forbiddenFields = vizForbiddenFields,
stack = [],
) {
if (!obj || typeof obj !== 'object') return obj;
if (stack.includes(obj)) return null;
const s = stack.concat([obj]);
return Array.isArray(obj)
? obj.map(x => decycleAndClear(x, forbiddenFields, s))
: objectFromEntries(
Object.entries(obj)
.map(([k, v]) => {
if (forbiddenFields.includes(k)) return null;
// Maybe unnecessary. Better safe than sorry.
if (typeof v === 'function') return null;
return [k, decycleAndClear(v, forbiddenFields, s)];
})
.filter(i => i),
);
}
export function isVizEqual(a, b) {
return isEqual(
decycleAndClear(cloneDeep(a), vizForbiddenFields),
decycleAndClear(cloneDeep(b), vizForbiddenFields),
);
}
export function isVizVariablesEqual(a, b) {
return isEqual(
decycleAndClear(cloneDeep(a), variablesForbiddenFields),
decycleAndClear(cloneDeep(b), variablesForbiddenFields),
);
}
export function isSourcemetadataEqual(a, b) {
return isEqual(
decycleAndClear(cloneDeep(a), metadataForbiddenFields),
decycleAndClear(cloneDeep(b), metadataForbiddenFields),
);
}