eslint-plugin-ts-data-forge 0.7.4 → 0.8.1

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
@@ -74,6 +74,7 @@ export default [
74
74
  | `prefer-arr-is-array` | Replace `Array.isArray` with `Arr.isArray`. |
75
75
  | `prefer-arr-scan` | Report an accumulated value rebuilt for every element (`xs.map((_, i) => f(...xs.slice(0, i + 1)))`, or a `reduce` that appends to its accumulator) and point at `Arr.scan`. Fixes the `reduce` form. |
76
76
  | `prefer-arr-sum` | Replace `xs.reduce((a, b) => a + b, 0)` with `Arr.sum(xs)` / `Arr.sumBy(xs, fn)`. |
77
+ | `prefer-arr-uniq` | Replace `Array.from(new Set(xs))` / `[...new Set(xs)]` with `Arr.uniq(xs)` when `xs` is an array of primitives (type-aware). Suggests instead of fixing when the result is used as a mutable array. |
77
78
  | `prefer-as-int` | Replace branded-number assertions (`x as Int`) with `asInt(x)`-style casts. |
78
79
  | `prefer-is-non-null-object` | Replace `typeof u === 'object' && u !== null` with `isNonNullObject(u)`. |
79
80
  | `prefer-range-for-loop` | Replace C-style `for` loops with `for (const i of range(begin, end))`. |
package/dist/plugin.d.mts CHANGED
@@ -10,6 +10,7 @@ export declare const eslintPluginTsDataForge: {
10
10
  readonly 'prefer-arr-is-array': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrIsArray", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
11
11
  readonly 'prefer-arr-scan': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferArrScanAccumulate" | "preferArrScanPrefix", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
12
12
  readonly 'prefer-arr-sum': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrSum" | "useArrSumBy", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
13
+ readonly 'prefer-arr-uniq': import("@typescript-eslint/utils/ts-eslint").RuleModule<"suggestArrUniq" | "useArrUniq", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
13
14
  readonly 'prefer-as-int': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useBrandedNumberCastFunction", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
14
15
  readonly 'prefer-is-non-null-object': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useIsNonNullObject", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
15
16
  readonly 'prefer-range-for-loop': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useRangeForLoop", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -37,6 +38,7 @@ export declare const eslintPluginTsDataForge: {
37
38
  readonly 'ts-data-forge/prefer-arr-is-array': 'error';
38
39
  readonly 'ts-data-forge/prefer-arr-scan': 'error';
39
40
  readonly 'ts-data-forge/prefer-arr-sum': 'error';
41
+ readonly 'ts-data-forge/prefer-arr-uniq': 'error';
40
42
  readonly 'ts-data-forge/prefer-as-int': 'error';
41
43
  readonly 'ts-data-forge/prefer-is-non-null-object': 'error';
42
44
  readonly 'ts-data-forge/prefer-range-for-loop': 'error';
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.mts","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AA8CvE,eAAO,MAAM,uBAAuB;;iBAEhC,IAAI,EAAE,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;QAInC,oDAAoD;iBACpD,WAAW;2BAtBP,2BAA2B;;yBAQ3B,eAAe,EAAI,YAAY;;;yEA9BW,OAAO;uEACT,OAAO;wEACN,OAAO;8DACjB,OAAO;0DACX,OAAO;yDACR,OAAO;wDACR,OAAO;oEACK,OAAO;gEACX,OAAO;uEACA,OAAO;oEACV,OAAO;sEACL,OAAO;gEACb,OAAO;oEACH,OAAO;+EACI,OAAO;6EACT,OAAO;;;;CA+B5B,CAAC"}
1
+ {"version":3,"file":"plugin.d.mts","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AA+CvE,eAAO,MAAM,uBAAuB;;iBAEhC,IAAI,EAAE,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;QAInC,oDAAoD;iBACpD,WAAW;2BAtBP,2BAA2B;;yBAQ3B,eAAe,EAAI,YAAY;;;yEA/BW,OAAO;uEACT,OAAO;wEACN,OAAO;8DACjB,OAAO;0DACX,OAAO;yDACR,OAAO;0DACN,OAAO;wDACT,OAAO;oEACK,OAAO;gEACX,OAAO;uEACA,OAAO;oEACV,OAAO;sEACL,OAAO;gEACb,OAAO;oEACH,OAAO;+EACI,OAAO;6EACT,OAAO;;;;CA+B5B,CAAC"}
package/dist/plugin.mjs CHANGED
@@ -12,6 +12,7 @@ const recommendedRules = {
12
12
  'ts-data-forge/prefer-arr-is-array': 'error',
13
13
  'ts-data-forge/prefer-arr-scan': 'error',
14
14
  'ts-data-forge/prefer-arr-sum': 'error',
15
+ 'ts-data-forge/prefer-arr-uniq': 'error',
15
16
  'ts-data-forge/prefer-as-int': 'error',
16
17
  'ts-data-forge/prefer-is-non-null-object': 'error',
17
18
  'ts-data-forge/prefer-range-for-loop': 'error',
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG;IACvB,8CAA8C,EAAE,OAAO;IACvD,4CAA4C,EAAE,OAAO;IACrD,6CAA6C,EAAE,OAAO;IACtD,mCAAmC,EAAE,OAAO;IAC5C,+BAA+B,EAAE,OAAO;IACxC,8BAA8B,EAAE,OAAO;IACvC,6BAA6B,EAAE,OAAO;IACtC,yCAAyC,EAAE,OAAO;IAClD,qCAAqC,EAAE,OAAO;IAC9C,4CAA4C,EAAE,OAAO;IACrD,yCAAyC,EAAE,OAAO;IAClD,2CAA2C,EAAE,OAAO;IACpD,qCAAqC,EAAE,OAAO;IAC9C,yCAAyC,EAAE,OAAO;IAClD,oDAAoD,EAAE,OAAO;IAC7D,kDAAkD,EAAE,OAAO;CAI5D,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE;QACP,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,0EAA0E;QAC1E,wDAAwD;QACxD,IAAI,eAAe;YACjB,OAAO,uBAAuB,CAAC;QACjC,CAAC;KACF;IACD,KAAK,EAAE,gBAAgB;CACY,CAAC;AAEtC,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,6BAA6B;KACpC;IACD,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE;QACP,oDAAoD;QACpD,WAAW,EAAE,iBAAiB;KAC/B;CAC8B,CAAC"}
1
+ {"version":3,"file":"plugin.mjs","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG;IACvB,8CAA8C,EAAE,OAAO;IACvD,4CAA4C,EAAE,OAAO;IACrD,6CAA6C,EAAE,OAAO;IACtD,mCAAmC,EAAE,OAAO;IAC5C,+BAA+B,EAAE,OAAO;IACxC,8BAA8B,EAAE,OAAO;IACvC,+BAA+B,EAAE,OAAO;IACxC,6BAA6B,EAAE,OAAO;IACtC,yCAAyC,EAAE,OAAO;IAClD,qCAAqC,EAAE,OAAO;IAC9C,4CAA4C,EAAE,OAAO;IACrD,yCAAyC,EAAE,OAAO;IAClD,2CAA2C,EAAE,OAAO;IACpD,qCAAqC,EAAE,OAAO;IAC9C,yCAAyC,EAAE,OAAO;IAClD,oDAAoD,EAAE,OAAO;IAC7D,kDAAkD,EAAE,OAAO;CAI5D,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE;QACP,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,0EAA0E;QAC1E,wDAAwD;QACxD,IAAI,eAAe;YACjB,OAAO,uBAAuB,CAAC;QACjC,CAAC;KACF;IACD,KAAK,EAAE,gBAAgB;CACY,CAAC;AAEtC,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,6BAA6B;KACpC;IACD,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE;QACP,oDAAoD;QACpD,WAAW,EAAE,iBAAiB;KAC/B;CAC8B,CAAC"}
@@ -92,6 +92,20 @@ declare namespace PreferArrScan {
92
92
  declare namespace PreferArrSum {
93
93
  type RuleEntry = Linter.StringSeverity;
94
94
  }
95
+ /**
96
+ * @description Replace `Array.from(new Set(xs))` / `[...new Set(xs)]` with `Arr.uniq(xs)` from ts-data-forge.
97
+ *
98
+ * ```md
99
+ * | key | value |
100
+ * | :--------- | :--------- |
101
+ * | type | suggestion |
102
+ * | deprecated | false |
103
+ * | fixable | code |
104
+ * ```
105
+ */
106
+ declare namespace PreferArrUniq {
107
+ type RuleEntry = Linter.StringSeverity;
108
+ }
95
109
  /**
96
110
  * @description Replace branded number type assertions (e.g., `as Int`) with corresponding functions (e.g., `asInt()`) from ts-data-forge.
97
111
  *
@@ -261,6 +275,7 @@ export type EslintTsDataForgeRules = Readonly<{
261
275
  'ts-data-forge/prefer-arr-is-array': PreferArrIsArray.RuleEntry;
262
276
  'ts-data-forge/prefer-arr-scan': PreferArrScan.RuleEntry;
263
277
  'ts-data-forge/prefer-arr-sum': PreferArrSum.RuleEntry;
278
+ 'ts-data-forge/prefer-arr-uniq': PreferArrUniq.RuleEntry;
264
279
  'ts-data-forge/prefer-as-int': PreferAsInt.RuleEntry;
265
280
  'ts-data-forge/prefer-is-non-null-object': PreferIsNonNullObject.RuleEntry;
266
281
  'ts-data-forge/prefer-range-for-loop': PreferRangeForLoop.RuleEntry;
@@ -1 +1 @@
1
- {"version":3,"file":"rule-types.d.mts","sourceRoot":"","sources":["../src/rule-types.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-types.d.mts","sourceRoot":"","sources":["../src/rule-types.mts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-types.mjs","sourceRoot":"","sources":["../src/rule-types.mts"],"names":[],"mappings":"AAAA,oBAAoB;AAOpB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAyT3C,8EAA8E;AAC9E,8DAA8D;AAC9D,UAAU,CAGR,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"rule-types.mjs","sourceRoot":"","sources":["../src/rule-types.mts"],"names":[],"mappings":"AAAA,oBAAoB;AAOpB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAyU3C,8EAA8E;AAC9E,8DAA8D;AAC9D,UAAU,CAGR,GAAG,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type TSESLint } from '@typescript-eslint/utils';
2
+ type Options = readonly [];
3
+ type MessageIds = 'useArrUniq' | 'suggestArrUniq';
4
+ /**
5
+ * `Arr.uniq(xs)` is implemented as `Array.from(new Set(xs))`, so the rewrite
6
+ * does not change behavior. What it does change is the static type: `Arr.uniq`
7
+ * only accepts `readonly Primitive[]` and returns a readonly array. The rule
8
+ * therefore reports only when the argument is an array or tuple of primitives,
9
+ * and it applies the fix automatically only when nothing in sight needs the
10
+ * result to be a mutable array; otherwise the rewrite is offered as a
11
+ * suggestion.
12
+ */
13
+ export declare const preferArrUniq: TSESLint.RuleModule<MessageIds, Options>;
14
+ export {};
15
+ //# sourceMappingURL=prefer-arr-uniq.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-arr-uniq.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-arr-uniq.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AASlC,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAkKzD,CAAC"}
@@ -0,0 +1,350 @@
1
+ import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
2
+ import { Arr } from 'ts-data-forge';
3
+ import * as ts from 'typescript';
4
+ import { buildImportFixes, getImportedLocalName, getTsDataForgeImport, } from './import-utils.mjs';
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ export const preferArrUniq = {
15
+ meta: {
16
+ type: 'suggestion',
17
+ docs: {
18
+ description: 'Replace `Array.from(new Set(xs))` / `[...new Set(xs)]` with `Arr.uniq(xs)` from ts-data-forge.',
19
+ },
20
+ fixable: 'code',
21
+ hasSuggestions: true,
22
+ schema: [],
23
+ messages: {
24
+ useArrUniq: 'Replace with `Arr.uniq({{arrayName}})` from ts-data-forge.',
25
+ suggestArrUniq: 'Replace with `Arr.uniq({{arrayName}})` from ts-data-forge (the result becomes a readonly array).',
26
+ },
27
+ },
28
+ create: (context) => {
29
+ const sourceCode = context.sourceCode;
30
+ const program = sourceCode.ast;
31
+ const tsDataForgeImport = getTsDataForgeImport(program);
32
+ const services = sourceCode.parserServices;
33
+ const checker = services?.program?.getTypeChecker();
34
+ const esTreeNodeToTSNodeMap = services?.esTreeNodeToTSNodeMap;
35
+
36
+
37
+ if (checker === undefined || esTreeNodeToTSNodeMap === undefined) {
38
+ return {};
39
+ }
40
+ const getTsNode = (
41
+
42
+ node) => esTreeNodeToTSNodeMap.get(node);
43
+ const mut_matches = [];
44
+ const check = (
45
+
46
+ node,
47
+
48
+ setNode) => {
49
+ const arrayExpression = getSetSourceArray(setNode);
50
+ if (arrayExpression === undefined)
51
+ return;
52
+ if (!isGlobal(sourceCode, node, 'Set'))
53
+ return;
54
+ const arrayTsNode = getTsNode(arrayExpression);
55
+ if (arrayTsNode === undefined)
56
+ return;
57
+ if (!isPrimitiveArrayType(checker, checker.getTypeAtLocation(arrayTsNode)))
58
+ return;
59
+ mut_matches.push({
60
+ node,
61
+ arrayExpression,
62
+ autofixable: !needsMutableResult(sourceCode, checker, getTsNode, node),
63
+ });
64
+ };
65
+ return {
66
+ CallExpression: (node) => {
67
+
68
+ if (node.optional ||
69
+ node.callee.type !== AST_NODE_TYPES.MemberExpression ||
70
+ node.callee.computed ||
71
+ node.callee.optional ||
72
+ node.callee.object.type !== AST_NODE_TYPES.Identifier ||
73
+ node.callee.object.name !== 'Array' ||
74
+ node.callee.property.type !== AST_NODE_TYPES.Identifier ||
75
+ node.callee.property.name !== 'from' ||
76
+
77
+ !Arr.isFixedLengthTuple(1, node.arguments)) {
78
+ return;
79
+ }
80
+ if (!isGlobal(sourceCode, node, 'Array'))
81
+ return;
82
+ check(node, node.arguments[0]);
83
+ },
84
+ ArrayExpression: (node) => {
85
+
86
+ if (!Arr.isFixedLengthTuple(1, node.elements))
87
+ return;
88
+ const element = node.elements[0];
89
+ if (element?.type !== AST_NODE_TYPES.SpreadElement)
90
+ return;
91
+ check(node, element.argument);
92
+ },
93
+ 'Program:exit': () => {
94
+ const arrLocalName = getImportedLocalName(tsDataForgeImport, 'Arr');
95
+ const arrName = arrLocalName ?? 'Arr';
96
+
97
+
98
+
99
+ const firstAutofixable = mut_matches.find((m) => m.autofixable);
100
+ for (const match of mut_matches) {
101
+ const arrayText = sourceCode.getText(match.arrayExpression);
102
+ const argumentText = match.arrayExpression.type === AST_NODE_TYPES.SequenceExpression
103
+ ? `(${arrayText})`
104
+ : arrayText;
105
+ const buildFix = (withImport) => (fixer) => [
106
+ ...(withImport && arrLocalName === undefined
107
+ ? buildImportFixes(fixer, program, tsDataForgeImport, ['Arr'])
108
+ : []),
109
+ fixer.replaceText(match.node, `${arrName}.uniq(${argumentText})`),
110
+ ];
111
+ const data = { arrayName: arrayText };
112
+ if (match.autofixable) {
113
+ context.report({
114
+ node: match.node,
115
+ messageId: 'useArrUniq',
116
+ data,
117
+ fix: buildFix(match === firstAutofixable),
118
+ });
119
+ }
120
+ else {
121
+ context.report({
122
+ node: match.node,
123
+ messageId: 'useArrUniq',
124
+ data,
125
+ suggest: [
126
+ {
127
+ messageId: 'suggestArrUniq',
128
+ data,
129
+ fix: buildFix(true),
130
+ },
131
+ ],
132
+ });
133
+ }
134
+ }
135
+ },
136
+ };
137
+ },
138
+ defaultOptions: [],
139
+ };
140
+
141
+ const mutatingMethods = new Set([
142
+ 'copyWithin',
143
+ 'fill',
144
+ 'pop',
145
+ 'push',
146
+ 'reverse',
147
+ 'shift',
148
+ 'sort',
149
+ 'splice',
150
+ 'unshift',
151
+ ]);
152
+
153
+
154
+
155
+
156
+
157
+ const getSetSourceArray = (
158
+
159
+ node) => {
160
+ if (node.type !== AST_NODE_TYPES.NewExpression ||
161
+ node.callee.type !== AST_NODE_TYPES.Identifier ||
162
+ node.callee.name !== 'Set' ||
163
+ node.typeArguments !== undefined ||
164
+ !Arr.isFixedLengthTuple(1, node.arguments)) {
165
+ return undefined;
166
+ }
167
+ const argument = node.arguments[0];
168
+ return argument.type === AST_NODE_TYPES.SpreadElement ? undefined : argument;
169
+ };
170
+
171
+ const isGlobal = (
172
+
173
+ sourceCode,
174
+
175
+ node, name) => {
176
+ const variable = findVariable(sourceCode.getScope(node), name);
177
+
178
+ return variable === undefined || variable.defs.length === 0;
179
+ };
180
+ const findVariable = (
181
+
182
+ scope, name) => {
183
+ const variable = scope.set.get(name);
184
+ if (variable !== undefined)
185
+ return variable;
186
+ if (scope.upper === null)
187
+ return undefined;
188
+ return findVariable(scope.upper, name);
189
+ };
190
+
191
+
192
+
193
+
194
+ const isPrimitiveArrayType = (
195
+
196
+ checker,
197
+
198
+ type) => {
199
+ const resolved = resolveConstraint(checker, type);
200
+ if (resolved.isUnion()) {
201
+ return resolved.types.every((t) => isPrimitiveArrayType(checker, t));
202
+ }
203
+
204
+
205
+ if (resolved.isIntersection()) {
206
+ return resolved.types.some((t) => isPrimitiveArrayType(checker, t));
207
+ }
208
+ if (!checker.isArrayType(resolved) && !checker.isTupleType(resolved)) {
209
+ return false;
210
+ }
211
+ const typeArguments = checker.getTypeArguments(
212
+
213
+ resolved);
214
+
215
+ return typeArguments.every((t) => isPrimitiveType(checker, t));
216
+ };
217
+ const isPrimitiveType = (
218
+
219
+ checker,
220
+
221
+ type) => {
222
+ const resolved = resolveConstraint(checker, type);
223
+ if (resolved.isUnion()) {
224
+ return resolved.types.every((t) => isPrimitiveType(checker, t));
225
+ }
226
+ return (resolved.flags & primitiveTypeFlags) !== 0;
227
+ };
228
+ const primitiveTypeFlags = ts.TypeFlags.StringLike |
229
+ ts.TypeFlags.NumberLike |
230
+ ts.TypeFlags.BigIntLike |
231
+ ts.TypeFlags.BooleanLike |
232
+ ts.TypeFlags.ESSymbolLike |
233
+ ts.TypeFlags.Null |
234
+ ts.TypeFlags.Undefined;
235
+ const resolveConstraint = (
236
+
237
+ checker,
238
+
239
+ type) => (type.flags & ts.TypeFlags.TypeParameter) !== 0
240
+ ? (checker.getBaseConstraintOfType(type) ?? type)
241
+ : type;
242
+
243
+
244
+
245
+
246
+
247
+
248
+ const needsMutableResult = (
249
+
250
+ sourceCode,
251
+
252
+ checker,
253
+
254
+ getTsNode,
255
+
256
+ node) => {
257
+ if (isUsedAsMutable(checker, getTsNode, node))
258
+ return true;
259
+ const parent = node.parent;
260
+ if (parent?.type !== AST_NODE_TYPES.VariableDeclarator ||
261
+ parent.init !== node ||
262
+ parent.id.type !== AST_NODE_TYPES.Identifier ||
263
+ parent.id.typeAnnotation !== undefined) {
264
+ return false;
265
+ }
266
+ const [variable] = sourceCode.getDeclaredVariables(parent);
267
+ return (variable?.references.some((reference) => reference.init !== true &&
268
+ isUsedAsMutable(checker, getTsNode, reference.identifier)) ?? false);
269
+ };
270
+ const isUsedAsMutable = (
271
+
272
+ checker,
273
+
274
+ getTsNode,
275
+
276
+ node) => {
277
+ const parent = node.parent;
278
+ if (parent?.type === AST_NODE_TYPES.MemberExpression &&
279
+ parent.object === node) {
280
+
281
+ if (!parent.computed &&
282
+ parent.property.type === AST_NODE_TYPES.Identifier &&
283
+ mutatingMethods.has(parent.property.name)) {
284
+ return true;
285
+ }
286
+
287
+ const grandParent = parent.parent;
288
+ return ((grandParent.type === AST_NODE_TYPES.AssignmentExpression &&
289
+ grandParent.left === parent) ||
290
+ grandParent.type === AST_NODE_TYPES.UpdateExpression ||
291
+ (grandParent.type === AST_NODE_TYPES.UnaryExpression &&
292
+ grandParent.operator === 'delete'));
293
+ }
294
+
295
+
296
+ const tsNode = getTsNode(node);
297
+ if (tsNode === undefined)
298
+ return false;
299
+ if (!ts.isExpression(tsNode))
300
+ return false;
301
+ const expectedType = getDeclaredParameterType(checker, tsNode) ??
302
+ checker.getContextualType(tsNode);
303
+ return (expectedType !== undefined && isMutableArrayOnly(checker, expectedType));
304
+ };
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ const getDeclaredParameterType = (
314
+
315
+ checker,
316
+
317
+ argument) => {
318
+ const call = argument.parent;
319
+ if (!ts.isCallExpression(call) && !ts.isNewExpression(call)) {
320
+ return undefined;
321
+ }
322
+ const index = call.arguments?.indexOf(argument) ?? -1;
323
+ if (index === -1)
324
+ return undefined;
325
+ const declaration = checker.getResolvedSignature(call)?.getDeclaration();
326
+ const parameter = declaration?.parameters[index];
327
+
328
+
329
+ if (parameter === undefined || parameter.dotDotDotToken !== undefined) {
330
+ return undefined;
331
+ }
332
+ return checker.getTypeAtLocation(parameter);
333
+ };
334
+
335
+
336
+
337
+
338
+
339
+ const isMutableArrayOnly = (
340
+
341
+ checker,
342
+
343
+ type) => {
344
+ const members = type.isUnion() ? type.types : [type];
345
+ return (members.every((t) =>
346
+
347
+ (t.flags & primitiveTypeFlags) !== 0 ||
348
+ (checker.isArrayType(t) && t.getSymbol()?.getName() === 'Array')) && members.some((t) => (t.flags & primitiveTypeFlags) === 0));
349
+ };
350
+ //# sourceMappingURL=prefer-arr-uniq.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-arr-uniq.mjs","sourceRoot":"","sources":["../../src/rules/prefer-arr-uniq.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAM5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAA6C;IACrE,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,gGAAgG;SACnG;QACD,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,IAAI;QACpB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,UAAU,EAAE,4DAA4D;YACxE,cAAc,EACZ,kGAAkG;SACrG;KACF;IAED,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEtC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC;QAE/B,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC;QAE3C,MAAM,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QAEpD,MAAM,qBAAqB,GAAG,QAAQ,EAAE,qBAAqB,CAAC;QAE9D,uEAAuE;QACvE,0EAA0E;QAC1E,IAAI,OAAO,KAAK,SAAS,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG;QAChB,8EAA8E;QAC9E,IAAmB,EACE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,WAAW,GAIX,EAAE,CAAC;QAET,MAAM,KAAK,GAAG;QACZ,8EAA8E;QAC9E,IAAwD;QACxD,8EAA8E;QAC9E,OAAsB,EAChB,EAAE;YACR,MAAM,eAAe,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,eAAe,KAAK,SAAS;gBAAE,OAAO;YAE1C,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC;gBAAE,OAAO;YAE/C,MAAM,WAAW,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;YAE/C,IAAI,WAAW,KAAK,SAAS;gBAAE,OAAO;YAEtC,IACE,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBAEtE,OAAO;YAET,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,eAAe;gBACf,WAAW,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;aACvE,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO;YACL,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,0BAA0B;gBAC1B,IACE,IAAI,CAAC,QAAQ;oBACb,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;oBACpD,IAAI,CAAC,MAAM,CAAC,QAAQ;oBACpB,IAAI,CAAC,MAAM,CAAC,QAAQ;oBACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBACrD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;oBACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;oBACpC,iEAAiE;oBACjE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAC1C,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;oBAAE,OAAO;gBAEjD,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,mBAAmB;gBACnB,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;oBAAE,OAAO;gBAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAEjC,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc,CAAC,aAAa;oBAAE,OAAO;gBAE3D,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,MAAM,YAAY,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,OAAO,GAAG,YAAY,IAAI,KAAK,CAAC;gBAEtC,sEAAsE;gBACtE,kEAAkE;gBAClE,6DAA6D;gBAC7D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBAEhE,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;oBAChC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBAE5D,MAAM,YAAY,GAChB,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,cAAc,CAAC,kBAAkB;wBAC9D,CAAC,CAAC,IAAI,SAAS,GAAG;wBAClB,CAAC,CAAC,SAAS,CAAC;oBAEhB,MAAM,QAAQ,GACZ,CAAC,UAAmB,EAA8B,EAAE,CACpD,CAAC,KAAK,EAAE,EAAE,CAAC;wBACT,GAAG,CAAC,UAAU,IAAI,YAAY,KAAK,SAAS;4BAC1C,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC;4BAC9D,CAAC,CAAC,EAAE,CAAC;wBACP,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,SAAS,YAAY,GAAG,CAAC;qBAClE,CAAC;oBAEJ,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,EAAW,CAAC;oBAE/C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;wBACtB,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,SAAS,EAAE,YAAY;4BACvB,IAAI;4BACJ,GAAG,EAAE,QAAQ,CAAC,KAAK,KAAK,gBAAgB,CAAC;yBAC1C,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,SAAS,EAAE,YAAY;4BACvB,IAAI;4BACJ,OAAO,EAAE;gCACP;oCACE,SAAS,EAAE,gBAAgB;oCAC3B,IAAI;oCACJ,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC;iCACpB;6BACF;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IACD,cAAc,EAAE,EAAE;CACV,CAAC;AAEX,uEAAuE;AACvE,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACnD,YAAY;IACZ,MAAM;IACN,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,iBAAiB,GAAG;AACxB,8EAA8E;AAC9E,IAAmB,EACc,EAAE;IACnC,IACE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK;QAC1B,IAAI,CAAC,aAAa,KAAK,SAAS;QAChC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAC1C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEnC,OAAO,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/E,CAAC,CAAC;AAEF,mFAAmF;AACnF,MAAM,QAAQ,GAAG;AACf,8EAA8E;AAC9E,UAA+B;AAC/B,8EAA8E;AAC9E,IAAmB,EACnB,IAAY,EACH,EAAE;IACX,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAE/D,6EAA6E;IAC7E,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG;AACnB,8EAA8E;AAC9E,KAA2B,EAC3B,IAAY,EACyB,EAAE;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE5C,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAAG;AAC3B,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,IAAa,EACJ,EAAE;IACX,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAElD,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,6EAA6E;IAC7E,oEAAoE;IACpE,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB;IAC5C,oEAAoE;IACpE,QAA4B,CAC7B,CAAC;IAEF,oEAAoE;IACpE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG;AACtB,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,IAAa,EACJ,EAAE;IACX,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAElD,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GACtB,EAAE,CAAC,SAAS,CAAC,UAAU;IACvB,EAAE,CAAC,SAAS,CAAC,UAAU;IACvB,EAAE,CAAC,SAAS,CAAC,UAAU;IACvB,EAAE,CAAC,SAAS,CAAC,WAAW;IACxB,EAAE,CAAC,SAAS,CAAC,YAAY;IACzB,EAAE,CAAC,SAAS,CAAC,IAAI;IACjB,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC;AAEzB,MAAM,iBAAiB,GAAG;AACxB,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,IAAa,EACJ,EAAE,CACX,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC;AAEX;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG;AACzB,8EAA8E;AAC9E,UAA+B;AAC/B,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,SAAyD;AACzD,8EAA8E;AAC9E,IAAmB,EACV,EAAE;IACX,IAAI,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,IACE,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,kBAAkB;QAClD,MAAM,CAAC,IAAI,KAAK,IAAI;QACpB,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAC5C,MAAM,CAAC,EAAE,CAAC,cAAc,KAAK,SAAS,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE3D,OAAO,CACL,QAAQ,EAAE,UAAU,CAAC,IAAI,CACvB,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,IAAI,KAAK,IAAI;QACvB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAC5D,IAAI,KAAK,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG;AACtB,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,SAAyD;AACzD,8EAA8E;AAC9E,IAAmB,EACV,EAAE;IACX,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,IACE,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,gBAAgB;QAChD,MAAM,CAAC,MAAM,KAAK,IAAI,EACtB,CAAC;QACD,+BAA+B;QAC/B,IACE,CAAC,MAAM,CAAC,QAAQ;YAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;YAClD,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EACzC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sDAAsD;QACtD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAElC,OAAO,CACL,CAAC,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,oBAAoB;YACvD,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC;YAC9B,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;YACpD,CAAC,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe;gBAClD,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,CACrC,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,0CAA0C;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEvC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,YAAY,GAChB,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC;QACzC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO,CACL,YAAY,KAAK,SAAS,IAAI,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CACxE,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,wBAAwB,GAAG;AAC/B,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,QAAuB,EACF,EAAE;IACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE7B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnC,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IAEzE,MAAM,SAAS,GAAG,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAEjD,8EAA8E;IAC9E,uDAAuD;IACvD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,kBAAkB,GAAG;AACzB,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,IAAa,EACJ,EAAE;IACX,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAW,CAAC;IAEhE,OAAO,CACL,OAAO,CAAC,KAAK,CACX,CAAC,CAAC,EAAE,EAAE;IACJ,mEAAmE;IACnE,CAAC,CAAC,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC;QACpC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CACnE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC,CAAC"}
@@ -5,6 +5,7 @@ export declare const tsDataForgeRules: {
5
5
  readonly 'prefer-arr-is-array': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrIsArray", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
6
6
  readonly 'prefer-arr-scan': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferArrScanAccumulate" | "preferArrScanPrefix", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
7
7
  readonly 'prefer-arr-sum': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrSum" | "useArrSumBy", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
8
+ readonly 'prefer-arr-uniq': import("@typescript-eslint/utils/ts-eslint").RuleModule<"suggestArrUniq" | "useArrUniq", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
8
9
  readonly 'prefer-as-int': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useBrandedNumberCastFunction", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
9
10
  readonly 'prefer-is-non-null-object': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useIsNonNullObject", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
10
11
  readonly 'prefer-range-for-loop': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useRangeForLoop", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAiBa,CAAC"}
1
+ {"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;CAkBa,CAAC"}
@@ -3,6 +3,7 @@ import { noUnnecessaryTypeGuard } from './no-unnecessary-type-guard.mjs';
3
3
  import { preferArrIsArray } from './prefer-arr-is-array.mjs';
4
4
  import { preferArrScan } from './prefer-arr-scan.mjs';
5
5
  import { preferArrSum } from './prefer-arr-sum.mjs';
6
+ import { preferArrUniq } from './prefer-arr-uniq.mjs';
6
7
  import { preferAsInt } from './prefer-as-int.mjs';
7
8
  import { preferCanonicalArraySlicing } from './prefer-canonical-array-slicing.mjs';
8
9
  import { preferCanonicalLengthCast } from './prefer-canonical-length-cast.mjs';
@@ -21,6 +22,7 @@ export const tsDataForgeRules = {
21
22
  'prefer-arr-is-array': preferArrIsArray,
22
23
  'prefer-arr-scan': preferArrScan,
23
24
  'prefer-arr-sum': preferArrSum,
25
+ 'prefer-arr-uniq': preferArrUniq,
24
26
  'prefer-as-int': preferAsInt,
25
27
  'prefer-is-non-null-object': preferIsNonNullObject,
26
28
  'prefer-range-for-loop': preferRangeForLoop,
@@ -1 +1 @@
1
- {"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gCAAgC,EAAE,2BAA2B;IAC7D,+BAA+B,EAAE,0BAA0B;IAC3D,8BAA8B,EAAE,yBAAyB;IACzD,qBAAqB,EAAE,gBAAgB;IACvC,iBAAiB,EAAE,aAAa;IAChC,gBAAgB,EAAE,YAAY;IAC9B,eAAe,EAAE,WAAW;IAC5B,2BAA2B,EAAE,qBAAqB;IAClD,uBAAuB,EAAE,kBAAkB;IAC3C,8BAA8B,EAAE,uBAAuB;IACvD,2BAA2B,EAAE,qBAAqB;IAClD,6BAA6B,EAAE,uBAAuB;IACtD,uBAAuB,EAAE,kBAAkB;IAC3C,2BAA2B,EAAE,sBAAsB;IACnD,sCAAsC,EAAE,gCAAgC;IACxE,oCAAoC,EAAE,6BAA6B;CAC3B,CAAC"}
1
+ {"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gCAAgC,EAAE,2BAA2B;IAC7D,+BAA+B,EAAE,0BAA0B;IAC3D,8BAA8B,EAAE,yBAAyB;IACzD,qBAAqB,EAAE,gBAAgB;IACvC,iBAAiB,EAAE,aAAa;IAChC,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,aAAa;IAChC,eAAe,EAAE,WAAW;IAC5B,2BAA2B,EAAE,qBAAqB;IAClD,uBAAuB,EAAE,kBAAkB;IAC3C,8BAA8B,EAAE,uBAAuB;IACvD,2BAA2B,EAAE,qBAAqB;IAClD,6BAA6B,EAAE,uBAAuB;IACtD,uBAAuB,EAAE,kBAAkB;IAC3C,2BAA2B,EAAE,sBAAsB;IACnD,sCAAsC,EAAE,gCAAgC;IACxE,oCAAoC,EAAE,6BAA6B;CAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-ts-data-forge",
3
- "version": "0.7.4",
3
+ "version": "0.8.1",
4
4
  "private": false,
5
5
  "description": "ESLint rules that steer code toward ts-data-forge idioms.",
6
6
  "keywords": [
@@ -34,17 +34,17 @@
34
34
  "LICENSE"
35
35
  ],
36
36
  "dependencies": {
37
- "@typescript-eslint/utils": "^8.69.0",
37
+ "@typescript-eslint/utils": "^8.70.0",
38
38
  "ts-data-forge": "14.7.1",
39
39
  "ts-type-forge": "~9.2.2"
40
40
  },
41
41
  "devDependencies": {
42
- "@typescript-eslint/parser": "8.69.0",
43
- "@typescript-eslint/rule-tester": "8.69.0",
42
+ "@typescript-eslint/parser": "8.70.0",
43
+ "@typescript-eslint/rule-tester": "8.70.0",
44
44
  "dedent": "1.7.2",
45
- "eslint-config-typed": "5.11.7",
46
- "eslint-plugin-ts-fortress": "1.2.2",
47
- "eslint-plugin-ts-type-forge": "0.8.3",
45
+ "eslint-config-typed": "5.11.9",
46
+ "eslint-plugin-ts-fortress": "1.2.3",
47
+ "eslint-plugin-ts-type-forge": "0.8.4",
48
48
  "prettier": "3.9.6",
49
49
  "prettier-plugin-organize-imports": "4.3.0",
50
50
  "prettier-plugin-packagejson": "3.0.2",
@@ -64,19 +64,20 @@
64
64
  },
65
65
  "scripts": {
66
66
  "build": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts",
67
- "build:min": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts --skip-check",
68
- "check:branded-number-types": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-branded-number-types.mts",
67
+ "check": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-branded-number-types.mts",
69
68
  "check:ext": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-ext.mts",
69
+ "doc": "pnpm run doc:embed",
70
+ "doc:embed": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/embed-examples.mts",
70
71
  "fmt": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-uncommitted.mts --cwd .",
71
72
  "fmt:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-diff-from.mts origin/main --cwd .",
72
73
  "fmt:full": "pnpm run z:prettier .",
73
74
  "gen:rule-types": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/gen-rule-types.mts",
75
+ "gen:src": "pnpm run gen:rule-types",
74
76
  "lint": "eslint .",
75
77
  "lint:fix": "eslint . --fix",
76
78
  "test": "pnpm run z:vitest run",
77
79
  "test:cov": "pnpm run z:vitest run --coverage",
78
80
  "testw": "pnpm run z:vitest",
79
- "tsc": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
80
81
  "tscw": "node ../../node_modules/typescript-native/bin/tsc --noEmit --watch -p ./tsconfig.json",
81
82
  "type-check": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
82
83
  "z:prettier": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --ignore-path ../../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
package/src/plugin.mts CHANGED
@@ -15,6 +15,7 @@ const recommendedRules = {
15
15
  'ts-data-forge/prefer-arr-is-array': 'error',
16
16
  'ts-data-forge/prefer-arr-scan': 'error',
17
17
  'ts-data-forge/prefer-arr-sum': 'error',
18
+ 'ts-data-forge/prefer-arr-uniq': 'error',
18
19
  'ts-data-forge/prefer-as-int': 'error',
19
20
  'ts-data-forge/prefer-is-non-null-object': 'error',
20
21
  'ts-data-forge/prefer-range-for-loop': 'error',
@@ -117,6 +117,21 @@ namespace PreferArrSum {
117
117
  export type RuleEntry = Linter.StringSeverity;
118
118
  }
119
119
 
120
+ /**
121
+ * @description Replace `Array.from(new Set(xs))` / `[...new Set(xs)]` with `Arr.uniq(xs)` from ts-data-forge.
122
+ *
123
+ * ```md
124
+ * | key | value |
125
+ * | :--------- | :--------- |
126
+ * | type | suggestion |
127
+ * | deprecated | false |
128
+ * | fixable | code |
129
+ * ```
130
+ */
131
+ namespace PreferArrUniq {
132
+ export type RuleEntry = Linter.StringSeverity;
133
+ }
134
+
120
135
  /**
121
136
  * @description Replace branded number type assertions (e.g., `as Int`) with corresponding functions (e.g., `asInt()`) from ts-data-forge.
122
137
  *
@@ -302,6 +317,7 @@ export type EslintTsDataForgeRules = Readonly<{
302
317
  'ts-data-forge/prefer-arr-is-array': PreferArrIsArray.RuleEntry;
303
318
  'ts-data-forge/prefer-arr-scan': PreferArrScan.RuleEntry;
304
319
  'ts-data-forge/prefer-arr-sum': PreferArrSum.RuleEntry;
320
+ 'ts-data-forge/prefer-arr-uniq': PreferArrUniq.RuleEntry;
305
321
  'ts-data-forge/prefer-as-int': PreferAsInt.RuleEntry;
306
322
  'ts-data-forge/prefer-is-non-null-object': PreferIsNonNullObject.RuleEntry;
307
323
  'ts-data-forge/prefer-range-for-loop': PreferRangeForLoop.RuleEntry;