{"_id":"@syncraft-labs/core","_rev":"12-167499a91351fe9349634ea25d10cd6a","name":"@syncraft-labs/core","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@syncraft-labs/core","version":"0.1.0","keywords":["sync","local-first","offline","indexeddb","optimistic-ui","state","immer","persistence"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@0.1.0","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://github.com/denislistiadi/syncraft/tree/main/packages/core#readme","bugs":{"url":"https://github.com/denislistiadi/syncraft/issues"},"dist":{"shasum":"bfeeed97daebf8d2ab52cefb415f06cb31213683","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.1.0.tgz","fileCount":8,"integrity":"sha512-TsQBeIpqG3xde63QGD9kTDVuY1vfNagvVf2OgW7JIbkvKRP/pPwReOL2M7Net3bT/gonkScRD11EA17nvSBM4Q==","signatures":[{"sig":"MEUCIQDDWWYiMkITuiZ90WxKe5jAxaZngZTqlykF86Q34HXWagIgBOEDDT8izJAFn8hd2ArUJp/t80hOMR3QHNNUxvcwZ3c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103587},"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/core"},"_npmVersion":"10.9.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"idb":"^8.0.0","immer":"^10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1782719270255_0.11080777666067299","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@syncraft-labs/core","version":"0.1.1","keywords":["sync","local-first","offline","indexeddb","optimistic-ui","state","immer","persistence"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@0.1.1","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"homepage":"https://github.com/denislistiadi/syncraft-labs/tree/main/packages/core#readme","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"371113735543f6322d6e46ca496f8dbce5812003","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.1.1.tgz","fileCount":8,"integrity":"sha512-s+jbV8PlDZ1kiEaH7xhRAq/TZzMqsq7tH2x0qBM69gXpzA9SsWjXZDdtSnYo6K9i02OOtYBSHFcAzXJwqePBCg==","signatures":[{"sig":"MEUCIColymDSj64gL15DpbAFT2QBQV8jVs3I4R7EAt4Tn4xjAiEAvgBzlxMGDAtQeENIL9pJFQxdk2pnhuZw63Tn90ODxSg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":103722},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0","immer":"^10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1783685567108_0.9793028571686901","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@syncraft-labs/core","version":"0.2.0","keywords":["sync","local-first","offline","indexeddb","optimistic-ui","state","immer","persistence"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@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":"6a2de95c484b53315662e945e8069d3fbb52443f","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.2.0.tgz","fileCount":8,"integrity":"sha512-+rxgOot9yCxhWAT07F57Oif5fGcB7WIwXf0G8B3ksWTJGUoG6Xk803qKIRRsdGEgUcQknWMOhAjfdV770D4VEQ==","signatures":[{"sig":"MEUCICxr/gkMU8DgZCi9zdjnzVVai29lUVIRv/u6SDwduCqQAiEAwe3zLrRSod5G0lwiva56iSgXrBbpt9ba8Kkn2K5Wmog=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":108986},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0","immer":"^10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.0_1783926988024_0.29416988293123914","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@syncraft-labs/core","version":"0.2.1","keywords":["sync","local-first","offline","indexeddb","optimistic-ui","state","immer","persistence"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@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":"499e7e96371b42fb91893d51310637005a7a7214","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.2.1.tgz","fileCount":8,"integrity":"sha512-A9Qlr+gKU2QcN8SHDyW6/NJJfavR0TFH+aAzjkX5F9hKHchSot+cP3Q67qnzQrBS1jyD+MOyBOO/CkYHAEKy7Q==","signatures":[{"sig":"MEUCIQD7zXwLnkOV4Q0+ivB57y3KgiW+JI9wcWVu3mJypITMfQIgXVnqfgOeoPPWkjAz6E8cLn7hWUIhgRwyLkJ6vDwqhnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":107318},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0","immer":"^10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.1_1784564439822_0.9915651427712808","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@syncraft-labs/core","version":"0.3.0","keywords":["syncraft-labs","sync","local-first","offline","indexeddb","optimistic-ui","state","persistence","outbox","patches","crdt","hydration","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@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":"4d96f3f88286944c6255895b63e0d9bb4c95d3fd","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.3.0.tgz","fileCount":8,"integrity":"sha512-5/thT7JgRRh/Mj7EdzXkSKJoZW3rKIg9j3keUmAUE9jx/vTAtymGa9DKvyk1MRG87LxBLrtW85Wkb66EaDjz0Q==","signatures":[{"sig":"MEUCIFICs9g4LZTYr3Uc13NfrHEOyGcNaj/UCYwiZrlFIHnsAiEAqiz9sxEHvdQTtnjsbZq1a/NhBQ897vCmk4/E1lid5BY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":145384},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.0_1785609486112_0.34598749908871684","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@syncraft-labs/core","version":"0.4.0","keywords":["syncraft-labs","sync","local-first","offline","indexeddb","optimistic-ui","state","persistence","outbox","patches","crdt","hydration","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@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":"8c3da4db8fa0eda7a35a06c6222bd84b4aacff5a","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.4.0.tgz","fileCount":8,"integrity":"sha512-tjR7HrHZlLTLPKOkBKN1AAijyhrsYsXWjhQHXdaVdrWlxweqbvmlc1eVtZwDsADSvpTjn1o9HBwH2GfmcSUKDw==","signatures":[{"sig":"MEUCIQCCmf656nmvMMmPci1tJmByeiQRnYzTNMS4vU4MRjygcAIgIoWWZu75oMquTLK5oJaQEFD+DtvDAWyzzDO9Qj/4opE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":257622},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.0_1787248263000_0.7027261218430059","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@syncraft-labs/core","version":"0.4.2","keywords":["syncraft-labs","sync","local-first","offline","indexeddb","optimistic-ui","state","persistence","outbox","patches","crdt","hydration","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@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":"f62976610523c60f3afb75bc83963a51ae99e994","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.4.2.tgz","fileCount":8,"integrity":"sha512-WNO2EzSyeijrvc2sPGWKbGzjq32T6bxITNJ2TFAoJWHJu7hpd7iDi4PYfoBSjD6xfimMOF7Ia5nyDU++eeXUzQ==","signatures":[{"sig":"MEUCIQCZJka/Td/TpJ7Kv90sfCQlL83NF9fxQFxInt7HvgF5xgIgXd4PGKOCsvtpHGc4WNHvmG+W/eqTV1z84PuSc2g4IEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":257622},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine — core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.2_1787416932872_0.30264487370163895","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@syncraft-labs/core","version":"0.5.0","keywords":["syncraft-labs","sync","local-first","offline","indexeddb","optimistic-ui","state","persistence","outbox","patches","crdt","hydration","typescript"],"author":{"name":"Denis Listiadi"},"license":"MIT","_id":"@syncraft-labs/core@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":"95be5fd9e83a78fc1ec66a0bf7fa8861a03b9986","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.5.0.tgz","fileCount":8,"integrity":"sha512-Ki+8z2Bb/mn4/4mu1zTW8A5E2KPqNwBA46Wqbv5cOIL23S5LgmZGqcYudSMPhXxZTvvTf8/G+7bqCp0klJJhZg==","signatures":[{"sig":"MEUCIBhV9Ka850/OsEZyPn8+fcfi7koVM48C9bNZPHSvM63NAiEAoMlJBZ9dDzGm7XE4Nc+gUrzX7LcK6VSbW50FzlEYE/g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIC5HPeFBwD+CVS67bVqqLHwwiAjxq9KGFGeeXtf+OO+oAiB/oSvKHEUNFTGP3f2+1egE3CJpeZQAnNcSxyKhfnN5xQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@syncraft-labs%2fcore@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":327199},"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/core"},"_npmVersion":"10.8.2","description":"Local-first state synchronization engine â€” core library.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"idb":"^8.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","fast-check":"^4.9.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.5.0_1788888882165_0.638600366785355","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"_id":"@syncraft-labs/core@0.6.0","bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"dist":{"shasum":"d20a6aad849e19bc59af26e148b8561932904441","tarball":"https://registry.npmjs.org/@syncraft-labs/core/-/core-0.6.0.tgz","fileCount":8,"integrity":"sha512-EgTzAvCI2N/MyRa0kjbec41ZzSNGCXFpmXSVxESv+82Knp+s7YwgIqxV+3PQ5Zv4npQjZ5chI1umzlTu8SgCUA==","signatures":[{"sig":"MEUCIACz4QUqFR4nM/IefWM6/gNrdSuNm09StYcGc7CUn1nzAiEAkCsKL8X369R7oGh/NHSNTYaBlneI8FMmUdwNFYqF1io=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG8I5vy7jNWaDa5jLwWoAzLjo3Vhb+N/8DIbCNVrxb1DAiEAjBqa/EZ28w/casIzTBoxGwu1M76InkpQSBQyf2NO7jk="}],"unpackedSize":390865},"main":"./dist/index.cjs","name":"@syncraft-labs/core","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","sync","local-first","offline","indexeddb","optimistic-ui","state","persistence","outbox","patches","hydration","typescript"],"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/core"},"_npmVersion":"11.17.0","description":"Local-first state synchronization engine — core library.","directories":{},"maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"idb":"^8.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","vitest":"^3.2.0","fast-check":"^4.9.0","typescript":"^5.8.0","@types/node":"^26.0.0","fake-indexeddb":"^6.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.6.0_1789485956540_0.6978001952853379"}}},"time":{"created":"2026-06-29T07:47:50.058Z","modified":"2026-09-15T15:25:56.800Z","0.1.0":"2026-06-29T07:47:50.399Z","0.1.1":"2026-07-10T12:12:47.341Z","0.2.0":"2026-07-13T07:16:28.160Z","0.2.1":"2026-07-20T16:20:39.979Z","0.3.0":"2026-08-01T18:38:06.245Z","0.4.0":"2026-08-20T17:51:03.131Z","0.4.1":"2026-08-22T10:08:08.017Z","0.4.2":"2026-08-22T16:42:12.998Z","0.5.0":"2026-09-08T17:34:42.293Z","0.6.0":"2026-09-15T15:25:56.644Z"},"bugs":{"url":"https://github.com/denislistiadi/syncraft-labs/issues"},"author":{"name":"Denis Listiadi"},"license":"MIT","homepage":"https://syncraft-labs.web.id","keywords":["syncraft-labs","sync","local-first","offline","indexeddb","optimistic-ui","state","persistence","outbox","patches","hydration","typescript"],"repository":{"url":"git+https://github.com/denislistiadi/syncraft-labs.git","type":"git","directory":"packages/core"},"description":"Local-first state synchronization engine — core library.","maintainers":[{"name":"denislistiadi","email":"denislistiadi24@gmail.com"}],"readme":"# <p align=\"center\">@syncraft-labs/core</p>\r\n\r\n**<p align=\"center\">The framework-agnostic engine for local-first state synchronization.</p>**\r\n\r\n<p align=\"center\">\r\n  <a href=\"https://www.npmjs.com/package/@syncraft-labs/core\"><img src=\"https://img.shields.io/npm/v/@syncraft-labs/core?style=flat-square&color=brightgreen\" alt=\"npm version\"></a>\r\n  <a href=\"https://www.npmjs.com/package/@syncraft-labs/core\"><img src=\"https://img.shields.io/npm/dt/@syncraft-labs/core?style=flat-square\" alt=\"total downloads\"></a>\r\n  <a href=\"https://bundlephobia.com/package/@syncraft-labs/core\"><img src=\"https://img.shields.io/bundlephobia/minzip/@syncraft-labs/core?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/core` is the zero-dependency state engine behind Syncraft Labs. It provides a type-safe, framework-agnostic store that combines **in-memory caching** for instant reads, **IndexedDB** for durable persistence, a **custom proxy draft engine** for zero-overhead immutable updates, and an **outbox queue** for eventual background synchronization.\r\n\r\nWhether you're building a web app or a PWA, Syncraft guarantees that your UI is never blocked by network latency while seamlessly synchronizing data when connectivity is restored.\r\n\r\n## Installation\r\n\r\n```bash\r\n# npm\r\nnpm install @syncraft-labs/core\r\n\r\n# yarn\r\nyarn add @syncraft-labs/core\r\n\r\n# pnpm\r\npnpm add @syncraft-labs/core\r\n```\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\nFor production and enterprise setups, check out our [Production Guides](https://syncraft-labs.web.id/docs/guides/production-checklist).\r\n\r\n## Quick Start\r\n\r\n```ts\r\nimport { createSyncStore } from \"@syncraft-labs/core\";\r\n\r\ninterface AppState {\r\n  count: number;\r\n}\r\n\r\n// 1. Create a store for your domain\r\nconst store = createSyncStore<AppState>({\r\n  storageKey: \"my-counter\",\r\n  initialState: { count: 0 },\r\n});\r\n\r\n// 2. Hydrate from IndexedDB\r\nawait store.hydrate();\r\n\r\n// 3. Mutate with proxy drafts — optimistic & durable\r\nawait store.set((draft) => {\r\n  draft.count += 1;\r\n});\r\n\r\n// 4. Subscribe to changes\r\nconst unsubscribe = store.subscribe((newState) => {\r\n  console.log(\"State updated:\", newState.count);\r\n});\r\n\r\n// 5. Clean up when done\r\nunsubscribe();\r\nstore.destroy();\r\n```\r\n\r\n### Storage Modes (\"document\" vs \"collection\")\r\n- **`document`** (default): Stores the entire state as a single blob under the key `\"current\"`. Suited for small-to-medium state.\r\n- **`collection`**: Decomposes state per-entity in IndexedDB. State must be shaped as `Record<string, Entity>`. When updating one entity, only that entity's record is rewritten to IndexedDB rather than the entire state dataset. Requires `idField` in store configuration.\r\n\r\n```ts\r\nconst store = createSyncStore<Record<string, TodoItem>>({\r\n  storageKey: \"todos-collection\",\r\n  storageMode: \"collection\",\r\n  idField: \"id\",\r\n  initialState: {},\r\n});\r\n```\r\n\r\n### Optimistic Updates & Rollback\r\nWhen you call `store.set()`, the memory state updates instantly, ensuring a zero-latency UI. The state is then persisted to IndexedDB asynchronously. If persistence fails (e.g., due to storage quotas), the memory state automatically rolls back to the previous snapshot and subscribers are notified.\r\n\r\n### Cross-Tab Synchronization\r\nStores with the same `storageKey` automatically synchronize state across multiple browser tabs using `BroadcastChannel`. Changes in one tab reflect instantly in another, without hitting the server.\r\n\r\n### State Immutability & Dev-Mode Freezing\r\nTo prevent accidental direct mutations that silently desynchronize memory state from IndexedDB (e.g. `state.count++` instead of `store.set(draft => { draft.count++ })`), Syncraft automatically freezes state via `Object.freeze()` in development mode (`NODE_ENV !== \"production\"`). Direct mutations in dev mode produce an immediate `TypeError`. In production builds, this check is eliminated for zero runtime overhead.\r\n\r\n### Supported State Shapes & Type Detection\r\nSyncraft Labs stores state in plain serializable structures. In development mode, `validateStateShape()` automatically guards your state:\r\n- **Plain Objects & Arrays**: Full deep drafting and patch generation support.\r\n- **Map & Set**: Supported with dedicated proxy handlers. Map operations (`set`, `delete`, `clear`) and Set operations (`add`, `delete`, `clear`) generate granular patches.\r\n- **Primitives**: Numbers, strings, booleans, null, undefined.\r\n- **Dates**: Allowed as immutable leaf values. Must be replaced wholesale (not mutated via `.setFullYear()`, etc.). Emits a dev warning recommending ISO strings or timestamps.\r\n- **Unsupported Types**: Custom class instances, `RegExp`, `Error`, and functions throw an explicit `Error` with the property path.\r\n\r\n### The Outbox Queue\r\nEvery mutation appends an `OutboxEntry` containing patches and inverse patches to IndexedDB. Framework integrations drain this queue using a custom background `pusher` strategy.\r\n\r\n## Migrating from Document to Collection Mode\r\n\r\nIf you are migrating an existing store from `\"document\"` mode to `\"collection\"` mode:\r\n\r\n1. **Re-shape your state**: Ensure your state type is structured as `Record<string, Entity>` rather than an array or nested document.\r\n2. **Set `storageMode` and `idField`**: Pass `storageMode: \"collection\"` and `idField: \"id\"` (or your entity's unique key field) in `SyncStoreConfig`.\r\n3. **Database Migration**: Collection mode uses a dedicated `state_entities` object store. Existing persisted state in `\"document\"` mode will not be auto-migrated. Clear the existing store or re-hydrate from remote source (`fetcher`).\r\n\r\n## API Reference\r\n\r\n| Export | Type | Description |\r\n|--------|------|-------------|\r\n| `createSyncStore<T>(config)` | Function | Factory creating a new `SyncStore` instance (`T extends Record<string, unknown> \\| any[]`) |\r\n| `deepFreeze<T>(obj)` | Function | Recursively freeze an object tree with `Object.freeze()` |\r\n| `assertNoCycles(obj, context?)` | Function | Detect circular references in an object tree with detailed property path |\r\n| `validateStateShape(obj, context?)` | Function | Recursively validate state shape; warns on Date and throws on unsupported types |\r\n| `isUnsupportedType(val)` | Function | Check if a value is an unsupported type for state drafting/persistence |\r\n| `applyPatches<T>(base, patches)` | Function | Pure function applying Immer JSON patches to a state |\r\n| `compactOutbox(entries)` | Function | Merges redundant consecutive patches to the same path |\r\n| `SyncStoreConfig<T>` | Interface | Configuration options (`storageKey`, `initialState?`, `maxOutboxSize?`, `overflowStrategy?`, `onOverflow?`, `storageMode?`, `idField?`) |\r\n| `OutboxOverflowStrategy` | Type | Strategy enum (`\"reject\"`, `\"dropOldest\"`, `\"forceFlush\"`) |\r\n| `OutboxOverflowInfo` | Interface | Event details (`storageKey`, `outboxSize`, `maxOutboxSize`, `strategy`) |\r\n| `SyncStore<T>` | Interface | Store methods (`get`, `getSnapshot`, `set`, `subscribe`, `hydrate`, `getOutbox`, `compactOutbox`, `clearOutbox`, `destroy`) |\r\n| `OutboxEntry<T>` | Interface | Outbox entry (`id`, `timestamp`, `patches`, `inversePatches`) |\r\n| `DraftUpdater<T>` | Type | Function updating draft state: `(draft: T) => void \\| T` |\r\n| `Patch` | Interface | RFC6902 patch (`op`, `path`, `value?`) — Map uses `$entries/<key>`, Set uses `$values/<value>`, keys/values `string\\|number` only |\r\n\r\n## Framework Integrations\r\n\r\nWhile you can use `@syncraft-labs/core` directly in vanilla JavaScript, we provide official bindings for popular frameworks:\r\n\r\n- [**React**](https://syncraft-labs.web.id/docs/packages/react): [`@syncraft-labs/react`](https://www.npmjs.com/package/@syncraft-labs/react) — `useSync` and `useSyncSuspense` hooks built on `useSyncExternalStore`.\r\n- [**Vue 3**](https://syncraft-labs.web.id/docs/packages/vue): [`@syncraft-labs/vue`](https://www.npmjs.com/package/@syncraft-labs/vue) — `useSync` composable built with `shallowRef`.\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"}