{"_id":"@arronqzy/rx-store","_rev":"9-4abf65602067e6553ef5783a45c4c5a7","name":"@arronqzy/rx-store","dist-tags":{"latest":"1.0.8"},"versions":{"0.0.1":{"name":"@arronqzy/rx-store","version":"0.0.1","_id":"@arronqzy/rx-store@0.0.1","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"fe4c59652b890b9150437fda06c0b5067a819548","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-0.0.1.tgz","fileCount":9,"integrity":"sha512-eJUK1DfB8MqIDvgxccQ0Ij3PhxUsKdZIQ3UNcwlerzjEcmvJruPCGOigXwTabbr9wrfjC3f14vLNhRUpwk2UhQ==","signatures":[{"sig":"MEYCIQDfKWBCh64R8AfsAtduEuruyu9a2X5jfrTE14BHD15kbgIhAIhFBTrVJbciqMuoIlg7bThQpA5RnaMVfNuts/mJjv7g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20230},"_from":"file:arronqzy-rx-store-0.0.1.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/private/var/folders/j8/y6q6lt0x6b3c136cncxlxlbr0000gn/T/fc5edb9b3704aba8f984cb29b165dd3e/arronqzy-rx-store-0.0.1.tgz","_integrity":"sha512-eJUK1DfB8MqIDvgxccQ0Ij3PhxUsKdZIQ3UNcwlerzjEcmvJruPCGOigXwTabbr9wrfjC3f14vLNhRUpwk2UhQ==","_npmVersion":"10.9.2","description":"**一个专为低代码/画布编辑器打造的极简、高性能、工业级状态管理库**   基于 **Immer + RxJS**，天生支持：","directories":{},"_nodeVersion":"22.17.0","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_0.0.1_1781753102930_0.3364438162447452","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@arronqzy/rx-store","version":"1.0.1","license":"MIT","_id":"@arronqzy/rx-store@1.0.1","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"a90bd13cb90d2b8442901a83f7a8eb484a2ea36e","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.1.tgz","fileCount":7,"integrity":"sha512-7W1+uRET2sz+gKCwg1J2GBzOiFxLdX/blkAG4sqIsiIVwqXDMgAcjXXV8ea4wPW68DJmF8fNO9CX4Ae9vHbn9w==","signatures":[{"sig":"MEUCIHUvGS58uUM1XG8FeP2ew7UuSBAmoWgsQkjfkkW59TcKAiEAhuswMeezh20ee14DGxGGxHh54qiOtksAgTv0CkjWS0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.1.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/2d79dd30796afdd75ad962e780b855be/arronqzy-rx-store-1.0.1.tgz","_integrity":"sha512-7W1+uRET2sz+gKCwg1J2GBzOiFxLdX/blkAG4sqIsiIVwqXDMgAcjXXV8ea4wPW68DJmF8fNO9CX4Ae9vHbn9w==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.1_1781768114324_0.7157765445265818","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@arronqzy/rx-store","version":"1.0.2","license":"MIT","_id":"@arronqzy/rx-store@1.0.2","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"8d7450951a9b38d37996316e08b5c2f6b3e3449c","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.2.tgz","fileCount":7,"integrity":"sha512-3feHk3gw3BCBPriZkAkC+xGSc9ro9Y6Rbe3Tpqypjhpbs/rPdHO+b0PToB64/Hq6NJrerpxOum+7o4CEotiQLw==","signatures":[{"sig":"MEUCIHTMvNJyixn/C+wa1OYtmd9CbugOJtp/X1RS9o4furNbAiEA7vY89icSTSyvnXTI4TJQqPGuAtbML6/vH4TqiMQzEk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.2.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/a2ff1504d41012612ff5bc0bd6220926/arronqzy-rx-store-1.0.2.tgz","_integrity":"sha512-3feHk3gw3BCBPriZkAkC+xGSc9ro9Y6Rbe3Tpqypjhpbs/rPdHO+b0PToB64/Hq6NJrerpxOum+7o4CEotiQLw==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.2_1782028291876_0.5932008611246462","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@arronqzy/rx-store","version":"1.0.3","license":"MIT","_id":"@arronqzy/rx-store@1.0.3","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"ccc8db54fc75ae138285b8089693fa9319879d2b","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.3.tgz","fileCount":7,"integrity":"sha512-PXVLc44VW6HZ/3Fpkiq3zgDom34qoiWynspKxELJUGkdDxVUBvCeMxhoc9P3bou0tFAAOoWaEk26/9k0qqG5TA==","signatures":[{"sig":"MEUCIF37/a918ZP5kFcbB4l+Dw4/sLyN1lwhzWXA/qmvTGFOAiEAuN9r+VEt/+2gD9nLoopxL8oKPhNYc2f8P6FC8Lwma5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.3.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/59dc7b3856e4f23b6ff15463c92a73c3/arronqzy-rx-store-1.0.3.tgz","_integrity":"sha512-PXVLc44VW6HZ/3Fpkiq3zgDom34qoiWynspKxELJUGkdDxVUBvCeMxhoc9P3bou0tFAAOoWaEk26/9k0qqG5TA==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.3_1786688314319_0.5817087798881562","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@arronqzy/rx-store","version":"1.0.4","license":"MIT","_id":"@arronqzy/rx-store@1.0.4","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"fdc10af566d358ecd744367b52b3456b6b7c69e1","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.4.tgz","fileCount":7,"integrity":"sha512-9ToN+po+PxWd6o2/u4StQRXt1TCr5Kaa0z5YKY1C4ZehzL0tmy/CVOGv/phnE6e9L69D82aETvRZwiDG6ZFqIQ==","signatures":[{"sig":"MEQCIDXkQ8ApJCQbI1XMxoMyuHhQM1lPeKKRqBq1mkndmHf7AiAQGim7WOVnWgEmUbQcZ7VruosMQPvBjXFDriugS0hsTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.4.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/d005f82154cf62b821c60ec1d7a3a120/arronqzy-rx-store-1.0.4.tgz","_integrity":"sha512-9ToN+po+PxWd6o2/u4StQRXt1TCr5Kaa0z5YKY1C4ZehzL0tmy/CVOGv/phnE6e9L69D82aETvRZwiDG6ZFqIQ==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.4_1786691191520_0.25341383405430706","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@arronqzy/rx-store","version":"1.0.5","license":"MIT","_id":"@arronqzy/rx-store@1.0.5","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"2e8ca548ef823b4b6a121cf88f6088d4e17d1d09","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.5.tgz","fileCount":7,"integrity":"sha512-H3tHmgd0IynZqaJSnlmJrodA2L3uKLU8Etg1ZUK+J+Dc+ZhuJAQfCtgHLuuP7CQCRp2uR9jfh31GWAJCweppzw==","signatures":[{"sig":"MEQCIFxp26VR2FxfvhThvoN2tl9foTVCSTGt0Mw3+exxKI8CAiBTNk2PDQnSk10flsxASZXNbMYvz2g9aEQ/J2RjRpRWlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.5.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/1649d82608f03d33d01f53e13779a2a5/arronqzy-rx-store-1.0.5.tgz","_integrity":"sha512-H3tHmgd0IynZqaJSnlmJrodA2L3uKLU8Etg1ZUK+J+Dc+ZhuJAQfCtgHLuuP7CQCRp2uR9jfh31GWAJCweppzw==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.5_1787305304168_0.8958762394970916","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@arronqzy/rx-store","version":"1.0.6","license":"MIT","_id":"@arronqzy/rx-store@1.0.6","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"cc6fb33a575b0141ec681b42b831c0ee6c015c3a","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.6.tgz","fileCount":7,"integrity":"sha512-O5X5VckSZRC9KKFs28nYCSc2NH7dK0AnYHzJ6zJnAmeWzA4r4Wm5c4Sc8seCHRMoWUvabl/Plm7wgBRxVFnZgw==","signatures":[{"sig":"MEUCIH6ry++aYZ7+hGP/6mxxCYWSfjeAE0iDovwmFKjQ73aTAiEA4py2VO2jpVxHCKlbYxNeGMpnOzU8dZtOJWYYFC2+S2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.6.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/0a208894d12179d6c5eb3b3ba31521a6/arronqzy-rx-store-1.0.6.tgz","_integrity":"sha512-O5X5VckSZRC9KKFs28nYCSc2NH7dK0AnYHzJ6zJnAmeWzA4r4Wm5c4Sc8seCHRMoWUvabl/Plm7wgBRxVFnZgw==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.6_1788167348114_0.714839166123161","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@arronqzy/rx-store","version":"1.0.7","license":"MIT","_id":"@arronqzy/rx-store@1.0.7","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"dist":{"shasum":"43e727e107671b12f2a4ece3cc3f489044a72b26","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.7.tgz","fileCount":7,"integrity":"sha512-WJoucYTQL5BBTJkjuu04KJc0e4ujvuPlu80DPHJxjXqgDEl4cCNniN3J9GLNyZZ541JgHZvuVJvvKreaudXBWg==","signatures":[{"sig":"MEUCIQDrH+pAjsFFLnNqwfmgF5lCL0+yR00lor2e9KM9gZqlxgIges2Du5iEYfJnfFsJYiRwhk68PA4on1YVC367O69ZHzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20137},"_from":"file:arronqzy-rx-store-1.0.7.tgz","exports":{".":"./src/index.ts"},"scripts":{"dev":"tsup --watch","lint":"eslint \"src/**/*.{ts,tsx}\"","build":"pnpm run lint && pnpm run typecheck && tsup","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"_resolved":"/tmp/47bf373eb34f4628f3b059db12290ee1/arronqzy-rx-store-1.0.7.tgz","_integrity":"sha512-WJoucYTQL5BBTJkjuu04KJc0e4ujvuPlu80DPHJxjXqgDEl4cCNniN3J9GLNyZZ541JgHZvuVJvvKreaudXBWg==","_npmVersion":"10.8.2","description":"RxJS-based state store for Abuilder","directories":{},"_nodeVersion":"20.20.2","dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rx-store_1.0.7_1788230570435_0.0021692464031843883","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@arronqzy/rx-store","version":"1.0.8","description":"RxJS-based state store for Abuilder","license":"MIT","exports":{".":"./src/index.ts"},"dependencies":{"rxjs":"^7.8.2","immer":"^11.0.1"},"devDependencies":{"eslint":"^8.57.0","typescript":"^5.5.4","@arronqzy/eslint-config":"0.0.0","@arronqzy/typescript-config":"1.0.0"},"publishConfig":{"access":"public"},"scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\"","typecheck":"tsc -p tsconfig.json --noEmit","build":"pnpm run lint && pnpm run typecheck && tsup","dev":"tsup --watch"},"_id":"@arronqzy/rx-store@1.0.8","_integrity":"sha512-9m7Yd7rlrS2dgH0c/EPouBl4dY4kw/L49jYrdedjfzInYDc1u1kOWG2tkH4CS4VJVBmnhrk1yfMSCNCgPVYzFg==","_resolved":"/tmp/0cdf998bf56b3fe20e2dcbe687ce364b/arronqzy-rx-store-1.0.8.tgz","_from":"file:arronqzy-rx-store-1.0.8.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-9m7Yd7rlrS2dgH0c/EPouBl4dY4kw/L49jYrdedjfzInYDc1u1kOWG2tkH4CS4VJVBmnhrk1yfMSCNCgPVYzFg==","shasum":"c295dd968e899819fb7f793d227453e7728ebe5e","tarball":"https://registry.npmjs.org/@arronqzy/rx-store/-/rx-store-1.0.8.tgz","fileCount":7,"unpackedSize":20137,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDLvkSf4tIbKHzjDbzuAdWYNT/71IRdwoHLfCncNakGLgIhAOgB+GGE5RD/m8uQuKqRJhzPD+cEhCRrYbskHGSz2ztj"}]},"_npmUser":{"name":"arronqzy","email":"arronqzy@outlook.com"},"directories":{},"maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rx-store_1.0.8_1788234359250_0.8126393780329548"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-18T03:25:02.783Z","modified":"2026-09-01T03:45:59.525Z","0.0.1":"2026-06-18T03:25:03.060Z","1.0.1":"2026-06-18T07:35:14.474Z","1.0.2":"2026-06-21T07:51:32.010Z","1.0.3":"2026-08-14T06:18:34.541Z","1.0.4":"2026-08-14T07:06:31.709Z","1.0.5":"2026-08-21T09:41:44.292Z","1.0.6":"2026-08-31T09:09:08.302Z","1.0.7":"2026-09-01T02:42:50.561Z","1.0.8":"2026-09-01T03:45:59.355Z"},"license":"MIT","description":"RxJS-based state store for Abuilder","maintainers":[{"name":"arronqzy","email":"arronqzy@outlook.com"}],"readme":"# `@arronqzy/rx-store`  \n\n**一个专为低代码/画布编辑器打造的极简、高性能、工业级状态管理库**  \n基于 **Immer + RxJS**，天生支持：\n\n- 100% Immutable（写法却像 mutable）\n- 类似 Figma 的精准路径订阅（只重渲染改动的节点）\n- 完整的 Undo/Redo + Batch 操作（拖拽只记一次）\n- 插件系统（内置 + 第三方任意扩展）\n- 体积仅 ~15kB，TypeScript 体验完美\n\n灵感来源：**tldraw v2、Figma、Excalidraw、Linear、Retool** 等新一代编辑器的核心状态层实现。\n\n## 安装\n\n```bash\n# yarn / pnpm / npm 任意\nyarn add @arronqzy/rx-store rxjs immer\n```\n\n## 快速开始\n\n```ts\nimport { store } from '@arronqzy/rx-store';\n\n// 1. 普通更新（写法跟 mutable 完全一样）\nstore.update(draft => {\n  draft.root.children.push({\n    id: 'text-1',\n    type: 'text',\n    props: { text: 'Hello World', x: 100, y: 100 }\n  });\n});\n\n// 2. 拖拽防抖（只记一次历史）\nstore.startBatch('drag-node-123');\nstore.update(draft => {\n  draft.root.children[0].props.x += 10;\n});\nstore.endBatch();\n\n// 3. Undo / Redo（Ctrl+Z / Ctrl+Y 直接可用）\nstore.undo();\nstore.redo();\n```\n\n## 核心 API\n\n### store.update(updater, options?)\n\n```ts\nstore.update(draft => {\n  // draft 就是普通对象，随便改！\n  draft.selectedIds = ['node-1'];\n}, {\n  meta: { type: 'select' },\n  skipHistory: false   // 可选：这次操作不进历史（比如光标移动）\n});\n```\n\n### store.selectPath<T>(path)\n\n精准订阅某一条路径的变化，**只在真正改变时触发**，完美适配 React/Vue 局部渲染。\n\n```ts\nstore.selectPath<number>('root.children[2].props.x')\n  .subscribe(x => {\n    console.log('X 坐标变了：', x);\n  });\n\n// 支持嵌套数组写法\nstore.selectPath('root.children[0].props.style.fontSize')\n```\n\n### Undo / Redo\n\n```ts\nstore.undo();\nstore.redo();\n\n// 响应式按钮状态\nstore.canUndo$.subscribe(can => btnUndo.disabled = !can);\nstore.canRedo$.subscribe(can => btnRedo.disabled = !can);\n```\n\n### Batch 操作（拖拽、框选移动必备）\n\n```ts\nstore.startBatch('move-multiple-nodes');\n// ... 连续多次 update\nstore.endBatch();   // 整个过程只记一次历史\n```\n\n### 插件系统\n\n```ts\nimport { store } from '@arronqzy/rx-store';\n\nconst autoSavePlugin = {\n  name: 'auto-save',\n  init(store) {\n    store.select().subscribe(state => {\n      localStorage.setItem('editor-state', JSON.stringify(state));\n    });\n  }\n};\n\nstore.registerPlugin(autoSavePlugin);\n```\n\n插件可用的钩子：\n\n- `init(store)`\n- `onBeforeUpdate(old, new)`\n- `shouldSkipHistory(old, new)` → 返回 `true` 跳过本次历史记录\n- `onUpdate(old, new)`\n\n## 完整示例：React Hook\n\n```tsx\nimport { store } from '@arronqzy/rx-store';\nimport { useEffect, useState } from 'react';\n\nfunction useNode(id: string) {\n  const [node, setNode] = useState(() =>\n    store.getState().root.children.find(n => n.id === id)\n  );\n\n  useEffect(() => {\n    const sub = store\n      .selectPath(`root.children[${id}]`)  // 也可以写死索引或用 find\n      .subscribe(setNode);\n    return () => sub.unsubscribe();\n  }, [id]);\n\n  return node;\n}\n```\n\n## 为什么选择这个方案（2025 最佳实践）\n\n| 方案                | 体积   | TS 支持 | 性能     | 社区趋势 |\n|---------------------|--------|---------|----------|----------|\n| immutable.js        | 150kB+ | 差      | 慢 30-200% | 已无人维护 |\n| zustand + immer     | ~20kB  | 好      | 快       | 流行     |\n| **本库 (Immer + RxJS)** | **~15kB** | **完美** | **最快** | **新一代编辑器标配** |\n\n## 许可证\n\nMIT © arronqzy\n\n---\n\n","readmeFilename":"readme.md"}