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