node-web-mvc
Version:
node spring mvc
70 lines (69 loc) • 2.45 kB
JavaScript
;
/**
* @module ElementType
* @description 注解类范围枚举
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.reflectAnnotationType = reflectAnnotationType;
exports.checkAnnotation = checkAnnotation;
const AnnotationElementTypeError_1 = __importDefault(require("../../../errors/AnnotationElementTypeError"));
const Javascript_1 = __importDefault(require("../../../interface/Javascript"));
var ElementType;
(function (ElementType) {
/**
* 标识注解可以使用在 类上
*/
ElementType["TYPE"] = "TYPE";
/**
* 标识注解可以使用在 类函数上
*/
ElementType["METHOD"] = "METHOD";
/**
* 标识注解可以使用在函数参数
*/
ElementType["PARAMETER"] = "PARAMETER";
/**
* 标识注解可以使用在 class的属性上
*/
ElementType["PROPERTY"] = "PROPERTY";
})(ElementType || (ElementType = {}));
function isPropertyDescritpor(descriptor) {
if (descriptor && typeof descriptor === 'object') {
return 'get' in descriptor && 'set' in descriptor;
}
}
function reflectAnnotationType(options) {
if (!options || options.length < 0 || options.length > 3 || !options[0]) {
return 'UNKNOW';
}
const length = options.length;
const [target, name, descriptor] = options;
const clazz = length == 1 ? target : target === null || target === void 0 ? void 0 : target.constructor;
const isClass = Javascript_1.default.isClass(clazz);
if (!isClass) {
// 如果不是作用在class上则直接判定为未知
return 'UNKNOW';
}
if (length === 1) {
return ElementType.TYPE;
}
else if (length === 3 && (descriptor === undefined || isPropertyDescritpor(descriptor))) {
return ElementType.PROPERTY;
}
else if (length === 3) {
const isNumber = typeof descriptor === 'number';
return isNumber ? ElementType.PARAMETER : ElementType.METHOD;
}
return 'UNKNOW';
}
function checkAnnotation(types, options, name) {
const elementType = reflectAnnotationType(options);
if (types.length > 0 && types.indexOf(elementType) < 0) {
throw new AnnotationElementTypeError_1.default(name, types, elementType);
}
return elementType;
}
exports.default = ElementType;