UNPKG

@open-wc/dedupe-mixin

Version:
35 lines (32 loc) 984 B
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; }; }