UNPKG

mission.api

Version:
121 lines 4.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const vendor_1 = require("../vendor"); const async_response_handler_1 = require("./async-response-handler"); exports.ServiceRegistry = {}; exports.RoutesRegistry = {}; function Get(route, pre) { return Routable(route, 'GET', pre); } exports.Get = Get; function Put(route, pre) { return Routable(route, 'PUT', pre); } exports.Put = Put; function Post(route, pre) { return Routable(route, 'POST', pre); } exports.Post = Post; function Delete(route, pre) { return Routable(route, 'DELETE', pre); } exports.Delete = Delete; function Options(route, pre) { return Routable(route, 'OPTIONS', pre); } exports.Options = Options; function Head(route, pre) { return Routable(route, 'HEAD', pre); } exports.Head = Head; function Patch(route, pre) { return Routable(route, 'PATCH', pre); } exports.Patch = Patch; function Trace(route, pre) { return Routable(route, 'TRACE', pre); } exports.Trace = Trace; function Routable(route, method, pre) { return (...args) => { const len = args.length; args.push(route, method || 'POST', pre); switch (len) { case 1: return RouteClass.apply(this, args); case 3: if (typeof args[2] !== 'number') { return RouteMethod.apply(this, args); } break; default: throw new Error('Decorators are not valid here!'); } }; } exports.Routable = Routable; const mdkRoute = 'route'; const routers = vendor_1.GetRouter(); exports.ApplicationRoutes = routers; function RouteMethod(target, propertyKey, descriptor, route, method, pre) { const apiSuffix = !!route; const func = descriptor.value; const methodRoute = { path: route ? route : `/${func.name}`, method, apiSuffix, pre }; Reflect.defineMetadata(mdkRoute, methodRoute, func, func.name); } function RouteClass(target, route, method) { const basePath = route ? route : '/' + target.name; Object.getOwnPropertyNames(target) .forEach((name) => { if (typeof target[name] === 'function') { const targetFunc = target[name]; if (Reflect.hasMetadata(mdkRoute, targetFunc, name)) { const apiArg = async_response_handler_1.Wrap(targetFunc); const apiRoute = Reflect.getMetadata(mdkRoute, targetFunc, name); const m = apiRoute.path.substr(1, apiRoute.path.length - 1); target[m] = target[name]; delete targetFunc[name]; const tmpMethod = apiRoute.method.toLowerCase(); const args = [apiArg]; if (apiRoute.pre && apiRoute.pre.length > 0) { args.unshift(...apiRoute.pre); } apiRoute.apiSuffix ? getRoute(basePath, apiRoute.path)[tmpMethod](...args) : getRoute(basePath, '/')[tmpMethod](...args); // Controller Registry if (exports.ServiceRegistry[basePath]) { exports.ServiceRegistry[basePath].NameList[apiRoute.path] = apiRoute.method; } else { exports.ServiceRegistry[basePath] = { Base: basePath, GetService: () => target, NameList: { [apiRoute.path]: apiRoute.method }, }; } } } }); const router = getRouter(basePath); if (router && router.route.length > 0) { routers.use(basePath, router); } } function getRouter(path) { return exports.RoutesRegistry[path] || (exports.RoutesRegistry[path] = vendor_1.GetRouter()); } function getRoute(basePath, suffix) { const xpath = `${basePath}${suffix}`; let route = exports.RoutesRegistry[xpath]; if (!route) { const router = getRouter(basePath); route = (exports.RoutesRegistry[xpath] = router.route(suffix)); } return route; } /* Ref: https://github.com/arolson101/typescript-decorators/blob/master/Readme.md */ //# sourceMappingURL=router.decorator.js.map