create()

in src/dispatch/static/dispatch/eslint-local-rules.js [555:651]


    create(context) {
      return context.parserServices.defineTemplateBodyVisitor({
        'VElement[name="v-list-item"]'(node) {
          if (
            node.startTag.attributes.some((attr) => attr.directive && attr.key.name.name === "slot")
          ) {
            return
          }

          const prepend = []
          const append = []
          let inContent = false
          let reachedContent = false
          let fixable = true
          for (const child of node.children) {
            if (child.type !== "VElement") {
              if (child.type === "VText" && !child.value.trim()) continue
              else {
                fixable = false
                break
              }
            } else if (
              ["v-list-item-title", "v-list-item-subtitle", "v-list-item-content"].includes(
                child.name
              )
            ) {
              if (reachedContent && !inContent) {
                fixable = false
                break
              }
              inContent = true
              reachedContent = true
            } else if (
              ["v-list-item-avatar", "v-list-item-icon", "v-list-item-action"].includes(child.name)
            ) {
              inContent = false
              if (child.startTag.attributes.length && child.name !== "v-list-item-avatar") {
                fixable = false
                break
              }
              if (reachedContent) {
                append.push(child)
              } else {
                prepend.push(child)
              }
            } else {
              fixable = false
              break
            }
          }

          if (prepend.length || append.length) {
            context.report({
              node,
              message: "move list item children into slots",
              *fix(fixer) {
                if (!fixable) return

                function stringifyChildren(children) {
                  return children
                    .flatMap((child) => {
                      if (child.name === "v-list-item-avatar") {
                        return context.sourceCode
                          .getText(child)
                          .replace(/<v-list-item-avatar(\s|>)/, "<v-avatar$1")
                          .replace("</v-list-item-avatar>", "</v-avatar>")
                      }
                      return child.children.map((v) => context.sourceCode.getText(v).trim())
                    })
                    .join("\n")
                }

                for (const child of prepend) {
                  yield fixer.remove(child)
                }
                for (const child of append) {
                  yield fixer.remove(child)
                }

                if (prepend.length) {
                  yield fixer.insertTextAfter(
                    node.startTag,
                    `<template #prepend>${stringifyChildren(prepend)}</template>`
                  )
                }
                if (append.length) {
                  yield fixer.insertTextBefore(
                    node.endTag,
                    `<template #append>${stringifyChildren(append)}</template>`
                  )
                }
              },
            })
          }
        },
      })
    },