| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | /** * @fileoverview Tools for obtaining SourceCode objects. * @author Ian VanSchooten */"use strict";//------------------------------------------------------------------------------// Requirements//------------------------------------------------------------------------------const CLIEngine = require("../cli-engine"),    globUtil = require("./glob-util"),    baseDefaultOptions = require("../../conf/default-cli-options");const debug = require("debug")("eslint:source-code-util");//------------------------------------------------------------------------------// Helpers//------------------------------------------------------------------------------/** * Get the SourceCode object for a single file * @param   {string}     filename The fully resolved filename to get SourceCode from. * @param   {Object}     options  A CLIEngine options object. * @returns {Array}               Array of the SourceCode object representing the file *                                and fatal error message. */function getSourceCodeOfFile(filename, options) {    debug("getting sourceCode of", filename);    const opts = Object.assign({}, options, { rules: {} });    const cli = new CLIEngine(opts);    const results = cli.executeOnFiles([filename]);    if (results && results.results[0] && results.results[0].messages[0] && results.results[0].messages[0].fatal) {        const msg = results.results[0].messages[0];        throw new Error(`(${filename}:${msg.line}:${msg.column}) ${msg.message}`);    }    const sourceCode = cli.linter.getSourceCode();    return sourceCode;}//------------------------------------------------------------------------------// Public Interface//------------------------------------------------------------------------------/** * This callback is used to measure execution status in a progress bar * @callback progressCallback * @param {number} The total number of times the callback will be called. *//** * Gets the SourceCode of a single file, or set of files. * @param {string[]|string} patterns A filename, directory name, or glob, or an array of them * @param {Object} [providedOptions] A CLIEngine options object. If not provided, the default cli options will be used. * @param {progressCallback} [providedCallback] Callback for reporting execution status * @returns {Object} The SourceCode of all processed files. */function getSourceCodeOfFiles(patterns, providedOptions, providedCallback) {    const sourceCodes = {};    const globPatternsList = typeof patterns === "string" ? [patterns] : patterns;    let options, callback;    const defaultOptions = Object.assign({}, baseDefaultOptions, { cwd: process.cwd() });    if (typeof providedOptions === "undefined") {        options = defaultOptions;        callback = null;    } else if (typeof providedOptions === "function") {        callback = providedOptions;        options = defaultOptions;    } else if (typeof providedOptions === "object") {        options = Object.assign({}, defaultOptions, providedOptions);        callback = providedCallback;    }    debug("constructed options:", options);    const resolvedPatterns = globUtil.resolveFileGlobPatterns(globPatternsList, options);    const filenames = globUtil.listFilesToProcess(resolvedPatterns, options)        .filter(fileInfo => !fileInfo.ignored)        .reduce((files, fileInfo) => files.concat(fileInfo.filename), []);    if (filenames.length === 0) {        debug(`Did not find any files matching pattern(s): ${resolvedPatterns}`);    }    filenames.forEach(filename => {        const sourceCode = getSourceCodeOfFile(filename, options);        if (sourceCode) {            debug("got sourceCode of", filename);            sourceCodes[filename] = sourceCode;        }        if (callback) {            callback(filenames.length); // eslint-disable-line callback-return        }    });    return sourceCodes;}module.exports = {    getSourceCodeOfFiles};
 |