node-web-mvc
Version:
node spring mvc
70 lines (69 loc) • 2.73 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildRuntimeType = void 0;
exports.getRuntimeType = getRuntimeType;
require("reflect-metadata");
const Tracer_1 = __importDefault(require("./Tracer"));
const Javascript_1 = __importDefault(require("../../../interface/Javascript"));
const MetaProperty_1 = __importDefault(require("../MetaProperty"));
const decorate = Reflect.decorate;
const metadata = Reflect.metadata;
const RuntimeTypeKey = 'design:runtimetype';
function getParameterKey(name, idx) {
return `${name}@@@${idx}`;
}
function myMetadata(metadataKey, metadataValue) {
return function decorator(target, property, idx) {
if (metadataKey == RuntimeTypeKey && arguments.length > 2) {
(0, MetaProperty_1.default)(target, property, idx);
}
// 支持参数元数据
const newMetadataKey = idx >= 0 ? getParameterKey(metadataKey, idx) : metadataKey;
return metadata.call(this, newMetadataKey, metadataValue)(target, property);
};
}
;
function myDecorator(decorators, target, propertyKey, attributes) {
if (!Tracer_1.default.hasTracer(target)) {
const tracer = new Tracer_1.default(new Error());
Tracer_1.default.setTracer(target, tracer);
}
// eslint-disable-next-line prefer-rest-params
return decorate.apply(this, arguments);
}
;
function getRuntimeType(name, target, key, idx) {
const id = RuntimeTypeKey;
const propertyKey = idx >= 0 ? getParameterKey(id, idx) : id;
const runtimeType = Reflect.getMetadata(propertyKey, target, key);
const metaType = Reflect.getMetadata(name, target, key);
let runtimeTypeInfo = null;
if (idx >= 0) {
const params = metaType || [];
runtimeTypeInfo = (0, exports.buildRuntimeType)(params[idx], runtimeType);
}
else {
runtimeTypeInfo = (0, exports.buildRuntimeType)(metaType, runtimeType);
}
if (!runtimeType) {
myMetadata(id, runtimeTypeInfo)(target, propertyKey, idx);
}
return runtimeTypeInfo;
}
const buildRuntimeType = (metaType, runtimeType) => {
if (!runtimeType) {
runtimeType = {
clazz: metaType,
name: metaType === null || metaType === void 0 ? void 0 : metaType.name,
fullName: metaType === null || metaType === void 0 ? void 0 : metaType.name,
array: Javascript_1.default.createTyper(metaType).isType(Array),
};
}
return runtimeType;
};
exports.buildRuntimeType = buildRuntimeType;
Reflect.metadata = myMetadata;
Reflect.decorate = myDecorator;