{"_id":"@syncraft-labs/react","_rev":"12-59f391de0e1f5af4aab442c90d46b8c6","name":"@syncraft-labs/react","dist-tags":{"latest":"0.6.0"},"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":{"_id":"@syncraft-labs/react@0.6.0","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"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDqHAGuo4wSUIdsKb+T0Dcg1ymDl0OBO2+jthezfJwJFwIgSlqg36xo63cs6F6a/5xkL0F+o7PlyMz8zUi40nrxPDo="}],"unpackedSize":82341},"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":"ac8625b2797c1e3d676656120729d678ffea7f8c","license":"MIT","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest watch"},"version":"0.6.0","_npmUser":{"name":"denislistiadi","email":"denislistiadi24@gmail.com"},"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":"11.17.0","description":"React hooks for Syncraft Labs — local-first state synchronization.","directories":{},"maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"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":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react_0.6.0_1789485927573_0.13977847480745798"}}},"time":{"created":"2026-06-29T07:48:13.631Z","modified":"2026-09-15T15:25:27.836Z","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"},"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>\r\n\r\n**<p align=\"center\">The official React bindings for Syncraft Labs — local-first state synchronization.</p>**\r\n\r\n<p align=\"center\">\r\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>\r\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>\r\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>\r\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>\r\n  <a href=\"https://www.typescriptlang.org/\"><img src=\"https://img.shields.io/badge/TypeScript-strict-blue.svg?style=flat-square\" alt=\"TypeScript\"></a>\r\n</p>\r\n\r\n---\r\n\r\n## Purpose\r\n\r\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.\r\n\r\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.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm install @syncraft-labs/core @syncraft-labs/react\r\n\r\n# yarn\r\nyarn add @syncraft-labs/core @syncraft-labs/react\r\n\r\n# pnpm\r\npnpm add @syncraft-labs/core @syncraft-labs/react\r\n```\r\n*Peer dependencies: React ≥ 18.0.0*\r\n\r\n## Documentation\r\n\r\nThe Syncraft Labs documentation is available at **[syncraft-labs.web.id](https://syncraft-labs.web.id)**.\r\n\r\n- [Getting Started with React](https://syncraft-labs.web.id/docs/packages/react)\r\n- [SSR with Next.js & Remix](https://syncraft-labs.web.id/docs/guides/ssr-nextjs-nuxt)\r\n- [Production Guides](https://syncraft-labs.web.id/docs/guides/production-checklist)\r\n\r\n## Basic Usage\r\n\r\nWrap your application tree in `<SyncraftProvider>` (crucial for SSR safety and request isolation), then consume state anywhere with `useSync`.\r\n\r\n```tsx\r\nimport { SyncraftProvider, useSync } from \"@syncraft-labs/react\";\r\n\r\ninterface TodoState {\r\n  todos: Array<{ id: string; text: string; done: boolean }>;\r\n}\r\n\r\nfunction TodoApp() {\r\n  const { data, update, isHydrating, isOffline, error } = useSync<TodoState>(\r\n    \"todos\",\r\n    { initialState: { todos: [] } }\r\n  );\r\n\r\n  // 1. Wait for IndexedDB hydration\r\n  if (isHydrating) return <p>Loading from cache…</p>;\r\n\r\n  // 2. Handle network and errors gracefully\r\n  if (isOffline) console.log(\"Working offline!\");\r\n  if (error) console.error(\"Mutation failed\", error);\r\n\r\n  return (\r\n    <div>\r\n      <button\r\n        onClick={() =>\r\n          update((draft) => {\r\n            draft.todos.push({\r\n              id: crypto.randomUUID(),\r\n              text: \"New todo\",\r\n              done: false,\r\n            });\r\n          })\r\n        }\r\n      >\r\n        Add Todo\r\n      </button>\r\n\r\n      <ul>\r\n        {data?.todos.map((t) => (\r\n          <li key={t.id}>{t.text}</li>\r\n        ))}\r\n      </ul>\r\n    </div>\r\n  );\r\n}\r\n\r\nexport function App() {\r\n  return (\r\n    <SyncraftProvider>\r\n      <TodoApp />\r\n    </SyncraftProvider>\r\n  );\r\n}\r\n```\r\n\r\n## React Suspense (`useSyncSuspense`)\r\n\r\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:\r\n\r\n```tsx\r\nimport { Suspense } from \"react\";\r\nimport { SyncraftProvider, useSyncSuspense } from \"@syncraft-labs/react\";\r\n\r\nfunction TodoList() {\r\n  const { data, update } = useSyncSuspense<TodoState>(\"todos\", {\r\n    initialState: { todos: [] },\r\n  });\r\n\r\n  return (\r\n    <ul>\r\n      {data.todos.map((t) => (\r\n        <li key={t.id}>{t.text}</li>\r\n      ))}\r\n    </ul>\r\n  );\r\n}\r\n\r\nexport function App() {\r\n  return (\r\n    <SyncraftProvider>\r\n      <Suspense fallback={<p>Loading from cache…</p>}>\r\n        <TodoList />\r\n      </Suspense>\r\n    </SyncraftProvider>\r\n  );\r\n}\r\n```\r\n\r\n## Remote Sync (Background Pushing)\r\n\r\nInject your API calls into the `useSync` options. Syncraft automatically queues mutations offline and drains the outbox using exponential backoff when connectivity is available.\r\n\r\n```tsx\r\nconst { data, update, refetch, isSyncing } = useSync<TodoState>(\"todos\", {\r\n  initialState: { todos: [] },\r\n\r\n  // Fetch initial state (called once if DB is empty)\r\n  fetcher: () => fetch(\"/api/todos\").then((r) => r.json()),\r\n\r\n  // Push pending mutations to your backend\r\n  pusher: async (entries) => {\r\n    await fetch(\"/api/sync\", {\r\n      method: \"POST\",\r\n      headers: { \"Content-Type\": \"application/json\" },\r\n      body: JSON.stringify(entries),\r\n    });\r\n  },\r\n\r\n  // Polling interval in ms (default: 5000)\r\n  syncInterval: 3000,\r\n});\r\n```\r\n\r\n## API Reference\r\n\r\n| Export | Type | Description |\r\n|--------|------|-------------|\r\n| `<SyncraftProvider>` | Component | App root wrapper guaranteeing store isolation across SSR requests |\r\n| `useSync<T>(key, options)` | Hook | Primary React integration hook returning reactive state and updater |\r\n| `useSyncSuspense<T>(key, options)` | Hook | Suspense-compatible hook throwing promises during hydration |\r\n| `destroyStore(key)` | Function | Destroys an active store instance by storage key |\r\n| `UseSyncOptions<T>` | Interface | Configuration options (`initialState?`, `fetcher?`, `pusher?`, `syncInterval?`, `maxOutboxSize?`, `overflowStrategy?`, `onOverflow?`, `storageMode?`, `idField?`) |\r\n| `UseSyncReturn<T>` | Interface | Return values (`data`, `update`, `refetch`, `isHydrating`, `isSyncing`, `isOffline`, `error`) |\r\n\r\n## License\r\n\r\n[MIT](https://github.com/denislistiadi/syncraft-labs/blob/main/LICENSE) © Denis Listiadi\r\n\r\n","readmeFilename":"README.md"}