UNPKG

search-replace

Version:

A simple tool to help you search/replace throughout a codebase.

92 lines 3.48 kB
#!/usr/bin/env node "use strict"; 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