UNPKG

9.66 kBMarkdownView Raw
1JS-YAML - YAML 1.2 parser / writer for JavaScript
2=================================================
3
4[![Build Status](https://travis-ci.org/nodeca/js-yaml.svg?branch=master)](https://travis-ci.org/nodeca/js-yaml)
5[![NPM version](https://img.shields.io/npm/v/js-yaml.svg)](https://www.npmjs.org/package/js-yaml)
6
7__[Online Demo](http://nodeca.github.com/js-yaml/)__
8
9
10This is an implementation of [YAML](http://yaml.org/), a human friendly data
11serialization language. Started as [PyYAML](http://pyyaml.org/) port, it was
12completely rewritten from scratch. Now it's very fast, and supports 1.2 spec.
13
14
15Installation
16------------
17
18### YAML module for node.js
19
20```
21npm install js-yaml
22```
23
24
25### CLI executable
26
27If you want to inspect your YAML files from CLI, install js-yaml globally:
28
29```
30npm install -g js-yaml
31```
32
33#### Usage
34
35```
36usage: js-yaml [-h] [-v] [-c] [-t] file
37
38Positional arguments:
39 file File with YAML document(s)
40
41Optional arguments:
42 -h, --help Show this help message and exit.
43 -v, --version Show program's version number and exit.
44 -c, --compact Display errors in compact mode
45 -t, --trace Show stack trace on error
46```
47
48
49### Bundled YAML library for browsers
50
51``` html
52<!-- esprima required only for !!js/function -->
53<script src="esprima.js"></script>
54<script src="js-yaml.min.js"></script>
55<script type="text/javascript">
56var doc = jsyaml.load('greeting: hello\nname: world');
57</script>
58```
59
60Browser support was done mostly for online demo. If you find any errors - feel
61free to send pull requests with fixes. Also note, that IE and other old browsers
62needs [es5-shims](https://github.com/kriskowal/es5-shim) to operate.
63
64Notes:
65
661. We have no resources to support browserified version. Don't expect it to be
67 well tested. Don't expect fast fixes if something goes wrong there.
682. `!!js/function` in browser bundle will not work by default. If you really need
69 it - load `esprima` parser first (via amd or directly).
703. `!!bin` in browser will return `Array`, because browsers do not support
71 node.js `Buffer` and adding Buffer shims is completely useless on practice.
72
73
74API
75---
76
77Here we cover the most 'useful' methods. If you need advanced details (creating
78your own tags), see [wiki](https://github.com/nodeca/js-yaml/wiki) and
79[examples](https://github.com/nodeca/js-yaml/tree/master/examples) for more
80info.
81
82``` javascript
83yaml = require('js-yaml');
84fs = require('fs');
85
86// Get document, or throw exception on error
87try {
88 var doc = yaml.safeLoad(fs.readFileSync('/home/ixti/example.yml', 'utf8'));
89 console.log(doc);
90} catch (e) {
91 console.log(e);
92}
93```
94
95
96### safeLoad (string [ , options ])
97
98**Recommended loading way.** Parses `string` as single YAML document. Returns a JavaScript
99object or throws `YAMLException` on error. By default, does not support regexps,
100functions and undefined. This method is safe for untrusted data.
101
102options:
103
104- `filename` _(default: null)_ - string to be used as a file path in
105 error/warning messages.
106- `onWarning` _(default: null)_ - function to call on warning messages.
107 Loader will throw on warnings if this function is not provided.
108- `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ - specifies a schema to use.
109 - `FAILSAFE_SCHEMA` - only strings, arrays and plain objects:
110 http://www.yaml.org/spec/1.2/spec.html#id2802346
111 - `JSON_SCHEMA` - all JSON-supported types:
112 http://www.yaml.org/spec/1.2/spec.html#id2803231
113 - `CORE_SCHEMA` - same as `JSON_SCHEMA`:
114 http://www.yaml.org/spec/1.2/spec.html#id2804923
115 - `DEFAULT_SAFE_SCHEMA` - all supported YAML types, without unsafe ones
116 (`!!js/undefined`, `!!js/regexp` and `!!js/function`):
117 http://yaml.org/type/
118 - `DEFAULT_FULL_SCHEMA` - all supported YAML types.
119- `json` _(default: false)_ - compatibility with JSON.parse behaviour. If true, then duplicate keys in a mapping will override values rather than throwing an error.
120
121NOTE: This function **does not** understand multi-document sources, it throws
122exception on those.
123
124NOTE: JS-YAML **does not** support schema-specific tag resolution restrictions.
125So, JSON schema is not as strict as defined in the YAML specification.
126It allows numbers in any notation, use `Null` and `NULL` as `null`, etc.
127Core schema also has no such restrictions. It allows binary notation for integers.
128
129
130### load (string [ , options ])
131
132**Use with care with untrusted sources**. The same as `safeLoad()` but uses
133`DEFAULT_FULL_SCHEMA` by default - adds some JavaScript-specific types:
134`!!js/function`, `!!js/regexp` and `!!js/undefined`. For untrusted sources you
135must additionally validate object structure, to avoid injections:
136
137``` javascript
138var untrusted_code = '"toString": !<tag:yaml.org,2002:js/function> "function (){very_evil_thing();}"';
139
140// I'm just converting that string, what could possibly go wrong?
141require('js-yaml').load(untrusted_code) + ''
142```
143
144
145### safeLoadAll (string, iterator [ , options ])
146
147Same as `safeLoad()`, but understands multi-document sources and apply
148`iterator` to each document.
149
150``` javascript
151var yaml = require('js-yaml');
152
153yaml.safeLoadAll(data, function (doc) {
154 console.log(doc);
155});
156```
157
158
159### loadAll (string, iterator [ , options ])
160
161Same as `safeLoadAll()` but uses `DEFAULT_FULL_SCHEMA` by default.
162
163
164### safeDump (object [ , options ])
165
166Serializes `object` as YAML document. Uses `DEFAULT_SAFE_SCHEMA`, so it will
167throw exception if you try to dump regexps or functions. However, you can
168disable exceptions by `skipInvalid` option.
169
170options:
171
172- `indent` _(default: 2)_ - indentation width to use (in spaces).
173- `skipInvalid` _(default: false)_ - do not throw on invalid types (like function
174 in the safe schema) and skip pairs and single values with such types.
175- `flowLevel` (default: -1) - specifies level of nesting, when to switch from
176 block to flow style for collections. -1 means block style everwhere
177- `styles` - "tag" => "style" map. Each tag may have own set of styles.
178- `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ specifies a schema to use.
179- `sortKeys` _(default: `false`)_ - if `true`, sort keys when dumping YAML. If a
180 function, use the function to sort the keys.
181- `lineWidth` _(default: `80`)_ - set max line width.
182- `noRefs` _(default: `false`)_ - if `true`, don't convert duplicate objects into references
183- `noCompatMode` _(default: `false`)_ - if `true` don't try to be compatible with older
184 yaml versions. Currently: don't quote "yes", "no" and so on, as required for YAML 1.1
185
186The following table show availlable styles (e.g. "canonical",
187"binary"...) available for each tag (.e.g. !!null, !!int ...). Yaml
188ouput is shown on the right side after `=>` (default setting) or `->`:
189
190``` none
191!!null
192 "canonical" -> "~"
193 "lowercase" => "null"
194 "uppercase" -> "NULL"
195 "camelcase" -> "Null"
196
197!!int
198 "binary" -> "0b1", "0b101010", "0b1110001111010"
199 "octal" -> "01", "052", "016172"
200 "decimal" => "1", "42", "7290"
201 "hexadecimal" -> "0x1", "0x2A", "0x1C7A"
202
203!!bool
204 "lowercase" => "true", "false"
205 "uppercase" -> "TRUE", "FALSE"
206 "camelcase" -> "True", "False"
207
208!!float
209 "lowercase" => ".nan", '.inf'
210 "uppercase" -> ".NAN", '.INF'
211 "camelcase" -> ".NaN", '.Inf'
212```
213
214Example:
215
216``` javascript
217safeDump (object, {
218 'styles': {
219 '!!null': 'canonical' // dump null as ~
220 },
221 'sortKeys': true // sort object keys
222}
223```
224
225### dump (object [ , options ])
226
227Same as `safeDump()` but without limits (uses `DEFAULT_FULL_SCHEMA` by default).
228
229
230Supported YAML types
231--------------------
232
233The list of standard YAML tags and corresponding JavaScipt types. See also
234[YAML tag discussion](http://pyyaml.org/wiki/YAMLTagDiscussion) and
235[YAML types repository](http://yaml.org/type/).
236
237```
238!!null '' # null
239!!bool 'yes' # bool
240!!int '3...' # number
241!!float '3.14...' # number
242!!binary '...base64...' # buffer
243!!timestamp 'YYYY-...' # date
244!!omap [ ... ] # array of key-value pairs
245!!pairs [ ... ] # array or array pairs
246!!set { ... } # array of objects with given keys and null values
247!!str '...' # string
248!!seq [ ... ] # array
249!!map { ... } # object
250```
251
252**JavaScript-specific tags**
253
254```
255!!js/regexp /pattern/gim # RegExp
256!!js/undefined '' # Undefined
257!!js/function 'function () {...}' # Function
258```
259
260Caveats
261-------
262
263Note, that you use arrays or objects as key in JS-YAML. JS does not allow objects
264or array as keys, and stringifies (by calling .toString method) them at the
265moment of adding them.
266
267``` yaml
268---
269? [ foo, bar ]
270: - baz
271? { foo: bar }
272: - baz
273 - baz
274```
275
276``` javascript
277{ "foo,bar": ["baz"], "[object Object]": ["baz", "baz"] }
278```
279
280Also, reading of properties on implicit block mapping keys is not supported yet.
281So, the following YAML document cannot be loaded.
282
283``` yaml
284&anchor foo:
285 foo: bar
286 *anchor: duplicate key
287 baz: bat
288 *anchor: duplicate key
289```
290
291
292Breaking changes in 2.x.x -> 3.x.x
293----------------------------------
294
295If you have not used __custom__ tags or loader classes and not loaded yaml
296files via `require()` - no changes needed. Just upgrade library.
297
298Otherwise, you should:
299
3001. Replace all occurences of `require('xxxx.yml')` by `fs.readFileSync()` +
301 `yaml.safeLoad()`.
3022. rewrite your custom tags constructors and custom loader
303 classes, to conform new API. See
304 [examples](https://github.com/nodeca/js-yaml/tree/master/examples) and
305 [wiki](https://github.com/nodeca/js-yaml/wiki) for details.
306
307
308License
309-------
310
311View the [LICENSE](https://github.com/nodeca/js-yaml/blob/master/LICENSE) file
312(MIT).