eslint-config-typed 5.3.3 → 5.4.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 (50) hide show
  1. package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.d.mts +6 -0
  2. package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.d.mts.map +1 -0
  3. package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mjs +522 -0
  4. package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mjs.map +1 -0
  5. package/dist/plugins/ts-data-forge/rules/rules.d.mts +1 -0
  6. package/dist/plugins/ts-data-forge/rules/rules.d.mts.map +1 -1
  7. package/dist/plugins/ts-data-forge/rules/rules.mjs +2 -0
  8. package/dist/plugins/ts-data-forge/rules/rules.mjs.map +1 -1
  9. package/dist/plugins/ts-restrictions/rules/array-type-utils.d.mts +24 -0
  10. package/dist/plugins/ts-restrictions/rules/array-type-utils.d.mts.map +1 -0
  11. package/dist/plugins/ts-restrictions/rules/array-type-utils.mjs +90 -0
  12. package/dist/plugins/ts-restrictions/rules/array-type-utils.mjs.map +1 -0
  13. package/dist/plugins/ts-restrictions/rules/no-unnecessary-array-from.d.mts +6 -0
  14. package/dist/plugins/ts-restrictions/rules/no-unnecessary-array-from.d.mts.map +1 -0
  15. package/dist/plugins/ts-restrictions/rules/no-unnecessary-array-from.mjs +118 -0
  16. package/dist/plugins/ts-restrictions/rules/no-unnecessary-array-from.mjs.map +1 -0
  17. package/dist/plugins/ts-restrictions/rules/prefer-non-mutating-array-method.d.mts +6 -0
  18. package/dist/plugins/ts-restrictions/rules/prefer-non-mutating-array-method.d.mts.map +1 -0
  19. package/dist/plugins/ts-restrictions/rules/prefer-non-mutating-array-method.mjs +165 -0
  20. package/dist/plugins/ts-restrictions/rules/prefer-non-mutating-array-method.mjs.map +1 -0
  21. package/dist/plugins/ts-restrictions/rules/rules.d.mts +2 -0
  22. package/dist/plugins/ts-restrictions/rules/rules.d.mts.map +1 -1
  23. package/dist/plugins/ts-restrictions/rules/rules.mjs +4 -0
  24. package/dist/plugins/ts-restrictions/rules/rules.mjs.map +1 -1
  25. package/dist/rules/eslint-ts-data-forge-rules.d.mts +1 -0
  26. package/dist/rules/eslint-ts-data-forge-rules.d.mts.map +1 -1
  27. package/dist/rules/eslint-ts-data-forge-rules.mjs +1 -0
  28. package/dist/rules/eslint-ts-data-forge-rules.mjs.map +1 -1
  29. package/dist/rules/eslint-ts-restrictions-rules.d.mts +2 -0
  30. package/dist/rules/eslint-ts-restrictions-rules.d.mts.map +1 -1
  31. package/dist/rules/eslint-ts-restrictions-rules.mjs +2 -0
  32. package/dist/rules/eslint-ts-restrictions-rules.mjs.map +1 -1
  33. package/dist/types/rules/eslint-ts-data-forge-rules.d.mts +15 -0
  34. package/dist/types/rules/eslint-ts-data-forge-rules.d.mts.map +1 -1
  35. package/dist/types/rules/eslint-ts-restrictions-rules.d.mts +30 -0
  36. package/dist/types/rules/eslint-ts-restrictions-rules.d.mts.map +1 -1
  37. package/package.json +1 -1
  38. package/src/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mts +793 -0
  39. package/src/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.test.mts +588 -0
  40. package/src/plugins/ts-data-forge/rules/rules.mts +2 -0
  41. package/src/plugins/ts-restrictions/rules/array-type-utils.mts +110 -0
  42. package/src/plugins/ts-restrictions/rules/no-unnecessary-array-from.mts +149 -0
  43. package/src/plugins/ts-restrictions/rules/no-unnecessary-array-from.test.mts +285 -0
  44. package/src/plugins/ts-restrictions/rules/prefer-non-mutating-array-method.mts +231 -0
  45. package/src/plugins/ts-restrictions/rules/prefer-non-mutating-array-method.test.mts +224 -0
  46. package/src/plugins/ts-restrictions/rules/rules.mts +4 -0
  47. package/src/rules/eslint-ts-data-forge-rules.mts +1 -0
  48. package/src/rules/eslint-ts-restrictions-rules.mts +2 -0
  49. package/src/types/rules/eslint-ts-data-forge-rules.mts +16 -0
  50. package/src/types/rules/eslint-ts-restrictions-rules.mts +32 -0
@@ -0,0 +1,6 @@
1
+ import { type TSESLint } from '@typescript-eslint/utils';
2
+ type Options = readonly [];
3
+ type MessageIds = 'preferCanonicalArraySlicing';
4
+ export declare const preferCanonicalArraySlicing: TSESLint.RuleModule<MessageIds, Options>;
5
+ export {};
6
+ //# sourceMappingURL=prefer-canonical-array-slicing.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-canonical-array-slicing.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAUlC,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,6BAA6B,CAAC;AA6IhD,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,UAAU,CAC3D,UAAU,EACV,OAAO,CAsnBC,CAAC"}
@@ -0,0 +1,522 @@
1
+ import { ESLintUtils, AST_NODE_TYPES } from '@typescript-eslint/utils';
2
+ import * as ts from 'typescript';
3
+ import { getTsDataForgeImport, getImportedLocalName, buildImportFixes } from './import-utils.mjs';
4
+
5
+ /** `skip 1` / `skipLast 1` have dedicated single-element names. */
6
+ const normalizeCountedOp = (fn, count) => count < 1
7
+ ? undefined
8
+ : fn === 'skip' && count === 1
9
+ ? { fn: 'tail' }
10
+ : fn === 'skipLast' && count === 1
11
+ ? { fn: 'butLast' }
12
+ : { fn, count };
13
+ const asNonNegativeIntegerLiteral = (node) => node.type === AST_NODE_TYPES.Literal &&
14
+ typeof node.value === 'number' &&
15
+ Number.isInteger(node.value) &&
16
+ node.value >= 0
17
+ ? node.value
18
+ : undefined;
19
+ /** Matches `-N` (unary minus of a positive integer literal) and returns `N`. */
20
+ const asNegatedPositiveIntegerLiteral = (node) => {
21
+ if (node.type !== AST_NODE_TYPES.UnaryExpression ||
22
+ node.operator !== '-' ||
23
+ node.argument.type !== AST_NODE_TYPES.Literal) {
24
+ return undefined;
25
+ }
26
+ const n = asNonNegativeIntegerLiteral(node.argument);
27
+ return n !== undefined && n >= 1 ? n : undefined;
28
+ };
29
+ /**
30
+ * Whether re-reading the expression is free of side effects (a plain variable
31
+ * or a non-computed property chain). Required for patterns that reference the
32
+ * receiver twice, such as `xs.filter((_, i) => i < xs.length - 1)`.
33
+ */
34
+ const isSimpleReference = (node) => node.type === AST_NODE_TYPES.Identifier ||
35
+ node.type === AST_NODE_TYPES.ThisExpression ||
36
+ (node.type === AST_NODE_TYPES.MemberExpression &&
37
+ !node.computed &&
38
+ node.property.type === AST_NODE_TYPES.Identifier &&
39
+ isSimpleReference(node.object));
40
+ const rootIdentifierName = (node) => node.type === AST_NODE_TYPES.Identifier
41
+ ? node.name
42
+ : node.type === AST_NODE_TYPES.MemberExpression
43
+ ? rootIdentifierName(node.object)
44
+ : undefined;
45
+ const COMPARISON_OPERATORS = new Set([
46
+ '!==',
47
+ '<',
48
+ '<=',
49
+ '>',
50
+ '>=',
51
+ ]);
52
+ /** Mirror of each comparison when its operands are swapped. */
53
+ const FLIPPED_OPERATORS = {
54
+ '!==': '!==',
55
+ '<': '>',
56
+ '<=': '>=',
57
+ '>': '<',
58
+ '>=': '<=',
59
+ };
60
+ /** Classifies `index OP N` (a comparison against an integer literal). */
61
+ const classifyLiteralComparison = (op, n) => {
62
+ switch (op) {
63
+ case '>=':
64
+ return normalizeCountedOp('skip', n);
65
+ case '>':
66
+ return normalizeCountedOp('skip', n + 1);
67
+ case '!==':
68
+ return n === 0 ? { fn: 'tail' } : undefined;
69
+ case '<':
70
+ return normalizeCountedOp('take', n);
71
+ case '<=':
72
+ return normalizeCountedOp('take', n + 1);
73
+ }
74
+ };
75
+ /** Classifies `index OP <xs>.length - M`. */
76
+ const classifyLengthComparison = (op, m) => {
77
+ switch (op) {
78
+ case '<':
79
+ return normalizeCountedOp('skipLast', m);
80
+ case '<=':
81
+ return normalizeCountedOp('skipLast', m - 1);
82
+ case '!==':
83
+ return m === 1 ? { fn: 'butLast' } : undefined;
84
+ case '>=':
85
+ return normalizeCountedOp('takeLast', m);
86
+ case '>':
87
+ return normalizeCountedOp('takeLast', m - 1);
88
+ }
89
+ };
90
+ const preferCanonicalArraySlicing = {
91
+ meta: {
92
+ type: 'suggestion',
93
+ docs: {
94
+ description: 'Unify non-mutating array element addition/removal patterns (`slice` / `toSpliced` / `filter` / `concat` / spread) into the corresponding ts-data-forge functions: `Arr.tail`, `Arr.skip`, `Arr.take`, `Arr.butLast`, `Arr.skipLast`, `Arr.takeLast`, `Arr.toUnshifted`, `Arr.toPushed`.',
95
+ },
96
+ fixable: 'code',
97
+ schema: [],
98
+ messages: {
99
+ preferCanonicalArraySlicing: 'Replace with `{{replacement}}` from ts-data-forge.',
100
+ },
101
+ },
102
+ create: (context) => {
103
+ const sourceCode = context.sourceCode;
104
+ const program = sourceCode.ast;
105
+ const tsDataForgeImport = getTsDataForgeImport(program);
106
+ const parserServices = ESLintUtils.getParserServices(context);
107
+ const checker = parserServices.program.getTypeChecker();
108
+ /**
109
+ * The in-scope way to reference the `Arr` namespace: a named import
110
+ * (possibly aliased), a namespace import member, or the canonical `Arr`
111
+ * (added by the import fix when nothing is imported yet).
112
+ */
113
+ const arrLocalName = getImportedLocalName(tsDataForgeImport, 'Arr');
114
+ const namespaceLocalName = tsDataForgeImport?.specifiers.find((specifier) => specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier)?.local.name;
115
+ const arrRef = arrLocalName ??
116
+ (namespaceLocalName === undefined ? 'Arr' : `${namespaceLocalName}.Arr`);
117
+ const needsArrImport = arrLocalName === undefined && namespaceLocalName === undefined;
118
+ /**
119
+ * Deferred (non-concrete) types are reduced to their base constraint
120
+ * before checking; `any` / `unknown` are conservatively not array-like.
121
+ */
122
+ const isArrayOrTupleType = (type) => {
123
+ if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {
124
+ return false;
125
+ }
126
+ if (type.isUnion()) {
127
+ return type.types.every(isArrayOrTupleType);
128
+ }
129
+ if ((type.flags &
130
+ (ts.TypeFlags.TypeParameter |
131
+ ts.TypeFlags.IndexedAccess |
132
+ ts.TypeFlags.Conditional |
133
+ ts.TypeFlags.Substitution)) !==
134
+ 0) {
135
+ const constraint = checker.getBaseConstraintOfType(type);
136
+ return constraint !== undefined && isArrayOrTupleType(constraint);
137
+ }
138
+ return checker.isArrayType(type) || checker.isTupleType(type);
139
+ };
140
+ const getTypeOf = (node) => checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node));
141
+ /**
142
+ * `true` only when the type can never be an array in any branch, so
143
+ * `xs.concat(v)` is guaranteed to append `v` as one element rather than
144
+ * flattening it.
145
+ */
146
+ const isDefinitelyNotArrayType = (type) => {
147
+ if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {
148
+ return false;
149
+ }
150
+ if (type.isUnion()) {
151
+ return type.types.every(isDefinitelyNotArrayType);
152
+ }
153
+ if ((type.flags &
154
+ (ts.TypeFlags.TypeParameter |
155
+ ts.TypeFlags.IndexedAccess |
156
+ ts.TypeFlags.Conditional |
157
+ ts.TypeFlags.Substitution)) !==
158
+ 0) {
159
+ const constraint = checker.getBaseConstraintOfType(type);
160
+ return constraint !== undefined && isDefinitelyNotArrayType(constraint);
161
+ }
162
+ return !checker.isArrayType(type) && !checker.isTupleType(type);
163
+ };
164
+ /** Argument-position text; a comma (sequence) expression needs parens. */
165
+ const toArgText = (node) => {
166
+ const text = sourceCode.getText(node);
167
+ return node.type === AST_NODE_TYPES.SequenceExpression
168
+ ? `(${text})`
169
+ : text;
170
+ };
171
+ const toReplacementText = (op, xsText) => {
172
+ switch (op.fn) {
173
+ case 'tail':
174
+ case 'butLast':
175
+ return `${arrRef}.${op.fn}(${xsText})`;
176
+ case 'skip':
177
+ case 'take':
178
+ case 'skipLast':
179
+ case 'takeLast':
180
+ return `${arrRef}.${op.fn}(${xsText}, ${op.count})`;
181
+ case 'toUnshifted':
182
+ case 'toPushed':
183
+ return `${arrRef}.${op.fn}(${xsText}, ${op.itemText})`;
184
+ }
185
+ };
186
+ const mut_nodesToFix = [];
187
+ const report = (node, op, xsText) => {
188
+ mut_nodesToFix.push({
189
+ node,
190
+ replacement: toReplacementText(op, xsText),
191
+ });
192
+ };
193
+ /** Matches `<xsText>.length` (non-computed). */
194
+ const isReceiverLengthAccess = (node, receiverText) => node.type === AST_NODE_TYPES.MemberExpression &&
195
+ !node.computed &&
196
+ node.property.type === AST_NODE_TYPES.Identifier &&
197
+ node.property.name === 'length' &&
198
+ sourceCode.getText(node.object) === receiverText;
199
+ /** Matches `<xsText>.length - M` (M ≥ 1) and returns `M`. */
200
+ const matchLengthMinus = (node, receiverText) => {
201
+ if (node.type !== AST_NODE_TYPES.BinaryExpression ||
202
+ node.operator !== '-' ||
203
+ !isReceiverLengthAccess(node.left, receiverText)) {
204
+ return undefined;
205
+ }
206
+ const m = asNonNegativeIntegerLiteral(node.right);
207
+ return m !== undefined && m >= 1 ? m : undefined;
208
+ };
209
+ /**
210
+ * Matches an index-only filter callback (`(_, i) => <comparison>`) and
211
+ * classifies the comparison. Both a leading index (`i >= 1`) and a
212
+ * trailing index (`1 <= i`) operand order are accepted.
213
+ */
214
+ const classifyFilterCallback = (callback, receiver, receiverText) => {
215
+ if (callback.type !== AST_NODE_TYPES.ArrowFunctionExpression ||
216
+ callback.async ||
217
+ callback.body.type === AST_NODE_TYPES.BlockStatement ||
218
+ callback.params.length !== 2) {
219
+ return undefined;
220
+ }
221
+ const [elementParam, indexParam] = callback.params;
222
+ if (elementParam === undefined ||
223
+ indexParam === undefined ||
224
+ elementParam.type !== AST_NODE_TYPES.Identifier ||
225
+ indexParam.type !== AST_NODE_TYPES.Identifier) {
226
+ return undefined;
227
+ }
228
+ // A callback parameter shadowing the receiver's root binding (e.g.
229
+ // `xs.filter((xs, i) => i < xs.length - 1)`) would make the textual
230
+ // `xs.length` comparison refer to the element, not the receiver.
231
+ const receiverRoot = rootIdentifierName(receiver);
232
+ if (receiverRoot !== undefined &&
233
+ (elementParam.name === receiverRoot || indexParam.name === receiverRoot)) {
234
+ return undefined;
235
+ }
236
+ const body = callback.body;
237
+ if (body.type !== AST_NODE_TYPES.BinaryExpression ||
238
+ !COMPARISON_OPERATORS.has(body.operator)) {
239
+ return undefined;
240
+ }
241
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
242
+ const rawOperator = body.operator;
243
+ const isIndex = (side) => side.type === AST_NODE_TYPES.Identifier &&
244
+ side.name === indexParam.name;
245
+ const [op, other] = isIndex(body.left)
246
+ ? [rawOperator, body.right]
247
+ : isIndex(body.right)
248
+ ? [FLIPPED_OPERATORS[rawOperator], body.left]
249
+ : [undefined, undefined];
250
+ // `op` and `other` are set together (both from the same tuple), so
251
+ // checking `op` also guarantees `other` is defined.
252
+ if (op === undefined || isIndex(other)) {
253
+ return undefined;
254
+ }
255
+ // The element parameter must not participate in the comparison (only
256
+ // the index side and a receiver-independent bound are recognized, so
257
+ // reaching here with an element reference is impossible for literals,
258
+ // but `xs.length - N` needs a stable receiver).
259
+ const n = asNonNegativeIntegerLiteral(other);
260
+ if (n !== undefined) {
261
+ return classifyLiteralComparison(op, n);
262
+ }
263
+ if (!isSimpleReference(receiver))
264
+ return undefined;
265
+ const m = matchLengthMinus(other, receiverText);
266
+ return m === undefined ? undefined : classifyLengthComparison(op, m);
267
+ };
268
+ const classifySliceArgs = (args, receiver) => {
269
+ if (args.length === 1) {
270
+ const [start] = args;
271
+ if (start === undefined)
272
+ return undefined;
273
+ const n = asNonNegativeIntegerLiteral(start);
274
+ if (n !== undefined)
275
+ return normalizeCountedOp('skip', n);
276
+ const negated = asNegatedPositiveIntegerLiteral(start);
277
+ return negated === undefined
278
+ ? undefined
279
+ : normalizeCountedOp('takeLast', negated);
280
+ }
281
+ if (args.length === 2) {
282
+ const [start, end] = args;
283
+ if (start === undefined ||
284
+ end === undefined ||
285
+ asNonNegativeIntegerLiteral(start) !== 0) {
286
+ return undefined;
287
+ }
288
+ const n = asNonNegativeIntegerLiteral(end);
289
+ if (n !== undefined)
290
+ return normalizeCountedOp('take', n);
291
+ const negated = asNegatedPositiveIntegerLiteral(end);
292
+ if (negated !== undefined) {
293
+ return normalizeCountedOp('skipLast', negated);
294
+ }
295
+ if (!isSimpleReference(receiver))
296
+ return undefined;
297
+ const m = matchLengthMinus(end, sourceCode.getText(receiver));
298
+ return m === undefined ? undefined : normalizeCountedOp('skipLast', m);
299
+ }
300
+ return undefined;
301
+ };
302
+ const classifyToSplicedArgs = (args, receiver, receiverText) => {
303
+ if (args.length === 1) {
304
+ const [start] = args;
305
+ if (start === undefined)
306
+ return undefined;
307
+ const n = asNonNegativeIntegerLiteral(start);
308
+ // `xs.toSpliced(N)` removes everything from index N on → take N.
309
+ if (n !== undefined)
310
+ return normalizeCountedOp('take', n);
311
+ const negated = asNegatedPositiveIntegerLiteral(start);
312
+ // `xs.toSpliced(-N)` removes the last N elements → skipLast N.
313
+ return negated === undefined
314
+ ? undefined
315
+ : normalizeCountedOp('skipLast', negated);
316
+ }
317
+ if (args.length === 2) {
318
+ const [start, deleteCount] = args;
319
+ if (start === undefined ||
320
+ deleteCount === undefined ||
321
+ asNonNegativeIntegerLiteral(start) !== 0) {
322
+ return undefined;
323
+ }
324
+ // `xs.toSpliced(0, N)` removes the first N elements → skip N.
325
+ const n = asNonNegativeIntegerLiteral(deleteCount);
326
+ if (n !== undefined)
327
+ return normalizeCountedOp('skip', n);
328
+ // `xs.toSpliced(0, xs.length - N)` keeps the last N → takeLast N.
329
+ // (Note: `xs.toSpliced(0, -N)` clamps the delete count to 0 and is a
330
+ // plain copy, so it is deliberately NOT treated as takeLast.)
331
+ if (!isSimpleReference(receiver))
332
+ return undefined;
333
+ const m = matchLengthMinus(deleteCount, receiverText);
334
+ return m === undefined ? undefined : normalizeCountedOp('takeLast', m);
335
+ }
336
+ if (args.length === 3) {
337
+ const [start, deleteCount, item] = args;
338
+ if (start === undefined ||
339
+ deleteCount === undefined ||
340
+ item === undefined ||
341
+ item.type === AST_NODE_TYPES.SpreadElement ||
342
+ asNonNegativeIntegerLiteral(deleteCount) !== 0) {
343
+ return undefined;
344
+ }
345
+ // `xs.toSpliced(0, 0, item)` prepends → toUnshifted.
346
+ if (asNonNegativeIntegerLiteral(start) === 0) {
347
+ return { fn: 'toUnshifted', itemText: toArgText(item) };
348
+ }
349
+ // `xs.toSpliced(xs.length, 0, item)` appends → toPushed.
350
+ if (isSimpleReference(receiver) &&
351
+ isReceiverLengthAccess(start, receiverText)) {
352
+ return { fn: 'toPushed', itemText: toArgText(item) };
353
+ }
354
+ return undefined;
355
+ }
356
+ return undefined;
357
+ };
358
+ return {
359
+ CallExpression: (node) => {
360
+ const callee = node.callee;
361
+ if (callee.type !== AST_NODE_TYPES.MemberExpression ||
362
+ callee.computed ||
363
+ callee.property.type !== AST_NODE_TYPES.Identifier) {
364
+ return;
365
+ }
366
+ const methodName = callee.property.name;
367
+ const receiver = callee.object;
368
+ // `Arr.skip(xs, 1)` → `Arr.tail(xs)`, `Arr.skipLast(xs, 1)` →
369
+ // `Arr.butLast(xs)` (also via a namespace import or an alias).
370
+ if (methodName === 'skip' || methodName === 'skipLast') {
371
+ const isArrObject = (receiver.type === AST_NODE_TYPES.Identifier &&
372
+ receiver.name === arrLocalName) ||
373
+ (receiver.type === AST_NODE_TYPES.MemberExpression &&
374
+ !receiver.computed &&
375
+ receiver.object.type === AST_NODE_TYPES.Identifier &&
376
+ receiver.object.name === namespaceLocalName &&
377
+ receiver.property.type === AST_NODE_TYPES.Identifier &&
378
+ receiver.property.name === 'Arr');
379
+ const [arrayArg, countArg] = node.arguments;
380
+ if (isArrObject &&
381
+ node.arguments.length === 2 &&
382
+ arrayArg !== undefined &&
383
+ arrayArg.type !== AST_NODE_TYPES.SpreadElement &&
384
+ countArg !== undefined &&
385
+ asNonNegativeIntegerLiteral(countArg) === 1) {
386
+ report(node, { fn: methodName === 'skip' ? 'tail' : 'butLast' }, toArgText(arrayArg));
387
+ }
388
+ return;
389
+ }
390
+ // `[item].concat(xs)` → `Arr.toUnshifted(xs, item)`.
391
+ if (methodName === 'concat' &&
392
+ receiver.type === AST_NODE_TYPES.ArrayExpression) {
393
+ const [element] = receiver.elements;
394
+ const [arg] = node.arguments;
395
+ if (receiver.elements.length === 1 &&
396
+ element !== null &&
397
+ element !== undefined &&
398
+ element.type !== AST_NODE_TYPES.SpreadElement &&
399
+ node.arguments.length === 1 &&
400
+ arg !== undefined &&
401
+ arg.type !== AST_NODE_TYPES.SpreadElement &&
402
+ isArrayOrTupleType(getTypeOf(arg))) {
403
+ report(node, { fn: 'toUnshifted', itemText: toArgText(element) }, toArgText(arg));
404
+ }
405
+ return;
406
+ }
407
+ if (methodName !== 'slice' &&
408
+ methodName !== 'toSpliced' &&
409
+ methodName !== 'filter' &&
410
+ methodName !== 'concat') {
411
+ return;
412
+ }
413
+ // The receiver must be an array or tuple (not a string / typed array
414
+ // / other object that happens to share the method name).
415
+ if (!isArrayOrTupleType(getTypeOf(receiver)))
416
+ return;
417
+ const receiverText = sourceCode.getText(receiver);
418
+ switch (methodName) {
419
+ case 'slice': {
420
+ const op = classifySliceArgs(node.arguments, receiver);
421
+ if (op !== undefined)
422
+ report(node, op, toArgText(receiver));
423
+ return;
424
+ }
425
+ case 'toSpliced': {
426
+ const op = classifyToSplicedArgs(node.arguments, receiver, receiverText);
427
+ if (op !== undefined)
428
+ report(node, op, toArgText(receiver));
429
+ return;
430
+ }
431
+ case 'filter': {
432
+ const [callback] = node.arguments;
433
+ if (callback === undefined || node.arguments.length !== 1) {
434
+ return;
435
+ }
436
+ const op = classifyFilterCallback(callback, receiver, receiverText);
437
+ if (op !== undefined)
438
+ report(node, op, toArgText(receiver));
439
+ return;
440
+ }
441
+ case 'concat': {
442
+ const [arg] = node.arguments;
443
+ if (node.arguments.length !== 1 ||
444
+ arg === undefined ||
445
+ arg.type === AST_NODE_TYPES.SpreadElement) {
446
+ return;
447
+ }
448
+ // `xs.concat([item])` → `Arr.toPushed(xs, item)`.
449
+ if (arg.type === AST_NODE_TYPES.ArrayExpression) {
450
+ const [element] = arg.elements;
451
+ if (arg.elements.length === 1 &&
452
+ element !== null &&
453
+ element !== undefined &&
454
+ element.type !== AST_NODE_TYPES.SpreadElement) {
455
+ report(node, { fn: 'toPushed', itemText: toArgText(element) }, toArgText(receiver));
456
+ }
457
+ return;
458
+ }
459
+ // `xs.concat(item)` appends only when `item` can never be an
460
+ // array (otherwise `concat` would flatten it).
461
+ if (isDefinitelyNotArrayType(getTypeOf(arg))) {
462
+ report(node, { fn: 'toPushed', itemText: toArgText(arg) }, toArgText(receiver));
463
+ }
464
+ }
465
+ }
466
+ },
467
+ ArrayExpression: (node) => {
468
+ // `[item, ...xs]` → `Arr.toUnshifted(xs, item)`,
469
+ // `[...xs, item]` → `Arr.toPushed(xs, item)`.
470
+ if (node.elements.length !== 2)
471
+ return;
472
+ const [first, second] = node.elements;
473
+ if (first === null ||
474
+ first === undefined ||
475
+ second === null ||
476
+ second === undefined) {
477
+ return;
478
+ }
479
+ const [spread, item, fn] = first.type === AST_NODE_TYPES.SpreadElement &&
480
+ second.type !== AST_NODE_TYPES.SpreadElement
481
+ ? [first, second, 'toPushed']
482
+ : first.type !== AST_NODE_TYPES.SpreadElement &&
483
+ second.type === AST_NODE_TYPES.SpreadElement
484
+ ? [second, first, 'toUnshifted']
485
+ : [undefined, undefined, undefined];
486
+ // `spread`, `item`, and `fn` are set together (all from the same
487
+ // tuple), so checking `spread` also guarantees the others are
488
+ // defined.
489
+ if (spread === undefined)
490
+ return;
491
+ // Spreading a non-array iterable (`[v, ...someSet]`) is a genuine
492
+ // conversion, not an element addition to an array.
493
+ if (!isArrayOrTupleType(getTypeOf(spread.argument)))
494
+ return;
495
+ report(node, { fn, itemText: toArgText(item) }, toArgText(spread.argument));
496
+ },
497
+ 'Program:exit': () => {
498
+ for (const [index, nodeInfo] of mut_nodesToFix.entries()) {
499
+ context.report({
500
+ node: nodeInfo.node,
501
+ messageId: 'preferCanonicalArraySlicing',
502
+ data: { replacement: nodeInfo.replacement },
503
+ fix: (fixer) => {
504
+ const importFixes = index === 0 && needsArrImport
505
+ ? buildImportFixes(fixer, program, tsDataForgeImport, ['Arr'])
506
+ : [];
507
+ return [
508
+ ...importFixes,
509
+ fixer.replaceText(nodeInfo.node, nodeInfo.replacement),
510
+ ];
511
+ },
512
+ });
513
+ }
514
+ },
515
+ };
516
+ },
517
+ defaultOptions: [],
518
+ };
519
+ /* eslint-enable @typescript-eslint/prefer-readonly-parameter-types */
520
+
521
+ export { preferCanonicalArraySlicing };
522
+ //# sourceMappingURL=prefer-canonical-array-slicing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-canonical-array-slicing.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAiCA;AACA,MAAM,kBAAkB,GAAG,CACzB,EAA6C,EAC7C,KAAa,KAEb,KAAK,GAAG;AACN,MAAE;AACF,MAAE,EAAE,KAAK,MAAM,IAAI,KAAK,KAAK;AAC3B,UAAG,EAAE,EAAE,EAAE,MAAM;AACf,UAAE,EAAE,KAAK,UAAU,IAAI,KAAK,KAAK;AAC/B,cAAG,EAAE,EAAE,EAAE,SAAS;AAClB,cAAG,EAAE,EAAE,EAAE,KAAK,EAAY;AAElC,MAAM,2BAA2B,GAAG,CAClC,IAAmB,KAEnB,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;AACpC,IAAA,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;AAC9B,IAAA,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,IAAI;MACV,IAAI,CAAC;MACL,SAAS;AAEf;AACA,MAAM,+BAA+B,GAAG,CACtC,IAAmB,KACG;AACtB,IAAA,IACE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe;QAC5C,IAAI,CAAC,QAAQ,KAAK,GAAG;QACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAC7C;AACA,QAAA,OAAO,SAAS;IAClB;IAEA,MAAM,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEpD,IAAA,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS;AAClD,CAAC;AAED;;;;AAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,IAAmB,KAC5C,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AACvC,IAAA,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;AAC3C,KAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;QAC5C,CAAC,IAAI,CAAC,QAAQ;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAChD,QAAA,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEnC,MAAM,kBAAkB,GAAG,CAAC,IAAmB,KAC7C,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC;MACzB,IAAI,CAAC;AACP,MAAE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC;AAC7B,UAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM;UAC9B,SAAS;AAIjB,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,KAAK;IACL,GAAG;IACH,IAAI;IACJ,GAAG;IACH,IAAI;AAC4C,CAAA,CAAC;AAEnD;AACA,MAAM,iBAAiB,GAAG;AACxB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,IAAI,EAAE,IAAI;CACuD;AAEnE;AACA,MAAM,yBAAyB,GAAG,CAChC,EAAsB,EACtB,CAAS,KACa;IACtB,QAAQ,EAAE;AACR,QAAA,KAAK,IAAI;AACP,YAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtC,QAAA,KAAK,GAAG;YACN,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;AAE1C,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,SAAS;AAE7C,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtC,QAAA,KAAK,IAAI;YACP,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;;AAE9C,CAAC;AAED;AACA,MAAM,wBAAwB,GAAG,CAC/B,EAAsB,EACtB,CAAS,KACa;IACtB,QAAQ,EAAE;AACR,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC;AAE1C,QAAA,KAAK,IAAI;YACP,OAAO,kBAAkB,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;AAE9C,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,SAAS;AAEhD,QAAA,KAAK,IAAI;AACP,YAAA,OAAO,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC;AAE1C,QAAA,KAAK,GAAG;YACN,OAAO,kBAAkB,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;;AAElD,CAAC;AAEM,MAAM,2BAA2B,GAGpC;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE;AACJ,YAAA,WAAW,EACT,yRAAyR;AAC5R,SAAA;AACD,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,QAAQ,EAAE;AACR,YAAA,2BAA2B,EACzB,oDAAoD;AACvD,SAAA;AACF,KAAA;AAED,IAAA,MAAM,EAAE,CAAC,OAAO,KAAI;AAClB,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;AAErC,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG;AAE9B,QAAA,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAEvD,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAE7D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE;AAEvD;;;;AAIG;QACH,MAAM,YAAY,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAEnE,MAAM,kBAAkB,GAAG,iBAAiB,EAAE,UAAU,CAAC,IAAI,CAC3D,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,KAAK,cAAc,CAAC,wBAAwB,CAC1E,EAAE,KAAK,CAAC,IAAI;QAEb,MAAM,MAAM,GACV,YAAY;AACZ,aAAC,kBAAkB,KAAK,SAAS,GAAG,KAAK,GAAG,CAAA,EAAG,kBAAkB,CAAA,IAAA,CAAM,CAAC;QAE1E,MAAM,cAAc,GAClB,YAAY,KAAK,SAAS,IAAI,kBAAkB,KAAK,SAAS;AAEhE;;;AAGG;AACH,QAAA,MAAM,kBAAkB,GAAG,CAAC,IAAa,KAAa;YACpD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAClE,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;gBAClB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAC7C;YAEA,IACE,CAAC,IAAI,CAAC,KAAK;AACT,iBAAC,EAAE,CAAC,SAAS,CAAC,aAAa;oBACzB,EAAE,CAAC,SAAS,CAAC,aAAa;oBAC1B,EAAE,CAAC,SAAS,CAAC,WAAW;AACxB,oBAAA,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC;AAC9B,gBAAA,CAAC,EACD;gBACA,MAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC;gBAExD,OAAO,UAAU,KAAK,SAAS,IAAI,kBAAkB,CAAC,UAAU,CAAC;YACnE;AAEA,YAAA,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;AAC/D,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,IAAmB,KACpC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAE3E;;;;AAIG;AACH,QAAA,MAAM,wBAAwB,GAAG,CAAC,IAAa,KAAa;YAC1D,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAClE,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;gBAClB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC;YACnD;YAEA,IACE,CAAC,IAAI,CAAC,KAAK;AACT,iBAAC,EAAE,CAAC,SAAS,CAAC,aAAa;oBACzB,EAAE,CAAC,SAAS,CAAC,aAAa;oBAC1B,EAAE,CAAC,SAAS,CAAC,WAAW;AACxB,oBAAA,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC;AAC9B,gBAAA,CAAC,EACD;gBACA,MAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC;gBAExD,OAAO,UAAU,KAAK,SAAS,IAAI,wBAAwB,CAAC,UAAU,CAAC;YACzE;AAEA,YAAA,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;AACjE,QAAA,CAAC;;AAGD,QAAA,MAAM,SAAS,GAAG,CAAC,IAAmB,KAAY;YAChD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;AAErC,YAAA,OAAO,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC;kBAChC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;kBACR,IAAI;AACV,QAAA,CAAC;AAED,QAAA,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,MAAc,KAAY;AAC/D,YAAA,QAAQ,EAAE,CAAC,EAAE;AACX,gBAAA,KAAK,MAAM;AACX,gBAAA,KAAK,SAAS;oBACZ,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAC,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG;AAExC,gBAAA,KAAK,MAAM;AACX,gBAAA,KAAK,MAAM;AACX,gBAAA,KAAK,UAAU;AACf,gBAAA,KAAK,UAAU;AACb,oBAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAC,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,EAAE,CAAC,KAAK,GAAG;AAErD,gBAAA,KAAK,aAAa;AAClB,gBAAA,KAAK,UAAU;AACb,oBAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAC,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,EAAE,CAAC,QAAQ,GAAG;;AAE5D,QAAA,CAAC;QAED,MAAM,cAAc,GAGd,EAAE;QAER,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,EAAU,EAAE,MAAc,KAAU;YACvE,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI;AACJ,gBAAA,WAAW,EAAE,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC;AAC3C,aAAA,CAAC;AACJ,QAAA,CAAC;;AAGD,QAAA,MAAM,sBAAsB,GAAG,CAC7B,IAAmB,EACnB,YAAoB,KAEpB,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;YAC7C,CAAC,IAAI,CAAC,QAAQ;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAChD,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAC/B,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,YAAY;;AAGlD,QAAA,MAAM,gBAAgB,GAAG,CACvB,IAAmB,EACnB,YAAoB,KACE;AACtB,YAAA,IACE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;gBAC7C,IAAI,CAAC,QAAQ,KAAK,GAAG;gBACrB,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAChD;AACA,gBAAA,OAAO,SAAS;YAClB;YAEA,MAAM,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;AAEjD,YAAA,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS;AAClD,QAAA,CAAC;AAED;;;;AAIG;QACH,MAAM,sBAAsB,GAAG,CAC7B,QAAyC,EACzC,QAA6B,EAC7B,YAAoB,KACE;AACtB,YAAA,IACE,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,uBAAuB;AACxD,gBAAA,QAAQ,CAAC,KAAK;AACd,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;AACpD,gBAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAC5B;AACA,gBAAA,OAAO,SAAS;YAClB;YAEA,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,MAAM;YAElD,IACE,YAAY,KAAK,SAAS;AAC1B,gBAAA,UAAU,KAAK,SAAS;AACxB,gBAAA,YAAY,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAC/C,gBAAA,UAAU,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,EAC7C;AACA,gBAAA,OAAO,SAAS;YAClB;;;;AAKA,YAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAEjD,IACE,YAAY,KAAK,SAAS;AAC1B,iBAAC,YAAY,CAAC,IAAI,KAAK,YAAY,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,CAAC,EACxE;AACA,gBAAA,OAAO,SAAS;YAClB;AAEA,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAE1B,YAAA,IACE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;gBAC7C,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxC;AACA,gBAAA,OAAO,SAAS;YAClB;;AAGA,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAA8B;AAEvD,YAAA,MAAM,OAAO,GAAG,CAAC,IAAmB,KAClC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AACvC,gBAAA,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;YAE/B,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI;AACnC,kBAAG,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK;AAC3B,kBAAE,OAAO,CAAC,IAAI,CAAC,KAAK;sBACf,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI;AAC7C,sBAAE,CAAC,SAAS,EAAE,SAAS,CAAC;;;YAI5B,IAAI,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AACtC,gBAAA,OAAO,SAAS;YAClB;;;;;AAMA,YAAA,MAAM,CAAC,GAAG,2BAA2B,CAAC,KAAK,CAAC;AAE5C,YAAA,IAAI,CAAC,KAAK,SAAS,EAAE;AACnB,gBAAA,OAAO,yBAAyB,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC;AAEA,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAAE,gBAAA,OAAO,SAAS;YAElD,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC;AAE/C,YAAA,OAAO,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,QAAA,CAAC;AAED,QAAA,MAAM,iBAAiB,GAAG,CACxB,IAAgD,EAChD,QAA6B,KACP;AACtB,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,gBAAA,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI;gBAEpB,IAAI,KAAK,KAAK,SAAS;AAAE,oBAAA,OAAO,SAAS;AAEzC,gBAAA,MAAM,CAAC,GAAG,2BAA2B,CAAC,KAAK,CAAC;gBAE5C,IAAI,CAAC,KAAK,SAAS;AAAE,oBAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzD,gBAAA,MAAM,OAAO,GAAG,+BAA+B,CAAC,KAAK,CAAC;gBAEtD,OAAO,OAAO,KAAK;AACjB,sBAAE;AACF,sBAAE,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC;YAC7C;AAEA,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,gBAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI;gBAEzB,IACE,KAAK,KAAK,SAAS;AACnB,oBAAA,GAAG,KAAK,SAAS;AACjB,oBAAA,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,EACxC;AACA,oBAAA,OAAO,SAAS;gBAClB;AAEA,gBAAA,MAAM,CAAC,GAAG,2BAA2B,CAAC,GAAG,CAAC;gBAE1C,IAAI,CAAC,KAAK,SAAS;AAAE,oBAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzD,gBAAA,MAAM,OAAO,GAAG,+BAA+B,CAAC,GAAG,CAAC;AAEpD,gBAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,oBAAA,OAAO,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC;gBAChD;AAEA,gBAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAAE,oBAAA,OAAO,SAAS;AAElD,gBAAA,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE7D,gBAAA,OAAO,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC;YACxE;AAEA,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC;QAED,MAAM,qBAAqB,GAAG,CAC5B,IAAgD,EAChD,QAA6B,EAC7B,YAAoB,KACE;AACtB,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,gBAAA,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI;gBAEpB,IAAI,KAAK,KAAK,SAAS;AAAE,oBAAA,OAAO,SAAS;AAEzC,gBAAA,MAAM,CAAC,GAAG,2BAA2B,CAAC,KAAK,CAAC;;gBAG5C,IAAI,CAAC,KAAK,SAAS;AAAE,oBAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzD,gBAAA,MAAM,OAAO,GAAG,+BAA+B,CAAC,KAAK,CAAC;;gBAGtD,OAAO,OAAO,KAAK;AACjB,sBAAE;AACF,sBAAE,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC;YAC7C;AAEA,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,gBAAA,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,IAAI;gBAEjC,IACE,KAAK,KAAK,SAAS;AACnB,oBAAA,WAAW,KAAK,SAAS;AACzB,oBAAA,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,EACxC;AACA,oBAAA,OAAO,SAAS;gBAClB;;AAGA,gBAAA,MAAM,CAAC,GAAG,2BAA2B,CAAC,WAAW,CAAC;gBAElD,IAAI,CAAC,KAAK,SAAS;AAAE,oBAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;;;;AAKzD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAAE,oBAAA,OAAO,SAAS;gBAElD,MAAM,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC;AAErD,gBAAA,OAAO,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC;YACxE;AAEA,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,IAAI;gBAEvC,IACE,KAAK,KAAK,SAAS;AACnB,oBAAA,WAAW,KAAK,SAAS;AACzB,oBAAA,IAAI,KAAK,SAAS;AAClB,oBAAA,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;AAC1C,oBAAA,2BAA2B,CAAC,WAAW,CAAC,KAAK,CAAC,EAC9C;AACA,oBAAA,OAAO,SAAS;gBAClB;;AAGA,gBAAA,IAAI,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AAC5C,oBAAA,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;gBACzD;;gBAGA,IACE,iBAAiB,CAAC,QAAQ,CAAC;AAC3B,oBAAA,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,EAC3C;AACA,oBAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;gBACtD;AAEA,gBAAA,OAAO,SAAS;YAClB;AAEA,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC;QAED,OAAO;AACL,YAAA,cAAc,EAAE,CAAC,IAAI,KAAI;AACvB,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAE1B,gBAAA,IACE,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;AAC/C,oBAAA,MAAM,CAAC,QAAQ;oBACf,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,EAClD;oBACA;gBACF;AAEA,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI;AAEvC,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM;;;gBAI9B,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,UAAU,EAAE;oBACtD,MAAM,WAAW,GACf,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAC1C,wBAAA,QAAQ,CAAC,IAAI,KAAK,YAAY;AAChC,yBAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;4BAChD,CAAC,QAAQ,CAAC,QAAQ;AAClB,4BAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAClD,4BAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB;AAC3C,4BAAA,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AACpD,4BAAA,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC;oBAErC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS;AAE3C,oBAAA,IACE,WAAW;AACX,wBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;AAC3B,wBAAA,QAAQ,KAAK,SAAS;AACtB,wBAAA,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;AAC9C,wBAAA,QAAQ,KAAK,SAAS;AACtB,wBAAA,2BAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC3C;wBACA,MAAM,CACJ,IAAI,EACJ,EAAE,EAAE,EAAE,UAAU,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,EAClD,SAAS,CAAC,QAAQ,CAAC,CACpB;oBACH;oBAEA;gBACF;;gBAGA,IACE,UAAU,KAAK,QAAQ;AACvB,oBAAA,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,EAChD;AACA,oBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,QAAQ;AAEnC,oBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS;AAE5B,oBAAA,IACE,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;AAC9B,wBAAA,OAAO,KAAK,IAAI;AAChB,wBAAA,OAAO,KAAK,SAAS;AACrB,wBAAA,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;AAC7C,wBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;AAC3B,wBAAA,GAAG,KAAK,SAAS;AACjB,wBAAA,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;AACzC,wBAAA,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAClC;wBACA,MAAM,CACJ,IAAI,EACJ,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EACnD,SAAS,CAAC,GAAG,CAAC,CACf;oBACH;oBAEA;gBACF;gBAEA,IACE,UAAU,KAAK,OAAO;AACtB,oBAAA,UAAU,KAAK,WAAW;AAC1B,oBAAA,UAAU,KAAK,QAAQ;oBACvB,UAAU,KAAK,QAAQ,EACvB;oBACA;gBACF;;;AAIA,gBAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAAE;gBAE9C,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAEjD,QAAQ,UAAU;oBAChB,KAAK,OAAO,EAAE;wBACZ,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;wBAEtD,IAAI,EAAE,KAAK,SAAS;4BAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;wBAE3D;oBACF;oBAEA,KAAK,WAAW,EAAE;AAChB,wBAAA,MAAM,EAAE,GAAG,qBAAqB,CAC9B,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,YAAY,CACb;wBAED,IAAI,EAAE,KAAK,SAAS;4BAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;wBAE3D;oBACF;oBAEA,KAAK,QAAQ,EAAE;AACb,wBAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS;AAEjC,wBAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;4BACzD;wBACF;wBAEA,MAAM,EAAE,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC;wBAEnE,IAAI,EAAE,KAAK,SAAS;4BAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;wBAE3D;oBACF;oBAEA,KAAK,QAAQ,EAAE;AACb,wBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS;AAE5B,wBAAA,IACE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;AAC3B,4BAAA,GAAG,KAAK,SAAS;AACjB,4BAAA,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,EACzC;4BACA;wBACF;;wBAGA,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,EAAE;AAC/C,4BAAA,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,QAAQ;AAE9B,4BAAA,IACE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;AACzB,gCAAA,OAAO,KAAK,IAAI;AAChB,gCAAA,OAAO,KAAK,SAAS;AACrB,gCAAA,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,EAC7C;gCACA,MAAM,CACJ,IAAI,EACJ,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EAChD,SAAS,CAAC,QAAQ,CAAC,CACpB;4BACH;4BAEA;wBACF;;;wBAIA,IAAI,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;4BAC5C,MAAM,CACJ,IAAI,EACJ,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAC5C,SAAS,CAAC,QAAQ,CAAC,CACpB;wBACH;oBACF;;YAEJ,CAAC;AAED,YAAA,eAAe,EAAE,CAAC,IAAI,KAAI;;;AAGxB,gBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;oBAAE;gBAEhC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ;gBAErC,IACE,KAAK,KAAK,IAAI;AACd,oBAAA,KAAK,KAAK,SAAS;AACnB,oBAAA,MAAM,KAAK,IAAI;oBACf,MAAM,KAAK,SAAS,EACpB;oBACA;gBACF;AAEA,gBAAA,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,GACtB,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;AAC3C,oBAAA,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC;AAC7B,sBAAG,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU;AAC7B,sBAAE,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;AACzC,wBAAA,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC;AACjC,0BAAG,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa;0BAC9B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;;;;gBAKzC,IAAI,MAAM,KAAK,SAAS;oBAAE;;;gBAI1B,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAAE;gBAErD,MAAM,CACJ,IAAI,EACJ,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EACjC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAC3B;YACH,CAAC;YAED,cAAc,EAAE,MAAK;AACnB,gBAAA,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE;oBACxD,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,wBAAA,SAAS,EAAE,6BAA6B;AACxC,wBAAA,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;AAC3C,wBAAA,GAAG,EAAE,CAAC,KAAK,KAAI;AACb,4BAAA,MAAM,WAAW,GACf,KAAK,KAAK,CAAC,IAAI;AACb,kCAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,KAAK,CAAC;kCAC3D,EAAE;4BAER,OAAO;AACL,gCAAA,GAAG,WAAW;gCACd,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;6BACvD;wBACH,CAAC;AACF,qBAAA,CAAC;gBACJ;YACF,CAAC;SACF;IACH,CAAC;AACD,IAAA,cAAc,EAAE,EAAE;;AAGpB;;;;"}
@@ -1,4 +1,5 @@
1
1
  export declare const tsDataForgeRules: {
2
+ readonly 'prefer-canonical-array-slicing': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferCanonicalArraySlicing", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
3
  readonly 'prefer-arr-is-array-at-least-length': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useIsArrayAtLeastLength", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
3
4
  readonly 'prefer-arr-is-array-of-length': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useIsArrayOfLength", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
4
5
  readonly 'prefer-arr-is-array': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrIsArray", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/rules.mts"],"names":[],"mappings":"AAeA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;CAca,CAAC"}
1
+ {"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/rules.mts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;CAea,CAAC"}
@@ -5,6 +5,7 @@ import { preferArrIsArray } from './prefer-arr-is-array.mjs';
5
5
  import { preferArrIsNonEmpty } from './prefer-arr-is-non-empty.mjs';
6
6
  import { preferArrSum } from './prefer-arr-sum.mjs';
7
7
  import { preferAsInt } from './prefer-as-int.mjs';
8
+ import { preferCanonicalArraySlicing } from './prefer-canonical-array-slicing.mjs';
8
9
  import { preferComparisonOverNullishGuard } from './prefer-comparison-over-nullish-guard.mjs';
9
10
  import { preferIsNonNullObject } from './prefer-is-non-null-object.mjs';
10
11
  import { preferIsRecordAndHasKey } from './prefer-is-record-and-has-key.mjs';
@@ -13,6 +14,7 @@ import { preferNumSafeParseInt } from './prefer-num-safe-parse-int.mjs';
13
14
  import { preferRangeForLoop } from './prefer-range-for-loop.mjs';
14
15
 
15
16
  const tsDataForgeRules = {
17
+ 'prefer-canonical-array-slicing': preferCanonicalArraySlicing,
16
18
  'prefer-arr-is-array-at-least-length': preferArrIsArrayAtLeastLength,
17
19
  'prefer-arr-is-array-of-length': preferArrIsArrayOfLength,
18
20
  'prefer-arr-is-array': preferArrIsArray,
@@ -1 +1 @@
1
- {"version":3,"file":"rules.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/rules.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;AAeO,MAAM,gBAAgB,GAAG;AAC9B,IAAA,qCAAqC,EAAE,6BAA6B;AACpE,IAAA,+BAA+B,EAAE,wBAAwB;AACzD,IAAA,qBAAqB,EAAE,gBAAgB;AACvC,IAAA,yBAAyB,EAAE,mBAAmB;AAC9C,IAAA,gBAAgB,EAAE,YAAY;AAC9B,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,2BAA2B,EAAE,qBAAqB;AAClD,IAAA,uBAAuB,EAAE,kBAAkB;AAC3C,IAAA,8BAA8B,EAAE,uBAAuB;AACvD,IAAA,2BAA2B,EAAE,qBAAqB;AAClD,IAAA,6BAA6B,EAAE,uBAAuB;AACtD,IAAA,2BAA2B,EAAE,sBAAsB;AACnD,IAAA,sCAAsC,EAAE,gCAAgC;;;;;"}
1
+ {"version":3,"file":"rules.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/rules.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;AAgBO,MAAM,gBAAgB,GAAG;AAC9B,IAAA,gCAAgC,EAAE,2BAA2B;AAC7D,IAAA,qCAAqC,EAAE,6BAA6B;AACpE,IAAA,+BAA+B,EAAE,wBAAwB;AACzD,IAAA,qBAAqB,EAAE,gBAAgB;AACvC,IAAA,yBAAyB,EAAE,mBAAmB;AAC9C,IAAA,gBAAgB,EAAE,YAAY;AAC9B,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,2BAA2B,EAAE,qBAAqB;AAClD,IAAA,uBAAuB,EAAE,kBAAkB;AAC3C,IAAA,8BAA8B,EAAE,uBAAuB;AACvD,IAAA,2BAA2B,EAAE,qBAAqB;AAClD,IAAA,6BAA6B,EAAE,uBAAuB;AACtD,IAAA,2BAA2B,EAAE,sBAAsB;AACnD,IAAA,sCAAsC,EAAE,gCAAgC;;;;;"}
@@ -0,0 +1,24 @@
1
+ import { AST_NODE_TYPES, type TSESTree } from '@typescript-eslint/utils';
2
+ import * as ts from 'typescript';
3
+ /**
4
+ * Builds a predicate that returns `true` if every constituent of the given type
5
+ * is an array or tuple type. Unions must be array-like in all branches for a
6
+ * defensive `Array.from()` to be safely removable; `any` / `unknown` are
7
+ * treated conservatively as not array-like because they could be a `Set` /
8
+ * `Map` / iterable that genuinely relies on `Array.from()` to be materialized
9
+ * into an array.
10
+ */
11
+ export declare const createIsArrayOrTupleType: (checker: ts.TypeChecker) => ((type: ts.Type) => boolean);
12
+ /**
13
+ * Wraps the source text of an expression in parentheses when it cannot be used
14
+ * directly as the object of a member expression.
15
+ */
16
+ export declare const toMemberObjectText: (argText: string, argNodeType: AST_NODE_TYPES) => string;
17
+ /**
18
+ * Matches a call expression of the shape `Array.from(<arg>)` (exactly one
19
+ * non-spread argument) and returns the argument, or `undefined` when the node
20
+ * has a different shape. `Array.from(x, mapFn)` maps each element, so it is not
21
+ * a plain defensive copy and is not matched.
22
+ */
23
+ export declare const matchArrayFromCall: (node: TSESTree.Expression) => TSESTree.Expression | undefined;
24
+ //# sourceMappingURL=array-type-utils.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-type-utils.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-restrictions/rules/array-type-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAajC;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GAEnC,SAAS,EAAE,CAAC,WAAW,KAEtB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAqB7B,CAAC;AAgBF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,MAAM,EACf,aAAa,cAAc,KAC1B,MAG4B,CAAC;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAE7B,MAAM,QAAQ,CAAC,UAAU,KACxB,QAAQ,CAAC,UAAU,GAAG,SAyBxB,CAAC"}