UNPKG

@trade-quorum/tq-helpers

Version:

Various common helpers for Trade Quorum API/App

132 lines (120 loc) 3.88 kB
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; };