lodash-traits
Version:
Traits for lodash
52 lines (38 loc) • 1.21 kB
JavaScript
;
function _implSymbol(target, sym, value) {
Object.defineProperty(target, sym, {
value,
configurable: true
});
return target[sym];
}
function _getSymbol(targetSymName, ...traitSets) {
let symbol;
traitSets.forEach(traitSet => {
const sym = traitSet[targetSymName];
if (typeof sym === 'symbol') {
if (!!symbol && symbol !== sym) {
throw new Error(`Symbol ${targetSymName} offered by multiple trait sets.`);
}
symbol = sym;
}
});
if (!symbol) {
throw new Error(`No trait set is providing symbol ${targetSymName}.`);
}
return symbol;
}
function _testTraitSet(traitSet) {
if (!traitSet || typeof traitSet === 'boolean' || typeof traitSet === 'number' || typeof traitSet === 'string') {
throw new Error(`${traitSet} cannot be used as a trait set.`);
}
}
const {
TraitSet
} = require('@straits/utils');
const lodash = require('lodash');
_testTraitSet(TraitSet);
const _defineAndImplMemberFreeFunctionsAsTraits = _getSymbol("defineAndImplMemberFreeFunctionsAsTraits", TraitSet);
const traits = new TraitSet();
traits[_defineAndImplMemberFreeFunctionsAsTraits](Object.prototype, lodash);
module.exports = traits;