@pobammer-ts/eslint-cease-nonsense-rules 1.10.0 → 1.12.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 (68) hide show
  1. package/README.md +149 -0
  2. package/dist/build-metadata.json +3 -3
  3. package/dist/index.d.ts +9 -6
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1056 -295
  6. package/dist/index.js.map +50 -41
  7. package/dist/rules/ban-instances.d.ts +6 -7
  8. package/dist/rules/ban-instances.d.ts.map +1 -1
  9. package/dist/rules/ban-react-fc.d.ts +4 -7
  10. package/dist/rules/ban-react-fc.d.ts.map +1 -1
  11. package/dist/rules/enforce-ianitor-check-type.d.ts +7 -3
  12. package/dist/rules/enforce-ianitor-check-type.d.ts.map +1 -1
  13. package/dist/rules/no-async-constructor.d.ts +4 -5
  14. package/dist/rules/no-async-constructor.d.ts.map +1 -1
  15. package/dist/rules/no-color3-constructor.d.ts +4 -3
  16. package/dist/rules/no-color3-constructor.d.ts.map +1 -1
  17. package/dist/rules/no-commented-code.d.ts.map +1 -1
  18. package/dist/rules/no-god-components.d.ts.map +1 -1
  19. package/dist/rules/no-identity-map.d.ts +4 -2
  20. package/dist/rules/no-identity-map.d.ts.map +1 -1
  21. package/dist/rules/no-instance-methods-without-this.d.ts +4 -9
  22. package/dist/rules/no-instance-methods-without-this.d.ts.map +1 -1
  23. package/dist/rules/no-print.d.ts +4 -3
  24. package/dist/rules/no-print.d.ts.map +1 -1
  25. package/dist/rules/no-useless-use-spring.d.ts +4 -4
  26. package/dist/rules/no-useless-use-spring.d.ts.map +1 -1
  27. package/dist/rules/no-warn.d.ts +4 -3
  28. package/dist/rules/no-warn.d.ts.map +1 -1
  29. package/dist/rules/prefer-class-properties.d.ts +4 -3
  30. package/dist/rules/prefer-class-properties.d.ts.map +1 -1
  31. package/dist/rules/prefer-early-return.d.ts +4 -4
  32. package/dist/rules/prefer-early-return.d.ts.map +1 -1
  33. package/dist/rules/prefer-module-scope-constants.d.ts +4 -2
  34. package/dist/rules/prefer-module-scope-constants.d.ts.map +1 -1
  35. package/dist/rules/prefer-pascal-case-enums.d.ts +4 -4
  36. package/dist/rules/prefer-pascal-case-enums.d.ts.map +1 -1
  37. package/dist/rules/prefer-pattern-replacements.d.ts +8 -0
  38. package/dist/rules/prefer-pattern-replacements.d.ts.map +1 -0
  39. package/dist/rules/prefer-sequence-overloads.d.ts +4 -7
  40. package/dist/rules/prefer-sequence-overloads.d.ts.map +1 -1
  41. package/dist/rules/prefer-singular-enums.d.ts +4 -4
  42. package/dist/rules/prefer-singular-enums.d.ts.map +1 -1
  43. package/dist/rules/react-hooks-strict-return.d.ts +4 -3
  44. package/dist/rules/react-hooks-strict-return.d.ts.map +1 -1
  45. package/dist/rules/require-named-effect-functions.d.ts.map +1 -1
  46. package/dist/rules/require-react-component-keys.d.ts +4 -5
  47. package/dist/rules/require-react-component-keys.d.ts.map +1 -1
  48. package/dist/rules/require-react-display-names.d.ts +11 -0
  49. package/dist/rules/require-react-display-names.d.ts.map +1 -0
  50. package/dist/rules/strict-component-boundaries.d.ts +4 -8
  51. package/dist/rules/strict-component-boundaries.d.ts.map +1 -1
  52. package/dist/utilities/configure-utilities.d.ts +14 -0
  53. package/dist/utilities/configure-utilities.d.ts.map +1 -1
  54. package/dist/utilities/create-rule.d.ts +9 -0
  55. package/dist/utilities/create-rule.d.ts.map +1 -0
  56. package/dist/utilities/pattern-replacement/constant-folder.d.ts +24 -0
  57. package/dist/utilities/pattern-replacement/constant-folder.d.ts.map +1 -0
  58. package/dist/utilities/pattern-replacement/index.d.ts +7 -0
  59. package/dist/utilities/pattern-replacement/index.d.ts.map +1 -0
  60. package/dist/utilities/pattern-replacement/pattern-matcher.d.ts +62 -0
  61. package/dist/utilities/pattern-replacement/pattern-matcher.d.ts.map +1 -0
  62. package/dist/utilities/pattern-replacement/pattern-parser.d.ts +22 -0
  63. package/dist/utilities/pattern-replacement/pattern-parser.d.ts.map +1 -0
  64. package/dist/utilities/pattern-replacement/pattern-types.d.ts +69 -0
  65. package/dist/utilities/pattern-replacement/pattern-types.d.ts.map +1 -0
  66. package/dist/utilities/pattern-replacement/replacement-generator.d.ts +16 -0
  67. package/dist/utilities/pattern-replacement/replacement-generator.d.ts.map +1 -0
  68. package/package.json +17 -17
package/README.md CHANGED
@@ -57,6 +57,7 @@ export default [
57
57
  "cease-nonsense/prefer-early-return": "error",
58
58
  "cease-nonsense/prefer-module-scope-constants": "error",
59
59
  "cease-nonsense/prefer-pascal-case-enums": "error",
60
+ "cease-nonsense/prefer-pattern-replacements": "error",
60
61
  "cease-nonsense/prefer-sequence-overloads": "error",
61
62
  "cease-nonsense/prefer-singular-enums": "error",
62
63
  "cease-nonsense/prefer-udim2-shorthand": "error",
@@ -64,6 +65,7 @@ export default [
64
65
  "cease-nonsense/require-named-effect-functions": "error",
65
66
  "cease-nonsense/require-paired-calls": "error",
66
67
  "cease-nonsense/require-react-component-keys": "error",
68
+ "cease-nonsense/require-react-display-names": "error",
67
69
  "cease-nonsense/strict-component-boundaries": "error",
68
70
  "cease-nonsense/use-exhaustive-dependencies": "error",
69
71
  "cease-nonsense/use-hook-at-top-level": "error",
@@ -427,6 +429,63 @@ function UserProfile({ userId }) {
427
429
  }
428
430
  ```
429
431
 
432
+ #### `require-react-display-names`
433
+
434
+ Require `displayName` property on exported `React.memo` components and `React.createContext` contexts for better debugging.
435
+
436
+ **Configuration**
437
+
438
+ ```typescript
439
+ {
440
+ "cease-nonsense/require-react-display-names": ["error", {
441
+ "environment": "roblox-ts" // or "standard" for regular React
442
+ }]
443
+ }
444
+ ```
445
+
446
+ **❌ Bad**
447
+
448
+ ```typescript
449
+ import { memo } from "@rbxts/react";
450
+
451
+ function CoolFrameNoMemo() {
452
+ return <frame />;
453
+ }
454
+
455
+ // Direct export without displayName
456
+ export default memo(CoolFrameNoMemo);
457
+ ```
458
+
459
+ ```typescript
460
+ import React from "@rbxts/react";
461
+
462
+ // Missing displayName
463
+ const ErrorBoundaryContext = React.createContext<unknown>(undefined);
464
+ export default ErrorBoundaryContext;
465
+ ```
466
+
467
+ **✅ Good**
468
+
469
+ ```typescript
470
+ import { memo } from "@rbxts/react";
471
+
472
+ function CoolFrameNoMemo() {
473
+ return <frame />;
474
+ }
475
+
476
+ export const CoolFrame = memo(CoolFrameNoMemo);
477
+ CoolFrame.displayName = "CoolFrame";
478
+ export default CoolFrame;
479
+ ```
480
+
481
+ ```typescript
482
+ import React from "@rbxts/react";
483
+
484
+ const ErrorBoundaryContext = React.createContext<unknown>(undefined);
485
+ ErrorBoundaryContext.displayName = "ErrorBoundaryContext";
486
+ export default ErrorBoundaryContext;
487
+ ```
488
+
430
489
  #### `react-hooks-strict-return`
431
490
 
432
491
  React hooks must return a tuple of ≤2 elements or a single object. Prevents unwieldy hook return types.
@@ -923,6 +982,96 @@ const deltaTime = 0.016;
923
982
  const model = entity.char; // Property access is allowed
924
983
  ```
925
984
 
985
+ #### `prefer-pattern-replacements`
986
+
987
+ Enforces replacement of verbose constructor/method patterns with simpler alternatives.
988
+
989
+ **Features**
990
+
991
+ - ✨ Has auto-fix
992
+ - Type-safe `pattern()` API with compile-time capture validation
993
+ - Supports captures (`$x`), optional args (`0?`), wildcards (`_`)
994
+ - Constant expression evaluation (`1 - 1` matches `0`)
995
+ - Same-variable matching (`$x, $x` requires identical arguments)
996
+ - Scope-aware: skips fix if replacement would shadow local variable
997
+
998
+ **Configuration**
999
+
1000
+ ```typescript
1001
+ import { pattern } from "@pobammer-ts/eslint-cease-nonsense-rules";
1002
+
1003
+ {
1004
+ "cease-nonsense/prefer-pattern-replacements": ["error", {
1005
+ "patterns": [
1006
+ // Simple patterns
1007
+ pattern({
1008
+ match: "UDim2.fromScale(1, 1)",
1009
+ replacement: "oneScale"
1010
+ }),
1011
+
1012
+ // Captures and conditions
1013
+ pattern({
1014
+ match: "new Vector2($x, $x)",
1015
+ replacement: "fromUniform($x)",
1016
+ when: { x: "!= 0" }
1017
+ }),
1018
+
1019
+ // Optional args (0? matches 0 or missing)
1020
+ pattern({
1021
+ match: "new Vector2($x, 0?)",
1022
+ replacement: "fromX($x)"
1023
+ }),
1024
+
1025
+ // Wildcards (match any value, don't capture)
1026
+ pattern({
1027
+ match: "new UDim2(_, 0, _, 0)",
1028
+ replacement: "UDim2.fromScale"
1029
+ })
1030
+ ]
1031
+ }]
1032
+ }
1033
+ ```
1034
+
1035
+ **Pattern syntax**
1036
+
1037
+ - `$name` - Capture variable, stores value for replacement
1038
+ - `0?` - Optional: matches literal `0` or missing argument
1039
+ - `_` - Wildcard: matches any value, not captured
1040
+ - `when` clause - Conditions on captures (`== 0`, `!= 0`, `> 5`, etc.)
1041
+
1042
+ **Replacement types**
1043
+
1044
+ - Identifier: `oneScale`
1045
+ - Static access: `Vector2.one`
1046
+ - Call: `fromUniform($x)` or `Vector2.fromUniform($x, $y)`
1047
+
1048
+ **❌ Bad**
1049
+
1050
+ ```typescript
1051
+ const scale = UDim2.fromScale(1, 1);
1052
+ const vec = new Vector2(5, 5);
1053
+ const offset = new Vector2(10, 0);
1054
+ ```
1055
+
1056
+ **✅ Good**
1057
+
1058
+ ```typescript
1059
+ const scale = oneScale;
1060
+ const vec = fromUniform(5);
1061
+ const offset = fromX(10);
1062
+ ```
1063
+
1064
+ **Scope awareness**
1065
+
1066
+ The rule automatically skips fixes when the replacement would conflict with a local variable:
1067
+
1068
+ ```typescript
1069
+ function example() {
1070
+ const oneScale = 5; // Local variable shadows replacement
1071
+ const scale = UDim2.fromScale(1, 1); // No fix applied (would shadow)
1072
+ }
1073
+ ```
1074
+
926
1075
  #### `prefer-class-properties`
927
1076
 
928
1077
  Prefer class properties over assignment of literals in constructors.
@@ -1,5 +1,5 @@
1
1
  {
2
- "commit": "8104213e0676ebea2ce52403f0e6559fb13d576e",
3
- "time": "2025-12-23T03:11:07.286Z",
4
- "version": "1.10.0"
2
+ "commit": "0c941c22d06cca23db96491078c85d1b80fb0191",
3
+ "time": "2026-01-01T05:26:31.863Z",
4
+ "version": "1.12.0"
5
5
  }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import type { TSESLint } from "@typescript-eslint/utils";
2
- import type { Rule } from "eslint";
3
- type AnyRuleModule = Rule.RuleModule | TSESLint.AnyRuleModuleWithMetaDocs;
1
+ import type { LooseRuleDefinition } from "@typescript-eslint/utils/ts-eslint";
2
+ import type { ReadonlyRecord } from "./types/utility-types.d";
4
3
  export type { BanInstancesOptions } from "./rules/ban-instances";
5
4
  export type { ComplexityConfiguration } from "./rules/enforce-ianitor-check-type";
6
5
  export type { NoGodComponentsOptions } from "./rules/no-god-components";
@@ -11,8 +10,11 @@ export type { NoUselessUseSpringOptions } from "./rules/no-useless-use-spring";
11
10
  export type { EffectFunctionOptions, EnvironmentMode, HookConfiguration } from "./rules/require-named-effect-functions";
12
11
  export type { PairConfiguration, RequirePairedCallsOptions } from "./rules/require-paired-calls";
13
12
  export type { ReactKeysOptions } from "./rules/require-react-component-keys";
13
+ export type { RequireReactDisplayNamesOptions } from "./rules/require-react-display-names";
14
14
  export type { HookEntry, UseExhaustiveDependenciesOptions } from "./rules/use-exhaustive-dependencies";
15
- export { createBanInstancesOptions, createComplexityConfiguration, createEffectFunctionOptions, createHookConfiguration, createNoGodComponentsOptions, createNoInstanceMethodsOptions, createNoShorthandOptions, createNoUselessUseSpringOptions, createPairConfiguration, createReactKeysOptions, createRequirePairedCallsOptions, createUseExhaustiveDependenciesOptions, createUseHookAtTopLevelOptions, defaultRobloxProfilePair, } from "./utilities/configure-utilities";
15
+ export { createBanInstancesOptions, createComplexityConfiguration, createEffectFunctionOptions, createHookConfiguration, createNoGodComponentsOptions, createNoInstanceMethodsOptions, createNoShorthandOptions, createNoUselessUseSpringOptions, createPairConfiguration, createPreferPatternReplacementsOptions, createReactKeysOptions, createRequirePairedCallsOptions, createRequireReactDisplayNamesOptions, createUseExhaustiveDependenciesOptions, createUseHookAtTopLevelOptions, defaultRobloxProfilePair, } from "./utilities/configure-utilities";
16
+ export type { Pattern, PreferPatternReplacementsOptions } from "./utilities/pattern-replacement";
17
+ export { pattern } from "./utilities/pattern-replacement";
16
18
  /**
17
19
  * Recommended configuration for ESLint flat config.
18
20
  *
@@ -32,7 +34,7 @@ export { createBanInstancesOptions, createComplexityConfiguration, createEffectF
32
34
  declare const recommended: {
33
35
  readonly plugins: {
34
36
  readonly "cease-nonsense": {
35
- readonly rules: Readonly<Record<string, AnyRuleModule>>;
37
+ readonly rules: Readonly<Record<string, LooseRuleDefinition>>;
36
38
  };
37
39
  };
38
40
  readonly rules: {
@@ -51,13 +53,14 @@ declare const recommended: {
51
53
  readonly "cease-nonsense/prefer-udim2-shorthand": "error";
52
54
  readonly "cease-nonsense/require-named-effect-functions": "error";
53
55
  readonly "cease-nonsense/require-react-component-keys": "error";
56
+ readonly "cease-nonsense/require-react-display-names": "error";
54
57
  readonly "cease-nonsense/use-exhaustive-dependencies": "error";
55
58
  readonly "cease-nonsense/use-hook-at-top-level": "error";
56
59
  };
57
60
  };
58
61
  type PluginConfig = typeof recommended;
59
62
  interface Plugin {
60
- readonly rules: Readonly<Record<string, AnyRuleModule>>;
63
+ readonly rules: ReadonlyRecord<string, LooseRuleDefinition>;
61
64
  readonly configs: {
62
65
  readonly recommended: PluginConfig;
63
66
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA8BnC,KAAK,aAAa,GAAG,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,yBAAyB,CAAC;AAE1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACxH,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,YAAY,EAAE,SAAS,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AACvG,OAAO,EACN,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,+BAA+B,EAC/B,uBAAuB,EACvB,sBAAsB,EACtB,+BAA+B,EAC/B,sCAAsC,EACtC,8BAA8B,EAC9B,wBAAwB,GACxB,MAAM,iCAAiC,CAAC;AAsCzC;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;CAuBP,CAAC;AAEX,KAAK,YAAY,GAAG,OAAO,WAAW,CAAC;AAEvC,UAAU,MAAM;IACf,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAA;KAAE,CAAC;CACzD;AAED,QAAA,MAAM,MAAM,EAAE,MAGJ,CAAC;AAEX,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AA+B9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACxH,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,YAAY,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AAC3F,YAAY,EAAE,SAAS,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AACvG,OAAO,EACN,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,+BAA+B,EAC/B,uBAAuB,EACvB,sCAAsC,EACtC,sBAAsB,EACtB,+BAA+B,EAC/B,qCAAqC,EACrC,sCAAsC,EACtC,8BAA8B,EAC9B,wBAAwB,GACxB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAwC1D;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CAwBP,CAAC;AAEX,KAAK,YAAY,GAAG,OAAO,WAAW,CAAC;AAEvC,UAAU,MAAM;IACf,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC5D,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAA;KAAE,CAAC;CACzD;AAED,QAAA,MAAM,MAAM,EAAE,MAGJ,CAAC;AAEX,eAAe,MAAM,CAAC"}