eslint-plugin-functype 1.2.0 → 2.0.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 +86 -44
- package/dist/chunk-BlXvk904.js +1 -0
- package/dist/cli/list-rules.d.ts +1 -1
- package/dist/cli/list-rules.js +15 -239
- package/dist/cli/list-rules.js.map +1 -1
- package/dist/index.d.ts +19 -16
- package/dist/index.js +1 -1075
- package/dist/index.js.map +1 -1
- package/dist/rules/index.d.ts +24 -29
- package/dist/rules/index.js +1 -1071
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/no-get-unsafe.d.ts +7 -0
- package/dist/rules/no-get-unsafe.js +2 -0
- package/dist/rules/no-get-unsafe.js.map +1 -0
- package/dist/rules/no-imperative-loops.d.ts +7 -0
- package/dist/rules/no-imperative-loops.js +2 -0
- package/dist/rules/no-imperative-loops.js.map +1 -0
- package/dist/rules/prefer-do-notation.d.ts +7 -0
- package/dist/rules/prefer-do-notation.js +5 -0
- package/dist/rules/prefer-do-notation.js.map +1 -0
- package/dist/rules/prefer-either.d.ts +7 -0
- package/dist/rules/prefer-either.js +2 -0
- package/dist/rules/prefer-either.js.map +1 -0
- package/dist/rules/prefer-flatmap.d.ts +7 -0
- package/dist/rules/prefer-flatmap.js +2 -0
- package/dist/rules/prefer-flatmap.js.map +1 -0
- package/dist/rules/prefer-fold.d.ts +7 -0
- package/dist/rules/prefer-fold.js +2 -0
- package/dist/rules/prefer-fold.js.map +1 -0
- package/dist/rules/prefer-list.d.ts +7 -0
- package/dist/rules/prefer-list.js +2 -0
- package/dist/rules/prefer-list.js.map +1 -0
- package/dist/rules/prefer-map.d.ts +7 -0
- package/dist/rules/prefer-map.js +2 -0
- package/dist/rules/prefer-map.js.map +1 -0
- package/dist/rules/prefer-option.d.ts +7 -0
- package/dist/rules/prefer-option.js +2 -0
- package/dist/rules/prefer-option.js.map +1 -0
- package/dist/types/ast.d.ts +12 -0
- package/dist/types/ast.js +1 -0
- package/dist/utils/dependency-validator.d.ts +13 -11
- package/dist/utils/dependency-validator.js +3 -108
- package/dist/utils/dependency-validator.js.map +1 -1
- package/dist/utils/functype-detection.d.ts +69 -0
- package/dist/utils/functype-detection.js +2 -0
- package/dist/utils/functype-detection.js.map +1 -0
- package/package.json +37 -34
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/functype-detection.ts","../src/rules/prefer-option.ts","../src/rules/prefer-either.ts","../src/rules/prefer-list.ts","../src/rules/no-get-unsafe.ts","../src/rules/prefer-fold.ts","../src/rules/prefer-map.ts","../src/rules/prefer-flatmap.ts","../src/rules/no-imperative-loops.ts","../src/rules/index.ts","../src/index.ts"],"names":["preferOption","preferEither","preferList","noGetUnsafe","preferFold","preferMap","preferFlatmap","noImperativeLoops"],"mappings":"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","file":"index.js","sourcesContent":["import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\n/**\n * Utility functions for detecting functype library usage in ESLint rules\n */\n\n/**\n * Check if functype library is imported in the current file\n */\nexport function hasFunctypeImport(context: Rule.RuleContext): boolean {\n const sourceCode = context.sourceCode\n const program = sourceCode.ast\n \n // Look for import statements that import from 'functype'\n for (const node of program.body) {\n if (node.type === \"ImportDeclaration\" && \n node.source.type === \"Literal\" && \n node.source.value === \"functype\") {\n return true\n }\n }\n \n return false\n}\n\n/**\n * Get imported functype symbols from the current file\n */\nexport function getFunctypeImports(context: Rule.RuleContext): Set<string> {\n const imports = new Set<string>()\n const sourceCode = context.sourceCode\n const program = sourceCode.ast\n \n for (const node of program.body) {\n if (node.type === \"ImportDeclaration\" && \n node.source.type === \"Literal\" && \n node.source.value === \"functype\") {\n \n // Handle named imports: import { Option, Either } from 'functype'\n if (node.specifiers) {\n for (const spec of node.specifiers) {\n if (spec.type === \"ImportSpecifier\" && spec.imported.type === \"Identifier\") {\n imports.add(spec.imported.name)\n } else if (spec.type === \"ImportDefaultSpecifier\") {\n imports.add(\"default\")\n } else if (spec.type === \"ImportNamespaceSpecifier\") {\n imports.add(\"*\")\n }\n }\n }\n }\n }\n \n return imports\n}\n\n/**\n * Check if a type reference is using functype types\n */\nexport function isFunctypeType(node: ASTNode, functypeImports: Set<string>): boolean {\n if (!node) return false\n \n // Check direct type names\n if (node.type === \"TSTypeReference\" && node.typeName?.type === \"Identifier\") {\n const typeName = node.typeName.name\n return functypeImports.has(typeName) || \n [\"Option\", \"Either\", \"List\", \"LazyList\", \"Task\"].includes(typeName)\n }\n \n return false\n}\n\n/**\n * Check if a call expression is using functype methods\n */\nexport function isFunctypeCall(node: ASTNode, functypeImports: Set<string>): boolean {\n if (!node || node.type !== \"CallExpression\") return false\n \n const callee = node.callee\n \n // Check for static method calls like Option.some(), Either.left(), List.of()\n if (callee.type === \"MemberExpression\" && \n callee.object.type === \"Identifier\") {\n const objectName = callee.object.name\n const methodName = callee.property?.name\n \n // Check if calling methods on imported functype types\n if (functypeImports.has(objectName)) return true\n \n // Check for common functype patterns\n if ((objectName === \"Option\" && [\"some\", \"none\", \"of\"].includes(methodName)) ||\n (objectName === \"Either\" && [\"left\", \"right\", \"of\"].includes(methodName)) ||\n (objectName === \"List\" && [\"of\", \"from\", \"empty\"].includes(methodName))) {\n return true\n }\n }\n \n // Check for method calls on functype instances like someOption.map()\n if (callee.type === \"MemberExpression\") {\n const methodName = callee.property?.name\n \n // Common functype methods\n if ([\"map\", \"flatMap\", \"filter\", \"fold\", \"foldLeft\", \"foldRight\", \n \"getOrElse\", \"orElse\", \"isEmpty\", \"nonEmpty\", \"isDefined\",\n \"isSome\", \"isNone\", \"isLeft\", \"isRight\", \"toArray\"].includes(methodName)) {\n return true\n }\n }\n \n return false\n}\n\n/**\n * Check if current context is already using functype patterns appropriately\n */\nexport function isAlreadyUsingFunctype(node: ASTNode, functypeImports: Set<string>): boolean {\n let parent = node.parent\n \n // Walk up the AST to find functype usage\n while (parent) {\n if (isFunctypeCall(parent as ASTNode, functypeImports) || \n isFunctypeType(parent as ASTNode, functypeImports)) {\n return true\n }\n parent = parent.parent\n }\n \n return false\n}\n\n/**\n * Check if a variable or parameter is typed with functype types\n */\nexport function hasFunctypeTypeAnnotation(node: ASTNode, functypeImports: Set<string>): boolean {\n // Check for type annotation\n if (node.typeAnnotation?.typeAnnotation) {\n return isFunctypeType(node.typeAnnotation.typeAnnotation, functypeImports)\n }\n \n return false\n}","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\nimport { getFunctypeImports, isFunctypeType, isAlreadyUsingFunctype } from \"../utils/functype-detection\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer Option<T> over nullable types (T | null | undefined)\",\n category: \"Stylistic Issues\",\n recommended: true,\n },\n fixable: \"code\",\n schema: [\n {\n type: \"object\",\n properties: {\n allowNullableIntersections: {\n type: \"boolean\",\n default: false,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n preferOption: \"Prefer Option<{{type}}> over nullable type '{{nullable}}'\",\n preferOptionReturn: \"Prefer Option<{{type}}> as return type over nullable '{{nullable}}'\",\n },\n },\n\n create(context) {\n // const options = context.options[0] || {}\n // Remove unused variable\n // const _allowNullableIntersections = options.allowNullableIntersections || false\n\n // Get functype imports if available (but still apply rule even without explicit import)\n const functypeImports = getFunctypeImports(context)\n\n return {\n TSUnionType(node: ASTNode) {\n if (!node.types || node.types.length < 2) return\n\n const hasNull = node.types.some((type: ASTNode) => \n type.type === \"TSNullKeyword\" || type.type === \"TSUndefinedKeyword\"\n )\n \n if (!hasNull) return\n\n const nonNullTypes = node.types.filter((type: ASTNode) => \n type.type !== \"TSNullKeyword\" && type.type !== \"TSUndefinedKeyword\"\n )\n\n if (nonNullTypes.length === 1) {\n const nonNullType = nonNullTypes[0]\n \n // Skip if it's already an Option type or other functype type\n if (isFunctypeType(nonNullType, functypeImports)) return\n \n // Skip if we're already in a functype context\n if (isAlreadyUsingFunctype(node, functypeImports)) return\n \n const sourceCode = context.sourceCode\n const nonNullTypeText = sourceCode.getText(nonNullType)\n const fullType = sourceCode.getText(node)\n \n // Skip if it's already an Option type (fallback check)\n if (nonNullTypeText.startsWith(\"Option<\")) return\n \n context.report({\n node,\n messageId: \"preferOption\",\n data: {\n type: nonNullTypeText,\n nullable: fullType,\n },\n fix(fixer) {\n return fixer.replaceText(node, `Option<${nonNullTypeText}>`)\n },\n })\n }\n },\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer Either<E, T> over try/catch blocks and throw statements\",\n category: \"Best Practices\",\n recommended: true,\n },\n schema: [\n {\n type: \"object\",\n properties: {\n allowThrowInTests: {\n type: \"boolean\",\n default: true,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n preferEitherOverTryCatch: \"Prefer Either<Error, T> over try/catch block\",\n preferEitherOverThrow: \"Prefer Either.left(error) over throw statement\",\n preferEitherReturn: \"Consider returning Either<Error, {{type}}> instead of throwing\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const allowThrowInTests = options.allowThrowInTests !== false\n\n function isInTestFile() {\n const filename = context.getFilename()\n return /\\.(test|spec)\\.(ts|js|tsx|jsx)$/.test(filename) ||\n filename.includes(\"__tests__\") ||\n filename.includes(\"/test/\") ||\n filename.includes(\"/tests/\")\n }\n\n\n function hasThrowStatementsOutsideCatch(node: ASTNode): boolean {\n if (!node) return false\n \n if (node.type === \"ThrowStatement\") {\n // Check if this throw is inside a catch block\n let parent = node.parent\n while (parent) {\n if (parent.type === \"CatchClause\") return false\n parent = parent.parent\n }\n return true\n }\n \n // Skip catch blocks when recursing\n if (node.type === \"CatchClause\") return false\n \n // Recursively check child nodes\n for (const key in node) {\n if (key === \"parent\") continue // Avoid circular references\n const child = node[key]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (item && typeof item === \"object\" && hasThrowStatementsOutsideCatch(item)) {\n return true\n }\n }\n } else if (child && typeof child === \"object\" && hasThrowStatementsOutsideCatch(child)) {\n return true\n }\n }\n \n return false\n }\n\n return {\n TryStatement(node: ASTNode) {\n // Allow try/catch in test files\n if (allowThrowInTests && isInTestFile()) return\n \n // Allow try/catch that re-throws in the catch block (even with logging)\n if (node.handler && node.handler.body) {\n const catchBody = node.handler.body.body\n const hasRethrow = catchBody.some((stmt: ASTNode) => stmt.type === \"ThrowStatement\")\n if (hasRethrow) return\n }\n \n context.report({\n node,\n messageId: \"preferEitherOverTryCatch\",\n })\n },\n\n ThrowStatement(node: ASTNode) {\n // Allow throws in test files if configured\n if (allowThrowInTests && isInTestFile()) return\n\n // Allow re-throwing in catch blocks (common pattern)\n let parent = node.parent\n while (parent) {\n if (parent.type === \"CatchClause\") return\n parent = parent.parent\n }\n\n context.report({\n node,\n messageId: \"preferEitherOverThrow\",\n })\n },\n\n FunctionDeclaration(node: ASTNode) {\n // Allow functions in test files\n if (allowThrowInTests && isInTestFile()) return\n \n if (!node.body) return\n\n // Only report function-level errors if there are throws NOT in catch blocks\n // (throws in catch blocks are handled by ThrowStatement rule)\n const hasThrowsNotInCatch = hasThrowStatementsOutsideCatch(node.body)\n if (hasThrowsNotInCatch) {\n const returnType = node.returnType?.typeAnnotation\n if (returnType) {\n const sourceCode = context.sourceCode\n const returnTypeText = sourceCode.getText(returnType)\n \n // Don't report if already using Either\n if (!returnTypeText.includes(\"Either\")) {\n context.report({\n node: node.id || node,\n messageId: \"preferEitherReturn\",\n data: { type: returnTypeText },\n })\n }\n }\n }\n },\n\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\nimport { getFunctypeImports, isFunctypeCall } from \"../utils/functype-detection\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer List<T> over native arrays for immutable collections\",\n category: \"Stylistic Issues\",\n recommended: true,\n },\n fixable: \"code\",\n schema: [\n {\n type: \"object\",\n properties: {\n allowArraysInTests: {\n type: \"boolean\",\n default: true,\n },\n allowReadonlyArrays: {\n type: \"boolean\", \n default: true,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n preferList: \"Prefer List<{{type}}> over array type {{arrayType}}\",\n preferListLiteral: \"Prefer List.of(...) or List.from([...]) over array literal\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const allowArraysInTests = options.allowArraysInTests !== false\n const allowReadonlyArrays = options.allowReadonlyArrays !== false\n\n // Get functype imports if available (but still apply rule even without explicit import)\n const functypeImports = getFunctypeImports(context)\n\n function isInTestFile() {\n const filename = context.getFilename()\n return /\\.(test|spec)\\.(ts|js|tsx|jsx)$/.test(filename) ||\n filename.includes(\"__tests__\") ||\n filename.includes(\"/test/\") ||\n filename.includes(\"/tests/\")\n }\n\n function findTypeParameter(node: ASTNode, sourceCode: typeof context.sourceCode): string | null {\n // Look for TSTypeParameterInstantiation child\n function findInNode(n: ASTNode): string | null {\n if (n.type === \"TSTypeParameterInstantiation\" && n.params && n.params[0]) {\n return sourceCode.getText(n.params[0])\n }\n \n // Recursively search child nodes\n for (const key in n) {\n if (key === \"parent\") continue\n const child = n[key]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (item && typeof item === \"object\" && item.type) {\n const result = findInNode(item)\n if (result) return result\n }\n }\n } else if (child && typeof child === \"object\" && child.type) {\n const result = findInNode(child)\n if (result) return result\n }\n }\n \n return null\n }\n \n return findInNode(node)\n }\n\n return {\n TSArrayType(node: ASTNode) {\n if (allowArraysInTests && isInTestFile()) return\n\n const sourceCode = context.sourceCode\n const elementType = sourceCode.getText(node.elementType)\n const fullType = sourceCode.getText(node)\n\n context.report({\n node,\n messageId: \"preferList\",\n data: {\n type: elementType,\n arrayType: fullType,\n },\n fix(fixer) {\n return fixer.replaceText(node, `List<${elementType}>`)\n },\n })\n },\n\n TSTypeReference(node: ASTNode) {\n if (allowArraysInTests && isInTestFile()) return\n\n const sourceCode = context.sourceCode\n \n // Get type name - handle both simple identifiers and member expressions\n let typeName = \"\"\n if (node.typeName && node.typeName.type === \"Identifier\") {\n typeName = node.typeName.name\n } else if (node.typeName) {\n typeName = sourceCode.getText(node.typeName)\n } else {\n return // No type name found\n }\n\n // Handle Array<T> syntax\n if (typeName === \"Array\") {\n // Look for type parameters in child nodes\n const typeParam = findTypeParameter(node, sourceCode)\n const fullType = sourceCode.getText(node)\n\n // Skip if already readonly\n if (allowReadonlyArrays && fullType.startsWith(\"readonly\")) return\n\n context.report({\n node,\n messageId: \"preferList\",\n data: {\n type: typeParam || \"T\",\n arrayType: fullType,\n },\n fix(fixer) {\n return fixer.replaceText(node, `List<${typeParam || \"T\"}>`)\n },\n })\n }\n\n // Handle ReadonlyArray<T> - suggest List even if allowing readonly arrays\n if (typeName === \"ReadonlyArray\") {\n const typeParam = findTypeParameter(node, sourceCode)\n const fullType = sourceCode.getText(node)\n\n context.report({\n node,\n messageId: \"preferList\",\n data: {\n type: typeParam || \"T\",\n arrayType: fullType,\n },\n fix(fixer) {\n return fixer.replaceText(node, `List<${typeParam || \"T\"}>`)\n },\n })\n }\n },\n\n ArrayExpression(node: ASTNode) {\n if (allowArraysInTests && isInTestFile()) return\n\n // Only flag non-empty arrays to avoid noise\n if (node.elements.length === 0) return\n\n // Don't flag arrays that are already arguments to List.from() or other functype calls\n let parent = node.parent\n if (parent && isFunctypeCall(parent, functypeImports)) {\n return\n }\n \n // Additional specific check for List.from/List.of patterns\n if (parent && parent.type === \"CallExpression\" && \n parent.callee.type === \"MemberExpression\" &&\n parent.callee.object.type === \"Identifier\" &&\n parent.callee.object.name === \"List\" &&\n [\"from\", \"of\"].includes(parent.callee.property.name)) {\n return\n }\n\n // Don't flag nested array literals - only flag the outermost one\n // Check if this array is inside another array literal\n parent = node.parent\n while (parent) {\n if (parent.type === \"ArrayExpression\") {\n return // Skip nested arrays, let the outer one handle it\n }\n parent = parent.parent\n }\n\n // Don't flag array literals that are already part of a type annotation context\n // (those should be handled by the type checking rules)\n let hasTypeAnnotation = false\n parent = node.parent\n while (parent) {\n if (parent.type === \"VariableDeclarator\" && parent.id?.typeAnnotation) {\n // Skip array literal if there's already a type annotation that would be flagged\n hasTypeAnnotation = true\n break\n }\n if (parent.type === \"TSTypeAnnotation\") {\n hasTypeAnnotation = true\n break\n }\n parent = parent.parent\n }\n \n if (hasTypeAnnotation) return\n\n context.report({\n node,\n messageId: \"preferListLiteral\",\n fix(fixer) {\n const sourceCode = context.sourceCode\n const elements = sourceCode.getText(node)\n return fixer.replaceText(node, `List.from(${elements})`)\n },\n })\n },\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"problem\",\n docs: {\n description: \"Avoid unsafe .get() calls on Option, Either, and other monadic types\",\n category: \"Possible Errors\",\n recommended: true,\n },\n schema: [\n {\n type: \"object\",\n properties: {\n allowInTests: {\n type: \"boolean\",\n default: true,\n },\n unsafeMethods: {\n type: \"array\",\n items: { type: \"string\" },\n default: [\"get\", \"getOrThrow\", \"unwrap\", \"expect\"],\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n noUnsafeGet: \"Avoid unsafe .{{method}}() call. Use .fold(), .map(), or .getOrElse() instead\",\n noUnsafeGetSuggestion: \"Consider using .getOrElse(defaultValue) or .fold() for safe access\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const allowInTests = options.allowInTests !== false\n const unsafeMethods = options.unsafeMethods || [\"get\", \"getOrThrow\", \"unwrap\", \"expect\"]\n\n function isInTestFile() {\n const filename = context.getFilename()\n return /\\.(test|spec)\\.(ts|js|tsx|jsx)$/.test(filename) ||\n filename.includes(\"__tests__\") ||\n filename.includes(\"/test/\") ||\n filename.includes(\"/tests/\")\n }\n\n function isMonadicType(node: ASTNode): boolean {\n // This is a simplified check - in a real implementation, you'd want\n // more sophisticated type checking using TypeScript's type checker\n if (!node) return false\n \n const sourceCode = context.sourceCode\n \n // Check for common patterns that indicate monadic types\n const text = sourceCode.getText(node)\n \n // Direct type checks - constructors or type names\n if (/\\b(Option|Either|Maybe|Result|Some|None|Left|Right)\\b/.test(text)) {\n return true\n }\n \n // Method chains that suggest monadic operations\n if (/\\.(map|flatMap|filter|fold)\\s*\\(/.test(text)) {\n return true\n }\n \n // Variable names that suggest monadic types (case insensitive)\n if (/\\b(option|either|maybe|result|some|none|left|right)\\w*\\b/i.test(text)) {\n return true\n }\n \n // Check the specific node type and name\n if (node.type === \"Identifier\") {\n const varName = node.name.toLowerCase()\n if (/(option|either|maybe|result|some|none|left|right|opt)/.test(varName)) {\n return true\n }\n }\n \n // Check for CallExpression pattern like Some(\"test\").map()\n if (node.type === \"CallExpression\" && \n node.callee.type === \"MemberExpression\" &&\n node.callee.object) {\n return isMonadicType(node.callee.object)\n }\n \n return false\n }\n\n return {\n CallExpression(node: ASTNode) {\n if (allowInTests && isInTestFile()) return\n\n if (node.callee.type !== \"MemberExpression\") return\n\n const property = node.callee.property\n if (!property || property.type !== \"Identifier\") return\n\n const methodName = property.name\n if (!unsafeMethods.includes(methodName)) return\n\n // Check if this looks like it's being called on a monadic type\n if (isMonadicType(node.callee.object)) {\n context.report({\n node,\n messageId: \"noUnsafeGet\",\n data: { method: methodName },\n })\n }\n },\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer .fold() over if/else chains when working with monadic types\",\n category: \"Best Practices\", \n recommended: true,\n },\n schema: [\n {\n type: \"object\",\n properties: {\n minComplexity: {\n type: \"integer\",\n minimum: 1,\n default: 2,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n preferFold: \"Prefer .fold() over if/else when working with {{type}} types\",\n preferFoldTernary: \"Consider using .fold() instead of ternary operator for {{type}}\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const minComplexity = options.minComplexity || 2\n\n function isMonadicCheck(node: ASTNode): { isMonadic: boolean; type: string } {\n const sourceCode = context.sourceCode\n const text = sourceCode.getText(node)\n\n // Check for common monadic type checks\n if (/\\.(isSome|isNone|isEmpty|isDefined)\\s*\\(\\s*\\)/.test(text)) {\n return { isMonadic: true, type: \"Option\" }\n }\n \n if (/\\.(isLeft|isRight)\\s*\\(\\s*\\)/.test(text)) {\n return { isMonadic: true, type: \"Either\" }\n }\n\n if (/\\.(isSuccess|isFailure)\\s*\\(\\s*\\)/.test(text)) {\n return { isMonadic: true, type: \"Result\" }\n }\n\n // Check for null/undefined checks on variables that might be Options\n if (node.type === \"BinaryExpression\") {\n if ((node.operator === \"===\" || node.operator === \"!==\") &&\n ((node.left.type === \"Literal\" && (node.left.value === null || node.left.value === undefined)) ||\n (node.right.type === \"Literal\" && (node.right.value === null || node.right.value === undefined)))) {\n // This might be checking an Option that hasn't been properly typed\n return { isMonadic: true, type: \"Option\" }\n }\n \n // Check for == or != with undefined\n if ((node.operator === \"==\" || node.operator === \"!=\" || node.operator === \"===\" || node.operator === \"!==\")) {\n const leftIsUndefined = (node.left.type === \"Identifier\" && node.left.name === \"undefined\") ||\n (node.left.type === \"Literal\" && node.left.value === undefined)\n const rightIsUndefined = (node.right.type === \"Identifier\" && node.right.name === \"undefined\") ||\n (node.right.type === \"Literal\" && node.right.value === undefined)\n \n if (leftIsUndefined || rightIsUndefined) {\n return { isMonadic: true, type: \"Option\" }\n }\n }\n }\n\n return { isMonadic: false, type: \"\" }\n }\n\n function analyzeIfStatement(node: ASTNode) {\n const test = node.test\n const monadicInfo = isMonadicCheck(test)\n \n if (!monadicInfo.isMonadic) return\n\n // Don't analyze if this is part of a larger if/else chain\n // (only analyze the outermost if statement)\n if (node.parent && node.parent.type === \"IfStatement\") return\n\n // Count the complexity (if/else if/else chain)\n let complexity = 1\n let current = node\n while (current.alternate) {\n complexity++\n if (current.alternate.type === \"IfStatement\") {\n current = current.alternate\n } else {\n break\n }\n }\n\n if (complexity >= minComplexity) {\n context.report({\n node,\n messageId: \"preferFold\",\n data: { type: monadicInfo.type },\n })\n }\n }\n\n return {\n IfStatement(node: ASTNode) {\n analyzeIfStatement(node)\n },\n\n ConditionalExpression(node: ASTNode) {\n const monadicInfo = isMonadicCheck(node.test)\n if (monadicInfo.isMonadic) {\n context.report({\n node,\n messageId: \"preferFoldTernary\", \n data: { type: monadicInfo.type },\n })\n }\n },\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer .map() over manual transformations and imperative patterns\",\n category: \"Best Practices\",\n recommended: true,\n },\n schema: [\n {\n type: \"object\",\n properties: {\n checkArrayMethods: {\n type: \"boolean\",\n default: true,\n },\n checkForLoops: {\n type: \"boolean\", \n default: true,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n preferMapOverLoop: \"Prefer .map() over for loop for transforming {{collection}}\",\n preferMapOverPush: \"Prefer .map() over manual .push() in loop\",\n preferMapChain: \"Consider using .map() for transformation instead of manual property access\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const checkArrayMethods = options.checkArrayMethods !== false\n const checkForLoops = options.checkForLoops !== false\n\n function isTransformationLoop(node: ASTNode): boolean {\n if (!node.body || node.body.type !== \"BlockStatement\") return false\n \n const statements = node.body.body\n if (statements.length === 0) return false\n\n // Look for patterns like: newArray.push(transform(item))\n return statements.some((stmt: ASTNode) => {\n if (stmt.type === \"ExpressionStatement\" && \n stmt.expression.type === \"CallExpression\") {\n const call = stmt.expression\n return call.callee.type === \"MemberExpression\" &&\n call.callee.property.name === \"push\"\n }\n return false\n })\n }\n\n function isSimplePropertyAccess(node: ASTNode): boolean {\n // Check for patterns like: items.forEach(item => console.log(item.name))\n // These could often be: items.map(item => item.name)\n if (node.type === \"CallExpression\" &&\n node.callee.type === \"MemberExpression\" &&\n node.callee.property.name === \"forEach\") {\n \n const callback = node.arguments[0]\n if (callback && (callback.type === \"ArrowFunctionExpression\" || \n callback.type === \"FunctionExpression\")) {\n const body = callback.body\n // Simple property access in arrow function\n if (body.type === \"MemberExpression\") {\n return true\n }\n }\n }\n return false\n }\n\n return {\n ForStatement(node: ASTNode) {\n if (!checkForLoops) return\n\n if (isTransformationLoop(node)) {\n context.report({\n node,\n messageId: \"preferMapOverLoop\", \n data: { collection: \"array\" },\n })\n }\n },\n\n ForInStatement(node: ASTNode) {\n if (!checkForLoops) return\n\n if (isTransformationLoop(node)) {\n context.report({\n node,\n messageId: \"preferMapOverLoop\",\n data: { collection: \"object\" },\n })\n }\n },\n\n ForOfStatement(node: ASTNode) {\n if (!checkForLoops) return\n\n if (isTransformationLoop(node)) {\n context.report({\n node,\n messageId: \"preferMapOverLoop\",\n data: { collection: \"iterable\" },\n })\n }\n },\n\n CallExpression(node: ASTNode) {\n if (!checkArrayMethods) return\n\n // Check for forEach that could be map\n if (node.callee.type === \"MemberExpression\" &&\n node.callee.property.name === \"forEach\") {\n \n if (isSimplePropertyAccess(node)) {\n context.report({\n node,\n messageId: \"preferMapChain\",\n })\n }\n }\n\n // Check for manual push patterns in callbacks\n if (node.callee.type === \"MemberExpression\" &&\n node.callee.property.name === \"push\") {\n \n // Check if we're inside a forEach or similar iteration\n let parent = node.parent\n while (parent) {\n if (parent.type === \"CallExpression\" &&\n parent.callee.type === \"MemberExpression\" &&\n (parent.callee.property.name === \"forEach\" ||\n parent.callee.property.name === \"for\")) {\n \n context.report({\n node,\n messageId: \"preferMapOverPush\",\n })\n break\n }\n parent = parent.parent\n }\n }\n },\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer .flatMap() over .map().flat() and nested transformations\",\n category: \"Best Practices\",\n recommended: true,\n },\n fixable: \"code\",\n schema: [\n {\n type: \"object\",\n properties: {\n checkNestedMaps: {\n type: \"boolean\",\n default: true,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n preferFlatMapOverMapFlat: \"Use .flatMap() instead of .map().flat()\",\n preferFlatMapNested: \"Consider .flatMap() for nested transformations that return arrays\",\n preferFlatMapChain: \"Use .flatMap() instead of chained .map() operations that flatten results\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const checkNestedMaps = options.checkNestedMaps !== false\n\n function isMapFollowedByFlat(node: ASTNode): boolean {\n if (node.type !== \"CallExpression\") return false\n \n const callee = node.callee\n if (callee.type !== \"MemberExpression\") return false\n \n // Check if this is .flat()\n if (callee.property.name === \"flat\") {\n const object = callee.object\n \n // Check if the object is a .map() call\n if (object.type === \"CallExpression\" &&\n object.callee.type === \"MemberExpression\" &&\n object.callee.property.name === \"map\") {\n return true\n }\n }\n \n return false\n }\n\n function returnsArray(functionNode: ASTNode): boolean {\n if (!functionNode || !functionNode.body) return false\n\n // Arrow function with expression body\n if (functionNode.body.type === \"ArrayExpression\") {\n return true\n }\n\n // Arrow function with call expression body\n if (functionNode.body.type === \"CallExpression\") {\n const call = functionNode.body\n if (call.callee.type === \"MemberExpression\") {\n const methodName = call.callee.property.name\n // Common methods that return arrays\n if ([\"map\", \"filter\", \"slice\", \"concat\", \"split\"].includes(methodName)) {\n return true\n }\n }\n }\n\n // Function with block body\n if (functionNode.body.type === \"BlockStatement\") {\n const statements = functionNode.body.body\n \n // Look for return statements that return arrays\n for (const stmt of statements) {\n if (stmt.type === \"ReturnStatement\" && stmt.argument) {\n if (stmt.argument.type === \"ArrayExpression\") {\n return true\n }\n \n // Check for method calls that return arrays\n if (stmt.argument.type === \"CallExpression\") {\n const call = stmt.argument\n if (call.callee.type === \"MemberExpression\") {\n const methodName = call.callee.property.name\n // Common methods that return arrays\n if ([\"map\", \"filter\", \"slice\", \"concat\", \"split\"].includes(methodName)) {\n return true\n }\n }\n }\n }\n }\n }\n\n return false\n }\n\n function isNestedMapReturningArrays(node: ASTNode): boolean {\n if (node.type !== \"CallExpression\") return false\n \n const callee = node.callee\n if (callee.type !== \"MemberExpression\") return false\n \n // Check if this is .map()\n if (callee.property.name === \"map\") {\n const callback = node.arguments[0]\n if (callback && (callback.type === \"ArrowFunctionExpression\" ||\n callback.type === \"FunctionExpression\")) {\n return returnsArray(callback)\n }\n }\n \n return false\n }\n\n return {\n CallExpression(node: ASTNode) {\n // Check for .map().flat() pattern first (highest priority)\n if (isMapFollowedByFlat(node)) {\n const sourceCode = context.sourceCode\n \n context.report({\n node,\n messageId: \"preferFlatMapOverMapFlat\",\n fix(fixer) {\n // Get the .map() call\n const mapCall = (node.callee as ASTNode).object\n const mapCallText = sourceCode.getText(mapCall)\n \n // Replace .map() with .flatMap() and remove .flat()\n const flatMapText = mapCallText.replace(/\\.map\\s*\\(/, \".flatMap(\")\n \n return fixer.replaceText(node, flatMapText)\n },\n })\n return // Don't check other patterns if we found .map().flat()\n }\n\n // Check for chained maps where intermediate results are arrays (highest priority after map().flat())\n if (node.callee.type === \"MemberExpression\" &&\n node.callee.property.name === \"map\") {\n \n const object = node.callee.object\n if (object.type === \"CallExpression\" &&\n object.callee.type === \"MemberExpression\" &&\n object.callee.property.name === \"map\") {\n \n // Check if the first map returns arrays\n const firstMapCallback = object.arguments[0]\n if (firstMapCallback && returnsArray(firstMapCallback)) {\n context.report({\n node: object, // Report on the first map call\n messageId: \"preferFlatMapChain\",\n })\n return // Don't check other patterns for this chain\n }\n }\n }\n\n // Check for nested maps that return arrays (but not if they're part of map().flat() or chains)\n if (checkNestedMaps && isNestedMapReturningArrays(node)) {\n // Don't flag if this map is immediately followed by flat()\n if (node.parent && \n node.parent.type === \"MemberExpression\" &&\n node.parent.parent &&\n node.parent.parent.type === \"CallExpression\" &&\n node.parent.property.name === \"flat\") {\n return // Skip - this will be handled by the map().flat() rule\n }\n\n // Don't flag if this map is part of a chain (either as first or second map)\n const object = node.callee?.object\n if (object?.type === \"CallExpression\" &&\n object.callee?.type === \"MemberExpression\" &&\n object.callee?.property?.name === \"map\") {\n return // Skip - this is part of a chain\n }\n \n // Check if this map feeds into another map\n if (node.parent?.type === \"MemberExpression\" &&\n node.parent.parent?.type === \"CallExpression\" &&\n node.parent.parent.callee?.property?.name === \"map\") {\n return // Skip - this feeds into a chain\n }\n \n context.report({\n node,\n messageId: \"preferFlatMapNested\",\n })\n }\n },\n }\n },\n}\n\nexport = rule","import type { Rule } from \"eslint\"\nimport type { ASTNode } from \"../types/ast\"\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer functional iteration methods over imperative for loops\",\n category: \"Best Practices\",\n recommended: true,\n },\n schema: [\n {\n type: \"object\",\n properties: {\n allowForIndexAccess: {\n type: \"boolean\",\n default: false,\n },\n allowWhileLoops: {\n type: \"boolean\", \n default: false,\n },\n allowInTests: {\n type: \"boolean\",\n default: true,\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n noForLoop: \"Prefer functional methods (.map, .filter, .forEach, .reduce) over for loops\",\n noForInLoop: \"Prefer Object.keys().forEach() or functional methods over for..in loops\",\n noForOfLoop: \"Prefer .forEach() or .map() over for..of loops\", \n noWhileLoop: \"Prefer functional iteration or recursion over while loops\",\n noDoWhileLoop: \"Prefer functional iteration or recursion over do..while loops\",\n suggestFunctional: \"Consider: {{suggestion}}\",\n },\n },\n\n create(context) {\n const options = context.options[0] || {}\n const allowForIndexAccess = options.allowForIndexAccess || false\n const allowWhileLoops = options.allowWhileLoops || false\n const allowInTests = options.allowInTests !== false\n\n function isInTestFile() {\n const filename = context.getFilename()\n return /\\.(test|spec)\\.(ts|js|tsx|jsx)$/.test(filename) ||\n filename.includes(\"__tests__\") ||\n filename.includes(\"/test/\") ||\n filename.includes(\"/tests/\")\n }\n\n function needsIndexAccess(node: ASTNode): boolean {\n if (!node.body || node.body.type !== \"BlockStatement\") return false\n \n const sourceCode = context.sourceCode\n const bodyText = sourceCode.getText(node.body)\n \n // Look for array index access patterns like arr[i]\n return /\\[\\s*\\w+\\s*\\]/.test(bodyText) && node.init && \n node.init.type === \"VariableDeclaration\"\n }\n\n function getSuggestionForForLoop(node: ASTNode): string {\n if (!node.body) return \"functional iteration method\"\n \n const sourceCode = context.sourceCode\n const bodyText = sourceCode.getText(node.body)\n \n // Simple heuristics for suggestions\n if (bodyText.includes(\"if\") && bodyText.includes(\"push\")) {\n return \"array.filter().map() for conditional transformation\"\n } else if (bodyText.includes(\"push\")) {\n return \"array.map() to transform elements\"\n } else if (bodyText.includes(\"console.log\") || bodyText.includes(\"print\")) {\n return \"array.forEach() for side effects\"\n } else if (bodyText.includes(\"+=\") || bodyText.includes(\"sum\")) {\n return \"array.reduce() for accumulation\"\n }\n \n return \"functional iteration method (.map, .filter, .forEach, .reduce)\"\n }\n\n // Remove unused function to fix lint error\n // getSuggestionForForLoop could be used for better error messages in the future\n // Mark as used to avoid lint error:\n void getSuggestionForForLoop\n \n return {\n ForStatement(node: ASTNode) {\n if (allowInTests && isInTestFile()) return\n \n // Allow traditional for loops if they need index access and option is set\n if (allowForIndexAccess && needsIndexAccess(node)) return\n\n // Remove unused suggestion variable\n // const _suggestion = getSuggestionForForLoop(node)\n context.report({\n node,\n messageId: \"noForLoop\",\n })\n },\n\n ForInStatement(node: ASTNode) {\n if (allowInTests && isInTestFile()) return\n\n context.report({\n node,\n messageId: \"noForInLoop\",\n })\n },\n\n ForOfStatement(node: ASTNode) {\n if (allowInTests && isInTestFile()) return\n\n context.report({\n node,\n messageId: \"noForOfLoop\",\n })\n },\n\n WhileStatement(node: ASTNode) {\n if (allowWhileLoops) return\n if (allowInTests && isInTestFile()) return\n\n context.report({\n node,\n messageId: \"noWhileLoop\",\n })\n },\n\n DoWhileStatement(node: ASTNode) {\n if (allowWhileLoops) return\n if (allowInTests && isInTestFile()) return\n\n context.report({\n node,\n messageId: \"noDoWhileLoop\",\n })\n },\n }\n },\n}\n\nexport = rule","import preferOption from \"./prefer-option\"\nimport preferEither from \"./prefer-either\"\nimport preferList from \"./prefer-list\"\nimport noGetUnsafe from \"./no-get-unsafe\"\nimport preferFold from \"./prefer-fold\"\nimport preferMap from \"./prefer-map\"\nimport preferFlatmap from \"./prefer-flatmap\"\nimport noImperativeLoops from \"./no-imperative-loops\"\n\nexport {\n preferOption,\n preferEither,\n preferList,\n noGetUnsafe,\n preferFold,\n preferMap,\n preferFlatmap,\n noImperativeLoops,\n}\n\nexport default {\n \"prefer-option\": preferOption,\n \"prefer-either\": preferEither,\n \"prefer-list\": preferList,\n \"no-get-unsafe\": noGetUnsafe,\n \"prefer-fold\": preferFold,\n \"prefer-map\": preferMap,\n \"prefer-flatmap\": preferFlatmap,\n \"no-imperative-loops\": noImperativeLoops,\n}","\nimport rules from \"./rules\"\n\n// ESLint 9.x Flat Config Plugin\nconst plugin = {\n rules,\n // Meta information\n meta: {\n name: \"eslint-plugin-functype\",\n version: \"2.0.0\",\n },\n}\n\nexport = plugin"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import rules from \"./rules\"\n\n// ESLint 9.x Flat Config Plugin\nconst plugin = {\n rules,\n // Meta information\n meta: {\n name: \"eslint-plugin-functype\",\n version: \"2.0.0\",\n },\n}\n\nexport default plugin\n"],"mappings":"gCAGA,MAAM,EAAS,CACb,MAAA,EAEA,KAAM,CACJ,KAAM,yBACN,QAAS,QACV,CACF"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -1,31 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
declare const rule$2: Rule.RuleModule;
|
|
15
|
-
|
|
16
|
-
declare const rule$1: Rule.RuleModule;
|
|
17
|
-
|
|
18
|
-
declare const rule: Rule.RuleModule;
|
|
19
|
-
|
|
1
|
+
import rule from "./no-get-unsafe.js";
|
|
2
|
+
import rule$1 from "./no-imperative-loops.js";
|
|
3
|
+
import rule$2 from "./prefer-do-notation.js";
|
|
4
|
+
import rule$3 from "./prefer-either.js";
|
|
5
|
+
import rule$4 from "./prefer-flatmap.js";
|
|
6
|
+
import rule$5 from "./prefer-fold.js";
|
|
7
|
+
import rule$6 from "./prefer-list.js";
|
|
8
|
+
import rule$7 from "./prefer-map.js";
|
|
9
|
+
import rule$8 from "./prefer-option.js";
|
|
10
|
+
import * as eslint from "eslint";
|
|
11
|
+
|
|
12
|
+
//#region src/rules/index.d.ts
|
|
20
13
|
declare const _default: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
14
|
+
"prefer-option": eslint.Rule.RuleModule;
|
|
15
|
+
"prefer-either": eslint.Rule.RuleModule;
|
|
16
|
+
"prefer-list": eslint.Rule.RuleModule;
|
|
17
|
+
"no-get-unsafe": eslint.Rule.RuleModule;
|
|
18
|
+
"prefer-fold": eslint.Rule.RuleModule;
|
|
19
|
+
"prefer-map": eslint.Rule.RuleModule;
|
|
20
|
+
"prefer-flatmap": eslint.Rule.RuleModule;
|
|
21
|
+
"no-imperative-loops": eslint.Rule.RuleModule;
|
|
22
|
+
"prefer-do-notation": eslint.Rule.RuleModule;
|
|
29
23
|
};
|
|
30
|
-
|
|
31
|
-
export { _default as default, rule
|
|
24
|
+
//#endregion
|
|
25
|
+
export { _default as default, rule as noGetUnsafe, rule$1 as noImperativeLoops, rule$2 as preferDoNotation, rule$3 as preferEither, rule$4 as preferFlatmap, rule$5 as preferFold, rule$6 as preferList, rule$7 as preferMap, rule$8 as preferOption };
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|