Permalink
Cannot retrieve contributors at this time
| /** | |
| * @fileoverview `Map` to load rules lazily. | |
| * @author Toru Nagashima <https://github.com/mysticatea> | |
| */ | |
| "use strict"; | |
| const debug = require("debug")("eslint:rules"); | |
| /** @typedef {import("./types").Rule} Rule */ | |
| /** | |
| * The `Map` object that loads each rule when it's accessed. | |
| * @example | |
| * const rules = new LazyLoadingRuleMap([ | |
| * ["eqeqeq", () => require("eqeqeq")], | |
| * ["semi", () => require("semi")], | |
| * ["no-unused-vars", () => require("no-unused-vars")], | |
| * ]) | |
| * | |
| * rules.get("semi") // call `() => require("semi")` here. | |
| * | |
| * @extends {Map<string, () => Rule>} | |
| */ | |
| class LazyLoadingRuleMap extends Map { | |
| /** | |
| * Initialize this map. | |
| * @param {Array<[string, function(): Rule]>} loaders The rule loaders. | |
| */ | |
| constructor(loaders) { | |
| let remaining = loaders.length; | |
| super( | |
| debug.enabled | |
| ? loaders.map(([ruleId, load]) => { | |
| let cache = null; | |
| return [ | |
| ruleId, | |
| () => { | |
| if (!cache) { | |
| debug("Loading rule %o (remaining=%d)", ruleId, --remaining); | |
| cache = load(); | |
| } | |
| return cache; | |
| } | |
| ]; | |
| }) | |
| : loaders | |
| ); | |
| // `super(...iterable)` uses `this.set()`, so disable it here. | |
| Object.defineProperty(LazyLoadingRuleMap.prototype, "set", { | |
| configurable: true, | |
| value: void 0 | |
| }); | |
| } | |
| /** | |
| * Get a rule. | |
| * Each rule will be loaded on the first access. | |
| * @param {string} ruleId The rule ID to get. | |
| * @returns {Rule|undefined} The rule. | |
| */ | |
| get(ruleId) { | |
| const load = super.get(ruleId); | |
| return load && load(); | |
| } | |
| /** | |
| * Iterate rules. | |
| * @returns {IterableIterator<Rule>} Rules. | |
| */ | |
| *values() { | |
| for (const load of super.values()) { | |
| yield load(); | |
| } | |
| } | |
| /** | |
| * Iterate rules. | |
| * @returns {IterableIterator<[string, Rule]>} Rules. | |
| */ | |
| *entries() { | |
| for (const [ruleId, load] of super.entries()) { | |
| yield [ruleId, load()]; | |
| } | |
| } | |
| /** | |
| * Call a function with each rule. | |
| * @param {Function} callbackFn The callback function. | |
| * @param {any} [thisArg] The object to pass to `this` of the callback function. | |
| * @returns {void} | |
| */ | |
| forEach(callbackFn, thisArg) { | |
| for (const [ruleId, load] of super.entries()) { | |
| callbackFn.call(thisArg, load(), ruleId, this); | |
| } | |
| } | |
| } | |
| // Forbid mutation. | |
| Object.defineProperties(LazyLoadingRuleMap.prototype, { | |
| clear: { configurable: true, value: void 0 }, | |
| delete: { configurable: true, value: void 0 }, | |
| [Symbol.iterator]: { | |
| configurable: true, | |
| writable: true, | |
| value: LazyLoadingRuleMap.prototype.entries | |
| } | |
| }); | |
| module.exports = { LazyLoadingRuleMap }; |