UNPKG

json-joy

Version:

Collection of libraries for building collaborative editing apps.

61 lines (60 loc) 2.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.hash = exports.updateJson = exports.updateStr = exports.updateNum = exports.CONST = void 0; const insertion_1 = require("@jsonjoy.com/util/lib/sort/insertion"); var CONST; (function (CONST) { CONST[CONST["START_STATE"] = 5381] = "START_STATE"; CONST[CONST["NULL"] = 982452847] = "NULL"; CONST[CONST["TRUE"] = 982453247] = "TRUE"; CONST[CONST["FALSE"] = 982454243] = "FALSE"; CONST[CONST["ARRAY"] = 982452259] = "ARRAY"; CONST[CONST["STRING"] = 982453601] = "STRING"; CONST[CONST["OBJECT"] = 982454533] = "OBJECT"; })(CONST || (exports.CONST = CONST = {})); const updateNum = (state, num) => { return (state << 5) + state + num; }; exports.updateNum = updateNum; const updateStr = (state, str) => { let i = str.length; while (i) state = (state << 5) + state + str.charCodeAt(--i); return state; }; exports.updateStr = updateStr; const updateJson = (state, json) => { switch (typeof json) { case 'number': return (0, exports.updateNum)(state, json); case 'string': state = (0, exports.updateNum)(state, CONST.STRING); return (0, exports.updateStr)(state, json); case 'object': { if (json === null) return (0, exports.updateNum)(state, CONST.NULL); if (json instanceof Array) { const length = json.length; state = (0, exports.updateNum)(state, CONST.ARRAY); for (let i = 0; i < length; i++) state = (0, exports.updateJson)(state, json[i]); return state; } state = (0, exports.updateNum)(state, CONST.OBJECT); const keys = (0, insertion_1.sort)(Object.keys(json)); const length = keys.length; for (let i = 0; i < length; i++) { const key = keys[i]; state = (0, exports.updateStr)(state, key); state = (0, exports.updateJson)(state, json[key]); } return state; } case 'boolean': return (0, exports.updateNum)(state, json ? CONST.TRUE : CONST.FALSE); } return state; }; exports.updateJson = updateJson; const hash = (json) => (0, exports.updateJson)(CONST.START_STATE, json) >>> 0; exports.hash = hash;