From acd28dbe96f18557b05f7f86312ed109d3098b98 Mon Sep 17 00:00:00 2001 From: Battousai Date: Mon, 12 Feb 2024 15:29:58 +0600 Subject: [PATCH] fix: weakmap in mixing tracking --- src/mixin-tracking.ts | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/mixin-tracking.ts b/src/mixin-tracking.ts index 90321b9..4dfcc01 100644 --- a/src/mixin-tracking.ts +++ b/src/mixin-tracking.ts @@ -2,17 +2,18 @@ import { protoChain } from './util'; import { Class } from './types'; // Keeps track of constituent classes for every mixin class created by ts-mixer. -const mixins = new Map(); +const mixins = new WeakMap(); -export const getMixinsForClass = (clazz: Class) => - mixins.get(clazz); +export const getMixinsForClass = (clazz: Class) => mixins.get(clazz); export const registerMixins = (mixedClass: any, constituents: Function[]) => mixins.set(mixedClass, constituents); -export const hasMixin = (instance: any, mixin: abstract new (...args) => M): instance is M => { - if (instance instanceof mixin) - return true; +export const hasMixin = ( + instance: any, + mixin: abstract new (...args) => M +): instance is M => { + if (instance instanceof mixin) return true; const constructor = instance.constructor; @@ -23,14 +24,18 @@ export const hasMixin = (instance: any, mixin: abstract new (...args) => M): while (frontier.size > 0) { // check if the frontier has the mixin we're looking for. if not, we can say we visited every item in the frontier if (frontier.has(mixin)) return true; - frontier.forEach(item => visited.add(item)); + frontier.forEach((item) => visited.add(item)); // build a new frontier based on the associated mixin classes and prototype chains of each frontier item const newFrontier = new Set(); - frontier.forEach(item => { - const itemConstituents = mixins.get(item) ?? protoChain(item.prototype).map(proto => proto.constructor).filter(item => item !== null); + frontier.forEach((item) => { + const itemConstituents = + mixins.get(item) ?? + protoChain(item.prototype) + .map((proto) => proto.constructor) + .filter((item) => item !== null); if (itemConstituents) - itemConstituents.forEach(constituent => { + itemConstituents.forEach((constituent) => { if (!visited.has(constituent) && !frontier.has(constituent)) newFrontier.add(constituent); });