@ark7/router
Version:
Ark7 Router layer framework.
149 lines (147 loc) • 5.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.METADATA_KEY = exports.A7ControllerSubsidiary = exports.A7ControllerSubsidiaryType = exports.A7ControllerMetadata = exports.injectHandler = exports.Method = void 0;
require("reflect-metadata");
const _ = require("underscore");
const Router = require("koa-router");
const utils_1 = require("./utils");
var Method;
(function (Method) {
Method["GET"] = "get";
Method["POST"] = "post";
Method["PUT"] = "put";
Method["DELETE"] = "delete";
})(Method = exports.Method || (exports.Method = {}));
function injectHandler(handler) {
return async (ctx, next) => {
ctx.handler = handler;
await next();
};
}
exports.injectHandler = injectHandler;
/**
* Metadata injected to the A7Controller class.
*/
class A7ControllerMetadata {
className;
middlewares;
subsidiaries;
routerOptions;
constructor(className,
/** Global middlewares applied to all the handlers. */
middlewares = [],
/** Subsidiaries under the current controller. */
subsidiaries = [],
/** Koa router options. */
routerOptions = {}) {
this.className = className;
this.middlewares = middlewares;
this.subsidiaries = subsidiaries;
this.routerOptions = routerOptions;
}
static getMetadata(cls) {
return (Reflect.getMetadata(exports.METADATA_KEY, cls) ??
new A7ControllerMetadata(cls.name));
}
koaRouter(controller) {
const koaRouter = new Router(this.routerOptions);
if (!_.isEmpty(this.middlewares)) {
koaRouter.use((0, utils_1.compose)(this.middlewares));
}
for (const subsidiary of this.subsidiaries) {
/**
* ES2022 overwrite properties on the prototypes, so reset the value here.
*/
const name = subsidiary.name;
const prototype = Object.getPrototypeOf(controller);
if (Object.getOwnPropertyNames(controller).includes(name) &&
Object.getOwnPropertyNames(prototype).includes(name)) {
const value = controller[name];
delete controller[name];
controller[name] = value;
}
switch (subsidiary.type) {
case A7ControllerSubsidiaryType.HANDLER:
if (subsidiary.path != null) {
koaRouter[subsidiary.method](subsidiary.name, subsidiary.path, (0, utils_1.compose)([
injectHandler(`${this.className}.${subsidiary.name}`),
subsidiary.composedMiddleware,
]).bind(controller));
}
break;
case A7ControllerSubsidiaryType.SUB_CONTROLLER:
const router = new Router({
prefix: subsidiary.path,
});
if (!_.isEmpty(subsidiary.middlewares)) {
router.use(subsidiary.composedMiddleware.bind(controller));
}
const subController = new subsidiary.cls();
router.use(...subController.$koaRouterUseArgs);
koaRouter.use(router.routes(), router.allowedMethods());
break;
}
}
return koaRouter;
}
extendOptions(options) {
_.extend(this.routerOptions, options);
return this;
}
defineMetadata(cls) {
Reflect.defineMetadata(exports.METADATA_KEY, this, cls);
return this;
}
pushMiddlewaresInFront(middlewares) {
this.middlewares = _.union(middlewares, this.middlewares);
return this;
}
clone() {
return new A7ControllerMetadata(this.className, _.clone(this.middlewares), _.clone(this.subsidiaries), _.clone(this.routerOptions));
}
getSubsidiaryByName(name) {
return _.find(this.subsidiaries, (s) => s.name === name);
}
getOrCreateSubsidiary(name, path) {
let subsidiary = this.getSubsidiaryByName(name);
if (subsidiary == null) {
subsidiary = new A7ControllerSubsidiary(name);
this.subsidiaries.push(subsidiary);
}
if (path != null) {
subsidiary.path = path;
}
return subsidiary;
}
}
exports.A7ControllerMetadata = A7ControllerMetadata;
var A7ControllerSubsidiaryType;
(function (A7ControllerSubsidiaryType) {
A7ControllerSubsidiaryType["HANDLER"] = "HANDLER";
A7ControllerSubsidiaryType["SUB_CONTROLLER"] = "SUB_CONTROLLER";
})(A7ControllerSubsidiaryType = exports.A7ControllerSubsidiaryType || (exports.A7ControllerSubsidiaryType = {}));
class A7ControllerSubsidiary {
name;
type;
path;
middlewares = [];
method;
cls;
constructor(name) {
this.name = name;
}
get composedMiddleware() {
return (0, utils_1.compose)(this.middlewares);
}
pushMiddlewaresInFront(middlewares) {
this.middlewares = _.union(middlewares, this.middlewares);
return this;
}
pushMiddlewaresBack(middlewares) {
this.middlewares = _.union(this.middlewares, middlewares);
return this;
}
}
exports.A7ControllerSubsidiary = A7ControllerSubsidiary;
exports.METADATA_KEY = 'ark7:router:metadata';
//# sourceMappingURL=declarations.js.map