@dazejs/framework
Version:
Daze.js - A powerful web framework for Node.js
76 lines • 4.13 kB
JavaScript
;
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