|
"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]); |
|
} |
|
} |
|
} |
|
}; |
|
} |
|
}); |
|
|