eslint-plugin-canonical
Version:
Canonical linting rules for ESLint.
155 lines (154 loc) • 7.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utilities_1 = require("../utilities");
exports.default = (0, utilities_1.createRule)({
create(context, [{ allowAllPropertiesOnSameLine }]) {
var _a;
const messageId = allowAllPropertiesOnSameLine
? 'propertiesOnNewlineAll'
: 'propertiesOnNewline';
const sourceCode = (_a = context.sourceCode) !== null && _a !== void 0 ? _a : context.getSourceCode();
return {
ArrayPattern: (node) => {
if (allowAllPropertiesOnSameLine && node.elements.length > 1) {
const firstToken = node.elements[0];
const lastToken = node.elements[node.elements.length - 1];
if (firstToken === null) {
return;
}
if (lastToken === null) {
return;
}
const firstTokenOfFirstProperty = sourceCode.getFirstToken(firstToken);
const lastTokenOfLastProperty = sourceCode.getLastToken(lastToken);
if (firstTokenOfFirstProperty === null) {
return;
}
if (lastTokenOfLastProperty === null) {
return;
}
if (firstTokenOfFirstProperty.loc.end.line ===
lastTokenOfLastProperty.loc.start.line) {
// All keys and values are on the same line
return;
}
}
for (let index = 1; index < node.elements.length; index++) {
const currentNode = node.elements[index];
const previousNode = node.elements[index - 1];
if (currentNode === null || previousNode === null) {
continue;
}
const lastTokenOfPreviousProperty = sourceCode.getLastToken(previousNode);
const firstTokenOfCurrentProperty = sourceCode.getFirstToken(currentNode);
if (lastTokenOfPreviousProperty === null ||
firstTokenOfCurrentProperty === null) {
continue;
}
if (lastTokenOfPreviousProperty.loc.end.line ===
firstTokenOfCurrentProperty.loc.start.line) {
context.report({
fix(fixer) {
const comma = sourceCode.getTokenBefore(firstTokenOfCurrentProperty);
if (comma === null) {
return null;
}
const rangeAfterComma = [
comma.range[1],
firstTokenOfCurrentProperty.range[0],
];
// Don't perform a fix if there are any comments between the comma and the next property.
if (sourceCode.text
.slice(rangeAfterComma[0], rangeAfterComma[1])
.trim()) {
return null;
}
return fixer.replaceTextRange(rangeAfterComma, '\n');
},
loc: firstTokenOfCurrentProperty.loc,
messageId,
node,
});
}
}
},
ObjectPattern: (node) => {
if (allowAllPropertiesOnSameLine && node.properties.length > 1) {
const firstTokenOfFirstProperty = sourceCode.getFirstToken(node.properties[0]);
const lastTokenOfLastProperty = sourceCode.getLastToken(node.properties[node.properties.length - 1]);
if (firstTokenOfFirstProperty === null ||
lastTokenOfLastProperty === null) {
return;
}
if (firstTokenOfFirstProperty.loc.end.line ===
lastTokenOfLastProperty.loc.start.line) {
// All keys and values are on the same line
return;
}
}
for (let index = 1; index < node.properties.length; index++) {
const lastTokenOfPreviousProperty = sourceCode.getLastToken(node.properties[index - 1]);
const firstTokenOfCurrentProperty = sourceCode.getFirstToken(node.properties[index]);
if (lastTokenOfPreviousProperty === null ||
firstTokenOfCurrentProperty === null) {
return;
}
if (lastTokenOfPreviousProperty.loc.end.line ===
firstTokenOfCurrentProperty.loc.start.line) {
context.report({
fix(fixer) {
const comma = sourceCode.getTokenBefore(firstTokenOfCurrentProperty);
if (comma === null) {
return null;
}
const rangeAfterComma = [
comma.range[1],
firstTokenOfCurrentProperty.range[0],
];
// Don't perform a fix if there are any comments between the comma and the next property.
if (sourceCode.text
.slice(rangeAfterComma[0], rangeAfterComma[1])
.trim()) {
return null;
}
return fixer.replaceTextRange(rangeAfterComma, '\n');
},
loc: firstTokenOfCurrentProperty.loc,
messageId,
node,
});
}
}
},
};
},
defaultOptions: [
{
allowAllPropertiesOnSameLine: false,
},
],
meta: {
docs: {
description: 'Like `object-property-newline`, but for destructuring.',
},
fixable: 'whitespace',
messages: {
propertiesOnNewline: 'Destructuring properties must go on a new line.',
propertiesOnNewlineAll: "Destructuring properties must go on a new line if they aren't all on the same line.",
},
schema: [
{
additionalProperties: false,
properties: {
allowAllPropertiesOnSameLine: {
default: false,
type: 'boolean',
},
},
type: 'object',
},
],
type: 'layout',
},
name: 'destructuring-property-newline',
});