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.' + } + ] } ] })