UNPKG

eslint-plugin-vue

Version:

Official ESLint plugin for Vue.js

86 lines (83 loc) 2.89 kB
'use strict'; const require_runtime = require('../_virtual/_rolldown/runtime.js'); const require_index = require('../utils/index.js'); //#region lib/rules/first-attribute-linebreak.js /** * @fileoverview Enforce the location of first attribute * @author Yosuke Ota */ var require_first_attribute_linebreak = /* @__PURE__ */ require_runtime.__commonJSMin(((exports, module) => { const utils = require_index.default; module.exports = { meta: { type: "layout", docs: { description: "enforce the location of first attribute", categories: ["vue3-strongly-recommended", "vue2-strongly-recommended"], url: "https://eslint.vuejs.org/rules/first-attribute-linebreak.html" }, fixable: "whitespace", schema: [{ type: "object", properties: { multiline: { enum: [ "below", "beside", "ignore" ] }, singleline: { enum: [ "below", "beside", "ignore" ] } }, additionalProperties: false }], messages: { expected: "Expected a linebreak before this attribute.", unexpected: "Expected no linebreak before this attribute." } }, create(context) { /** @type {"below" | "beside" | "ignore"} */ const singleline = context.options[0] && context.options[0].singleline || "ignore"; /** @type {"below" | "beside" | "ignore"} */ const multiline = context.options[0] && context.options[0].multiline || "below"; const sourceCode = context.sourceCode; const template = sourceCode.parserServices.getTemplateBodyTokenStore && sourceCode.parserServices.getTemplateBodyTokenStore(); /** * Report attribute * @param {VAttribute | VDirective} firstAttribute * @param { "below" | "beside"} location */ function report(firstAttribute, location) { context.report({ node: firstAttribute, messageId: location === "beside" ? "unexpected" : "expected", fix(fixer) { const prevToken = template.getTokenBefore(firstAttribute, { includeComments: true }); return fixer.replaceTextRange([prevToken.range[1], firstAttribute.range[0]], location === "beside" ? " " : "\n"); } }); } return utils.defineTemplateBodyVisitor(context, { VStartTag(node) { const firstAttribute = node.attributes[0]; const lastAttribute = node.attributes.at(-1); if (!firstAttribute || !lastAttribute) return; const location = firstAttribute.loc.start.line === lastAttribute.loc.end.line ? singleline : multiline; if (location === "ignore") return; if (location === "beside") { if (node.loc.start.line === firstAttribute.loc.start.line) return; } else if (node.loc.start.line < firstAttribute.loc.start.line) return; report(firstAttribute, location); } }); } }; })); //#endregion Object.defineProperty(exports, 'default', { enumerable: true, get: function () { return require_first_attribute_linebreak(); } });