@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.
Files changed (53) hide show
  1. package/build/index.js +510 -446
  2. package/build/index.js.map +4 -4
  3. package/build/rules/enforce-bem-usage.js +5 -5
  4. package/build/rules/enforce-bem-usage.js.map +3 -3
  5. package/build/rules/no-deprecated-classes-slds2.js +2 -2
  6. package/build/rules/no-deprecated-classes-slds2.js.map +2 -2
  7. package/build/rules/v9/enforce-bem-usage.js +2 -2
  8. package/build/rules/v9/enforce-bem-usage.js.map +2 -2
  9. package/build/rules/v9/enforce-component-hook-naming-convention.js +2 -2
  10. package/build/rules/v9/enforce-component-hook-naming-convention.js.map +2 -2
  11. package/build/rules/v9/enforce-sds-to-slds-hooks.js +2 -2
  12. package/build/rules/v9/enforce-sds-to-slds-hooks.js.map +2 -2
  13. package/build/rules/v9/lwc-token-to-slds-hook.js +2 -2
  14. package/build/rules/v9/lwc-token-to-slds-hook.js.map +2 -2
  15. package/build/rules/v9/no-deprecated-slds-classes.js +2 -2
  16. package/build/rules/v9/no-deprecated-slds-classes.js.map +2 -2
  17. package/build/rules/v9/no-deprecated-tokens-slds1.js +2 -2
  18. package/build/rules/v9/no-deprecated-tokens-slds1.js.map +2 -2
  19. package/build/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.js.map +1 -1
  20. package/build/rules/v9/no-hardcoded-values/handlers/colorHandler.js.map +1 -1
  21. package/build/rules/v9/no-hardcoded-values/handlers/densityHandler.js.map +1 -1
  22. package/build/rules/v9/no-hardcoded-values/handlers/fontHandler.js.map +1 -1
  23. package/build/rules/v9/no-hardcoded-values/handlers/index.js.map +1 -1
  24. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js +29 -5
  25. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js.map +4 -4
  26. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js +29 -5
  27. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js.map +4 -4
  28. package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.js +23 -1
  29. package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.js.map +3 -3
  30. package/build/rules/v9/no-slds-class-overrides.js +2 -2
  31. package/build/rules/v9/no-slds-class-overrides.js.map +2 -2
  32. package/build/rules/v9/no-slds-namespace-for-custom-hooks.js +2 -2
  33. package/build/rules/v9/no-slds-namespace-for-custom-hooks.js.map +2 -2
  34. package/build/rules/v9/no-slds-var-without-fallback.js +121 -35
  35. package/build/rules/v9/no-slds-var-without-fallback.js.map +4 -4
  36. package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js +2 -2
  37. package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js.map +2 -2
  38. package/build/rules/v9/no-unsupported-hooks-slds2.js +2 -2
  39. package/build/rules/v9/no-unsupported-hooks-slds2.js.map +2 -2
  40. package/build/src/rules/v9/no-hardcoded-values/noHardcodedValueRule.d.ts +3 -1
  41. package/build/src/rules/v9/no-slds-var-without-fallback.d.ts +4 -0
  42. package/build/src/utils/css-utils.d.ts +13 -0
  43. package/build/src/utils/rule-utils.d.ts +8 -0
  44. package/build/types/index.js.map +1 -1
  45. package/build/utils/boxShadowValueParser.js.map +1 -1
  46. package/build/utils/color-lib-utils.js.map +1 -1
  47. package/build/utils/css-utils.js +100 -0
  48. package/build/utils/css-utils.js.map +4 -4
  49. package/build/utils/hardcoded-shared-utils.js.map +1 -1
  50. package/build/utils/rule-utils.js +46 -0
  51. package/build/utils/rule-utils.js.map +7 -0
  52. package/build/utils/styling-hook-utils.js.map +1 -1
  53. 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 import_next, import_rule_messages, type, description, url, messages, bemMapping, enforce_bem_usage_default;
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
- import_next = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next.default.bemNaming;
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 import_next14 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next14.default.bemNaming;
261
- var deprecatedClasses2 = import_next14.default.deprecatedClasses;
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 import_next14 = __toESM(require("@salesforce-ux/sds-metadata/next"));
352
+ var import_sds_metadata14 = __toESM(require("@salesforce-ux/sds-metadata"));
353
353
  var import_rule_messages16 = __toESM(require_rule_messages());
354
- var deprecatedClasses2 = import_next14.default.deprecatedClasses;
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 import_next2 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next2.default.sldsPlusClasses;
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 import_next3 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next3.default.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 import_next4 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next4.default.auraToLwcTokensMapping;
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 import_next5 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next5.default.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 import_next6 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next6.default.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 import_next7 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next7.default.sldsPlusStylingHooks;
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 import_next8 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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(import_next8.default.deprecatedStylingHooks);
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 import_next9 = __toESM(require("@salesforce-ux/sds-metadata/next"));
1023
+ var import_sds_metadata9 = __toESM(require("@salesforce-ux/sds-metadata"));
1024
1024
  var import_rule_messages9 = __toESM(require_rule_messages());
1025
- var ruleConfig7 = import_rule_messages9.default["no-slds-var-without-fallback"];
1026
- var { type: type8, description: description8, url: url8, messages: messages8 } = ruleConfig7;
1027
- var sldsVariables = import_next9.default.slds1ExcludedVars || {};
1028
- function isSldsCssVariable(cssVar) {
1029
- return cssVar.startsWith("--slds-");
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
- function hasFallbackValue(varFunctionNode) {
1032
- if (!varFunctionNode || !varFunctionNode.children) return false;
1033
- return varFunctionNode.children.some(
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
- // Handle SLDS tokens inside var() functions: var(--slds-*)
1063
- "Function[name='var'] Identifier[name=/^--slds-/]"(node) {
1064
- const cssVar = node.name;
1065
- if (!isSldsCssVariable(cssVar)) {
1066
- return;
1067
- }
1068
- const varFunctionNode = context.sourceCode.getAncestors(node).at(-1);
1069
- if (hasFallbackValue(varFunctionNode)) {
1070
- return;
1071
- }
1072
- const fallbackValue = sldsVariables[cssVar];
1073
- if (!fallbackValue) {
1074
- return;
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 import_next10 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next10.default.sldsPlusStylingHooks;
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 import_next11 = __toESM(require("@salesforce-ux/sds-metadata/next"));
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 = import_next11.default.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
- break;
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 ruleConfig12 = import_rule_messages14.default["no-hardcoded-values-slds1"];
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 = import_next12.default.valueToStylingHooksSlds;
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 import_next13 = __toESM(require("@salesforce-ux/sds-metadata/next"));
2262
+ var import_sds_metadata13 = __toESM(require("@salesforce-ux/sds-metadata"));
2207
2263
  var import_rule_messages15 = __toESM(require_rule_messages());
2208
- var ruleConfig13 = import_rule_messages15.default["no-hardcoded-values-slds2"];
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 = import_next13.default.valueToStylingHooksCosmos;
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.internal.json
2221
- var eslint_rules_internal_default = {
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-internal-alpha.0"
2323
+ version: "1.0.0"
2269
2324
  },
2270
2325
  rules,
2271
2326
  configs: {}
2272
2327
  };
2273
- Object.assign(plugin.configs, {
2274
- // Flat config for ESLint v9+
2275
- "flat/recommended": [
2276
- // HTML/Component config
2277
- {
2278
- files: ["**/*.html", "**/*.cmp"],
2279
- languageOptions: {
2280
- parser: import_parser2.default,
2281
- ecmaVersion: 2021,
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
- // CSS config - Standard CSS files
2290
- {
2291
- files: ["**/*.{css,scss}"],
2292
- language: "css/css",
2293
- ...import_css.default.configs.recommended,
2294
- languageOptions: {
2295
- tolerant: true
2296
- // Allow recoverable parsing errors for SCSS syntax
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: eslint_rules_internal_default.html,
2372
+ rules: eslint_rules_default.html,
2309
2373
  parser: import_parser2.default,
2310
2374
  parserOptions: {
2311
2375
  ecmaVersion: 2021,