| /** |
| * @fileoverview `ConfigDependency` class. |
| * |
| * `ConfigDependency` class expresses a loaded parser or plugin. |
| * |
| * If the parser or plugin was loaded successfully, it has `definition` property |
| * and `filePath` property. Otherwise, it has `error` property. |
| * |
| * When `JSON.stringify()` converted a `ConfigDependency` object to a JSON, it |
| * omits `definition` property. |
| * |
| * `ConfigArrayFactory` creates `ConfigDependency` objects when it loads parsers |
| * or plugins. |
| * |
| * @author Toru Nagashima <https://github.com/mysticatea> |
| */ |
| "use strict"; |
| |
| const util = require("util"); |
| |
| /** |
| * The class is to store parsers or plugins. |
| * This class hides the loaded object from `JSON.stringify()` and `console.log`. |
| * @template T |
| */ |
| class ConfigDependency { |
| |
| /** |
| * Initialize this instance. |
| * @param {Object} data The dependency data. |
| * @param {T} [data.definition] The dependency if the loading succeeded. |
| * @param {Error} [data.error] The error object if the loading failed. |
| * @param {string} [data.filePath] The actual path to the dependency if the loading succeeded. |
| * @param {string} data.id The ID of this dependency. |
| * @param {string} data.importerName The name of the config file which loads this dependency. |
| * @param {string} data.importerPath The path to the config file which loads this dependency. |
| */ |
| constructor({ |
| definition = null, |
| error = null, |
| filePath = null, |
| id, |
| importerName, |
| importerPath |
| }) { |
| |
| /** |
| * The loaded dependency if the loading succeeded. |
| * @type {T|null} |
| */ |
| this.definition = definition; |
| |
| /** |
| * The error object if the loading failed. |
| * @type {Error|null} |
| */ |
| this.error = error; |
| |
| /** |
| * The loaded dependency if the loading succeeded. |
| * @type {string|null} |
| */ |
| this.filePath = filePath; |
| |
| /** |
| * The ID of this dependency. |
| * @type {string} |
| */ |
| this.id = id; |
| |
| /** |
| * The name of the config file which loads this dependency. |
| * @type {string} |
| */ |
| this.importerName = importerName; |
| |
| /** |
| * The path to the config file which loads this dependency. |
| * @type {string} |
| */ |
| this.importerPath = importerPath; |
| } |
| |
| /** |
| * @returns {Object} a JSON compatible object. |
| */ |
| toJSON() { |
| const obj = this[util.inspect.custom](); |
| |
| // Display `error.message` (`Error#message` is unenumerable). |
| if (obj.error instanceof Error) { |
| obj.error = { ...obj.error, message: obj.error.message }; |
| } |
| |
| return obj; |
| } |
| |
| /** |
| * @returns {Object} an object to display by `console.log()`. |
| */ |
| [util.inspect.custom]() { |
| const { |
| definition: _ignore, // eslint-disable-line no-unused-vars |
| ...obj |
| } = this; |
| |
| return obj; |
| } |
| } |
| |
| /** @typedef {ConfigDependency<import("../../shared/types").Parser>} DependentParser */ |
| /** @typedef {ConfigDependency<import("../../shared/types").Plugin>} DependentPlugin */ |
| |
| module.exports = { ConfigDependency }; |