@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.
- package/README.md +149 -0
- package/dist/build-metadata.json +3 -3
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1056 -295
- package/dist/index.js.map +50 -41
- package/dist/rules/ban-instances.d.ts +6 -7
- package/dist/rules/ban-instances.d.ts.map +1 -1
- package/dist/rules/ban-react-fc.d.ts +4 -7
- package/dist/rules/ban-react-fc.d.ts.map +1 -1
- package/dist/rules/enforce-ianitor-check-type.d.ts +7 -3
- package/dist/rules/enforce-ianitor-check-type.d.ts.map +1 -1
- package/dist/rules/no-async-constructor.d.ts +4 -5
- package/dist/rules/no-async-constructor.d.ts.map +1 -1
- package/dist/rules/no-color3-constructor.d.ts +4 -3
- package/dist/rules/no-color3-constructor.d.ts.map +1 -1
- package/dist/rules/no-commented-code.d.ts.map +1 -1
- package/dist/rules/no-god-components.d.ts.map +1 -1
- package/dist/rules/no-identity-map.d.ts +4 -2
- package/dist/rules/no-identity-map.d.ts.map +1 -1
- package/dist/rules/no-instance-methods-without-this.d.ts +4 -9
- package/dist/rules/no-instance-methods-without-this.d.ts.map +1 -1
- package/dist/rules/no-print.d.ts +4 -3
- package/dist/rules/no-print.d.ts.map +1 -1
- package/dist/rules/no-useless-use-spring.d.ts +4 -4
- package/dist/rules/no-useless-use-spring.d.ts.map +1 -1
- package/dist/rules/no-warn.d.ts +4 -3
- package/dist/rules/no-warn.d.ts.map +1 -1
- package/dist/rules/prefer-class-properties.d.ts +4 -3
- package/dist/rules/prefer-class-properties.d.ts.map +1 -1
- package/dist/rules/prefer-early-return.d.ts +4 -4
- package/dist/rules/prefer-early-return.d.ts.map +1 -1
- package/dist/rules/prefer-module-scope-constants.d.ts +4 -2
- package/dist/rules/prefer-module-scope-constants.d.ts.map +1 -1
- package/dist/rules/prefer-pascal-case-enums.d.ts +4 -4
- package/dist/rules/prefer-pascal-case-enums.d.ts.map +1 -1
- package/dist/rules/prefer-pattern-replacements.d.ts +8 -0
- package/dist/rules/prefer-pattern-replacements.d.ts.map +1 -0
- package/dist/rules/prefer-sequence-overloads.d.ts +4 -7
- package/dist/rules/prefer-sequence-overloads.d.ts.map +1 -1
- package/dist/rules/prefer-singular-enums.d.ts +4 -4
- package/dist/rules/prefer-singular-enums.d.ts.map +1 -1
- package/dist/rules/react-hooks-strict-return.d.ts +4 -3
- package/dist/rules/react-hooks-strict-return.d.ts.map +1 -1
- package/dist/rules/require-named-effect-functions.d.ts.map +1 -1
- package/dist/rules/require-react-component-keys.d.ts +4 -5
- package/dist/rules/require-react-component-keys.d.ts.map +1 -1
- package/dist/rules/require-react-display-names.d.ts +11 -0
- package/dist/rules/require-react-display-names.d.ts.map +1 -0
- package/dist/rules/strict-component-boundaries.d.ts +4 -8
- package/dist/rules/strict-component-boundaries.d.ts.map +1 -1
- package/dist/utilities/configure-utilities.d.ts +14 -0
- package/dist/utilities/configure-utilities.d.ts.map +1 -1
- package/dist/utilities/create-rule.d.ts +9 -0
- package/dist/utilities/create-rule.d.ts.map +1 -0
- package/dist/utilities/pattern-replacement/constant-folder.d.ts +24 -0
- package/dist/utilities/pattern-replacement/constant-folder.d.ts.map +1 -0
- package/dist/utilities/pattern-replacement/index.d.ts +7 -0
- package/dist/utilities/pattern-replacement/index.d.ts.map +1 -0
- package/dist/utilities/pattern-replacement/pattern-matcher.d.ts +62 -0
- package/dist/utilities/pattern-replacement/pattern-matcher.d.ts.map +1 -0
- package/dist/utilities/pattern-replacement/pattern-parser.d.ts +22 -0
- package/dist/utilities/pattern-replacement/pattern-parser.d.ts.map +1 -0
- package/dist/utilities/pattern-replacement/pattern-types.d.ts +69 -0
- package/dist/utilities/pattern-replacement/pattern-types.d.ts.map +1 -0
- package/dist/utilities/pattern-replacement/replacement-generator.d.ts +16 -0
- package/dist/utilities/pattern-replacement/replacement-generator.d.ts.map +1 -0
- 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.
|
package/dist/build-metadata.json
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
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,
|
|
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:
|
|
63
|
+
readonly rules: ReadonlyRecord<string, LooseRuleDefinition>;
|
|
61
64
|
readonly configs: {
|
|
62
65
|
readonly recommended: PluginConfig;
|
|
63
66
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
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"}
|