@pobammer-ts/eslint-cease-nonsense-rules 1.14.1 → 1.15.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.
Files changed (114) hide show
  1. package/README.md +72 -0
  2. package/dist/build-metadata.json +3 -3
  3. package/dist/constants/react-sources.d.ts +4 -0
  4. package/dist/index.d.ts +5 -3
  5. package/dist/index.js +400 -200
  6. package/dist/oxfmt-sync.d.ts +0 -1
  7. package/dist/oxfmt-worker.d.ts +0 -1
  8. package/dist/oxfmt-worker.js +0 -2
  9. package/dist/recognizers/camel-case-detector.d.ts +0 -1
  10. package/dist/recognizers/code-recognizer.d.ts +0 -1
  11. package/dist/recognizers/contains-detector.d.ts +0 -1
  12. package/dist/recognizers/detector.d.ts +0 -1
  13. package/dist/recognizers/end-with-detector.d.ts +0 -1
  14. package/dist/recognizers/javascript-footprint.d.ts +0 -1
  15. package/dist/recognizers/keywords-detector.d.ts +0 -1
  16. package/dist/rules/ban-instances.d.ts +0 -1
  17. package/dist/rules/ban-react-fc.d.ts +0 -1
  18. package/dist/rules/enforce-ianitor-check-type.d.ts +0 -1
  19. package/dist/rules/fast-format.d.ts +0 -1
  20. package/dist/rules/no-async-constructor.d.ts +0 -1
  21. package/dist/rules/no-color3-constructor.d.ts +0 -1
  22. package/dist/rules/no-commented-code.d.ts +0 -1
  23. package/dist/rules/no-god-components.d.ts +0 -1
  24. package/dist/rules/no-identity-map.d.ts +0 -1
  25. package/dist/rules/no-instance-methods-without-this.d.ts +0 -1
  26. package/dist/rules/no-memo-children.d.ts +19 -0
  27. package/dist/rules/no-print.d.ts +0 -1
  28. package/dist/rules/no-shorthand-names.d.ts +0 -1
  29. package/dist/rules/no-useless-use-spring.d.ts +0 -1
  30. package/dist/rules/no-warn.d.ts +0 -1
  31. package/dist/rules/prefer-class-properties.d.ts +0 -1
  32. package/dist/rules/prefer-early-return.d.ts +0 -1
  33. package/dist/rules/prefer-enum-item.d.ts +0 -1
  34. package/dist/rules/prefer-module-scope-constants.d.ts +0 -1
  35. package/dist/rules/prefer-pascal-case-enums.d.ts +0 -1
  36. package/dist/rules/prefer-pattern-replacements.d.ts +0 -1
  37. package/dist/rules/prefer-sequence-overloads.d.ts +0 -1
  38. package/dist/rules/prefer-singular-enums.d.ts +0 -1
  39. package/dist/rules/prefer-udim2-shorthand.d.ts +0 -1
  40. package/dist/rules/react-hooks-strict-return.d.ts +0 -1
  41. package/dist/rules/require-named-effect-functions.d.ts +1 -4
  42. package/dist/rules/require-paired-calls.d.ts +0 -1
  43. package/dist/rules/require-react-component-keys.d.ts +0 -1
  44. package/dist/rules/require-react-display-names.d.ts +1 -2
  45. package/dist/rules/strict-component-boundaries.d.ts +5 -2
  46. package/dist/rules/use-exhaustive-dependencies.d.ts +0 -1
  47. package/dist/rules/use-hook-at-top-level.d.ts +0 -1
  48. package/dist/types/environment-mode.d.ts +3 -0
  49. package/dist/utilities/casing-utilities.d.ts +0 -1
  50. package/dist/utilities/configure-utilities.d.ts +7 -1
  51. package/dist/utilities/create-rule.d.ts +0 -1
  52. package/dist/utilities/format-utilities.d.ts +0 -1
  53. package/dist/utilities/pattern-replacement/constant-folder.d.ts +0 -1
  54. package/dist/utilities/pattern-replacement/index.d.ts +0 -1
  55. package/dist/utilities/pattern-replacement/pattern-matcher.d.ts +0 -1
  56. package/dist/utilities/pattern-replacement/pattern-parser.d.ts +0 -1
  57. package/dist/utilities/pattern-replacement/pattern-types.d.ts +0 -1
  58. package/dist/utilities/pattern-replacement/replacement-generator.d.ts +0 -1
  59. package/dist/utilities/resolve-import.d.ts +0 -1
  60. package/package.json +5 -4
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/index.js.map +0 -725
  63. package/dist/oxfmt-sync.d.ts.map +0 -1
  64. package/dist/oxfmt-worker.d.ts.map +0 -1
  65. package/dist/oxfmt-worker.js.map +0 -10
  66. package/dist/recognizers/camel-case-detector.d.ts.map +0 -1
  67. package/dist/recognizers/code-recognizer.d.ts.map +0 -1
  68. package/dist/recognizers/contains-detector.d.ts.map +0 -1
  69. package/dist/recognizers/detector.d.ts.map +0 -1
  70. package/dist/recognizers/end-with-detector.d.ts.map +0 -1
  71. package/dist/recognizers/javascript-footprint.d.ts.map +0 -1
  72. package/dist/recognizers/keywords-detector.d.ts.map +0 -1
  73. package/dist/rules/ban-instances.d.ts.map +0 -1
  74. package/dist/rules/ban-react-fc.d.ts.map +0 -1
  75. package/dist/rules/enforce-ianitor-check-type.d.ts.map +0 -1
  76. package/dist/rules/fast-format.d.ts.map +0 -1
  77. package/dist/rules/no-async-constructor.d.ts.map +0 -1
  78. package/dist/rules/no-color3-constructor.d.ts.map +0 -1
  79. package/dist/rules/no-commented-code.d.ts.map +0 -1
  80. package/dist/rules/no-god-components.d.ts.map +0 -1
  81. package/dist/rules/no-identity-map.d.ts.map +0 -1
  82. package/dist/rules/no-instance-methods-without-this.d.ts.map +0 -1
  83. package/dist/rules/no-print.d.ts.map +0 -1
  84. package/dist/rules/no-shorthand-names.d.ts.map +0 -1
  85. package/dist/rules/no-useless-use-spring.d.ts.map +0 -1
  86. package/dist/rules/no-warn.d.ts.map +0 -1
  87. package/dist/rules/prefer-class-properties.d.ts.map +0 -1
  88. package/dist/rules/prefer-early-return.d.ts.map +0 -1
  89. package/dist/rules/prefer-enum-item.d.ts.map +0 -1
  90. package/dist/rules/prefer-module-scope-constants.d.ts.map +0 -1
  91. package/dist/rules/prefer-pascal-case-enums.d.ts.map +0 -1
  92. package/dist/rules/prefer-pattern-replacements.d.ts.map +0 -1
  93. package/dist/rules/prefer-sequence-overloads.d.ts.map +0 -1
  94. package/dist/rules/prefer-singular-enums.d.ts.map +0 -1
  95. package/dist/rules/prefer-udim2-shorthand.d.ts.map +0 -1
  96. package/dist/rules/react-hooks-strict-return.d.ts.map +0 -1
  97. package/dist/rules/require-named-effect-functions.d.ts.map +0 -1
  98. package/dist/rules/require-paired-calls.d.ts.map +0 -1
  99. package/dist/rules/require-react-component-keys.d.ts.map +0 -1
  100. package/dist/rules/require-react-display-names.d.ts.map +0 -1
  101. package/dist/rules/strict-component-boundaries.d.ts.map +0 -1
  102. package/dist/rules/use-exhaustive-dependencies.d.ts.map +0 -1
  103. package/dist/rules/use-hook-at-top-level.d.ts.map +0 -1
  104. package/dist/utilities/casing-utilities.d.ts.map +0 -1
  105. package/dist/utilities/configure-utilities.d.ts.map +0 -1
  106. package/dist/utilities/create-rule.d.ts.map +0 -1
  107. package/dist/utilities/format-utilities.d.ts.map +0 -1
  108. package/dist/utilities/pattern-replacement/constant-folder.d.ts.map +0 -1
  109. package/dist/utilities/pattern-replacement/index.d.ts.map +0 -1
  110. package/dist/utilities/pattern-replacement/pattern-matcher.d.ts.map +0 -1
  111. package/dist/utilities/pattern-replacement/pattern-parser.d.ts.map +0 -1
  112. package/dist/utilities/pattern-replacement/pattern-types.d.ts.map +0 -1
  113. package/dist/utilities/pattern-replacement/replacement-generator.d.ts.map +0 -1
  114. package/dist/utilities/resolve-import.d.ts.map +0 -1
package/README.md CHANGED
@@ -49,6 +49,7 @@ export default [
49
49
  "cease-nonsense/no-god-components": "error",
50
50
  "cease-nonsense/no-identity-map": "error",
51
51
  "cease-nonsense/no-instance-methods-without-this": "error",
52
+ "cease-nonsense/no-memo-children": "error",
52
53
  "cease-nonsense/no-print": "error",
53
54
  "cease-nonsense/prefer-enum-item": "error",
54
55
  "cease-nonsense/no-shorthand-names": "error",
@@ -215,6 +216,77 @@ function Input() {
215
216
  }
216
217
  ```
217
218
 
219
+ #### `no-memo-children`
220
+
221
+ Disallow `React.memo` on components that accept a `children` prop, since children typically change on every render and defeat memoization.
222
+
223
+ **Why**
224
+
225
+ `React.memo` performs a shallow comparison of props. When a component accepts `children`, the `children` prop is typically a new JSX element on every parent render. This causes the shallow comparison to fail every time, making `memo` useless while adding overhead.
226
+
227
+ **Configuration**
228
+
229
+ ```typescript
230
+ {
231
+ "cease-nonsense/no-memo-children": ["error", {
232
+ "allowedComponents": ["Modal", "Drawer"], // Allow specific components
233
+ "environment": "roblox-ts" // or "standard"
234
+ }]
235
+ }
236
+ ```
237
+
238
+ **❌ Bad**
239
+
240
+ ```typescript
241
+ import { memo, ReactNode } from "@rbxts/react";
242
+
243
+ interface CardProps {
244
+ readonly title: string;
245
+ readonly children?: ReactNode;
246
+ }
247
+
248
+ // memo is useless - children change every render
249
+ const Card = memo<CardProps>(({ title, children }) => {
250
+ return (
251
+ <frame>
252
+ <textlabel Text={title} />
253
+ {children}
254
+ </frame>
255
+ );
256
+ });
257
+ ```
258
+
259
+ **✅ Good**
260
+
261
+ ```typescript
262
+ import { memo, ReactNode } from "@rbxts/react";
263
+
264
+ // Option 1: Remove memo if you need children
265
+ interface CardProps {
266
+ readonly title: string;
267
+ readonly children?: ReactNode;
268
+ }
269
+
270
+ function Card({ title, children }: CardProps) {
271
+ return (
272
+ <frame>
273
+ <textlabel Text={title} />
274
+ {children}
275
+ </frame>
276
+ );
277
+ }
278
+
279
+ // Option 2: Use render prop instead of children
280
+ interface ListProps<T> {
281
+ readonly items: ReadonlyArray<T>;
282
+ readonly renderItem: (item: T) => ReactNode;
283
+ }
284
+
285
+ const List = memo(<T,>({ items, renderItem }: ListProps<T>) => {
286
+ return <frame>{items.map(renderItem)}</frame>;
287
+ });
288
+ ```
289
+
218
290
  #### `no-god-components`
219
291
 
220
292
  Flags React components that are too large or doing too much, encouraging better separation of concerns.
@@ -1,5 +1,5 @@
1
1
  {
2
- "commit": "a1999eb0db192f808a0d523d82258f6e35864ed3",
3
- "time": "2026-01-10T03:50:18.800Z",
4
- "version": "1.14.1"
2
+ "commit": "02202d06fed3e5ad1ec4ef66f32874643bcbaa18",
3
+ "time": "2026-01-11T20:59:08.304Z",
4
+ "version": "1.15.0"
5
5
  }
@@ -0,0 +1,4 @@
1
+ import type { TSESTree } from "@typescript-eslint/types";
2
+ import type { EnvironmentMode } from "../types/environment-mode";
3
+ export declare function getReactSources(environment: EnvironmentMode): Set<string>;
4
+ export declare function isReactImport(node: TSESTree.ImportDeclaration, reactSources: Set<string>): boolean;
package/dist/index.d.ts CHANGED
@@ -5,15 +5,17 @@ export type { ComplexityConfiguration } from "./rules/enforce-ianitor-check-type
5
5
  export type { NoGodComponentsOptions } from "./rules/no-god-components";
6
6
  export type { NoIdentityMapOptions } from "./rules/no-identity-map";
7
7
  export type { NoInstanceMethodsOptions } from "./rules/no-instance-methods-without-this";
8
+ export type { NoMemoChildrenOptions } from "./rules/no-memo-children";
8
9
  export type { NoShorthandOptions } from "./rules/no-shorthand-names";
9
10
  export type { NoUselessUseSpringOptions } from "./rules/no-useless-use-spring";
10
11
  export type { PreferEnumItemOptions } from "./rules/prefer-enum-item";
11
- export type { EffectFunctionOptions, EnvironmentMode, HookConfiguration } from "./rules/require-named-effect-functions";
12
+ export type { EffectFunctionOptions, HookConfiguration } from "./rules/require-named-effect-functions";
12
13
  export type { PairConfiguration, RequirePairedCallsOptions } from "./rules/require-paired-calls";
13
14
  export type { ReactKeysOptions } from "./rules/require-react-component-keys";
14
15
  export type { RequireReactDisplayNamesOptions } from "./rules/require-react-display-names";
15
16
  export type { HookEntry, UseExhaustiveDependenciesOptions } from "./rules/use-exhaustive-dependencies";
16
- export { createBanInstancesOptions, createComplexityConfiguration, createEffectFunctionOptions, createHookConfiguration, createNoGodComponentsOptions, createNoInstanceMethodsOptions, createNoShorthandOptions, createNoUselessUseSpringOptions, createPairConfiguration, createPreferPatternReplacementsOptions, createReactKeysOptions, createRequirePairedCallsOptions, createRequireReactDisplayNamesOptions, createUseExhaustiveDependenciesOptions, createUseHookAtTopLevelOptions, defaultRobloxProfilePair, } from "./utilities/configure-utilities";
17
+ export type { EnvironmentMode } from "./types/environment-mode";
18
+ export { createBanInstancesOptions, createComplexityConfiguration, createEffectFunctionOptions, createHookConfiguration, createNoGodComponentsOptions, createNoInstanceMethodsOptions, createNoMemoChildrenOptions, createNoShorthandOptions, createNoUselessUseSpringOptions, createPairConfiguration, createPreferPatternReplacementsOptions, createReactKeysOptions, createRequirePairedCallsOptions, createRequireReactDisplayNamesOptions, createUseExhaustiveDependenciesOptions, createUseHookAtTopLevelOptions, defaultRobloxProfilePair, } from "./utilities/configure-utilities";
17
19
  export type { Pattern, PreferPatternReplacementsOptions } from "./utilities/pattern-replacement";
18
20
  export { pattern } from "./utilities/pattern-replacement";
19
21
  /**
@@ -47,6 +49,7 @@ declare const recommended: {
47
49
  readonly "cease-nonsense/no-god-components": "error";
48
50
  readonly "cease-nonsense/no-identity-map": "error";
49
51
  readonly "cease-nonsense/no-instance-methods-without-this": "error";
52
+ readonly "cease-nonsense/no-memo-children": "error";
50
53
  readonly "cease-nonsense/no-print": "error";
51
54
  readonly "cease-nonsense/no-shorthand-names": "error";
52
55
  readonly "cease-nonsense/no-warn": "error";
@@ -68,4 +71,3 @@ interface Plugin {
68
71
  }
69
72
  declare const plugin: Plugin;
70
73
  export default plugin;
71
- //# sourceMappingURL=index.d.ts.map