From 0bfab6c9f5c5e243268200cf9368acf39ea099f8 Mon Sep 17 00:00:00 2001 From: zz <2418184580@qq.com> Date: Thu, 26 May 2022 23:43:52 +0800 Subject: [PATCH] feat(eslint-plugin): [space-infix-ops] missing error report for conditional types (#5041) --- .../src/rules/space-infix-ops.ts | 21 +++- .../tests/rules/space-infix-ops.test.ts | 110 ++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/space-infix-ops.ts b/packages/eslint-plugin/src/rules/space-infix-ops.ts index ff6e15ac340..73d115ecfbf 100644 --- a/packages/eslint-plugin/src/rules/space-infix-ops.ts +++ b/packages/eslint-plugin/src/rules/space-infix-ops.ts @@ -69,7 +69,10 @@ export default util.createRule({ }; function isSpaceChar(token: TSESTree.Token): boolean { - return token.type === AST_TOKEN_TYPES.Punctuator && token.value === '='; + return ( + token.type === AST_TOKEN_TYPES.Punctuator && + /^[=|?|:]$/.test(token.value) + ); } function checkAndReportAssignmentSpace( @@ -180,6 +183,21 @@ export default util.createRule({ checkAndReportAssignmentSpace(node, leftNode, rightNode); } + function checkForTypeConditional(node: TSESTree.TSConditionalType): void { + const extendsTypeNode = sourceCode.getTokenByRangeStart( + node.extendsType.range[0], + )!; + const trueTypeNode = sourceCode.getTokenByRangeStart( + node.trueType.range[0], + )!; + const falseTypeNode = sourceCode.getTokenByRangeStart( + node.falseType.range[0], + ); + + checkAndReportAssignmentSpace(node, extendsTypeNode, trueTypeNode); + checkAndReportAssignmentSpace(node, trueTypeNode, falseTypeNode); + } + return { ...rules, TSEnumMember: checkForEnumAssignmentSpace, @@ -187,6 +205,7 @@ export default util.createRule({ TSTypeAliasDeclaration: checkForTypeAliasAssignment, TSUnionType: checkForTypeAnnotationSpace, TSIntersectionType: checkForTypeAnnotationSpace, + TSConditionalType: checkForTypeConditional, }; }, }); diff --git a/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts b/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts index 72f71d00358..26e62323167 100644 --- a/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts +++ b/packages/eslint-plugin/tests/rules/space-infix-ops.test.ts @@ -977,6 +977,116 @@ ruleTester.run('space-infix-ops', rule, { }, ], }, + { + code: ` + type Test = T extends boolean?true:false + `, + output: ` + type Test = T extends boolean ? true : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 46, + line: 2, + }, + ], + }, + { + code: ` + type Test = T extends boolean? true :false + `, + output: ` + type Test = T extends boolean ? true : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 48, + line: 2, + }, + ], + }, + { + code: ` + type Test = T extends boolean? + true :false + `, + output: ` + type Test = T extends boolean ? + true : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 16, + line: 3, + }, + ], + }, + { + code: ` + type Test = T extends boolean? + true + :false + `, + output: ` + type Test = T extends boolean ? + true + : false + `, + errors: [ + { + messageId: 'missingSpace', + column: 41, + line: 2, + }, + { + messageId: 'missingSpace', + column: 11, + line: 4, + }, + ], + }, + { + code: ` + type Test = T extends boolean + ?true: + false + `, + output: ` + type Test = T extends boolean + ? true : + false + `, + errors: [ + { + messageId: 'missingSpace', + column: 11, + line: 3, + }, + { + messageId: 'missingSpace', + column: 16, + line: 3, + }, + ], + }, { code: ` interface Test {