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 }) })