feat: added singleAttributePerLine option (#5501) (#6644)

This commit is contained in:
Jere Kankaanranta authored and GitHub committed 2021-12-02 11:46:11 +03:00
1 parent 16b6825172
commit 0e42acb49b
19 files changed
+594 -5

No files matched your search

+17 -2
View File
@@ -388,8 +388,8 @@ Whether or not to indent the code inside `<script>` and `<style>` tags in Vue fi
Valid options:
- `"false"` - Do not indent script and style tags in Vue files.
- `"true"` - Indent script and style tags in Vue files.
- `false` - Do not indent script and style tags in Vue files.
- `true` - Indent script and style tags in Vue files.
| Default | CLI Override | API Override |
| ------- | ------------------------------- | --------------------------------- |
@@ -451,3 +451,18 @@ Valid options:
| Default | CLI Override | API Override |
| -------- | ------------------------------------ | ----------------------------------- |
| `"auto"` | `--embedded-language-formatting=off` | `embeddedLanguageFormatting: "off"` |
## Single Attribute Per Line
_First available in v2.3.3_
Enforce single attribute per line in HTML, Vue and JSX.
Valid options:
- `false` - Do not enforce single attribute per line.
- `true` - Enforce single attribute per line.
| Default | CLI Override | API Override |
| ------- | ----------------------------- | -------------------------------- |
| `false` | `--single-attribute-per-line` | `singleAttributePerLine: <bool>` |
+7
View File
@@ -54,4 +54,11 @@ module.exports = {
description:
"Put > of opening tags on the last line instead of on a new line.",
},
singleAttributePerLine: {
since: "2.3.3",
category: CATEGORY_COMMON,
type: "boolean",
default: false,
description: "Enforce single attribute per line in HTML, Vue and JSX.",
},
};
+1
View File
@@ -28,6 +28,7 @@ module.exports = {
},
],
},
singleAttributePerLine: commonOptions.singleAttributePerLine,
vueIndentScriptAndStyle: {
since: "1.19.0",
category: CATEGORY_HTML,
+5 -2
View File
@@ -7,7 +7,7 @@
const assert = require("assert");
const { isNonEmptyArray } = require("../../common/util.js");
const {
builders: { indent, join, line, softline },
builders: { indent, join, line, softline, hardline },
utils: { replaceTextEndOfLine },
} = require("../../document/index.js");
const { locStart, locEnd } = require("../loc.js");
@@ -251,11 +251,14 @@ function printAttributes(path, options, print) {
node.attrs[0].fullName === "src" &&
node.children.length === 0;
const attributeLine =
options.singleAttributePerLine && node.attrs.length > 1 ? hardline : line;
/** @type {Doc[]} */
const parts = [
indent([
forceNotToBreakAttrContent ? " " : line,
join(line, printedAttributes),
join(attributeLine, printedAttributes),
]),
];
+1
View File
@@ -98,4 +98,5 @@ module.exports = {
},
],
},
singleAttributePerLine: commonOptions.singleAttributePerLine,
};
+6 -1
View File
@@ -605,12 +605,17 @@ function printJsxOpeningElement(path, options, print) {
attr.value.value.includes("\n")
);
const attributeLine =
options.singleAttributePerLine && node.attributes.length > 1
? hardline
: line;
return group(
[
"<",
print("name"),
print("typeParameters"),
indent(path.map(() => [line, print()], "attributes")),
indent(path.map(() => [attributeLine, print()], "attributes")),
node.selfClosing ? line : bracketSameLine ? ">" : softline,
node.selfClosing ? "/>" : bracketSameLine ? "" : ">",
],
@@ -0,0 +1,135 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`single-attribute-per-line.html - {"singleAttributePerLine":true} format 1`] = `
====================================options=====================================
parsers: ["html"]
printWidth: 80
singleAttributePerLine: true
| printWidth
=====================================input======================================
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
=====================================output=====================================
<div data-a="1">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div
data-a="1"
data-b="2"
data-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="Lorem ipsum dolor sit amet"
data-b="Lorem ipsum dolor sit amet"
data-c="Lorem ipsum dolor sit amet"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-long-attribute-a="1"
data-long-attribute-b="2"
data-long-attribute-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img
src="/images/foo.png"
alt="bar"
/>
<img
src="/images/foo.png"
alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
================================================================================
`;
exports[`single-attribute-per-line.html format 1`] = `
====================================options=====================================
parsers: ["html"]
printWidth: 80
| printWidth
=====================================input======================================
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
=====================================output=====================================
<div data-a="1">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="Lorem ipsum dolor sit amet"
data-b="Lorem ipsum dolor sit amet"
data-c="Lorem ipsum dolor sit amet"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-long-attribute-a="1"
data-long-attribute-b="2"
data-long-attribute-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img
src="/images/foo.png"
alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
================================================================================
`;
@@ -0,0 +1,2 @@
run_spec(__dirname, ["html"]);
run_spec(__dirname, ["html"], { singleAttributePerLine: true });
@@ -0,0 +1,21 @@
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
@@ -0,0 +1,163 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`single-attribute-per-line.js - {"singleAttributePerLine":true} format 1`] = `
====================================options=====================================
parsers: ["flow", "babel", "typescript"]
printWidth: 80
singleAttributePerLine: true
| printWidth
=====================================input======================================
import React from "react";
const Component = () => (
<div>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</div>
);
=====================================output=====================================
import React from "react";
const Component = () => (
<div>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="1"
data-b="2"
data-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="Lorem ipsum dolor sit amet"
data-b="Lorem ipsum dolor sit amet"
data-c="Lorem ipsum dolor sit amet"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-long-attribute-a="1"
data-long-attribute-b="2"
data-long-attribute-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img
src="/images/foo.png"
alt="bar"
/>
<img
src="/images/foo.png"
alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
</div>
);
================================================================================
`;
exports[`single-attribute-per-line.js format 1`] = `
====================================options=====================================
parsers: ["flow", "babel", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
import React from "react";
const Component = () => (
<div>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</div>
);
=====================================output=====================================
import React from "react";
const Component = () => (
<div>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="Lorem ipsum dolor sit amet"
data-b="Lorem ipsum dolor sit amet"
data-c="Lorem ipsum dolor sit amet"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-long-attribute-a="1"
data-long-attribute-b="2"
data-long-attribute-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img
src="/images/foo.png"
alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
</div>
);
================================================================================
`;
@@ -0,0 +1,4 @@
run_spec(__dirname, ["flow", "babel", "typescript"]);
run_spec(__dirname, ["flow", "babel", "typescript"], {
singleAttributePerLine: true,
});
@@ -0,0 +1,27 @@
import React from "react";
const Component = () => (
<div>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</div>
);
@@ -0,0 +1,143 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`single-attribute-per-line.vue - {"singleAttributePerLine":true} format 1`] = `
====================================options=====================================
parsers: ["vue"]
printWidth: 80
singleAttributePerLine: true
| printWidth
=====================================input======================================
<template>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</template>
=====================================output=====================================
<template>
<div data-a="1">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div
data-a="1"
data-b="2"
data-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="Lorem ipsum dolor sit amet"
data-b="Lorem ipsum dolor sit amet"
data-c="Lorem ipsum dolor sit amet"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-long-attribute-a="1"
data-long-attribute-b="2"
data-long-attribute-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img
src="/images/foo.png"
alt="bar"
/>
<img
src="/images/foo.png"
alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
</template>
================================================================================
`;
exports[`single-attribute-per-line.vue format 1`] = `
====================================options=====================================
parsers: ["vue"]
printWidth: 80
| printWidth
=====================================input======================================
<template>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</template>
=====================================output=====================================
<template>
<div data-a="1">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-a="Lorem ipsum dolor sit amet"
data-b="Lorem ipsum dolor sit amet"
data-c="Lorem ipsum dolor sit amet"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div
data-long-attribute-a="1"
data-long-attribute-b="2"
data-long-attribute-c="3"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img
src="/images/foo.png"
alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
</template>
================================================================================
`;
@@ -0,0 +1,2 @@
run_spec(__dirname, ["vue"]);
run_spec(__dirname, ["vue"], { singleAttributePerLine: true });
@@ -0,0 +1,23 @@
<template>
<div data-a="1">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="1" data-b="2" data-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-a="Lorem ipsum dolor sit amet" data-b="Lorem ipsum dolor sit amet" data-c="Lorem ipsum dolor sit amet">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<div data-long-attribute-a="1" data-long-attribute-b="2" data-long-attribute-c="3">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
<img src="/images/foo.png" />
<img src="/images/foo.png" alt="bar" />
<img src="/images/foo.png" alt="Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</template>
@@ -86,6 +86,9 @@ Format options:
Change when properties in objects are quoted.
Defaults to as-needed.
--no-semi Do not print semicolons, except at the beginning of lines which may need them.
--single-attribute-per-line
Enforce single attribute per line in HTML, Vue and JSX.
Defaults to false.
--single-quote Use single quotes instead of double quotes.
Defaults to false.
--tab-width <int> Number of spaces per indentation level.
@@ -251,6 +254,9 @@ Format options:
Change when properties in objects are quoted.
Defaults to as-needed.
--no-semi Do not print semicolons, except at the beginning of lines which may need them.
--single-attribute-per-line
Enforce single attribute per line in HTML, Vue and JSX.
Defaults to false.
--single-quote Use single quotes instead of double quotes.
Defaults to false.
--tab-width <int> Number of spaces per indentation level.
@@ -541,6 +541,19 @@ Default: true
exports[`show detailed usage with --help semi (write) 1`] = `Array []`;
exports[`show detailed usage with --help single-attribute-per-line (stderr) 1`] = `""`;
exports[`show detailed usage with --help single-attribute-per-line (stdout) 1`] = `
"--single-attribute-per-line
Enforce single attribute per line in HTML, Vue and JSX.
Default: false
"
`;
exports[`show detailed usage with --help single-attribute-per-line (write) 1`] = `Array []`;
exports[`show detailed usage with --help single-quote (stderr) 1`] = `""`;
exports[`show detailed usage with --help single-quote (stdout) 1`] = `
@@ -366,6 +366,11 @@ in order for it to be formatted.",
"description": "Print semicolons.",
"type": "boolean",
},
"singleAttributePerLine": Object {
"default": false,
"description": "Enforce single attribute per line in HTML, Vue and JSX.",
"type": "boolean",
},
"singleQuote": Object {
"default": false,
"description": "Use single quotes instead of double quotes.",
@@ -239,6 +239,10 @@ Object {
"default": true,
"type": "boolean",
},
"singleAttributePerLine": Object {
"default": false,
"type": "boolean",
},
"singleQuote": Object {
"default": false,
"type": "boolean",
@@ -1065,6 +1069,15 @@ exports[`CLI --support-info (stdout) 1`] = `
\\"since\\": \\"1.0.0\\",
\\"type\\": \\"boolean\\"
},
{
\\"category\\": \\"Common\\",
\\"default\\": false,
\\"description\\": \\"Enforce single attribute per line in HTML, Vue and JSX.\\",
\\"name\\": \\"singleAttributePerLine\\",
\\"pluginDefaults\\": {},
\\"since\\": \\"2.3.3\\",
\\"type\\": \\"boolean\\"
},
{
\\"category\\": \\"Common\\",
\\"default\\": false,