mission.api
Version:
mission api
121 lines • 4.25 kB
JavaScript
;
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