blob: b93f2058bb2df8dd4e573703923c5ac36dff84d3 [file] [log] [blame]
var util = require('util')
var Promise = require('bluebird')
var semver = require('semver')
var minimatch = require('minimatch')
var wire = require('../wire')
function RequirementMismatchError(name) {
Error.call(this)
this.name = 'RequirementMismatchError'
this.message = util.format('Requirement mismatch for "%s"', name)
Error.captureStackTrace(this, RequirementMismatchError)
}
util.inherits(RequirementMismatchError, Error)
module.exports.RequirementMismatchError = RequirementMismatchError
function AlreadyGroupedError() {
Error.call(this)
this.name = 'AlreadyGroupedError'
this.message = 'Already a member of another group'
Error.captureStackTrace(this, AlreadyGroupedError)
}
util.inherits(AlreadyGroupedError, Error)
module.exports.AlreadyGroupedError = AlreadyGroupedError
function NoGroupError() {
Error.call(this)
this.name = 'NoGroupError'
this.message = 'Not a member of any group'
Error.captureStackTrace(this, NoGroupError)
}
util.inherits(NoGroupError, Error)
module.exports.NoGroupError = NoGroupError
module.exports.match = Promise.method(function(capabilities, requirements) {
return requirements.every(function(req) {
var capability = capabilities[req.name]
if (!capability) {
throw new RequirementMismatchError(req.name)
}
switch (req.type) {
case wire.RequirementType.SEMVER:
if (!semver.satisfies(capability, req.value)) {
throw new RequirementMismatchError(req.name)
}
break
case wire.RequirementType.GLOB:
if (!minimatch(capability, req.value)) {
throw new RequirementMismatchError(req.name)
}
break
case wire.RequirementType.EXACT:
if (capability !== req.value) {
throw new RequirementMismatchError(req.name)
}
break
default:
throw new RequirementMismatchError(req.name)
}
return true
})
})