generated from DenoPlayground/Template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli.ts
54 lines (44 loc) · 1.56 KB
/
cli.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import { parseArgs } from 'https://deno.land/std@0.212.0/cli/mod.ts';
import { WalkEntry, walkSync } from 'https://deno.land/std@0.212.0/fs/mod.ts';
import { green } from 'https://deno.land/std@0.212.0/fmt/colors.ts';
import { parseString as parseRegExpString } from 'https://raw.githubusercontent.com/TypeScriptPlayground/std/main/src/regexp/mod.ts'
const args = parseArgs<{
path : string,
pattern : string,
replacer : string
}>(Deno.args);
if (!args.path || !args.pattern || !args.replacer) {
console.log('Missing arguments');
Deno.exit()
}
const pattern = parseRegExpString(args.pattern)
const entries : WalkEntry[] = []
Deno.chdir(args.path)
for (const entry of walkSync('.')) {
if (
entry.path.match(pattern) ||
(
entry.isFile &&
Deno.readTextFileSync(entry.path).match(pattern)
)
) {
entries.push(entry);
}
}
entries.forEach((entry) => {
const oldPath = entry.isDirectory ? entry.path : entry.path.replace(entry.name, '');
const newPath = oldPath.replace(pattern, args.replacer);
const oldName = entry.isFile ? entry.name : '';
const newName = oldName.replace(pattern, args.replacer);
console.log(green(oldPath + oldName), '->', green(newPath + newName));
Deno.mkdirSync(newPath, {recursive: true});
if (entry.isFile) {
Deno.copyFileSync(oldPath + oldName, newPath + newName);
const oldContent = Deno.readTextFileSync(oldPath + oldName)
Deno.writeTextFileSync(newPath + newName, oldContent.replace(pattern, args.replacer))
}
})
entries.reverse();
entries.forEach((entry) => {
Deno.removeSync(entry.path);
})