@salesforce-ux/eslint-plugin-slds 0.5.3 → 1.0.0-internal-alpha.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 (114) hide show
  1. package/build/index.js +2309 -50
  2. package/build/index.js.map +4 -4
  3. package/build/rules/enforce-bem-usage.js +325 -85
  4. package/build/rules/enforce-bem-usage.js.map +4 -4
  5. package/build/rules/modal-close-button-issue.js +324 -179
  6. package/build/rules/modal-close-button-issue.js.map +4 -4
  7. package/build/rules/no-deprecated-classes-slds2.js +247 -53
  8. package/build/rules/no-deprecated-classes-slds2.js.map +4 -4
  9. package/build/rules/v9/enforce-bem-usage.js +236 -0
  10. package/build/rules/v9/enforce-bem-usage.js.map +7 -0
  11. package/build/rules/v9/enforce-component-hook-naming-convention.js +262 -0
  12. package/build/rules/v9/enforce-component-hook-naming-convention.js.map +7 -0
  13. package/build/rules/v9/enforce-sds-to-slds-hooks.js +260 -0
  14. package/build/rules/v9/enforce-sds-to-slds-hooks.js.map +7 -0
  15. package/build/rules/v9/lwc-token-to-slds-hook.js +330 -0
  16. package/build/rules/v9/lwc-token-to-slds-hook.js.map +7 -0
  17. package/build/rules/v9/no-deprecated-slds-classes.js +227 -0
  18. package/build/rules/v9/no-deprecated-slds-classes.js.map +7 -0
  19. package/build/rules/v9/no-deprecated-tokens-slds1.js +270 -0
  20. package/build/rules/v9/no-deprecated-tokens-slds1.js.map +7 -0
  21. package/build/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.js +339 -0
  22. package/build/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.js.map +7 -0
  23. package/build/rules/v9/no-hardcoded-values/handlers/colorHandler.js +348 -0
  24. package/build/rules/v9/no-hardcoded-values/handlers/colorHandler.js.map +7 -0
  25. package/build/rules/v9/no-hardcoded-values/handlers/densityHandler.js +344 -0
  26. package/build/rules/v9/no-hardcoded-values/handlers/densityHandler.js.map +7 -0
  27. package/build/rules/v9/no-hardcoded-values/handlers/fontHandler.js +388 -0
  28. package/build/rules/v9/no-hardcoded-values/handlers/fontHandler.js.map +7 -0
  29. package/build/rules/v9/no-hardcoded-values/handlers/index.js +834 -0
  30. package/build/rules/v9/no-hardcoded-values/handlers/index.js.map +7 -0
  31. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js +1112 -0
  32. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js.map +7 -0
  33. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js +1112 -0
  34. package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js.map +7 -0
  35. package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.js +945 -0
  36. package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.js.map +7 -0
  37. package/build/rules/v9/no-slds-class-overrides.js +233 -0
  38. package/build/rules/v9/no-slds-class-overrides.js.map +7 -0
  39. package/build/rules/v9/no-slds-namespace-for-custom-hooks.js +250 -0
  40. package/build/rules/v9/no-slds-namespace-for-custom-hooks.js.map +7 -0
  41. package/build/rules/v9/no-slds-private-var.js +230 -0
  42. package/build/rules/v9/no-slds-private-var.js.map +7 -0
  43. package/build/rules/v9/no-slds-var-without-fallback.js +253 -0
  44. package/build/rules/v9/no-slds-var-without-fallback.js.map +7 -0
  45. package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js +253 -0
  46. package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js.map +7 -0
  47. package/build/rules/v9/no-unsupported-hooks-slds2.js +243 -0
  48. package/build/rules/v9/no-unsupported-hooks-slds2.js.map +7 -0
  49. package/build/rules/v9/reduce-annotations.js +234 -0
  50. package/build/rules/v9/reduce-annotations.js.map +7 -0
  51. package/build/src/rules/enforce-bem-usage.d.ts +17 -0
  52. package/build/{rules → src/rules}/modal-close-button-issue.d.ts +2 -1
  53. package/build/{rules → src/rules}/no-deprecated-classes-slds2.d.ts +2 -1
  54. package/build/src/rules/v9/enforce-bem-usage.d.ts +3 -0
  55. package/build/src/rules/v9/enforce-component-hook-naming-convention.d.ts +3 -0
  56. package/build/src/rules/v9/enforce-sds-to-slds-hooks.d.ts +3 -0
  57. package/build/src/rules/v9/lwc-token-to-slds-hook.d.ts +3 -0
  58. package/build/src/rules/v9/no-deprecated-slds-classes.d.ts +3 -0
  59. package/build/src/rules/v9/no-deprecated-tokens-slds1.d.ts +3 -0
  60. package/build/src/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.d.ts +5 -0
  61. package/build/src/rules/v9/no-hardcoded-values/handlers/colorHandler.d.ts +7 -0
  62. package/build/src/rules/v9/no-hardcoded-values/handlers/densityHandler.d.ts +7 -0
  63. package/build/src/rules/v9/no-hardcoded-values/handlers/fontHandler.d.ts +6 -0
  64. package/build/src/rules/v9/no-hardcoded-values/handlers/index.d.ts +8 -0
  65. package/build/src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.d.ts +3 -0
  66. package/build/src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.d.ts +3 -0
  67. package/build/src/rules/v9/no-hardcoded-values/noHardcodedValueRule.d.ts +9 -0
  68. package/build/src/rules/v9/no-slds-class-overrides.d.ts +8 -0
  69. package/build/src/rules/v9/no-slds-namespace-for-custom-hooks.d.ts +3 -0
  70. package/build/src/rules/v9/no-slds-private-var.d.ts +3 -0
  71. package/build/src/rules/v9/no-slds-var-without-fallback.d.ts +3 -0
  72. package/build/src/rules/v9/no-sldshook-fallback-for-lwctoken.d.ts +3 -0
  73. package/build/src/rules/v9/no-unsupported-hooks-slds2.d.ts +3 -0
  74. package/build/src/rules/v9/reduce-annotations.d.ts +3 -0
  75. package/build/src/types/index.d.ts +26 -0
  76. package/build/src/utils/boxShadowValueParser.d.ts +17 -0
  77. package/build/src/utils/color-lib-utils.d.ts +18 -0
  78. package/build/src/utils/css-functions.d.ts +7 -0
  79. package/build/src/utils/css-utils.d.ts +7 -0
  80. package/build/src/utils/hardcoded-shared-utils.d.ts +60 -0
  81. package/build/src/utils/property-matcher.d.ts +23 -0
  82. package/build/src/utils/styling-hook-utils.d.ts +7 -0
  83. package/build/src/utils/value-utils.d.ts +40 -0
  84. package/build/types/index.js +18 -0
  85. package/build/types/index.js.map +7 -0
  86. package/build/types/yaml.d.js +1 -0
  87. package/build/types/yaml.d.js.map +7 -0
  88. package/build/utils/boxShadowValueParser.js +197 -0
  89. package/build/utils/boxShadowValueParser.js.map +7 -0
  90. package/build/utils/color-lib-utils.js +160 -0
  91. package/build/utils/color-lib-utils.js.map +7 -0
  92. package/build/utils/css-functions.js +68 -0
  93. package/build/utils/css-functions.js.map +7 -0
  94. package/build/utils/css-utils.js +33 -0
  95. package/build/utils/css-utils.js.map +7 -0
  96. package/build/utils/hardcoded-shared-utils.js +300 -0
  97. package/build/utils/hardcoded-shared-utils.js.map +7 -0
  98. package/build/utils/node.js +158 -0
  99. package/build/{rules/utils → utils}/node.js.map +2 -2
  100. package/build/utils/property-matcher.js +159 -0
  101. package/build/utils/property-matcher.js.map +7 -0
  102. package/build/utils/styling-hook-utils.js +80 -0
  103. package/build/utils/styling-hook-utils.js.map +7 -0
  104. package/build/utils/value-utils.js +65 -0
  105. package/build/utils/value-utils.js.map +7 -0
  106. package/package.json +9 -4
  107. package/src/config/rule-messages.yml +143 -0
  108. package/build/rules/enforce-bem-usage.d.ts +0 -28
  109. package/build/rules/utils/node.js +0 -197
  110. package/build/rules/utils/rule.d.ts +0 -7
  111. package/build/rules/utils/rule.js +0 -10
  112. package/build/rules/utils/rule.js.map +0 -7
  113. /package/build/{index.d.ts → src/index.d.ts} +0 -0
  114. /package/build/{rules → src}/utils/node.d.ts +0 -0
@@ -0,0 +1,160 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/utils/color-lib-utils.ts
30
+ var color_lib_utils_exports = {};
31
+ __export(color_lib_utils_exports, {
32
+ convertToHex: () => convertToHex,
33
+ extractColorValue: () => extractColorValue,
34
+ findClosestColorHook: () => findClosestColorHook,
35
+ isHardCodedColor: () => isHardCodedColor,
36
+ isHexCode: () => isHexCode,
37
+ isValidColor: () => isValidColor
38
+ });
39
+ module.exports = __toCommonJS(color_lib_utils_exports);
40
+ var import_chroma_js = __toESM(require("chroma-js"));
41
+ var import_css_tree = require("@eslint/css-tree");
42
+
43
+ // src/utils/css-functions.ts
44
+ var CSS_FUNCTIONS = [
45
+ "attr",
46
+ "calc",
47
+ "color-mix",
48
+ "conic-gradient",
49
+ "counter",
50
+ "cubic-bezier",
51
+ "linear-gradient",
52
+ "max",
53
+ "min",
54
+ "radial-gradient",
55
+ "repeating-conic-gradient",
56
+ "repeating-linear-gradient",
57
+ "repeating-radial-gradient",
58
+ "var"
59
+ ];
60
+ var CSS_MATH_FUNCTIONS = ["calc", "min", "max"];
61
+ var RGB_COLOR_FUNCTIONS = ["rgb", "rgba", "hsl", "hsla"];
62
+ var cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join("|")})`);
63
+ var cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join("|")})$`);
64
+ var cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join("|")})$`);
65
+ function isCssColorFunction(value) {
66
+ return RGB_COLOR_FUNCTIONS.includes(value);
67
+ }
68
+
69
+ // src/utils/color-lib-utils.ts
70
+ var LAB_THRESHOLD = 25;
71
+ var isHardCodedColor = (color) => {
72
+ const colorRegex = /\b(rgb|rgba)\((\s*\d{1,3}\s*,\s*){2,3}\s*(0|1|0?\.\d+)\s*\)|#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\b|[a-zA-Z]+/g;
73
+ return colorRegex.test(color);
74
+ };
75
+ var isHexCode = (color) => {
76
+ const hexPattern = /^#(?:[0-9a-fA-F]{3}){1,2}$/;
77
+ return hexPattern.test(color);
78
+ };
79
+ var convertToHex = (color) => {
80
+ try {
81
+ return (0, import_chroma_js.default)(color).hex();
82
+ } catch (e) {
83
+ return null;
84
+ }
85
+ };
86
+ var findClosestColorHook = (color, supportedColors, cssProperty) => {
87
+ const returnStylingHooks = [];
88
+ const closestHooksWithSameProperty = [];
89
+ const closestHooksWithoutSameProperty = [];
90
+ const closestHooksWithAllProperty = [];
91
+ const labColor = (0, import_chroma_js.default)(color).lab();
92
+ Object.entries(supportedColors).forEach(([sldsValue, data]) => {
93
+ if (sldsValue && isHexCode(sldsValue)) {
94
+ const hooks = data;
95
+ hooks.forEach((hook) => {
96
+ const labSupportedColor = (0, import_chroma_js.default)(sldsValue).lab();
97
+ 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");
98
+ if (hook.properties.includes(cssProperty)) {
99
+ if (distance <= LAB_THRESHOLD) {
100
+ closestHooksWithSameProperty.push({ name: hook.name, distance });
101
+ }
102
+ } else if (hook.properties.includes("*")) {
103
+ if (distance <= LAB_THRESHOLD) {
104
+ closestHooksWithAllProperty.push({ name: hook.name, distance });
105
+ }
106
+ } else {
107
+ if (distance <= LAB_THRESHOLD) {
108
+ closestHooksWithoutSameProperty.push({ name: hook.name, distance });
109
+ }
110
+ }
111
+ });
112
+ }
113
+ });
114
+ const closesthookGroups = [
115
+ { hooks: closestHooksWithSameProperty, distance: 0 },
116
+ { hooks: closestHooksWithAllProperty, distance: 0 },
117
+ { hooks: closestHooksWithSameProperty, distance: Infinity },
118
+ // For hooks with distance > 0
119
+ { hooks: closestHooksWithAllProperty, distance: Infinity },
120
+ { hooks: closestHooksWithoutSameProperty, distance: Infinity }
121
+ ];
122
+ for (const group of closesthookGroups) {
123
+ const filteredHooks = group.hooks.filter(
124
+ (h) => group.distance === 0 ? h.distance === 0 : h.distance > 0
125
+ );
126
+ if (returnStylingHooks.length < 1 && filteredHooks.length > 0) {
127
+ filteredHooks.sort((a, b) => a.distance - b.distance);
128
+ returnStylingHooks.push(...filteredHooks.slice(0, 5).map((h) => h.name));
129
+ }
130
+ }
131
+ return Array.from(new Set(returnStylingHooks));
132
+ };
133
+ var isValidColor = (val) => import_chroma_js.default.valid(val);
134
+ var extractColorValue = (node) => {
135
+ let colorValue = null;
136
+ switch (node.type) {
137
+ case "Hash":
138
+ colorValue = `#${node.value}`;
139
+ break;
140
+ case "Identifier":
141
+ colorValue = node.name;
142
+ break;
143
+ case "Function":
144
+ if (isCssColorFunction(node.name)) {
145
+ colorValue = (0, import_css_tree.generate)(node);
146
+ }
147
+ break;
148
+ }
149
+ return colorValue && isValidColor(colorValue) ? colorValue : null;
150
+ };
151
+ // Annotate the CommonJS export names for ESM import in node:
152
+ 0 && (module.exports = {
153
+ convertToHex,
154
+ extractColorValue,
155
+ findClosestColorHook,
156
+ isHardCodedColor,
157
+ isHexCode,
158
+ isValidColor
159
+ });
160
+ //# sourceMappingURL=color-lib-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/color-lib-utils.ts", "../../src/utils/css-functions.ts"],
4
+ "sourcesContent": ["//stylelint-sds/packages/stylelint-plugin-slds/src/utils/color-lib-utils.ts\nimport { ValueToStylingHooksMapping, ValueToStylingHookEntry } from '@salesforce-ux/sds-metadata/next';\nimport chroma from 'chroma-js';\nimport { generate } from '@eslint/css-tree';\nimport { isCssColorFunction } from './css-functions';\n\nconst LAB_THRESHOLD = 25; // Adjust this to set how strict the matching should be\n\nconst isHardCodedColor = (color: string): boolean => {\n const colorRegex =\n /\\b(rgb|rgba)\\((\\s*\\d{1,3}\\s*,\\s*){2,3}\\s*(0|1|0?\\.\\d+)\\s*\\)|#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\\b|[a-zA-Z]+/g;\n return colorRegex.test(color);\n};\n\nconst isHexCode = (color: string): boolean => {\n const hexPattern = /^#(?:[0-9a-fA-F]{3}){1,2}$/; // Pattern for #RGB or #RRGGBB\n return hexPattern.test(color);\n};\n\n// Convert a named color or hex code into a hex format using chroma-js\nconst convertToHex = (color: string): string | null => {\n try {\n // Try converting the color using chroma-js, which handles both named and hex colors\n return chroma(color).hex();\n } catch (e) {\n // If chroma can't process the color, it's likely invalid\n return null;\n }\n};\n\n// Find the closest color hook using LAB distance\nconst findClosestColorHook = (\n color: string,\n supportedColors:ValueToStylingHooksMapping,\n cssProperty: string\n): string[] => {\n const returnStylingHooks: string[] = [];\n const closestHooksWithSameProperty: { name: string; distance: number }[] = [];\n const closestHooksWithoutSameProperty: { name: string; distance: number }[] =\n [];\n const closestHooksWithAllProperty: { name: string; distance: number }[] =\n [];\n const labColor = chroma(color).lab();\n\n Object.entries(supportedColors).forEach(([sldsValue, data]) => {\n if (sldsValue && isHexCode(sldsValue)) {\n const hooks = data as ValueToStylingHookEntry[]; // Get the hooks for the sldsValue\n\n hooks.forEach((hook) => {\n const labSupportedColor = chroma(sldsValue).lab();\n const distance = (JSON.stringify(labColor) === JSON.stringify(labSupportedColor)) ? 0\n : chroma.distance(chroma.lab(...labColor), chroma.lab(...labSupportedColor), \"lab\");\n // Check if the hook has the same property\n if (hook.properties.includes(cssProperty)) {\n // Add to same property hooks if within threshold\n if (distance <= LAB_THRESHOLD) {\n closestHooksWithSameProperty.push({ name: hook.name, distance });\n }\n } \n // Check for the universal selector\n else if ( hook.properties.includes(\"*\") ){\n // Add to same property hooks if within threshold\n if (distance <= LAB_THRESHOLD) {\n closestHooksWithAllProperty.push({ name: hook.name, distance });\n }\n }\n else {\n // Add to different property hooks if within threshold\n if (distance <= LAB_THRESHOLD) {\n closestHooksWithoutSameProperty.push({ name: hook.name, distance });\n }\n }\n });\n }\n });\n\n// Group hooks by their priority\nconst closesthookGroups = [\n { hooks: closestHooksWithSameProperty, distance: 0 },\n { hooks: closestHooksWithAllProperty, distance: 0 },\n { hooks: closestHooksWithSameProperty, distance: Infinity }, // For hooks with distance > 0\n { hooks: closestHooksWithAllProperty, distance: Infinity },\n { hooks: closestHooksWithoutSameProperty, distance: Infinity },\n];\n\nfor (const group of closesthookGroups) {\n // Filter hooks based on the distance condition\n const filteredHooks = group.hooks.filter(h => \n group.distance === 0 ? h.distance === 0 : h.distance > 0\n );\n\n if (returnStylingHooks.length < 1 && filteredHooks.length > 0) {\n filteredHooks.sort((a, b) => a.distance - b.distance);\n returnStylingHooks.push(...filteredHooks.slice(0, 5).map((h) => h.name));\n }\n}\n\n\n return Array.from(new Set(returnStylingHooks));\n};\n\n/**\n * This method is usefull to identify all possible css color values.\n * - names colors\n * - 6,8 digit hex\n * - rgb and rgba\n * - hsl and hsla\n */\nconst isValidColor = (val:string):boolean => chroma.valid(val);\n\n/**\n * Extract color value from CSS AST node\n */\nconst extractColorValue = (node: any): string | null => {\n let colorValue: string | null = null;\n \n switch (node.type) {\n case 'Hash':\n colorValue = `#${node.value}`;\n break;\n case 'Identifier':\n colorValue = node.name;\n break;\n case 'Function':\n // Only extract color functions\n if (isCssColorFunction(node.name)) {\n colorValue = generate(node);\n }\n break;\n }\n \n return colorValue && isValidColor(colorValue) ? colorValue : null;\n};\n\nexport { findClosestColorHook, convertToHex, isHexCode, isHardCodedColor, isValidColor, extractColorValue };\n", "//stylelint-sds/packages/stylelint-plugin-slds/src/utils/css-functions.ts\n/**\n * Complete list of CSS functions that should be preserved/recognized\n */\nconst CSS_FUNCTIONS = [\n 'attr',\n 'calc',\n 'color-mix',\n 'conic-gradient',\n 'counter',\n 'cubic-bezier',\n 'linear-gradient',\n 'max',\n 'min',\n 'radial-gradient',\n 'repeating-conic-gradient',\n 'repeating-linear-gradient',\n 'repeating-radial-gradient',\n 'var'\n ];\n \n \n const CSS_MATH_FUNCTIONS = ['calc', 'min', 'max'];\n \n \n const RGB_COLOR_FUNCTIONS = ['rgb', 'rgba', 'hsl', 'hsla'];\n \n /**\n * Regex for matching any CSS function (for general detection)\n * Matches function names within other text\n */\n const cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join('|')})`);\n \n \n const cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join('|')})$`);\n \n \n const cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join('|')})$`);\n \n export function containsCssFunction(value: string): boolean {\n return cssFunctionsRegex.test(value);\n }\n \n /**\n * Check if a value is exactly a CSS function name\n */\n export function isCssFunction(value: string): boolean {\n return cssFunctionsExactRegex.test(value);\n }\n \n export function isCssMathFunction(value: string): boolean {\n return cssMathFunctionsRegex.test(value);\n }\n \n export function isCssColorFunction(value: string): boolean {\n return RGB_COLOR_FUNCTIONS.includes(value);\n }"],
5
+ "mappings": "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",
6
+ "names": ["chroma"]
7
+ }
@@ -0,0 +1,68 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/utils/css-functions.ts
20
+ var css_functions_exports = {};
21
+ __export(css_functions_exports, {
22
+ containsCssFunction: () => containsCssFunction,
23
+ isCssColorFunction: () => isCssColorFunction,
24
+ isCssFunction: () => isCssFunction,
25
+ isCssMathFunction: () => isCssMathFunction
26
+ });
27
+ module.exports = __toCommonJS(css_functions_exports);
28
+ var CSS_FUNCTIONS = [
29
+ "attr",
30
+ "calc",
31
+ "color-mix",
32
+ "conic-gradient",
33
+ "counter",
34
+ "cubic-bezier",
35
+ "linear-gradient",
36
+ "max",
37
+ "min",
38
+ "radial-gradient",
39
+ "repeating-conic-gradient",
40
+ "repeating-linear-gradient",
41
+ "repeating-radial-gradient",
42
+ "var"
43
+ ];
44
+ var CSS_MATH_FUNCTIONS = ["calc", "min", "max"];
45
+ var RGB_COLOR_FUNCTIONS = ["rgb", "rgba", "hsl", "hsla"];
46
+ var cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join("|")})`);
47
+ var cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join("|")})$`);
48
+ var cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join("|")})$`);
49
+ function containsCssFunction(value) {
50
+ return cssFunctionsRegex.test(value);
51
+ }
52
+ function isCssFunction(value) {
53
+ return cssFunctionsExactRegex.test(value);
54
+ }
55
+ function isCssMathFunction(value) {
56
+ return cssMathFunctionsRegex.test(value);
57
+ }
58
+ function isCssColorFunction(value) {
59
+ return RGB_COLOR_FUNCTIONS.includes(value);
60
+ }
61
+ // Annotate the CommonJS export names for ESM import in node:
62
+ 0 && (module.exports = {
63
+ containsCssFunction,
64
+ isCssColorFunction,
65
+ isCssFunction,
66
+ isCssMathFunction
67
+ });
68
+ //# sourceMappingURL=css-functions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/css-functions.ts"],
4
+ "sourcesContent": ["//stylelint-sds/packages/stylelint-plugin-slds/src/utils/css-functions.ts\n/**\n * Complete list of CSS functions that should be preserved/recognized\n */\nconst CSS_FUNCTIONS = [\n 'attr',\n 'calc',\n 'color-mix',\n 'conic-gradient',\n 'counter',\n 'cubic-bezier',\n 'linear-gradient',\n 'max',\n 'min',\n 'radial-gradient',\n 'repeating-conic-gradient',\n 'repeating-linear-gradient',\n 'repeating-radial-gradient',\n 'var'\n ];\n \n \n const CSS_MATH_FUNCTIONS = ['calc', 'min', 'max'];\n \n \n const RGB_COLOR_FUNCTIONS = ['rgb', 'rgba', 'hsl', 'hsla'];\n \n /**\n * Regex for matching any CSS function (for general detection)\n * Matches function names within other text\n */\n const cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join('|')})`);\n \n \n const cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join('|')})$`);\n \n \n const cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join('|')})$`);\n \n export function containsCssFunction(value: string): boolean {\n return cssFunctionsRegex.test(value);\n }\n \n /**\n * Check if a value is exactly a CSS function name\n */\n export function isCssFunction(value: string): boolean {\n return cssFunctionsExactRegex.test(value);\n }\n \n export function isCssMathFunction(value: string): boolean {\n return cssMathFunctionsRegex.test(value);\n }\n \n export function isCssColorFunction(value: string): boolean {\n return RGB_COLOR_FUNCTIONS.includes(value);\n }"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,IAAM,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,qBAAqB,CAAC,QAAQ,OAAO,KAAK;AAGhD,IAAM,sBAAsB,CAAC,OAAO,QAAQ,OAAO,MAAM;AAMzD,IAAM,oBAAoB,IAAI,OAAO,MAAM,cAAc,KAAK,GAAG,CAAC,GAAG;AAGrE,IAAM,yBAAyB,IAAI,OAAO,OAAO,cAAc,KAAK,GAAG,CAAC,IAAI;AAG5E,IAAM,wBAAwB,IAAI,OAAO,OAAO,mBAAmB,KAAK,GAAG,CAAC,IAAI;AAEzE,SAAS,oBAAoB,OAAwB;AAC1D,SAAO,kBAAkB,KAAK,KAAK;AACrC;AAKO,SAAS,cAAc,OAAwB;AACpD,SAAO,uBAAuB,KAAK,KAAK;AAC1C;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,sBAAsB,KAAK,KAAK;AACzC;AAEO,SAAS,mBAAmB,OAAwB;AACzD,SAAO,oBAAoB,SAAS,KAAK;AAC3C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,33 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/utils/css-utils.ts
20
+ var css_utils_exports = {};
21
+ __export(css_utils_exports, {
22
+ isTargetProperty: () => isTargetProperty
23
+ });
24
+ module.exports = __toCommonJS(css_utils_exports);
25
+ function isTargetProperty(property, propertyTargets = []) {
26
+ if (typeof property !== "string") return false;
27
+ return property.startsWith("--sds-") || property.startsWith("--slds-") || property.startsWith("--lwc-") || propertyTargets.length === 0 || propertyTargets.includes(property);
28
+ }
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ isTargetProperty
32
+ });
33
+ //# sourceMappingURL=css-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/css-utils.ts"],
4
+ "sourcesContent": ["/**\n * Check if a CSS property should be targeted for linting based on prefixes or explicit targets\n * @param property - The CSS property name to check\n * @param propertyTargets - Array of specific properties to target (empty means target all)\n * @returns true if the property should be targeted\n */\nexport function isTargetProperty(property: string, propertyTargets: string[] = []): boolean {\n if (typeof property !== 'string') return false;\n return property.startsWith('--sds-')\n || property.startsWith('--slds-')\n || property.startsWith('--lwc-')\n || propertyTargets.length === 0\n || propertyTargets.includes(property);\n}"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,iBAAiB,UAAkB,kBAA4B,CAAC,GAAY;AAC1F,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,SAAO,SAAS,WAAW,QAAQ,KAC9B,SAAS,WAAW,SAAS,KAC7B,SAAS,WAAW,QAAQ,KAC5B,gBAAgB,WAAW,KAC3B,gBAAgB,SAAS,QAAQ;AACxC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,300 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/utils/hardcoded-shared-utils.ts
30
+ var hardcoded_shared_utils_exports = {};
31
+ __export(hardcoded_shared_utils_exports, {
32
+ forEachColorValue: () => forEachColorValue,
33
+ forEachDensityValue: () => forEachDensityValue,
34
+ forEachFontValue: () => forEachFontValue,
35
+ forEachValue: () => forEachValue,
36
+ handleShorthandAutoFix: () => handleShorthandAutoFix,
37
+ isKnownFontWeight: () => isKnownFontWeight
38
+ });
39
+ module.exports = __toCommonJS(hardcoded_shared_utils_exports);
40
+ var import_css_tree2 = require("@eslint/css-tree");
41
+
42
+ // src/utils/color-lib-utils.ts
43
+ var import_chroma_js = __toESM(require("chroma-js"));
44
+ var import_css_tree = require("@eslint/css-tree");
45
+
46
+ // src/utils/css-functions.ts
47
+ var CSS_FUNCTIONS = [
48
+ "attr",
49
+ "calc",
50
+ "color-mix",
51
+ "conic-gradient",
52
+ "counter",
53
+ "cubic-bezier",
54
+ "linear-gradient",
55
+ "max",
56
+ "min",
57
+ "radial-gradient",
58
+ "repeating-conic-gradient",
59
+ "repeating-linear-gradient",
60
+ "repeating-radial-gradient",
61
+ "var"
62
+ ];
63
+ var CSS_MATH_FUNCTIONS = ["calc", "min", "max"];
64
+ var RGB_COLOR_FUNCTIONS = ["rgb", "rgba", "hsl", "hsla"];
65
+ var cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join("|")})`);
66
+ var cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join("|")})$`);
67
+ var cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join("|")})$`);
68
+ function isCssFunction(value) {
69
+ return cssFunctionsExactRegex.test(value);
70
+ }
71
+ function isCssColorFunction(value) {
72
+ return RGB_COLOR_FUNCTIONS.includes(value);
73
+ }
74
+
75
+ // src/utils/color-lib-utils.ts
76
+ var isValidColor = (val) => import_chroma_js.default.valid(val);
77
+ var extractColorValue = (node) => {
78
+ let colorValue = null;
79
+ switch (node.type) {
80
+ case "Hash":
81
+ colorValue = `#${node.value}`;
82
+ break;
83
+ case "Identifier":
84
+ colorValue = node.name;
85
+ break;
86
+ case "Function":
87
+ if (isCssColorFunction(node.name)) {
88
+ colorValue = (0, import_css_tree.generate)(node);
89
+ }
90
+ break;
91
+ }
92
+ return colorValue && isValidColor(colorValue) ? colorValue : null;
93
+ };
94
+
95
+ // src/utils/hardcoded-shared-utils.ts
96
+ var FONT_WEIGHTS = [
97
+ "normal",
98
+ "bold",
99
+ "bolder",
100
+ "lighter",
101
+ "100",
102
+ "200",
103
+ "300",
104
+ "400",
105
+ "500",
106
+ "600",
107
+ "700",
108
+ "800",
109
+ "900"
110
+ ];
111
+ function isKnownFontWeight(value) {
112
+ const stringValue = value.toString();
113
+ return FONT_WEIGHTS.includes(stringValue.toLowerCase());
114
+ }
115
+ function handleShorthandAutoFix(declarationNode, context, valueText, replacements) {
116
+ const sortedReplacements = replacements.sort((a, b) => a.start - b.start);
117
+ const hasAnyHooks = sortedReplacements.some((r) => r.hasHook);
118
+ const canAutoFix = hasAnyHooks;
119
+ sortedReplacements.forEach(({ start, end, replacement, displayValue, hasHook }) => {
120
+ const originalValue = valueText.substring(start, end);
121
+ const valueStartColumn = declarationNode.value.loc.start.column;
122
+ const valueColumn = valueStartColumn + start;
123
+ const { loc: { start: locStart, end: locEnd } } = declarationNode.value;
124
+ const reportNode = {
125
+ ...declarationNode.value,
126
+ loc: {
127
+ ...declarationNode.value.loc,
128
+ start: {
129
+ ...locStart,
130
+ column: valueColumn
131
+ },
132
+ end: {
133
+ ...locEnd,
134
+ column: valueColumn + originalValue.length
135
+ }
136
+ }
137
+ };
138
+ if (hasHook) {
139
+ const fix = canAutoFix ? (fixer) => {
140
+ let newValue = valueText;
141
+ for (let i = sortedReplacements.length - 1; i >= 0; i--) {
142
+ const { start: rStart, end: rEnd, replacement: rReplacement } = sortedReplacements[i];
143
+ newValue = newValue.substring(0, rStart) + rReplacement + newValue.substring(rEnd);
144
+ }
145
+ return fixer.replaceText(declarationNode.value, newValue);
146
+ } : void 0;
147
+ context.context.report({
148
+ node: reportNode,
149
+ messageId: "hardcodedValue",
150
+ data: {
151
+ oldValue: originalValue,
152
+ newValue: displayValue
153
+ },
154
+ fix
155
+ });
156
+ } else {
157
+ context.context.report({
158
+ node: reportNode,
159
+ messageId: "noReplacement",
160
+ data: {
161
+ oldValue: originalValue
162
+ }
163
+ });
164
+ }
165
+ });
166
+ }
167
+ function forEachValue(valueText, extractValue, shouldSkipNode, callback) {
168
+ if (!valueText || typeof valueText !== "string") {
169
+ return;
170
+ }
171
+ try {
172
+ const ast = (0, import_css_tree2.parse)(valueText, { context: "value", positions: true });
173
+ (0, import_css_tree2.walk)(ast, {
174
+ enter(node) {
175
+ if (shouldSkipNode(node)) {
176
+ return this.skip;
177
+ }
178
+ const value = extractValue(node);
179
+ if (value !== null) {
180
+ const positionInfo = {
181
+ start: node.loc?.start,
182
+ end: node.loc?.end
183
+ };
184
+ callback(value, positionInfo);
185
+ }
186
+ }
187
+ });
188
+ } catch (error) {
189
+ return;
190
+ }
191
+ }
192
+ function shouldSkipColorNode(node) {
193
+ return node.type === "Function" && isCssFunction(node.name);
194
+ }
195
+ function shouldSkipDimensionNode(node) {
196
+ return node.type === "Function";
197
+ }
198
+ function extractDimensionValue(valueNode, cssProperty) {
199
+ if (!valueNode) return null;
200
+ switch (valueNode.type) {
201
+ case "Dimension":
202
+ const numValue = Number(valueNode.value);
203
+ if (numValue === 0) return null;
204
+ const unit = valueNode.unit.toLowerCase();
205
+ if (unit !== "px" && unit !== "rem" && unit !== "%") return null;
206
+ return {
207
+ number: numValue,
208
+ unit
209
+ };
210
+ case "Number":
211
+ const numberValue = Number(valueNode.value);
212
+ if (numberValue === 0) return null;
213
+ return {
214
+ number: numberValue,
215
+ unit: null
216
+ };
217
+ case "Percentage":
218
+ const percentValue = Number(valueNode.value);
219
+ if (percentValue === 0) return null;
220
+ return {
221
+ number: percentValue,
222
+ unit: "%"
223
+ };
224
+ case "Value":
225
+ return valueNode.children?.[0] ? extractDimensionValue(valueNode.children[0], cssProperty) : null;
226
+ }
227
+ return null;
228
+ }
229
+ function forEachColorValue(valueText, callback) {
230
+ forEachValue(valueText, extractColorValue, shouldSkipColorNode, callback);
231
+ }
232
+ function forEachDensityValue(valueText, cssProperty, callback) {
233
+ forEachValue(
234
+ valueText,
235
+ (node) => extractDimensionValue(node, cssProperty),
236
+ shouldSkipDimensionNode,
237
+ callback
238
+ );
239
+ }
240
+ function extractFontValue(node) {
241
+ if (!node) return null;
242
+ switch (node.type) {
243
+ case "Dimension":
244
+ const numValue = Number(node.value);
245
+ if (numValue <= 0) return null;
246
+ const unit = node.unit.toLowerCase();
247
+ if (unit !== "px" && unit !== "rem" && unit !== "%") return null;
248
+ return {
249
+ number: numValue,
250
+ unit
251
+ };
252
+ case "Number":
253
+ const numberValue = Number(node.value);
254
+ if (numberValue <= 0) {
255
+ return null;
256
+ }
257
+ if (!isKnownFontWeight(numberValue)) {
258
+ return null;
259
+ }
260
+ return {
261
+ number: numberValue,
262
+ unit: null
263
+ };
264
+ case "Identifier":
265
+ const namedValue = node.name.toLowerCase();
266
+ if (!isKnownFontWeight(namedValue)) {
267
+ return null;
268
+ }
269
+ if (namedValue === "normal") {
270
+ return { number: 400, unit: null };
271
+ }
272
+ return { number: namedValue, unit: null };
273
+ case "Percentage":
274
+ const percentValue = Number(node.value);
275
+ if (percentValue === 0) return null;
276
+ return {
277
+ number: percentValue,
278
+ unit: "%"
279
+ };
280
+ case "Value":
281
+ return node.children?.[0] ? extractFontValue(node.children[0]) : null;
282
+ }
283
+ return null;
284
+ }
285
+ function shouldSkipFontNode(node) {
286
+ return node.type === "Function";
287
+ }
288
+ function forEachFontValue(valueText, callback) {
289
+ forEachValue(valueText, extractFontValue, shouldSkipFontNode, callback);
290
+ }
291
+ // Annotate the CommonJS export names for ESM import in node:
292
+ 0 && (module.exports = {
293
+ forEachColorValue,
294
+ forEachDensityValue,
295
+ forEachFontValue,
296
+ forEachValue,
297
+ handleShorthandAutoFix,
298
+ isKnownFontWeight
299
+ });
300
+ //# sourceMappingURL=hardcoded-shared-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/hardcoded-shared-utils.ts", "../../src/utils/color-lib-utils.ts", "../../src/utils/css-functions.ts"],
4
+ "sourcesContent": ["import { parse, walk } from '@eslint/css-tree';\nimport type { HandlerContext } from '../types';\nimport type { ParsedUnitValue } from './value-utils';\nimport { extractColorValue } from './color-lib-utils';\nimport { isCssFunction } from './css-functions';\n\n/**\n * Common replacement data structure used by both color and density handlers\n */\nexport interface ReplacementInfo {\n start: number;\n end: number;\n replacement: string; // Full CSS var: var(--hook, fallback)\n displayValue: string; // Just the hook: --hook\n hasHook: boolean;\n}\n\n/**\n * Position information from CSS tree parsing\n */\nexport interface PositionInfo {\n start?: { offset: number; line: number; column: number };\n end?: { offset: number; line: number; column: number };\n}\n\n/**\n * Generic callback for processing values with position information\n */\nexport type ValueCallback<T> = (value: T, positionInfo?: PositionInfo) => void;\n\n/**\n * Known valid font-weight values\n */\nconst FONT_WEIGHTS = [\n 'normal',\n 'bold', \n 'bolder',\n 'lighter',\n '100',\n '200', \n '300',\n '400',\n '500',\n '600',\n '700',\n '800',\n '900'\n];\n\n/**\n * Check if a value is a known font-weight\n */\nexport function isKnownFontWeight(value: string | number): boolean {\n const stringValue = value.toString();\n return FONT_WEIGHTS.includes(stringValue.toLowerCase());\n}\n\n/**\n * Generic shorthand auto-fix handler\n * Handles the common logic for reconstructing shorthand values with replacements\n */\nexport function handleShorthandAutoFix(\n declarationNode: any,\n context: HandlerContext,\n valueText: string,\n replacements: ReplacementInfo[]\n) {\n // Sort replacements by position for proper reconstruction\n const sortedReplacements = replacements.sort((a, b) => a.start - b.start);\n \n // Check if we can apply auto-fix (at least one value has a hook)\n const hasAnyHooks = sortedReplacements.some(r => r.hasHook);\n const canAutoFix = hasAnyHooks;\n\n // Report each individual value\n sortedReplacements.forEach(({ start, end, replacement, displayValue, hasHook }) => {\n const originalValue = valueText.substring(start, end);\n const valueStartColumn = declarationNode.value.loc.start.column;\n const valueColumn = valueStartColumn + start;\n \n // Create precise error location for this value\n const { loc: { start: locStart, end: locEnd } } = declarationNode.value;\n const reportNode = {\n ...declarationNode.value,\n loc: {\n ...declarationNode.value.loc,\n start: {\n ...locStart,\n column: valueColumn\n },\n end: {\n ...locEnd,\n column: valueColumn + originalValue.length\n }\n }\n };\n\n if (hasHook) {\n // Create auto-fix for the entire shorthand value\n const fix = canAutoFix ? (fixer: any) => {\n // Reconstruct the entire value with all replacements\n let newValue = valueText;\n \n // Apply replacements from right to left to maintain string positions\n for (let i = sortedReplacements.length - 1; i >= 0; i--) {\n const { start: rStart, end: rEnd, replacement: rReplacement } = sortedReplacements[i];\n newValue = newValue.substring(0, rStart) + rReplacement + newValue.substring(rEnd);\n }\n \n return fixer.replaceText(declarationNode.value, newValue);\n } : undefined;\n\n context.context.report({\n node: reportNode,\n messageId: 'hardcodedValue',\n data: {\n oldValue: originalValue,\n newValue: displayValue\n },\n fix\n });\n } else {\n // No hook available\n context.context.report({\n node: reportNode,\n messageId: 'noReplacement',\n data: {\n oldValue: originalValue\n }\n });\n }\n });\n}\n\n/**\n * Generic CSS tree traversal with position tracking\n * Always provides position information since both handlers need it\n */\nexport function forEachValue<T>(\n valueText: string,\n extractValue: (node: any) => T | null,\n shouldSkipNode: (node: any) => boolean,\n callback: (value: T, positionInfo: PositionInfo) => void\n): void {\n if (!valueText || typeof valueText !== 'string') {\n return;\n }\n\n try {\n const ast = parse(valueText, { context: 'value' as const, positions: true });\n \n walk(ast, {\n enter(node: any) {\n // Skip nodes efficiently using this.skip\n if (shouldSkipNode(node)) {\n return this.skip;\n }\n \n const value = extractValue(node);\n if (value !== null) {\n const positionInfo: PositionInfo = {\n start: node.loc?.start,\n end: node.loc?.end\n };\n callback(value, positionInfo);\n }\n }\n });\n } catch (error) {\n // Silently handle parse errors\n return;\n }\n}\n\n/**\n * Check if color node should be skipped during traversal\n */\nfunction shouldSkipColorNode(node: any): boolean {\n return node.type === 'Function' && isCssFunction(node.name);\n}\n\n/**\n * Check if dimension node should be skipped during traversal\n * Skip all function nodes by default\n */\nfunction shouldSkipDimensionNode(node: any): boolean {\n return node.type === 'Function';\n}\n\n/**\n * Extract dimension value from CSS AST node\n * Returns structured data with number and unit to eliminate regex parsing\n */\nfunction extractDimensionValue(valueNode: any, cssProperty?: string): ParsedUnitValue | null {\n if (!valueNode) return null;\n \n switch (valueNode.type) {\n case 'Dimension':\n // Dimensions: 16px, 1rem -> extract value and unit directly from AST\n const numValue = Number(valueNode.value);\n if (numValue === 0) return null; // Skip zero values\n \n const unit = valueNode.unit.toLowerCase();\n if (unit !== 'px' && unit !== 'rem' && unit !== '%') return null; // Support px, rem, and % units\n \n return {\n number: numValue,\n unit: unit as 'px' | 'rem' | '%'\n };\n \n case 'Number':\n // Numbers: 400, 1.5 -> treat as unitless (font-weight, line-height, etc.)\n const numberValue = Number(valueNode.value);\n if (numberValue === 0) return null; // Skip zero values\n \n return {\n number: numberValue,\n unit: null\n };\n \n case 'Percentage':\n // Percentage values: 100%, 50% -> extract value and add % unit\n const percentValue = Number(valueNode.value);\n if (percentValue === 0) return null; // Skip zero values\n \n return {\n number: percentValue,\n unit: '%'\n };\n \n case 'Value':\n // Value wrapper - extract from first child\n return valueNode.children?.[0] ? extractDimensionValue(valueNode.children[0], cssProperty) : null;\n }\n \n return null;\n}\n\n/**\n * Specialized color value traversal\n * Handles color-specific extraction and skipping logic\n */\nexport function forEachColorValue(\n valueText: string,\n callback: (colorValue: string, positionInfo: PositionInfo) => void\n): void {\n forEachValue(valueText, extractColorValue, shouldSkipColorNode, callback);\n}\n\n/**\n * Specialized density value traversal\n * Handles dimension-specific extraction and skipping logic\n */\nexport function forEachDensityValue(\n valueText: string,\n cssProperty: string,\n callback: (parsedDimension: ParsedUnitValue, positionInfo: PositionInfo) => void\n): void {\n forEachValue(\n valueText, \n (node) => extractDimensionValue(node, cssProperty), \n shouldSkipDimensionNode, \n callback\n );\n}\n\n/**\n * Extract font-related values from CSS AST node\n * Handles font-size and font-weight values\n */\nfunction extractFontValue(node: any): ParsedUnitValue | null {\n if (!node) return null;\n \n switch (node.type) {\n case 'Dimension':\n // Font-size: 16px, 1rem, etc.\n const numValue = Number(node.value);\n if (numValue <= 0) return null; // Skip zero/negative values\n \n const unit = node.unit.toLowerCase();\n if (unit !== 'px' && unit !== 'rem' && unit !== '%') return null;\n \n return {\n number: numValue,\n unit: unit as 'px' | 'rem' | '%'\n };\n \n case 'Number':\n // Font-weight: 400, 700, etc.\n const numberValue = Number(node.value);\n if (numberValue <= 0) {\n return null; // Skip zero/negative values\n }\n \n // Only accept known font-weight values for unitless numbers\n if (!isKnownFontWeight(numberValue)) {\n return null; // Skip values that aren't valid font-weights\n }\n \n return {\n number: numberValue,\n unit: null\n };\n \n case 'Identifier':\n // Font-weight keywords: normal, bold, etc.\n const namedValue = node.name.toLowerCase();\n \n // Only accept known font-weight keywords\n if (!isKnownFontWeight(namedValue)) {\n return null;\n }\n \n // Convert known keywords to numeric values\n if (namedValue === 'normal') {\n return { number: 400, unit: null };\n }\n \n // For other keywords (bolder, lighter), we can't determine exact numeric value\n // but we know they're valid font-weight values\n return { number: namedValue, unit: null };\n \n case 'Percentage':\n // Percentage values for font-size\n const percentValue = Number(node.value);\n if (percentValue === 0) return null; // Skip zero values\n \n return {\n number: percentValue,\n unit: '%'\n };\n \n case 'Value':\n // Value wrapper - extract from first child\n return node.children?.[0] ? extractFontValue(node.children[0]) : null;\n }\n \n return null;\n}\n\n/**\n * Check if font node should be skipped during traversal\n * Skip all function nodes by default\n */\nfunction shouldSkipFontNode(node: any): boolean {\n return node.type === 'Function';\n}\n\n/**\n * Specialized font value traversal\n * Handles font-specific extraction and skipping logic\n */\nexport function forEachFontValue(\n valueText: string,\n callback: (fontValue: ParsedUnitValue, positionInfo: PositionInfo) => void\n): void {\n forEachValue(valueText, extractFontValue, shouldSkipFontNode, callback);\n}\n", "//stylelint-sds/packages/stylelint-plugin-slds/src/utils/color-lib-utils.ts\nimport { ValueToStylingHooksMapping, ValueToStylingHookEntry } from '@salesforce-ux/sds-metadata/next';\nimport chroma from 'chroma-js';\nimport { generate } from '@eslint/css-tree';\nimport { isCssColorFunction } from './css-functions';\n\nconst LAB_THRESHOLD = 25; // Adjust this to set how strict the matching should be\n\nconst isHardCodedColor = (color: string): boolean => {\n const colorRegex =\n /\\b(rgb|rgba)\\((\\s*\\d{1,3}\\s*,\\s*){2,3}\\s*(0|1|0?\\.\\d+)\\s*\\)|#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\\b|[a-zA-Z]+/g;\n return colorRegex.test(color);\n};\n\nconst isHexCode = (color: string): boolean => {\n const hexPattern = /^#(?:[0-9a-fA-F]{3}){1,2}$/; // Pattern for #RGB or #RRGGBB\n return hexPattern.test(color);\n};\n\n// Convert a named color or hex code into a hex format using chroma-js\nconst convertToHex = (color: string): string | null => {\n try {\n // Try converting the color using chroma-js, which handles both named and hex colors\n return chroma(color).hex();\n } catch (e) {\n // If chroma can't process the color, it's likely invalid\n return null;\n }\n};\n\n// Find the closest color hook using LAB distance\nconst findClosestColorHook = (\n color: string,\n supportedColors:ValueToStylingHooksMapping,\n cssProperty: string\n): string[] => {\n const returnStylingHooks: string[] = [];\n const closestHooksWithSameProperty: { name: string; distance: number }[] = [];\n const closestHooksWithoutSameProperty: { name: string; distance: number }[] =\n [];\n const closestHooksWithAllProperty: { name: string; distance: number }[] =\n [];\n const labColor = chroma(color).lab();\n\n Object.entries(supportedColors).forEach(([sldsValue, data]) => {\n if (sldsValue && isHexCode(sldsValue)) {\n const hooks = data as ValueToStylingHookEntry[]; // Get the hooks for the sldsValue\n\n hooks.forEach((hook) => {\n const labSupportedColor = chroma(sldsValue).lab();\n const distance = (JSON.stringify(labColor) === JSON.stringify(labSupportedColor)) ? 0\n : chroma.distance(chroma.lab(...labColor), chroma.lab(...labSupportedColor), \"lab\");\n // Check if the hook has the same property\n if (hook.properties.includes(cssProperty)) {\n // Add to same property hooks if within threshold\n if (distance <= LAB_THRESHOLD) {\n closestHooksWithSameProperty.push({ name: hook.name, distance });\n }\n } \n // Check for the universal selector\n else if ( hook.properties.includes(\"*\") ){\n // Add to same property hooks if within threshold\n if (distance <= LAB_THRESHOLD) {\n closestHooksWithAllProperty.push({ name: hook.name, distance });\n }\n }\n else {\n // Add to different property hooks if within threshold\n if (distance <= LAB_THRESHOLD) {\n closestHooksWithoutSameProperty.push({ name: hook.name, distance });\n }\n }\n });\n }\n });\n\n// Group hooks by their priority\nconst closesthookGroups = [\n { hooks: closestHooksWithSameProperty, distance: 0 },\n { hooks: closestHooksWithAllProperty, distance: 0 },\n { hooks: closestHooksWithSameProperty, distance: Infinity }, // For hooks with distance > 0\n { hooks: closestHooksWithAllProperty, distance: Infinity },\n { hooks: closestHooksWithoutSameProperty, distance: Infinity },\n];\n\nfor (const group of closesthookGroups) {\n // Filter hooks based on the distance condition\n const filteredHooks = group.hooks.filter(h => \n group.distance === 0 ? h.distance === 0 : h.distance > 0\n );\n\n if (returnStylingHooks.length < 1 && filteredHooks.length > 0) {\n filteredHooks.sort((a, b) => a.distance - b.distance);\n returnStylingHooks.push(...filteredHooks.slice(0, 5).map((h) => h.name));\n }\n}\n\n\n return Array.from(new Set(returnStylingHooks));\n};\n\n/**\n * This method is usefull to identify all possible css color values.\n * - names colors\n * - 6,8 digit hex\n * - rgb and rgba\n * - hsl and hsla\n */\nconst isValidColor = (val:string):boolean => chroma.valid(val);\n\n/**\n * Extract color value from CSS AST node\n */\nconst extractColorValue = (node: any): string | null => {\n let colorValue: string | null = null;\n \n switch (node.type) {\n case 'Hash':\n colorValue = `#${node.value}`;\n break;\n case 'Identifier':\n colorValue = node.name;\n break;\n case 'Function':\n // Only extract color functions\n if (isCssColorFunction(node.name)) {\n colorValue = generate(node);\n }\n break;\n }\n \n return colorValue && isValidColor(colorValue) ? colorValue : null;\n};\n\nexport { findClosestColorHook, convertToHex, isHexCode, isHardCodedColor, isValidColor, extractColorValue };\n", "//stylelint-sds/packages/stylelint-plugin-slds/src/utils/css-functions.ts\n/**\n * Complete list of CSS functions that should be preserved/recognized\n */\nconst CSS_FUNCTIONS = [\n 'attr',\n 'calc',\n 'color-mix',\n 'conic-gradient',\n 'counter',\n 'cubic-bezier',\n 'linear-gradient',\n 'max',\n 'min',\n 'radial-gradient',\n 'repeating-conic-gradient',\n 'repeating-linear-gradient',\n 'repeating-radial-gradient',\n 'var'\n ];\n \n \n const CSS_MATH_FUNCTIONS = ['calc', 'min', 'max'];\n \n \n const RGB_COLOR_FUNCTIONS = ['rgb', 'rgba', 'hsl', 'hsla'];\n \n /**\n * Regex for matching any CSS function (for general detection)\n * Matches function names within other text\n */\n const cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join('|')})`);\n \n \n const cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join('|')})$`);\n \n \n const cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join('|')})$`);\n \n export function containsCssFunction(value: string): boolean {\n return cssFunctionsRegex.test(value);\n }\n \n /**\n * Check if a value is exactly a CSS function name\n */\n export function isCssFunction(value: string): boolean {\n return cssFunctionsExactRegex.test(value);\n }\n \n export function isCssMathFunction(value: string): boolean {\n return cssMathFunctionsRegex.test(value);\n }\n \n export function isCssColorFunction(value: string): boolean {\n return RGB_COLOR_FUNCTIONS.includes(value);\n }"],
5
+ "mappings": "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",
6
+ "names": ["import_css_tree", "chroma"]
7
+ }