123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /**
- * @author Yosuke Ota
- * See LICENSE file in root directory for full license.
- */
- 'use strict'
- module.exports = {
- deprecated: '2.6.0',
- supported: '2.5.0',
- createTemplateBodyVisitor (context, { fixToUpgrade } = {}) {
- const sourceCode = context.getSourceCode()
- /**
- * Checks whether the given node can convert to the `v-slot`.
- * @param {VStartTag} startTag node of `<element v-slot ... >`
- * @returns {boolean} `true` if the given node can convert to the `v-slot`
- */
- function canConvertToVSlot (startTag) {
- if (startTag.parent.name !== 'template') {
- return false
- }
- const slotAttr = startTag.attributes
- .find(attr => attr.directive === false && attr.key.name === 'slot')
- if (slotAttr) {
- // if the element have `slot` it can not be converted.
- // Conversion of `slot` is done with `vue/no-deprecated-slot-attribute`.
- return false
- }
- const vBindSlotAttr = startTag.attributes
- .find(attr =>
- attr.directive === true &&
- attr.key.name.name === 'bind' &&
- attr.key.argument &&
- attr.key.argument.name === 'slot')
- if (vBindSlotAttr) {
- // if the element have `v-bind:slot` it can not be converted.
- // Conversion of `v-bind:slot` is done with `vue/no-deprecated-slot-attribute`.
- return false
- }
- return true
- }
- /**
- * Convert to `v-slot`.
- * @param {object} fixer fixer
- * @param {VAttribute | null} scopeAttr node of `slot-scope`
- * @returns {*} fix data
- */
- function fixSlotScopeToVSlot (fixer, scopeAttr) {
- const scopeValue = scopeAttr && scopeAttr.value
- ? `=${sourceCode.getText(scopeAttr.value)}`
- : ''
- const replaceText = `v-slot${scopeValue}`
- return fixer.replaceText(scopeAttr, replaceText)
- }
- /**
- * Reports `slot-scope` node
- * @param {VAttribute} scopeAttr node of `slot-scope`
- * @returns {void}
- */
- function reportSlotScope (scopeAttr) {
- context.report({
- node: scopeAttr.key,
- messageId: 'forbiddenSlotScopeAttribute',
- fix: fixToUpgrade
- // fix to use `v-slot`
- ? (fixer) => {
- const startTag = scopeAttr.parent
- if (!canConvertToVSlot(startTag)) {
- return null
- }
- return fixSlotScopeToVSlot(fixer, scopeAttr)
- }
- : null
- })
- }
- return {
- "VAttribute[directive=true][key.name.name='slot-scope']": reportSlotScope
- }
- }
- }
|