UNPKG

@mvx/mvc

Version:

@mvx/mvc is mvc framework on server, base on koa, @tsdi frameworks

1,687 lines (1,485 loc) 109 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var tslib = _interopDefault(require('tslib')); var ioc = _interopDefault(require('@tsdi/ioc')); var boot = _interopDefault(require('@tsdi/boot')); var stream = _interopDefault(require('stream')); var fs = _interopDefault(require('fs')); var path = _interopDefault(require('path')); var aop = _interopDefault(require('@tsdi/aop')); var koaJson = _interopDefault(require('koa-json')); var platformServer = _interopDefault(require('@tsdi/platform-server')); var koaBodyparser = _interopDefault(require('koa-bodyparser')); var koaLogger = _interopDefault(require('koa-logger')); var koaStatic = _interopDefault(require('koa-static')); var koaViews = _interopDefault(require('koa-views')); var koaHelmet = _interopDefault(require('koa-helmet')); var koaCompose = _interopDefault(require('koa-compose')); var https = _interopDefault(require('https')); var koa = _interopDefault(require('koa')); var core = _interopDefault(require('@tsdi/core')); var logs = _interopDefault(require('@tsdi/logs')); var platformServerBoot = _interopDefault(require('@tsdi/platform-server-boot')); var platformServerLogs = _interopDefault(require('@tsdi/platform-server-logs')); var http = _interopDefault(require('http')); var koaMount = _interopDefault(require('koa-mount')); function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var IContext = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ContextToken = void 0; /** * mvc service middleware context. */ exports.ContextToken = ioc.tokenId('MVC_SERVICE_CONTEXT'); }); unwrapExports(IContext); var IContext_1 = IContext.ContextToken; var IConfiguration = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ConfigurationToken = void 0; /** * configuration token. */ exports.ConfigurationToken = new ioc.InjectToken('MVX_Configuration'); }); unwrapExports(IConfiguration); var IConfiguration_1 = IConfiguration.ConfigurationToken; var exps = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.routeSart = void 0; exports.routeSart = /^\//; }); unwrapExports(exps); var exps_1 = exps.routeSart; var RequestMethod_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRequestMethod = exports.methodToString = exports.RequestMethod = void 0; /** * request method. */ var RequestMethod; (function (RequestMethod) { /** * Get method. */ RequestMethod[RequestMethod["Get"] = 1] = "Get"; /** * Post method. */ RequestMethod[RequestMethod["Post"] = 2] = "Post"; /** * Put method. */ RequestMethod[RequestMethod["Put"] = 3] = "Put"; /** * Delete method. */ RequestMethod[RequestMethod["Delete"] = 4] = "Delete"; /** * Options method. */ RequestMethod[RequestMethod["Options"] = 5] = "Options"; /** * Head method. */ RequestMethod[RequestMethod["Head"] = 6] = "Head"; /** * Patch method. */ RequestMethod[RequestMethod["Patch"] = 7] = "Patch"; })(RequestMethod = exports.RequestMethod || (exports.RequestMethod = {})); /** * convert method to string. * * @export * @param {RequestMethod} [method] * @returns {string} */ function methodToString(method) { if (ioc.isString(method)) { return method.toUpperCase(); } switch (method) { case RequestMethod.Get: return 'GET'; case RequestMethod.Post: return 'POST'; case RequestMethod.Put: return 'PUT'; case RequestMethod.Delete: return 'DELETE'; case RequestMethod.Options: return 'OPTIONS'; case RequestMethod.Head: return 'HEAD'; case RequestMethod.Patch: return 'PATCH'; default: return ''; } } exports.methodToString = methodToString; /** * parse string to RequestMethod * * @export * @param {string} [method] * @returns {RequestMethod} */ function parseRequestMethod(method) { method = (method || '').toUpperCase(); switch (method) { case 'GET': return RequestMethod.Get; case 'POST': return RequestMethod.Post; case 'PUT': return RequestMethod.Put; case 'DELETE': return RequestMethod.Delete; case 'OPTIONS': return RequestMethod.Options; case 'HEAD': return RequestMethod.Head; case 'PATCH': return RequestMethod.Patch; default: return null; } } exports.parseRequestMethod = parseRequestMethod; }); unwrapExports(RequestMethod_1); var RequestMethod_2 = RequestMethod_1.parseRequestMethod; var RequestMethod_3 = RequestMethod_1.methodToString; var RequestMethod_4 = RequestMethod_1.RequestMethod; var decorators = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Put = exports.Post = exports.Patch = exports.Delete = exports.Get = exports.Options = exports.Head = exports.Route = exports.createRouteDecorator = exports.Middleware = exports.Cors = exports.createCorsDecorator = exports.Controller = exports.Authorization = exports.MvcModule = void 0; /** * MvcModule Decorator, definde class as mvc module. * * @MvcModule */ exports.MvcModule = boot.createDIModuleDecorator('MvcModule', null, function (metadata) { // static main. if (ioc.isClass(metadata.type) && ioc.isFunction(metadata.type['main'])) { setTimeout(function () { metadata.type['main'](metadata); }, 100); } return metadata; }); /** * Authorization decorator, define class or method need auth check. * * @Authorization */ exports.Authorization = ioc.createClassMethodDecorator('Authorization', [ function (ctx, next) { var arg = ctx.currArg; if (ioc.isArray(arg)) { ctx.metadata.middlewares = arg; ctx.next(next); } else { ctx.metadata.role = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isString(arg)) { ctx.metadata.role = arg; } } ]); /** * Controller decorator, define the class as mvc controller. * @Controller */ exports.Controller = ioc.createClassDecorator('Controller', [ function (ctx, next) { var arg = ctx.currArg; if (ioc.isString(arg)) { ctx.metadata.routePrefix = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isArray(arg)) { ctx.metadata.middlewares = arg; ctx.next(next); } else { ctx.next(next, false); } } ], function (meta) { if (!exps.routeSart.test(meta.routePrefix)) { meta.routePrefix = '/' + meta.routePrefix; } }, true); /** * Cors Decorator, define controller class or controller method support cors. * @Cors * @param name * @param actions * @param metadataExtends */ function createCorsDecorator(name, actions, metadataExtends) { return ioc.createClassMethodDecorator(name, tslib.__spreadArrays((actions || []), [ function (ctx, next) { var arg = ctx.currArg; if (ioc.isString(arg)) { ctx.metadata.allowMethods = arg; ctx.next(next); } else if (ioc.isArray(arg)) { var allowMethods = arg; ctx.metadata.allowMethods = allowMethods.filter(function (m) { return !ioc.isUndefined(m) && m !== null; }); ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isNumber(arg)) { ctx.metadata.maxAge = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isArray(arg)) { var allowHeaders = arg; ctx.metadata.allowHeaders = allowHeaders.filter(function (h) { return !!h; }); ctx.next(next); } } ]), metadataExtends); } exports.createCorsDecorator = createCorsDecorator; /** * Cors Decorator, define controller class or controller method support cors. * @Cors */ exports.Cors = createCorsDecorator('Cors'); /** * Middleware Decorator, definde class as mvc middleware. * * @Middleware */ exports.Middleware = ioc.createClassDecorator('Middleware', null, function (metadata) { metadata.singleton = true; if (metadata.name) { metadata.provide = metadata.name; } if (!metadata.scope) { metadata.scope = 'global'; } }); /** * create route decorator. * * @export * @template T * @param {RequestMethod} [method] * @param { MetadataExtends<T>} [metaExtends] */ function createRouteDecorator(method, actions, metaExtends) { return ioc.createMethodDecorator('Route', tslib.__spreadArrays((actions || []), [ function (ctx, next) { var arg = ctx.currArg; if (ioc.isString(arg)) { ctx.metadata.route = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isArray(arg)) { ctx.metadata.middlewares = arg; ctx.next(next); } else if (ioc.isString(arg)) { ctx.metadata.contentType = arg; ctx.next(next); } else if (ioc.isNumber(arg)) { ctx.metadata.method = arg; } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isNumber(arg)) { ctx.metadata.method = arg; } else { ctx.metadata.contentType = arg; ctx.next(next); } }, function (ctx, next) { var arg = ctx.currArg; if (ioc.isNumber(arg)) { ctx.metadata.method = arg; } } ]), function (metadata) { if (metaExtends) { metaExtends(metadata); } if (!exps.routeSart.test(metadata.route)) { metadata.route = '/' + metadata.route; } if (method) { metadata.method = method; } else if (!metadata.method) { metadata.method = RequestMethod_1.RequestMethod.Get; } return metadata; }); } exports.createRouteDecorator = createRouteDecorator; /** * route decorator. define the controller method as an route. * * @Route */ exports.Route = createRouteDecorator(); /** * Head decorator. define the route method as head. * * @Head */ exports.Head = createRouteDecorator(RequestMethod_1.RequestMethod.Head); /** * Options decorator. define the route method as an options. * * @Options */ exports.Options = createRouteDecorator(RequestMethod_1.RequestMethod.Options); /** * Get decorator. define the route method as get. * * @Get */ exports.Get = createRouteDecorator(RequestMethod_1.RequestMethod.Get); /** * Delete decorator. define the route method as delete. * * @Delete */ exports.Delete = createRouteDecorator(RequestMethod_1.RequestMethod.Delete); /** * Patch decorator. define the route method as patch. * * @Patch */ exports.Patch = createRouteDecorator(RequestMethod_1.RequestMethod.Patch); /** * Post decorator. define the route method as post. * * @Post */ exports.Post = createRouteDecorator(RequestMethod_1.RequestMethod.Post); /** * Put decorator. define the route method as put. * * @Put */ exports.Put = createRouteDecorator(RequestMethod_1.RequestMethod.Put); }); unwrapExports(decorators); var decorators_1 = decorators.Put; var decorators_2 = decorators.Post; var decorators_3 = decorators.Patch; var decorators_4 = decorators.Delete; var decorators_5 = decorators.Get; var decorators_6 = decorators.Options; var decorators_7 = decorators.Head; var decorators_8 = decorators.Route; var decorators_9 = decorators.createRouteDecorator; var decorators_10 = decorators.Middleware; var decorators_11 = decorators.Cors; var decorators_12 = decorators.createCorsDecorator; var decorators_13 = decorators.Controller; var decorators_14 = decorators.Authorization; var decorators_15 = decorators.MvcModule; var HttpError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.HttpError = void 0; /** * http error * * @export * @class HttpError * @extends {Error} */ var HttpError = /** @class */ (function (_super) { tslib.__extends(HttpError, _super); function HttpError(status, message) { var _this = _super.call(this) || this; _this.status = status; _this.message = ioc.isArray(message) ? message.join('\n') : message; Error.captureStackTrace(_this); return _this; } HttpError.prototype.toString = function () { return "Http Error: " + this.status + ", " + this.message; }; HttpError.ρAnn = function () { return { "name": "HttpError" }; }; return HttpError; }(Error)); exports.HttpError = HttpError; }); unwrapExports(HttpError_1); var HttpError_2 = HttpError_1.HttpError; var BadRequestError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.BadRequestError = void 0; /** * bad request error. * * @export * @class BadRequestError * @extends {HttpError} */ var BadRequestError = /** @class */ (function (_super) { tslib.__extends(BadRequestError, _super); function BadRequestError(message) { if (message === void 0) { message = 'Bad Request'; } return _super.call(this, 400, message) || this; } BadRequestError.ρAnn = function () { return { "name": "BadRequestError" }; }; return BadRequestError; }(HttpError_1.HttpError)); exports.BadRequestError = BadRequestError; }); unwrapExports(BadRequestError_1); var BadRequestError_2 = BadRequestError_1.BadRequestError; var ForbiddenError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ForbiddenError = void 0; /** * forbidden error. * * @export * @class ForbiddenError * @extends {HttpError} */ var ForbiddenError = /** @class */ (function (_super) { tslib.__extends(ForbiddenError, _super); function ForbiddenError(message) { if (message === void 0) { message = 'Request Forbidden'; } return _super.call(this, 403, message) || this; } ForbiddenError.ρAnn = function () { return { "name": "ForbiddenError" }; }; return ForbiddenError; }(HttpError_1.HttpError)); exports.ForbiddenError = ForbiddenError; }); unwrapExports(ForbiddenError_1); var ForbiddenError_2 = ForbiddenError_1.ForbiddenError; var InternalServerError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.InternalServerError = void 0; /** * internal server error. * * @export * @class InternalServerError * @extends {HttpError} */ var InternalServerError = /** @class */ (function (_super) { tslib.__extends(InternalServerError, _super); function InternalServerError(message) { if (message === void 0) { message = 'Internal Server Error'; } return _super.call(this, 500, message) || this; } InternalServerError.ρAnn = function () { return { "name": "InternalServerError" }; }; return InternalServerError; }(HttpError_1.HttpError)); exports.InternalServerError = InternalServerError; }); unwrapExports(InternalServerError_1); var InternalServerError_2 = InternalServerError_1.InternalServerError; var MethodNotAllowedError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MethodNotAllowedError = void 0; /** * method not allowed error. * * @export * @class MethodNotAllowedError * @extends {HttpError} */ var MethodNotAllowedError = /** @class */ (function (_super) { tslib.__extends(MethodNotAllowedError, _super); function MethodNotAllowedError(message) { if (message === void 0) { message = 'Method Not Allowed'; } return _super.call(this, 405, message) || this; } MethodNotAllowedError.ρAnn = function () { return { "name": "MethodNotAllowedError" }; }; return MethodNotAllowedError; }(HttpError_1.HttpError)); exports.MethodNotAllowedError = MethodNotAllowedError; }); unwrapExports(MethodNotAllowedError_1); var MethodNotAllowedError_2 = MethodNotAllowedError_1.MethodNotAllowedError; var NotAcceptableError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.NotAcceptableError = void 0; /** * not acceptable error. * * @export * @class NotAcceptableError * @extends {HttpError} */ var NotAcceptableError = /** @class */ (function (_super) { tslib.__extends(NotAcceptableError, _super); function NotAcceptableError(message) { if (message === void 0) { message = 'Not Acceptable'; } return _super.call(this, 406, message) || this; } NotAcceptableError.ρAnn = function () { return { "name": "NotAcceptableError" }; }; return NotAcceptableError; }(HttpError_1.HttpError)); exports.NotAcceptableError = NotAcceptableError; }); unwrapExports(NotAcceptableError_1); var NotAcceptableError_2 = NotAcceptableError_1.NotAcceptableError; var NotFoundError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.NotFoundError = void 0; /** * not found error. * * @export * @class NotFoundError * @extends {HttpError} */ var NotFoundError = /** @class */ (function (_super) { tslib.__extends(NotFoundError, _super); function NotFoundError(message) { if (message === void 0) { message = 'Not Found'; } return _super.call(this, 404, message) || this; } NotFoundError.ρAnn = function () { return { "name": "NotFoundError" }; }; return NotFoundError; }(HttpError_1.HttpError)); exports.NotFoundError = NotFoundError; }); unwrapExports(NotFoundError_1); var NotFoundError_2 = NotFoundError_1.NotFoundError; var UnauthorizedError_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.UnauthorizedError = void 0; /** * unauthorized error. * * @export * @class UnauthorizedError * @extends {HttpError} */ var UnauthorizedError = /** @class */ (function (_super) { tslib.__extends(UnauthorizedError, _super); function UnauthorizedError(message) { if (message === void 0) { message = 'Unauthorized'; } return _super.call(this, 401, message) || this; } UnauthorizedError.ρAnn = function () { return { "name": "UnauthorizedError" }; }; return UnauthorizedError; }(HttpError_1.HttpError)); exports.UnauthorizedError = UnauthorizedError; }); unwrapExports(UnauthorizedError_1); var UnauthorizedError_2 = UnauthorizedError_1.UnauthorizedError; var errors = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); tslib.__exportStar(HttpError_1, exports); tslib.__exportStar(BadRequestError_1, exports); tslib.__exportStar(ForbiddenError_1, exports); tslib.__exportStar(InternalServerError_1, exports); tslib.__exportStar(MethodNotAllowedError_1, exports); tslib.__exportStar(NotAcceptableError_1, exports); tslib.__exportStar(NotFoundError_1, exports); tslib.__exportStar(UnauthorizedError_1, exports); }); unwrapExports(errors); var metadata = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); }); unwrapExports(metadata); var IMiddleware = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MiddlewareTypes = exports.bindMiddlewareName = exports.isMiddlewareFunc = void 0; /** * middlware check. * * @export * @template T * @param {*} target * @returns {target is MiddlewareFunc} */ function isMiddlewareFunc(target) { return ioc.isFunction(target) && ioc.isString(target.middleName); } exports.isMiddlewareFunc = isMiddlewareFunc; /** * bind middleware name. * * @export * @param {Function} middleware * @param {string} name * @returns {MiddlewareFunc} */ function bindMiddlewareName(middleware, name) { var middle = middleware; middle.middleName = name; return middle; } exports.bindMiddlewareName = bindMiddlewareName; /** * default middleware types. * * @export * @enum {number} */ var MiddlewareTypes; (function (MiddlewareTypes) { MiddlewareTypes["Helmet"] = "helmet"; MiddlewareTypes["BodyParser"] = "bodyParser"; MiddlewareTypes["Cors"] = "Cors"; MiddlewareTypes["Csrf"] = "Csrf"; MiddlewareTypes["Json"] = "json"; MiddlewareTypes["Logger"] = "logger"; MiddlewareTypes["Session"] = "session"; MiddlewareTypes["Content"] = "content"; MiddlewareTypes["View"] = "view"; MiddlewareTypes["Router"] = "router"; })(MiddlewareTypes = exports.MiddlewareTypes || (exports.MiddlewareTypes = {})); }); unwrapExports(IMiddleware); var IMiddleware_1 = IMiddleware.MiddlewareTypes; var IMiddleware_2 = IMiddleware.bindMiddlewareName; var IMiddleware_3 = IMiddleware.isMiddlewareFunc; var MvcMiddleware_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.CompositeMiddleware = exports.MvcMiddleware = void 0; /** * middleware * * @export * @abstract * @class Middleware * @extends {Handle<MvcContext>} * @implements {IMiddleware} */ var MvcMiddleware = /** @class */ (function (_super) { tslib.__extends(MvcMiddleware, _super); function MvcMiddleware() { return _super !== null && _super.apply(this, arguments) || this; } /** * get injector of current message queue. */ MvcMiddleware.prototype.getInjector = function () { return this._injector(); }; MvcMiddleware.ρAnn = function () { return { "name": "MvcMiddleware" }; }; tslib.__decorate([ ioc.Inject(ioc.InjectorProxyToken), tslib.__metadata("design:type", Function) ], MvcMiddleware.prototype, "_injector", void 0); return MvcMiddleware; }(boot.Handle)); exports.MvcMiddleware = MvcMiddleware; /** * composite middleware. * * @export * @class CompositeMiddleware * @extends {Handles<IContext>} */ var CompositeMiddleware = /** @class */ (function (_super) { tslib.__extends(CompositeMiddleware, _super); function CompositeMiddleware() { return _super !== null && _super.apply(this, arguments) || this; } /** * get injector of current message queue. */ CompositeMiddleware.prototype.getInjector = function () { return this._injector(); }; CompositeMiddleware.prototype.find = function (filter) { return this.handles.find(function (item) { return filter(item); }); }; /** * use handle before * * @param {HandleType} handle * @param {HandleType} [before] * @returns {this} * @memberof LifeScope */ CompositeMiddleware.prototype.useBefore = function (handle, before) { if (ioc.isString(before)) { var beforehdl = this.find(function (h) { return h.middleName === before; }); _super.prototype.useBefore.call(this, handle, beforehdl); } else { _super.prototype.useBefore.call(this, handle, before); } return this; }; /** * use handle after. * * @param {HandleType} handle * @param {HandleType} [after] * @returns {this} * @memberof LifeScope */ CompositeMiddleware.prototype.useAfter = function (handle, after) { if (ioc.isString(after)) { var afterhdl = this.find(function (h) { return h.middleName === after; }); _super.prototype.useAfter.call(this, handle, afterhdl); } else { _super.prototype.useAfter.call(this, handle, after); } return this; }; CompositeMiddleware.prototype.registerHandle = function (HandleType) { if (ioc.isClass(HandleType)) { this.getInjector().registerType(HandleType); } return this; }; CompositeMiddleware.prototype.toHandle = function (handleType) { var _a, _b, _c, _d; if (handleType instanceof ioc.Action) { return handleType.toAction(); } else if (ioc.isClass(handleType)) { var ist = (_a = this.getInjector().get(handleType)) !== null && _a !== void 0 ? _a : this.getInjector().getContainer().getTypeReflects().getInjector(handleType).getInstance(handleType); return (_b = ist === null || ist === void 0 ? void 0 : ist.toAction) === null || _b === void 0 ? void 0 : _b.call(ist); } else if (ioc.isToken(handleType)) { return (_d = (_c = this.getInjector().get(handleType)) === null || _c === void 0 ? void 0 : _c.toAction) === null || _d === void 0 ? void 0 : _d.call(_c); } else if (ioc.isFunction(handleType)) { return handleType; } return null; }; CompositeMiddleware.ρAnn = function () { return { "name": "CompositeMiddleware", "params": { "find": ["filter"], "useBefore": ["handle", "before"], "useAfter": ["handle", "after"], "registerHandle": ["HandleType"], "toHandle": ["handleType"] } }; }; tslib.__decorate([ ioc.Inject(ioc.InjectorProxyToken), tslib.__metadata("design:type", Function) ], CompositeMiddleware.prototype, "_injector", void 0); CompositeMiddleware = tslib.__decorate([ ioc.Injectable() ], CompositeMiddleware); return CompositeMiddleware; }(boot.Handles)); exports.CompositeMiddleware = CompositeMiddleware; }); unwrapExports(MvcMiddleware_1); var MvcMiddleware_2 = MvcMiddleware_1.CompositeMiddleware; var MvcMiddleware_3 = MvcMiddleware_1.MvcMiddleware; var MvcMiddlewares_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MvcMiddlewares = void 0; /** * mvc middlewares. * * @export * @class MvcMiddlewares * @extends {CompositeMiddleware} */ var MvcMiddlewares = /** @class */ (function (_super) { tslib.__extends(MvcMiddlewares, _super); function MvcMiddlewares() { return _super !== null && _super.apply(this, arguments) || this; } /** * setup root in koa. * * @param {MvcContext} mvcContext * @memberof MvcMiddlewares */ MvcMiddlewares.prototype.setup = function (mvcContext) { var _this = this; mvcContext.getKoa().use(function (ctx, next) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: ctx.mvcContext = mvcContext; if (!ctx.getInjector) { ctx.getInjector = function () { return mvcContext.injector; }; } mvcContext.app = ctx.app; return [4 /*yield*/, this.execute(ctx)]; case 1: _a.sent(); return [4 /*yield*/, next()]; case 2: return [2 /*return*/, _a.sent()]; } }); }); }); }; MvcMiddlewares.ρAnn = function () { return { "name": "MvcMiddlewares", "params": { "setup": ["mvcContext"] } }; }; MvcMiddlewares.ρNPT = true; MvcMiddlewares = tslib.__decorate([ ioc.Singleton() ], MvcMiddlewares); return MvcMiddlewares; }(MvcMiddleware_1.CompositeMiddleware)); exports.MvcMiddlewares = MvcMiddlewares; }); unwrapExports(MvcMiddlewares_1); var MvcMiddlewares_2 = MvcMiddlewares_1.MvcMiddlewares; var MiddlewareRegister_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MiddlewareRegister = void 0; /** * middleware register. * * @export * @class MiddlewareRegister */ var MiddlewareRegister = /** @class */ (function () { function MiddlewareRegister() { this.map = new Map(); } MiddlewareRegister.prototype.set = function (key, val) { this.map.set(key, val); }; /** * setup middleware. * * @param {ICoreInjector} injector * @memberof MiddlewareRegister */ MiddlewareRegister.prototype.setup = function (injector) { this.map.forEach(function (meta, middle) { var middlewares = injector.getInstance(MvcMiddlewares_1.MvcMiddlewares); if (meta.regIn) { var comp = meta.regIn; if (!injector.has(comp)) { injector.register(comp); } middlewares = injector.get(comp); } if (meta.before) { middlewares.useBefore(middle, meta.before); } else if (meta.after) { middlewares.useAfter(middle, meta.after); } else { middlewares.use(middle); } }); }; MiddlewareRegister.ρAnn = function () { return { "name": "MiddlewareRegister", "params": { "set": ["key", "val"], "setup": ["injector"] } }; }; MiddlewareRegister.ρNPT = true; tslib.__decorate([ tslib.__param(0, ioc.Inject(ioc.INJECTOR)), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [Object]), tslib.__metadata("design:returntype", void 0) ], MiddlewareRegister.prototype, "setup", null); MiddlewareRegister = tslib.__decorate([ ioc.Singleton(), tslib.__metadata("design:paramtypes", []) ], MiddlewareRegister); return MiddlewareRegister; }()); exports.MiddlewareRegister = MiddlewareRegister; }); unwrapExports(MiddlewareRegister_1); var MiddlewareRegister_2 = MiddlewareRegister_1.MiddlewareRegister; var ResultValue_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ResultValue = void 0; /** * controller method return result type. * * @export * @abstract * @class ResultValue */ var ResultValue = /** @class */ (function () { function ResultValue(contentType) { this.contentType = contentType; } ResultValue.ρAnn = function () { return { "name": "ResultValue" }; }; return ResultValue; }()); exports.ResultValue = ResultValue; }); unwrapExports(ResultValue_1); var ResultValue_2 = ResultValue_1.ResultValue; var FileResult_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.FileResult = void 0; /** * controller method return result type of file. * * @export * @class FileResult */ var FileResult = /** @class */ (function (_super) { tslib.__extends(FileResult, _super); function FileResult(file, options) { var _this = _super.call(this, (options === null || options === void 0 ? void 0 : options.contentType) || 'application/octet-stream') || this; _this.file = file; _this.options = options; return _this; } FileResult.prototype.sendValue = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { var file, confige, filepath; return tslib.__generator(this, function (_a) { file = this.file; ctx.type = this.contentType; if (this.options && this.options.filename) { ctx.attachment(this.options.filename, this.options.disposition); } confige = ctx.mvcContext.getConfiguration(); if (ioc.isString(file)) { filepath = (path.isAbsolute(file) || !confige.baseURL) ? file : path.join(confige.baseURL, file); if (fs.existsSync(filepath)) { ctx.body = fs.createReadStream(filepath); } } else if (file instanceof Buffer) { ctx.body = file; } else if (file instanceof stream.Stream) { ctx.body = file; } return [2 /*return*/]; }); }); }; FileResult.ρAnn = function () { return { "name": "FileResult" }; }; return FileResult; }(ResultValue_1.ResultValue)); exports.FileResult = FileResult; }); unwrapExports(FileResult_1); var FileResult_2 = FileResult_1.FileResult; var JsonResult_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonResult = void 0; /** * controller method return result type of json. * context type 'application/json' * * @export * @class JsonResult */ var JsonResult = /** @class */ (function (_super) { tslib.__extends(JsonResult, _super); function JsonResult(data) { var _this = _super.call(this, 'application/json') || this; _this.data = data; return _this; } JsonResult.prototype.sendValue = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { ctx.type = this.contentType; ctx.body = this.data || {}; return [2 /*return*/]; }); }); }; JsonResult.ρAnn = function () { return { "name": "JsonResult" }; }; return JsonResult; }(ResultValue_1.ResultValue)); exports.JsonResult = JsonResult; }); unwrapExports(JsonResult_1); var JsonResult_2 = JsonResult_1.JsonResult; var RedirectResult_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.RedirectResult = void 0; /** * redirect url * * @export * @class RedirectResult * @extends {ResultValue} */ var RedirectResult = /** @class */ (function (_super) { tslib.__extends(RedirectResult, _super); function RedirectResult(url, alt) { var _this = _super.call(this, 'text/html') || this; _this.url = url; _this.alt = alt; return _this; } RedirectResult.prototype.sendValue = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, ctx.redirect(this.url, this.alt)]; }); }); }; RedirectResult.ρAnn = function () { return { "name": "RedirectResult" }; }; return RedirectResult; }(ResultValue_1.ResultValue)); exports.RedirectResult = RedirectResult; }); unwrapExports(RedirectResult_1); var RedirectResult_2 = RedirectResult_1.RedirectResult; var ViewResult_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ViewResult = void 0; /** * controller method return result type of view. * context type 'text/html' * * @export * @class ViewResult */ var ViewResult = /** @class */ (function (_super) { tslib.__extends(ViewResult, _super); function ViewResult(name, model) { var _this = _super.call(this, 'text/html') || this; _this.name = name; _this.model = model; return _this; } ViewResult.prototype.sendValue = function (ctx) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { if (!ctx.render) { return [2 /*return*/, Promise.reject('view engin middleware no configed!')]; } else { ctx.type = this.contentType; return [2 /*return*/, ctx.render(this.name, this.model)]; } }); }); }; ViewResult.ρAnn = function () { return { "name": "ViewResult" }; }; return ViewResult; }(ResultValue_1.ResultValue)); exports.ViewResult = ViewResult; }); unwrapExports(ViewResult_1); var ViewResult_2 = ViewResult_1.ViewResult; var RouteChecker_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.RouteChecker = void 0; var urlReg = /\/((\w|%|\.))+\.\w+$/; var noParms = /\/\s*$/; var hasParms = /\?\S*$/; var subStart = /^\s*\/|\?/; var RouteChecker = /** @class */ (function (_super) { tslib.__extends(RouteChecker, _super); function RouteChecker() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.assertUrlRegExp = urlReg; return _this; } RouteChecker.prototype.isRoute = function (ctxUrl) { return !this.assertUrlRegExp.test(ctxUrl); }; RouteChecker.prototype.getReqRoute = function (ctx) { var reqUrl = this.vaildify(ctx.url, true); var config = ctx.mvcContext.getConfiguration(); if (config.routePrefix) { return reqUrl.replace(config.routePrefix, ''); } return reqUrl; }; RouteChecker.prototype.vaildify = function (routePath, foreNull) { if (foreNull === void 0) { foreNull = false; } if (foreNull && routePath === '/') { routePath = ''; } if (noParms.test(routePath)) { routePath = routePath.substring(0, routePath.lastIndexOf('/')); } if (hasParms.test(routePath)) { routePath = routePath.substring(0, routePath.lastIndexOf('?')); } return routePath; }; RouteChecker.prototype.isActiveRoute = function (ctx, route) { var routeUrl = this.getReqRoute(ctx); if (route === '' || route === routeUrl) { return true; } return routeUrl.startsWith(route) && subStart.test(routeUrl.substring(route.length)); }; RouteChecker.ρAnn = function () { return { "name": "RouteChecker", "params": { "isRoute": ["ctxUrl"], "getReqRoute": ["ctx"], "vaildify": ["routePath", "foreNull"], "isActiveRoute": ["ctx", "route"] } }; }; RouteChecker = tslib.__decorate([ ioc.Singleton() ], RouteChecker); return RouteChecker; }(ioc.IocCoreService)); exports.RouteChecker = RouteChecker; }); unwrapExports(RouteChecker_1); var RouteChecker_2 = RouteChecker_1.RouteChecker; var Route = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MvcRoute = exports.RouteUrlArgToken = void 0; exports.RouteUrlArgToken = ioc.tokenId('route_url'); var MvcRoute = /** @class */ (function (_super) { tslib.__extends(MvcRoute, _super); function MvcRoute(url) { var _this = _super.call(this) || this; if (url) { _this.metaUrl = url; } return _this; } Object.defineProperty(MvcRoute.prototype, "url", { get: function () { if (!this._url) { this._url = this.vaildify(this.metaUrl, true); } return this._url; }, set: function (val) { this._url = val; }, enumerable: false, configurable: true }); MvcRoute.prototype.getChecker = function () { if (!this.checker) { this.checker = this.getInjector().get(RouteChecker_1.RouteChecker); } return this.checker; }; MvcRoute.prototype.getReqRoute = function (ctx) { return this.getChecker().getReqRoute(ctx); }; MvcRoute.prototype.vaildify = function (routePath, foreNull) { if (foreNull === void 0) { foreNull = false; } return this.getChecker().vaildify(routePath, foreNull); }; MvcRoute.prototype.match = function (ctx) { if (ctx.status && ctx.status !== 404) { return false; } return this.getChecker().isActiveRoute(ctx, this.url); }; MvcRoute.prototype.execute = function (ctx, next) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (!this.match(ctx)) return [3 /*break*/, 2]; return [4 /*yield*/, this.navigate(ctx, next)]; case 1: _a.sent(); return [3 /*break*/, 4]; case 2: return [4 /*yield*/, next()]; case 3: return [2 /*return*/, _a.sent()]; case 4: return [2 /*return*/]; } }); }); }; MvcRoute.prototype.toHandle = function (handleType) { var _a, _b, _c, _d; if (handleType instanceof ioc.Action) { return handleType.toAction(); } else if (ioc.isClass(handleType)) { var ist = (_a = this.getInjector().get(handleType)) !== null && _a !== void 0 ? _a : this.getInjector().getContainer().getTypeReflects().getInjector(handleType).getInstance(handleType); return (_b = ist === null || ist === void 0 ? void 0 : ist.toAction) === null || _b === void 0 ? void 0 : _b.call(ist); } else if (ioc.isToken(handleType)) { return (_d = (_c = this.getInjector().get(handleType)) === null || _c === void 0 ? void 0 : _c.toAction) === null || _d === void 0 ? void 0 : _d.call(_c); } else if (ioc.isFunction(handleType)) { return handleType; } return null; }; MvcRoute.ρAnn = function () { return { "name": "MvcRoute", "params": { "constructor": ["url"], "getReqRoute": ["ctx"], "vaildify": ["routePath", "foreNull"], "match": ["ctx"], "execute": ["ctx", "next"], "navigate": ["ctx", "next"], "toHandle": ["handleType"] } }; }; MvcRoute.ρNPT = true; MvcRoute = tslib.__decorate([ ioc.Abstract(), tslib.__metadata("design:paramtypes", [String]) ], MvcRoute); return MvcRoute; }(MvcMiddleware_1.MvcMiddleware)); exports.MvcRoute = MvcRoute; }); unwrapExports(Route); var Route_1 = Route.MvcRoute; var Route_2 = Route.RouteUrlArgToken; var Router_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Router = void 0; var Router = /** @class */ (function (_super) { tslib.__extends(Router, _super); function Router() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.sorted = false; return _this; } Router.prototype.vaild = function (ctx) { return (!ctx.status || ctx.status === 404) && this.isRouteUrl(ctx.url); }; Router.prototype.execute = function (ctx, next) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (!this.sorted) { this.handles = this.handles.sort(function (a, b) { if (a instanceof Route.MvcRoute && b instanceof Route.MvcRoute) { return (b.url || '').length - (a.url || '').length; } return -1; }); this.resetFuncs(); this.sorted = true; } return [4 /*yield*/, _super.prototype.execute.call(this, ctx)]; case 1: _a.sent(); if (!next) return [3 /*break*/, 3]; return [4 /*yield*/, next()]; case 2: return [2 /*return*/, _a.sent()]; case 3: return [2 /*return*/]; } }); }); }; Router.prototype.getChecker = function () { return this.getInjector().get(RouteChecker_1.RouteChecker); }; Router.prototype.isRouteUrl = function (route) { return this.getChecker().isRoute(route); }; Router.prototype.routes = function () { var _this = this; var routes = []; for (var _i = 0; _i < arguments.length; _i++) { routes[_i] = arguments[_i]; } routes.forEach(function (r) { return _this.use(r); }); this.sorted = false; return this; }; Router.ρAnn = function () { return { "name": "Router", "params": { "vaild": ["ctx"], "execute": ["ctx", "next"], "isRouteUrl": ["route"], "routes": ["routes"] } }; }; Router.ρNPT = true; Router = tslib.__decorate([ ioc.Singleton() ], Router); return Router; }(MvcMiddleware_1.CompositeMiddleware)); exports.Router = Router; }); unwrapExports(Router_1); var Router_2 = Router_1.Router; var AuthorizationService_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.AuthorizationService = void 0; var AuthorizationService = /** @class */ (function () { function AuthorizationService() { } AuthorizationService.ρAnn = function () { return { "name": "AuthorizationService", "params": { "getAuthMiddlewares": ["ctx", "controller", "propertyKey"] } }; }; AuthorizationService = tslib.__decorate([ ioc.Abstract() ], AuthorizationService); return AuthorizationService; }()); exports.AuthorizationService = AuthorizationService; }); unwrapExports(AuthorizationService_1); var AuthorizationService_2 = AuthorizationService_1.AuthorizationService; /*! * vary * Copyright(c) 2014-2017 Douglas Christopher Wilson * MIT Licensed */ /** * Module exports. */ var vary_1 = vary; var append_1 = append; /** * RegExp to match field-name in RFC 7230 sec 3.2 * * field-name = token * token = 1*tchar * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" * / DIGIT / ALPHA * ; any VCHAR, except delimiters */ var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/; /** * Append a field to a vary header. * * @param {String} header * @param {String|Array} field * @return {String} * @public */ function append (header, field) { if (typeof header !== 'string') { throw new TypeError('header argument is required') } if (!field) { throw new TypeError('field argument is required') } // get fields array var fields = !Array.isArray(field) ? parse(String(field)) : field; // assert on invalid field names for (var j = 0; j < fields.length; j++) { if (!FIELD_NAME_REGEXP.test(fields[j])) { throw new TypeError('field argument contains an invalid header name') } } // existing, unspecified vary if (header === '*') { return header } // enumerate current values var val = header; var vals = parse(header.toLowerCase()); // unspecified vary if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { return '*' } for (var i = 0; i < fields.length; i++) { var fld = fields[i].toLowerCase(); // append value (case-preserving) if (vals.indexOf(fld) === -1) { vals.push(fld); val = val ? val + ', ' + fields[i] : fields[i]; } } return val } /** * Parse a vary header into an array. * * @param {String} header * @return {Array} * @private */ function parse (header) { var end = 0; var list = []; var start = 0; // gather tokens for (var i = 0, len = header.length; i < len; i++) { switch (header.charCodeAt(i)) { case 0x20: /* */ if (start === end) { start = end = i + 1; } break case 0x2c: /* , */ list.push(header.substring(start, end)); start = end = i + 1; break default: end = i + 1; break } } // final token list.push(header.substring(start, end)); return list } /** * Mark that a request is varied on a header field. * * @param {Object} res * @param {String|Array} field * @public */ function vary (res, field) { if (!res || !res.getHeader || !res.setHeader) { // quack quack throw new TypeError('res argument is required') } // get existing header var val = res.getHeader('Vary') || ''; var header = Array.isArray(val) ? val.join(', ') : String(val); // set new header if ((val = append(header, field))) { res.setHeader('Vary', val); } } vary_1.append = append_1; var ControllerRoute_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ControllerRoute = exports.RouteControllerMiddlewar