From e6b323eedb37e5956bb28b3b8ace1515263e4442 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Thu, 11 Dec 2025 13:07:49 +0530 Subject: [PATCH] Use literal block scalar style for exporting multiline content --- pkg/transformer/kubernetes/k8sutils.go | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index 331d23a9..dc720ea9 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -591,6 +591,24 @@ func removeEmptyInterfaces(obj interface{}) interface{} { } // Convert JSON to YAML. +// setLiteralStyleForMultilineStrings walks through a yaml.Node tree and sets +// multiline strings to use literal style (|) for better readability +func setLiteralStyleForMultilineStrings(node *yaml.Node) { + if node == nil { + return + } + + // If this is a scalar string node with newlines, use literal style + if node.Kind == yaml.ScalarNode && node.Tag == "!!str" && strings.Contains(node.Value, "\n") { + node.Style = yaml.LiteralStyle // Use | for multiline strings + } + + // Recursively process child nodes + for _, child := range node.Content { + setLiteralStyleForMultilineStrings(child) + } +} + func jsonToYaml(j []byte, spaces int) ([]byte, error) { // Convert the JSON to an object. var jsonObj interface{} @@ -604,10 +622,20 @@ func jsonToYaml(j []byte, spaces int) ([]byte, error) { return nil, err } jsonObj = removeEmptyInterfaces(jsonObj) + + // Create a yaml.Node to have control over string styles + var node yaml.Node + if err := node.Encode(jsonObj); err != nil { + return nil, err + } + + // Set literal style for multiline strings (e.g., ConfigMap data) + setLiteralStyleForMultilineStrings(&node) + var b bytes.Buffer encoder := yaml.NewEncoder(&b) encoder.SetIndent(spaces) - if err := encoder.Encode(jsonObj); err != nil { + if err := encoder.Encode(&node); err != nil { return nil, err } return b.Bytes(), nil