From 3305cedb7d1c68246b0ac21e3a26392bc80d44a4 Mon Sep 17 00:00:00 2001 From: Cody Oss Date: Mon, 13 Jul 2026 15:13:07 +0000 Subject: [PATCH 1/4] fix(internal/snippetmetadata): disable HTML escaping in JSON output Snippet metadata files are written using Go's json encoder, which by defaultescapes HTML characters like >, <, and &. This causes these characters to be serialized as unicode sequences (e.g., \u003e), which is unnecessary for these metadata files and causes issues with other tools that expect raw characters. We now use a custom json.Encoder with SetEscapeHTML(false) to prevent this escaping. We also continue to trim the trailing newline added by the encoder to maintain format consistency with the generator. Fixes #6776 --- internal/snippetmetadata/snippetmetadata.go | 12 +++- .../snippetmetadata/snippetmetadata_test.go | 58 +++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/internal/snippetmetadata/snippetmetadata.go b/internal/snippetmetadata/snippetmetadata.go index 5b4a7c9bf52..8412347189d 100644 --- a/internal/snippetmetadata/snippetmetadata.go +++ b/internal/snippetmetadata/snippetmetadata.go @@ -17,6 +17,7 @@ package snippetmetadata import ( + "bytes" "encoding/json" "errors" "fmt" @@ -49,10 +50,17 @@ func readMetadata(path string) (map[string]any, error) { // writeMetadata formats and writes the given metadata as a JSON file at the // given path. func writeMetadata(path string, metadata map[string]any) error { - content, err := json.MarshalIndent(metadata, "", " ") - if err != nil { + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + if err := enc.Encode(metadata); err != nil { return fmt.Errorf("error encoding snippet metadata file %s: %w", path, err) } + content := buf.Bytes() + if len(content) > 0 && content[len(content)-1] == '\n' { + content = content[:len(content)-1] + } if err := os.WriteFile(path, content, 0644); err != nil { return fmt.Errorf("error writing snippet metadata file %s: %w", path, err) } diff --git a/internal/snippetmetadata/snippetmetadata_test.go b/internal/snippetmetadata/snippetmetadata_test.go index 936b0b7ab96..6b5b46102d9 100644 --- a/internal/snippetmetadata/snippetmetadata_test.go +++ b/internal/snippetmetadata/snippetmetadata_test.go @@ -410,3 +410,61 @@ func copyInputFileToTemp(t *testing.T, inputFile string) string { } return path } + +func TestHTMLCharsNoEscape(t *testing.T) { + for _, tc := range []struct { + name string + input string + run func(string) error + want string + }{ + { + name: "updateLibraryVersion", + input: `{ + "clientLibrary": { + "someFieldWithHTML": "a > b & c < d", + "version": "1.0.0" + } +}`, + run: func(path string) error { + return updateLibraryVersion(path, "1.2.0") + }, + want: `{ + "clientLibrary": { + "someFieldWithHTML": "a > b & c < d", + "version": "1.2.0" + } +}`, + }, + { + name: "reformat", + input: `{ + "someFieldWithHTML": "a > b & c < d" +}`, + run: func(path string) error { + return reformat(path) + }, + want: `{ + "someFieldWithHTML": "a > b & c < d" +}`, + }, + } { + t.Run(tc.name, func(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "snippet_metadata.json") + if err := os.WriteFile(path, []byte(tc.input), 0644); err != nil { + t.Fatal(err) + } + if err := tc.run(path); err != nil { + t.Fatal(err) + } + got, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if diff := cmp.Diff(tc.want, string(got)); diff != "" { + t.Errorf("mismatch (-want +got):\n%s", diff) + } + }) + } +} From 2d31fed00a7727b2a486f184f17762dcdb6ebf95 Mon Sep 17 00:00:00 2001 From: Cody Oss Date: Mon, 13 Jul 2026 19:05:24 +0000 Subject: [PATCH 2/4] feedback --- internal/snippetmetadata/snippetmetadata.go | 1 + internal/snippetmetadata/snippetmetadata_test.go | 1 + 2 files changed, 2 insertions(+) diff --git a/internal/snippetmetadata/snippetmetadata.go b/internal/snippetmetadata/snippetmetadata.go index 8412347189d..69852c7d8e3 100644 --- a/internal/snippetmetadata/snippetmetadata.go +++ b/internal/snippetmetadata/snippetmetadata.go @@ -58,6 +58,7 @@ func writeMetadata(path string, metadata map[string]any) error { return fmt.Errorf("error encoding snippet metadata file %s: %w", path, err) } content := buf.Bytes() + // Trim the trailing newline added by Encode to match the generator's format. if len(content) > 0 && content[len(content)-1] == '\n' { content = content[:len(content)-1] } diff --git a/internal/snippetmetadata/snippetmetadata_test.go b/internal/snippetmetadata/snippetmetadata_test.go index 6b5b46102d9..ec5af2b43fe 100644 --- a/internal/snippetmetadata/snippetmetadata_test.go +++ b/internal/snippetmetadata/snippetmetadata_test.go @@ -450,6 +450,7 @@ func TestHTMLCharsNoEscape(t *testing.T) { }, } { t.Run(tc.name, func(t *testing.T) { + t.Parallel() dir := t.TempDir() path := filepath.Join(dir, "snippet_metadata.json") if err := os.WriteFile(path, []byte(tc.input), 0644); err != nil { From 16e673be5f78c410959c62d8b1f5b8c1bf5cd42b Mon Sep 17 00:00:00 2001 From: Cody Oss <6331106+codyoss@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:13:15 -0500 Subject: [PATCH 3/4] Update internal/snippetmetadata/snippetmetadata_test.go Co-authored-by: Joe Wang <106995533+JoeWang1127@users.noreply.github.com> Signed-off-by: Cody Oss <6331106+codyoss@users.noreply.github.com> --- internal/snippetmetadata/snippetmetadata_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/snippetmetadata/snippetmetadata_test.go b/internal/snippetmetadata/snippetmetadata_test.go index ec5af2b43fe..078c6a59b2f 100644 --- a/internal/snippetmetadata/snippetmetadata_test.go +++ b/internal/snippetmetadata/snippetmetadata_test.go @@ -412,7 +412,7 @@ func copyInputFileToTemp(t *testing.T, inputFile string) string { } func TestHTMLCharsNoEscape(t *testing.T) { - for _, tc := range []struct { + for _, test := range []struct { name string input string run func(string) error From a4d90bfa3e4696c12658c70198398618f1d58242 Mon Sep 17 00:00:00 2001 From: Cody Oss Date: Mon, 13 Jul 2026 19:32:34 +0000 Subject: [PATCH 4/4] fixup --- internal/snippetmetadata/snippetmetadata_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/snippetmetadata/snippetmetadata_test.go b/internal/snippetmetadata/snippetmetadata_test.go index 078c6a59b2f..c31b9cc279c 100644 --- a/internal/snippetmetadata/snippetmetadata_test.go +++ b/internal/snippetmetadata/snippetmetadata_test.go @@ -449,21 +449,21 @@ func TestHTMLCharsNoEscape(t *testing.T) { }`, }, } { - t.Run(tc.name, func(t *testing.T) { + t.Run(test.name, func(t *testing.T) { t.Parallel() dir := t.TempDir() path := filepath.Join(dir, "snippet_metadata.json") - if err := os.WriteFile(path, []byte(tc.input), 0644); err != nil { + if err := os.WriteFile(path, []byte(test.input), 0644); err != nil { t.Fatal(err) } - if err := tc.run(path); err != nil { + if err := test.run(path); err != nil { t.Fatal(err) } got, err := os.ReadFile(path) if err != nil { t.Fatal(err) } - if diff := cmp.Diff(tc.want, string(got)); diff != "" { + if diff := cmp.Diff(test.want, string(got)); diff != "" { t.Errorf("mismatch (-want +got):\n%s", diff) } })