You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

314 lines
9.9 KiB

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