43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { statSync, readdirSync } from 'fs';
|
|
import { join, extname } from 'path';
|
|
|
|
function loadRoutes(dir, { filter = () => true, basePath = '' } = {}) {
|
|
let files;
|
|
const paths = [];
|
|
|
|
if (statSync(dir).isDirectory()) {
|
|
files = readdirSync(dir)
|
|
.filter(filter)
|
|
.map(file => join(dir, file));
|
|
} else {
|
|
files = [dir];
|
|
}
|
|
|
|
files.forEach(file => {
|
|
if (statSync(file).isDirectory()) {
|
|
// Recursive if directory
|
|
paths.push(...loadRoutes.call(this, file, { filter, basePath }));
|
|
} else if (extname(file) === '.js') {
|
|
const routes = require(file);
|
|
let basePaths = routes.basePath || [''];
|
|
delete routes.basePath;
|
|
if (typeof basePaths === 'string') basePaths = [basePaths];
|
|
|
|
basePaths.forEach(basep => {
|
|
for (const method in routes) {
|
|
const methodRoutes = routes[method];
|
|
for (let r in methodRoutes) {
|
|
if (!Array.isArray(methodRoutes[r])) methodRoutes[r] = [methodRoutes[r]];
|
|
this[method](basePath + basep + r, ...methodRoutes[r]);
|
|
paths.push(basePath + basep + r);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
return paths;
|
|
}
|
|
|
|
export default loadRoutes;
|