diff --git a/src/commands/optimize.ts b/src/commands/optimize.ts index d5e81f4e499..cbd2702a3ce 100644 --- a/src/commands/optimize.ts +++ b/src/commands/optimize.ts @@ -18,6 +18,10 @@ export enum Optimizations { MOVE_ALL_TO_COMPONENTS='move-all-to-components', } +export enum DisableOptimizations { + SCHEMA='schema' +} + export enum Outputs { TERMINAL='terminal', NEW_FILE='new-file', @@ -27,6 +31,7 @@ export default class Optimize extends Command { static description = 'optimize asyncapi specification file'; isInteractive = false; selectedOptimizations?: Optimizations[]; + disableOptimizations?: DisableOptimizations[]; outputMethod?: Outputs; static examples = [ @@ -34,6 +39,7 @@ export default class Optimize extends Command { 'asyncapi optimize ./asyncapi.yaml --no-tty', 'asyncapi optimize ./asyncapi.yaml --optimization=remove-components --optimization=reuse-components --optimization=move-all-to-components --no-tty', 'asyncapi optimize ./asyncapi.yaml --optimization=remove-components --output=terminal --no-tty', + 'asyncapi optimize ./asyncapi.yaml --ignore=schema' ]; static flags = optimizeFlags(); @@ -74,6 +80,7 @@ export default class Optimize extends Command { } this.isInteractive = !flags['no-tty']; this.selectedOptimizations = flags.optimization as Optimizations[]; + this.disableOptimizations = flags.ignore as DisableOptimizations[]; this.outputMethod = flags.output as Outputs; this.metricsMetadata.optimized = false; @@ -93,7 +100,11 @@ export default class Optimize extends Command { moveAllToComponents: this.selectedOptimizations.includes(Optimizations.MOVE_ALL_TO_COMPONENTS), removeComponents: this.selectedOptimizations.includes(Optimizations.REMOVE_COMPONENTS), reuseComponents: this.selectedOptimizations.includes(Optimizations.REUSE_COMPONENTS) - }, output: Output.YAML}); + }, + disableOptimizationFor: { + schema: this.disableOptimizations.includes(DisableOptimizations.SCHEMA) + }, + output: Output.YAML}); this.collectMetricsData(report); @@ -178,6 +189,13 @@ export default class Optimize extends Command { this.showOptimizations(report.reuseComponents); choices.push({name: 'reuse components', value: Optimizations.REUSE_COMPONENTS}); } + + if (this.disableOptimizations?.includes(DisableOptimizations.SCHEMA)) { + choices.push({name: 'Do not ignore schema', value: DisableOptimizations.SCHEMA}); + } else { + choices.push({name: 'Ignore schema', value: DisableOptimizations.SCHEMA}); + } + const optimizationRes = await inquirer.prompt([{ name: 'optimization', message: 'select the type of optimization that you want to apply:', @@ -186,6 +204,14 @@ export default class Optimize extends Command { choices }]); + if (optimizationRes.optimization.includes('schema')) { + if (this.disableOptimizations?.includes(DisableOptimizations.SCHEMA)) { + this.disableOptimizations = this.disableOptimizations?.filter(opt => opt !== DisableOptimizations.SCHEMA); + } else { + this.disableOptimizations = [...(this.disableOptimizations || []), DisableOptimizations.SCHEMA]; + } + } + this.selectedOptimizations = optimizationRes.optimization; const outputRes = await inquirer.prompt([{ diff --git a/src/core/flags/optimize.flags.ts b/src/core/flags/optimize.flags.ts index b9a5aa2c707..8fc1f8cb58f 100644 --- a/src/core/flags/optimize.flags.ts +++ b/src/core/flags/optimize.flags.ts @@ -7,6 +7,10 @@ export enum Optimizations { MOVE_ALL_TO_COMPONENTS='move-all-to-components', } +export enum DisableOptimizations { + SCHEMA='schema', +} + export enum Outputs { TERMINAL='terminal', NEW_FILE='new-file', @@ -17,6 +21,7 @@ export const optimizeFlags = () => { return { help: Flags.help({ char: 'h' }), optimization: Flags.string({char: 'p', default: Object.values(Optimizations), options: Object.values(Optimizations), multiple: true, description: 'select the type of optimizations that you want to apply.'}), + ignore: Flags.string({char: 'i', default: [], options: Object.values(DisableOptimizations), multiple: true, description: 'list of components to be ignored from the optimization process'}), output: Flags.string({char: 'o', default: Outputs.TERMINAL, options: Object.values(Outputs), description: 'select where you want the output.'}), 'no-tty': Flags.boolean({ description: 'do not use an interactive terminal', default: false }), };