@@ -22,6 +22,21 @@ interface PassThroughFlagsOptions {
2222 allowedFlags ?: string [ ]
2323}
2424type EnvironmentName = string
25+ /**
26+ * Flags required to run a command in multiple environments
27+ *
28+ * If the command does not support multiple environments, set to null
29+ *
30+ * Otherwise, each element can be:
31+ * - string: A required flag
32+ * - string[]: Multiple flags where at least one is required,
33+ * ordered by precedence
34+ *
35+ * @example
36+ * // store, password, and one of: live, development, or theme
37+ * ['store', 'password', ['live', 'development', 'theme']]
38+ */
39+ export type RequiredFlags = ( string | string [ ] ) [ ] | null
2540
2641export default abstract class ThemeCommand extends Command {
2742 passThroughFlags ( flags : FlagValues , { allowedFlags} : PassThroughFlagsOptions ) : string [ ] {
@@ -58,7 +73,7 @@ export default abstract class ThemeCommand extends Command {
5873 > ( _opts ?: Input < TFlags , TGlobalFlags , TArgs > ) : Promise < void > {
5974 // Parse command flags using the current command class definitions
6075 const klass = this . constructor as unknown as Input < TFlags , TGlobalFlags , TArgs > & {
61- multiEnvironmentsFlags : string [ ] | null
76+ multiEnvironmentsFlags : RequiredFlags
6277 flags : FlagOutput
6378 }
6479 const requiredFlags = klass . multiEnvironmentsFlags
@@ -128,7 +143,10 @@ export default abstract class ThemeCommand extends Command {
128143 * @param requiredFlags - The required flags to check for
129144 * @returns An object containing valid and invalid environment arrays
130145 */
131- private async validateEnvironments ( environmentMap : Map < EnvironmentName , FlagValues > , requiredFlags : string [ ] ) {
146+ private async validateEnvironments (
147+ environmentMap : Map < EnvironmentName , FlagValues > ,
148+ requiredFlags : Exclude < RequiredFlags , null > ,
149+ ) {
132150 const valid : { environment : EnvironmentName ; flags : FlagValues ; session : AdminSession } [ ] = [ ]
133151 const invalid : { environment : EnvironmentName ; reason : string } [ ] = [ ]
134152
@@ -158,7 +176,7 @@ export default abstract class ThemeCommand extends Command {
158176 */
159177 private async showConfirmation (
160178 commandName : string ,
161- requiredFlags : string [ ] ,
179+ requiredFlags : Exclude < RequiredFlags , null > ,
162180 validationResults : {
163181 valid : { environment : string ; flags : FlagValues } [ ]
164182 invalid : { environment : string ; reason : string } [ ]
@@ -176,7 +194,10 @@ export default abstract class ThemeCommand extends Command {
176194 const environmentDetails = [
177195 ...validationResults . valid . map ( ( { environment, flags} ) => {
178196 const flagDetails = requiredFlags
179- . map ( ( flag ) => ( flag . includes ( 'password' ) ? flag : `${ flag } : ${ String ( flags [ flag ] ) } ` ) )
197+ . map ( ( flag ) => {
198+ const usedFlag = Array . isArray ( flag ) ? flag . find ( ( flag ) => flags [ flag ] ) : flag
199+ return usedFlag && [ usedFlag . includes ( 'password' ) ? usedFlag : `${ usedFlag } : ${ flags [ usedFlag ] } ` ]
200+ } )
180201 . join ( ', ' )
181202
182203 return [ environment , { subdued : flagDetails || 'No flags required' } ]
@@ -241,8 +262,14 @@ export default abstract class ThemeCommand extends Command {
241262 * @param environmentName - The name of the environment
242263 * @returns The missing flags or true if the environment has all required flags
243264 */
244- private validConfig ( environmentFlags : FlagValues , requiredFlags : string [ ] , environmentName : string ) : string [ ] | true {
245- const missingFlags = requiredFlags . filter ( ( flag ) => ! environmentFlags [ flag ] )
265+ private validConfig (
266+ environmentFlags : FlagValues ,
267+ requiredFlags : Exclude < RequiredFlags , null > ,
268+ environmentName : string ,
269+ ) : string [ ] | true {
270+ const missingFlags = requiredFlags
271+ . filter ( ( flag ) => ( Array . isArray ( flag ) ? ! flag . some ( ( flag ) => environmentFlags [ flag ] ) : ! environmentFlags [ flag ] ) )
272+ . map ( ( flag ) => ( Array . isArray ( flag ) ? flag . join ( ' or ' ) : flag ) )
246273
247274 if ( missingFlags . length > 0 ) {
248275 renderWarning ( {
0 commit comments