UNPKG

hybrids-compose

Version:

compose hybrids.js component property descriptors

71 lines (66 loc) 1.74 kB
const methodMap = (method, descriptors) => ({ connect: (...args) => { let disconnect; let descriptorsDisconnect; if (descriptors.connect) { descriptorsDisconnect = descriptors.connect(...args); } disconnect = method(...args); return () => { if (disconnect) { disconnect(); } if (descriptorsDisconnect) { descriptorsDisconnect(); } }; }, get: (host, lastValue) => { return method( host, descriptors.get ? descriptors.get(host, lastValue) : lastValue ); }, set: (host, value, lastValue) => { return method( host, descriptors.set ? descriptors.set(host, value, lastValue) : value, lastValue ); }, }); const translate = (descriptor) => { if (typeof descriptor === "function") { return { get: descriptor }; } else { return descriptor; } }; const composeDescriptors = (...descriptors) => descriptors.reduceRight( (descriptors, descriptor) => ({ ...descriptors, ...Object.entries(translate(descriptor)) .filter(([, method]) => method != null) .reduce( (methods, [methodType, method]) => ({ ...methods, [methodType]: methodMap(method, descriptors)[methodType] || ((...args) => { if (descriptors[methodType]) { descriptors[methodType](...args); } return method(...args); }), }), {} ), }), {} ); exports.compose = (...descriptors) => composeDescriptors(...descriptors); exports.composeWithValue = (value, ...descriptors) => ({ value, ...composeDescriptors(...descriptors), });