@reflet/express
Version:
Well-defined and well-typed express decorators
59 lines (58 loc) • 2.01 kB
JavaScript
;
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;