@salesforce-ux/eslint-plugin-slds 1.0.4-internal → 1.0.5
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 +108 -140
- package/build/index.js.map +4 -4
- package/build/rules/enforce-bem-usage.js +5 -5
- package/build/rules/enforce-bem-usage.js.map +4 -4
- package/build/rules/modal-close-button-issue.js.map +1 -1
- package/build/rules/no-deprecated-classes-slds2.js +2 -2
- package/build/rules/no-deprecated-classes-slds2.js.map +3 -3
- package/build/rules/v9/enforce-bem-usage.js +2 -2
- package/build/rules/v9/enforce-bem-usage.js.map +3 -3
- package/build/rules/v9/enforce-component-hook-naming-convention.js +2 -2
- package/build/rules/v9/enforce-component-hook-naming-convention.js.map +3 -3
- package/build/rules/v9/enforce-sds-to-slds-hooks.js +2 -2
- package/build/rules/v9/enforce-sds-to-slds-hooks.js.map +3 -3
- package/build/rules/v9/lwc-token-to-slds-hook.js +119 -97
- package/build/rules/v9/lwc-token-to-slds-hook.js.map +3 -3
- package/build/rules/v9/no-deprecated-slds-classes.js +2 -2
- package/build/rules/v9/no-deprecated-slds-classes.js.map +3 -3
- package/build/rules/v9/no-deprecated-tokens-slds1.js +2 -2
- package/build/rules/v9/no-deprecated-tokens-slds1.js.map +3 -3
- package/build/rules/v9/no-hardcoded-values/handlers/boxShadowHandler.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/handlers/colorHandler.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/handlers/densityHandler.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/handlers/fontHandler.js.map +2 -2
- package/build/rules/v9/no-hardcoded-values/handlers/index.js.map +2 -2
- 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 +3 -3
- 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 +3 -3
- package/build/rules/v9/no-hardcoded-values/noHardcodedValueRule.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 +3 -3
- 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 +3 -3
- package/build/rules/v9/no-slds-private-var.js.map +1 -1
- package/build/rules/v9/no-slds-var-without-fallback.js +2 -2
- package/build/rules/v9/no-slds-var-without-fallback.js.map +3 -3
- package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js +2 -2
- package/build/rules/v9/no-sldshook-fallback-for-lwctoken.js.map +3 -3
- package/build/rules/v9/no-unsupported-hooks-slds2.js +2 -2
- package/build/rules/v9/no-unsupported-hooks-slds2.js.map +3 -3
- package/build/rules/v9/reduce-annotations.js.map +1 -1
- package/build/src/utils/css-utils.d.ts +5 -0
- package/build/types/index.js.map +1 -1
- package/build/utils/boxShadowValueParser.js.map +1 -1
- package/build/utils/color-lib-utils.js.map +1 -1
- package/build/utils/css-utils.js +14 -0
- package/build/utils/css-utils.js.map +2 -2
- package/build/utils/hardcoded-shared-utils.js.map +1 -1
- package/build/utils/styling-hook-utils.js.map +1 -1
- package/eslint.config.mjs +6 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["rule-messages.yml", "../../../src/rules/v9/enforce-component-hook-naming-convention.ts"],
|
|
4
|
-
"sourcesContent": ["module.exports = {\n \"no-slds-class-overrides\": {\n \"description\": \"Create new custom CSS classes instead of overriding SLDS selectors\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-class-overrides\",\n \"type\": \"problem\",\n \"messages\": {\n \"sldsClassOverride\": \"Overriding .{{className}} isn't supported. To differentiate SLDS and custom classes, create a CSS class in your namespace. Examples: myapp-input, myapp-button.\"\n }\n },\n \"no-deprecated-slds-classes\": {\n \"description\": \"Please replace the deprecated classes with a modern equivalent\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-slds-classes\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} is deprecated and not available in SLDS2. Please update to a supported class.\"\n }\n },\n \"no-deprecated-tokens-slds1\": {\n \"description\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-tokens-slds1\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedToken\": \"Consider removing {{oldValue}} or replacing it with {{newValue}}. Set the fallback to {{oldValue}}. For more info, see Styling Hooks on lightningdesignsystem.com.\",\n \"noReplacement\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\"\n }\n },\n \"enforce-sds-to-slds-hooks\": {\n \"description\": \"Convert your existing --sds styling hooks to --slds styling hooks. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-sds-to-slds-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"replaceSdsWithSlds\": \"Replace {{oldValue}} with {{suggestedMatch}} styling hook.\"\n }\n },\n \"enforce-bem-usage\": {\n \"description\": \"Replace BEM double-dash syntax in class names with single underscore syntax\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-bem-usage\",\n \"type\": \"problem\",\n \"messages\": {\n \"bemDoubleDash\": \"{{actual}} has been retired. Update it to the new name {{newValue}}.\",\n \"fixBemNaming\": \"Update to correct BEM naming convention\"\n }\n },\n \"modal-close-button-issue\": {\n \"description\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#modal-close-button-issue\",\n \"type\": \"problem\",\n \"messages\": {\n \"modalCloseButtonIssue\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint.\",\n \"removeClass\": \"Remove the slds-button_icon-inverse class from the modal close button in components that use the SLDS modal blueprint.\",\n \"changeVariant\": \"Change the variant attribute value from bare-inverse to bare in <lightning-button-icon> or <lightning-icon>.\",\n \"removeVariant\": \"Remove the variant attribute from the <lightning-icon> component inside the <button> element.\",\n \"ensureButtonClasses\": \"Add or move slds-button and slds-button_icon to the class attribute of the <button> element or <lightning-button-icon> component.\",\n \"ensureSizeAttribute\": \"To size icons properly, set the size attribute \u200Cto large in the <lightning-icon> and <lightning-button-icon> components.\"\n }\n },\n \"no-deprecated-classes-slds2\": {\n \"description\": \"Replace classes that aren't available with SLDS 2 classes\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-classes-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\n \"updateToModernClass\": \"Replace deprecated class with modern equivalent\",\n \"checkDocumentation\": \"See lightningdesignsystem.com for SLDS 2 class alternatives\"\n }\n },\n \"lwc-token-to-slds-hook\": {\n \"description\": \"Replace the deprecated --lwc tokens with the latest --slds tokens. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#lwc-token-to-slds-hook\",\n \"type\": \"problem\",\n \"messages\": {\n \"errorWithReplacement\": \"The '{{oldValue}}' design token is deprecated. Replace it with '{{newValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithStyleHooks\": \"The '{{oldValue}}' design token is deprecated. Replace it with the SLDS 2 '{{newValue}}' styling hook and set the fallback to '{{oldValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithNoRecommendation\": \"The '{{oldValue}}' design token is deprecated. For more info, see the New Global Styling Hook Guidance on lightningdesignsystem.com.\"\n }\n },\n \"no-sldshook-fallback-for-lwctoken\": {\n \"description\": \"Avoid using --slds styling hooks as fallback values for --lwc tokens.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-sldshook-fallback-for-lwctoken\",\n \"type\": \"problem\",\n \"messages\": {\n \"unsupportedFallback\": \"Remove the {{sldsToken}} styling hook that is used as a fallback value for {{lwcToken}}.\"\n }\n },\n \"no-unsupported-hooks-slds2\": {\n \"description\": \"Identifies styling hooks that aren't present in SLDS 2. They must be replaced with styling hooks that have a similar effect, or they must be removed.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-unsupported-hooks-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecated\": \"The {{token}} styling hook isn't present in SLDS 2 and there's no equivalent replacement. Remove it or replace it with a styling hook with a similar effect.\"\n }\n },\n \"no-slds-var-without-fallback\": {\n \"description\": \"Add fallback values to SLDS styling hooks. The fallback values are used in Salesforce environments where styling hooks are unavailable.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-var-without-fallback\",\n \"type\": \"problem\",\n \"messages\": {\n \"varWithoutFallback\": \"Your code uses the {{cssVar}} styling hook without a fallback value. Styling hooks are unavailable in some Salesforce environments. To render your component correctly in all environments, add this fallback value: var({{cssVar}}, {{recommendation}}). To make this fallback value brand-aware, use a branded design token instead of a static value. See Design Tokens on v1.lightningdesignsystem.com.\"\n }\n },\n \"no-slds-namespace-for-custom-hooks\": {\n \"description\": \"To differentiate custom styling hooks from SLDS styling hooks, create custom styling hooks in your namespace.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-namespace-for-custom-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"customHookNamespace\": \"Using the --slds namespace for {{token}} isn't supported. Create the custom styling hook in your namespace. Example: --myapp-{{tokenWithoutNamespace}}\"\n }\n },\n \"no-slds-private-var\": {\n \"description\": \"Some SLDS styling hooks are private and reserved only for internal Salesforce use. Private SLDS styling hooks have prefixes --_slds- and --slds-s-. For more information, look up private CSS in lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-private-var\",\n \"type\": \"problem\",\n \"messages\": {\n \"privateVar\": \"This styling hook is reserved for internal Salesforce use. Remove the --_slds- or \u2013slds-s private variable within selector {{prop}}. For more information, look up private CSS in lightningdesignsystem.com.\"\n }\n },\n \"enforce-component-hook-naming-convention\": {\n \"description\": \"Replace component styling hooks that use a deprecated naming convention.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-component-hook-naming-convention\",\n \"type\": \"problem\",\n \"messages\": {\n \"replace\": \"Replace the deprecated {{oldValue}} component styling hook with {{suggestedMatch}}.\"\n }\n },\n \"no-hardcoded-values-slds1\": {\n \"description\": \"Replace static values with SLDS 1 design tokens. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-value\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Replace the {{oldValue}} static value with an SLDS 1 styling hook: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"no-hardcoded-values-slds2\": {\n \"description\": \"Replace static values with SLDS 2 styling hooks. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-values-slds2\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Consider replacing the {{oldValue}} static value with an SLDS 2 styling hook that has a similar value: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"reduce-annotations\": {\n \"description\": \"Remove your annotations and update your code.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#reduce-annotations\",\n \"type\": \"problem\",\n \"messages\": {\n \"removeAnnotation\": \"Remove this annotation and update the code to SLDS best practices. For help, file an issue at https://github.com/salesforce-ux/slds-linter/\"\n }\n }\n};", "import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata/next';\nimport ruleMessages from '../../config/rule-messages.yml';\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": "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
|
|
3
|
+
"sources": ["yaml-file:rule-messages.yml", "../../../src/rules/v9/enforce-component-hook-naming-convention.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = {\n \"no-slds-class-overrides\": {\n \"description\": \"Create new custom CSS classes instead of overriding SLDS selectors\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-class-overrides\",\n \"type\": \"problem\",\n \"messages\": {\n \"sldsClassOverride\": \"Overriding .{{className}} isn't supported. To differentiate SLDS and custom classes, create a CSS class in your namespace. Examples: myapp-input, myapp-button.\"\n }\n },\n \"no-deprecated-slds-classes\": {\n \"description\": \"Please replace the deprecated classes with a modern equivalent\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-slds-classes\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} is deprecated and not available in SLDS2. Please update to a supported class.\"\n }\n },\n \"no-deprecated-tokens-slds1\": {\n \"description\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-tokens-slds1\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedToken\": \"Consider removing {{oldValue}} or replacing it with {{newValue}}. Set the fallback to {{oldValue}}. For more info, see Styling Hooks on lightningdesignsystem.com.\",\n \"noReplacement\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\"\n }\n },\n \"enforce-sds-to-slds-hooks\": {\n \"description\": \"Convert your existing --sds styling hooks to --slds styling hooks. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-sds-to-slds-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"replaceSdsWithSlds\": \"Replace {{oldValue}} with {{suggestedMatch}} styling hook.\"\n }\n },\n \"enforce-bem-usage\": {\n \"description\": \"Replace BEM double-dash syntax in class names with single underscore syntax\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-bem-usage\",\n \"type\": \"problem\",\n \"messages\": {\n \"bemDoubleDash\": \"{{actual}} has been retired. Update it to the new name {{newValue}}.\",\n \"fixBemNaming\": \"Update to correct BEM naming convention\"\n }\n },\n \"modal-close-button-issue\": {\n \"description\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#modal-close-button-issue\",\n \"type\": \"problem\",\n \"messages\": {\n \"modalCloseButtonIssue\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint.\",\n \"removeClass\": \"Remove the slds-button_icon-inverse class from the modal close button in components that use the SLDS modal blueprint.\",\n \"changeVariant\": \"Change the variant attribute value from bare-inverse to bare in <lightning-button-icon> or <lightning-icon>.\",\n \"removeVariant\": \"Remove the variant attribute from the <lightning-icon> component inside the <button> element.\",\n \"ensureButtonClasses\": \"Add or move slds-button and slds-button_icon to the class attribute of the <button> element or <lightning-button-icon> component.\",\n \"ensureSizeAttribute\": \"To size icons properly, set the size attribute \u200Cto large in the <lightning-icon> and <lightning-button-icon> components.\"\n }\n },\n \"no-deprecated-classes-slds2\": {\n \"description\": \"Replace classes that aren't available with SLDS 2 classes\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-classes-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\n \"updateToModernClass\": \"Replace deprecated class with modern equivalent\",\n \"checkDocumentation\": \"See lightningdesignsystem.com for SLDS 2 class alternatives\"\n }\n },\n \"lwc-token-to-slds-hook\": {\n \"description\": \"Replace the deprecated --lwc tokens with the latest --slds tokens. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#lwc-token-to-slds-hook\",\n \"type\": \"problem\",\n \"messages\": {\n \"errorWithReplacement\": \"The '{{oldValue}}' design token is deprecated. Replace it with '{{newValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithStyleHooks\": \"The '{{oldValue}}' design token is deprecated. Replace it with the SLDS 2 '{{newValue}}' styling hook and set the fallback to '{{oldValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithNoRecommendation\": \"The '{{oldValue}}' design token is deprecated. For more info, see the New Global Styling Hook Guidance on lightningdesignsystem.com.\"\n }\n },\n \"no-sldshook-fallback-for-lwctoken\": {\n \"description\": \"Avoid using --slds styling hooks as fallback values for --lwc tokens.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-sldshook-fallback-for-lwctoken\",\n \"type\": \"problem\",\n \"messages\": {\n \"unsupportedFallback\": \"Remove the {{sldsToken}} styling hook that is used as a fallback value for {{lwcToken}}.\"\n }\n },\n \"no-unsupported-hooks-slds2\": {\n \"description\": \"Identifies styling hooks that aren't present in SLDS 2. They must be replaced with styling hooks that have a similar effect, or they must be removed.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-unsupported-hooks-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecated\": \"The {{token}} styling hook isn't present in SLDS 2 and there's no equivalent replacement. Remove it or replace it with a styling hook with a similar effect.\"\n }\n },\n \"no-slds-var-without-fallback\": {\n \"description\": \"Add fallback values to SLDS styling hooks. The fallback values are used in Salesforce environments where styling hooks are unavailable.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-var-without-fallback\",\n \"type\": \"problem\",\n \"messages\": {\n \"varWithoutFallback\": \"Your code uses the {{cssVar}} styling hook without a fallback value. Styling hooks are unavailable in some Salesforce environments. To render your component correctly in all environments, add this fallback value: var({{cssVar}}, {{recommendation}}). To make this fallback value brand-aware, use a branded design token instead of a static value. See Design Tokens on v1.lightningdesignsystem.com.\"\n }\n },\n \"no-slds-namespace-for-custom-hooks\": {\n \"description\": \"To differentiate custom styling hooks from SLDS styling hooks, create custom styling hooks in your namespace.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-namespace-for-custom-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"customHookNamespace\": \"Using the --slds namespace for {{token}} isn't supported. Create the custom styling hook in your namespace. Example: --myapp-{{tokenWithoutNamespace}}\"\n }\n },\n \"no-slds-private-var\": {\n \"description\": \"Some SLDS styling hooks are private and reserved only for internal Salesforce use. Private SLDS styling hooks have prefixes --_slds- and --slds-s-. For more information, look up private CSS in lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-private-var\",\n \"type\": \"problem\",\n \"messages\": {\n \"privateVar\": \"This styling hook is reserved for internal Salesforce use. Remove the --_slds- or \u2013slds-s private variable within selector {{prop}}. For more information, look up private CSS in lightningdesignsystem.com.\"\n }\n },\n \"enforce-component-hook-naming-convention\": {\n \"description\": \"Replace component styling hooks that use a deprecated naming convention.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-component-hook-naming-convention\",\n \"type\": \"problem\",\n \"messages\": {\n \"replace\": \"Replace the deprecated {{oldValue}} component styling hook with {{suggestedMatch}}.\"\n }\n },\n \"no-hardcoded-values-slds1\": {\n \"description\": \"Replace static values with SLDS 1 design tokens. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-value\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Replace the {{oldValue}} static value with an SLDS 1 styling hook: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"no-hardcoded-values-slds2\": {\n \"description\": \"Replace static values with SLDS 2 styling hooks. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-values-slds2\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Consider replacing the {{oldValue}} static value with an SLDS 2 styling hook that has a similar value: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"reduce-annotations\": {\n \"description\": \"Remove your annotations and update your code.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#reduce-annotations\",\n \"type\": \"problem\",\n \"messages\": {\n \"removeAnnotation\": \"Remove this annotation and update the code to SLDS best practices. For help, file an issue at https://github.com/salesforce-ux/slds-linter/\"\n }\n }\n};", "import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages.yml';\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": "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",
|
|
6
6
|
"names": ["exports", "module", "ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -192,11 +192,11 @@ __export(enforce_sds_to_slds_hooks_exports, {
|
|
|
192
192
|
default: () => enforce_sds_to_slds_hooks_default
|
|
193
193
|
});
|
|
194
194
|
module.exports = __toCommonJS(enforce_sds_to_slds_hooks_exports);
|
|
195
|
-
var
|
|
195
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
196
196
|
var import_rule_messages = __toESM(require_rule_messages());
|
|
197
197
|
var ruleConfig = import_rule_messages.default["enforce-sds-to-slds-hooks"];
|
|
198
198
|
var { type, description, url, messages } = ruleConfig;
|
|
199
|
-
var sldsPlusStylingHooks =
|
|
199
|
+
var sldsPlusStylingHooks = import_sds_metadata.default.sldsPlusStylingHooks;
|
|
200
200
|
var allSldsHooks = [...sldsPlusStylingHooks.global, ...sldsPlusStylingHooks.component];
|
|
201
201
|
var toSldsToken = (sdsToken) => sdsToken.replace("--sds-", "--slds-");
|
|
202
202
|
function shouldIgnoreDetection(sdsToken) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["rule-messages.yml", "../../../src/rules/v9/enforce-sds-to-slds-hooks.ts"],
|
|
4
|
-
"sourcesContent": ["module.exports = {\n \"no-slds-class-overrides\": {\n \"description\": \"Create new custom CSS classes instead of overriding SLDS selectors\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-class-overrides\",\n \"type\": \"problem\",\n \"messages\": {\n \"sldsClassOverride\": \"Overriding .{{className}} isn't supported. To differentiate SLDS and custom classes, create a CSS class in your namespace. Examples: myapp-input, myapp-button.\"\n }\n },\n \"no-deprecated-slds-classes\": {\n \"description\": \"Please replace the deprecated classes with a modern equivalent\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-slds-classes\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} is deprecated and not available in SLDS2. Please update to a supported class.\"\n }\n },\n \"no-deprecated-tokens-slds1\": {\n \"description\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-tokens-slds1\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedToken\": \"Consider removing {{oldValue}} or replacing it with {{newValue}}. Set the fallback to {{oldValue}}. For more info, see Styling Hooks on lightningdesignsystem.com.\",\n \"noReplacement\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\"\n }\n },\n \"enforce-sds-to-slds-hooks\": {\n \"description\": \"Convert your existing --sds styling hooks to --slds styling hooks. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-sds-to-slds-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"replaceSdsWithSlds\": \"Replace {{oldValue}} with {{suggestedMatch}} styling hook.\"\n }\n },\n \"enforce-bem-usage\": {\n \"description\": \"Replace BEM double-dash syntax in class names with single underscore syntax\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-bem-usage\",\n \"type\": \"problem\",\n \"messages\": {\n \"bemDoubleDash\": \"{{actual}} has been retired. Update it to the new name {{newValue}}.\",\n \"fixBemNaming\": \"Update to correct BEM naming convention\"\n }\n },\n \"modal-close-button-issue\": {\n \"description\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#modal-close-button-issue\",\n \"type\": \"problem\",\n \"messages\": {\n \"modalCloseButtonIssue\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint.\",\n \"removeClass\": \"Remove the slds-button_icon-inverse class from the modal close button in components that use the SLDS modal blueprint.\",\n \"changeVariant\": \"Change the variant attribute value from bare-inverse to bare in <lightning-button-icon> or <lightning-icon>.\",\n \"removeVariant\": \"Remove the variant attribute from the <lightning-icon> component inside the <button> element.\",\n \"ensureButtonClasses\": \"Add or move slds-button and slds-button_icon to the class attribute of the <button> element or <lightning-button-icon> component.\",\n \"ensureSizeAttribute\": \"To size icons properly, set the size attribute \u200Cto large in the <lightning-icon> and <lightning-button-icon> components.\"\n }\n },\n \"no-deprecated-classes-slds2\": {\n \"description\": \"Replace classes that aren't available with SLDS 2 classes\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-classes-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\n \"updateToModernClass\": \"Replace deprecated class with modern equivalent\",\n \"checkDocumentation\": \"See lightningdesignsystem.com for SLDS 2 class alternatives\"\n }\n },\n \"lwc-token-to-slds-hook\": {\n \"description\": \"Replace the deprecated --lwc tokens with the latest --slds tokens. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#lwc-token-to-slds-hook\",\n \"type\": \"problem\",\n \"messages\": {\n \"errorWithReplacement\": \"The '{{oldValue}}' design token is deprecated. Replace it with '{{newValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithStyleHooks\": \"The '{{oldValue}}' design token is deprecated. Replace it with the SLDS 2 '{{newValue}}' styling hook and set the fallback to '{{oldValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithNoRecommendation\": \"The '{{oldValue}}' design token is deprecated. For more info, see the New Global Styling Hook Guidance on lightningdesignsystem.com.\"\n }\n },\n \"no-sldshook-fallback-for-lwctoken\": {\n \"description\": \"Avoid using --slds styling hooks as fallback values for --lwc tokens.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-sldshook-fallback-for-lwctoken\",\n \"type\": \"problem\",\n \"messages\": {\n \"unsupportedFallback\": \"Remove the {{sldsToken}} styling hook that is used as a fallback value for {{lwcToken}}.\"\n }\n },\n \"no-unsupported-hooks-slds2\": {\n \"description\": \"Identifies styling hooks that aren't present in SLDS 2. They must be replaced with styling hooks that have a similar effect, or they must be removed.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-unsupported-hooks-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecated\": \"The {{token}} styling hook isn't present in SLDS 2 and there's no equivalent replacement. Remove it or replace it with a styling hook with a similar effect.\"\n }\n },\n \"no-slds-var-without-fallback\": {\n \"description\": \"Add fallback values to SLDS styling hooks. The fallback values are used in Salesforce environments where styling hooks are unavailable.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-var-without-fallback\",\n \"type\": \"problem\",\n \"messages\": {\n \"varWithoutFallback\": \"Your code uses the {{cssVar}} styling hook without a fallback value. Styling hooks are unavailable in some Salesforce environments. To render your component correctly in all environments, add this fallback value: var({{cssVar}}, {{recommendation}}). To make this fallback value brand-aware, use a branded design token instead of a static value. See Design Tokens on v1.lightningdesignsystem.com.\"\n }\n },\n \"no-slds-namespace-for-custom-hooks\": {\n \"description\": \"To differentiate custom styling hooks from SLDS styling hooks, create custom styling hooks in your namespace.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-namespace-for-custom-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"customHookNamespace\": \"Using the --slds namespace for {{token}} isn't supported. Create the custom styling hook in your namespace. Example: --myapp-{{tokenWithoutNamespace}}\"\n }\n },\n \"no-slds-private-var\": {\n \"description\": \"Some SLDS styling hooks are private and reserved only for internal Salesforce use. Private SLDS styling hooks have prefixes --_slds- and --slds-s-. For more information, look up private CSS in lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-private-var\",\n \"type\": \"problem\",\n \"messages\": {\n \"privateVar\": \"This styling hook is reserved for internal Salesforce use. Remove the --_slds- or \u2013slds-s private variable within selector {{prop}}. For more information, look up private CSS in lightningdesignsystem.com.\"\n }\n },\n \"enforce-component-hook-naming-convention\": {\n \"description\": \"Replace component styling hooks that use a deprecated naming convention.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-component-hook-naming-convention\",\n \"type\": \"problem\",\n \"messages\": {\n \"replace\": \"Replace the deprecated {{oldValue}} component styling hook with {{suggestedMatch}}.\"\n }\n },\n \"no-hardcoded-values-slds1\": {\n \"description\": \"Replace static values with SLDS 1 design tokens. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-value\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Replace the {{oldValue}} static value with an SLDS 1 styling hook: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"no-hardcoded-values-slds2\": {\n \"description\": \"Replace static values with SLDS 2 styling hooks. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-values-slds2\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Consider replacing the {{oldValue}} static value with an SLDS 2 styling hook that has a similar value: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"reduce-annotations\": {\n \"description\": \"Remove your annotations and update your code.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#reduce-annotations\",\n \"type\": \"problem\",\n \"messages\": {\n \"removeAnnotation\": \"Remove this annotation and update the code to SLDS best practices. For help, file an issue at https://github.com/salesforce-ux/slds-linter/\"\n }\n }\n};", "import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata/next';\nimport ruleMessages from '../../config/rule-messages.yml';\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,gCAAAA,UAAAC,SAAA;AAAA,IAAAA,QAAO,UAAU;AAAA,MACf,2BAA2B;AAAA,QACzB,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,qBAAqB;AAAA,QACvB;AAAA,MACF;AAAA,MACA,8BAA8B;AAAA,QAC5B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,MACA,8BAA8B;AAAA,QAC5B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,mBAAmB;AAAA,UACnB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,6BAA6B;AAAA,QAC3B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,qBAAqB;AAAA,QACnB,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,4BAA4B;AAAA,QAC1B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,yBAAyB;AAAA,UACzB,eAAe;AAAA,UACf,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,UACvB,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,MACA,+BAA+B;AAAA,QAC7B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,mBAAmB;AAAA,UACnB,uBAAuB;AAAA,UACvB,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,0BAA0B;AAAA,QACxB,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,wBAAwB;AAAA,UACxB,uBAAuB;AAAA,UACvB,6BAA6B;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,qCAAqC;AAAA,QACnC,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,MACA,8BAA8B;AAAA,QAC5B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MACA,gCAAgC;AAAA,QAC9B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,sCAAsC;AAAA,QACpC,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,QACrB,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MACA,4CAA4C;AAAA,QAC1C,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,6BAA6B;AAAA,QAC3B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,6BAA6B;AAAA,QAC3B,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,QACpB,eAAe;AAAA,QACf,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,oBAAoB;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACtJA;AAAA;AAAA;AAAA;AAAA;AACA,
|
|
3
|
+
"sources": ["yaml-file:rule-messages.yml", "../../../src/rules/v9/enforce-sds-to-slds-hooks.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = {\n \"no-slds-class-overrides\": {\n \"description\": \"Create new custom CSS classes instead of overriding SLDS selectors\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-class-overrides\",\n \"type\": \"problem\",\n \"messages\": {\n \"sldsClassOverride\": \"Overriding .{{className}} isn't supported. To differentiate SLDS and custom classes, create a CSS class in your namespace. Examples: myapp-input, myapp-button.\"\n }\n },\n \"no-deprecated-slds-classes\": {\n \"description\": \"Please replace the deprecated classes with a modern equivalent\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-slds-classes\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} is deprecated and not available in SLDS2. Please update to a supported class.\"\n }\n },\n \"no-deprecated-tokens-slds1\": {\n \"description\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-tokens-slds1\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedToken\": \"Consider removing {{oldValue}} or replacing it with {{newValue}}. Set the fallback to {{oldValue}}. For more info, see Styling Hooks on lightningdesignsystem.com.\",\n \"noReplacement\": \"Update outdated design tokens to SLDS 2 styling hooks with similar values. For more information, see Styling Hooks on lightningdesignsystem.com.\"\n }\n },\n \"enforce-sds-to-slds-hooks\": {\n \"description\": \"Convert your existing --sds styling hooks to --slds styling hooks. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-sds-to-slds-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"replaceSdsWithSlds\": \"Replace {{oldValue}} with {{suggestedMatch}} styling hook.\"\n }\n },\n \"enforce-bem-usage\": {\n \"description\": \"Replace BEM double-dash syntax in class names with single underscore syntax\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-bem-usage\",\n \"type\": \"problem\",\n \"messages\": {\n \"bemDoubleDash\": \"{{actual}} has been retired. Update it to the new name {{newValue}}.\",\n \"fixBemNaming\": \"Update to correct BEM naming convention\"\n }\n },\n \"modal-close-button-issue\": {\n \"description\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#modal-close-button-issue\",\n \"type\": \"problem\",\n \"messages\": {\n \"modalCloseButtonIssue\": \"Update component attributes or CSS classes for the modal close button to comply with the modal component blueprint.\",\n \"removeClass\": \"Remove the slds-button_icon-inverse class from the modal close button in components that use the SLDS modal blueprint.\",\n \"changeVariant\": \"Change the variant attribute value from bare-inverse to bare in <lightning-button-icon> or <lightning-icon>.\",\n \"removeVariant\": \"Remove the variant attribute from the <lightning-icon> component inside the <button> element.\",\n \"ensureButtonClasses\": \"Add or move slds-button and slds-button_icon to the class attribute of the <button> element or <lightning-button-icon> component.\",\n \"ensureSizeAttribute\": \"To size icons properly, set the size attribute \u200Cto large in the <lightning-icon> and <lightning-button-icon> components.\"\n }\n },\n \"no-deprecated-classes-slds2\": {\n \"description\": \"Replace classes that aren't available with SLDS 2 classes\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-deprecated-classes-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecatedClass\": \"The class {{className}} isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\n \"updateToModernClass\": \"Replace deprecated class with modern equivalent\",\n \"checkDocumentation\": \"See lightningdesignsystem.com for SLDS 2 class alternatives\"\n }\n },\n \"lwc-token-to-slds-hook\": {\n \"description\": \"Replace the deprecated --lwc tokens with the latest --slds tokens. See lightningdesignsystem.com for more info.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#lwc-token-to-slds-hook\",\n \"type\": \"problem\",\n \"messages\": {\n \"errorWithReplacement\": \"The '{{oldValue}}' design token is deprecated. Replace it with '{{newValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithStyleHooks\": \"The '{{oldValue}}' design token is deprecated. Replace it with the SLDS 2 '{{newValue}}' styling hook and set the fallback to '{{oldValue}}'. For more info, see Global Styling Hooks on lightningdesignsystem.com.\",\n \"errorWithNoRecommendation\": \"The '{{oldValue}}' design token is deprecated. For more info, see the New Global Styling Hook Guidance on lightningdesignsystem.com.\"\n }\n },\n \"no-sldshook-fallback-for-lwctoken\": {\n \"description\": \"Avoid using --slds styling hooks as fallback values for --lwc tokens.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-sldshook-fallback-for-lwctoken\",\n \"type\": \"problem\",\n \"messages\": {\n \"unsupportedFallback\": \"Remove the {{sldsToken}} styling hook that is used as a fallback value for {{lwcToken}}.\"\n }\n },\n \"no-unsupported-hooks-slds2\": {\n \"description\": \"Identifies styling hooks that aren't present in SLDS 2. They must be replaced with styling hooks that have a similar effect, or they must be removed.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-unsupported-hooks-slds2\",\n \"type\": \"problem\",\n \"messages\": {\n \"deprecated\": \"The {{token}} styling hook isn't present in SLDS 2 and there's no equivalent replacement. Remove it or replace it with a styling hook with a similar effect.\"\n }\n },\n \"no-slds-var-without-fallback\": {\n \"description\": \"Add fallback values to SLDS styling hooks. The fallback values are used in Salesforce environments where styling hooks are unavailable.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-var-without-fallback\",\n \"type\": \"problem\",\n \"messages\": {\n \"varWithoutFallback\": \"Your code uses the {{cssVar}} styling hook without a fallback value. Styling hooks are unavailable in some Salesforce environments. To render your component correctly in all environments, add this fallback value: var({{cssVar}}, {{recommendation}}). To make this fallback value brand-aware, use a branded design token instead of a static value. See Design Tokens on v1.lightningdesignsystem.com.\"\n }\n },\n \"no-slds-namespace-for-custom-hooks\": {\n \"description\": \"To differentiate custom styling hooks from SLDS styling hooks, create custom styling hooks in your namespace.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-namespace-for-custom-hooks\",\n \"type\": \"problem\",\n \"messages\": {\n \"customHookNamespace\": \"Using the --slds namespace for {{token}} isn't supported. Create the custom styling hook in your namespace. Example: --myapp-{{tokenWithoutNamespace}}\"\n }\n },\n \"no-slds-private-var\": {\n \"description\": \"Some SLDS styling hooks are private and reserved only for internal Salesforce use. Private SLDS styling hooks have prefixes --_slds- and --slds-s-. For more information, look up private CSS in lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-slds-private-var\",\n \"type\": \"problem\",\n \"messages\": {\n \"privateVar\": \"This styling hook is reserved for internal Salesforce use. Remove the --_slds- or \u2013slds-s private variable within selector {{prop}}. For more information, look up private CSS in lightningdesignsystem.com.\"\n }\n },\n \"enforce-component-hook-naming-convention\": {\n \"description\": \"Replace component styling hooks that use a deprecated naming convention.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#enforce-component-hook-naming-convention\",\n \"type\": \"problem\",\n \"messages\": {\n \"replace\": \"Replace the deprecated {{oldValue}} component styling hook with {{suggestedMatch}}.\"\n }\n },\n \"no-hardcoded-values-slds1\": {\n \"description\": \"Replace static values with SLDS 1 design tokens. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-value\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Replace the {{oldValue}} static value with an SLDS 1 styling hook: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"no-hardcoded-values-slds2\": {\n \"description\": \"Replace static values with SLDS 2 styling hooks. For more information, look up design tokens on lightningdesignsystem.com.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#no-hardcoded-values-slds2\",\n \"type\": \"suggestion\",\n \"messages\": {\n \"hardcodedValue\": \"Consider replacing the {{oldValue}} static value with an SLDS 2 styling hook that has a similar value: {{newValue}}.\",\n \"noReplacement\": \"There's no replacement styling hook for the {{oldValue}} static value. Remove the static value.\"\n }\n },\n \"reduce-annotations\": {\n \"description\": \"Remove your annotations and update your code.\",\n \"url\": \"https://developer.salesforce.com/docs/platform/slds-linter/guide/reference-rules.html#reduce-annotations\",\n \"type\": \"problem\",\n \"messages\": {\n \"removeAnnotation\": \"Remove this annotation and update the code to SLDS best practices. For help, file an issue at https://github.com/salesforce-ux/slds-linter/\"\n }\n }\n};", "import { Rule } from 'eslint';\nimport metadata from '@salesforce-ux/sds-metadata';\nimport ruleMessages from '../../config/rule-messages.yml';\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": "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",
|
|
6
6
|
"names": ["exports", "module", "ruleMessages", "metadata"]
|
|
7
7
|
}
|
|
@@ -192,7 +192,7 @@ __export(lwc_token_to_slds_hook_exports, {
|
|
|
192
192
|
default: () => lwc_token_to_slds_hook_default
|
|
193
193
|
});
|
|
194
194
|
module.exports = __toCommonJS(lwc_token_to_slds_hook_exports);
|
|
195
|
-
var
|
|
195
|
+
var import_sds_metadata = __toESM(require("@salesforce-ux/sds-metadata"));
|
|
196
196
|
var import_rule_messages = __toESM(require_rule_messages());
|
|
197
197
|
|
|
198
198
|
// src/utils/hardcoded-shared-utils.ts
|
|
@@ -224,7 +224,67 @@ var cssFunctionsRegex = new RegExp(`(?:${CSS_FUNCTIONS.join("|")})`);
|
|
|
224
224
|
var cssFunctionsExactRegex = new RegExp(`^(?:${CSS_FUNCTIONS.join("|")})$`);
|
|
225
225
|
var cssMathFunctionsRegex = new RegExp(`^(?:${CSS_MATH_FUNCTIONS.join("|")})$`);
|
|
226
226
|
|
|
227
|
+
// src/utils/hardcoded-shared-utils.ts
|
|
228
|
+
function forEachValue(valueText, extractValue, shouldSkipNode, callback) {
|
|
229
|
+
if (!valueText || typeof valueText !== "string") {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const ast = (0, import_css_tree2.parse)(valueText, { context: "value", positions: true });
|
|
234
|
+
(0, import_css_tree2.walk)(ast, {
|
|
235
|
+
enter(node) {
|
|
236
|
+
if (shouldSkipNode(node)) {
|
|
237
|
+
return this.skip;
|
|
238
|
+
}
|
|
239
|
+
const value = extractValue(node);
|
|
240
|
+
if (value !== null) {
|
|
241
|
+
const positionInfo = {
|
|
242
|
+
start: node.loc?.start,
|
|
243
|
+
end: node.loc?.end
|
|
244
|
+
};
|
|
245
|
+
callback(value, positionInfo);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
} catch (error) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
227
254
|
// src/utils/css-utils.ts
|
|
255
|
+
function extractCssVariable(node, filter) {
|
|
256
|
+
if (!node || node.type !== "Function" || node.name !== "var") {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
if (!node.children) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const childrenArray = Array.from(node.children);
|
|
263
|
+
if (childrenArray.length === 0) {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
const firstChild = childrenArray[0];
|
|
267
|
+
if (!firstChild || firstChild.type !== "Identifier") {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const variableName = firstChild.name;
|
|
271
|
+
if (!variableName) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
return filter(variableName, childrenArray);
|
|
275
|
+
}
|
|
276
|
+
function forEachLwcVariable(valueText, callback) {
|
|
277
|
+
const extractor = (node) => extractCssVariable(node, (variableName, childrenArray) => {
|
|
278
|
+
if (!variableName.startsWith("--lwc-")) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const hasFallback = childrenArray.some(
|
|
282
|
+
(child) => child.type === "Operator" && child.value === ","
|
|
283
|
+
);
|
|
284
|
+
return { name: variableName, hasFallback };
|
|
285
|
+
});
|
|
286
|
+
forEachValue(valueText, extractor, () => false, callback);
|
|
287
|
+
}
|
|
228
288
|
function formatSuggestionHooks(hooks) {
|
|
229
289
|
if (hooks.length === 1) {
|
|
230
290
|
return `${hooks[0]}`;
|
|
@@ -235,7 +295,7 @@ function formatSuggestionHooks(hooks) {
|
|
|
235
295
|
// src/rules/v9/lwc-token-to-slds-hook.ts
|
|
236
296
|
var ruleConfig = import_rule_messages.default["lwc-token-to-slds-hook"];
|
|
237
297
|
var { type, description, url, messages } = ruleConfig;
|
|
238
|
-
var lwcToSlds =
|
|
298
|
+
var lwcToSlds = import_sds_metadata.default.lwcToSlds;
|
|
239
299
|
function shouldIgnoreDetection(lwcToken) {
|
|
240
300
|
return !lwcToken.startsWith("--lwc-") || !(lwcToken in lwcToSlds) || lwcToSlds[lwcToken].continueToUse;
|
|
241
301
|
}
|
|
@@ -258,32 +318,6 @@ function getRecommendation(lwcToken) {
|
|
|
258
318
|
const hasRecommendation = oldValue in lwcToSlds && replacementCategory !== "empty" /* EMPTY */;
|
|
259
319
|
return { hasRecommendation, recommendation, replacementCategory };
|
|
260
320
|
}
|
|
261
|
-
function extractLwcVariableWithFallback(node, sourceCode) {
|
|
262
|
-
if (!node?.children || node.type !== "Function" || node.name !== "var") {
|
|
263
|
-
return null;
|
|
264
|
-
}
|
|
265
|
-
const children = Array.from(node.children);
|
|
266
|
-
const firstChild = children[0];
|
|
267
|
-
if (!firstChild?.name?.startsWith("--lwc-") || firstChild.type !== "Identifier") {
|
|
268
|
-
return null;
|
|
269
|
-
}
|
|
270
|
-
const commaIndex = children.findIndex(
|
|
271
|
-
(child) => child.type === "Operator" && child.value === ","
|
|
272
|
-
);
|
|
273
|
-
let fallbackValue = null;
|
|
274
|
-
if (commaIndex !== -1 && commaIndex + 1 < children.length) {
|
|
275
|
-
const fallbackStart = children[commaIndex + 1];
|
|
276
|
-
const fallbackEnd = children[children.length - 1];
|
|
277
|
-
if (fallbackStart?.loc && fallbackEnd?.loc) {
|
|
278
|
-
const fullText = sourceCode.getText();
|
|
279
|
-
fallbackValue = fullText.substring(fallbackStart.loc.start.offset, fallbackEnd.loc.end.offset).trim();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
return {
|
|
283
|
-
lwcToken: firstChild.name,
|
|
284
|
-
fallbackValue
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
321
|
function getReportMessage(cssVar, replacementCategory, recommendation) {
|
|
288
322
|
if (!recommendation) {
|
|
289
323
|
return {
|
|
@@ -319,85 +353,73 @@ var lwc_token_to_slds_hook_default = {
|
|
|
319
353
|
messages
|
|
320
354
|
},
|
|
321
355
|
create(context) {
|
|
322
|
-
function reportAndFix(node,
|
|
323
|
-
let fixFunction = null;
|
|
324
|
-
if (suggestedMatch) {
|
|
325
|
-
fixFunction = (fixer) => {
|
|
326
|
-
if (node.type === "Declaration") {
|
|
327
|
-
const sourceCode = context.sourceCode;
|
|
328
|
-
const fullText = sourceCode.getText();
|
|
329
|
-
const nodeOffset = node.loc.start.offset;
|
|
330
|
-
const propertyStart = nodeOffset;
|
|
331
|
-
const propertyEnd = propertyStart + oldValue.length;
|
|
332
|
-
const textAtPosition = fullText.substring(propertyStart, propertyEnd);
|
|
333
|
-
if (textAtPosition === oldValue) {
|
|
334
|
-
return fixer.replaceTextRange([propertyStart, propertyEnd], suggestedMatch);
|
|
335
|
-
}
|
|
336
|
-
} else if (node.type === "Function" && node.name === "var") {
|
|
337
|
-
const sourceCode = context.sourceCode;
|
|
338
|
-
const fullText = sourceCode.getText();
|
|
339
|
-
const nodeOffset = node.loc.start.offset;
|
|
340
|
-
const nodeEnd = node.loc.end.offset;
|
|
341
|
-
return fixer.replaceTextRange([nodeOffset, nodeEnd], suggestedMatch);
|
|
342
|
-
} else {
|
|
343
|
-
const sourceCode = context.sourceCode;
|
|
344
|
-
const fullText = sourceCode.getText();
|
|
345
|
-
const varFunctionCall = `var(${oldValue})`;
|
|
346
|
-
const nodeOffset = node.loc.start.offset;
|
|
347
|
-
const searchStart = Math.max(0, nodeOffset - 4);
|
|
348
|
-
const searchEnd = nodeOffset + oldValue.length + 1;
|
|
349
|
-
const searchArea = fullText.substring(searchStart, searchEnd);
|
|
350
|
-
const functionCallIndex = searchArea.indexOf(varFunctionCall);
|
|
351
|
-
if (functionCallIndex !== -1) {
|
|
352
|
-
const actualStart = searchStart + functionCallIndex;
|
|
353
|
-
const actualEnd = actualStart + varFunctionCall.length;
|
|
354
|
-
return fixer.replaceTextRange([actualStart, actualEnd], suggestedMatch);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return null;
|
|
358
|
-
};
|
|
359
|
-
}
|
|
356
|
+
function reportAndFix(node, suggestedMatch, messageId, data, fixRange, loc) {
|
|
360
357
|
context.report({
|
|
361
358
|
node,
|
|
359
|
+
loc: loc || node.loc,
|
|
362
360
|
messageId,
|
|
363
361
|
data,
|
|
364
|
-
fix:
|
|
362
|
+
fix: suggestedMatch && fixRange ? (fixer) => {
|
|
363
|
+
return fixer.replaceTextRange(fixRange, suggestedMatch);
|
|
364
|
+
} : void 0
|
|
365
365
|
});
|
|
366
366
|
}
|
|
367
367
|
return {
|
|
368
|
-
// CSS custom property declarations:
|
|
369
|
-
"Declaration
|
|
368
|
+
// CSS custom property declarations: Check both property name and value
|
|
369
|
+
"Declaration"(node) {
|
|
370
370
|
const property = node.property;
|
|
371
|
-
if (
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
// LWC tokens inside var() functions: var(--lwc-*)
|
|
380
|
-
"Function[name='var']"(node) {
|
|
381
|
-
const lwcVarInfo = extractLwcVariableWithFallback(node, context.sourceCode);
|
|
382
|
-
if (!lwcVarInfo) {
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
const { lwcToken, fallbackValue } = lwcVarInfo;
|
|
386
|
-
if (shouldIgnoreDetection(lwcToken)) {
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
const { hasRecommendation, recommendation, replacementCategory } = getRecommendation(lwcToken);
|
|
390
|
-
const { messageId, data } = getReportMessage(lwcToken, replacementCategory, recommendation);
|
|
391
|
-
let suggestedMatch = null;
|
|
392
|
-
if (hasRecommendation) {
|
|
393
|
-
if (replacementCategory === "slds_token" /* SLDS_TOKEN */) {
|
|
394
|
-
const originalVarCall = fallbackValue ? `var(${lwcToken}, ${fallbackValue})` : `var(${lwcToken})`;
|
|
395
|
-
suggestedMatch = `var(${recommendation}, ${originalVarCall})`;
|
|
396
|
-
} else if (replacementCategory === "raw_value" /* RAW_VALUE */) {
|
|
397
|
-
suggestedMatch = recommendation;
|
|
371
|
+
if (property && property.startsWith("--lwc-")) {
|
|
372
|
+
if (!shouldIgnoreDetection(property)) {
|
|
373
|
+
const { hasRecommendation, recommendation, replacementCategory } = getRecommendation(property);
|
|
374
|
+
const { messageId, data } = getReportMessage(property, replacementCategory, recommendation);
|
|
375
|
+
const suggestedMatch = hasRecommendation && replacementCategory === "slds_token" /* SLDS_TOKEN */ ? recommendation : null;
|
|
376
|
+
const propertyStart = node.loc.start.offset;
|
|
377
|
+
const propertyEnd = propertyStart + property.length;
|
|
378
|
+
reportAndFix(node, suggestedMatch, messageId, data, [propertyStart, propertyEnd]);
|
|
398
379
|
}
|
|
399
380
|
}
|
|
400
|
-
|
|
381
|
+
const valueText = context.sourceCode.getText(node.value);
|
|
382
|
+
if (valueText) {
|
|
383
|
+
forEachLwcVariable(valueText, (variableInfo, positionInfo) => {
|
|
384
|
+
const { name: lwcToken, hasFallback } = variableInfo;
|
|
385
|
+
if (shouldIgnoreDetection(lwcToken)) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
const { hasRecommendation, recommendation, replacementCategory } = getRecommendation(lwcToken);
|
|
389
|
+
const { messageId, data } = getReportMessage(lwcToken, replacementCategory, recommendation);
|
|
390
|
+
let suggestedMatch = null;
|
|
391
|
+
if (hasRecommendation) {
|
|
392
|
+
if (replacementCategory === "slds_token" /* SLDS_TOKEN */) {
|
|
393
|
+
let fallbackValue = null;
|
|
394
|
+
if (hasFallback && positionInfo.start && positionInfo.end && positionInfo.start.offset !== void 0 && positionInfo.end.offset !== void 0) {
|
|
395
|
+
const varCallText = valueText.substring(positionInfo.start.offset, positionInfo.end.offset);
|
|
396
|
+
const commaIndex = varCallText.indexOf(",");
|
|
397
|
+
if (commaIndex !== -1) {
|
|
398
|
+
fallbackValue = varCallText.substring(commaIndex + 1, varCallText.length - 1).trim();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
const originalVarCall = fallbackValue ? `var(${lwcToken}, ${fallbackValue})` : `var(${lwcToken})`;
|
|
402
|
+
suggestedMatch = `var(${recommendation}, ${originalVarCall})`;
|
|
403
|
+
} else if (replacementCategory === "raw_value" /* RAW_VALUE */) {
|
|
404
|
+
suggestedMatch = recommendation;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
const valueStartOffset = node.value.loc.start.offset;
|
|
408
|
+
const varStartOffset = valueStartOffset + (positionInfo.start?.offset || 0);
|
|
409
|
+
const varEndOffset = valueStartOffset + (positionInfo.end?.offset || valueText.length);
|
|
410
|
+
const preciseLoc = positionInfo.start && positionInfo.end && node.value.loc ? {
|
|
411
|
+
start: {
|
|
412
|
+
line: node.value.loc.start.line + positionInfo.start.line - 1,
|
|
413
|
+
column: node.value.loc.start.column + positionInfo.start.column - 1
|
|
414
|
+
},
|
|
415
|
+
end: {
|
|
416
|
+
line: node.value.loc.start.line + positionInfo.end.line - 1,
|
|
417
|
+
column: node.value.loc.start.column + positionInfo.end.column - 1
|
|
418
|
+
}
|
|
419
|
+
} : node.value.loc;
|
|
420
|
+
reportAndFix(node, suggestedMatch, messageId, data, [varStartOffset, varEndOffset], preciseLoc);
|
|
421
|
+
});
|
|
422
|
+
}
|
|
401
423
|
}
|
|
402
424
|
};
|
|
403
425
|
}
|