Skip to content

Commit

Permalink
fix(eslint-plugin): [no-unsafe-assignment] be more specific about err…
Browse files Browse the repository at this point in the history
…or types (#8304)

* fix: error assignment type issue

* refactor: error assignment type

* refactor: error assignment type

* refactor: error assignment type

* chore: resolve comments

* fix: error type assignment tests

* fix: error type assignment tests

* chore: change yarn lock

* fix: errot type assignments tests

* chore: remove unnecessary error type check function

* refactor: rename every error ocurrence to error typed

* refactor: rename every error ocurrence to error typed

* refactor: rename every error ocurrence to error typed

* fix CI issues

* fix CI issues

* refactor: change create data from types function and add test data for test cases

* refactor: remove unnecessary else
  • Loading branch information
tobySolutions committed Jun 5, 2024
1 parent cb1720d commit 293fb24
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 23 deletions.
39 changes: 30 additions & 9 deletions packages/eslint-plugin/src/rules/no-unsafe-assignment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,18 @@ export default createRule({
requiresTypeChecking: true,
},
messages: {
anyAssignment: 'Unsafe assignment of an `any` value.',
anyAssignment: 'Unsafe assignment of an {{sender}} value.',
anyAssignmentThis: [
'Unsafe assignment of an `any` value. `this` is typed as `any`.',
'Unsafe assignment of an {{sender}} value. `this` is typed as `any`.',
'You can try to fix this by turning on the `noImplicitThis` compiler option, or adding a `this` parameter to the function.',
].join('\n'),
unsafeArrayPattern: 'Unsafe array destructuring of an `any` array value.',
unsafeArrayPattern:
'Unsafe array destructuring of an {{sender}} array value.',
unsafeArrayPatternFromTuple:
'Unsafe array destructuring of a tuple element with an `any` value.',
'Unsafe array destructuring of a tuple element with an {{sender}} value.',
unsafeAssignment:
'Unsafe assignment of type {{sender}} to a variable of type {{receiver}}.',
unsafeArraySpread: 'Unsafe spread of an `any` value in an array.',
unsafeArraySpread: 'Unsafe spread of an {{sender}} value in an array.',
},
schema: [],
},
Expand Down Expand Up @@ -88,6 +89,7 @@ export default createRule({
context.report({
node: receiverNode,
messageId: 'unsafeArrayPattern',
data: createData(senderType),
});
return false;
}
Expand Down Expand Up @@ -126,6 +128,7 @@ export default createRule({
context.report({
node: receiverElement,
messageId: 'unsafeArrayPatternFromTuple',
data: createData(senderType),
});
// we want to report on every invalid element in the tuple
didReport = true;
Expand Down Expand Up @@ -212,6 +215,7 @@ export default createRule({
context.report({
node: receiverProperty.value,
messageId: 'unsafeArrayPatternFromTuple',
data: createData(senderType),
});
didReport = true;
} else if (
Expand Down Expand Up @@ -275,7 +279,9 @@ export default createRule({
context.report({
node: reportingNode,
messageId,
data: createData(senderType),
});

return true;
}

Expand All @@ -297,10 +303,7 @@ export default createRule({
context.report({
node: reportingNode,
messageId: 'unsafeAssignment',
data: {
sender: checker.typeToString(sender),
receiver: checker.typeToString(receiver),
},
data: createData(sender, receiver),
});
return true;
}
Expand All @@ -315,6 +318,23 @@ export default createRule({
ComparisonType.None;
}

function createData(
senderType: ts.Type,
receiverType?: ts.Type,
): Readonly<Record<string, unknown>> | undefined {
if (receiverType) {
return {
sender: '`' + checker.typeToString(senderType) + '`',
receiver: '`' + checker.typeToString(receiverType) + '`',
};
}
return {
sender: tsutils.isIntrinsicErrorType(senderType)
? 'error typed'
: '`any`',
};
}

return {
'VariableDeclarator[init != null]'(
node: TSESTree.VariableDeclarator,
Expand Down Expand Up @@ -383,6 +403,7 @@ export default createRule({
context.report({
node: node,
messageId: 'unsafeArraySpread',
data: createData(restType),
});
}
},
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

74 changes: 64 additions & 10 deletions packages/eslint-plugin/tests/rules/no-unsafe-assignment.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ declare function Foo(props: Props): never;
},
},
},

{
code: `
declare function Foo(props: { a: string }): never;
Expand Down Expand Up @@ -195,7 +196,60 @@ class Foo {
`,
errors: [{ messageId: 'anyAssignment' }],
},
{
code: `
const [x] = spooky;
`,
errors: [
{
messageId: 'anyAssignment',
data: { sender: 'error typed', receiver: 'error typed' },
},
],
},
{
code: `
const [[[x]]] = [spooky];
`,
errors: [
{
messageId: 'unsafeArrayPatternFromTuple',
data: { sender: 'error typed', receiver: 'error typed' },
},
],
},
{
code: `
const {
x: { y: z },
} = { x: spooky };
`,
errors: [
{
messageId: 'unsafeArrayPatternFromTuple',
data: { sender: 'error typed', receiver: 'error typed' },
},
{
messageId: 'anyAssignment',
data: { sender: 'error typed', receiver: 'error typed' },
},
],
},
{
code: `
let value: number;
value = spooky;
`,
errors: [
{
messageId: 'anyAssignment',
data: {
sender: 'error typed',
},
},
],
},
{
code: `
const [x] = 1 as any;
Expand All @@ -215,8 +269,8 @@ const [x] = [] as any[];
{
messageId: 'unsafeAssignment',
data: {
sender: 'Set<any>',
receiver: 'Set<string>',
sender: '`Set<any>`',
receiver: '`Set<string>`',
},
},
],
Expand All @@ -227,8 +281,8 @@ const [x] = [] as any[];
{
messageId: 'unsafeAssignment',
data: {
sender: 'Map<string, any>',
receiver: 'Map<string, string>',
sender: '`Map<string, any>`',
receiver: '`Map<string, string>`',
},
},
],
Expand All @@ -239,8 +293,8 @@ const [x] = [] as any[];
{
messageId: 'unsafeAssignment',
data: {
sender: 'Set<any[]>',
receiver: 'Set<string[]>',
sender: '`Set<any[]>`',
receiver: '`Set<string[]>`',
},
},
],
Expand All @@ -251,8 +305,8 @@ const [x] = [] as any[];
{
messageId: 'unsafeAssignment',
data: {
sender: 'Set<Set<Set<any>>>',
receiver: 'Set<Set<Set<string>>>',
sender: '`Set<Set<Set<any>>>`',
receiver: '`Set<Set<Set<string>>>`',
},
},
],
Expand Down Expand Up @@ -327,8 +381,8 @@ const x = [...([] as any[])];
column: 43,
endColumn: 70,
data: {
sender: 'Set<Set<Set<any>>>',
receiver: 'Set<Set<Set<string>>>',
sender: '`Set<Set<Set<any>>>`',
receiver: '`Set<Set<Set<string>>>`',
},
},
],
Expand Down

0 comments on commit 293fb24

Please sign in to comment.