@nodeswork/kiws
Version:
Koa-based Injectable Web Service
55 lines (53 loc) • 2.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata");
const _ = require("underscore");
const injection_1 = require("./injection");
exports.MIDDLEWARE = 'MIDDLEWARE';
exports.MIDDLEWARE_TARGET_APP = 'app';
exports.MIDDLEWARE_TARGET_ROUTER = 'router';
const MIDDLEWARE_TAGS = ['middleware', 'provider'];
/**
* MiddlewareProvider class decorator will register the middlewares declared in
* the provider to Koa and KoaRouter.
*/
function MiddlewareProvider(options = {}) {
return (constructor) => {
const injectionMetadata = injection_1.getInjectionMetadata(constructor);
const injectable = injection_1.Injectable({
inputs: true,
tags: _.union(MIDDLEWARE_TAGS, options.tags || []),
meta: _.extend({}, options.meta, {
middlewares: injectionMetadata.meta.middlewares || [],
}),
});
injectable(constructor);
constructor.prototype.$getMiddlewares = $getMiddlewares;
};
}
exports.MiddlewareProvider = MiddlewareProvider;
function AppMiddleware(options = {}) {
return middleware(_.extend({}, options, { target: exports.MIDDLEWARE_TARGET_APP }));
}
exports.AppMiddleware = AppMiddleware;
function RouterMiddleware(options = {}) {
return middleware(_.extend({}, options, { target: exports.MIDDLEWARE_TARGET_ROUTER }));
}
exports.RouterMiddleware = RouterMiddleware;
function middleware(metadata) {
return (target, propertyName) => {
metadata.name = propertyName;
metadata.provider = target.constructor.name;
const injectionMetadata = injection_1.getInjectionMetadata(target.constructor);
_.defaults(injectionMetadata.meta, { middlewares: [] });
injectionMetadata.meta.middlewares.push(metadata);
injection_1.defineInjectionMetadata(target.constructor, injectionMetadata);
};
}
function $getMiddlewares() {
const injectionMetadata = injection_1.getInjectionMetadata(this.constructor);
return _.map(injectionMetadata.meta.middlewares, (metadata) => {
return _.extend(metadata, { fn: this[metadata.name] });
});
}
//# sourceMappingURL=middleware.js.map