12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 'use strict';
- const levenshtein = require('fastest-levenshtein');
- const rules = require('./rules');
- const MAX_LEVENSHTEIN_DISTANCE = 6;
- const MAX_SUGGESTIONS_COUNT = 3;
- /**
- * @param {string} ruleName
- * @return {string[]}
- */
- function extractSuggestions(ruleName) {
- const suggestions = Array.from({ length: MAX_LEVENSHTEIN_DISTANCE });
- for (let i = 0; i < suggestions.length; i++) {
- suggestions[i] = [];
- }
- for (const existRuleName of Object.keys(rules)) {
- const distance = levenshtein.distance(existRuleName, ruleName);
- if (distance <= MAX_LEVENSHTEIN_DISTANCE) {
- suggestions[distance - 1].push(existRuleName);
- }
- }
- /** @type {string[]} */
- let result = [];
- for (const [i, suggestion] of suggestions.entries()) {
- if (suggestion.length > 0) {
- if (i < 3) {
- return suggestion.slice(0, MAX_SUGGESTIONS_COUNT);
- }
- result = result.concat(suggestion);
- }
- }
- return result.slice(0, MAX_SUGGESTIONS_COUNT);
- }
- /**
- * @param {string} ruleName
- * @param {string[]} [suggestions=[]]
- * @return {string}
- */
- function rejectMessage(ruleName, suggestions = []) {
- return `Unknown rule ${ruleName}.${
- suggestions.length > 0 ? ` Did you mean ${suggestions.join(', ')}?` : ''
- }`;
- }
- /** @type {Map<string, string[]>} */
- const cache = new Map();
- /**
- * @param {string} unknownRuleName
- * @param {import('postcss').Root} postcssRoot
- * @param {import('stylelint').PostcssResult} postcssResult
- * @returns {void}
- */
- module.exports = function reportUnknownRuleNames(unknownRuleName, postcssRoot, postcssResult) {
- const suggestions = cache.has(unknownRuleName)
- ? /** @type {string[]} */ (cache.get(unknownRuleName))
- : extractSuggestions(unknownRuleName);
- cache.set(unknownRuleName, suggestions);
- postcssResult.warn(rejectMessage(unknownRuleName, suggestions), {
- severity: 'error',
- rule: unknownRuleName,
- node: postcssRoot,
- index: 0,
- });
- };
|