UNPKG

@ark7/router

Version:
149 lines (147 loc) 5.4 kB
"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