ing
This commit is contained in:
		
							parent
							
								
									100a0060bc
								
							
						
					
					
						commit
						8bea46c526
					
				
							
								
								
									
										41
									
								
								src/ts/@overflow/commons/core/reflect/accessible_object.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/ts/@overflow/commons/core/reflect/accessible_object.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,41 @@
 | 
			
		||||
import {
 | 
			
		||||
  ClassType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AnnotatedElement,
 | 
			
		||||
  Annotation,
 | 
			
		||||
 } from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export abstract class AccessibleObject implements AnnotatedElement {
 | 
			
		||||
  private _annotations: Map<any, Annotation>;
 | 
			
		||||
 | 
			
		||||
  protected constructor() {
 | 
			
		||||
    this._annotations = new Map();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public _addAnnotation<AnnotationType extends Annotation>(annotation: AnnotationType): void {
 | 
			
		||||
    this._annotations.set((<any>annotation).prototype, annotation);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public isAnnotationPresent<AnnotationType extends Annotation>(annotationClass: ClassType<AnnotationType>): boolean {
 | 
			
		||||
    return null !== this.getAnnotation(annotationClass);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getOwnAnnotation<AnnotationType extends Annotation>(annotationClass: ClassType<AnnotationType>): AnnotationType {
 | 
			
		||||
    return <AnnotationType>this._annotations.get(annotationClass.prototype);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getOwnAnnotations(): Map<any, Annotation> {
 | 
			
		||||
    return this._annotations;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getAnnotation<AnnotationType extends Annotation>(annotationClass: ClassType<AnnotationType>): AnnotationType {
 | 
			
		||||
    return this.getOwnAnnotation(annotationClass);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getAnnotations(): Map<any, Annotation> {
 | 
			
		||||
    return this.getOwnAnnotations();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								src/ts/@overflow/commons/core/reflect/annotated_element.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/ts/@overflow/commons/core/reflect/annotated_element.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
import {
 | 
			
		||||
  ClassType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export interface AnnotatedElement {
 | 
			
		||||
  _addAnnotation<AnnotationType extends Annotation>(annotation: AnnotationType): void;
 | 
			
		||||
 | 
			
		||||
  isAnnotationPresent<AnnotationType extends Annotation>(annotationClass: ClassType<AnnotationType>): boolean;
 | 
			
		||||
  getOwnAnnotation<AnnotationType extends Annotation>(annotationClass: ClassType<AnnotationType>): AnnotationType;
 | 
			
		||||
  getOwnAnnotations(): Map<any, Annotation>;
 | 
			
		||||
  getAnnotation<AnnotationType extends Annotation>(annotationClass: ClassType<AnnotationType>): AnnotationType;
 | 
			
		||||
  getAnnotations(): Map<any, Annotation>;
 | 
			
		||||
}
 | 
			
		||||
@ -4,15 +4,9 @@ import {
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
export interface Annotation {
 | 
			
		||||
  metadataKey(): MetadataKeyType;
 | 
			
		||||
  classDecorator?<TFunction extends Function>(target: TFunction): TFunction | void;
 | 
			
		||||
  propertyDecorator?(target: Object, propertyKey: PropertyKeyType): void;
 | 
			
		||||
  methodDecorator?<T>(target: Object, propertyKey: PropertyKeyType,
 | 
			
		||||
                      descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void;
 | 
			
		||||
  parameterDecorator?(target: Object, propertyKey: PropertyKeyType, parameterIndex: number): void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export abstract class Annotation {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default Annotation;
 | 
			
		||||
							
								
								
									
										112
									
								
								src/ts/@overflow/commons/core/reflect/class.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								src/ts/@overflow/commons/core/reflect/class.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,112 @@
 | 
			
		||||
import {
 | 
			
		||||
  ClassType,
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
  Metadata,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AccessibleObject,
 | 
			
		||||
  Field,
 | 
			
		||||
  Method,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export class Class extends AccessibleObject {
 | 
			
		||||
  private _clazzType: ClassType;
 | 
			
		||||
  private _fields: Map<PropertyKeyType, Field>;
 | 
			
		||||
  private _methods: Map<PropertyKeyType, Method>;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * forClass
 | 
			
		||||
   */
 | 
			
		||||
  public static forClass(clazzType: ClassType): Class {
 | 
			
		||||
    return Metadata.get(LOAFER_CLASS, clazzType);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * _defineClass
 | 
			
		||||
   */
 | 
			
		||||
  public static _defineClass(clazzType: ClassType): Class {
 | 
			
		||||
    let clazz: Class = Metadata.get(LOAFER_CLASS, clazzType);
 | 
			
		||||
    if (undefined === clazz) {
 | 
			
		||||
      clazz = new Class(clazzType);
 | 
			
		||||
      Metadata.set(LOAFER_CLASS, clazz, clazzType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return clazz;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private constructor(clazzType: ClassType) {
 | 
			
		||||
    super();
 | 
			
		||||
    this._clazzType = clazzType;
 | 
			
		||||
    this._fields = new Map();
 | 
			
		||||
    this._methods = new Map();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * _defineField
 | 
			
		||||
   */
 | 
			
		||||
  public _defineField(propertyKey: PropertyKeyType, propertyType: any): Field {
 | 
			
		||||
    let field: Field = this._fields.get(propertyKey);
 | 
			
		||||
    if (undefined === field) {
 | 
			
		||||
      field = new Field(this, propertyKey, propertyType);
 | 
			
		||||
      this._fields.set(propertyKey, field);
 | 
			
		||||
    }
 | 
			
		||||
    return field;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * _defineMethod
 | 
			
		||||
   */
 | 
			
		||||
  public _defineMethod(propertyKey: PropertyKeyType, parameterTypes: any[], returnType: any): Method {
 | 
			
		||||
    let method: Method = this._methods.get(propertyKey);
 | 
			
		||||
    if (undefined === method) {
 | 
			
		||||
      method = new Method(this, propertyKey, parameterTypes, returnType);
 | 
			
		||||
      this._methods.set(propertyKey, method);
 | 
			
		||||
    }
 | 
			
		||||
    return method;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  public getOwnField(propertyKey: PropertyKeyType): Field {
 | 
			
		||||
    return this._fields.get(propertyKey);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getOwnFields(): Map<PropertyKeyType, Field> {
 | 
			
		||||
    return this._fields;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getField(propertyKey: PropertyKeyType): Field {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getFields(): Field[] {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getOwnMethod(propertyKey: PropertyKeyType): Method {
 | 
			
		||||
    return this._methods.get(propertyKey);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getOwnMethods(): Map<PropertyKeyType, Method> {
 | 
			
		||||
    return this._methods;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getMethod(propertyKey: PropertyKeyType): Method {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getMethods(): Method[] {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getName(): string {
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Metadata key
 | 
			
		||||
 * @private
 | 
			
		||||
 * @type {string}
 | 
			
		||||
 */
 | 
			
		||||
const LOAFER_CLASS = Symbol('loafer:class');
 | 
			
		||||
							
								
								
									
										19
									
								
								src/ts/@overflow/commons/core/reflect/constructor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/ts/@overflow/commons/core/reflect/constructor.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
import {
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Class,
 | 
			
		||||
  Executable,
 | 
			
		||||
 } from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export class Constructor extends Executable {
 | 
			
		||||
 | 
			
		||||
  public constructor(declaringClazz: Class, parameterTypes: any[]) {
 | 
			
		||||
    super(declaringClazz, parameterTypes);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getName(): PropertyKeyType {
 | 
			
		||||
    return this.getDeclaringClass().getName();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										64
									
								
								src/ts/@overflow/commons/core/reflect/executable.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								src/ts/@overflow/commons/core/reflect/executable.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,64 @@
 | 
			
		||||
import {
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AccessibleObject,
 | 
			
		||||
  Class,
 | 
			
		||||
  Member,
 | 
			
		||||
  Parameter,
 | 
			
		||||
 } from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export abstract class Executable extends AccessibleObject implements Member {
 | 
			
		||||
  private _clazz: Class;
 | 
			
		||||
  private _parameters: Parameter[];
 | 
			
		||||
 | 
			
		||||
  protected constructor(declaringClazz: Class, parameterTypes: any[]) {
 | 
			
		||||
    super();
 | 
			
		||||
 | 
			
		||||
    this._clazz = declaringClazz;
 | 
			
		||||
 | 
			
		||||
    if (null === parameterTypes) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    this._parameters = [];
 | 
			
		||||
    for (let i = 0; i < parameterTypes.length; i++) {
 | 
			
		||||
      const parameterType = parameterTypes[i];
 | 
			
		||||
      let parameter: Parameter = new Parameter(this, parameterType, i);
 | 
			
		||||
      this._parameters.push(parameter);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getDeclaringClass(): Class {
 | 
			
		||||
    return this._clazz;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public abstract getName(): PropertyKeyType;
 | 
			
		||||
  /**
 | 
			
		||||
   * getParameterCount
 | 
			
		||||
   */
 | 
			
		||||
  public getParameterCount(): number {
 | 
			
		||||
    if (null === this._parameters) {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return this._parameters.length;
 | 
			
		||||
  }
 | 
			
		||||
  /**
 | 
			
		||||
   * getParameters
 | 
			
		||||
   */
 | 
			
		||||
  public getParameters(): Parameter[] {
 | 
			
		||||
    return this._parameters;
 | 
			
		||||
  }
 | 
			
		||||
  /**
 | 
			
		||||
   * getParameter
 | 
			
		||||
   */
 | 
			
		||||
  public getParameter(index: number): Parameter {
 | 
			
		||||
    if (null === this._parameters) {
 | 
			
		||||
      return null;
 | 
			
		||||
    }
 | 
			
		||||
    if (0 > index || this._parameters.length <= index) {
 | 
			
		||||
      return null;
 | 
			
		||||
    }
 | 
			
		||||
    return this._parameters[index];
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								src/ts/@overflow/commons/core/reflect/field.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/ts/@overflow/commons/core/reflect/field.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
import {
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AccessibleObject,
 | 
			
		||||
  Class,
 | 
			
		||||
  Member,
 | 
			
		||||
 } from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export class Field extends AccessibleObject implements Member {
 | 
			
		||||
  private _clazz: Class;
 | 
			
		||||
  private _name: PropertyKeyType;
 | 
			
		||||
  private _type: any;
 | 
			
		||||
 | 
			
		||||
  public constructor(declaringClazz: Class, name: PropertyKeyType, fieldType: any) {
 | 
			
		||||
    super();
 | 
			
		||||
    this._clazz = declaringClazz;
 | 
			
		||||
    this._name = name;
 | 
			
		||||
    this._type = fieldType;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getDeclaringClass(): Class {
 | 
			
		||||
    return this._clazz;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getName(): PropertyKeyType {
 | 
			
		||||
    return this._name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getType(): any {
 | 
			
		||||
    return this._type;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								src/ts/@overflow/commons/core/reflect/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/ts/@overflow/commons/core/reflect/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
export * from './accessible_object';
 | 
			
		||||
export * from './annotated_element';
 | 
			
		||||
export * from './annotation';
 | 
			
		||||
export * from './class';
 | 
			
		||||
export * from './constructor';
 | 
			
		||||
export * from './executable';
 | 
			
		||||
export * from './field';
 | 
			
		||||
export * from './member';
 | 
			
		||||
export * from './method';
 | 
			
		||||
export * from './parameter';
 | 
			
		||||
							
								
								
									
										12
									
								
								src/ts/@overflow/commons/core/reflect/member.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/ts/@overflow/commons/core/reflect/member.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
import {
 | 
			
		||||
  Class,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
export interface Member {
 | 
			
		||||
  getDeclaringClass(): Class;
 | 
			
		||||
  getName(): PropertyKeyType;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								src/ts/@overflow/commons/core/reflect/method.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/ts/@overflow/commons/core/reflect/method.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
import {
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Class,
 | 
			
		||||
  Executable,
 | 
			
		||||
 } from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export class Method extends Executable {
 | 
			
		||||
  private _name: PropertyKeyType;
 | 
			
		||||
  private _returnType: any;
 | 
			
		||||
 | 
			
		||||
  public constructor(declaringClazz: Class, name: PropertyKeyType, parameterTypes: any[], returnType: any) {
 | 
			
		||||
    super(declaringClazz, parameterTypes);
 | 
			
		||||
    this._name = name;
 | 
			
		||||
    this._returnType = returnType;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getName(): PropertyKeyType {
 | 
			
		||||
    return this._name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getReturnType(): any {
 | 
			
		||||
    return this._returnType;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								src/ts/@overflow/commons/core/reflect/parameter.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/ts/@overflow/commons/core/reflect/parameter.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
import {
 | 
			
		||||
  AccessibleObject,
 | 
			
		||||
  Executable,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
export class Parameter extends AccessibleObject {
 | 
			
		||||
  private _executable: Executable;
 | 
			
		||||
  private _type: any;
 | 
			
		||||
  private _index: number;
 | 
			
		||||
 | 
			
		||||
  public constructor(executable: Executable, parameterType: any, index: number) {
 | 
			
		||||
    super();
 | 
			
		||||
    this._executable = executable;
 | 
			
		||||
    this._type = parameterType;
 | 
			
		||||
    this._index = index;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getDeclaringExecutable(): Executable {
 | 
			
		||||
    return this._executable;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getType(): any {
 | 
			
		||||
    return this._type;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getIndex(): number {
 | 
			
		||||
    return this._index;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -2,8 +2,8 @@ export type IdentityType<T> = T | symbol;
 | 
			
		||||
export type PropertyKeyType = IdentityType<string>;
 | 
			
		||||
export type MetadataKeyType = IdentityType<string>;
 | 
			
		||||
 | 
			
		||||
export const ConstructorType = Function;
 | 
			
		||||
export interface ConstructorType<T = {}> extends Function {
 | 
			
		||||
export const ClassType = Function;
 | 
			
		||||
export interface ClassType<T = {}> extends Function {
 | 
			
		||||
  new (...args: any[]): T;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import {
 | 
			
		||||
  ConstructorType,
 | 
			
		||||
  ClassType,
 | 
			
		||||
  DecoratorType,
 | 
			
		||||
  DecoratorParametersType,
 | 
			
		||||
  PrimitiveType,
 | 
			
		||||
@ -12,7 +12,7 @@ export class TypeUtil {
 | 
			
		||||
   * Get the provide constructor.
 | 
			
		||||
   * @param targetClass
 | 
			
		||||
   */
 | 
			
		||||
  public static getContructor(targetClass: any): ConstructorType {
 | 
			
		||||
  public static getContructor(targetClass: any): ClassType {
 | 
			
		||||
    return typeof targetClass === 'function'
 | 
			
		||||
        ? targetClass
 | 
			
		||||
        : targetClass.constructor;
 | 
			
		||||
@ -23,7 +23,7 @@ export class TypeUtil {
 | 
			
		||||
   * @param target
 | 
			
		||||
   * @returns {*}
 | 
			
		||||
   */
 | 
			
		||||
  public static getClass(target: any): any {
 | 
			
		||||
  public static getClass(target: any): ClassType {
 | 
			
		||||
      return target.prototype ? target : target.constructor;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
export * from './annotation';
 | 
			
		||||
@ -1,5 +1,13 @@
 | 
			
		||||
import {
 | 
			
		||||
  ConstructorType,
 | 
			
		||||
  Annotation,
 | 
			
		||||
  Class,
 | 
			
		||||
  Field,
 | 
			
		||||
  Method,
 | 
			
		||||
  Parameter,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  ClassType,
 | 
			
		||||
  DecoratorType,
 | 
			
		||||
  MetadataKeyType,
 | 
			
		||||
  Metadata,
 | 
			
		||||
@ -7,12 +15,10 @@ import {
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import * as Constants from './constants';
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
} from './annotation';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export class Decorator {
 | 
			
		||||
  public static create = (AnnotationClass: ConstructorType<Annotation>) => {
 | 
			
		||||
  public static create = (AnnotationClass: ClassType<Annotation>) => {
 | 
			
		||||
 | 
			
		||||
    return (...handlerArgs: any[]) => {
 | 
			
		||||
      let annotation: Annotation = new AnnotationClass(...handlerArgs);
 | 
			
		||||
@ -23,13 +29,10 @@ export class Decorator {
 | 
			
		||||
 | 
			
		||||
        const [target, propertyKey, descriptorOrParameterIndex] = decoratorArgs;
 | 
			
		||||
 | 
			
		||||
        // let type = typeof decoratorArgs[0] === 'function' ? decoratorArgs[0].prototype : decoratorArgs[0];
 | 
			
		||||
        // let clazz = TypeUtil.getClass(decoratorArgs[0]);
 | 
			
		||||
        if (typeof(annotation.metadataKey) === 'undefined') {
 | 
			
		||||
          throw new Error(`Annotation[@${name}] must be implements metadataKey().`);
 | 
			
		||||
        }
 | 
			
		||||
        let metadataKey: MetadataKeyType = annotation.metadataKey.call(annotation);
 | 
			
		||||
        Metadata.set(metadataKey, annotation, target, propertyKey);
 | 
			
		||||
        let clazz: Class = Class._defineClass(TypeUtil.getClass(target));
 | 
			
		||||
        let field: Field = null;
 | 
			
		||||
        let method: Method = null;
 | 
			
		||||
        let parameter: Parameter = null;
 | 
			
		||||
 | 
			
		||||
        switch(decoratorType) {
 | 
			
		||||
        case DecoratorType.CLASS:
 | 
			
		||||
@ -37,24 +40,40 @@ export class Decorator {
 | 
			
		||||
            throw new Error(`Cannot apply @${name} decorator on Class.`);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          clazz._addAnnotation(annotation);
 | 
			
		||||
 | 
			
		||||
          return annotation.classDecorator.call(annotation, target);
 | 
			
		||||
        case DecoratorType.PROPERTY:
 | 
			
		||||
          if (typeof(annotation.propertyDecorator) === 'undefined') {
 | 
			
		||||
            throw new Error(`Cannot apply @${name} decorator on Property.`);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          field = clazz._defineField(propertyKey, Metadata.getOwnType(target, propertyKey));
 | 
			
		||||
          field._addAnnotation(annotation);
 | 
			
		||||
 | 
			
		||||
          return annotation.propertyDecorator.call(annotation, target, propertyKey);
 | 
			
		||||
        case DecoratorType.METHOD:
 | 
			
		||||
          if (typeof(annotation.methodDecorator) === 'undefined') {
 | 
			
		||||
            throw new Error(`Cannot apply @${name} decorator on Method.`);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          method = clazz._defineMethod(propertyKey,
 | 
			
		||||
                                       Metadata.getOwnParamTypes(target, propertyKey),
 | 
			
		||||
                                       Metadata.getOwnReturnType(target, propertyKey));
 | 
			
		||||
          method._addAnnotation(annotation);
 | 
			
		||||
 | 
			
		||||
          return annotation.methodDecorator.call(annotation, target, propertyKey, descriptorOrParameterIndex);
 | 
			
		||||
        case DecoratorType.PARAMETER:
 | 
			
		||||
          if (typeof(annotation.parameterDecorator) === 'undefined') {
 | 
			
		||||
            throw new Error(`Cannot apply @${name} decorator on Parameter.`);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          method = clazz._defineMethod(propertyKey,
 | 
			
		||||
                                       Metadata.getOwnParamTypes(target, propertyKey),
 | 
			
		||||
                                       Metadata.getOwnReturnType(target, propertyKey));
 | 
			
		||||
          parameter = method.getParameter(descriptorOrParameterIndex);
 | 
			
		||||
          parameter._addAnnotation(annotation);
 | 
			
		||||
 | 
			
		||||
          return annotation.parameterDecorator.call(annotation, target, propertyKey, descriptorOrParameterIndex);
 | 
			
		||||
        default:
 | 
			
		||||
          throw new Error(`Cannot determine decorator[@${name}] type.`);
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,2 @@
 | 
			
		||||
export * from './constants';
 | 
			
		||||
export * from './decorator';
 | 
			
		||||
 | 
			
		||||
export * from './annotation';
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,7 @@
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  MetadataKeyType,
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
@ -5,21 +9,17 @@ import {
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
  Decorator,
 | 
			
		||||
} from '@overflow/commons/decorator';
 | 
			
		||||
 | 
			
		||||
export const ActionMappingMetadataKey = Symbol('ActionMappingAnnotation');
 | 
			
		||||
 | 
			
		||||
export interface ActionMappingAnnotationAttributes {
 | 
			
		||||
  value: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class ActionMappingAnnotation extends Annotation {
 | 
			
		||||
export class ActionMappingAnnotation implements Annotation {
 | 
			
		||||
  public readonly attributes: ActionMappingAnnotationAttributes;
 | 
			
		||||
 | 
			
		||||
  public constructor(value: string | ActionMappingAnnotationAttributes) {
 | 
			
		||||
    super();
 | 
			
		||||
 | 
			
		||||
    if (undefined === value) {
 | 
			
		||||
      throw new Error(`value attribute must be specified.`);
 | 
			
		||||
@ -34,10 +34,6 @@ export class ActionMappingAnnotation extends Annotation {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public metadataKey(): MetadataKeyType {
 | 
			
		||||
    return ActionMappingMetadataKey;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public classDecorator<TFunction extends Function>(target: TFunction): TFunction | void {
 | 
			
		||||
    console.log('ActionMapping');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -1,25 +1,24 @@
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  MetadataKeyType,
 | 
			
		||||
  TypeUtil,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
  Decorator,
 | 
			
		||||
} from '@overflow/commons/decorator';
 | 
			
		||||
 | 
			
		||||
export const ReducerMetadataKey = Symbol('ReducerAnnotation');
 | 
			
		||||
 | 
			
		||||
export interface ReducerAnnotationAttributes {
 | 
			
		||||
  name?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class ReducerAnnotation extends Annotation {
 | 
			
		||||
export class ReducerAnnotation implements Annotation {
 | 
			
		||||
  public readonly attributes: ReducerAnnotationAttributes;
 | 
			
		||||
 | 
			
		||||
  public constructor(name: string | ReducerAnnotationAttributes) {
 | 
			
		||||
    super();
 | 
			
		||||
 | 
			
		||||
    if (undefined === name) {
 | 
			
		||||
      this.attributes = {
 | 
			
		||||
        name: '',
 | 
			
		||||
@ -36,10 +35,6 @@ export class ReducerAnnotation extends Annotation {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public metadataKey(): MetadataKeyType {
 | 
			
		||||
    return ReducerMetadataKey;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public classDecorator<TFunction extends Function>(target: TFunction): TFunction | void {
 | 
			
		||||
    console.log('Reducer');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,7 @@
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  MetadataKeyType,
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
@ -5,22 +9,17 @@ import {
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
  Decorator,
 | 
			
		||||
} from '@overflow/commons/decorator';
 | 
			
		||||
 | 
			
		||||
export const RestAPIMetadataKey = Symbol('RestAPIAnnotation');
 | 
			
		||||
 | 
			
		||||
export interface RestAPIAnnotationAttributes {
 | 
			
		||||
  entryPath: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class RestAPIAnnotation extends Annotation {
 | 
			
		||||
export class RestAPIAnnotation implements Annotation {
 | 
			
		||||
  public readonly attributes: RestAPIAnnotationAttributes;
 | 
			
		||||
 | 
			
		||||
  public constructor(entryPath: string | RestAPIAnnotationAttributes) {
 | 
			
		||||
    super();
 | 
			
		||||
 | 
			
		||||
    if (undefined === entryPath) {
 | 
			
		||||
      throw new Error(`entryPath attribute must be specified.`);
 | 
			
		||||
    }
 | 
			
		||||
@ -34,10 +33,6 @@ export class RestAPIAnnotation extends Annotation {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public metadataKey(): MetadataKeyType {
 | 
			
		||||
    return RestAPIMetadataKey;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public methodDecorator<T>(target: Object, propertyKey: PropertyKeyType,
 | 
			
		||||
                            descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void {
 | 
			
		||||
    console.log('RestAPI');
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,7 @@
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
} from '@overflow/commons/core/reflect';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  MetadataKeyType,
 | 
			
		||||
  PropertyKeyType,
 | 
			
		||||
@ -5,22 +9,17 @@ import {
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Annotation,
 | 
			
		||||
  Decorator,
 | 
			
		||||
} from '@overflow/commons/decorator';
 | 
			
		||||
 | 
			
		||||
export const RpcAPIMetadataKey = Symbol('RpcAPIAnnotation');
 | 
			
		||||
 | 
			
		||||
export interface RpcAPIAnnotationAttributes {
 | 
			
		||||
  method: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class RpcAPIAnnotation extends Annotation {
 | 
			
		||||
export class RpcAPIAnnotation implements Annotation {
 | 
			
		||||
  public readonly attributes: RpcAPIAnnotationAttributes;
 | 
			
		||||
 | 
			
		||||
  public constructor(method: string | RpcAPIAnnotationAttributes) {
 | 
			
		||||
    super();
 | 
			
		||||
 | 
			
		||||
    if (undefined === method) {
 | 
			
		||||
      throw new Error(`method attribute must be specified.`);
 | 
			
		||||
    }
 | 
			
		||||
@ -34,10 +33,6 @@ export class RpcAPIAnnotation extends Annotation {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public metadataKey(): MetadataKeyType {
 | 
			
		||||
    return RpcAPIMetadataKey;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public methodDecorator<T>(target: Object, propertyKey: PropertyKeyType,
 | 
			
		||||
                            descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void {
 | 
			
		||||
    console.log('RestAPI');
 | 
			
		||||
 | 
			
		||||
@ -1,17 +1,17 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Action,
 | 
			
		||||
} from './action';
 | 
			
		||||
import {
 | 
			
		||||
  ConstructorType,
 | 
			
		||||
  ClassType,
 | 
			
		||||
  Metadata,
 | 
			
		||||
  TypeUtil,
 | 
			
		||||
} from '@overflow/commons/core/type';
 | 
			
		||||
import {
 | 
			
		||||
  ActionMappingAnnotation,
 | 
			
		||||
  ActionMappingMetadataKey,
 | 
			
		||||
  ReducerMetadataKey,
 | 
			
		||||
  ReducerAnnotation,
 | 
			
		||||
  RestAPIAnnotation,
 | 
			
		||||
  RpcAPIAnnotation,
 | 
			
		||||
} from '@overflow/commons/redux/decorators';
 | 
			
		||||
import { Class } from '@overflow/commons/core/reflect';
 | 
			
		||||
import { Action } from '@overflow/commons/redux/action';
 | 
			
		||||
 | 
			
		||||
export default class LPCReducer {
 | 
			
		||||
 | 
			
		||||
@ -45,27 +45,31 @@ export default class LPCReducer {
 | 
			
		||||
  /**
 | 
			
		||||
   * registerReducers
 | 
			
		||||
   */
 | 
			
		||||
  public registerReducers(reducerTypes: ConstructorType[]): void {
 | 
			
		||||
  public registerReducers(reducerTypes: ClassType[]): void {
 | 
			
		||||
    for (let reducerType of reducerTypes) {
 | 
			
		||||
      let ra: ReducerAnnotation = Metadata.get(ReducerMetadataKey, reducerType);
 | 
			
		||||
      let clazz: Class = Class.forClass(reducerType);
 | 
			
		||||
      let ra: ReducerAnnotation = clazz.getOwnAnnotation(ReducerAnnotation);
 | 
			
		||||
      if (undefined === ra) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      console.log(`name: ${ra.attributes.name}`);
 | 
			
		||||
      let ama: ActionMappingAnnotation = Metadata.get(ActionMappingMetadataKey, reducerType);
 | 
			
		||||
      let ama: ActionMappingAnnotation = clazz.getOwnAnnotation(ActionMappingAnnotation);
 | 
			
		||||
      if (undefined === ama) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      console.log(`actionMapping-value: ${ama.attributes.value}`);
 | 
			
		||||
 | 
			
		||||
      let properties = Object.keys(reducerType.prototype);
 | 
			
		||||
      for (let propertyKey of properties) {
 | 
			
		||||
        if (!TypeUtil.isMethod(reducerType.prototype, propertyKey)) {
 | 
			
		||||
          console.log(`property: ${propertyKey}`);
 | 
			
		||||
          continue;
 | 
			
		||||
      clazz.getMethods().forEach(method => {
 | 
			
		||||
        let restAPIAnnotation: RestAPIAnnotation = method.getOwnAnnotation(RestAPIAnnotation);
 | 
			
		||||
        let rpcAPIAnnotation: RpcAPIAnnotation = method.getOwnAnnotation(RpcAPIAnnotation);
 | 
			
		||||
        if (restAPIAnnotation) {
 | 
			
		||||
          console.log(`restAPI: ${restAPIAnnotation.attributes.entryPath}`);
 | 
			
		||||
        }
 | 
			
		||||
        console.log(`method: ${propertyKey}`);
 | 
			
		||||
      }
 | 
			
		||||
        if (rpcAPIAnnotation) {
 | 
			
		||||
          console.log(`restAPI: ${rpcAPIAnnotation.attributes.method}`);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
@ -73,7 +77,7 @@ export default class LPCReducer {
 | 
			
		||||
  /**
 | 
			
		||||
   * registerReducer
 | 
			
		||||
   */
 | 
			
		||||
  public registerReducer(reducerType: ConstructorType): void {
 | 
			
		||||
  public registerReducer(reducerType: ClassType): void {
 | 
			
		||||
    console.log(``);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,6 @@ import {
 | 
			
		||||
@Reducer()
 | 
			
		||||
@ActionMapping('@overflow/modules/member/MemberReducer')
 | 
			
		||||
export default class MemberReducer {
 | 
			
		||||
  public path: string;
 | 
			
		||||
  /**
 | 
			
		||||
   * signin
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user