From 4731853f8de8648c8217b5f17641a0262aec3e50 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Fri, 2 Feb 2024 17:30:18 +0900 Subject: [PATCH 1/3] wip --- lib/rules/syntaxes/slot-attribute.js | 22 ++++++++++++---- lib/rules/syntaxes/slot-scope-attribute.js | 13 ++++++++-- .../syntaxes/utils/can-convert-to-v-slot.js | 3 --- .../lib/rules/no-deprecated-slot-attribute.js | 26 ++++++++++++++++--- .../no-deprecated-slot-scope-attribute.js | 7 ++++- 5 files changed, 57 insertions(+), 14 deletions(-) diff --git a/lib/rules/syntaxes/slot-attribute.js b/lib/rules/syntaxes/slot-attribute.js index a96998175..7b0a10685 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..7a0e24192 100644 --- a/lib/rules/syntaxes/slot-scope-attribute.js +++ b/lib/rules/syntaxes/slot-scope-attribute.js @@ -62,16 +62,25 @@ 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 { + return [ + fixer.remove(scopeAttr), + 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..b77438dab 100644 --- a/tests/lib/rules/no-deprecated-slot-scope-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-scope-attribute.js @@ -98,7 +98,12 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { `, - output: null, + output: ` + `, errors: [ { message: '`slot-scope` are deprecated.', From fc535db0191f50b33d3ccc3296402d4348e65fd2 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Fri, 2 Feb 2024 18:45:28 +0900 Subject: [PATCH 2/3] wip --- lib/rules/syntaxes/slot-attribute.js | 4 ++-- lib/rules/syntaxes/slot-scope-attribute.js | 18 ++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/rules/syntaxes/slot-attribute.js b/lib/rules/syntaxes/slot-attribute.js index 7b0a10685..61891df3b 100644 --- a/lib/rules/syntaxes/slot-attribute.js +++ b/lib/rules/syntaxes/slot-attribute.js @@ -90,14 +90,14 @@ module.exports = { const replaceText = `v-slot${nameArgument}${scopeValue}` - const element = startTag.parent; + 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); + yield fixer.remove(slotAttr || scopeAttr) if (slotAttr && scopeAttr) { yield fixer.remove(scopeAttr) } diff --git a/lib/rules/syntaxes/slot-scope-attribute.js b/lib/rules/syntaxes/slot-scope-attribute.js index 7a0e24192..dd60cdd03 100644 --- a/lib/rules/syntaxes/slot-scope-attribute.js +++ b/lib/rules/syntaxes/slot-scope-attribute.js @@ -65,22 +65,20 @@ module.exports = { * @returns {Fix[]} fix data */ function fixSlotScopeToVSlot(fixer, scopeAttr) { - const element = scopeAttr.parent.parent; + const element = scopeAttr.parent.parent const scopeValue = scopeAttr && scopeAttr.value ? `=${sourceCode.getText(scopeAttr.value)}` : '' const replaceText = `v-slot${scopeValue}` - if (element.name === 'template') { - return [fixer.replaceText(scopeAttr, replaceText)] - } else { - return [ - fixer.remove(scopeAttr), - fixer.insertTextBefore(element, ``), - ]; - } + return element.name === 'template' + ? [fixer.replaceText(scopeAttr, replaceText)] + : [ + fixer.remove(scopeAttr), + fixer.insertTextBefore(element, ``) + ] } /** * Reports `slot-scope` node From d1855f8899382dd4657d9b6905b95a668891b2d0 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Fri, 2 Feb 2024 21:21:04 +0900 Subject: [PATCH 3/3] wip --- lib/rules/syntaxes/slot-scope-attribute.js | 17 ++++++++++------- .../rules/no-deprecated-slot-scope-attribute.js | 3 +-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/rules/syntaxes/slot-scope-attribute.js b/lib/rules/syntaxes/slot-scope-attribute.js index dd60cdd03..5f8070498 100644 --- a/lib/rules/syntaxes/slot-scope-attribute.js +++ b/lib/rules/syntaxes/slot-scope-attribute.js @@ -72,13 +72,16 @@ module.exports = { : '' const replaceText = `v-slot${scopeValue}` - return element.name === 'template' - ? [fixer.replaceText(scopeAttr, replaceText)] - : [ - fixer.remove(scopeAttr), - fixer.insertTextBefore(element, ``) - ] + 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/tests/lib/rules/no-deprecated-slot-scope-attribute.js b/tests/lib/rules/no-deprecated-slot-scope-attribute.js index b77438dab..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: `