UNPKG

@hashgraph/solo

Version:

An opinionated CLI tool to deploy and manage private Hedera Networks.

112 lines (97 loc) 3.93 kB
/** * SPDX-License-Identifier: Apache-2.0 */ import {Flags as flags} from '../../../commands/flags.js'; import {type ToObject} from '../../../types/index.js'; import {type RemoteConfigCommonFlagsStruct} from './types.js'; import {type ConfigManager} from '../../config_manager.js'; import {type CommandFlag} from '../../../types/flag_types.js'; import {type AnyObject} from '../../../types/aliases.js'; import {select} from '@inquirer/prompts'; export class CommonFlagsDataWrapper implements ToObject<RemoteConfigCommonFlagsStruct> { private static readonly COMMON_FLAGS: CommandFlag[] = [ flags.releaseTag, flags.chartDirectory, flags.relayReleaseTag, flags.soloChartVersion, flags.mirrorNodeVersion, flags.nodeAliasesUnparsed, flags.hederaExplorerVersion, ]; private constructor( private readonly configManager: ConfigManager, private readonly flags: RemoteConfigCommonFlagsStruct, ) {} /** * Updates the flags or populates them inside the remote config */ public async handleFlags(argv: AnyObject): Promise<void> { for (const flag of CommonFlagsDataWrapper.COMMON_FLAGS) { await this.handleFlag(flag, argv); } } private async handleFlag(flag: CommandFlag, argv: AnyObject): Promise<void> { const detectFlagMismatch = async () => { const oldValue = this.flags[flag.constName] as string; const newValue = this.configManager.getFlag<string>(flag); // if the old value is not present, override it with the new one if (!oldValue && newValue) { this.flags[flag.constName] = newValue; return; } // if its present but there is a mismatch warn user else if (oldValue && oldValue !== newValue) { const isQuiet = this.configManager.getFlag<boolean>(flags.quiet); const isForced = this.configManager.getFlag<boolean>(flags.force); // if the quiet or forced flag is passed don't prompt the user if (isQuiet === true || isForced === true) return; const answer = await select<string>({ message: 'Value in remote config differs with the one you are passing, choose which you want to use', choices: [ { name: `[old value] ${oldValue}`, value: oldValue, }, { name: `[new value] ${newValue}`, value: newValue, }, ], }); // Override if user chooses new the new value, else override and keep the old one if (answer === newValue) { this.flags[flag.constName] = newValue; } else { this.configManager.setFlag(flag, oldValue); argv[flag.constName] = oldValue; } } }; // if the flag is set, inspect the value if (this.configManager.hasFlag(flag)) { await detectFlagMismatch(); } // use remote config value if no user supplied value else if (this.flags[flag.constName]) { argv[flag.constName] = this.flags[flag.constName]; this.configManager.setFlag(flag, this.flags[flag.constName]); } } public static async initialize(configManager: ConfigManager, argv: AnyObject): Promise<CommonFlagsDataWrapper> { const commonFlagsDataWrapper = new CommonFlagsDataWrapper(configManager, {}); await commonFlagsDataWrapper.handleFlags(argv); return commonFlagsDataWrapper; } public static fromObject(configManager: ConfigManager, data: RemoteConfigCommonFlagsStruct): CommonFlagsDataWrapper { return new CommonFlagsDataWrapper(configManager, data); } public toObject(): RemoteConfigCommonFlagsStruct { return { nodeAliasesUnparsed: this.flags.nodeAliasesUnparsed, releaseTag: this.flags.releaseTag, relayReleaseTag: this.flags.relayReleaseTag, hederaExplorerVersion: this.flags.hederaExplorerVersion, mirrorNodeVersion: this.flags.mirrorNodeVersion, }; } }