| class Rule { | 
|   constructor({ test, value }) { | 
|     if (!(test instanceof RegExp)) { | 
|       throw new TypeError('`test` should be a regexp'); | 
|     } | 
|   | 
|     this.test = test; | 
|     this.value = value; | 
|   } | 
|   | 
|   /** | 
|    * @param {string} value | 
|    * @return {boolean} | 
|    */ | 
|   match(value) { | 
|     return this.test.test(value); | 
|   } | 
| } | 
|   | 
| class RuleSet { | 
|   /** | 
|    * @param {Array<{test: RegExp, uri: string}>} rules | 
|    */ | 
|   constructor(rules) { | 
|     if (!Array.isArray(rules)) { | 
|       throw new TypeError('`data` should be an array'); | 
|     } | 
|   | 
|     this.rules = rules.map(params => new Rule(params)); | 
|   } | 
|   | 
|   /** | 
|    * @param {string} value | 
|    * @return {Rule|null} | 
|    */ | 
|   getMatchedRule(value) { | 
|     return this.rules.find(rule => rule.match(value)) || null; | 
|   } | 
| } | 
|   | 
| module.exports = RuleSet; | 
| module.exports.Rule = Rule; |