UNPKG

inversify-express-utils

Version:

Some utilities for the development of express applications with Inversify

147 lines 6.72 kB
"use strict"; 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