| /** | |
| * @fileoverview Tools for obtaining SourceCode objects. | |
| * @author Ian VanSchooten | |
| */ | |
| "use strict"; | |
| //------------------------------------------------------------------------------ | |
| // Requirements | |
| //------------------------------------------------------------------------------ | |
| const { CLIEngine } = require("../cli-engine"); | |
| /* | |
| * This is used for: | |
| * | |
| * 1. Enumerate target file because we have not expose such a API on `CLIEngine` | |
| * (https://github.com/eslint/eslint/issues/11222). | |
| * 2. Create `SourceCode` instances. Because we don't have any function which | |
| * instantiate `SourceCode` so it needs to take the created `SourceCode` | |
| * instance out after linting. | |
| * | |
| * TODO1: Expose the API that enumerates target files. | |
| * TODO2: Extract the creation logic of `SourceCode` from `Linter` class. | |
| */ | |
| const { getCLIEngineInternalSlots } = require("../cli-engine/cli-engine"); // eslint-disable-line no-restricted-modules | |
| const debug = require("debug")("eslint:source-code-utils"); | |
| //------------------------------------------------------------------------------ | |
| // Helpers | |
| //------------------------------------------------------------------------------ | |
| /** | |
| * Get the SourceCode object for a single file | |
| * @param {string} filename The fully resolved filename to get SourceCode from. | |
| * @param {Object} engine A CLIEngine. | |
| * @returns {Array} Array of the SourceCode object representing the file | |
| * and fatal error message. | |
| */ | |
| function getSourceCodeOfFile(filename, engine) { | |
| debug("getting sourceCode of", filename); | |
| const results = engine.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}`); | |
| } | |
| // TODO: extract the logic that creates source code objects to `SourceCode#parse(text, options)` or something like. | |
| const { linter } = getCLIEngineInternalSlots(engine); | |
| const sourceCode = 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} options A CLIEngine options object. If not provided, the default cli options will be used. | |
| * @param {progressCallback} callback Callback for reporting execution status | |
| * @returns {Object} The SourceCode of all processed files. | |
| */ | |
| function getSourceCodeOfFiles(patterns, options, callback) { | |
| const sourceCodes = {}; | |
| const globPatternsList = typeof patterns === "string" ? [patterns] : patterns; | |
| const engine = new CLIEngine({ ...options, rules: {} }); | |
| // TODO: make file iteration as a public API and use it. | |
| const { fileEnumerator } = getCLIEngineInternalSlots(engine); | |
| const filenames = | |
| Array.from(fileEnumerator.iterateFiles(globPatternsList)) | |
| .filter(entry => !entry.ignored) | |
| .map(entry => entry.filePath); | |
| if (filenames.length === 0) { | |
| debug(`Did not find any files matching pattern(s): ${globPatternsList}`); | |
| } | |
| filenames.forEach(filename => { | |
| const sourceCode = getSourceCodeOfFile(filename, engine); | |
| 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 | |
| }; |