Read files explicitly as UTF-8 and pass the filename to load() so parse
errors identify the input source:
import { readFileSync } from 'node:fs'
import { load } from 'js-yaml'
const filename = 'config.yml'
try {
const source = readFileSync(filename, 'utf8')
const config = load(source, { filename })
console.log(`Starting ${config.service.name} on port ${config.service.port}`)
} catch (e) {
console.error(e instanceof Error ? e.message : String(e))
process.exitCode = 1
}
For a stream containing several YAML documents, use loadAll():
import { loadAll } from 'js-yaml'
try {
const documents = loadAll(`
---
name: api
port: 8080
---
name: worker
concurrency: 4
`)
console.log(documents)
} catch (e) {
console.error(e)
}
Unlike load(), loadAll() accepts empty and multi-document streams. It
returns an array; an empty stream produces an empty array.
The most frequent cases are:
Map instances.Here is how to do that:
import { CORE_SCHEMA, mergeTag, realMapTag } from 'js-yaml'
const schema = CORE_SCHEMA.withTags(mergeTag, realMapTag)
For the most robust object-based mappings, use objects without a prototype and accept only string keys:
import { CORE_SCHEMA, load, mapTag } from 'js-yaml'
const schema = CORE_SCHEMA.withTags({
...mapTag,
create: () => Object.create(null),
addPair: (container, key, value) => {
if (typeof key !== 'string') return 'object-based map supports only string keys'
container[key] = value
return ''
},
has: (container, key) => typeof key === 'string' && key in container,
get: (container, key) => {
if (typeof key !== 'string' || !(key in container)) return null
return container[key]
}
})
try {
const config = load('{ enabled: true, level: 2 }', { schema })
} catch (e) {
console.error(e)
}
This is not the default because objects without a prototype break many common
usage examples and equality checks. Still, consider using realMapTag instead.
dump() returns a YAML string with a trailing newline:
import { dump } from 'js-yaml'
const config = {
service: { name: 'api', ports: [8080, 8081] },
logging: { level: 'info' }
}
const output = dump(config, { lineWidth: 100 })
console.log(output)
Unsupported values, such as functions, cause an exception by default. Use
skipInvalid: true only when silently dropping those values is intentional.
Use DUMP_SCHEMA as the base so its compatibility and quoting rules remain
active.
import { DUMP_SCHEMA, boolYaml11Tag, dump, nullYaml11Tag } from 'js-yaml'
// Instead of defining a new tag, we override a single method of clone
// in one line. That's compact and simple.
const schema = DUMP_SCHEMA.withTags(
{ ...boolYaml11Tag, represent: value => value ? 'TRUE' : 'FALSE' },
{ ...nullYaml11Tag, represent: () => '' }
)
const output = dump({
enabled: true,
archived: false,
parent: null
}, { schema })
console.log(output)
Output:
enabled: TRUE
archived: FALSE
parent:
The CLI is intentionally minimal, with no plans to extend its feature set.
npx js-yaml -h