An EDN reader and an EDN writer for JS. It tries to use native JS types when possible but currently JS has no equivalent of EDN's List or UUID; so edn-js provides them.
In addition to standard EDN this implementation also supports cyclic data.
npm install edn-js
then in your app:
const {read,write,edn,List,UUID} = require('edn-js')
Just takes a string of EDN data and returns the best approximation of it in native JS data
read('[1 2]') // => [1, 2]
read('#{1 2}') // => new Set([1, 2])
read('{1 2}') // => new Map([[1, 2]])
Converts any value to its EDN representation. If its not a builtin type then it should implement either toEDN()
returning a string or toJSON()
returning a plain Object
.
write(new Date(0)) // => '#inst "1970-01-01T00:00:00.000Z"'
write(new Set([1,2,3])) // => '#{1 2 3}'
write(new Map([[Symbol('a'), 1]])) // => '{a 1}'
write({a: 1, b: 2}) // => '#js/Object {"a" 1 "b" 2}'
write([1,2]) // => '#js/Array [1 2]'
This function is designed to be used with ES6's tagged template strings
edn`(1 2)` // => List.from([1,2])
And if you want to interpolate values it does it without serializing them so identity is preserved
const object = {}
edn`(${object})` // => List.from([object])
const m = new Map
m.set('self', m)
write(m) // => '{"self" # 1}'
const copy = read('{"self" # 1}')
copy.get('self') == copy // => true