eslint-plugin-vue
Version:
Official ESLint plugin for Vue.js
86 lines (83 loc) • 2.89 kB
JavaScript
;
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();
}
});