{"_id":"loro-mirror","_rev":"22-cd3c1492581ac5c26d5a78522799178a","name":"loro-mirror","dist-tags":{"latest":"2.3.3"},"versions":{"0.0.1-alpha0":{"name":"loro-mirror","version":"0.0.1-alpha0","keywords":[],"author":"","license":"ISC","_id":"loro-mirror@0.0.1-alpha0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"fbcadb49d30aede713c855a1abbf98cfd835ad72","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-0.0.1-alpha0.tgz","fileCount":3,"integrity":"sha512-rLOd2Bx4XIlYH3j0VPlNq9AB5DjU2l9/nK5nxOddiG7mEyiNsuQu7HBE13T0GC/OjqVsu7a2Mvs2sW6+z22euQ==","signatures":[{"sig":"MEQCICDOhmmjOPNKeVII9zHvZYfq/qoVXPJ3N/wbxjo2GrEmAiBKwoR+zEPzZqy+MHr29Epd8ucCCVy9m1R/HGeQw4IzSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_npmVersion":"10.9.3","description":"","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.14.0","_npmOperationalInternal":{"tmp":"tmp/loro-mirror_0.0.1-alpha0_1756040447717_0.7412906209568593","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"loro-mirror","version":"0.1.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@0.1.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"194fa8053e6df0bda42de89c363bcdb4be09a97a","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-0.1.0.tgz","fileCount":58,"integrity":"sha512-KCeNgZk7MUoOfa1bIHbGCes9jV3uu50+a0Yl8u0FTwBu37WyzrYR1nq9BsicrqaNIvYRxX6MqIM6sk73d1DcEQ==","signatures":[{"sig":"MEYCIQDLpgkc0qLDIyndECqq9nfCxhysNdWRCKqXX+zPaJQ5EQIhAP/VRIAlQduxnil1VIXWXhyh5tohXb7ilaWIU/Oas0Xn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":706765},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-0.1.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/03214a4408280ab32da3af35372c2f7e/loro-mirror-0.1.0.tgz","_integrity":"sha512-KCeNgZk7MUoOfa1bIHbGCes9jV3uu50+a0Yl8u0FTwBu37WyzrYR1nq9BsicrqaNIvYRxX6MqIM6sk73d1DcEQ==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.7.1"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_0.1.0_1757674622886_0.7506094432521346","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"loro-mirror","version":"0.1.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@0.1.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"a7525e1f06e24aca814628fa0859d304c75c59ae","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-0.1.1.tgz","fileCount":58,"integrity":"sha512-VBG1IcbYvhBw7gONXZHv8kHtiUCNWT0IZe+5cCDlOFnHy375/u5erLQ0HdeRfW2+40BJSKSbPRPfPvL1/ipYlQ==","signatures":[{"sig":"MEUCIAONATAhZrJlFQP9LL345M3yG7aJ4ZKSQ/dysHPfOvycAiEAxQw4twHjc9QUnjOEoENkghytwAGhkWWbpGC0jqBPz3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":707170},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-0.1.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/d8c5358021b6da2995036326f8ccefde/loro-mirror-0.1.1.tgz","_integrity":"sha512-VBG1IcbYvhBw7gONXZHv8kHtiUCNWT0IZe+5cCDlOFnHy375/u5erLQ0HdeRfW2+40BJSKSbPRPfPvL1/ipYlQ==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.7.1"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_0.1.1_1758076461105_0.12620533308558146","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"loro-mirror","version":"1.0.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.0.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"18639ddd17addfa0f4c2b45fc3d8f20a5e9c13e1","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.0.0.tgz","fileCount":53,"integrity":"sha512-77PyZxkA/xyq8igmVO2bH6U3EkrKICz7Gnhu2fQ/L5UO61JC+zisUwy/8Hy26DXrVE07jih0WbwVZ7sMJLRcbg==","signatures":[{"sig":"MEYCIQD+WAxyWZ9iwGJON4ixy6EJTYMHlrDE6VJQLH5nyk1XtQIhAMZwjEBTgCuCquKuI0vYo3BU3BRU95WDbPf/IXnxCLRi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":692418},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.0.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/b493f1d5279e1a88e9ef660acd565441/loro-mirror-1.0.0.tgz","_integrity":"sha512-77PyZxkA/xyq8igmVO2bH6U3EkrKICz7Gnhu2fQ/L5UO61JC+zisUwy/8Hy26DXrVE07jih0WbwVZ7sMJLRcbg==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.0.0_1758513256569_0.552893367736629","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"loro-mirror","version":"1.0.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.0.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"f506170cbe2bf23980e8fb6d0969a093b1537aee","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.0.1.tgz","fileCount":53,"integrity":"sha512-XsfN2OXyfSu0I0JRD5vDDdVxjRZX5RahupubeBwS2vqrORiTT/zaxhAn0bgOjXNJOgv0HLzcAkR4RLqyqh3n8A==","signatures":[{"sig":"MEUCIFEN+ksMMlEax+VI+lp9GJHqrYB1yIB57GStE2tc7ya9AiEA1xsusus9X3PfhYloycnk/E1eeWbKnBcsi2Rsz2P5Ueo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":695449},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.0.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/a0b5258c3ed5f57eef2fdb2c204a9779/loro-mirror-1.0.1.tgz","_integrity":"sha512-XsfN2OXyfSu0I0JRD5vDDdVxjRZX5RahupubeBwS2vqrORiTT/zaxhAn0bgOjXNJOgv0HLzcAkR4RLqyqh3n8A==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.0.1_1758542783905_0.4747828417509683","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"loro-mirror","version":"1.0.2","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.0.2","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"bb4f7a549d1629bc3a4199510c5ec7b395c71335","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.0.2.tgz","fileCount":53,"integrity":"sha512-zHOyoI4iDp+g/EG+PEAn1GTdhT1Ab03ycGNCNPe2cNYb1ikGW4eWZj0I59W/82M8E4xTavyvhS9hNwxS64uBVQ==","signatures":[{"sig":"MEUCIC6ls3mWiLmLo6Hi+4FG+ziZHgsC7Ak5XBj1ylfLmlBQAiEA9UUG8j79aGHV1/bjvCWkHQEIJ4jY5IMQZVfXHO8QuS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":704766},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.0.2.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/75ca049cb08a2495e45d9f393d0c7588/loro-mirror-1.0.2.tgz","_integrity":"sha512-zHOyoI4iDp+g/EG+PEAn1GTdhT1Ab03ycGNCNPe2cNYb1ikGW4eWZj0I59W/82M8E4xTavyvhS9hNwxS64uBVQ==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.0.2_1758783839012_0.8392413506118523","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"loro-mirror","version":"1.0.3","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.0.3","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"046aa99dee7207df5f944894e6f8b108d40684b4","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.0.3.tgz","fileCount":53,"integrity":"sha512-FnCXpX/cCjd9s8ZaSQId9ahPeUFnsCseX+el/w7Wia570ub8FIc22wn4crtU1ZQbqzCXGKP0bybas784khacRg==","signatures":[{"sig":"MEQCIBxOMQ8f0neAnDiBOReeD8i+VqYjG9/blI8VW7wzXtBPAiBHvD3aHtpxPQxyEcyNlBKddZdnfmOXrSVDj6RQumL7UQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":703896},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.0.3.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/d6306974336756ca0a281e1238f49bbe/loro-mirror-1.0.3.tgz","_integrity":"sha512-FnCXpX/cCjd9s8ZaSQId9ahPeUFnsCseX+el/w7Wia570ub8FIc22wn4crtU1ZQbqzCXGKP0bybas784khacRg==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.0.3_1759076057490_0.15735342853983458","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"loro-mirror","version":"1.0.4","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.0.4","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"586dcb5d122c5e210516ec00e643995347cc5a55","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.0.4.tgz","fileCount":53,"integrity":"sha512-RO2y6puneZY03ZQoMDEgRR1lalYUtUbQzKJas88/gqc6sSWu6pkrfAulfih5OZJndPB9dQga2YFY1QVSZmlpXQ==","signatures":[{"sig":"MEYCIQCqqImikoZvz/KF/YE5jjiF5dL4pRINV/2+bvvbZ62z6wIhAPRrEqihhXoRpSGFlKuu5XsLN8X9zfyXept8FOq1h/0u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":712305},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.0.4.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/61d62a0c96f0e8eb6fb3abaf5ab703b8/loro-mirror-1.0.4.tgz","_integrity":"sha512-RO2y6puneZY03ZQoMDEgRR1lalYUtUbQzKJas88/gqc6sSWu6pkrfAulfih5OZJndPB9dQga2YFY1QVSZmlpXQ==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.0.4_1760330037386_0.13543774960650534","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"loro-mirror","version":"1.1.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.1.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"1706af14d296b0bbd9e631c65acb12f4b317ee9c","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.1.0.tgz","fileCount":53,"integrity":"sha512-2njBZz3BavQC8bWMqz0NwviYYq/YW6GnUopIilsquyMI3TsWLGyCWJzF+jLXcL6fQmdQo9fgzZ3hH2tdGagsNQ==","signatures":[{"sig":"MEUCIB3BqeE8U9chJ3vUwMfwv2YV8AtiVBGJ1rArdotkJ/+yAiEA8TAKjNnXax7n7Rv7ICHAaGlGvugajBd4YJapKTldR2k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":717279},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.1.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/412d367bdf3b9bf72182cf735361f5fc/loro-mirror-1.1.0.tgz","_integrity":"sha512-2njBZz3BavQC8bWMqz0NwviYYq/YW6GnUopIilsquyMI3TsWLGyCWJzF+jLXcL6fQmdQo9fgzZ3hH2tdGagsNQ==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.1.0_1760415388014_0.9298430624688525","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"loro-mirror","version":"1.1.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.1.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"1c0b68f05f86855ba06240c53bd5887d0e7406c6","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.1.1.tgz","fileCount":53,"integrity":"sha512-NrWEILkRqXC0G8aM+JymMo5ZaAzJtJNKzMd1Oc0HJwxKwywoCvfnGhYW33kVj+tfNC6AKfbZWmiJCEzDf6SshQ==","signatures":[{"sig":"MEQCIATF2HvgDvBrxEWxhRI7DBNplKk2M/2i3x18neqDnv7VAiA2jx/vxT6jleEACBKsDfYzOvZzAYLBnB+sZ1SweMMzZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":717279},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.1.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/4f04c959b570f2813f0ba1aea4d2b43a/loro-mirror-1.1.1.tgz","_integrity":"sha512-NrWEILkRqXC0G8aM+JymMo5ZaAzJtJNKzMd1Oc0HJwxKwywoCvfnGhYW33kVj+tfNC6AKfbZWmiJCEzDf6SshQ==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.1.1_1762245499182_0.6911143911457265","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"loro-mirror","version":"1.1.2","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.1.2","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"39653f035580a1c336044936442e2197499b4ae1","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.1.2.tgz","fileCount":53,"integrity":"sha512-IkYAE6Y8qZccZ1XvnvNgPzpRJE1pnpXWi/lR1pU9nO2+urEklrDhXObPHohY/jFNGIgk/3ql4J1MhSbF927gKg==","signatures":[{"sig":"MEQCIGosKGm5dv13ue8FG6jOMBHDtv9ge6Ns5od/UUukuD/aAiBJ2VAtIl6f6IyOTHsytDnBTGk0LD1z+fKPggaGwKkehw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":717279},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.1.2.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/tmp/8def2177354b7ad3b92a04ecc9b31b13/loro-mirror-1.1.2.tgz","_integrity":"sha512-IkYAE6Y8qZccZ1XvnvNgPzpRJE1pnpXWi/lR1pU9nO2+urEklrDhXObPHohY/jFNGIgk/3ql4J1MhSbF927gKg==","_npmVersion":"10.8.2","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.1.2_1765012322574_0.17174518856224807","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"loro-mirror","version":"1.2.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.2.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"f58366da2684e72f6c8536e30e98179ded93f3a4","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.2.0.tgz","fileCount":63,"integrity":"sha512-e5SeAj5V+yTMypwgGOnDkA0XaepIrH/B1Xah+rh0KGn+rqRMZKDsPq4083uoRKhaqBupapJAYbCq2pFYSZOoAQ==","signatures":[{"sig":"MEQCIEOqD/94Be6LlYo963PZusVDxgBrQY5l1QKMLc2xpaffAiAZNSA+nkrzsDw0MrrO/gZmD0E45ty3NRhoXbWc/bQEUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":987489},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.2.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/private/var/folders/x9/v95xfgsd7q77l65gphtc4vdw0000gn/T/a74d40fb9c44c554021b577f8528f140/loro-mirror-1.2.0.tgz","_integrity":"sha512-e5SeAj5V+yTMypwgGOnDkA0XaepIrH/B1Xah+rh0KGn+rqRMZKDsPq4083uoRKhaqBupapJAYbCq2pFYSZOoAQ==","_npmVersion":"11.6.4","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.2.0_1765594572307_0.34459159648665505","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"loro-mirror","version":"1.2.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@1.2.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"dist":{"shasum":"a6b36bfa1f2eb9853f66e17061133e38ce966230","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-1.2.1.tgz","fileCount":63,"integrity":"sha512-ySBIn3DA+ZdpI2w+pHR/zQ4bd7XghOFY6rb7IAGmLjRbMxEbdwvUi0MtBn9xQ5c7QIcHBCa2Ryzz5yqTo7VODg==","signatures":[{"sig":"MEUCIQDlR5aqmEgJNrHnf7WGzYf6abr260XB2SdyhOcvgWjZmgIgWRItfYr6pV51vQ1LMwpI3s/cMvfzZ8SXSyPb2frje+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1002222},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-1.2.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"rem2018","email":"remch183@outlook.com"},"_resolved":"/private/var/folders/x9/v95xfgsd7q77l65gphtc4vdw0000gn/T/45842b999393f40560868f5cd43b514f/loro-mirror-1.2.1.tgz","_integrity":"sha512-ySBIn3DA+ZdpI2w+pHR/zQ4bd7XghOFY6rb7IAGmLjRbMxEbdwvUi0MtBn9xQ5c7QIcHBCa2Ryzz5yqTo7VODg==","_npmVersion":"11.6.4","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_1.2.1_1766066348707_0.22324256454598723","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"loro-mirror","version":"2.0.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.0.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"dfba2738666da6ede250b47a9c2e1c707aed30c7","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.0.0.tgz","fileCount":63,"integrity":"sha512-LrZ+K+80emVETsAy+K3yV79+Ns8a/py6Ggxa+0/d58ufRhdOa7IoW4G5P7kCy6aSoFO7z/XRJHu/QiMTPYUdVw==","signatures":[{"sig":"MEYCIQD2VfPRkZsqNR9ClDv0BFJI6WUWWf8QYwJXPP+w7dws4AIhANhcuyInnncCjJDrUedLNzjvri3Zy5keL3B8FYp2gOFV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":948308},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.0.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/97a9e494ca229c8c9da676059885a273/loro-mirror-2.0.0.tgz","_integrity":"sha512-LrZ+K+80emVETsAy+K3yV79+Ns8a/py6Ggxa+0/d58ufRhdOa7IoW4G5P7kCy6aSoFO7z/XRJHu/QiMTPYUdVw==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.9.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.0.0_1774356972268_0.5744470589131221","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"loro-mirror","version":"2.1.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.1.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"031dbd136091e7d81aae53b33fcd805ba68bac40","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.1.0.tgz","fileCount":78,"integrity":"sha512-sOq962AHnCGUaW1SA1av6vFPGwFphM8rzd/wzCK5rMquM4g3t+KGCLhBn+AxOdTfaqHdJfM0H3M9t+GxWsbmhw==","signatures":[{"sig":"MEQCIGqhHaVU78yiMH7sjRzrJ+cKJ8xGQ18ggJm/7A3zXFYoAiB6w8F/ucPywaWprDpZoIhhCwdGfpRY3hhtUavx2a7MCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1028774},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.1.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/8b82a483a7d9ccaffb50d8ae5c91050f/loro-mirror-2.1.0.tgz","_integrity":"sha512-sOq962AHnCGUaW1SA1av6vFPGwFphM8rzd/wzCK5rMquM4g3t+KGCLhBn+AxOdTfaqHdJfM0H3M9t+GxWsbmhw==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.9.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.1.0_1774410649513_0.3243286175715425","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"loro-mirror","version":"2.1.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.1.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"d402c8ab72d06f1569012f7c438b76a0e4cef8ef","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.1.1.tgz","fileCount":78,"integrity":"sha512-0pT/jn9o2lHTYEGMKq0IBLdORmXPcTk+7LKuXzNDEfhthH/gxvt7j15c0B47brMQ6LB7ZdOFVahNYFQBx3jugg==","signatures":[{"sig":"MEQCIHerXcF3HCpjtMfs0oq2X+Pulx4id964/iWE+MivHR7OAiAymTuBfXouXAaE5/Oe1OYw81SrvaLzv4LEqRi7ENRL0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1031319},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.1.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/8d4be384ce41940bc2ac387353149751/loro-mirror-2.1.1.tgz","_integrity":"sha512-0pT/jn9o2lHTYEGMKq0IBLdORmXPcTk+7LKuXzNDEfhthH/gxvt7j15c0B47brMQ6LB7ZdOFVahNYFQBx3jugg==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.11.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.1.1_1777447168915_0.3514014617674137","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"loro-mirror","version":"2.2.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.2.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"809a59cb3a12efc08825d9db87cef8e0eb386b10","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.2.0.tgz","fileCount":78,"integrity":"sha512-zX/hqBrEa01Uf2cDEDHHhomkNvniDmmp6/lBNcTc08EG+feU+srSv/EB2bjB/WVr0G9HJaBGMGEqFsKnUUwiDA==","signatures":[{"sig":"MEQCIHM1uuctqlUVUAE+CYQ+Le8H9hPZNvfKGqFwQFtbah8cAiAwemvImt72fA8qx0hMgxqTXkeZ5D1/VPoOFL4c8TIACg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1069768},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.2.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/878742587168d1bbdf47e8d3d2de5c9d/loro-mirror-2.2.0.tgz","_integrity":"sha512-zX/hqBrEa01Uf2cDEDHHhomkNvniDmmp6/lBNcTc08EG+feU+srSv/EB2bjB/WVr0G9HJaBGMGEqFsKnUUwiDA==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.13.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.13.3"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.2.0_1781544154501_0.19212125603268104","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"loro-mirror","version":"2.2.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.2.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"2a6f5e00fbfc07e043b8de86494e8943ed6ef28c","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.2.1.tgz","fileCount":83,"integrity":"sha512-wOeNqNTSdFS7S6z0j+GWlRUtgRwMG/vAS0U0MJ3egZZlJUw4tIpmQoUQ2lEtjzdddBzZBfTR33YphE+ZIXY6LA==","signatures":[{"sig":"MEUCIQDPUg7rwkEXSZcmjkj5PgDszpnoKS2O9lbuWU2bLwHYywIgN4eGFupHTNfe3YCh1yGiZCkPq3P+HeH041a9EFdQ+1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1115388},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.2.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/908e1abbfc1d313bacc3f498a123093d/loro-mirror-2.2.1.tgz","_integrity":"sha512-wOeNqNTSdFS7S6z0j+GWlRUtgRwMG/vAS0U0MJ3egZZlJUw4tIpmQoUQ2lEtjzdddBzZBfTR33YphE+ZIXY6LA==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.16.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.13.3"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.2.1_1785863090634_0.7561495892108234","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"loro-mirror","version":"2.3.0","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.3.0","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"67644f1b68e928bea90693cf2715a358c9b01f08","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.3.0.tgz","fileCount":83,"integrity":"sha512-CVoxuh4D+JSkYQrJyIXfqnbnYnIwVFlCoRcNc1XSdWRshJZQ7tymnb5rT6AQ+XuDZHyIua0HVHjpEvHkGCTm9A==","signatures":[{"sig":"MEYCIQDrBdA6uMiOHLaS7/gtCa3Zy2OOSne3qPML4BnzpHX6QAIhAMVFmd5zTFvXWcaUdLhph2Q4ewjinQoLNYmnvSmf/Cre","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1125241},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.3.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/7f31457556c7d938669522a29043e5be/loro-mirror-2.3.0.tgz","_integrity":"sha512-CVoxuh4D+JSkYQrJyIXfqnbnYnIwVFlCoRcNc1XSdWRshJZQ7tymnb5rT6AQ+XuDZHyIua0HVHjpEvHkGCTm9A==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.17.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.13.3"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.3.0_1787845502175_0.7022738796779715","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"loro-mirror","version":"2.3.1","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.3.1","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"c19875d6a088aef11116d54b3debfddd763f8e66","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.3.1.tgz","fileCount":83,"integrity":"sha512-0OYFSq0z3FhYuNpNbydJipNuevrvxv2qioJN798O1mZCOVT5pytFzIzksrGNVZMsiYi5xcyrpo6KNxenEouzRw==","signatures":[{"sig":"MEUCICOuFm5wxyeVrnOqqLcN/tUgzF2ymP8Fy9UlaXOiMYI6AiEA1qfjn01dktgLlK5Z1cdc4sa7pOYgTRbkltQQucejrLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1120749},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.3.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs","bench:ignore-unknown-properties":"pnpm build && node --expose-gc ./scripts/ignore-unknown-properties-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/9de9788a14e055d57f68068ba8dbd582/loro-mirror-2.3.1.tgz","_integrity":"sha512-0OYFSq0z3FhYuNpNbydJipNuevrvxv2qioJN798O1mZCOVT5pytFzIzksrGNVZMsiYi5xcyrpo6KNxenEouzRw==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.17.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.13.3"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.3.1_1787996764452_0.050480672752811984","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"loro-mirror","version":"2.3.2","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","_id":"loro-mirror@2.3.2","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"homepage":"https://github.com/loro-dev/loro-mirror#readme","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"dist":{"shasum":"9c679a7f699efc2ca9d0dda3c3da584157c1f29b","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.3.2.tgz","fileCount":83,"integrity":"sha512-qTCZ37FEgWHnepnRQwqOZWLE8QxG2E+Qzx1gw9SE5187H6Yow3tkWXZ6BCSmjX5BoSJf4kEblS6aGJxgDnV29g==","signatures":[{"sig":"MEUCIDjd6Axikc1Ioz0AQe83y+vk7SwoAoiBBD6C7pZARCM1AiEAubaIc4MMFzUPOSb84oLFjMgxwt7R+IVcq1OA6c0RmeE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1148015},"main":"dist/index.js","type":"module","_from":"file:loro-mirror-2.3.2.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p .","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","test:watch":"vitest","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs","bench:single-text-event":"pnpm build && node ./scripts/single-text-event-bench.mjs","bench:ignore-unknown-properties":"pnpm build && node --expose-gc ./scripts/ignore-unknown-properties-bench.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"_resolved":"/tmp/2e781701b6b9cd38988d1c7d54460776/loro-mirror-2.3.2.tgz","_integrity":"sha512-qTCZ37FEgWHnepnRQwqOZWLE8QxG2E+Qzx1gw9SE5187H6Yow3tkWXZ6BCSmjX5BoSJf4kEblS6aGJxgDnV29g==","repository":{"url":"git+https://github.com/loro-dev/loro-mirror.git","type":"git","directory":"packages/core"},"_npmVersion":"11.19.0","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"immer":"^10.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.5"},"peerDependencies":{"loro-crdt":"^1.13.3"},"_npmOperationalInternal":{"tmp":"tmp/loro-mirror_2.3.2_1788956836092_0.894584917761075","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"name":"loro-mirror","version":"2.3.3","description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"sideEffects":false,"publishConfig":{"access":"public"},"keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"author":{"name":"Loro Team"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/loro-dev/loro-mirror.git","directory":"packages/core"},"dependencies":{"immer":"^10.0.3"},"peerDependencies":{"loro-crdt":"^1.16.0"},"devDependencies":{"@types/node":"^20.10.5","typescript":"^5.3.3"},"scripts":{"build":"tsc -p .","test":"vitest run","test:watch":"vitest","typecheck":"tsc -p tsconfig.typecheck.json --noEmit","bench:ephemeral":"pnpm build && node --expose-gc ./scripts/ephemeral-bench.mjs","bench:single-text-event":"pnpm build && node ./scripts/single-text-event-bench.mjs","bench:ignore-unknown-properties":"pnpm build && node --expose-gc ./scripts/ignore-unknown-properties-bench.mjs"},"_id":"loro-mirror@2.3.3","bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"homepage":"https://github.com/loro-dev/loro-mirror#readme","_integrity":"sha512-hu09GaKQHtUnqEjBA0nFUsr213txmFITX9Km1htz+8MN04iccKI96n0zSdMDFCEzxSgaI9jiTLHU427GkZW6IA==","_resolved":"/tmp/32ff3a3532042474f25a8f868a20dad7/loro-mirror-2.3.3.tgz","_from":"file:loro-mirror-2.3.3.tgz","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-hu09GaKQHtUnqEjBA0nFUsr213txmFITX9Km1htz+8MN04iccKI96n0zSdMDFCEzxSgaI9jiTLHU427GkZW6IA==","shasum":"bbc2dff13b0478f348bd8472e5190bfe209e07e5","tarball":"https://registry.npmjs.org/loro-mirror/-/loro-mirror-2.3.3.tgz","fileCount":83,"unpackedSize":1184209,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/loro-mirror@2.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHOkk8NW0C/jjr6/+vWq/Qu+T2U/F5HXJrM8jgGMvNqPAiEA0SKmvdnHYeFaNkkwAedYawO913nuN6jy5q3uT+rKf8U="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9f2604a5-d91a-4b2d-886d-e9e61ad51415"}},"directories":{},"maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loro-mirror_2.3.3_1789060207624_0.7809654191607456"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-24T13:00:47.716Z","modified":"2026-09-10T17:10:08.110Z","0.0.1-alpha0":"2025-08-24T13:00:47.902Z","0.1.0":"2025-09-12T10:57:03.120Z","0.1.1":"2025-09-17T02:34:21.335Z","1.0.0":"2025-09-22T03:54:16.747Z","1.0.1":"2025-09-22T12:06:24.128Z","1.0.2":"2025-09-25T07:03:59.325Z","1.0.3":"2025-09-28T16:14:17.707Z","1.0.4":"2025-10-13T04:33:57.639Z","1.1.0":"2025-10-14T04:16:28.255Z","1.1.1":"2025-11-04T08:38:19.433Z","1.1.2":"2025-12-06T09:12:02.766Z","1.2.0":"2025-12-13T02:56:12.553Z","1.2.1":"2025-12-18T13:59:08.911Z","2.0.0":"2026-03-24T12:56:12.412Z","2.1.0":"2026-03-25T03:50:49.677Z","2.1.1":"2026-04-29T07:19:29.066Z","2.2.0":"2026-06-15T17:22:34.817Z","2.2.1":"2026-08-04T17:04:50.809Z","2.3.0":"2026-08-27T15:45:02.319Z","2.3.1":"2026-08-29T09:46:04.604Z","2.3.2":"2026-09-09T12:27:16.213Z","2.3.3":"2026-09-10T17:10:07.764Z"},"bugs":{"url":"https://github.com/loro-dev/loro-mirror/issues"},"author":{"name":"Loro Team"},"license":"MIT","homepage":"https://github.com/loro-dev/loro-mirror#readme","keywords":["loro","loro-crdt","crdt","state-management","synchronization","sync"],"repository":{"type":"git","url":"git+https://github.com/loro-dev/loro-mirror.git","directory":"packages/core"},"description":"Type-safe state management synchronized with Loro CRDT via a declarative schema and bidirectional mirroring.","maintainers":[{"name":"rem2018","email":"remch183@outlook.com"}],"readme":"# Loro Mirror\n\n## Quick Start\n\nDefine a schema and instantiate a `Mirror` with a `LoroDoc`.\n\n```ts\nimport { Mirror, schema } from \"loro-mirror\";\nimport { LoroDoc } from \"loro-crdt\";\n\nconst doc = new LoroDoc();\n\nconst appSchema = schema({\n    // LoroMap: structured object\n    settings: schema.LoroMap({\n        title: schema.String({ defaultValue: \"Docs\" }),\n        darkMode: schema.Boolean({ defaultValue: false }),\n    }),\n    // LoroList: array of items (use `$cid` from maps)\n    todos: schema.LoroList(\n        schema.LoroMap({\n            text: schema.String(),\n        }),\n        (t) => t.$cid, // `$cid` reuses Loro container id (explained later)\n    ),\n    // LoroText: collaborative text (string in state)\n    notes: schema.LoroText(),\n});\n\nconst store = new Mirror({ doc, schema: appSchema });\n\n// Read state\nconst state = store.getState();\n\n// Update (return a new state) — synchronous; the next line sees the new state.\nstore.setState({\n    ...state,\n    settings: { ...state.settings, darkMode: true },\n    todos: [...state.todos, { text: \"Add milk\" }],\n    notes: \"Hello, team!\",\n});\n\n// Or mutate a draft (Immer-style)\nstore.setState((s) => {\n    s.todos.push({ text: \"Ship\" });\n    s.settings.title = \"Project\";\n});\n\n// Subscribe\nconst unsubscribe = store.subscribe((next, { source }) => {\n    // source: \"LORO\" | \"MIRROR\" | \"EPHEMERAL\"\n});\n```\n\n## Installation\n\n```bash\nnpm install loro-mirror loro-crdt\n```\n\n## API Reference\n\nCore structures first:\n\n- LoroMap: Structured object synced to a Loro map. Update fields by setting plain JS values. Nested containers (maps/lists/text) are created automatically from schema.\n- LoroList: Array of items. With an `idSelector`, Mirror performs minimal add/update/move/delete; without it, updates are by index.\n- LoroText: Collaborative rich text represented as a string in state; Mirror calls `LoroText.update` on changes.\n\nTrees are advanced usage; see Advanced: Trees at the end.\n\n### Mirror\n\n- Constructor: `new Mirror({ doc, schema?, initialState?, validateUpdates?=true, ignoreUnknownProperties?=false, debug?=false, checkStateConsistency?=false, inferOptions? })`\n    - doc: LoroDoc to sync with\n    - schema: Root schema; enables validation and typed defaults\n    - initialState: Shallow-merged over schema defaults and current doc JSON\n    - validateUpdates: Validate on `setState`\n    - ignoreUnknownProperties: Tolerate doc properties the schema does not declare (e.g. written by newer schema versions): undeclared root keys are mirrored into state and `validateUpdates` no longer fails on `Unknown property`. State stays the source of truth — unknown keys removed from state are deleted from the doc as usual.\n    - debug: Verbose logging\n    - checkStateConsistency: Extra runtime check that the doc-backed base state still matches `toNormalizedJson(doc)` after non-ephemeral `setState` updates\n    - inferOptions: `{ defaultLoroText?: boolean; defaultMovableList?: boolean; mergeableMapChildContainers?: boolean }` for container inference and Map child-container creation\n- Methods:\n    - getState(): Current state\n    - setState(updater | partial, options?): Mutate a draft or return a new object. Runs synchronously so downstream logic can immediately read the latest state. When `ephemeralStore` is configured, eligible changes are automatically routed through EphemeralStore. See [Ephemeral Patches](#ephemeral-patches) below.\n        - options: `{ tags?: string | string[]; origin?: string; timestamp?: number; message?: string; finalizeTimeout?: number }` — tags surface in subscriber metadata; commit metadata is forwarded to the underlying Loro commit; `finalizeTimeout` controls the debounce delay before ephemeral values auto-commit.\n    - finalizeEphemeralPatches(): Immediately commit pending ephemeral patches to LoroDoc (e.g. on `mouseup`).\n    - subscribe((state, metadata) => void): Subscribe; returns unsubscribe\n        - metadata: `{ source: LORO | MIRROR | EPHEMERAL; tags?: string[] }`\n    - dispose(): Remove all subscriptions\n\nTypes: `UpdateSource`, `UpdateMetadata`, `SetStateOptions`.\n\n### Schema Builder\n\n- Root: `schema({ ...fields })`\n- Primitives: `schema.String`, `schema.Number`, `schema.Boolean`, `schema.Any`, `schema.Ignore`\n- Containers (core):\n    - `schema.LoroMap({ ...fields })`\n    - `schema.LoroList(itemSchema, idSelector?)`\n    - `schema.LoroText()`\n- Containers (additional):\n    - `schema.LoroMovableList(itemSchema, idSelector)` — emits move ops on reorder\n    - `schema.LoroTree(nodeMapSchema)` — hierarchical data (advanced)\n    - `schema.LoroMapRecord(valueSchema)` — dynamic key map with a single value schema\n    - `schema.LoroMap({...}).catchall(valueSchema)` — mix fixed keys with a catchall value schema\n\nSignatures:\n\n- `schema.LoroMap(definition, options?)` — mirrored state always includes a read-only `$cid` field equal to the underlying Loro container id (applies to root/nested maps, list items, and tree node `data` maps).\n- `schema.LoroList(itemSchema, idSelector?: (item) => string, options?)`\n- `schema.LoroMovableList(itemSchema, idSelector: (item) => string, options?)`\n- `schema.LoroText(options?)`\n- `schema.LoroTree(nodeMapSchema, options?)`\n\nSchemaOptions for any field: `{ required?: boolean; defaultValue?: unknown; description?: string; validate?: (value) => boolean | string }`.\nMap-only option: `{ mergeableMapChildContainers?: boolean }` on `schema.LoroMap` or `schema.LoroMapRecord`.\n\nAny options:\n\n- `schema.Any({ defaultLoroText?: boolean; defaultMovableList?: boolean })`\n    - `defaultLoroText` defaults to `false` for Any when omitted (primitive string), overriding the global `inferOptions.defaultLoroText`.\n    - `defaultMovableList` inherits from the global inference options unless specified.\n\nMergeable Map child containers:\n\nBy default, child containers are created with `LoroMap.setContainer`. If two peers concurrently create a child container under the _same_ Map key (e.g. both first-write `records.note`), each peer's child gets a **distinct** container ID. Because the Map slot is last-writer-wins, one peer's child — and everything written into it — is silently dropped after sync.\n\n**Mergeable containers** fix this: the child's identity is derived from its _logical position_ (parent container id + key + type) instead of the creating operation, so every peer's `ensureMergeable*` call resolves to the **same** CRDT object and their content merges. See <https://loro.dev/blog/mergeable-containers> for the full model.\n\nEnable it on the parent Map when multiple peers may create the same child for the first time concurrently:\n\n```ts\nconst appSchema = schema({\n    records: schema.LoroMapRecord(\n        schema.LoroMap({ entries: schema.LoroList(schema.String()) }),\n        { mergeableMapChildContainers: true }, // ← opt in on the parent map\n    ),\n});\n\n// docA.setState({ records: { note: { entries: [\"A\"] } } }) and\n// docB.setState({ records: { note: { entries: [\"B\"] } } }) now converge to one\n// `note` map whose `entries` contains both \"A\" and \"B\" after sync — instead of\n// one peer's `note` clobbering the other's.\n```\n\n- Prefer configuring the parent Map: `schema.LoroMap(..., { mergeableMapChildContainers: true })` or `schema.LoroMapRecord(..., { mergeableMapChildContainers: true })`.\n- `inferOptions.mergeableMapChildContainers` remains the schema-less/global fallback and defaults to `false` for backward-compatible document format and `LoroMap.setContainer` semantics.\n- When enabled for a parent Map, new direct child containers under that `LoroMap`'s keys are created with Loro's `ensureMergeableMap/List/MovableList/Text/Tree` APIs, so concurrent first creation at the same parent/key/type shares one logical child container.\n- Existing same-type child containers are reused as-is, including regular `setContainer` children from old data.\n- All collaborating clients must use `loro-crdt >= 1.13.3` to interpret mergeable child markers. Older clients preserve the data as ordinary binary values but do not expose the mergeable child semantics.\n- Concurrent first writes merge CRDT content rather than acting like LWW replacement. If two peers insert the same text or list item while offline, both writes can be visible after sync.\n- Avoid very deep chains of mergeable child maps because mergeable container IDs encode the logical path and grow with depth.\n- List items and tree nodes keep the existing `insertContainer`/node-data behavior because they are not identified by a stable Map key.\n\nReserved key `$cid`:\n\n- `$cid` is injected into mirrored state for all `LoroMap` schemas; it is never written back to Loro and is ignored by diffs/updates. It’s useful as a stable identifier (e.g., `schema.LoroList(map, x => x.$cid)`).\n\n### Validators & Helpers\n\n- `validateSchema(schema, value)` — returns `{ valid: boolean; errors?: string[] }`\n- `getDefaultValue(schema)` — default value inferred from schema/options\n- `toNormalizedJson(doc)` — JSON matching Mirror’s state shape (e.g., Tree `meta` -> `data`)\n\n## Ephemeral Patches\n\nWhen users drag or scale canvas elements, syncing every intermediate position through LoroDoc creates redundant editing history. Ephemeral patches solve this: pass an `EphemeralStore` and `setState` automatically routes temporary changes through it for real-time sync, then commits once to LoroDoc when the operation ends.\n\n> **Key point:** Adding `ephemeralStore` to `MirrorOptions` changes how `setState` behaves. You don't need a separate API — the same `setState` call is used for both persistent and ephemeral updates.\n\n### How `setState` changes with `ephemeralStore`\n\n**Without `ephemeralStore`** (default):\n\n```\nsetState(updater)  →  all changes  →  LoroDoc\n```\n\n**With `ephemeralStore`**:\n\n```\nsetState(updater)  →  classify each change:\n    primitive on existing Map key  →  EphemeralStore (temporary)\n    everything else                →  LoroDoc (permanent)\n```\n\nA single `setState` call can write to both destinations in one invocation. `getState()` always returns the composed result (`LoroDoc + EphemeralStore overlay`), so callers don't need to know where each value lives.\n\n### Routing rules\n\n| Change type                                                                                               | Destination      | Example               |\n| --------------------------------------------------------------------------------------------------------- | ---------------- | --------------------- |\n| Primitive value (`string`, `number`, `boolean`, `null`) on an **existing key** of an **existing LoroMap** | `EphemeralStore` | `s.items[0].x = 100`  |\n| New Map / new key / container value                                                                       | `LoroDoc`        | `s.items.push({...})` |\n| List / Text / Tree operations                                                                             | `LoroDoc`        | `s.items.splice(...)` |\n\nThe rule is intentionally conservative: only simple value-swaps on known keys go to EphemeralStore. Anything structural always goes to LoroDoc.\n\n### Setup\n\n```ts\nimport { LoroDoc, EphemeralStore } from \"loro-crdt\";\nimport { Mirror, schema } from \"loro-mirror\";\n\nconst doc = new LoroDoc();\nconst eph = new EphemeralStore();\n\nconst mirror = new Mirror({\n    doc,\n    schema: mySchema,\n    ephemeralStore: eph, // ← this changes setState behavior\n});\n\n// Network sync for ephemeral state (your responsibility)\neph.subscribeLocalUpdates((bytes) => channel.send(bytes));\nchannel.on(\"ephemeral\", (bytes) => eph.apply(bytes));\n```\n\n### Usage\n\n```ts\n// During drag — called on every mousemove (~60fps)\n// x/y are primitives on existing keys → routed to EphemeralStore.\n// LoroDoc stays clean — no editing history for intermediate positions.\nmirror.setState(\n    (s) => {\n        s.items[i].x = e.clientX;\n        s.items[i].y = e.clientY;\n    },\n    { finalizeTimeout: 1_000 }, // auto-commit after 1s of inactivity\n);\n\n// Mixed: push goes to LoroDoc, x/y go to EphemeralStore (same call)\nmirror.setState((s) => {\n    s.items.push({ x: 0, y: 0, name: \"new\" }); // → LoroDoc\n    s.items[0].x = 999; // → EphemeralStore\n});\n\n// On mouseup — commit ephemeral values to LoroDoc immediately\nmirror.finalizeEphemeralPatches();\n```\n\n### Finalization\n\nEphemeral values are committed to LoroDoc when:\n\n1. The debounced `finalizeTimeout` expires (default: 50 000 ms). The timer resets on each `setState` call that produces ephemeral changes, so it only fires after the user stops updating.\n2. You call `finalizeEphemeralPatches()` manually (e.g. on `mouseup`).\n\nOn finalize, only values that still match what **this peer** last wrote are committed. If a remote peer overwrote a value in the EphemeralStore, it is skipped to prevent stale writes.\n\n### Cross-peer compatibility\n\nBecause LoroDoc and EphemeralStore are independent, `ephemeralStore` is fully optional:\n\n- Peers **without** `ephemeralStore` sync normally via LoroDoc. They see final values after `finalizeEphemeralPatches()`, but not intermediate ephemeral changes.\n- Peers that share an EphemeralStore channel see real-time intermediate updates as well.\n\n### Subscriber source\n\nSubscribers receive `source: \"EPHEMERAL\"` when state changes due to an EphemeralStore update. Use this to distinguish ephemeral changes from permanent LoroDoc changes:\n\n```ts\nmirror.subscribe((state, { source }) => {\n    if (source === \"EPHEMERAL\") {\n        // Lightweight update — no LoroDoc history created\n    }\n});\n```\n\n## Advanced: Trees\n\nTrees are for hierarchical data where each node has a `data` map. The state shape is `{ id?: string; data: {...}; children: Node[] }`.\n\n```ts\nconst node = schema.LoroMap({ name: schema.String({ required: true }) });\nconst s = schema({ tree: schema.LoroTree(node) });\nconst mirror = new Mirror({ doc: new LoroDoc(), schema: s });\n\nmirror.setState((st) => {\n    st.tree.push({ data: { name: \"root\" }, children: [] });\n});\n```\n\nNote: If you omit `id` when creating a node, Loro assigns one; Mirror writes it back on the next state after sync.\n\n## Tiny React Example\n\nPrefer the React helpers in `loro-mirror-react` for a clean setup.\n\n```tsx\nimport { useLoroStore } from \"loro-mirror-react\";\nimport { schema } from \"loro-mirror\";\nimport { LoroDoc } from \"loro-crdt\";\n\nconst todosSchema = schema({\n    todos: schema.LoroList(\n        schema.LoroMap({ text: schema.String() }),\n        (t) => t.$cid, // list selector uses `$cid` (Loro container id)\n    ),\n});\n\nexport function App() {\n    const { state, setState } = useLoroStore({\n        doc: new LoroDoc(),\n        schema: todosSchema,\n    });\n    return (\n        <div>\n            <button\n                onClick={() =>\n                    setState((s) => {\n                        s.todos.push({ text: \"New\" });\n                    })\n                }\n            >\n                Add\n            </button>\n            <ul>\n                {state.todos.map((t) => (\n                    <li key={t.$cid /* stable key from Loro container id */}>\n                        {t.text}\n                    </li>\n                ))}\n            </ul>\n        </div>\n    );\n}\n```\n\nFor more React patterns (selectors, actions, provider), see `packages/react/README.md` or the `useLoroContext` helpers.\n\n## Notes & Tips\n\n- Use an `idSelector` whenever list items have stable IDs to get efficient moves instead of delete+insert.\n- `setState` accepts an updater that either mutates a draft or returns a new object — use whichever style you prefer.\n- Subscriptions receive `{ source: LORO | MIRROR | EPHEMERAL, tags?: string[] }`.\n\n### Streaming text implementation note\n\nSingle-event updates to an existing string leaf copy only its ancestor path,\npreserving `$cid`, old snapshots and unchanged branch identities. Missing baselines,\naccessor/non-plain paths (including array subclasses), tree paths and structural/multi-event batches retain the\ngeneral Immer path. Ordinary dense arrays copy validated data values directly;\nholes, extra keys, accessors or unusual descriptors retain descriptor copying.\nNo getters, iterators or species constructors run during this copy. It remains\nO(ancestor width), not windowed reading; storage and public APIs do not change.\n\nRun `pnpm --filter loro-mirror bench:single-text-event`. The synthetic benchmark\nwarms each path and alternates five samples of 30 events, checking output equality.\nThe general-path control adds an empty text event (its overhead is included).\nSet `TEXT_EVENT_BASELINE` to a module URL exporting `applyEventBatchToState` to\ncompare a previous build on exactly the same single-event batches. Measurements\nexclude writes, startup and UI rendering. Tests collect callback results/errors\nand assert outside Wasm dispatch; corruption must fail the named test even when\nunhandled errors are ignored. Array tests preserve descriptors and sharing without\ndepending on wall-clock thresholds.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}