@tangle-js/ld-proofs
Version:
Linked Data Proofs on the Tangle. Powered by IOTA Identity & IOTA Streams
73 lines • 4.97 kB
JavaScript
/* eslint-disable jsdoc/require-jsdoc */
// es-lint-disable unicorn/no-array-for-each
export class JsonCanonicalization {
/**
* Calculates the canonical serialization of a JSON document.
*
* @param input The input.
* @returns The serialization as a string.
*/
static calculate(input) {
let buffer = "";
serialize(input);
return buffer;
/**
* Serializes in canonical format.
*
* @param object The object to be serialized.
*/
function serialize(object) {
if (object === null || typeof object !== "object") {
// ///////////////////////////////////////////////
// Primitive data type - Use ES6/JSON //
// ///////////////////////////////////////////////
buffer += JSON.stringify(object);
}
else if (Array.isArray(object)) {
// ///////////////////////////////////////////////
// Array - Maintain element order //
// ///////////////////////////////////////////////
buffer += "[";
let next = false;
// eslint-disable-next-line unicorn/no-array-for-each
object.forEach(element => {
if (next) {
buffer += ",";
}
next = true;
// ///////////////////////////////////////
// Array element - Recursive expansion //
// ///////////////////////////////////////
serialize(element);
});
buffer += "]";
}
else {
// ///////////////////////////////////////////////
// Object - Sort properties before serializing //
// ///////////////////////////////////////////////
buffer += "{";
let next = false;
Object.keys(object).sort()
// eslint-disable-next-line unicorn/no-array-for-each
.forEach(property => {
if (next) {
buffer += ",";
}
next = true;
// /////////////////////////////////////////////
// Property names are strings - Use ES6/JSON //
// /////////////////////////////////////////////
buffer += JSON.stringify(property);
buffer += ":";
// ////////////////////////////////////////
// Property value - Recursive expansion //
// ////////////////////////////////////////
serialize(object[property]);
});
buffer += "}";
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkNhbm9uaWNhbGl6YXRpb24ubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hlbHBlcnMvanNvbkNhbm9uaWNhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBRXhDLDRDQUE0QztBQUM1QyxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFjO1FBQ2xDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakIsT0FBTyxNQUFNLENBQUM7UUFFZDs7OztXQUlHO1FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBTTtZQUNyQixJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO2dCQUMvQyxrREFBa0Q7Z0JBQ2xELGlEQUFpRDtnQkFDakQsa0RBQWtEO2dCQUNsRCxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNwQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlCLGtEQUFrRDtnQkFDbEQsaURBQWlEO2dCQUNqRCxrREFBa0Q7Z0JBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUNqQixxREFBcUQ7Z0JBQ3JELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3JCLElBQUksSUFBSSxFQUFFO3dCQUNOLE1BQU0sSUFBSSxHQUFHLENBQUM7cUJBQ2pCO29CQUNELElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ1osMENBQTBDO29CQUMxQyx5Q0FBeUM7b0JBQ3pDLDBDQUEwQztvQkFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNILGtEQUFrRDtnQkFDbEQsaURBQWlEO2dCQUNqRCxrREFBa0Q7Z0JBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQWlCLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3JDLHFEQUFxRDtxQkFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNoQixJQUFJLElBQUksRUFBRTt3QkFDTixNQUFNLElBQUksR0FBRyxDQUFDO3FCQUNqQjtvQkFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUNaLGdEQUFnRDtvQkFDaEQsK0NBQStDO29CQUMvQyxnREFBZ0Q7b0JBQ2hELE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNuQyxNQUFNLElBQUksR0FBRyxDQUFDO29CQUNkLDJDQUEyQztvQkFDM0MsMENBQTBDO29CQUMxQywyQ0FBMkM7b0JBQzNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsQ0FBQzthQUNqQjtRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0oifQ==