// Removes all leading and trailing slashes from a path export function stripSlashes(name: string) { return name.replace(/^(\/+)|(\/+)$/g, '') } export type KeyValueCallback = (value: any, key: string) => T // A set of lodash-y utility functions that use ES6 export const _ = { each(obj: any, callback: KeyValueCallback) { if (obj && typeof obj.forEach === 'function') { obj.forEach(callback) } else if (_.isObject(obj)) { Object.keys(obj).forEach((key) => callback(obj[key], key)) } }, some(value: any, callback: KeyValueCallback) { return Object.keys(value) .map((key) => [value[key], key]) .some(([val, key]) => callback(val, key)) }, every(value: any, callback: KeyValueCallback) { return Object.keys(value) .map((key) => [value[key], key]) .every(([val, key]) => callback(val, key)) }, keys(obj: any) { return Object.keys(obj) }, values(obj: any) { return _.keys(obj).map((key) => obj[key]) }, isMatch(obj: any, item: any) { return _.keys(item).every((key) => obj[key] === item[key]) }, isEmpty(obj: any) { return _.keys(obj).length === 0 }, isObject(item: any) { return typeof item === 'object' && !Array.isArray(item) && item !== null }, isObjectOrArray(value: any) { return typeof value === 'object' && value !== null }, extend(first: any, ...rest: any[]) { return Object.assign(first, ...rest) }, omit(obj: any, ...keys: string[]) { const result = _.extend({}, obj) keys.forEach((key) => delete result[key]) return result }, pick(source: any, ...keys: string[]) { return keys.reduce((result: { [key: string]: any }, key) => { if (source[key] !== undefined) { result[key] = source[key] } return result }, {}) }, // Recursively merge the source object into the target object merge(target: any, source: any) { if (_.isObject(target) && _.isObject(source)) { Object.keys(source).forEach((key) => { if (_.isObject(source[key])) { if (!target[key]) { Object.assign(target, { [key]: {} }) } _.merge(target[key], source[key]) } else { Object.assign(target, { [key]: source[key] }) } }) } return target } } // Duck-checks if an object looks like a promise export function isPromise(result: any) { return _.isObject(result) && typeof result.then === 'function' } export function createSymbol(name: string) { return typeof Symbol !== 'undefined' ? Symbol.for(name) : name } export * from './debug'