ravel
Version:
Ravel Rapid Application Development Framework
74 lines (70 loc) • 1.92 kB
JavaScript
const Metadata = require('../../util/meta');
/**
* Method-level decorator for `Module` methods, so that
* they are registered as middleware which can be injected
* automatically by `@before`.
* Made available through the Module class.
* See [`Module`](#module) for more information.
*
* @param {string} name - The injection name this middleware will be made available under.
* @param {object} config - Configuration for this middleware definition.
* @param {boolean} config.factory - Whether or not this is a middleware factory (a function that returns middleware).
* @example
* const Module = require('ravel').Module;
* const middleware = Module.middleware;
* // @Module('mymodule')
* class MyModule {
* // @middleware('my-middleware')
* async doSomething (ctx, next) {
* //...
* }
* }
* //...
* const Resource = require('ravel').Resource;
* const before = Resource.before;
* // @Resource('/')
* class MyResource {
* // @before('my-middleware')
* async getAll () {
* //...
* }
* }
*
* @example
* const Module = require('ravel').Module;
* const middleware = Module.middleware;
* // @Module('mymodule')
* class MyModule {
* // @middleware('my-middleware', {factory: true})
* doSomethingFactory (word, number) {
* return async function (ctx, next) {
* //...
* };
* }
* }
* //...
* const Resource = require('ravel').Resource;
* const before = Resource.before;
* // @Resource('/')
* class MyResource {
* // @before('my-middleware', 'hello', 12)
* async getAll () {
* //...
* }
* }
* @private
*/
function middleware(name, config = {
factory: false
}) {
return function (target, key, descriptor) {
Metadata.putClassMeta(target, '@middleware', name, {
fn: descriptor.value,
isFactory: config.factory
});
};
}
/**
* @private
*/
module.exports = middleware;