From 0aaf183131f3eadd40c05ccc94139282bd8d7d56 Mon Sep 17 00:00:00 2001 From: Alex <32290337+ahoisl@users.noreply.github.com> Date: Mon, 20 Dec 2021 13:24:37 +0100 Subject: [PATCH] Fix/lint constructor overloads (#3231) --- .changeset/gentle-weeks-rescue.md | 5 +++++ .../__tests__/missing-make-observable.js | 13 +++++++++++++ .../src/missing-make-observable.js | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .changeset/gentle-weeks-rescue.md diff --git a/.changeset/gentle-weeks-rescue.md b/.changeset/gentle-weeks-rescue.md new file mode 100644 index 000000000..fdae45e67 --- /dev/null +++ b/.changeset/gentle-weeks-rescue.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-mobx": patch +--- + +fix(lint): fix 'missing-make-observable' rule with constructor overloads diff --git a/packages/eslint-plugin-mobx/__tests__/missing-make-observable.js b/packages/eslint-plugin-mobx/__tests__/missing-make-observable.js index be99cf2c3..fe3abacd6 100644 --- a/packages/eslint-plugin-mobx/__tests__/missing-make-observable.js +++ b/packages/eslint-plugin-mobx/__tests__/missing-make-observable.js @@ -56,6 +56,18 @@ class C { } `).map(code => ({ code })) +const valid4 = fields.map(field => ` +class C { + ${field} + + constructor(aString: string); + constructor(aNum: number); + constructor(stringOrNum: string | number) { + makeObservable(this, null, { name: 'foo' }) + } +} +`).map(code => ({ code })) + const invalid1 = fields.map(field => ({ code: ` class C { @@ -152,6 +164,7 @@ tester.run("missing-make-observable", rule, { ...valid1, valid2, ...valid3, + ...valid4, ], invalid: [ ...invalid1, diff --git a/packages/eslint-plugin-mobx/src/missing-make-observable.js b/packages/eslint-plugin-mobx/src/missing-make-observable.js index 59fe094c6..45d40ca78 100644 --- a/packages/eslint-plugin-mobx/src/missing-make-observable.js +++ b/packages/eslint-plugin-mobx/src/missing-make-observable.js @@ -11,7 +11,8 @@ function create(context) { const clazz = findAncestor(decorator, node => node.type === 'ClassDeclaration' || node.type === 'ClassExpression'); if (!clazz) return; // ClassDeclaration > ClassBody > [] - const constructor = clazz.body.body.find(node => node.kind === 'constructor'); + const constructor = clazz.body.body.find(node => node.kind === 'constructor' && node.value.type === 'FunctionExpression') ?? + clazz.body.body.find(node => node.kind === 'constructor'); // MethodDefinition > FunctionExpression > BlockStatement > [] const isMakeObservable = node => node.expression?.callee?.name === 'makeObservable' && node.expression?.arguments[0]?.type === 'ThisExpression'; const makeObservable = constructor?.value.body?.body.find(isMakeObservable)?.expression;