@pobammer-ts/eslint-cease-nonsense-rules 0.5.0 → 0.7.0

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/README.md CHANGED
@@ -29,12 +29,19 @@ export default [
29
29
  "cease-nonsense/no-print": "error",
30
30
  "cease-nonsense/no-shorthand-names": "error",
31
31
  "cease-nonsense/no-warn": "error",
32
+ "cease-nonsense/prefer-udim2-shorthand": "error",
33
+ "cease-nonsense/require-named-effect-functions": "error",
32
34
  "cease-nonsense/require-react-component-keys": "error",
33
35
  "cease-nonsense/use-exhaustive-dependencies": "error",
34
36
  "cease-nonsense/use-hook-at-top-level": "error",
35
37
  },
36
38
  },
37
39
  ];
40
+
41
+ // Or just include the preset
42
+ export default [
43
+ ceaseNonsense.configs.recommended,
44
+ ];
38
45
  ```
39
46
 
40
47
  ## Rules
@@ -114,6 +121,57 @@ function UserList({ users }) {
114
121
  }
115
122
  ```
116
123
 
124
+ #### `require-named-effect-functions`
125
+
126
+ Enforce named effect functions for better debuggability. Prevent inline arrow functions in `useEffect` and similar hooks.
127
+
128
+ Behavior by environment (option `environment`):
129
+
130
+ - `roblox-ts` (default): only identifiers allowed (e.g., `useEffect(onTick, [...])`). Inline function expressions or arrows are reported.
131
+ - `standard`: identifiers and named function expressions are allowed; arrows are still reported.
132
+
133
+ Default hooks checked: `useEffect`, `useLayoutEffect`, `useInsertionEffect`.
134
+
135
+ **❌ Bad:**
136
+
137
+ ```typescript
138
+ // Arrow function
139
+ useEffect(() => {
140
+ doThing();
141
+ }, [dep]);
142
+
143
+ // Anonymous function expression
144
+ useEffect(function () {
145
+ doThing();
146
+ }, [dep]);
147
+ ```
148
+
149
+ **✅ Good:**
150
+
151
+ ```typescript
152
+ // Preferred: reference a named function
153
+ function onDepChange() {
154
+ doThing();
155
+ }
156
+ useEffect(onDepChange, [dep]);
157
+
158
+ // Allowed in `standard` mode
159
+ useEffect(function onDepChange() {
160
+ doThing();
161
+ }, [dep]);
162
+ ```
163
+
164
+ **Configuration:**
165
+
166
+ ```typescript
167
+ {
168
+ "cease-nonsense/require-named-effect-functions": ["error", {
169
+ "environment": "roblox-ts", // or "standard"
170
+ "hooks": ["useEffect", "useLayoutEffect", "useInsertionEffect"]
171
+ }]
172
+ }
173
+ ```
174
+
117
175
  **✅ Good:**
118
176
 
119
177
  ```typescript
@@ -271,6 +329,25 @@ const blue = Color3.fromRGB(127, 127, 255);
271
329
  const black = new Color3(0, 0, 0); // Allowed
272
330
  ```
273
331
 
332
+ #### `prefer-udim2-shorthand`
333
+
334
+ Prefer `UDim2.fromScale()` or `UDim2.fromOffset()` when all offsets or all scales are zero. Leaves `new UDim2(0, 0, 0, 0)` alone. Includes auto-fix.
335
+
336
+ **❌ Bad:**
337
+
338
+ ```typescript
339
+ new UDim2(1, 0, 1, 0);
340
+ new UDim2(0, 100, 0, 50);
341
+ ```
342
+
343
+ **✅ Good:**
344
+
345
+ ```typescript
346
+ UDim2.fromScale(1, 1);
347
+ UDim2.fromOffset(100, 50);
348
+ new UDim2(0, 0, 0, 0); // Allowed
349
+ ```
350
+
274
351
  #### `no-shorthand-names`
275
352
 
276
353
  Bans shorthand variable names in favor of descriptive full names.
package/dist/index.d.ts CHANGED
@@ -30,6 +30,7 @@ declare const recommended: {
30
30
  readonly "cease-nonsense/no-shorthand-names": "error";
31
31
  readonly "cease-nonsense/no-warn": "error";
32
32
  readonly "cease-nonsense/prefer-udim2-shorthand": "error";
33
+ readonly "cease-nonsense/require-named-effect-functions": "error";
33
34
  readonly "cease-nonsense/require-react-component-keys": "error";
34
35
  readonly "cease-nonsense/use-exhaustive-dependencies": "error";
35
36
  readonly "cease-nonsense/use-hook-at-top-level": "error";
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import noPrint from "./rules/no-print";
4
4
  import noShorthandNames from "./rules/no-shorthand-names";
5
5
  import noWarn from "./rules/no-warn";
6
6
  import preferUDim2Shorthand from "./rules/prefer-udim2-shorthand";
7
+ import requireNamedEffectFunctions from "./rules/require-named-effect-functions";
7
8
  import requireReactComponentKeys from "./rules/require-react-component-keys";
8
9
  import useExhaustiveDependencies from "./rules/use-exhaustive-dependencies";
9
10
  import useHookAtTopLevel from "./rules/use-hook-at-top-level";
@@ -19,6 +20,7 @@ const rules = {
19
20
  "no-shorthand-names": noShorthandNames,
20
21
  "no-warn": noWarn,
21
22
  "prefer-udim2-shorthand": preferUDim2Shorthand,
23
+ "require-named-effect-functions": requireNamedEffectFunctions,
22
24
  "require-react-component-keys": requireReactComponentKeys,
23
25
  "use-exhaustive-dependencies": useExhaustiveDependencies,
24
26
  "use-hook-at-top-level": useHookAtTopLevel,
@@ -52,6 +54,7 @@ const recommended = {
52
54
  "cease-nonsense/no-shorthand-names": "error",
53
55
  "cease-nonsense/no-warn": "error",
54
56
  "cease-nonsense/prefer-udim2-shorthand": "error",
57
+ "cease-nonsense/require-named-effect-functions": "error",
55
58
  "cease-nonsense/require-react-component-keys": "error",
56
59
  "cease-nonsense/use-exhaustive-dependencies": "error",
57
60
  "cease-nonsense/use-hook-at-top-level": "error",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,uBAAuB,MAAM,oCAAoC,CAAC;AACzE,OAAO,mBAAmB,MAAM,+BAA+B,CAAC;AAChE,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAC1D,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAClE,OAAO,yBAAyB,MAAM,sCAAsC,CAAC;AAC7E,OAAO,yBAAyB,MAAM,qCAAqC,CAAC;AAC5E,OAAO,iBAAiB,MAAM,+BAA+B,CAAC;AAI9D;;;;GAIG;AACH,MAAM,KAAK,GAA4C;IACtD,4BAA4B,EAAE,uBAAuB;IACrD,uBAAuB,EAAE,mBAAmB;IAC5C,UAAU,EAAE,OAAO;IACnB,oBAAoB,EAAE,gBAAgB;IACtC,SAAS,EAAE,MAAM;IACjB,wBAAwB,EAAE,oBAAoB;IAC9C,8BAA8B,EAAE,yBAAyB;IACzD,6BAA6B,EAAE,yBAAyB;IACxD,uBAAuB,EAAE,iBAAiB;CACjC,CAAC;AAEX;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,GAAG;IACnB,OAAO,EAAE;QACR,gBAAgB,EAAE;YACjB,KAAK;SACL;KACD;IACD,KAAK,EAAE;QACN,2CAA2C,EAAE,OAAO;QACpD,sCAAsC,EAAE,OAAO;QAC/C,yBAAyB,EAAE,OAAO;QAClC,mCAAmC,EAAE,OAAO;QAC5C,wBAAwB,EAAE,OAAO;QACjC,uCAAuC,EAAE,OAAO;QAChD,6CAA6C,EAAE,OAAO;QACtD,4CAA4C,EAAE,OAAO;QACrD,sCAAsC,EAAE,OAAO;KAC/C;CACQ,CAAC;AAWX,MAAM,MAAM,GAAW;IACtB,OAAO,EAAE,EAAE,WAAW,EAAE;IACxB,KAAK;CACI,CAAC;AAEX,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,uBAAuB,MAAM,oCAAoC,CAAC;AACzE,OAAO,mBAAmB,MAAM,+BAA+B,CAAC;AAChE,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAC1D,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAClE,OAAO,2BAA2B,MAAM,wCAAwC,CAAC;AACjF,OAAO,yBAAyB,MAAM,sCAAsC,CAAC;AAC7E,OAAO,yBAAyB,MAAM,qCAAqC,CAAC;AAC5E,OAAO,iBAAiB,MAAM,+BAA+B,CAAC;AAI9D;;;;GAIG;AACH,MAAM,KAAK,GAA4C;IACtD,4BAA4B,EAAE,uBAAuB;IACrD,uBAAuB,EAAE,mBAAmB;IAC5C,UAAU,EAAE,OAAO;IACnB,oBAAoB,EAAE,gBAAgB;IACtC,SAAS,EAAE,MAAM;IACjB,wBAAwB,EAAE,oBAAoB;IAC9C,gCAAgC,EAAE,2BAA2B;IAC7D,8BAA8B,EAAE,yBAAyB;IACzD,6BAA6B,EAAE,yBAAyB;IACxD,uBAAuB,EAAE,iBAAiB;CACjC,CAAC;AAEX;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,GAAG;IACnB,OAAO,EAAE;QACR,gBAAgB,EAAE;YACjB,KAAK;SACL;KACD;IACD,KAAK,EAAE;QACN,2CAA2C,EAAE,OAAO;QACpD,sCAAsC,EAAE,OAAO;QAC/C,yBAAyB,EAAE,OAAO;QAClC,mCAAmC,EAAE,OAAO;QAC5C,wBAAwB,EAAE,OAAO;QACjC,uCAAuC,EAAE,OAAO;QAChD,+CAA+C,EAAE,OAAO;QACxD,6CAA6C,EAAE,OAAO;QACtD,4CAA4C,EAAE,OAAO;QACrD,sCAAsC,EAAE,OAAO;KAC/C;CACQ,CAAC;AAWX,MAAM,MAAM,GAAW;IACtB,OAAO,EAAE,EAAE,WAAW,EAAE;IACxB,KAAK;CACI,CAAC;AAEX,eAAe,MAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "eslint";
2
+ declare const requireNamedEffectFunctions: Rule.RuleModule;
3
+ export default requireNamedEffectFunctions;
@@ -0,0 +1,137 @@
1
+ import { TSESTree } from "@typescript-eslint/types";
2
+ /**
3
+ * Default effect hooks to check.
4
+ */
5
+ const DEFAULT_HOOKS = ["useEffect", "useLayoutEffect", "useInsertionEffect"];
6
+ /**
7
+ * Parses and validates rule options.
8
+ *
9
+ * @param optionsInput - Raw options from ESLint context.
10
+ * @returns Validated options with defaults.
11
+ */
12
+ function parseOptions(optionsInput) {
13
+ if (optionsInput === undefined) {
14
+ return {
15
+ environment: "roblox-ts",
16
+ hooks: DEFAULT_HOOKS,
17
+ };
18
+ }
19
+ if (typeof optionsInput !== "object" || optionsInput === null) {
20
+ return {
21
+ environment: "roblox-ts",
22
+ hooks: DEFAULT_HOOKS,
23
+ };
24
+ }
25
+ const opts = optionsInput;
26
+ const envValue = opts.environment;
27
+ const environment = envValue === "standard" ? "standard" : "roblox-ts";
28
+ const hooksValue = opts.hooks;
29
+ const hooks = Array.isArray(hooksValue) && hooksValue.every((h) => typeof h === "string") ? hooksValue : DEFAULT_HOOKS;
30
+ return { environment, hooks };
31
+ }
32
+ /**
33
+ * Gets the hook name from a call expression-like object.
34
+ *
35
+ * @param callExpr - The call expression object.
36
+ * @returns The hook name or undefined.
37
+ */
38
+ function getHookName(callExpr) {
39
+ const { callee } = callExpr;
40
+ if (callee.type === TSESTree.AST_NODE_TYPES.Identifier && callee.name)
41
+ return callee.name;
42
+ if (callee.type === TSESTree.AST_NODE_TYPES.MemberExpression &&
43
+ callee.property?.type === TSESTree.AST_NODE_TYPES.Identifier &&
44
+ callee.property.name)
45
+ return callee.property.name;
46
+ return undefined;
47
+ }
48
+ const requireNamedEffectFunctions = {
49
+ /**
50
+ * Creates the ESLint rule visitor.
51
+ *
52
+ * @param context - The ESLint rule context.
53
+ * @returns The visitor object with AST node handlers.
54
+ */
55
+ create(context) {
56
+ const options = parseOptions(context.options[0]);
57
+ const effectHooks = new Set(options.hooks);
58
+ const isRobloxTsMode = options.environment === "roblox-ts";
59
+ return {
60
+ CallExpression(node) {
61
+ const callExpr = node;
62
+ const hookName = getHookName(callExpr);
63
+ if (!hookName || !effectHooks.has(hookName))
64
+ return;
65
+ const firstArg = callExpr.arguments?.[0];
66
+ if (!firstArg)
67
+ return;
68
+ const argNode = firstArg;
69
+ if (argNode.type === TSESTree.AST_NODE_TYPES.Identifier)
70
+ return;
71
+ if (argNode.type === TSESTree.AST_NODE_TYPES.ArrowFunctionExpression) {
72
+ context.report({
73
+ data: { hook: hookName },
74
+ messageId: "arrowFunction",
75
+ node,
76
+ });
77
+ return;
78
+ }
79
+ if (argNode.type === TSESTree.AST_NODE_TYPES.FunctionExpression) {
80
+ if (argNode.id) {
81
+ if (isRobloxTsMode) {
82
+ context.report({
83
+ data: { hook: hookName },
84
+ messageId: "functionExpression",
85
+ node,
86
+ });
87
+ }
88
+ }
89
+ else {
90
+ context.report({
91
+ data: { hook: hookName },
92
+ messageId: "anonymousFunction",
93
+ node,
94
+ });
95
+ }
96
+ return;
97
+ }
98
+ },
99
+ };
100
+ },
101
+ meta: {
102
+ docs: {
103
+ description: "Enforce named effect functions for better debuggability. Prevents inline arrow functions in useEffect and similar hooks.",
104
+ recommended: false,
105
+ },
106
+ messages: {
107
+ anonymousFunction: "Use a named function instead of an anonymous function for better debuggability",
108
+ arrowFunction: "Use a named function instead of an arrow function for better debuggability",
109
+ functionExpression: "Use a named function reference instead of a function expression for better debuggability",
110
+ },
111
+ schema: [
112
+ {
113
+ additionalProperties: false,
114
+ properties: {
115
+ environment: {
116
+ default: "roblox-ts",
117
+ description: "Environment mode: 'roblox-ts' only allows identifiers, 'standard' allows both identifiers and named function expressions",
118
+ enum: ["roblox-ts", "standard"],
119
+ type: "string",
120
+ },
121
+ hooks: {
122
+ default: DEFAULT_HOOKS,
123
+ description: "Array of hook names to check",
124
+ items: {
125
+ type: "string",
126
+ },
127
+ type: "array",
128
+ },
129
+ },
130
+ type: "object",
131
+ },
132
+ ],
133
+ type: "problem",
134
+ },
135
+ };
136
+ export default requireNamedEffectFunctions;
137
+ //# sourceMappingURL=require-named-effect-functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-named-effect-functions.js","sourceRoot":"","sources":["../../src/rules/require-named-effect-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD;;GAEG;AACH,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAU,CAAC;AAetF;;;;;GAKG;AACH,SAAS,YAAY,CAAC,YAAqB;IAC1C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO;YACN,WAAW,EAAE,WAAW;YACxB,KAAK,EAAE,aAAa;SACpB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC/D,OAAO;YACN,WAAW,EAAE,WAAW;YACxB,KAAK,EAAE,aAAa;SACpB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,YAA4C,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;IAClC,MAAM,WAAW,GAAoB,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAExF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;IAC9B,MAAM,KAAK,GACV,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;IAE1G,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,QAEpB;IACA,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAE5B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAE1F,IACC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,gBAAgB;QACxD,MAAM,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,UAAU;QAC5D,MAAM,CAAC,QAAQ,CAAC,IAAI;QAEpB,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAE7B,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,2BAA2B,GAAoB;IACpD;;;;;OAKG;IACH,MAAM,CAAC,OAAO;QACb,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,KAAK,WAAW,CAAC;QAE3D,OAAO;YACN,cAAc,CAAC,IAAe;gBAC7B,MAAM,QAAQ,GAAG,IAA4D,CAAC;gBAE9E,MAAM,QAAQ,GAAG,WAAW,CAAC,QAA6C,CAAC,CAAC;gBAC5E,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,OAAO;gBAEpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBAEtB,MAAM,OAAO,GAAG,QAA0C,CAAC;gBAE3D,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,UAAU;oBAAE,OAAO;gBAEhE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC;oBACtE,OAAO,CAAC,MAAM,CAAC;wBACd,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxB,SAAS,EAAE,eAAe;wBAC1B,IAAI;qBACJ,CAAC,CAAC;oBACH,OAAO;gBACR,CAAC;gBAED,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,cAAc,CAAC,kBAAkB,EAAE,CAAC;oBACjE,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;wBAChB,IAAI,cAAc,EAAE,CAAC;4BACpB,OAAO,CAAC,MAAM,CAAC;gCACd,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACxB,SAAS,EAAE,oBAAoB;gCAC/B,IAAI;6BACJ,CAAC,CAAC;wBACJ,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,OAAO,CAAC,MAAM,CAAC;4BACd,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,SAAS,EAAE,mBAAmB;4BAC9B,IAAI;yBACJ,CAAC,CAAC;oBACJ,CAAC;oBACD,OAAO;gBACR,CAAC;YACF,CAAC;SACD,CAAC;IACH,CAAC;IACD,IAAI,EAAE;QACL,IAAI,EAAE;YACL,WAAW,EACV,0HAA0H;YAC3H,WAAW,EAAE,KAAK;SAClB;QACD,QAAQ,EAAE;YACT,iBAAiB,EAAE,gFAAgF;YACnG,aAAa,EAAE,4EAA4E;YAC3F,kBAAkB,EACjB,0FAA0F;SAC3F;QACD,MAAM,EAAE;YACP;gBACC,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACX,WAAW,EAAE;wBACZ,OAAO,EAAE,WAAW;wBACpB,WAAW,EACV,0HAA0H;wBAC3H,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;wBAC/B,IAAI,EAAE,QAAQ;qBACd;oBACD,KAAK,EAAE;wBACN,OAAO,EAAE,aAAa;wBACtB,WAAW,EAAE,8BAA8B;wBAC3C,KAAK,EAAE;4BACN,IAAI,EAAE,QAAQ;yBACd;wBACD,IAAI,EAAE,OAAO;qBACb;iBACD;gBACD,IAAI,EAAE,QAAQ;aACd;SACD;QACD,IAAI,EAAE,SAAS;KACf;CACD,CAAC;AAEF,eAAe,2BAA2B,CAAC"}
@@ -49,10 +49,9 @@ function ascendPastWrappers(node) {
49
49
  * @returns True if the element has a key attribute.
50
50
  */
51
51
  function hasKeyAttribute(node) {
52
- for (const attr of node.openingElement.attributes) {
53
- if (attr.type === "JSXAttribute" && attr.name.name === "key")
52
+ for (const attribute of node.openingElement.attributes)
53
+ if (attribute.type === "JSXAttribute" && attribute.name.name === "key")
54
54
  return true;
55
- }
56
55
  return false;
57
56
  }
58
57
  /**
@@ -63,69 +62,13 @@ function hasKeyAttribute(node) {
63
62
  */
64
63
  function isReactComponentHOC(callExpr) {
65
64
  const { callee } = callExpr;
66
- // Simple identifier: forwardRef(...) or memo(...)
67
- if (callee.type === "Identifier") {
65
+ if (callee.type === "Identifier")
68
66
  return callee.name === "forwardRef" || callee.name === "memo";
69
- }
70
- // Member expression: React.forwardRef(...) or React.memo(...)
71
67
  if (callee.type === "MemberExpression" &&
72
68
  callee.object.type === "Identifier" &&
73
69
  callee.object.name === "React" &&
74
- callee.property.type === "Identifier") {
70
+ callee.property.type === "Identifier")
75
71
  return callee.property.name === "forwardRef" || callee.property.name === "memo";
76
- }
77
- return false;
78
- }
79
- /**
80
- * Checks if a JSX element is inside a conditional or logical expression that is a JSX child,
81
- * and is the ONLY child (no siblings).
82
- *
83
- * @param node - The JSX element or fragment to check.
84
- * @returns True if inside a ternary/logical expression as the only JSX child.
85
- */
86
- function isInConditionalJSXChild(node) {
87
- let parent = node.parent;
88
- if (!parent)
89
- return false;
90
- // Check if the immediate parent is a conditional or logical expression
91
- const hasConditional = parent.type === "ConditionalExpression" || parent.type === "LogicalExpression";
92
- if (!hasConditional)
93
- return false;
94
- // Traverse up through conditional/logical expressions
95
- while (parent && (parent.type === "ConditionalExpression" || parent.type === "LogicalExpression")) {
96
- parent = parent.parent;
97
- }
98
- if (!parent)
99
- return false;
100
- // If the conditional/logical is inside a JSXExpressionContainer, check for siblings
101
- // Example: <div>{cond ? <A/> : <B/>}</div> - A and B don't need keys (only child)
102
- // Example: <div><X key="x"/>{cond && <A/>}</div> - A needs a key (has siblings)
103
- if (parent.type === "JSXExpressionContainer") {
104
- const jsxExprContainer = parent;
105
- const containerParent = jsxExprContainer.parent;
106
- if (!containerParent)
107
- return false;
108
- // Check if the parent is a JSX element or fragment
109
- if (containerParent.type === "JSXElement" || containerParent.type === "JSXFragment") {
110
- const children = containerParent.children;
111
- // Count non-whitespace children
112
- const significantChildren = children.filter((child) => {
113
- // JSXText nodes that are just whitespace don't count as siblings
114
- if (child.type === "JSXText") {
115
- return child.value.trim().length > 0;
116
- }
117
- return true;
118
- });
119
- // If there's more than one significant child, elements inside need keys
120
- if (significantChildren.length > 1) {
121
- return false;
122
- }
123
- // If it's the only child, elements inside don't need keys
124
- return true;
125
- }
126
- // For other parent types, default to requiring keys
127
- return false;
128
- }
129
72
  return false;
130
73
  }
131
74
  /**
@@ -139,9 +82,8 @@ function getEnclosingFunctionLike(node) {
139
82
  while (current) {
140
83
  if (current.type === "ArrowFunctionExpression" ||
141
84
  current.type === "FunctionExpression" ||
142
- current.type === "FunctionDeclaration") {
85
+ current.type === "FunctionDeclaration")
143
86
  return current;
144
- }
145
87
  current = current.parent;
146
88
  }
147
89
  return undefined;
@@ -222,16 +164,14 @@ function referenceActsAsCallback(reference) {
222
164
  */
223
165
  function isFunctionUsedAsCallback(context, fn) {
224
166
  const inlineCall = findEnclosingCallExpression(fn);
225
- if (inlineCall && !isReactComponentHOC(inlineCall)) {
167
+ if (inlineCall && !isReactComponentHOC(inlineCall))
226
168
  return true;
227
- }
228
169
  const variable = getVariableForFunction(context, fn);
229
170
  if (!variable)
230
171
  return false;
231
- for (const reference of variable.references) {
172
+ for (const reference of variable.references)
232
173
  if (referenceActsAsCallback(reference))
233
174
  return true;
234
- }
235
175
  return false;
236
176
  }
237
177
  /**
@@ -244,52 +184,36 @@ function isTopLevelReturn(node) {
244
184
  let parent = ascendPastWrappers(node.parent);
245
185
  if (!parent)
246
186
  return false;
247
- // Handle return with parentheses: return (<div>...)
248
187
  if (parent.type === "JSXExpressionContainer")
249
188
  parent = ascendPastWrappers(parent.parent);
250
189
  if (!parent)
251
190
  return false;
252
- // Traverse through conditional and logical expressions
253
- // Example: return condition ? <A/> : <B/>
254
- // Example: return condition && <Component/>
255
- while (parent && (parent.type === "ConditionalExpression" || parent.type === "LogicalExpression")) {
191
+ while (parent && (parent.type === "ConditionalExpression" || parent.type === "LogicalExpression"))
192
+ parent = ascendPastWrappers(parent.parent);
193
+ if (!parent)
194
+ return false;
195
+ if (parent.type === "JSXExpressionContainer")
256
196
  parent = ascendPastWrappers(parent.parent);
257
- }
258
197
  if (!parent)
259
198
  return false;
260
- // Handle direct return
261
199
  if (parent.type === "ReturnStatement") {
262
- // Walk up to find the containing function
263
200
  let currentNode = ascendPastWrappers(parent.parent);
264
- // Skip through block statement to get to function
265
- if (currentNode?.type === "BlockStatement") {
201
+ if (currentNode?.type === "BlockStatement")
266
202
  currentNode = ascendPastWrappers(currentNode.parent);
267
- }
268
203
  if (!currentNode)
269
204
  return false;
270
- // Check if this is a callback (arrow/function expression inside a call expression)
271
205
  if (currentNode.type === "ArrowFunctionExpression" || currentNode.type === "FunctionExpression") {
272
- // If the function is an argument to a call expression, check if it's a React HOC
273
206
  const functionParent = ascendPastWrappers(currentNode.parent);
274
- if (functionParent?.type === "CallExpression") {
275
- // React.forwardRef and React.memo callbacks are component definitions, treat as top-level
207
+ if (functionParent?.type === "CallExpression")
276
208
  return isReactComponentHOC(functionParent);
277
- }
278
- // Not inside a call expression, so it's a top-level component
279
209
  return true;
280
210
  }
281
- // Function declarations are always top-level
282
211
  return currentNode.type === "FunctionDeclaration";
283
212
  }
284
- // Handle arrow function direct return: () => <div>
285
213
  if (parent.type === "ArrowFunctionExpression") {
286
- // Check if this arrow function is inside a call expression
287
214
  const functionParent = ascendPastWrappers(parent.parent);
288
- if (functionParent?.type === "CallExpression") {
289
- // React.forwardRef and React.memo callbacks are component definitions, treat as top-level
215
+ if (functionParent?.type === "CallExpression")
290
216
  return isReactComponentHOC(functionParent);
291
- }
292
- // Not inside a call expression, so it's a top-level component
293
217
  return true;
294
218
  }
295
219
  return false;
@@ -305,30 +229,24 @@ function isIgnoredCallExpression(node, ignoreList) {
305
229
  let parent = node.parent;
306
230
  if (!parent)
307
231
  return false;
308
- // Handle JSXExpressionContainer wrapper
309
232
  if (parent.type === "JSXExpressionContainer") {
310
233
  parent = parent.parent;
311
234
  if (!parent)
312
235
  return false;
313
236
  }
314
- // Traverse up to find CallExpression
315
237
  const maxDepth = 20;
316
238
  for (let depth = 0; depth < maxDepth && parent; depth++) {
317
239
  const { type } = parent;
318
- // Found CallExpression - check if it's in the ignore list
319
240
  if (type === "CallExpression") {
320
241
  const { callee } = parent;
321
- // Simple identifier: mount(...)
322
242
  if (callee.type === "Identifier")
323
243
  return ignoreList.includes(callee.name);
324
- // Member expression: ReactTree.mount(...)
325
244
  if (callee.type === "MemberExpression" &&
326
245
  callee.object.type === "Identifier" &&
327
246
  callee.property.type === "Identifier")
328
247
  return ignoreList.includes(`${callee.object.name}.${callee.property.name}`);
329
248
  return false;
330
249
  }
331
- // Don't stop at any boundaries - continue traversing until we find CallExpression or run out of parents
332
250
  parent = parent.parent;
333
251
  }
334
252
  return false;
@@ -343,20 +261,15 @@ function isJSXPropValue(node) {
343
261
  let parent = node.parent;
344
262
  if (!parent)
345
263
  return false;
346
- // Traverse through conditional and logical expressions
347
- // Example: fallback={condition ? <A/> : <B/>}
348
- // Example: fallback={placeholder ?? <></>}
349
264
  while (parent && (parent.type === "ConditionalExpression" || parent.type === "LogicalExpression"))
350
265
  parent = parent.parent;
351
266
  if (!parent)
352
267
  return false;
353
- // Handle JSXExpressionContainer wrapper: prop={<div/>}
354
268
  if (parent.type === "JSXExpressionContainer") {
355
269
  parent = parent.parent;
356
270
  if (!parent)
357
271
  return false;
358
272
  }
359
- // Check if parent is a JSXAttribute (prop)
360
273
  return parent.type === "JSXAttribute";
361
274
  }
362
275
  const docs = {
@@ -384,7 +297,6 @@ const requireReactComponentKeys = {
384
297
  const functionLike = getEnclosingFunctionLike(node);
385
298
  const isCallback = functionLike ? isFunctionUsedAsCallback(context, functionLike) : false;
386
299
  const isRoot = isTopLevelReturn(node);
387
- // Check if root component has a key (and it's not allowed)
388
300
  if (isRoot && !isCallback) {
389
301
  if (!options.allowRootKeys && node.type === "JSXElement" && hasKeyAttribute(node)) {
390
302
  context.report({
@@ -394,17 +306,10 @@ const requireReactComponentKeys = {
394
306
  }
395
307
  return;
396
308
  }
397
- // Skip key requirement for ignored call expressions
398
309
  if (isIgnoredCallExpression(node, options.ignoreCallExpressions))
399
310
  return;
400
- // Skip key requirement for JSX passed as props
401
311
  if (isJSXPropValue(node))
402
312
  return;
403
- // Skip key requirement for elements in conditional/logical expressions as JSX children
404
- // Example: <div>{cond ? <A/> : <B/>}</div> - A and B don't need keys
405
- if (isInConditionalJSXChild(node))
406
- return;
407
- // Fragments always need keys when not top-level
408
313
  if (node.type === "JSXFragment") {
409
314
  context.report({
410
315
  messageId: "missingKey",
@@ -412,7 +317,6 @@ const requireReactComponentKeys = {
412
317
  });
413
318
  return;
414
319
  }
415
- // Check if element has key
416
320
  if (!hasKeyAttribute(node)) {
417
321
  context.report({
418
322
  messageId: "missingKey",
@@ -421,11 +325,9 @@ const requireReactComponentKeys = {
421
325
  }
422
326
  }
423
327
  return {
424
- // Check JSX elements
425
328
  JSXElement(node) {
426
329
  checkElement(node);
427
330
  },
428
- // Check JSX fragments
429
331
  JSXFragment(node) {
430
332
  checkElement(node);
431
333
  },
@@ -1 +1 @@
1
- {"version":3,"file":"require-react-component-keys.js","sourceRoot":"","sources":["../../src/rules/require-react-component-keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"require-react-component-keys.js","sourceRoot":"","sources":["../../src/rules/require-react-component-keys.ts"],"names":[],"mappings":"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"}