Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

JSON to YAML: control characters are written raw, so PyYAML and js-yaml can't read the output

Abierto
#234 2 comentarios 0 reacciones 1 asignado Ver en GitHub

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

bug good first issue hacktoberfest

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 \xNN below U+0100 and \uNNNN above 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, \t and \r escapes as they are.

Where to look

  • lib/json-utils.ts: needsQuote (line 348, the check at line 364) and yamlString (line 369, the escapes at line 371)
  • lib/__tests__/json-utils.test.ts: the toYAML tests (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"} gives soh: "\x01" and bell: "a\x07b"
  • {"log":"\u001b[31mred\u001b[0m"} gives log: "\x1B[31mred\x1B[0m"
  • U+0000, U+007F, U+0080, U+0085 and U+009F come out as \x00, \x7F, \x80, \x85 and \x9F, and U+2028, U+2029 and U+FFFE as \u2028, \u2029 and \uFFFE
  • Keys are escaped too: {"a\u0001b":1} gives "a\x01b": 1
  • {"v":"x\ty\nz"} still gives v: "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 test and npm run build pass

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

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de codercops/toolbelt

Todos los issues de codercops/toolbelt

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.