UNPKG

node-web-mvc

Version:
70 lines (69 loc) 2.73 kB
"use strict"; 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;