{"_id":"unwrapped","_rev":"27-474ccb2b43a613e983b57cd09ce1e491","name":"unwrapped","dist-tags":{"latest":"0.1.25"},"versions":{"0.0.1":{"name":"unwrapped","version":"0.0.1","license":"MIT","_id":"unwrapped@0.0.1","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"b2e6e52b2a7efccef795a135c2c5c1fc042c6393","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.0.1.tgz","fileCount":12,"integrity":"sha512-Ym4iE+7h1QzVfAqfJvbRoWTp7OmQdVqLGAjKpw4cVVuiWzAonCaw2WtzSsiY+7MPOewO+zls+HxwYQ1aeQkDUA==","signatures":[{"sig":"MEQCIGBG1+Ag7175GykRB2c7mnwgbf6cudT66o+dDu6Z8kQ0AiBUQI+LZN0TJL+hI/z+tpRlQLPQTKoNBfZU/Emvwbo44A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4313},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"32a3dc90ac29a5ec385c6039bbdf763f7b03f677","scripts":{"lint":"tsc","build":"tsup index.ts --format cjs,esm --dts","release":"npm run build && changeset publish"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"10.9.0","description":"Library to deal with result types, both synchronous and asynchronous, along with utilities like caches","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.0.1_1762817569423_0.5975725615402725","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"unwrapped","version":"0.1.0","license":"MIT","_id":"unwrapped@0.1.0","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"f4ab7214189201576affe2f255c895e1f1bb0de7","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.0.tgz","fileCount":19,"integrity":"sha512-vr23LGgHs4Vhg9CpOBtqt8CfJUdnEIBngcrphhqg7Fpg7rB3ZwvUbomEvNAV+3OVTmCmXOVQwuKavT8/XVKnNw==","signatures":[{"sig":"MEYCIQCB4DL8n0f7jc1nSOY+e2KlxWOwcMKVqDy6BrN7u4tc0gIhAIgyu1iNd3KqZOgbaboOpNxKZWex4KZ7yJkTpUOdc7ww","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26638},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"723f5fb657472f4fd473809f79aed4de901736dd","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"Library to deal with result types, both synchronous and asynchronous, along with utilities like caches","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.0_1762852713374_0.6102809213815434","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"unwrapped","version":"0.1.1","license":"MIT","_id":"unwrapped@0.1.1","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"cee774f6f78fe0b2e7b14654e1e2b696cdcff6c7","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.1.tgz","fileCount":24,"integrity":"sha512-IARxzD0Sp1YQzwgHTKn48V4kocrpQngfRLU2gdB6fkN80nWUOAosPoqwsmLqd9AdPyEvdUtoueVa+ngueuQROg==","signatures":[{"sig":"MEQCICAudzKqJOVO/JNu2XbfcqCV7vyKrtJm+e9UJGBSiJc8AiABmTsSYMpNTJRM09PZGqWZ1PuJorPzLf2GJ9ygEq4tOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143767},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"77a22bbbe065222e00cebf2821d1d7bdbcfea871","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"Library to deal with result types, both synchronous and asynchronous, along with utilities like caches","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.1_1762853783666_0.2510820686082067","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"unwrapped","version":"0.1.2","license":"MIT","_id":"unwrapped@0.1.2","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"51c65e55f9f3a2b41eaf9ca6585a39fe2859ac13","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.2.tgz","fileCount":16,"integrity":"sha512-ooqr+995cCTNasf9ye8tEUL1PEri1QSgJ/9/RV81VlOqZ2aFjm4cE1JDMVyClviXF1jAY6Men347m+FT1NC/Bg==","signatures":[{"sig":"MEUCIAVzL8N8S8OZiNU5gnAEH11gQlf3ZZemXZhBbdYEJaKFAiEAi8QiIwGOOsbw8KVc9pcGAEOHQwQR0WnGOTaVQDzd2/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121852},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"358d4ac708ba81a88ace1d62313ce736c8e54202","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"Library to deal with result types, both synchronous and asynchronous, along with utilities like caches","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.2_1762854442654_0.92916925020582","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"unwrapped","version":"0.1.3","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.3","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"28bfaa2620b441c20ded98611a79a08a472be57c","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.3.tgz","fileCount":16,"integrity":"sha512-1EheAloCdU61E4k6GnCF0ihC+lmHrv1TesqhRve4E0SpyC78UITaLh4o2o1bspXHUyrgcXtwe+GUTUAl8qR5Yw==","signatures":[{"sig":"MEUCIAxom2c5gzTUm5tlp+VKPWyBv9osspIabEgobXp5kgIIAiEA6MneRWqTDkFOOyKFx6lJW4FHnZZw4vzxz+yiovXqy9U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":283902},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"809be0bdedeb6dc082735a4c8255cf9ee2a840ed","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for elegant error handling and asynchronous state management, inspired by Rust's `Result` type and designed with Vue 3 integration in mind.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.3_1762904885370_0.5869301988360225","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"unwrapped","version":"0.1.4","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.4","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"3dcd3b992177eb8099a85f2b4479418c228c332b","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.4.tgz","fileCount":17,"integrity":"sha512-ro0/u6U0ytwtwVIstnqhVZz0SgqNRxEVlfVRzCMefFirXb5b3ng16oNBsf8KHist+19N5+RkuLZ9bwIWnYW54w==","signatures":[{"sig":"MEYCIQDFUfwofqzDgyuqVE2FiJMYSVNliyln+tLsdoT7Bbl6GAIhAP0nxYLSTq2Xe5afWYrKJSWPQSX+2CiVabM3gDdzLmdc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339757},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"cc54675c8f3163073021aeb8674d3bbaabc699f7","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for elegant error handling and asynchronous state management, inspired by Rust's `Result` type and designed with Vue 3 integration in mind.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.4_1762954177387_0.6176882688183087","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"unwrapped","version":"0.1.5","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.5","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"8a4d338dab8addacae1772ef90fff27ce946cf3c","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.5.tgz","fileCount":17,"integrity":"sha512-YZLBmV+d4Gvl9cTQYUM6IN5aOUx8w7O8Jep1ZVnpudbA12JZAOCgWTycr7H7YEkx+F1wEoBawKgCmuHfB9ZVdg==","signatures":[{"sig":"MEQCIErsSSwIlYBKqL+d3+jAzSMJ5rfNgEmsx9qF8Oa9BeQYAiBPxKtC2jKYKILEg0OdBlNBRkqr/NmGgacOZDvZHIbOhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":341392},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"26c6535e6cfb7f8236b0f3db05780de13b016dfb","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.5_1762955302699_0.0015279510187040657","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"unwrapped","version":"0.1.6","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.6","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"8fadaacf093517eb8412a4fd6b7daefe53b13c2e","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.6.tgz","fileCount":17,"integrity":"sha512-sQFbFGfZaobMypL3GR8Jiwq4c/1m/kwAsOU67ypkDjVq5ktlz2ivTF+IHId0YxBEXt9TheRQUem7m4LJcZhaUQ==","signatures":[{"sig":"MEQCIGHBnEdjuZ6FahCjHg59d3I9K2NlxOCzMaGf/Qdrxk2DAiBcQZJ8HKDn/+e43Q2uX17VfXg8T4KfY0N/GMW4MeMR2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":408835},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"0d8e4c63f40e294d6320e93a0aff35268625d052","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.6_1765195506062_0.47724017640611605","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"unwrapped","version":"0.1.7","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.7","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"e2c5af586db3fc67fe5f7bf94c03b75794aba2d8","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.7.tgz","fileCount":17,"integrity":"sha512-DBvvc8z0pHJqHsBVcTm+Wf8KmxVsM/bjRg9y9crWbe1xMe2lqV61reW9XglquXF3DXvYcmdbVmCpmRAXvy0Bow==","signatures":[{"sig":"MEMCIE3g2OhDBY3DSmB4xSAwcpQPE0Cv67mgYfEtczlYmNrlAh9v1Ov7NEi8pseJGF0y+8Ytp7oYVhUWYvYiGPWKXWEu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":408708},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"8cbc8d121071fc04395526fd9dd11924ae7cff5b","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.7_1765234544927_0.0374646198645987","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"unwrapped","version":"0.1.8","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.8","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"8a5ece2ddd40d13301bb3d9c002b0d0b8fbf23d5","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.8.tgz","fileCount":17,"integrity":"sha512-k63FWkZDTkDOqs/Z3tuJq3O6eE549qR4ZpfqHxPX9GF3ZjfTuCIZ4ATafwyvHyKICMB7ruwTLjwGSWTc3LiYtg==","signatures":[{"sig":"MEUCIQD4BkT31b7mGHIfif0WT8/2oNih5f19J8DX32dS8o4y4QIgardTqTiqVCOyqWWtsZV6c9+yQIseODZbZS+gNUvYuoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423929},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"6489495631f082c3e9d98373511ac3d5c9b5fe8a","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.8_1765236464185_0.9509411078755896","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"unwrapped","version":"0.1.9","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.9","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"0d777c12b9c80c8883581f444d9a8820d84e0d41","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.9.tgz","fileCount":17,"integrity":"sha512-8akfyvryz1VSys70dsvhYqvdaNiubwspUsCuL+88kGmMtqbGPWF98tGsOtLq71KQUENV4CWBPgQMZE23mXuQBQ==","signatures":[{"sig":"MEUCIHkMGVpsmkOZJ+ePmH75LsT/64b+jJG099fjLlgEjkP8AiEAjf3h0EjKPtlM0qpptQ6JzVN6F8Etq1mRuiGs1uaoXEM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":449698},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"0d49d9ad917917903405c91f2b5c0c0d328a907c","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.9_1765312714230_0.3925813315871203","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"unwrapped","version":"0.1.10","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.10","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"4626084adc7f6fbf285937d05f0f9bd565213086","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.10.tgz","fileCount":17,"integrity":"sha512-DCnyBd40WDFbA05MMjZihhNlw5gCqrxrPCnbcOYcQURBkP7B78BfIkyVYoJJIbOYl0l1ELxBo4AYdukB59Vg/A==","signatures":[{"sig":"MEYCIQC5oKzsAf10hnMCB/bNP+B9UK+z/7H9JIc39v8T153G6wIhALbpEfb9535tmUI+OvhwTEiEq8oPVqJK+efJbr7dtgKW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453830},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"35ceda7630bf49055bee1760a3beb186ad4fed7d","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.10_1768842206281_0.15616072834064987","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"unwrapped","version":"0.1.11","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.11","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"cd6b26b6a68e9725a5284157a0d7db960b220bef","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.11.tgz","fileCount":17,"integrity":"sha512-b5oGIBVFW4Dew0HgCJABPvdDI12IwuTjBQ/S4i1c9Dfx4Q6uPntrzk5IsVfu/KS0feURIBPQ8ZvXcYKxc4sT5Q==","signatures":[{"sig":"MEQCIAT1IRrHaRsqDwo18uV4HKDW1QDJ4j+s96wQv0nTMy2RAiBiXSpHv143J9hWxLd0UZgMfJcHxU1aFyCRywuT5svRwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":477353},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"8771e43d73ba1cbea299a47cf9dd45921be53f14","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.11_1770134976432_0.6223746160688568","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"unwrapped","version":"0.1.12","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.12","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"8b1f0bfacbd06f68db8a2182ec349f5d7b9d9717","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.12.tgz","fileCount":17,"integrity":"sha512-7O7N+IzP3J8qaqiRhUeh9G/qAM0me3ArDx7SnB1vAAdOgk7+3Sg3akaQuZa6BkDjM7vBnaUSmwT03JW3E1yRBQ==","signatures":[{"sig":"MEQCIEIWvkYNVE8hMKyJkGGwmgywkX2/yxumCjTvf4UnQLAkAiBVSpnrORcWZlr3qFtf8Y1vl3YS+PmtdPNvrTBIThiPbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":479720},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"49e6695718b92f61fe93e4278f3b660c726941a1","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.12_1770136760855_0.3966089688631662","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"unwrapped","version":"0.1.13","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.13","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"ba966218917edfa3d40a2edb2c631b2fd0140a89","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.13.tgz","fileCount":17,"integrity":"sha512-G768B1bcTp4VGlgkH3ji1A/sHNdMBklTp4kwsstzFFQJEAfVaapqBFFhbRqSmY8Wl9i36Ogzyrr35h1c20tTUw==","signatures":[{"sig":"MEUCIQDUS771yKV9cqj5n0FvPSEtzEfjpi5NzKwWG+5Cr4XlTgIgE3KxIutM5D2j2o5b2aUE9tIhh5fL+PPT5kWzQWaD8yE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":479608},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"5ed3069c2c6fb2ad5a121b32ca478fd27aa57639","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.13_1770141363306_0.2109647883624619","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"unwrapped","version":"0.1.14","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.14","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"f98c1a4f08d9318b3b55ca5828f44ab2782d044f","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.14.tgz","fileCount":17,"integrity":"sha512-5DEtbfyfJao7Xwn3lTh6quhb8wsP6c21Cu3s3k+RN0kWjfF2vIVEbD58HV43dfLcaeeeCpRBBrdEXw7d8jR59Q==","signatures":[{"sig":"MEUCIQC9JlKNYTlTqzapt1kkuYkoZDceiKfXqvYwnW2Cp8Yn8QIgYGBBEZaxA8n+W0zPWLQ5M8fvE+YUPqtRFX6mKgBkWSw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480320},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"71de2c21fc9abae5ff0a4a059a2bf43f4b281099","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.14_1770142079207_0.7787419803625921","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"unwrapped","version":"0.1.15","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.15","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"c990d2eddf1b4297861eb1677cbc85e380754306","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.15.tgz","fileCount":17,"integrity":"sha512-fkgnGIEjFQYR0u8l43GHe2DNEiw0d3H4NF72fAiik6ONwFWbFERU5S7RKjW43WW/aM8d8PzNVKjPYetYFR+2MA==","signatures":[{"sig":"MEQCIG25FCa2HylDU8TfAbbUIhtRH4julTCDoiSBXBpkJpI+AiApgpMUfcZ2Xf31YADBnLiagfMNTgoh5IWa9R9yv4B5Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":482742},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"3ca15bffd1f990aad7647370d00a46e06968b3ef","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.15_1770152018171_0.16653804521374482","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"unwrapped","version":"0.1.16","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.16","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"66a12b19f7273ec8566a7fcfd9467671715af778","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.16.tgz","fileCount":17,"integrity":"sha512-UTih9LtV2/0Yu5dBeFke9FgXRmtVhL9LSq1dYQN9ZRFacCfbbxsaPifKjR+95n7a0tLU4GDnQUyLHQOR5PmgYg==","signatures":[{"sig":"MEUCIG3Gp4b+h5mgxklko1rkeyIRv2W/FUmQdVy9h07Gt0UsAiEAoCDqX/quBNJTpuF0pVjhdkdRuZVSruplKNcrRLlAt4I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480576},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"b7e8e3599d4fa50f732e4f699c41e81b60b7b527","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.16_1770157513145_0.28705491689536355","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"unwrapped","version":"0.1.17","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.17","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"3dbed166fe60398bc80fcab0c99df1afa30a3a3a","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.17.tgz","fileCount":17,"integrity":"sha512-GByDk1lf9x3Hcm5lMiF4IEmIj3Ll87WZl86SuA7fZwMu64JnfaHU8vGsxwIIOYL+J1bj6DQXvIfzT7RBLiro7Q==","signatures":[{"sig":"MEQCID193FqMGlbwYkoP0SmgV5AJGSF6+kPQYKSHZFEamOGQAiA/iCcWG2v/t6Rz65zNUpLdiC2b71SJNguWUiXpYzUHaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480749},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"8beaa3daaf7c7666ef06f60ba32e45ed6408c233","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.17_1770216664892_0.15564378063569473","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"unwrapped","version":"0.1.18","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.18","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"a08732e24f4014ff92ef2ff03d131c62998470ab","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.18.tgz","fileCount":17,"integrity":"sha512-NjNnICmJKjW6Fz9jzLtW2ygrpU0jh2pAWzEOwB7kUuGlttqLfERBH95Uz/OR6ys99bisOXPGHQ7OktV+U+KU3w==","signatures":[{"sig":"MEYCIQDgIzEF4bbVlpkPyNEtbQux+o7S5tvRwZ+TkGyNq11sSQIhAM5mz6nZwXoey+oYOllAdWWy8tqhqyk7YLKOblZ/rpWy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480857},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"4233c990ef555a9aabf9e3f0e5e6e012ed86a336","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.18_1770224074988_0.11590995577317176","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"unwrapped","version":"0.1.19","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.19","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"7af6924cde344eaadd77f9ee6ec31b7429286f91","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.19.tgz","fileCount":17,"integrity":"sha512-n8TqbGXaDJjR/6PuDDsZdjRjfjLhN5ivB4UxB6fBuCuHUlY5IBFrGEkuaTTrQ/7XHphxJL01hjvPJP8QeeZqlg==","signatures":[{"sig":"MEUCIBe/P7ITdqfhJ7RY5tBjoVPP7/sQZO4Sqw/DESipvQkUAiEA87FwWkZbO+RfOP+KXcGdVGb5jlCJJ0vBU6eWmdiu65Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":494139},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"71945f0358aecf7252ef93c48faad18385e31f90","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.19_1770670938473_0.7161137274194436","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"unwrapped","version":"0.1.20","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.20","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"1a706e2747024262f5d243ce1529520ea8ebdab5","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.20.tgz","fileCount":17,"integrity":"sha512-skvQVyVsbLz2h0PrLL0phLsRrnzSu/t5xkPr7g5mIrP6F4F4OTuuB3rVZO+m+wpQbypPixE/uyluOQOgE0U+Nw==","signatures":[{"sig":"MEUCIAqyZYXZf5uS0aVy1NhW4KWGT4u1ayBvC5uUlVdc3WY4AiEA5nr0gPvj+dCkzptaZc60mOHC1NaPFoF99NUt/BFYk6I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":506646},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"8c9817555b4b0fea78af230909f8463b30348259","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.20_1770720416399_0.9898703804429698","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"unwrapped","version":"0.1.21","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.21","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"6a13acd65d006354d4b5f0d50bc78b45c317fdad","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.21.tgz","fileCount":17,"integrity":"sha512-f9WAP65ZIMlDfL3y9ffH7dh0w5Byw6nJyFxEm3z0O6kgznT0y1s6M3x9m0c6SQVyYCgJJWRQt6drft9stD7zUA==","signatures":[{"sig":"MEUCIFsK99wW3t/tRszsID8o9yZdZQDlCzPJh48629lWL1RZAiEAnGwJFebJ9faaK5qSFOcQKmkxV3tH8DuGJA2unBKaDX4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":511413},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"b4c8975ef644078e1d5cfb450c350444a4981d59","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.21_1770737857440_0.780845839777081","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"unwrapped","version":"0.1.22","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.22","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"665296c96ded19a60d3450093828a29f6bdb5d73","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.22.tgz","fileCount":17,"integrity":"sha512-loxIKl+NVp/3rw/jo9iZJTiS9oG4F3B1MaOE6UFGYI1VIZuNWdSj/PzfiRYvLyDTXSQeImaSJRIBm9EwBqXVMw==","signatures":[{"sig":"MEUCICZYcBB45hberf961Crh2sRBP9LVUuzpvzo71pnQ2v1aAiEA8eHRzeaq3gH/JlnyU1bkKhME3k5mwWvudtTCcmqlgkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":511890},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"a118fae9455b9271406502ff52efb0d48d9be2db","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.22_1771148481809_0.6927666636598837","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"unwrapped","version":"0.1.23","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.23","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"0fbfedb7bdb1af6abbd1035d220876f120a880a0","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.23.tgz","fileCount":17,"integrity":"sha512-JTi4/YihuPQAQN2LLfyMrFhQ3pVkVbIsPOUIPxRJM1D1q/Wj+p82hc8j3ulfggYdrUtPGUh+cNbq8xd4euq8KA==","signatures":[{"sig":"MEUCIQCNRwLqR2939QSuq9GG4YiNnWjFwXx16Iyy/MFCTBHMawIgaRRYwJHPD2U9OdTW8VL8putLOIq/e3wAEiC6suMJJXM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":512166},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"df13040ab8ef263a09e4c645ea93bbad08f695ed","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.23_1771165586889_0.05530192251865196","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"unwrapped","version":"0.1.24","license":"LGPL-3.0-or-later","_id":"unwrapped@0.1.24","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"dist":{"shasum":"338ca4ea6a92f2fbbac4a1d1470fc3124cd76e93","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.24.tgz","fileCount":17,"integrity":"sha512-YroTR5QHeLbNY4GjXSDFDuOnCiYSD2CUvQklh6AKXhGLm5jhP42cexrretiFqVaHOQVCEBr8ryNiD164AWDNFw==","signatures":[{"sig":"MEYCIQC4mqI8hQoAHSctvF3KZMqXjbdyPCSTAg990PtOK5bobgIhAKUjo8A5JAhBU4jmo2Uv9VVh4khtW4sWceWxmmC2VN0s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":512262},"main":"./dist/core/index.js","types":"./dist/core/index.d.ts","module":"./dist/core/index.mjs","exports":{"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./package.json":"./package.json"},"gitHead":"55e7cdb368259dcee8267aef0fd3b76529ffef7e","scripts":{"lint":"tsc","build":"npm run build:core && npm run build:vue","release":"npm run build && changeset publish","build:vue":"tsup --config tsup.config.vue.ts","build:core":"tsup --config tsup.config.core.ts"},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"_npmVersion":"8.19.4","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","directories":{},"_nodeVersion":"16.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.24","tsup":"^8.5.0","typescript":"^5.9.3","@changesets/cli":"^2.29.7"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/unwrapped_0.1.24_1771360764193_0.06638198261761286","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"unwrapped","version":"0.1.25","publishConfig":{"access":"public"},"license":"LGPL-3.0-or-later","main":"./dist/core/index.js","module":"./dist/core/index.mjs","types":"./dist/core/index.d.ts","exports":{"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./vue":{"types":"./dist/vue/index.d.ts","import":"./dist/vue/index.mjs","require":"./dist/vue/index.js"},"./package.json":"./package.json"},"scripts":{"build":"npm run build:core && npm run build:vue","build:core":"tsup --config tsup.config.core.ts","build:vue":"tsup --config tsup.config.vue.ts","release":"npm run build && changeset publish","lint":"tsc"},"devDependencies":{"@changesets/cli":"^2.29.7","tsup":"^8.5.0","typescript":"^5.9.3","vue":"^3.5.24"},"peerDependencies":{"vue":"^3.0.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"gitHead":"5e24e5d98488f36dc183f96575ebbbbad1dc1f24","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","_id":"unwrapped@0.1.25","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-FKG4VbMFYE+kSUHqqLjyb7oD4ULQPmpYsFY8FTYOT5/VWKPm6FodGYYcqpoG+KnJlw0rqUMQ+t0aj/e3uEwaAw==","shasum":"a52de85d3930a1b0c6fb522d76bfa2aa27402fe6","tarball":"https://registry.npmjs.org/unwrapped/-/unwrapped-0.1.25.tgz","fileCount":17,"unpackedSize":521273,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICkTEObSYtlQs6bKotaW8UZy5gPD5y6VUJPllbXlgEGdAiEAvaZJIjx1uq2FEzG8xlzFgf8+mvyQy2v+wUDpjf/Cjtc="}]},"_npmUser":{"name":"cy-len","email":"cyprien.lengagne@gmail.com"},"directories":{},"maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/unwrapped_0.1.25_1773007325508_0.878049219222995"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-10T23:32:49.354Z","modified":"2026-03-08T22:02:05.831Z","0.0.1":"2025-11-10T23:32:49.616Z","0.1.0":"2025-11-11T09:18:33.587Z","0.1.1":"2025-11-11T09:36:23.861Z","0.1.2":"2025-11-11T09:47:22.852Z","0.1.3":"2025-11-11T23:48:05.564Z","0.1.4":"2025-11-12T13:29:37.543Z","0.1.5":"2025-11-12T13:48:23.043Z","0.1.6":"2025-12-08T12:05:06.232Z","0.1.7":"2025-12-08T22:55:45.082Z","0.1.8":"2025-12-08T23:27:44.324Z","0.1.9":"2025-12-09T20:38:34.401Z","0.1.10":"2026-01-19T17:03:26.494Z","0.1.11":"2026-02-03T16:09:36.605Z","0.1.12":"2026-02-03T16:39:21.027Z","0.1.13":"2026-02-03T17:56:03.466Z","0.1.14":"2026-02-03T18:07:59.376Z","0.1.15":"2026-02-03T20:53:38.346Z","0.1.16":"2026-02-03T22:25:13.328Z","0.1.17":"2026-02-04T14:51:05.081Z","0.1.18":"2026-02-04T16:54:35.166Z","0.1.19":"2026-02-09T21:02:18.653Z","0.1.20":"2026-02-10T10:46:56.544Z","0.1.21":"2026-02-10T15:37:37.587Z","0.1.22":"2026-02-15T09:41:22.018Z","0.1.23":"2026-02-15T14:26:27.085Z","0.1.24":"2026-02-17T20:39:24.308Z","0.1.25":"2026-03-08T22:02:05.738Z"},"license":"LGPL-3.0-or-later","description":"A TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.","maintainers":[{"name":"cy-len","email":"cyprien.lengagne@gmail.com"}],"readme":"# Unwrapped\n\nA TypeScript library for handling more gracefully synchronous and asynchronous operations that can fail via Result types. Provides also utilities for caching and binding for popular web frameworks.\n\n## Overview\n\nError handling in TypeScript is fundamentally built around throwing exceptions and catching them with try/catch blocks. This works fine for simple scripts where an unexpected error should crash the program, but modern applications—especially frontends—need to handle errors gracefully without crashing the entire app.\n\n**Unwrapped** provides a different approach by providing Result types, with variants for both synchronous and asynchronous operations.\nWhile their primary and most basic use are for describing the result of operations that may fail, they can be chained to describe chains of operations, with build-in short-circuiting when encoutering an error. These chains can be described either by successively calling methods like `.chain()`, or by using a generator syntax inspired by Effect (although much simplified).\n\nWithout **Unwrapped**, the traditional approach leads to scattered state management: separate variables for loading, error, and data, manual state transitions, and the ever-present risk of forgetting to set loading = false in a finally block. Error types are unknown, forcing type assertions everywhere. Chaining multiple async operations that can each fail becomes a mess of nested try/catch blocks or promise chains with multiple .catch() handlers.\n\nOn the contrary, **Unwrapped**'s AsyncResult type wraps loading, error, and success states in one type allowing for a much leaner and less error prone way of writing. Unsettled asynchronous operations will always give you an AsyncResult in a loading state, and when this work finishes, the AsyncResult will always be in a settled state, being either error or success.\n\n**Unwrapped** is composed of multiple sub-modules :\n\n- **Core**: Framework-agnostic utilities for managing results and async operations\n- **Vue**: Vue 3 composables and components for reactive async state management\n\nYou can take a look at the Real world example section at the end of this document to see how Unwrapped can simplify your development.\n\nA brief comparison with other libraries can be found at the \"Why Unwrapped ?\" section at the end of the document.\n\n## Installation\n\n```bash\nnpm install unwrapped\n```\n\n## API Reference\n\n### Core Module (`unwrapped/core`)\n\n- **`Result<T, E>`**: Synchronous result type\n- **`AsyncResult<T, E>`**: Asynchronous result with state tracking\n- **`ErrorBase`**: Base error class with structured logging\n- **`KeyedAsyncCache<P, V, E>`**: Cache for async operations\n\n### Vue Module (`unwrapped/vue`)\n\n- **Composables**: `useAsyncResultRef`, `useAction`, `useLazyAction`, `useReactiveChain`, `useGenerator`, `useLazyGenerator`, `useReactiveGenerator`\n- **Components**: `AsyncResultLoader`, `buildCustomAsyncResultLoader`\n\n\n## Core Concepts\n\n### `Result<T, E>`\n\nA `Result` represents a synchronous operation that can either succeed with a value of type `T` or fail with an error of type `E`.\n\n#### **Basic Usage:**\n\n```typescript\nimport { Result, ErrorBase } from 'unwrapped/core';\n\nfunction divide(a: number, b: number): Result<number> {\n    if (b === 0) {\n        return Result.errTag(\"division_by_zero\", \"Can't divide by 0 !\");\n    }\n\n    return Result.ok(a / b);\n}\n\nconst shouldSucceed = divide(10, 2);\nconst shouldError = divide(10, 0);\n\n// Checking status\nif (shouldSucceed.isSuccess()) {\n    console.log(\"Success !\");\n}\nif (shouldError.isError()) {\n    console.log(\"Error !\");\n}\n\n// Unwrapping values\nconst value = shouldSucceed.unwrapOrNull(); // 5\nconst valueOrDefault = shouldError.unwrapOr(0); // Returns 0 since it's an error\nconst valueOrThrow = shouldSucceed.unwrapOrThrow();\n```\n\n#### **Working with Promises:**\n\n```typescript\n// Wrap a promise and catch errors\nconst result = await Result.tryPromise(\n    fetch(\"/api/data\").then(r => r.json(),\n    (error) => new ErrorBase(\"fetch_error\", \"Failed to fetch data\", error)\n);\n\n// Execute an async function\nconst result = await Result.tryFunction(\n    async () => {\n        const response = await fetch(\"/api/data\");\n        return response.json();\n    },\n    (error) => new ErrorBase(\"fetch_error\", \"Failed to fetch data\", error)\n);\n```\n\n#### **Chaining Operations:**\n\n```typescript\nfunction validateAge(age: number): Result<number, ErrorBase> {\n    if (age < 0) {\n        return Result.err(new ErrorBase(\"invalid_age\", \"Age must be positive\"));\n    }\n    return Result.ok(age);\n}\n\nfunction categorizeAge(age: number): Result<string, ErrorBase> {\n    if (age < 18) return Result.ok('minor');\n    if (age < 65) return Result.ok('adult');\n    return Result.ok('senior');\n}\n\n// Chain operations - stops at first error\nconst valid = Result.ok(25)\n    .flatChain(validateAge) // 25 is a valid age so execution continues\n    .flatChain(categorizeAge); // 25 is passed to categorizeAge\n\nconst invalid = Result.ok(-1)\n    .flatChain(validateAge) // -1 is not a valid age, so the chain short-circuits and returns a Result containing the error given by validateAge\n    .flatChain(categorizeAge) // categorizeAge does not get called\n\nconsole.log(valid.state); // { status: \"success\", value: \"adult\" }\nconsole.log(invalid.state); // { status: \"error\", value: <ErrorBase> }\n```\n\n#### **Generator Syntax for Complex Flows:**\n\nThe same way async/await allows to write asynchronous code in a synchronous-looking way, generators can be used to write result chaining in a more imperative-looking manner via `Result.run()`.\n\nThink of `function*` as `async function` and `yield*` as `await`. Inside a generator function executed by `Result.run()`, yielding a `Result` with `yield*` unwraps the `Result` and allows you to get its value if it is successful. If the `Result` contains an error, the whole generator will terminate and `Result.run()` will return a `Result` containing the error.\n\nNote that in the case of `Result.run()`, everything is synchronous. For performing the same kind of operations on asynchronous tasks, use `AsyncResult.run()`.\n\n```typescript\n\nconst valid = Result.run(function* () {\n    const validatedAge = yield* validateAge(10); // 10 is a valid age so validatedAge is set to 10 and execution continues\n    const category = yield* categorizeAge(validateAge); // yield* unwraps the value so category is set to \"minor\"\n    \n    return category;\n});\n\nconst invalid = Result.run(function* () {\n    const validatedAge = yield* validateAge(-1); // -1 is not a valid age so the run terminates early and returns a Result containing the error given by validateAge\n    const category = yield* categorizeAge(validateAge); // this never gets reached\n    \n    return category;\n})\n\n// If any step fails, the error is automatically propagated\nif (invalid.isError()) {\n    console.error(result.state.error);\n}\n```\n\n### `AsyncResult<T, E>`\n\nAn `AsyncResult` represents an asynchronous operation with four possible states: `idle`, `loading`, `success`, or `error`.\n\n#### **Basic Usage:**\n\n```typescript\nimport { AsyncResult, Result } from 'unwrapped/core';\n\n// Create from a promise that returns a Result\nconst asyncResult = AsyncResult.fromResultPromise(\n  fetch('/api/user')\n    .then(r => r.json())\n    .then(data => Result.ok(data))\n    .catch(err => Result.err(new ErrorBase('API_ERROR', 'Failed to fetch', err)))\n);\n\n// Create from a plain promise\nconst asyncResult = AsyncResult.fromValuePromise(\n  fetch('/api/user').then(r => r.json())\n);\n\n// Check current state\nconsole.log(asyncResult.isLoading()); // true\nconsole.log(asyncResult.isSuccess()); // false\n\n// Listen to state changes\nasyncResult.listen((result) => {\n  if (result.isSuccess()) {\n    console.log('Data loaded:', result.unwrapOrNull());\n  } else if (result.isError()) {\n    console.error('Error:', result.state.error);\n  }\n});\n\n// Wait for completion\nconst settledResult = await asyncResult.waitForSettled();\nconst value = settledResult.unwrapOrNull();\n```\n\n#### **Lazy Actions:**\n\n```typescript\n// Create an action that doesn't execute until triggered\nconst { trigger, result } = AsyncResult.makeLazyAction(async () => {\n    const response = await fetch('/api/data');\n    const data = await response.json();\n    return Result.ok(data);\n});\n\n// Listen for changes\nresult.listen((r) => {\n    console.log('State:', r.state.status);\n});\n\n// Trigger execution\ntrigger();\n```\n\n#### **Chaining Async Operations:**\n\n```typescript\nconst userResult = AsyncResult.fromValuePromise(fetch('/api/user/1').then(r => r.json()));\n\n// Chain with another async operation\nconst postsResult = userResult.chain(async (user) => {\n    const response = await fetch(`/api/posts?userId=${user.id}`);\n    const posts = await response.json();\n    return Result.ok(posts);\n});\n\n// FlatChain with AsyncResult\nconst enrichedPosts = postsResult.flatChain((posts) => {\n    return AsyncResult.fromValuePromise(\n        Promise.all(posts.map(p => enrichPost(p)))\n    );\n});\n```\n\n#### **Generator Syntax for Async Operations:**\n\n```typescript\nfunction fetchUser(id: string): AsyncResult<User> {\n    // ...\n}\n\nfunction fetchProfile(id: string): AsyncResult<Profile> {\n    // ...\n}\n\nconst result = AsyncResult.run(function* () {\n    const user = yield* fetchUser(userId);\n    const profile = yield* fetchProfile(user.profileId);\n\n    return { user, profile };\n});\n\n// result is an AsyncResult that automatically tracks loading/success/error states\nresult.debug(\"Profile fetcher\");\n```\n\n#### **Ensuring Multiple AsyncResults:**\n\n```typescript\n// Wait for multiple AsyncResults to complete\nconst user: AsyncResult<User> = fetchUser(userId);\nconst settings: AsyncResult<Settings> = AsyncResult.fromValuePromise(fetchSettings());\n\nconst all = AsyncResult.ensureAvailable([user, settings]);\n\nall.listen((result) => {\n  if (result.isSuccess()) {\n    const [userData, settingsData] = result.unwrapOrThrow();\n    console.log('All data loaded', { userData, settingsData });\n  }\n});\n```\n\n### `KeyedAsyncCache<P, V, E>`\n\nA cache for asynchronous operations that maps parameters to their results, with support for automatic refetching.\n\n**Usage:**\n\n```typescript\nimport { KeyedAsyncCache, Result } from 'unwrapped/core';\n\n// Create a cache with a fetcher function\nconst userCache = new KeyedAsyncCache(\n    async (userId: number) => Result.tryFunction(\n        async () => {\n            const response = await fetch(`/api/users/${userId}`);\n            const data = await response.json();\n            return data;\n        },\n        (e) => new ErrorBase(\"fetch_error\", \"Error on fetch\", e)\n    ),\n    (userId) => `user-${userId}`, // Key generator\n    60000 // TTL: 60 seconds\n);\n\n// Get cached or fetch\nconst userResult = userCache.get(123); // Returns AsyncResult\n\n// Get with refetch policy\nconst freshUser = userCache.get(123, { policy: 'refetch' });\nconst errorRetry = userCache.get(456, { policy: 'if-error' });\n\n// Check if any request is loading\nif (userCache.anyLoading()) {\n    console.log('Loading data...');\n}\n\n// Invalidate cache\nuserCache.invalidateParams(123);\nuserCache.invalidateAll();\nuserCache.clear();\n```\n\n### `ErrorBase`\n\nA structured error class that provides consistent error handling with codes, messages, and automatic logging.\n\n```typescript\nimport { ErrorBase } from 'unwrapped/core';\n\n// Create an error\nconst error = new ErrorBase(\n    'VALIDATION_ERROR',\n    'Email address is invalid',\n    originalError, // Optional: the caught error\n    true // Optional: whether to log immediately (default: true)\n);\n\n// Access error properties\nconsole.log(error.code); // 'VALIDATION_ERROR'\nconsole.log(error.message); // 'Email address is invalid'\nconsole.log(error.toString()); // 'Error VALIDATION_ERROR: Email address is invalid'\n\n// Log the error\nerror.logError();\n\n// Use with Result\nconst result = Result.err(error);\n```\n\n## Vue Integration\n\nThe Vue package provides composables and components for seamless integration with Vue 3's reactivity system.\n\n### Composables\n\n#### `useAsyncResultRef(asyncResult)`\n\nMakes an `AsyncResult` reactive by wrapping it in a Vue ref:\n\n```typescript\nimport { AsyncResult } from 'unwrapped/core';\nimport { useAsyncResultRef } from 'unwrapped/vue';\n\nconst asyncResult = AsyncResult.fromValuePromise(fetch('/api/data').then(r => r.json()));\nconst resultRef = useAsyncResultRef(asyncResult);\n```\n\n```vue\n<template>\n  <div v-if=\"resultRef.isLoading()\">Loading...</div>\n  <div v-else-if=\"resultRef.isSuccess()\">\n    Data: {{ resultRef.unwrapOrNull() }}\n  </div>\n  <div v-else-if=\"resultRef.isError()\">\n    Error: {{ resultRef.state.error.message }}\n  </div>\n</template>\n```\n\n#### `useAction(action)`\n\nExecutes an action immediately and returns a reactive AsyncResult:\n\n```typescript\nimport { useAction } from 'unwrapped/vue';\nimport { Result } from 'unwrapped/core';\n\nconst resultRef = useAction(async () => Result.tryFunction(\n    async () => {\n        const response = await fetch('/api/data');\n        const data = await response.json();\n        return data;\n    },\n    (e) => new ErrorBase(\"fetch_error\", \"Error on fetch\", e)\n));\n    \n```\n\n#### `useLazyAction(action)`\n\nCreates a lazy action that can be triggered manually:\n\n```typescript\nimport { useLazyAction } from 'unwrapped/vue';\nimport { Result } from 'unwrapped/core';\n\nconst { resultRef, trigger } = useLazyAction(async () => Result.tryFunction(\n    async () => {\n        const response = await fetch('/api/data');\n        const data = await response.json();\n        return data;\n    },\n    (e) => new ErrorBase(\"fetch_error\", \"Error on fetch\", e)\n));\n```\n\n```vue\n<template>\n  <button @click=\"trigger\">Load Data</button>\n  <div v-if=\"resultRef.isLoading()\">Loading...</div>\n  <div v-else-if=\"resultRef.isSuccess()\">{{ resultRef.unwrapOrNull() }}</div>\n</template>\n```\n\n#### `useReactiveChain(source, pipe, options)`\n\nCreates a reactive pipeline that automatically updates when the source changes:\n\n```typescript\nimport { ref } from 'vue';\nimport { useReactiveChain } from 'unwrapped/vue';\nimport { AsyncResult, Result } from 'unwrapped/core';\n\nconst userId = ref(1);\n\nconst userResultRef = useReactiveChain(\n    () => userId.value,\n    (id) => AsyncResult.fromValuePromise(\n    fetch(`/api/users/${id}`).then(r => r.json())\n    ),\n    { immediate: true }\n);\n```\n\n#### `useGenerator(generatorFunc)` / `useLazyGenerator(generatorFunc)`\n\nRun generator functions with reactive AsyncResults:\n\n```typescript\nimport { useGenerator } from 'unwrapped/vue';\nimport { AsyncResult } from 'unwrapped/core';\n\nconst resultRef = useGenerator(function* () {\n    const user = yield* AsyncResult.fromValuePromise(fetchUser());\n    const posts = yield* AsyncResult.fromValuePromise(fetchPosts(user.id));\n    return { user, posts };\n});\n```\n\n#### `useReactiveGenerator(source, generatorFunc, options)`\n\nReactive generator that reruns when source changes:\n\n```typescript\nimport { ref } from 'vue';\nimport { useReactiveGenerator } from 'unwrapped/vue';\nimport { AsyncResult } from 'unwrapped/core';\n\nconst searchQuery = ref('');\n\nconst resultsRef = useReactiveGenerator(\n    () => searchQuery.value,\n    function* (query) {\n    if (!query) return [];\n    \n    const results = yield* AsyncResult.fromValuePromise(\n        fetch(`/api/search?q=${query}`).then(r => r.json())\n    );\n    \n    return results;\n    }\n);\n```\n\n### Components\n\n#### `<AsyncResultLoader>`\n\nA component that renders different content based on AsyncResult state:\n\n```vue\n<template>\n  <AsyncResultLoader :result=\"dataResult\">\n    <template #loading>\n      <div class=\"spinner\">Loading...</div>\n    </template>\n    \n    <template #error=\"{ error }\">\n      <div class=\"error-message\">\n        Error {{ error.code }}: {{ error.message }}\n      </div>\n    </template>\n    \n    <template #default=\"{ value }\">\n      <div class=\"data\">{{ value }}</div>\n    </template>\n    \n    <template #idle>\n      <div>Click the button to load data</div>\n    </template>\n  </AsyncResultLoader>\n</template>\n\n<script setup>\nimport { AsyncResultLoader } from 'unwrapped/vue';\nimport { useLazyAction } from 'unwrapped/vue';\nimport { Result } from 'unwrapped/core';\n\nconst { resultRef: dataResult, trigger: loadData } = useLazyAction(async () => {\n    const response = await fetch('/api/data');\n    const data = await response.json();\n    return Result.ok(data);\n});\n</script>\n```\n\n#### `buildCustomAsyncResultLoader(slots)`\n\nCreate reusable loaders with consistent loading and error UI:\n\n```typescript\nimport { buildCustomAsyncResultLoader } from 'unwrapped/vue';\nimport { h } from 'vue';\nimport Spinner from './Spinner.vue';\nimport ErrorAlert from './ErrorAlert.vue';\n\nexport const CustomLoader = buildCustomAsyncResultLoader({\n    loading: () => h(Spinner),\n    error: ({ error }) => h(ErrorAlert, { error })\n});\n```\n\n```vue\n<template>\n  <CustomLoader :result=\"myAsyncResult\">\n    <template #default=\"{ value }\">\n      <!-- Your success content -->\n      <div>{{ value }}</div>\n    </template>\n  </CustomLoader>\n</template>\n```\n\n## Real-World Examples\n\n### Simple data fetching (Vue 3)\n\n#### **Without** Unwrapped\n\n```vue\n<template>\n    <div>\n        <!-- Manually handle each state -->\n        <div v-if=\"loading\">Loading user...</div>\n        <div v-else-if=\"error\" class=\"error\">\n            Error: {{ error.message }}\n        </div>\n        <div v-else-if=\"user\">\n            <h2>{{ user.name }}</h2>\n            <p>{{ user.email }}</p>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue';\n\n// Need separate refs for each state\nconst user = ref(null);\nconst loading = ref(false);\nconst error = ref(null);\n\nonMounted(async () => {\n    // Manually manage loading state\n    loading.value = true;\n    error.value = null;\n\n    try {\n        const response = await fetch('/api/user/1');\n        if (!response.ok) throw new Error('Failed to fetch');\n        user.value = await response.json();\n    } catch (e) {\n        // Manually handle errors\n        error.value = e;\n    } finally {\n        // Don't forget to set loading to false!\n        loading.value = false;\n    }\n});\n</script>\n```\n\n#### **With** Unwrapped\n\n```vue\n<template>\n    <div>\n        <!-- Single component handles all states automatically -->\n        <!-- You can make your own custom reusable version with buildCustomAsyncResultLoader to avoid repeating the loading and error slots -->\n        <AsyncResultLoader :result=\"userResult\">\n            <template #loading>Loading user...</template>\n            \n            <template #error=\"{ error }\">\n                <div class=\"error\">Error: {{ error.message }}</div>\n            </template>\n            \n            <!-- Only renders when data is successfully loaded -->\n            <template #default=\"{ value: user }\">\n                <h2>{{ user.name }}</h2>\n                <p>{{ user.email }}</p>\n            </template>\n        </AsyncResultLoader>\n    </div>\n</template>\n\n<script setup>\nimport { AsyncResultLoader, useAction } from 'unwrapped/vue';\nimport { Result, ErrorBase } from 'unwrapped/core';\n\n// Single composable handles loading, success, and error states automatically\n// No need for separate refs or manual state management\nconst userResult = useAction(async () => \n    Result.tryFunction(\n        async () => {\n            const response = await fetch('/api/user/1');\n            if (!response.ok) return Result.errTag(\"fetch_error\", \"response.ok is false\");\n            return response.json();\n        },\n        (e) => new ErrorBase('unknown_fetch_error', 'Failed to load user', e)\n    )\n);\n\n// That's it! Loading state, error handling, and success state are all managed\n// userResult automatically transitions: idle -> loading -> success/error\n</script>\n```\n\n\n### Reactive search (Vue 3)\n\n#### **Without** Unwrapped\n\n```vue\n<template>\n    <div>\n        <input v-model=\"searchQuery\" placeholder=\"Search users...\" />\n        \n        <!-- Multiple loading states to manage -->\n        <div v-if=\"isSearching\">Searching...</div>\n        <div v-else-if=\"isLoadingDetails\">Loading user details...</div>\n        \n        <div v-if=\"searchError\" class=\"error\">{{ searchError }}</div>\n        <div v-if=\"detailsError\" class=\"error\">{{ detailsError }}</div>\n        \n        <div v-if=\"searchResults && !selectedUser\">\n            <div v-for=\"user in searchResults\" :key=\"user.id\" \n                @click=\"loadUserDetails(user.id)\">\n                {{ user.name }}\n            </div>\n        </div>\n        \n        <div v-if=\"selectedUser\">\n            <h2>{{ selectedUser.name }}</h2>\n            <p>Posts: {{ selectedUser.posts?.length || 0 }}</p>\n        </div>\n    </div>\n</template>\n\n<script setup>\nimport { ref, watch } from 'vue';\n\nconst searchQuery = ref('');\nconst searchResults = ref(null);\nconst selectedUser = ref(null);\n\n// Separate loading/error states for each operation\nconst isSearching = ref(false);\nconst isLoadingDetails = ref(false);\nconst searchError = ref(null);\nconst detailsError = ref(null);\n\n// Watch for search query changes\nwatch(searchQuery, async (query) => {\n    if (!query) {\n        searchResults.value = null;\n        return;\n    }\n    \n    isSearching.value = true;\n    searchError.value = null;\n    \n    try {\n        const response = await fetch(`/api/users/search?q=${query}`);\n        searchResults.value = await response.json();\n    } catch (e) {\n        searchError.value = e.message;\n    } finally {\n        isSearching.value = false;\n    }\n});\n\nasync function loadUserDetails(userId) {\n    isLoadingDetails.value = true;\n    detailsError.value = null;\n    \n    try {\n        // Chain two requests manually\n        const userRes = await fetch(`/api/users/${userId}`);\n        const user = await userRes.json();\n        \n        const postsRes = await fetch(`/api/posts?userId=${userId}`);\n        const posts = await postsRes.json();\n        \n        selectedUser.value = { ...user, posts };\n    } catch (e) {\n        detailsError.value = e.message;\n    } finally {\n        isLoadingDetails.value = false;\n    }\n}\n</script>\n```\n\n\n#### **With** Unwrapped\n\n```vue\n<template>\n  <div>\n    <input v-model=\"searchQuery\" placeholder=\"Search users...\" />\n    \n    <!-- Search results with automatic state management -->\n    <CustomAsyncResultLoader :result=\"searchResults\">\n        <template #default=\"{ value: users }\">\n            <div v-for=\"user in users\" :key=\"user.id\" \n                @click=\"selectedUserId = user.id\">\n            {{ user.name }}\n            </div>\n        </template>\n        \n        <template #idle>\n            <div>Enter a search query</div>\n        </template>\n    </CustomAsyncResultLoader>\n    \n    <!-- User details with chained operations -->\n    <CustomAsyncResultLoader v-if=\"selectedUserId\" :result=\"userDetails\">\n        <template #default=\"{ value: userData }\">\n            <h2>{{ userData.user.name }}</h2>\n            <p>Email: {{ userData.user.email }}</p>\n            <p>Posts: {{ userData.posts.length }}</p>\n        </template>\n    </CustomAsyncResultLoader>\n  </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\nimport { AsyncResultLoader, useReactiveChain, useReactiveGenerator } \n  from 'unwrapped/vue';\nimport { AsyncResult, ErrorBase } from 'unwrapped/core';\nimport CustomAsyncResultLoader from 'src/your/own/component'; // Made with buildCustomAsyncResultLoader()\n\nconst searchQuery = ref('');\nconst selectedUserId = ref(null);\n\n// Automatically re-fetches when searchQuery changes\n// No need for manual watch() or state management\nconst searchResults = useReactiveChain(\n    () => searchQuery.value, // Reactive source\n    (query) => {\n        // Return idle state if no query\n        if (!query) return AsyncResult.idle();\n        \n        // Otherwise fetch - loading/error states handled automatically\n        return AsyncResult.fromValuePromise(\n            fetch(`/api/users/search?q=${query}`).then(r => r.json())\n        );\n    },\n    { immediate: true }\n);\n\n// Generator syntax makes chaining multiple async operations elegant\n// Automatically re-runs when selectedUserId changes\nconst userDetails = useReactiveGenerator(\n    () => selectedUserId.value, // Reactive source\n    function* (userId) {\n        if (!userId) return null;\n        \n        // yield* unwraps AsyncResults - if any fail, whole chain fails\n        // No manual error handling needed for each step!\n        const user = yield* AsyncResult.fromValuePromise(\n            fetch(`/api/users/${userId}`).then(r => r.json())\n        );\n        \n        const posts = yield* AsyncResult.fromValuePromise(\n            fetch(`/api/posts?userId=${userId}`).then(r => r.json())\n        );\n        \n        // Return combined result - automatically wrapped in success state\n        return { user, posts };\n    }\n);\n\n// That's it! No manual:\n// - loading state tracking\n// - error state tracking  \n// - try/catch blocks\n// - watch() cleanup\n// - state reset on new requests\n// All handled automatically by Unwrapped!\n</script>\n```\n\n## Why Unwrapped ?\n\nTraditional error handling in TypeScript relies on thrown errors with try/catch blocks. While this is great for \"catstrophic failures\" to make the whole app explode. This is great for simple scripts (which was, to be fair, the original intended purpose of JavaScript), but having your whole app panic because of a random JSON.parse() burried in your code is not ideal. Since the advent of Promises, this basic pattern basically became an absolute requirement for every serious app, and we're stuck developping complex apps with sub-par tools for handling the state of our asynchronous operations, having no really good way to track loading and error states provided by the language.Forgetting to set loading = false in a finally block, or missing an error case, are common sources of bugs. Complex async flows with multiple dependent operations become nested and difficult to follow.\n\nUnwrapped addresses these pain points by making error handling explicit and composable through Result types, inspired by the more modern takes on these issues offered by newer languages/tools. A Result<T, E> forces you to acknowledge both success and error cases, with full type safety for both. For async operations, AsyncResult automatically manages the full lifecycle (idle → loading → success/error) so you don't need separate state variables. Generator syntax (yield*) lets you write complex async flows that read sequentially while remaining fully type-safe and composable.\n\nThe goal is not to reinvent TypeScript or impose a new paradigm, but to reduce boilerplate and eliminate common error-handling bugs while staying close to familiar patterns. If you already use async/await and promises, Unwrapped feels natural—just more robust and explicit about errors.\n\n\n### Why not use Tanstack Query instead ?\n\nOn the frontend, errors and pending states are encountered while fetching data. A very good library for this is Tanstack Query, which has versions for most front-end frameworks. It's great at handling what we talked about earlier, from the basics of loading and error states, to more advanced concepts like caching, invalidation, and retries. It's however not meant as a general purpose error handling mechanism and lacks a proper Result type able to be used in other contexts in your codebase, and instead leans on the thrown errors pattern. It's thus more focused on a very specific part of your frontend application.\n\nUnwrapped takes a more general approach, and instead of starting from the top (the useQuery primitive of Tanstack Query), starts from the bottom, with error and result types. These build primitives that can be easily built upon to compose features that catch up with the capabilities of Tanstack Query, especially via the framework specific bindings (`unwrapped/vue` for instance). Results and AsyncResults can be chained (via their `.chain()` and `.flatChain()` methods) for general synchronous or asynchronous computations that may fail at each step, and those chains can be written in a more imperative-looking way with the generators. These features get composed to allow the `KeyedAsyncCache` to perform automatically deduping, invalidations, and retries of any asynchronous operations, which can be easily used in your state management library of choice, like zustand or pinia. While Unwrapped is not yet at feature parity with Tanstack Query for the specific area it covers, its primitives are more composables and can be used in every context when needed. In fact, while first thought for front-end development, the `unwrapped/core` sub-module is pure typescript and can be used on the backend.\n\n### Why not use Effect instead ?\n\nEffect is an incredibly powerful library (that could even be called a framework) that has the ambition to \"Fix TypeScript\". It succeeds very well in this in its own way, but at the cost of almost becoming its own language. Some projects can benefit immensly from this, but it is overkill for simpler, smaller projects. Sometimes you just want your existing tools (TypeScript), but made a little more convenient, and that's where Unwrapped comes into play.\n\nUnwrapped draws a lot of inspiration from Effect and its concepts (especially for the generators) while trying to make them more accessible, with a much more minimal set of APIs. Unwrapped also aims to play nicely with the existing UI frameworks (React, Vue, etc...) by providing integrations that bring Unwrapped's features into the common way of writing apps in those frameworks. In short, it aims to bring some of Effect's concepts to the Vue/React/Svelte way of writing, without disrupting existing patterns.\n\n## Next planned features\n\nUnwrapped is in very active development and a lot of features are still planned, such as :\n- Abort and retries on AsyncResult\n- Better support for concurrency\n- Common utilities (like fetch()) using AsyncResult so you don't have to wrap them in a AsyncResult.fromValuePromise()\n- Debounce on relevant utilities\n\n\n## License\n\nLGPL-3.0-or-later\n\n## Contributing\n\nContributions are welcome! Please feel free to submit issues or pull requests.","readmeFilename":"README.md"}