Skip to content

Commit a312077

Browse files
committed
Switch rule suggestions to use desc; patch TS-ESLint utils
- Replace suggestion messages with inline desc in: - packages/plugins/eslint-plugin-react-dom/src/rules/no-missing-iframe-sandbox.ts - packages/plugins/eslint-plugin-react-dom/src/rules/no-unsafe-target-blank.ts - packages/plugins/eslint-plugin-react-x/src/rules/jsx-dollar.ts - Add patch to patch @typescript-eslint/utils to support SuggestionReportDescriptor with desc - Include patches/@typescript-eslint__utils.patch and update pnpm-lock.yaml - Update workspace overrides to reference patched dependencies and hashes
1 parent bfacd66 commit a312077

6 files changed

Lines changed: 72 additions & 58 deletions

File tree

packages/plugins/eslint-plugin-react-dom/src/rules/no-missing-iframe-sandbox.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ export const RULE_FEATURES = [
1010
"FIX",
1111
] as const satisfies RuleFeature[];
1212

13-
export type MessageID =
14-
| "addSandboxAttribute"
15-
| "missingSandboxAttribute";
13+
export type MessageID = "missingSandboxAttribute";
1614

1715
export default createRule<[], MessageID>({
1816
meta: {
@@ -23,7 +21,6 @@ export default createRule<[], MessageID>({
2321
fixable: "code",
2422
hasSuggestions: true,
2523
messages: {
26-
addSandboxAttribute: "Add sandbox attribute with value '{{ value }}'.",
2724
missingSandboxAttribute: "Missing an explicit sandbox attribute for iframe.",
2825
},
2926
schema: [],
@@ -51,8 +48,7 @@ export function create(context: RuleContext<MessageID, []>): RuleListener {
5148
messageId: "missingSandboxAttribute",
5249
node: node.openingElement,
5350
suggest: [{
54-
messageId: "addSandboxAttribute",
55-
data: { value: "" },
51+
desc: `Add an explicit 'sandbox=""' attribute.`,
5652
fix(fixer) {
5753
// Suggest adding a 'sandbox' attribute
5854
return fixer.insertTextAfter(node.openingElement.name, ` sandbox=""`);
@@ -73,8 +69,7 @@ export function create(context: RuleContext<MessageID, []>): RuleListener {
7369
node: sandboxValue.node ?? sandboxProp,
7470
suggest: [
7571
{
76-
messageId: "addSandboxAttribute",
77-
data: { value: "" },
72+
desc: `Replace the value of 'sandbox' with an empty string.`,
7873
fix(fixer) {
7974
// Do not try to fix spread attributes
8075
if (sandboxValue.kind.startsWith("spread")) return null;

packages/plugins/eslint-plugin-react-dom/src/rules/no-unsafe-target-blank.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ export const RULE_FEATURES = [
1212
"FIX",
1313
] as const satisfies RuleFeature[];
1414

15-
export type MessageID = CamelCase<typeof RULE_NAME> | RuleSuggestMessageID;
16-
17-
export type RuleSuggestMessageID = "addRelNoreferrerNoopener";
15+
export type MessageID = CamelCase<typeof RULE_NAME>;
1816

1917
/**
2018
* Check if a value appears to be an external link.
@@ -49,7 +47,6 @@ export default createRule<[], MessageID>({
4947
fixable: "code",
5048
hasSuggestions: true,
5149
messages: {
52-
addRelNoreferrerNoopener: `Add 'rel="noreferrer noopener"' to the link to prevent security risks.`,
5350
noUnsafeTargetBlank:
5451
`Using 'target="_blank"' on an external link without 'rel="noreferrer noopener"' is a security risk.`,
5552
},
@@ -95,7 +92,7 @@ export function create(context: RuleContext<MessageID, []>): RuleListener {
9592
messageId: "noUnsafeTargetBlank",
9693
node: node.openingElement,
9794
suggest: [{
98-
messageId: "addRelNoreferrerNoopener",
95+
desc: `Add 'rel="noreferrer noopener"' to the link to prevent security risks.`,
9996
fix(fixer) {
10097
return fixer.insertTextAfter(
10198
node.openingElement.name,
@@ -116,7 +113,7 @@ export function create(context: RuleContext<MessageID, []>): RuleListener {
116113
messageId: "noUnsafeTargetBlank",
117114
node: relProp,
118115
suggest: [{
119-
messageId: "addRelNoreferrerNoopener",
116+
desc: `Replace the 'rel' value with 'noreferrer noopener' to prevent security risks.`,
120117
fix(fixer) {
121118
return fixer.replaceText(relProp, `rel="noreferrer noopener"`);
122119
},

packages/plugins/eslint-plugin-react-x/src/rules/jsx-dollar.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ export const RULE_FEATURES = [
1212
"FIX",
1313
] as const satisfies RuleFeature[];
1414

15-
export type MessageID = CamelCase<typeof RULE_NAME> | RuleSuggestMessageID;
16-
17-
export type RuleSuggestMessageID = "removeDollarSign";
15+
export type MessageID = CamelCase<typeof RULE_NAME>;
1816

1917
export default createRule<[], MessageID>({
2018
meta: {
@@ -63,7 +61,7 @@ export function create(context: RuleContext<MessageID, []>): RuleListener {
6361
},
6462
suggest: [
6563
{
66-
messageId: "removeDollarSign",
64+
desc: "Remove the dollar sign '$' before the expression.",
6765
fix(fixer) {
6866
return fixer.removeRange([child.range[1] - 1, child.range[1]]);
6967
},
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
diff --git a/dist/ts-eslint/Rule.d.ts b/dist/ts-eslint/Rule.d.ts
2+
index c76bdfaa04569afdb34b8fc6c70fa0386407d541..e568b494148a9c7b24bf32d3a3bcb37d6bdacc06 100644
3+
--- a/dist/ts-eslint/Rule.d.ts
4+
+++ b/dist/ts-eslint/Rule.d.ts
5+
@@ -148,7 +148,8 @@ export interface RuleFixer {
6+
replaceText(nodeOrToken: TSESTree.Node | TSESTree.Token, text: string): RuleFix;
7+
replaceTextRange(range: Readonly<AST.Range>, text: string): RuleFix;
8+
}
9+
-export interface SuggestionReportDescriptor<MessageIds extends string> extends Omit<ReportDescriptorBase<MessageIds>, 'fix'> {
10+
+export interface SuggestionReportDescriptor<MessageIds extends string> extends Omit<ReportDescriptorBase<MessageIds>, 'fix', 'messageId'> {
11+
+ readonly desc: string;
12+
readonly fix: ReportFixFunction;
13+
}
14+
export type ReportFixFunction = (fixer: RuleFixer) => IterableIterator<RuleFix> | readonly RuleFix[] | RuleFix | null;

pnpm-lock.yaml

Lines changed: 26 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
11
packages:
2-
- ".pkgs/*"
3-
- "apps/*"
4-
- "packages/*"
5-
- "packages/*/*"
6-
- "examples/*"
2+
- .pkgs/*
3+
- apps/*
4+
- packages/*
5+
- packages/*/*
6+
- examples/*
7+
78
onlyBuiltDependencies:
89
- core-js
910
- dprint
1011
- esbuild
1112
- sharp
13+
1214
overrides:
13-
"@eslint/js": "9.39.1"
14-
"@types/react-dom": "^19.2.3"
15-
"@types/react": "^19.2.10"
16-
"esbuild": "^0.27.2"
17-
"eslint": "^9.39.2"
18-
"fumadocs-ui": "16.2.4"
19-
"lodash": "^4.17.23"
20-
"next": "^16.1.6"
21-
"react-dom": "^19.2.4"
22-
"react": "^19.2.4"
23-
"ts-api-utils": "^2.4.0"
24-
"tslib": "^2.8.1"
25-
"typescript": "^5.9.3"
26-
"undici": "^7.19.2"
15+
"@eslint/js": 9.39.1
16+
"@types/react": ^19.2.10
17+
"@types/react-dom": ^19.2.3
18+
esbuild: ^0.27.2
19+
eslint: ^9.39.2
20+
fumadocs-ui: 16.2.4
21+
lodash: ^4.17.23
22+
next: ^16.1.6
23+
react: ^19.2.4
24+
react-dom: ^19.2.4
25+
ts-api-utils: ^2.4.0
26+
tslib: ^2.8.1
27+
typescript: ^5.9.3
28+
undici: ^7.19.2
29+
30+
patchedDependencies:
31+
"@typescript-eslint/utils": patches/@typescript-eslint__utils.patch

0 commit comments

Comments
 (0)