@salesforce-ux/eslint-plugin-slds 1.1.0-internal → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +11 -30
- package/build/index.js.map +3 -3
- package/build/rules/enforce-bem-usage.js +3 -3
- package/build/rules/enforce-bem-usage.js.map +2 -2
- package/build/rules/no-deprecated-classes-slds2.js +2 -2
- package/build/rules/no-deprecated-classes-slds2.js.map +2 -2
- package/build/rules/v9/enforce-bem-usage.js +2 -2
- package/build/rules/v9/enforce-bem-usage.js.map +2 -2
- package/build/rules/v9/enforce-component-hook-naming-convention.js +2 -2
- package/build/rules/v9/enforce-component-hook-naming-convention.js.map +2 -2
- package/build/rules/v9/enforce-sds-to-slds-hooks.js +2 -2
- package/build/rules/v9/enforce-sds-to-slds-hooks.js.map +2 -2
- package/build/rules/v9/lwc-token-to-slds-hook.js +2 -2
- package/build/rules/v9/lwc-token-to-slds-hook.js.map +2 -2
- package/build/rules/v9/no-deprecated-slds-classes.js +2 -2
- package/build/rules/v9/no-deprecated-slds-classes.js.map +2 -2
- package/build/rules/v9/no-deprecated-tokens-slds1.js +4 -4
- package/build/rules/v9/no-deprecated-tokens-slds1.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.js.map +1 -1
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js +2 -2
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js +2 -2
- package/build/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.js.map +2 -2
- package/build/rules/v9/no-slds-class-overrides.js +2 -2
- package/build/rules/v9/no-slds-class-overrides.js.map +2 -2
- package/build/rules/v9/no-slds-namespace-for-custom-hooks.js +2 -2
- package/build/rules/v9/no-slds-namespace-for-custom-hooks.js.map +2 -2
- package/build/rules/v9/no-slds-var-without-fallback.js +2 -2
- package/build/rules/v9/no-slds-var-without-fallback.js.map +2 -2
- package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js +2 -2
- package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js.map +2 -2
- package/build/rules/v9/no-unsupported-hooks-slds2.js +2 -2
- package/build/rules/v9/no-unsupported-hooks-slds2.js.map +2 -2
- package/build/types/index.js.map +1 -1
- package/build/utils/color-lib-utils.js.map +1 -1
- package/build/utils/styling-hook-utils.js.map +1 -1
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -24,15 +24,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
mod
|
|
25
25
|
));
|
|
26
26
|
|
|
27
|
-
// json-inline:eslint.rules.
|
|
28
|
-
var
|
|
29
|
-
"json-inline:eslint.rules.
|
|
27
|
+
// json-inline:eslint.rules.json
|
|
28
|
+
var require_eslint_rules = __commonJS({
|
|
29
|
+
"json-inline:eslint.rules.json"(exports2, module2) {
|
|
30
30
|
module2.exports = {
|
|
31
31
|
"css": {
|
|
32
|
-
"@salesforce-ux/slds/enforce-bem-usage": "warn",
|
|
33
|
-
"@salesforce-ux/slds/no-deprecated-classes-slds2": "warn",
|
|
34
32
|
"@salesforce-ux/slds/no-slds-class-overrides": "warn",
|
|
35
|
-
"@salesforce-ux/slds/no-deprecated-
|
|
33
|
+
"@salesforce-ux/slds/no-deprecated-classes-slds2": "warn",
|
|
36
34
|
"@salesforce-ux/slds/lwc-token-to-slds-hook": "error",
|
|
37
35
|
"@salesforce-ux/slds/enforce-sds-to-slds-hooks": "warn",
|
|
38
36
|
"@salesforce-ux/slds/no-sldshook-fallback-for-lwctoken": "warn",
|
|
@@ -41,24 +39,7 @@ var require_eslint_rules_internal = __commonJS({
|
|
|
41
39
|
"@salesforce-ux/slds/no-slds-namespace-for-custom-hooks": "warn",
|
|
42
40
|
"@salesforce-ux/slds/enforce-component-hook-naming-convention": "error",
|
|
43
41
|
"@salesforce-ux/slds/no-slds-private-var": "warn",
|
|
44
|
-
"@salesforce-ux/slds/no-hardcoded-values-slds2":
|
|
45
|
-
"reportNumericValue": "hasReplacement",
|
|
46
|
-
"preferPaletteHook": true,
|
|
47
|
-
"customMapping": {
|
|
48
|
-
"--slds-g-font-line-height-4": {
|
|
49
|
-
"properties": ["line-height"],
|
|
50
|
-
"values": ["1.5"]
|
|
51
|
-
},
|
|
52
|
-
"--slds-g-sizing-5": {
|
|
53
|
-
"properties": ["width", "height", "max-width", "max-height", "border*"],
|
|
54
|
-
"values": ["1rem", "16px"]
|
|
55
|
-
},
|
|
56
|
-
"--slds-g-sizing-content-1": {
|
|
57
|
-
"properties": ["width", "height", "max-width", "max-height", "border*"],
|
|
58
|
-
"values": ["20ch"]
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}],
|
|
42
|
+
"@salesforce-ux/slds/no-hardcoded-values-slds2": "warn",
|
|
62
43
|
"@salesforce-ux/slds/reduce-annotations": "warn"
|
|
63
44
|
},
|
|
64
45
|
"html": {
|
|
@@ -89,7 +70,7 @@ var import_no_hardcoded_values_slds1 = __toESM(require("./rules/v9/no-hardcoded-
|
|
|
89
70
|
var import_no_hardcoded_values_slds2 = __toESM(require("./rules/v9/no-hardcoded-values/no-hardcoded-values-slds2"));
|
|
90
71
|
var import_parser = __toESM(require("@html-eslint/parser"));
|
|
91
72
|
var import_css = __toESM(require("@eslint/css"));
|
|
92
|
-
var
|
|
73
|
+
var import_eslint_rules = __toESM(require_eslint_rules());
|
|
93
74
|
var rules = {
|
|
94
75
|
"enforce-bem-usage": import_enforce_bem_usage.default,
|
|
95
76
|
"no-deprecated-classes-slds2": import_no_deprecated_classes_slds2.default,
|
|
@@ -111,7 +92,7 @@ var rules = {
|
|
|
111
92
|
var plugin = {
|
|
112
93
|
meta: {
|
|
113
94
|
name: "@salesforce-ux/eslint-plugin-slds",
|
|
114
|
-
version: "1.1.
|
|
95
|
+
version: "1.1.1"
|
|
115
96
|
},
|
|
116
97
|
rules,
|
|
117
98
|
configs: {}
|
|
@@ -127,10 +108,10 @@ var baseCssConfigWithPlugin = {
|
|
|
127
108
|
css: import_css.default,
|
|
128
109
|
"@salesforce-ux/slds": plugin
|
|
129
110
|
},
|
|
130
|
-
rules:
|
|
111
|
+
rules: import_eslint_rules.default.css,
|
|
131
112
|
settings: {
|
|
132
113
|
// Pass rules configuration to context for runtime access
|
|
133
|
-
sldsRules: { ...
|
|
114
|
+
sldsRules: { ...import_eslint_rules.default.css }
|
|
134
115
|
}
|
|
135
116
|
};
|
|
136
117
|
var cssConfigArray = [baseCssConfigWithPlugin];
|
|
@@ -146,7 +127,7 @@ var htmlConfigArray = [
|
|
|
146
127
|
plugins: {
|
|
147
128
|
"@salesforce-ux/slds": plugin
|
|
148
129
|
},
|
|
149
|
-
rules:
|
|
130
|
+
rules: import_eslint_rules.default.html
|
|
150
131
|
}
|
|
151
132
|
];
|
|
152
133
|
Object.assign(plugin.configs, {
|
|
@@ -157,7 +138,7 @@ Object.assign(plugin.configs, {
|
|
|
157
138
|
// legacy config for ESLint v8-
|
|
158
139
|
recommended: {
|
|
159
140
|
plugins: ["@salesforce-ux/slds"],
|
|
160
|
-
rules:
|
|
141
|
+
rules: import_eslint_rules.default.html,
|
|
161
142
|
parser: import_parser.default,
|
|
162
143
|
parserOptions: {
|
|
163
144
|
ecmaVersion: 2021,
|
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["json-inline:eslint.rules.
|
|
4
|
-
"sourcesContent": ["module.exports = {\n \"css\": {\n \"@salesforce-ux/slds/
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,
|
|
3
|
+
"sources": ["json-inline:eslint.rules.json", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = {\n \"css\": {\n \"@salesforce-ux/slds/no-slds-class-overrides\": \"warn\",\n \"@salesforce-ux/slds/no-deprecated-classes-slds2\": \"warn\",\n \"@salesforce-ux/slds/lwc-token-to-slds-hook\": \"error\",\n \"@salesforce-ux/slds/enforce-sds-to-slds-hooks\": \"warn\",\n \"@salesforce-ux/slds/no-sldshook-fallback-for-lwctoken\": \"warn\",\n \"@salesforce-ux/slds/no-unsupported-hooks-slds2\": \"warn\",\n \"@salesforce-ux/slds/no-slds-var-without-fallback\": \"warn\",\n \"@salesforce-ux/slds/no-slds-namespace-for-custom-hooks\": \"warn\",\n \"@salesforce-ux/slds/enforce-component-hook-naming-convention\": \"error\",\n \"@salesforce-ux/slds/no-slds-private-var\": \"warn\",\n \"@salesforce-ux/slds/no-hardcoded-values-slds2\": \"warn\",\n \"@salesforce-ux/slds/reduce-annotations\": \"warn\"\n },\n \"html\": { \n \"@salesforce-ux/slds/enforce-bem-usage\": \"error\",\n \"@salesforce-ux/slds/no-deprecated-classes-slds2\": \"error\",\n \"@salesforce-ux/slds/modal-close-button-issue\": \"error\"\n }\n};", "// Unified ESLint plugin config for both v8 (legacy) and v9+ (flat)\n\nimport enforceBemUsage from './rules/enforce-bem-usage';\nimport noDeprecatedClassesSlds2 from './rules/no-deprecated-classes-slds2';\nimport modalCloseButtonIssue from './rules/modal-close-button-issue';\nimport noSldsClassOverrides from './rules/v9/no-slds-class-overrides';\nimport noDeprecatedTokensSlds1 from './rules/v9/no-deprecated-tokens-slds1';\nimport lwcTokenToSldsHook from './rules/v9/lwc-token-to-slds-hook';\nimport enforceSdsToSldsHooks from './rules/v9/enforce-sds-to-slds-hooks';\nimport noSldshookFallbackForLwctoken from './rules/v9/no-sldshook-fallback-for-lwctoken';\nimport noUnsupportedHooksSlds2 from './rules/v9/no-unsupported-hooks-slds2';\nimport noSldsVarWithoutFallback from './rules/v9/no-slds-var-without-fallback';\nimport noSldsNamespaceForCustomHooks from './rules/v9/no-slds-namespace-for-custom-hooks';\nimport enforceComponentHookNamingConvention from './rules/v9/enforce-component-hook-naming-convention';\nimport reduceAnnotations from './rules/v9/reduce-annotations';\nimport noSldsPrivateVar from './rules/v9/no-slds-private-var';\nimport noHardcodedValuesSlds1 from './rules/v9/no-hardcoded-values/no-hardcoded-values-slds1';\nimport noHardcodedValuesSlds2 from './rules/v9/no-hardcoded-values/no-hardcoded-values-slds2';\n\n\nimport htmlParser from \"@html-eslint/parser\";\nimport cssPlugin from \"@eslint/css\";\n\n// Import rule configurations based on persona\nimport ruleConfigs from '../eslint.rules.json';\n\nconst rules = {\n \"enforce-bem-usage\": enforceBemUsage,\n \"no-deprecated-classes-slds2\": noDeprecatedClassesSlds2,\n \"modal-close-button-issue\": modalCloseButtonIssue,\n \"no-slds-class-overrides\": noSldsClassOverrides,\n \"no-deprecated-tokens-slds1\": noDeprecatedTokensSlds1,\n \"lwc-token-to-slds-hook\": lwcTokenToSldsHook,\n \"enforce-sds-to-slds-hooks\": enforceSdsToSldsHooks,\n \"no-sldshook-fallback-for-lwctoken\": noSldshookFallbackForLwctoken,\n \"no-unsupported-hooks-slds2\": noUnsupportedHooksSlds2,\n \"no-slds-var-without-fallback\": noSldsVarWithoutFallback,\n \"no-slds-namespace-for-custom-hooks\": noSldsNamespaceForCustomHooks,\n \"enforce-component-hook-naming-convention\": enforceComponentHookNamingConvention,\n \"no-slds-private-var\": noSldsPrivateVar,\n \"no-hardcoded-values-slds1\": noHardcodedValuesSlds1,\n \"no-hardcoded-values-slds2\": noHardcodedValuesSlds2,\n \"reduce-annotations\": reduceAnnotations\n};\n\nconst plugin = {\n meta: {\n name: \"@salesforce-ux/eslint-plugin-slds\",\n version: process.env.PLUGIN_VERSION\n },\n rules,\n configs: {}\n};\n\n// Base CSS config with CSS plugin included (required for SLDS plugin to work independently)\nconst baseCssConfigWithPlugin = {\n files: [\"**/*.{css,scss}\"],\n language: \"css/css\",\n languageOptions: {\n tolerant: true // Allow recoverable parsing errors for SCSS syntax\n },\n plugins: {\n css: cssPlugin,\n \"@salesforce-ux/slds\": plugin,\n },\n rules: ruleConfigs.css,\n settings: {\n // Pass rules configuration to context for runtime access\n sldsRules: { ...ruleConfigs.css }\n }\n};\n\n// CSS config array built from base config (self-sufficient with CSS plugin)\nconst cssConfigArray = [baseCssConfigWithPlugin];\n\nconst htmlConfigArray = [\n // HTML/Component config\n {\n files: [\"**/*.html\", \"**/*.cmp\"],\n languageOptions: {\n parser: htmlParser,\n ecmaVersion: 2021,\n sourceType: \"module\"\n },\n plugins: {\n \"@salesforce-ux/slds\": plugin\n },\n rules: ruleConfigs.html\n }\n];\n\nObject.assign(plugin.configs, {\n // Flat config for ESLint v9+\n \"flat/recommended-css\": cssConfigArray,\n \"flat/recommended-html\": htmlConfigArray,\n \"flat/recommended\": [...cssConfigArray, ...htmlConfigArray],\n // legacy config for ESLint v8-\n recommended: {\n plugins: [\"@salesforce-ux/slds\"],\n rules: ruleConfigs.html,\n parser: htmlParser,\n parserOptions: {\n ecmaVersion: 2021,\n sourceType: \"module\"\n }\n }\n});\n\nfunction sldsCssPlugin() {\n return {\n ...baseCssConfigWithPlugin.plugins,\n }\n}\n\nmodule.exports = plugin;\nmodule.exports.sldsCssPlugin = sldsCssPlugin;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["exports", "module", "enforceBemUsage", "noDeprecatedClassesSlds2", "modalCloseButtonIssue", "noSldsClassOverrides", "noDeprecatedTokensSlds1", "lwcTokenToSldsHook", "enforceSdsToSldsHooks", "noSldshookFallbackForLwctoken", "noUnsupportedHooksSlds2", "noSldsVarWithoutFallback", "noSldsNamespaceForCustomHooks", "enforceComponentHookNamingConvention", "noSldsPrivateVar", "noHardcodedValuesSlds1", "noHardcodedValuesSlds2", "reduceAnnotations", "cssPlugin", "ruleConfigs", "htmlParser"]
|
|
7
7
|
}
|
|
@@ -23,11 +23,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
23
23
|
|
|
24
24
|
// src/rules/enforce-bem-usage.ts
|
|
25
25
|
var import_node = require("../utils/node");
|
|
26
|
-
var
|
|
26
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
27
27
|
var import_rule_messages = __toESM(require("../config/rule-messages"));
|
|
28
28
|
var import_enforce_bem_usage = __toESM(require("./v9/enforce-bem-usage"));
|
|
29
|
-
var bemMapping =
|
|
30
|
-
var deprecatedClasses =
|
|
29
|
+
var bemMapping = import_sds_metadata.default.bemNaming;
|
|
30
|
+
var deprecatedClasses = import_sds_metadata.default.deprecatedClasses;
|
|
31
31
|
var ruleConfig = import_rule_messages.default["enforce-bem-usage"];
|
|
32
32
|
var { type, description, url, messages } = ruleConfig;
|
|
33
33
|
var isDeprecatedClass = (className) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/rules/enforce-bem-usage.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport { findAttr, isAttributesEmpty } from \"../utils/node\";\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AACA,kBAA4C;AAC5C,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport { findAttr, isAttributesEmpty } from \"../utils/node\";\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../config/rule-messages';\nimport enforceBemUsageCss from './v9/enforce-bem-usage';\n\nconst bemMapping = metadata.bemNaming;\nconst deprecatedClasses = metadata.deprecatedClasses;\nconst ruleConfig = ruleMessages['enforce-bem-usage'];\nconst { type, description, url, messages } = ruleConfig;\n/**\n * Checks if a given className or its BEM mapped equivalent is deprecated.\n * \n * This function checks whether the provided className is included in the\n * `deprecatedClasses` list or if the BEM mapped class is deprecated.\n * \n * @param className - The class name to check for deprecation.\n * @returns A boolean indicating whether the className or its mapped version is deprecated.\n */\nconst isDeprecatedClass = (className : string) => {\n return (deprecatedClasses.includes(className) || deprecatedClasses.includes(bemMapping[className]))\n}\n\nconst enforceBemUsageHtml = {\n create(context) { \n\n function check(node) {\n if (isAttributesEmpty(node)) {\n return;\n }\n const classAttr = findAttr(node, \"class\");\n if (classAttr && classAttr.value) {\n const classNames = classAttr.value.value.split(/\\s+/);\n classNames.forEach((className) => {\n if (className && className in bemMapping && !isDeprecatedClass(className)) {\n // Find the exact location of the problematic class name\n const classNameStart = classAttr.value.value.indexOf(className) + 7; // 7 here is for `class= \"`\n const classNameEnd = classNameStart + className.length;\n\n // Use the loc property to get line and column from the class attribute\n const startLoc = {\n line: classAttr.loc.start.line,\n column: classAttr.loc.start.column + classNameStart,\n };\n const endLoc = {\n line: classAttr.loc.start.line,\n column: classAttr.loc.start.column + classNameEnd,\n };\n\n // Check whether a fixed class is available\n const newValue = bemMapping[className];\n context.report({\n node,\n loc: { start: startLoc, end: endLoc },\n messageId: 'bemDoubleDash',\n data: {\n actual: className,\n newValue\n },\n fix(fixer) {\n if (newValue) {\n const newClassValue = classAttr.value.value.replace(\n className,\n newValue\n );\n return fixer.replaceTextRange(\n [classAttr.value.range[0], classAttr.value.range[1]],\n `${newClassValue}`\n );\n }\n return null; // Ensure a return value even if no fix is applied\n },\n });\n }\n });\n }\n }\n\n return {\n Tag: check,\n };\n },\n};\n\n\n\n// Create a hybrid rule that works for both HTML and CSS\nconst enforceBemUsage = {\n meta: {\n type,\n docs: {\n recommended: true,\n description,\n url\n },\n fixable: \"code\",\n messages\n },\n\n create(context) {\n const filename = context.filename || context.getFilename();\n \n // Check if we're in a CSS context\n if (filename.endsWith('.css') || filename.endsWith('.scss')) {\n // Try to detect if we have CSS support\n // In ESLint v9 with @eslint/css, we should have CSS AST support\n try {\n // Use CSS implementation (ESLint v9 with @eslint/css)\n return enforceBemUsageCss.create(context);\n } catch (error) {\n // If CSS implementation fails, likely ESLint v8 without CSS support\n // Return empty visitor to avoid errors\n return {};\n }\n } else {\n // Use HTML implementation (compatible with both ESLint v8 and v9)\n return enforceBemUsageHtml.create(context);\n }\n },\n};\n\nexport = enforceBemUsage;"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AACA,kBAA4C;AAC5C,0BAAqB;AACrB,2BAAyB;AACzB,+BAA+B;AAE/B,IAAM,aAAa,oBAAAA,QAAS;AAC5B,IAAM,oBAAoB,oBAAAA,QAAS;AACnC,IAAM,aAAa,qBAAAC,QAAa,mBAAmB;AACnD,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAU7C,IAAM,oBAAoB,CAAC,cAAuB;AAChD,SAAQ,kBAAkB,SAAS,SAAS,KAAK,kBAAkB,SAAS,WAAW,SAAS,CAAC;AACnG;AAEA,IAAM,sBAAsB;AAAA,EAC1B,OAAO,SAAS;AAEd,aAAS,MAAM,MAAM;AACnB,cAAI,+BAAkB,IAAI,GAAG;AAC3B;AAAA,MACF;AACA,YAAM,gBAAY,sBAAS,MAAM,OAAO;AACxC,UAAI,aAAa,UAAU,OAAO;AAChC,cAAM,aAAa,UAAU,MAAM,MAAM,MAAM,KAAK;AACpD,mBAAW,QAAQ,CAAC,cAAc;AAChC,cAAI,aAAa,aAAa,cAAc,CAAC,kBAAkB,SAAS,GAAG;AAEzE,kBAAM,iBAAiB,UAAU,MAAM,MAAM,QAAQ,SAAS,IAAI;AAClE,kBAAM,eAAe,iBAAiB,UAAU;AAGhD,kBAAM,WAAW;AAAA,cACf,MAAM,UAAU,IAAI,MAAM;AAAA,cAC1B,QAAQ,UAAU,IAAI,MAAM,SAAS;AAAA,YACvC;AACA,kBAAM,SAAS;AAAA,cACb,MAAM,UAAU,IAAI,MAAM;AAAA,cAC1B,QAAQ,UAAU,IAAI,MAAM,SAAS;AAAA,YACvC;AAGA,kBAAM,WAAW,WAAW,SAAS;AACrC,oBAAQ,OAAO;AAAA,cACb;AAAA,cACA,KAAK,EAAE,OAAO,UAAU,KAAK,OAAO;AAAA,cACpC,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ,QAAQ;AAAA,gBACR;AAAA,cACF;AAAA,cACA,IAAI,OAAO;AACT,oBAAI,UAAU;AACZ,wBAAM,gBAAgB,UAAU,MAAM,MAAM;AAAA,oBAC1C;AAAA,oBACA;AAAA,kBACF;AACA,yBAAO,MAAM;AAAA,oBACX,CAAC,UAAU,MAAM,MAAM,CAAC,GAAG,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,oBACnD,GAAG,aAAa;AAAA,kBAClB;AAAA,gBACF;AACA,uBAAO;AAAA,cACT;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAKA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ,aAAa;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,UAAM,WAAW,QAAQ,YAAY,QAAQ,YAAY;AAGzD,QAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,GAAG;AAG3D,UAAI;AAEF,eAAO,yBAAAC,QAAmB,OAAO,OAAO;AAAA,MAC1C,SAAS,OAAO;AAGd,eAAO,CAAC;AAAA,MACV;AAAA,IACF,OAAO;AAEL,aAAO,oBAAoB,OAAO,OAAO;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,iBAAS;",
|
|
6
6
|
"names": ["metadata", "ruleMessages", "enforceBemUsageCss"]
|
|
7
7
|
}
|
|
@@ -23,10 +23,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
23
23
|
|
|
24
24
|
// src/rules/no-deprecated-classes-slds2.ts
|
|
25
25
|
var import_node = require("../utils/node");
|
|
26
|
-
var
|
|
26
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
27
27
|
var import_rule_messages = __toESM(require("../config/rule-messages"));
|
|
28
28
|
var import_no_deprecated_slds_classes = __toESM(require("./v9/no-deprecated-slds-classes"));
|
|
29
|
-
var deprecatedClasses =
|
|
29
|
+
var deprecatedClasses = import_sds_metadata.default.deprecatedClasses;
|
|
30
30
|
var ruleConfig = import_rule_messages.default["no-deprecated-classes-slds2"];
|
|
31
31
|
var { type, description, url, messages } = ruleConfig;
|
|
32
32
|
var noDeprecatedClassesSlds2Html = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/rules/no-deprecated-classes-slds2.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport { findAttr, isAttributesEmpty } from \"../utils/node\";\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AACA,kBAA4C;AAC5C,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport { findAttr, isAttributesEmpty } from \"../utils/node\";\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../config/rule-messages';\nimport noDeprecatedSldsClassesCss from './v9/no-deprecated-slds-classes';\n\nconst deprecatedClasses = metadata.deprecatedClasses;\nconst ruleConfig = ruleMessages['no-deprecated-classes-slds2'];\nconst { type, description, url, messages } = ruleConfig;\n\n/**\n * HTML implementation for detecting deprecated SLDS classes in HTML templates.\n * Checks class attributes on HTML elements for deprecated class names.\n */\nconst noDeprecatedClassesSlds2Html = {\n create(context) {\n function check(node) {\n if (isAttributesEmpty(node)) {\n return;\n }\n\n const classAttr = findAttr(node, \"class\");\n if (classAttr && classAttr.value) {\n const classNames = classAttr.value.value.split(/\\s+/);\n classNames.forEach((className) => {\n if (className && deprecatedClasses.includes(className)) {\n // Find the exact location of the problematic class name\n const classNameStart = classAttr.value.value.indexOf(className) + 7; // 7 here is for `class= \"`\n const classNameEnd = classNameStart + className.length;\n\n // Use the loc property to get line and column from the class attribute\n const startLoc = {\n line: classAttr.loc.start.line,\n column: classAttr.loc.start.column + classNameStart,\n };\n const endLoc = {\n line: classAttr.loc.start.line,\n column: classAttr.loc.start.column + classNameEnd,\n };\n\n context.report({\n node,\n loc: { start: startLoc, end: endLoc },\n messageId: 'deprecatedClass',\n data: {\n className,\n },\n });\n }\n });\n }\n }\n\n return {\n Tag: check,\n };\n },\n};\n\n// Create a hybrid rule that works for both HTML and CSS\nconst noDeprecatedClassesSlds2 = {\n meta: {\n type,\n docs: {\n category: \"Best Practices\",\n recommended: true,\n description,\n url\n },\n schema: [],\n messages\n },\n\n create(context) {\n const filename = context.filename || context.getFilename();\n\n // Check if we're in a CSS context\n if (filename.endsWith('.css') || filename.endsWith('.scss')) {\n // Try to detect if we have CSS support\n // In ESLint v9 with @eslint/css, we should have CSS AST support\n try {\n // Use CSS implementation (ESLint v9 with @eslint/css)\n return noDeprecatedSldsClassesCss.create(context);\n } catch (error) {\n // If CSS implementation fails, likely ESLint v8 without CSS support\n // Return empty visitor to avoid errors\n return {};\n }\n } else {\n // Use HTML implementation (compatible with both ESLint v8 and v9)\n return noDeprecatedClassesSlds2Html.create(context);\n }\n },\n};\n\nexport = noDeprecatedClassesSlds2;"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AACA,kBAA4C;AAC5C,0BAAqB;AACrB,2BAAyB;AACzB,wCAAuC;AAEvC,IAAM,oBAAoB,oBAAAA,QAAS;AACnC,IAAM,aAAa,qBAAAC,QAAa,6BAA6B;AAC7D,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAM7C,IAAM,+BAA+B;AAAA,EACnC,OAAO,SAAS;AACd,aAAS,MAAM,MAAM;AACnB,cAAI,+BAAkB,IAAI,GAAG;AAC3B;AAAA,MACF;AAEA,YAAM,gBAAY,sBAAS,MAAM,OAAO;AACxC,UAAI,aAAa,UAAU,OAAO;AAChC,cAAM,aAAa,UAAU,MAAM,MAAM,MAAM,KAAK;AACpD,mBAAW,QAAQ,CAAC,cAAc;AAChC,cAAI,aAAa,kBAAkB,SAAS,SAAS,GAAG;AAEtD,kBAAM,iBAAiB,UAAU,MAAM,MAAM,QAAQ,SAAS,IAAI;AAClE,kBAAM,eAAe,iBAAiB,UAAU;AAGhD,kBAAM,WAAW;AAAA,cACf,MAAM,UAAU,IAAI,MAAM;AAAA,cAC1B,QAAQ,UAAU,IAAI,MAAM,SAAS;AAAA,YACvC;AACA,kBAAM,SAAS;AAAA,cACb,MAAM,UAAU,IAAI,MAAM;AAAA,cAC1B,QAAQ,UAAU,IAAI,MAAM,SAAS;AAAA,YACvC;AAEA,oBAAQ,OAAO;AAAA,cACb;AAAA,cACA,KAAK,EAAE,OAAO,UAAU,KAAK,OAAO;AAAA,cACpC,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAGA,IAAM,2BAA2B;AAAA,EAC/B,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,UAAM,WAAW,QAAQ,YAAY,QAAQ,YAAY;AAGzD,QAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,GAAG;AAG3D,UAAI;AAEF,eAAO,kCAAAC,QAA2B,OAAO,OAAO;AAAA,MAClD,SAAS,OAAO;AAGd,eAAO,CAAC;AAAA,MACV;AAAA,IACF,OAAO;AAEL,aAAO,6BAA6B,OAAO,OAAO;AAAA,IACpD;AAAA,EACF;AACF;AAEA,iBAAS;",
|
|
6
6
|
"names": ["metadata", "ruleMessages", "noDeprecatedSldsClassesCss"]
|
|
7
7
|
}
|
|
@@ -32,10 +32,10 @@ __export(enforce_bem_usage_exports, {
|
|
|
32
32
|
default: () => enforce_bem_usage_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(enforce_bem_usage_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var { type, description, url, messages } = import_rule_messages.default["enforce-bem-usage"];
|
|
38
|
-
var bemMapping =
|
|
38
|
+
var bemMapping = import_sds_metadata.default.bemNaming;
|
|
39
39
|
var enforce_bem_usage_default = {
|
|
40
40
|
meta: {
|
|
41
41
|
type,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/enforce-bem-usage.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst { type, description, url, messages } = ruleMessages['enforce-bem-usage'];\n\nconst bemMapping = metadata.bemNaming;\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n fixable: 'code',\n messages,\n },\n \n create(context) {\n return {\n // Check all class selectors for BEM usage\n \"SelectorList Selector ClassSelector\"(node) {\n const cssClassSelector = context.sourceCode.getText(node);\n \n // Extract class name (remove the leading dot)\n const className = cssClassSelector.substring(1);\n \n // Check mapping data for this class name (matches Stylelint logic)\n if (className && className in bemMapping) {\n const newValue = bemMapping[className];\n if (typeof newValue === 'string') {\n context.report({\n node,\n messageId: 'bemDoubleDash',\n data: {\n actual: className,\n newValue,\n },\n fix(fixer) {\n return fixer.replaceText(node, `.${newValue}`);\n },\n });\n }\n }\n },\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI,qBAAAA,QAAa,mBAAmB;AAE7E,IAAM,aAAa,oBAAAC,QAAS;AAE5B,IAAO,4BAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA;AAAA,MAEL,sCAAsC,MAAM;AAC1C,cAAM,mBAAmB,QAAQ,WAAW,QAAQ,IAAI;AAGxD,cAAM,YAAY,iBAAiB,UAAU,CAAC;AAG9C,YAAI,aAAa,aAAa,YAAY;AACxC,gBAAM,WAAW,WAAW,SAAS;AACrC,cAAI,OAAO,aAAa,UAAU;AAChC,oBAAQ,OAAO;AAAA,cACb;AAAA,cACA,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ,QAAQ;AAAA,gBACR;AAAA,cACF;AAAA,cACA,IAAI,OAAO;AACT,uBAAO,MAAM,YAAY,MAAM,IAAI,QAAQ,EAAE;AAAA,cAC/C;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,11 +32,11 @@ __export(enforce_component_hook_naming_convention_exports, {
|
|
|
32
32
|
default: () => enforce_component_hook_naming_convention_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(enforce_component_hook_naming_convention_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var ruleConfig = import_rule_messages.default["enforce-component-hook-naming-convention"];
|
|
38
38
|
var { type, description, url, messages } = ruleConfig;
|
|
39
|
-
var slds1DeprecatedComponentHooks =
|
|
39
|
+
var slds1DeprecatedComponentHooks = import_sds_metadata.default.slds1DeprecatedComponentHooks;
|
|
40
40
|
function shouldIgnoreDetection(hook) {
|
|
41
41
|
return !hook.startsWith("--slds-c-") || !(hook in slds1DeprecatedComponentHooks);
|
|
42
42
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/enforce-component-hook-naming-convention.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst ruleConfig = ruleMessages['enforce-component-hook-naming-convention'];\nconst { type, description, url, messages } = ruleConfig;\n\nconst slds1DeprecatedComponentHooks = metadata.slds1DeprecatedComponentHooks;\n\n/**\n * Check if using a deprecated component hook that should be replaced\n */\nfunction shouldIgnoreDetection(hook: string): boolean {\n // Ignore if entry not found in the list\n return (\n !hook.startsWith('--slds-c-') || !(hook in slds1DeprecatedComponentHooks)\n );\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n fixable: 'code',\n messages,\n },\n \n create(context) {\n return {\n /*\n * Handle component hooks in CSS declarations\n * Limitation: For example:\n * .testClass{\n * --slds-c-accordion-section-color-background: var(--slds-c-accordion-section-color-border);\n * }\n * var in value is not detected, because eslint treats above statement as custom property assignment \n * and value treated as raw string, not parsed into function nodes\n */\n \"Declaration[property=/^--slds-c-/], Function[name='var'] Identifier[name=/^--slds-c-/]\"(node) {\n let hookName: string;\n let reportNode = node;\n \n if (node.type === \"Declaration\") {\n // CSS custom property declaration: --slds-c-...\n hookName = node.property;\n } else if (node.type === \"Identifier\") {\n // Inside var() function: var(--slds-c-...)\n hookName = node.name;\n } else {\n return;\n }\n\n // Skip if hook should be ignored\n if (shouldIgnoreDetection(hookName)) {\n return;\n }\n\n const suggestedMatch = slds1DeprecatedComponentHooks[hookName];\n \n context.report({\n node: reportNode,\n messageId: 'replace',\n data: { \n oldValue: hookName,\n suggestedMatch: suggestedMatch\n },\n fix(fixer) {\n if (node.type === \"Declaration\") {\n // Replace the property name in CSS declaration\n const originalText = context.sourceCode.getText(node);\n const colonIndex = originalText.indexOf(':');\n const valuePartWithColon = originalText.substring(colonIndex);\n return fixer.replaceText(node, `${suggestedMatch}${valuePartWithColon}`);\n } else if (node.type === \"Identifier\") {\n // Replace the identifier name in var() function\n return fixer.replaceText(node, suggestedMatch);\n }\n return null;\n }\n });\n }\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,aAAa,qBAAAA,QAAa,0CAA0C;AAC1E,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,gCAAgC,oBAAAC,QAAS;AAK/C,SAAS,sBAAsB,MAAuB;AAEpD,SACE,CAAC,KAAK,WAAW,WAAW,KAAK,EAAE,QAAQ;AAE/C;AAEA,IAAO,mDAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUL,yFAAyF,MAAM;AAC7F,YAAI;AACJ,YAAI,aAAa;AAEjB,YAAI,KAAK,SAAS,eAAe;AAE/B,qBAAW,KAAK;AAAA,QAClB,WAAW,KAAK,SAAS,cAAc;AAErC,qBAAW,KAAK;AAAA,QAClB,OAAO;AACL;AAAA,QACF;AAGA,YAAI,sBAAsB,QAAQ,GAAG;AACnC;AAAA,QACF;AAEA,cAAM,iBAAiB,8BAA8B,QAAQ;AAE7D,gBAAQ,OAAO;AAAA,UACb,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,YACJ,UAAU;AAAA,YACV;AAAA,UACF;AAAA,UACA,IAAI,OAAO;AACT,gBAAI,KAAK,SAAS,eAAe;AAE/B,oBAAM,eAAe,QAAQ,WAAW,QAAQ,IAAI;AACpD,oBAAM,aAAa,aAAa,QAAQ,GAAG;AAC3C,oBAAM,qBAAqB,aAAa,UAAU,UAAU;AAC5D,qBAAO,MAAM,YAAY,MAAM,GAAG,cAAc,GAAG,kBAAkB,EAAE;AAAA,YACzE,WAAW,KAAK,SAAS,cAAc;AAErC,qBAAO,MAAM,YAAY,MAAM,cAAc;AAAA,YAC/C;AACA,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,11 +32,11 @@ __export(enforce_sds_to_slds_hooks_exports, {
|
|
|
32
32
|
default: () => enforce_sds_to_slds_hooks_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(enforce_sds_to_slds_hooks_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var ruleConfig = import_rule_messages.default["enforce-sds-to-slds-hooks"];
|
|
38
38
|
var { type, description, url, messages } = ruleConfig;
|
|
39
|
-
var sldsPlusStylingHooks =
|
|
39
|
+
var sldsPlusStylingHooks = import_sds_metadata.default.sldsPlusStylingHooks;
|
|
40
40
|
var allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component];
|
|
41
41
|
var toSldsToken = (sdsToken) => sdsToken.replace("--sds-", "--slds-");
|
|
42
42
|
function shouldIgnoreDetection(sdsToken) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/enforce-sds-to-slds-hooks.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst ruleConfig = ruleMessages['enforce-sds-to-slds-hooks'];\nconst { type, description, url, messages } = ruleConfig;\n\nconst sldsPlusStylingHooks = metadata.sldsPlusStylingHooks;\n\n// Generate values to hooks mapping using only global hooks\n// shared hooks are private/ undocumented APIs, so they should not be recommended to customers\n// Ref this thread: https://salesforce-internal.slack.com/archives/C071J0Q3FNV/p1743010620921339?thread_ts=1743009353.385429&cid=C071J0Q3FNV\nconst allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component];\n\nconst toSldsToken = (sdsToken: string) => sdsToken.replace('--sds-', '--slds-');\n\nfunction shouldIgnoreDetection(sdsToken: string) {\n // Ignore if entry not found in the list\n return (\n !sdsToken.startsWith('--sds-') || !allSldsHooks.includes(toSldsToken(sdsToken))\n );\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n fixable: 'code',\n messages,\n },\n \n create(context) {\n function reportAndFix(node, oldValue, suggestedMatch) {\n context.report({\n node,\n messageId: 'replaceSdsWithSlds',\n data: { oldValue, suggestedMatch },\n fix(fixer) {\n // For Declaration nodes, use the offset from loc info\n if (node.type === \"Declaration\") {\n const sourceCode = context.sourceCode;\n const fullText = sourceCode.getText();\n const nodeOffset = node.loc.start.offset;\n \n // The property name appears at the start of the Declaration\n const propertyStart = nodeOffset;\n const propertyEnd = propertyStart + oldValue.length;\n \n // Verify we're replacing the right text\n const textAtPosition = fullText.substring(propertyStart, propertyEnd);\n if (textAtPosition === oldValue) {\n return fixer.replaceTextRange([propertyStart, propertyEnd], suggestedMatch);\n }\n }\n \n // For Identifier nodes (inside var() functions), simple replacement works\n return fixer.replaceText(node, suggestedMatch);\n }\n });\n }\n\n return {\n // CSS custom property declarations: --sds-* properties\n \"Declaration[property=/^--sds-/]\"(node) {\n const property = node.property;\n \n if (shouldIgnoreDetection(property)) {\n return;\n }\n\n const suggestedMatch = toSldsToken(property);\n reportAndFix(node, property, suggestedMatch);\n },\n\n // SDS tokens inside var() functions: var(--sds-*)\n \"Function[name='var'] Identifier[name=/^--sds-/]\"(node) {\n const tokenName = node.name;\n \n if (shouldIgnoreDetection(tokenName)) {\n return;\n }\n\n const suggestedMatch = toSldsToken(tokenName);\n reportAndFix(node, tokenName, suggestedMatch);\n }\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,aAAa,qBAAAA,QAAa,2BAA2B;AAC3D,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,uBAAuB,oBAAAC,QAAS;AAKtC,IAAM,eAAe,CAAC,GAAG,qBAAqB,QAAQ,GAAG,qBAAqB,SAAS;AAEvF,IAAM,cAAc,CAAC,aAAqB,SAAS,QAAQ,UAAU,SAAS;AAE9E,SAAS,sBAAsB,UAAkB;AAE/C,SACE,CAAC,SAAS,WAAW,QAAQ,KAAK,CAAC,aAAa,SAAS,YAAY,QAAQ,CAAC;AAElF;AAEA,IAAO,oCAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,aAAS,aAAa,MAAM,UAAU,gBAAgB;AACpD,cAAQ,OAAO;AAAA,QACb;AAAA,QACA,WAAW;AAAA,QACX,MAAM,EAAE,UAAU,eAAe;AAAA,QACjC,IAAI,OAAO;AAET,cAAI,KAAK,SAAS,eAAe;AAC/B,kBAAM,aAAa,QAAQ;AAC3B,kBAAM,WAAW,WAAW,QAAQ;AACpC,kBAAM,aAAa,KAAK,IAAI,MAAM;AAGlC,kBAAM,gBAAgB;AACtB,kBAAM,cAAc,gBAAgB,SAAS;AAG7C,kBAAM,iBAAiB,SAAS,UAAU,eAAe,WAAW;AACpE,gBAAI,mBAAmB,UAAU;AAC/B,qBAAO,MAAM,iBAAiB,CAAC,eAAe,WAAW,GAAG,cAAc;AAAA,YAC5E;AAAA,UACF;AAGA,iBAAO,MAAM,YAAY,MAAM,cAAc;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA;AAAA,MAEL,kCAAkC,MAAM;AACtC,cAAM,WAAW,KAAK;AAEtB,YAAI,sBAAsB,QAAQ,GAAG;AACnC;AAAA,QACF;AAEA,cAAM,iBAAiB,YAAY,QAAQ;AAC3C,qBAAa,MAAM,UAAU,cAAc;AAAA,MAC7C;AAAA;AAAA,MAGA,kDAAkD,MAAM;AACtD,cAAM,YAAY,KAAK;AAEvB,YAAI,sBAAsB,SAAS,GAAG;AACpC;AAAA,QACF;AAEA,cAAM,iBAAiB,YAAY,SAAS;AAC5C,qBAAa,MAAM,WAAW,cAAc;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,12 +32,12 @@ __export(lwc_token_to_slds_hook_exports, {
|
|
|
32
32
|
default: () => lwc_token_to_slds_hook_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(lwc_token_to_slds_hook_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var import_css_utils = require("../../utils/css-utils");
|
|
38
38
|
var ruleConfig = import_rule_messages.default["lwc-token-to-slds-hook"];
|
|
39
39
|
var { type, description, url, messages } = ruleConfig;
|
|
40
|
-
var lwcToSlds =
|
|
40
|
+
var lwcToSlds = import_sds_metadata.default.lwcToSlds;
|
|
41
41
|
function shouldIgnoreDetection(lwcToken) {
|
|
42
42
|
return !lwcToken.startsWith("--lwc-") || !(lwcToken in lwcToSlds) || lwcToSlds[lwcToken].continueToUse;
|
|
43
43
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/lwc-token-to-slds-hook.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\nimport { formatSuggestionHooks, forEachLwcVariable, type CssVariableInfo } from '../../utils/css-utils';\nimport type { PositionInfo } from '../../utils/hardcoded-shared-utils';\n\nconst ruleConfig = ruleMessages['lwc-token-to-slds-hook'];\nconst { type, description, url, messages } = ruleConfig;\n\nconst lwcToSlds = metadata.lwcToSlds;\n\n// Replacement category enum to match Stylelint version\nenum ReplacementCategory {\n EMPTY = 'empty',\n SLDS_TOKEN = 'slds_token',\n ARRAY = 'array',\n RAW_VALUE = 'raw_value'\n}\n\nfunction shouldIgnoreDetection(lwcToken: string): boolean {\n // Ignore if entry not found in the list or the token is marked to use further\n return (\n !lwcToken.startsWith('--lwc-') ||\n !(lwcToken in lwcToSlds) ||\n lwcToSlds[lwcToken].continueToUse\n );\n}\n\nfunction categorizeReplacement(recommendation: string | string[]): ReplacementCategory {\n if (!recommendation || recommendation === '--') {\n return ReplacementCategory.EMPTY;\n }\n if (Array.isArray(recommendation)) {\n return ReplacementCategory.ARRAY;\n }\n if (typeof recommendation === 'string' && recommendation.startsWith('--slds-')) {\n return ReplacementCategory.SLDS_TOKEN;\n }\n return ReplacementCategory.RAW_VALUE;\n}\n\nfunction getRecommendation(lwcToken: string) {\n const oldValue = lwcToken;\n const recommendation = lwcToSlds[oldValue]?.replacement || '';\n const replacementCategory = categorizeReplacement(recommendation);\n const hasRecommendation = oldValue in lwcToSlds && replacementCategory !== ReplacementCategory.EMPTY;\n return { hasRecommendation, recommendation, replacementCategory };\n}\n\nfunction getReportMessage(cssVar: string, replacementCategory: ReplacementCategory, recommendation: string | string[]): { messageId: string, data: any } {\n if (!recommendation) {\n // Found a deprecated token but don't have any alternate recommendation then just report user to follow docs\n return {\n messageId: 'errorWithNoRecommendation',\n data: { oldValue: cssVar }\n };\n } else if (replacementCategory === ReplacementCategory.ARRAY) {\n return {\n messageId: 'errorWithStyleHooks',\n data: { oldValue: cssVar, newValue: formatSuggestionHooks(recommendation as string[]) }\n };\n } else if (replacementCategory === ReplacementCategory.SLDS_TOKEN) {\n return {\n messageId: 'errorWithStyleHooks',\n data: { oldValue: cssVar, newValue: recommendation as string }\n };\n } else {\n return {\n messageId: 'errorWithReplacement',\n data: { oldValue: cssVar, newValue: recommendation as string }\n };\n }\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n fixable: 'code',\n messages,\n },\n \n create(context) {\n function reportAndFix(\n node: any,\n suggestedMatch: string | null,\n messageId: string,\n data: any,\n fixRange?: [number, number],\n loc?: any\n ) {\n context.report({\n node,\n loc: loc || node.loc,\n messageId,\n data,\n fix: suggestedMatch && fixRange ? (fixer) => {\n return fixer.replaceTextRange(fixRange, suggestedMatch);\n } : undefined\n });\n }\n\n return {\n // CSS custom property declarations: Check both property name and value\n \"Declaration\"(node) {\n // Check 1: Property name (left-side) for custom properties using --lwc- prefix\n const property = node.property;\n if (property && property.startsWith('--lwc-')) {\n if (!shouldIgnoreDetection(property)) {\n const { hasRecommendation, recommendation, replacementCategory } = getRecommendation(property);\n const { messageId, data } = getReportMessage(property, replacementCategory, recommendation);\n \n // Only provide auto-fix for SLDS token replacements\n const suggestedMatch = (hasRecommendation && replacementCategory === ReplacementCategory.SLDS_TOKEN) \n ? recommendation as string \n : null;\n \n // Calculate fix range for property name\n const propertyStart = node.loc.start.offset;\n const propertyEnd = propertyStart + property.length;\n \n reportAndFix(node, suggestedMatch, messageId, data, [propertyStart, propertyEnd]);\n }\n }\n\n // Check 2: Property value (right-side) - Use AST parsing to detect var(--lwc-*) functions\n // Note: We use forEachLwcVariable instead of Function[name='var'] handler because\n // ESLint treats custom property values (e.g., --custom-prop: var(--lwc-token)) as raw strings\n // rather than parsing them into Function nodes. This AST-based approach handles both cases.\n const valueText = context.sourceCode.getText(node.value);\n if (valueText) {\n forEachLwcVariable(valueText, (variableInfo: CssVariableInfo, positionInfo: PositionInfo) => {\n const { name: lwcToken, hasFallback } = variableInfo;\n \n if (shouldIgnoreDetection(lwcToken)) {\n return;\n }\n\n const { hasRecommendation, recommendation, replacementCategory } = getRecommendation(lwcToken);\n const { messageId, data } = getReportMessage(lwcToken, replacementCategory, recommendation);\n \n let suggestedMatch: string | null = null;\n \n if (hasRecommendation) {\n if (replacementCategory === ReplacementCategory.SLDS_TOKEN) {\n // Extract fallback value from the original var() call if present\n // Use position info to get the full var() call text\n let fallbackValue: string | null = null;\n if (hasFallback && positionInfo.start && positionInfo.end && positionInfo.start.offset !== undefined && positionInfo.end.offset !== undefined) {\n const varCallText = valueText.substring(positionInfo.start.offset, positionInfo.end.offset);\n // Find the comma after the token name and extract everything after it (before the closing paren)\n const commaIndex = varCallText.indexOf(',');\n if (commaIndex !== -1) {\n // Extract from after comma to before closing paren\n fallbackValue = varCallText.substring(commaIndex + 1, varCallText.length - 1).trim();\n }\n }\n \n // Create the replacement in the format: var(--slds-token, var(--lwc-token, fallback))\n // This preserves any existing fallback value\n const originalVarCall = fallbackValue \n ? `var(${lwcToken}, ${fallbackValue})`\n : `var(${lwcToken})`;\n suggestedMatch = `var(${recommendation}, ${originalVarCall})`;\n } else if (replacementCategory === ReplacementCategory.RAW_VALUE) {\n suggestedMatch = recommendation as string;\n }\n }\n\n // Calculate fix range and location using position info from AST parsing\n const valueStartOffset = node.value.loc.start.offset;\n const varStartOffset = valueStartOffset + (positionInfo.start?.offset || 0);\n const varEndOffset = valueStartOffset + (positionInfo.end?.offset || valueText.length);\n \n // Calculate precise location if position info is available\n const preciseLoc = positionInfo.start && positionInfo.end && node.value.loc ? {\n start: {\n line: node.value.loc.start.line + positionInfo.start.line - 1,\n column: node.value.loc.start.column + positionInfo.start.column - 1\n },\n end: {\n line: node.value.loc.start.line + positionInfo.end.line - 1,\n column: node.value.loc.start.column + positionInfo.end.column - 1\n }\n } : node.value.loc;\n \n reportAndFix(node, suggestedMatch, messageId, data, [varStartOffset, varEndOffset], preciseLoc);\n });\n }\n },\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,10 +32,10 @@ __export(no_deprecated_slds_classes_exports, {
|
|
|
32
32
|
default: () => no_deprecated_slds_classes_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_deprecated_slds_classes_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var { type, description, url, messages } = import_rule_messages.default["no-deprecated-classes-slds2"];
|
|
38
|
-
var deprecatedClasses =
|
|
38
|
+
var deprecatedClasses = import_sds_metadata.default.deprecatedClasses;
|
|
39
39
|
var deprecatedClassesSet = new Set(deprecatedClasses);
|
|
40
40
|
var no_deprecated_slds_classes_default = {
|
|
41
41
|
meta: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-deprecated-slds-classes.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\n// Use the same config as the main hybrid rule (no-deprecated-classes-slds2)\nconst { type, description, url, messages } = ruleMessages['no-deprecated-classes-slds2'];\n\nconst deprecatedClasses = metadata.deprecatedClasses;\nconst deprecatedClassesSet = new Set(deprecatedClasses);\n\n/**\n * CSS implementation for detecting deprecated SLDS classes in CSS files.\n * Checks class selectors for deprecated class names.\n * Used by the hybrid no-deprecated-classes-slds2 rule for CSS contexts.\n */\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n messages,\n },\n\n create(context) {\n return {\n // Check all class selectors for deprecated classes\n \"SelectorList Selector ClassSelector\"(node) {\n const cssClassSelector = context.sourceCode.getText(node);\n\n // Extract class name (remove the leading dot)\n const className = cssClassSelector.substring(1);\n\n // Check if it's a deprecated SLDS class\n if (className && deprecatedClassesSet.has(className)) {\n context.report({\n node,\n messageId: 'deprecatedClass',\n data: { className },\n });\n }\n },\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAGzB,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI,qBAAAA,QAAa,6BAA6B;AAEvF,IAAM,oBAAoB,oBAAAC,QAAS;AACnC,IAAM,uBAAuB,IAAI,IAAI,iBAAiB;AAOtD,IAAO,qCAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA;AAAA,MAEL,sCAAsC,MAAM;AAC1C,cAAM,mBAAmB,QAAQ,WAAW,QAAQ,IAAI;AAGxD,cAAM,YAAY,iBAAiB,UAAU,CAAC;AAG9C,YAAI,aAAa,qBAAqB,IAAI,SAAS,GAAG;AACpD,kBAAQ,OAAO;AAAA,YACb;AAAA,YACA,WAAW;AAAA,YACX,MAAM,EAAE,UAAU;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,13 +32,13 @@ __export(no_deprecated_tokens_slds1_exports, {
|
|
|
32
32
|
default: () => no_deprecated_tokens_slds1_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_deprecated_tokens_slds1_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var ruleConfig = import_rule_messages.default["no-deprecated-tokens-slds1"];
|
|
38
38
|
var { type, description, url, messages } = ruleConfig;
|
|
39
|
-
var auraToLwc =
|
|
40
|
-
var lwcToSlds =
|
|
41
|
-
var globalStylingHooksMetadata =
|
|
39
|
+
var auraToLwc = import_sds_metadata.default.auraToLwcTokensMapping;
|
|
40
|
+
var lwcToSlds = import_sds_metadata.default.lwcToSlds;
|
|
41
|
+
var globalStylingHooksMetadata = import_sds_metadata.default.globalStylingHooksMetadata?.global || {};
|
|
42
42
|
function getSldsHookFallbackValue(sldsHook) {
|
|
43
43
|
const value = globalStylingHooksMetadata[sldsHook]?.values?.slds;
|
|
44
44
|
if (!value) return null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-deprecated-tokens-slds1.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst ruleConfig = ruleMessages['no-deprecated-tokens-slds1'];\nconst { type, description, url, messages } = ruleConfig;\n\n// Get both mappings to chain Aura \u2192 LWC \u2192 SLDS\nconst auraToLwc = metadata.auraToLwcTokensMapping;\nconst lwcToSlds = metadata.lwcToSlds;\nconst globalStylingHooksMetadata = metadata.globalStylingHooksMetadata?.global || {};\n\n/**\n * Get fallback value (numeric/color) for an SLDS hook from metadata.\n * Handles two patterns in metadata:\n * 1. Raw value: \"#757575\" \u2192 returns as-is\n * 2. Nested var: \"var(--lwc-*, var(--slds-*))\" \u2192 looks up the inner SLDS hook's value\n */\nfunction getSldsHookFallbackValue(sldsHook: string): string | null {\n const value = globalStylingHooksMetadata[sldsHook]?.values?.slds;\n if (!value) return null;\n \n // If raw value, return directly\n if (!value.startsWith('var(')) return value;\n \n // Value is \"var(--lwc-*, var(--slds-*))\" - extract the inner --slds-* hook\n const innerSldsHook = value.match(/(--slds-[\\w-]+)/)?.[1];\n if (innerSldsHook) {\n return globalStylingHooksMetadata[innerSldsHook]?.values?.slds || null;\n }\n \n return null;\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description: description,\n recommended: true,\n url,\n },\n fixable: 'code',\n messages,\n },\n \n create(context) {\n /**\n * Check if a token should be ignored (not in mapping or not LWC token)\n */\n function shouldIgnoreDetection(token: string): boolean {\n return !(token in auraToLwc) || !auraToLwc[token].startsWith('--lwc-');\n }\n\n /**\n * Generate replacement - directly to SLDS with LWC fallback (removes t())\n * Output format: var(--slds-*, var(--lwc-*, fallback)) or var(--lwc-*, fallback) if no SLDS mapping\n */\n function generateReplacement(tokenName: string): string | null {\n const lwcToken = auraToLwc[tokenName];\n if (!lwcToken || !lwcToken.startsWith('--lwc-')) {\n return null;\n }\n \n const sldsMapping = lwcToSlds[lwcToken];\n \n // If SLDS mapping exists and is a direct token replacement\n if (sldsMapping) {\n const sldsHook = sldsMapping.replacement;\n if (typeof sldsHook === 'string' && sldsHook.startsWith('--slds-')) {\n // Get fallback value from SLDS hook metadata\n const fallbackValue = getSldsHookFallbackValue(sldsHook);\n // Final format: var(--slds-*, var(--lwc-*, fallback)) or var(--slds-*, var(--lwc-*))\n const lwcFallback = fallbackValue \n ? `var(${lwcToken}, ${fallbackValue})`\n : `var(${lwcToken})`;\n return `var(${sldsHook}, ${lwcFallback})`;\n }\n }\n \n // No SLDS mapping: just LWC token without t()\n return `var(${lwcToken})`;\n }\n\n function handleTokenFunction(node, functionName) {\n // Get the token name from the identifier\n const tokenName = context.sourceCode.getText(node);\n \n // Skip if token should be ignored\n if (shouldIgnoreDetection(tokenName)) {\n return;\n }\n\n // Create original function call for error message\n const originalFunctionCall = `${functionName}(${tokenName})`;\n const replacement = generateReplacement(tokenName);\n \n if (replacement) {\n // Report with replacement suggestion\n context.report({\n node,\n messageId: 'deprecatedToken',\n data: { \n oldValue: originalFunctionCall,\n newValue: replacement\n },\n fix(fixer) {\n // Use node position to avoid multiple replacements of same token\n const sourceCode = context.sourceCode.getText();\n const tokenFunctionCall = `${functionName}(${tokenName})`;\n const nodeOffset = node.loc.start.offset;\n \n // Search backwards from the node position to find the function start\n const searchStart = Math.max(0, nodeOffset - functionName.length - 1);\n const searchEnd = nodeOffset + tokenName.length + 1;\n const searchArea = sourceCode.substring(searchStart, searchEnd);\n \n const functionCallIndex = searchArea.indexOf(tokenFunctionCall);\n if (functionCallIndex !== -1) {\n const actualStart = searchStart + functionCallIndex;\n const actualEnd = actualStart + tokenFunctionCall.length;\n return fixer.replaceTextRange([actualStart, actualEnd], replacement);\n }\n return null;\n }\n });\n } else {\n // Report without specific replacement\n context.report({\n node,\n messageId: 'noReplacement',\n });\n }\n }\n\n return {\n \"Function[name='token'] Identifier\"(node) {\n handleTokenFunction(node, 'token');\n },\n \"Function[name='t'] Identifier\"(node) {\n handleTokenFunction(node, 't');\n },\n };\n\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,aAAa,qBAAAA,QAAa,4BAA4B;AAC5D,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAG7C,IAAM,YAAY,oBAAAC,QAAS;AAC3B,IAAM,YAAY,oBAAAA,QAAS;AAC3B,IAAM,6BAA6B,oBAAAA,QAAS,4BAA4B,UAAU,CAAC;AAQnF,SAAS,yBAAyB,UAAiC;AACjE,QAAM,QAAQ,2BAA2B,QAAQ,GAAG,QAAQ;AAC5D,MAAI,CAAC,MAAO,QAAO;AAGnB,MAAI,CAAC,MAAM,WAAW,MAAM,EAAG,QAAO;AAGtC,QAAM,gBAAgB,MAAM,MAAM,iBAAiB,IAAI,CAAC;AACxD,MAAI,eAAe;AACjB,WAAO,2BAA2B,aAAa,GAAG,QAAQ,QAAQ;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,IAAO,qCAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AAId,aAAS,sBAAsB,OAAwB;AACrD,aAAO,EAAE,SAAS,cAAc,CAAC,UAAU,KAAK,EAAE,WAAW,QAAQ;AAAA,IACvE;AAMA,aAAS,oBAAoB,WAAkC;AAC7D,YAAM,WAAW,UAAU,SAAS;AACpC,UAAI,CAAC,YAAY,CAAC,SAAS,WAAW,QAAQ,GAAG;AAC/C,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,UAAU,QAAQ;AAGtC,UAAI,aAAa;AACf,cAAM,WAAW,YAAY;AAC7B,YAAI,OAAO,aAAa,YAAY,SAAS,WAAW,SAAS,GAAG;AAElE,gBAAM,gBAAgB,yBAAyB,QAAQ;AAEvD,gBAAM,cAAc,gBAChB,OAAO,QAAQ,KAAK,aAAa,MACjC,OAAO,QAAQ;AACnB,iBAAO,OAAO,QAAQ,KAAK,WAAW;AAAA,QACxC;AAAA,MACF;AAGA,aAAO,OAAO,QAAQ;AAAA,IACxB;AAEA,aAAS,oBAAoB,MAAM,cAAc;AAE/C,YAAM,YAAY,QAAQ,WAAW,QAAQ,IAAI;AAGjD,UAAI,sBAAsB,SAAS,GAAG;AACpC;AAAA,MACF;AAGA,YAAM,uBAAuB,GAAG,YAAY,IAAI,SAAS;AACzD,YAAM,cAAc,oBAAoB,SAAS;AAEjD,UAAI,aAAa;AAEf,gBAAQ,OAAO;AAAA,UACb;AAAA,UACA,WAAW;AAAA,UACX,MAAM;AAAA,YACJ,UAAU;AAAA,YACV,UAAU;AAAA,UACZ;AAAA,UACA,IAAI,OAAO;AAET,kBAAM,aAAa,QAAQ,WAAW,QAAQ;AAC9C,kBAAM,oBAAoB,GAAG,YAAY,IAAI,SAAS;AACtD,kBAAM,aAAa,KAAK,IAAI,MAAM;AAGlC,kBAAM,cAAc,KAAK,IAAI,GAAG,aAAa,aAAa,SAAS,CAAC;AACpE,kBAAM,YAAY,aAAa,UAAU,SAAS;AAClD,kBAAM,aAAa,WAAW,UAAU,aAAa,SAAS;AAE9D,kBAAM,oBAAoB,WAAW,QAAQ,iBAAiB;AAC9D,gBAAI,sBAAsB,IAAI;AAC5B,oBAAM,cAAc,cAAc;AAClC,oBAAM,YAAY,cAAc,kBAAkB;AAClD,qBAAO,MAAM,iBAAiB,CAAC,aAAa,SAAS,GAAG,WAAW;AAAA,YACrE;AACA,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,gBAAQ,OAAO;AAAA,UACb;AAAA,UACA,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL,oCAAoC,MAAM;AACxC,4BAAoB,MAAM,OAAO;AAAA,MACnC;AAAA,MACA,gCAAgC,MAAM;AACpC,4BAAoB,MAAM,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,EAEF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.ts"],
|
|
4
|
-
"sourcesContent": ["import type { HandlerContext, DeclarationHandler } from '../../../../types';\nimport type { ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata
|
|
4
|
+
"sourcesContent": ["import type { HandlerContext, DeclarationHandler } from '../../../../types';\nimport type { ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata';\nimport { parseBoxShadowValue, isBoxShadowMatch, type BoxShadowValue } from '../../../../utils/boxShadowValueParser';\nimport { formatSuggestionHooks } from '../../../../utils/css-utils';\nimport { getCustomMapping } from '../../../../utils/custom-mapping-utils';\n\n// Import shared utilities for common logic\nimport { \n handleShorthandAutoFix, \n type ReplacementInfo,\n type PositionInfo\n} from '../../../../utils/hardcoded-shared-utils';\n\n/**\n * Convert CSS value to parsed box-shadow values, filtering out empty ones\n */\nfunction toBoxShadowValue(cssValue: string): BoxShadowValue[] | null {\n const parsedCssValue = parseBoxShadowValue(cssValue).filter((shadow) => Object.keys(shadow).length > 0);\n if (parsedCssValue.length === 0) {\n return null;\n }\n return parsedCssValue;\n}\n\n/**\n * Extract box-shadow hook entries from styling hooks mapping\n */\nfunction shadowValueToHookEntries(supportedStylinghooks: ValueToStylingHooksMapping): Array<[string, string[]]> {\n return Object.entries(supportedStylinghooks).filter(([key, value]) => {\n return value.some((hook) => hook.properties.includes('box-shadow'));\n }).map(([key, value]) => {\n return [key, value.map((hook) => hook.name)];\n });\n}\n\n/**\n * Report box-shadow violation with hooks and apply auto-fix\n */\nfunction reportBoxShadowViolation(\n node: any,\n context: HandlerContext,\n valueText: string,\n hooks: string[]\n): void {\n const positionInfo: PositionInfo = {\n start: { offset: 0, line: 1, column: 1 },\n end: { offset: valueText.length, line: 1, column: valueText.length + 1 }\n };\n \n const replacement = createBoxShadowReplacement(\n valueText,\n hooks,\n context,\n positionInfo\n );\n \n if (replacement) {\n const replacements: ReplacementInfo[] = [replacement];\n handleShorthandAutoFix(node, context, valueText, replacements);\n }\n}\n\n/**\n * Handle box-shadow declarations using CSS tree parsing\n */\nexport const handleBoxShadowDeclaration: DeclarationHandler = (node: any, context: HandlerContext) => {\n const cssProperty = node.property.toLowerCase();\n const valueText = context.sourceCode.getText(node.value);\n \n // Check custom mapping first\n const customHook = getCustomMapping(cssProperty, valueText, context.options?.customMapping);\n if (customHook) {\n reportBoxShadowViolation(node, context, valueText, [customHook]);\n return;\n }\n\n const shadowHooks = shadowValueToHookEntries(context.valueToStylinghook);\n const parsedCssValue = toBoxShadowValue(valueText);\n if (!parsedCssValue) {\n return;\n }\n\n // Look for matching hooks in metadata\n for (const [shadow, closestHooks] of shadowHooks) {\n const parsedValueHook = toBoxShadowValue(shadow);\n if (parsedValueHook && isBoxShadowMatch(parsedCssValue, parsedValueHook)) {\n if (closestHooks.length > 0) {\n reportBoxShadowViolation(node, context, valueText, closestHooks);\n }\n return;\n }\n }\n \n // If no hooks found, silently ignore - don't report any violations\n};\n\n\n/**\n * Create box-shadow replacement info for shorthand auto-fix\n * Only called when hooks are available (hooks.length > 0)\n * Returns replacement data or null if invalid position info\n */\nfunction createBoxShadowReplacement(\n originalValue: string,\n hooks: string[],\n context: HandlerContext,\n positionInfo: PositionInfo\n): ReplacementInfo | null {\n if (!positionInfo?.start) {\n return null;\n }\n\n // Use position information directly from CSS tree (already 0-based offsets)\n const start = positionInfo.start.offset;\n const end = positionInfo.end.offset;\n\n if (hooks.length === 1) {\n // Has a single hook replacement - should provide autofix\n return {\n start,\n end,\n replacement: `var(${hooks[0]}, ${originalValue})`,\n displayValue: hooks[0],\n hasHook: true\n };\n } else {\n // Multiple hooks - still has hooks, but no auto-fix\n return {\n start,\n end,\n replacement: originalValue,\n displayValue: formatSuggestionHooks(hooks),\n hasHook: true\n };\n }\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,kCAA2E;AAC3E,uBAAsC;AACtC,kCAAiC;AAGjC,oCAIO;AAKP,SAAS,iBAAiB,UAA2C;AACnE,QAAM,qBAAiB,iDAAoB,QAAQ,EAAE,OAAO,CAAC,WAAW,OAAO,KAAK,MAAM,EAAE,SAAS,CAAC;AACtG,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,yBAAyB,uBAA8E;AAC9G,SAAO,OAAO,QAAQ,qBAAqB,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM;AACpE,WAAO,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS,YAAY,CAAC;AAAA,EACpE,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACvB,WAAO,CAAC,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAAA,EAC7C,CAAC;AACH;AAKA,SAAS,yBACP,MACA,SACA,WACA,OACM;AACN,QAAM,eAA6B;AAAA,IACjC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,EAAE;AAAA,IACvC,KAAK,EAAE,QAAQ,UAAU,QAAQ,MAAM,GAAG,QAAQ,UAAU,SAAS,EAAE;AAAA,EACzE;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa;AACf,UAAM,eAAkC,CAAC,WAAW;AACpD,8DAAuB,MAAM,SAAS,WAAW,YAAY;AAAA,EAC/D;AACF;AAKO,IAAM,6BAAiD,CAAC,MAAW,YAA4B;AACpG,QAAM,cAAc,KAAK,SAAS,YAAY;AAC9C,QAAM,YAAY,QAAQ,WAAW,QAAQ,KAAK,KAAK;AAGvD,QAAM,iBAAa,8CAAiB,aAAa,WAAW,QAAQ,SAAS,aAAa;AAC1F,MAAI,YAAY;AACd,6BAAyB,MAAM,SAAS,WAAW,CAAC,UAAU,CAAC;AAC/D;AAAA,EACF;AAEA,QAAM,cAAc,yBAAyB,QAAQ,kBAAkB;AACvE,QAAM,iBAAiB,iBAAiB,SAAS;AACjD,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAGA,aAAW,CAAC,QAAQ,YAAY,KAAK,aAAa;AAChD,UAAM,kBAAkB,iBAAiB,MAAM;AAC/C,QAAI,uBAAmB,8CAAiB,gBAAgB,eAAe,GAAG;AACxE,UAAI,aAAa,SAAS,GAAG;AAC3B,iCAAyB,MAAM,SAAS,WAAW,YAAY;AAAA,MACjE;AACA;AAAA,IACF;AAAA,EACF;AAGF;AAQA,SAAS,2BACP,eACA,OACA,SACA,cACwB;AACxB,MAAI,CAAC,cAAc,OAAO;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,MAAM,aAAa,IAAI;AAE7B,MAAI,MAAM,WAAW,GAAG;AAEtB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa,OAAO,MAAM,CAAC,CAAC,KAAK,aAAa;AAAA,MAC9C,cAAc,MAAM,CAAC;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,EACF,OAAO;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,kBAAc,wCAAsB,KAAK;AAAA,MACzC,SAAS;AAAA,IACX;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -32,13 +32,13 @@ __export(no_hardcoded_values_slds1_exports, {
|
|
|
32
32
|
default: () => no_hardcoded_values_slds1_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_hardcoded_values_slds1_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../../config/rule-messages"));
|
|
37
37
|
var import_noHardcodedValueRule = require("./noHardcodedValueRule");
|
|
38
38
|
var ruleName = "no-hardcoded-values-slds1";
|
|
39
39
|
var ruleConfig = import_rule_messages.default[ruleName];
|
|
40
40
|
var { type, description, url, messages } = ruleConfig;
|
|
41
|
-
var valueToStylinghook =
|
|
41
|
+
var valueToStylinghook = import_sds_metadata.default.valueToStylingHooksSlds;
|
|
42
42
|
var no_hardcoded_values_slds1_default = (0, import_noHardcodedValueRule.defineNoHardcodedValueRule)({
|
|
43
43
|
ruleConfig,
|
|
44
44
|
valueToStylinghook,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds1.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../../config/rule-messages';\nimport { defineNoHardcodedValueRule } from './noHardcodedValueRule';\n\nconst ruleName = 'no-hardcoded-values-slds1';\nconst ruleConfig = ruleMessages[ruleName];\nconst { type, description, url, messages } = ruleConfig;\n\nconst valueToStylinghook = metadata.valueToStylingHooksSlds;\n\nexport default defineNoHardcodedValueRule({\n ruleConfig,\n valueToStylinghook,\n ruleName,\n}) as Rule.RuleModule;\n\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AACzB,kCAA2C;AAE3C,IAAM,WAAW;AACjB,IAAM,aAAa,qBAAAA,QAAa,QAAQ;AACxC,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,qBAAqB,oBAAAC,QAAS;AAEpC,IAAO,wCAAQ,wDAA2B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,CAAC;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,13 +32,13 @@ __export(no_hardcoded_values_slds2_exports, {
|
|
|
32
32
|
default: () => no_hardcoded_values_slds2_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_hardcoded_values_slds2_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../../config/rule-messages"));
|
|
37
37
|
var import_noHardcodedValueRule = require("./noHardcodedValueRule");
|
|
38
38
|
var ruleName = "no-hardcoded-values-slds2";
|
|
39
39
|
var ruleConfig = import_rule_messages.default[ruleName];
|
|
40
40
|
var { type, description, url, messages } = ruleConfig;
|
|
41
|
-
var valueToStylinghook =
|
|
41
|
+
var valueToStylinghook = import_sds_metadata.default.valueToStylingHooksCosmos;
|
|
42
42
|
var no_hardcoded_values_slds2_default = (0, import_noHardcodedValueRule.defineNoHardcodedValueRule)({
|
|
43
43
|
ruleConfig,
|
|
44
44
|
valueToStylinghook,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/rules/v9/no-hardcoded-values/no-hardcoded-values-slds2.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../../config/rule-messages';\nimport { defineNoHardcodedValueRule } from './noHardcodedValueRule';\n \nconst ruleName = 'no-hardcoded-values-slds2';\nconst ruleConfig = ruleMessages[ruleName];\nconst { type, description, url, messages } = ruleConfig;\n\nconst valueToStylinghook = metadata.valueToStylingHooksCosmos;\n\nexport default defineNoHardcodedValueRule({\n ruleConfig,\n valueToStylinghook,\n ruleName,\n}) as Rule.RuleModule;\n\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AACzB,kCAA2C;AAE3C,IAAM,WAAW;AACjB,IAAM,aAAa,qBAAAA,QAAa,QAAQ;AACxC,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,qBAAqB,oBAAAC,QAAS;AAEpC,IAAO,wCAAQ,wDAA2B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,CAAC;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,10 +32,10 @@ __export(no_slds_class_overrides_exports, {
|
|
|
32
32
|
default: () => no_slds_class_overrides_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_slds_class_overrides_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var ruleConfig = import_rule_messages.default["no-slds-class-overrides"];
|
|
38
|
-
var sldsClasses =
|
|
38
|
+
var sldsClasses = import_sds_metadata.default.sldsPlusClasses;
|
|
39
39
|
var sldsClassesSet = new Set(sldsClasses);
|
|
40
40
|
var no_slds_class_overrides_default = {
|
|
41
41
|
meta: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-slds-class-overrides.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Rule to disallow overriding SLDS CSS classes\n * Compatible with @eslint/css parser for ESLint v9\n * Maintains full parity with stylelint version behavior\n */\n\nimport { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Rule to disallow overriding SLDS CSS classes\n * Compatible with @eslint/css parser for ESLint v9\n * Maintains full parity with stylelint version behavior\n */\n\nimport { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst ruleConfig = ruleMessages['no-slds-class-overrides'];\n\n// Get SLDS classes from metadata (same as stylelint version)\nconst sldsClasses = metadata.sldsPlusClasses;\nconst sldsClassesSet = new Set(sldsClasses);\n\nexport default {\n meta: {\n type: ruleConfig.type,\n docs: {\n description: ruleConfig.description,\n recommended: true, //useful for plugin recommended configs\n url: ruleConfig.url,\n },\n fixable: null,\n hasSuggestions: false,\n schema: [],\n messages: ruleConfig.messages,\n },\n \n create(context) {\n return {\n // For no-slds-class-overrides: Only flags classes at selector end\n \"SelectorList Selector\"(node) {\n // Get the last ClassSelector in this selector (the one at the end)\n const classSelectorNode = node.children.filter((child) => child.type === \"ClassSelector\").at(-1);\n \n if (classSelectorNode) {\n const className = classSelectorNode.name;\n \n // Check if it's an SLDS class that exists in metadata\n if (className && \n className.startsWith('slds-') && \n sldsClassesSet.has(className)) {\n context.report({\n node: classSelectorNode,\n messageId: 'sldsClassOverride',\n data: { className },\n });\n }\n }\n },\n };\n },\n} as Rule.RuleModule; "],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,aAAa,qBAAAA,QAAa,yBAAyB;AAGzD,IAAM,cAAc,oBAAAC,QAAS;AAC7B,IAAM,iBAAiB,IAAI,IAAI,WAAW;AAE1C,IAAO,kCAAQ;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,WAAW;AAAA,IACjB,MAAM;AAAA,MACJ,aAAa,WAAW;AAAA,MACxB,aAAa;AAAA;AAAA,MACb,KAAK,WAAW;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ,CAAC;AAAA,IACT,UAAU,WAAW;AAAA,EACvB;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA;AAAA,MAEL,wBAAwB,MAAM;AAE5B,cAAM,oBAAoB,KAAK,SAAS,OAAO,CAAC,UAAU,MAAM,SAAS,eAAe,EAAE,GAAG,EAAE;AAE/F,YAAI,mBAAmB;AACrB,gBAAM,YAAY,kBAAkB;AAGpC,cAAI,aACA,UAAU,WAAW,OAAO,KAC5B,eAAe,IAAI,SAAS,GAAG;AACjC,oBAAQ,OAAO;AAAA,cACb,MAAM;AAAA,cACN,WAAW;AAAA,cACX,MAAM,EAAE,UAAU;AAAA,YACpB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,12 +32,12 @@ __export(no_slds_namespace_for_custom_hooks_exports, {
|
|
|
32
32
|
default: () => no_slds_namespace_for_custom_hooks_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_slds_namespace_for_custom_hooks_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var import_css_utils = require("../../utils/css-utils");
|
|
38
38
|
var ruleConfig = import_rule_messages.default["no-slds-namespace-for-custom-hooks"];
|
|
39
39
|
var { type, description, url, messages } = ruleConfig;
|
|
40
|
-
var sldsPlusStylingHooks =
|
|
40
|
+
var sldsPlusStylingHooks = import_sds_metadata.default.sldsPlusStylingHooks;
|
|
41
41
|
var allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component, ...sldsPlusStylingHooks.shared];
|
|
42
42
|
var toSldsToken = (sdsToken) => sdsToken.replace("--sds-", "--slds-");
|
|
43
43
|
function shouldIgnoreDetection(sdsToken) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-slds-namespace-for-custom-hooks.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\nimport { forEachNamespacedVariable, type CssVariableInfo } from '../../utils/css-utils';\nimport type { PositionInfo } from '../../utils/hardcoded-shared-utils';\n\nconst ruleConfig = ruleMessages['no-slds-namespace-for-custom-hooks'];\nconst { type, description, url, messages } = ruleConfig;\n\nconst sldsPlusStylingHooks = metadata.sldsPlusStylingHooks;\n\n// Generate values to hooks mapping using only global hooks\n// shared hooks are private/ undocumented APIs, so they should not be recommended to customers\n// Ref this thread: https://salesforce-internal.slack.com/archives/C071J0Q3FNV/p1743010620921339?thread_ts=1743009353.385429&cid=C071J0Q3FNV\n// Note: kinetics hooks available but excluded due to TypeScript type mismatch (type says 'kinetic', runtime has 'kinetics')\nconst allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component, ...sldsPlusStylingHooks.shared];\n\nconst toSldsToken = (sdsToken: string) => sdsToken.replace('--sds-', '--slds-');\n\nfunction shouldIgnoreDetection(sdsToken: string): boolean {\n // Ignore if entry found in the list or not starts with reserved namespace\n if (sdsToken.startsWith('--sds-') || sdsToken.startsWith('--slds-')) {\n return allSldsHooks.includes(toSldsToken(sdsToken));\n }\n return true;\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n messages,\n },\n \n create(context) {\n return {\n \"Declaration\"(node) {\n // Check 1: Property name (left-side) for custom properties using reserved namespaces\n const property = node.property;\n if (property && \n (property.startsWith('--slds-') || property.startsWith('--sds-')) &&\n !shouldIgnoreDetection(property)) {\n const tokenWithoutNamespace = property.replace('--slds-', '').replace('--sds-', '');\n \n // Report at the property location (before the colon)\n context.report({\n node,\n loc: node.loc, // Use full declaration loc which includes the property\n messageId: 'customHookNamespace',\n data: { \n token: property,\n tokenWithoutNamespace\n }\n });\n }\n\n // Check 2: Property value (right-side) - Use AST parsing to detect var() functions\n const valueText = context.sourceCode.getText(node.value);\n if (valueText) {\n forEachNamespacedVariable(valueText, (variableInfo: CssVariableInfo, positionInfo: PositionInfo) => {\n const { name: tokenName } = variableInfo;\n \n if (!shouldIgnoreDetection(tokenName)) {\n const tokenWithoutNamespace = tokenName.replace('--slds-', '').replace('--sds-', '');\n \n // Use exact position if available, otherwise report on declaration node\n if (positionInfo.start && positionInfo.end && node.value.loc) {\n context.report({\n node,\n loc: {\n start: {\n line: node.value.loc.start.line + positionInfo.start.line - 1,\n column: node.value.loc.start.column + positionInfo.start.column - 1\n },\n end: {\n line: node.value.loc.start.line + positionInfo.end.line - 1,\n column: node.value.loc.start.column + positionInfo.end.column - 1\n }\n },\n messageId: 'customHookNamespace',\n data: { token: tokenName, tokenWithoutNamespace }\n });\n } else {\n context.report({\n node,\n messageId: 'customHookNamespace',\n data: { token: tokenName, tokenWithoutNamespace }\n });\n }\n }\n });\n }\n },\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AACzB,uBAAgE;AAGhE,IAAM,aAAa,qBAAAA,QAAa,oCAAoC;AACpE,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,uBAAuB,oBAAAC,QAAS;AAMtC,IAAM,eAAe,CAAC,GAAG,qBAAqB,QAAQ,GAAG,qBAAqB,WAAW,GAAG,qBAAqB,MAAM;AAEvH,IAAM,cAAc,CAAC,aAAqB,SAAS,QAAQ,UAAU,SAAS;AAE9E,SAAS,sBAAsB,UAA2B;AAExD,MAAI,SAAS,WAAW,QAAQ,KAAK,SAAS,WAAW,SAAS,GAAG;AACnE,WAAO,aAAa,SAAS,YAAY,QAAQ,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAEA,IAAO,6CAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA,MACL,cAAc,MAAM;AAElB,cAAM,WAAW,KAAK;AACtB,YAAI,aACC,SAAS,WAAW,SAAS,KAAK,SAAS,WAAW,QAAQ,MAC/D,CAAC,sBAAsB,QAAQ,GAAG;AACpC,gBAAM,wBAAwB,SAAS,QAAQ,WAAW,EAAE,EAAE,QAAQ,UAAU,EAAE;AAGlF,kBAAQ,OAAO;AAAA,YACb;AAAA,YACA,KAAK,KAAK;AAAA;AAAA,YACV,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,OAAO;AAAA,cACP;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAGA,cAAM,YAAY,QAAQ,WAAW,QAAQ,KAAK,KAAK;AACvD,YAAI,WAAW;AACb,0DAA0B,WAAW,CAAC,cAA+B,iBAA+B;AAClG,kBAAM,EAAE,MAAM,UAAU,IAAI;AAE5B,gBAAI,CAAC,sBAAsB,SAAS,GAAG;AACrC,oBAAM,wBAAwB,UAAU,QAAQ,WAAW,EAAE,EAAE,QAAQ,UAAU,EAAE;AAGnF,kBAAI,aAAa,SAAS,aAAa,OAAO,KAAK,MAAM,KAAK;AAC5D,wBAAQ,OAAO;AAAA,kBACb;AAAA,kBACA,KAAK;AAAA,oBACH,OAAO;AAAA,sBACL,MAAM,KAAK,MAAM,IAAI,MAAM,OAAO,aAAa,MAAM,OAAO;AAAA,sBAC5D,QAAQ,KAAK,MAAM,IAAI,MAAM,SAAS,aAAa,MAAM,SAAS;AAAA,oBACpE;AAAA,oBACA,KAAK;AAAA,sBACH,MAAM,KAAK,MAAM,IAAI,MAAM,OAAO,aAAa,IAAI,OAAO;AAAA,sBAC1D,QAAQ,KAAK,MAAM,IAAI,MAAM,SAAS,aAAa,IAAI,SAAS;AAAA,oBAClE;AAAA,kBACF;AAAA,kBACA,WAAW;AAAA,kBACX,MAAM,EAAE,OAAO,WAAW,sBAAsB;AAAA,gBAClD,CAAC;AAAA,cACH,OAAO;AACL,wBAAQ,OAAO;AAAA,kBACb;AAAA,kBACA,WAAW;AAAA,kBACX,MAAM,EAAE,OAAO,WAAW,sBAAsB;AAAA,gBAClD,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,12 +32,12 @@ __export(no_slds_var_without_fallback_exports, {
|
|
|
32
32
|
default: () => no_slds_var_without_fallback_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_slds_var_without_fallback_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var import_css_utils = require("../../utils/css-utils");
|
|
38
38
|
var ruleConfig = import_rule_messages.default["no-slds-var-without-fallback"];
|
|
39
39
|
var { type, description, url, messages } = ruleConfig;
|
|
40
|
-
var sldsVariables =
|
|
40
|
+
var sldsVariables = import_sds_metadata.default.slds1ExcludedVars || {};
|
|
41
41
|
var no_slds_var_without_fallback_default = {
|
|
42
42
|
meta: {
|
|
43
43
|
type,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-slds-var-without-fallback.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\nimport { forEachSldsVariable, type CssVariableInfo } from '../../utils/css-utils';\nimport type { PositionInfo } from '../../utils/hardcoded-shared-utils';\n\nconst ruleConfig = ruleMessages['no-slds-var-without-fallback'];\nconst { type, description, url, messages } = ruleConfig;\n\n// Access the slds1ExcludedVars property from metadata\nconst sldsVariables = metadata.slds1ExcludedVars || {};\n\n/**\n * ESLint rule to detect SLDS variables used without fallback values\n * Uses CSS AST parsing for consistent detection across all CSS contexts\n */\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n fixable: 'code',\n messages,\n },\n \n create(context) {\n return {\n \"Declaration\"(node) {\n const valueText = context.sourceCode.getText(node.value);\n if (!valueText) return;\n\n const variablesNeedingFallback: Array<{\n cssVar: string;\n fallbackValue: string;\n start: number;\n end: number;\n }> = [];\n\n // Use AST parsing to find all SLDS variables\n forEachSldsVariable(valueText, (variableInfo: CssVariableInfo, positionInfo: PositionInfo) => {\n const { name: cssVar, hasFallback } = variableInfo;\n \n if (hasFallback) return; // Skip if variable already has a fallback\n \n const fallbackValue = sldsVariables[cssVar];\n if (!fallbackValue) return; // No fallback available in metadata\n \n variablesNeedingFallback.push({\n cssVar,\n fallbackValue,\n start: positionInfo.start?.offset || 0,\n end: positionInfo.end?.offset || 0\n });\n });\n\n // Report violations with combined fix\n if (variablesNeedingFallback.length > 0) {\n // Create combined fix for all variables\n let newValue = valueText;\n const sortedVariables = variablesNeedingFallback.sort((a, b) => b.start - a.start);\n \n sortedVariables.forEach(({ cssVar, fallbackValue, start, end }) => {\n const replacement = `var(${cssVar}, ${fallbackValue})`;\n newValue = newValue.substring(0, start) + replacement + newValue.substring(end);\n });\n\n // Report each variable separately but with the same combined fix\n variablesNeedingFallback.forEach(({ cssVar, fallbackValue }) => {\n context.report({\n node,\n messageId: 'varWithoutFallback',\n data: { cssVar, recommendation: fallbackValue },\n fix: (fixer) => fixer.replaceText(node.value, newValue)\n });\n });\n }\n }\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AACzB,uBAA0D;AAG1D,IAAM,aAAa,qBAAAA,QAAa,8BAA8B;AAC9D,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAG7C,IAAM,gBAAgB,oBAAAC,QAAS,qBAAqB,CAAC;AAMrD,IAAO,uCAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA,MACL,cAAc,MAAM;AAClB,cAAM,YAAY,QAAQ,WAAW,QAAQ,KAAK,KAAK;AACvD,YAAI,CAAC,UAAW;AAEhB,cAAM,2BAKD,CAAC;AAGN,kDAAoB,WAAW,CAAC,cAA+B,iBAA+B;AAC5F,gBAAM,EAAE,MAAM,QAAQ,YAAY,IAAI;AAEtC,cAAI,YAAa;AAEjB,gBAAM,gBAAgB,cAAc,MAAM;AAC1C,cAAI,CAAC,cAAe;AAEpB,mCAAyB,KAAK;AAAA,YAC5B;AAAA,YACA;AAAA,YACA,OAAO,aAAa,OAAO,UAAU;AAAA,YACrC,KAAK,aAAa,KAAK,UAAU;AAAA,UACnC,CAAC;AAAA,QACH,CAAC;AAGD,YAAI,yBAAyB,SAAS,GAAG;AAEvC,cAAI,WAAW;AACf,gBAAM,kBAAkB,yBAAyB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEjF,0BAAgB,QAAQ,CAAC,EAAE,QAAQ,eAAe,OAAO,IAAI,MAAM;AACjE,kBAAM,cAAc,OAAO,MAAM,KAAK,aAAa;AACnD,uBAAW,SAAS,UAAU,GAAG,KAAK,IAAI,cAAc,SAAS,UAAU,GAAG;AAAA,UAChF,CAAC;AAGD,mCAAyB,QAAQ,CAAC,EAAE,QAAQ,cAAc,MAAM;AAC9D,oBAAQ,OAAO;AAAA,cACb;AAAA,cACA,WAAW;AAAA,cACX,MAAM,EAAE,QAAQ,gBAAgB,cAAc;AAAA,cAC9C,KAAK,CAAC,UAAU,MAAM,YAAY,KAAK,OAAO,QAAQ;AAAA,YACxD,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,11 +32,11 @@ __export(no_sldshook_fallback_for_lwctoken_exports, {
|
|
|
32
32
|
default: () => no_sldshook_fallback_for_lwctoken_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_sldshook_fallback_for_lwctoken_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var ruleConfig = import_rule_messages.default["no-sldshook-fallback-for-lwctoken"];
|
|
38
38
|
var { type, description, url, messages } = ruleConfig;
|
|
39
|
-
var sldsPlusStylingHooks =
|
|
39
|
+
var sldsPlusStylingHooks = import_sds_metadata.default.sldsPlusStylingHooks;
|
|
40
40
|
var allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component];
|
|
41
41
|
var allSldsHooksSet = new Set(allSldsHooks);
|
|
42
42
|
function hasUnsupportedFallback(lwcToken, sldsToken) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-sldshook-fallback-for-lwctoken.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst ruleConfig = ruleMessages['no-sldshook-fallback-for-lwctoken'];\nconst { type, description, url, messages } = ruleConfig;\n\nconst sldsPlusStylingHooks = metadata.sldsPlusStylingHooks;\n\n// Generate values to hooks mapping using only global hooks\n// shared hooks are private/ undocumented APIs, so they should not be recommended to customers\n// Ref this thread: https://salesforce-internal.slack.com/archives/C071J0Q3FNV/p1743010620921339?thread_ts=1743009353.385429&cid=C071J0Q3FNV\nconst allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component];\nconst allSldsHooksSet = new Set(allSldsHooks);\n\n/**\n * Check if using an SLDS hook as fallback for LWC token is unsupported\n */\nfunction hasUnsupportedFallback(lwcToken: string, sldsToken: string): boolean {\n // Convert --sds- to --slds- if needed\n const normalizedSldsToken = sldsToken.replace('--sds-', '--slds-');\n \n return lwcToken.startsWith('--lwc-') \n && normalizedSldsToken.startsWith('--slds-') \n && allSldsHooksSet.has(normalizedSldsToken);\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n messages,\n },\n \n create(context) {\n return {\n // Handle LWC tokens inside var() functions: var(--lwc-*, ...)\n \"Function[name='var'] Identifier[name=/^--lwc-/]\"(node) {\n const lwcToken = node.name;\n \n // Get the var() function node that contains this identifier\n const varFunctionNode = context.sourceCode.getAncestors(node).at(-1);\n if (!varFunctionNode) return;\n \n //access children to find fallback\n const varFunctionChildren = (varFunctionNode as any).children;\n if (!varFunctionChildren) return;\n \n // Find comma operator and the Raw node after it\n let foundComma = false;\n let fallbackRawNode = null;\n \n for (const child of varFunctionChildren) {\n if (child.type === 'Operator' && child.value === ',') {\n foundComma = true;\n continue;\n }\n if (foundComma && child.type === 'Raw') {\n fallbackRawNode = child;\n break;\n }\n }\n \n if (!fallbackRawNode) return;\n \n // Extract SLDS token from the Raw node value\n const fallbackValue = fallbackRawNode.value.trim();\n const varMatch = fallbackValue.match(/var\\(([^,)]+)/);\n if (!varMatch) return;\n \n const sldsToken = varMatch[1];\n \n if (hasUnsupportedFallback(lwcToken, sldsToken)) {\n context.report({\n node,\n messageId: 'unsupportedFallback',\n data: { lwcToken, sldsToken }\n });\n }\n }\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,aAAa,qBAAAA,QAAa,mCAAmC;AACnE,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,uBAAuB,oBAAAC,QAAS;AAKtC,IAAM,eAAe,CAAC,GAAG,qBAAqB,QAAQ,GAAG,qBAAqB,SAAS;AACvF,IAAM,kBAAkB,IAAI,IAAI,YAAY;AAK5C,SAAS,uBAAuB,UAAkB,WAA4B;AAE5E,QAAM,sBAAsB,UAAU,QAAQ,UAAU,SAAS;AAEjE,SAAO,SAAS,WAAW,QAAQ,KAC9B,oBAAoB,WAAW,SAAS,KACxC,gBAAgB,IAAI,mBAAmB;AAC9C;AAEA,IAAO,4CAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,WAAO;AAAA;AAAA,MAEL,kDAAkD,MAAM;AACtD,cAAM,WAAW,KAAK;AAGtB,cAAM,kBAAkB,QAAQ,WAAW,aAAa,IAAI,EAAE,GAAG,EAAE;AACnE,YAAI,CAAC,gBAAiB;AAGtB,cAAM,sBAAuB,gBAAwB;AACrD,YAAI,CAAC,oBAAqB;AAG1B,YAAI,aAAa;AACjB,YAAI,kBAAkB;AAEtB,mBAAW,SAAS,qBAAqB;AACvC,cAAI,MAAM,SAAS,cAAc,MAAM,UAAU,KAAK;AACpD,yBAAa;AACb;AAAA,UACF;AACA,cAAI,cAAc,MAAM,SAAS,OAAO;AACtC,8BAAkB;AAClB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,gBAAiB;AAGtB,cAAM,gBAAgB,gBAAgB,MAAM,KAAK;AACjD,cAAM,WAAW,cAAc,MAAM,eAAe;AACpD,YAAI,CAAC,SAAU;AAEf,cAAM,YAAY,SAAS,CAAC;AAE5B,YAAI,uBAAuB,UAAU,SAAS,GAAG;AAC/C,kBAAQ,OAAO;AAAA,YACb;AAAA,YACA,WAAW;AAAA,YACX,MAAM,EAAE,UAAU,UAAU;AAAA,UAC9B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -32,11 +32,11 @@ __export(no_unsupported_hooks_slds2_exports, {
|
|
|
32
32
|
default: () => no_unsupported_hooks_slds2_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(no_unsupported_hooks_slds2_exports);
|
|
35
|
-
var
|
|
35
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
36
36
|
var import_rule_messages = __toESM(require("../../config/rule-messages"));
|
|
37
37
|
var ruleConfig = import_rule_messages.default["no-unsupported-hooks-slds2"];
|
|
38
38
|
var { type, description, url, messages } = ruleConfig;
|
|
39
|
-
var deprecatedHooks = new Set(
|
|
39
|
+
var deprecatedHooks = new Set(import_sds_metadata.default.deprecatedStylingHooks);
|
|
40
40
|
function shouldIgnoreDetection(sldsHook) {
|
|
41
41
|
return !deprecatedHooks.has(sldsHook);
|
|
42
42
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rules/v9/no-unsupported-hooks-slds2.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages';\n\nconst ruleConfig = ruleMessages['no-unsupported-hooks-slds2'];\nconst { type, description, url, messages } = ruleConfig;\n\nconst deprecatedHooks = new Set(metadata.deprecatedStylingHooks);\n\nfunction shouldIgnoreDetection(sldsHook: string): boolean {\n return !deprecatedHooks.has(sldsHook);\n}\n\nexport default {\n meta: {\n type,\n docs: {\n description,\n recommended: true,\n url,\n },\n messages,\n },\n \n create(context) {\n function reportDeprecatedHook(node, token: string) {\n context.report({\n node,\n messageId: 'deprecated',\n data: { token }\n });\n }\n\n return {\n // Handle CSS custom property declarations (left-side usage): --slds-* properties\n // Example: .THIS { --slds-g-link-color: #f73650; }\n \"Declaration[property=/^--s(lds|ds)-/]\"(node) {\n const property = node.property;\n \n if (shouldIgnoreDetection(property)) {\n return;\n }\n \n reportDeprecatedHook(node, property);\n },\n\n // Handle SLDS/SDS hooks inside var() functions (right-side usage): var(--slds-*)\n // Example: .THIS .demo { border-top: 1px solid var(--slds-g-color-border-brand-1); }\n \"Function[name='var'] Identifier[name=/^--s(lds|ds)-/]\"(node) {\n const tokenName = node.name;\n \n if (shouldIgnoreDetection(tokenName)) {\n return;\n }\n \n reportDeprecatedHook(node, tokenName);\n },\n };\n },\n} as Rule.RuleModule;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAqB;AACrB,2BAAyB;AAEzB,IAAM,aAAa,qBAAAA,QAAa,4BAA4B;AAC5D,IAAM,EAAE,MAAM,aAAa,KAAK,SAAS,IAAI;AAE7C,IAAM,kBAAkB,IAAI,IAAI,oBAAAC,QAAS,sBAAsB;AAE/D,SAAS,sBAAsB,UAA2B;AACxD,SAAO,CAAC,gBAAgB,IAAI,QAAQ;AACtC;AAEA,IAAO,qCAAQ;AAAA,EACb,MAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,SAAS;AACd,aAAS,qBAAqB,MAAM,OAAe;AACjD,cAAQ,OAAO;AAAA,QACb;AAAA,QACA,WAAW;AAAA,QACX,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA;AAAA;AAAA,MAGL,wCAAwC,MAAM;AAC5C,cAAM,WAAW,KAAK;AAEtB,YAAI,sBAAsB,QAAQ,GAAG;AACnC;AAAA,QACF;AAEA,6BAAqB,MAAM,QAAQ;AAAA,MACrC;AAAA;AAAA;AAAA,MAIA,wDAAwD,MAAM;AAC5D,cAAM,YAAY,KAAK;AAEvB,YAAI,sBAAsB,SAAS,GAAG;AACpC;AAAA,QACF;AAEA,6BAAqB,MAAM,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["ruleMessages", "metadata"]
|
|
7
7
|
}
|
package/build/types/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { Rule } from 'eslint';\nimport type { ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata
|
|
4
|
+
"sourcesContent": ["import { Rule } from 'eslint';\nimport type { ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata';\n\n/**\n * Custom mapping for hook replacements\n * Maps hook names to their applicable properties and values\n */\nexport interface CustomHookMapping {\n [hookName: string]: {\n properties: string[];\n values: string[];\n };\n}\n\n/**\n * Options for the no-hardcoded-values rule\n */\nexport interface RuleOptions {\n /**\n * Controls when to report hardcoded numeric values\n * - 'never': Don't report hardcoded numeric values\n * - 'always': Always report hardcoded numeric values (default)\n * - 'hasReplacement': Only report when a replacement hook is available\n */\n reportNumericValue?: 'never' | 'always' | 'hasReplacement';\n \n /**\n * Custom mapping for pre-configured hook replacements\n */\n customMapping?: CustomHookMapping;\n \n /**\n * Prefer palette hooks when multiple replacements are available\n */\n preferPaletteHook?: boolean;\n}\n\n/**\n * Context interface for handlers to access necessary dependencies\n */\nexport interface HandlerContext {\n valueToStylinghook: ValueToStylingHooksMapping;\n context: Rule.RuleContext;\n sourceCode: any;\n options?: RuleOptions;\n}\n\n\n\n/**\n * Configuration for creating the rule\n */\nexport interface RuleConfig {\n ruleConfig: {\n type: 'problem' | 'suggestion' | 'layout';\n description: string;\n url?: string;\n messages: Record<string, string>;\n };\n valueToStylinghook: ValueToStylingHooksMapping;\n}\n\n/**\n * Handler function signature for CSS declarations\n */\nexport type DeclarationHandler = (node: any, context: HandlerContext) => void;"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/color-lib-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { ValueToStylingHooksMapping, ValueToStylingHookEntry } from '@salesforce-ux/sds-metadata
|
|
4
|
+
"sourcesContent": ["import { ValueToStylingHooksMapping, ValueToStylingHookEntry } from '@salesforce-ux/sds-metadata';\nimport chroma from 'chroma-js';\nimport { generate } from '@eslint/css-tree';\nimport { isCssColorFunction } from './css-functions';\n\n/**\n * Perceptual color difference threshold (Delta E, CIEDE2000 via chroma.deltaE).\n * Lower values are stricter matches. Used to decide which hooks are \"close enough\".\n */\nconst DELTAE_THRESHOLD = 10;\n\n/**\n * Convert any valid CSS color (named, hex, rgb(a), hsl(a), etc.) to hex.\n * Returns null if the value is not a valid color.\n */\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\nconst isHookPropertyMatch = (hook: ValueToStylingHookEntry, cssProperty: string): boolean => {\n return hook.properties.includes(cssProperty) || hook.properties.includes(\"*\");\n}\n\nfunction getOrderByCssProp(cssProperty: string): string[] {\n if(cssProperty === 'color' || cssProperty === 'fill') {\n return [\"surface\", \"theme\", \"feedback\", \"reference\"];\n } else if(cssProperty.match(/background/)){\n return [\"surface\", \"surface-inverse\", \"theme\", \"feedback\", \"reference\"];\n } else if(cssProperty.match(/border/) || cssProperty.match(/outline/) || cssProperty.match(/stroke/)) {\n return [\"borders\", \"borders-inverse\", \"feedback\", \"theme\", \"reference\"];\n }\n return [\"surface\", \"surface-inverse\", \"borders\", \"borders-inverse\", \"theme\", \"feedback\", \"reference\"];\n}\n\n\n/**\n * Given an input color and the metadata mapping of supported colors to hooks,\n * suggest up to 5 styling hook names ordered by:\n * 1) Category priority: semantic -> system -> palette\n * 2) Perceptual distance (Delta E)\n * Also prioritizes exact color matches (distance 0).\n */\nconst findClosestColorHook = (\n color: string,\n supportedColors:ValueToStylingHooksMapping,\n cssProperty: string\n): string[] => {\n const closestHooks: Array<{distance: number, group: string, name: string}> = [];\n Object.entries(supportedColors).forEach(([sldsValue, data]) => {\n if (sldsValue && isValidColor(sldsValue)) {\n const hooks = data as ValueToStylingHookEntry[]; // Get the hooks for the sldsValue\n\n hooks.forEach((hook) => {\n // Exact match shortcut to avoid floating rounding noise\n const distance = (sldsValue.toLowerCase() === color.toLowerCase())\n ? 0\n : chroma.deltaE(sldsValue, color);\n \n // Check if the hook has the same property or universal selector\n if (isHookPropertyMatch(hook, cssProperty) && distance <= DELTAE_THRESHOLD) {\n // Add to same property hooks if within threshold\n closestHooks.push({ distance, group: hook.group, name: hook.name });\n }\n });\n }\n });\n\n const hooksByGroupMap:Record<string, string[]> = closestHooks.sort((a, b) => a.distance - b.distance).reduce((acc, hook) => {\n if (!acc[hook.group]) {\n acc[hook.group] = [];\n }\n acc[hook.group].push(hook.name);\n return acc;\n }, {});\n\n return getOrderByCssProp(cssProperty)\n .map(group => hooksByGroupMap[group]||[])\n .flat().slice(0, 5);\n};\n\n/**\n * Check if a value is any valid CSS color string (delegates to chroma-js).\n */\nconst isValidColor = (val:string):boolean => chroma.valid(val);\n\n/**\n * Extract a color string from a CSS AST node produced by @eslint/css-tree.\n * Supports Hash (#rrggbb), Identifier (named colors), and color Function nodes.\n * Returns null if the extracted value is not a valid color.\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, isValidColor, extractColorValue };\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,uBAAmB;AACnB,sBAAyB;AACzB,2BAAmC;AAMnC,IAAM,mBAAmB;AAMzB,IAAM,eAAe,CAAC,UAAiC;AACrD,MAAI;AAEF,eAAO,iBAAAA,SAAO,KAAK,EAAE,IAAI;AAAA,EAC3B,SAAS,GAAG;AAEV,WAAO;AAAA,EACT;AACF;AAEA,IAAM,sBAAsB,CAAC,MAA+B,gBAAiC;AAC3F,SAAO,KAAK,WAAW,SAAS,WAAW,KAAK,KAAK,WAAW,SAAS,GAAG;AAC9E;AAEA,SAAS,kBAAkB,aAA+B;AACxD,MAAG,gBAAgB,WAAW,gBAAgB,QAAQ;AAClD,WAAO,CAAC,WAAW,SAAU,YAAY,WAAW;AAAA,EACxD,WAAU,YAAY,MAAM,YAAY,GAAE;AACvC,WAAO,CAAC,WAAW,mBAAmB,SAAU,YAAY,WAAW;AAAA,EAC1E,WAAU,YAAY,MAAM,QAAQ,KAAK,YAAY,MAAM,SAAS,KAAK,YAAY,MAAM,QAAQ,GAAG;AAClG,WAAO,CAAC,WAAW,mBAAmB,YAAY,SAAS,WAAW;AAAA,EAC1E;AACA,SAAO,CAAC,WAAW,mBAAmB,WAAW,mBAAmB,SAAU,YAAY,WAAW;AACvG;AAUA,IAAM,uBAAuB,CAC3B,OACA,iBACA,gBACa;AACb,QAAM,eAAuE,CAAC;AAC9E,SAAO,QAAQ,eAAe,EAAE,QAAQ,CAAC,CAAC,WAAW,IAAI,MAAM;AAC7D,QAAI,aAAa,aAAa,SAAS,GAAG;AACxC,YAAM,QAAQ;AAEd,YAAM,QAAQ,CAAC,SAAS;AAEtB,cAAM,WAAY,UAAU,YAAY,MAAM,MAAM,YAAY,IAC5D,IACA,iBAAAA,QAAO,OAAO,WAAW,KAAK;AAGlC,YAAI,oBAAoB,MAAM,WAAW,KAAK,YAAY,kBAAkB;AAE1E,uBAAa,KAAK,EAAE,UAAU,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AAAA,QACpE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,kBAA2C,aAAa,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,SAAS;AAC1H,QAAI,CAAC,IAAI,KAAK,KAAK,GAAG;AACpB,UAAI,KAAK,KAAK,IAAI,CAAC;AAAA,IACrB;AACA,QAAI,KAAK,KAAK,EAAE,KAAK,KAAK,IAAI;AAC9B,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO,kBAAkB,WAAW,EACjC,IAAI,WAAS,gBAAgB,KAAK,KAAG,CAAC,CAAC,EACvC,KAAK,EAAE,MAAM,GAAG,CAAC;AACtB;AAKA,IAAM,eAAe,CAAC,QAAuB,iBAAAA,QAAO,MAAM,GAAG;AAO7D,IAAM,oBAAoB,CAAC,SAA6B;AACtD,MAAI,aAA4B;AAEhC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,mBAAa,IAAI,KAAK,KAAK;AAC3B;AAAA,IACF,KAAK;AACH,mBAAa,KAAK;AAClB;AAAA,IACF,KAAK;AAEH,cAAI,yCAAmB,KAAK,IAAI,GAAG;AACjC,yBAAa,0BAAS,IAAI;AAAA,MAC5B;AACA;AAAA,EACJ;AAEA,SAAO,cAAc,aAAa,UAAU,IAAI,aAAa;AAC/D;",
|
|
6
6
|
"names": ["chroma"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/styling-hook-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ValueToStylingHookEntry, ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata
|
|
4
|
+
"sourcesContent": ["import type { ValueToStylingHookEntry, ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata';\nimport { ParsedUnitValue, parseUnitValue, toAlternateUnitValue } from './value-utils';\n\nfunction isValueMatch(valueToMatch: ParsedUnitValue, sldsValue: ParsedUnitValue): boolean {\n if (!valueToMatch || !sldsValue) {\n return false;\n }\n return valueToMatch.unit == sldsValue.unit && valueToMatch.value === sldsValue.value;\n}\n\n/**\n * Check if a parsed value is a keyword (string) rather than a numeric value\n */\nfunction isKeywordValue(parsedValue: ParsedUnitValue): parsedValue is { value: string; unit: null } {\n return parsedValue !== null && typeof parsedValue.value === 'string';\n}\n\n/**\n * Get styling hooks for a density value using structured data from CSS AST\n * Eliminates regex parsing by accepting pre-parsed dimension data\n */\nexport function getStylingHooksForDensityValue(\n parsedValue: ParsedUnitValue,\n supportedStylinghooks: ValueToStylingHooksMapping,\n cssProperty: string\n): string[] {\n if (!parsedValue) return [];\n \n const matchedHooks: string[] = [];\n\n // Handle keyword values (e.g., 'bold', 'normal') with direct string match\n if (isKeywordValue(parsedValue)) {\n const keywordLower = parsedValue.value.toLowerCase();\n for (const [sldsValue, hooks] of Object.entries(supportedStylinghooks)) {\n if (sldsValue.toLowerCase() === keywordLower) {\n hooks\n .filter((hook: ValueToStylingHookEntry) => hook.properties.includes(cssProperty))\n .forEach((hook) => matchedHooks.push(hook.name));\n }\n }\n return matchedHooks;\n }\n\n // Handle numeric values with unit conversion\n const alternateValue = typeof parsedValue.value === 'number' \n ? toAlternateUnitValue(parsedValue.value, parsedValue.unit)\n : null;\n\n for (const [sldsValue, hooks] of Object.entries(supportedStylinghooks)) {\n const parsedSldsValue = parseUnitValue(sldsValue);\n if (isValueMatch(parsedValue, parsedSldsValue) || (alternateValue && isValueMatch(alternateValue, parsedSldsValue))) {\n hooks\n .filter((hook: ValueToStylingHookEntry) => hook.properties.includes(cssProperty))\n .forEach((hook) => matchedHooks.push(hook.name));\n }\n }\n return matchedHooks;\n}"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAAsE;AAEtE,SAAS,aAAa,cAA+B,WAAqC;AACxF,MAAI,CAAC,gBAAgB,CAAC,WAAW;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,aAAa,QAAQ,UAAU,QAAQ,aAAa,UAAU,UAAU;AACjF;AAKA,SAAS,eAAe,aAA4E;AAClG,SAAO,gBAAgB,QAAQ,OAAO,YAAY,UAAU;AAC9D;AAMO,SAAS,+BACd,aACA,uBACA,aACU;AACV,MAAI,CAAC,YAAa,QAAO,CAAC;AAE1B,QAAM,eAAyB,CAAC;AAGhC,MAAI,eAAe,WAAW,GAAG;AAC/B,UAAM,eAAe,YAAY,MAAM,YAAY;AACnD,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,qBAAqB,GAAG;AACtE,UAAI,UAAU,YAAY,MAAM,cAAc;AAC5C,cACG,OAAO,CAAC,SAAkC,KAAK,WAAW,SAAS,WAAW,CAAC,EAC/E,QAAQ,CAAC,SAAS,aAAa,KAAK,KAAK,IAAI,CAAC;AAAA,MACnD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiB,OAAO,YAAY,UAAU,eAChD,yCAAqB,YAAY,OAAO,YAAY,IAAI,IACxD;AAEJ,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,qBAAqB,GAAG;AACtE,UAAM,sBAAkB,mCAAe,SAAS;AAChD,QAAI,aAAa,aAAa,eAAe,KAAM,kBAAkB,aAAa,gBAAgB,eAAe,GAAI;AACnH,YACG,OAAO,CAAC,SAAkC,KAAK,WAAW,SAAS,WAAW,CAAC,EAC/E,QAAQ,CAAC,SAAS,aAAa,KAAK,KAAK,IAAI,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|