Travailler avec YAML en TypeScript : parsing, génération et validation
\n\nYAML (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.
Installation et configuration
\n\nPour commencer, installez la bibliothèque et ses types via npm :
\n\nnpm install js-yaml\nnpm install --save-dev @types/js-yaml\n\nAprès l'installation, vous pouvez importer la bibliothèque dans votre projet TypeScript :
\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs';\n\nParsing YAML en TypeScript
\n\nLa 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 :
// 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\nPour 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.
Génération de YAML à partir d'objets TypeScript
\n\nL'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 :
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\nTravailler avec des types personnalisés
\n\nLa 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 :
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\nValidation YAML avec
Aussi dans la bibliothèque
Awilix pour TypeScript : guide complet avec exemples
AutoMapper pour C# (.NET) : guide complet avec exemples
Métriques Prometheus dans Node.js : la bibliothèque prom-client pour le monitoring