UNPKG

1.92 kBJavaScriptView Raw
1'use strict';
2
3const levenshtein = require('fastest-levenshtein');
4const rules = require('./rules');
5
6const MAX_LEVENSHTEIN_DISTANCE = 6;
7const MAX_SUGGESTIONS_COUNT = 3;
8
9/**
10 * @param {string} ruleName
11 * @return {string[]}
12 */
13function extractSuggestions(ruleName) {
14 const suggestions = new Array(MAX_LEVENSHTEIN_DISTANCE);
15
16 for (let i = 0; i < suggestions.length; i++) {
17 suggestions[i] = [];
18 }
19
20 Object.keys(rules).forEach((existRuleName) => {
21 const distance = levenshtein.distance(existRuleName, ruleName);
22
23 if (distance <= MAX_LEVENSHTEIN_DISTANCE) {
24 suggestions[distance - 1].push(existRuleName);
25 }
26 });
27
28 /** @type {string[]} */
29 let result = [];
30
31 for (let i = 0; i < suggestions.length; i++) {
32 if (suggestions[i].length > 0) {
33 if (i < 3) {
34 return suggestions[i].slice(0, MAX_SUGGESTIONS_COUNT);
35 }
36
37 result = result.concat(suggestions[i]);
38 }
39 }
40
41 return result.slice(0, MAX_SUGGESTIONS_COUNT);
42}
43
44/**
45 * @param {string} ruleName
46 * @param {string[]} [suggestions=[]]
47 * @return {string}
48 */
49function rejectMessage(ruleName, suggestions = []) {
50 return `Unknown rule ${ruleName}.${
51 suggestions.length > 0 ? ` Did you mean ${suggestions.join(', ')}?` : ''
52 }`;
53}
54
55/** @type {Map<string, string[]>} */
56const cache = new Map();
57
58/**
59 * @param {string} unknownRuleName
60 * @param {import('postcss').Root} postcssRoot
61 * @param {import('stylelint').PostcssResult} postcssResult
62 * @returns {void}
63 */
64module.exports = function reportUnknownRuleNames(unknownRuleName, postcssRoot, postcssResult) {
65 const suggestions = cache.has(unknownRuleName)
66 ? /** @type {string[]} */ (cache.get(unknownRuleName))
67 : extractSuggestions(unknownRuleName);
68 const warningProperties = {
69 severity: 'error',
70 rule: unknownRuleName,
71 node: postcssRoot,
72 index: 0,
73 };
74
75 cache.set(unknownRuleName, suggestions);
76 postcssResult.warn(rejectMessage(unknownRuleName, suggestions), warningProperties);
77};