Spaces:
Runtime error
Runtime error
/** | |
* @fileoverview `Map` to load rules lazily. | |
* @author Toru Nagashima <https://github.com/mysticatea> | |
*/ | |
; | |
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 }; | |