Files
actions/src/core/versionManager.ts
2020-03-13 14:54:25 +02:00

57 lines
1.7 KiB
TypeScript

import cmp from 'semver-compare'
import * as semver from 'semver'
import { injectable, inject } from 'inversify'
import { IBuildAgent, TYPES } from './models'
export interface IVersionManager {
isExplicitVersion(versionSpec: string): boolean
evaluateVersions(versions: string[], versionSpec: string): string
cleanVersion(version: string): string
}
@injectable()
export class VersionManager implements IVersionManager {
private buildAgent: IBuildAgent
constructor(@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent) {
this.buildAgent = buildAgent
}
public isExplicitVersion(versionSpec: string): boolean {
const c = semver.clean(versionSpec)
this.buildAgent.debug('isExplicit: ' + c)
const valid = semver.valid(c) != null
this.buildAgent.debug('explicit? ' + valid)
return valid
}
public evaluateVersions(versions: string[], versionSpec: string): string {
let version: string
this.buildAgent.debug('evaluating ' + versions.length + ' versions')
versions = versions.sort(cmp)
for (let i = versions.length - 1; i >= 0; i--) {
const potential: string = versions[i]
const satisfied: boolean = semver.satisfies(potential, versionSpec)
if (satisfied) {
version = potential
break
}
}
if (version) {
this.buildAgent.debug('matched: ' + version)
} else {
this.buildAgent.debug('match not found')
}
return version
}
public cleanVersion(version: string): string {
this.buildAgent.debug('cleaning: ' + version)
return semver.clean(version)
}
}