I have a weird use-case where I need to be able to convert my shared YJS doc to/from a POJO (plain old javascript object). Converting from YJS to pojo is simple with toJSON
but there was no solution to compare a YJS doc with a POJO, and apply whatever changes to the YJS doc are necessary to make it equivalent to the POJO. So I wrote y-pojo.
disclaimer: this is still experimental, and should only be used when you have code that NEEDS a pojo, and cannot use ES6 proxies for maintaining the state. If you are in control of all the client code I would strongly recommend you just use native YJS objects to maintain the state directly.
const first = {
inner: {
foo: "bar"
},
second: 123
}
const target = {
second: 123
}
const doc = new Y.Doc()
const root = doc.getMap("root")
let changed = syncronize(root, first)
// root would now be equivalent to POJO `first`
changed = syncronize(root, target)
// changes have been applied to root to be equivalent to `target`
One of the cooler features in here is that it intelligently detects when an item is removed from or added to an array, treating that as a single remove or insert operation, instead of a cascading “rewrite index 0’s content to match old index 1”, “rewrite index 1 to match old index 2”, etc.
See the examples on how to use it.