@salesforce-ux/eslint-plugin-slds 1.0.0-internal-alpha.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +510 -446
- package/build/index.js.map +4 -4
- package/build/rules/enforce-bem-usage.js +5 -5
- package/build/rules/enforce-bem-usage.js.map +3 -3
- package/build/rules/no-deprecated-classes-slds2.js +2 -2
- package/build/rules/no-deprecated-classes-slds2.js.map +2 -2
- package/build/rules/v9/enforce-bem-usage.js +2 -2
- package/build/rules/v9/enforce-bem-usage.js.map +2 -2
- package/build/rules/v9/enforce-component-hook-naming-convention.js +2 -2
- package/build/rules/v9/enforce-component-hook-naming-convention.js.map +2 -2
- package/build/rules/v9/enforce-sds-to-slds-hooks.js +2 -2
- package/build/rules/v9/enforce-sds-to-slds-hooks.js.map +2 -2
- package/build/rules/v9/lwc-token-to-slds-hook.js +2 -2
- package/build/rules/v9/lwc-token-to-slds-hook.js.map +2 -2
- package/build/rules/v9/no-deprecated-slds-classes.js +2 -2
- package/build/rules/v9/no-deprecated-slds-classes.js.map +2 -2
- package/build/rules/v9/no-deprecated-tokens-slds1.js +2 -2
- package/build/rules/v9/no-deprecated-tokens-slds1.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.js.map +1 -1
- package/build/rules/v9/no-hardcoded-values/handlers/colorHandler.js.map +1 -1
- package/build/rules/v9/no-hardcoded-values/handlers/densityHandler.js.map +1 -1
- package/build/rules/v9/no-hardcoded-values/handlers/fontHandler.js.map +1 -1
- package/build/rules/v9/no-hardcoded-values/handlers/index.js.map +1 -1
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js +29 -5
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js.map +4 -4
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js +29 -5
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js.map +4 -4
- package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.js +23 -1
- package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.js.map +3 -3
- package/build/rules/v9/no-slds-class-overrides.js +2 -2
- package/build/rules/v9/no-slds-class-overrides.js.map +2 -2
- package/build/rules/v9/no-slds-namespace-for-custom-hooks.js +2 -2
- package/build/rules/v9/no-slds-namespace-for-custom-hooks.js.map +2 -2
- package/build/rules/v9/no-slds-var-without-fallback.js +121 -35
- package/build/rules/v9/no-slds-var-without-fallback.js.map +4 -4
- package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js +2 -2
- package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js.map +2 -2
- package/build/rules/v9/no-unsupported-hooks-slds2.js +2 -2
- package/build/rules/v9/no-unsupported-hooks-slds2.js.map +2 -2
- package/build/src/rules/v9/no-hardcoded-values/noHardcodedValueRule.d.ts +3 -1
- package/build/src/rules/v9/no-slds-var-without-fallback.d.ts +4 -0
- package/build/src/utils/css-utils.d.ts +13 -0
- package/build/src/utils/rule-utils.d.ts +8 -0
- package/build/types/index.js.map +1 -1
- package/build/utils/boxShadowValueParser.js.map +1 -1
- package/build/utils/color-lib-utils.js.map +1 -1
- package/build/utils/css-utils.js +100 -0
- package/build/utils/css-utils.js.map +4 -4
- package/build/utils/hardcoded-shared-utils.js.map +1 -1
- package/build/utils/rule-utils.js +46 -0
- package/build/utils/rule-utils.js.map +7 -0
- package/build/utils/styling-hook-utils.js.map +1 -1
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -203,13 +203,13 @@ var require_rule_messages = __commonJS({
|
|
|
203
203
|
});
|
|
204
204
|
|
|
205
205
|
// src/rules/v9/enforce-bem-usage.ts
|
|
206
|
-
var
|
|
206
|
+
var import_sds_metadata, import_rule_messages, type, description, url, messages, bemMapping, enforce_bem_usage_default;
|
|
207
207
|
var init_enforce_bem_usage = __esm({
|
|
208
208
|
"src/rules/v9/enforce-bem-usage.ts"() {
|
|
209
|
-
|
|
209
|
+
import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
210
210
|
import_rule_messages = __toESM(require_rule_messages());
|
|
211
211
|
({ type, description, url, messages } = import_rule_messages.default["enforce-bem-usage"]);
|
|
212
|
-
bemMapping =
|
|
212
|
+
bemMapping = import_sds_metadata.default.bemNaming;
|
|
213
213
|
enforce_bem_usage_default = {
|
|
214
214
|
meta: {
|
|
215
215
|
type,
|
|
@@ -254,11 +254,11 @@ var init_enforce_bem_usage = __esm({
|
|
|
254
254
|
var require_enforce_bem_usage = __commonJS({
|
|
255
255
|
"src/rules/enforce-bem-usage.ts"(exports2, module2) {
|
|
256
256
|
init_node();
|
|
257
|
-
var
|
|
257
|
+
var import_sds_metadata14 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
258
258
|
var import_rule_messages16 = __toESM(require_rule_messages());
|
|
259
259
|
init_enforce_bem_usage();
|
|
260
|
-
var bemMapping2 =
|
|
261
|
-
var deprecatedClasses2 =
|
|
260
|
+
var bemMapping2 = import_sds_metadata14.default.bemNaming;
|
|
261
|
+
var deprecatedClasses2 = import_sds_metadata14.default.deprecatedClasses;
|
|
262
262
|
var ruleConfig14 = import_rule_messages16.default["enforce-bem-usage"];
|
|
263
263
|
var { type: type15, description: description15, url: url15, messages: messages15 } = ruleConfig14;
|
|
264
264
|
var isDeprecatedClass = (className) => {
|
|
@@ -349,9 +349,9 @@ var require_enforce_bem_usage = __commonJS({
|
|
|
349
349
|
var require_no_deprecated_classes_slds2 = __commonJS({
|
|
350
350
|
"src/rules/no-deprecated-classes-slds2.ts"(exports2, module2) {
|
|
351
351
|
init_node();
|
|
352
|
-
var
|
|
352
|
+
var import_sds_metadata14 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
353
353
|
var import_rule_messages16 = __toESM(require_rule_messages());
|
|
354
|
-
var deprecatedClasses2 =
|
|
354
|
+
var deprecatedClasses2 = import_sds_metadata14.default.deprecatedClasses;
|
|
355
355
|
var ruleConfig14 = import_rule_messages16.default["no-deprecated-classes-slds2"];
|
|
356
356
|
module2.exports = {
|
|
357
357
|
meta: {
|
|
@@ -555,10 +555,10 @@ var import_no_deprecated_classes_slds2 = __toESM(require_no_deprecated_classes_s
|
|
|
555
555
|
var import_modal_close_button_issue = __toESM(require_modal_close_button_issue());
|
|
556
556
|
|
|
557
557
|
// src/rules/v9/no-slds-class-overrides.ts
|
|
558
|
-
var
|
|
558
|
+
var import_sds_metadata2 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
559
559
|
var import_rule_messages2 = __toESM(require_rule_messages());
|
|
560
560
|
var ruleConfig = import_rule_messages2.default["no-slds-class-overrides"];
|
|
561
|
-
var sldsClasses =
|
|
561
|
+
var sldsClasses = import_sds_metadata2.default.sldsPlusClasses;
|
|
562
562
|
var sldsClassesSet = new Set(sldsClasses);
|
|
563
563
|
var no_slds_class_overrides_default = {
|
|
564
564
|
meta: {
|
|
@@ -595,10 +595,10 @@ var no_slds_class_overrides_default = {
|
|
|
595
595
|
};
|
|
596
596
|
|
|
597
597
|
// src/rules/v9/no-deprecated-slds-classes.ts
|
|
598
|
-
var
|
|
598
|
+
var import_sds_metadata3 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
599
599
|
var import_rule_messages3 = __toESM(require_rule_messages());
|
|
600
600
|
var { type: type2, description: description2, url: url2, messages: messages2 } = import_rule_messages3.default["no-deprecated-slds-classes"];
|
|
601
|
-
var deprecatedClasses =
|
|
601
|
+
var deprecatedClasses = import_sds_metadata3.default.deprecatedClasses;
|
|
602
602
|
var deprecatedClassesSet = new Set(deprecatedClasses);
|
|
603
603
|
var no_deprecated_slds_classes_default = {
|
|
604
604
|
meta: {
|
|
@@ -629,11 +629,11 @@ var no_deprecated_slds_classes_default = {
|
|
|
629
629
|
};
|
|
630
630
|
|
|
631
631
|
// src/rules/v9/no-deprecated-tokens-slds1.ts
|
|
632
|
-
var
|
|
632
|
+
var import_sds_metadata4 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
633
633
|
var import_rule_messages4 = __toESM(require_rule_messages());
|
|
634
634
|
var ruleConfig2 = import_rule_messages4.default["no-deprecated-tokens-slds1"];
|
|
635
635
|
var { type: type3, description: description3, url: url3, messages: messages3 } = ruleConfig2;
|
|
636
|
-
var tokenMapping =
|
|
636
|
+
var tokenMapping = import_sds_metadata4.default.auraToLwcTokensMapping;
|
|
637
637
|
var no_deprecated_tokens_slds1_default = {
|
|
638
638
|
meta: {
|
|
639
639
|
type: type3,
|
|
@@ -706,11 +706,11 @@ var no_deprecated_tokens_slds1_default = {
|
|
|
706
706
|
};
|
|
707
707
|
|
|
708
708
|
// src/rules/v9/lwc-token-to-slds-hook.ts
|
|
709
|
-
var
|
|
709
|
+
var import_sds_metadata5 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
710
710
|
var import_rule_messages5 = __toESM(require_rule_messages());
|
|
711
711
|
var ruleConfig3 = import_rule_messages5.default["lwc-token-to-slds-hook"];
|
|
712
712
|
var { type: type4, description: description4, url: url4, messages: messages4 } = ruleConfig3;
|
|
713
|
-
var lwcToSlds =
|
|
713
|
+
var lwcToSlds = import_sds_metadata5.default.lwcToSlds;
|
|
714
714
|
function shouldIgnoreDetection(lwcToken) {
|
|
715
715
|
return !lwcToken.startsWith("--lwc-") || !(lwcToken in lwcToSlds) || lwcToSlds[lwcToken].continueToUse;
|
|
716
716
|
}
|
|
@@ -843,11 +843,11 @@ var lwc_token_to_slds_hook_default = {
|
|
|
843
843
|
};
|
|
844
844
|
|
|
845
845
|
// src/rules/v9/enforce-sds-to-slds-hooks.ts
|
|
846
|
-
var
|
|
846
|
+
var import_sds_metadata6 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
847
847
|
var import_rule_messages6 = __toESM(require_rule_messages());
|
|
848
848
|
var ruleConfig4 = import_rule_messages6.default["enforce-sds-to-slds-hooks"];
|
|
849
849
|
var { type: type5, description: description5, url: url5, messages: messages5 } = ruleConfig4;
|
|
850
|
-
var sldsPlusStylingHooks =
|
|
850
|
+
var sldsPlusStylingHooks = import_sds_metadata6.default.sldsPlusStylingHooks;
|
|
851
851
|
var allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component];
|
|
852
852
|
var toSldsToken = (sdsToken) => sdsToken.replace("--sds-", "--slds-");
|
|
853
853
|
function shouldIgnoreDetection2(sdsToken) {
|
|
@@ -910,11 +910,11 @@ var enforce_sds_to_slds_hooks_default = {
|
|
|
910
910
|
};
|
|
911
911
|
|
|
912
912
|
// src/rules/v9/no-sldshook-fallback-for-lwctoken.ts
|
|
913
|
-
var
|
|
913
|
+
var import_sds_metadata7 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
914
914
|
var import_rule_messages7 = __toESM(require_rule_messages());
|
|
915
915
|
var ruleConfig5 = import_rule_messages7.default["no-sldshook-fallback-for-lwctoken"];
|
|
916
916
|
var { type: type6, description: description6, url: url6, messages: messages6 } = ruleConfig5;
|
|
917
|
-
var sldsPlusStylingHooks2 =
|
|
917
|
+
var sldsPlusStylingHooks2 = import_sds_metadata7.default.sldsPlusStylingHooks;
|
|
918
918
|
var allSldsHooks2 = [...sldsPlusStylingHooks2.global, ...sldsPlusStylingHooks2.component];
|
|
919
919
|
var allSldsHooksSet = new Set(allSldsHooks2);
|
|
920
920
|
function hasUnsupportedFallback(lwcToken, sldsToken) {
|
|
@@ -970,11 +970,11 @@ var no_sldshook_fallback_for_lwctoken_default = {
|
|
|
970
970
|
};
|
|
971
971
|
|
|
972
972
|
// src/rules/v9/no-unsupported-hooks-slds2.ts
|
|
973
|
-
var
|
|
973
|
+
var import_sds_metadata8 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
974
974
|
var import_rule_messages8 = __toESM(require_rule_messages());
|
|
975
975
|
var ruleConfig6 = import_rule_messages8.default["no-unsupported-hooks-slds2"];
|
|
976
976
|
var { type: type7, description: description7, url: url7, messages: messages7 } = ruleConfig6;
|
|
977
|
-
var deprecatedHooks = new Set(
|
|
977
|
+
var deprecatedHooks = new Set(import_sds_metadata8.default.deprecatedStylingHooks);
|
|
978
978
|
function shouldIgnoreDetection3(sldsHook) {
|
|
979
979
|
return !deprecatedHooks.has(sldsHook);
|
|
980
980
|
}
|
|
@@ -1020,20 +1020,357 @@ var no_unsupported_hooks_slds2_default = {
|
|
|
1020
1020
|
};
|
|
1021
1021
|
|
|
1022
1022
|
// src/rules/v9/no-slds-var-without-fallback.ts
|
|
1023
|
-
var
|
|
1023
|
+
var import_sds_metadata9 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
1024
1024
|
var import_rule_messages9 = __toESM(require_rule_messages());
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
var
|
|
1028
|
-
|
|
1029
|
-
|
|
1025
|
+
|
|
1026
|
+
// src/utils/hardcoded-shared-utils.ts
|
|
1027
|
+
var import_css_tree2 = require("@eslint/css-tree");
|
|
1028
|
+
|
|
1029
|
+
// src/utils/color-lib-utils.ts
|
|
1030
|
+
var import_chroma_js = __toESM(require("chroma-js"));
|
|
1031
|
+
var import_css_tree = require("@eslint/css-tree");
|
|
1032
|
+
|
|
1033
|
+
// src/utils/css-functions.ts
|
|
1034
|
+
var CSS_FUNCTIONS = [
|
|
1035
|
+
"attr",
|
|
1036
|
+
"calc",
|
|
1037
|
+
"color-mix",
|
|
1038
|
+
"conic-gradient",
|
|
1039
|
+
"counter",
|
|
1040
|
+
"cubic-bezier",
|
|
1041
|
+
"linear-gradient",
|
|
1042
|
+
"max",
|
|
1043
|
+
"min",
|
|
1044
|
+
"radial-gradient",
|
|
1045
|
+
"repeating-conic-gradient",
|
|
1046
|
+
"repeating-linear-gradient",
|
|
1047
|
+
"repeating-radial-gradient",
|
|
1048
|
+
"var"
|
|
1049
|
+
];
|
|
1050
|
+
var CSS_MATH_FUNCTIONS = ["calc", "min", "max"];
|
|
1051
|
+
var RGB_COLOR_FUNCTIONS = ["rgb", "rgba", "hsl", "hsla"];
|
|
1052
|
+
var cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join("|")})`);
|
|
1053
|
+
var cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join("|")})$`);
|
|
1054
|
+
var cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join("|")})$`);
|
|
1055
|
+
function isCssFunction(value) {
|
|
1056
|
+
return cssFunctionsExactRegex.test(value);
|
|
1057
|
+
}
|
|
1058
|
+
function isCssColorFunction(value) {
|
|
1059
|
+
return RGB_COLOR_FUNCTIONS.includes(value);
|
|
1030
1060
|
}
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1061
|
+
|
|
1062
|
+
// src/utils/color-lib-utils.ts
|
|
1063
|
+
var LAB_THRESHOLD = 25;
|
|
1064
|
+
var isHexCode = (color) => {
|
|
1065
|
+
const hexPattern = /^#(?:[0-9a-fA-F]{3}){1,2}$/;
|
|
1066
|
+
return hexPattern.test(color);
|
|
1067
|
+
};
|
|
1068
|
+
var convertToHex = (color) => {
|
|
1069
|
+
try {
|
|
1070
|
+
return (0, import_chroma_js.default)(color).hex();
|
|
1071
|
+
} catch (e) {
|
|
1072
|
+
return null;
|
|
1073
|
+
}
|
|
1074
|
+
};
|
|
1075
|
+
var findClosestColorHook = (color, supportedColors, cssProperty) => {
|
|
1076
|
+
const returnStylingHooks = [];
|
|
1077
|
+
const closestHooksWithSameProperty = [];
|
|
1078
|
+
const closestHooksWithoutSameProperty = [];
|
|
1079
|
+
const closestHooksWithAllProperty = [];
|
|
1080
|
+
const labColor = (0, import_chroma_js.default)(color).lab();
|
|
1081
|
+
Object.entries(supportedColors).forEach(([sldsValue, data]) => {
|
|
1082
|
+
if (sldsValue && isHexCode(sldsValue)) {
|
|
1083
|
+
const hooks = data;
|
|
1084
|
+
hooks.forEach((hook) => {
|
|
1085
|
+
const labSupportedColor = (0, import_chroma_js.default)(sldsValue).lab();
|
|
1086
|
+
const distance = JSON.stringify(labColor) === JSON.stringify(labSupportedColor) ? 0 : import_chroma_js.default.distance(import_chroma_js.default.lab(...labColor), import_chroma_js.default.lab(...labSupportedColor), "lab");
|
|
1087
|
+
if (hook.properties.includes(cssProperty)) {
|
|
1088
|
+
if (distance <= LAB_THRESHOLD) {
|
|
1089
|
+
closestHooksWithSameProperty.push({ name: hook.name, distance });
|
|
1090
|
+
}
|
|
1091
|
+
} else if (hook.properties.includes("*")) {
|
|
1092
|
+
if (distance <= LAB_THRESHOLD) {
|
|
1093
|
+
closestHooksWithAllProperty.push({ name: hook.name, distance });
|
|
1094
|
+
}
|
|
1095
|
+
} else {
|
|
1096
|
+
if (distance <= LAB_THRESHOLD) {
|
|
1097
|
+
closestHooksWithoutSameProperty.push({ name: hook.name, distance });
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
});
|
|
1103
|
+
const closesthookGroups = [
|
|
1104
|
+
{ hooks: closestHooksWithSameProperty, distance: 0 },
|
|
1105
|
+
{ hooks: closestHooksWithAllProperty, distance: 0 },
|
|
1106
|
+
{ hooks: closestHooksWithSameProperty, distance: Infinity },
|
|
1107
|
+
// For hooks with distance > 0
|
|
1108
|
+
{ hooks: closestHooksWithAllProperty, distance: Infinity },
|
|
1109
|
+
{ hooks: closestHooksWithoutSameProperty, distance: Infinity }
|
|
1110
|
+
];
|
|
1111
|
+
for (const group of closesthookGroups) {
|
|
1112
|
+
const filteredHooks = group.hooks.filter(
|
|
1113
|
+
(h) => group.distance === 0 ? h.distance === 0 : h.distance > 0
|
|
1114
|
+
);
|
|
1115
|
+
if (returnStylingHooks.length < 1 && filteredHooks.length > 0) {
|
|
1116
|
+
filteredHooks.sort((a, b) => a.distance - b.distance);
|
|
1117
|
+
returnStylingHooks.push(...filteredHooks.slice(0, 5).map((h) => h.name));
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
return Array.from(new Set(returnStylingHooks));
|
|
1121
|
+
};
|
|
1122
|
+
var isValidColor = (val) => import_chroma_js.default.valid(val);
|
|
1123
|
+
var extractColorValue = (node) => {
|
|
1124
|
+
let colorValue = null;
|
|
1125
|
+
switch (node.type) {
|
|
1126
|
+
case "Hash":
|
|
1127
|
+
colorValue = `#${node.value}`;
|
|
1128
|
+
break;
|
|
1129
|
+
case "Identifier":
|
|
1130
|
+
colorValue = node.name;
|
|
1131
|
+
break;
|
|
1132
|
+
case "Function":
|
|
1133
|
+
if (isCssColorFunction(node.name)) {
|
|
1134
|
+
colorValue = (0, import_css_tree.generate)(node);
|
|
1135
|
+
}
|
|
1136
|
+
break;
|
|
1137
|
+
}
|
|
1138
|
+
return colorValue && isValidColor(colorValue) ? colorValue : null;
|
|
1139
|
+
};
|
|
1140
|
+
|
|
1141
|
+
// src/utils/hardcoded-shared-utils.ts
|
|
1142
|
+
var FONT_WEIGHTS = [
|
|
1143
|
+
"normal",
|
|
1144
|
+
"bold",
|
|
1145
|
+
"bolder",
|
|
1146
|
+
"lighter",
|
|
1147
|
+
"100",
|
|
1148
|
+
"200",
|
|
1149
|
+
"300",
|
|
1150
|
+
"400",
|
|
1151
|
+
"500",
|
|
1152
|
+
"600",
|
|
1153
|
+
"700",
|
|
1154
|
+
"800",
|
|
1155
|
+
"900"
|
|
1156
|
+
];
|
|
1157
|
+
function isKnownFontWeight(value) {
|
|
1158
|
+
const stringValue = value.toString();
|
|
1159
|
+
return FONT_WEIGHTS.includes(stringValue.toLowerCase());
|
|
1160
|
+
}
|
|
1161
|
+
function handleShorthandAutoFix(declarationNode, context, valueText, replacements) {
|
|
1162
|
+
const sortedReplacements = replacements.sort((a, b) => a.start - b.start);
|
|
1163
|
+
const hasAnyHooks = sortedReplacements.some((r) => r.hasHook);
|
|
1164
|
+
const canAutoFix = hasAnyHooks;
|
|
1165
|
+
sortedReplacements.forEach(({ start, end, replacement, displayValue, hasHook }) => {
|
|
1166
|
+
const originalValue = valueText.substring(start, end);
|
|
1167
|
+
const valueStartColumn = declarationNode.value.loc.start.column;
|
|
1168
|
+
const valueColumn = valueStartColumn + start;
|
|
1169
|
+
const { loc: { start: locStart, end: locEnd } } = declarationNode.value;
|
|
1170
|
+
const reportNode = {
|
|
1171
|
+
...declarationNode.value,
|
|
1172
|
+
loc: {
|
|
1173
|
+
...declarationNode.value.loc,
|
|
1174
|
+
start: {
|
|
1175
|
+
...locStart,
|
|
1176
|
+
column: valueColumn
|
|
1177
|
+
},
|
|
1178
|
+
end: {
|
|
1179
|
+
...locEnd,
|
|
1180
|
+
column: valueColumn + originalValue.length
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
};
|
|
1184
|
+
if (hasHook) {
|
|
1185
|
+
const fix = canAutoFix ? (fixer) => {
|
|
1186
|
+
let newValue = valueText;
|
|
1187
|
+
for (let i = sortedReplacements.length - 1; i >= 0; i--) {
|
|
1188
|
+
const { start: rStart, end: rEnd, replacement: rReplacement } = sortedReplacements[i];
|
|
1189
|
+
newValue = newValue.substring(0, rStart) + rReplacement + newValue.substring(rEnd);
|
|
1190
|
+
}
|
|
1191
|
+
return fixer.replaceText(declarationNode.value, newValue);
|
|
1192
|
+
} : void 0;
|
|
1193
|
+
context.context.report({
|
|
1194
|
+
node: reportNode,
|
|
1195
|
+
messageId: "hardcodedValue",
|
|
1196
|
+
data: {
|
|
1197
|
+
oldValue: originalValue,
|
|
1198
|
+
newValue: displayValue
|
|
1199
|
+
},
|
|
1200
|
+
fix
|
|
1201
|
+
});
|
|
1202
|
+
} else {
|
|
1203
|
+
context.context.report({
|
|
1204
|
+
node: reportNode,
|
|
1205
|
+
messageId: "noReplacement",
|
|
1206
|
+
data: {
|
|
1207
|
+
oldValue: originalValue
|
|
1208
|
+
}
|
|
1209
|
+
});
|
|
1210
|
+
}
|
|
1211
|
+
});
|
|
1212
|
+
}
|
|
1213
|
+
function forEachValue(valueText, extractValue, shouldSkipNode, callback) {
|
|
1214
|
+
if (!valueText || typeof valueText !== "string") {
|
|
1215
|
+
return;
|
|
1216
|
+
}
|
|
1217
|
+
try {
|
|
1218
|
+
const ast = (0, import_css_tree2.parse)(valueText, { context: "value", positions: true });
|
|
1219
|
+
(0, import_css_tree2.walk)(ast, {
|
|
1220
|
+
enter(node) {
|
|
1221
|
+
if (shouldSkipNode(node)) {
|
|
1222
|
+
return this.skip;
|
|
1223
|
+
}
|
|
1224
|
+
const value = extractValue(node);
|
|
1225
|
+
if (value !== null) {
|
|
1226
|
+
const positionInfo = {
|
|
1227
|
+
start: node.loc?.start,
|
|
1228
|
+
end: node.loc?.end
|
|
1229
|
+
};
|
|
1230
|
+
callback(value, positionInfo);
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
});
|
|
1234
|
+
} catch (error) {
|
|
1235
|
+
return;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
function shouldSkipColorNode(node) {
|
|
1239
|
+
return node.type === "Function" && isCssFunction(node.name);
|
|
1240
|
+
}
|
|
1241
|
+
function shouldSkipDimensionNode(node) {
|
|
1242
|
+
return node.type === "Function";
|
|
1243
|
+
}
|
|
1244
|
+
function extractDimensionValue(valueNode, cssProperty) {
|
|
1245
|
+
if (!valueNode) return null;
|
|
1246
|
+
switch (valueNode.type) {
|
|
1247
|
+
case "Dimension":
|
|
1248
|
+
const numValue = Number(valueNode.value);
|
|
1249
|
+
if (numValue === 0) return null;
|
|
1250
|
+
const unit = valueNode.unit.toLowerCase();
|
|
1251
|
+
if (unit !== "px" && unit !== "rem" && unit !== "%") return null;
|
|
1252
|
+
return {
|
|
1253
|
+
number: numValue,
|
|
1254
|
+
unit
|
|
1255
|
+
};
|
|
1256
|
+
case "Number":
|
|
1257
|
+
const numberValue = Number(valueNode.value);
|
|
1258
|
+
if (numberValue === 0) return null;
|
|
1259
|
+
return {
|
|
1260
|
+
number: numberValue,
|
|
1261
|
+
unit: null
|
|
1262
|
+
};
|
|
1263
|
+
case "Percentage":
|
|
1264
|
+
const percentValue = Number(valueNode.value);
|
|
1265
|
+
if (percentValue === 0) return null;
|
|
1266
|
+
return {
|
|
1267
|
+
number: percentValue,
|
|
1268
|
+
unit: "%"
|
|
1269
|
+
};
|
|
1270
|
+
case "Value":
|
|
1271
|
+
return valueNode.children?.[0] ? extractDimensionValue(valueNode.children[0], cssProperty) : null;
|
|
1272
|
+
}
|
|
1273
|
+
return null;
|
|
1274
|
+
}
|
|
1275
|
+
function forEachColorValue(valueText, callback) {
|
|
1276
|
+
forEachValue(valueText, extractColorValue, shouldSkipColorNode, callback);
|
|
1277
|
+
}
|
|
1278
|
+
function forEachDensityValue(valueText, cssProperty, callback) {
|
|
1279
|
+
forEachValue(
|
|
1280
|
+
valueText,
|
|
1281
|
+
(node) => extractDimensionValue(node, cssProperty),
|
|
1282
|
+
shouldSkipDimensionNode,
|
|
1283
|
+
callback
|
|
1284
|
+
);
|
|
1285
|
+
}
|
|
1286
|
+
function extractFontValue(node) {
|
|
1287
|
+
if (!node) return null;
|
|
1288
|
+
switch (node.type) {
|
|
1289
|
+
case "Dimension":
|
|
1290
|
+
const numValue = Number(node.value);
|
|
1291
|
+
if (numValue <= 0) return null;
|
|
1292
|
+
const unit = node.unit.toLowerCase();
|
|
1293
|
+
if (unit !== "px" && unit !== "rem" && unit !== "%") return null;
|
|
1294
|
+
return {
|
|
1295
|
+
number: numValue,
|
|
1296
|
+
unit
|
|
1297
|
+
};
|
|
1298
|
+
case "Number":
|
|
1299
|
+
const numberValue = Number(node.value);
|
|
1300
|
+
if (numberValue <= 0) {
|
|
1301
|
+
return null;
|
|
1302
|
+
}
|
|
1303
|
+
if (!isKnownFontWeight(numberValue)) {
|
|
1304
|
+
return null;
|
|
1305
|
+
}
|
|
1306
|
+
return {
|
|
1307
|
+
number: numberValue,
|
|
1308
|
+
unit: null
|
|
1309
|
+
};
|
|
1310
|
+
case "Identifier":
|
|
1311
|
+
const namedValue = node.name.toLowerCase();
|
|
1312
|
+
if (!isKnownFontWeight(namedValue)) {
|
|
1313
|
+
return null;
|
|
1314
|
+
}
|
|
1315
|
+
if (namedValue === "normal") {
|
|
1316
|
+
return { number: 400, unit: null };
|
|
1317
|
+
}
|
|
1318
|
+
return { number: namedValue, unit: null };
|
|
1319
|
+
case "Percentage":
|
|
1320
|
+
const percentValue = Number(node.value);
|
|
1321
|
+
if (percentValue === 0) return null;
|
|
1322
|
+
return {
|
|
1323
|
+
number: percentValue,
|
|
1324
|
+
unit: "%"
|
|
1325
|
+
};
|
|
1326
|
+
case "Value":
|
|
1327
|
+
return node.children?.[0] ? extractFontValue(node.children[0]) : null;
|
|
1328
|
+
}
|
|
1329
|
+
return null;
|
|
1330
|
+
}
|
|
1331
|
+
function shouldSkipFontNode(node) {
|
|
1332
|
+
return node.type === "Function";
|
|
1333
|
+
}
|
|
1334
|
+
function forEachFontValue(valueText, callback) {
|
|
1335
|
+
forEachValue(valueText, extractFontValue, shouldSkipFontNode, callback);
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
// src/utils/css-utils.ts
|
|
1339
|
+
function extractSldsVariable(node) {
|
|
1340
|
+
if (!node || node.type !== "Function" || node.name !== "var") {
|
|
1341
|
+
return null;
|
|
1342
|
+
}
|
|
1343
|
+
if (!node.children) {
|
|
1344
|
+
return null;
|
|
1345
|
+
}
|
|
1346
|
+
const childrenArray = Array.from(node.children);
|
|
1347
|
+
if (childrenArray.length === 0) {
|
|
1348
|
+
return null;
|
|
1349
|
+
}
|
|
1350
|
+
const firstChild = childrenArray[0];
|
|
1351
|
+
if (!firstChild || firstChild.type !== "Identifier") {
|
|
1352
|
+
return null;
|
|
1353
|
+
}
|
|
1354
|
+
const variableName = firstChild.name;
|
|
1355
|
+
if (!variableName || !variableName.startsWith("--slds-")) {
|
|
1356
|
+
return null;
|
|
1357
|
+
}
|
|
1358
|
+
const hasFallback = childrenArray.some(
|
|
1034
1359
|
(child) => child.type === "Operator" && child.value === ","
|
|
1035
1360
|
);
|
|
1361
|
+
return {
|
|
1362
|
+
name: variableName,
|
|
1363
|
+
hasFallback
|
|
1364
|
+
};
|
|
1036
1365
|
}
|
|
1366
|
+
function forEachSldsVariable(valueText, callback) {
|
|
1367
|
+
forEachValue(valueText, extractSldsVariable, () => false, callback);
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
// src/rules/v9/no-slds-var-without-fallback.ts
|
|
1371
|
+
var ruleConfig7 = import_rule_messages9.default["no-slds-var-without-fallback"];
|
|
1372
|
+
var { type: type8, description: description8, url: url8, messages: messages8 } = ruleConfig7;
|
|
1373
|
+
var sldsVariables = import_sds_metadata9.default.slds1ExcludedVars || {};
|
|
1037
1374
|
var no_slds_var_without_fallback_default = {
|
|
1038
1375
|
meta: {
|
|
1039
1376
|
type: type8,
|
|
@@ -1046,45 +1383,50 @@ var no_slds_var_without_fallback_default = {
|
|
|
1046
1383
|
messages: messages8
|
|
1047
1384
|
},
|
|
1048
1385
|
create(context) {
|
|
1049
|
-
function reportAndFix(node, cssVar, fallbackValue) {
|
|
1050
|
-
context.report({
|
|
1051
|
-
node,
|
|
1052
|
-
messageId: "varWithoutFallback",
|
|
1053
|
-
data: { cssVar, recommendation: fallbackValue },
|
|
1054
|
-
fix(fixer) {
|
|
1055
|
-
const varFunctionNode = context.sourceCode.getAncestors(node).at(-1);
|
|
1056
|
-
const varWithFallback = `var(${cssVar}, ${fallbackValue})`;
|
|
1057
|
-
return fixer.replaceText(varFunctionNode, varWithFallback);
|
|
1058
|
-
}
|
|
1059
|
-
});
|
|
1060
|
-
}
|
|
1061
1386
|
return {
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
return;
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1387
|
+
"Declaration"(node) {
|
|
1388
|
+
const valueText = context.sourceCode.getText(node.value);
|
|
1389
|
+
if (!valueText) return;
|
|
1390
|
+
const variablesNeedingFallback = [];
|
|
1391
|
+
forEachSldsVariable(valueText, (variableInfo, positionInfo) => {
|
|
1392
|
+
const { name: cssVar, hasFallback } = variableInfo;
|
|
1393
|
+
if (hasFallback) return;
|
|
1394
|
+
const fallbackValue = sldsVariables[cssVar];
|
|
1395
|
+
if (!fallbackValue) return;
|
|
1396
|
+
variablesNeedingFallback.push({
|
|
1397
|
+
cssVar,
|
|
1398
|
+
fallbackValue,
|
|
1399
|
+
start: positionInfo.start?.offset || 0,
|
|
1400
|
+
end: positionInfo.end?.offset || 0
|
|
1401
|
+
});
|
|
1402
|
+
});
|
|
1403
|
+
if (variablesNeedingFallback.length > 0) {
|
|
1404
|
+
let newValue = valueText;
|
|
1405
|
+
const sortedVariables = variablesNeedingFallback.sort((a, b) => b.start - a.start);
|
|
1406
|
+
sortedVariables.forEach(({ cssVar, fallbackValue, start, end }) => {
|
|
1407
|
+
const replacement = `var(${cssVar}, ${fallbackValue})`;
|
|
1408
|
+
newValue = newValue.substring(0, start) + replacement + newValue.substring(end);
|
|
1409
|
+
});
|
|
1410
|
+
variablesNeedingFallback.forEach(({ cssVar, fallbackValue }) => {
|
|
1411
|
+
context.report({
|
|
1412
|
+
node,
|
|
1413
|
+
messageId: "varWithoutFallback",
|
|
1414
|
+
data: { cssVar, recommendation: fallbackValue },
|
|
1415
|
+
fix: (fixer) => fixer.replaceText(node.value, newValue)
|
|
1416
|
+
});
|
|
1417
|
+
});
|
|
1075
1418
|
}
|
|
1076
|
-
reportAndFix(node, cssVar, fallbackValue);
|
|
1077
1419
|
}
|
|
1078
1420
|
};
|
|
1079
1421
|
}
|
|
1080
1422
|
};
|
|
1081
1423
|
|
|
1082
1424
|
// src/rules/v9/no-slds-namespace-for-custom-hooks.ts
|
|
1083
|
-
var
|
|
1425
|
+
var import_sds_metadata10 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
1084
1426
|
var import_rule_messages10 = __toESM(require_rule_messages());
|
|
1085
1427
|
var ruleConfig8 = import_rule_messages10.default["no-slds-namespace-for-custom-hooks"];
|
|
1086
1428
|
var { type: type9, description: description9, url: url9, messages: messages9 } = ruleConfig8;
|
|
1087
|
-
var sldsPlusStylingHooks3 =
|
|
1429
|
+
var sldsPlusStylingHooks3 = import_sds_metadata10.default.sldsPlusStylingHooks;
|
|
1088
1430
|
var allSldsHooks3 = [...sldsPlusStylingHooks3.global, ...sldsPlusStylingHooks3.component];
|
|
1089
1431
|
var toSldsToken2 = (sdsToken) => sdsToken.replace("--sds-", "--slds-");
|
|
1090
1432
|
function shouldIgnoreDetection4(sdsToken) {
|
|
@@ -1137,11 +1479,11 @@ var no_slds_namespace_for_custom_hooks_default = {
|
|
|
1137
1479
|
};
|
|
1138
1480
|
|
|
1139
1481
|
// src/rules/v9/enforce-component-hook-naming-convention.ts
|
|
1140
|
-
var
|
|
1482
|
+
var import_sds_metadata11 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
1141
1483
|
var import_rule_messages11 = __toESM(require_rule_messages());
|
|
1142
1484
|
var ruleConfig9 = import_rule_messages11.default["enforce-component-hook-naming-convention"];
|
|
1143
1485
|
var { type: type10, description: description10, url: url10, messages: messages10 } = ruleConfig9;
|
|
1144
|
-
var slds1DeprecatedComponentHooks =
|
|
1486
|
+
var slds1DeprecatedComponentHooks = import_sds_metadata11.default.slds1DeprecatedComponentHooks;
|
|
1145
1487
|
function shouldIgnoreDetection5(hook) {
|
|
1146
1488
|
return !hook.startsWith("--slds-c-") || !(hook in slds1DeprecatedComponentHooks);
|
|
1147
1489
|
}
|
|
@@ -1253,152 +1595,40 @@ var { type: type12, description: description12, url: url12, messages: messages12
|
|
|
1253
1595
|
var no_slds_private_var_default = {
|
|
1254
1596
|
meta: {
|
|
1255
1597
|
type: type12,
|
|
1256
|
-
docs: {
|
|
1257
|
-
description: description12,
|
|
1258
|
-
recommended: true,
|
|
1259
|
-
url: url12
|
|
1260
|
-
},
|
|
1261
|
-
fixable: "code",
|
|
1262
|
-
messages: messages12
|
|
1263
|
-
},
|
|
1264
|
-
create(context) {
|
|
1265
|
-
return {
|
|
1266
|
-
// Handle CSS custom properties (declarations starting with --)
|
|
1267
|
-
"Declaration"(node) {
|
|
1268
|
-
if (node.property && typeof node.property === "string" && node.property.startsWith("--_slds-")) {
|
|
1269
|
-
context.report({
|
|
1270
|
-
node,
|
|
1271
|
-
messageId: "privateVar",
|
|
1272
|
-
data: { prop: node.property },
|
|
1273
|
-
fix(fixer) {
|
|
1274
|
-
const newProperty = node.property.replace("--_slds-", "--slds-");
|
|
1275
|
-
const sourceCode = context.sourceCode.getText(node);
|
|
1276
|
-
const fixedCode = sourceCode.replace(node.property, newProperty);
|
|
1277
|
-
return fixer.replaceText(node, fixedCode);
|
|
1278
|
-
}
|
|
1279
|
-
});
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
|
-
};
|
|
1283
|
-
}
|
|
1284
|
-
};
|
|
1285
|
-
|
|
1286
|
-
// src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.ts
|
|
1287
|
-
var import_next12 = __toESM(require("@salesforce-ux/sds-metadata/next"));
|
|
1288
|
-
var import_rule_messages14 = __toESM(require_rule_messages());
|
|
1289
|
-
|
|
1290
|
-
// src/utils/color-lib-utils.ts
|
|
1291
|
-
var import_chroma_js = __toESM(require("chroma-js"));
|
|
1292
|
-
var import_css_tree = require("@eslint/css-tree");
|
|
1293
|
-
|
|
1294
|
-
// src/utils/css-functions.ts
|
|
1295
|
-
var CSS_FUNCTIONS = [
|
|
1296
|
-
"attr",
|
|
1297
|
-
"calc",
|
|
1298
|
-
"color-mix",
|
|
1299
|
-
"conic-gradient",
|
|
1300
|
-
"counter",
|
|
1301
|
-
"cubic-bezier",
|
|
1302
|
-
"linear-gradient",
|
|
1303
|
-
"max",
|
|
1304
|
-
"min",
|
|
1305
|
-
"radial-gradient",
|
|
1306
|
-
"repeating-conic-gradient",
|
|
1307
|
-
"repeating-linear-gradient",
|
|
1308
|
-
"repeating-radial-gradient",
|
|
1309
|
-
"var"
|
|
1310
|
-
];
|
|
1311
|
-
var CSS_MATH_FUNCTIONS = ["calc", "min", "max"];
|
|
1312
|
-
var RGB_COLOR_FUNCTIONS = ["rgb", "rgba", "hsl", "hsla"];
|
|
1313
|
-
var cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join("|")})`);
|
|
1314
|
-
var cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join("|")})$`);
|
|
1315
|
-
var cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join("|")})$`);
|
|
1316
|
-
function isCssFunction(value) {
|
|
1317
|
-
return cssFunctionsExactRegex.test(value);
|
|
1318
|
-
}
|
|
1319
|
-
function isCssColorFunction(value) {
|
|
1320
|
-
return RGB_COLOR_FUNCTIONS.includes(value);
|
|
1321
|
-
}
|
|
1322
|
-
|
|
1323
|
-
// src/utils/color-lib-utils.ts
|
|
1324
|
-
var LAB_THRESHOLD = 25;
|
|
1325
|
-
var isHexCode = (color) => {
|
|
1326
|
-
const hexPattern = /^#(?:[0-9a-fA-F]{3}){1,2}$/;
|
|
1327
|
-
return hexPattern.test(color);
|
|
1328
|
-
};
|
|
1329
|
-
var convertToHex = (color) => {
|
|
1330
|
-
try {
|
|
1331
|
-
return (0, import_chroma_js.default)(color).hex();
|
|
1332
|
-
} catch (e) {
|
|
1333
|
-
return null;
|
|
1334
|
-
}
|
|
1335
|
-
};
|
|
1336
|
-
var findClosestColorHook = (color, supportedColors, cssProperty) => {
|
|
1337
|
-
const returnStylingHooks = [];
|
|
1338
|
-
const closestHooksWithSameProperty = [];
|
|
1339
|
-
const closestHooksWithoutSameProperty = [];
|
|
1340
|
-
const closestHooksWithAllProperty = [];
|
|
1341
|
-
const labColor = (0, import_chroma_js.default)(color).lab();
|
|
1342
|
-
Object.entries(supportedColors).forEach(([sldsValue, data]) => {
|
|
1343
|
-
if (sldsValue && isHexCode(sldsValue)) {
|
|
1344
|
-
const hooks = data;
|
|
1345
|
-
hooks.forEach((hook) => {
|
|
1346
|
-
const labSupportedColor = (0, import_chroma_js.default)(sldsValue).lab();
|
|
1347
|
-
const distance = JSON.stringify(labColor) === JSON.stringify(labSupportedColor) ? 0 : import_chroma_js.default.distance(import_chroma_js.default.lab(...labColor), import_chroma_js.default.lab(...labSupportedColor), "lab");
|
|
1348
|
-
if (hook.properties.includes(cssProperty)) {
|
|
1349
|
-
if (distance <= LAB_THRESHOLD) {
|
|
1350
|
-
closestHooksWithSameProperty.push({ name: hook.name, distance });
|
|
1351
|
-
}
|
|
1352
|
-
} else if (hook.properties.includes("*")) {
|
|
1353
|
-
if (distance <= LAB_THRESHOLD) {
|
|
1354
|
-
closestHooksWithAllProperty.push({ name: hook.name, distance });
|
|
1355
|
-
}
|
|
1356
|
-
} else {
|
|
1357
|
-
if (distance <= LAB_THRESHOLD) {
|
|
1358
|
-
closestHooksWithoutSameProperty.push({ name: hook.name, distance });
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
});
|
|
1362
|
-
}
|
|
1363
|
-
});
|
|
1364
|
-
const closesthookGroups = [
|
|
1365
|
-
{ hooks: closestHooksWithSameProperty, distance: 0 },
|
|
1366
|
-
{ hooks: closestHooksWithAllProperty, distance: 0 },
|
|
1367
|
-
{ hooks: closestHooksWithSameProperty, distance: Infinity },
|
|
1368
|
-
// For hooks with distance > 0
|
|
1369
|
-
{ hooks: closestHooksWithAllProperty, distance: Infinity },
|
|
1370
|
-
{ hooks: closestHooksWithoutSameProperty, distance: Infinity }
|
|
1371
|
-
];
|
|
1372
|
-
for (const group of closesthookGroups) {
|
|
1373
|
-
const filteredHooks = group.hooks.filter(
|
|
1374
|
-
(h) => group.distance === 0 ? h.distance === 0 : h.distance > 0
|
|
1375
|
-
);
|
|
1376
|
-
if (returnStylingHooks.length < 1 && filteredHooks.length > 0) {
|
|
1377
|
-
filteredHooks.sort((a, b) => a.distance - b.distance);
|
|
1378
|
-
returnStylingHooks.push(...filteredHooks.slice(0, 5).map((h) => h.name));
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
return Array.from(new Set(returnStylingHooks));
|
|
1382
|
-
};
|
|
1383
|
-
var isValidColor = (val) => import_chroma_js.default.valid(val);
|
|
1384
|
-
var extractColorValue = (node) => {
|
|
1385
|
-
let colorValue = null;
|
|
1386
|
-
switch (node.type) {
|
|
1387
|
-
case "Hash":
|
|
1388
|
-
colorValue = `#${node.value}`;
|
|
1389
|
-
break;
|
|
1390
|
-
case "Identifier":
|
|
1391
|
-
colorValue = node.name;
|
|
1392
|
-
break;
|
|
1393
|
-
case "Function":
|
|
1394
|
-
if (isCssColorFunction(node.name)) {
|
|
1395
|
-
colorValue = (0, import_css_tree.generate)(node);
|
|
1598
|
+
docs: {
|
|
1599
|
+
description: description12,
|
|
1600
|
+
recommended: true,
|
|
1601
|
+
url: url12
|
|
1602
|
+
},
|
|
1603
|
+
fixable: "code",
|
|
1604
|
+
messages: messages12
|
|
1605
|
+
},
|
|
1606
|
+
create(context) {
|
|
1607
|
+
return {
|
|
1608
|
+
// Handle CSS custom properties (declarations starting with --)
|
|
1609
|
+
"Declaration"(node) {
|
|
1610
|
+
if (node.property && typeof node.property === "string" && node.property.startsWith("--_slds-")) {
|
|
1611
|
+
context.report({
|
|
1612
|
+
node,
|
|
1613
|
+
messageId: "privateVar",
|
|
1614
|
+
data: { prop: node.property },
|
|
1615
|
+
fix(fixer) {
|
|
1616
|
+
const newProperty = node.property.replace("--_slds-", "--slds-");
|
|
1617
|
+
const sourceCode = context.sourceCode.getText(node);
|
|
1618
|
+
const fixedCode = sourceCode.replace(node.property, newProperty);
|
|
1619
|
+
return fixer.replaceText(node, fixedCode);
|
|
1620
|
+
}
|
|
1621
|
+
});
|
|
1622
|
+
}
|
|
1396
1623
|
}
|
|
1397
|
-
|
|
1624
|
+
};
|
|
1398
1625
|
}
|
|
1399
|
-
return colorValue && isValidColor(colorValue) ? colorValue : null;
|
|
1400
1626
|
};
|
|
1401
1627
|
|
|
1628
|
+
// src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.ts
|
|
1629
|
+
var import_sds_metadata12 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
1630
|
+
var import_rule_messages14 = __toESM(require_rule_messages());
|
|
1631
|
+
|
|
1402
1632
|
// src/utils/property-matcher.ts
|
|
1403
1633
|
var DIRECTION_VALUES = "(?:top|right|bottom|left|inline|block|inline-start|inline-end|start|end|block-start|block-end)";
|
|
1404
1634
|
var CORNER_VALUES = "(?:top-left|top-right|bottom-right|bottom-left|start-start|start-end|end-start|end-end)";
|
|
@@ -1499,204 +1729,6 @@ function resolvePropertyToMatch(cssProperty) {
|
|
|
1499
1729
|
return propertyToMatch;
|
|
1500
1730
|
}
|
|
1501
1731
|
|
|
1502
|
-
// src/utils/hardcoded-shared-utils.ts
|
|
1503
|
-
var import_css_tree2 = require("@eslint/css-tree");
|
|
1504
|
-
var FONT_WEIGHTS = [
|
|
1505
|
-
"normal",
|
|
1506
|
-
"bold",
|
|
1507
|
-
"bolder",
|
|
1508
|
-
"lighter",
|
|
1509
|
-
"100",
|
|
1510
|
-
"200",
|
|
1511
|
-
"300",
|
|
1512
|
-
"400",
|
|
1513
|
-
"500",
|
|
1514
|
-
"600",
|
|
1515
|
-
"700",
|
|
1516
|
-
"800",
|
|
1517
|
-
"900"
|
|
1518
|
-
];
|
|
1519
|
-
function isKnownFontWeight(value) {
|
|
1520
|
-
const stringValue = value.toString();
|
|
1521
|
-
return FONT_WEIGHTS.includes(stringValue.toLowerCase());
|
|
1522
|
-
}
|
|
1523
|
-
function handleShorthandAutoFix(declarationNode, context, valueText, replacements) {
|
|
1524
|
-
const sortedReplacements = replacements.sort((a, b) => a.start - b.start);
|
|
1525
|
-
const hasAnyHooks = sortedReplacements.some((r) => r.hasHook);
|
|
1526
|
-
const canAutoFix = hasAnyHooks;
|
|
1527
|
-
sortedReplacements.forEach(({ start, end, replacement, displayValue, hasHook }) => {
|
|
1528
|
-
const originalValue = valueText.substring(start, end);
|
|
1529
|
-
const valueStartColumn = declarationNode.value.loc.start.column;
|
|
1530
|
-
const valueColumn = valueStartColumn + start;
|
|
1531
|
-
const { loc: { start: locStart, end: locEnd } } = declarationNode.value;
|
|
1532
|
-
const reportNode = {
|
|
1533
|
-
...declarationNode.value,
|
|
1534
|
-
loc: {
|
|
1535
|
-
...declarationNode.value.loc,
|
|
1536
|
-
start: {
|
|
1537
|
-
...locStart,
|
|
1538
|
-
column: valueColumn
|
|
1539
|
-
},
|
|
1540
|
-
end: {
|
|
1541
|
-
...locEnd,
|
|
1542
|
-
column: valueColumn + originalValue.length
|
|
1543
|
-
}
|
|
1544
|
-
}
|
|
1545
|
-
};
|
|
1546
|
-
if (hasHook) {
|
|
1547
|
-
const fix = canAutoFix ? (fixer) => {
|
|
1548
|
-
let newValue = valueText;
|
|
1549
|
-
for (let i = sortedReplacements.length - 1; i >= 0; i--) {
|
|
1550
|
-
const { start: rStart, end: rEnd, replacement: rReplacement } = sortedReplacements[i];
|
|
1551
|
-
newValue = newValue.substring(0, rStart) + rReplacement + newValue.substring(rEnd);
|
|
1552
|
-
}
|
|
1553
|
-
return fixer.replaceText(declarationNode.value, newValue);
|
|
1554
|
-
} : void 0;
|
|
1555
|
-
context.context.report({
|
|
1556
|
-
node: reportNode,
|
|
1557
|
-
messageId: "hardcodedValue",
|
|
1558
|
-
data: {
|
|
1559
|
-
oldValue: originalValue,
|
|
1560
|
-
newValue: displayValue
|
|
1561
|
-
},
|
|
1562
|
-
fix
|
|
1563
|
-
});
|
|
1564
|
-
} else {
|
|
1565
|
-
context.context.report({
|
|
1566
|
-
node: reportNode,
|
|
1567
|
-
messageId: "noReplacement",
|
|
1568
|
-
data: {
|
|
1569
|
-
oldValue: originalValue
|
|
1570
|
-
}
|
|
1571
|
-
});
|
|
1572
|
-
}
|
|
1573
|
-
});
|
|
1574
|
-
}
|
|
1575
|
-
function forEachValue(valueText, extractValue, shouldSkipNode, callback) {
|
|
1576
|
-
if (!valueText || typeof valueText !== "string") {
|
|
1577
|
-
return;
|
|
1578
|
-
}
|
|
1579
|
-
try {
|
|
1580
|
-
const ast = (0, import_css_tree2.parse)(valueText, { context: "value", positions: true });
|
|
1581
|
-
(0, import_css_tree2.walk)(ast, {
|
|
1582
|
-
enter(node) {
|
|
1583
|
-
if (shouldSkipNode(node)) {
|
|
1584
|
-
return this.skip;
|
|
1585
|
-
}
|
|
1586
|
-
const value = extractValue(node);
|
|
1587
|
-
if (value !== null) {
|
|
1588
|
-
const positionInfo = {
|
|
1589
|
-
start: node.loc?.start,
|
|
1590
|
-
end: node.loc?.end
|
|
1591
|
-
};
|
|
1592
|
-
callback(value, positionInfo);
|
|
1593
|
-
}
|
|
1594
|
-
}
|
|
1595
|
-
});
|
|
1596
|
-
} catch (error) {
|
|
1597
|
-
return;
|
|
1598
|
-
}
|
|
1599
|
-
}
|
|
1600
|
-
function shouldSkipColorNode(node) {
|
|
1601
|
-
return node.type === "Function" && isCssFunction(node.name);
|
|
1602
|
-
}
|
|
1603
|
-
function shouldSkipDimensionNode(node) {
|
|
1604
|
-
return node.type === "Function";
|
|
1605
|
-
}
|
|
1606
|
-
function extractDimensionValue(valueNode, cssProperty) {
|
|
1607
|
-
if (!valueNode) return null;
|
|
1608
|
-
switch (valueNode.type) {
|
|
1609
|
-
case "Dimension":
|
|
1610
|
-
const numValue = Number(valueNode.value);
|
|
1611
|
-
if (numValue === 0) return null;
|
|
1612
|
-
const unit = valueNode.unit.toLowerCase();
|
|
1613
|
-
if (unit !== "px" && unit !== "rem" && unit !== "%") return null;
|
|
1614
|
-
return {
|
|
1615
|
-
number: numValue,
|
|
1616
|
-
unit
|
|
1617
|
-
};
|
|
1618
|
-
case "Number":
|
|
1619
|
-
const numberValue = Number(valueNode.value);
|
|
1620
|
-
if (numberValue === 0) return null;
|
|
1621
|
-
return {
|
|
1622
|
-
number: numberValue,
|
|
1623
|
-
unit: null
|
|
1624
|
-
};
|
|
1625
|
-
case "Percentage":
|
|
1626
|
-
const percentValue = Number(valueNode.value);
|
|
1627
|
-
if (percentValue === 0) return null;
|
|
1628
|
-
return {
|
|
1629
|
-
number: percentValue,
|
|
1630
|
-
unit: "%"
|
|
1631
|
-
};
|
|
1632
|
-
case "Value":
|
|
1633
|
-
return valueNode.children?.[0] ? extractDimensionValue(valueNode.children[0], cssProperty) : null;
|
|
1634
|
-
}
|
|
1635
|
-
return null;
|
|
1636
|
-
}
|
|
1637
|
-
function forEachColorValue(valueText, callback) {
|
|
1638
|
-
forEachValue(valueText, extractColorValue, shouldSkipColorNode, callback);
|
|
1639
|
-
}
|
|
1640
|
-
function forEachDensityValue(valueText, cssProperty, callback) {
|
|
1641
|
-
forEachValue(
|
|
1642
|
-
valueText,
|
|
1643
|
-
(node) => extractDimensionValue(node, cssProperty),
|
|
1644
|
-
shouldSkipDimensionNode,
|
|
1645
|
-
callback
|
|
1646
|
-
);
|
|
1647
|
-
}
|
|
1648
|
-
function extractFontValue(node) {
|
|
1649
|
-
if (!node) return null;
|
|
1650
|
-
switch (node.type) {
|
|
1651
|
-
case "Dimension":
|
|
1652
|
-
const numValue = Number(node.value);
|
|
1653
|
-
if (numValue <= 0) return null;
|
|
1654
|
-
const unit = node.unit.toLowerCase();
|
|
1655
|
-
if (unit !== "px" && unit !== "rem" && unit !== "%") return null;
|
|
1656
|
-
return {
|
|
1657
|
-
number: numValue,
|
|
1658
|
-
unit
|
|
1659
|
-
};
|
|
1660
|
-
case "Number":
|
|
1661
|
-
const numberValue = Number(node.value);
|
|
1662
|
-
if (numberValue <= 0) {
|
|
1663
|
-
return null;
|
|
1664
|
-
}
|
|
1665
|
-
if (!isKnownFontWeight(numberValue)) {
|
|
1666
|
-
return null;
|
|
1667
|
-
}
|
|
1668
|
-
return {
|
|
1669
|
-
number: numberValue,
|
|
1670
|
-
unit: null
|
|
1671
|
-
};
|
|
1672
|
-
case "Identifier":
|
|
1673
|
-
const namedValue = node.name.toLowerCase();
|
|
1674
|
-
if (!isKnownFontWeight(namedValue)) {
|
|
1675
|
-
return null;
|
|
1676
|
-
}
|
|
1677
|
-
if (namedValue === "normal") {
|
|
1678
|
-
return { number: 400, unit: null };
|
|
1679
|
-
}
|
|
1680
|
-
return { number: namedValue, unit: null };
|
|
1681
|
-
case "Percentage":
|
|
1682
|
-
const percentValue = Number(node.value);
|
|
1683
|
-
if (percentValue === 0) return null;
|
|
1684
|
-
return {
|
|
1685
|
-
number: percentValue,
|
|
1686
|
-
unit: "%"
|
|
1687
|
-
};
|
|
1688
|
-
case "Value":
|
|
1689
|
-
return node.children?.[0] ? extractFontValue(node.children[0]) : null;
|
|
1690
|
-
}
|
|
1691
|
-
return null;
|
|
1692
|
-
}
|
|
1693
|
-
function shouldSkipFontNode(node) {
|
|
1694
|
-
return node.type === "Function";
|
|
1695
|
-
}
|
|
1696
|
-
function forEachFontValue(valueText, callback) {
|
|
1697
|
-
forEachValue(valueText, extractFontValue, shouldSkipFontNode, callback);
|
|
1698
|
-
}
|
|
1699
|
-
|
|
1700
1732
|
// src/rules/v9/no-hardcoded-values/handlers/colorHandler.ts
|
|
1701
1733
|
var handleColorDeclaration = (node, context) => {
|
|
1702
1734
|
const cssProperty = node.property.toLowerCase();
|
|
@@ -2123,9 +2155,28 @@ function createBoxShadowReplacement(originalValue, hooks, context, positionInfo)
|
|
|
2123
2155
|
}
|
|
2124
2156
|
}
|
|
2125
2157
|
|
|
2158
|
+
// src/utils/rule-utils.ts
|
|
2159
|
+
function isRuleEnabled(context, ruleName3) {
|
|
2160
|
+
try {
|
|
2161
|
+
const rules2 = context.settings?.sldsRules || {};
|
|
2162
|
+
if (ruleName3 in rules2) {
|
|
2163
|
+
const ruleConfig14 = rules2[ruleName3];
|
|
2164
|
+
if (Array.isArray(ruleConfig14)) {
|
|
2165
|
+
return ruleConfig14[0] === true;
|
|
2166
|
+
} else if (ruleConfig14 !== void 0 && ruleConfig14 !== null) {
|
|
2167
|
+
return true;
|
|
2168
|
+
} else if (ruleConfig14 === false) {
|
|
2169
|
+
return false;
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
} catch (error) {
|
|
2173
|
+
return false;
|
|
2174
|
+
}
|
|
2175
|
+
}
|
|
2176
|
+
|
|
2126
2177
|
// src/rules/v9/no-hardcoded-values/noHardcodedValueRule.ts
|
|
2127
2178
|
function defineNoHardcodedValueRule(config) {
|
|
2128
|
-
const { ruleConfig: ruleConfig14 } = config;
|
|
2179
|
+
const { ruleConfig: ruleConfig14, ruleName: ruleName3 } = config;
|
|
2129
2180
|
const { type: type15, description: description15, url: url15, messages: messages15 } = ruleConfig14;
|
|
2130
2181
|
return {
|
|
2131
2182
|
meta: {
|
|
@@ -2139,6 +2190,9 @@ function defineNoHardcodedValueRule(config) {
|
|
|
2139
2190
|
messages: messages15
|
|
2140
2191
|
},
|
|
2141
2192
|
create(context) {
|
|
2193
|
+
if (ruleName3 === "no-hardcoded-values-slds1" && isRuleEnabled(context, "@salesforce-ux/slds/no-hardcoded-values-slds2")) {
|
|
2194
|
+
return {};
|
|
2195
|
+
}
|
|
2142
2196
|
const handlerContext = {
|
|
2143
2197
|
valueToStylinghook: config.valueToStylinghook,
|
|
2144
2198
|
context,
|
|
@@ -2194,36 +2248,38 @@ function defineNoHardcodedValueRule(config) {
|
|
|
2194
2248
|
}
|
|
2195
2249
|
|
|
2196
2250
|
// src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.ts
|
|
2197
|
-
var
|
|
2251
|
+
var ruleName = "no-hardcoded-values-slds1";
|
|
2252
|
+
var ruleConfig12 = import_rule_messages14.default[ruleName];
|
|
2198
2253
|
var { type: type13, description: description13, url: url13, messages: messages13 } = ruleConfig12;
|
|
2199
|
-
var valueToStylinghook =
|
|
2254
|
+
var valueToStylinghook = import_sds_metadata12.default.valueToStylingHooksSlds;
|
|
2200
2255
|
var no_hardcoded_values_slds1_default = defineNoHardcodedValueRule({
|
|
2201
2256
|
ruleConfig: ruleConfig12,
|
|
2202
|
-
valueToStylinghook
|
|
2257
|
+
valueToStylinghook,
|
|
2258
|
+
ruleName
|
|
2203
2259
|
});
|
|
2204
2260
|
|
|
2205
2261
|
// src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.ts
|
|
2206
|
-
var
|
|
2262
|
+
var import_sds_metadata13 = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
2207
2263
|
var import_rule_messages15 = __toESM(require_rule_messages());
|
|
2208
|
-
var
|
|
2264
|
+
var ruleName2 = "no-hardcoded-values-slds2";
|
|
2265
|
+
var ruleConfig13 = import_rule_messages15.default[ruleName2];
|
|
2209
2266
|
var { type: type14, description: description14, url: url14, messages: messages14 } = ruleConfig13;
|
|
2210
|
-
var valueToStylinghook2 =
|
|
2267
|
+
var valueToStylinghook2 = import_sds_metadata13.default.valueToStylingHooksCosmos;
|
|
2211
2268
|
var no_hardcoded_values_slds2_default = defineNoHardcodedValueRule({
|
|
2212
2269
|
ruleConfig: ruleConfig13,
|
|
2213
|
-
valueToStylinghook: valueToStylinghook2
|
|
2270
|
+
valueToStylinghook: valueToStylinghook2,
|
|
2271
|
+
ruleName: ruleName2
|
|
2214
2272
|
});
|
|
2215
2273
|
|
|
2216
2274
|
// src/index.ts
|
|
2217
2275
|
var import_parser2 = __toESM(require("@html-eslint/parser"));
|
|
2218
2276
|
var import_css = __toESM(require("@eslint/css"));
|
|
2219
2277
|
|
|
2220
|
-
// eslint.rules.
|
|
2221
|
-
var
|
|
2278
|
+
// eslint.rules.json
|
|
2279
|
+
var eslint_rules_default = {
|
|
2222
2280
|
css: {
|
|
2223
2281
|
"@salesforce-ux/slds/no-slds-class-overrides": "warn",
|
|
2224
2282
|
"@salesforce-ux/slds/no-deprecated-slds-classes": "warn",
|
|
2225
|
-
"@salesforce-ux/slds/no-deprecated-tokens-slds1": "error",
|
|
2226
|
-
"@salesforce-ux/slds/lwc-token-to-slds-hook": "error",
|
|
2227
2283
|
"@salesforce-ux/slds/enforce-sds-to-slds-hooks": "warn",
|
|
2228
2284
|
"@salesforce-ux/slds/no-sldshook-fallback-for-lwctoken": "warn",
|
|
2229
2285
|
"@salesforce-ux/slds/no-unsupported-hooks-slds2": "warn",
|
|
@@ -2231,7 +2287,6 @@ var eslint_rules_internal_default = {
|
|
|
2231
2287
|
"@salesforce-ux/slds/no-slds-namespace-for-custom-hooks": "warn",
|
|
2232
2288
|
"@salesforce-ux/slds/enforce-component-hook-naming-convention": "error",
|
|
2233
2289
|
"@salesforce-ux/slds/no-slds-private-var": "warn",
|
|
2234
|
-
"@salesforce-ux/slds/no-hardcoded-values-slds1": "error",
|
|
2235
2290
|
"@salesforce-ux/slds/no-hardcoded-values-slds2": "warn",
|
|
2236
2291
|
"@salesforce-ux/slds/reduce-annotations": "warn"
|
|
2237
2292
|
},
|
|
@@ -2265,47 +2320,56 @@ var rules = {
|
|
|
2265
2320
|
var plugin = {
|
|
2266
2321
|
meta: {
|
|
2267
2322
|
name: "@salesforce-ux/eslint-plugin-slds",
|
|
2268
|
-
version: "1.0.0
|
|
2323
|
+
version: "1.0.0"
|
|
2269
2324
|
},
|
|
2270
2325
|
rules,
|
|
2271
2326
|
configs: {}
|
|
2272
2327
|
};
|
|
2273
|
-
|
|
2274
|
-
//
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
sourceType: "module"
|
|
2283
|
-
},
|
|
2284
|
-
plugins: {
|
|
2285
|
-
"@salesforce-ux/slds": plugin
|
|
2286
|
-
},
|
|
2287
|
-
rules: eslint_rules_internal_default.html
|
|
2328
|
+
var cssConfigArray = [
|
|
2329
|
+
// CSS config - Standard CSS files
|
|
2330
|
+
{
|
|
2331
|
+
files: ["**/*.{css,scss}"],
|
|
2332
|
+
language: "css/css",
|
|
2333
|
+
...import_css.default.configs.recommended,
|
|
2334
|
+
languageOptions: {
|
|
2335
|
+
tolerant: true
|
|
2336
|
+
// Allow recoverable parsing errors for SCSS syntax
|
|
2288
2337
|
},
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
},
|
|
2298
|
-
plugins: {
|
|
2299
|
-
css: import_css.default,
|
|
2300
|
-
"@salesforce-ux/slds": plugin
|
|
2301
|
-
},
|
|
2302
|
-
rules: eslint_rules_internal_default.css
|
|
2338
|
+
plugins: {
|
|
2339
|
+
css: import_css.default,
|
|
2340
|
+
"@salesforce-ux/slds": plugin
|
|
2341
|
+
},
|
|
2342
|
+
rules: eslint_rules_default.css,
|
|
2343
|
+
settings: {
|
|
2344
|
+
// Pass rules configuration to context for runtime access
|
|
2345
|
+
sldsRules: { ...eslint_rules_default.css }
|
|
2303
2346
|
}
|
|
2304
|
-
|
|
2347
|
+
}
|
|
2348
|
+
];
|
|
2349
|
+
var htmlConfigArray = [
|
|
2350
|
+
// HTML/Component config
|
|
2351
|
+
{
|
|
2352
|
+
files: ["**/*.html", "**/*.cmp"],
|
|
2353
|
+
languageOptions: {
|
|
2354
|
+
parser: import_parser2.default,
|
|
2355
|
+
ecmaVersion: 2021,
|
|
2356
|
+
sourceType: "module"
|
|
2357
|
+
},
|
|
2358
|
+
plugins: {
|
|
2359
|
+
"@salesforce-ux/slds": plugin
|
|
2360
|
+
},
|
|
2361
|
+
rules: eslint_rules_default.html
|
|
2362
|
+
}
|
|
2363
|
+
];
|
|
2364
|
+
Object.assign(plugin.configs, {
|
|
2365
|
+
// Flat config for ESLint v9+
|
|
2366
|
+
"flat/recommended-css": cssConfigArray,
|
|
2367
|
+
"flat/recommended-html": htmlConfigArray,
|
|
2368
|
+
"flat/recommended": [...cssConfigArray, ...htmlConfigArray],
|
|
2305
2369
|
// legacy config for ESLint v8-
|
|
2306
2370
|
recommended: {
|
|
2307
2371
|
plugins: ["@salesforce-ux/slds"],
|
|
2308
|
-
rules:
|
|
2372
|
+
rules: eslint_rules_default.html,
|
|
2309
2373
|
parser: import_parser2.default,
|
|
2310
2374
|
parserOptions: {
|
|
2311
2375
|
ecmaVersion: 2021,
|