diff --git a/src/stringify/stringifyString.ts b/src/stringify/stringifyString.ts index d600ec66..04a33945 100644 --- a/src/stringify/stringifyString.ts +++ b/src/stringify/stringifyString.ts @@ -15,8 +15,11 @@ interface StringifyScalar { type?: string } -const getFoldOptions = (ctx: StringifyContext): FoldOptions => ({ - indentAtStart: ctx.indentAtStart, +const getFoldOptions = ( + ctx: StringifyContext, + isBlock: boolean +): FoldOptions => ({ + indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart, lineWidth: ctx.options.lineWidth, minContentWidth: ctx.options.minContentWidth }) @@ -132,7 +135,7 @@ function doubleQuotedString(value: string, ctx: StringifyContext) { str = start ? str + json.slice(start) : json return implicitKey ? str - : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx)) + : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx, false)) } function singleQuotedString(value: string, ctx: StringifyContext) { @@ -148,7 +151,7 @@ function singleQuotedString(value: string, ctx: StringifyContext) { "'" + value.replace(/'/g, "''").replace(/\n+/g, `$&\n${indent}`) + "'" return ctx.implicitKey ? res - : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx)) + : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx, false)) } function quotedString(value: string, ctx: StringifyContext) { @@ -263,7 +266,7 @@ function blockString( `${start}${value}${end}`, indent, FOLD_BLOCK, - getFoldOptions(ctx) + getFoldOptions(ctx, true) ) return `${header}\n${indent}${body}` } @@ -327,7 +330,7 @@ function plainString( } return implicitKey ? str - : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx)) + : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx, false)) } export function stringifyString( diff --git a/tests/doc/foldFlowLines.ts b/tests/doc/foldFlowLines.ts index f9f3b601..1ecb1567 100644 --- a/tests/doc/foldFlowLines.ts +++ b/tests/doc/foldFlowLines.ts @@ -1,5 +1,6 @@ import * as YAML from 'yaml' import { foldFlowLines as fold, FoldOptions } from 'yaml/util' +import { source } from '../_utils' const FOLD_FLOW = 'flow' const FOLD_QUOTED = 'quoted' @@ -248,6 +249,31 @@ describe('double-quoted', () => { }) }) +describe('block scalar', () => { + test('eemeli/yaml#422', () => { + const obj = { + 'nginx.ingress.kubernetes.io/configuration-snippet': source` + location ~* ^/sites/aaaaaaa.aa/files/(.+) { + return 302 https://process.aaaaaaa.aa/sites/aaaaaaa.aa/files/$1; + } + location ~* ^/partner-application/cls/(.+) { + return 301 https://process.aaaaaaa.aa/partner-application/cls/$1$is_args$args; + } + ` + } + expect(YAML.stringify(obj)).toBe(source` + nginx.ingress.kubernetes.io/configuration-snippet: > + location ~* ^/sites/aaaaaaa.aa/files/(.+) { + return 302 https://process.aaaaaaa.aa/sites/aaaaaaa.aa/files/$1; + } + + location ~* ^/partner-application/cls/(.+) { + return 301 https://process.aaaaaaa.aa/partner-application/cls/$1$is_args$args; + } + `) + }) +}) + describe('end-to-end', () => { const foldOptions = { lineWidth: 20, minContentWidth: 0 }