@zerooneit/expressive-tea
Version:
A REST API over Express and Typescript
63 lines (62 loc) • 2.63 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.router = exports.generateRoute = exports.extractParameters = exports.mapArguments = exports.autoResponse = void 0;
const lodash_1 = require("lodash");
const MetaData_1 = require("../classes/MetaData");
const constants_1 = require("../libs/constants");
function autoResponse(request, response, annotations, responseResult) {
const view = (0, lodash_1.find)(annotations, { type: 'view' });
if (view) {
return response.render(view.arguments[0], responseResult);
}
response.send((0, lodash_1.isNumber)(responseResult) ? responseResult.toString() : responseResult);
}
exports.autoResponse = autoResponse;
function mapArguments(decoratedArguments, request, response, next) {
return (0, lodash_1.chain)(decoratedArguments)
.sortBy('index')
.map((argument) => {
switch (argument.type) {
case constants_1.ARGUMENT_TYPES.REQUEST:
return request;
case constants_1.ARGUMENT_TYPES.RESPONSE:
return response;
case constants_1.ARGUMENT_TYPES.NEXT:
return next;
case constants_1.ARGUMENT_TYPES.QUERY:
return extractParameters(request.query, argument.arguments);
case constants_1.ARGUMENT_TYPES.BODY:
return extractParameters(request.body, argument.arguments);
case constants_1.ARGUMENT_TYPES.GET_PARAM:
return extractParameters(request.params, argument.arguments);
default:
return;
}
})
.thru((args) => (0, lodash_1.size)(args) ? args : [request, response, next])
.value();
}
exports.mapArguments = mapArguments;
function extractParameters(target, args) {
if (!args && !target) {
return;
}
if (!args) {
return target;
}
if (Array.isArray(args)) {
return (0, lodash_1.pick)(target, args);
}
return (0, lodash_1.get)(target, args);
}
exports.extractParameters = extractParameters;
function generateRoute(route, verb) {
return (target, propertyKey, descriptor) => router(verb, route, target, descriptor.value, propertyKey);
}
exports.generateRoute = generateRoute;
function router(verb, route, target, handler, propertyKey) {
const existedRoutesHandlers = MetaData_1.default.get(constants_1.ROUTER_HANDLERS_KEY, target) || [];
existedRoutesHandlers.unshift({ verb, route, handler, target, propertyKey });
MetaData_1.default.set(constants_1.ROUTER_HANDLERS_KEY, existedRoutesHandlers, target);
}
exports.router = router;
;