Travailler avec YAML en TypeScript : parsing, génération et validation de données

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec YAML en TypeScript : parsing, génération et validation

\n\n

YAML (YAML Ain't Markup Language) est l'un des formats de sérialisation de données les plus populaires, activement utilisé dans les fichiers de configuration, DevOps (Docker, Kubernetes, Ansible) et les pipelines CI/CD. Dans l'écosystème TypeScript, la bibliothèque js-yaml est utilisée pour travailler avec YAML, offrant un support complet de la spécification YAML 1.2, y compris les structures complexes, les balises et les types de données personnalisés.

\n\n

Installation et configuration

\n\n

Pour commencer, installez la bibliothèque et ses types via npm :

\n\n
npm install js-yaml\nnpm install --save-dev @types/js-yaml
\n\n

Après l'installation, vous pouvez importer la bibliothèque dans votre projet TypeScript :

\n\n
import * as yaml from 'js-yaml';\nimport * as fs from 'fs';
\n\n

Parsing YAML en TypeScript

\n\n

La fonction principale pour lire du YAML est yaml.load(), qui convertit une chaîne YAML en objet JavaScript/TypeScript. Voici un exemple avec un fichier de configuration :

\n\n
// config.yaml\n// server:\n//   port: 3000\n//   host: "localhost"\n// database:\n//   url: "mongodb://localhost:27017/mydb"\n//   poolSize: 10\n// features:\n//   - logging\n//   - authentication\n\ninterface Config {\n  server: {\n    port: number;\n    host: string;\n  };\n  database: {\n    url: string;\n    poolSize: number;\n  };\n  features: string[];\n}\n\nconst yamlContent = fs.readFileSync('config.yaml', 'utf8');\nconst config = yaml.load(yamlContent) as Config;\n\nconsole.log(config.server.port); // 3000\nconsole.log(config.features); // ['logging', 'authentication']
\n\n

Pour un parsing sécurisé (sans exécution de code), utilisez yaml.load() — il est plus sûr que yaml.eval(), qui peut exécuter du code JavaScript arbitraire.

\n\n

Génération de YAML à partir d'objets TypeScript

\n\n

L'opération inverse — conversion d'un objet TypeScript en chaîne YAML — est effectuée par la fonction yaml.dump(). Cela est utile pour créer des fichiers de configuration à la volée :

\n\n
interface DeploymentConfig {\n  apiVersion: string;\n  kind: string;\n  metadata: { name: string; labels?: Record<string, string> };\n  spec: { replicas: number; selector: Record<string, string> };\n}\n\nconst deployment: DeploymentConfig = {\n  apiVersion: 'apps/v1',\n  kind: 'Deployment',\n  metadata: {\n    name: 'my-app',\n    labels: { app: 'my-app', tier: 'backend' }\n  },\n  spec: {\n    replicas: 3,\n    selector: { matchLabels: { app: 'my-app' } }\n  }\n};\n\nconst yamlString = yaml.dump(deployment, {\n  indent: 2,\n  lineWidth: 120,\n  noRefs: true,\n  sortKeys: true\n});\n\nconsole.log(yamlString);\n// apiVersion: apps/v1\n// kind: Deployment\n// metadata:\n//   labels:\n//     app: my-app\n//     tier: backend\n//   name: my-app\n// spec:\n//   replicas: 3\n//   selector:\n//     matchLabels:\n//       app: my-app
\n\n

Travailler avec des types personnalisés

\n\n

La bibliothèque js-yaml prend en charge les schémas et types de données personnalisés. Cela est particulièrement utile pour travailler avec des dates, des expressions régulières ou des objets spéciaux :

\n\n
import * as yaml from 'js-yaml';\n\n// Création d'un type personnalisé pour les dates\nconst DateType = new yaml.Type('!date', {\n  kind: 'scalar',\n  resolve: (data: string) => !isNaN(Date.parse(data)),\n  construct: (data: string) => new Date(data),\n  instanceOf: Date,\n  represent: (date: Date) => date.toISOString()\n});\n\n// Création d'un schéma avec support des types standards et personnalisés\nconst schema = yaml.DEFAULT_SCHEMA.extend([DateType]);\n\nconst yamlWithDates = `\nevent: !date 2024-12-25T10:00:00Z\ntitle: "Séminaire de Noël"\n`;\n\nconst parsed = yaml.load(yamlWithDates, { schema });\nconsole.log(parsed.event instanceof Date); // true\nconsole.log(parsed.event.toLocaleDateString('fr-FR')); // 25/12/2024
\n\n

Validation YAML avec

Recommendations