123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /**
- * @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 };
|