@@ -8,43 +8,39 @@ import { Command } from "commander";
88import { runBuild } from "./commands/build" ;
99import { ALL_PACKAGES , CATEGORY_VM } from "./common/cli.constants" ;
1010import { startDeleteFlow } from "./commands/delete" ;
11- import {
12- Options_Cli ,
13- Options_Cli_Build ,
14- Options_Cli_Delete ,
15- Schema_Options_Cli_Build ,
16- Schema_Options_Cli_Delete ,
17- Schema_Options_Cli_Root ,
18- } from "./common/cli.types" ;
19- import { getPckgsTo , log } from "./common/cli.utils" ;
11+ import { CliValidator } from "./cli.validator" ;
2012
2113class CompassCli {
2214 private program : Command ;
23- private options : Options_Cli ;
15+ private validator : CliValidator ;
2416
2517 constructor ( args : string [ ] ) {
2618 this . program = this . _createProgram ( ) ;
19+ this . validator = new CliValidator ( this . program ) ;
2720 this . program . parse ( args ) ;
28- this . options = this . _getCliOptions ( ) ;
2921 }
3022
3123 public async run ( ) {
32- const { force, user } = this . options ;
24+ const options = this . validator . getCliOptions ( ) ;
25+ const { force, user } = options ;
3326 const cmd = this . program . args [ 0 ] ;
3427
3528 switch ( true ) {
3629 case cmd === "build" : {
37- await this . _validateBuild ( ) ;
38- await runBuild ( this . options ) ;
30+ await this . validator . validateBuild ( options ) ;
31+ await runBuild ( options ) ;
3932 break ;
4033 }
4134 case cmd === "delete" : {
42- this . _validateDelete ( ) ;
35+ this . validator . validateDelete ( options ) ;
4336 await startDeleteFlow ( user as string , force ) ;
4437 break ;
4538 }
4639 default :
47- this . _exitHelpfully ( "root" , `${ cmd as string } is not a supported cmd` ) ;
40+ this . validator . exitHelpfully (
41+ "root" ,
42+ `${ cmd as string } is not a supported cmd`
43+ ) ;
4844 }
4945 }
5046
@@ -78,156 +74,6 @@ class CompassCli {
7874 ) ;
7975 return program ;
8076 }
81-
82- private _exitHelpfully ( cmd : "root" | "build" | "delete" , msg ?: string ) {
83- msg && log . error ( msg ) ;
84-
85- if ( cmd === "root" ) {
86- console . log ( this . program . helpInformation ( ) ) ;
87- } else {
88- const command = this . program . commands . find (
89- ( c ) => c . name ( ) === cmd
90- ) as Command ;
91- console . log ( command . helpInformation ( ) ) ;
92- }
93-
94- process . exit ( 1 ) ;
95- }
96-
97- private _getBuildOptions ( ) {
98- const buildOpts : Options_Cli_Build = { } ;
99-
100- const buildCmd = this . program . commands . find (
101- ( cmd ) => cmd . name ( ) === "build"
102- ) ;
103- if ( buildCmd ) {
104- const packages = this . program . args [ 1 ] ?. split ( "," ) ;
105- if ( packages ) {
106- buildOpts . packages = packages ;
107- }
108-
109- const environment = buildCmd ?. opts ( ) [
110- "environment"
111- ] as Options_Cli_Build [ "environment" ] ;
112- if ( environment ) {
113- buildOpts . environment = environment ;
114- }
115-
116- const clientId = buildCmd ?. opts ( ) [
117- "clientId"
118- ] as Options_Cli_Build [ "clientId" ] ;
119- if ( clientId ) {
120- buildOpts . clientId = clientId ;
121- }
122- }
123- return buildOpts ;
124- }
125-
126- private _getCliOptions ( ) : Options_Cli {
127- const options = this . _mergeOptions ( ) ;
128- const validOptions = this . _validateOptions ( options ) ;
129-
130- console . log ( "options" , options ) ;
131- console . log ( "validOptions:" , validOptions ) ;
132- return validOptions ;
133- }
134-
135- private _getDeleteOptions ( ) {
136- const deleteOpts : Options_Cli_Delete = { } ;
137-
138- const deleteCmd = this . program . commands . find (
139- ( cmd ) => cmd . name ( ) === "delete"
140- ) ;
141- if ( deleteCmd ) {
142- const user = deleteCmd ?. opts ( ) [ "user" ] as Options_Cli [ "user" ] ;
143- if ( user ) {
144- deleteOpts . user = user ;
145- }
146- }
147-
148- return deleteOpts ;
149- }
150-
151- private _mergeOptions = ( ) : Options_Cli => {
152- const _options = this . program . opts ( ) ;
153- let options : Options_Cli = {
154- ..._options ,
155- force : _options [ "force" ] === true ,
156- } ;
157-
158- const buildOptions = this . _getBuildOptions ( ) ;
159- if ( Object . keys ( buildOptions ) . length > 0 ) {
160- options = {
161- ...options ,
162- ...buildOptions ,
163- } ;
164- }
165-
166- const deleteOptions = this . _getDeleteOptions ( ) ;
167- if ( Object . keys ( deleteOptions ) . length > 0 ) {
168- options = {
169- ...options ,
170- ...deleteOptions ,
171- } ;
172- }
173-
174- return options ;
175- } ;
176-
177- private async _validateBuild ( ) {
178- if ( ! this . options . packages ) {
179- this . options . packages = await getPckgsTo ( "build" ) ;
180- }
181-
182- const unsupportedPackages = this . options . packages . filter (
183- ( pkg ) => ! ALL_PACKAGES . includes ( pkg )
184- ) ;
185- if ( unsupportedPackages . length > 0 ) {
186- this . _exitHelpfully (
187- "build" ,
188- `One or more of these packages isn't supported: ${ unsupportedPackages . toString ( ) } `
189- ) ;
190- }
191- }
192-
193- private _validateDelete ( ) {
194- const { user } = this . options ;
195- if ( ! user || typeof user !== "string" ) {
196- this . _exitHelpfully ( "delete" , "You must supply a user" ) ;
197- }
198- }
199-
200- private _validateOptions ( options : Options_Cli ) {
201- const { data : rootData , error : rootError } =
202- Schema_Options_Cli_Root . safeParse ( options ) ;
203- if ( rootError ) {
204- this . _exitHelpfully (
205- "root" ,
206- `Invalid CLI options: ${ rootError . toString ( ) } `
207- ) ;
208- }
209-
210- const { data : buildData , error : buildError } =
211- Schema_Options_Cli_Build . safeParse ( options ) ;
212- if ( buildError ) {
213- this . _exitHelpfully (
214- "build" ,
215- `Invalid build options: ${ buildError . toString ( ) } `
216- ) ;
217- }
218-
219- const { data : deleteData , error : deleteError } =
220- Schema_Options_Cli_Delete . safeParse ( options ) ;
221- if ( deleteError ) {
222- this . _exitHelpfully (
223- "delete" ,
224- `Invalid delete options: ${ deleteError . toString ( ) } `
225- ) ;
226- }
227-
228- const data : Options_Cli = { ...rootData , ...buildData , ...deleteData } ;
229- return data ;
230- }
23177}
23278
23379const cli = new CompassCli ( process . argv ) ;
0 commit comments