57 lines
1.7 KiB
TypeScript
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)
|
|
}
|
|
}
|