ts-api-core
Version:
Nodejs api framework core
139 lines • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpBodyModel = exports.HttpBody = exports.HttpResponse = exports.HttpRequest = exports.Esn = exports.Token = exports.Headers = exports.Cookie = exports.Body = exports.Query = exports.Param = exports.GetPost = exports.Put = exports.Delete = exports.Post = exports.Get = exports.Controller = exports.getMethod = exports.getClazz = void 0;
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable @typescript-eslint/no-unsafe-call */
require("reflect-metadata");
const getClazz = (target) => {
return (target.$Meta = target.$Meta || { baseUrl: "", routes: {} });
};
exports.getClazz = getClazz;
const getMethod = (target, methodName) => {
const meta = (0, exports.getClazz)(target);
const methodMeta = meta.routes[methodName] || (meta.routes[methodName] = {
subUrl: '',
httpMethod: '',
midwares: [],
params: [],
});
return methodMeta;
};
exports.getMethod = getMethod;
/**
* Service class decorator.
*
* @Controller('/user')
* class UserService {
* }
* @param baseUrl 基础路径
* @param logPackage 是否输出 api 日志
*
*/
function Controller(baseUrl = '/', midwares, logPackage) {
return function (target) {
const meta = (0, exports.getClazz)(target.prototype);
meta.baseUrl = baseUrl;
meta.midwares = midwares;
meta.logPackage = logPackage;
};
}
exports.Controller = Controller;
const MethodFactory = (httpMethod) => {
return (url, midwares) => {
return (target, methodName, descriptor) => {
const meta = (0, exports.getMethod)(target, methodName);
meta.subUrl = url;
meta.httpMethod = httpMethod;
meta.midwares = midwares;
// Sort parameter by param index
meta.params.sort((param1, param2) => param1.index - param2.index);
};
};
};
/**
*
* @GET('/user/:name')
* list(@PathParam('name') name:string)
*/
exports.Get = MethodFactory('get');
exports.Post = MethodFactory('post');
exports.Delete = MethodFactory('delete');
exports.Put = MethodFactory('put');
exports.GetPost = MethodFactory('get,post');
const ParamFactory = (paramType, dataType2, paramName2) => {
return (target, methodName, paramIndex) => {
var _a, _b;
let dataType = dataType2;
let paramName = paramName2;
if (!dataType) {
const paramTypes = Reflect.getMetadata('design:paramtypes', target, methodName);
const item = paramTypes[paramIndex];
if (item.name === 'Number') {
dataType = 'number';
}
else if (item.name !== "String"
&& item.name !== "Boolean"
&& paramType !== "request"
&& paramType !== "response"
&& paramType !== "body"
&& paramType !== "path") {
dataType = item.prototype;
}
}
// 如果没有指定参数名,则根据参数索引,获取对应位置的参数变量名称,作为参数名
if (!paramName
&& paramType !== "request"
&& paramType !== "response"
&& paramType !== "body") {
const ss = (_b = (_a = target[methodName]) === null || _a === void 0 ? void 0 : _a.toString()) === null || _b === void 0 ? void 0 : _b.trim();
if (ss.startsWith(methodName)) {
const params = ss
.substring(methodName.length + 1, ss.indexOf(")"))
.split(",");
if (paramIndex < params.length) {
paramName = params[paramIndex].trim();
}
}
}
const meta = (0, exports.getMethod)(target, methodName);
meta.params.push({
name: paramName ? paramName : paramType,
index: paramIndex,
type: paramType,
dataType,
});
};
};
const MethodParamFactory = (paramType) => {
return (paramName, dataType) => {
return ParamFactory(paramType, dataType, paramName);
};
};
/**
*
* list(@PathParam('name') name:string)
*
*/
exports.Param = MethodParamFactory('path');
exports.Query = MethodParamFactory('query');
exports.Body = MethodParamFactory('form');
exports.Cookie = MethodParamFactory('cookie');
exports.Headers = MethodParamFactory('header');
exports.Token = (0, exports.Headers)('token');
exports.Esn = (0, exports.Headers)('esn');
const ContextParamFactory = (paramType) => {
return ParamFactory(paramType);
};
/**
*
* @GET('/get')
* list(@Request request, @Response res)
*/
exports.HttpRequest = ContextParamFactory('request');
exports.HttpResponse = ContextParamFactory('response');
/** 参数值是原始的Http请求Body数据 */
exports.HttpBody = ContextParamFactory('body');
/** 参数值是Http请求的Body数据自动转换的Model对象, 与 Body 的区别的是,会自动合并未知字段 */
exports.HttpBodyModel = ContextParamFactory("bodyModel");
//# sourceMappingURL=express.decorator.js.map