73 lines
2.1 KiB
JavaScript
73 lines
2.1 KiB
JavaScript
import { readdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
|
|
const projectName = process.argv[2];
|
|
const root = path.resolve(process.argv[3] ?? process.cwd());
|
|
|
|
if (!projectName || !/^[a-z][a-z0-9-]*$/.test(projectName)) {
|
|
console.error('用法: node scripts/apply-name.mjs <项目名> [目录]');
|
|
console.error('项目名需为小写字母开头,只含小写字母、数字和连字符');
|
|
process.exit(1);
|
|
}
|
|
|
|
const skipDirs = new Set(['node_modules', '.git', 'dist', '.react-router', 'scripts', 'doc']);
|
|
const textExtensions = new Set([
|
|
'.ts',
|
|
'.tsx',
|
|
'.js',
|
|
'.mjs',
|
|
'.cjs',
|
|
'.scss',
|
|
'.css',
|
|
'.json',
|
|
'.html',
|
|
'.svg',
|
|
]);
|
|
|
|
function replaceBqPrefix(text) {
|
|
return text.replace(/(^|[^A-Za-z0-9])bq/g, `$1${projectName}`);
|
|
}
|
|
|
|
async function rewriteFile(file) {
|
|
const text = await readFile(file, 'utf8');
|
|
const next =
|
|
path.basename(file) === 'package-lock.json'
|
|
? text.replaceAll('"name": "bq_react"', `"name": "${replaceBqPrefix('bq_react')}"`)
|
|
: replaceBqPrefix(text);
|
|
if (next !== text) await writeFile(file, next);
|
|
}
|
|
|
|
function shouldRewrite(file, inSrc) {
|
|
if (inSrc) return textExtensions.has(path.extname(file));
|
|
const base = path.basename(file);
|
|
return base === 'package.json' || base === 'package-lock.json';
|
|
}
|
|
|
|
async function processDir(dir) {
|
|
const relativeDir = path.relative(root, dir);
|
|
const inSrc = relativeDir === 'src' || relativeDir.startsWith(`src${path.sep}`);
|
|
const entries = await readdir(dir, { withFileTypes: true });
|
|
|
|
for (const entry of entries) {
|
|
if (skipDirs.has(entry.name)) continue;
|
|
const full = path.join(dir, entry.name);
|
|
if (entry.isDirectory()) {
|
|
await processDir(full);
|
|
} else if (entry.isFile() && shouldRewrite(full, inSrc)) {
|
|
await rewriteFile(full);
|
|
}
|
|
}
|
|
|
|
if (!inSrc) return;
|
|
|
|
const after = await readdir(dir, { withFileTypes: true });
|
|
for (const entry of after) {
|
|
const nextName = replaceBqPrefix(entry.name);
|
|
if (nextName === entry.name) continue;
|
|
await rename(path.join(dir, entry.name), path.join(dir, nextName));
|
|
}
|
|
}
|
|
|
|
await processDir(root);
|
|
console.log(`已将 bq 前缀替换为 ${projectName}`);
|