|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /**
- * @fileoverview Rule to enforce placing object properties on separate lines.
- * @author Vitor Balocco
- */
-
- "use strict";
-
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
-
- module.exports = {
- meta: {
- type: "layout",
-
- docs: {
- description: "enforce placing object properties on separate lines",
- category: "Stylistic Issues",
- recommended: false,
- url: "https://eslint.org/docs/rules/object-property-newline"
- },
-
- schema: [
- {
- type: "object",
- properties: {
- allowAllPropertiesOnSameLine: {
- type: "boolean",
- default: false
- },
- allowMultiplePropertiesPerLine: { // Deprecated
- type: "boolean",
- default: false
- }
- },
- additionalProperties: false
- }
- ],
-
- fixable: "whitespace",
-
- messages: {
- propertiesOnNewlineAll: "Object properties must go on a new line if they aren't all on the same line.",
- propertiesOnNewline: "Object properties must go on a new line."
- }
- },
-
- create(context) {
- const allowSameLine = context.options[0] && (
- (context.options[0].allowAllPropertiesOnSameLine || context.options[0].allowMultiplePropertiesPerLine /* Deprecated */)
- );
- const messageId = allowSameLine
- ? "propertiesOnNewlineAll"
- : "propertiesOnNewline";
-
- const sourceCode = context.getSourceCode();
-
- return {
- ObjectExpression(node) {
- if (allowSameLine) {
- if (node.properties.length > 1) {
- const firstTokenOfFirstProperty = sourceCode.getFirstToken(node.properties[0]);
- const lastTokenOfLastProperty = sourceCode.getLastToken(node.properties[node.properties.length - 1]);
-
- if (firstTokenOfFirstProperty.loc.end.line === lastTokenOfLastProperty.loc.start.line) {
-
- // All keys and values are on the same line
- return;
- }
- }
- }
-
- for (let i = 1; i < node.properties.length; i++) {
- const lastTokenOfPreviousProperty = sourceCode.getLastToken(node.properties[i - 1]);
- const firstTokenOfCurrentProperty = sourceCode.getFirstToken(node.properties[i]);
-
- if (lastTokenOfPreviousProperty.loc.end.line === firstTokenOfCurrentProperty.loc.start.line) {
- context.report({
- node,
- loc: firstTokenOfCurrentProperty.loc,
- messageId,
- fix(fixer) {
- const comma = sourceCode.getTokenBefore(firstTokenOfCurrentProperty);
- 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");
- }
- });
- }
- }
- }
- };
- }
- };
|