@orgiltse/service v1.0.2
import {
    Router
} from "express";
import fs from "fs";
import path from "path";
import controller from "../utils/controller";
export const requirePath = basedir => (dirpath, _routers = [], action = "", onlyRoute) => {
    try {
        let isDirectory = false;
        let ROUTE;
        const accepted = (route) => {
            return !_routers.find(router => {
                return router.path === route.path && router.method === route.method;
            });
        };
        try {
            isDirectory = fs.lstatSync(path.normalize(basedir + "/" + dirpath)).isDirectory();
        } catch (err) {
            isDirectory = false;
        }
        if (isDirectory) {
            fs.readdirSync(basedir + "/" + dirpath).forEach(file => {
                let subpath = basedir + "/" + dirpath + "/" + file;
                let filename = path.normalize(file).replace(/.^/.+$/, "");
                if (fs.lstatSync(path.normalize(subpath)).isDirectory()) {
                    if (file === "logics" || file === "interface") return; // eslint-disable-next-line no-param-reassign
                    _routers = requirePath(basedir)(path.normalize("/" + dirpath + "/" + file), _routers, action + "/" + filename);
                } else if (file.indexOf(".js.map") == -1) {
                    let obj = require(subpath);
                    Object.keys(obj).forEach(key => {
                        let model = objkey;
                        if (Array.isArray(model)) {
                            let path = model0 || action + "/" + filename, // Path
                                method = model1, // Method
                                func = model2; // Function
                            ROUTE = {
                                path: path,
                                method: method,
                                func: func
                            };
                            if (accepted(ROUTE)) _routers.push(ROUTE);
                        } else if (model) { // ONLY HTTP POST
                            ROUTE = {
                                path: action + "/" + filename,
                                method: "POST",
                                func: model
                            };
                            if (accepted(ROUTE)) _routers.push(ROUTE);
                        }
                    });
                }
            });
        } else {
            let obj = require(path.normalize(basedir + "/" + dirpath));
            Object.keys(obj).forEach(key => {
                let model = objkey;
                if (Array.isArray(model)) {
                    let path = model0 || onlyRoute, // Path
                        method = model1, // Method
                        func = model2; // Function
                    ROUTE = {
                        path: path,
                        method: method,
                        func: func
                    };
                    if (accepted(ROUTE)) _routers.push(ROUTE);
                } else if (model) { // ONLY HTTP POST
                    ROUTE = {
                        path: onlyRoute,
                        method: "POST",
                        func: model
                    };
                    if (accepted(ROUTE)) _routers.push(ROUTE);
                }
            });
        }
    } catch (err) {
        throw err;
    }
    return _routers;
};
export default (basedir, data) => {
    const router = new Router();
    const routes = (Array.isArray(data) ? data : data).reduce((accumulator, iterator) => {
        return [...accumulator, ...requirePath("")(path.join(basedir, iterator), [], "", iterator)];
    }, []);
    routes.forEach(route => {
        routerroute.method.toLowerCase()(route.path, controller(route.func));
    });
    return router;
};
5 years ago