mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-03 10:38:03 +08:00
76 lines
2.4 KiB
TypeScript
76 lines
2.4 KiB
TypeScript
import * as fs from 'node:fs';
|
|
import * as path from 'node:path';
|
|
import { directoryImport } from 'directory-import';
|
|
|
|
const target = path.join(__dirname, '../../assets/build/maintainer.json');
|
|
const dirname = path.join(__dirname + '../../../lib/routes');
|
|
|
|
// Presence Check
|
|
for (const dir of fs.readdirSync(dirname)) {
|
|
const dirPath = path.join(dirname, dir);
|
|
if (fs.existsSync(path.join(dirPath, 'router.ts')) && !fs.existsSync(path.join(dirPath, 'maintainer.ts'))) {
|
|
throw new Error(`No maintainer.ts in "${dirPath}".`);
|
|
}
|
|
}
|
|
|
|
// 遍历整个 routes 文件夹,收集模块 maintainer.ts
|
|
// const maintainerPath = require('require-all')({
|
|
// dirname,
|
|
// filter: /maintainer\.ts$/,
|
|
// });
|
|
const imports = directoryImport({
|
|
targetDirectoryPath: dirname,
|
|
importPattern: /maintainer\.ts$/,
|
|
});
|
|
|
|
const maintainers = {};
|
|
|
|
// 将收集到的自定义模块进行合并
|
|
for (const dir in imports) {
|
|
const routes = imports[dir].default; // Do not merge other file
|
|
|
|
// typo check e.g., ✘ module.export, ✔ module.exports
|
|
if (!Object.keys(routes).length) {
|
|
throw new Error(`No maintainer in "${dir}".`);
|
|
}
|
|
for (const author of Object.values(routes)) {
|
|
if (!Array.isArray(author)) {
|
|
throw new TypeError(`Maintainers' name should be an array in "${dir}".`);
|
|
}
|
|
// check for [], [''] or ['Someone', '']
|
|
if (author.length < 1 || author.includes('')) {
|
|
throw new Error(`Empty maintainer in "${dir}".`);
|
|
}
|
|
}
|
|
|
|
for (const key in routes) {
|
|
maintainers[dir.replace('/maintainer.ts', '') + (key.endsWith('/') ? key.substring(0, key.length - 1) : key)] = routes[key];
|
|
}
|
|
}
|
|
|
|
// 兼容旧版路由
|
|
// const router = require('../../lib/router.js');
|
|
// for (const e of router.stack) {
|
|
// if (!maintainers[e.path]) {
|
|
// maintainers[e.path] = [];
|
|
// }
|
|
// }
|
|
|
|
const maintainer = Object.keys(maintainers)
|
|
.sort()
|
|
.reduce((obj, path) => {
|
|
obj[path] = maintainers[path];
|
|
return obj;
|
|
}, {});
|
|
|
|
const count = Object.keys(maintainer).length;
|
|
const uniqueMaintainer = new Set();
|
|
for (const e of Object.values(maintainer).flat()) {
|
|
uniqueMaintainer.add(e);
|
|
}
|
|
|
|
// eslint-disable-next-line no-console
|
|
console.log(`We have ${count} routes and maintained by ${uniqueMaintainer.size} contributors!`);
|
|
|
|
fs.writeFileSync(target, JSON.stringify(maintainer, null, 4));
|