Skip to content

Commit be98b35

Browse files
committed
Fix #26.
1 parent 41343d5 commit be98b35

File tree

3 files changed

+35
-15
lines changed

3 files changed

+35
-15
lines changed

docs/event-handlers.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ let el = <div onclick={() => {}} />;
3535
// after eslint --fix:
3636
let el = <div onClick={() => {}} />;
3737

38+
let el = <div onClIcK={() => {}} />;
39+
// after eslint --fix:
40+
let el = <div onClick={() => {}} />;
41+
42+
let el = <div oncLICK={() => {}} />;
43+
// after eslint --fix:
44+
let el = <div onClick={() => {}} />;
45+
3846
let el = <div onLy />;
3947

4048
let el = <div onLy="string" />;

src/rules/event-handlers.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ const COMMON_EVENTS: Record<string, string | null> = {
6666

6767
const isCommonEventName = (lowercaseEventName: string) =>
6868
Object.prototype.hasOwnProperty.call(COMMON_EVENTS, lowercaseEventName);
69-
const getCommoneEventHandlerName = (lowercaseEventName: string) => {
69+
const getCommonEventHandlerName = (lowercaseEventName: string) => {
7070
return `on${
7171
COMMON_EVENTS[lowercaseEventName] ??
72-
lowercaseEventName[0].toUpperCase() + lowercaseEventName.slice(1)
72+
lowercaseEventName[0].toUpperCase() + lowercaseEventName.slice(1).toLowerCase()
7373
}`;
7474
};
7575

@@ -132,7 +132,7 @@ const rule: TSESLint.RuleModule<
132132
// string name of the name node
133133
const { name } = node.name;
134134

135-
const match = /^on([a-zA-Z].*)/.exec(name);
135+
const match = /^on([a-zA-Z].*)$/.exec(name);
136136
if (!match) {
137137
return; // bail if Solid doesn't consider the prop name an event handler
138138
}
@@ -173,24 +173,26 @@ const rule: TSESLint.RuleModule<
173173
staticValue: node.value !== null ? node.value.value : true,
174174
},
175175
});
176-
} else if (name[2] === name[2].toLowerCase() && !context.options[0]?.ignoreCase) {
176+
} else if (!context.options[0]?.ignoreCase) {
177177
const lowercaseEventName = match[1].toLowerCase();
178178
if (isCommonEventName(lowercaseEventName)) {
179-
// For common DOM event names, we know the user intended the prop to be an event handler.
180-
// Fix it to have an uppercase third letter and be property camel-cased with an uppercase third letter
181-
const fixedName = getCommoneEventHandlerName(lowercaseEventName);
182-
context.report({
183-
node: node.name,
184-
messageId: "capitalization",
185-
data: { name, fixedName },
186-
fix: (fixer) => fixer.replaceText(node.name, fixedName),
187-
});
188-
} else {
179+
const fixedName = getCommonEventHandlerName(lowercaseEventName);
180+
if (fixedName !== name) {
181+
// For common DOM event names, we know the user intended the prop to be an event handler.
182+
// Fix it to have an uppercase third letter and be properly camel-cased.
183+
context.report({
184+
node: node.name,
185+
messageId: "capitalization",
186+
data: { name, fixedName },
187+
fix: (fixer) => fixer.replaceText(node.name, fixedName),
188+
});
189+
}
190+
} else if (name[2] === name[2].toLowerCase()) {
189191
// this includes words like `only` and `ongoing` as well as unknown handlers like `onfoobar`.
190192
// Enforce using either /^on[A-Z]/ (event handler) or /^attr:on[a-z]/ (forced regular attribute)
191193
// to make user intent clear and code maximally readable
192194
const handlerName = `on${match[1][0].toUpperCase()}${match[1].slice(1)}`;
193-
const attrName = `attr:${match[0]}`;
195+
const attrName = `attr:${name}`;
194196
context.report({
195197
node: node.name,
196198
messageId: "naming",

test/rules/event-handlers.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ export const cases = run("event-handlers", rule, {
5858
errors: [{ messageId: "capitalization", type: T.JSXIdentifier }],
5959
output: `let el = <div onClick={() => {}} />`,
6060
},
61+
{
62+
code: `let el = <div onClIcK={() => {}} />`,
63+
errors: [{ messageId: "capitalization", type: T.JSXIdentifier }],
64+
output: `let el = <div onClick={() => {}} />`,
65+
},
66+
{
67+
code: `let el = <div oncLICK={() => {}} />`,
68+
errors: [{ messageId: "capitalization", type: T.JSXIdentifier }],
69+
output: `let el = <div onClick={() => {}} />`,
70+
},
6171
{
6272
code: `let el = <div onLy />`,
6373
errors: [

0 commit comments

Comments
 (0)