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