| .. | ||
| config | ||
| deno-tests | ||
| e2e | ||
| examples | ||
| scripts | ||
| src | ||
| test | ||
| .denoifyrc.json | ||
| .eslintignore | ||
| .eslintrc.cjs | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc | ||
| HACKING.md | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| tslint.json | ||
Automerge
Automerge is a library of data structures for building collaborative applications, this package is the javascript implementation.
Detailed documentation is available at automerge.org but see the following for a short getting started guid.
Quickstart
First, install the library.
yarn add @automerge/automerge
If you're writing a node application, you can skip straight to Make some
data. If you're in a browser you need a bundler
Bundler setup
@automerge/automerge is a wrapper around a core library which is written in
rust, compiled to WebAssembly and distributed as a separate package called
@automerge/automerge-wasm. Browsers don't currently support WebAssembly
modules taking part in ESM module imports, so you must use a bundler to import
@automerge/automerge in the browser. There are a lot of bundlers out there, we
have examples for common bundlers in the examples folder. Here is a short
example using Webpack 5.
Assuming a standard setup of a new webpack project, you'll need to enable the
asyncWebAssembly experiment. In a typical webpack project that means adding
something like this to webpack.config.js
module.exports = {
...
experiments: { asyncWebAssembly: true },
performance: { // we dont want the wasm blob to generate warnings
hints: false,
maxEntrypointSize: 512000,
maxAssetSize: 512000
}
};
Make some data
Automerge allows to separate threads of execution to make changes to some data and always be able to merge their changes later.
import * as automerge from "@automerge/automerge"
import * as assert from "assert"
let doc1 = automerge.from({
tasks: [
{ description: "feed fish", done: false },
{ description: "water plants", done: false },
],
})
// Create a new thread of execution
let doc2 = automerge.clone(doc1)
// Now we concurrently make changes to doc1 and doc2
// Complete a task in doc2
doc2 = automerge.change(doc2, d => {
d.tasks[0].done = true
})
// Add a task in doc1
doc1 = automerge.change(doc1, d => {
d.tasks.push({
description: "water fish",
done: false,
})
})
// Merge changes from both docs
doc1 = automerge.merge(doc1, doc2)
doc2 = automerge.merge(doc2, doc1)
// Both docs are merged and identical
assert.deepEqual(doc1, {
tasks: [
{ description: "feed fish", done: true },
{ description: "water plants", done: false },
{ description: "water fish", done: false },
],
})
assert.deepEqual(doc2, {
tasks: [
{ description: "feed fish", done: true },
{ description: "water plants", done: false },
{ description: "water fish", done: false },
],
})
Development
See HACKING.md
Meta
Copyright 2017–present, the Automerge contributors. Released under the terms of the
MIT license (see LICENSE).