From fbd1338d6348fa834ff26e2d2fe7cd12d6128b30 Mon Sep 17 00:00:00 2001 From: Sander de Winter Date: Tue, 25 Jun 2024 09:39:42 +0200 Subject: [PATCH] fix(require-explicit-slots): Add support for type reference --- lib/rules/require-explicit-slots.js | 27 ++++++++ tests/lib/rules/require-explicit-slots.js | 79 +++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/lib/rules/require-explicit-slots.js b/lib/rules/require-explicit-slots.js index 0ae77b597..bde61081a 100644 --- a/lib/rules/require-explicit-slots.js +++ b/lib/rules/require-explicit-slots.js @@ -5,6 +5,7 @@ 'use strict' const utils = require('../utils') +const { getComponentPropsFromTypeDefine } = require('../utils/ts-utils') /** * @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TypeNode @@ -95,6 +96,32 @@ module.exports = { slotsDefined.add(slotName) } } + } else if ( + param.type === 'TSTypeReference' && + param.typeName.type === 'Identifier' + ) { + const componentPropsFromTypeDefine = + getComponentPropsFromTypeDefine(context, typeArguments?.params[0]) + + for (const memberNode of componentPropsFromTypeDefine) { + const slotName = memberNode.propName + + if (!slotName || !memberNode.node) { + continue + } + + if (slotsDefined.has(slotName)) { + context.report({ + node: memberNode.node, + messageId: 'alreadyDefinedSlot', + data: { + slotName + } + }) + } else { + slotsDefined.add(slotName) + } + } } } }), diff --git a/tests/lib/rules/require-explicit-slots.js b/tests/lib/rules/require-explicit-slots.js index ebbc28818..3129b587e 100644 --- a/tests/lib/rules/require-explicit-slots.js +++ b/tests/lib/rules/require-explicit-slots.js @@ -160,6 +160,36 @@ tester.run('require-explicit-slots', rule, { parser: null } } + }, + { + filename: 'test.vue', + code: ` + + ` + }, + { + filename: 'test.vue', + code: ` + + ` } ], invalid: [ @@ -333,6 +363,55 @@ tester.run('require-explicit-slots', rule, { message: 'Slot foo is already defined.' } ] + }, + { + filename: 'test.vue', + code: ` + + `, + errors: [ + { + message: 'Slot default is already defined.' + } + ] + }, + { + filename: 'test.vue', + code: ` + + `, + errors: [ + { + message: 'Slot default is already defined.' + }, + { + message: 'Slot foo is already defined.' + } + ] } ] })