|
1 | 1 | #! /usr/bin/env node
|
2 | 2 |
|
| 3 | +import { cwd } from "node:process"; |
3 | 4 | import { createRequire } from "node:module";
|
4 | 5 | import { spawn } from "node:child_process";
|
5 | 6 | import { program } from "commander";
|
6 | 7 |
|
7 |
| -function run(regex: RegExp, { version }: { version: string }) { |
8 |
| - const require = createRequire(`${process.cwd()}/`); |
| 8 | +function run( |
| 9 | + dependencyNameRegex: RegExp, |
| 10 | + { dependencyVersion, dryRun }: { dependencyVersion: string; dryRun: boolean } |
| 11 | +) { |
| 12 | + const require = createRequire(`${cwd()}/`); |
9 | 13 | const pkg = require("./package.json");
|
10 | 14 |
|
11 | 15 | const dependencies = Object.keys(pkg.dependencies || {})
|
12 | 16 | .concat(Object.keys(pkg.devDependencies || {}))
|
13 |
| - .filter((dependency) => regex.test(dependency)) |
14 |
| - .map((dependency) => `${dependency}@${version}`); |
| 17 | + .filter((dependency) => dependencyNameRegex.test(dependency)) |
| 18 | + .map((dependency) => `${dependency}@${dependencyVersion}`); |
15 | 19 |
|
16 | 20 | if (dependencies.length > 0) {
|
| 21 | + if (dryRun) { |
| 22 | + console.info( |
| 23 | + `The next packages might be updated:\n${dependencies.join("\n")}` |
| 24 | + ); |
| 25 | + |
| 26 | + return; |
| 27 | + } |
| 28 | + |
17 | 29 | const npmInstall = spawn("npm", ["install"].concat(dependencies));
|
18 | 30 |
|
19 | 31 | npmInstall.on("close", (code: number) => {
|
20 | 32 | if (code === 0) {
|
21 | 33 | console.info(
|
22 |
| - `The next packages were updated to their latest version:\n${dependencies.join( |
23 |
| - "\n" |
24 |
| - )}` |
| 34 | + `The next packages were updated:\n${dependencies.join("\n")}` |
25 | 35 | );
|
26 |
| - } else { |
27 |
| - console.error("Something went wrong"); |
| 36 | + |
| 37 | + return; |
28 | 38 | }
|
29 | 39 |
|
30 |
| - process.exit(code); |
| 40 | + throw new Error("Something went wrong"); |
31 | 41 | });
|
| 42 | + |
32 | 43 | return;
|
33 | 44 | }
|
34 | 45 |
|
35 |
| - console.log(`No packages found with the next regular expression: ${regex}`); |
36 |
| - process.exit(1); |
| 46 | + throw new Error( |
| 47 | + `No packages found with the next regular expressions: ${dependencyNameRegex}` |
| 48 | + ); |
37 | 49 | }
|
38 | 50 |
|
| 51 | +program |
| 52 | + .name("npm-ri") |
| 53 | + .description( |
| 54 | + "npm install using regular expressions to update installed dependencies" |
| 55 | + ) |
| 56 | + .version("0.0.4"); |
| 57 | + |
39 | 58 | program
|
40 | 59 | .argument(
|
41 |
| - "<regex>", |
42 |
| - "regex that will be use to find packages", |
43 |
| - (value) => new RegExp(value) |
| 60 | + "<dependency-name-regex>", |
| 61 | + "regex that will be use to find dependencies", |
| 62 | + (value) => { |
| 63 | + return new RegExp(value); |
| 64 | + } |
44 | 65 | )
|
45 | 66 | .option(
|
46 |
| - "-v, --version <version>", |
47 |
| - "version that will be use to update packages", |
| 67 | + "-dv, --dependency-version <dependency-version>", |
| 68 | + "version that will be use to update dependencies", |
48 | 69 | "latest"
|
49 | 70 | )
|
| 71 | + .option("--dry-run", "do not actually perform updates", false) |
50 | 72 | .action(run);
|
51 | 73 |
|
52 | 74 | program.parse();
|
0 commit comments