Skip to content

Commit 776e264

Browse files
committed
refactor(create-plugin): move prompt from cmd file to the manager
1 parent 0121ba1 commit 776e264

File tree

2 files changed

+74
-88
lines changed

2 files changed

+74
-88
lines changed

packages/create-plugin/src/additions/manager.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,52 @@ export async function parseAdditionFlags(addition: AdditionMeta, argv: any): Pro
4747
}
4848
}
4949

50+
async function validateAdditionOptions(addition: AdditionMeta, options: AdditionOptions): Promise<void> {
51+
const flags = await getAdditionFlags(addition);
52+
53+
if (!flags || flags.length === 0) {
54+
return;
55+
}
56+
57+
const missingFlags: string[] = [];
58+
59+
for (const flag of flags) {
60+
if (flag.required) {
61+
const value = options[flag.name];
62+
if (value === undefined || value === null || (Array.isArray(value) && value.length === 0)) {
63+
missingFlags.push(flag.name);
64+
}
65+
}
66+
}
67+
68+
if (missingFlags.length > 0) {
69+
const flagDocs = flags.filter((f) => missingFlags.includes(f.name)).map((f) => ` --${f.name}: ${f.description}`);
70+
71+
throw new Error(
72+
`Missing required flag${missingFlags.length > 1 ? 's' : ''}:\n\n` +
73+
flagDocs.join('\n') +
74+
`\n\nExample: npx @grafana/create-plugin add ${addition.name} --${missingFlags[0]}=value`
75+
);
76+
}
77+
}
78+
79+
export async function runAdditionByName(
80+
additionName: string,
81+
argv: any,
82+
runOptions: RunAdditionOptions = {}
83+
): Promise<void> {
84+
const addition = getAdditionByName(additionName);
85+
if (!addition) {
86+
const availableAdditions = getAvailableAdditions();
87+
const additionsList = Object.keys(availableAdditions);
88+
throw new Error(`Unknown addition: ${additionName}\n\nAvailable additions: ${additionsList.join(', ')}`);
89+
}
90+
91+
const options = await parseAdditionFlags(addition, argv);
92+
await validateAdditionOptions(addition, options);
93+
await runAddition(addition, options, runOptions);
94+
}
95+
5096
export async function runAddition(
5197
addition: AdditionMeta,
5298
additionOptions: AdditionOptions = {},

packages/create-plugin/src/commands/add.command.ts

Lines changed: 28 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
AdditionOptions,
3-
getAdditionByName,
4-
getAdditionFlags,
5-
getAvailableAdditions,
6-
parseAdditionFlags,
7-
runAddition,
8-
} from '../additions/manager.js';
1+
import { getAdditionFlags, getAvailableAdditions, runAdditionByName } from '../additions/manager.js';
92
import { isGitDirectory, isGitDirectoryClean } from '../utils/utils.git.js';
103

114
import { isPluginDirectory } from '../utils/utils.plugin.js';
@@ -16,58 +9,14 @@ export const add = async (argv: minimist.ParsedArgs) => {
169
const subCommand = argv._[1];
1710

1811
if (!subCommand) {
19-
const availableAdditions = getAvailableAdditions();
20-
const additionsList = await Promise.all(
21-
Object.values(availableAdditions).map(async (addition) => {
22-
let info = `${addition.name} - ${addition.description}`;
23-
const flags = await getAdditionFlags(addition);
24-
if (flags.length > 0) {
25-
const flagDocs = flags.map((flag) => {
26-
const req = flag.required ? ' (required)' : ' (optional)';
27-
return ` --${flag.name}: ${flag.description}${req}`;
28-
});
29-
info += '\n' + flagDocs.join('\n');
30-
}
31-
return info;
32-
})
33-
);
34-
35-
output.error({
36-
title: 'No addition specified',
37-
body: [
38-
'Usage: npx @grafana/create-plugin add <addition-name> [options]',
39-
'',
40-
'Available additions:',
41-
...output.bulletList(additionsList),
42-
],
43-
});
12+
await showAdditionsHelp();
4413
process.exit(1);
4514
}
4615

4716
await performPreAddChecks(argv);
4817

49-
const addition = getAdditionByName(subCommand);
50-
51-
if (!addition) {
52-
const availableAdditions = getAvailableAdditions();
53-
const additionsList = Object.values(availableAdditions).map((addition) => addition.name);
54-
55-
output.error({
56-
title: `Unknown addition: ${subCommand}`,
57-
body: ['Available additions:', ...output.bulletList(additionsList)],
58-
});
59-
process.exit(1);
60-
}
61-
6218
try {
63-
// Parse addition-specific options from argv flags using the addition's own parser
64-
const options = await parseAdditionFlags(addition, argv);
65-
66-
// Validate required flags
67-
await validateAdditionOptions(addition, options);
68-
69-
const commitChanges = argv.commit;
70-
await runAddition(addition, options, { commitChanges });
19+
await runAdditionByName(subCommand, argv, { commitChanges: argv.commit });
7120
} catch (error) {
7221
if (error instanceof Error) {
7322
output.error({
@@ -79,41 +28,32 @@ export const add = async (argv: minimist.ParsedArgs) => {
7928
}
8029
};
8130

82-
async function validateAdditionOptions(addition: any, options: AdditionOptions): Promise<void> {
83-
const flags = await getAdditionFlags(addition);
84-
85-
if (!flags || flags.length === 0) {
86-
return;
87-
}
88-
89-
const missingFlags: string[] = [];
90-
91-
for (const flag of flags) {
92-
if (flag.required) {
93-
const value = options[flag.name];
94-
if (value === undefined || value === null || (Array.isArray(value) && value.length === 0)) {
95-
missingFlags.push(flag.name);
31+
async function showAdditionsHelp() {
32+
const availableAdditions = getAvailableAdditions();
33+
const additionsList = await Promise.all(
34+
Object.values(availableAdditions).map(async (addition) => {
35+
let info = `${addition.name} - ${addition.description}`;
36+
const flags = await getAdditionFlags(addition);
37+
if (flags.length > 0) {
38+
const flagDocs = flags.map((flag) => {
39+
const req = flag.required ? ' (required)' : ' (optional)';
40+
return ` --${flag.name}: ${flag.description}${req}`;
41+
});
42+
info += '\n' + flagDocs.join('\n');
9643
}
97-
}
98-
}
99-
100-
if (missingFlags.length > 0) {
101-
const flagDocs = flags
102-
.filter((f: any) => missingFlags.includes(f.name))
103-
.map((f: any) => ` --${f.name}: ${f.description}`);
104-
105-
output.error({
106-
title: `Missing required flag${missingFlags.length > 1 ? 's' : ''}`,
107-
body: [
108-
`The following required flag${missingFlags.length > 1 ? 's are' : ' is'} missing:`,
109-
'',
110-
...flagDocs,
111-
'',
112-
`Example: npx @grafana/create-plugin add ${addition.name} --${missingFlags[0]}=value`,
113-
],
114-
});
115-
process.exit(1);
116-
}
44+
return info;
45+
})
46+
);
47+
48+
output.error({
49+
title: 'No addition specified',
50+
body: [
51+
'Usage: npx @grafana/create-plugin add <addition-name> [options]',
52+
'',
53+
'Available additions:',
54+
...output.bulletList(additionsList),
55+
],
56+
});
11757
}
11858

11959
async function performPreAddChecks(argv: minimist.ParsedArgs) {

0 commit comments

Comments
 (0)