Spaces:
Sleeping
Sleeping
| ; | |
| 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); | |
| } | |
| } | |