UNPKG

@tangential/core

Version:

Core types and support code for Tangential

116 lines 14.3 kB
import { ObjectUtil } from '../util/core-util'; export class JsonUtil { static diff(left, right) { const diff = {}; let keys = ObjectUtil.keys(left).concat(ObjectUtil.keys(right)); keys = ObjectUtil.keys(ObjectUtil.toTruthMap(keys)); keys.forEach(key => { const leftVal = left[key]; const rightVal = right[key]; if (!JsonUtil.areEqual(leftVal, rightVal)) { diff[key] = true; } }); return diff; } static areEqual(left, right) { let areEqual; if (left === right) { areEqual = true; } else if (!left || !right) { areEqual = false; } else if (ObjectUtil.isObject(left)) { if (!ObjectUtil.isObject(right)) { areEqual = false; } else { areEqual = ObjectUtil.keys(JsonUtil.diff(left, right)).length === 0; } } return areEqual || false; } static applyJsonToInstance(instance, json) { const model = instance.getModel(); json = json || {}; ObjectUtil.keys(model).forEach((key) => { instance[key] = this.determineValue(json[key], model[key]); }); } static determineValue(jsonValue, defaultValue) { let value = null; if (ObjectUtil.isNullOrDefined(jsonValue)) { value = defaultValue; } else if (ObjectUtil.isObject(jsonValue)) { value = ObjectUtil.assignDeep({}, defaultValue, jsonValue); } else { value = jsonValue; } return value; } static instanceToJson(instance, withHiddenFields) { const model = instance.getModel(); const json = {}; ObjectUtil.keys(model).forEach((key) => { if (withHiddenFields || JsonUtil.isLegalFirebaseKey(key)) { const value = instance[key]; json[key] = value; if (value) { if (ObjectUtil.isFunction(value['toJson'])) { json[key] = value.toJson(withHiddenFields); } else if (ObjectUtil.isObject(value)) { json[key] = JsonUtil.mapToJson(value, withHiddenFields || false); } } } }); return json; } static mapToJson(map, withHiddenFields) { const json = {}; // @ts-ignore Typescript is confused by the return type of ObjectUtil.entries. ObjectUtil.entries(map).forEach((entry) => { let v = entry.value; if (v && v['toJson'] && ObjectUtil.isFunction(v['toJson'])) { v = v.toJson(withHiddenFields); } json[entry.key] = v; }); return json; } static keyedArrayToJsonMap(array, withHiddenFields, keyField = '$key') { const json = {}; array.forEach(entry => { json[entry[keyField]] = entry.toJson(withHiddenFields); }); return json; } /** * @param obj * @returns {T} * @deprecated See FireBlanket.util.removeIllegalKey */ static removeIllegalFirebaseKeys(obj) { const cleanObj = {}; Object.keys(obj).forEach((key) => { const v = obj[key]; if (JsonUtil.isLegalFirebaseKey(v)) { cleanObj[key] = v; } }); return cleanObj; } /** * @param key * @returns {boolean} * @deprecated See FireBlanket.util.isLegalFirebaseKey */ static isLegalFirebaseKey(key) { return key !== null && key !== undefined && !key.startsWith('$'); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9jb3JlL3NyYy9saWIvbGFuZy9qc29uLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLFVBQVUsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBZXRELE1BQU0sT0FBTyxRQUFRO0lBRW5CLE1BQU0sQ0FBQyxJQUFJLENBQUksSUFBTyxFQUFFLEtBQVE7UUFDOUIsTUFBTSxJQUFJLEdBQU0sRUFBRSxDQUFBO1FBQ2xCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQU0sS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUN6RSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLE9BQU8sR0FBSSxJQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbEMsTUFBTSxRQUFRLEdBQUksS0FBYSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDeEMsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTthQUMxQjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBR08sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFRLEVBQUUsS0FBUztRQUN6QyxJQUFJLFFBQVEsQ0FBQTtRQUNaLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUNsQixRQUFRLEdBQUcsSUFBSSxDQUFBO1NBQ2hCO2FBQU0sSUFBSSxD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QkFDNUMsUUFBUSxDQUFDLEdBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBVztRQUNuQyxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEUsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXBFbnRyeSwgT2JqZWN0VXRpbH0gZnJvbSAnLi4vdXRpbC9jb3JlLXV0aWwnXG5pbXBvcnQge09iak1hcH0gZnJvbSAnLi9vYmotbWFwJ1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9Kc29uPFQ+IHtcbiAgdG9Kc29uKHdpdGhIaWRkZW5GaWVsZHM/OiBib29sZWFuKTogVFxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbmlmaWVkPFQsIEogZXh0ZW5kcyBPYmpNYXA8YW55Pj4gZXh0ZW5kcyBUb0pzb248Sj4ge1xuICBnZXRNb2RlbCgpOiBKXG5cblxufVxuXG5leHBvcnQgY2xhc3MgSnNvblV0aWwge1xuXG4gIHN0YXRpYyBkaWZmPFQ+KGxlZnQ6IFQsIHJpZ2h0OiBUKTogVCB7XG4gICAgY29uc3QgZGlmZiA9IDxUPnt9XG4gICAgbGV0IGtleXMgPSBPYmplY3RVdGlsLmtleXMoPGFueT5sZWZ0KS5jb25jYXQoT2JqZWN0VXRpbC5rZXlzKDxhbnk+cmlnaHQpKVxuICAgIGtleXMgPSBPYmplY3RVdGlsLmtleXMoT2JqZWN0VXRpbC50b1RydXRoTWFwKGtleXMpKVxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgbGVmdFZhbCA9IChsZWZ0IGFzIGFueSlba2V5XVxuICAgICAgY29uc3QgcmlnaHRWYWwgPSAocmlnaHQgYXMgYW55KVtrZXldXG4gICAgICBpZiAoIUpzb25VdGlsLmFyZUVxdWFsKGxlZnRWYWwsIHJpZ2h0VmFsKSkge1xuICAgICAgICAoZGlmZiBhcyBhbnkpW2tleV0gPSB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZGlmZlxuICB9XG5cblxuICBwcml2YXRlIHN0YXRpYyBhcmVFcXVhbChsZWZ0OmFueSwgcmlnaHQ6YW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGFyZUVxdWFsXG4gICAgaWYgKGxlZnQgPT09IHJpZ2h0KSB7XG4gICAgICBhcmVFcXVhbCA9IHRydWVcbiAgICB9IGVsc2UgaWYgKCFsZWZ0IHx8ICFyaWdodCkge1xuICAgICAgYXJlRXF1YWwgPSBmYWxzZVxuICAgIH0gZWxzZSBpZiAoT2JqZWN0VXRpbC5pc09iamVjdChsZWZ0KSkge1xuICAgICAgaWYgKCFPYmplY3RVdGlsLmlzT2JqZWN0KHJpZ2h0KSkge1xuICAgICAgICBhcmVFcXVhbCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmVFcXVhbCA9IE9iamVjdFV0aWwua2V5cyhKc29uVXRpbC5kaWZmKGxlZnQsIHJpZ2h0KSkubGVuZ3RoID09PSAwXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcmVFcXVhbCB8fCBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGFwcGx5SnNvblRvSW5zdGFuY2U8VCwgSiBleHRlbmRzIE9iak1hcDxhbnk+PihpbnN0YW5jZTogSnNvbmlmaWVkPFQsIEo+LCBqc29uOiBKKSB7XG4gICAgY29uc3QgbW9kZWwgPSBpbnN0YW5jZS5nZXRNb2RlbCgpXG4gICAganNvbiA9IGpzb24gfHwgPGFueT57fVxuICAgIE9iamVjdFV0aWwua2V5cyhtb2RlbCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gdGhpcy5kZXRlcm1pbmVWYWx1ZShqc29uW2tleV0sIG1vZGVsW2tleV0pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRldGVybWluZVZhbHVlPFQsIEogZXh0ZW5kcyBPYmpNYXA8YW55Pj4oanNvblZhbHVlOiBhbnksIGRlZmF1bHRWYWx1ZTogYW55KTogYW55IHtcbiAgICBsZXQgdmFsdWUgPSBudWxsXG4gICAgaWYgKE9iamVjdFV0aWwuaXNOdWxsT3JEZWZpbmVkKGpzb25WYWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlXG4gICAgfSBlbHNlIGlmIChPYmplY3RVdGlsLmlzT2JqZWN0KGpzb25WYWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gT2JqZWN0VXRpbC5hc3NpZ25EZWVwKHt9LCBkZWZhdWx0VmFsdWUsIGpzb25WYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBqc29uVmFsdWVcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBzdGF0aWMgaW5zdGFuY2VUb0pzb248VCwgSiBleHRlbmRzIE9iak1hcDxhbnk+PihpbnN0YW5jZTogSnNvbmlmaWVkPFQsIEo+LCB3aXRoSGlkZGVuRmllbGRzPzogYm9vbGVhbikge1xuICAgIGNvbnN0IG1vZGVsID0gaW5zdGFuY2UuZ2V0TW9kZWwoKVxuICAgIGNvbnN0IGpzb24gPSA8YW55Pnt9XG4gICAgT2JqZWN0VXRpbC5rZXlzKG1vZGVsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICh3aXRoSGlkZGVuRmllbGRzIHx8IEpzb25VdGlsLmlzTGVnYWxGaXJlYmFzZUtleShrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XVxuICAgICAgICBqc29uW2tleV0gPSB2YWx1ZVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0VXRpbC5pc0Z1bmN0aW9uKHZhbHVlWyd0b0pzb24nXSkpIHtcbiAgICAgICAgICAgIGpzb25ba2V5XSA9IHZhbHVlLnRvSnNvbih3aXRoSGlkZGVuRmllbGRzKVxuICAgICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0VXRpbC5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGpzb25ba2V5XSA9IEpzb25VdGlsLm1hcFRvSnNvbih2YWx1ZSwgd2l0aEhpZGRlbkZpZWxkcyB8fCBmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBqc29uXG4gIH1cblxuXG4gIHN0YXRpYyBtYXBUb0pzb248SiBleHRlbmRzIG9iamVjdD4obWFwOiBPYmpNYXA8Sj4sIHdpdGhIaWRkZW5GaWVsZHM6IGJvb2xlYW4pOiBPYmpNYXA8Sj4ge1xuICAgIGNvbnN0IGpzb246YW55ID0ge31cbiAgICAvLyBAdHMtaWdub3JlIFR5cGVzY3JpcHQgaXMgY29uZnVzZWQgYnkgdGhlIHJldHVybiB0eXBlIG9mIE9iamVjdFV0aWwuZW50cmllcy5cbiAgICBPYmplY3RVdGlsLmVudHJpZXMobWFwKS5mb3JFYWNoKChlbnRyeTogTWFwRW50cnk8Sj4pID0+IHtcbiAgICAgIGxldCB2OiBhbnkgPSBlbnRyeS52YWx1ZVxuICAgICAgaWYgKHYgJiYgdlsndG9Kc29uJ10gJiYgT2JqZWN0VXRpbC5pc0Z1bmN0aW9uKHZbJ3RvSnNvbiddKSkge1xuICAgICAgICB2ID0gdi50b0pzb24od2l0aEhpZGRlbkZpZWxkcylcbiAgICAgIH1cbiAgICAgIGpzb25bZW50cnkua2V5XSA9IHZcbiAgICB9KVxuICAgIHJldHVybiBqc29uXG4gIH1cblxuICBzdGF0aWMga2V5ZWRBcnJheVRvSnNvbk1hcDxKIGV4dGVuZHMgb2JqZWN0PihhcnJheTogVG9Kc29uPEo+W10sIHdpdGhIaWRkZW5GaWVsZHM6IGJvb2xlYW4sIGtleUZpZWxkOiBzdHJpbmcgPSAnJGtleScpOiBPYmpNYXA8Sj4ge1xuICAgIGNvbnN0IGpzb246YW55ID0ge31cbiAgICBhcnJheS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIGpzb25bKGVudHJ5IGFzIGFueSlba2V5RmllbGRdXSA9IGVudHJ5LnRvSnNvbih3aXRoSGlkZGVuRmllbGRzKVxuICAgIH0pXG4gICAgcmV0dXJuIGpzb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2JqXG4gICAqIEByZXR1cm5zIHtUfVxuICAgKiBAZGVwcmVjYXRlZCBTZWUgRmlyZUJsYW5rZXQudXRpbC5yZW1vdmVJbGxlZ2FsS2V5XG4gICAqL1xuICBzdGF0aWMgcmVtb3ZlSWxsZWdhbEZpcmViYXNlS2V5czxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBUIHtcbiAgICBjb25zdCBjbGVhbk9iajogVCA9IDxUPnt9XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHYgPSBvYmpba2V5IGFzIGtleW9mIFRdXG4gICAgICBpZiAoSnNvblV0aWwuaXNMZWdhbEZpcmViYXNlS2V5KHYgYXMgc3RyaW5nKSkge1xuICAgICAgICBjbGVhbk9ialtrZXkgYXMga2V5b2YgVF0gPSB2XG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gY2xlYW5PYmpcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAZGVwcmVjYXRlZCBTZWUgRmlyZUJsYW5rZXQudXRpbC5pc0xlZ2FsRmlyZWJhc2VLZXlcbiAgICovXG4gIHN0YXRpYyBpc0xlZ2FsRmlyZWJhc2VLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4ga2V5ICE9PSBudWxsICYmIGtleSAhPT0gdW5kZWZpbmVkICYmICFrZXkuc3RhcnRzV2l0aCgnJCcpXG4gIH1cblxuXG59XG4iXX0=