loro-crdt
Advanced tools
Comparing version 1.0.7 to 1.0.8-alpha.0
{ | ||
"name": "loro-crdt", | ||
"version": "1.0.7", | ||
"version": "1.0.8-alpha.0", | ||
"description": "Loro CRDTs is a high-performance CRDT framework that makes your app state synchronized, collaborative and maintainable effortlessly.", | ||
@@ -17,34 +17,23 @@ "keywords": [ | ||
}, | ||
"main": "dist/loro.js", | ||
"module": "dist/loro.mjs", | ||
"typings": "dist/loro.d.ts", | ||
"author": "Loro", | ||
"main": "nodejs/index.js", | ||
"module": "bundler/index.js", | ||
"types": "bundler/index.d.ts", | ||
"scripts": { | ||
"build-dev": "deno run -A ./scripts/build.ts dev && rollup -c && deno run -A ./scripts/post-rollup.ts && npm run test", | ||
"build-release": "deno run -A ./scripts/build.ts release && rollup -c && deno run -A ./scripts/post-rollup.ts && npm run test", | ||
"test": "cd ./deno_tests && deno test -A" | ||
}, | ||
"homepage": "https://loro.dev", | ||
"author": "", | ||
"license": "MIT", | ||
"dependencies": { | ||
"loro-wasm": "1.0.7" | ||
}, | ||
"devDependencies": { | ||
"@rollup/plugin-alias": "^5.1.1", | ||
"@rollup/plugin-node-resolve": "^15.0.1", | ||
"@typescript-eslint/parser": "^6.2.0", | ||
"@vitest/ui": "^1.0.4", | ||
"esbuild": "^0.18.20", | ||
"eslint": "^8.46.0", | ||
"loro-crdt-old": "npm:loro-crdt@=0.16.0", | ||
"loro-crdt-alpha-4": "npm:loro-crdt@=1.0.0-alpha.4", | ||
"prettier": "^3.0.0", | ||
"@rollup/plugin-typescript": "^12.1.1", | ||
"rollup": "^3.20.1", | ||
"rollup-plugin-dts": "^5.3.0", | ||
"rollup-plugin-esbuild": "^5.0.0", | ||
"typescript": "^5.0.2", | ||
"vite": "^4.2.1", | ||
"vite-plugin-wasm": "^3.2.2", | ||
"vitest": "^1.4.0" | ||
}, | ||
"scripts": { | ||
"build": "rollup -c", | ||
"watch": "rollup -c -w", | ||
"test": "node --expose-gc ./node_modules/vitest/vitest.mjs run && npx tsc --noEmit", | ||
"prepublish": "pnpm run build" | ||
"tslib": "^2.8.0", | ||
"typescript": "^5.6.3", | ||
"vite-plugin-top-level-await": "^1.2.2", | ||
"vite-plugin-wasm": "^3.1.0" | ||
} | ||
} | ||
} |
@@ -41,8 +41,8 @@ <p align="center"> | ||
https://github.com/loro-dev/loro/assets/18425020/fe246c47-a120-44b3-91d4-1e7232a5b4ac | ||
<h4 align="center"> | ||
✨ Loro 1.0 is out! Read the <a href="https://loro.dev/blog/v1.0">announcement</a>. | ||
</h4> | ||
Loro is a [CRDTs(Conflict-free Replicated Data Types)](https://crdt.tech/) library that makes building [local-first apps][local-first] easier. It is currently available for JavaScript (via WASM) and Rust developers. | ||
Loro is a [CRDTs(Conflict-free Replicated Data Types)](https://crdt.tech/) library that makes building [local-first apps][local-first] easier. It is currently available for JavaScript (via WASM) and Rust developers. | ||
Explore our vision in our blog: [**✨ Reimagine State Management with CRDTs**](https://loro.dev/blog/loro-now-open-source). | ||
# Features | ||
@@ -69,7 +69,10 @@ | ||
- 📖 Preserve Editing History in a [Replayable Event Graph](https://loro.dev/docs/advanced/replayable_event_graph) | ||
- ⏱️ Fast [Time Travel](https://loro.dev/docs/tutorial/time_travel) Through History | ||
- 🏛️ [Version Control with Real-Time Collaboration](https://loro.dev/blog/v1.0#version-control) | ||
- 📦 [Shallow Snapshot](https://loro.dev/docs/advanced/shallow_snapshot) that Works like Git Shallow Clone | ||
https://github.com/loro-dev/loro/assets/18425020/ec2d20a3-3d8c-4483-a601-b200243c9792 | ||
> In this example, we demonstrate importing an entire Loro codebase into a Loro-powered | ||
> version controller, preserving the complete Git DAG history while enabling fast version switching. | ||
# Example | ||
@@ -81,44 +84,46 @@ | ||
import { expect, test } from 'vitest'; | ||
import { Loro, LoroList } from 'loro-crdt'; | ||
import { LoroDoc, LoroList } from 'loro-crdt'; | ||
/** | ||
* Demonstrates synchronization of two documents with two rounds of exchanges. | ||
*/ | ||
// Initialize document A | ||
const docA = new Loro(); | ||
const listA: LoroList = docA.getList('list'); | ||
listA.insert(0, 'A'); | ||
listA.insert(1, 'B'); | ||
listA.insert(2, 'C'); | ||
test('sync example', () => { | ||
/** | ||
* Demonstrates synchronization of two documents with two rounds of exchanges. | ||
*/ | ||
// Initialize document A | ||
const docA = new LoroDoc(); | ||
const listA: LoroList = docA.getList('list'); | ||
listA.insert(0, 'A'); | ||
listA.insert(1, 'B'); | ||
listA.insert(2, 'C'); | ||
// Export the state of document A as a byte array | ||
const bytes: Uint8Array = docA.exportFrom(); | ||
// Export the state of document A as a byte array | ||
const bytes: Uint8Array = docA.export({ mode: 'update' }); | ||
// Simulate sending `bytes` across the network to another peer, B | ||
const docB = new Loro(); | ||
// Peer B imports the updates from A | ||
docB.import(bytes); | ||
// Simulate sending `bytes` across the network to another peer, B | ||
const docB = new LoroDoc(); | ||
// Peer B imports the updates from A | ||
docB.import(bytes); | ||
// Verify that B's state matches A's state | ||
expect(docB.toJSON()).toStrictEqual({ | ||
list: ['A', 'B', 'C'], | ||
}); | ||
// Verify that B's state matches A's state | ||
expect(docB.toJSON()).toStrictEqual({ | ||
list: ['A', 'B', 'C'], | ||
}); | ||
// Get the current operation log version of document B | ||
const version = docB.oplogVersion(); | ||
// Get the current operation log version of document B | ||
const version = docB.oplogVersion(); | ||
// Simulate editing at B: delete item 'B' | ||
const listB: LoroList = docB.getList('list'); | ||
listB.delete(1, 1); | ||
// Simulate editing at B: delete item 'B' | ||
const listB: LoroList = docB.getList('list'); | ||
listB.delete(1, 1); | ||
// Export the updates from B since the last synchronization point | ||
const bytesB: Uint8Array = docB.exportFrom(version); | ||
// Export the updates from B since the last synchronization point | ||
const bytesB: Uint8Array = docB.export({ mode: 'update', from: version }); | ||
// Simulate sending `bytesB` back across the network to A | ||
// A imports the updates from B | ||
docA.import(bytesB); | ||
// Simulate sending `bytesB` back across the network to A | ||
// A imports the updates from B | ||
docA.import(bytesB); | ||
// Verify that the list at A now matches the list at B after merging | ||
expect(docA.toJSON()).toStrictEqual({ | ||
list: ['A', 'C'], | ||
// Verify that the list at A now matches the list at B after merging | ||
expect(docA.toJSON()).toStrictEqual({ | ||
list: ['A', 'C'], | ||
}); | ||
}); | ||
@@ -132,5 +137,5 @@ ``` | ||
- [Ink & Switch](https://inkandswitch.com/): The principles of Local-first Software have greatly influenced this project. The [Peritext](https://www.inkandswitch.com/peritext/) project has also shaped our approach to rich text CRDTs. | ||
- [Diamond-types](https://github.com/josephg/diamond-types): The [Replayable Event Graph (REG)](https://loro.dev/docs/advanced/replayable_event_graph) algorithm from @josephg has been adapted to reduce the computation and space usage of CRDTs. | ||
- [Diamond-types](https://github.com/josephg/diamond-types): The [Event Graph Walker (Eg-walker)](https://loro.dev/docs/advanced/event_graph_walker) algorithm from @josephg has been adapted to reduce the computation and space usage of CRDTs. | ||
- [Automerge](https://github.com/automerge/automerge): Their use of columnar encoding for CRDTs has informed our strategies for efficient data encoding. | ||
- [Yjs](https://github.com/yjs/yjs): We have incorporated a similar algorithm for effectively merging collaborative editing operations, thanks to their pioneering works. | ||
- [Yjs](https://github.com/yjs/yjs): We have incorporated a similar algorithm for effectively merging collaborative editing operations, thanks to their pioneering work. | ||
- [Matthew Weidner](https://mattweidner.com/): His work on the [Fugue](https://arxiv.org/abs/2305.00583) algorithm has been invaluable, enhancing our text editing capabilities. | ||
@@ -137,0 +142,0 @@ - [Martin Kleppmann](https://martin.kleppmann.com/): His work on CRDTs has significantly influenced our comprehension of the field. |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 2 instances in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
No contributors or author data
MaintenancePackage does not specify a list of contributors or an author in package.json.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
6499880
0
8
22
18598
144
2
2
2
4
- Removedloro-wasm@1.0.7
- Removedloro-wasm@1.0.7(transitive)