Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(eslint-plugin): [no-unnecessary-type-constraint] correctly fix in cts/mts files #6795

Merged
19 changes: 10 additions & 9 deletions packages/eslint-plugin/src/rules/no-unnecessary-type-constraint.ts
@@ -1,6 +1,7 @@
import {
getLanguageVariant,
getScriptKind,
isNewModuleExtension,
} from '@typescript-eslint/type-utils';
import type { TSESLint, TSESTree } from '@typescript-eslint/utils';
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
Expand Down Expand Up @@ -64,21 +65,21 @@ export default util.createRule({
])
: new Map([[AST_NODE_TYPES.TSUnknownKeyword, 'unknown']]);

const inJsx =
getLanguageVariant(
getScriptKind(
context.getFilename(),
!!context.parserOptions.ecmaFeatures?.jsx,
),
) === ts.LanguageVariant.JSX;

const filename = context.getFilename();
const scriptKind = getScriptKind(
filename,
!!context.parserOptions.ecmaFeatures?.jsx,
);
const inJsx = getLanguageVariant(scriptKind) === ts.LanguageVariant.JSX;
const newModuleExtension = isNewModuleExtension(filename);
WoodyWoodsta marked this conversation as resolved.
Show resolved Hide resolved
const source = context.getSourceCode();

const checkNode = (
node: TypeParameterWithConstraint,
inArrowFunction: boolean,
): void => {
const constraint = unnecessaryConstraints.get(node.constraint.type);
const constraint =
!newModuleExtension && unnecessaryConstraints.get(node.constraint.type);
function shouldAddTrailingComma(): boolean {
if (!inArrowFunction || !inJsx) {
return false;
Expand Down
Expand Up @@ -25,6 +25,10 @@ function data<T extends TODO>() {}
'const data = <T, U>() => {};',
'const data = <T extends number>() => {};',
'const data = <T extends number | string>() => {};',
{
code: 'const data = <T extends any>() => {};',
filename: 'file.mts',
},
],
invalid: [
{
Expand Down
1 change: 1 addition & 0 deletions packages/type-utils/src/index.ts
Expand Up @@ -18,4 +18,5 @@ export {
typescriptVersionIsAtLeast,
getScriptKind,
getLanguageVariant,
isNewModuleExtension,
} from '@typescript-eslint/typescript-estree';
28 changes: 27 additions & 1 deletion packages/typescript-estree/src/create-program/getScriptKind.ts
@@ -1,6 +1,32 @@
import path from 'path';
import * as ts from 'typescript';

function isNewModuleExtension(filePath: string): boolean {
WoodyWoodsta marked this conversation as resolved.
Show resolved Hide resolved
const extension = path.extname(filePath).toLowerCase();

Check warning on line 5 in packages/typescript-estree/src/create-program/getScriptKind.ts

View check run for this annotation

Codecov / codecov/patch

packages/typescript-estree/src/create-program/getScriptKind.ts#L5

Added line #L5 was not covered by tests
// note - we only respect the user's jsx setting for unknown extensions
// this is so that we always match TS's internal script kind logic, preventing
// weird errors due to a mismatch.
// https://github.com/microsoft/TypeScript/blob/da00ba67ed1182ad334f7c713b8254fba174aeba/src/compiler/utilities.ts#L6948-L6968
switch (extension) {
case ts.Extension.Js:
case ts.Extension.Ts:
case ts.Extension.Jsx:
case ts.Extension.Tsx:
case ts.Extension.Json:
return false;

Check warning on line 16 in packages/typescript-estree/src/create-program/getScriptKind.ts

View check run for this annotation

Codecov / codecov/patch

packages/typescript-estree/src/create-program/getScriptKind.ts#L16

Added line #L16 was not covered by tests

case ts.Extension.Cjs:
case ts.Extension.Mjs:
case ts.Extension.Cts:
case ts.Extension.Mts:
return true;

Check warning on line 22 in packages/typescript-estree/src/create-program/getScriptKind.ts

View check run for this annotation

Codecov / codecov/patch

packages/typescript-estree/src/create-program/getScriptKind.ts#L22

Added line #L22 was not covered by tests

default:
// unknown extension, we assume this is not a new module extension
return false;

Check warning on line 26 in packages/typescript-estree/src/create-program/getScriptKind.ts

View check run for this annotation

Codecov / codecov/patch

packages/typescript-estree/src/create-program/getScriptKind.ts#L26

Added line #L26 was not covered by tests
}
}

function getScriptKind(filePath: string, jsx: boolean): ts.ScriptKind {
const extension = path.extname(filePath).toLowerCase();
// note - we only respect the user's jsx setting for unknown extensions
Expand Down Expand Up @@ -47,4 +73,4 @@
}
}

export { getScriptKind, getLanguageVariant };
export { getScriptKind, getLanguageVariant, isNewModuleExtension };