routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+124
@@ -0,0 +1,124 @@
|
||||
'use strict';
|
||||
|
||||
const require_runtime = require('../_virtual/_rolldown/runtime.js');
|
||||
const require_index = require('../utils/index.js');
|
||||
|
||||
//#region lib/rules/max-attributes-per-line.js
|
||||
/**
|
||||
* @fileoverview Define the number of attributes allows per line
|
||||
* @author Filipa Lacerda
|
||||
*/
|
||||
var require_max_attributes_per_line = /* @__PURE__ */ require_runtime.__commonJSMin(((exports, module) => {
|
||||
const utils = require_index.default;
|
||||
/**
|
||||
* @param {any} options
|
||||
*/
|
||||
function parseOptions(options) {
|
||||
const defaults = {
|
||||
singleline: 1,
|
||||
multiline: 1
|
||||
};
|
||||
if (options) {
|
||||
if (typeof options.singleline === "number") defaults.singleline = options.singleline;
|
||||
else if (typeof options.singleline === "object" && typeof options.singleline.max === "number") defaults.singleline = options.singleline.max;
|
||||
if (options.multiline) {
|
||||
if (typeof options.multiline === "number") defaults.multiline = options.multiline;
|
||||
else if (typeof options.multiline === "object" && typeof options.multiline.max === "number") defaults.multiline = options.multiline.max;
|
||||
}
|
||||
}
|
||||
return defaults;
|
||||
}
|
||||
/**
|
||||
* @param {(VDirective | VAttribute)[]} attributes
|
||||
*/
|
||||
function groupAttrsByLine(attributes) {
|
||||
const propsPerLine = [[attributes[0]]];
|
||||
for (let index = 1; index < attributes.length; index++) {
|
||||
const previous = attributes[index - 1];
|
||||
const current = attributes[index];
|
||||
if (previous.loc.end.line === current.loc.start.line) propsPerLine.at(-1).push(current);
|
||||
else propsPerLine.push([current]);
|
||||
}
|
||||
return propsPerLine;
|
||||
}
|
||||
module.exports = {
|
||||
meta: {
|
||||
type: "layout",
|
||||
docs: {
|
||||
description: "enforce the maximum number of attributes per line",
|
||||
categories: ["vue3-strongly-recommended", "vue2-strongly-recommended"],
|
||||
url: "https://eslint.vuejs.org/rules/max-attributes-per-line.html"
|
||||
},
|
||||
fixable: "whitespace",
|
||||
schema: [{
|
||||
type: "object",
|
||||
properties: {
|
||||
singleline: { oneOf: [{
|
||||
type: "number",
|
||||
minimum: 1
|
||||
}, {
|
||||
type: "object",
|
||||
properties: { max: {
|
||||
type: "number",
|
||||
minimum: 1
|
||||
} },
|
||||
additionalProperties: false
|
||||
}] },
|
||||
multiline: { oneOf: [{
|
||||
type: "number",
|
||||
minimum: 1
|
||||
}, {
|
||||
type: "object",
|
||||
properties: { max: {
|
||||
type: "number",
|
||||
minimum: 1
|
||||
} },
|
||||
additionalProperties: false
|
||||
}] }
|
||||
},
|
||||
additionalProperties: false
|
||||
}],
|
||||
messages: { shouldBeOnNewLine: "'{{name}}' should be on a new line." }
|
||||
},
|
||||
create(context) {
|
||||
const sourceCode = context.sourceCode;
|
||||
const configuration = parseOptions(context.options[0]);
|
||||
const multilineMaximum = configuration.multiline;
|
||||
const singlelinemMaximum = configuration.singleline;
|
||||
const template = sourceCode.parserServices.getTemplateBodyTokenStore && sourceCode.parserServices.getTemplateBodyTokenStore();
|
||||
return utils.defineTemplateBodyVisitor(context, { VStartTag(node) {
|
||||
const numberOfAttributes = node.attributes.length;
|
||||
if (!numberOfAttributes) return;
|
||||
if (utils.isSingleLine(node) && numberOfAttributes > singlelinemMaximum) showErrors(node.attributes.slice(singlelinemMaximum));
|
||||
if (!utils.isSingleLine(node)) {
|
||||
for (const attrs of groupAttrsByLine(node.attributes)) if (attrs.length > multilineMaximum) showErrors(attrs.splice(multilineMaximum));
|
||||
}
|
||||
} });
|
||||
/**
|
||||
* @param {(VDirective | VAttribute)[]} attributes
|
||||
*/
|
||||
function showErrors(attributes) {
|
||||
for (const [i, prop] of attributes.entries()) context.report({
|
||||
node: prop,
|
||||
loc: prop.loc,
|
||||
messageId: "shouldBeOnNewLine",
|
||||
data: { name: sourceCode.getText(prop.key) },
|
||||
fix(fixer) {
|
||||
if (i !== 0) return null;
|
||||
/** @type {Range} */
|
||||
const range = [template.getTokenBefore(prop, { filter: (token) => token.type !== "HTMLWhitespace" }).range[1], prop.range[0]];
|
||||
return fixer.replaceTextRange(range, "\n");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
}));
|
||||
|
||||
//#endregion
|
||||
Object.defineProperty(exports, 'default', {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return require_max_attributes_per_line();
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user