search-replace
Version:
A simple tool to help you search/replace throughout a codebase.
92 lines • 3.48 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const globby_1 = __importDefault(require("globby"));
const replace_in_file_1 = __importDefault(require("replace-in-file"));
const yargs_1 = __importDefault(require("yargs"));
const fs_1 = require("fs");
const path_1 = require("path");
const argv = yargs_1.default
.options({
d: { type: 'boolean', alias: 'dry', description: `Don't make any changes`, default: false },
r: { type: 'boolean', alias: 'rename-files', description: 'Renames files', default: false },
f: { type: 'string', alias: 'regexp-flags', description: 'Flags to pass in to regexp', default: 'g' },
w: { type: 'string', alias: 'working-dir', description: 'Working dir', default: '.' },
p: { type: 'array', alias: 'pair', description: 'The search,replace pairs', default: [] },
s: { type: 'array', alias: 'separator', description: 'Separator between search,replace', default: ',' },
})
.alias('h', 'help')
.help('help')
.usage('Usage: $0 -p foo,bar')
.showHelpOnFail(false, 'Specify --help for available options').argv;
const cwd = argv.w;
const dry = argv.d;
const pairs = argv.p;
const renameFiles = !!argv.renameFiles;
const main = async () => {
if (!pairs.length) {
console.log(`Provide at least one search/replace pair. See --help for details.`);
return;
}
const files = await globby_1.default(cwd, { gitignore: true, absolute: false });
const froms = [];
const tos = [];
pairs.forEach((pair) => {
const [fromThis, toThis] = pair.split(argv.s);
froms.push(new RegExp(fromThis, argv.f));
tos.push(toThis);
});
const options = {
files: [...files],
from: [...froms],
to: [...tos],
dry: dry || false,
};
console.log(`👀 I will search and replace!`);
console.log(`From: ${JSON.stringify(froms.map((f) => f.toString()), null, 2)}`);
console.log(`To: ${JSON.stringify(tos, null, 2)}`);
if (dry) {
console.log(`DRY RUN: I won't make any changes!`);
}
try {
const results = await replace_in_file_1.default(options);
const changes = results.filter((item) => item.hasChanged);
console.log('Changes files:', changes);
}
catch (error) {
console.error('Error occurred:', error);
}
if (renameFiles) {
const filesToRename = files
.map((file) => ({ from: file, to: file }))
.filter((file) => {
let hasMatch = false;
froms.forEach((f, idx) => {
if (f.test(file.from)) {
hasMatch = true;
file.to = file.to.replace(f, tos[idx]);
}
});
return hasMatch;
});
console.log('File renames:');
filesToRename.map(({ from, to }) => {
console.log(` ${from} => ${to}`);
if (!dry) {
const path = path_1.dirname(to);
if (!fs_1.existsSync(path)) {
console.log(`Creating path ${path}`);
fs_1.mkdirSync(path, { recursive: true });
}
fs_1.renameSync(from, to);
}
});
}
};
if (require.main === module) {
main();
}
//# sourceMappingURL=index.js.map
;