{"_id":"@syncraft-labs/react","_rev":"14-24a8a8a68f441fbd9d5897f6b2a5bfef","name":"@syncraft-labs/react","dist-tags":{"latest":"0.7.1"},"versions":{"0.1.0":{"name":"@syncraft-labs/react","version":"0.1.0","keywords":["syncraft","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.1.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://github.com/denislistiadi/syncraft/tree/main/packages/react#readme","bugs":{"url":"https://github.com/denislistiadi/syncraft/issues"},"dist":{"shasum":"ecba68692a9f926fc73db54403edca5586f88048","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.1.0.tgz","fileCount":8,"integrity":"sha512-3aYbRitrLVUJaRObfdl3DASlRl5sfh6Tu9LuD5La3axuq7iCwEmkdtorjSOUW7+Z5AGPl6XUGt7fOw3Gpb/s8g==","signatures":[{"sig":"MEYCIQDjBAixNaReBQ9Vj4STbmdEDaOscUtDwUKGmqbdrnGKowIhAN+9fuRleUDfmEg2C4GGMVd34Y1bTZdVSJ9/pr//gM4T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74572},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"65b0a3aea39a9913a4f4604bcbe2b83404f56e44","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft.git","type":"git","directory":"packages/react"},"_npmVersion":"10.9.2","description":"React hooks for Syncraft — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"@syncraft-labs/core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.0_1782719293730_0.6280761766379788","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@syncraft-labs/react","version":"0.1.1","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.1.1","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://github.com/denislistiadi/syncraft-labs/tree/main/packages/react#readme","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"b95a2c3b572ef929c0a9c739d1865b493e8dfab6","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.1.1.tgz","fileCount":8,"integrity":"sha512-bFcy/frq+hDp7mw0+usYqCNGoFBcEWAA76iiJZ5Kl6hd1Tqo+M051xzad0h7ssGXq2IYKqT590hFnfnNhinpEQ==","signatures":[{"sig":"MEYCIQCCvbIgy4AcpSnz0/JCL+HYFCK168nWBJKV3JUOb8vk3wIhAP8LguT8011rLcybjQnA2ijZGVYHAW97niNTPenlE5Wm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":74610},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"77eb453b357b5266fa73c73f9e45482e5a6e1351","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.1_1783685569979_0.4822162789624813","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@syncraft-labs/react","version":"0.2.0","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.2.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.netlify.app","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"fa2fa4c8545747364848728e4c6b21f2d2b8d076","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.2.0.tgz","fileCount":8,"integrity":"sha512-iutlV6cNh5xEeClhNY/y7tsOVHgYT9XsTtSbTtpUcQ9aeI5q+Q993/DFDMeMWDu/o16haAUe7WDQYLnUwnBgyg==","signatures":[{"sig":"MEUCIAOfP+9TXtX2BkGtxyNkoSHCfM3AWdlD6XiV0VRzN6A8AiEAn3jm4AAul72Z6WoLsTGTgRza3Ns6GH0eVzk/s4Zeph8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":84336},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"bd63f956f0e7dcbc6a4703cb56a3d7ef49ded4fa","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.0_1783926990804_0.46872688364383386","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@syncraft-labs/react","version":"0.2.1","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.2.1","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.netlify.app","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"61ccd44d07ffdb7c9ab358b589f61369e8a94bea","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.2.1.tgz","fileCount":8,"integrity":"sha512-M3YKat2GOTwom0L2KqMSgLRdxnoILI9Jdv7vKYPd3y6RllIeQF7cAupHiLY9zCAzVwB+gWza+b07SPih6ARDVA==","signatures":[{"sig":"MEQCIFQPVyRKlAvDCXgkeej1txyIqVKbICh1sZWBuiD3poHpAiBcCf8ThbqRElAnxLzjZZ1PdpgxtWQZUlCeNbAMwfBauQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82695},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"0cc7defbb109a7b1f375e77ceec4bdd98b2f62cc","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.1_1784564442334_0.43867626731503684","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@syncraft-labs/react","version":"0.3.0","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.3.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.web.id","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"d67b782e4d8a4b44925926d3ce3b12f200d59ce2","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.3.0.tgz","fileCount":8,"integrity":"sha512-0kUThoyYvw6tQuwHe5yHC3XAr9oRfM+YykOX58+tfUSNq8NhXdYrEADMPMYZ9eQqPugJgiDitLqGpxL39MCb0g==","signatures":[{"sig":"MEUCIG1aPHE3G+AISXQWgJCPJ1uG2Kgud9Sc51TtW7l/k/bXAiEA7bxeciJzGAb4deOIdbwHxA2BmyknoYdnRP+svwBOYBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":84775},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"3abeddceb46235b57f2ef92bb4352fc592ec3d18","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.0_1785609489147_0.6445294058000992","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@syncraft-labs/react","version":"0.4.0","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.4.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.web.id","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"81b662221c6137fd1a18ed19b3866ff5f09917db","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.4.0.tgz","fileCount":8,"integrity":"sha512-glp5UpjjGiGNqtxg1jNu3k7niA+ZB4gnDvKfYZvuhoam2CpyIAGDHsTmfGOfhlTViw6hhV3FizjnVM6hzyYAnw==","signatures":[{"sig":"MEYCIQDk/6IkY+EcRhTM2jKt+43GFGdCmboudiIX49fbKHkpwwIhAJq7nYuKIfCVoGvciA6oL/DEn9t6guv8+W82YhjBBYYa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":88383},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"e8612dcbfcff864aac51a2991fafd8125a5b5caf","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.4.0_1787248270020_0.8281922212496353","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@syncraft-labs/react","version":"0.4.2","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.4.2","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.web.id","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"95da0eb5896b9cf158fd17acb5053460f02b86fd","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.4.2.tgz","fileCount":8,"integrity":"sha512-5KYjQHoQksmirfxfVRV4NaiO0tTd1sgkhGY+xuV5MqJzDGObB7UklLslTZ91q/AiB0xD4utxDl+5MelAThQEQw==","signatures":[{"sig":"MEUCIGX6Knq3iOs2w80GVN18PXd3RV9QOk/rDA7MpQPyE6ZlAiEAgbuCUP2/uy64zAEPUQPAPffcuNipw/BTZ21YZhnOiKA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":88383},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"3eaa0c6bd21888026d6620c4dc036f68e08dc475","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"0.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.4.2_1787416935610_0.6236653571420117","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@syncraft-labs/react","version":"0.5.0","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.5.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.web.id","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"99f15600de716c89e8e708d952a37125569ba817","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.5.0.tgz","fileCount":8,"integrity":"sha512-RnOmBpubrNyB9Nr6p2LILobMqlBCpF9NkH3EqethfAvY1iytl9qfEcDF3Q3cITKaMVX8feOD+f/fUCfUHcEYKg==","signatures":[{"sig":"MEUCIA1F/mY0wl1U2hvhWmD+jHn1FHYnIOI2PpqeDk8ZsxbtAiEAqHLqtMWMZX5ae7oIliSD6S4uJ8AH66HyRjFgxbCpgaw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDJ1RiCF5S2KwE2ujgL+lmxFiIWN1o5FOoczMJDI8BX3QIhAIcqyJUJ0TkE/8KzbJ1zZHZBeNrcjVhsQsbRuc8HufWh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":77053},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"a8e1fbd61f5f9a3921f4a17c7230dc0b0fdd0ff3","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"10.8.2","description":"React hooks for Syncraft Labs â€” local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@syncraft-labs/core":"0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.5.0_1788888885605_0.8882160223673559","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@syncraft-labs/react","version":"0.6.0","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.6.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.web.id","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"f6108c37bffa52520388b768a67aac296be9a85d","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.6.0.tgz","fileCount":8,"integrity":"sha512-17Ont/qkDDx+1SMcJGM/zQjGQ2Tfd68695GWk1U16ZfDKLrc9t7Z6ZVUVRcR98JKq8Y5TxUgGDg1Lb4gbPqT1A==","signatures":[{"sig":"MEQCIANJ5lYy+d4EMp+vV5Fo5ZhnHC9lUXZvdnSmuTmh4ZpjAiBqBZYohkSfB64w9r/vRPYDvbJFIhvKAwTZ2Jds01YXQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDqHAGuo4wSUIdsKb+T0Dcg1ymDl0OBO2+jthezfJwJFwIgSlqg36xo63cs6F6a/5xkL0F+o7PlyMz8zUi40nrxPDo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82341},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"ac8625b2797c1e3d676656120729d678ffea7f8c","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"11.17.0","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@syncraft-labs/core":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.6.0_1789485927573_0.13977847480745798","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@syncraft-labs/react","version":"0.7.0","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/react@0.7.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://syncraft-labs.web.id","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"d15b06de1e94e63a696e08e45dcd51df10c719c1","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.7.0.tgz","fileCount":8,"integrity":"sha512-uM2BQ+zu/mdGrjFv7ZJsLF8GhQbxcj8fbMgV81GI+LWB/mpVLYO3taSnV/cfcqKOdHClerR1Z7exx+o99eIzvw==","signatures":[{"sig":"MEQCIE9Ej0gVW2zU53OkmpbvMbW71CFlu0QN8PD494FmqPK1AiAP1T/mbOqPwbZLiG4S+cJWhG2rC5Y/a51lwiGSFmFZvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFiDH1B8BxRmnguT8Jt4ZOHtf4FkpyHwJnjiRFqZveXWAiBgAUb/W24p5ow44KgxfMlzPsm65CP7OsvQTG39JMvQuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":87613},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"ec7b5c6b1c64727d7eec15b264053067c7608083","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"b1f20201-c278-4c03-8210-3bdab823f87b"}},"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"12.2.0","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.3","dependencies":{"@syncraft-labs/core":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.7.0_1791802039510_0.3117174331935284","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"_id":"@syncraft-labs/react@0.7.1","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"f6a25f6ae0032b8d85c0e04f3c7a17508ae5a058","tarball":"https://registry.npmjs.org/@syncraft-labs/react/-/react-0.7.1.tgz","fileCount":8,"integrity":"sha512-SI71RH8menSrKBf/jOKHbHwkHtmQY8S5qPSBMXIufIbV+9Mq1zaH6hFX1CYjdqxXfOiMd5MZ6SGea+w0BYt7Dw==","signatures":[{"sig":"MEUCIE0YCIve4E2LxsG6ewZTwbKCB78CUWbKYqm/mperouBKAiEA5gduMfbW+3aN2ecmC+crEppbPgeu1JvTS/XXQsaVABY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFsMRTPIfG7gjFvYlilt2Kz6T+HSypFo/77uuwNtRqwdAiAuwdtsvkjwUpBqLTVWCVxzI91ONwJXTysz/FO1Q4o1AQ=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2freact@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":80007},"main":"./dist/index.cjs","name":"@syncraft-labs/react","type":"module","types":"./dist/index.d.ts","author":{"name":"Denis Listiadi"},"module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"806b9c9bdfb8bbc2d912c4e8948b7f1fdfa41df5","license":"MIT","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"version":"0.7.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"b1f20201-c278-4c03-8210-3bdab823f87b"}},"homepage":"https://syncraft-labs.web.id","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"_npmVersion":"12.2.0","description":"React hooks for Syncraft Labs - local-first state synchronization.","directories":{},"maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.23.3","dependencies":{"@syncraft-labs/core":"0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^26.1.0","react":"^19.0.0","vitest":"^3.2.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/react":"^19.0.0","fake-indexeddb":"^6.0.0","@testing-library/react":"^16.3.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react_0.7.1_1792070135560_0.43005674565060126"}}},"time":{"created":"2026-06-29T07:48:13.631Z","modified":"2026-10-15T13:15:36.206Z","0.1.0":"2026-06-29T07:48:13.870Z","0.1.1":"2026-07-10T12:12:50.111Z","0.2.0":"2026-07-13T07:16:30.968Z","0.2.1":"2026-07-20T16:20:42.472Z","0.3.0":"2026-08-01T18:38:09.295Z","0.4.0":"2026-08-20T17:51:10.180Z","0.4.1":"2026-08-22T10:08:35.218Z","0.4.2":"2026-08-22T16:42:15.766Z","0.5.0":"2026-09-08T17:34:45.691Z","0.6.0":"2026-09-15T15:25:27.660Z","0.7.0":"2026-10-12T10:47:19.594Z","0.7.1":"2026-10-15T13:15:35.647Z"},"bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"author":{"name":"Denis Listiadi"},"license":"MIT","homepage":"https://syncraft-labs.web.id","keywords":["syncraft-labs","react","hooks","local-first","offline","sync","useSyncExternalStore","optimistic-ui","suspense","provider","state-management","indexeddb","typescript"],"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/react"},"description":"React hooks for Syncraft Labs - local-first state synchronization.","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"readme":"# <p align=\"center\">@syncraft-labs/react</p>\n\n**<p align=\"center\">The official React bindings for Syncraft Labs - local-first state synchronization.</p>**\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@syncraft-labs/react\"><img src=\"https://img.shields.io/npm/v/@syncraft-labs/react?style=flat-square&color=61dafb\" alt=\"npm version\"></a>\n  <a href=\"https://www.npmjs.com/package/@syncraft-labs/react\"><img src=\"https://img.shields.io/npm/dt/@syncraft-labs/react?style=flat-square\" alt=\"total downloads\"></a>\n  <a href=\"https://bundlephobia.com/package/@syncraft-labs/react\"><img src=\"https://img.shields.io/bundlephobia/minzip/@syncraft-labs/react?style=flat-square\" alt=\"size\"></a>\n  <a href=\"https://github.com/denislistiadi/syncraft-labs/blob/main/LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square\" alt=\"License: MIT\"></a>\n  <a href=\"https://www.typescriptlang.org/\"><img src=\"https://img.shields.io/badge/TypeScript-strict-blue.svg?style=flat-square\" alt=\"TypeScript\"></a>\n</p>\n\n---\n\n## Purpose\n\n`@syncraft-labs/react` provides the `useSync` and `useSyncSuspense` hooks for React. It gives your React components instant optimistic writes, durable IndexedDB persistence, automatic background outbox sync, and cross-tab synchronization.\n\nBuilt natively on `useSyncExternalStore`, it guarantees tear-free concurrent rendering in React 18+ while enforcing context-based store isolation via `<SyncraftProvider>` to eliminate data leaks in Server-Side Rendering (SSR) environments like Next.js and Remix.\n\n## Installation\n\n```bash\n# npm\nnpm install @syncraft-labs/core @syncraft-labs/react\n\n# yarn\nyarn add @syncraft-labs/core @syncraft-labs/react\n\n# pnpm\npnpm add @syncraft-labs/core @syncraft-labs/react\n```\n*Peer dependencies: React ≥ 18.0.0*\n\n## Documentation\n\nThe Syncraft Labs documentation is available at **[syncraft-labs.web.id](https://syncraft-labs.web.id)**.\n\n- [Getting Started with React](https://syncraft-labs.web.id/docs/packages/react)\n- [SSR with Next.js & Remix](https://syncraft-labs.web.id/docs/guides/ssr-nextjs-nuxt)\n- [Production Guides](https://syncraft-labs.web.id/docs/guides/production-checklist)\n\n## Basic Usage\n\nWrap your application tree in `<SyncraftProvider>` (crucial for SSR safety and request isolation), then consume state anywhere with `useSync`.\n\n```tsx\nimport { SyncraftProvider, useSync } from \"@syncraft-labs/react\";\n\ninterface TodoState {\n  todos: Array<{ id: string; text: string; done: boolean }>;\n}\n\nfunction TodoApp() {\n  const { data, update, isHydrating, isOffline, error } = useSync<TodoState>(\n    \"todos\",\n    { initialState: { todos: [] } }\n  );\n\n  // 1. Wait for IndexedDB hydration\n  if (isHydrating) return <p>Loading from cache...</p>;\n\n  // 2. Handle network and errors gracefully\n  if (isOffline) console.log(\"Working offline!\");\n  if (error) console.error(\"Mutation failed\", error);\n\n  return (\n    <div>\n      <button\n        onClick={() =>\n          update((draft) => {\n            draft.todos.push({\n              id: crypto.randomUUID(),\n              text: \"New todo\",\n              done: false,\n            });\n          })\n        }\n      >\n        Add Todo\n      </button>\n\n      <ul>\n        {data?.todos.map((t) => (\n          <li key={t.id}>{t.text}</li>\n        ))}\n      </ul>\n    </div>\n  );\n}\n\nexport function App() {\n  return (\n    <SyncraftProvider>\n      <TodoApp />\n    </SyncraftProvider>\n  );\n}\n```\n\n## React Suspense (`useSyncSuspense`)\n\nFor seamless integration with React Suspense boundaries, use `useSyncSuspense`. It throws a promise during cold-start IndexedDB hydration so components can rely on direct `data` access:\n\n```tsx\nimport { Suspense } from \"react\";\nimport { SyncraftProvider, useSyncSuspense } from \"@syncraft-labs/react\";\n\nfunction TodoList() {\n  const { data, update } = useSyncSuspense<TodoState>(\"todos\", {\n    initialState: { todos: [] },\n  });\n\n  return (\n    <ul>\n      {data.todos.map((t) => (\n        <li key={t.id}>{t.text}</li>\n      ))}\n    </ul>\n  );\n}\n\nexport function App() {\n  return (\n    <SyncraftProvider>\n      <Suspense fallback={<p>Loading from cache...</p>}>\n        <TodoList />\n      </Suspense>\n    </SyncraftProvider>\n  );\n}\n```\n\n## Remote Sync (Background Pushing)\n\nInject your API calls into the `useSync` options. Syncraft automatically queues mutations offline and drains the outbox using exponential backoff when connectivity is available.\n\n```tsx\nconst { data, update, refetch, isSyncing } = useSync<TodoState>(\"todos\", {\n  initialState: { todos: [] },\n\n  // Fetch initial state (called once if DB is empty)\n  fetcher: () => fetch(\"/api/todos\").then((r) => r.json()),\n\n  // Push pending mutations to your backend\n  pusher: async (entries) => {\n    await fetch(\"/api/sync\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(entries),\n    });\n  },\n\n  // Polling interval in ms (default: 5000)\n  syncInterval: 3000,\n});\n```\n\n## Performance & Optimization\n\n**Selector-based Reactivity**: Prevent over-rendering by passing a `selector` function. The hook will only trigger a re-render if the selected slice of data changes.\n```tsx\nconst doneTodos = useSync(\"todos\", {\n  selector: (state) => state?.todos.filter((t) => t.done),\n});\n```\n\n## Developer Tools\n\nSyncraft Labs exposes a global object `window.__SYNCRAFT_DEVTOOLS__` in the browser. You can inspect all active local stores via `window.__SYNCRAFT_DEVTOOLS__.stores`.\n\n## API Reference\n\n| Export | Type | Description |\n|--------|------|-------------|\n| `<SyncraftProvider>` | Component | App root wrapper guaranteeing store isolation across SSR requests |\n| `useSync<T>(key, options)` | Hook | Primary React integration hook returning reactive state and updater |\n| `useSyncSuspense<T>(key, options)` | Hook | Suspense-compatible hook throwing promises during hydration |\n| `destroyStore(key)` | Function | Destroys an active store instance by storage key |\n| `UseSyncOptions<T>` | Interface | Configuration options (`initialState?`, `fetcher?`, `pusher?`, `syncInterval?`, `selector?`, `onSyncStart?`, `onSyncSuccess?`, `onSyncError?`, `onRollback?`, `maxOutboxSize?`, `overflowStrategy?`, `onOverflow?`, `storageMode?`, `idField?`) |\n| `UseSyncReturn<T>` | Interface | Return values (`data`, `update`, `refetch`, `isHydrating`, `isSyncing`, `isOffline`, `error`) |\n\n## License\n\n[MIT](https://github.com/denislistiadi/syncraft-labs/blob/main/LICENSE) © Denis Listiadi\n\n","readmeFilename":"README.md"}