What is js-yaml?
The js-yaml npm package is a JavaScript library that allows you to parse and dump YAML, a human-friendly data serialization standard. It can be used to convert YAML to JSON and vice versa, making it a useful tool for configuration files, data exchange, and more.
What are js-yaml's main functionalities?
YAML Parsing
This feature allows you to parse a YAML file or string and convert it into a JavaScript object. The code sample demonstrates how to read a YAML file from the filesystem and parse its contents.
{"const yaml = require('js-yaml');\nconst fs = require('fs');\n\ntry {\n const doc = yaml.load(fs.readFileSync('/path/to/file.yml', 'utf8'));\n console.log(doc);\n} catch (e) {\n console.error(e);\n}"}
YAML Dumping
This feature allows you to take a JavaScript object and convert it into a YAML-formatted string. The code sample shows how to create a YAML string from an object and then save it to a file.
{"const yaml = require('js-yaml');\nconst fs = require('fs');\n\nconst obj = { hello: 'world' };\nconst ymlText = yaml.dump(obj);\n\nfs.writeFileSync('/path/to/file.yml', ymlText, 'utf8');\nconsole.log('YAML file saved.');"}
Custom Types
js-yaml allows you to define custom types for specialized use cases. The code sample demonstrates how to create a custom YAML type and use it in parsing a YAML string.
{"const yaml = require('js-yaml');\n\nconst schema = yaml.Schema.create([ new yaml.Type('!myType', {\n kind: 'scalar',\n resolve: data => data === 'valid',\n construct: data => data,\n instanceOf: String\n}) ]);\n\nconst doc = yaml.load('!myType valid', { schema });\nconsole.log(doc); // 'valid'"}
Other packages similar to js-yaml
yaml
The 'yaml' package is another JavaScript library for parsing and serializing YAML. It offers a similar API to js-yaml but with a focus on being highly compliant with the YAML specification. It may be preferred for applications that require strict adherence to the spec.
yamljs
Yamljs is a JavaScript library that provides YAML parsing and dumping functionalities. It is similar to js-yaml but has a different API design and may not be as actively maintained as js-yaml.
yaml-ast-parser
This package is designed for parsing YAML into an abstract syntax tree (AST). It is useful for developers who need to analyze or manipulate the structure of YAML documents at a lower level compared to js-yaml.
JS-YAML - YAML 1.1 parser for JavaScript
Online Demo
This is a native port of PyYAML, the most advanced YAML parser.
Now you can use all modern YAML feature right in JavaScript. Originally snapshoted version - PyYAML 3.10 (2011-05-30).
Braking changes in 0.3.x -> 1.0.x
y
, yes
, n
, no
, on
, off
are not converted to Booleans anymore.
Decision to drop support of such "magic" was made after speaking with YAML
core developers: from now on we try to keep as minimal subset of rules as
possible to keep things obvious. Booleans are following YAML 1.2 core schema
now: http://www.yaml.org/spec/1.2/spec.html#id2804923require('file.yml')
now returns a single document (was array of documents)
and throws an error when file contains multiple documents.js-yaml.bin
become part of js-yaml
again.
Installation
YAML module for node.js
npm install js-yaml
CLI executable
If you want to inspect your YAML files from CLI, install js-yaml globally:
npm install js-yaml -g
Usage
usage: js-yaml [-h] [-v] [-c] [-j] [-t] file
Positional arguments:
file File with YAML document(s)
Optional arguments:
-h, --help Show this help message and exit.
-v, --version Show program's version number and exit.
-c, --compact Display errors in compact mode
-j, --to-json Output a non-funky boring JSON
-t, --trace Show stack trace on error
bundled YAML library for browser
<script src="js-yaml.min.js"></script>
<script type="text/javascript">
var doc = jsyaml.load('greeting: hello\nname: world');
</script>
Browser support is still buggy, and mostly done to run online demo. If you
can help to improve browser compatibility and AMD support - rise pull request.
API
JS-YAML automatically registers handlers for .yml
and .yaml
files. You can load them just with require
.
That's mostly equivalent to calling loadAll() on file handler ang gathering all documents into array.
Just with one string!
require('js-yaml');
var doc = require('/home/ixti/example.yml');
console.log(doc);
load (string|buffer|file_resource)
Parses source as single YAML document. Returns JS object or throws exception on error.
This function does NOT understands multi-doc sources, it throws exception on those.
var yaml = require('js-yaml');
fs.readFile('/home/ixti/example.yml', 'utf8', function (err, data) {
if (err) {
return;
}
try {
console.log( yaml.load(data) );
} catch(e) {
console.log(e);
}
});
loadAll (string|buffer|file_resource, iterator)
Same as Load
, but understands multi-doc sources and apply iterator to each document.
var yaml = require('js-yaml');
fs.readFile('/home/ixti/example.yml', 'utf8', function (err, data) {
if (err) {
return;
}
try {
yaml.loadAll(data, function (doc) {
console.log(doc);
});
} catch(e) {
console.log(e);
}
});
safeLoad (string|buffer|file_resource)
Same as load()
but uses safe schema - only recommended tags of YAML
specification (no JavaScript-specific tags, e.g. !!js/regexp
).
safeLoadAll (string|buffer|file_resource, iterator)
Same as loadAll()
but uses safe schema - only recommended tags of YAML
specification (no JavaScript-specific tags, e.g. !!js/regexp
).
JavaScript YAML tags scheme
The list of standard YAML tags and corresponding JavaScipt types. See also
YAML Tag Discussion and Yaml Types.
!!null '' # null
!!bool 'yes' # bool
!!int '3...' # number
!!float '3.14...' # number
!!binary '...base64...' # buffer
!!timestamp 'YYYY-...' # date
!!omap [ ... ] # array of key-value pairs
!!pairs [ ... ] # array or array pairs
!!set { ... } # array of objects with given keys and null values
!!str '...' # string
!!seq [ ... ] # array
!!map { ... } # object
JavaScript-specific tags
!!js/regexp /pattern/gim # RegExp
!!js/undefined '' # Undefined
!!js/function 'function () {...}' # Function
Caveats
Note, that you use arrays or objects as key in JS-YAML. JS do not allows objects
or array as keys, and stringifies them at the moment of adding them.
---
? [ foo, bar ]
: - baz
? { foo: bar }
: - baz
- baz
=>
{ "": ["baz"], "[object Object]": ["baz", "baz"] }
License
View the LICENSE file (MIT).