UNPKG

@dazejs/framework

Version:

Daze.js - A powerful web framework for Node.js

76 lines 4.13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Router = void 0; const container_1 = require("../../container"); const cors_1 = require("../../foundation/buildin-app/middlewares/cors"); const dispatcher_1 = require("./dispatcher"); const route_1 = require("./route"); const trie_1 = require("./trie"); const middleware_1 = require("../middleware"); const debug_1 = __importDefault(require("debug")); const utils_1 = require("../../utils"); const OPTIONAL_PARAM_REGEXP = /(\/:[^/()]*?)\?(\/?)/; const debug = (0, debug_1.default)('@dazejs/framework:router'); class Router { constructor() { this.app = container_1.Container.get('app'); this.trie = new trie_1.Trie(); this.middleware = new middleware_1.MiddlewareService(this.app); } match(request) { return this.trie.match(request); } createResolver(_matchedRoute) { return async (request) => { var _a; const method = (_a = request.getMethod()) !== null && _a !== void 0 ? _a : ''; const requestPath = request.getPath(); const metchedRoute = _matchedRoute !== null && _matchedRoute !== void 0 ? _matchedRoute : this.match(request); debug(`已匹配路由:[${method}] - [${requestPath}] - ${!!metchedRoute}`); const dispatcher = new dispatcher_1.Dispatcher(request, metchedRoute); return this.middleware .handle(request, async () => dispatcher.resolve()) .catch((err) => { throw err; }); }; } register(uri, methods, option, controller, action, middlewareOptions = []) { const optionalParamMatch = uri.match(OPTIONAL_PARAM_REGEXP); if (optionalParamMatch) { const pathFull = uri.replace(OPTIONAL_PARAM_REGEXP, '$1$2'); const pathOptional = uri.replace(OPTIONAL_PARAM_REGEXP, '$2'); this.register(pathFull, methods, option, controller, action, middlewareOptions); this.register(pathOptional, methods, option, controller, action, middlewareOptions); } this._register(uri, methods, option, controller, action, middlewareOptions); } _register(uri, methods, option, controller, action, middlewareOptions = []) { const isStereotypeController = Reflect.getMetadata('type', controller); if (isStereotypeController && typeof controller !== 'function') throw new Error('route must be register an controller!'); const finalUri = (((option === null || option === void 0 ? void 0 : option.baseUrl) !== undefined && (option === null || option === void 0 ? void 0 : option.baseUrl) !== null) ? utils_1.Str.formatPrefix(option === null || option === void 0 ? void 0 : option.baseUrl) : utils_1.Str.formatPrefix(this.app.get('config').get('app.baseUrl', ''))) + utils_1.Str.formatPrefix(uri); const route = new route_1.Route(finalUri, methods, controller, action); for (const middlewareOption of middlewareOptions) { route.registerMiddleware(middlewareOption === null || middlewareOption === void 0 ? void 0 : middlewareOption.middleware, middlewareOption === null || middlewareOption === void 0 ? void 0 : middlewareOption.args); } if (isStereotypeController && action) { const controllerCrossOrigin = Reflect.getMetadata('controllerCrossOrigin', controller); const routeCrossOrigin = Reflect.getMetadata('routeCrossOrigin', controller) || {}; if (controllerCrossOrigin) { route.addMethod('OPTIONS').registerMiddleware(cors_1.CORSMiddleware, [controllerCrossOrigin]); } else if (routeCrossOrigin[action]) { route.addMethod('OPTIONS').registerMiddleware(cors_1.CORSMiddleware, [routeCrossOrigin[action]]); } } this.trie.add(route); } } exports.Router = Router; //# sourceMappingURL=index.js.map