diff --git a/src/base/decoratorManager.ts b/src/base/decoratorManager.ts index 4668484..8a269e8 100644 --- a/src/base/decoratorManager.ts +++ b/src/base/decoratorManager.ts @@ -47,28 +47,68 @@ export class DecoratorManager extends Map { return DecoratorManager.getDecoratorClsMethodPrefix(decoratorNameKey) + ':' + methodKey.toString(); } + static getDecoratorMethod(decoratorNameKey: decoratorKey, methodKey: decoratorKey) { + return DecoratorManager.getDecoratorMethodKey(decoratorNameKey) + '_' + methodKey.toString(); + } + listModule(key) { return Array.from(this.get(key) || {}); } - static getOriginMetadata(metaKey, target, method?) { - if (method) { - // for property - if (!Reflect.hasMetadata(metaKey, target, method)) { - Reflect.defineMetadata(metaKey, new Map(), target, method); - } - return Reflect.getMetadata(metaKey, target, method); + static saveMetadata(metaKey: string, target: any, dataKey: string, data: any) { + // filter Object.create(null) + if (typeof target === 'object' && target.constructor) { + target = target.constructor; + } + + let m: Map; + if (Reflect.hasOwnMetadata(metaKey, target)) { + m = Reflect.getMetadata(metaKey, target); } else { - // filter Object.create(null) - if (typeof target === 'object' && target.constructor) { - target = target.constructor; - } - // for class - if (!Reflect.hasMetadata(metaKey, target)) { - Reflect.defineMetadata(metaKey, new Map(), target); - } - return Reflect.getMetadata(metaKey, target); + m = new Map(); } + + m.set(dataKey, data); + Reflect.defineMetadata(metaKey, m, target); + } + + static attachMetadata(metaKey: string, target: any, dataKey: string, data: any) { + // filter Object.create(null) + if (typeof target === 'object' && target.constructor) { + target = target.constructor; + } + + let m: Map; + if (Reflect.hasOwnMetadata(metaKey, target)) { + m = Reflect.getMetadata(metaKey, target); + } else { + m = new Map(); + } + + if (!m.has(dataKey)) { + m.set(dataKey, []); + } + m.get(dataKey).push(data); + Reflect.defineMetadata(metaKey, m, target); + } + + static getMetadata(metaKey: string, target: any, dataKey?: string) { + // filter Object.create(null) + if (typeof target === 'object' && target.constructor) { + target = target.constructor; + } + + let m: Map; + if (!Reflect.hasOwnMetadata(metaKey, target)) { + m = new Map(); + Reflect.defineMetadata(metaKey, m, target); + } else { + m = Reflect.getMetadata(metaKey, target); + } + if (!dataKey) { + return m; + } + return m.get(dataKey); } /** @@ -80,11 +120,11 @@ export class DecoratorManager extends Map { */ saveMetadata(decoratorNameKey: decoratorKey, data, target, propertyName?) { if (propertyName) { - const originMap = DecoratorManager.getOriginMetadata(this.injectMethodKeyPrefix, target, propertyName); - originMap.set(DecoratorManager.getDecoratorMethodKey(decoratorNameKey), data); + const dataKey = DecoratorManager.getDecoratorMethod(decoratorNameKey, propertyName); + DecoratorManager.saveMetadata(this.injectMethodKeyPrefix, target, dataKey, data); } else { - const originMap = DecoratorManager.getOriginMetadata(this.injectClassKeyPrefix, target); - originMap.set(DecoratorManager.getDecoratorClassKey(decoratorNameKey), data); + const dataKey = DecoratorManager.getDecoratorClassKey(decoratorNameKey); + DecoratorManager.saveMetadata(this.injectClassKeyPrefix, target, dataKey, data); } } @@ -96,19 +136,13 @@ export class DecoratorManager extends Map { * @param propertyName */ attachMetadata(decoratorNameKey: decoratorKey, data, target, propertyName?) { - let originMap; - let key; if (propertyName) { - originMap = DecoratorManager.getOriginMetadata(this.injectMethodKeyPrefix, target, propertyName); - key = DecoratorManager.getDecoratorMethodKey(decoratorNameKey); + const dataKey = DecoratorManager.getDecoratorMethod(decoratorNameKey, propertyName); + DecoratorManager.attachMetadata(this.injectMethodKeyPrefix, target, dataKey, data); } else { - originMap = DecoratorManager.getOriginMetadata(this.injectClassKeyPrefix, target); - key = DecoratorManager.getDecoratorClassKey(decoratorNameKey); - } - if (!originMap.has(key)) { - originMap.set(key, []); + const dataKey = DecoratorManager.getDecoratorClassKey(decoratorNameKey); + DecoratorManager.attachMetadata(this.injectClassKeyPrefix, target, dataKey, data); } - originMap.get(key).push(data); } /** @@ -119,11 +153,11 @@ export class DecoratorManager extends Map { */ getMetadata(decoratorNameKey: decoratorKey, target, propertyName?) { if (propertyName) { - const originMap = DecoratorManager.getOriginMetadata(this.injectMethodKeyPrefix, target, propertyName); - return originMap.get(DecoratorManager.getDecoratorMethodKey(decoratorNameKey)); + const dataKey = DecoratorManager.getDecoratorMethod(decoratorNameKey, propertyName); + return DecoratorManager.getMetadata(this.injectMethodKeyPrefix, target, dataKey); } else { - const originMap = DecoratorManager.getOriginMetadata(this.injectClassKeyPrefix, target); - return originMap.get(DecoratorManager.getDecoratorClassKey(decoratorNameKey)); + const dataKey = `${DecoratorManager.getDecoratorClassKey(decoratorNameKey)}`; + return DecoratorManager.getMetadata(this.injectClassKeyPrefix, target, dataKey); } } @@ -135,8 +169,8 @@ export class DecoratorManager extends Map { * @param propertyName */ savePropertyDataToClass(decoratorNameKey: decoratorKey, data, target, propertyName) { - const originMap = DecoratorManager.getOriginMetadata(this.injectClassMethodKeyPrefix, target); - originMap.set(DecoratorManager.getDecoratorClsMethodKey(decoratorNameKey, propertyName), data); + const dataKey = DecoratorManager.getDecoratorClsMethodKey(decoratorNameKey, propertyName); + DecoratorManager.saveMetadata(this.injectClassMethodKeyPrefix, target, dataKey, data); } /** @@ -147,12 +181,8 @@ export class DecoratorManager extends Map { * @param propertyName */ attachPropertyDataToClass(decoratorNameKey: decoratorKey, data, target, propertyName) { - const originMap = DecoratorManager.getOriginMetadata(this.injectClassMethodKeyPrefix, target); - const key = DecoratorManager.getDecoratorClsMethodKey(decoratorNameKey, propertyName); - if (!originMap.has(key)) { - originMap.set(key, []); - } - originMap.get(key).push(data); + const dataKey = DecoratorManager.getDecoratorClsMethodKey(decoratorNameKey, propertyName); + DecoratorManager.attachMetadata(this.injectClassMethodKeyPrefix, target, dataKey, data); } /** @@ -162,8 +192,8 @@ export class DecoratorManager extends Map { * @param propertyName */ getPropertyDataFromClass(decoratorNameKey: decoratorKey, target, propertyName) { - const originMap = DecoratorManager.getOriginMetadata(this.injectClassMethodKeyPrefix, target); - return originMap.get(DecoratorManager.getDecoratorClsMethodKey(decoratorNameKey, propertyName)); + const dataKey = DecoratorManager.getDecoratorClsMethodKey(decoratorNameKey, propertyName); + return DecoratorManager.getMetadata(this.injectClassMethodKeyPrefix, target, dataKey); } /** @@ -172,7 +202,7 @@ export class DecoratorManager extends Map { * @param target */ listPropertyDataFromClass(decoratorNameKey: decoratorKey, target) { - const originMap = DecoratorManager.getOriginMetadata(this.injectClassMethodKeyPrefix, target); + const originMap = DecoratorManager.getMetadata(this.injectClassMethodKeyPrefix, target); const res = []; for (const [ key, value ] of originMap) { if (key.indexOf(DecoratorManager.getDecoratorClsMethodPrefix(decoratorNameKey)) !== -1) { diff --git a/test/unit/base/decoratorManager.test.ts b/test/unit/base/decoratorManager.test.ts index 28b97da..4a115ff 100644 --- a/test/unit/base/decoratorManager.test.ts +++ b/test/unit/base/decoratorManager.test.ts @@ -22,6 +22,7 @@ describe('/test/unit/base/decoratorManager.test.ts', () => { }); it('should save data to class and list it', () => { + const dataRes = listMethodDataFromClass('custom', module); assert(dataRes.length === 1);