diff --git a/internal/snippetmetadata/snippetmetadata.go b/internal/snippetmetadata/snippetmetadata.go index 5b4a7c9bf52..69852c7d8e3 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,18 @@ 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() + // 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] + } 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..c31b9cc279c 100644 --- a/internal/snippetmetadata/snippetmetadata_test.go +++ b/internal/snippetmetadata/snippetmetadata_test.go @@ -410,3 +410,62 @@ func copyInputFileToTemp(t *testing.T, inputFile string) string { } return path } + +func TestHTMLCharsNoEscape(t *testing.T) { + for _, test := 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(test.name, func(t *testing.T) { + t.Parallel() + dir := t.TempDir() + path := filepath.Join(dir, "snippet_metadata.json") + if err := os.WriteFile(path, []byte(test.input), 0644); err != nil { + t.Fatal(err) + } + 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(test.want, string(got)); diff != "" { + t.Errorf("mismatch (-want +got):\n%s", diff) + } + }) + } +}