diff --git a/lib/rules/syntaxes/slot-attribute.js b/lib/rules/syntaxes/slot-attribute.js index a96998175..61891df3b 100644 --- a/lib/rules/syntaxes/slot-attribute.js +++ b/lib/rules/syntaxes/slot-attribute.js @@ -71,8 +71,8 @@ module.exports = { * @returns {IterableIterator} fix data */ function* fixSlotToVSlot(fixer, slotAttr, slotName, vBind) { - const element = slotAttr.parent - const scopeAttr = element.attributes.find( + const startTag = slotAttr.parent + const scopeAttr = startTag.attributes.find( (attr) => attr.directive === true && attr.key.name && @@ -89,9 +89,21 @@ module.exports = { : '' const replaceText = `v-slot${nameArgument}${scopeValue}` - yield fixer.replaceText(slotAttr || scopeAttr, replaceText) - if (slotAttr && scopeAttr) { - yield fixer.remove(scopeAttr) + + const element = startTag.parent + if (element.name === 'template') { + yield fixer.replaceText(slotAttr || scopeAttr, replaceText) + if (slotAttr && scopeAttr) { + yield fixer.remove(scopeAttr) + } + } else { + yield fixer.remove(slotAttr || scopeAttr) + if (slotAttr && scopeAttr) { + yield fixer.remove(scopeAttr) + } + + yield fixer.insertTextBefore(element, ``) } } /** diff --git a/lib/rules/syntaxes/slot-scope-attribute.js b/lib/rules/syntaxes/slot-scope-attribute.js index 7332c5b7d..5f8070498 100644 --- a/lib/rules/syntaxes/slot-scope-attribute.js +++ b/lib/rules/syntaxes/slot-scope-attribute.js @@ -62,16 +62,26 @@ module.exports = { * Convert to `v-slot`. * @param {RuleFixer} fixer fixer * @param {VDirective} scopeAttr node of `slot-scope` - * @returns {Fix} fix data + * @returns {Fix[]} fix data */ function fixSlotScopeToVSlot(fixer, scopeAttr) { + const element = scopeAttr.parent.parent const scopeValue = scopeAttr && scopeAttr.value ? `=${sourceCode.getText(scopeAttr.value)}` : '' const replaceText = `v-slot${scopeValue}` - return fixer.replaceText(scopeAttr, replaceText) + if (element.name === 'template') { + return [fixer.replaceText(scopeAttr, replaceText)] + } else { + const tokenBefore = tokenStore.getTokenBefore(scopeAttr) + return [ + fixer.removeRange([tokenBefore.range[1], scopeAttr.range[1]]), + fixer.insertTextBefore(element, ``) + ] + } } /** * Reports `slot-scope` node diff --git a/lib/rules/syntaxes/utils/can-convert-to-v-slot.js b/lib/rules/syntaxes/utils/can-convert-to-v-slot.js index 69c26cf43..f4e667783 100644 --- a/lib/rules/syntaxes/utils/can-convert-to-v-slot.js +++ b/lib/rules/syntaxes/utils/can-convert-to-v-slot.js @@ -25,9 +25,6 @@ const utils = require('../../../utils') * @param {ParserServices.TokenStore} tokenStore */ module.exports = function canConvertToVSlot(element, sourceCode, tokenStore) { - if (element.name !== 'template') { - return false - } const ownerElement = element.parent if ( ownerElement.type === 'VDocumentFragment' || diff --git a/tests/lib/rules/no-deprecated-slot-attribute.js b/tests/lib/rules/no-deprecated-slot-attribute.js index 324983444..51d109358 100644 --- a/tests/lib/rules/no-deprecated-slot-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-attribute.js @@ -335,7 +335,12 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - output: null, + output: ` + `, errors: [ { message: '`slot` attributes are deprecated.', @@ -350,7 +355,12 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - output: null, + output: ` + `, errors: [ { message: '`slot` attributes are deprecated.', @@ -616,7 +626,17 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - output: null, + output: ` + `, options: [ { ignore: ['one'] diff --git a/tests/lib/rules/no-deprecated-slot-scope-attribute.js b/tests/lib/rules/no-deprecated-slot-scope-attribute.js index dccc46a0c..078f004ef 100644 --- a/tests/lib/rules/no-deprecated-slot-scope-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-scope-attribute.js @@ -90,7 +90,6 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { } ] }, - // cannot fix { code: ` `, - output: null, + output: ` + `, errors: [ { message: '`slot-scope` are deprecated.',