JSON to YAML: control characters are written raw, so PyYAML and js-yaml can't read the output
Los mantenedores suelen responder en 1 día
@anurag2787 ya está trabajando en esto.
Desde el 21/10/2026.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
The JSON formatter's YAML conversion (toYAML in lib/json-utils.ts) copies control characters into the output as they are. This JSON
{"soh":"\u0001","bell":"a\u0007b"}
gives the following, where <U+0001> and <U+0007> stand for the raw characters:
soh: <U+0001>
bell: a<U+0007>b
PyYAML stops with ReaderError: unacceptable character #x0001: special characters are not allowed, and js-yaml with the stream contains non-printable characters. (The yaml package on npm does read it.) The likeliest real case is log output with ANSI color codes, like {"log":"\u001b[31mred\u001b[0m"}.
The same happens with:
- the rest of U+0000 to U+001F, except tab, line feed and carriage return
- U+007F (DEL), and U+0080 to U+009F apart from U+0085
- U+FFFE and U+FFFF
U+0085 (NEL), U+2028 and U+2029 are line breaks in YAML 1.1. PyYAML sees {"v":"a\u2028b"} (written as v: a<U+2028>b) as a value cut off by a new line and fails with could not find expected ':', and inside double quotes it drops a NEL: {"v":"a: \u0085b"} comes back as a: b.
Checked with js-yaml 4.3, yaml 2.9 and PyYAML 6.0.
needsQuote only forces quotes for \n, \t, \r and " (line 364), and yamlString only escapes \, ", \n, \t and \r (line 371). Keys go through yamlString too, so {"a\u0001b":1} breaks the same way.
What to do
- Quote a string when it contains any of the characters above: U+0000 to U+001F other than tab, LF and CR, U+007F to U+009F, U+2028, U+2029, U+FFFE and U+FFFF.
- Inside the double quotes, escape them as
\xNNbelow U+0100 and\uNNNNabove it, with uppercase hex (\x1B, not\x1b). YAML 1.1 and 1.2 both have these escapes. Do it after the existing backslash replace, so the new backslashes don't get doubled. - Keep the
\n,\tand\rescapes as they are.
Where to look
lib/json-utils.ts:needsQuote(line 348, the check at line 364) andyamlString(line 369, the escapes at line 371)lib/__tests__/json-utils.test.ts: thetoYAMLtests (line 244)- #237 (exponent numbers in JSON to YAML) changes
yamlValue(line 375) in the same file. The two changes don't overlap, but whoever merges second may need to rebase.
Acceptance criteria
-
{"soh":"\u0001","bell":"a\u0007b"}givessoh: "\x01"andbell: "a\x07b" -
{"log":"\u001b[31mred\u001b[0m"}giveslog: "\x1B[31mred\x1B[0m" - U+0000, U+007F, U+0080, U+0085 and U+009F come out as
\x00,\x7F,\x80,\x85and\x9F, and U+2028, U+2029 and U+FFFE as\u2028,\u2029and\uFFFE - Keys are escaped too:
{"a\u0001b":1}gives"a\x01b": 1 -
{"v":"x\ty\nz"}still givesv: "x\ty\nz", and strings without these characters don't change - Tests check the output text for these cases (please don't add a YAML parser as a dependency)
-
npm run lint,npm run testandnpm run buildpass
Want to work on this? Comment below and I'll assign it to you. Please take one issue at a time, branch off develop, and open your PR against develop with Closes #234 in the description.
- Lenguaje dominante
- TypeScript
- Estrellas
- 1
- Forks
- 9
- Merge medio
- 9 h 9 min
- PR fusionados (30 d)
- 118
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de codercops/toolbelt
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 55/100
Los mantenedores suelen responder en 1 día
-
JWT encoder signs payloads that aren't JSON objects, and the decoder then rejects themPosiblemente ocupada @MugdhoAI la tomó hace 1 día. Abiertobug good first issue hacktoberfest
codercops/toolbelt#253 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
JSON formatter: Escape for code gives broken Python when the text has a run of single quotesPosiblemente ocupada @anurag2787 la tomó hace 1 día. Abiertobug good first issue hacktoberfest
codercops/toolbelt#233 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Add the URL encoder to the README, the home share card and package.jsonPosiblemente ocupada @Abhishek764 la tomó hace 4 días. Abiertodocumentation good first issue hacktoberfest
codercops/toolbelt#153 · 4 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Hacktoberfest 2026: start hereAbiertohacktoberfest
Dificultad 1/5 Menos de una hora Aptitud para principiantes 1/100
codercops/toolbelt#101 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de codercops/toolbelt
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
db-ux-design-system/core-web#8613 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
foxglove/mcap#1907 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug internal-plugin pr-welcome upstream
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
dsh-tauri-desk/deepseek-harness-desktop#1225 · 1 comentario ·
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
unjs/unhead#1027 · 1 reacción ·
Los mantenedores suelen responder en 1 día