Skip to content

Commit 2f80d77

Browse files
authored
display multiple suggestions when a config has an unknown feature (#1062)
1 parent abd5daa commit 2f80d77

File tree

4 files changed

+29
-28
lines changed

4 files changed

+29
-28
lines changed

plugin-packs/postcss-preset-env/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
### Unreleased (patch)
44

5+
- Display multiple feature suggestions when an unknown feature is used in plugin options
56
- Fix `env` option for plugin specific options by @BPScott
67

78
### 9.1.0

plugin-packs/postcss-preset-env/dist/index.cjs

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

plugin-packs/postcss-preset-env/dist/index.mjs

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

plugin-packs/postcss-preset-env/src/plugins/plugin-id-help.mjs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,38 @@ export function pluginIdHelp(featureNamesInOptions, root, result) {
1010
return;
1111
}
1212

13-
const byId = mostSimilar(featureName, featureNames);
14-
const byPackage = mostSimilar(featureName, packageNames);
13+
const suggestions = [
14+
...featureNames.map((x) => {
15+
return [x, levenshteinDistance(featureName, x)];
16+
}),
17+
...packageNames.map((x) => {
18+
return [packageNamesToIds[x], levenshteinDistance(featureName, x)];
19+
}),
20+
].sort((a, b) => {
21+
return a[1] - b[1];
22+
}).filter((x) => x[1] < 10);
1523

16-
if (Math.min(byId.distance, byPackage.distance) > 10) {
17-
root.warn(result, `Unknown feature: "${featureName}", see the list of features https://github.com/csstools/postcss-plugins/blob/main/plugin-packs/postcss-preset-env/FEATURES.md`);
18-
return;
19-
}
24+
const uniqueSuggestions = new Set();
2025

21-
if (byId.distance < byPackage.distance) {
22-
root.warn(result, `Unknown feature: "${featureName}", did you mean: "${byId.mostSimilar}"`);
23-
} else {
24-
root.warn(result, `Unknown feature: "${featureName}", did you mean: "${packageNamesToIds[byPackage.mostSimilar]}"`);
25-
}
26-
});
27-
}
26+
for (let i = 0; i < suggestions.length; i++) {
27+
uniqueSuggestions.add(suggestions[i][0]);
2828

29-
function mostSimilar(a, b) {
30-
let mostSimilar = 'unknown';
31-
let leastDistance = Infinity;
29+
if (uniqueSuggestions.size >= 3) {
30+
break;
31+
}
32+
}
3233

33-
for (let j = 0; j < b.length; j++) {
34-
const distance = levenshteinDistance(a, b[j]);
35-
if (distance < leastDistance) {
36-
leastDistance = distance;
37-
mostSimilar = b[j];
34+
if (!uniqueSuggestions.size) {
35+
root.warn(result, `Unknown feature: "${featureName}", see the list of features https://github.com/csstools/postcss-plugins/blob/main/plugin-packs/postcss-preset-env/FEATURES.md`);
36+
return;
3837
}
39-
}
4038

41-
return {
42-
mostSimilar: mostSimilar,
43-
distance: leastDistance,
44-
};
39+
let formattedSuggestions = '"';
40+
formattedSuggestions += Array.from(uniqueSuggestions).join('", "');
41+
formattedSuggestions += '"';
42+
43+
root.warn(result, `Unknown feature: "${featureName}", did you mean one of: ${formattedSuggestions}`);
44+
});
4545
}
4646

4747
function levenshteinDistance(s, t) {

0 commit comments

Comments
 (0)