UNPKG

json-canonicalize

Version:
79 lines 3.07 kB
export function canonicalize(obj, allowCircular) { var buffer = ''; var visited = new WeakMap(); serialize(obj); return buffer; function serialize(object) { if (object === null || typeof object !== 'object' || object.toJSON != null) { ///////////////////////////////////////////////// // Primitive data type - Use ES6/JSON // ///////////////////////////////////////////////// buffer += JSON.stringify(object); // } else if (object instanceof Date) { // buffer += JSON.stringify(object); } else if (Array.isArray(object)) { ///////////////////////////////////////////////// // Array - Maintain element order // ///////////////////////////////////////////////// if (visited.has(object)) { if (!allowCircular) { throw new Error('Circular reference detected'); } buffer += '"[Circular]"'; return; } visited.set(object, true); buffer += '['; var next_1 = false; object.forEach(function (element) { if (next_1) { buffer += ','; } next_1 = true; if (element === undefined) { element = null; } ///////////////////////////////////////// // Array element - Recursive expansion // ///////////////////////////////////////// serialize(element); }); buffer += ']'; } else { ///////////////////////////////////////////////// // Object - Sort properties before serializing // ///////////////////////////////////////////////// if (visited.has(object)) { if (!allowCircular) { throw new Error('Circular reference detected'); } buffer += '"[Circular]"'; return; } visited.set(object, true); buffer += '{'; var vKeys = Object.keys(object).filter(function (k) { return object[k] !== undefined; }).sort(); vKeys.forEach(function (property, index) { return addProp(object, property, index); }); buffer += '}'; } } function addProp(object, property, index) { if (index > 0) { buffer += ','; } /////////////////////////////////////////////// // Property names are strings - Use ES6/JSON // /////////////////////////////////////////////// buffer += JSON.stringify(property); buffer += ':'; ////////////////////////////////////////// // Property value - Recursive expansion // ////////////////////////////////////////// serialize(object[property]); } } //# sourceMappingURL=canonicalize.js.map