UNPKG

@reflet/express

Version:

Well-defined and well-typed express decorators

59 lines (58 loc) 2.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractMiddlewares = exports.Use = void 0; const metadata_map_1 = require("./metadata-map"); const METAKEY_USE = Symbol('use'); /** * Applies middlewares on a single route when applied to a method, or on multipe routes when applied to a class. * @see https://expressjs.com/en/4x/api.html#app.use * * @remarks * You can specify as much middlewares as you want inside a single `Use` decorator, * and apply as many `Use` decorators as you want. * Middlewares are applied on the routes in the order they are written. * * ------ * @example * ```ts * @Use(express.json(), express.urlencoded()) * class Foo { * @Use<{ bar?: number }>((req, res, next) => { * req.bar = 1 * next() * }) * @Post('/some') * create(req: Request & { bar: number }, res: Response, next: NextFunction) {} * } * ``` * ------ * @public */ function Use(...middlewares) { return (target, key, descriptor) => { // Method middleware if (key) { const existingMiddlewares = (0, metadata_map_1.getOwnMetadata)(METAKEY_USE, target, key) || []; // prepend (0, metadata_map_1.defineMetadata)(METAKEY_USE, middlewares.concat(existingMiddlewares), target, key); } // Class middleware else { const existingMiddlewares = (0, metadata_map_1.getOwnMetadata)(METAKEY_USE, target.prototype) || []; // prepend (0, metadata_map_1.defineMetadata)(METAKEY_USE, middlewares.concat(existingMiddlewares), target.prototype); } }; } exports.Use = Use; /** * @internal */ function extractMiddlewares(target, key) { // Method middlewares if (key) return (0, metadata_map_1.getOwnMetadata)(METAKEY_USE, target.prototype, key) || []; // Class middlewares return (0, metadata_map_1.getOwnMetadata)(METAKEY_USE, target.prototype) || []; } exports.extractMiddlewares = extractMiddlewares;