inversify-express-utils
Version:
Some utilities for the development of express applications with Inversify
147 lines • 6.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.principal = exports.next = exports.cookies = exports.requestHeaders = exports.requestBody = exports.queryParam = exports.requestParam = exports.response = exports.request = exports.injectHttpContext = void 0;
exports.withMiddleware = withMiddleware;
exports.controller = controller;
exports.all = all;
exports.httpGet = httpGet;
exports.httpPost = httpPost;
exports.httpPut = httpPut;
exports.httpPatch = httpPatch;
exports.httpHead = httpHead;
exports.httpDelete = httpDelete;
exports.httpOptions = httpOptions;
exports.httpMethod = httpMethod;
exports.params = params;
const inversify_1 = require("inversify");
const constants_1 = require("./constants");
const utils_1 = require("./utils");
exports.injectHttpContext = (0, inversify_1.inject)(constants_1.TYPE.HttpContext);
function defineMiddlewareMetadata(target, metaDataKey, ...middleware) {
// We register decorated middleware meteadata in a map, e.g. { "controller": [ middleware ] }
const middlewareMap = (0, utils_1.getOrCreateMetadata)(constants_1.METADATA_KEY.middleware, target, {});
if (!(metaDataKey in middlewareMap)) {
middlewareMap[metaDataKey] = [];
}
middlewareMap[metaDataKey]?.push(...middleware);
Reflect.defineMetadata(constants_1.METADATA_KEY.middleware, middlewareMap, target);
}
function withMiddleware(...middleware) {
return function (target, methodName) {
if (methodName !== undefined) {
defineMiddlewareMetadata(target, methodName, ...middleware);
}
else if (isNewableFunction(target)) {
defineMiddlewareMetadata(target.constructor, target.name, ...middleware);
}
};
}
function isNewableFunction(target) {
return typeof target === 'function' && target.prototype !== undefined;
}
function controller(path, ...middleware) {
return (target) => {
// Get the list of middleware registered with @middleware() decorators
const decoratedMiddleware = (0, utils_1.getMiddlewareMetadata)(target.constructor, target.name);
const currentMetadata = {
middleware: middleware.concat(decoratedMiddleware),
path,
target,
};
(0, inversify_1.decorate)((0, inversify_1.injectable)(), target);
Reflect.defineMetadata(constants_1.METADATA_KEY.controller, currentMetadata, target);
// We need to create an array that contains the metadata of all
// the controllers in the application, the metadata cannot be
// attached to a controller. It needs to be attached to a global
// We attach metadata to the Reflect object itself to avoid
// declaring additional globals. Also, the Reflect is available
// in both node and web browsers.
const previousMetadata = Reflect.getMetadata(constants_1.METADATA_KEY.controller, Reflect) ?? [];
const newMetadata = [
currentMetadata,
...previousMetadata,
];
Reflect.defineMetadata(constants_1.METADATA_KEY.controller, newMetadata, Reflect);
};
}
function all(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.all, path, ...middleware);
}
function httpGet(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.get, path, ...middleware);
}
function httpPost(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.post, path, ...middleware);
}
function httpPut(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.put, path, ...middleware);
}
function httpPatch(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.patch, path, ...middleware);
}
function httpHead(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.head, path, ...middleware);
}
function httpDelete(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.delete, path, ...middleware);
}
function httpOptions(path, ...middleware) {
return httpMethod(constants_1.HTTP_VERBS_ENUM.options, path, ...middleware);
}
function httpMethod(method, path, ...middleware) {
return (target, key) => {
const decoratedMiddleware = (0, utils_1.getMiddlewareMetadata)(target, key);
const metadata = {
key,
method,
middleware: middleware.concat(decoratedMiddleware),
path,
target,
};
let metadataList = [];
if (!Reflect.hasOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor)) {
Reflect.defineMetadata(constants_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
}
else {
metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor);
}
metadataList.push(metadata);
};
}
exports.request = paramDecoratorFactory(constants_1.PARAMETER_TYPE.REQUEST);
exports.response = paramDecoratorFactory(constants_1.PARAMETER_TYPE.RESPONSE);
exports.requestParam = paramDecoratorFactory(constants_1.PARAMETER_TYPE.PARAMS);
exports.queryParam = paramDecoratorFactory(constants_1.PARAMETER_TYPE.QUERY);
exports.requestBody = paramDecoratorFactory(constants_1.PARAMETER_TYPE.BODY);
exports.requestHeaders = paramDecoratorFactory(constants_1.PARAMETER_TYPE.HEADERS);
exports.cookies = paramDecoratorFactory(constants_1.PARAMETER_TYPE.COOKIES);
exports.next = paramDecoratorFactory(constants_1.PARAMETER_TYPE.NEXT);
exports.principal = paramDecoratorFactory(constants_1.PARAMETER_TYPE.PRINCIPAL);
function paramDecoratorFactory(parameterType) {
return (name) => params(parameterType, name);
}
function params(type, parameterName) {
return (target, methodName, index) => {
let metadataList = {};
let parameterMetadataList = [];
const parameterMetadata = {
index,
injectRoot: parameterName === undefined,
parameterName,
type,
};
if (!Reflect.hasOwnMetadata(constants_1.METADATA_KEY.controllerParameter, target.constructor)) {
parameterMetadataList.unshift(parameterMetadata);
}
else {
metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerParameter, target.constructor);
if (metadataList[methodName]) {
parameterMetadataList = metadataList[methodName] || [];
}
parameterMetadataList.unshift(parameterMetadata);
}
metadataList[methodName] = parameterMetadataList;
Reflect.defineMetadata(constants_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
};
}
//# sourceMappingURL=decorators.js.map