Skip to content

Commit

Permalink
feat(yaml): do not put singleline values on a separate line from the …
Browse files Browse the repository at this point in the history
…key (#4916)

Only apply to `alias` and `plain`/`quoteSingle`/`quoteDouble` with

- no backslash newline
- or no literal newline and `proseWrap: preserve`
- or no newline and `proseWrap: never`
- or no whitespace and `proseWrap: always`

in mapping items with implicit key, otherwise it's impossible to do prose wrapping.
  • Loading branch information
ikatyang committed Aug 1, 2018
1 parent 783923a commit 10df246
Show file tree
Hide file tree
Showing 6 changed files with 208 additions and 77 deletions.
126 changes: 97 additions & 29 deletions src/language-yaml/printer-yaml.js
Expand Up @@ -353,36 +353,52 @@ function _print(node, parentNode, path, options, print) {
": ",
align(2, value)
])
: conditionalGroup([
concat([
group(
concat([ifBreak("? "), group(align(2, key), { id: groupId })])
),
ifBreak(
concat([hardline, ": ", align(2, value)]),
indent(
concat([
needsSpaceInFrontOfMappingValue(node) ? " " : "",
":",
hasLeadingComments(node.value.node) ||
(parentNode.type === "mapping" &&
hasTrailingComments(node.key.node) &&
isInlineNode(node.value.node)) ||
((node.value.node.type === "mapping" ||
node.value.node.type === "sequence") &&
node.value.node.tag.type === "null" &&
node.value.node.anchor.type === "null")
? hardline
: node.value.node.type === "null"
? ""
: line,
value
])
),
{ groupId }
)
: // force singleline
isSingleLineNode(node.key.node) &&
!hasLeadingComments(node.key.node) &&
!hasMiddleComments(node.key.node) &&
!hasTrailingComments(node.key.node) &&
!hasEndComments(node.key) &&
!hasLeadingComments(node.value.node) &&
!hasMiddleComments(node.value.node) &&
!hasEndComments(node.value) &&
isAbsolutelyPrintedAsSingleLineNode(node.value.node, options)
? concat([
key,
needsSpaceInFrontOfMappingValue(node) ? " " : "",
": ",
value
])
]);
: conditionalGroup([
concat([
group(
concat([ifBreak("? "), group(align(2, key), { id: groupId })])
),
ifBreak(
concat([hardline, ": ", align(2, value)]),
indent(
concat([
needsSpaceInFrontOfMappingValue(node) ? " " : "",
":",
hasLeadingComments(node.value.node) ||
(parentNode.type === "mapping" &&
hasTrailingComments(node.key.node) &&
isInlineNode(node.value.node)) ||
((node.value.node.type === "mapping" ||
node.value.node.type === "sequence") &&
node.value.node.tag.type === "null" &&
node.value.node.anchor.type === "null")
? hardline
: node.value.node.type === "null"
? ""
: line,
value
])
),
{ groupId }
)
])
]);
}
case "flowMapping":
case "flowSequence": {
Expand Down Expand Up @@ -467,6 +483,58 @@ function isInlineNode(node) {
}
}

function isSingleLineNode(node) {
switch (node.type) {
case "plain":
case "quoteDouble":
case "quoteSingle":
return node.position.start.line === node.position.end.line;
case "alias":
return true;
default:
return false;
}
}

function isAbsolutelyPrintedAsSingleLineNode(node, options) {
switch (node.type) {
case "plain":
case "quoteSingle":
case "quoteDouble":
break;
case "alias":
return true;
default:
return false;
}

if (options.proseWrap === "preserve") {
return node.position.start.line === node.position.end.line;
}

if (
// backslash-newline
/\\$/m.test(
options.originalText.slice(
node.position.start.offset,
node.position.end.offset
)
)
) {
return false;
}

switch (options.proseWrap) {
case "never":
return node.value.indexOf("\n") === -1;
case "always":
return !/[\n ]/.test(node.value);
// istanbul ignore next
default:
return false;
}
}

function needsSpaceInFrontOfMappingValue(node) {
// istanbul ignore else
if (node.key.type !== "null") {
Expand Down
27 changes: 9 additions & 18 deletions tests/yaml_flow_mapping/__snapshots__/jsfmt.spec.js.snap
Expand Up @@ -571,12 +571,9 @@ exports[`long-key-long-value.yml - yaml-verify 1`] = `
{longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
}
`;
Expand All @@ -585,12 +582,9 @@ exports[`long-key-long-value.yml - yaml-verify 2`] = `
{longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
}
`;
Expand All @@ -599,12 +593,9 @@ exports[`long-key-long-value.yml - yaml-verify 3`] = `
{longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong1: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong3: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
}
`;
Expand Down
27 changes: 9 additions & 18 deletions tests/yaml_flow_sequence/__snapshots__/jsfmt.spec.js.snap
Expand Up @@ -562,12 +562,9 @@ exports[`long-key-long-value.yml - yaml-verify 1`] = `
[longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]
`;
Expand All @@ -576,12 +573,9 @@ exports[`long-key-long-value.yml - yaml-verify 2`] = `
[longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]
`;
Expand All @@ -590,12 +584,9 @@ exports[`long-key-long-value.yml - yaml-verify 3`] = `
[longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]
`;
Expand Down
18 changes: 6 additions & 12 deletions tests/yaml_mapping/__snapshots__/jsfmt.spec.js.snap
Expand Up @@ -107,8 +107,7 @@ key1: value
key2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
key1: value
key2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
key2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
`;

Expand All @@ -117,8 +116,7 @@ key1: value
key2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
key1: value
key2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
key2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
`;

Expand All @@ -131,10 +129,8 @@ exports[`explicit-key.yml - yaml-verify 1`] = `
: value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
key1: value
key2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
? longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
: value
key2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: value
`;

Expand All @@ -147,10 +143,8 @@ exports[`explicit-key.yml - yaml-verify 2`] = `
: value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
key1: value
key2:
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
? longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
: value
key2: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: value
`;

Expand Down
77 changes: 77 additions & 0 deletions tests/yaml_plain/__snapshots__/jsfmt.spec.js.snap
@@ -1,5 +1,82 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`force-singleline-in-mapping-value.yml - yaml-verify 1`] = `
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
whitespace: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong
literal-newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
whitespace: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong
literal-newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
`;

exports[`force-singleline-in-mapping-value.yml - yaml-verify 2`] = `
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
whitespace: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong
literal-newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
whitespace: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong
literal-newline: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong
newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
`;

exports[`force-singleline-in-mapping-value.yml - yaml-verify 3`] = `
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
whitespace: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong
literal-newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
whitespace:
longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
literal-newline:
longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong
`;

exports[`middle-comment.yml - yaml-verify 1`] = `
!!str # comment
hello
Expand Down
10 changes: 10 additions & 0 deletions tests/yaml_plain/force-singleline-in-mapping-value.yml
@@ -0,0 +1,10 @@
no-whitesapce: longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong

whitespace: longlonglonglonglonglonglonglonglonglonglong longlonglonglonglonglonglonglonglonglonglong

literal-newline: longlonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglong

newline: longlonglonglonglonglonglonglonglonglonglong

longlonglonglonglonglonglonglonglonglonglong

0 comments on commit 10df246

Please sign in to comment.