UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

122 lines (106 loc) 3.55 kB
import { assertOptions } from '@sprucelabs/schema' import { GraphicsInterface, PkgService, versionUtil, } from '@sprucelabs/spruce-skill-utils' export default class VersionResolver { private constructor( private ui: GraphicsInterface, private pkg: PkgService ) {} public static Resolver(ui: GraphicsInterface, pkg: PkgService) { assertOptions({ ui, pkg }, ['ui', 'pkg']) return new this(ui, pkg) } public async resolveVersion( resolvedDestination: string, userSuppliedVersion?: string | null ) { if (userSuppliedVersion) { versionUtil.assertValidVersion(userSuppliedVersion) } let resolvedVersion = versionUtil.generateVersion( userSuppliedVersion ?? undefined ).constValue if (!userSuppliedVersion) { resolvedVersion = await this.askForVersionIfTodaysVersionDoesNotExist( resolvedDestination, resolvedVersion ) } const version = versionUtil.generateVersion(resolvedVersion).dirValue this.persistVersion(version) return version } private persistVersion(version: string) { this.pkg.set({ path: 'skill.version', value: version, }) } private async askForVersionIfTodaysVersionDoesNotExist( resolvedDestination: string, fallbackVersion: string ) { const versions = this.loadVersions(resolvedDestination) const choices = this.buildChoices(versions) if (versions.length > 0) { return await this.ui.prompt({ type: 'select', label: 'Version', hint: 'Confirm which version you want to use?', isRequired: true, options: { choices, }, }) } return fallbackVersion } private buildChoices( versions: { intValue: number; constValue: string; dirValue: string }[] ) { const todaysVersion = versionUtil.generateVersion() const alreadyHasToday = !!versions.find( (version) => version.dirValue === todaysVersion.dirValue ) const choices = [] if (!alreadyHasToday) { choices.push({ label: 'New Version', value: todaysVersion.dirValue, }) } choices.push( ...versions .sort((a, b) => { return a.intValue > b.intValue ? -1 : 1 }) .map((version) => ({ value: version.dirValue, label: version.dirValue, })) ) return choices } private loadVersions(resolvedDestination: string) { const versions = versionUtil.getAllVersions(resolvedDestination) const persistedVersion = this.pkg.get('skill.version') const todaysVersion = versionUtil.generateVersion().dirValue if ( persistedVersion && todaysVersion !== persistedVersion && !versions.find((v) => v.dirValue === persistedVersion) ) { versions.push({ intValue: versionUtil.generateVersion(persistedVersion).intValue, dirValue: persistedVersion, constValue: persistedVersion, }) } return versions } }