{"_id":"@firsttx/local-first","_rev":"37-08b2628db1068320c2f5b31546f79aab","name":"@firsttx/local-first","dist-tags":{"latest":"0.12.0"},"versions":{"0.0.1":{"name":"@firsttx/local-first","version":"0.0.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.0.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"ae10cf6041373448a203dc0eb4ecfd7664a29e8e","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.0.1.tgz","fileCount":5,"integrity":"sha512-shpCCKFQS6ZA5xDU2mk2JBrd0helh7XpSsdOS+WXDsB/yD6aeZ+lntY7QkeOQGJUZyjj7a/V0KO8D8fHjsnBkQ==","signatures":[{"sig":"MEYCIQCukbgkRZpN7HTEN0aPl9kzABod16UmP64IuhkGQ2A7swIhALjXuCjZ29MmlEh+IT/c4akcOP9ye+VKXmMg9Wh1BnD3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25849},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.0.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/private/var/folders/11/31xd6czx4s7c8gjpjrxr477r0000gn/T/bd734678c2d7d5eac10423d078b3fe21/firsttx-local-first-0.0.1.tgz","_integrity":"sha512-shpCCKFQS6ZA5xDU2mk2JBrd0helh7XpSsdOS+WXDsB/yD6aeZ+lntY7QkeOQGJUZyjj7a/V0KO8D8fHjsnBkQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-first model layer for FirstTx: IndexedDB persistence, multi-tab sync, snapshots, and simple merge policies.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","fake-indexeddb":"^6.2.2"},"peerDependencies":{"zod":"^3.23.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.0.1_1759663545291_0.21948749570399495","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@firsttx/local-first","version":"0.1.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.1.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"5ee24d3060df546269746591a509f7ae87518f12","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.1.0.tgz","fileCount":6,"integrity":"sha512-KOLNYztv9c+btm0ej4743TGwxgyxWA1fKz1fqs+NbHDVXElJiECGwXm2HxeGY/ggPhWAMt+/os9DURB5Jrq4Ew==","signatures":[{"sig":"MEUCIGn6pDZ8DNM41VgYCM+J20rNT+C0J3euX6fRYXINZee8AiEA3/qBLP4MWBEy/SMg8X3NUWTXrnDfCPiAIvj6bYfVnqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59067},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/1098b22e34cdcef1334b6739b5479be3/firsttx-local-first-0.1.0.tgz","_integrity":"sha512-KOLNYztv9c+btm0ej4743TGwxgyxWA1fKz1fqs+NbHDVXElJiECGwXm2HxeGY/ggPhWAMt+/os9DURB5Jrq4Ew==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","happy-dom":"^19.0.2","@types/react":"^19.2.0","fake-indexeddb":"^6.2.2","@testing-library/react":"^16.3.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.1.0_1759886004385_0.1161323763365727","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@firsttx/local-first","version":"0.1.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.1.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"6c5cf61008ad00f24feaee383bc1323fc6e7c373","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.1.1.tgz","fileCount":6,"integrity":"sha512-DnSO84gu2ONOd8gTHupcCdZi/a3BEADX9Wp+RBJ7984/7YdCsxMNhlHw69KYgCOjmVvHGrhFFAYDtQIpG1+2Kw==","signatures":[{"sig":"MEQCIAn3yLbAohdbv8hqrlJOQEqux65Edg1ldaPhh7dsaoFSAiAsg1R0IkwEg1C8K9xFHi2k4aLe53QCnFPucZxY8aA+Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58991},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/10a7ac24d9fd34de5dd626bb9531aa66/firsttx-local-first-0.1.1.tgz","_integrity":"sha512-DnSO84gu2ONOd8gTHupcCdZi/a3BEADX9Wp+RBJ7984/7YdCsxMNhlHw69KYgCOjmVvHGrhFFAYDtQIpG1+2Kw==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.1.1_1759996150458_0.7148397062525766","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@firsttx/local-first","version":"0.1.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.1.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"b66d683794de02ae1b8c94f7a59f333e067a5853","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.1.2.tgz","fileCount":6,"integrity":"sha512-8M8+ONs8IeONgXEvbBdqTispktyZgqhGvSzBx0SxNCZ61ctlVR8ufwB+v94TqTkqJTITlxzRoObQb+JkuoSUZA==","signatures":[{"sig":"MEYCIQC3HmQH9PdbmkoRWdBqpzakokeVkkd0/5ISQk9XBQmfvgIhANXKLesz8qbP37P3Wsrwr/lel2AJC+q38s97Qx2hZoWK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58991},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.1.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/ee09a12f6a134b1feb801505e08e8964/firsttx-local-first-0.1.2.tgz","_integrity":"sha512-8M8+ONs8IeONgXEvbBdqTispktyZgqhGvSzBx0SxNCZ61ctlVR8ufwB+v94TqTkqJTITlxzRoObQb+JkuoSUZA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.1.2_1759996662497_0.4528595517050369","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@firsttx/local-first","version":"0.2.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.2.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"09cbc4ef77e5432204c8bde25205e516474a0ee3","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.2.0.tgz","fileCount":6,"integrity":"sha512-ACIMt6Sam9Sjm3merXJXwstI7zGsvD2mt83kFqeLK/24yY5xLD5Q8A4WRuP2uG6HuAUcrcAXtS/N3lUfqsbD5g==","signatures":[{"sig":"MEUCIDECifG1eeUfvEH5LoISi15oPwg0YHeBeS4PnDLCgzCGAiEA9+Be/cybuwyF333XC/e0uqSiTRoHAv85jhuVq8TSwg4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63755},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/cb412e9fe1e5161d62dc05b8f98609dc/firsttx-local-first-0.2.0.tgz","_integrity":"sha512-ACIMt6Sam9Sjm3merXJXwstI7zGsvD2mt83kFqeLK/24yY5xLD5Q8A4WRuP2uG6HuAUcrcAXtS/N3lUfqsbD5g==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.2.0_1760068559114_0.10850695903671781","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@firsttx/local-first","version":"0.2.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.2.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"5a55595a358f6a6c87a83a5d9b70588998567445","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.2.1.tgz","fileCount":6,"integrity":"sha512-JpAnQD5oKRjDmmTj7mSEEpv9Vb9L4MEE9h4QrRCxTGhV3ZX60fU5xqa11Y8uMJYNUQjC0qhauZdPsU1eNtukKA==","signatures":[{"sig":"MEUCICFkxjVa4KQcwOo1rcTAds+CBZkUMhAQQJUkPI9ROf9IAiEAnvTG7lMPHWACYUQYF5xIj5w8CqBRUAoqtez+nF0nFoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66721},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/a3107c0eff40a1f6902cfb9b62798db9/firsttx-local-first-0.2.1.tgz","_integrity":"sha512-JpAnQD5oKRjDmmTj7mSEEpv9Vb9L4MEE9h4QrRCxTGhV3ZX60fU5xqa11Y8uMJYNUQjC0qhauZdPsU1eNtukKA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.2.1_1760093193999_0.3362528867911785","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@firsttx/local-first","version":"0.2.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.2.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"9e42bc3fc9ecf0ff75c9623fff0a5f998d2c1504","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.2.2.tgz","fileCount":6,"integrity":"sha512-byrdUjT1jp77ZEvCCkhVqdCNPJQowMxl0JduSGnMJq28auJ+zubSsEPeOFGATXJBTjrdelcDQmRwZ7CV7tbp3w==","signatures":[{"sig":"MEUCIFEHG53Ywlrpx+jLMWbdmxctdtKBSMO5ZWBwnaGpFIBfAiEApP11vKqygZueC/16fqJXIvcVP388ulnnG4sYC3jzpKM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67464},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.2.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/ca9e18a49aa7e5fc1d0330e513d2d816/firsttx-local-first-0.2.2.tgz","_integrity":"sha512-byrdUjT1jp77ZEvCCkhVqdCNPJQowMxl0JduSGnMJq28auJ+zubSsEPeOFGATXJBTjrdelcDQmRwZ7CV7tbp3w==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.2.2_1760139924163_0.08417152028588482","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@firsttx/local-first","version":"0.3.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.3.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"1c2066f3b19f480a814b4b8488240a6ee3cfde11","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.3.0.tgz","fileCount":6,"integrity":"sha512-TbbUGkGCxQke+0VAtz4UfHUwdE81Whc+A/xW5SdZvkYX+g5rWLROdPWozt5fdu94aFW73s4Ei4RBOKlO49R+bA==","signatures":[{"sig":"MEQCIA91h/pqTHrYSFFOpDnor+S+t1Pk1Pg2Ben58GTe08/7AiBFTeXKoaO95XhXIng5JMOGbLo0ySZnUql8wRWqx82UMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68069},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/fe5d94d933cd44e73ed5de87cfb5ccb5/firsttx-local-first-0.3.0.tgz","_integrity":"sha512-TbbUGkGCxQke+0VAtz4UfHUwdE81Whc+A/xW5SdZvkYX+g5rWLROdPWozt5fdu94aFW73s4Ei4RBOKlO49R+bA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.3.0_1760240517804_0.3134434253571454","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@firsttx/local-first","version":"0.3.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.3.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"fa3113d00331a2bf3a464979d4a22f21b7c4f6d1","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.3.1.tgz","fileCount":6,"integrity":"sha512-SootXYREZRCm6eWOYBQdd70nneR3M9tKxVGewdTdpWyGWnzXwZKAUMjYT1lCADQm82hHCykQ2LOZFglTwbnVZg==","signatures":[{"sig":"MEUCIQC/05/bJbMTMjl50OezIwG0sf5Ec2ZT/ZqinzkkFpIrzQIgGcbIidWELDT865t+fsiv0JR8pWV8UD7qPW1N3pEjPiU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69662},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.3.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/57ab03f190af120eed31c1f7a67d3304/firsttx-local-first-0.3.1.tgz","_integrity":"sha512-SootXYREZRCm6eWOYBQdd70nneR3M9tKxVGewdTdpWyGWnzXwZKAUMjYT1lCADQm82hHCykQ2LOZFglTwbnVZg==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.3.1_1760243497310_0.8588720179777916","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@firsttx/local-first","version":"0.3.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.3.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"823e3cc706bc8a100b6aa6b7f244fe3e9257ac93","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.3.2.tgz","fileCount":6,"integrity":"sha512-8OWcHD6FcPdKl2PGXKhWcxeCyQRiM7RrAk9RYgi2/9HAHvd82Sheggg8HUdJ3johbpN375FvKXYy7ALQhrNmYg==","signatures":[{"sig":"MEUCIFu0ybWazlGT+Yp3T76+C6F2ZRMUfttyd1njq1f39iB9AiEAk5uVX3LzPgZ533jdjPCqQDUUsldL1/3HaGoiu5wInbY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72575},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.3.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/7eff6f06127e12202f64b55beb04b9b3/firsttx-local-first-0.3.2.tgz","_integrity":"sha512-8OWcHD6FcPdKl2PGXKhWcxeCyQRiM7RrAk9RYgi2/9HAHvd82Sheggg8HUdJ3johbpN375FvKXYy7ALQhrNmYg==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.3.2_1760401046067_0.5806646632080066","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@firsttx/local-first","version":"0.3.3","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.3.3","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"5008d1f7c95d2a65fec4209ed08566b9b220d618","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.3.3.tgz","fileCount":6,"integrity":"sha512-ZxL19lVxEGanAkybtXzSWTTmchc0riUdSk6dDQ1sgeHduvBMr9E2XL/YVaSh4zDWRrDlCQe7FmkT3a2AsCzE2Q==","signatures":[{"sig":"MEUCIQCv60byJ4hf6xUO2IY7+6xelKNOOUwqWcQjzmX5jVKNdQIgJnrz0qm3R9HE+8gIWrQNLVZwA1a2Ph/y75kRwCUoq1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76172},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.3.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/8782ee580d18f29074f07511dcc2c602/firsttx-local-first-0.3.3.tgz","_integrity":"sha512-ZxL19lVxEGanAkybtXzSWTTmchc0riUdSk6dDQ1sgeHduvBMr9E2XL/YVaSh4zDWRrDlCQe7FmkT3a2AsCzE2Q==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.3.3_1760497525063_0.991808985408712","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@firsttx/local-first","version":"0.4.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.4.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"33b6fa21540d103e3dab20c5ae21b291946de7e3","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.4.0.tgz","fileCount":6,"integrity":"sha512-gqgd+0AYPoMAfMIBK9ij4YSXqneDBXrlpn2eoJSRvff7YSdWfwHgXtq7IiRt1MfinNFjoMBPpw4Hl64wV/4o2A==","signatures":[{"sig":"MEQCIF1JAYjH3xFetruyzkZs9dF9d30tg6ly97khi1SV1O6QAiAy5PuwvZ06T23SUjuqBAFuqIvOp/fkRekW/0xh6BWl5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84597},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/896c81dfe9e4b22f5841c499e866da4e/firsttx-local-first-0.4.0.tgz","_integrity":"sha512-gqgd+0AYPoMAfMIBK9ij4YSXqneDBXrlpn2eoJSRvff7YSdWfwHgXtq7IiRt1MfinNFjoMBPpw4Hl64wV/4o2A==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.4.0_1760573096752_0.42139954718642225","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@firsttx/local-first","version":"0.4.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.4.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"564f66f06328001f321797f8a762212f5ba889f2","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.4.1.tgz","fileCount":6,"integrity":"sha512-EMTlnbD/7g15rD2qd58w+brpOTX9TOaXf6TbOOdal+gyS5WAA4jmqxj+8Il/L6uTh5xUFh4+MOFSiYNUWVTwMA==","signatures":[{"sig":"MEQCIEGQmJ2ROcFCSThCVofGLbHSx8HuN+MNVGNz22ZseoHLAiAXErrhkA3fM4qrhLgNXHnp2iudNz9hCFNmuB3uF0ms1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81861},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.4.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/0dcb0821c14367bd1330c76befffd8cd/firsttx-local-first-0.4.1.tgz","_integrity":"sha512-EMTlnbD/7g15rD2qd58w+brpOTX9TOaXf6TbOOdal+gyS5WAA4jmqxj+8Il/L6uTh5xUFh4+MOFSiYNUWVTwMA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.3","description":"Local-First bridges IndexedDB (async) and React state (sync) using useSyncExternalStore plus an in-memory cache, so components read state synchronously from the very first render. It tracks freshness (isStale, age) and pairs with Tx for fast optimistic up","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.4.1_1760663252218_0.2598203827739154","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@firsttx/local-first","version":"0.4.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.4.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"9b67f04cf9fec468345cc9ecad23cb83a3b4eef1","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.4.2.tgz","fileCount":6,"integrity":"sha512-m8rWak34hKZlwEgvWkPCi6OQNAHo0uf3zGL2sQwqCCXIgY8nRaE6s86akNjV0qeqVojcsKJBeDfJV52yqfmIpQ==","signatures":[{"sig":"MEMCID8oqkXEQQhZpIkaJWFG6WemvpdMafJf2NwS2pJpnX7kAh8DTWIK/yGHQwwmnIMN6k3AT7+l00kIAbpNKzmZ1fsn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95759},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.4.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.20.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/75e0a098387defd4d6e1b7cc195f496c/firsttx-local-first-0.4.2.tgz","_integrity":"sha512-m8rWak34hKZlwEgvWkPCi6OQNAHo0uf3zGL2sQwqCCXIgY8nRaE6s86akNjV0qeqVojcsKJBeDfJV52yqfmIpQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.4.2_1761379894563_0.2508309846623864","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@firsttx/local-first","version":"0.4.3","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.4.3","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"a74d313160d9c81f087140645bfbeaf1f6e686ac","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.4.3.tgz","fileCount":6,"integrity":"sha512-Ctj2DJNOWUjd399jb+QYGs3OXJKFWH38gqecr0Uu5DZZyB/7eq3484orBzr2RfaAHDVItDtd+0OB4DfXnr7aCQ==","signatures":[{"sig":"MEQCIHSKvGc70xZCFuuj0g4caz5FD/OECoAO9iP7ni3v3JQDAiBHl7oZPeNfwpqSEHrSMgJ92Ln5Z8MQ2zB9GBDcP2/OBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100385},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.4.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/03a9a94af4cba2520c960fa8e0f5dcfd/firsttx-local-first-0.4.3.tgz","_integrity":"sha512-Ctj2DJNOWUjd399jb+QYGs3OXJKFWH38gqecr0Uu5DZZyB/7eq3484orBzr2RfaAHDVItDtd+0OB4DfXnr7aCQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.4.3_1761891217186_0.5344494786709297","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@firsttx/local-first","version":"0.5.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.5.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"534da959f148902fa80acbc75e42673bd3d575a3","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.5.0.tgz","fileCount":6,"integrity":"sha512-mkO6P8g5SCjmwb3v4G1jxsFYhFSVz2v/5Dbl7APYkgsRIsV7SP7YXaqLjxSXwIQ9q65t4+fxjpP4GynCHM+XdQ==","signatures":[{"sig":"MEUCIQCu6SOkTJNuRnm//EFGvcS+w1fNYNWLHIL0hlTOF57G6AIgKviteoFaUKVvpi3jtnULui+PNqN+QuO/beHZYQDCCLY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107029},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/cd0f6dac22ae809ca8232fb5049aeca1/firsttx-local-first-0.5.0.tgz","_integrity":"sha512-mkO6P8g5SCjmwb3v4G1jxsFYhFSVz2v/5Dbl7APYkgsRIsV7SP7YXaqLjxSXwIQ9q65t4+fxjpP4GynCHM+XdQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.5.0_1762128803700_0.4808347217082489","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@firsttx/local-first","version":"0.5.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.5.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"7207348c839612c2133d983b81f08c665b149f27","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.5.1.tgz","fileCount":6,"integrity":"sha512-5IarkXF3AZtpZmJktkPvoHRTOCRpMzPq4UgUIX7+6mwGfKYz4waLBORIirbwdw5SRCGf5I5hMuihnm4NMXuaRQ==","signatures":[{"sig":"MEYCIQC4TqCsPFx5R5BQFWUciTtmEYPpC+KcCSFea406JQAIOQIhAOrwwNx/1AXj0xdJfvv7GKp/GI2zEWOXXovjWIc/EJ/W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107650},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.5.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/f6d27d5b35f581168db8fbef99c3e36a/firsttx-local-first-0.5.1.tgz","_integrity":"sha512-5IarkXF3AZtpZmJktkPvoHRTOCRpMzPq4UgUIX7+6mwGfKYz4waLBORIirbwdw5SRCGf5I5hMuihnm4NMXuaRQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.5.1_1762131010320_0.9199476565533629","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@firsttx/local-first","version":"0.5.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.5.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"535fc1c5fab11272be5940c332d2b2214827c780","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.5.2.tgz","fileCount":6,"integrity":"sha512-6iyp2emENP4F7cXm1BUlh59JVgMmVJlob5cmzkwH7mQgphnIM71CY2r2zvjl5CQhHOKu2qy6icBdjukVih3tKA==","signatures":[{"sig":"MEQCIDDuLacPdjQqBMSTyy1gfJIsAt08570SoM5eEcSK4fmgAiBVdTuEqaMWtOIZyAMnMpl35YI2EQy6jO7u9/o0LT5bww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117395},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.5.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/613d88fab37e7750b16936fb20a69c7d/firsttx-local-first-0.5.2.tgz","_integrity":"sha512-6iyp2emENP4F7cXm1BUlh59JVgMmVJlob5cmzkwH7mQgphnIM71CY2r2zvjl5CQhHOKu2qy6icBdjukVih3tKA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.5.2_1762306340191_0.890964697920275","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@firsttx/local-first","version":"0.5.3","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.5.3","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"06f92de0160958758cd39c87626b4ebbfdb510fb","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.5.3.tgz","fileCount":6,"integrity":"sha512-+riGO3qwSM6r0ha/mPMggdGlq7sOSMNlkV87jXgvlWvpKRHwsz5BzZfIN3aDB3Ex5FYZ17B7SyigMzxG5NsXYg==","signatures":[{"sig":"MEUCIBtXtpqYmxsLn63ly5DVGgvaF8RSl+R8p9VszOhvzGRwAiEAzAqaNZ1crsZrQ+rCrCYvVz5g9pkaHyhz4GvhfSfF3SA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118887},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.5.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/47dddf093e1ad7e25fe60b21e2745831/firsttx-local-first-0.5.3.tgz","_integrity":"sha512-+riGO3qwSM6r0ha/mPMggdGlq7sOSMNlkV87jXgvlWvpKRHwsz5BzZfIN3aDB3Ex5FYZ17B7SyigMzxG5NsXYg==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.5.3_1762323669923_0.0517886495845965","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@firsttx/local-first","version":"0.6.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.6.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"38fe379530491ca4fe878f51ff2549b6a2b9e3c7","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.6.0.tgz","fileCount":6,"integrity":"sha512-/p1tTI4s8G+F6qWAglcpFLtYNtqytE00T2O+EyazP9rvbC4aj1y5w2Tcstdp6eRxcQVD5eGz8I79QXu6pjQyLQ==","signatures":[{"sig":"MEUCIQDZeaSs0YzbApSUJ7aLCkkuMKdiMFUCs0N7O4L3r5qsawIgNFFYWDiErrrHzz6XJ5dHjQm31HExcpcqxcsvn+CwFh0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122501},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/9d374367dbfeb4b2a4a503e16d1fd5de/firsttx-local-first-0.6.0.tgz","_integrity":"sha512-/p1tTI4s8G+F6qWAglcpFLtYNtqytE00T2O+EyazP9rvbC4aj1y5w2Tcstdp6eRxcQVD5eGz8I79QXu6pjQyLQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.6.0_1763008338205_0.2498320977060704","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@firsttx/local-first","version":"0.7.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.7.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"e57178e73b07ef16b5917b0db7237ae3ce23dfab","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.7.0.tgz","fileCount":6,"integrity":"sha512-gIUjLuMu8fl/uI7ndF9ycWBk+c0lkQxV5IzUShfmrx509rYgmLNxSiUu3i8SLlsMsJ7+9bsEj5eYSjaP1hU7gQ==","signatures":[{"sig":"MEYCIQD5QVkHHReQv+S/2MKg7AKAjeiKy1JbuuT8UV+1lB1ogAIhAPvLYAlqGRnBXMYp6cmi3CdxocdscIPaf3yyteowrcbu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":127418},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/d59580f5b6f082cabbbbe325d4eac6a1/firsttx-local-first-0.7.0.tgz","_integrity":"sha512-gIUjLuMu8fl/uI7ndF9ycWBk+c0lkQxV5IzUShfmrx509rYgmLNxSiUu3i8SLlsMsJ7+9bsEj5eYSjaP1hU7gQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.3","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.7.0_1763603917857_0.7544678350681973","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@firsttx/local-first","version":"0.8.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.8.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"f35464f4fefe4e9745e9353915a226921b6bc93f","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.8.0.tgz","fileCount":6,"integrity":"sha512-1JySZm6/kQrHZHwfPbYXyYXJLPd9ijNj+saRIMHfNCse5+SuuE9F2VpKVdFTbp44NJY95U8/exUQx0enyrmc+Q==","signatures":[{"sig":"MEQCIFnUPoDumQNeTP2KrkGzVy1cJurtw2EjZNBiEP9/ir75AiA3j21NfXkjSyZ5VPSZ+W9TLILhjmdK+DkeSobvFlLelw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":128648},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.8.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/085bd4780daa4aa1977503822959ada2/firsttx-local-first-0.8.0.tgz","_integrity":"sha512-1JySZm6/kQrHZHwfPbYXyYXJLPd9ijNj+saRIMHfNCse5+SuuE9F2VpKVdFTbp44NJY95U8/exUQx0enyrmc+Q==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.8.0_1764240585845_0.23141352016379213","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@firsttx/local-first","version":"0.8.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.8.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"1976313d7913020e0ed8ccd1c638fc29269e2626","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.8.1.tgz","fileCount":6,"integrity":"sha512-D1kZQNi6lv8Pq7jJOeV4YywXdgDskUXsdIfrOr2Ga3ESnK7APmgTFwCpyt1A55fGNmH/1yYxUqvIPiQ4txVUiw==","signatures":[{"sig":"MEUCIQClsOIAEzSWCkcK0FbznjpY5bbSX32deNYmAXxqyFmX1wIgfhI7iGtGcLJ3x88vOom/G4i5B7npjHgr9iN9fzYeq10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126811},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.8.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/181bcdbe973db65fc36245ee5202e73d/firsttx-local-first-0.8.1.tgz","_integrity":"sha512-D1kZQNi6lv8Pq7jJOeV4YywXdgDskUXsdIfrOr2Ga3ESnK7APmgTFwCpyt1A55fGNmH/1yYxUqvIPiQ4txVUiw==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.0"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.8.1_1764671898165_0.9150373412613027","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@firsttx/local-first","version":"0.8.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.8.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"91c45ce5d4dfcc0cd1061108ed4cc219603a506f","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.8.2.tgz","fileCount":6,"integrity":"sha512-NDDBVA+dDWMeXonYKiIpnMaMOLw94GZg38xfBjtpcB31J5jO8qCLYf/6elKMy0amIJ/XKImQPOHTnh6JkjWVOw==","signatures":[{"sig":"MEUCIQDwtjiEYmskZ1AUWPSPC69vie+1p3FIoFRkLip4bjpjIQIgAa9IhxrKwX2P2n7pW/W/InLzhl4hys3xouo0aaqRgNE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126811},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.8.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/84ba6f9ffd356eced7d5caaa701a3cba/firsttx-local-first-0.8.2.tgz","_integrity":"sha512-NDDBVA+dDWMeXonYKiIpnMaMOLw94GZg38xfBjtpcB31J5jO8qCLYf/6elKMy0amIJ/XKImQPOHTnh6JkjWVOw==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.8.2_1764839048607_0.2480120887891717","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"name":"@firsttx/local-first","version":"0.8.3","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.8.3","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"2569769baabbe4847cdb10f34925de6d81c08929","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.8.3.tgz","fileCount":6,"integrity":"sha512-PB26et9pcEneuIgRewfzUtZyGGkRw5ZPz5pHIJ3rnrGQCDtOHyr1LqbF1ugL5C2N6RT0FZkbCXHaSZpMSey38Q==","signatures":[{"sig":"MEQCIC8qWOLUHPOxNpcXVFyaD+7cxUoV+A7QdfEHoTW6zS0ZAiAse56elBrPk6zwSq6JzGZ/JvPvYnLioumaB8EJO/zdKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.8.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126821},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.8.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/6d6a3417ff030eeb48f90f629a750833/firsttx-local-first-0.8.3.tgz","_integrity":"sha512-PB26et9pcEneuIgRewfzUtZyGGkRw5ZPz5pHIJ3rnrGQCDtOHyr1LqbF1ugL5C2N6RT0FZkbCXHaSZpMSey38Q==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.8.3_1765270168402_0.6888352949637646","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@firsttx/local-first","version":"0.9.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.9.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"853de738df032650e32eafae79481dc1bf506b88","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.9.0.tgz","fileCount":6,"integrity":"sha512-+N9XsS5Bb26MfcOdM8BNSIMpDW2BURAg8/6zY/J8u58m+ps5RkH9v3YhdtulhY0IP6An79Dh7k7pEX54+tLnyA==","signatures":[{"sig":"MEUCIQD3qKta37tJBOHmWhNoO5ZRMOTUVhPx33z4NLrp4LkGywIgUr9fkkfH8GaOifiiHmZLTo0ZQu71A1rf0JBcFNZu2zA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126413},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.9.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/aa0c4c4a5a61b27ae9bd3bb295165cca/firsttx-local-first-0.9.0.tgz","_integrity":"sha512-+N9XsS5Bb26MfcOdM8BNSIMpDW2BURAg8/6zY/J8u58m+ps5RkH9v3YhdtulhY0IP6An79Dh7k7pEX54+tLnyA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.7.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@firsttx/shared":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.9.0_1765419486677_0.5525033883665729","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@firsttx/local-first","version":"0.9.1","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.9.1","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"f2ee0ae460f0d037a7bf21db22b44d743854257d","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.9.1.tgz","fileCount":6,"integrity":"sha512-Ry1nvW3D6qs/SXX5I7AYcBGchlkCrd1UPxKi5LPXFSssjrLDC9aXlr4JhMxy0JpGmLtMss9YkNvfRslcddqyzg==","signatures":[{"sig":"MEQCIC88W7159JGjoqRExt/BXctndmC5dJCxqvF8xsiVFy4WAiBKOrNkS7xIGGrm95ZKqeseCPMel4RUxh/FUJg0o2vBLA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126413},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.9.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/fe07e0a86576f1ccf642acbede7a077e/firsttx-local-first-0.9.1.tgz","_integrity":"sha512-Ry1nvW3D6qs/SXX5I7AYcBGchlkCrd1UPxKi5LPXFSssjrLDC9aXlr4JhMxy0JpGmLtMss9YkNvfRslcddqyzg==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.7.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@firsttx/shared":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.9.1_1765536135647_0.4792138858899575","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@firsttx/local-first","version":"0.9.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.9.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"93cfacd7b3d1584f546144e14cb6b2256e235ae4","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.9.2.tgz","fileCount":6,"integrity":"sha512-NQj40vgl6YeloaN151/2AnlsqxgPxuCE5w9gvpqVkCSvYzofoYfskuXARq4G9ipV3oQI0gxAb+DOjHc7/zVxqA==","signatures":[{"sig":"MEUCID0spWVHx2hTis1FYPq9wrY+whU5fFl+GWUhQBCOxFvpAiEA/8164csSGg0Nczaq55eK7jbF+mpph4kSGUjDtgGPSaA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126413},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.9.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/00188da21f3f1752983822a8cb999ed5/firsttx-local-first-0.9.2.tgz","_integrity":"sha512-NQj40vgl6YeloaN151/2AnlsqxgPxuCE5w9gvpqVkCSvYzofoYfskuXARq4G9ipV3oQI0gxAb+DOjHc7/zVxqA==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.7.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@firsttx/shared":"0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.9.2_1765536238338_0.12471098408483061","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"@firsttx/local-first","version":"0.9.3","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.9.3","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"12a18276887cb05ed432a5a850bea4ffecc25e0e","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.9.3.tgz","fileCount":6,"integrity":"sha512-MF1N/c3/Ljft0qCcVV3OjK42Azz533Ivz7GB9Ma3wR7wGCIfPFFUBb9Hsa4DqMGpF9+EwxCqtojjEU0aAczjFw==","signatures":[{"sig":"MEUCIEGJXerW4eZcAcJCTXHsLNRxHTOLZUEnHW8OptvajaQkAiEA3Jz0Plas6/caOUUl0Iy+4vjD+gaGzqlgzmf5omh7kkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126413},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.9.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/0089e11a7a886bc9219e1e05813c65bf/firsttx-local-first-0.9.3.tgz","_integrity":"sha512-MF1N/c3/Ljft0qCcVV3OjK42Azz533Ivz7GB9Ma3wR7wGCIfPFFUBb9Hsa4DqMGpF9+EwxCqtojjEU0aAczjFw==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.7.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@firsttx/shared":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.9.3_1765536618437_0.520215026285753","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"@firsttx/local-first","version":"0.9.4","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.9.4","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"1fd0c8ef0c60137f95a92f18c052c7ef7e00e6fa","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.9.4.tgz","fileCount":6,"integrity":"sha512-VihrCRO0vh8bVsvaJPR8VJx2vs9dZ8vLV6yQPbfdd/TU2EE3zegrffdfwGnrSTfsqDplOvUSIRov73ZqG2/18w==","signatures":[{"sig":"MEUCIE2kB2lIOfe/UDX9BfaCDJZjh7wnP7PVUGwyRcqejaAOAiEApjRzGIMYzP6Tr6odSlkPksWA9q8IVKXCWUICu2Ncmjc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.9.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126413},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.9.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/9dcad808a881d7441c73b6c0b92c5f93/firsttx-local-first-0.9.4.tgz","_integrity":"sha512-VihrCRO0vh8bVsvaJPR8VJx2vs9dZ8vLV6yQPbfdd/TU2EE3zegrffdfwGnrSTfsqDplOvUSIRov73ZqG2/18w==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.7.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@firsttx/shared":"0.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.9.4_1765536919759_0.8595974656854246","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@firsttx/local-first","version":"0.10.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.10.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"471ce6762c60d4d8fca8e90c4c3c30f15bd736e8","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.10.0.tgz","fileCount":6,"integrity":"sha512-Mc/ccNjklLad8dJ0d1uQYmegEHJJjQSVRW41QQhHN8Oz2r2jTAchFt4vuOIvm7wLL/2/8k2zOZWWz5nQJC15cQ==","signatures":[{"sig":"MEUCIGflg6+Zg7Lqw0M+MhjWiAMZja7qI9YP8d0V+MsJMzQVAiEAwcqTYQrXfA7YkDU4ooXMp28gdapNWdHC1WUkoL3xqyo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":126414},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.10.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ce12b9fb-0eb0-4c45-8583-ce82e9ce4a45"}},"_resolved":"/tmp/75df4f20ff642d8eee6a9c4fad1a67bc/firsttx-local-first-0.10.0.tgz","_integrity":"sha512-Mc/ccNjklLad8dJ0d1uQYmegEHJJjQSVRW41QQhHN8Oz2r2jTAchFt4vuOIvm7wLL/2/8k2zOZWWz5nQJC15cQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.7.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@firsttx/shared":"0.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.10.0_1765537212324_0.46055433818683666","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@firsttx/local-first","version":"0.11.0","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.11.0","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"c2a7d2ed22a2fcf9ac1ce30c203a04bca9feb298","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.11.0.tgz","fileCount":6,"integrity":"sha512-IsC/VDoU/OPq8S7Aeg9t6aZn2UZtr5j3dQJh72tQD7Z/XIdl3JC4G3zjinblW4VZEq3tr5/NNzwsMn/l3aIOwQ==","signatures":[{"sig":"MEUCIHaU5B9fOkg8jIxbliHGsmMZSDJ7hByXAQ48JS8oIGYJAiEA6UBQyERItiKe1pwo8z5fn8ODFP66DZ0F/LXMmx63mlw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128915},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.11.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joseph0926","email":"rkekqmf0926@gmail.com"},"_resolved":"/tmp/e09513bd7d82a8cb956df8099ce24c04/firsttx-local-first-0.11.0.tgz","_integrity":"sha512-IsC/VDoU/OPq8S7Aeg9t6aZn2UZtr5j3dQJh72tQD7Z/XIdl3JC4G3zjinblW4VZEq3tr5/NNzwsMn/l3aIOwQ==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"10.9.4","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"@firsttx/shared":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","vitest":"^3.2.4","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.11.0_1765965620553_0.3615292419296885","host":"s3://npm-registry-packages-npm-production"}},"0.11.2":{"name":"@firsttx/local-first","version":"0.11.2","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.11.2","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"7f4f51a2e433405198b8118065afdbea5232dfd7","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.11.2.tgz","fileCount":6,"integrity":"sha512-81LUom4xT3nXaEzBvFzKcLXMLZt7MnEjh1Ytji9Dzpe302okzroLg/nOS1yWBIlMBnvTN8DvyKUFTsBcAZ6uMg==","signatures":[{"sig":"MEQCIAN60j/XUGdCXUAycbXtd2lS3+biv3btkwMD+OikOiDwAiBHmjF9mRAUiZvsHnJjsItbfYf8pX7xbVB5m7WiKTpfXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.11.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":130204},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.11.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b8fdd5bb-a1ef-4976-b9a5-8b7b4d940b81"}},"_resolved":"/tmp/d907d1d350e992d371e5e0f98db03b1b/firsttx-local-first-0.11.2.tgz","_integrity":"sha512-81LUom4xT3nXaEzBvFzKcLXMLZt7MnEjh1Ytji9Dzpe302okzroLg/nOS1yWBIlMBnvTN8DvyKUFTsBcAZ6uMg==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.2","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@firsttx/shared":"0.3.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.0","rimraf":"^6.0.1","@types/react":"^19.2.7"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.11.2_1769899755275_0.8688880770042489","host":"s3://npm-registry-packages-npm-production"}},"0.11.3":{"name":"@firsttx/local-first","version":"0.11.3","keywords":["local-first","offline-first","indexeddb","snapshot","persistence"],"author":{"name":"joseph0926"},"license":"MIT","_id":"@firsttx/local-first@0.11.3","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"2468fa03e6c3c798014e72221064472828268625","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.11.3.tgz","fileCount":6,"integrity":"sha512-bQKJiumpm3gD76+47USmWfYH8dJFfp8jt5KBKNfvNV5VTrp74xlPQYEl1JvbD4IxaEcanF2bUuIgAKBMyyzokw==","signatures":[{"sig":"MEYCIQDBn1ou08LYSL2acfV5xCdeGZYl/2IaYN4SIRuKMpGfhwIhAJdMRdfhyQvG05BL/f4l5ZoTRikmrLfjC56mftD9ms8Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.11.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":131884},"main":"./dist/index.js","type":"module","_from":"file:firsttx-local-first-0.11.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b8fdd5bb-a1ef-4976-b9a5-8b7b4d940b81"}},"_resolved":"/tmp/bb471800db5cd2ce0f2c72e28a764ff0/firsttx-local-first-0.11.3.tgz","_integrity":"sha512-bQKJiumpm3gD76+47USmWfYH8dJFfp8jt5KBKNfvNV5VTrp74xlPQYEl1JvbD4IxaEcanF2bUuIgAKBMyyzokw==","repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"_npmVersion":"11.6.2","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@firsttx/shared":"0.3.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.1","rimraf":"^6.0.1","vitest":"^4.0.18","@types/react":"^19.2.10","@vitest/coverage-v8":"^4.0.18"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.11.3_1770419088705_0.5051165405933125","host":"s3://npm-registry-packages-npm-production"}},"0.11.4":{"name":"@firsttx/local-first","version":"0.11.4","keywords":["local-first","persistent-cache","indexeddb","snapshot","persistence"],"author":"joseph0926","license":"MIT","_id":"@firsttx/local-first@0.11.4","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"3d7f3fea02d612889021ce4d00e5fe5d2a6ccd78","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.11.4.tgz","fileCount":6,"integrity":"sha512-xVSBp2af+N3wKyqFTQPs0C4ceeHAOvXdjs2r0Iw5tX0ChMajoH2YDMb/CzYUG3Q4OiPqAhK+FjoquFyjNHrwlA==","signatures":[{"sig":"MEYCIQCRpD7Ue4dSAfhtxfGr+DrQDgm91D6Sb6IyAsibBtqCcgIhAPjTs6xVy/NaWsywypw6pvqnm78Q39rprB5E9wu8WAsD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.11.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":132503},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","lint:fix":"eslint . --fix","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b8fdd5bb-a1ef-4976-b9a5-8b7b4d940b81"}},"repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@firsttx/shared":"0.3.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.1","rimraf":"^6.0.1","vitest":"^4.0.18","@types/react":"^19.2.10","@vitest/coverage-v8":"^4.0.18"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.11.4_1784331112990_0.8123173695935884","host":"s3://npm-registry-packages-npm-production"}},"0.11.5":{"name":"@firsttx/local-first","version":"0.11.5","keywords":["local-first","persistent-cache","indexeddb","snapshot","persistence"],"author":"joseph0926","license":"MIT","_id":"@firsttx/local-first@0.11.5","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"dist":{"shasum":"96928f63b1166166adfa7bc265cf7e841dff3bf5","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.11.5.tgz","fileCount":6,"integrity":"sha512-XPyGu4ri+XXVrfC/KhdTykXOTRXwU7A/m6IoWVPMgclqKLwGJIsvWfc7Om+aFCd5e9uv8dP2DydirNCynBka4Q==","signatures":[{"sig":"MEQCIHYcixa3fjAKpisNY+HhbKDcp31sSDmm9I10G85gWrW9AiAkzEHkztrK8yfCylGED9Skuo4IncTNMdygAcEYaxMMWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.11.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":132783},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest","build":"tsup","clean":"rimraf dist","test:ui":"vitest --ui","lint:fix":"eslint . --fix","test:run":"vitest run","typecheck":"tsc -p tsconfig.json --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b8fdd5bb-a1ef-4976-b9a5-8b7b4d940b81"}},"repository":{"url":"git+https://github.com/joseph0926/firsttx.git","type":"git","directory":"packages/local-first"},"description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@firsttx/shared":"0.3.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","tsup":"^8.5.1","rimraf":"^6.0.1","vitest":"^4.0.18","@types/react":"^19.2.10","@vitest/coverage-v8":"^4.0.18"},"peerDependencies":{"zod":"^3.23.0 || ^4.0.0","react":"^18.2.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/local-first_0.11.5_1786185079242_0.025946708594742685","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@firsttx/local-first","version":"0.12.0","description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","license":"MIT","author":"joseph0926","type":"module","engines":{"node":">=24"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"sideEffects":false,"keywords":["local-first","persistent-cache","indexeddb","snapshot","persistence"],"dependencies":{"@firsttx/shared":"0.3.2"},"peerDependencies":{"react":"^18.2.0 || ^19.0.0","zod":"^3.23.0 || ^4.0.0"},"devDependencies":{"@types/react":"^19.2.10","@vitest/coverage-v8":"^4.0.18","rimraf":"^6.0.1","tsup":"^8.5.1","vitest":"^4.0.18","zod":"^3.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"repository":{"type":"git","url":"git+https://github.com/joseph0926/firsttx.git","directory":"packages/local-first"},"bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rimraf dist","lint":"eslint .","lint:fix":"eslint . --fix","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest","test:ui":"vitest --ui","test:run":"vitest run","test:coverage":"vitest run --coverage"},"_nodeVersion":"24.18.0","_id":"@firsttx/local-first@0.12.0","dist":{"integrity":"sha512-t+KNuKNgyt6HhLwg/pXBnouniEPMbFi8xtmZ3zYiu1n6MC4i9QduimrcXheG+iV99tUmL1vFKNsSzHLt16Zj4w==","shasum":"3297e8e4670eb21b1b3f702af3d1a36a641dc071","tarball":"https://registry.npmjs.org/@firsttx/local-first/-/local-first-0.12.0.tgz","fileCount":6,"unpackedSize":141070,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@firsttx%2flocal-first@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCREhknTgfQPyArW18rbszcx9asBSkvlit/c4f/lWa+yQIgMt4YHi4Esunho320JQ1i6wEzEyNUwyCo+NRg1lmUJ0o="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b8fdd5bb-a1ef-4976-b9a5-8b7b4d940b81"}},"directories":{},"maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/local-first_0.12.0_1786227551554_0.0976320140752589"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-05T11:25:45.063Z","modified":"2026-08-08T22:19:12.032Z","0.0.1":"2025-10-05T11:25:45.476Z","0.1.0":"2025-10-08T01:13:24.574Z","0.1.1":"2025-10-09T07:49:10.631Z","0.1.2":"2025-10-09T07:57:42.663Z","0.2.0":"2025-10-10T03:55:59.300Z","0.2.1":"2025-10-10T10:46:34.183Z","0.2.2":"2025-10-10T23:45:24.396Z","0.3.0":"2025-10-12T03:41:57.992Z","0.3.1":"2025-10-12T04:31:37.530Z","0.3.2":"2025-10-14T00:17:26.291Z","0.3.3":"2025-10-15T03:05:25.265Z","0.4.0":"2025-10-16T00:04:56.974Z","0.4.1":"2025-10-17T01:07:32.447Z","0.4.2":"2025-10-25T08:11:34.783Z","0.4.3":"2025-10-31T06:13:37.383Z","0.5.0":"2025-11-03T00:13:23.921Z","0.5.1":"2025-11-03T00:50:10.513Z","0.5.2":"2025-11-05T01:32:20.418Z","0.5.3":"2025-11-05T06:21:10.142Z","0.6.0":"2025-11-13T04:32:18.386Z","0.7.0":"2025-11-20T01:58:38.065Z","0.8.0":"2025-11-27T10:49:46.031Z","0.8.1":"2025-12-02T10:38:18.349Z","0.8.2":"2025-12-04T09:04:08.776Z","0.8.3":"2025-12-09T08:49:28.551Z","0.9.0":"2025-12-11T02:18:06.807Z","0.9.1":"2025-12-12T10:42:15.777Z","0.9.2":"2025-12-12T10:43:58.462Z","0.9.3":"2025-12-12T10:50:18.568Z","0.9.4":"2025-12-12T10:55:19.911Z","0.10.0":"2025-12-12T11:00:12.492Z","0.11.0":"2025-12-17T10:00:20.689Z","0.11.2":"2026-01-31T22:49:15.418Z","0.11.3":"2026-02-06T23:04:48.859Z","0.11.4":"2026-07-17T23:31:53.124Z","0.11.5":"2026-08-08T10:31:19.398Z","0.12.0":"2026-08-08T22:19:11.702Z"},"bugs":{"url":"https://github.com/joseph0926/firsttx/issues"},"author":"joseph0926","license":"MIT","homepage":"https://github.com/joseph0926/firsttx/tree/main/packages/local-first#readme","keywords":["local-first","persistent-cache","indexeddb","snapshot","persistence"],"repository":{"type":"git","url":"git+https://github.com/joseph0926/firsttx.git","directory":"packages/local-first"},"description":"React + IndexedDB data layer that exposes synchronous snapshots, staleness metadata, and server sync hooks while pairing with Tx for optimistic durability.","maintainers":[{"name":"joseph0926","email":"rkekqmf0926@gmail.com"}],"readme":"# @firsttx/local-first\n\n**Bridge IndexedDB (async) and React state (sync) seamlessly.**\n\nType-safe IndexedDB models with React integration via `useSyncExternalStore`, staleness metadata, server revalidation hooks, and cross-tab invalidation.\n\n## Why Local-First?\n\n**A persistent client cache with synchronous React snapshots and BroadcastChannel updates.**\n\n- **Sync API**: `getCachedSnapshot()` returns instantly (no async/await in render)\n- **Multi-tab updates**: BroadcastChannel notifies other tabs to reload the stored snapshot\n- **TTL metadata**: Automatic staleness detection with `history.isStale`\n- **Zod validation**: Type-safe schema with runtime validation\n- **Concise model definition**: Schema, TTL, version, and initial data live together\n\n<img src=\"https://res.cloudinary.com/dx25hswix/image/upload/v1760400559/firsttx-local-01_zwhtge.gif\" />\n\n```bash\nnpm install @firsttx/local-first zod\n```\n\n[![npm version](https://img.shields.io/npm/v/@firsttx/local-first.svg)](https://www.npmjs.com/package/@firsttx/local-first)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/joseph0926/firsttx/blob/main/LICENSE)\n\n> Module format: ESM-only. CommonJS users should use `import()` (dynamic import).\n\n---\n\n## Basic Usage\n\n### 1. Define a Model\n\n```ts\nimport { defineModel } from '@firsttx/local-first';\nimport { z } from 'zod';\n\nexport const CartModel = defineModel('cart', {\n  schema: z.object({\n    items: z.array(\n      z.object({\n        id: z.string(),\n        name: z.string(),\n        price: z.number(),\n        qty: z.number(),\n      }),\n    ),\n    total: z.number(),\n  }),\n  ttl: 5 * 60 * 1000, // optional - defaults to 5 minutes\n  initialData: { items: [], total: 0 },\n});\n```\n\n### 2. Use in React (Local-Only)\n\n```tsx\nimport { useModel } from '@firsttx/local-first';\n\nfunction CartPage() {\n  const { data: cart, patch, history, status } = useModel(CartModel);\n\n  if (status === 'loading') return <Skeleton />;\n  if (status === 'error') return <ErrorMessage />;\n  if (!cart) return <EmptyCart />;\n\n  return (\n    <div>\n      {history.isStale && <Badge>Stale ({Math.floor(history.age / 1000)}s old)</Badge>}\n      <h1>Cart ({cart.items.length} items)</h1>\n      <button\n        onClick={() =>\n          patch((draft) => {\n            draft.items.push({ id: '1', name: 'Product', price: 100, qty: 1 });\n            draft.total += 100;\n          })\n        }\n      >\n        Add Item\n      </button>\n    </div>\n  );\n}\n```\n\n### 3. Sync with Server (Auto)\n\n```tsx\nimport { useSyncedModel } from '@firsttx/local-first';\n\nfunction CartPage() {\n  const {\n    data: cart,\n    patch,\n    sync,\n    isSyncing,\n    error,\n  } = useSyncedModel(\n    CartModel,\n    async () => {\n      const res = await fetch('/api/cart');\n      return res.json();\n    },\n    {\n      syncOnMount: 'stale', // auto-sync when stale (default)\n      onSuccess: () => toast.success('Synced'),\n      onError: (err) => toast.error(err.message),\n    },\n  );\n\n  if (!cart) return <Skeleton />;\n\n  return (\n    <div>\n      {isSyncing && <Spinner />}\n      <button onClick={() => sync()}>Refresh</button>\n      {/* ... */}\n    </div>\n  );\n}\n```\n\n---\n\n## API Reference\n\n### `defineModel(key, options)`\n\nDefines a type-safe IndexedDB model with automatic React integration.\n\n```ts\nconst Model = defineModel('cart', {\n  schema: z.object({ items: z.array(...) }),\n  ttl: 5 * 60 * 1000,\n  version: 1,\n  initialData: { items: [] },\n  merge: (current, incoming) => ({ ...current, ...incoming }),\n});\n```\n\n**Parameters**\n\n- `key: string` - Unique IndexedDB key for this model\n- `options.schema: ZodSchema` - Zod schema for validation\n- `options.ttl?: number` - Time-to-live in milliseconds (default: `5 * 60 * 1000` = 5 minutes)\n  - Set to `Infinity` for data that never expires\n  - Set to `0` for always-stale behavior\n- `options.version?: number` - Schema version. When changed, existing data is deleted\n- `options.initialData?: T` - Default value when no data exists. Required for `patch()`\n- `options.merge?: (current: T, incoming: T) => T` - Merge current data with incoming server replacement data\n\n**Returns** `Model<T>`\n\n**Model Properties**\n\n- `name: string` - Model key\n- `schema: ZodSchema` - Validation schema\n- `ttl: number` - Effective TTL value\n- `merge: (current, incoming) => T` - Server replacement merge function\n\n**Model Methods**\n\n- `getSnapshot(): Promise<T | null>` - Load data from IndexedDB\n- `getHistory(): Promise<ModelHistory>` - Get metadata (age, staleness)\n- `replace(data: T): Promise<void>` - Replace entire data (including `null`)\n- `patch(mutator: (draft: T) => void): Promise<void>` - Update existing data via Immer-style draft mutation\n- `subscribe(callback: () => void): () => void` - Listen to changes\n- `getCachedSnapshot(): T | null` - Synchronous cached read\n- `getCachedHistory(): ModelHistory` - Synchronous cached metadata\n- `getCachedError(): FirstTxError | null` - Get last error\n\n**When to use `patch()` vs `replace()`**\n\nUse `patch()` when you have existing data and want to modify specific fields:\n\n```ts\nawait Model.patch((draft) => {\n  draft.items.push(newItem); // Mutate draft in place\n  draft.total += 100; // No return statement\n});\n```\n\nUse `replace()` when you want to completely replace data (including setting/clearing `null`):\n\n```ts\n// Set initial data\nawait Model.replace({ items: [], total: 0 });\n\n// Clear data\nawait Model.replace(null);\n```\n\n⚠️ **Important:** `patch()` requires existing data. If data is `null` and you haven't provided `initialData`, `patch()` will throw an error. Use `replace()` instead.\n\n---\n\n### `useModel(model)`\n\nReact hook for local-only model usage (no server sync).\n\n```tsx\nconst { data, status, patch, history, error } = useModel(CartModel);\n```\n\n**Parameters**\n\n- `model: Model<T>` - Model created with `defineModel`\n\n**Returns** `{ data, status, patch, history, error }`\n\n- `data: T | null` - Current data (null while loading or empty)\n- `status: 'loading' | 'success' | 'error'` - Current loading status\n- `patch: (mutator: (draft: T) => void) => Promise<void>` - Update function (Immer-style)\n  ```ts\n  await patch((draft) => {\n    draft.items.push(newItem);\n  });\n  ```\n- `history: ModelHistory` - Metadata\n  - `updatedAt: number` - Unix timestamp of last update\n  - `age: number` - Time elapsed since last update (ms)\n  - `isStale: boolean` - Whether `age > ttl`\n  - `isConflicted: boolean` - Reserved conflict flag; currently always `false`\n- `error: FirstTxError | null` - Validation or storage error\n\n**Example**\n\n```tsx\nconst { data: cart, status, patch, history } = useModel(CartModel);\n\nif (status === 'loading') return <Skeleton />;\nif (status === 'error') return <ErrorMessage />;\nif (!cart) return <EmptyCart />;\n\nreturn (\n  <div>\n    {history.isStale && <Badge>Data is {Math.floor(history.age / 1000)}s old</Badge>}\n    <button onClick={() => patch((draft) => draft.items.push(item))}>Add Item</button>\n  </div>\n);\n```\n\n---\n\n### `useSyncedModel(model, fetcher, options?)`\n\nReact hook for model with automatic server synchronization.\n\n```tsx\nconst { data, status, patch, sync, isSyncing, error, history } = useSyncedModel(\n  CartModel,\n  fetchCart,\n  {\n    syncOnMount: 'stale',\n    onSuccess: (data) => console.log('Synced', data),\n    onError: (err) => console.error(err),\n  },\n);\n```\n\n---\n\n### `useSuspenseSyncedModel(model, fetcher)`\n\n**React 18.2+ supported.** Suspense-enabled hook for declarative data fetching with automatic IndexedDB cache.\n\n```tsx\nimport { useSuspenseSyncedModel } from '@firsttx/local-first';\n\nfunction ContactsList() {\n  const contacts = useSuspenseSyncedModel(ContactsModel, fetchContacts);\n\n  return (\n    <div>\n      {contacts.map((c) => (\n        <ContactCard key={c.id} {...c} />\n      ))}\n    </div>\n  );\n}\n\nfunction App() {\n  return (\n    <ErrorBoundary fallback={<ErrorAlert />}>\n      <Suspense fallback={<Skeleton />}>\n        <ContactsList />\n      </Suspense>\n    </ErrorBoundary>\n  );\n}\n```\n\n**Parameters**\n\n- `model: Model<T>` - Model created with `defineModel`\n- `fetcher: (current: T | null) => Promise<T>` - Async data fetcher\n\n**Returns** `T`\n\n- Direct data (never `null`)\n- Throws Promise for Suspense on initial load\n- Throws Error for Error Boundary on fetch failure\n\n**Cache-First Behavior**\n\n`useSuspenseSyncedModel` implements a stale-while-revalidate pattern:\n\n1. **First visit**: No cache → fetch from network → show Suspense fallback\n2. **Revisit (fresh cache)**: Return cached data instantly → no network request\n3. **Revisit (stale cache)**: Return cached data instantly → revalidate in background\n\nThis can restore cached data during rendering and reduce the time spent in a loading fallback on revisit.\n\n**Key Differences from `useSyncedModel`**\n\n| Feature        | `useSyncedModel`           | `useSuspenseSyncedModel`  |\n| -------------- | -------------------------- | ------------------------- |\n| Return type    | `{ data: T \\| null, ... }` | `T` (never null)          |\n| Loading state  | Manual `if (isSyncing)`    | Automatic Suspense        |\n| Error handling | Manual `if (error)`        | Automatic Error Boundary  |\n| Type safety    | Nullable data              | Non-nullable data         |\n| React version  | 18.2+                      | 18.2+                     |\n| Use case       | Full control, mutations    | Simple read-only fetching |\n\n**Requirements**\n\n- React 18.2+\n- Must be wrapped in `<Suspense>` boundary\n- Recommended: wrap in `<ErrorBoundary>`\n\n**Performance Benefits**\n\nCompared to traditional fetch-on-render approaches:\n\n- **50% faster on revisits**: Single IndexedDB read (data + history combined)\n- **Zero network requests**: Fresh cached data skips fetcher entirely\n- **Background updates**: Stale data updates silently without blocking UI\n\n**Limitations**\n\n- Read-only (use `useSyncedModel` for `patch()` or mutations)\n- Not suitable for SSR (client-side only)\n- Background revalidation has no UI feedback (use `useSyncedModel` if you need `isSyncing` state)\n\n**Example: Dashboard with Multiple Models**\n\n```tsx\nfunction Dashboard() {\n  return (\n    <ErrorBoundary fallback={<ErrorAlert />}>\n      <Suspense fallback={<DashboardSkeleton />}>\n        <StatsCards />\n        <RecentActivity />\n      </Suspense>\n    </ErrorBoundary>\n  );\n}\n\nfunction StatsCards() {\n  const stats = useSuspenseSyncedModel(StatsModel, fetchStats);\n  const contacts = useSuspenseSyncedModel(ContactsModel, fetchContacts);\n\n  return (\n    <div>\n      <Card>Total: {stats.total}</Card>\n      <Card>Contacts: {contacts.length}</Card>\n    </div>\n  );\n}\n```\n\n**When to use Suspense?**\n\n✅ Use `useSuspenseSyncedModel` when:\n\n- Simple read-only data display\n- Want declarative loading/error states\n- Prefer less boilerplate\n\n❌ Use `useSyncedModel` when:\n\n- Need mutations (`patch()`, manual `sync()`)\n- Want granular control over loading UI\n- Building SSR apps\n\n---\n\n### `useSyncedModel(model, fetcher, options?)` (continued)\n\n**Parameters**\n\n- `model: Model<T>` - Model created with `defineModel`\n- `fetcher: (current: T | null) => Promise<T>` - Function to fetch server data\n  - Receives current local data for delta sync support\n  - Should return full data to replace local state\n- `options?: SyncOptions`\n  - `syncOnMount?: 'always' | 'stale' | 'never'` (default: `'stale'`)\n    - `'always'`: Always sync on component mount\n    - `'stale'`: Only sync when `history.isStale === true`\n    - `'never'`: Never auto-sync, only manual `sync()` calls\n  - `onSuccess?: (data: T) => void` - Called after successful sync\n  - `onError?: (error: Error) => void` - Called on sync failure\n\n**Returns** `SyncedModelResult<T>`\n\n- `data: T | null` - Current data\n- `patch: (mutator: (draft: T) => void) => Promise<void>` - Update existing data via draft mutation\n- `replace: (data: T) => Promise<void>` - Replace entire data\n- `sync: () => Promise<void>` - Manual sync trigger\n  - Safe to call multiple times (automatically deduplicated)\n  - Uses ViewTransition for smooth updates (if available)\n- `isSyncing: boolean` - Whether sync is in progress\n- `error: Error | null` - Sync error (not validation errors)\n- `history: ModelHistory` - Metadata (same as `useModel`)\n\n**Example**\n\n```tsx\nconst {\n  data: cart,\n  sync,\n  isSyncing,\n} = useSyncedModel(\n  CartModel,\n  async (current) => {\n    // Delta sync example\n    const since = current ? new Date(current.lastSync) : null;\n    const res = await fetch(`/api/cart?since=${since}`);\n    return res.json();\n  },\n  { syncOnMount: 'stale' },\n);\n\nreturn (\n  <div>\n    <button onClick={() => sync()} disabled={isSyncing}>\n      {isSyncing ? 'Syncing...' : 'Refresh'}\n    </button>\n    {/* ... */}\n  </div>\n);\n```\n\n**Sync Behavior**\n\n```\nMount → Load IndexedDB → Check isStale\n  ↓\nif syncOnMount === 'always' → sync()\nif syncOnMount === 'stale' && isStale → sync()\nif syncOnMount === 'never' → do nothing\n```\n\n---\n\n## Features\n\n### Cross-Tab Synchronization\n\nAutomatically syncs changes across all open tabs using BroadcastChannel API.\n\n```ts\n// Tab 1\nawait CartModel.patch((draft) => draft.items.push(item));\n\n// Tab 2 receives a BroadcastChannel notification\n// React reloads the latest stored snapshot\n```\n\n**How it works**\n\n- Every `patch()` or `replace()` broadcasts to other tabs\n- Tabs auto-reload from IndexedDB on receiving broadcast\n- Concurrent writes are not conflict-detected; the latest completed IndexedDB write wins\n- Zero network overhead (browser-internal communication)\n- Without BroadcastChannel, cross-tab propagation is skipped\n\n**Server Replacement Merge**\n\n```ts\nconst Model = defineModel('cart', {\n  schema: CartSchema,\n  merge: (current, incoming) => {\n    // Custom merge logic\n    return {\n      items: [...current.items, ...incoming.items].filter(uniqueById),\n      total: recalculate(merged.items),\n    };\n  },\n});\n```\n\n`merge()` is applied when incoming server data replaces the current record. It does not detect or resolve concurrent cross-tab writes, and `isConflicted` currently remains `false`.\n\n---\n\n### TTL-Based Staleness\n\nData automatically expires based on TTL, triggering smart refetches.\n\n```tsx\nconst Model = defineModel('prices', {\n  schema: PriceSchema,\n  ttl: 30 * 1000, // 30 seconds\n});\n\nconst { data, history } = useSyncedModel(Model, fetchPrices, {\n  syncOnMount: 'stale', // refetch when age > 30s\n});\n\n// Visual feedback\n{\n  history.isStale && <Badge variant=\"warning\">Prices may be outdated</Badge>;\n}\n```\n\n**TTL Use Cases**\n\n- `30s - 5min`: Real-time data (stock prices, live scores)\n- `5min - 1hr`: Frequently updated (product inventory, user notifications)\n- `1hr - 24hr`: Slow-changing (user profile, settings)\n- `Infinity`: Static content (translations, constants)\n\n---\n\n### Schema Validation\n\nZod schema protects against corrupted IndexedDB data.\n\n```ts\nconst Model = defineModel('cart', {\n  schema: z.object({\n    items: z.array(ItemSchema),\n    total: z.number().nonnegative(),\n  }),\n});\n\n// Invalid data is rejected\nawait Model.replace({ items: [], total: -100 }); // ❌ ValidationError\n```\n\n**Error Handling**\n\n```tsx\nconst [data, patch, history, error] = useModel(Model);\n\nif (error) {\n  return <ErrorBanner error={error} onReset={() => Model.replace(initialData)} />;\n}\n```\n\n---\n\n## Advanced\n\n### Schema Migrations\n\n```ts\nconst UserModel = defineModel('user', {\n  schema: z.object({\n    id: z.string(),\n    name: z.string(),\n    email: z.string(), // added in v2\n  }),\n  version: 2,\n  initialData: { id: '', name: '', email: '' },\n});\n\n// On version mismatch:\n// 1. Old data is deleted\n// 2. initialData is written\n// 3. Next sync fetches fresh data\n```\n\n---\n\n## Error Types\n\n```ts\nimport { FirstTxError, StorageError, ValidationError } from '@firsttx/local-first';\n\ntry {\n  await Model.replace(data);\n} catch (error) {\n  if (error instanceof ValidationError) {\n    console.error('Schema validation failed:', error.zodError);\n  } else if (error instanceof StorageError) {\n    console.error('IndexedDB error:', error.code, error.context);\n  }\n}\n```\n\n---\n\n## Related Packages\n\n- [`@firsttx/tx`](https://www.npmjs.com/package/@firsttx/tx) - Optimistic sagas with compensating rollback\n- [`@firsttx/prepaint`](https://www.npmjs.com/package/@firsttx/prepaint) - Boot-time visual snapshot replay\n\n---\n\n## License\n\nMIT © [joseph0926](https://github.com/joseph0926)\n","readmeFilename":""}