@tangential/core
Version:
Core types and support code for Tangential
157 lines • 17.2 kB
JavaScript
export const ResolveVoid = undefined;
export class ObjectUtil {
/**
* Null safe version of Object.keys.
* @param map
* @returns {string[]} The keys for the map, or an empty array if the argument provided is falsy.
*/
static keys(map) {
return Object.keys(map || {});
}
/**
* Provide a map of keys such that 'map[key]' provides a literal true value if the key is present, even if the value
* on the source map is falsy.
*/
static toTruthMap(ary) {
const map = {};
ary.forEach(value => map[value] = true);
return map;
}
/**
* Expand the map into an array of key-value pairs.
* @param {ObjMap<T extends object>} map
* @returns MapEntry<T>
*/
static entries(map) {
const ret = Object.keys(map || {}).map((key) => {
return { key: key, value: map[key] };
});
return ret;
}
/**
* Provide the values of the map.
* @param {ObjMap<T>} map
* @returns MapEntry<T>
*/
static values(map) {
return Object.keys(map || {}).map((key) => {
return map[key];
});
}
static isObject(value) {
return (typeof value === 'object' || value.constructor === Object);
}
static isFunction(value) {
return (typeof value === 'function' || value instanceof Function);
}
static isNullOrDefined(value) {
return value === null || value === undefined;
}
static exists(value) {
return value !== null && value !== undefined;
}
static assignDeep(target, ...sources) {
target = target || {};
const L = sources.length;
for (let i = 0; i < L; i++) {
const source = sources[i] || {};
Object.keys(source).forEach(key => {
const value = source[key];
if (value && ObjectUtil.isObject(value)) {
target[key] = ObjectUtil.assignDeep({}, target[key] || {}, value);
}
else {
target[key] = value;
}
});
}
return target;
}
static removeNullish(obj) {
const cleanObj = {};
Object.keys(obj).forEach((key) => {
const v = obj[key];
if (v !== null && v !== undefined) {
cleanObj[key] = v;
}
});
return cleanObj;
}
}
export const cleanFirebaseMap = function (firebaseList, deep) {
const result = {};
Object.keys(firebaseList).forEach((key) => {
if (key[0] !== '$') {
if (deep && firebaseList[key] instanceof Object) {
result[key] = cleanFirebaseMap(firebaseList[key], true);
}
else {
result[key] = firebaseList[key];
}
}
});
return result;
};
export const pathExists = (object, path) => {
const parts = path.split('\.');
let exists = true;
let obj = object;
for (let i = 0; i < parts.length; i++) {
obj = obj[parts[i]];
if (obj === undefined) {
exists = false;
break;
}
}
return exists;
};
export const ensureExists = (object, path, value = true) => {
const parts = path.split('\.');
let obj = object;
for (let i = 0; i < parts.length - 1; i++) {
const key = parts[i];
if (obj[key] === undefined) {
obj[key] = {};
}
obj = obj[key];
}
const lastKey = parts[parts.length - 1];
if (obj[lastKey] === undefined) {
obj[lastKey] = value;
}
return obj[lastKey];
};
export const removeIfExists = (object, path) => {
const parts = path.split('\.');
let obj = object;
let existed = true;
for (let i = 0; i < parts.length - 1; i++) {
obj = obj[parts[i]];
if (obj === undefined) {
existed = false;
break;
}
}
if (existed) {
const lastKey = parts[parts.length - 1];
existed = obj[lastKey] !== undefined;
if (existed) {
delete obj[lastKey];
}
}
return existed;
};
export const safe = (fn) => {
try {
return fn();
}
catch (e) {
return null;
}
};
export const eachKey = (objMap, fn) => {
Object.keys(objMap).forEach((key) => {
fn(objMap[key], key);
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9jb3JlL3NyYy9saWIvdXRpbC9jb3JlLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUVwQyxNQUFNLE9BQU8sVUFBVTtJQUdyQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBSSxHQUFjO1FBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBYTtRQUM3QixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUE7UUFDZCxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUUsR0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ2hELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFJLEdBQW9CO1FBQ3BDLE1BQU0sR0FBRyxHQUFrQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1RCxPQUFPLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUE7UUFDcEMsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBSSxHQUFvQjtRQUNuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFD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QU8sQ0FBQyxDQUFBO1NBQ3BCO0tBQ0Y7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFhLEVBQUUsRUFBRTtJQUNwQyxJQUFJO1FBQ0YsT0FBTyxFQUFFLEVBQUUsQ0FBQTtLQUNaO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLElBQUksQ0FBQTtLQUNaO0FBQ0gsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQWUsTUFBUyxFQUFFLEVBQWtDLEVBQUUsRUFBRTtJQUNyRixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQzFDLEVBQUUsQ0FBRSxNQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDL0IsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09iak1hcH0gZnJvbSAnLi4vbGFuZy9vYmotbWFwJ1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwRW50cnk8VD4geyBrZXk6IHN0cmluZywgdmFsdWU6IFRcbn1cblxuZXhwb3J0IGNvbnN0IFJlc29sdmVWb2lkID0gdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBPYmplY3RVdGlsIHtcblxuXG4gIC8qKlxuICAgKiBOdWxsIHNhZmUgdmVyc2lvbiBvZiBPYmplY3Qua2V5cy5cbiAgICogQHBhcmFtIG1hcFxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFRoZSBrZXlzIGZvciB0aGUgbWFwLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGUgYXJndW1lbnQgcHJvdmlkZWQgaXMgZmFsc3kuXG4gICAqL1xuICBzdGF0aWMga2V5czxUPihtYXA6IE9iak1hcDxUPik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwIHx8IHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBtYXAgb2Yga2V5cyBzdWNoIHRoYXQgJ21hcFtrZXldJyBwcm92aWRlcyBhIGxpdGVyYWwgdHJ1ZSB2YWx1ZSBpZiB0aGUga2V5IGlzIHByZXNlbnQsIGV2ZW4gaWYgdGhlIHZhbHVlXG4gICAqIG9uIHRoZSBzb3VyY2UgbWFwIGlzIGZhbHN5LlxuICAgKi9cbiAgc3RhdGljIHRvVHJ1dGhNYXAoYXJ5OiBzdHJpbmdbXSk6IE9iak1hcDxib29sZWFuPiB7XG4gICAgY29uc3QgbWFwID0ge31cbiAgICBhcnkuZm9yRWFjaCh2YWx1ZSA9PiAobWFwIGFzIGFueSlbdmFsdWVdID0gdHJ1ZSlcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIHRoZSBtYXAgaW50byBhbiBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAqIEBwYXJhbSB7T2JqTWFwPFQgZXh0ZW5kcyBvYmplY3Q+fSBtYXBcbiAgICogQHJldHVybnMgTWFwRW50cnk8VD5cbiAgICovXG4gIHN0YXRpYyBlbnRyaWVzPFQ+KG1hcDogT2JqTWFwPFQ+IHwgYW55KTogTWFwRW50cnk8VD5bXSB7XG4gICAgY29uc3QgcmV0Ok1hcEVudHJ5PFQ+W10gPSAgT2JqZWN0LmtleXMobWFwIHx8IHt9KS5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtrZXk6IGtleSwgdmFsdWU6IG1hcFtrZXldfVxuICAgIH0pXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgdGhlIHZhbHVlcyBvZiB0aGUgbWFwLlxuICAgKiBAcGFyYW0ge09iak1hcDxUPn0gbWFwXG4gICAqIEByZXR1cm5zIE1hcEVudHJ5PFQ+XG4gICAqL1xuICBzdGF0aWMgdmFsdWVzPFQ+KG1hcDogT2JqTWFwPFQ+IHwgYW55KTogVFtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwIHx8IHt9KS5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIG1hcFtrZXldXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBpc09iamVjdCh2YWx1ZTphbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdClcbiAgfVxuXG4gIHN0YXRpYyBpc0Z1bmN0aW9uKHZhbHVlOmFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8IHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgaXNOdWxsT3JEZWZpbmVkKHZhbHVlOmFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gIH1cblxuICBzdGF0aWMgZXhpc3RzKHZhbHVlOmFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBzdGF0aWMgYXNzaWduRGVlcCh0YXJnZXQ6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuICAgIHRhcmdldCA9IHRhcmdldCB8fCB7fVxuICAgIGNvbnN0IEwgPSBzb3VyY2VzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTDsgaSsrKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzW2ldIHx8IHt9XG4gICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XVxuICAgICAgICBpZiAodmFsdWUgJiYgT2JqZWN0VXRpbC5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IE9iamVjdFV0aWwuYXNzaWduRGVlcCh7fSwgdGFyZ2V0W2tleV0gfHwge30sIHZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG5cblxuICBzdGF0aWMgcmVtb3ZlTnVsbGlzaDxUPihvYmo6IFQpOiBUIHtcbiAgICBjb25zdCBjbGVhbk9iajogVCA9IDxUPnt9XG4gICAgT2JqZWN0LmtleXMob2JqIGFzIGFueSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2ID0gKG9iaiBhcyBhbnkpW2tleV1cbiAgICAgIGlmICh2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoY2xlYW5PYmogYXMgYW55KVtrZXldID0gdlxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGNsZWFuT2JqXG4gIH1cblxufVxuXG5leHBvcnQgY29uc3QgY2xlYW5GaXJlYmFzZU1hcCA9IGZ1bmN0aW9uIDxUPihmaXJlYmFzZUxpc3Q6IE9iak1hcDxUPiwgZGVlcD86IGJvb2xlYW4pOiBPYmpNYXA8VD4ge1xuICBjb25zdCByZXN1bHQ6IE9iak1hcDxUPiA9IHt9XG5cbiAgT2JqZWN0LmtleXMoZmlyZWJhc2VMaXN0KS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmIChrZXlbMF0gIT09ICckJykge1xuICAgICAgaWYgKGRlZXAgJiYgZmlyZWJhc2VMaXN0W2tleV0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSA8YW55PmNsZWFuRmlyZWJhc2VNYXAoPGFueT5maXJlYmFzZUxpc3Rba2V5XSwgdHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZmlyZWJhc2VMaXN0W2tleV1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRcbn1cbmV4cG9ydCBjb25zdCBwYXRoRXhpc3RzID0gKG9iamVjdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJ1xcLicpXG4gIGxldCBleGlzdHMgPSB0cnVlXG4gIGxldCBvYmogPSBvYmplY3RcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG9iaiA9IG9ialtwYXJ0c1tpXV1cbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4aXN0cyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhpc3RzXG59XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVFeGlzdHMgPSAob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSA9IHRydWUpOiBhbnkgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJ1xcLicpXG4gIGxldCBvYmogPSBvYmplY3RcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBwYXJ0c1tpXVxuICAgIGlmIChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYmpba2V5XSA9IHt9XG4gICAgfVxuICAgIG9iaiA9IG9ialtrZXldXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChvYmpbbGFzdEtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgIG9ialtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbiAgcmV0dXJuIG9ialtsYXN0S2V5XVxufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlSWZFeGlzdHMgPSAob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJ1xcLicpXG4gIGxldCBvYmogPSBvYmplY3RcbiAgbGV0IGV4aXN0ZWQgPSB0cnVlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgb2JqID0gb2JqW3BhcnRzW2ldXVxuICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXhpc3RlZCA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICBpZiAoZXhpc3RlZCkge1xuICAgIGNvbnN0IGxhc3RLZXkgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICAgIGV4aXN0ZWQgPSBvYmpbbGFzdEtleV0gIT09IHVuZGVmaW5lZFxuICAgIGlmIChleGlzdGVkKSB7XG4gICAgICBkZWxldGUgb2JqW2xhc3RLZXldXG4gICAgfVxuICB9XG4gIHJldHVybiBleGlzdGVkXG59XG5cbmV4cG9ydCBjb25zdCBzYWZlID0gKGZuOiAoKSA9PiBhbnkpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZWFjaEtleSA9IDxUIGV4dGVuZHMge30+KG9iak1hcDogVCwgZm46IChhcmc/OiBULCBrZXk/OiBzdHJpbmcpID0+IGFueSkgPT4ge1xuICBPYmplY3Qua2V5cyhvYmpNYXApLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgZm4oKG9iak1hcCBhcyBhbnkpW2tleV0sIGtleSlcbiAgfSlcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIER1bzxYLCBZPiB7XG4gIHg6IFhcbiAgeTogWVxufVxuIl19