| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | /** * @fileoverview Responsible for caching config files * @author Sylvan Mably */"use strict";//------------------------------------------------------------------------------// Helpers//------------------------------------------------------------------------------/** * Get a string hash for a config vector * @param {Array<Object>} vector config vector to hash * @returns {string} hash of the vector values * @private */function hash(vector) {    return JSON.stringify(vector);}//------------------------------------------------------------------------------// API//------------------------------------------------------------------------------/** * Configuration caching class */module.exports = class ConfigCache {    constructor() {        this.configFullNameCache = new Map();        this.localHierarchyCache = new Map();        this.mergedVectorCache = new Map();        this.mergedCache = new Map();    }    /**     * Gets a config object from the cache for the specified config file path.     * @param {string} configFullName the name of the configuration as used in the eslint config(e.g. 'plugin:node/recommended'),     * or the absolute path to a config file. This should uniquely identify a config.     * @returns {Object|null} config object, if found in the cache, otherwise null     * @private     */    getConfig(configFullName) {        return this.configFullNameCache.get(configFullName);    }    /**     * Sets a config object in the cache for the specified config file path.     * @param {string} configFullName the name of the configuration as used in the eslint config(e.g. 'plugin:node/recommended'),     * or the absolute path to a config file. This should uniquely identify a config.     * @param {Object} config the config object to add to the cache     * @returns {void}     * @private     */    setConfig(configFullName, config) {        this.configFullNameCache.set(configFullName, config);    }    /**     * Gets a list of hierarchy-local config objects that apply to the specified directory.     * @param {string} directory the path to the directory     * @returns {Object[]|null} a list of config objects, if found in the cache, otherwise null     * @private     */    getHierarchyLocalConfigs(directory) {        return this.localHierarchyCache.get(directory);    }    /**     * For each of the supplied parent directories, sets the list of config objects for that directory to the     * appropriate subset of the supplied parent config objects.     * @param {string[]} parentDirectories a list of parent directories to add to the config cache     * @param {Object[]} parentConfigs a list of config objects that apply to the lowest directory in parentDirectories     * @returns {void}     * @private     */    setHierarchyLocalConfigs(parentDirectories, parentConfigs) {        parentDirectories.forEach((localConfigDirectory, i) => {            const directoryParentConfigs = parentConfigs.slice(0, parentConfigs.length - i);            this.localHierarchyCache.set(localConfigDirectory, directoryParentConfigs);        });    }    /**     * Gets a merged config object corresponding to the supplied vector.     * @param {Array<Object>} vector the vector to find a merged config for     * @returns {Object|null} a merged config object, if found in the cache, otherwise null     * @private     */    getMergedVectorConfig(vector) {        return this.mergedVectorCache.get(hash(vector));    }    /**     * Sets a merged config object in the cache for the supplied vector.     * @param {Array<Object>} vector the vector to save a merged config for     * @param {Object} config the merged config object to add to the cache     * @returns {void}     * @private     */    setMergedVectorConfig(vector, config) {        this.mergedVectorCache.set(hash(vector), config);    }    /**     * Gets a merged config object corresponding to the supplied vector, including configuration options from outside     * the vector.     * @param {Array<Object>} vector the vector to find a merged config for     * @returns {Object|null} a merged config object, if found in the cache, otherwise null     * @private     */    getMergedConfig(vector) {        return this.mergedCache.get(hash(vector));    }    /**     * Sets a merged config object in the cache for the supplied vector, including configuration options from outside     * the vector.     * @param {Array<Object>} vector the vector to save a merged config for     * @param {Object} config the merged config object to add to the cache     * @returns {void}     * @private     */    setMergedConfig(vector, config) {        this.mergedCache.set(hash(vector), config);    }};
 |