Skip to content

Commit f0b075f

Browse files
authored
Add --yes option to skip prompts (#432)
1 parent 8909b12 commit f0b075f

File tree

4 files changed

+110
-38
lines changed

4 files changed

+110
-38
lines changed

.changeset/new-kiwis-play.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"types-react-codemod": minor
3+
---
4+
5+
Add `--yes` option to skip prompts
6+
7+
Useful when applying presets when no user input is available or desired.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Options:
4949
--help Show help [boolean]
5050
--dry [boolean] [default: false]
5151
--ignore-pattern [string] [default: "**/node_modules/**"]
52+
--yes Automatically accepts all prompts. Useful when no user input
53+
is available or desired. [boolean] [default: false]
5254
--verbose [boolean] [default: false]
5355

5456
Examples:

bin/__tests__/types-react-codemod.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ describe("types-react-codemod", () => {
3737
--help Show help [boolean]
3838
--dry [boolean] [default: false]
3939
--ignore-pattern [string] [default: "**/node_modules/**"]
40+
--yes Automatically accepts all prompts. Useful when no user input
41+
is available or desired. [boolean] [default: false]
4042
--verbose [boolean] [default: false]
4143
4244
Examples:
@@ -62,4 +64,32 @@ describe("types-react-codemod", () => {
6264
// Everything ok
6365
expect(stderr).toMatchInlineSnapshot(`""`);
6466
});
67+
68+
test("can execute all default preset-18 codemods without prompt", async () => {
69+
const fixture = path.resolve(__dirname, "./__fixtures__/smoke-test");
70+
// Does't matter which transform as long as it is one that doesn't change code in the fixture
71+
const { stderr, stdout } = await execTypesReactCodemod(
72+
`--yes preset-18 ${fixture}`,
73+
);
74+
75+
// Everything ok
76+
expect(stderr).toMatchInlineSnapshot(`""`);
77+
expect(stdout).toContain(
78+
`--preset18Transforms="deprecated-react-type,deprecated-sfc-element,deprecated-sfc,deprecated-stateless-component"`,
79+
);
80+
});
81+
82+
test("can execute all default preset-19 codemods without prompt", async () => {
83+
const fixture = path.resolve(__dirname, "./__fixtures__/smoke-test");
84+
// Does't matter which transform as long as it is one that doesn't change code in the fixture
85+
const { stderr, stdout } = await execTypesReactCodemod(
86+
`--yes preset-19 ${fixture}`,
87+
);
88+
89+
// Everything ok
90+
expect(stderr).toMatchInlineSnapshot(`""`);
91+
expect(stdout).toContain(
92+
`--preset19Transforms="deprecated-legacy-ref,deprecated-prop-types-types,deprecated-react-child,deprecated-react-node-array,deprecated-react-fragment,deprecated-react-text,deprecated-void-function-component,refobject-defaults,scoped-jsx,useRef-required-initial"`,
93+
);
94+
});
6595
});

bin/types-react-codemod.cjs

Lines changed: 71 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,33 @@ const yargs = require("yargs/yargs");
88
const { hideBin } = require("yargs/helpers");
99
const path = require("path");
1010

11+
/** @type {import('inquirer').CheckboxChoiceOptions[]} */
12+
const preset18Choices = [
13+
{ checked: false, value: "context-any" },
14+
{ checked: true, value: "deprecated-react-type" },
15+
{ checked: true, value: "deprecated-sfc-element" },
16+
{ checked: true, value: "deprecated-sfc" },
17+
{ checked: true, value: "deprecated-stateless-component" },
18+
{ checked: false, value: "implicit-children" },
19+
{ checked: false, value: "useCallback-implicit-any" },
20+
];
21+
22+
/** @type {import('inquirer').CheckboxChoiceOptions[]} */
23+
const preset19Choices = [
24+
{ checked: true, value: "deprecated-legacy-ref" },
25+
{ checked: true, value: "deprecated-prop-types-types" },
26+
{ checked: true, value: "deprecated-react-child" },
27+
{ checked: true, value: "deprecated-react-node-array" },
28+
{ checked: true, value: "deprecated-react-fragment" },
29+
{ checked: true, value: "deprecated-react-text" },
30+
{ checked: true, value: "deprecated-void-function-component" },
31+
{ checked: false, value: "no-implicit-ref-callback-return" },
32+
{ checked: false, value: "react-element-default-any-props" },
33+
{ checked: true, value: "refobject-defaults" },
34+
{ checked: true, value: "scoped-jsx" },
35+
{ checked: true, value: "useRef-required-initial" },
36+
];
37+
1138
async function main() {
1239
const transformsRoot = path.join(__dirname, "../transforms");
1340
const transforms = fs
@@ -43,6 +70,12 @@ async function main() {
4370
default: "**/node_modules/**",
4471
type: "string",
4572
})
73+
.option("yes", {
74+
description:
75+
"Automatically accepts all prompts. Useful when no user input is available or desired.",
76+
default: false,
77+
type: "boolean",
78+
})
4679
.option("verbose", { default: false, type: "boolean" })
4780
// Ignoring `build`: https://www.digitalocean.com/community/tools/glob?comments=true&glob=%2A%2A%2F%7Bnode_modules%2Cbuild%7D%2F%2A%2A&matches=false&tests=package%2Fnode_modules%2Ftest.js&tests=package%2Fbuild%2Ftest.js&tests=package%2Ftest.js
4881
.example(
@@ -53,7 +86,7 @@ async function main() {
5386
);
5487
},
5588
async (argv) => {
56-
const { codemod, dry, paths, verbose } = argv;
89+
const { codemod, dry, paths, verbose, yes } = argv;
5790

5891
// TODO: npx instead?
5992
const jscodeshiftExecutable = require.resolve(
@@ -73,46 +106,46 @@ async function main() {
73106

74107
if (codemod === "preset-18") {
75108
const { default: inquirer } = await inquirerImport;
76-
const { presets } = await inquirer.prompt([
77-
{
78-
message: "Pick transforms to apply",
79-
name: "presets",
80-
type: "checkbox",
81-
choices: [
82-
{ checked: false, value: "context-any" },
83-
{ checked: true, value: "deprecated-react-type" },
84-
{ checked: true, value: "deprecated-sfc-element" },
85-
{ checked: true, value: "deprecated-sfc" },
86-
{ checked: true, value: "deprecated-stateless-component" },
87-
{ checked: false, value: "implicit-children" },
88-
{ checked: false, value: "useCallback-implicit-any" },
89-
],
90-
},
91-
]);
109+
110+
const { presets } = yes
111+
? {
112+
presets: preset18Choices
113+
.filter((choice) => {
114+
return choice.checked;
115+
})
116+
.map((choice) => {
117+
return choice.value;
118+
}),
119+
}
120+
: await inquirer.prompt([
121+
{
122+
message: "Pick transforms to apply",
123+
name: "presets",
124+
type: "checkbox",
125+
choices: preset18Choices,
126+
},
127+
]);
92128
args.push(`--preset18Transforms="${presets.join(",")}"`);
93129
} else if (codemod === "preset-19") {
94130
const { default: inquirer } = await inquirerImport;
95-
const { presets } = await inquirer.prompt([
96-
{
97-
message: "Pick transforms to apply",
98-
name: "presets",
99-
type: "checkbox",
100-
choices: [
101-
{ checked: true, value: "deprecated-legacy-ref" },
102-
{ checked: true, value: "deprecated-prop-types-types" },
103-
{ checked: true, value: "deprecated-react-child" },
104-
{ checked: true, value: "deprecated-react-node-array" },
105-
{ checked: true, value: "deprecated-react-fragment" },
106-
{ checked: true, value: "deprecated-react-text" },
107-
{ checked: true, value: "deprecated-void-function-component" },
108-
{ checked: false, value: "no-implicit-ref-callback-return" },
109-
{ checked: false, value: "react-element-default-any-props" },
110-
{ checked: true, value: "refobject-defaults" },
111-
{ checked: true, value: "scoped-jsx" },
112-
{ checked: true, value: "useRef-required-initial" },
113-
],
114-
},
115-
]);
131+
const { presets } = yes
132+
? {
133+
presets: preset19Choices
134+
.filter((choice) => {
135+
return choice.checked;
136+
})
137+
.map((choice) => {
138+
return choice.value;
139+
}),
140+
}
141+
: await inquirer.prompt([
142+
{
143+
message: "Pick transforms to apply",
144+
name: "presets",
145+
type: "checkbox",
146+
choices: preset19Choices,
147+
},
148+
]);
116149
args.push(`--preset19Transforms="${presets.join(",")}"`);
117150
}
118151

0 commit comments

Comments
 (0)