diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-09-15 13:57:21 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-09-15 13:57:21 +0200 |
commit | 5a205346e3d125b1c834220ce98a206d88697811 (patch) | |
tree | 47700546d3b7a3e484975e37b1bb06e7efa88b92 /lib/utils | |
parent | e1930046599d430a6bb378af62bce78fb9d24ff7 (diff) | |
download | gitbook-5a205346e3d125b1c834220ce98a206d88697811.zip gitbook-5a205346e3d125b1c834220ce98a206d88697811.tar.gz gitbook-5a205346e3d125b1c834220ce98a206d88697811.tar.bz2 |
Jshint all files
Diffstat (limited to 'lib/utils')
-rw-r--r-- | lib/utils/batch.js | 8 | ||||
-rw-r--r-- | lib/utils/fs.js | 32 | ||||
-rw-r--r-- | lib/utils/git.js | 8 | ||||
-rw-r--r-- | lib/utils/i18n.js | 22 | ||||
-rw-r--r-- | lib/utils/images.js | 12 | ||||
-rw-r--r-- | lib/utils/links.js | 8 | ||||
-rw-r--r-- | lib/utils/logger.js | 18 | ||||
-rw-r--r-- | lib/utils/navigation.js | 6 | ||||
-rw-r--r-- | lib/utils/page.js | 75 | ||||
-rw-r--r-- | lib/utils/path.js | 23 | ||||
-rw-r--r-- | lib/utils/progress.js | 2 | ||||
-rw-r--r-- | lib/utils/server.js | 32 | ||||
-rw-r--r-- | lib/utils/string.js | 4 | ||||
-rw-r--r-- | lib/utils/watch.js | 12 |
14 files changed, 130 insertions, 132 deletions
diff --git a/lib/utils/batch.js b/lib/utils/batch.js index bd3b80f..9069766 100644 --- a/lib/utils/batch.js +++ b/lib/utils/batch.js @@ -3,12 +3,12 @@ var _ = require("lodash"); // Execute a method for all element function execEach(items, options) { - if (_.size(items) == 0) return Q(); + if (_.size(items) === 0) return Q(); var concurrents = 0, d = Q.defer(), pending = []; options = _.defaults(options || {}, { max: 100, - fn: function(item) {} + fn: function() {} }); @@ -29,7 +29,7 @@ function execEach(items, options) { // Next pending var next = pending.shift(); - if (concurrents == 0 && !next) { + if (concurrents === 0 && !next) { d.resolve(); } else if (next) { startItem.apply(null, next); @@ -38,7 +38,7 @@ function execEach(items, options) { .fail(function(err) { pending = []; d.reject(err); - }) + }); } _.each(items, startItem); diff --git a/lib/utils/fs.js b/lib/utils/fs.js index 176a215..0a9d846 100644 --- a/lib/utils/fs.js +++ b/lib/utils/fs.js @@ -9,10 +9,10 @@ var Ignore = require("fstream-ignore"); var fsUtils = { tmp: { file: function(opt) { - return Q.nfcall(tmp.file.bind(tmp), opt).get(0) + return Q.nfcall(tmp.file.bind(tmp), opt).get(0); }, dir: function() { - return Q.nfcall(tmp.dir.bind(tmp)).get(0) + return Q.nfcall(tmp.dir.bind(tmp)).get(0); } }, list: listFiles, @@ -34,14 +34,14 @@ var fsUtils = { readFileSync: fs.readFileSync.bind(fs), clean: cleanFolder, getUniqueFilename: getUniqueFilename, -} +}; // Write a file function writeFile(filename, data, options) { var d = Q.defer(); try { - fs.writeFileSync(filename, data, options) + fs.writeFileSync(filename, data, options); } catch(err) { d.reject(err); } @@ -57,14 +57,14 @@ function writeStream(filename, st) { var wstream = fs.createWriteStream(filename); - wstream.on('finish', function () { + wstream.on("finish", function () { d.resolve(); }); - wstream.on('error', function (err) { + wstream.on("error", function (err) { d.reject(err); }); - st.on('error', function(err) { + st.on("error", function(err) { d.reject(err); }); @@ -115,20 +115,20 @@ function listFiles(root, options) { }); // Add extra rules to ignore common folders - ig.addIgnoreRules(options.ignoreRules, '__custom_stuff'); + ig.addIgnoreRules(options.ignoreRules, "__custom_stuff"); // Push each file to our list - ig.on('child', function (c) { + ig.on("child", function (c) { files.push( - c.path.substr(c.root.path.length + 1) + (c.props.Directory === true ? '/' : '') + c.path.substr(c.root.path.length + 1) + (c.props.Directory === true ? "/" : "") ); }); - ig.on('end', function() { + ig.on("end", function() { // Normalize paths on Windows - if(process.platform === 'win32') { + if(process.platform === "win32") { return d.resolve(files.map(function(file) { - return file.replace(/\\/g, '/'); + return file.replace(/\\/g, "/"); })); } @@ -136,7 +136,7 @@ function listFiles(root, options) { return d.resolve(files); }); - ig.on('error', d.reject); + ig.on("error", d.reject); return d.promise; } @@ -150,8 +150,8 @@ function cleanFolder(root) { ignoreFiles: [], ignoreRules: [ // Skip Git and SVN stuff - '.git/', - '.svn/' + ".git/", + ".svn/" ] }) .then(function(files) { diff --git a/lib/utils/git.js b/lib/utils/git.js index 6eb9681..e93c8f2 100644 --- a/lib/utils/git.js +++ b/lib/utils/git.js @@ -1,7 +1,5 @@ var Q = require("q"); var _ = require("lodash"); -var url = require("url"); -var tmp = require("tmp"); var path = require("path"); var crc = require("crc"); var exec = Q.denodeify(require("child_process").exec); @@ -102,11 +100,11 @@ function resolveFileFromGit(giturl) { // Resolve relative path return path.resolve(repo, giturl.filepath); }); -}; +} // Return root of git repo from a filepath function resolveGitRoot(filepath) { - var relativeToGit, repoId + var relativeToGit, repoId; // No git repo cloned, or file is not in a git repository if (!GIT_TMP || !pathUtil.isInRoot(GIT_TMP, filepath)) return null; @@ -118,7 +116,7 @@ function resolveGitRoot(filepath) { // Return an absolute file return path.resolve(GIT_TMP, repoId); -}; +} module.exports = { diff --git a/lib/utils/i18n.js b/lib/utils/i18n.js index c3253b7..f6001f9 100644 --- a/lib/utils/i18n.js +++ b/lib/utils/i18n.js @@ -4,7 +4,7 @@ var fs = require("fs"); var i18n = require("i18n"); -var I18N_PATH = path.resolve(__dirname, "../../theme/i18n/") +var I18N_PATH = path.resolve(__dirname, "../../theme/i18n/"); var DEFAULT_LANGUAGE = "en"; var LOCALES = _.map(fs.readdirSync(I18N_PATH), function(lang) { return path.basename(lang, ".json"); @@ -17,7 +17,7 @@ i18n.configure({ updateFiles: false }); -var compareLocales = function(lang, locale) { +function compareLocales(lang, locale) { var langMain = _.first(lang.split("-")); var langSecond = _.last(lang.split("-")); @@ -28,7 +28,7 @@ var compareLocales = function(lang, locale) { if (localeMain == langMain) return 50; if (localeSecond == langSecond) return 20; return 0; -}; +} var normalizeLanguage = _.memoize(function(lang) { var language = _.chain(LOCALES) @@ -37,7 +37,7 @@ var normalizeLanguage = _.memoize(function(lang) { return { locale: locale, score: compareLocales(lang, locale) - } + }; }) .filter(function(lang) { return lang.score > 0; @@ -49,25 +49,25 @@ var normalizeLanguage = _.memoize(function(lang) { return language || lang; }); -var translate = function(locale, phrase) { +function translate(locale, phrase) { var args = Array.prototype.slice.call(arguments, 2); return i18n.__.apply({}, [{ locale: locale, phrase: phrase }].concat(args)); -}; +} -var getCatalog = function(locale) { +function getCatalog(locale) { locale = normalizeLanguage(locale); return i18n.getCatalog(locale); -}; +} -var getLocales = function() { +function getLocales() { return LOCALES; -}; +} -var hasLocale = function(locale) { +function hasLocale(locale) { return _.contains(LOCALES, locale); } diff --git a/lib/utils/images.js b/lib/utils/images.js index 3bc650a..a82b0a1 100644 --- a/lib/utils/images.js +++ b/lib/utils/images.js @@ -1,9 +1,7 @@ var _ = require("lodash"); var Q = require("q"); var fs = require("./fs"); -var spawn = require('spawn-cmd').spawn; - -var links = require("./links"); +var spawn = require("spawn-cmd").spawn; // Convert a svg file var convertSVG = function(source, dest, options) { @@ -14,16 +12,16 @@ var convertSVG = function(source, dest, options) { }); - //var command = shellescape(['svgexport', source, dest]); - var child = spawn('svgexport', [source, dest]); + //var command = shellescape(["svgexport", source, dest]); + var child = spawn("svgexport", [source, dest]); child.on("error", function(error) { - if (error.code == "ENOENT") error = new Error("Need to install 'svgexport' using 'npm install svgexport -g'"); + if (error.code == "ENOENT") error = new Error("Need to install \"svgexport\" using \"npm install svgexport -g\""); return d.reject(error); }); child.on("close", function(code) { - if (code == 0 && fs.existsSync(dest)) { + if (code === 0 && fs.existsSync(dest)) { d.resolve(); } else { d.reject(new Error("Error converting "+source+" into "+dest)); diff --git a/lib/utils/links.js b/lib/utils/links.js index 61cdc9a..589e0d7 100644 --- a/lib/utils/links.js +++ b/lib/utils/links.js @@ -1,5 +1,5 @@ -var url = require('url'); -var path = require('path'); +var url = require("url"); +var path = require("path"); // Is the link an external link var isExternal = function(href) { @@ -33,7 +33,7 @@ var isAnchor = function(href) { // Normalize a path to be a link var normalizeLink = function(s) { - return s.replace(/\\/g, '/'); + return s.replace(/\\/g, "/"); }; // Relative to absolute path @@ -43,7 +43,7 @@ var normalizeLink = function(s) { var toAbsolute = function(_href, dir, outdir) { if (isExternal(_href)) return _href; - // Path '_href' inside the base folder + // Path "_href" inside the base folder var hrefInRoot = path.normalize(path.join(dir, _href)); if (_href[0] == "/") hrefInRoot = path.normalize(_href.slice(1)); diff --git a/lib/utils/logger.js b/lib/utils/logger.js index 5c1da8c..db3d90e 100644 --- a/lib/utils/logger.js +++ b/lib/utils/logger.js @@ -1,6 +1,6 @@ -var _ = require('lodash'); -var util = require('util'); -var color = require('bash-color'); +var _ = require("lodash"); +var util = require("util"); +var color = require("bash-color"); var LEVELS = { DEBUG: 0, @@ -19,7 +19,7 @@ var COLORS = { module.exports = function(_write, logLevel) { var logger = {}; - var lastChar = '\n'; + var lastChar = "\n"; if (_.isString(logLevel)) logLevel = LEVELS[logLevel.toUpperCase()]; // Write a simple message @@ -47,14 +47,14 @@ module.exports = function(_write, logLevel) { var args = Array.prototype.slice.apply(arguments, [1]); var msg = logger.format.apply(logger, args); - if (lastChar == '\n') { + if (lastChar == "\n") { msg = COLORS[levelKey](levelKey.toLowerCase()+":")+" "+msg; } return logger.write(msg); }; logger.logLn = function() { - if (lastChar != '\n') logger.write("\n"); + if (lastChar != "\n") logger.write("\n"); var args = Array.prototype.slice.apply(arguments); args.push("\n"); @@ -66,7 +66,7 @@ module.exports = function(_write, logLevel) { var args = Array.prototype.slice.apply(arguments, [1]); var msg = logger.format.apply(logger, args); if (arguments.length > 1) { - logger.logLn(level, color.green('>> ') + msg.trim().replace(/\n/g, color.green('\n>> '))); + logger.logLn(level, color.green(">> ") + msg.trim().replace(/\n/g, color.green("\n>> "))); } else { logger.log(level, color.green("OK"), "\n"); } @@ -77,7 +77,7 @@ module.exports = function(_write, logLevel) { return logger.log(level, color.red("ERROR")+"\n"); }; - _.each(_.omit(LEVELS, 'DISABLED'), function(level, levelKey) { + _.each(_.omit(LEVELS, "DISABLED"), function(level, levelKey) { levelKey = levelKey.toLowerCase(); logger[levelKey] = _.partial(logger.log, level); @@ -93,7 +93,7 @@ module.exports = function(_write, logLevel) { logger[levelKey].fail(); throw err; }); - } + }; }); return logger; diff --git a/lib/utils/navigation.js b/lib/utils/navigation.js index d825c2c..d07eb35 100644 --- a/lib/utils/navigation.js +++ b/lib/utils/navigation.js @@ -1,9 +1,9 @@ -var _ = require('lodash'); +var _ = require("lodash"); // Cleans up an article/chapter object -// remove 'articles' attributes +// remove "articles" attributes function clean(obj) { - return obj && _.omit(obj, ['articles']); + return obj && _.omit(obj, ["articles"]); } function flattenChapters(chapters) { diff --git a/lib/utils/page.js b/lib/utils/page.js index 5b4eca8..a17c6a2 100644 --- a/lib/utils/page.js +++ b/lib/utils/page.js @@ -1,18 +1,18 @@ -var Q = require('q'); -var _ = require('lodash'); -var url = require('url'); -var path = require('path'); -var cheerio = require('cheerio'); -var domSerializer = require('dom-serializer'); -var request = require('request'); +var Q = require("q"); +var _ = require("lodash"); +var url = require("url"); +var path = require("path"); +var cheerio = require("cheerio"); +var domSerializer = require("dom-serializer"); +var request = require("request"); var crc = require("crc"); -var links = require('./links'); -var imgUtils = require('./images'); -var fs = require('./fs'); -var batch = require('./batch'); +var links = require("./links"); +var imgUtils = require("./images"); +var fs = require("./fs"); +var batch = require("./batch"); -var parsableExtensions = require('gitbook-parsers').extensions; +var parsableExtensions = require("gitbook-parsers").extensions; // Render a cheerio dom as html var renderDom = function($, dom, options) { @@ -40,7 +40,8 @@ function replaceText($, el, search, replace, text_only ) { if ( node ) { // Loop over all childNodes. - do { + while (node) { + // Only process text nodes. if ( node.nodeType === 3 ) { @@ -58,7 +59,7 @@ function replaceText($, el, search, replace, text_only ) { // robust way. $(node).before( new_val ); - // Don't remove the node yet, or the loop will lose its place. + // Don"t remove the node yet, or the loop will lose its place. remove.push( node ); } else { // The new value contains no HTML, so it can be set in this @@ -68,17 +69,18 @@ function replaceText($, el, search, replace, text_only ) { } } - } while ( node = node.nextSibling ); + node = node.nextSibling; + } } // Time to remove those elements! - remove.length && $(remove).remove(); + if (remove.length) $(remove).remove(); }); -}; +} function pregQuote( str ) { - return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1"); -}; + return (str+"").replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1"); +} // Adapt an html snippet to be relative to a base folder @@ -107,15 +109,16 @@ function normalizeHtml(src, options) { // Generate filename dest = "/"+fs.getUniqueFilename(outputRoot, dest); - svgContent[dest] = '<?xml version="1.0" encoding="UTF-8"?>'+content; + svgContent[dest] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+content; $(this).replaceWith($("<img>").attr("src", dest)); }); } // Find images to normalize $("img").each(function() { - var origin = undefined; + var origin; var src = $(this).attr("src"); + if (!src) return; var isExternal = links.isExternal(src); @@ -150,7 +153,7 @@ function normalizeHtml(src, options) { dest = links.join(path.dirname(srcAbs), path.basename(srcAbs, ext)+".png"); dest = dest[0] == "/"? dest.slice(1) : dest; - // Get a name that doesn't exists + // Get a name that doesn"t exists dest = fs.getUniqueFilename(outputRoot, dest); options.book.log.debug.ln("detect invalid image (will be converted to png):", srcAbs); @@ -205,9 +208,9 @@ function normalizeHtml(src, options) { // If md/adoc/rst files is not in summary // or for ebook, signal all files that are outside the summary - else if (_.contains(parsableExtensions, path.extname(absolutePath)) - || _.contains(['epub', 'pdf', 'mobi'], options.book.options.generator)) { - options.book.log.warn.ln("page", options.input, "contains an hyperlink to resource outside spine '"+href+"'"); + else if (_.contains(parsableExtensions, path.extname(absolutePath)) || + _.contains(["epub", "pdf", "mobi"], options.book.options.generator)) { + options.book.log.warn.ln("page", options.input, "contains an hyperlink to resource outside spine \""+href+"\""); } // Transform as absolute @@ -241,7 +244,7 @@ function normalizeHtml(src, options) { .value(); var source = $(this).text(); - var html = options.book.template.applyBlock('code', { + var html = options.book.template.applyBlock("code", { body: source, kwargs: { language: lang @@ -255,8 +258,9 @@ function normalizeHtml(src, options) { var glossary = _.sortBy(options.glossary, function(term) { return -term.name.length; }); + _.each(glossary, function(term) { - var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' ); + var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , "gi" ); var includedInFiles = false; $("*").each(function() { @@ -270,7 +274,7 @@ function normalizeHtml(src, options) { term.files = term.files || []; term.files.push(options.navigation[options.input]); } - return "<a href='"+links.toAbsolute("/GLOSSARY.html", options.base, options.output)+"#"+term.id+"' class='glossary-term' title='"+_.escape(term.description)+"'>"+match+"</a>"; + return "<a href=\""+links.toAbsolute("/GLOSSARY.html", options.base, options.output) + "#" + term.id+"\" class=\"glossary-term\" title=\""+_.escape(term.description)+"\">"+match+"</a>"; }); }); }); @@ -279,7 +283,7 @@ function normalizeHtml(src, options) { html: renderDom($), images: toConvert }; -}; +} // Convert svg images to png function convertImages(images, options) { @@ -304,7 +308,7 @@ function convertImages(images, options) { .fail(function(err) { if (!_.isError(err)) err = new Error(err); - err.message = 'Fail downloading '+image.origin+': '+err.message; + err.message = "Fail downloading "+image.origin+": "+err.message; throw err; }); }) @@ -327,8 +331,7 @@ function convertImages(images, options) { .then(function() { options.book.log.debug.ok(images.length+" images converted with success"); }); -}; - +} // Adapt page content to be relative to a base folder function normalizePage(sections, options) { @@ -361,7 +364,7 @@ function normalizePage(sections, options) { sections = _.map(sections, function(section) { if (section.type != "normal") return section; - var out = normalizeHtml(section.content, options);; + var out = normalizeHtml(section.content, options); toConvert = toConvert.concat(out.images); section.content = out.html; @@ -370,11 +373,11 @@ function normalizePage(sections, options) { return Q() .then(function() { - toConvert = _.uniq(toConvert, 'source'); + toConvert = _.uniq(toConvert, "source"); return convertImages(toConvert, options); }) .thenResolve(sections); -}; +} // Extract text from sections function extractText(sections) { @@ -388,7 +391,7 @@ function extractText(sections) { return prev; }, ""); -}; +} module.exports = { normalize: normalizePage, diff --git a/lib/utils/path.js b/lib/utils/path.js index d5b98f7..5285896 100644 --- a/lib/utils/path.js +++ b/lib/utils/path.js @@ -1,5 +1,5 @@ var _ = require("lodash"); -var path = require('path'); +var path = require("path"); // Return true if file path is inside a folder function isInRoot(root, filename) { @@ -10,28 +10,29 @@ function isInRoot(root, filename) { // Resolve paths in a specific folder // Throw error if file is outside this folder function resolveInRoot(root) { - var input = _.chain(arguments) + var input, result, err; + + input = _.chain(arguments) .toArray() .slice(1) - .reduce(function(current, p, i) { - // Handle path relative to book root ('/README.md') - if (p[0] == '/' || p[0] == '\\') return p.slice(1); + .reduce(function(current, p) { + // Handle path relative to book root ("/README.md") + if (p[0] == "/" || p[0] == "\\") return p.slice(1); return current? path.join(current, p) : path.normalize(p); - }, '') + }, "") .value(); - var result = path.resolve(root, input); + result = path.resolve(root, input); if (!isInRoot(root, result)) { - err = new Error("EACCESS: '" + result + "' not in '" + root + "'"); + err = new Error("EACCESS: \"" + result + "\" not in \"" + root + "\""); err.code = "EACCESS"; throw err; } - return result -}; - + return result; +} module.exports = { isInRoot: isInRoot, diff --git a/lib/utils/progress.js b/lib/utils/progress.js index 9669d86..78821ad 100644 --- a/lib/utils/progress.js +++ b/lib/utils/progress.js @@ -1,7 +1,7 @@ var _ = require("lodash"); // Returns from a navigation and a current file, a snapshot of current detailed state -var calculProgress = function(navigation, current) { +function calculProgress(navigation, current) { var n = _.size(navigation); var percent = 0, prevPercent = 0, currentChapter = null; var done = true; diff --git a/lib/utils/server.js b/lib/utils/server.js index 2b97fe8..1d6822f 100644 --- a/lib/utils/server.js +++ b/lib/utils/server.js @@ -1,11 +1,9 @@ -var Q = require('q'); -var _ = require('lodash'); - -var events = require('events'); -var http = require('http'); -var send = require('send'); -var util = require('util'); -var url = require('url'); +var Q = require("q"); +var events = require("events"); +var http = require("http"); +var send = require("send"); +var util = require("util"); +var url = require("url"); var Server = function() { this.running = null; @@ -17,7 +15,7 @@ util.inherits(Server, events.EventEmitter); // Return true if the server is running Server.prototype.isRunning = function() { - return this.running != null; + return !!this.running; }; // Stop the server @@ -57,25 +55,25 @@ Server.prototype.start = function(dir, port) { res.end(err.message); } - // Redirect to directory's index.html + // Redirect to directory"s index.html function redirect() { res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); + res.setHeader("Location", req.url + "/"); + res.end("Redirecting to " + req.url + "/"); } // Send file send(req, url.parse(req.url).pathname) .root(dir) - .on('error', error) - .on('directory', redirect) + .on("error", error) + .on("directory", redirect) .pipe(res); }); - that.running.on('connection', function (socket) { + that.running.on("connection", function (socket) { that.sockets.push(socket); socket.setTimeout(4000); - socket.on('close', function () { + socket.on("close", function () { that.sockets.splice(that.sockets.indexOf(socket), 1); }); }); @@ -91,6 +89,6 @@ Server.prototype.start = function(dir, port) { return d.promise; }); -} +}; module.exports = Server; diff --git a/lib/utils/string.js b/lib/utils/string.js index 72a9ca0..caa2364 100644 --- a/lib/utils/string.js +++ b/lib/utils/string.js @@ -1,7 +1,7 @@ var _ = require("lodash"); function escapeShellArg(arg) { - var ret = ''; + var ret = ""; ret = arg.replace(/"/g, '\\"'); @@ -11,7 +11,7 @@ function escapeShellArg(arg) { function optionsToShellArgs(options) { return _.chain(options) .map(function(value, key) { - if (value == null || value === false) return null; + if (value === null || value === undefined || value === false) return null; if (value === true) return key; return key+"="+escapeShellArg(value); }) diff --git a/lib/utils/watch.js b/lib/utils/watch.js index 3e73e47..4d1a752 100644 --- a/lib/utils/watch.js +++ b/lib/utils/watch.js @@ -1,9 +1,9 @@ -var Q = require('q'); -var _ = require('lodash'); -var path = require('path'); -var chokidar = require('chokidar'); +var Q = require("q"); +var _ = require("lodash"); +var path = require("path"); +var chokidar = require("chokidar"); -var parsers = require('gitbook-parsers') +var parsers = require("gitbook-parsers"); function watch(dir) { var d = Q.defer(); @@ -19,7 +19,7 @@ function watch(dir) { var watcher = chokidar.watch(toWatch, { cwd: dir, - ignored: '_book/**', + ignored: "_book/**", ignoreInitial: true }); |