| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | /** * @author Toru Nagashima * @copyright 2017 Toru Nagashima. All rights reserved. * See LICENSE file in root directory for full license. */'use strict'// ------------------------------------------------------------------------------// Requirements// ------------------------------------------------------------------------------const utils = require('../utils')// ------------------------------------------------------------------------------// Helpers// ------------------------------------------------------------------------------/** * Get the name of the given attribute node. * @param {ASTNode} attribute The attribute node to get. * @returns {string} The name of the attribute. */function getName (attribute) {  if (!attribute.directive) {    return attribute.key.name  }  if (attribute.key.name === 'bind') {    return attribute.key.argument || null  }  return null}// ------------------------------------------------------------------------------// Rule Definition// ------------------------------------------------------------------------------module.exports = {  meta: {    docs: {      description: 'disallow duplication of attributes',      category: 'essential',      url: 'https://github.com/vuejs/eslint-plugin-vue/blob/v4.7.1/docs/rules/no-duplicate-attributes.md'    },    fixable: null,    schema: [      {        type: 'object',        properties: {          allowCoexistClass: {            type: 'boolean'          },          allowCoexistStyle: {            type: 'boolean'          }        }      }    ]  },  create (context) {    const options = context.options[0] || {}    const allowCoexistStyle = options.allowCoexistStyle !== false    const allowCoexistClass = options.allowCoexistClass !== false    const directiveNames = new Set()    const attributeNames = new Set()    function isDuplicate (name, isDirective) {      if ((allowCoexistStyle && name === 'style') || (allowCoexistClass && name === 'class')) {        return isDirective ? directiveNames.has(name) : attributeNames.has(name)      }      return directiveNames.has(name) || attributeNames.has(name)    }    return utils.defineTemplateBodyVisitor(context, {      'VStartTag' () {        directiveNames.clear()        attributeNames.clear()      },      'VAttribute' (node) {        const name = getName(node)        if (name == null) {          return        }        if (isDuplicate(name, node.directive)) {          context.report({            node,            loc: node.loc,            message: "Duplicate attribute '{{name}}'.",            data: { name }          })        }        if (node.directive) {          directiveNames.add(name)        } else {          attributeNames.add(name)        }      }    })  }}
 |