eslint-plugin-ts-data-forge 0.6.0 → 0.7.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 +1 -0
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +45 -41
- package/dist/plugin.mjs.map +1 -1
- package/dist/rule-types.d.mts +15 -0
- package/dist/rule-types.d.mts.map +1 -1
- package/dist/rule-types.mjs +6 -2
- package/dist/rule-types.mjs.map +1 -1
- package/dist/rules/ast-utils.mjs +107 -50
- package/dist/rules/ast-utils.mjs.map +1 -1
- package/dist/rules/branded-number-types.mjs +41 -37
- package/dist/rules/branded-number-types.mjs.map +1 -1
- package/dist/rules/constants.mjs +2 -4
- package/dist/rules/constants.mjs.map +1 -1
- package/dist/rules/import-utils.mjs +80 -56
- package/dist/rules/import-utils.mjs.map +1 -1
- package/dist/rules/index.mjs +2 -2
- package/dist/rules/index.mjs.map +1 -1
- package/dist/rules/no-side-effect-import.mjs +46 -34
- package/dist/rules/no-side-effect-import.mjs.map +1 -1
- package/dist/rules/no-unnecessary-type-guard.mjs +376 -265
- package/dist/rules/no-unnecessary-type-guard.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-array.mjs +64 -52
- package/dist/rules/prefer-arr-is-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-bounded-length-array.mjs +91 -85
- package/dist/rules/prefer-arr-is-bounded-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-fixed-length-array.mjs +92 -83
- package/dist/rules/prefer-arr-is-fixed-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-max-length-array.mjs +92 -80
- package/dist/rules/prefer-arr-is-max-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-min-length-array.mjs +92 -80
- package/dist/rules/prefer-arr-is-min-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-non-empty.mjs +85 -77
- package/dist/rules/prefer-arr-is-non-empty.mjs.map +1 -1
- package/dist/rules/prefer-arr-scan.d.mts +96 -0
- package/dist/rules/prefer-arr-scan.d.mts.map +1 -0
- package/dist/rules/prefer-arr-scan.mjs +482 -0
- package/dist/rules/prefer-arr-scan.mjs.map +1 -0
- package/dist/rules/prefer-arr-sum.mjs +176 -132
- package/dist/rules/prefer-arr-sum.mjs.map +1 -1
- package/dist/rules/prefer-as-int.mjs +77 -71
- package/dist/rules/prefer-as-int.mjs.map +1 -1
- package/dist/rules/prefer-canonical-array-slicing.mjs +503 -343
- package/dist/rules/prefer-canonical-array-slicing.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-cast.mjs +217 -144
- package/dist/rules/prefer-canonical-length-cast.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-guard.mjs +160 -109
- package/dist/rules/prefer-canonical-length-guard.mjs.map +1 -1
- package/dist/rules/prefer-comparison-over-nullish-guard.mjs +89 -71
- package/dist/rules/prefer-comparison-over-nullish-guard.mjs.map +1 -1
- package/dist/rules/prefer-is-non-null-object.mjs +91 -72
- package/dist/rules/prefer-is-non-null-object.mjs.map +1 -1
- package/dist/rules/prefer-is-record-and-has-key.mjs +148 -105
- package/dist/rules/prefer-is-record-and-has-key.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-float.mjs +101 -77
- package/dist/rules/prefer-num-safe-parse-float.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-int.mjs +103 -81
- package/dist/rules/prefer-num-safe-parse-int.mjs.map +1 -1
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs +299 -194
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs.map +1 -1
- package/dist/rules/prefer-range-for-loop.mjs +121 -99
- package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
- package/dist/rules/rules.d.mts +1 -0
- package/dist/rules/rules.d.mts.map +1 -1
- package/dist/rules/rules.mjs +19 -20
- package/dist/rules/rules.mjs.map +1 -1
- package/dist/types.mjs +2 -2
- package/dist/types.mjs.map +1 -1
- package/package.json +6 -7
- package/src/plugin.mts +1 -0
- package/src/rule-types.mts +16 -0
- package/src/rules/prefer-arr-scan.mts +693 -0
- package/src/rules/prefer-arr-scan.test.mts +295 -0
- package/src/rules/rules.mts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-canonical-array-slicing.mjs","sources":["../../src/rules/prefer-canonical-array-slicing.mts"],"sourcesContent":["import {\n AST_NODE_TYPES,\n ESLintUtils,\n type TSESLint,\n type TSESTree,\n} from '@typescript-eslint/utils';\nimport { type ReadonlyRecord } from 'ts-type-forge';\nimport * as ts from 'typescript';\nimport {\n buildImportFixes,\n getImportedLocalName,\n getTsDataForgeImport,\n} from './import-utils.mjs';\n\n/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */\n\ntype Options = readonly [];\n\ntype MessageIds = 'preferCanonicalArraySlicing';\n\n/**\n * A canonical ts-data-forge `Arr` operation a detected pattern is rewritten to:\n *\n * - `tail` / `butLast` — drop the first / last element\n * - `skip N` / `take N` — drop / keep the first `N` elements\n * - `skipLast N` / `takeLast N` — drop / keep the last `N` elements\n * - `toUnshifted item` / `toPushed item` — prepend / append one element\n * (`toUnshifted` is emitted in its curried form `toUnshifted(item)(xs)` so\n * the new element keeps the leading position it had in `[item, ...xs]`)\n */\ntype CopyOp = Readonly<\n | { fn: 'butLast' | 'tail' }\n | { fn: 'skip' | 'skipLast' | 'take' | 'takeLast'; count: number }\n | { fn: 'toPushed' | 'toUnshifted'; itemText: string }\n>;\n\n/** `skip 1` / `skipLast 1` have dedicated single-element names. */\nconst normalizeCountedOp = (\n fn: 'skip' | 'skipLast' | 'take' | 'takeLast',\n count: number,\n): CopyOp | undefined =>\n count < 1\n ? undefined\n : fn === 'skip' && count === 1\n ? ({ fn: 'tail' } as const)\n : fn === 'skipLast' && count === 1\n ? ({ fn: 'butLast' } as const)\n : ({ fn, count } as const);\n\nconst asNonNegativeIntegerLiteral = (\n node: TSESTree.Node,\n): number | undefined =>\n node.type === AST_NODE_TYPES.Literal &&\n typeof node.value === 'number' &&\n Number.isInteger(node.value) &&\n node.value >= 0\n ? node.value\n : undefined;\n\n/** Matches `-N` (unary minus of a positive integer literal) and returns `N`. */\nconst asNegatedPositiveIntegerLiteral = (\n node: TSESTree.Node,\n): number | undefined => {\n if (\n node.type !== AST_NODE_TYPES.UnaryExpression ||\n node.operator !== '-' ||\n node.argument.type !== AST_NODE_TYPES.Literal\n ) {\n return undefined;\n }\n\n const n = asNonNegativeIntegerLiteral(node.argument);\n\n return n !== undefined && n >= 1 ? n : undefined;\n};\n\n/**\n * Whether re-reading the expression is free of side effects (a plain variable\n * or a non-computed property chain). Required for patterns that reference the\n * receiver twice, such as `xs.filter((_, i) => i < xs.length - 1)`.\n */\nconst isSimpleReference = (node: TSESTree.Node): boolean =>\n node.type === AST_NODE_TYPES.Identifier ||\n node.type === AST_NODE_TYPES.ThisExpression ||\n (node.type === AST_NODE_TYPES.MemberExpression &&\n !node.computed &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n isSimpleReference(node.object));\n\nconst rootIdentifierName = (node: TSESTree.Node): string | undefined =>\n node.type === AST_NODE_TYPES.Identifier\n ? node.name\n : node.type === AST_NODE_TYPES.MemberExpression\n ? rootIdentifierName(node.object)\n : undefined;\n\ntype ComparisonOperator = '!==' | '<' | '<=' | '>' | '>=';\n\nconst COMPARISON_OPERATORS: ReadonlySet<string> = new Set([\n '!==',\n '<',\n '<=',\n '>',\n '>=',\n] as const satisfies readonly ComparisonOperator[]);\n\n/** Mirror of each comparison when its operands are swapped. */\nconst FLIPPED_OPERATORS = {\n '!==': '!==',\n '<': '>',\n '<=': '>=',\n '>': '<',\n '>=': '<=',\n} as const satisfies ReadonlyRecord<ComparisonOperator, ComparisonOperator>;\n\n/** Classifies `index OP N` (a comparison against an integer literal). */\nconst classifyLiteralComparison = (\n op: ComparisonOperator,\n n: number,\n): CopyOp | undefined => {\n switch (op) {\n case '>=':\n return normalizeCountedOp('skip', n);\n\n case '>':\n return normalizeCountedOp('skip', n + 1);\n\n case '!==':\n return n === 0 ? { fn: 'tail' } : undefined;\n\n case '<':\n return normalizeCountedOp('take', n);\n\n case '<=':\n return normalizeCountedOp('take', n + 1);\n }\n};\n\n/** Classifies `index OP <xs>.length - M`. */\nconst classifyLengthComparison = (\n op: ComparisonOperator,\n m: number,\n): CopyOp | undefined => {\n switch (op) {\n case '<':\n return normalizeCountedOp('skipLast', m);\n\n case '<=':\n return normalizeCountedOp('skipLast', m - 1);\n\n case '!==':\n return m === 1 ? { fn: 'butLast' } : undefined;\n\n case '>=':\n return normalizeCountedOp('takeLast', m);\n\n case '>':\n return normalizeCountedOp('takeLast', m - 1);\n }\n};\n\nexport const preferCanonicalArraySlicing: TSESLint.RuleModule<\n MessageIds,\n Options\n> = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n '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`.',\n },\n fixable: 'code',\n schema: [],\n messages: {\n preferCanonicalArraySlicing:\n 'Replace with `{{replacement}}` from ts-data-forge.',\n },\n },\n\n create: (context) => {\n const sourceCode = context.sourceCode;\n\n const program = sourceCode.ast;\n\n const tsDataForgeImport = getTsDataForgeImport(program);\n\n const parserServices = ESLintUtils.getParserServices(context);\n\n const checker = parserServices.program.getTypeChecker();\n\n /**\n * The in-scope way to reference the `Arr` namespace: a named import\n * (possibly aliased), a namespace import member, or the canonical `Arr`\n * (added by the import fix when nothing is imported yet).\n */\n const arrLocalName = getImportedLocalName(tsDataForgeImport, 'Arr');\n\n const namespaceLocalName = tsDataForgeImport?.specifiers.find(\n (specifier) => specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier,\n )?.local.name;\n\n const arrRef =\n arrLocalName ??\n (namespaceLocalName === undefined ? 'Arr' : `${namespaceLocalName}.Arr`);\n\n const needsArrImport =\n arrLocalName === undefined && namespaceLocalName === undefined;\n\n /**\n * Deferred (non-concrete) types are reduced to their base constraint\n * before checking; `any` / `unknown` are conservatively not array-like.\n */\n const isArrayOrTupleType = (type: ts.Type): boolean => {\n if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {\n return false;\n }\n\n if (type.isUnion()) {\n return type.types.every(isArrayOrTupleType);\n }\n\n if (\n (type.flags &\n (ts.TypeFlags.TypeParameter |\n ts.TypeFlags.IndexedAccess |\n ts.TypeFlags.Conditional |\n ts.TypeFlags.Substitution)) !==\n 0\n ) {\n const constraint = checker.getBaseConstraintOfType(type);\n\n return constraint !== undefined && isArrayOrTupleType(constraint);\n }\n\n return checker.isArrayType(type) || checker.isTupleType(type);\n };\n\n const getTypeOf = (node: TSESTree.Node): ts.Type =>\n checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node));\n\n /**\n * `true` only when the type can never be an array in any branch, so\n * `xs.concat(v)` is guaranteed to append `v` as one element rather than\n * flattening it.\n */\n const isDefinitelyNotArrayType = (type: ts.Type): boolean => {\n if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) {\n return false;\n }\n\n if (type.isUnion()) {\n return type.types.every(isDefinitelyNotArrayType);\n }\n\n if (\n (type.flags &\n (ts.TypeFlags.TypeParameter |\n ts.TypeFlags.IndexedAccess |\n ts.TypeFlags.Conditional |\n ts.TypeFlags.Substitution)) !==\n 0\n ) {\n const constraint = checker.getBaseConstraintOfType(type);\n\n return constraint !== undefined && isDefinitelyNotArrayType(constraint);\n }\n\n return !checker.isArrayType(type) && !checker.isTupleType(type);\n };\n\n /** Argument-position text; a comma (sequence) expression needs parens. */\n const toArgText = (node: TSESTree.Node): string => {\n const text = sourceCode.getText(node);\n\n return node.type === AST_NODE_TYPES.SequenceExpression\n ? `(${text})`\n : text;\n };\n\n const toReplacementText = (op: CopyOp, xsText: string): string => {\n switch (op.fn) {\n case 'tail':\n case 'butLast':\n return `${arrRef}.${op.fn}(${xsText})`;\n\n case 'skip':\n case 'take':\n case 'skipLast':\n case 'takeLast':\n return `${arrRef}.${op.fn}(${xsText}, ${op.count})`;\n\n // Emit the curried form for `toUnshifted` so the new element stays in\n // the same textual position as in the `[item, ...xs]` source, keeping\n // the rewrite easy to read.\n case 'toUnshifted':\n return `${arrRef}.toUnshifted(${op.itemText})(${xsText})`;\n\n case 'toPushed':\n return `${arrRef}.toPushed(${xsText}, ${op.itemText})`;\n }\n };\n\n const mut_nodesToFix: {\n node: TSESTree.Node;\n replacement: string;\n }[] = [];\n\n const report = (node: TSESTree.Node, op: CopyOp, xsText: string): void => {\n mut_nodesToFix.push({\n node,\n replacement: toReplacementText(op, xsText),\n });\n };\n\n /** Matches `<xsText>.length` (non-computed). */\n const isReceiverLengthAccess = (\n node: TSESTree.Node,\n receiverText: string,\n ): boolean =>\n node.type === AST_NODE_TYPES.MemberExpression &&\n !node.computed &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n node.property.name === 'length' &&\n sourceCode.getText(node.object) === receiverText;\n\n /** Matches `<xsText>.length - M` (M ≥ 1) and returns `M`. */\n const matchLengthMinus = (\n node: TSESTree.Node,\n receiverText: string,\n ): number | undefined => {\n if (\n node.type !== AST_NODE_TYPES.BinaryExpression ||\n node.operator !== '-' ||\n !isReceiverLengthAccess(node.left, receiverText)\n ) {\n return undefined;\n }\n\n const m = asNonNegativeIntegerLiteral(node.right);\n\n return m !== undefined && m >= 1 ? m : undefined;\n };\n\n /**\n * Matches an index-only filter callback (`(_, i) => <comparison>`) and\n * classifies the comparison. Both a leading index (`i >= 1`) and a\n * trailing index (`1 <= i`) operand order are accepted.\n */\n const classifyFilterCallback = (\n callback: TSESTree.CallExpressionArgument,\n receiver: TSESTree.Expression,\n receiverText: string,\n ): CopyOp | undefined => {\n if (\n callback.type !== AST_NODE_TYPES.ArrowFunctionExpression ||\n callback.async ||\n callback.body.type === AST_NODE_TYPES.BlockStatement ||\n callback.params.length !== 2\n ) {\n return undefined;\n }\n\n const [elementParam, indexParam] = callback.params;\n\n if (\n elementParam === undefined ||\n indexParam === undefined ||\n elementParam.type !== AST_NODE_TYPES.Identifier ||\n indexParam.type !== AST_NODE_TYPES.Identifier\n ) {\n return undefined;\n }\n\n // A callback parameter shadowing the receiver's root binding (e.g.\n // `xs.filter((xs, i) => i < xs.length - 1)`) would make the textual\n // `xs.length` comparison refer to the element, not the receiver.\n const receiverRoot = rootIdentifierName(receiver);\n\n if (\n receiverRoot !== undefined &&\n (elementParam.name === receiverRoot || indexParam.name === receiverRoot)\n ) {\n return undefined;\n }\n\n const body = callback.body;\n\n if (\n body.type !== AST_NODE_TYPES.BinaryExpression ||\n !COMPARISON_OPERATORS.has(body.operator)\n ) {\n return undefined;\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n const rawOperator = body.operator as ComparisonOperator;\n\n const isIndex = (side: TSESTree.Node): boolean =>\n side.type === AST_NODE_TYPES.Identifier &&\n side.name === indexParam.name;\n\n const [op, other] = isIndex(body.left)\n ? ([rawOperator, body.right] as const)\n : isIndex(body.right)\n ? ([FLIPPED_OPERATORS[rawOperator], body.left] as const)\n : [undefined, undefined];\n\n // `op` and `other` are set together (both from the same tuple), so\n // checking `op` also guarantees `other` is defined.\n if (op === undefined || isIndex(other)) {\n return undefined;\n }\n\n // The element parameter must not participate in the comparison (only\n // the index side and a receiver-independent bound are recognized, so\n // reaching here with an element reference is impossible for literals,\n // but `xs.length - N` needs a stable receiver).\n const n = asNonNegativeIntegerLiteral(other);\n\n if (n !== undefined) {\n return classifyLiteralComparison(op, n);\n }\n\n if (!isSimpleReference(receiver)) return undefined;\n\n const m = matchLengthMinus(other, receiverText);\n\n return m === undefined ? undefined : classifyLengthComparison(op, m);\n };\n\n const classifySliceArgs = (\n args: readonly TSESTree.CallExpressionArgument[],\n receiver: TSESTree.Expression,\n ): CopyOp | undefined => {\n if (args.length === 1) {\n const [start] = args;\n\n if (start === undefined) return undefined;\n\n const n = asNonNegativeIntegerLiteral(start);\n\n if (n !== undefined) return normalizeCountedOp('skip', n);\n\n const negated = asNegatedPositiveIntegerLiteral(start);\n\n return negated === undefined\n ? undefined\n : normalizeCountedOp('takeLast', negated);\n }\n\n if (args.length === 2) {\n const [start, end] = args;\n\n if (\n start === undefined ||\n end === undefined ||\n asNonNegativeIntegerLiteral(start) !== 0\n ) {\n return undefined;\n }\n\n const n = asNonNegativeIntegerLiteral(end);\n\n if (n !== undefined) return normalizeCountedOp('take', n);\n\n const negated = asNegatedPositiveIntegerLiteral(end);\n\n if (negated !== undefined) {\n return normalizeCountedOp('skipLast', negated);\n }\n\n if (!isSimpleReference(receiver)) return undefined;\n\n const m = matchLengthMinus(end, sourceCode.getText(receiver));\n\n return m === undefined ? undefined : normalizeCountedOp('skipLast', m);\n }\n\n return undefined;\n };\n\n const classifyToSplicedArgs = (\n args: readonly TSESTree.CallExpressionArgument[],\n receiver: TSESTree.Expression,\n receiverText: string,\n ): CopyOp | undefined => {\n if (args.length === 1) {\n const [start] = args;\n\n if (start === undefined) return undefined;\n\n const n = asNonNegativeIntegerLiteral(start);\n\n // `xs.toSpliced(N)` removes everything from index N on → take N.\n if (n !== undefined) return normalizeCountedOp('take', n);\n\n const negated = asNegatedPositiveIntegerLiteral(start);\n\n // `xs.toSpliced(-N)` removes the last N elements → skipLast N.\n return negated === undefined\n ? undefined\n : normalizeCountedOp('skipLast', negated);\n }\n\n if (args.length === 2) {\n const [start, deleteCount] = args;\n\n if (\n start === undefined ||\n deleteCount === undefined ||\n asNonNegativeIntegerLiteral(start) !== 0\n ) {\n return undefined;\n }\n\n // `xs.toSpliced(0, N)` removes the first N elements → skip N.\n const n = asNonNegativeIntegerLiteral(deleteCount);\n\n if (n !== undefined) return normalizeCountedOp('skip', n);\n\n // `xs.toSpliced(0, xs.length - N)` keeps the last N → takeLast N.\n // (Note: `xs.toSpliced(0, -N)` clamps the delete count to 0 and is a\n // plain copy, so it is deliberately NOT treated as takeLast.)\n if (!isSimpleReference(receiver)) return undefined;\n\n const m = matchLengthMinus(deleteCount, receiverText);\n\n return m === undefined ? undefined : normalizeCountedOp('takeLast', m);\n }\n\n if (args.length === 3) {\n const [start, deleteCount, item] = args;\n\n if (\n start === undefined ||\n deleteCount === undefined ||\n item === undefined ||\n item.type === AST_NODE_TYPES.SpreadElement ||\n asNonNegativeIntegerLiteral(deleteCount) !== 0\n ) {\n return undefined;\n }\n\n // `xs.toSpliced(0, 0, item)` prepends → toUnshifted.\n if (asNonNegativeIntegerLiteral(start) === 0) {\n return { fn: 'toUnshifted', itemText: toArgText(item) };\n }\n\n // `xs.toSpliced(xs.length, 0, item)` appends → toPushed.\n if (\n isSimpleReference(receiver) &&\n isReceiverLengthAccess(start, receiverText)\n ) {\n return { fn: 'toPushed', itemText: toArgText(item) };\n }\n\n return undefined;\n }\n\n return undefined;\n };\n\n return {\n CallExpression: (node) => {\n const callee = node.callee;\n\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return;\n }\n\n const methodName = callee.property.name;\n\n const receiver = callee.object;\n\n // `Arr.skip(xs, 1)` → `Arr.tail(xs)`, `Arr.skipLast(xs, 1)` →\n // `Arr.butLast(xs)` (also via a namespace import or an alias).\n if (methodName === 'skip' || methodName === 'skipLast') {\n const isArrObject =\n (receiver.type === AST_NODE_TYPES.Identifier &&\n receiver.name === arrLocalName) ||\n (receiver.type === AST_NODE_TYPES.MemberExpression &&\n !receiver.computed &&\n receiver.object.type === AST_NODE_TYPES.Identifier &&\n receiver.object.name === namespaceLocalName &&\n receiver.property.type === AST_NODE_TYPES.Identifier &&\n receiver.property.name === 'Arr');\n\n const [arrayArg, countArg] = node.arguments;\n\n if (\n isArrObject &&\n arrayArg !== undefined &&\n countArg !== undefined &&\n node.arguments.length === 2 &&\n arrayArg.type !== AST_NODE_TYPES.SpreadElement &&\n asNonNegativeIntegerLiteral(countArg) === 1\n ) {\n report(\n node,\n { fn: methodName === 'skip' ? 'tail' : 'butLast' },\n toArgText(arrayArg),\n );\n }\n\n return;\n }\n\n // `[item].concat(xs)` → `Arr.toUnshifted(xs, item)`.\n if (\n methodName === 'concat' &&\n receiver.type === AST_NODE_TYPES.ArrayExpression\n ) {\n const [element] = receiver.elements;\n\n const [arg] = node.arguments;\n\n if (\n element !== null &&\n element !== undefined &&\n arg !== undefined &&\n receiver.elements.length === 1 &&\n element.type !== AST_NODE_TYPES.SpreadElement &&\n node.arguments.length === 1 &&\n arg.type !== AST_NODE_TYPES.SpreadElement &&\n isArrayOrTupleType(getTypeOf(arg))\n ) {\n report(\n node,\n { fn: 'toUnshifted', itemText: toArgText(element) },\n toArgText(arg),\n );\n }\n\n return;\n }\n\n if (\n methodName !== 'slice' &&\n methodName !== 'toSpliced' &&\n methodName !== 'filter' &&\n methodName !== 'concat'\n ) {\n return;\n }\n\n // The receiver must be an array or tuple (not a string / typed array\n // / other object that happens to share the method name).\n if (!isArrayOrTupleType(getTypeOf(receiver))) return;\n\n const receiverText = sourceCode.getText(receiver);\n\n switch (methodName) {\n case 'slice': {\n const op = classifySliceArgs(node.arguments, receiver);\n\n if (op !== undefined) report(node, op, toArgText(receiver));\n\n return;\n }\n\n case 'toSpliced': {\n const op = classifyToSplicedArgs(\n node.arguments,\n receiver,\n receiverText,\n );\n\n if (op !== undefined) report(node, op, toArgText(receiver));\n\n return;\n }\n\n case 'filter': {\n const [callback] = node.arguments;\n\n if (callback === undefined || node.arguments.length !== 1) {\n return;\n }\n\n const op = classifyFilterCallback(callback, receiver, receiverText);\n\n if (op !== undefined) report(node, op, toArgText(receiver));\n\n return;\n }\n\n case 'concat': {\n const [arg] = node.arguments;\n\n if (\n arg === undefined ||\n node.arguments.length !== 1 ||\n arg.type === AST_NODE_TYPES.SpreadElement\n ) {\n return;\n }\n\n // `xs.concat([item])` → `Arr.toPushed(xs, item)`.\n if (arg.type === AST_NODE_TYPES.ArrayExpression) {\n const [element] = arg.elements;\n\n if (\n element !== null &&\n element !== undefined &&\n arg.elements.length === 1 &&\n element.type !== AST_NODE_TYPES.SpreadElement\n ) {\n report(\n node,\n { fn: 'toPushed', itemText: toArgText(element) },\n toArgText(receiver),\n );\n }\n\n return;\n }\n\n // `xs.concat(item)` appends only when `item` can never be an\n // array (otherwise `concat` would flatten it).\n if (isDefinitelyNotArrayType(getTypeOf(arg))) {\n report(\n node,\n { fn: 'toPushed', itemText: toArgText(arg) },\n toArgText(receiver),\n );\n }\n }\n }\n },\n\n ArrayExpression: (node) => {\n // `[item, ...xs]` → `Arr.toUnshifted(xs, item)`,\n // `[...xs, item]` → `Arr.toPushed(xs, item)`.\n if (node.elements.length !== 2) return;\n\n const [first, second] = node.elements;\n\n if (\n first === null ||\n first === undefined ||\n second === null ||\n second === undefined\n ) {\n return;\n }\n\n const [spread, item, fn] =\n first.type === AST_NODE_TYPES.SpreadElement &&\n second.type !== AST_NODE_TYPES.SpreadElement\n ? ([first, second, 'toPushed'] as const)\n : first.type !== AST_NODE_TYPES.SpreadElement &&\n second.type === AST_NODE_TYPES.SpreadElement\n ? ([second, first, 'toUnshifted'] as const)\n : [undefined, undefined, undefined];\n\n // `spread`, `item`, and `fn` are set together (all from the same\n // tuple), so checking `spread` also guarantees the others are\n // defined.\n if (spread === undefined) return;\n\n // Spreading a non-array iterable (`[v, ...someSet]`) is a genuine\n // conversion, not an element addition to an array.\n if (!isArrayOrTupleType(getTypeOf(spread.argument))) return;\n\n report(\n node,\n { fn, itemText: toArgText(item) },\n toArgText(spread.argument),\n );\n },\n\n 'Program:exit': () => {\n for (const [index, nodeInfo] of mut_nodesToFix.entries()) {\n context.report({\n node: nodeInfo.node,\n messageId: 'preferCanonicalArraySlicing',\n data: { replacement: nodeInfo.replacement },\n fix: (fixer) => {\n const importFixes =\n index === 0 && needsArrImport\n ? buildImportFixes(fixer, program, tsDataForgeImport, ['Arr'])\n : [];\n\n return [\n ...importFixes,\n fixer.replaceText(nodeInfo.node, nodeInfo.replacement),\n ];\n },\n });\n }\n },\n };\n },\n defaultOptions: [],\n} as const;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prefer-canonical-array-slicing.mjs","sourceRoot":"","sources":["../../src/rules/prefer-canonical-array-slicing.mts"],"names":[],"mappings":"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"}
|
|
@@ -1,155 +1,228 @@
|
|
|
1
|
-
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
1
|
+
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
2
2
|
import { getImportedLocalName, getTsDataForgeImport } from './import-utils.mjs';
|
|
3
3
|
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
4
34
|
const CAST_REWRITES = [
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
35
|
+
{
|
|
36
|
+
cast: 'asMinLengthArray',
|
|
37
|
+
bounds: [1],
|
|
38
|
+
replacement: 'asNonEmptyArray',
|
|
39
|
+
keep: [],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
cast: 'asFixedLengthArray',
|
|
43
|
+
bounds: [0],
|
|
44
|
+
replacement: 'asEmptyArray',
|
|
45
|
+
keep: [],
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
{
|
|
50
|
+
cast: 'asBoundedLengthArray',
|
|
51
|
+
bounds: [0, 0],
|
|
52
|
+
replacement: 'asEmptyArray',
|
|
53
|
+
keep: [],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
cast: 'asBoundedLengthArray',
|
|
57
|
+
bounds: ['anyLength', 'sameAsFirst'],
|
|
58
|
+
replacement: 'asFixedLengthArray',
|
|
59
|
+
keep: [0],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
cast: 'asMaxLengthArray',
|
|
63
|
+
bounds: [0],
|
|
64
|
+
replacement: 'asEmptyArray',
|
|
65
|
+
keep: [],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
cast: 'asMinLengthTuple',
|
|
69
|
+
bounds: [1],
|
|
70
|
+
replacement: 'asNonEmptyTuple',
|
|
71
|
+
keep: [],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
cast: 'asFixedLengthTuple',
|
|
75
|
+
bounds: [0],
|
|
76
|
+
replacement: 'asEmptyTuple',
|
|
77
|
+
keep: [],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
cast: 'asBoundedLengthTuple',
|
|
81
|
+
bounds: [0, 0],
|
|
82
|
+
replacement: 'asEmptyTuple',
|
|
83
|
+
keep: [],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
cast: 'asBoundedLengthTuple',
|
|
87
|
+
bounds: ['anyLength', 'sameAsFirst'],
|
|
88
|
+
replacement: 'asFixedLengthTuple',
|
|
89
|
+
keep: [0],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
cast: 'asMaxLengthTuple',
|
|
93
|
+
bounds: [0],
|
|
94
|
+
replacement: 'asEmptyTuple',
|
|
95
|
+
keep: [],
|
|
96
|
+
},
|
|
67
97
|
];
|
|
68
|
-
const preferCanonicalLengthCast = {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
98
|
+
export const preferCanonicalLengthCast = {
|
|
99
|
+
meta: {
|
|
100
|
+
type: 'suggestion',
|
|
101
|
+
docs: {
|
|
102
|
+
description: 'Normalize an `Arr` length cast whose bounds are degenerate (e.g. `Arr.asMinLengthArray(1, xs)`, `Arr.asFixedLengthTuple(0, xs)`) to the cast that names that constraint directly, staying within the branded `*Array` or structural `*Tuple` family.',
|
|
103
|
+
},
|
|
104
|
+
fixable: 'code',
|
|
105
|
+
schema: [],
|
|
106
|
+
messages: {
|
|
107
|
+
useCanonicalCast: 'Use `{{arrName}}.{{replacement}}(...)` instead of `{{arrName}}.{{cast}}({{boundsText}})`: with these bounds the result type is the same (or stricter), and `{{replacement}}` names the constraint directly.',
|
|
108
|
+
},
|
|
73
109
|
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
),
|
|
110
|
-
...dropBoundsFix(fixer, node, rewrite)
|
|
111
|
-
]
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
},
|
|
116
|
-
defaultOptions: []
|
|
110
|
+
create: (context) => {
|
|
111
|
+
const sourceCode = context.sourceCode;
|
|
112
|
+
const arrLocalName = getImportedLocalName(getTsDataForgeImport(sourceCode.ast), 'Arr');
|
|
113
|
+
if (arrLocalName === undefined)
|
|
114
|
+
return {};
|
|
115
|
+
return {
|
|
116
|
+
CallExpression: (node) => {
|
|
117
|
+
const castName = getCastName(node, arrLocalName);
|
|
118
|
+
if (castName === undefined)
|
|
119
|
+
return;
|
|
120
|
+
const rewrite = CAST_REWRITES.find((candidate) => candidate.cast === castName && matchesBounds(node, candidate));
|
|
121
|
+
if (rewrite === undefined)
|
|
122
|
+
return;
|
|
123
|
+
const boundsText = node.arguments
|
|
124
|
+
.slice(0, rewrite.bounds.length)
|
|
125
|
+
.map((arg) => sourceCode.getText(arg))
|
|
126
|
+
.join(', ');
|
|
127
|
+
context.report({
|
|
128
|
+
node,
|
|
129
|
+
messageId: 'useCanonicalCast',
|
|
130
|
+
data: {
|
|
131
|
+
arrName: arrLocalName,
|
|
132
|
+
cast: castName,
|
|
133
|
+
boundsText: [boundsText, '…'].join(', '),
|
|
134
|
+
replacement: rewrite.replacement,
|
|
135
|
+
},
|
|
136
|
+
fix: (fixer) => [
|
|
137
|
+
fixer.replaceText(node.callee, `${arrLocalName}.${rewrite.replacement}`),
|
|
138
|
+
...dropBoundsFix(fixer, node, rewrite),
|
|
139
|
+
],
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
defaultOptions: [],
|
|
117
145
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
146
|
+
|
|
147
|
+
const getCastName = (
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
node, arrLocalName) => {
|
|
151
|
+
const { callee } = node;
|
|
152
|
+
return callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
153
|
+
!callee.computed &&
|
|
154
|
+
callee.object.type === AST_NODE_TYPES.Identifier &&
|
|
155
|
+
callee.object.name === arrLocalName &&
|
|
156
|
+
callee.property.type === AST_NODE_TYPES.Identifier
|
|
157
|
+
? callee.property.name
|
|
158
|
+
: undefined;
|
|
121
159
|
};
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return value === first;
|
|
141
|
-
default:
|
|
142
|
-
return value === matcher;
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
const matchesBounds = (
|
|
169
|
+
|
|
170
|
+
node, rewrite) => {
|
|
171
|
+
const args = node.arguments;
|
|
172
|
+
const boundCount = rewrite.bounds.length;
|
|
173
|
+
if (args.length !== boundCount + 1 || node.typeArguments !== undefined) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (args.some((arg) => arg.type === AST_NODE_TYPES.SpreadElement)) {
|
|
177
|
+
return false;
|
|
143
178
|
}
|
|
144
|
-
|
|
179
|
+
const bounds = args.slice(0, boundCount).map(getLengthLiteral);
|
|
180
|
+
const [first] = bounds;
|
|
181
|
+
return rewrite.bounds.every((matcher, index) => {
|
|
182
|
+
const value = bounds[index];
|
|
183
|
+
if (value === undefined)
|
|
184
|
+
return false;
|
|
185
|
+
switch (matcher) {
|
|
186
|
+
case 'anyLength':
|
|
187
|
+
return true;
|
|
188
|
+
case 'sameAsFirst':
|
|
189
|
+
return value === first;
|
|
190
|
+
default:
|
|
191
|
+
return value === matcher;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
145
194
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
const dropBoundsFix = (fixer,
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
node, rewrite) => rewrite.bounds.flatMap((_, index) => {
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
const dropped = node.arguments[index];
|
|
212
|
+
const next = node.arguments[index + 1];
|
|
213
|
+
if (rewrite.keep.includes(index))
|
|
214
|
+
return [];
|
|
215
|
+
return dropped === undefined || next === undefined
|
|
216
|
+
? []
|
|
217
|
+
: [fixer.removeRange([dropped.range[0], next.range[0]])];
|
|
151
218
|
});
|
|
152
|
-
const getLengthLiteral = (node) => node.type === AST_NODE_TYPES.Literal && typeof node.value === "number" && Number.isSafeInteger(node.value) && node.value >= 0 ? node.value : void 0;
|
|
153
219
|
|
|
154
|
-
|
|
155
|
-
|
|
220
|
+
const getLengthLiteral = (
|
|
221
|
+
|
|
222
|
+
node) => node.type === AST_NODE_TYPES.Literal &&
|
|
223
|
+
typeof node.value === 'number' &&
|
|
224
|
+
Number.isSafeInteger(node.value) &&
|
|
225
|
+
node.value >= 0
|
|
226
|
+
? node.value
|
|
227
|
+
: undefined;
|
|
228
|
+
//# sourceMappingURL=prefer-canonical-length-cast.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-canonical-length-cast.mjs","sources":["../../src/rules/prefer-canonical-length-cast.mts"],"sourcesContent":["import {\n AST_NODE_TYPES,\n type TSESLint,\n type TSESTree,\n} from '@typescript-eslint/utils';\nimport { getImportedLocalName, getTsDataForgeImport } from './import-utils.mjs';\n\ntype Options = readonly [];\n\ntype MessageIds = 'useCanonicalCast';\n\n/** How one leading length argument of a cast call must look. */\ntype BoundMatcher = number | 'anyLength' | 'sameAsFirst';\n\ntype CastRewrite = Readonly<{\n /** The `Arr` cast the call resolves to. */\n cast: string;\n /** One matcher per leading length argument the call must have. */\n bounds: readonly BoundMatcher[];\n /** The cast the call is rewritten to. */\n replacement: string;\n /** Indices into `bounds` of the length arguments the rewrite keeps, in order. */\n keep: readonly number[];\n}>;\n\n/**\n * `Arr.as*` casts whose length arguments make them a longhand spelling of\n * another cast.\n *\n * Unlike a `Type<T>` wrapper, a cast only ever *returns* the narrowed value, so\n * a rewrite that strengthens the result type stays safe — the result is\n * assignable everywhere the old one was:\n *\n * | call | canonical form | relation |\n * | :----------------------------------- | :------------------------------ | :------- |\n * | `Arr.asMinLengthArray(1, xs)` | `Arr.asNonEmptyArray(xs)` | type-identical — `NonEmptyArray<A>` is defined as `MinLengthArray<1, A>` |\n * | `Arr.asFixedLengthArray(0, xs)` | `Arr.asEmptyArray(xs)` | type-identical — `asEmptyArray` is the length-0 specialization |\n * | `Arr.asBoundedLengthArray(n, n, xs)` | `Arr.asFixedLengthArray(n, xs)` | strengthens — `FixedLengthArray<N, E>` is `BoundedLengthArray<N, N, E>` intersected with the exact tuple for `N <= 10` |\n * | `Arr.asMaxLengthArray(0, xs)` | `Arr.asEmptyArray(xs)` | strengthens — an array of at most `0` elements is an array of exactly `0` |\n * | `Arr.asMinLengthTuple(1, xs)` | `Arr.asNonEmptyTuple(xs)` | type-identical — both are `MinLengthTuple<1, E>` |\n * | `Arr.asFixedLengthTuple(0, xs)` | `Arr.asEmptyTuple(xs)` | type-identical — both are `readonly []` |\n * | `Arr.asBoundedLengthTuple(n, n, xs)` | `Arr.asFixedLengthTuple(n, xs)` | type-identical — `BoundedLengthTuple<N, N, E>` *is* `FixedLengthTuple<N, E>` |\n * | `Arr.asMaxLengthTuple(0, xs)` | `Arr.asEmptyTuple(xs)` | type-identical — `MaxLengthTuple<0, E>` is `readonly []` |\n *\n * Each family is rewritten within its own lane — the branded `*Array` casts to\n * `asEmptyArray` / `asNonEmptyArray`, the structural `*Tuple` casts to\n * `asEmptyTuple` / `asNonEmptyTuple` — so a rewrite never moves a value across\n * the branded/structural divide, matching `prefer-canonical-length-guard`.\n *\n * `Arr.asBoundedLengthArray(0, n, xs)` → `Arr.asMaxLengthArray(n, xs)` is\n * deliberately absent: it would *drop* the `MinLengthArray<0, E>` brand, which\n * is a widening rather than a rename.\n *\n * Only the runtime `TypeError` message changes, to the one that names the\n * constraint actually being checked.\n */\nconst CAST_REWRITES = [\n {\n cast: 'asMinLengthArray',\n bounds: [1],\n replacement: 'asNonEmptyArray',\n keep: [],\n },\n {\n cast: 'asFixedLengthArray',\n bounds: [0],\n replacement: 'asEmptyArray',\n keep: [],\n },\n // Listed before the `anyLength, sameAsFirst` entry so that\n // `asBoundedLengthArray(0, 0, xs)` lands on `asEmptyArray` in one step.\n {\n cast: 'asBoundedLengthArray',\n bounds: [0, 0],\n replacement: 'asEmptyArray',\n keep: [],\n },\n {\n cast: 'asBoundedLengthArray',\n bounds: ['anyLength', 'sameAsFirst'],\n replacement: 'asFixedLengthArray',\n keep: [0],\n },\n {\n cast: 'asMaxLengthArray',\n bounds: [0],\n replacement: 'asEmptyArray',\n keep: [],\n },\n {\n cast: 'asMinLengthTuple',\n bounds: [1],\n replacement: 'asNonEmptyTuple',\n keep: [],\n },\n {\n cast: 'asFixedLengthTuple',\n bounds: [0],\n replacement: 'asEmptyTuple',\n keep: [],\n },\n {\n cast: 'asBoundedLengthTuple',\n bounds: [0, 0],\n replacement: 'asEmptyTuple',\n keep: [],\n },\n {\n cast: 'asBoundedLengthTuple',\n bounds: ['anyLength', 'sameAsFirst'],\n replacement: 'asFixedLengthTuple',\n keep: [0],\n },\n {\n cast: 'asMaxLengthTuple',\n bounds: [0],\n replacement: 'asEmptyTuple',\n keep: [],\n },\n] as const satisfies readonly CastRewrite[];\n\nexport const preferCanonicalLengthCast: TSESLint.RuleModule<\n MessageIds,\n Options\n> = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Normalize an `Arr` length cast whose bounds are degenerate (e.g. `Arr.asMinLengthArray(1, xs)`, `Arr.asFixedLengthTuple(0, xs)`) to the cast that names that constraint directly, staying within the branded `*Array` or structural `*Tuple` family.',\n },\n fixable: 'code',\n schema: [],\n messages: {\n useCanonicalCast:\n 'Use `{{arrName}}.{{replacement}}(...)` instead of `{{arrName}}.{{cast}}({{boundsText}})`: with these bounds the result type is the same (or stricter), and `{{replacement}}` names the constraint directly.',\n },\n },\n\n create: (context) => {\n const sourceCode = context.sourceCode;\n\n const arrLocalName = getImportedLocalName(\n getTsDataForgeImport(sourceCode.ast),\n 'Arr',\n );\n\n if (arrLocalName === undefined) return {};\n\n return {\n CallExpression: (node) => {\n const castName = getCastName(node, arrLocalName);\n\n if (castName === undefined) return;\n\n const rewrite = CAST_REWRITES.find(\n (candidate) =>\n candidate.cast === castName && matchesBounds(node, candidate),\n );\n\n if (rewrite === undefined) return;\n\n const boundsText = node.arguments\n .slice(0, rewrite.bounds.length)\n .map((arg) => sourceCode.getText(arg))\n .join(', ');\n\n context.report({\n node,\n messageId: 'useCanonicalCast',\n data: {\n arrName: arrLocalName,\n cast: castName,\n boundsText: [boundsText, '…'].join(', '),\n replacement: rewrite.replacement,\n },\n fix: (fixer) => [\n fixer.replaceText(\n node.callee,\n `${arrLocalName}.${rewrite.replacement}`,\n ),\n ...dropBoundsFix(fixer, node, rewrite),\n ],\n });\n },\n };\n },\n defaultOptions: [],\n} as const;\n\n/** The `Arr.<cast>` method name of `node`, or `undefined` for other calls. */\nconst getCastName = (\n // AST nodes hold mutable child arrays, so they are not deeply readonly.\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: TSESTree.CallExpression,\n arrLocalName: string,\n): string | undefined => {\n const { callee } = node;\n\n return callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === arrLocalName &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : undefined;\n};\n\n/**\n * Whether the call is `cast(...bounds, array)` with every bound written as the\n * exact numeric literal the rewrite requires.\n *\n * The arity check also excludes the curried form (`cast(...bounds)`):\n * `Arr.asNonEmptyArray` has no curried counterpart, and a curried\n * `asFixedLengthArray` would need the bound kept in a different position.\n */\nconst matchesBounds = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: TSESTree.CallExpression,\n rewrite: CastRewrite,\n): boolean => {\n const args = node.arguments;\n\n const boundCount = rewrite.bounds.length;\n\n if (args.length !== boundCount + 1 || node.typeArguments !== undefined) {\n return false;\n }\n\n if (args.some((arg) => arg.type === AST_NODE_TYPES.SpreadElement)) {\n return false;\n }\n\n const bounds = args.slice(0, boundCount).map(getLengthLiteral);\n\n const [first] = bounds;\n\n return rewrite.bounds.every((matcher, index) => {\n const value = bounds[index];\n\n if (value === undefined) return false;\n\n switch (matcher) {\n case 'anyLength':\n return true;\n\n case 'sameAsFirst':\n return value === first;\n\n default:\n return value === matcher;\n }\n });\n};\n\n/**\n * Removes the length arguments the rewrite drops. Each removal runs from the\n * dropped argument up to the start of the next one, so the comma, whitespace\n * and any comments in between go with it; the ranges never overlap.\n */\nconst dropBoundsFix = (\n fixer: TSESLint.RuleFixer,\n // AST nodes hold mutable child arrays, so they are not deeply readonly.\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: TSESTree.CallExpression,\n rewrite: CastRewrite,\n): readonly TSESLint.RuleFix[] =>\n rewrite.bounds.flatMap((_, index) => {\n // Read before the `includes` below, not after. The strict standard\n // library types `includes` as `searchElement is T` — that is what lets a\n // literal union narrow a wider value — but the predicate applies to the\n // false branch too, and here `keep` is `readonly number[]` against a\n // `number`, so `index` narrows to `never` past the guard and `index + 1`\n // stops type-checking. A false `includes` means \"not in this array\", not\n // \"not of this type\".\n const dropped = node.arguments[index];\n\n const next = node.arguments[index + 1];\n\n if (rewrite.keep.includes(index)) return [];\n\n return dropped === undefined || next === undefined\n ? []\n : [fixer.removeRange([dropped.range[0], next.range[0]])];\n });\n\n/** A non-negative integer literal's value, or `undefined` for anything else. */\nconst getLengthLiteral = (\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n node: TSESTree.Node,\n): number | undefined =>\n node.type === AST_NODE_TYPES.Literal &&\n typeof node.value === 'number' &&\n Number.isSafeInteger(node.value) &&\n node.value >= 0\n ? node.value\n : undefined;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prefer-canonical-length-cast.mjs","sourceRoot":"","sources":["../../src/rules/prefer-canonical-length-cast.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAoBhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,aAAa,GAAG;IACpB;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,EAAE;KACT;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,EAAE;KACT;IACD,2DAA2D;IAC3D,wEAAwE;IACxE;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACd,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,EAAE;KACT;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;QACpC,WAAW,EAAE,oBAAoB;QACjC,IAAI,EAAE,CAAC,CAAC,CAAC;KACV;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,EAAE;KACT;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,EAAE;KACT;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,EAAE;KACT;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACd,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,EAAE;KACT;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;QACpC,WAAW,EAAE,oBAAoB;QACjC,IAAI,EAAE,CAAC,CAAC,CAAC;KACV;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,EAAE;KACT;CACwC,CAAC;AAE5C,MAAM,CAAC,MAAM,yBAAyB,GAGlC;IACF,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,sPAAsP;SACzP;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,gBAAgB,EACd,6MAA6M;SAChN;KACF;IAED,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEtC,MAAM,YAAY,GAAG,oBAAoB,CACvC,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,EACpC,KAAK,CACN,CAAC;QAEF,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1C,OAAO;YACL,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAEjD,IAAI,QAAQ,KAAK,SAAS;oBAAE,OAAO;gBAEnC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAChC,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAChE,CAAC;gBAEF,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO;gBAElC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS;qBAC9B,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;qBAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;qBACrC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,kBAAkB;oBAC7B,IAAI,EAAE;wBACJ,OAAO,EAAE,YAAY;wBACrB,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;wBACxC,WAAW,EAAE,OAAO,CAAC,WAAW;qBACjC;oBACD,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;wBACd,KAAK,CAAC,WAAW,CACf,IAAI,CAAC,MAAM,EACX,GAAG,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CACzC;wBACD,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;qBACvC;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;IACD,cAAc,EAAE,EAAE;CACV,CAAC;AAEX,8EAA8E;AAC9E,MAAM,WAAW,GAAG;AAClB,wEAAwE;AACxE,8EAA8E;AAC9E,IAA6B,EAC7B,YAAoB,EACA,EAAE;IACtB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,OAAO,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;QACpD,CAAC,MAAM,CAAC,QAAQ;QAChB,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAChD,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAClD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;QACtB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,aAAa,GAAG;AACpB,8EAA8E;AAC9E,IAA6B,EAC7B,OAAoB,EACX,EAAE;IACX,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IAE5B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IAEzC,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE/D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IAEvB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAEtC,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC;YAEd,KAAK,aAAa;gBAChB,OAAO,KAAK,KAAK,KAAK,CAAC;YAEzB;gBACE,OAAO,KAAK,KAAK,OAAO,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,aAAa,GAAG,CACpB,KAAyB;AACzB,wEAAwE;AACxE,8EAA8E;AAC9E,IAA6B,EAC7B,OAAoB,EACS,EAAE,CAC/B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;IAClC,mEAAmE;IACnE,yEAAyE;IACzE,wEAAwE;IACxE,qEAAqE;IACrE,yEAAyE;IACzE,yEAAyE;IACzE,sBAAsB;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,OAAO,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAChD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEL,gFAAgF;AAChF,MAAM,gBAAgB,GAAG;AACvB,8EAA8E;AAC9E,IAAmB,EACC,EAAE,CACtB,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;IACpC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;IAC9B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,CAAC;IACb,CAAC,CAAC,IAAI,CAAC,KAAK;IACZ,CAAC,CAAC,SAAS,CAAC"}
|