yasui
Version:
Lightweight Express-based framework for REST and web APIs
84 lines • 7.65 kB
JavaScript
import { ReflectMetadata, getMetadata } from './reflect.js';
import { HttpCode } from '../enums/index.js';
export function routeHandler(target, descriptor, params, pipes, isMiddleware, defaultStatus = HttpCode.OK) {
const routeFunction = descriptor.value;
return async (req, res, next) => {
req.source = target.name;
const routeHandlerArgs = { req, res, next };
const self = getMetadata(ReflectMetadata.SELF, target.prototype) || {};
const methodDeps = getMetadata(ReflectMetadata.RESOLVED_METHOD_DEPS, self, String(descriptor.value.name)) || {};
const allIndexes = [
...params.map(p => p.index),
...Object.keys(methodDeps).map(k => parseInt(k))
];
const maxIndex = allIndexes.length > 0 ? Math.max(...allIndexes) : -1;
const args = new Array(maxIndex + 1);
for (const param of params) {
let value = param.path.reduce((prev, curr) => prev && prev[curr] || null, routeHandlerArgs);
if (value !== null && param.type && shouldCastParam(param.path)) {
value = castParamValue(value, param.type, param.itemsType);
}
if (pipes.length > 0) {
const metadata = {
type: param.path[1],
metatype: param.type,
name: param.path[2]
};
for (const pipe of pipes) {
value = await pipe.transform(value, metadata);
}
}
args[param.index] = value;
}
for (const indexStr in methodDeps) {
const index = parseInt(indexStr);
args[index] = methodDeps[index];
}
try {
const result = await routeFunction.apply(self, args);
if (!res.headersSent) {
if (result !== undefined || !isMiddleware) {
res.status(defaultStatus).json(result);
}
else {
next();
}
}
}
catch (err) {
next(err);
}
};
}
function shouldCastParam(path) {
if (path.length < 3) {
return false;
}
return (path[1] === 'params' ||
path[1] === 'query' ||
path[1] === 'headers');
}
function castParamValue(value, paramType, itemsType) {
switch (paramType) {
case Number:
return Number(value);
case Boolean:
return value === 'true' || value === '1';
case Date:
return new Date(value);
case Array:
return Array.isArray(value)
? (itemsType ? value.map(v => castParamValue(v, itemsType)) : value)
: [itemsType ? castParamValue(value, itemsType) : value];
case String:
return value;
default:
try {
return JSON.parse(value);
}
catch {
return null;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9yb3V0ZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVELE9BQU8sRUFBRSxRQUFRLEVBQTBCLE1BQU0sbUJBQW1CLENBQUM7QUFLckUsTUFBTSxVQUFVLFlBQVksQ0FDMUIsTUFBZ0IsRUFDaEIsVUFBOEIsRUFDOUIsTUFBcUIsRUFDckIsS0FBdUIsRUFDdkIsWUFBc0IsRUFDdEIsZ0JBQTBCLFFBQVEsQ0FBQyxFQUFFO0lBRXJDLE1BQU0sYUFBYSxHQUFhLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFakQsT0FBTyxLQUFLLEVBQ1YsR0FBWSxFQUNaLEdBQWEsRUFDYixJQUFrQixFQUNILEVBQUU7UUFDakIsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBR3pCLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBUyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFHdkUsTUFBTSxVQUFVLEdBQ2QsV0FBVyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFL0YsTUFBTSxVQUFVLEdBQUc7WUFDakIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMzQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FB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