diff --git a/components/api/LanguageSelector.tsx b/components/api/LanguageSelector.tsx
deleted file mode 100644
index 643849f..0000000
--- a/components/api/LanguageSelector.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useRouter } from 'next/router';
-
-const languages = [
- { id: 'js', name: 'JavaScript / TypeScript', available: true },
- { id: 'rust', name: 'Rust', available: false },
- { id: 'python', name: 'Python', available: false },
- { id: 'swift', name: 'Swift', available: false },
-];
-
-export default function LanguageSelector() {
- const router = useRouter();
- const [selectedLang, setSelectedLang] = useState('js');
-
- useEffect(() => {
- // Get language from URL query or localStorage
- const urlLang = router.query.lang as string;
- const storedLang = localStorage.getItem('loro-api-lang');
-
- if (urlLang && languages.find(l => l.id === urlLang)) {
- setSelectedLang(urlLang);
- localStorage.setItem('loro-api-lang', urlLang);
- } else if (storedLang && languages.find(l => l.id === storedLang)) {
- setSelectedLang(storedLang);
- }
- }, [router.query.lang]);
-
- const handleLanguageChange = (langId: string) => {
- const lang = languages.find(l => l.id === langId);
- if (lang && lang.available) {
- setSelectedLang(langId);
- localStorage.setItem('loro-api-lang', langId);
-
- // Update URL without navigation
- const newUrl = new URL(window.location.href);
- newUrl.searchParams.set('lang', langId);
- window.history.pushState({}, '', newUrl.toString());
- }
- };
-
- return (
-
-
-
- Select Language/Binding:
-
-
-
- {languages.map((lang) => (
-
- ))}
-
- {selectedLang !== 'js' && (
-
-
API documentation for {languages.find(l => l.id === selectedLang)?.name} is coming soon.
-
Currently showing JavaScript/TypeScript API reference.
-
- )}
-
- );
-}
\ No newline at end of file
diff --git a/deno_scripts/deno.lock b/deno_scripts/deno.lock
index 471c2bb..b70ca95 100644
--- a/deno_scripts/deno.lock
+++ b/deno_scripts/deno.lock
@@ -1,60 +1,45 @@
{
"version": "5",
"specifiers": {
- "jsr:@std/fs@*": "1.0.4",
- "jsr:@std/path@^1.0.6": "1.0.6",
- "npm:expect@*": "29.7.0",
+ "jsr:@std/fs@*": "1.0.24",
+ "jsr:@std/internal@^1.0.14": "1.0.14",
+ "jsr:@std/path@^1.1.5": "1.1.5",
"npm:expect@29.7.0": "29.7.0",
- "npm:expect@^30.0.5": "30.0.5",
- "npm:loro-crdt@*": "0.15.1",
- "npm:loro-crdt@0.15.1": "0.15.1",
- "npm:loro-crdt@1.0.0-beta.5": "1.0.0-beta.5",
- "npm:loro-crdt@1.5.10": "1.5.10"
+ "npm:expect@^30.0.5": "30.4.1",
+ "npm:loro-crdt@1.13.3": "1.13.3"
},
"jsr": {
- "@std/fs@1.0.4": {
- "integrity": "2907d32d8d1d9e540588fd5fe0ec21ee638134bd51df327ad4e443aaef07123c",
+ "@std/fs@1.0.24": {
+ "integrity": "f3061b45b81673a2bece689da041df32d174be064c89eb6397fb5718d3fb7877",
"dependencies": [
+ "jsr:@std/internal",
"jsr:@std/path"
]
},
- "@std/path@1.0.6": {
- "integrity": "ab2c55f902b380cf28e0eec501b4906e4c1960d13f00e11cfbcd21de15f18fed"
+ "@std/internal@1.0.14": {
+ "integrity": "291516b3d4c35024d6ffbc0a9df5bf4c64116e05b50012cf846710152d2ffdf7"
+ },
+ "@std/path@1.1.5": {
+ "integrity": "ccea00982ea28c36becaf6e62f855406c76a8c32d462f66f415bbb7d83a271bc",
+ "dependencies": [
+ "jsr:@std/internal"
+ ]
}
},
"npm": {
- "@babel/code-frame@7.25.9": {
- "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==",
+ "@babel/code-frame@7.29.7": {
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
"dependencies": [
- "@babel/highlight",
- "picocolors"
- ]
- },
- "@babel/code-frame@7.27.1": {
- "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
- "dependencies": [
- "@babel/helper-validator-identifier@7.27.1",
+ "@babel/helper-validator-identifier",
"js-tokens",
"picocolors"
]
},
- "@babel/helper-validator-identifier@7.25.9": {
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
- },
- "@babel/helper-validator-identifier@7.27.1": {
- "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
- },
- "@babel/highlight@7.25.9": {
- "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==",
- "dependencies": [
- "@babel/helper-validator-identifier@7.25.9",
- "chalk@2.4.2",
- "js-tokens",
- "picocolors"
- ]
+ "@babel/helper-validator-identifier@7.29.7": {
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="
},
- "@jest/diff-sequences@30.0.1": {
- "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw=="
+ "@jest/diff-sequences@30.4.0": {
+ "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g=="
},
"@jest/expect-utils@29.7.0": {
"integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
@@ -62,32 +47,32 @@
"jest-get-type"
]
},
- "@jest/expect-utils@30.0.5": {
- "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==",
+ "@jest/expect-utils@30.4.1": {
+ "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==",
"dependencies": [
"@jest/get-type"
]
},
- "@jest/get-type@30.0.1": {
- "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw=="
+ "@jest/get-type@30.1.0": {
+ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA=="
},
- "@jest/pattern@30.0.1": {
- "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==",
+ "@jest/pattern@30.4.0": {
+ "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==",
"dependencies": [
- "@types/node@22.12.0",
+ "@types/node",
"jest-regex-util"
]
},
"@jest/schemas@29.6.3": {
"integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
"dependencies": [
- "@sinclair/typebox@0.27.8"
+ "@sinclair/typebox@0.27.10"
]
},
- "@jest/schemas@30.0.5": {
- "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==",
+ "@jest/schemas@30.4.1": {
+ "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==",
"dependencies": [
- "@sinclair/typebox@0.34.38"
+ "@sinclair/typebox@0.34.49"
]
},
"@jest/types@29.6.3": {
@@ -96,28 +81,28 @@
"@jest/schemas@29.6.3",
"@types/istanbul-lib-coverage",
"@types/istanbul-reports",
- "@types/node@22.5.4",
+ "@types/node",
"@types/yargs",
- "chalk@4.1.2"
+ "chalk"
]
},
- "@jest/types@30.0.5": {
- "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==",
+ "@jest/types@30.4.1": {
+ "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==",
"dependencies": [
"@jest/pattern",
- "@jest/schemas@30.0.5",
+ "@jest/schemas@30.4.1",
"@types/istanbul-lib-coverage",
"@types/istanbul-reports",
- "@types/node@22.12.0",
+ "@types/node",
"@types/yargs",
- "chalk@4.1.2"
+ "chalk"
]
},
- "@sinclair/typebox@0.27.8": {
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="
+ "@sinclair/typebox@0.27.10": {
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="
},
- "@sinclair/typebox@0.34.38": {
- "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA=="
+ "@sinclair/typebox@0.34.49": {
+ "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A=="
},
"@types/istanbul-lib-coverage@2.0.6": {
"integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="
@@ -134,16 +119,10 @@
"@types/istanbul-lib-report"
]
},
- "@types/node@22.12.0": {
- "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
- "dependencies": [
- "undici-types@6.20.0"
- ]
- },
- "@types/node@22.5.4": {
- "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==",
+ "@types/node@25.9.3": {
+ "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==",
"dependencies": [
- "undici-types@6.19.8"
+ "undici-types"
]
},
"@types/stack-utils@2.0.3": {
@@ -152,22 +131,16 @@
"@types/yargs-parser@21.0.3": {
"integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="
},
- "@types/yargs@17.0.33": {
- "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "@types/yargs@17.0.35": {
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
"dependencies": [
"@types/yargs-parser"
]
},
- "ansi-styles@3.2.1": {
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": [
- "color-convert@1.9.3"
- ]
- },
"ansi-styles@4.3.0": {
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dependencies": [
- "color-convert@2.0.1"
+ "color-convert"
]
},
"ansi-styles@5.2.0": {
@@ -179,51 +152,31 @@
"fill-range"
]
},
- "chalk@2.4.2": {
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": [
- "ansi-styles@3.2.1",
- "escape-string-regexp@1.0.5",
- "supports-color@5.5.0"
- ]
- },
"chalk@4.1.2": {
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dependencies": [
"ansi-styles@4.3.0",
- "supports-color@7.2.0"
+ "supports-color"
]
},
"ci-info@3.9.0": {
"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="
},
- "ci-info@4.3.0": {
- "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ=="
- },
- "color-convert@1.9.3": {
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": [
- "color-name@1.1.3"
- ]
+ "ci-info@4.4.0": {
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="
},
"color-convert@2.0.1": {
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dependencies": [
- "color-name@1.1.4"
+ "color-name"
]
},
- "color-name@1.1.3": {
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
"color-name@1.1.4": {
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"diff-sequences@29.6.3": {
"integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="
},
- "escape-string-regexp@1.0.5": {
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
- },
"escape-string-regexp@2.0.0": {
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
},
@@ -237,15 +190,15 @@
"jest-util@29.7.0"
]
},
- "expect@30.0.5": {
- "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==",
+ "expect@30.4.1": {
+ "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==",
"dependencies": [
- "@jest/expect-utils@30.0.5",
+ "@jest/expect-utils@30.4.1",
"@jest/get-type",
- "jest-matcher-utils@30.0.5",
- "jest-message-util@30.0.5",
+ "jest-matcher-utils@30.4.1",
+ "jest-message-util@30.4.1",
"jest-mock",
- "jest-util@30.0.5"
+ "jest-util@30.4.1"
]
},
"fill-range@7.1.1": {
@@ -257,9 +210,6 @@
"graceful-fs@4.2.11": {
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
- "has-flag@3.0.0": {
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
- },
"has-flag@4.0.0": {
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
@@ -269,19 +219,19 @@
"jest-diff@29.7.0": {
"integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
"dependencies": [
- "chalk@4.1.2",
+ "chalk",
"diff-sequences",
"jest-get-type",
"pretty-format@29.7.0"
]
},
- "jest-diff@30.0.5": {
- "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==",
+ "jest-diff@30.4.1": {
+ "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==",
"dependencies": [
"@jest/diff-sequences",
"@jest/get-type",
- "chalk@4.1.2",
- "pretty-format@30.0.5"
+ "chalk",
+ "pretty-format@30.4.1"
]
},
"jest-get-type@29.6.3": {
@@ -290,28 +240,28 @@
"jest-matcher-utils@29.7.0": {
"integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
"dependencies": [
- "chalk@4.1.2",
+ "chalk",
"jest-diff@29.7.0",
"jest-get-type",
"pretty-format@29.7.0"
]
},
- "jest-matcher-utils@30.0.5": {
- "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==",
+ "jest-matcher-utils@30.4.1": {
+ "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==",
"dependencies": [
"@jest/get-type",
- "chalk@4.1.2",
- "jest-diff@30.0.5",
- "pretty-format@30.0.5"
+ "chalk",
+ "jest-diff@30.4.1",
+ "pretty-format@30.4.1"
]
},
"jest-message-util@29.7.0": {
"integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
"dependencies": [
- "@babel/code-frame@7.25.9",
+ "@babel/code-frame",
"@jest/types@29.6.3",
"@types/stack-utils",
- "chalk@4.1.2",
+ "chalk",
"graceful-fs",
"micromatch",
"pretty-format@29.7.0",
@@ -319,131 +269,112 @@
"stack-utils"
]
},
- "jest-message-util@30.0.5": {
- "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==",
+ "jest-message-util@30.4.1": {
+ "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==",
"dependencies": [
- "@babel/code-frame@7.27.1",
- "@jest/types@30.0.5",
+ "@babel/code-frame",
+ "@jest/types@30.4.1",
"@types/stack-utils",
- "chalk@4.1.2",
+ "chalk",
"graceful-fs",
- "micromatch",
- "pretty-format@30.0.5",
+ "jest-util@30.4.1",
+ "picomatch@4.0.4",
+ "pretty-format@30.4.1",
"slash",
"stack-utils"
]
},
- "jest-mock@30.0.5": {
- "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==",
+ "jest-mock@30.4.1": {
+ "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==",
"dependencies": [
- "@jest/types@30.0.5",
- "@types/node@22.12.0",
- "jest-util@30.0.5"
+ "@jest/types@30.4.1",
+ "@types/node",
+ "jest-util@30.4.1"
]
},
- "jest-regex-util@30.0.1": {
- "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="
+ "jest-regex-util@30.4.0": {
+ "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg=="
},
"jest-util@29.7.0": {
"integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
"dependencies": [
"@jest/types@29.6.3",
- "@types/node@22.5.4",
- "chalk@4.1.2",
+ "@types/node",
+ "chalk",
"ci-info@3.9.0",
"graceful-fs",
- "picomatch@2.3.1"
+ "picomatch@2.3.2"
]
},
- "jest-util@30.0.5": {
- "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==",
+ "jest-util@30.4.1": {
+ "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==",
"dependencies": [
- "@jest/types@30.0.5",
- "@types/node@22.12.0",
- "chalk@4.1.2",
- "ci-info@4.3.0",
+ "@jest/types@30.4.1",
+ "@types/node",
+ "chalk",
+ "ci-info@4.4.0",
"graceful-fs",
- "picomatch@4.0.3"
+ "picomatch@4.0.4"
]
},
"js-tokens@4.0.0": {
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
- "loro-crdt@0.15.1": {
- "integrity": "sha512-2pK3IchNL2ZLl9Q53rgjWLP1Cr0uCDvChnb9o5NgQVamOD4ap5rHeDfIk05PVKn9epgHn2NCSacvFFepUYJGZg==",
- "dependencies": [
- "loro-wasm@0.15.1"
- ]
- },
- "loro-crdt@1.0.0-beta.5": {
- "integrity": "sha512-vSs4YDabF4iuwNX15djXQNoV6+sORNzqC6vrurOGN1VFlJ15TlBKkR5Y0WF30UBx1RTuI3tUBtcEm+vqiJKsgA==",
- "dependencies": [
- "loro-wasm@1.0.0-beta.5"
- ]
- },
- "loro-crdt@1.5.10": {
- "integrity": "sha512-dBAw3Hh9EJLaS5MqyNMoZRq7r01UxLWUdm3go2v2EtYIrH658IG0vcktHuZqeEwyTMvE5eUtyHhLx3lgUyDFfw=="
- },
- "loro-wasm@0.15.1": {
- "integrity": "sha512-1ZRJgD3WJzFDBEHnMMiciaszt1iuM7BwJECggjNqCH1wBhGJ6gNk777b1pLQvuqHP1rU8LDcKeWaYwnavep17g=="
- },
- "loro-wasm@1.0.0-beta.5": {
- "integrity": "sha512-UR8dOyNKmRR6gABr7KfjKCGgEWDR6yR2AuN59Kbz0QkNIOztMYdQnSlSl4x7vKpkK+rz2QmhkNUD3KdzkANVHw=="
+ "loro-crdt@1.13.3": {
+ "integrity": "sha512-vh+hYxvsGL9MrsUaquPpawbrL97R4Qb84nc41xTh0zEEz7tJsdioH4mhbsLi0R659LFj3/xII2ML2ScZYJTw9Q=="
},
"micromatch@4.0.8": {
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dependencies": [
"braces",
- "picomatch@2.3.1"
+ "picomatch@2.3.2"
]
},
"picocolors@1.1.1": {
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
},
- "picomatch@2.3.1": {
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ "picomatch@2.3.2": {
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="
},
- "picomatch@4.0.3": {
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="
+ "picomatch@4.0.4": {
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="
},
"pretty-format@29.7.0": {
"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dependencies": [
"@jest/schemas@29.6.3",
"ansi-styles@5.2.0",
- "react-is"
+ "react-is@18.3.1"
]
},
- "pretty-format@30.0.5": {
- "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==",
+ "pretty-format@30.4.1": {
+ "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==",
"dependencies": [
- "@jest/schemas@30.0.5",
+ "@jest/schemas@30.4.1",
"ansi-styles@5.2.0",
- "react-is"
+ "react-is-18@npm:react-is@18.3.1",
+ "react-is-19@npm:react-is@19.2.7"
]
},
"react-is@18.3.1": {
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
},
+ "react-is@19.2.7": {
+ "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A=="
+ },
"slash@3.0.0": {
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
},
"stack-utils@2.0.6": {
"integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
"dependencies": [
- "escape-string-regexp@2.0.0"
- ]
- },
- "supports-color@5.5.0": {
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": [
- "has-flag@3.0.0"
+ "escape-string-regexp"
]
},
"supports-color@7.2.0": {
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dependencies": [
- "has-flag@4.0.0"
+ "has-flag"
]
},
"to-regex-range@5.0.1": {
@@ -452,16 +383,10 @@
"is-number"
]
},
- "undici-types@6.19.8": {
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
- },
- "undici-types@6.20.0": {
- "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
+ "undici-types@7.24.6": {
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="
}
},
- "redirects": {
- "https://deno.land/std/fs/mod.ts": "https://deno.land/std@0.224.0/fs/mod.ts"
- },
"remote": {
"https://deno.land/std@0.139.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.139.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617",
@@ -481,7 +406,6 @@
"https://deno.land/std@0.220.1/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412",
"https://deno.land/std@0.220.1/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e",
"https://deno.land/std@0.220.1/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5",
- "https://deno.land/std@0.220.1/fs/expand_glob.ts": "a1ce02b05ed7b96985b0665067c9f1018f3f2ade7ee0fb0d629231050260b158",
"https://deno.land/std@0.220.1/fs/walk.ts": "78e1d01a9f75715614bf8d6e58bd77d9fafb1222c41194e607cd3849d7a0e771",
"https://deno.land/std@0.220.1/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8",
"https://deno.land/std@0.220.1/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2",
@@ -559,71 +483,7 @@
"https://deno.land/std@0.220.1/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7",
"https://deno.land/std@0.220.1/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972",
"https://deno.land/std@0.220.1/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e",
- "https://deno.land/std@0.220.1/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c",
- "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834",
- "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917",
- "https://deno.land/std@0.224.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412",
- "https://deno.land/std@0.224.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd",
- "https://deno.land/std@0.224.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f",
- "https://deno.land/std@0.224.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd",
- "https://deno.land/std@0.224.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e",
- "https://deno.land/std@0.224.0/fs/copy.ts": "7ab12a16adb65d155d4943c88081ca16ce3b0b5acada64c1ce93800653678039",
- "https://deno.land/std@0.224.0/fs/empty_dir.ts": "e400e96e1d2c8c558a5a1712063bd43939e00619c1d1cc29959babc6f1639418",
- "https://deno.land/std@0.224.0/fs/ensure_dir.ts": "51a6279016c65d2985f8803c848e2888e206d1b510686a509fa7cc34ce59d29f",
- "https://deno.land/std@0.224.0/fs/ensure_file.ts": "67608cf550529f3d4aa1f8b6b36bf817bdc40b14487bf8f60e61cbf68f507cf3",
- "https://deno.land/std@0.224.0/fs/ensure_link.ts": "5c98503ebfa9cc05e2f2efaa30e91e60b4dd5b43ebbda82f435c0a5c6e3ffa01",
- "https://deno.land/std@0.224.0/fs/ensure_symlink.ts": "cafe904cebacb9a761977d6dbf5e3af938be946a723bb394080b9a52714fafe4",
- "https://deno.land/std@0.224.0/fs/eol.ts": "18c4ac009d0318504c285879eb7f47942643f13619e0ff070a0edc59353306bd",
- "https://deno.land/std@0.224.0/fs/exists.ts": "3d38cb7dcbca3cf313be343a7b8af18a87bddb4b5ca1bd2314be12d06533b50f",
- "https://deno.land/std@0.224.0/fs/expand_glob.ts": "2e428d90acc6676b2aa7b5c78ef48f30641b13f1fe658e7976c9064fb4b05309",
- "https://deno.land/std@0.224.0/fs/mod.ts": "c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4",
- "https://deno.land/std@0.224.0/fs/move.ts": "ca205d848908d7f217353bc5c623627b1333490b8b5d3ef4cab600a700c9bd8f",
- "https://deno.land/std@0.224.0/fs/walk.ts": "cddf87d2705c0163bff5d7767291f05b0f46ba10b8b28f227c3849cace08d303",
- "https://deno.land/std@0.224.0/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8",
- "https://deno.land/std@0.224.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2",
- "https://deno.land/std@0.224.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c",
- "https://deno.land/std@0.224.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8",
- "https://deno.land/std@0.224.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf",
- "https://deno.land/std@0.224.0/path/_common/glob_to_reg_exp.ts": "6cac16d5c2dc23af7d66348a7ce430e5de4e70b0eede074bdbcf4903f4374d8d",
- "https://deno.land/std@0.224.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8",
- "https://deno.land/std@0.224.0/path/_common/normalize_string.ts": "33edef773c2a8e242761f731adeb2bd6d683e9c69e4e3d0092985bede74f4ac3",
- "https://deno.land/std@0.224.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a",
- "https://deno.land/std@0.224.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15",
- "https://deno.land/std@0.224.0/path/basename.ts": "7ee495c2d1ee516ffff48fb9a93267ba928b5a3486b550be73071bc14f8cc63e",
- "https://deno.land/std@0.224.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36",
- "https://deno.land/std@0.224.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c",
- "https://deno.land/std@0.224.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069",
- "https://deno.land/std@0.224.0/path/glob_to_regexp.ts": "7f30f0a21439cadfdae1be1bf370880b415e676097fda584a63ce319053b5972",
- "https://deno.land/std@0.224.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7",
- "https://deno.land/std@0.224.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141",
- "https://deno.land/std@0.224.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a",
- "https://deno.land/std@0.224.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0",
- "https://deno.land/std@0.224.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352",
- "https://deno.land/std@0.224.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d",
- "https://deno.land/std@0.224.0/path/posix/basename.ts": "d2fa5fbbb1c5a3ab8b9326458a8d4ceac77580961b3739cd5bfd1d3541a3e5f0",
- "https://deno.land/std@0.224.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1",
- "https://deno.land/std@0.224.0/path/posix/dirname.ts": "76cd348ffe92345711409f88d4d8561d8645353ac215c8e9c80140069bf42f00",
- "https://deno.land/std@0.224.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40",
- "https://deno.land/std@0.224.0/path/posix/glob_to_regexp.ts": "76f012fcdb22c04b633f536c0b9644d100861bea36e9da56a94b9c589a742e8f",
- "https://deno.land/std@0.224.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede",
- "https://deno.land/std@0.224.0/path/posix/join.ts": "7fc2cb3716aa1b863e990baf30b101d768db479e70b7313b4866a088db016f63",
- "https://deno.land/std@0.224.0/path/posix/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25",
- "https://deno.land/std@0.224.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91",
- "https://deno.land/std@0.224.0/path/posix/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6",
- "https://deno.land/std@0.224.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf",
- "https://deno.land/std@0.224.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d",
- "https://deno.land/std@0.224.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808",
- "https://deno.land/std@0.224.0/path/windows/basename.ts": "6bbc57bac9df2cec43288c8c5334919418d784243a00bc10de67d392ab36d660",
- "https://deno.land/std@0.224.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5",
- "https://deno.land/std@0.224.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9",
- "https://deno.land/std@0.224.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01",
- "https://deno.land/std@0.224.0/path/windows/glob_to_regexp.ts": "e45f1f89bf3fc36f94ab7b3b9d0026729829fabc486c77f414caebef3b7304f8",
- "https://deno.land/std@0.224.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a",
- "https://deno.land/std@0.224.0/path/windows/join.ts": "8d03530ab89195185103b7da9dfc6327af13eabdcd44c7c63e42e27808f50ecf",
- "https://deno.land/std@0.224.0/path/windows/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25",
- "https://deno.land/std@0.224.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780",
- "https://deno.land/std@0.224.0/path/windows/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6",
- "https://deno.land/std@0.224.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972"
+ "https://deno.land/std@0.220.1/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c"
},
"workspace": {
"dependencies": [
diff --git a/deno_scripts/loro.ts b/deno_scripts/loro.ts
index 4efbae9..d98bb75 100644
--- a/deno_scripts/loro.ts
+++ b/deno_scripts/loro.ts
@@ -1,4 +1,4 @@
-import { LoroDoc } from "npm:loro-crdt@1.5.2";
+import { LoroDoc } from "npm:loro-crdt@1.13.3";
const doc = new LoroDoc();
doc.getCursorPos;
diff --git a/deno_scripts/run_code_blocks.ts b/deno_scripts/run_code_blocks.ts
index 7699f3d..f689998 100644
--- a/deno_scripts/run_code_blocks.ts
+++ b/deno_scripts/run_code_blocks.ts
@@ -2,7 +2,12 @@ import { walk } from "jsr:@std/fs";
import { CodeBlock, extractCodeBlocks } from "./extract_code_blocks.ts";
import { resolve } from "https://deno.land/std@0.139.0/path/mod.ts";
-const LORO_VERSION = "1.5.10";
+const LORO_VERSION = "1.13.3";
+const PACKAGE_VERSIONS: Record = {
+ "loro-crdt": LORO_VERSION,
+ "loro-mirror": "1.0.0",
+ "loro-mirror-react": "1.0.0",
+};
async function scanMarkdownFiles(
dir: string,
@@ -33,10 +38,13 @@ async function scanMarkdownFiles(
);
}
-function replaceImportVersion(input: string, targetVersion: string): string {
- const regex = /from "loro-crdt"/g;
- const replacement = `from "npm:loro-crdt@${targetVersion}"`;
- return input.replace(regex, replacement);
+function replaceImportVersions(input: string): string {
+ let output = input;
+ for (const [pkg, version] of Object.entries(PACKAGE_VERSIONS)) {
+ const regex = new RegExp(`from "${pkg}"`, "g");
+ output = output.replace(regex, `from "npm:${pkg}@${version}"`);
+ }
+ return output;
}
// Parsing command-line arguments
@@ -89,7 +97,7 @@ await scanMarkdownFiles(targetDir, (block) => {
name: `${block.filePath}:${block.lineNumber}`,
job: async () => {
let codeBlock = block.content;
- codeBlock = replaceImportVersion(codeBlock, LORO_VERSION);
+ codeBlock = replaceImportVersions(codeBlock);
if (codeBlock.includes("Loro") && !codeBlock.includes("import {")) {
codeBlock = IMPORTS + codeBlock;
}
@@ -142,6 +150,8 @@ await scanMarkdownFiles(targetDir, (block) => {
});
});
-for (let i = 0; i < 16; i++) {
- runJob();
+await Promise.all(Array.from({ length: 16 }, () => runJob()));
+await processLogQueue();
+if (failed > 0) {
+ Deno.exit(1);
}
diff --git a/package.json b/package.json
index 7ec8276..d233745 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,7 @@
"highlight.js": "^11.9.0",
"is-equal": "^1.7.0",
"jotai": "^2.6.0",
- "loro-crdt": "^1.5.10",
+ "loro-crdt": "^1.13.3",
"lucide-react": "^0.294.0",
"next": "^14.2.31",
"next-seo": "^5.15.0",
diff --git a/pages/blog/crdt-richtext.mdx b/pages/blog/crdt-richtext.mdx
index 1bfe437..2e93c67 100644
--- a/pages/blog/crdt-richtext.mdx
+++ b/pages/blog/crdt-richtext.mdx
@@ -2,7 +2,7 @@
title: crdt-richtext - Rust implementation of Peritext and Fugue
date: 2023/04/20
keywords: crdt, richtext, peritext, fugue, loro
-description: Presenting a new Rust crate that combines Peritext and Fugue's power with impressive performance, tailored specifically for rich text. This crate's functionality is set to be incorporated into Loro, a general-purpose CRDT library currently under development.
+description: Presenting the early Rust crate that combined Peritext and Fugue's power with impressive performance, tailored specifically for rich text. This work later informed Loro's rich text CRDT.
tag: richtext
# ogImage: /images/blog/joining-vercel/x-card.png
---
@@ -18,7 +18,7 @@ import Authors, { Author } from "../../components/authors";
/>
-Presenting a new Rust crate that combines [Peritext](https://inkandswitch.com/peritext) and [Fugue](https://arxiv.org/abs/2305.00583)'s power with impressive performance, tailored specifically for rich text. This crate's functionality is set to be incorporated into **[Loro](https://www.loro.dev/)**, a general-purpose CRDT library currently under development.
+Presenting an early Rust crate that combines [Peritext](https://inkandswitch.com/peritext) and [Fugue](https://arxiv.org/abs/2305.00583)'s power with impressive performance, tailored specifically for rich text. This work later informed **[Loro](https://www.loro.dev/)**'s rich text CRDT.
# What’s Peritext
@@ -240,14 +240,14 @@ The benchmark was conducted on a 2020 M1 MacBook Pro 13-inch on 2023-05-11.
| [B4x100] Apply real-world editing dataset 100 times (docSize) | 12,667,753 +/- 0 bytes | 26,634,606 +/- 80 bytes | skipped | 17,844,936 +/- 0 bytes | 15,989,245 +/- 0 bytes | skipped |
| [B4x100] Apply real-world editing dataset 100 times (parseTime) | 1,252 +/- 14 ms | 170 +/- 15 ms | skipped | 368 +/- 13 ms | 1,335 +/- 238 ms | skipped |
-The complete benchmark result and code is available at https://github.com/https://twitter.com/zx_loro/fugue-bench.
+The complete benchmark result and code is available at https://github.com/zxch3n/fugue-bench.
It is worth noting that:
- The benchmark for Automerge is based on `automerge-wasm`, which is not the latest version of Automerge 2.0.
- `crdt-richtext` and `fugue` are special-purpose CRDTs that tend to be faster and have a smaller encoding size.
- The encoding of `yjs`, `ywasm`, and `loro-wasm` still contains redundancy that can be compressed significantly. For more details, see [the full report](https://loro.dev/docs/performance/docsize).
-- loro-wasm and fugue only support plain text for now
+- At the time of this 2023 benchmark, `loro-wasm` and `fugue` only supported plain text.
# Discussion
diff --git a/pages/blog/loro-mirror.mdx b/pages/blog/loro-mirror.mdx
index 2e5fa48..b6ff23a 100644
--- a/pages/blog/loro-mirror.mdx
+++ b/pages/blog/loro-mirror.mdx
@@ -68,7 +68,7 @@ This code is repetitive and easy to get wrong. Mirror centralizes it behind a de
### Basic Example
-```ts twoslash
+```ts no_run
/**
* As an example, you can use `useState` from React to manage the state
*
@@ -141,7 +141,7 @@ const stop = doc.subscribeLocalUpdates((bytes) => {
### React Example
-```tsx twoslash
+```tsx no_run
import React, { useMemo } from "react";
import { LoroDoc } from "loro-crdt";
import { schema } from "loro-mirror";
@@ -214,7 +214,7 @@ export function TodoApp() {
Undo/Redo
```tsx
-import { UndoManageker } from "loro-crdt";
+import { UndoManager } from "loro-crdt";
// Inside the same component, after creating `doc`:
const undo = useMemo(() => new UndoManager(doc), [doc]);
@@ -257,7 +257,7 @@ Because Mirror owns the bidirectional mapping between application state and the
- Text. Many interfaces render by lines, yet LoroText’s low‑level API is index‑based. Teams typically re‑implement line segmentation and map edits back to lines by hand. With Mirror in the middle, it becomes feasible to surface optional line‑aware events on top of LoroText so the UI receives stable, line‑based diffs without custom conversion—while retaining the underlying CRDT guarantees.
- Tree. LoroTree CRDT already ensures correct concurrent moves, but developers still translate tree operations into application‑state patches. Mirror carries first‑class mappings from tree events into your state shape, so consumers can work with natural “insert/move/delete node” updates.
-- Ephemeral patches. We'll add [`setStateWithEphemeralPatch`](https://github.com/loro-dev/loro-mirror/issues/35) so Mirror can stream temporary drag or scale interactions through an `EphemeralStore`, letting collaborators see live previews while the persisted history stays clean and deduplicated once the change finalizes.
+- Ephemeral patches. [`setStateWithEphemeralPatch`](https://github.com/loro-dev/loro-mirror/issues/35) lets Mirror stream temporary drag or scale interactions through an `EphemeralStore`, so collaborators can see live previews while the persisted history stays clean and deduplicated once the change finalizes.
By using loro-mirror to bridge CRDTs and application state consistency, and by expressing schemas declaratively, we can let AI help developers get more done correctly. This makes Loro not only suitable for professional creative tools with real-time collaboration, but also for enabling people to build practical mini-tools for themselves and their communities.
diff --git a/pages/blog/loro-now-open-source.mdx b/pages/blog/loro-now-open-source.mdx
index cf11cb4..94c8f6b 100644
--- a/pages/blog/loro-now-open-source.mdx
+++ b/pages/blog/loro-now-open-source.mdx
@@ -221,7 +221,8 @@ yet to be widely used.
Our CRDTs library is built on the brilliant concept of OT-like CRDTs from Seph
Gentle's [Diamond-types](https://github.com/josephg/diamond-types). Joseph Gentle
-is currently writing a paper on it, which is worth looking forward to. Its
+and Martin Kleppmann later published the
+[Eg-walker paper](https://arxiv.org/abs/2409.14252) on this line of work. Its
notable features include reducing the cost of local operations, easier
historical data reclamation, and sometimes lower storage and memory overhead.
However, it relies on high-performance algorithms to apply remote operations.
@@ -272,8 +273,8 @@ challenge was that
We have recently overcome this issue. We developed a new rich text CRDT
algorithm that can run on OT-like CRDTs and has passed the capabilities listed
in the Peritext paper's Criteria for rich text CRDTs, with no new issues
-revealed in our current million fuzzing tests. We will write an article in the
-future specifically to introduce this algorithm.
+revealed in our current million fuzzing tests. We later introduced this work in
+the [Loro rich text article](https://loro.dev/blog/loro-richtext).
#### Movable Tree
@@ -325,38 +326,33 @@ Internally, we've
The state represents the current form of the document, akin to Git's HEAD
pointer, while the document's history resembles the complete operation history
behind Git. Hence, multiple document states can correspond to the same history.
-This structure simplifies our code and facilitates future support for version
-control.
+This structure simplifies our code and provides the foundation for Loro's
+version-control primitives.
Most of our optimizations thus far have focused on text manipulations,
-historically one of the thorniest problems in CRDTs. In the future, we plan
-optimizations for a wider range of real-world scenarios.
+historically one of the thorniest problems in CRDTs. Later releases expanded
+these optimizations across more real-world scenarios.
-### The Future
+### Update

-We aim to reach version 1.0 by mid-next year, with much work to complete.
+Loro has since reached 1.0 and stabilized its core data format. The project now
+ships production-ready JavaScript/WASM and Rust packages, plus maintained
+bindings and examples for other platforms.
-Given our limited workforce, we will first provide a WASM interface for web
-developers to experiment with. Optimizing the WASM size is one of our goals for
-this phase. Much of our design work is still ongoing, and we plan to stabilize
-it in the next quarter, aiming for a simple yet powerful and flexible API. We
-welcome ideas and suggestions in our
+Documentation and developer tooling remain active areas of work. We welcome
+ideas and suggestions in our
[community discussions](https://discord.gg/tUsBSVfqzf).
-There's also extensive documentation work to make working with Loro enjoyable. A
-potential indicator of success would be GPT generating sufficiently good code
-based on our documentation.
-
Developing tools for developers is a challenging and exciting task. Many
developer tools and visualization methods in front-end development are
exceptionally good, and we hope to bring such experiences into the world of
CRDTs and local-first development. DevTools will reveal CRDTs' hidden states and
simplify control, making state maintenance and debugging a breeze.
-We also plan to support richer CRDT semantics, including Movable Lists and
-global undo/redo operations to support more diverse application scenarios.
+Loro now supports richer CRDT semantics, including movable data structures and
+undo/redo APIs for more diverse application scenarios.
## Seeking Collaborative Project Opportunities
diff --git a/pages/blog/v1.0.mdx b/pages/blog/v1.0.mdx
index 5849587..a80fbd0 100644
--- a/pages/blog/v1.0.mdx
+++ b/pages/blog/v1.0.mdx
@@ -12,7 +12,7 @@ import Authors, { Author } from "../../components/authors";
@@ -73,10 +73,10 @@ operation application, and network exception handling. For Loro's CRDT document,
just two rounds of data exchange can transmit the missing operations between two
documents to achieve final consistency:
-> You can find all the code samples in this blog [here](https://github.com/https://twitter.com/zx_loro/loro-blog-examples)
+> You can find all the code samples in this blog [here](https://github.com/zxch3n/loro-blog-examples)
```jsx
-import { LoroDoc, VersionVector } from "npm:loro-crdt@1.0.0-beta.3";
+import { LoroDoc, VersionVector } from "npm:loro-crdt@1.13.3";
const docA = new LoroDoc();
const docB = new LoroDoc();
@@ -112,7 +112,7 @@ A minimum of one round of data exchange can ensure consistency
```jsx
-import { LoroDoc } from "npm:loro-crdt@1.0.0-beta.2";
+import { LoroDoc } from "npm:loro-crdt@1.13.3";
const docA = new LoroDoc();
const docB = new LoroDoc();
@@ -180,7 +180,7 @@ We also support:
Loro also supports nesting between types, so you can model edits on JSON documents through them:
-> You can find all the code samples in this blog [here](https://github.com/https://twitter.com/zx_loro/loro-blog-examples)
+> You can find all the code samples in this blog [here](https://github.com/zxch3n/loro-blog-examples)
```tsx
import {
@@ -188,7 +188,7 @@ import {
LoroList,
LoroMap,
LoroText,
-} from "npm:loro-crdt@1.0.0-beta.2";
+} from "npm:loro-crdt@1.13.3";
// Create a JSON structure of
interface JsonStructure {
@@ -223,10 +223,10 @@ Loro supports primitives that allow users to switch between different versions,
Based on this operation primitive, applications can build various Git-like capabilities:
- You can merge multiple versions without needing to manually resolve conflicts
-- You can rebase/squash updates from the current branch to the target branch (WIP)
+- Applications can build rebase and squash workflows on top of Loro's version primitives.
```jsx
-import { LoroDoc } from "npm:loro-crdt@1.0.0-beta.2";
+import { LoroDoc } from "npm:loro-crdt@1.13.3";
const doc = new LoroDoc();
doc.setPeerId("0");
@@ -257,7 +257,7 @@ console.log(doc.getText("text").toString()); // "Hello, world! Alice!"
You can also use `doc.fork()` to create a separate doc at the current version. It is independent of the current doc, and works like a fork:
```tsx
-import { LoroDoc } from "npm:loro-crdt@1.0.0-beta.4";
+import { LoroDoc } from "npm:loro-crdt@1.13.3";
const doc = new LoroDoc();
doc.setPeerId("0");
@@ -279,7 +279,7 @@ console.log(doc.getText("text").toString()); // "Hello, world! Alice!"
```
Loro CRDTs still have significant room for optimization in these scenarios.
-Currently, the Loro CRDTs library doesn't involve network or disk I/O, which
-enhances its ease of use but also constrains its capabilities and potential
-optimizations.
+At the time of Loro 1.0, the Loro CRDTs library didn't involve network or disk
+I/O, which enhanced its ease of use but also constrained its capabilities and
+potential optimizations.
For example, while we've implemented block-level storage, documents are still
imported and exported as whole units. Adding I/O capabilities to selectively
load/save blocks would enable significant performance optimizations.
@@ -722,9 +722,5 @@ We're excited to see it being applied in various scenarios.
If you're interested in using Loro, welcome to join our
[Discord community](https://discord.gg/tUsBSVfqzf) for discussions.
-
- 🚀 **Want early access to our upcoming local-first apps built with Loro?**
- [Sign up
- here](https://noteforms.com/forms/request-early-access-for-loro-apps-vkbt9p)
- to be among the first to try them out!
-
+For current updates, follow the [changelog](/changelog) or join the
+[Discord community](https://discord.gg/tUsBSVfqzf).
diff --git a/pages/docs/api/js.mdx b/pages/docs/api/js.mdx
index a7f908a..4800d29 100644
--- a/pages/docs/api/js.mdx
+++ b/pages/docs/api/js.mdx
@@ -6,7 +6,7 @@ import Method from "./method";
# API Reference
-> _Last updated: 2025-08-09 loro-crdt@1.5.10_
+> _Last updated: 2026-06-16 loro-crdt@1.13.3_
## Overview
diff --git a/pages/docs/performance/index.md b/pages/docs/performance/index.md
index de4382e..11c4f45 100644
--- a/pages/docs/performance/index.md
+++ b/pages/docs/performance/index.md
@@ -99,7 +99,7 @@ and Fire" is only 1.6 million characters long (including whitespace).
| N = 6000 | yjs | ywasm | loro | loro-old | automerge | automerge-wasm |
| :----------------------------------------------------------------------- | ---------------: | --------------: | ---------------: | ---------------: | ---------------: | --------------: |
-| Version | 13.6.15 | 0.17.4 | 1.0.0-beta.2 | 0.15.2 | 2.1.10 | 0.9.0 |
+| Version | 13.6.15 | 0.17.4 | 1.0.0-beta.2 (historical) | 0.15.2 | 2.1.10 | 0.9.0 |
| Bundle size | 84,017 bytes | 938,991 bytes | 2,919,363 bytes | 1,583,094 bytes | 1,696,176 bytes | 1,701,136 bytes |
| Bundle size (gzipped) | 25,105 bytes | 284,616 bytes | 894,460 bytes | 592,039 bytes | 591,049 bytes | 594,071 bytes |
| [B1.1] Append N characters (time) | 141 ms | 171 ms | 164 ms | 115 ms | 279 ms | 110 ms |
diff --git a/pages/docs/tutorial/get_started.mdx b/pages/docs/tutorial/get_started.mdx
index d6cdeb2..6bace6b 100644
--- a/pages/docs/tutorial/get_started.mdx
+++ b/pages/docs/tutorial/get_started.mdx
@@ -119,7 +119,7 @@ example:
-