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.
89 lines
2.6 KiB
89 lines
2.6 KiB
'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} rule 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); |
|
} |
|
}
|
|
|