Skip to content

Commit

Permalink
Refactor to use sourceIndices utility from `@csstools/css-parser-al…
Browse files Browse the repository at this point in the history
…gorithms` (#7033)
  • Loading branch information
romainmenke committed Jul 3, 2023
1 parent 3f91eaa commit 15c15b6
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 139 deletions.
7 changes: 4 additions & 3 deletions lib/rules/media-feature-name-unit-allowed-list/index.js
@@ -1,15 +1,16 @@
'use strict';

const report = require('../../utils/report');
const ruleMessages = require('../../utils/ruleMessages');
const validateOptions = require('../../utils/validateOptions');
const { TokenType } = require('@csstools/css-tokenizer');
const { isTokenNode } = require('@csstools/css-parser-algorithms');
const {
isMediaFeaturePlain,
isMediaFeatureRange,
isMediaQueryInvalid,
} = require('@csstools/media-query-list-parser');

const report = require('../../utils/report');
const ruleMessages = require('../../utils/ruleMessages');
const validateOptions = require('../../utils/validateOptions');
const validateObjectWithArrayProps = require('../../utils/validateObjectWithArrayProps');
const { isString } = require('../../utils/validateTypes');
const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
Expand Down
37 changes: 2 additions & 35 deletions lib/rules/media-feature-name-value-allowed-list/index.js
@@ -1,5 +1,6 @@
'use strict';

const { sourceIndices } = require('@csstools/css-parser-algorithms');
const {
isMediaQueryInvalid,
isMediaFeature,
Expand Down Expand Up @@ -80,7 +81,7 @@ const rule = (primary) => {
}

const atRuleIndex = atRuleParamIndex(atRule);
const [startIndex, endIndex] = startAndEndIndex(componentValues);
const [startIndex, endIndex] = sourceIndices(componentValues);

report({
index: atRuleIndex + startIndex,
Expand All @@ -97,40 +98,6 @@ const rule = (primary) => {
};
};

/**
* A recursive function that returns the start and end boundaries of a node.
*
* @template {import('@csstools/css-tokenizer').CSSToken} T
* @param {Array<{ tokens(): Array<T> }> | { tokens(): Array<T> }} node
* @returns {[number, number]}
*/
function startAndEndIndex(node) {
if (Array.isArray(node)) {
const nodeStart = node[0];

if (!nodeStart) return [0, 0];

const nodeEnd = node[node.length - 1] || nodeStart;

const [startA] = startAndEndIndex(nodeStart);
const [, endB] = startAndEndIndex(nodeEnd);

return [startA, endB];
}

const tokens = node.tokens();

const firstToken = tokens[0];
const lastToken = tokens[tokens.length - 1];

if (!firstToken || !lastToken) return [0, 0];

const start = firstToken[2];
const end = lastToken[3];

return [start, end];
}

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
Expand Down
40 changes: 3 additions & 37 deletions lib/rules/media-feature-name-value-no-unknown/index.js
@@ -1,7 +1,7 @@
'use strict';

const { TokenType, NumberType } = require('@csstools/css-tokenizer');
const { isTokenNode, isFunctionNode } = require('@csstools/css-parser-algorithms');
const { isTokenNode, isFunctionNode, sourceIndices } = require('@csstools/css-parser-algorithms');
const {
isMediaFeature,
isMediaFeatureValue,
Expand Down Expand Up @@ -161,7 +161,7 @@ const rule = (primary) => {
}

// An unexpected function or a media feature that doesn't support types that can be the result of a function.
reporter(state, functionNode.toString(), ...startAndEndIndex(functionNode));
reporter(state, functionNode.toString(), ...sourceIndices(functionNode));
}

/**
Expand All @@ -187,7 +187,7 @@ const rule = (primary) => {
reporter(
state,
componentValues.map((x) => x.toString()).join(''),
...startAndEndIndex(componentValues),
...sourceIndices(componentValues),
);
}

Expand Down Expand Up @@ -271,40 +271,6 @@ const rule = (primary) => {
};
};

/**
* A recursive function that returns the start and end boundaries of a node.
*
* @template {import('@csstools/css-tokenizer').CSSToken} T
* @param {Array<{ tokens(): Array<T> }> | { tokens(): Array<T> }} node
* @returns {[number, number]}
*/
function startAndEndIndex(node) {
if (Array.isArray(node)) {
const nodeStart = node[0];

if (!nodeStart) return [0, 0];

const nodeEnd = node[node.length - 1] || nodeStart;

const [startA] = startAndEndIndex(nodeStart);
const [, endB] = startAndEndIndex(nodeEnd);

return [startA, endB];
}

const tokens = node.tokens();

const firstToken = tokens[0];
const lastToken = tokens[tokens.length - 1];

if (!firstToken || !lastToken) return [0, 0];

const start = firstToken[2];
const end = lastToken[3];

return [start, end];
}

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
Expand Down
16 changes: 3 additions & 13 deletions lib/rules/media-feature-range-notation/index.js
@@ -1,5 +1,7 @@
'use strict';

const { TokenType } = require('@csstools/css-tokenizer');
const { TokenNode, sourceIndices } = require('@csstools/css-parser-algorithms');
const {
MediaFeatureName,
MediaFeatureRangeNameValue,
Expand All @@ -8,8 +10,6 @@ const {
isMediaFeatureRange,
isMediaQueryInvalid,
} = require('@csstools/media-query-list-parser');
const { TokenNode } = require('@csstools/css-parser-algorithms');
const { TokenType } = require('@csstools/css-tokenizer');

const atRuleParamIndex = require('../../utils/atRuleParamIndex');
const parseMediaQuery = require('../../utils/parseMediaQuery');
Expand Down Expand Up @@ -94,17 +94,7 @@ const rule = (primary, _secondaryOptions, context) => {
return;
}

const tokens = node.tokens();
const firstToken = tokens[0];
const lastToken = tokens[tokens.length - 1];

let startIndex = 0;
let endIndex = atRule.params.length;

if (firstToken && lastToken) {
startIndex = firstToken[2];
endIndex = lastToken[3];
}
const [startIndex, endIndex] = sourceIndices(node);

const atRuleIndex = atRuleParamIndex(atRule);

Expand Down
23 changes: 2 additions & 21 deletions lib/rules/media-query-no-invalid/index.js
@@ -1,5 +1,6 @@
'use strict';

const { sourceIndices } = require('@csstools/css-parser-algorithms');
const {
isMediaQueryInvalid,
isGeneralEnclosed,
Expand Down Expand Up @@ -116,7 +117,7 @@ const rule = (primary) => {
const atRuleParamIndexValue = atRuleParamIndex(atRule);

invalidNodes.forEach((invalidNode) => {
const [start, end] = startAndEndIndex(invalidNode);
const [start, end] = sourceIndices(invalidNode);

report({
message: messages.rejected,
Expand All @@ -132,26 +133,6 @@ const rule = (primary) => {
};
};

/**
* A function that returns the start and end boundaries of a node.
*
* @param {{ tokens(): Array<import('@csstools/css-tokenizer').CSSToken> }} node
* @returns {[number, number]}
*/
function startAndEndIndex(node) {
const tokens = node.tokens();

const firstToken = tokens[0];
const lastToken = tokens[tokens.length - 1];

if (!firstToken || !lastToken) return [0, 0];

const start = firstToken[2];
const end = lastToken[3];

return [start, end];
}

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
Expand Down
60 changes: 33 additions & 27 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Expand Up @@ -130,10 +130,10 @@
]
},
"dependencies": {
"@csstools/css-parser-algorithms": "^2.2.0",
"@csstools/css-parser-algorithms": "^2.3.0",
"@csstools/css-tokenizer": "^2.1.1",
"@csstools/media-query-list-parser": "^2.1.1",
"@csstools/selector-specificity": "^2.2.0",
"@csstools/media-query-list-parser": "^2.1.2",
"@csstools/selector-specificity": "^3.0.0",
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
"cosmiconfig": "^8.2.0",
Expand Down

0 comments on commit 15c15b6

Please sign in to comment.