{"_id":"react-fate","_rev":"32-70825f8eb673487d35fe7722f3625e84","name":"react-fate","dist-tags":{"latest":"1.7.0"},"versions":{"0.0.0":{"name":"react-fate","version":"0.0.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"dist":{"shasum":"6fcafb9124b6b64a62ca4a9e03abfb1c6604c567","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.0.tgz","fileCount":2,"integrity":"sha512-QrKwna9Y0tHiscRor/RN5cLVRzLxIkDu6QcA6p+khXeaCYfFHLLvGBTDsLlPiYRVXkHx4ZmLObeUnUJmFutFgw==","signatures":[{"sig":"MEUCIE92pxHO4w3hE+jOAMTnuvUfS7aFbEVOmMuHRbjjz3myAiEA36bJ1g9J0kMPeWGV6coFkJWKLPP49SajQTALB4BYAlE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1579},"main":"./lib/index.js","type":"module","_from":"file:react-fate-0.0.0.tgz","types":"./lib/index.d.ts","scripts":{"build":"tsdown -d lib --target=node24"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/53530662f41c820018ccc11da4c35f91/react-fate-0.0.0.tgz","_integrity":"sha512-QrKwna9Y0tHiscRor/RN5cLVRzLxIkDu6QcA6p+khXeaCYfFHLLvGBTDsLlPiYRVXkHx4ZmLObeUnUJmFutFgw==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.0","description":"Fate","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.0_1761097198259_0.2630753419681531","host":"s3://npm-registry-packages-npm-production"}},"0.0.1":{"name":"react-fate","version":"0.0.1","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.1","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"723e4e3c823f61fa3a34f9d912bda097ee87ef2b","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.1.tgz","fileCount":7,"integrity":"sha512-dtpMgyJ1lsmXh84txspkWbzTtSdy7+aKiF/zWzeInPNW3yEoR8d9BBzBMJoeHg5ljJUQLCX5E02tUwGvxvf8+A==","signatures":[{"sig":"MEYCIQCZHiBHuPpIxIm7lmpRQKfP7+6FzCMYOT+Bx29Pyf413wIhAI/4xehJYx6IqHfPB0myahwX9XuDNB1nvzYUYp2jnt63","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47947},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.1.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","development":"./src/index.tsx"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/e27ff5c50358cd35c8dc909aa9961a89/react-fate-0.0.1.tgz","_integrity":"sha512-dtpMgyJ1lsmXh84txspkWbzTtSdy7+aKiF/zWzeInPNW3yEoR8d9BBzBMJoeHg5ljJUQLCX5E02tUwGvxvf8+A==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"0.0.1"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.1_1764860325169_0.6374006366532634","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"react-fate","version":"0.0.2","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.2","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"0ccba0b1579c7254f322a569173255831c9a856f","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.2.tgz","fileCount":7,"integrity":"sha512-C9PdR3uy8hj8nejnUOecvuNHHw9qK9cbSZjas32PzcaRkKUW98Gzl40lixUxoRon9GG8uv0+zajjxg4PWbbUIA==","signatures":[{"sig":"MEUCIBwV3YS9qUHnJzpqfW72XOkLcA1qhU2h0psT1ZL6f89FAiEAmvgE1g4X24sbGFh2rZeuiDL8q0OFpiTGsamfLCyhhkg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47908},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.2.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/18ed5733f3ebb06af69aad14fea42980/react-fate-0.0.2.tgz","_integrity":"sha512-C9PdR3uy8hj8nejnUOecvuNHHw9qK9cbSZjas32PzcaRkKUW98Gzl40lixUxoRon9GG8uv0+zajjxg4PWbbUIA==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.2"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.2_1764863641197_0.6895007426667228","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"react-fate","version":"0.0.3","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.3","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"484ef76ed8b7bd4e422dad9e088aa618404eccea","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.3.tgz","fileCount":7,"integrity":"sha512-zgmXQrF1DVRCw+7kCihyiuNSfca+kng1lR9CzIqDc9YIMF8O+SFrviBCSL+T894uz19cvdNsRpzWC1z2Dw2gjQ==","signatures":[{"sig":"MEQCIHu2VRjfMtolOYm6TsvVHo34syahghD20a5OJ0lKrVPxAiBS7PKVNq9WPTvdUYW3Nqo3VWjFNeC6gz1kQ7t/2qyfOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48865},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.3.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/aa9b51fcd64ab614407fb306ddacaa67/react-fate-0.0.3.tgz","_integrity":"sha512-zgmXQrF1DVRCw+7kCihyiuNSfca+kng1lR9CzIqDc9YIMF8O+SFrviBCSL+T894uz19cvdNsRpzWC1z2Dw2gjQ==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.3"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.3_1764912727362_0.16558998428717842","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"react-fate","version":"0.0.4","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.4","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"2e12260f3ae4c577c72c97bd5269b1e4aa8e14c6","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.4.tgz","fileCount":7,"integrity":"sha512-r1r4y7qzGFj0R3Ue8y0WKEEQ0yR4uneivs81AHHx7tbQ94O90sqosfDsAQEYAgs/Cv2yVIW8GfaOjx0qoxeNHA==","signatures":[{"sig":"MEQCIBg9ZD4r+ESmt7E+YsHwNLnQn089kbQ8vkQafDacZM+/AiBBWl6m5bQoEqt7HcJXkdzocDpkL2k6OfFF2QTK9pwxeQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48992},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.4.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/2e4a9d07396c3e7f9c837c667b502611/react-fate-0.0.4.tgz","_integrity":"sha512-r1r4y7qzGFj0R3Ue8y0WKEEQ0yR4uneivs81AHHx7tbQ94O90sqosfDsAQEYAgs/Cv2yVIW8GfaOjx0qoxeNHA==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.4"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.4_1765033646691_0.439334061808788","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"react-fate","version":"0.0.5","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.5","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"d2252b6b3f57095ed9c1ccce8e0ae54e83260ba1","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.5.tgz","fileCount":7,"integrity":"sha512-JVPYoXaJID5PnsisXOKe/wHMInRvY61Oa3UGuyDL4Lkmnu6hIP1VZUPl1VW3V9ELtbr6PplP+gzT0D3Im3uHUA==","signatures":[{"sig":"MEUCIQCou1spR0JNv2gmk3+AdI/9Pzfanl44QXILZMhEztl+iQIgNKEC2RDREzPs0CT8YMJiXEuQBTeIknfBEnb4MTVA//Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48992},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.5.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/f944c3ded90f6762367e1c06e9788ab5/react-fate-0.0.5.tgz","_integrity":"sha512-JVPYoXaJID5PnsisXOKe/wHMInRvY61Oa3UGuyDL4Lkmnu6hIP1VZUPl1VW3V9ELtbr6PplP+gzT0D3Im3uHUA==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.5"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.5_1765034110885_0.9118677973536586","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"react-fate","version":"0.0.6","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.6","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"278998e29e226712fbec35c8138617ca47e85526","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.6.tgz","fileCount":7,"integrity":"sha512-phi70eUnnkDhE6+lz7QQDBUn9qzsx8GYSnQf00U3MZhvPNaBBDR77Y5ixkEhv3MuGiz+Z/0S62c6a7oIr3SsWQ==","signatures":[{"sig":"MEYCIQC5CPCivygzJDMdLgDhXrUI3WkLSlQKDo2F0LQB7HHRPwIhAIqeNB6ZTq7gd3tbe61h+zQaywuIxYaBAU0FCcBQw7cq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48961},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.6.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/9e1e05884ec55cd5e5eb4a9042e8f613/react-fate-0.0.6.tgz","_integrity":"sha512-phi70eUnnkDhE6+lz7QQDBUn9qzsx8GYSnQf00U3MZhvPNaBBDR77Y5ixkEhv3MuGiz+Z/0S62c6a7oIr3SsWQ==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.6"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.6_1765036161191_0.6709656550810836","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"react-fate","version":"0.0.7","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.7","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"0229c9c56fed6814a49991ffa2bf7a2e2de27946","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.7.tgz","fileCount":7,"integrity":"sha512-pKu92pAYIq3j7gnHD/zuTetKGewD7hK2iciEcYdjTewoK04Ho3BG+nb5M365M0mhyDf3xg00odstFs7T3qee7Q==","signatures":[{"sig":"MEYCIQDVN+Hpf5tsR59wPNI/RHSXVF1zzwZ0aLf1UawxOm5kOwIhAJSaaYycXQChfaQY1v+77nkl8s203q8jicTQaFiwvMio","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49301},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.7.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/c6f234fdaee1f61f44a8900a8948ad6f/react-fate-0.0.7.tgz","_integrity":"sha512-pKu92pAYIq3j7gnHD/zuTetKGewD7hK2iciEcYdjTewoK04Ho3BG+nb5M365M0mhyDf3xg00odstFs7T3qee7Q==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.7"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.7_1765079111974_0.044202436276302715","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"react-fate","version":"0.0.8","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.0.8","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"a01f4f7771c11c1631c9657470c20fa85cf2ba07","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.0.8.tgz","fileCount":7,"integrity":"sha512-ufoHzgcZbtEuIq/g1z2FRosZmHyEPqMkZL+x5+Jyl4f2pZocUIHopygGs4uIlJfwkKfMk8x6qEwk9EZgD4xr/w==","signatures":[{"sig":"MEUCIQCqFYa6ZlSmxORk7Lc6VXYq8iwDTo093Q3IHtGLxqWtqwIgKGu08HnHHxIeoXi/x6T8Dj+IqlBTpf/uYZ2PYbEqvgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51246},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.0.8.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/5988a1378d1c506a76f76726f307d66d/react-fate-0.0.8.tgz","_integrity":"sha512-ufoHzgcZbtEuIq/g1z2FRosZmHyEPqMkZL+x5+Jyl4f2pZocUIHopygGs4uIlJfwkKfMk8x6qEwk9EZgD4xr/w==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.0.8"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.0.8_1765203318401_0.5870403324909008","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"react-fate","version":"0.1.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.1.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"812ffc5f3c4eca5a6f3e9fdb1f5ee274479419b8","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.1.0.tgz","fileCount":7,"integrity":"sha512-J4j3oqXFkWaPRQuoLmo4zmExPy+bQBpzDAC4n2AXDZDhwf4T+E2UxJBqSfJbLnJvzoYxvzZFPo5OfteFlGTSpw==","signatures":[{"sig":"MEUCIBaaxTYErBWDJ1tx5pUz6X4dw0LmrFaurq8ymFRlFXMZAiEA6GeUxrVqZ4WvOeGfdTkn8Vk66Ktz6hN7QzK8DIM8oUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53436},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.1.0.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/2738aea7a1e6a1117cd73ab1abe2e899/react-fate-0.1.0.tgz","_integrity":"sha512-J4j3oqXFkWaPRQuoLmo4zmExPy+bQBpzDAC4n2AXDZDhwf4T+E2UxJBqSfJbLnJvzoYxvzZFPo5OfteFlGTSpw==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.1.0_1765253324055_0.6327309418952554","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"react-fate","version":"0.1.1","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.1.1","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"f84c8b53a2d5e8acff8e00da38c09e22b2c42336","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.1.1.tgz","fileCount":7,"integrity":"sha512-h9lWz+510mFTNj9Fi+JAGSiGG3QMgN3m773zevuL/v84zHBOtCIlwzOJyZj1xz/7RVE4P4q2pt2N0o1wSWb9Kw==","signatures":[{"sig":"MEUCIQDP1NVnBOJm9lwsLXbc9rvRqKxzKuhOiBbYxioqr+zmxAIgJ17zSTvWYwNTKwXCZlL3p2WIc7Nhvt6R0hN1cCyunE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53436},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.1.1.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/82a957a31317633051d0a8a07ff05236/react-fate-0.1.1.tgz","_integrity":"sha512-h9lWz+510mFTNj9Fi+JAGSiGG3QMgN3m773zevuL/v84zHBOtCIlwzOJyZj1xz/7RVE4P4q2pt2N0o1wSWb9Kw==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.1","react-dom":"^19.2.1","@types/react":"^19.2.7","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.1.1_1765285777554_0.6218570761355027","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"react-fate","version":"0.1.2","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.1.2","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"2a37946461a2d7441ce099135a5878c735506d70","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.1.2.tgz","fileCount":7,"integrity":"sha512-wFrGeoIFLbqmQBmkBWCuMrXIJ97ddoLywm9XAHBNlzjwdMrkRDVqErtzckpDragkjfHQ9FGPcMtoH6txsYca2g==","signatures":[{"sig":"MEQCIFtdqOWBa2og9Glkk10K50Mi/Q0970fpVDGW8DH6dT50AiBzxqSRe+DLKim9TKgyZcWDPpHKO0bj/VivmuQq/wEICw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53420},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.1.2.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"}},"scripts":{"build":"tsdown -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/47eaec05b39e947097f08ecb1b1e6b3c/react-fate-0.1.2.tgz","_integrity":"sha512-wFrGeoIFLbqmQBmkBWCuMrXIJ97ddoLywm9XAHBNlzjwdMrkRDVqErtzckpDragkjfHQ9FGPcMtoH6txsYca2g==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.6.2","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@nkzw/fate":"^0.1.2"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","react-dom":"^19.2.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.1.2_1768349839665_0.9164484276276916","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"react-fate","version":"0.1.3","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@0.1.3","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bugs":{"url":"https://github.com/nkzw-tech/fate/issues"},"bin":{"fate":"lib/cli.mjs"},"dist":{"shasum":"bfadaeba767cafb4175cf7c5566b89c6bd08db3f","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-0.1.3.tgz","fileCount":7,"integrity":"sha512-S+zeKkaXJ7iYm5JQCks8hI9v+I5J9EQtAAymrAI5peYfctB8hhViQaf5A6ArqDnTNToz6u9nrQZLDbnml6RiSw==","signatures":[{"sig":"MEYCIQDxzWeJgWCzQ8f7BJ5GCcqdFDYoPppVz2P/btcPFOm4mwIhAJB1IBKXAuPX2iVTAS0bXI1UsXolrN3UzjKasJ4fqpC0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53422},"main":"./lib/index.mjs","type":"module","_from":"file:react-fate-0.1.3.tgz","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"}},"scripts":{"build":"vite lib -d lib --target=node24 src/index.tsx src/cli.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"_resolved":"/private/var/folders/5d/mql7sglx2_lg6ml_t901m7gc0000gn/T/05a99a7974f492f8875f664a74a84a18/react-fate-0.1.3.tgz","_integrity":"sha512-S+zeKkaXJ7iYm5JQCks8hI9v+I5J9EQtAAymrAI5peYfctB8hhViQaf5A6ArqDnTNToz6u9nrQZLDbnml6RiSw==","repository":{"url":"git+https://github.com/nkzw-tech/fate.git","type":"git"},"_npmVersion":"11.7.0","description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"25.4.0","dependencies":{"@nkzw/fate":"^0.1.3"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","react-dom":"^19.2.3","@types/react":"^19.2.9","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_0.1.3_1769212535391_0.6743625583165649","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-rc.0":{"name":"react-fate","version":"1.0.0-rc.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.0.0-rc.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"b9a664f720191f15f82ddc4de3707b0394dca393","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.0.0-rc.0.tgz","fileCount":39,"integrity":"sha512-fQTDZBSpdlERBIMwdd7gOeFKeSub2uW/Kg8tiBcnP4bkROX/hz4kbSV0ZSzHmHu3Ne0CVM1OggCFbyR5YdsZ7A==","signatures":[{"sig":"MEQCICWSyE7ZsaMn/RI9SAnet6T5C4z84487puPe+10vnKhoAiBwJNsKwuELG1w3qkfDyPmtN3E6DUDocfAMLa5XSi6p2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159326},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@nkzw/fate":"^1.0.0-rc.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.5","react-dom":"^19.2.5","@types/react":"^19.2.14","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.0.0-rc.0_1778743776602_0.13001699847494508","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"react-fate","version":"1.0.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.0.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"8093d6e256fd3ecf24f63d2991b8b5ad70dab828","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.0.0.tgz","fileCount":39,"integrity":"sha512-Yid+/PxEwOZ/2c2z7LfzoA6eZArZfl79k4FQf1BkysW76Jn6kvHvWQXRif+rfgc82cgCod79gL2fyLMUvAYQyw==","signatures":[{"sig":"MEUCIAo2dbX5V0AHyL0LnVForrp1NyddwkSuzQu7hvc6a++7AiEA9aihsn76C4PtjsK+hXw/CT9ncxrBlbnTxJ4+s4vFsdo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159316},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@nkzw/fate":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","react-dom":"^19.2.6","@types/react":"^19.2.14","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.0.0_1778765963398_0.9460736445117945","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"react-fate","version":"1.0.1","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.0.1","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"5400d050535711f983d0c10fad6004a807f2df79","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.0.1.tgz","fileCount":39,"integrity":"sha512-opC0X1W0MLceoJjpV7xa5WI35kc35hiuVWD0ulmeHsPwclXQoCbvkoJ9+4TQBpAf2mkc67b6GVOxSQzGjfM4pQ==","signatures":[{"sig":"MEQCIEd0mqEGD77BnvrvI11kQH4/EDh3BeZj8nVL2koh4zlDAiAiTUidN3ivo4fCTab9qDGYxxPXKkZZxF6c/eGRZVWjZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165909},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@nkzw/fate":"^1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","react-dom":"^19.2.6","@types/react":"^19.2.14","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.0.1_1778832997182_0.9480430197985656","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"react-fate","version":"1.0.2","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.0.2","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"f6e012d967728fa227dc51a79bd814552a0e8f55","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.0.2.tgz","fileCount":39,"integrity":"sha512-rXSX2h9fh7+xvuS3IEugQiSMmb6ncIX1kG+YAMSqNoEkLXormGjAAfjYKbZJoBuApmfgjQ+YDW9iiiHg2IBy3A==","signatures":[{"sig":"MEUCIGyJN+OUC9vPbDGZVq/1VLadoiA+DDYdSta1NTIOe+YlAiEAkNmdOer2FEyBCIYJz/0y8RYTbeULewHABafH3c5z4o8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165909},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@nkzw/fate":"^1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","react-dom":"^19.2.6","@types/react":"^19.2.14","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.0.2_1778915385906_0.38494705338325885","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"react-fate","version":"1.0.3","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.0.3","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"78e10076432ba6da97f90bc2b8d60b3fb6f4806c","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.0.3.tgz","fileCount":39,"integrity":"sha512-jajKK4p7xYPL+qFilrm17tO2doSpQUfeWMmF61ITv+9QkxV+iz1IsWU+AqrOebddeYt1vHwLn06x1pDyRRQmiQ==","signatures":[{"sig":"MEQCIGHrIXSIpwbmzWOTJ7cJ0mwvGLS5fPX53K1kCdKEVZZOAiBAlDSP1Thl1KYtxrVUTrELQ3pQNuJEU/CZSpb0L8uhFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165909},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@nkzw/fate":"^1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","react-dom":"^19.2.6","@types/react":"^19.2.14","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.0.3_1779094373518_0.49389761259177467","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"react-fate","version":"1.1.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.1.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"c4cfc65f001e5bf62fb1362f545ced430e7e28ec","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.1.0.tgz","fileCount":51,"integrity":"sha512-C6UvmoaOicnfQClz9uYUPHw3ZwgPPFU9EJeR8pST38DMpQk20Gw9lZsjb7ZSUwi3PF2zVmtxbVkmYKJBUj2Cpw==","signatures":[{"sig":"MEUCIQC6iyoK/ItoVWbllodP9LH9Vy0o8hOV+E4aY7W2OiZVbQIgQbby2R2NdRwpmFf/7AAeJ9Bl/22K1MXkf8Xg4Jj27xU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196438},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@nkzw/fate":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","react-dom":"^19.2.7","@types/react":"^19.2.16","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.1.0_1780471591626_0.3891383332924423","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"react-fate","version":"1.2.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.2.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"f8e1e7d873bbeca770456854d3cb10fa4bc5deb5","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.2.0.tgz","fileCount":55,"integrity":"sha512-vdDUj6dCEpOQ7T/AzuVQPPa9JMaESnPYSuOjqru7TOVo9tyLgqFJ/gcKEcauvJrlSuumGCBRdlmw+HAHyV85kw==","signatures":[{"sig":"MEYCIQDhd6HpLiRtEDqwgdmzrihLmO93QDvX/FLviNJQUa/bAgIhAPiTeUCVmCTlfBrvv9JbhN2LerNlY83EZgAE5SsPGKYp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":240532},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@nkzw/fate":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","react-dom":"^19.2.7","@types/react":"^19.2.16","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.2.0_1780903082860_0.8808915880259467","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"react-fate","version":"1.3.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.3.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"ac674b1c8fad4b479a78b453060c6390fb0cfb7c","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.3.0.tgz","fileCount":56,"integrity":"sha512-2GDp9TpQHtrXg5iKc0EG56LZmIpH4exsXAXpYRLqQngnAfmDg7d71K7yvMZsTARpsn93Zwhqg9XBMI4dkbw05A==","signatures":[{"sig":"MEUCIF9GFXzcvK2c00dh349qs6XspdLt629lAVcRSoP2/UnWAiEA+79BZxqc2zeXfN84UcLIFT12SXmEoh052OmdI1qyPT0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":244255},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"@nkzw/fate":"^1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","react-dom":"^19.2.7","@types/react":"^19.2.16","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.3.0_1781101317541_0.63513187951784","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"react-fate","version":"1.3.1","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.3.1","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"a1ea484719578407ab6074553818748d52a683f3","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.3.1.tgz","fileCount":56,"integrity":"sha512-6L7iOSWFz4f4CpCCtlBtIdhvW0hWT3Mv7MokpDpSCB65yTKID2UIYTbbLyhXtONqwhYSNGhff6hI1/z4lJaBVQ==","signatures":[{"sig":"MEUCIF9dchRi9AwHSNDYwWQvjiDSzJqCUw07MHlV7wvU9dXTAiEAx8Pkbanzj7kCklU4CCMWTDSENhme4Q1aXDBLMcYNw2A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249836},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"@nkzw/fate":"^1.3.1"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","react-dom":"^19.2.7","@types/react":"^19.2.16","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.3.1_1781137916910_0.8290642477685997","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"react-fate","version":"1.3.2","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.3.2","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"68029aa846c2993e7a85d08fb6891765d7ba1af8","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.3.2.tgz","fileCount":56,"integrity":"sha512-W714zVQddM8H4qZ2FU5snGKNXxOpI6Peze8bIt5yETZ6FMNXCREMyDJmetKpKwyK3f0ctR2egHJwXP+nQhthww==","signatures":[{"sig":"MEUCIFWb2JF9XDdNoJavxM9OdFiCiIlOp5nkeY4fOycEZ54YAiEAsK8HulDmRB+ZuED3/cjMYf/Xt9rLtVWpqkjgim2Qxh4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":252630},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"@nkzw/fate":"^1.3.2"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","react-dom":"^19.2.7","@types/react":"^19.2.17","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.3.2_1784197624859_0.3751227684359095","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"react-fate","version":"1.3.3","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.3.3","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"554d5e06aad01dbf46f69458bb14dc2d35af2bdd","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.3.3.tgz","fileCount":56,"integrity":"sha512-gzOkKW3GyEPzIHkQ4ReTD8xGRNrWQbxZJwfFkNfJUvNVx2boQx9Dwn+7jkkjQhGG+8kVl1EmJevOxt7b1JMKVQ==","signatures":[{"sig":"MEUCIQDD5T8jyY0WPLUrwihV8l+2iS0r7PNsGRUEj3XuxNWJdgIgYVbhOIrMnG5jHuCerLMC7mlkPtJZgH/Gw7L0DuBWs1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249873},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.5.0","dependencies":{"@nkzw/fate":"^1.3.3"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","react-dom":"^19.2.7","@types/react":"^19.2.17","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.3.3_1785739816752_0.5843225885091554","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"react-fate","version":"1.4.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.4.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"572f396c2aa01e040d426eb8078ba70f519e2be1","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.4.0.tgz","fileCount":56,"integrity":"sha512-NOy3IaESqH+Fh1TxPXK85VlYmRH0HLhCWo+PuS1fwJJpNunYM2FkfOMxxqXsEfko/1fFSU/pSchj3lFEwNjdGQ==","signatures":[{"sig":"MEUCIQCorSlXo0FVfwvHAufESc72OhxD4XqR4U3+n0JNLa70bgIgVWCOCX1aKcdiAnZNPTCGdI8PWHDRPGX+5j5V6vxIfdY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249934},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"@nkzw/fate":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","react-dom":"^19.2.8","@types/react":"^19.2.18","@types/react-dom":"^19.2.7"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.4.0_1788690046092_0.33786961494154655","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"react-fate","version":"1.5.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.5.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"a5c8c3f7a7c0c38ad235f9313c8f8f04cf3d4ae8","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.5.0.tgz","fileCount":60,"integrity":"sha512-Cka6Jr4uAoQp0NCy865pEEqZK3ONSiGBS8agQUj0c9CFM9kDRS3tI6RDs70FYZFmokkGt41jDub24jY3iDte7A==","signatures":[{"sig":"MEUCIDcFKqu154dgX4Dg/c3zXzPhfSFLOmDOOfwj4DcQKZpJAiEA5Dl262KBYhl4mxkjG1805Z3eaDTKeKrJtfaykeMNX0Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293968},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"@nkzw/fate":"^1.5.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","react-dom":"^19.2.8","@types/react":"^19.2.18","@types/react-dom":"^19.2.7"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.5.0_1788879944413_0.8140777214128863","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"react-fate","version":"1.5.1","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.5.1","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"c4d86952b62cddaa4645536107aa077918d92fe9","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.5.1.tgz","fileCount":60,"integrity":"sha512-k+hYyUwbSpqR7avEnQpmbXfBDeicyrTTDPQPdigLXo6XBdPvzTiwn1VWqdwVQ35Sb9MKdI6WgoctX9VZWTX/xw==","signatures":[{"sig":"MEYCIQDW7bybZJNYnujeXrivBre+qU0lfPH2NycApkV5u4t9fQIhAN4kLMyOaSsBnunKpivEaodMEdmBNWKc6iBR+qyo9mnP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293712},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"@nkzw/fate":"^1.5.1"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","react-dom":"^19.2.8","@types/react":"^19.2.18","@types/react-dom":"^19.2.7"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.5.1_1788918288824_0.2961327637925444","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"react-fate","version":"1.5.2","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.5.2","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"85334b6be1c1f8a4efa7eca5b9008598dad6d06a","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.5.2.tgz","fileCount":60,"integrity":"sha512-x5Cs+yuPJ0z6nPJ3VmokbXUGKRYbeRA2HIxemH5VDbb+PhnRzkYtGgzSfS5JMHEKS4FtDaKDnelA29pzECGdOQ==","signatures":[{"sig":"MEUCIQClBX+2A+PQ6PuqJfEYAX4XuAjt+EKBe1gA4jOejnarBAIgaq54OJd7ddNAAucNPX4B9ll4Sp3DmsGeVcsvkqtS7qU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH3Izfa8RGfzTamznYlEIqpMgTpuu421mMCX4JWlPcn+AiBoUkzvCpoIzncHE49Y18Xxi3WKQkVj3wkI1/68VYGRDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289135},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"_nodeVersion":"26.8.2","dependencies":{"@nkzw/fate":"^1.5.2"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.3.0","react-dom":"^19.3.0","@types/react":"^19.3.0","@types/react-dom":"^19.3.0"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.5.2_1789531281856_0.17392254498485205","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"react-fate","version":"1.6.0","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.6.0","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"dc090c0604559b792f3f9e84e7ca9204099f915a","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.6.0.tgz","fileCount":60,"integrity":"sha512-facxrkqYRG3eHcLGxeqSGhYevUWgoS4C0fvh2A3+pLkMdVjnh5fhrWX3m6272hnmTe3MYjz+1PpgOVpB7F6hjQ==","signatures":[{"sig":"MEUCIQCuQNQlr1//2hVnyBWs9XwoqVcH5DX+PjKU61R7p0cXFgIgVYPXimHujRcJSB7aTtk4G7c4gwtFQzkqAuRIFxCalCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDui35Zchll5LDTUAAXpg5atvxKdTGLDSBOfJVJsX4jqQIhAP4KdguJtvOjDPfrclcPJaZUO58bPd3cG33J85GSeIDu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285812},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"dependencies":{"@nkzw/fate":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"19.3.0","react-dom":"19.3.0","@types/react":"19.3.0","@types/react-dom":"19.3.0"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.6.0_1789717035608_0.7196122615849427","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"react-fate","version":"1.6.1","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.6.1","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"8c9132dcb565e2ef0b206bcb8158afe30b339e9f","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.6.1.tgz","fileCount":60,"integrity":"sha512-G4KPtO8cj2QYv4UY8ylSgi0fTa1QXvXXB2WmkKTtqSycXqxqkLojCSaDTI+ALG+MXxR39hFM4E4Im+xZzoJT1Q==","signatures":[{"sig":"MEUCICaqothBnM0oldtviHjxmNJ28IJwVWRBGDRfDvUHk41qAiEAgTHrWEGcIV+OLhkucmtGoVrbXsZVMr4VpR/Y1bUsjIc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAuggk5yTEXO1JeiHJa9Kz9MSOJbAW5uEOLwIC8ANTNaAiEA1n99GY5jkFUAW9N25yuGOP378y6AGI2kQTSmf86uBCY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285068},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"dependencies":{"@nkzw/fate":"1.6.1"},"_hasShrinkwrap":false,"devDependencies":{"react":"19.3.0","react-dom":"19.3.0","@types/react":"19.3.0","@types/react-dom":"19.3.0"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.6.1_1790384922071_0.194419307725461","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"react-fate","version":"1.6.2","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","_id":"react-fate@1.6.2","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"homepage":"https://github.com/nkzw-tech/fate","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"2a6e47b83371740d7ce9dab51e6b7831e558cfec","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.6.2.tgz","fileCount":60,"integrity":"sha512-UAUJTChLIZa8iwOXtW/VBGilziNQh+Z/vESqP+2pjxAWIafhmnmBhrmkY/ENanMNxnVLBM2dd9oeWH2qttJy/w==","signatures":[{"sig":"MEUCIQCCHJmZWNqST8Me2Gld2k/0u1gELYFDx2XOt7qNOOJMxAIgH9/T8n3W8uHDr7nhN5CdKfLjEj6rTTRFop4V/2ssN2Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICia7bi20qt6iu09MkeVHAvrpAAR0uZ3w+KzPegmWCn4AiBt/r8ALqdQHvpNMkxCzsVqL6vjMeVQAeHSiJVR5ZmWdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285069},"main":"./lib/index.mjs","type":"module","types":"./lib/index.d.mts","exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"dependencies":{"@nkzw/fate":"1.6.2"},"_hasShrinkwrap":false,"devDependencies":{"react":"19.3.0","react-dom":"19.3.0","@types/react":"19.3.0","@types/react-dom":"19.3.0"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-fate_1.6.2_1790638646798_0.1714303149792702","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"_id":"react-fate@1.7.0","bin":{"fate":"./lib/cli.mjs"},"dist":{"shasum":"040242d5e1fd3b90b3f329e7e4bb09506d46f1a0","tarball":"https://registry.npmjs.org/react-fate/-/react-fate-1.7.0.tgz","fileCount":69,"integrity":"sha512-86G6iyGNA/gFZvEEXIDmTlzhZlq50gqSdp9LI+ITxfC58y71Qcl6Ya1A3Xie+YMsdS3FIlbkU0OH3kzv1B+Z1A==","signatures":[{"sig":"MEUCIG+fafXtxcJ4Nk6A8TUApgJ0r6ZLjSZ8iku1zwdN4ulkAiEA0H4hinubd3qZsc1Ucd9auLVsh8xmb7QKXF2wrvMY4mE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBsrBRHLR/LG1acQUmj4f28+H1teSfMnxXtt00bvvqrWAiAxW5ia5++cPx3Wruy0L9D7VJrHJcuT9Hs+/NoafSUkVQ=="}],"unpackedSize":323747},"main":"./lib/index.mjs","name":"react-fate","type":"module","types":"./lib/index.d.mts","author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"exports":{".":{"types":"./lib/index.d.mts","default":"./lib/index.mjs","@nkzw/source":"./src/index.tsx"},"./vite":{"types":"./lib/vite.d.mts","default":"./lib/vite.mjs","@nkzw/source":"./src/vite.ts"},"./client":{"types":"./lib/client.d.mts","default":"./lib/client.mjs","@nkzw/source":"./src/client.ts"}},"license":"MIT","scripts":{"build":"vp pack --tsconfig tsconfig.json -d lib --target=node24 src/index.tsx src/client.ts src/cli.ts src/vite.ts"},"version":"1.7.0","_npmUser":{"name":"cpojer","email":"christoph.pojer@gmail.com"},"homepage":"https://github.com/nkzw-tech/fate","repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","directories":{},"maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"dependencies":{"@nkzw/fate":"1.7.0"},"_hasShrinkwrap":false,"devDependencies":{"react":"19.3.0","react-dom":"19.3.0","@types/react":"19.3.0","@types/react-dom":"19.3.0"},"peerDependencies":{"react":"^19.2.0","react-dom":"^19.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-fate_1.7.0_1790686663462_0.28204938226544574"}}},"time":{"created":"2025-10-22T01:39:58.258Z","modified":"2026-09-29T12:57:43.724Z","0.0.0":"2025-10-22T01:39:58.431Z","0.0.1":"2025-12-04T14:58:45.348Z","0.0.2":"2025-12-04T15:54:01.326Z","0.0.3":"2025-12-05T05:32:07.535Z","0.0.4":"2025-12-06T15:07:26.868Z","0.0.5":"2025-12-06T15:15:11.024Z","0.0.6":"2025-12-06T15:49:21.331Z","0.0.7":"2025-12-07T03:45:12.104Z","0.0.8":"2025-12-08T14:15:18.543Z","0.1.0":"2025-12-09T04:08:44.213Z","0.1.1":"2025-12-09T13:09:37.719Z","0.1.2":"2026-01-14T00:17:19.806Z","0.1.3":"2026-01-23T23:55:35.542Z","1.0.0-rc.0":"2026-05-14T07:29:36.736Z","1.0.0":"2026-05-14T13:39:23.562Z","1.0.1":"2026-05-15T08:16:37.319Z","1.0.2":"2026-05-16T07:09:46.070Z","1.0.3":"2026-05-18T08:52:53.644Z","1.1.0":"2026-06-03T07:26:31.851Z","1.2.0":"2026-06-08T07:18:03.007Z","1.3.0":"2026-06-10T14:21:57.708Z","1.3.1":"2026-06-11T00:31:57.074Z","1.3.2":"2026-07-16T10:27:04.998Z","1.3.3":"2026-08-03T06:50:16.886Z","1.4.0":"2026-09-06T10:20:46.231Z","1.5.0":"2026-09-08T15:05:44.563Z","1.5.1":"2026-09-09T01:44:48.958Z","1.5.2":"2026-09-16T04:01:21.936Z","1.6.0":"2026-09-18T07:37:15.694Z","1.6.1":"2026-09-26T01:08:42.158Z","1.6.2":"2026-09-28T23:37:26.905Z","1.7.0":"2026-09-29T12:57:43.547Z"},"author":{"name":"Christoph Nakazawa","email":"christoph.pojer@gmail.com"},"license":"MIT","homepage":"https://github.com/nkzw-tech/fate","repository":{"url":"https://github.com/nkzw-tech/fate","type":"git"},"description":"fate is a modern data client for React.","maintainers":[{"name":"cpojer","email":"christoph.pojer@gmail.com"}],"readme":"<!-- auto-generated from docs/guide/*.md and docs/integrations/*.md. Do not edit directly. -->\n\n<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"/public/fate-logo-dark.svg\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"/public/fate-logo.svg\">\n    <img alt=\"Logo\" src=\"/public/fate-logo.svg\" width=\"50%\">\n  </picture>\n</p>\n\n**_fate_** is a modern data client for React inspired by [Relay](https://relay.dev/) and [GraphQL](https://graphql.org/). It combines view composition, normalized caching, data masking, Async React features, and type-safe data fetching.\n\n### Features\n\n- **View Composition:** Components declare their data requirements using co-located \"views\". Views are composed into a single request per screen, minimizing network requests and eliminating waterfalls.\n- **Normalized Cache:** fate maintains a normalized cache for all fetched data. This enables efficient data updates through actions and mutations and avoids stale or duplicated data.\n- **Data Masking & Strict Selection:** fate enforces strict data selection for each view, and masks (hides) data that components did not request. This prevents accidental coupling between components and reduces overfetching.\n- **Async React:** fate uses modern Async React features like Actions, Suspense, and `use` to support concurrent rendering and enable a seamless user experience.\n- **Lists & Pagination:** fate provides built-in support for connection-style lists with cursor-based pagination, making it easy to implement infinite scrolling and \"load-more\" functionality.\n- **Optimistic Updates:** fate supports declarative optimistic updates for mutations, allowing the UI to update immediately while the server request is in-flight. If the request fails, the cache and its associated views are rolled back to their previous state.\n- **Live Views:** fate can keep individual view refs up to date through a single native Server-Sent Events stream, merging updates into the normalized cache.\n- **AI-Ready:** fate's minimal, predictable API and explicit data selection enable local reasoning, enabling humans and AI tools to generate stable, type-safe data-fetching code.\n\n### A modern data client for React\n\n**_fate_** is designed to make data fetching and state management in React applications more composable, declarative, and predictable. The framework has a minimal API, no DSL, and no magic—_it's just JavaScript_.\n\nGraphQL and Relay introduced several novel ideas: fragments co‑located with components, [a normalized cache](https://relay.dev/docs/principles-and-architecture/thinking-in-graphql/#caching-a-graph) keyed by global identifiers, and a compiler that hoists fragments into a single network request. These innovations made it possible to build large applications where data requirements are modular and self‑contained.\n\n[Nakazawa Tech](https://nakazawa.tech) builds apps and [games](https://athenacrisis.com) primarily with GraphQL and Relay. We advocate for these technologies in [talks](https://www.youtube.com/watch?v=rxPTEko8J7c&t=36s) and provide templates ([server](https://github.com/nkzw-tech/server-template), [client](https://github.com/nkzw-tech/web-app-template/tree/with-relay)) to help developers get started quickly.\n\nHowever, GraphQL comes with its own type system and query language. If you are already using tRPC or another type‑safe RPC framework, it's a significant investment to adopt and implement GraphQL on the backend. This investment often prevents teams from adopting Relay on the frontend.\n\nMany React data frameworks lack Relay's ergonomics, especially fragment composition, co-located data requirements, predictable caching, and deep integration with modern React features. Optimistic updates usually require manually managing keys and imperative data updates, which is error-prone and tedious.\n\n_fate_ takes the great ideas from Relay and applies them to plain TypeScript data fetching. You get type safety between the client and server, a native protocol with optional adapters such as tRPC, and GraphQL-like ergonomics for data fetching. Using _fate_ usually looks like this:\n\n```tsx\nexport const PostView = view<Post>()({\n  author: UserView,\n  content: true,\n  id: true,\n  title: true,\n});\n\nexport const PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      <p>{post.content}</p>\n      <UserCard user={post.author} />\n    </Card>\n  );\n};\n```\n\n_[Learn more](/docs/guide/getting-started.md) about fate's core concepts or create an app from one of the templates._\n\n## Getting Started\n\n### Template\n\nCreate a new fate app with Vite+:\n\n```bash\nvp create fate\n```\n\nExplore the [fate stack](https://stack.fate.technology) to see the tools included in your new project.\n\nThe template selector can create a React or Vue client for a Void app with Drizzle, a tRPC app with Drizzle or Prisma, a GraphQL app with Prisma, or a fate client for an existing GraphQL server. React is the default UI framework; pass `--framework vue` or choose Vue in the template selector to create a Vue app. The template sources live in the fate repo under [`packages/create-fate/templates/fate`](https://github.com/nkzw-tech/fate/tree/main/packages/create-fate/templates/fate). They feature modern tools to deliver an incredibly fast development experience.\n\n### Manual Installation\n\nFor a React client, install `react-fate`. It requires React 19.2+:\n\n::: code-group\n\n```bash [npm]\nnpm add react-fate\n```\n\n```bash [pnpm]\npnpm add react-fate\n```\n\n```bash [yarn]\nyarn add react-fate\n```\n\n:::\n\nFor a Vue client, install `vue-fate`:\n\n::: code-group\n\n```bash [npm]\nnpm add vue-fate\n```\n\n```bash [pnpm]\npnpm add vue-fate\n```\n\n```bash [yarn]\nyarn add vue-fate\n```\n\n:::\n\nIf your server is a separate package, install `@nkzw/fate` there as a runtime dependency too. Install `@nkzw/fate` on the client only for a barebones integration without a framework adapter:\n\n::: code-group\n\n```bash [npm]\nnpm add @nkzw/fate\n```\n\n```bash [pnpm]\npnpm add @nkzw/fate\n```\n\n```bash [yarn]\nyarn add @nkzw/fate\n```\n\n:::\n\n## Core Concepts\n\n**_fate_** has a minimal API surface and is aimed at reducing data fetching complexity.\n\n### Thinking in Views\n\nIn fate, each component declares the data it needs using views. Views are composed upward through the component tree until they reach a root, where the actual request is made. fate fetches all required data in a single request. React Suspense manages loading states, and any data-fetching errors naturally bubble up to React error boundaries. This eliminates the need for imperative loading logic or manual error handling.\n\nTraditionally, React apps are built with components and hooks. fate introduces a third primitive: views – a declarative way for components to express their data requirements. An app built with fate looks more like this:\n\n<p align=\"center\">\n  <picture class=\"fate-tree\">\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"/public/fate-tree-dark.svg\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"/public/fate-tree.svg\">\n    <img alt=\"Tree\" src=\"/public/fate-tree.svg\" width=\"90%\">\n  </picture>\n</p>\n\nWith fate, you no longer worry about _when_ to fetch data, how to coordinate loading states, or how to handle errors imperatively. You avoid overfetching, stop passing unnecessary data down the tree, and eliminate boilerplate types created solely for passing server data to child components.\n\n> [!NOTE]\n> Views in _fate_ are what fragments are in GraphQL.\n\n## Views\n\n### Defining Views\n\nLet's start by defining a simple view for a blog's `Post` component. fate requires you to explicitly \"select\" each field that you plan to use in your components. Here is how you can define a view for a `Post` entity that has `title` and `content` fields:\n\n```tsx\nimport { view } from 'react-fate';\n\ntype Post = {\n  content: string;\n  id: string;\n  title: string;\n};\n\nexport const PostView = view<Post>()({\n  content: true,\n  id: true,\n  title: true,\n});\n```\n\nFields are selected by setting them to `true` in the view definition. This tells **_fate_** that these fields should be fetched from the server and made available to components that use this view.\n\n> [!NOTE]\n> The `Post` type above is an example. In a real application, this type is defined on the server and imported into your client code.\n\n### Resolving a View with `useView`\n\nNow we can use the view that we defined in a `PostCard` React component to resolve the data against a reference of an individual `Post`:\n\n```tsx\nimport { useView, ViewRef } from 'react-fate';\n\nexport const PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      <p>{post.content}</p>\n    </Card>\n  );\n};\n```\n\nA `ViewRef` is a reference to a concrete object of a specific type, for example a `Post` with id `7`. It contains the unique ID of the object, the type name (as `__typename`) and some fate-specific metadata. fate creates and manages these references for you, and you can pass them around your components as needed.\n\nComponents using `useView` listen to changes for all selected fields. When data changes, fate re-renders all of the fields that depend on that data. For example, if the `title` of the `Post` changes, the `PostCard` component re-renders with new data. However, if a different field such as `likes` that isn't selected in `PostView` changes, the `PostCard` component will not re-render.\n\n### Fetching Data with `useRequest`\n\nNow that we defined our view and component, we fetch the data from the server using the `useRequest` hook from fate. This hook allows us to declare what data we need for a specific screen or component tree. At the root of our app, we can request a list of posts like this:\n\n```tsx\nimport { useRequest } from 'react-fate';\nimport { PostCard, PostView } from './PostCard.tsx';\n\nexport function App() {\n  const { posts } = useRequest({ posts: { list: PostView } });\n\n  return posts.map((post) => <PostCard key={post.id} post={post} />);\n}\n```\n\n_Learn more about `useRequest` in the [Requests Guide](/docs/guide/requests.md)._\n\n### Composing Views\n\nIn the above example we are defining a single view for a `Post`. One of fate's core strengths is view composition. Let's say we want to show the author's name along with the post. A simple way to do this is by adding an `author` field to the `PostView` with a concrete selection:\n\n```tsx\nimport { Suspense } from 'react';\nimport { useView, ViewRef } from 'react-fate';\n\nexport const PostView = view<Post>()({\n  author: {\n    id: true,\n    name: true,\n  },\n  content: true,\n  id: true,\n  title: true,\n});\n\nconst PostCard = ({ postRef }: { postRef: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      <p>by {post.author.name}</p>\n      <p>{post.content}</p>\n    </Card>\n  );\n};\n```\n\nThis code fetches the author associated with the Post and makes it available to the `PostCard` component. However, this approach has some downsides:\n\n1. The `author` selection is tightly coupled to the `PostView`. If we want to use the author's data in another component, we would need to duplicate the field selection.\n1. If the `author` has more fields that we want to use in other components, we would need to add them to the `PostView`, leading to overfetching.\n1. We cannot reuse the `author` field selection in other views or components.\n\nIn fate, views are composable and reusable. Instead of inlining the selection, we can define a `UserView` and compose it into the `PostView` like this:\n\n```tsx\nimport type { Post, User } from '@your-org/server/views';\nimport { view } from 'react-fate';\n\nexport const UserView = view<User>()({\n  id: true,\n  name: true,\n  profilePicture: true,\n});\n\nexport const PostView = view<Post>()({\n  author: UserView,\n  content: true,\n  id: true,\n  title: true,\n});\n```\n\nNow we can create a separate `UserCard` component that uses our `UserView`:\n\n```tsx\nimport { useView, ViewRef } from 'react-fate';\n\nexport const UserCard = ({ user: userRef }: { user: ViewRef<'User'> }) => {\n  const user = useView(UserView, userRef);\n\n  return (\n    <div>\n      <img src={user.profilePicture} alt={user.name} />\n      <p>{user.name}</p>\n    </div>\n  );\n};\n```\n\nAnd update `PostCard` to use our `UserCard` component:\n\n```tsx\nimport { UserCard } from './UserCard.tsx';\n\nexport const PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      <UserCard user={post.author} />\n      <p>{post.content}</p>\n    </Card>\n  );\n};\n```\n\n### View Spreads\n\nWhen building complex UIs, you will often build multiple components that share the same data requirements. In fate, you can use view spreads to compose such views together. This is similar to GraphQL fragment spreads, but works with plain JavaScript objects.\n\nLet's assume we want to fetch and display additional information about the author in the `PostCard`, such as their bio. Instead of directly assigning our `UserView` to the `author` field, we can instead spread it and add the `bio` field:\n\n```tsx\nexport const PostView = view<Post>()({\n  author: {\n    ...UserView,\n    bio: true,\n  },\n  content: true,\n  id: true,\n  title: true,\n});\n```\n\nNow the `PostCard` component can access the `bio` field of the author:\n\n```tsx\nexport const PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      <UserCard author={post.author} />\n      {/* Accessing the bio field */}\n      <p>{post.author.bio}</p>\n      <p>{post.content}</p>\n    </Card>\n  );\n};\n```\n\nWe can also spread multiple views together. For example, if we have another view called `UserStatsView` that selects some statistics about the user, we can include it in the `PostView` like this:\n\n```tsx\nexport const UserStatsView = view<User>()({\n  followerCount: true,\n  postCount: true,\n});\n\nexport const PostView = view<Post>()({\n  author: {\n    ...UserView,\n    ...UserStatsView,\n    bio: true,\n  },\n  content: true,\n  id: true,\n  title: true,\n});\n```\n\nViews are opaque objects. Even if you select the same field multiple times through different views, the composed object won't have conflicting fields or result in TypeScript errors. fate automatically deduplicates fields during runtime and ensures that each field is only fetched once.\n\n### `useView` and Suspense\n\nWe learned that `useRequest` is responsible for fetching data from the server and `useView` is used for reading data from the cache. In some situations data may not be available in the cache and `useView` might need to suspend the component to fetch only the missing data. Once that data is fetched and written to the cache, the component resumes rendering.\n\n_Tip: You can test this behavior in development mode with Fast Refresh (HMR) enabled in your bundler. When you edit the selection of a view, components using that view will suspend, fetch the missing data, and then resume rendering._\n\n### Type Safety and Data Masking\n\nfate provides guarantees through TypeScript and during runtime that prevent you from accessing data that wasn't selected in a component. This ensures that you declare all the data dependencies at the right level in your component tree, and prevents accidental coupling between components.\n\nIn the below example, we forgot to select the `content` of a `Post`. As a result, type-checks fail and the `content` field is undefined during runtime:\n\n```tsx\nconst PostView = view<Post>()({\n  id: true,\n  title: true,\n  // `content: true` is omitted.\n});\n\nconst PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      {/* TypeScript errors here, and `post.content` is undefined during runtime */}\n      <p>{post.content}</p>\n    </Card>\n  );\n};\n```\n\nViews can only be resolved against refs that include that view directly or via view spreads. If a component tries to resolve a view against a ref that isn't linked, it will throw an error during runtime:\n\n```tsx\nconst PostDetailView = view<Post>()({\n  content: true,\n});\n\nconst AnotherPostView = view<Post>()({\n  content: true,\n});\n\nconst PostView = view<Post>()({\n  id: true,\n  title: true,\n  ...AnotherPostView,\n});\n\nconst PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useView(PostView, postRef);\n  return <PostDetail post={post} />;\n};\n\nconst PostDetail = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  // This throws because the post reference passed into this component\n  // is of type `AnotherPostView`, not `PostDetailView`.\n  const post = useView(PostDetailView, postRef);\n};\n```\n\nViewRefs carry a set of view names they can resolve. `useView` throws if a ref does not include the required view.\n\n### Parameters and Conditional Selections\n\nA view can take parameters. Define the selection with a function, then bind its parameters where you request or compose the view:\n\n```tsx\nimport { alias, useRequest, useView, view, when, type ViewRef } from 'react-fate';\nimport type { User } from '@your-org/server/views';\n\nconst AccountView = view<User>()({ email: true });\n\nconst ProfileView = view<User>()(({ isViewer }: { isViewer: boolean }) => ({\n  name: true,\n  account: when(isViewer, alias(AccountView)),\n}));\n\nfunction Profile({ userId, isViewer }: { userId: string; isViewer: boolean }) {\n  const { user } = useRequest({\n    user: { id: userId, view: ProfileView({ isViewer }) },\n  });\n  const profile = useView(ProfileView, user);\n  const account = useView(AccountView, profile.account);\n\n  return (\n    <div>\n      <h2>{profile.name}</h2>\n      {account && <p>{account.email}</p>}\n    </div>\n  );\n}\n```\n\n`alias(AccountView)` gives the selection a named ref to the **same User**. The name `account` belongs to your result; it does not need to exist in the server schema. Read the ref with `useView` to access the fragment's selected fields. The existing `alias('field', selection)` form still selects a schema field under another name.\n\n`when(condition, selection)` works with named fragments and ordinary fields:\n\n```tsx\nconst ProfileView = view<User>()(({ isViewer }: { isViewer: boolean }) => ({\n  name: true,\n  email: when(isViewer, true),\n}));\n```\n\nA false condition returns `undefined` and excludes that branch from fetching and subscriptions, even if its data is already cached. A selected field whose server value is `null` still returns `null`. TypeScript preserves that distinction: a boolean condition adds `undefined` to the result type; literal `true` keeps the selected type; literal `false` produces `undefined`.\n\nBoth `useView` and `useLiveView` accept `undefined` refs and return `undefined` without fetching or subscribing. Call the hooks unconditionally, as in the example above.\n\n#### Carrying Parameters with Refs\n\nBindings travel with refs. Child components read the view definition without reconstructing its parameters:\n\n```tsx\nconst LocalizedNameView = view<User>()(({ locale }: { locale: string }) => ({\n  name: { args: { locale } },\n}));\n\nconst NamesView = view<User>()({\n  english: alias(LocalizedNameView({ locale: 'en' })),\n  japanese: alias(LocalizedNameView({ locale: 'ja' })),\n});\n\nfunction Names({ user }: { user: ViewRef<'User'> }) {\n  const names = useView(NamesView, user);\n  const english = useView(LocalizedNameView, names.english);\n  const japanese = useView(LocalizedNameView, names.japanese);\n\n  return (\n    <p>\n      {english.name} / {japanese.name}\n    </p>\n  );\n}\n```\n\nThis example assumes the server's `name` field accepts a `locale` argument. The two refs identify the same entity with independent bindings. Connections inside named views likewise keep their own arguments and pagination state.\n\nDeclare view definitions at module scope. Binding an equivalent parameter object again preserves the logical request and ref identity; no `useMemo` is needed. Parameter objects use the same serializable values as field arguments, and fate snapshots them when binding. Keep selection functions pure, with all varying inputs passed as parameters.\n\nBind a parameterized definition before using it in a request, nested selection, alias, or spread. If a single ref contains multiple bindings of one definition, use named aliases to give each binding its own ref. Conditional anonymous spreads are not supported; use `when(condition, alias(View))` instead.\n\n#### Vue\n\nThe same `view`, `alias`, and `when` API is available from `vue-fate`. Pass reactive refs or getters to the view composables:\n\n```ts\nconst profile = useView(ProfileView, () => request.value?.user);\nconst account = useView(AccountView, () => profile.value?.account);\n```\n\nWhen the ref is `undefined`, the resource's value and `ready()` result are `undefined`, and the view has no active subscriptions.\n\n## Requests\n\n### Requesting Lists\n\nThe `useRequest` hook can be used to declare our data needs for a specific screen or component tree. At the root of our app, we can request a list of posts like this:\n\n```tsx\nimport { useRequest } from 'react-fate';\nimport { PostCard, PostView } from './PostCard.tsx';\n\nexport function App() {\n  const { posts } = useRequest({ posts: { list: PostView } });\n  return posts.map((post) => <PostCard key={post.id} post={post} />);\n}\n```\n\nThis component suspends or throws errors, which bubble up to the nearest error boundary. Wrap your component tree with `ErrorBoundary` and `Suspense` components to show error and loading states:\n\n```tsx\n<ErrorBoundary FallbackComponent={ErrorComponent}>\n  <Suspense fallback={<div>Loading…</div>}>\n    <App />\n  </Suspense>\n</ErrorBoundary>\n```\n\n> [!NOTE]\n>\n> `useRequest` may issue multiple operations in the same render pass. fate transports can batch those operations into fewer network requests: the native HTTP transport batches same-microtask operations into one `POST /fate` request, and the tRPC adapter can use tRPC's [HTTP Batch Link](https://trpc.io/docs/client/links/httpBatchLink).\n\n### Requesting Objects by ID\n\nIf you want to fetch data for a single object instead of a list, you can specify the `id` and the associated `view` like this:\n\n```tsx\nconst { post } = useRequest({\n  post: { id: '12', view: PostView },\n});\n```\n\nIf you want to fetch multiple objects by their IDs, you can use the `ids` field:\n\n```tsx\nconst { posts } = useRequest({\n  posts: { ids: ['6', '7'], view: PostView },\n});\n```\n\n### Other Types of Requests\n\nFor any other queries, pass only the `type` and `view`:\n\n```tsx\nconst { viewer } = useRequest({\n  viewer: { view: UserView },\n});\n```\n\n### Request Arguments\n\nYou can pass arguments to `useRequest` calls. This is useful for pagination, filtering, or sorting. For example, to fetch the first 10 posts, you can do the following:\n\n```tsx\nconst { posts } = useRequest({\n  posts: {\n    args: { first: 10 },\n    list: PostView,\n  },\n});\n```\n\nRequest arguments are part of the cache key. Two list requests for the same root with different filters or sorting arguments keep separate list state, and cursor arguments are merged into the same list when you load more pages. The selected view is part of the key as well: requesting `PostCardView` and `PostDetailView` can share normalized records, but fate still tracks whether the specific fields for each request are present.\n\n### Request Modes\n\n`useRequest` supports different request modes to control caching and data freshness. The available modes are:\n\n- `cache-first` (_default_): Returns data from the cache if available, otherwise fetches from the network.\n- `stale-while-revalidate`: Returns data from the cache and simultaneously fetches fresh data from the network.\n- `network-only`: Always fetches data from the network, bypassing the cache.\n\nYou can pass the request mode as an option to `useRequest`:\n\n```tsx\nconst { posts } = useRequest(\n  {\n    posts: { list: PostView },\n  },\n  {\n    mode: 'stale-while-revalidate',\n  },\n);\n```\n\n### Cache Lifetime\n\nfate stores records in a normalized cache keyed by `__typename` and `id`. Lists and root queries point at those records, and views read from the normalized cache. When a `useRequest` call is mounted, fate retains the request so the records and lists needed by that screen stay in memory. When the component unmounts, the request is released and fate schedules garbage collection.\n\nReleased requests are kept in a small release buffer before their data becomes collectible. This makes common route transitions cheap: navigating away from a screen and quickly coming back usually reuses the cached records instead of refetching them. The default release buffer stores the 10 most recently released requests.\n\nYou can tune the buffer when creating the client:\n\n```tsx\nconst fate = createClient({\n  gcReleaseBufferSize: 20,\n  roots,\n  transport,\n  types,\n});\n```\n\nSet `gcReleaseBufferSize` to `0` in tests or very memory-sensitive environments when released screens should be collected immediately.\n\n`cache-first` request handles are stable while their request is cached. If garbage collection later removes the data for a fulfilled request, the next `cache-first` request automatically fetches it again rather than returning stale references.\n\nIf you call `fate.request(...)` outside React and need the result to stay in memory across manual `gc()` calls, retain the same request for the lifetime of that work:\n\n```tsx\nconst request = { posts: { list: PostView } };\nconst retained = fate.retain(request);\n\ntry {\n  const { posts } = await fate.request(request);\n  // Use posts while this request is retained.\n} finally {\n  retained.dispose();\n}\n```\n\nGarbage collection waits for active optimistic updates to settle before sweeping records. This keeps temporary optimistic records and their list positions stable while mutations are still pending.\n\n### SSR and Hydration\n\nCreate a request-scoped fate client on the server, preload the route data, and dehydrate its normalized cache:\n\n```tsx\nconst fate = createFateClient();\nawait fate.request({ post: { id: '12', view: PostView } });\n\nreturn {\n  fate: fate.dehydrate(),\n};\n```\n\nTransport the returned value through your framework's loader serialization, React Server Component props, or a safely escaped JSON bootstrap script. The snapshot contains plain serializable values, so serializers such as Seroval can carry it without fate-specific integration. Treat the snapshot as opaque: hydrate it through fate rather than reading or editing its internal data.\n\nOn the browser, hydrate the new client before rendering components that call `useRequest`:\n\n```tsx\nconst fate = createFateClient();\nfate.hydrate(loaderData.fate);\n\nhydrateRoot(\n  document,\n  <FateClient client={fate}>\n    <App />\n  </FateClient>,\n);\n```\n\nHydrated `cache-first` requests resolve from the normalized cache without refetching. Hydration restores records, selected-field coverage, root queries, and list pagination state. It intentionally does not restore active requests, subscriptions, retainers, timers, or optimistic mutation state.\n\nSnapshots carry a hydration scope and are rejected by clients with a different scope. Generated clients set a stable scope automatically. When constructing a client directly, pass `hydrationScope` and rotate it when deploying an incompatible cache schema or when separating cache namespaces:\n\n```tsx\nconst fate = createClient({\n  hydrationScope: 'storefront-v2',\n  // ...\n});\n```\n\nUse `hydrationLimits` when an application needs stricter bootstrap payload limits. fate applies conservative defaults for total encoded values, collection sizes, and string lengths.\n\nBy default, hydration preserves values already present in the browser cache while adding missing server data. Pass `{ merge: 'replace' }` only when the snapshot should authoritatively reset the durable cache:\n\n```tsx\nfate.hydrate(loaderData.fate, { merge: 'replace' });\n```\n\n`preserve-existing` recursively combines plain scalar objects while keeping browser values on conflicts. Arrays, dates, entity references, and list windows are atomic: an existing browser value wins as a whole. Replaying a snapshot is safe and does not notify subscribers when durable cache state is unchanged.\n\nDo not reuse request-scoped snapshots across users. Dehydrate after awaited route preloading: snapshots are point-in-time values and do not stream cache patches for data that resolves later. Hydration and dehydration reject clients with in-flight requests, so hydrate the initial snapshot before rendering.\n\n### Observing Request State\n\nReact's `useRequestState(request, options)` observes a request without suspending.\nIt returns `status`, `data`, `error`, and `isFetching`. Status is `pending`, `ready`,\nor `error` for an enabled network request. An initial failure exposes the original\nerror rather than throwing during render. Request data contains the same refs as\n`useRequest`; resolve them with `useView`.\n\nUse `{ enabled: false }` for an empty search or an inactive screen. The status is\n`disabled`, data is undefined, and no request starts. Changing `enabled` to true\nstarts the request. Equivalent inline request objects do not cause repeat fetches.\n\nUse `{ mode: 'cache-only' }` to observe already-cached data. A complete selection\nhas status `ready`; an incomplete selection has status `missing` and undefined\ndata. A successful nullable root remains `ready` with a null value. Cache-only\nrequests never fetch, and their view refs cannot fetch missing fields either.\nMounted observers retain their request's records until unmount.\n\nOutside React, `client.observeRequest(request, options)` exposes `getSnapshot()`\nand `subscribe(listener)`. The first subscriber starts an enabled request;\nunsubscribing releases its retention. Reading a snapshot alone never starts work.\n\nEvery request state includes a stable `refetch()` function. It forces a network\nrequest, returns a promise for the completed result, and rejects with the original\nerror on failure. Concurrent calls share pending work. During refresh, complete\ncached data stays available with `status: 'ready'` and `isFetching: true`. A failed\nrefresh keeps that data and exposes `error`; the next attempt clears the error.\n`stale-while-revalidate` observers track the entire background request the same\nway, including failures. Disabled and cache-only observers reject explicit\nrefetches without fetching; enable the request or change its mode first.\n\n```ts\nconst state = useRequestState(request, { mode: 'stale-while-revalidate' });\n// Render state.data, state.isFetching, and state.error independently.\nawait state.refetch(); // Also usable from a refresh button or retry action.\n```\n\nOverlapping reads use their network start order when normalizing responses. An\nolder response cannot overwrite a field already supplied by a newer response or\na later confirmed write. It may still fill other fields. Root results and list\nreplacements also retain the newer result. Optimistic layers remain visible over\nincoming confirmed data; rolling them back reveals that data, while committing a\nmutation protects its confirmed fields from older requests.\n\n#### Aliases\n\nUse `alias(sourceField, selection)` to select one schema field under multiple\nresult names, with independent arguments:\n\n```ts\nconst GamesView = view<User>()({\n  activeGames: alias('games', {\n    args: { first: 20, status: 'Active' },\n    items: { node: GameView },\n    pagination: { hasNext: true, nextCursor: true },\n  }),\n  waitingGames: alias('games', {\n    args: { first: 20, status: 'Waiting' },\n    items: { node: GameView },\n  }),\n  displayName: alias('name', true),\n});\n\nconst request = { currentUser: alias('viewer', { view: GamesView }) };\n```\n\nSource fields, nested selections, result types, and generated root argument\ncontracts remain checked. Alias names affect the returned shape; normalized\nidentity uses the source field and its arguments. An ordinary selection with the\nsame arguments shares the cached data. Connection filters identify separate\ncache slots and pagination state. Conflicting response names or arguments in a\ncomposed view fail during planning. `id` and `__typename` are reserved result\nnames because fate needs them for entity identity.\n\nGraphQL emits native aliases, including inside mutation selections, so multiple\nvariants execute in one operation. Native HTTP, tRPC, and custom transports\nreceive compatible reads with ordinary schema field names; conflicting variants\nmay require multiple reads or subscriptions. These fallback reads are independent\nserver operations. A mutation that needs multiple variants requires native alias\nsupport and otherwise rejects before executing. A simple rename is lowered for\nnative mutations without repeating the action.\n\nCustom transports can set `supportsAliases: true` to handle the full selection in\none operation. Selection path segments and corresponding argument keys then use\n`resultName:schemaField`, and returned records must use those same encoded keys.\nGraphQL performs that conversion automatically. Applications consume the declared\nresult names, never the encoded transport names.\n\n## Deferred Views\n\nUse `defer` when a field should not block the parent view. The parent view receives a deferred handle immediately after the eager fields are available, and the component that reads that handle with `useView`, `useListView`, or `useLiveListView` decides which `Suspense` boundary handles the loading state.\n\n```tsx\nimport { Suspense } from 'react';\nimport { defer, useListView, useView, view, Deferred, ViewRef } from 'react-fate';\n\nconst CommentView = view<Comment>()({\n  content: true,\n  id: true,\n});\n\nconst CommentConnectionView = {\n  args: { first: 3 },\n  items: { node: CommentView },\n};\n\nconst PostView = view<Post>()({\n  comments: defer(CommentConnectionView),\n  content: true,\n  id: true,\n  title: true,\n});\n\nfunction PostCard({ post: postRef }: { post: ViewRef<'Post'> }) {\n  const post = useView(PostView, postRef);\n\n  return (\n    <article>\n      <h2>{post.title}</h2>\n      <p>{post.content}</p>\n      <Suspense fallback={<CommentsSkeleton />}>\n        <PostComments comments={post.comments} />\n      </Suspense>\n    </article>\n  );\n}\n\nfunction PostComments({\n  comments,\n}: {\n  comments: Deferred<{ items: ReadonlyArray<{ node: ViewRef<'Comment'> }> }>;\n}) {\n  const [items, loadNext] = useListView(CommentConnectionView, comments);\n\n  return (\n    <section>\n      {items.map(({ node }) => (\n        <CommentCard comment={node} key={node.id} />\n      ))}\n      {loadNext ? <button onClick={loadNext}>Load more</button> : null}\n    </section>\n  );\n}\n```\n\nDeferred fields are not optional data. They are explicit handles that existing view APIs can read. If the deferred selection is missing from the normalized cache, fate fetches only that missing selection and suspends the component that tried to resolve it.\n\nThis keeps parent components simple: eager fields like `title` and `content` are available when `useView(PostView, postRef)` returns, while slower or secondary fields such as `comments` can load under their own boundary.\n\nGraphQL transports use the same client semantics today. The deferred field is omitted from the eager request and fetched when the deferred handle is resolved. GraphQL `@defer` is the natural transport representation for this feature, but consuming incremental multipart patches requires additional transport support before fate can safely normalize streamed patches from a single GraphQL response.\n\n## List Views\n\n### Pagination with `useListView`\n\nYou can wrap a list of references using `useListView` to enable connection-style lists with pagination support.\n\nFor example, you can define a `CommentView` and reuse it inside of a `CommentConnectionView`:\n\n```tsx\nimport { useListView, ViewRef } from 'react-fate';\n\nconst CommentView = view<Comment>()({\n  content: true,\n  id: true,\n});\n\nconst CommentConnectionView = {\n  args: { first: 10 },\n  items: {\n    node: CommentView,\n  },\n};\n\nconst PostView = view<Post>()({\n  comments: CommentConnectionView,\n});\n```\n\nNow you can apply the `useListView` hook inside of your `PostCard` component to read the list of comments and load more comments when needed:\n\n```tsx\nexport function PostCard({ detail, post: postRef }: { detail?: boolean; post: ViewRef<'Post'> }) {\n  const post = useView(PostView, postRef);\n  const [comments, loadNext] = useListView(CommentConnectionView, post.comments);\n\n  return (\n    <div>\n      {comments.map(({ node }) => (\n        <CommentCard comment={node} key={node.id} post={post} />\n      ))}\n      {loadNext ? (\n        <Button onClick={loadNext} variant=\"ghost\">\n          Load more comments\n        </Button>\n      ) : null}\n    </div>\n  );\n}\n```\n\nIf `loadNext` is undefined, it means there are no more comments to load. If you want to instead load previous comments, you can use the third argument returned by `useListView`, which is `loadPrevious`. Similarly, if there are no previous comments to load, `loadPrevious` will be undefined.\n\n### Pagination Arguments\n\nConnection views can define default arguments, and `useListView` carries those arguments forward when loading more pages:\n\n```tsx\nconst CommentConnectionView = {\n  args: { first: 10 },\n  items: {\n    cursor: true,\n    node: CommentView,\n  },\n  pagination: {\n    hasNext: true,\n    hasPrevious: true,\n    nextCursor: true,\n    previousCursor: true,\n  },\n};\n```\n\nWhen `loadNext` runs, fate sends the next cursor as `after` and keeps the page size in `first`. When `loadPrevious` runs, fate sends the previous cursor as `before` and uses `last` for the page size. This lets the server distinguish forward and backward pagination while keeping the component API small.\n\nAdditional arguments on a root request are scoped to that root list:\n\n```tsx\nconst { posts } = useRequest({\n  posts: {\n    args: { categoryId: category.id, first: 20 },\n    list: PostConnectionView,\n  },\n});\n```\n\nThe `categoryId` list above has its own cache entry and pagination state. Loading another page for that list does not update a different `posts` request with another category or search query.\n\n## Live Views\n\n`useLiveView` resolves a `ViewRef` just like `useView`, but also keeps the selected object up to date through the native live SSE transport.\n\n```tsx\nimport { useLiveView, ViewRef } from 'react-fate';\n\nexport const PostCard = ({ post: postRef }: { post: ViewRef<'Post'> }) => {\n  const post = useLiveView(PostView, postRef);\n\n  return (\n    <Card>\n      <h2>{post.title}</h2>\n      {/* Updates automatically! */}\n      <p>{post.likes} likes</p>\n    </Card>\n  );\n};\n```\n\nThe API mirrors `useView`: pass a view and a ref, and get back the same masked data shape. A `null` ref returns `null` and does not subscribe.\n\n### How Live Updates Work\n\nThe native HTTP transport opens one Server-Sent Events (SSE) connection per fate client. When components mount or unmount live views, the client sends subscribe and unsubscribe control messages to the server. The server keeps those selections on the connection and sends updates only for records that connection subscribed to.\n\nWhen the server sends an update, fate normalizes the selected record into the same cache used by requests, actions, and mutations. Components that read affected fields re-render automatically.\n\nFor example, if `PostView` selects `likes`, a live update that changes `likes` re-renders the `PostCard`. If another component only selected `title`, it does not re-render for a `likes` change.\n\nLive deletion events remove the record from the normalized cache in the same way as mutations, and any lists or object fields that reference it are pruned.\n\n### Client Setup\n\nConfigure the native transport and point the client at your fate endpoint:\n\n```tsx\nimport { FateClient } from 'react-fate';\nimport { createFateClient } from 'react-fate/client';\n\nexport function App() {\n  const fate = useMemo(\n    () =>\n      createFateClient({\n        fetch: (input, init) =>\n          fetch(input, {\n            ...init,\n            credentials: 'include',\n          }),\n        url: `${env('SERVER_URL')}/fate`,\n      }),\n    [],\n  );\n\n  return <FateClient client={fate}>{/* Components go here */}</FateClient>;\n}\n```\n\n> [!NOTE]\n>\n> Live views use `GET /fate/live` for the single SSE stream and `POST /fate/live` for subscribe/unsubscribe control messages.\n\n### Server Setup\n\nLive views use an event bus. By default, the bus signals that an object changed and fate refetches the selected object through the same data view pipeline used by `byId` queries before sending it to the client. Update events can also include changed field paths so fate only resolves the intersection of those paths and each active subscription.\n\nPass a live event bus to `createFateServer` and expose the native handler:\n\n```tsx\nimport { createFateServer, createHonoFateHandler, createLiveEventBus } from '@nkzw/fate/server';\nimport type { AppContext } from './context.ts';\nimport { sources } from './sources.ts';\nimport { Root } from './views.ts';\n\nexport const live = createLiveEventBus();\n\nexport const fate = createFateServer<AppContext>({\n  live,\n  roots: Root,\n  sources,\n});\n\napp.all('/fate/*', createHonoFateHandler(fate));\n```\n\nfate keeps a bounded in-memory queue for each native SSE connection while live events are waiting to be resolved and sent. The default limit is `1000` queued events per connection. If a client falls behind and exceeds the limit, fate closes that live connection so server memory cannot grow without bound. You can tune the limit by passing the object form:\n\n```tsx\nexport const fate = createFateServer<AppContext>({\n  live: {\n    bus: live,\n    maxQueueSize: 500,\n  },\n  roots: Root,\n  sources,\n});\n```\n\nOnce this is in place, components can switch from `useView` to `useLiveView` without changing their view definitions or return types.\n\n### Live List Views\n\n`useLiveListView` mirrors `useListView`, but subscribes to live connection events for the connection it receives:\n\n```tsx\nimport { useLiveListView, useLiveView, ViewRef } from 'react-fate';\n\nexport function PostCard({ post: postRef }: { post: ViewRef<'Post'> }) {\n  const post = useLiveView(PostView, postRef);\n  const [comments, loadNext] = useLiveListView(CommentConnectionView, post.comments);\n\n  return (\n    <>\n      {comments.map(({ node }) => (\n        <CommentCard comment={node} key={node.id} />\n      ))}\n      {loadNext ? <button onClick={loadNext}>Load more</button> : null}\n    </>\n  );\n}\n```\n\nThe hook returns the same tuple as `useListView`: items, `loadNext`, and `loadPrevious`. Live events append, prepend, insert, or delete edges from one connection without deleting the underlying records.\n\nBy default, live appends and prepends respect pagination boundaries. If the relevant edge still has more pages, fate keeps the incoming node attached to that edge instead of expanding the loaded window. For chat or activity streams where new items should keep appearing immediately, opt into visible live insertion on the connection view:\n\n```tsx\nconst MessageConnectionView = {\n  args: { first: 30 },\n  items: {\n    node: MessageView,\n  },\n  live: {\n    append: 'visible',\n  },\n};\n```\n\nEmit connection events on the server when list membership changes:\n\n```tsx\nlive.connection('Post.comments', { id: postId }).prependNode('Comment', comment.id);\nlive.connection('Post.comments', { id: postId }).deleteEdge('Comment', comment.id);\n```\n\nFor root lists, use the generated root procedure name:\n\n```tsx\nlive.connection('posts', { categoryId }).prependNode('Post', post.id);\n```\n\nIf the changed list cannot be described precisely, invalidate the active connection and fate will refetch it:\n\n```tsx\nlive.connection('posts', { categoryId }).invalidate();\n```\n\nConnection identity follows Relay's model: pagination args like `first`, `last`, `after`, and `before` are ignored for live connection matching, while filter args such as `categoryId` are part of the identity.\n\n### Emitting Events\n\nAfter a mutation changes an object, emit an update event for that object:\n\n```tsx\nexport const postRouter = router({\n  ...fate.procedures({\n    view: postDataView,\n  }),\n  like: procedure.input(likeInput).mutation(async ({ ctx, input }) => {\n    const post = await ctx.prisma.post.update({\n      data: {\n        likes: {\n          increment: 1,\n        },\n      },\n      where: { id: input.id },\n    });\n\n    live.update('Post', input.id);\n\n    return post;\n  }),\n});\n```\n\nThis tells fate that the `Post` changed. Every active live view for that post refreshes using the selection it subscribed with.\n\nIf you know which fields changed, pass them with `changed` to reduce the amount of data sent to each subscriber:\n\n```tsx\nlive.update('Post', input.id, { changed: ['likes'] });\n```\n\nWith this version, a live view that selected `likes` refreshes only `likes`, while a live view that only selected unrelated fields is skipped entirely.\n\nIf a mutation changes a related object, emit for the object whose live view should refresh. For example, adding a comment usually changes the post's `commentCount` and `comments` list, so emit for the `Post`:\n\n```tsx\nexport const commentRouter = router({\n  add: procedure.input(addCommentInput).mutation(async ({ ctx, input }) => {\n    const comment = await ctx.prisma.comment.create({\n      data: {\n        content: input.content,\n        postId: input.postId,\n      },\n    });\n\n    live.update('Post', input.postId, { changed: ['commentCount', 'comments'] });\n\n    return comment;\n  }),\n});\n```\n\nFor deletions, emit a delete event for the deleted object if clients may be subscribed to it:\n\n```tsx\nlive.delete('Comment', input.id);\n```\n\nIf deleting the object also changes another object, emit an update for that object too:\n\n```tsx\nlive.update('Post', postId, { changed: ['commentCount', 'comments'] });\n```\n\nYou can pass an `eventId` when emitting. fate sends it on the native SSE event and includes the last received event ID when it resubscribes after a reconnect:\n\n```tsx\nlive.update('Post', input.id, {\n  changed: ['likes'],\n  eventId: `post:${input.id}:${Date.now()}`,\n});\n```\n\nThe default `createLiveEventBus` is an in-memory fanout bus and does not replay events that were emitted while a client was disconnected. Use a durable custom live bus if your deployment needs reconnects to catch up from `lastEventId`; otherwise the client receives future live events after it reconnects.\n\n### Error Handling\n\nLive subscription errors are reported out of band. They do not replace the last cached data or throw through the component that called `useLiveView`.\n\nPass `onLiveError` when creating the client to send those failures to your logger or monitoring system:\n\n```tsx\nconst fate = createFateClient({\n  fetch: (input, init) =>\n    fetch(input, {\n      ...init,\n      credentials: 'include',\n    }),\n  onLiveError(error) {\n    captureException(error);\n  },\n  url: `${env('SERVER_URL')}/fate`,\n});\n```\n\nThe handler runs in a microtask after the subscription reports the error. Components continue to read whatever data is currently available in the fate cache.\n\n## Actions\n\nfate does not provide hooks for mutations like traditional data fetching libraries do. Instead, mutations are exposed in two ways:\n\n- `fate.actions` for use with [`useActionState`](https://react.dev/reference/react/useActionState) and React Actions.\n- `fate.mutations` for traditional imperative mutation calls.\n\nServer mutations are exposed automatically as actions and mutations by fate's Vite plugin. The transport determines where those mutations are declared:\n\n- With the [native HTTP transport](/docs/integrations/server.md#native-fate-protocol), mutations come from the `mutations` object passed to `createFateServer`.\n- With the [tRPC adapter](/docs/integrations/server.md#trpc-fate-setup), mutations come from tRPC mutation procedures exposed through your fate-enabled router.\n- With [Void](/docs/integrations/void.md), mutations use the same native fate server shape and are exposed through the Void route helpers.\n\nIf you have a mutation named `post.like`, a `LikeButton` component using fate Actions and an async component library could look like this:\n\n```tsx\nimport { useActionState } from 'react';\nimport { useFateClient } from 'react-fate';\n\nconst LikeButton = ({ post }: { post: { id: string; likes: number } }) => {\n  const fate = useFateClient();\n  const [result, like] = useActionState(fate.actions.post.like, null);\n\n  return (\n    <Button action={() => like({ input: { id: post.id } })}>\n      {result?.error ? 'Oops!' : 'Like'}\n    </Button>\n  );\n};\n```\n\nIf you are not using an async component library, you can use React's `useTransition` to start the action in a transition:\n\n```tsx\nconst LikeButton = ({ post }: { post: { id: string; likes: number } }) => {\n  const fate = useFateClient();\n  const [, startTransition] = useTransition();\n  const [result, like, isPending] = useActionState(fate.actions.post.like, null);\n\n  return (\n    <button\n      disabled={isPending}\n      onClick={() => {\n        startTransition(() =>\n          like({\n            input: { id: post.id },\n          }),\n        );\n      }}\n    >\n      {result?.error ? 'Oops!' : 'Like'}\n    </button>\n  );\n};\n```\n\nBy using `useActionState`, fate Actions integrate with Suspense and concurrent rendering.\n\n### Optimistic Updates\n\nfate Actions support optimistic updates out of the box. For example, to update the post's like count optimistically, you can pass an `optimistic` object to the action call. This will immediately update the cache with the new like count and re-render all views that select the `likes` field:\n\n```tsx\nlike({\n  input: { id: post.id },\n  optimistic: { likes: post.likes + 1 },\n});\n```\n\nWhen data changes through optimistic updates or otherwise, fate only re-renders the views that select the changed fields. In the above example, only views that select the `likes` field will re-render. If a view only selects the `title` field, it won't re-render when the `likes` field changes.\n\nIf a mutation fails, the cache will be rolled back to its previous state and any views depending on the mutated data will be updated.\n\n### Inserting New Objects\n\nWhen a mutation inserts a new object, you can provide an optimistic object with a temporary ID to represent the new object in the cache until the server responds with the actual ID. For example, to add a new comment to a post optimistically, you can do the following:\n\n```tsx\nconst content = 'New Comment text';\naddComment({\n  input: { content, postId: post.id },\n  optimistic: {\n    author: { id: user.id, name: user.name },\n    content,\n    id: `optimistic:${Date.now().toString(36)}`,\n    post: { commentCount: post.commentCount + 1, id: post.id },\n  },\n});\n```\n\nBy default, fate inserts new records after existing items in matching root lists and nested lists. For a newest-first list, pass `insert: 'before'` so optimistic records appear at the beginning:\n\n```tsx\naddComment({\n  input: { content, postId: post.id },\n  insert: 'before',\n  optimistic: {\n    content,\n    id: `optimistic:${Date.now().toString(36)}`,\n    post: { id: post.id },\n  },\n});\n```\n\nInsertion respects pagination boundaries. If you append to a list that still has a next page, fate keeps the new record attached to the unresolved trailing edge instead of mixing it into the loaded page. As you load more pages, the inserted record stays at the end until the server returns the canonical item or the list reaches the edge. The same behavior applies to prepends while `hasPrevious` is true.\n\nMultiple pending optimistic inserts keep their visible order. For example, two `insert: 'before'` calls on a newest-first feed show the second optimistic item before the first, matching what users expect from newly created content.\n\n### Selecting a View with Actions\n\nMutations may change data that is not directly specified in the mutation result. For example, adding a comment increases the post's comment count. For such cases, you can provide a `view` to an action that specifies which fields to fetch as part of the mutation:\n\n```tsx\naddComment({\n  input: { content: 'New Comment text', postId: post.id },\n  view: view<Comment>()({\n    ...CommentView,\n    post: { commentCount: true },\n  }),\n});\n```\n\nThe server will return the selected fields and fate updates the cache and re-renders all views that depend on the changed data. The action result contains the newly added comment with the selected fields:\n\n```tsx\nconst [result, addComment] = useActionState(fate.actions.comment.add, null);\n\nconst newComment = result?.result;\nif (newComment) {\n  // All the fields selected in the view are available on `newComment`:\n  console.log(newComment.post.commentCount);\n}\n```\n\n### Mutations\n\nfate Actions are the recommended way to execute server mutations in React components. However, there are cases where you might want to call mutations imperatively, outside of React components, or without waiting for previous actions to finish like `useActionState` does. For such cases, you can use `fate.mutations` to call mutations imperatively:\n\n```tsx\nconst result = await fate.mutations.comment.add({\n  input: { content, postId: post.id },\n});\n```\n\nYou can call mutations from anywhere, and without waiting for previous mutations to finish. The mutation API matches the API of fate Actions, including optimistic updates and view selection. With mutations, you'll need to handle loading states and errors manually, and the result is returned as a promise.\n\n### Mutation Server Implementation\n\nfate Actions & Mutations are backed by regular server mutations. If you already know how your fate server is wired, the client-side API above is the same regardless of transport. If not, start with the server setup for your environment:\n\n- [Native HTTP custom mutations](/docs/integrations/server.md#custom-mutations) use `createFateServer({ mutations })`.\n- [tRPC fate setup](/docs/integrations/server.md#trpc-fate-setup) wires fate into your tRPC router; custom writes can use the same `fate.createPlan` and `fate.resolveById` helpers shown there.\n- [Void integration](/docs/integrations/void.md) exposes a native fate server from Void routes; define mutations with the native `createFateServer({ mutations })` API and serve them through `defineVoidFateRoute`.\n\nHere is a native HTTP mutation for `post.like`:\n\n```tsx\nexport const fate = createFateServer({\n  mutations: {\n    'post.like': {\n      input: likeInput,\n      resolve: async ({ ctx, input, select }) => {\n        await ctx.prisma.post.update({\n          data: {\n            likes: {\n              increment: 1,\n            },\n          },\n          where: { id: input.id },\n        });\n\n        return sources.resolveById({\n          ctx,\n          id: input.id,\n          input: { select },\n          view: postDataView,\n        });\n      },\n      type: 'Post',\n    },\n  },\n  roots: Root,\n  sources,\n});\n```\n\nThe equivalent tRPC mutation lives in your router and returns the selected shape that the client asked for:\n\n```tsx\nimport { z } from 'zod';\nimport { connectionArgs, createResolver } from '@nkzw/fate/server';\nimport { procedure, router } from '../init.ts';\nimport { postDataView, PostItem } from '../views.ts';\n\nexport const postRouter = router({\n  like: procedure\n    .input(\n      z.object({\n        args: connectionArgs,\n        id: z.string().min(1, 'Post id is required.'),\n        select: z.array(z.string()),\n      }),\n    )\n    .mutation(async ({ ctx, input }) => {\n      const { resolve, select } = createResolver({\n        ...input,\n        ctx,\n        view: postDataView,\n      });\n\n      return resolve(\n        await ctx.prisma.post.update({\n          data: {\n            likes: {\n              increment: 1,\n            },\n          },\n          select,\n          where: { id: input.id },\n        } as PostUpdateArgs),\n      );\n    }),\n});\n```\n\nSee [Server Integration](/docs/integrations/server.md) for complete native HTTP and tRPC setup examples, and [Void Integration](/docs/integrations/void.md) for route helpers when your app runs on Void.\n\n### Action & Mutation Error Handling\n\nfate Actions & Mutations separate error handling into two scopes: \"call site\" and \"boundary\". Call site errors are expected to be handled at the location where the action or mutation is called. Boundary errors are unexpected errors that should be handled by a higher-level error boundary.\n\nIf your server returns a `NOT_FOUND` error with code `404`, the result of an Action or Mutation will contain an error object that you can handle at the call site:\n\n```tsx\nconst [result] = useActionState(fate.actions.post.delete, null);\n\nif (result?.error) {\n  if (result.error.code === 'NOT_FOUND') {\n    // Handle not found error at call site.\n  } else {\n    // Handle other *expected* errors.\n  }\n}\n```\n\nHowever, if an `INTERNAL_SERVER_ERROR` error with code `500` occurs, it will be thrown and can be caught by the nearest React error boundary:\n\n```tsx\n<ErrorBoundary FallbackComponent={ErrorComponent}>\n  <Suspense fallback={<div>Loading…</div>}>\n    <PostPage postId={postId} />\n  </Suspense>\n</ErrorBoundary>\n```\n\nYou can find the error classification behavior in [`mutation.ts`](https://github.com/nkzw-tech/fate/blob/main/packages/fate/src/mutation.ts#L227-L254).\n\n### Deleting Records\n\nWhen you want to delete a record using fate Actions, you can pass a `delete: true` flag to the action call. This flag removes the object from the cache and re-renders all views that depend on the deleted data:\n\n```tsx\nconst [result, deleteAction] = useActionState(fate.actions.post.delete, null);\n\ndeleteAction({\n  input: { id: post.id },\n  delete: true,\n});\n```\n\n### Resetting Action State\n\nWhen using `useActionState`, the result of the action is cached until the component using the action is unmounted. When a mutation fails with an error, you might want to clear the error state without invoking the action again. fate Actions take a `'reset'` token to reset the action state:\n\n```tsx\nconst [result, like] = useActionState(fate.actions.post.like, null);\n\nuseEffect(() => {\n  if (result?.error) {\n    // Reset the action state after 3 seconds.\n    const timeout = setTimeout(() => startTransition(() => like('reset')), 3000);\n    return () => clearTimeout(timeout);\n  }\n}, [like, result]);\n```\n\n### Controlling List Insertion Behavior\n\nWhen inserting new objects into lists, the default behavior is to append the new object to the list. You can provide an `insert` option with `before`, `after` or `none` values to customize this behavior and specify where the new object should be inserted in the list:\n\n```tsx\naddComment({\n  input: { content: 'New Comment text', postId: post.id },\n  insert: 'before', // Insert the new comment at the beginning of the list.\n});\n```\n\nOr, use the `none` option if you want to ignore inserting the new object into any lists:\n\n```tsx\naddComment({\n  input: { content: 'New Comment text', postId: post.id },\n  insert: 'none', // Do not insert the new comment into any lists.\n});\n```\n\n## Persistence\n\nfate can optionally keep data available across page reloads and save mutations while a user is offline. When the user comes back, their views can show previously loaded data and their pending changes continue where they left off.\n\nPersistence builds on fate's normalized cache, [Requests](/docs/guide/requests.md), and [Actions](/docs/guide/actions.md). You configure storage only once, without changing how you use fate.\n\n### Client Setup\n\nThe persistence layer is part of `@nkzw/fate`, with storage adapters installed separately. For a browser app using IndexedDB, add the adapter:\n\n```sh\nvp add @nkzw/fate-indexeddb\n```\n\nThen pass `persistence` when creating the client:\n\n```tsx\nimport { createPersistence } from '@nkzw/fate/persistence';\nimport { createIndexedDBStorage } from '@nkzw/fate-indexeddb';\nimport { createFateClient } from 'react-fate/client';\n\nconst fate = createFateClient({\n  persistence: createPersistence({\n    key: `workspace:${workspaceId}:user:${userId}`,\n    storage: createIndexedDBStorage(),\n  }),\n  url: '/api/fate',\n});\n```\n\nBy default, fate keeps loaded data for **one day**, with a storage budget of **25 MiB**. You can change both values:\n\n```tsx\npersistence: createPersistence({\n  key: `workspace:${workspaceId}:user:${userId}`,\n  maxAge: 24 * 60 * 60 * 1000,\n  maxBytes: 25 * 1024 * 1024,\n  storage: createIndexedDBStorage(),\n}),\n```\n\nCreate the browser client after you know which user is signed in. The `key` separates saved data and mutations by account and workspace, and must match the authenticated scope in the [server setup](#server-deduplication). When switching accounts, dispose the previous persistence session and create a new client with the new account's key.\n\n> [!NOTE]\n>\n> Persistence saves your app's data. To load the app itself while offline, you'll also need a service worker that makes its HTML, JavaScript, and other assets available. fate does not install a service worker or download pages the user hasn't visited.\n\n### Cache Lifetime\n\nYou can keep the data for a specific screen longer by passing `persist` to `useRequest`. For example, to keep a list of posts for three days:\n\n```tsx\nconst { posts } = useRequest(\n  {\n    posts: { list: PostView },\n  },\n  {\n    persist: { maxAge: 3 * 24 * 60 * 60 * 1000 },\n  },\n);\n```\n\nThe same option works with `fate.request(...)` and Vue's `useRequest`. If a screen uses several requests, set the option on each request whose data you want to keep longer.\n\nfate stores objects by their type and ID, just like the in-memory cache. If a post appears in both your feed and a detail screen, both requests share the same saved post. Each request describes which fields and related objects it needs, including list membership and pagination state.\n\nFor example, your feed might keep posts for one day, while the detail screen keeps them for three days. After one day, the fields needed by the detail screen remain available. Fields selected only by the feed can be removed. You don't need to coordinate separate copies of the same post or manually patch each request's cache.\n\n`maxAge` is measured in milliseconds from when the data was fetched successfully. Reading saved data or rendering the screen again does not restart that lifetime. If a request fetches one missing post, it only renews the data it fetched. Other posts already in the cache keep their original age. Changing a cached request's `maxAge` also uses the original fetch time.\n\nWhen callers share a pending request, the latest explicit `persist.maxAge` also applies to that request's eventual cache write.\n\nPass `persist: { maxAge: 0 }` to skip saving data for a request. Shared objects may still be saved for other requests, so this option does not delete all copies of an object.\n\nThe [in-memory garbage collector](/docs/guide/requests.md#cache-lifetime) continues to work independently. A post can be removed from memory while its saved copy remains available for a later visit. On startup, fate restores pending mutations, then loads saved data as requests need it. It does not load the entire saved cache into memory.\n\n### Refreshing Data\n\nKeeping data for three days doesn't mean waiting three days for updates. You can use the existing [request modes](/docs/guide/requests.md#request-modes) to choose when to fetch fresh data:\n\n- `cache-first` (_default_): Uses available saved data and fetches missing data from the network.\n- `stale-while-revalidate`: Shows saved data and refreshes it in the background. If the refresh fails, the saved data stays visible.\n- `network-only`: Requires a network response, even if saved data is available.\n\nFor example, to show the previous session's posts immediately and update them on reload:\n\n```tsx\nconst { posts } = useRequest(\n  {\n    posts: { list: PostView },\n  },\n  {\n    mode: 'stale-while-revalidate',\n    persist: { maxAge: 3 * 24 * 60 * 60 * 1000 },\n  },\n);\n```\n\nExpiration controls how long data stays in storage. It does not remove data from a mounted view or change the in-memory fetch policy. For ongoing server updates, use [Live Views](/docs/guide/live-views.md).\n\n### Cache Size\n\nWhen saved data reaches `maxBytes`, fate removes expired data first, then releases the least recently used requests until the new data fits. Objects still needed by another saved request remain available, and shared objects count toward the budget only once. A response that is too large to save can still be used in memory without removing other saved requests to make room for it.\n\nThe budget includes encoded data, keys, cache metadata, and the saved mutation queue. Your storage backend may use additional space for its own bookkeeping. `maxBytes` controls saved data; the existing garbage collector controls the lifetime of data in memory.\n\nfate batches cache writes and yields during large traversals and writes so other work on the page can continue. The mutation journal stores each entry separately and writes only changed entries, so confirming a mutation does not rewrite the entire queue. Changes to scalar fields write the affected record, while changes to relationships also update the saved data that depends on them.\n\nPending mutations are never removed to make room for cached data. If a new mutation cannot fit, it fails before fate applies its optimistic update or sends it to the server.\n\n> [!NOTE]\n>\n> Already accepted mutations must still be able to finish. Their recovery data and saved results can exceed the budget","readmeFilename":""}