Skip to content

Fix messages #153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"workspaces": [
"packages/eslint-plugin-slds",
"packages/stylelint-plugin-slds",
"packages/cli"
"packages/cli",
"packages/shared-utils"
],
"packageManager": "[email protected]",
"engines": {
Expand Down
6 changes: 5 additions & 1 deletion packages/eslint-plugin-slds/src/rules/enforce-bem-usage.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { findAttr, isAttributesEmpty } from "./utils/node";
import metadata from '@salesforce-ux/sds-metadata';
import { formatMessageWithSuggestions } from '../../../shared-utils/src';
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we use as a package or relative path?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Letz create package , but skipped from publishing
  • move all rule message formatting related code into this
  • update esling and stylelint plugins to use this package
  • update esbuild of esling and stylelint plugins to bundle this package

Name of the package can be rule-meta

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Planning to hold this PR until we decide on the rule-meta end. I can create the function on top of that work. Don't want to merge two work items in this PR.

const bemMapping = metadata.bemNaming;
const deprecatedClasses = metadata.deprecatedClasses;

Expand Down Expand Up @@ -72,7 +73,10 @@ export = {
actual: className,
newValue
},
message: JSON.stringify({message: "{{actual}} has been retired. Update it to the new name {{newValue}}.", suggestions:[newValue]}),
message: formatMessageWithSuggestions(
"{{actual}} has been retired. Update it to the new name {{newValue}}.",
[newValue]
),
fix(fixer) {
if (newValue) {
const newClassValue = classAttr.value.value.replace(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { findAttr, isAttributesEmpty } from "./utils/node";
import { messages } from "./utils/rule";
import { formatMessageWithSuggestions } from '../../../shared-utils/src/message-formatter';

// This rule specific to CVS, find more details here https://issues.salesforce.com/issue/a028c00000zh1iqAAA/modal-close-button-is-not-visible-with-the-new-white-background-after-winter-25-release
export = {
Expand Down Expand Up @@ -43,7 +44,7 @@ export = {
context.report({
node,
loc: classAttr.loc,
message: JSON.stringify({message: messages["removeClass"], suggestions: [`class="${newClassList}"`]}),
message: formatMessageWithSuggestions(messages["removeClass"], [`class="${newClassList}"`]),
fix(fixer) {
return fixer.replaceText(classAttr, // Replace the full attribute
`class="${newClassList}"` // Updated class list
Expand Down Expand Up @@ -85,7 +86,7 @@ export = {
context.report({
node,
loc: attribute.loc,
message: JSON.stringify({message:messages["removeClass"],suggestions:[`${attrName}="${newClassList}"`]}),
message: formatMessageWithSuggestions(messages["removeClass"], [`${attrName}="${newClassList}"`]),
fix(fixer) {
return fixer.replaceText(attribute, // Replace the full attribute
`${attrName}="${newClassList}"` // Correctly modifies the respective attribute
Expand All @@ -111,7 +112,7 @@ export = {
context.report({
node: attribute,
loc: attribute.value.loc,
message: JSON.stringify({message:messages["ensureButtonClasses"],suggestions:[newClassList]}),
message: formatMessageWithSuggestions(messages["ensureButtonClasses"], [newClassList]),
fix(fixer) {
return fixer.replaceText(attribute.value, `${newClassList}`);
},
Expand All @@ -121,7 +122,7 @@ export = {
if (variantAttr && variantAttr.value && variantAttr.value.value === "bare-inverse") {
context.report({
node: variantAttr,
message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}),
message: formatMessageWithSuggestions(messages["changeVariant"], ["bare"]),
loc: variantAttr.value.loc,
fix(fixer) {
return fixer.replaceText(variantAttr.value, `bare`);
Expand Down Expand Up @@ -166,7 +167,7 @@ export = {
if (variantAttr && variantAttr.value && variantAttr.value.value === "bare-inverse") {
context.report({
node: variantAttr,
message: JSON.stringify({message:messages["changeVariant"], suggestions:["bare"]}),
message: formatMessageWithSuggestions(messages["changeVariant"], ["bare"]),
loc: variantAttr.value.loc,
fix(fixer) {
return fixer.replaceText(variantAttr.value, `bare`);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { findAttr, isAttributesEmpty } from "./utils/node";
import metadata from '@salesforce-ux/sds-metadata';
import { formatMessageWithSuggestions } from '../../../shared-utils/src/message-formatter';
const deprecatedClasses = metadata.deprecatedClasses;

export = {
Expand Down Expand Up @@ -47,7 +48,10 @@ export = {
data: {
className,
},
message: JSON.stringify({message:"The class {{className}} isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.", suggestions:[]}),
message: formatMessageWithSuggestions(
"The class {{className}} isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.",
[]
),
});
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ ruleTester.run("enforce-bem-usage", rule, {
code: `<div class="slds-container--medium"></div>`, // Invalid: underscore instead of double underscore
errors: [
{
message: "{\"message\":\"slds-container--medium has been retired. Update it to the new name slds-container_medium.\",\"suggestions\":[\"slds-container_medium\"]}",
// message: "{\"message\":\"slds-container--medium has been retired. Update it to the new name slds-container_medium.\",\"suggestions\":[\"slds-container_medium\"]}",
message:"slds-container--medium has been retired. Update it to the new name slds-container_medium.",
line: 1,
column: 13,
},
Expand All @@ -51,7 +52,8 @@ ruleTester.run("enforce-bem-usage", rule, {
code: `<div class="block block_element slds-border--left"></div>`, // Invalid: `block_element` not in BEM
errors: [
{
message: "{\"message\":\"slds-border--left has been retired. Update it to the new name slds-border_left.\",\"suggestions\":[\"slds-border_left\"]}",
// message: "{\"message\":\"slds-border--left has been retired. Update it to the new name slds-border_left.\",\"suggestions\":[\"slds-border_left\"]}",
message:"slds-border--left has been retired. Update it to the new name slds-border_left.",
line: 1,
column: 33,
}
Expand All @@ -62,7 +64,8 @@ ruleTester.run("enforce-bem-usage", rule, {
code: `<div class="slds-p-right--xxx-small"></div>`, // Invalid: Missing block name
errors: [
{
message: "{\"message\":\"slds-p-right--xxx-small has been retired. Update it to the new name slds-p-right_xxx-small.\",\"suggestions\":[\"slds-p-right_xxx-small\"]}",
// message: "{\"message\":\"slds-p-right--xxx-small has been retired. Update it to the new name slds-p-right_xxx-small.\",\"suggestions\":[\"slds-p-right_xxx-small\"]}",
message:"slds-p-right--xxx-small has been retired. Update it to the new name slds-p-right_xxx-small.",
line: 1,
column: 13,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,14 @@ ruleTester.run("slds-modal-button-issue", rule, {
// ❌ Scenario 1: Remove slds-button_icon-inverse from a modal close button
{
code: `<button class="slds-button slds-button_icon slds-modal__close slds-button_icon-inverse"></button>`,
errors: [{ message: JSON.stringify({message: messages["removeClass"], suggestions: [`class="slds-button slds-button_icon slds-modal__close"`]}), type: "Tag" }],
errors: [{ message: messages["removeClass"], type: "Tag" }],
output: `<button class="slds-button slds-button_icon slds-modal__close"></button>`,
},

// ❌ Scenario 2: Fix variant="bare-inverse" and ensure size="large" in lightning-button-icon
{
code: `<lightning-button-icon variant="bare-inverse" class="slds-button slds-button_icon slds-modal__close"></lightning-button-icon>`,
errors: [{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}) }],
errors: [{ message: messages["changeVariant"] }],
output: `<lightning-button-icon variant="bare" class="slds-button slds-button_icon slds-modal__close"></lightning-button-icon>`,
},

Expand All @@ -66,14 +66,14 @@ ruleTester.run("slds-modal-button-issue", rule, {
code: `<button class="slds-button slds-modal__close"><lightning-icon variant="bare-inverse" size="medium"></lightning-icon></button>`,
errors: [
//{ messageId: "ensureSizeAttribute", type: "Tag" },
{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}) }
{ message: messages["changeVariant"] }
],
output: `<button class="slds-button slds-modal__close"><lightning-icon variant="bare" size="medium"></lightning-icon></button>`,
},
{
code: `<button class="slds-button slds-modal__close"><lightning-icon variant="bare-inverse"></lightning-icon></button>`,
errors: [
{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}) }
{ message: messages["changeVariant"] }
],
output: `<button class="slds-button slds-modal__close"><lightning-icon variant="bare"></lightning-icon></button>`,
},
Expand All @@ -91,8 +91,8 @@ ruleTester.run("slds-modal-button-issue", rule, {
<span class="slds-assistive-text">{cancelButtonLabel}</span>
</button>`,
errors: [
{ message: JSON.stringify({message: messages["removeClass"], suggestions: [`class="slds-button slds-button_icon slds-modal__close"`]})},
{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}), }
{ message: messages["removeClass"]},
{ message: messages["changeVariant"] }
],
output: `<button class="slds-button slds-button_icon slds-modal__close">
<lightning-icon
Expand All @@ -113,8 +113,8 @@ ruleTester.run("slds-modal-button-issue", rule, {
class="slds-button slds-button_icon slds-modal__close slds-button--icon-inverse" variant="bare-inverse" size="large">
</lightning-button-icon>`,
errors: [
{ message: JSON.stringify({message: messages["removeClass"], suggestions: [`class="slds-button slds-button_icon slds-modal__close"`]})},
{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}) }
{ message: messages["removeClass"]},
{ message: messages["changeVariant"] }
],
output: `<lightning-button-icon
title={labels.closeButton} icon-name="utility:close"
Expand All @@ -132,9 +132,9 @@ ruleTester.run("slds-modal-button-issue", rule, {
variant="bare-inverse" size="large">
</lightning-button-icon>`,
errors: [
{ message: JSON.stringify({message: messages["removeClass"], suggestions: [`icon-class="slds-button slds-button_icon slds-modal__close"`]})},
{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}) },
{ message: JSON.stringify({message:messages["changeVariant"],suggestions:["bare"]}) },
{ message: messages["removeClass"]},
{ message: messages["changeVariant"] },
{ message: messages["changeVariant"] },
],
output: `<lightning-button-icon
title={labels.closeButton} icon-name="utility:close"
Expand All @@ -156,7 +156,7 @@ ruleTester.run("slds-modal-button-issue", rule, {
<h2 id="modal-heading-01" class="slds-modal__title slds-hyphenate">{heading}</h2>
</header>`,
errors: [
{ message: JSON.stringify({message: messages["removeClass"], suggestions: [`class="slds-button slds-button_icon slds-modal__close"`]}) }
{ message: messages["removeClass"] }
],
output: `<header class="slds-modal__header">
<button class="slds-button slds-button_icon slds-modal__close" title={labels.Close} onclick={close}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ ruleTester.run("no-deprecated-classes", rule, {
code: `<div class="slds-action-overflow--touch"></div>`, // Single deprecated class
errors: [
{
message: "{\"message\":\"The class slds-action-overflow--touch isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\"suggestions\":[]}",
// message: "{\"message\":\"The class slds-action-overflow--touch isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\"suggestions\":[]}",
message: "The class slds-action-overflow--touch isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.",
line: 1,
column: 13,
},
Expand All @@ -40,12 +41,14 @@ ruleTester.run("no-deprecated-classes", rule, {
code: `<div class="slds-app-launcher__tile-body_small slds-app-launcher__tile-figure_small"></div>`, // Multiple deprecated classes
errors: [
{
message: "{\"message\":\"The class slds-app-launcher__tile-body_small isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\"suggestions\":[]}",
// message: "{\"message\":\"The class slds-app-launcher__tile-body_small isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\"suggestions\":[]}",
message: "The class slds-app-launcher__tile-body_small isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.",
line: 1,
column: 13,
},
{
message: "{\"message\":\"The class slds-app-launcher__tile-figure_small isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\"suggestions\":[]}",
// message: "{\"message\":\"The class slds-app-launcher__tile-figure_small isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.\",\"suggestions\":[]}",
message: "The class slds-app-launcher__tile-figure_small isn't available in SLDS 2. Update it to a class supported in SLDS 2. See lightningdesignsystem.com for more information.",
line: 1,
column: 48,
},
Expand Down
1 change: 1 addition & 0 deletions packages/shared-utils/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { formatMessageWithSuggestions } from './message-formatter';
13 changes: 13 additions & 0 deletions packages/shared-utils/src/message-formatter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* Formats a message with suggestions into a stringified JSON object
* @param message The main message to display
* @param suggestions Array of suggestion objects to include
* @returns Stringified JSON object containing message and suggestions
*/
export function formatMessageWithSuggestions(message: string, suggestions: string[]): string {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Created a function so that we can in case needed.

// return JSON.stringify({
// message,
// suggestions
// });
return message;
}
17 changes: 17 additions & 0 deletions packages/shared-utils/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"compilerOptions": {
"outDir": "build",
"target": "ESNext",
"module": "ES2022",
"moduleResolution": "node",
"declaration": true,
"emitDeclarationOnly": true,
"noEmitOnError": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"skipLibCheck": true
},
"include": ["./src/**/*.ts"]
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import stylelint, { PostcssResult, Rule, RuleSeverity } from 'stylelint';
import ruleMetadata from '../../utils/rulesMetadata';
import replacePlaceholders from '../../utils/util';
import metadata from '@salesforce-ux/sds-metadata';
import { formatMessageWithSuggestions } from '../../../../shared-utils/src';
const sldsPlusStylingHooks = metadata.sldsPlusStylingHooks;

const { utils, createPlugin }: typeof stylelint = stylelint;
Expand Down Expand Up @@ -64,7 +65,7 @@ function detectRightSide(decl:Declaration, basicReportProps:Partial<stylelint.Pr
const message = messages.replace(oldValue, suggestedMatch);

utils.report(<stylelint.Problem>{
message: JSON.stringify({message, suggestions:[suggestedMatch]}),
message: formatMessageWithSuggestions(message, [suggestedMatch]),
index: startIndex,
endIndex,
...basicReportProps,
Expand Down Expand Up @@ -95,7 +96,7 @@ function detectLeftSide(decl:Declaration, basicReportProps:Partial<stylelint.Pro
const message = messages.replace(prop, suggestedMatch);

utils.report(<stylelint.Problem>{
message: JSON.stringify({message, suggestions:[suggestedMatch]}),
message: formatMessageWithSuggestions(message, [suggestedMatch]),
index: startIndex,
endIndex,
...basicReportProps,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
import generateSuggestionsList from '../../utils/generateSuggestionsList';
import ruleMetadata from '../../utils/rulesMetadata';
import replacePlaceholders from '../../utils/util';
import { formatMessageWithSuggestions } from '../../../../shared-utils/src';
import type { ValueToStylingHooksMapping } from '@salesforce-ux/sds-metadata';
const { utils, createPlugin } = stylelint;

Expand Down Expand Up @@ -192,19 +193,19 @@ function reportMatchingHooks(

if (suggestions.length > 0) {
utils.report(<stylelint.Problem>{
message: JSON.stringify({
message: messages.rejected(value, generateSuggestionsList(suggestions)),
suggestions,
}),
message: formatMessageWithSuggestions(
messages.rejected(value, generateSuggestionsList(suggestions)),
suggestions
),
...reportProps,
fix: suggestions.length === 1 ? fix : null,
});
} else {
utils.report(<stylelint.Problem>{
message: JSON.stringify({
message: messages.suggested(value),
suggestions: [],
}),
message: formatMessageWithSuggestions(
messages.suggested(value),
[]
),
...reportProps,
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import metadata from '@salesforce-ux/sds-metadata';
import ruleMetadata from '../../utils/rulesMetadata';
import { getClassNodesFromSelector } from '../../utils/selector-utils';
import replacePlaceholders from '../../utils/util';
import { formatMessageWithSuggestions } from '../../../../shared-utils/src';
const { utils, createPlugin }: typeof stylelint = stylelint;
const sldsClasses = metadata.sldsClasses;

Expand Down Expand Up @@ -35,9 +36,12 @@ function rule(primaryOptions: boolean, {severity = severityLevel as RuleSeverity
const index = offsetIndex + classNode.sourceIndex + 1; // find selector in rule plus '.'
const endIndex = index + classNode.value.length;
utils.report({
message: JSON.stringify({message:replacePlaceholders(warningMsg, {
selector: `.${classNode.value}`
}), suggestions:[]}),
message: formatMessageWithSuggestions(
replacePlaceholders(warningMsg, {
selector: `.${classNode.value}`
}),
[]
),
node: rule,
result,
ruleName,
Expand Down
Loading