@@ -9,8 +9,9 @@ import { dirname, join } from "node:path";
99import { fileURLToPath } from "node:url" ;
1010// eslint-disable-next-line n/no-missing-import
1111import type { PackageJson } from "type-fest" ;
12- import { logGemberErrors } from "./errors.js" ;
12+ import { GemberError , logGemberErrors } from "./errors.js" ;
1313import { generators } from "./generators.js" ;
14+ import { logger } from "./logger.js" ;
1415
1516const { description, name, version } : PackageJson = readJsonSync (
1617 join ( dirname ( fileURLToPath ( import . meta. url ) ) , ".." , "package.json" ) ,
@@ -23,6 +24,62 @@ const main = defineCommand({
2324 version,
2425 } ,
2526
27+ run : ( context ) : void => {
28+ if ( context . rawArgs . length > 0 ) {
29+ return ;
30+ }
31+
32+ logGemberErrors ( async ( ) => {
33+ // @ts -expect-error: The `multiselect` return type is incorrect:
34+ const selectedGeneratorNames : string [ ] | undefined = await logger . prompt (
35+ "Which generators would you like to run?" ,
36+ {
37+ options : generators . map ( ( generator ) => ( {
38+ hint : generator . description ,
39+ label : generator . name ,
40+ value : generator . name ,
41+ } ) ) ,
42+ type : "multiselect" ,
43+ } ,
44+ ) ;
45+
46+ if ( selectedGeneratorNames === undefined ) {
47+ // The user probably cancelled the interactive flow:
48+ return ;
49+ }
50+
51+ let entityName : string | undefined ;
52+
53+ for ( const selectedGeneratorName of selectedGeneratorNames . sort ( ) ) {
54+ const selectedGenerator = generators . find (
55+ ( generator ) => generator . name === selectedGeneratorName ,
56+ ) ;
57+
58+ if ( selectedGenerator === undefined ) {
59+ throw new GemberError (
60+ `[BUG] Could not find generator \`${ selectedGeneratorName } \`.` ,
61+ ) ;
62+ }
63+
64+ entityName = await logger . prompt (
65+ `Please provide a name for generator \`${ selectedGenerator . name } \`:` ,
66+ {
67+ initial : entityName ,
68+ type : "text" ,
69+ } ,
70+ ) ;
71+
72+ if ( entityName === undefined ) {
73+ throw new GemberError (
74+ `A name must be provided for generator \`${ selectedGenerator . name } \`.` ,
75+ ) ;
76+ }
77+
78+ await selectedGenerator . run ( { name : entityName } ) ;
79+ }
80+ } ) ;
81+ } ,
82+
2683 subCommands : generators . reduce ( ( subCommands : SubCommandsDef , generator ) => {
2784 subCommands [ generator . name ] = {
2885 args : generator . args . reduce ( ( args : ArgsDef , arg ) => {
0 commit comments