@open-wc/dedupe-mixin
Version:
Dedupe JavaScript Class Mixins
35 lines (32 loc) • 984 B
JavaScript
const appliedClassMixins = new WeakMap();
/** Vefify if the Mixin was previously applyed
* @private
* @param {function} mixin Mixin being applyed
* @param {object} superClass Class receiving the new mixin
* @returns {boolean}
*/
function wasMixinPreviouslyApplied(mixin, superClass) {
let klass = superClass;
while (klass) {
if (appliedClassMixins.get(klass) === mixin) {
return true;
}
klass = Object.getPrototypeOf(klass);
}
return false;
}
/** Apply each mixin in the chain to make sure they are not applied more than once to the final class.
* @export
* @param {function} mixin Mixin to be applyed
* @returns {object} Mixed class with mixin applied
*/
export function dedupeMixin(mixin) {
return superClass => {
if (wasMixinPreviouslyApplied(mixin, superClass)) {
return superClass;
}
const mixedClass = mixin(superClass);
appliedClassMixins.set(mixedClass, mixin);
return mixedClass;
};
}