12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- 'use strict';
- /**
- * Create a collection of Maps that serve to contextualize a given node.
- * This is useful to ensure that you only compare nodes that share a certain
- * context.
- *
- * All nodes are initially contextualized by their input source.
- * From there, you can contextualize them however you want.
- *
- * For a usage example, see `selector-no-descending-specificity`.
- */
- module.exports = function nodeContextLookup() {
- const contextMap = new Map();
- return {
- /**
- * @param {import('postcss').Node} node
- * @param {any[]} subContexts
- * @returns {Map<any, any>}
- */
- getContext(node, ...subContexts) {
- if (!node.source) throw new Error('The node source must be present');
- const nodeSource = node.source.input.from;
- const baseContext = creativeGetMap(contextMap, nodeSource);
- return subContexts.reduce((result, context) => creativeGetMap(result, context), baseContext);
- },
- };
- };
- /**
- * @param {Map<any, any>} someMap
- * @param {any} someThing
- */
- function creativeGetMap(someMap, someThing) {
- if (!someMap.has(someThing)) {
- someMap.set(someThing, new Map());
- }
- return someMap.get(someThing);
- }
|