UNPKG

buddha-core

Version:
226 lines (225 loc) 9.55 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadRouter = void 0; const fs_1 = require("fs"); const async_1 = require("async"); const path_1 = require("path"); const lodash_1 = require("lodash"); const chalk_1 = require("chalk"); const service_1 = require("../service"); const express_1 = __importDefault(require("express")); /**đọc toàn bộ tên file của folder */ const get_all_file_name_folder = (root_path, proceed) => { const DATA = []; /**đệ quy đọc toàn bộ tên file của folder */ const recursive = (path, proceed) => (0, async_1.eachOfLimit)( // đọc tên file của folder hiện tại (0, fs_1.readdirSync)(path), 20, (name, i, next) => { /**đường dẫn đến file hiện tại */ const CURRENT_PATH = `${path}/${name}`; // lấy thông tin của tập tin này (0, fs_1.lstat)(CURRENT_PATH, (e, r) => { if (e) return next(e); // nếu là folder thì đệ quy để lấy toàn bộ dự liệu cần thiết bên trong if (r.isDirectory()) return recursive(CURRENT_PATH, next); DATA.push({ full_path: CURRENT_PATH, // xoá bỏ các dữ liệu thừa để lấy path path: CURRENT_PATH .replace(root_path, '') .replace('.ts', '') .replace('.js', '') .replace(/index/g, ''), }); next(); }); }, proceed); // bắt đầu chạy recursive(root_path, e => e ? proceed(e) : proceed(null, DATA)); }; /**nạp các middleware vào router */ const load_middleware = (ROUTER, proceed) => { /**đường dẫn đến nơi chứa middleware */ const PATH = `${$project_dirname}/api/middleware`; const DATA = { config_middleware: {}, list_middleware: {} }; (0, async_1.waterfall)([ // * đọc code của middleware (cb) => Promise.all((0, fs_1.readdirSync)(PATH).map((n) => __awaiter(void 0, void 0, void 0, function* () { var _a; return { name: (0, service_1.get_file_name)(n), source: yield (_a = (0, path_1.join)(PATH, n), Promise.resolve().then(() => __importStar(require(_a)))) }; }))).then(n => { DATA.list_middleware = (0, lodash_1.keyBy)(n, 'name'); cb(); }), // * đọc cấu hình (cb) => { var _a; (_a = `${$project_dirname}/config/middleware`, Promise.resolve().then(() => __importStar(require(_a)))).then(r => { DATA.config_middleware = r === null || r === void 0 ? void 0 : r.default; cb(); }); }, // * thêm middleware vào router (cb) => { console.log((0, chalk_1.green) `✔ Middleware loading successfully`); (0, async_1.eachOfLimit)(DATA.config_middleware, 20, (v, k, next) => { /**code của middleware */ const LIST_HANDLE = v.map(n => (0, lodash_1.get)(DATA.list_middleware, [n, 'source', 'default'])).filter(n => n); if (!LIST_HANDLE.length) return next(); // thêm vào router ROUTER.use((0, path_1.join)('/', k), ...LIST_HANDLE); console.log((0, chalk_1.blue) `\t⇨ ${v.join(' >> ')} >> ${k}`); next(); }, cb); } ], proceed); }; /**xử lý code thành dạng chuẩn */ const handle_controller = (path, source, proceed) => { const DATA = { controller_list: [] }; (0, async_1.eachOfLimit)(source, 20, (controller, name, next) => { DATA.controller_list.push({ path: (0, path_1.join)(path, name.replace(/index/g, '')), controller }); next(); }, e => e ? proceed(e) : proceed(null, DATA.controller_list)); }; /**xử lý code ban đầu để nạp vào router */ const handle_controller_list = (input, proceed) => { const DATA = { controller_list: [] }; (0, async_1.waterfall)([ // * export const (cb) => handle_controller(input.path, input.source, (e, r) => { if (e) return cb(e); DATA.controller_list = [...DATA.controller_list, ...r]; cb(); }), // * export default (cb) => handle_controller(input.path, input.default, (e, r) => { if (e) return cb(e); DATA.controller_list = [...DATA.controller_list, ...r]; cb(); }), ], e => e ? proceed(e) : proceed(null, DATA.controller_list)); }; /**nạp toàn bộ dữ liệu của controller vào làm api */ const load_controller = (ROUTER, proceed) => { const DATA = { path_list: [], source_list: [], controller_list: [], }; (0, async_1.waterfall)([ // * đọc tên của toàn bộ các file trong controller (cb) => get_all_file_name_folder(`${$project_dirname}/api/controller`, (e, r) => { if (e) return cb(e); DATA.path_list = r; cb(); }), // * import code của các file đã đọc được (cb) => Promise.all(DATA.path_list.map((file) => __awaiter(void 0, void 0, void 0, function* () { var _a; /**code các api của file này */ const SOURCE = yield (_a = file.full_path, Promise.resolve().then(() => __importStar(require(_a)))); /**code dạng default của file */ const DEFAULT = SOURCE.default || {}; // loại bỏ code default trong source gốc delete SOURCE.default; // thêm code đọc được vào đường dẫn return Object.assign(Object.assign({}, file), { source: SOURCE, default: DEFAULT }); }))).then(r => { DATA.source_list = r; cb(); }), // * xử lý code để nạp vào router (cb) => { console.log((0, chalk_1.green) `✔ Api loading successfully`); // * xử lý source (0, async_1.eachOfLimit)(DATA.source_list, 20, (source_data, i, next) => handle_controller_list(source_data, (e, r) => { if (e) return next(e); DATA.controller_list = [...DATA.controller_list, ...r]; r.map(n => console.log((0, chalk_1.blue) `\t⇨ ${n.path}`)); next(); }), cb); }, // * nạp code vào router (cb) => (0, async_1.eachOfLimit)(DATA.controller_list, 20, (n, i, next) => { if ((0, lodash_1.isArray)(n.controller)) ROUTER.all(n.path, ...n.controller); else ROUTER.all(n.path, n.controller); next(); }, cb) ], proceed); }; /**nạp toàn bộ các xử lý api vào router */ const loadRouter = (APP, proceed) => { /**khởi tạo đối tượng router */ const ROUTER = express_1.default.Router(); (0, async_1.waterfall)([ // * nạp toàn bộ các middleware (cb) => load_middleware(ROUTER, cb), // * nạp toàn bộ các controller (cb) => load_controller(ROUTER, cb), // * nạp prefix cho router (cb) => { var _a; APP.use(`/${(_a = $env === null || $env === void 0 ? void 0 : $env.app) === null || _a === void 0 ? void 0 : _a.prefix}`, ROUTER); cb(); }, ], proceed); }; exports.loadRouter = loadRouter;