"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("../utils"); const compat_1 = require("../utils/compat"); function isSingleLine(node) { return node.loc.start.line === node.loc.end.line; } function groupAttributesByLine(attributes) { const group = []; for (const attr of attributes) { if (group[0]?.[0]?.loc.end.line === attr.loc.start.line) { group[0].push(attr); } else { group.unshift([attr]); } } return group.reverse(); } exports.default = (0, utils_1.createRule)('max-attributes-per-line', { meta: { docs: { description: 'enforce the maximum number of attributes per line', category: 'Stylistic Issues', recommended: false, conflictWithPrettier: true }, fixable: 'whitespace', schema: [ { type: 'object', properties: { multiline: { type: 'number', minimum: 1 }, singleline: { type: 'number', minimum: 1 } }, additionalProperties: false } ], messages: { requireNewline: "'{{name}}' should be on a new line." }, type: 'layout' }, create(context) { const multilineMaximum = context.options[0]?.multiline ?? 1; const singlelineMaximum = context.options[0]?.singleline ?? 1; const sourceCode = (0, compat_1.getSourceCode)(context); function report(attribute) { if (!attribute) { return; } let name; if (attribute.type === 'SvelteAttribute' || attribute.type === 'SvelteShorthandAttribute' || attribute.type === 'SvelteDirective' || attribute.type === 'SvelteStyleDirective' || attribute.type === 'SvelteSpecialDirective') { name = sourceCode.text.slice(...attribute.key.range); } else { name = sourceCode.text.slice(...attribute.range); } context.report({ node: attribute, loc: attribute.loc, messageId: 'requireNewline', data: { name }, fix(fixer) { const prevToken = sourceCode.getTokenBefore(attribute, { includeComments: true }); const range = [prevToken.range[1], attribute.range[0]]; return fixer.replaceTextRange(range, '\n'); } }); } return { SvelteStartTag(node) { const numberOfAttributes = node.attributes.length; if (!numberOfAttributes) return; if (isSingleLine(node)) { if (numberOfAttributes > singlelineMaximum) { report(node.attributes[singlelineMaximum]); } } else { for (const attrs of groupAttributesByLine(node.attributes)) { report(attrs[multilineMaximum]); } } } }; } });