UNPKG

json-canonicalize

Version:
101 lines 3.86 kB
export function canonicalizeEx(obj, options) { var buffer = ''; var vInclude = options && options.include; var vExclude = options && options.exclude; if (vExclude) { if (typeof vExclude === 'string') vExclude = [vExclude]; } if (vInclude) vInclude.sort(); var visited = new WeakMap(); var allowCircular = options && (options === null || options === void 0 ? void 0 : options.allowCircular); serialize(obj); return buffer; function serialize(object, parent) { 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; ///////////////////////////////////////// // Array element - Recursive expansion // ///////////////////////////////////////// serialize(element, object); }); 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 += '{'; if (!parent && vInclude) { vInclude.forEach(function (property, index) { if (!object.hasOwnProperty(property)) return; addProp(object, property, index); }); } else { var vKeys = Object.keys(object).sort(); vKeys.forEach(function (property, index) { return addProp(object, property, index); }); } buffer += '}'; } } function addProp(object, property, index) { if (vExclude && vExclude.length) { for (var _i = 0, vExclude_1 = vExclude; _i < vExclude_1.length; _i++) { var v = vExclude_1[_i]; if (v === property) return; } } if (index > 0) { buffer += ','; } /////////////////////////////////////////////// // Property names are strings - Use ES6/JSON // /////////////////////////////////////////////// buffer += JSON.stringify(property); buffer += ':'; ////////////////////////////////////////// // Property value - Recursive expansion // ////////////////////////////////////////// serialize(object[property], object); } } //# sourceMappingURL=canonicalize-ex.js.map