You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					90 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					90 lines
				
				2.6 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | var utils = require('../utils'); | ||
|  | 
 | ||
|  | // internal
 | ||
|  | var reEscComments = /\\#/g; | ||
|  | // note that '^^' is used in place of escaped comments
 | ||
|  | var reUnescapeComments = /\^\^/g; | ||
|  | var reComments = /#.*$/; | ||
|  | var reEscapeChars = /[.|\-[\]()\\]/g; | ||
|  | var reAsterisk = /\*/g; | ||
|  | 
 | ||
|  | module.exports = add; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Converts file patterns or regular expressions to nodemon | ||
|  |  * compatible RegExp matching rules. Note: the `rules` argument | ||
|  |  * object is modified to include the new rule and new RegExp | ||
|  |  * | ||
|  |  * ### Example: | ||
|  |  * | ||
|  |  *     var rules = { watch: [], ignore: [] }; | ||
|  |  *     add(rules, 'watch', '*.js'); | ||
|  |  *     add(rules, 'ignore', '/public/'); | ||
|  |  *     add(rules, 'watch', ':(\d)*\.js'); // note: string based regexp
 | ||
|  |  *     add(rules, 'watch', /\d*\.js/); | ||
|  |  * | ||
|  |  * @param {Object} rules containing `watch` and `ignore`. Also updated during | ||
|  |  *                       execution | ||
|  |  * @param {String} which must be either "watch" or "ignore" | ||
|  |  * @param {String|RegExp} the actual rule. | ||
|  |  */ | ||
|  | function add(rules, which, rule) { | ||
|  |   if (!{ ignore: 1, watch: 1}[which]) { | ||
|  |     throw new Error('rules/index.js#add requires "ignore" or "watch" as the ' + | ||
|  |       'first argument'); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (Array.isArray(rule)) { | ||
|  |     rule.forEach(function (rule) { | ||
|  |       add(rules, which, rule); | ||
|  |     }); | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   // support the rule being a RegExp, but reformat it to
 | ||
|  |   // the custom :<regexp> format that we're working with.
 | ||
|  |   if (rule instanceof RegExp) { | ||
|  |     // rule = ':' + rule.toString().replace(/^\/(.*?)\/$/g, '$1');
 | ||
|  |     utils.log.error('RegExp format no longer supported, but globs are.'); | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   // remove comments and trim lines
 | ||
|  |   // this mess of replace methods is escaping "\#" to allow for emacs temp files
 | ||
|  | 
 | ||
|  |   // first up strip comments and remove blank head or tails
 | ||
|  |   rule = (rule || '').replace(reEscComments, '^^') | ||
|  |              .replace(reComments, '') | ||
|  |              .replace(reUnescapeComments, '#').trim(); | ||
|  | 
 | ||
|  |   var regexp = false; | ||
|  | 
 | ||
|  |   if (typeof rule === 'string' && rule.substring(0, 1) === ':') { | ||
|  |     rule = rule.substring(1); | ||
|  |     utils.log.error('RegExp no longer supported: ' + rule); | ||
|  |     regexp = true; | ||
|  |   } else if (rule.length === 0) { | ||
|  |     // blank line (or it was a comment)
 | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (regexp) { | ||
|  |     // rules[which].push(rule);
 | ||
|  |   } else { | ||
|  |     // rule = rule.replace(reEscapeChars, '\\$&')
 | ||
|  |     // .replace(reAsterisk, '.*');
 | ||
|  | 
 | ||
|  |     rules[which].push(rule); | ||
|  |     // compile a regexp of all the rules for this ignore or watch
 | ||
|  |     var re = rules[which].map(function (rule) { | ||
|  |       return rule.replace(reEscapeChars, '\\$&') | ||
|  |                  .replace(reAsterisk, '.*'); | ||
|  |     }).join('|'); | ||
|  | 
 | ||
|  |     // used for the directory matching
 | ||
|  |     rules[which].re = new RegExp(re); | ||
|  |   } | ||
|  | } |