@trade-quorum/tq-helpers
Version:
Various common helpers for Trade Quorum API/App
132 lines (120 loc) • 3.88 kB
JavaScript
const _ = require('lodash');
// eslint-disable-next-line arrow-body-style
exports.compareFunction = ({ path, transform = _.identity, direction = 1 }) => {
return (object1, object2) => {
const value1 = transform(_.get(object1, path));
const value2 = transform(_.get(object2, path));
return direction * (value1 - value2);
};
};
exports.clone = (object) => {
if (!object) return {};
if (_.isArray(object)) return object.slice();
return Object.assign(Object.create(object), object);
};
exports.setIn = (object, path, value) =>
_.setWith(exports.clone(object), path, value, exports.clone);
exports.map = (object, transformation) => {
const newObject = {};
Object.keys(object).forEach((property) => {
newObject[property] = transformation(object[property]);
});
return newObject;
};
exports.matchObject = (object, filter) => {
let matched = true;
for (const [filterKey, filterValue] of Object.entries(filter)) {
if (
matched && // Still matched
object.hasOwnProperty(filterKey) &&
(Array.isArray(filterValue)
? filterValue.indexOf(object[filterKey]) === -1 // Not in array
: typeof filterValue === 'object'
? !exports.matchObject(object[filterKey], filterValue) // Sub-object does not match
: object[filterKey] !== filterValue) // Property value is different from expected
) {
// Then it is not matched any longer
matched = false;
}
}
return matched;
};
exports.filterObject = (collection, filter) => {
const isArray = Array.isArray(collection);
const filteredObjects = isArray ? [] : {};
for (const [key, object] of Object.entries(collection)) {
if (exports.matchObject(object, filter)) {
if (isArray) filteredObjects.push(object);
else filteredObjects[key] = object;
}
}
return filteredObjects;
};
exports.getObjectIndex = (objects, filter) => {
let objectIndex = -1;
for (const [index, object] of Object.entries(objects)) {
if (objectIndex === -1 && exports.matchObject(object, filter)) {
objectIndex = index;
}
}
return objectIndex;
};
exports.extendMatchedObjects = (collection, filter, source) => {
collection.forEach((object) => {
if (exports.matchObject(object, filter)) {
Object.assign(object, source);
}
});
return collection;
};
exports.applyTemplate = (template, object) => {
// Set object type attribute if not set already
if (!object.objectType) object.objectType = object.constructor.objectType;
// console.log('start applyTemplate');
let prototype = object;
// console.log('template', template);
do {
// Loop on properties
// console.log('prototype', prototype);
for (const property in prototype) {
// console.log('property', property);
if (property in template && !object[property]) {
// console.log('add property', property);
object[property] = template[property];
}
}
// Look on parent
prototype = Object.getPrototypeOf(prototype);
} while (prototype);
// console.log('end applyTemplate');
};
exports.getTemplate = (object) => {
const template = {};
// Loop on properties
let prototype = object;
do {
// Loop on properties
for (const property in prototype) {
template[property] = object[property];
}
// Look on parent
prototype = Object.getPrototypeOf(prototype);
} while (prototype);
return template;
};
exports.getLabelFromProperty = (property) => {
let label = '';
let upperCase = false;
for (let i = 0; i < property.length; i++) {
const c = property.charAt(i);
if (/[A-Z]/.test(c)) {
if (!upperCase) label += label ? ` ${c.toLowerCase()}` : c;
else label += c.toLocaleLowerCase();
upperCase = true;
} else {
label += label ? c : c.toUpperCase();
upperCase = false;
}
}
return label;
};