{"_id":"@b3-business/cherry","_rev":"11-1afc7634a14352e8ba23c231156e11be","name":"@b3-business/cherry","dist-tags":{"latest":"0.3.3"},"versions":{"0.1.0":{"name":"@b3-business/cherry","version":"0.1.0","_id":"@b3-business/cherry@0.1.0","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"dist":{"shasum":"4dfaf994d1105efc1826617338e893a610a0fb4d","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.1.0.tgz","fileCount":6,"integrity":"sha512-VEEbOxSjbksAFxGyMItoWJifBIu+ryxF/MMx0enl3oKQ2VrePYdNllE6UVsRfksR6KgfdDFRgw4MLOSo5T5Aig==","signatures":[{"sig":"MEUCICF1+EfY8dOGfxk0MYeEOjdH7Xx4G505W2vGaFsn8/L/AiEA1pczXow/VxhQKDAVDnkShk29SNFnzVMTyEULPyGXBIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45616},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"9ff7dc22aa1f5330705ee715dffef6b7b79cd00a","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","typecheck":"tsc --noEmit -p .","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"bjesuiter","email":"bjesuiter@gmail.com"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.1.0_1767578552826_0.08823653604332993","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@b3-business/cherry","version":"0.2.2","license":"MIT","_id":"@b3-business/cherry@0.2.2","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"ed3aa15e7b6d5e9c19853873712d5d3cde23f56a","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.2.2.tgz","fileCount":6,"integrity":"sha512-E62tu4ANYFTU4n2l5dWn7fbFBZ4Y14EwiEvn2nsj9NaqJeLwhh3P5Ff6sHBUWxu32Zy+8zn5pXJ0WgVA2H+hzg==","signatures":[{"sig":"MEQCIEnuSCQGHr9lbySCB5bdnrHvclwf0qiKyVny5cuPe33/AiAYWZiA0o28tUuxRDcYMZZRaaEt0ZAqZrO4BvIVgxGJcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":46212},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"48922d1b5362c4a6f222b4002037398831159bdf","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","typecheck":"tsc --noEmit -p .","publish:dry":"npm publish --dry-run --access public","publish:npm":"npm publish --access public","prepublishOnly":"npm run check && npm run test && npm run build","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.2.2_1767580857502_0.24207604573675456","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@b3-business/cherry","version":"0.2.3","license":"MIT","_id":"@b3-business/cherry@0.2.3","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"37d937b04e9265c1e6665e3f2a95eaa1bbc55505","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.2.3.tgz","fileCount":6,"integrity":"sha512-MSCpVdNDDIS2sDO5OMCPTF0a91SQ0gwtpummUfaTCJTKo0/7fbxb/2OkNK/qJKc5aLV2/4n9gxy0ziBg3hZ2ZQ==","signatures":[{"sig":"MEUCIQDinVhZw8qMu7d+L17eRbSd0JfVpA1SS0ChcbwMBe3h/wIgMuf7V5KeVVDS9DwSt6ln0IZMK2brfjJc/9pUIJ1o90U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":46244},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"eedee73d1e6dbe209c68465c54edb61a4309582a","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","typecheck":"tsc --noEmit -p .","publish:dry":"npm publish --dry-run --access public","publish:npm":"npm publish --access public","prepublishOnly":"npm run check && npm run test && npm run build","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.2.3_1767581303590_0.6736662780021856","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@b3-business/cherry","version":"0.2.4","license":"MIT","_id":"@b3-business/cherry@0.2.4","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"ed8572d89011ceec2d2c78bf1550dc946a3f2c70","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.2.4.tgz","fileCount":7,"integrity":"sha512-45sFTkHB2nkLrozTSZXHqSKDv2PSIuUkm6pyvNk45aWNAlslocZpTl7zoVsSsaboXBIJSFCl+LkmRgP3s/JRMw==","signatures":[{"sig":"MEYCIQD5NgS+nerTwk8FFIhYb+INE0j5jG0aPN507P7hsO7XiAIhAL6o+2OXXKNTTIHCaIfTW9DRcJ5MOvYnhnRJz9+I9luz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48031},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"b80d185daeaa52235d15fb937159c63b93ec34fb","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.2.4_1767581646853_0.45516855064919914","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@b3-business/cherry","version":"0.2.5","license":"MIT","_id":"@b3-business/cherry@0.2.5","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"d186a20a247b94778646dc0009d4b1fb1eb6f7a6","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.2.5.tgz","fileCount":7,"integrity":"sha512-PgeO2fAHS9HmaMQL6Q1/jawe0SLw1AQX92s0CfvZ5Rx+E9TD0wbI2cHLkB54wvnkJyAyaKEuogVEkYnIfX4XfA==","signatures":[{"sig":"MEYCIQDtVaAd4IloP97y2QkYMgTeWA8XcPEzxtP6ksp+FupKugIhALXpzXQhhJyfBY5JKU5z//fZxz7SC5rnLAoSZuTgfgti","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48207},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"c276c9f72a624c1af4752d81f7dfa53bc5b8eecc","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.2.5_1767583628596_0.9615769601241846","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@b3-business/cherry","version":"0.2.6","license":"MIT","_id":"@b3-business/cherry@0.2.6","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"0f8b17469049c917bec709f8dcc6f71397044009","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.2.6.tgz","fileCount":7,"integrity":"sha512-/zBbLP+CYB3E8gsfTzS3oXh55VbVbqbQKreGninGgmmw5oW7GZ2Oqe0UtCgPJqftlSFIY0h9EyEL1SZv4Inu/A==","signatures":[{"sig":"MEQCIGl3/qoWtRF//iKQ22f9u4SK0r88LYvlKocGvXAYGUP8AiAi7t5AsAlLxV9lOvMJK8NH95ZdZIbt4zMyPPTM7sACgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48123},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"333d2fdc27139dcbcf868bd05b017d26718c5303","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.2.6_1767583842151_0.7340209706007315","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@b3-business/cherry","version":"0.2.7","license":"MIT","_id":"@b3-business/cherry@0.2.7","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"9003096bff10f529a38c274f8dc930850bac08a4","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.2.7.tgz","fileCount":7,"integrity":"sha512-D/n+7v4jJDBLmBAzFRX4+3hX76YAgJilGqMmg6A8LKP5f5LCELB3lxuPGdOlsfJPHK64y4AT+d2GdSpDpEgiDQ==","signatures":[{"sig":"MEUCIASIG+9U5FuoLGRVyntBOUHoMED7DrEKS3DNWrTtGF9mAiEAnC2aWgGozIvh4P1Up02mv9ji61sVa9iMk3daReX+4Pk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48093},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"91152d6156366ed2e614af6a3d1bc32948e7207f","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck typecheck-test","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build","typecheck-test":"tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.2.7_1767584946591_0.8850421399161854","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@b3-business/cherry","version":"0.3.0","license":"MIT","_id":"@b3-business/cherry@0.3.0","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"ef50abcfda0b91f241451256976b4a76246d1645","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.3.0.tgz","fileCount":7,"integrity":"sha512-ozgIlhznKbySTW7w9rW6rGR7269LluO5eQES27gaoBVjnuKZEWTsJb2DNeXccfJyC7ropuF03A28b97d3gyqPw==","signatures":[{"sig":"MEYCIQC39KrX+ldPMCw6MdDkNyIil358vqzm2zG9zJGKuwvcdAIhAKibMd4ae69FUHxsOwboBFbe2L+FpqvDNcxQYP25Wutb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":55699},"type":"module","types":"./dist/index.d.ts","exports":{".":"./src/index.ts","./package.json":"./package.json"},"gitHead":"cdf0a852750f8aeb20cca32bd850b262af5b8953","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"publishConfig":{"exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.3.0_1767588664014_0.054307754922531926","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@b3-business/cherry","version":"0.3.1","license":"MIT","_id":"@b3-business/cherry@0.3.1","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"0909952d966e733b9c3c7ac2b1000c74bb5dee92","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.3.1.tgz","fileCount":7,"integrity":"sha512-doNdfFfo2kSWRTPxocLsLQlpsHLJ9pzjjJYCSHyqkJlgHM1z2LuUJ+R8Fm9Tj59usswrxinq+1dc9sYagj9QXA==","signatures":[{"sig":"MEYCIQD+dpHzYHhZGPHCU/GtJQlKmvhPCEArQ6Af6TE7crMKbAIhAJ3Q1f9xjectW5fNj583VnK85Ponby2ln+h4z9aHMal5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":52911},"type":"module","types":"./dist/index.d.ts","exports":{".":"./src/index.ts","./package.json":"./package.json"},"gitHead":"6bca72c3ae3a57c705c1c982f421e86d8705b54d","scripts":{"lint":"oxlint src test","test":"bun test","build":"tsdown","check":"run-s lint typecheck","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"publishConfig":{"exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","oxlint":"^1.36.0","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0","npm-run-all":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.3.1_1767591816550_0.09350196528348231","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@b3-business/cherry","version":"0.3.2","license":"MIT","_id":"@b3-business/cherry@0.3.2","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"homepage":"https://github.com/b3-business/cherry#readme","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"dist":{"shasum":"94dbd57b4bc97b993843d89fdd1107db4ab04b7b","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.3.2.tgz","fileCount":13,"integrity":"sha512-vFzUa7xbpkh7tWne69MtOW8QAcJTOnh4Vjf2Gtdw8d5Tb6WHOtX8NRMQeV3Vk9KOnl/0T7FaoLifFZGPgCY9BQ==","signatures":[{"sig":"MEYCIQC6E9SxIQz7H68Vu+v99EzN35AlD57QMjcu2UgtBlTDjgIhAOitSgwVFfEKRb4IECikOnav74YBg8pPFdmut+Me3eZr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":68587},"type":"module","types":"./dist/index.d.ts","exports":{".":"./src/index.ts","./package.json":"./package.json"},"gitHead":"7b5d933bb36af1a7dd3151b97164104e741d098b","scripts":{"test":"bun test","build":"tsdown","check":"oxlint --type-aware --type-check src test","dry-jsr":"bunx jsr publish --dry-run --allow-dirty","dry-npm":"npm publish --dry-run --access public","typecheck":"tsc --noEmit -p .","prepublishOnly":"npm run check && npm run test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"repository":{"url":"git+https://github.com/b3-business/cherry.git","type":"git"},"_npmVersion":"11.6.2","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"valibot":"^1.2.0","neverthrow":"^8.2.0"},"publishConfig":{"exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","tsdown":"^0.19.0-beta.2","@types/bun":"^1.3.5","typescript":"^5.9.3","expect-type":"^1.3.0"},"_npmOperationalInternal":{"tmp":"tmp/cherry_0.3.2_1767592987438_0.1920483720233781","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@b3-business/cherry","version":"0.3.3","description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","repository":{"type":"git","url":"git+https://github.com/b3-business/cherry.git"},"license":"MIT","type":"module","types":"./dist/index.d.ts","exports":{".":"./src/index.ts","./package.json":"./package.json"},"scripts":{"build":"tsdown","check":"oxlint --type-aware --type-check src test","typecheck":"tsc --noEmit -p .","test":"bun test","prepublishOnly":"npm run check && npm run test && npm run build","dry-npm":"npm publish --dry-run --access public","dry-jsr":"bunx jsr publish --dry-run --allow-dirty"},"dependencies":{"neverthrow":"^8.2.0"},"peerDependencies":{"valibot":">=1.2.0"},"devDependencies":{"@types/bun":"^1.3.5","expect-type":"^1.3.0","jsr":"^0.13.5","tsdown":"^0.19.0-beta.2","typescript":"^5.9.3","valibot":"^1.2.0"},"publishConfig":{"exports":{".":"./dist/index.js","./package.json":"./package.json"}},"gitHead":"560ecbcd11e5cd15dbefa7af7669d06ea8a006fd","_id":"@b3-business/cherry@0.3.3","bugs":{"url":"https://github.com/b3-business/cherry/issues"},"homepage":"https://github.com/b3-business/cherry#readme","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-E8RvsGHVCiMd3beGHKVgQfi1Cisekp+Z/OT3VbfiOwMqT6s4ri1w9CJkZyOeizrIM/BHsrYW7LKsQIVCqcSmtg==","shasum":"114ad4e7b1ef250169cdcd479fe48b709c07e91d","tarball":"https://registry.npmjs.org/@b3-business/cherry/-/cherry-0.3.3.tgz","fileCount":13,"unpackedSize":68641,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@b3-business%2fcherry@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDeoOwpZVyQK3vwUbr74leE6lvbWpasLAx+oTctBK4eZAiBGsaYJyXoglVWUEIqAVLJAO644lYxNfXdlvq+80p6rlw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e16aa47d-2f8c-4f49-9769-3474a3565803"}},"directories":{},"maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cherry_0.3.3_1771874593798_0.13477143386667678"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-05T02:02:32.720Z","modified":"2026-02-23T19:23:14.253Z","0.1.0":"2026-01-05T02:02:33.031Z","0.2.2":"2026-01-05T02:40:57.725Z","0.2.3":"2026-01-05T02:48:23.734Z","0.2.4":"2026-01-05T02:54:06.985Z","0.2.5":"2026-01-05T03:27:08.740Z","0.2.6":"2026-01-05T03:30:42.293Z","0.2.7":"2026-01-05T03:49:06.775Z","0.3.0":"2026-01-05T04:51:04.165Z","0.3.1":"2026-01-05T05:43:36.697Z","0.3.2":"2026-01-05T06:03:07.589Z","0.3.3":"2026-02-23T19:23:13.946Z"},"bugs":{"url":"https://github.com/b3-business/cherry/issues"},"license":"MIT","homepage":"https://github.com/b3-business/cherry#readme","repository":{"type":"git","url":"git+https://github.com/b3-business/cherry.git"},"description":"A tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.","maintainers":[{"name":"bjesuiter","email":"bjesuiter@gmail.com"}],"readme":"# cherry\n\n> Cherry-pick your API routes.\n\nA tree-shakeable, minimal API client factory. Import only the routes you need — nothing more.\n\n[![npm](https://img.shields.io/npm/v/@b3-business/cherry)](https://www.npmjs.com/package/@b3-business/cherry)\n[![JSR](https://jsr.io/badges/@b3-business/cherry)](https://jsr.io/@b3-business/cherry)\n[![GitHub](https://img.shields.io/badge/GitHub-b3--business%2Fcherry-blue?logo=github)](https://github.com/b3-business/cherry)\n\n---\n\n## Latest Changelog - 0.3.3\n\n- Changed: `valibot` is now a peer dependency with version policy `>=1.2.0`\n\nSee [CHANGELOG.md](https://github.com/b3-business/cherry/blob/main/packages/cherry/CHANGELOG.md) for full history.\n\n---\n\n## What is Cherry?\n\nCherry is a lightweight API client library that separates **route definitions** from the **client runtime**. Routes are plain objects with validation schemas — import only what you use, bundle only what you import.\n\n```ts\nimport { createCherryClient } from \"@b3b/cherry\";\nimport { listZones, getZone } from \"./routes/cloudflare\";\n\nconst cf = createCherryClient({\n  baseUrl: \"https://api.cloudflare.com/client/v4\",\n  headers: () => ({ Authorization: `Bearer ${process.env.CF_TOKEN}` }),\n  routes: { listZones, getZone },\n});\n\n// Fully typed, fully tree-shakeable\nconst zones = await cf.listZones({ account_id: \"abc\" });\n```\n\n---\n\n## Why Cherry?\n\n### The Problem\n\nOfficial API clients (e.g., Cloudflare, AWS) bundle **everything**:\n\n- Every endpoint, even ones you'll never use\n- Massive web shims for Node.js compatibility\n- Complex class hierarchies that defeat tree-shaking\n\nThe result? A simple \"list DNS records\" call pulls in megabytes of unused code, bloating serverless deployments and slowing cold starts.\n\n```\n# Real-world bundle size comparison (hypothetical)\ncloudflare-sdk:     2.4 MB (bundled)\ncherry + 3 routes:   12 KB (bundled)\n```\n\n### The Solution\n\nCherry inverts the architecture:\n\n| Traditional SDK | Cherry |\n|-----------------|--------|\n| Monolithic client class | Minimal client factory (~50 lines) |\n| All endpoints registered | Routes are plain imports |\n| Tree-shaking impossible | Only imported routes are bundled |\n| Runtime schema validation optional | Validation built-in (Valibot) |\n\n**Routes are data, not code.** They're plain objects describing endpoints — completely decoupled from the client that executes them.\n\n---\n\n## Installation\n\n```bash\n# npm\nnpm install @b3b/cherry valibot\n\n# pnpm\npnpm add @b3b/cherry valibot\n\n# bun\nbun add @b3b/cherry valibot\n\n# jsr (Deno)\ndeno add jsr:@b3b/cherry\n```\n\n---\n\n## Quick Start\n\n### 1. Define a Route\n\n```ts\nimport * as v from \"valibot\";\nimport { route, path, param } from \"@b3b/cherry\";\n\nexport const listZones = route({\n  method: \"GET\",\n  path: path`/zones`,\n  queryParams: v.object({\n    account_id: v.string(),\n    page: v.optional(v.number()),\n  }),\n  response: v.object({\n    result: v.array(v.object({ id: v.string(), name: v.string() })),\n  }),\n});\n```\n\n### 2. Create a Client\n\n```ts\nimport { createCherryClient } from \"@b3b/cherry\";\nimport { listZones, getZone, createDnsRecord } from \"./routes/cloudflare\";\n\nconst cf = createCherryClient({\n  baseUrl: \"https://api.cloudflare.com/client/v4\",\n  headers: () => ({ Authorization: `Bearer ${process.env.CF_TOKEN}` }),\n  routes: { listZones, getZone, createDnsRecord },\n});\n```\n\n### 3. Call Your API\n\n```ts\n// Named method — discoverable, autocomplete-friendly\nconst zones = await cf.listZones({ account_id: \"abc\" });\n\n// Generic call — works with any route, even ones not in `routes`\nconst zones = await cf.call(listZones, { account_id: \"abc\" });\n```\n\n---\n\n## Features\n\n### Path Parameters\n\nUse `path` tagged template with `param()` markers for dynamic URL segments:\n\n```ts\nimport { route, path, param } from \"@b3b/cherry\";\n\nexport const getUser = route({\n  method: \"GET\",\n  path: path`/users/${param(\"id\")}`,\n  pathParams: v.object({ id: v.number() }),\n  response: UserSchema,\n});\n\n// Multiple params\nexport const getComment = route({\n  method: \"GET\",\n  path: path`/posts/${param(\"postId\")}/comments/${param(\"commentId\")}`,\n  pathParams: v.object({ postId: v.number(), commentId: v.number() }),\n  response: CommentSchema,\n});\n```\n\n### Optional Path Parameters\n\nUse `optional()` for optional URL segments:\n\n```ts\nimport { route, path, optional } from \"@b3b/cherry\";\n\nexport const getApiResource = route({\n  method: \"GET\",\n  path: path`/api${optional(\"version\")}/resource`,\n  pathParams: v.object({ version: v.optional(v.string()) }),\n  response: ResourceSchema,\n});\n```\n\n### Query Parameters\n\nDefine query string parameters with their own schema:\n\n```ts\nexport const listUsers = route({\n  method: \"GET\",\n  path: path`/users`,\n  queryParams: v.object({\n    page: v.optional(v.number()),\n    limit: v.optional(v.number()),\n    search: v.optional(v.string()),\n  }),\n  response: v.array(UserSchema),\n});\n\n// Usage: client.listUsers({ page: 1, limit: 10, search: \"john\" })\n// → GET /users?page=1&limit=10&search=john\n```\n\n### Query Array Formats\n\nConfigure how arrays are serialized in query strings:\n\n```ts\nexport const filterItems = route({\n  method: \"GET\",\n  path: path`/items`,\n  queryParams: v.object({ tags: v.array(v.string()) }),\n  queryParamOptions: { arrayFormat: \"comma\" }, // or \"repeat\" | \"brackets\" | \"json\"\n  response: v.array(ItemSchema),\n});\n\n// arrayFormat examples for tags=[\"a\",\"b\"]:\n// \"repeat\"   → ?tags=a&tags=b        (default)\n// \"comma\"    → ?tags=a,b\n// \"brackets\" → ?tags[]=a&tags[]=b\n// \"json\"     → ?tags=[\"a\",\"b\"]\n```\n\n### Body Parameters\n\nDefine request body schema for POST/PUT/PATCH:\n\n```ts\nexport const createPost = route({\n  method: \"POST\",\n  path: path`/posts`,\n  bodyParams: v.object({\n    title: v.string(),\n    body: v.string(),\n    userId: v.number(),\n  }),\n  response: PostSchema,\n});\n```\n\n### Namespaced Routes\n\nGroup related routes into nested objects for better organization:\n\n```ts\n// routes.ts\nexport const posts = {\n  list: route({ method: \"GET\", path: path`/posts`, response: v.array(PostSchema) }),\n  get: route({ method: \"GET\", path: path`/posts/${param(\"id\")}`, pathParams: v.object({ id: v.number() }), response: PostSchema }),\n  create: route({ method: \"POST\", path: path`/posts`, bodyParams: PostInputSchema, response: PostSchema }),\n};\n\nexport const users = {\n  list: route({ method: \"GET\", path: path`/users`, response: v.array(UserSchema) }),\n  get: route({ method: \"GET\", path: path`/users/${param(\"id\")}`, pathParams: v.object({ id: v.number() }), response: UserSchema }),\n};\n\n// client.ts\nconst api = createCherryClient({\n  baseUrl: \"https://api.example.com\",\n  routes: { posts, users },\n});\n\n// Usage with namespacing\nawait api.posts.list({});\nawait api.posts.get({ id: 1 });\nawait api.users.get({ id: 42 });\n```\n\n### Dynamic Headers\n\nProvide headers dynamically (supports async for token refresh):\n\n```ts\nconst client = createCherryClient({\n  baseUrl: \"https://api.example.com\",\n  headers: async () => ({\n    Authorization: `Bearer ${await getAccessToken()}`,\n    \"X-Request-ID\": crypto.randomUUID(),\n  }),\n  routes: { /* ... */ },\n});\n```\n\n### Generic `call()` Method\n\nCall any route without registering it in the client:\n\n```ts\nimport { createCherryClient } from \"@b3b/cherry\";\nimport { getUser, listPosts } from \"./routes\";\n\nconst client = createCherryClient({ baseUrl: \"https://api.example.com\" });\n\n// Works with any route - useful for one-off calls or dynamic route selection\nconst user = await client.call(getUser, { id: 1 });\nconst posts = await client.call(listPosts, {});\n```\n\n### Custom Fetcher\n\nReplace the underlying fetch logic for logging, retries, auth refresh, etc.:\n\n```ts\ncreateCherryClient({\n  baseUrl: \"...\",\n  fetcher: async (req) => {\n    console.log(`→ ${req.init.method} ${req.url}`);\n    const res = await fetch(req.url, req.init);\n    if (!res.ok) throw new Error(`HTTP ${res.status}`);\n    return res;\n  },\n});\n```\n\n### Composable Middleware\n\nComposition is userland — no magic middleware system:\n\n```ts\nimport type { Fetcher } from \"@b3b/cherry\";\n\nconst withRetry = (fetcher: Fetcher, attempts = 3): Fetcher =>\n  async (req) => {\n    for (let i = 0; i < attempts; i++) {\n      try { return await fetcher(req); }\n      catch (e) { if (i === attempts - 1) throw e; }\n    }\n    throw new Error(\"unreachable\");\n  };\n\nconst withLogging = (fetcher: Fetcher): Fetcher =>\n  async (req) => {\n    console.log(`→ ${req.init.method} ${req.url}`);\n    return fetcher(req);\n  };\n\nconst baseFetcher: Fetcher = (req) => fetch(req.url, req.init);\n\ncreateCherryClient({\n  baseUrl: \"...\",\n  fetcher: withLogging(withRetry(baseFetcher)),\n});\n```\n\n### Railway-Oriented Error Handling\n\nAll client methods return `ResultAsync<T, CherryError>` from [neverthrow](https://github.com/supermacro/neverthrow):\n\n```ts\nconst result = await client.posts.get({ id: 1 });\n\n// Pattern 1: Check and unwrap\nif (result.isOk()) {\n  console.log(result.value); // typed as Post\n} else {\n  console.error(result.error); // typed as CherryError\n}\n\n// Pattern 2: Map/chain operations\nconst title = await client.posts.get({ id: 1 })\n  .map(post => post.title)\n  .unwrapOr(\"Unknown\");\n\n// Pattern 3: Match both cases\nresult.match(\n  (post) => console.log(`Got: ${post.title}`),\n  (error) => console.error(`Failed: ${error.message}`),\n);\n```\n\n### Typed Error Hierarchy\n\nAll errors extend `CherryError` with `type` and `retryable` properties:\n\n```ts\nimport {\n  CherryError,\n  HttpError,        // HTTP 4xx/5xx (retryable for 5xx and 429)\n  ValidationError,  // Valibot schema validation failed\n  NetworkError,     // fetch() threw (always retryable)\n  SerializationError, // JSON serialization failed\n  UnknownCherryError, // Catch-all\n  isCherryError,\n} from \"@b3b/cherry\";\n\nconst result = await client.posts.get({ id: 1 });\n\nif (result.isErr()) {\n  const err = result.error;\n  \n  if (err instanceof HttpError) {\n    console.log(err.status, err.statusText, err.body);\n    if (err.retryable) { /* retry logic */ }\n  }\n  \n  if (err instanceof ValidationError) {\n    console.log(err.target); // \"request\" or \"response\"\n    console.log(err.issues); // Valibot issues array\n  }\n}\n```\n\n### Type Inference Utilities\n\nExtract input/output types from route definitions:\n\n```ts\nimport type { InferRouteInput, InferRouteOutput } from \"@b3b/cherry\";\nimport { getUser } from \"./routes\";\n\ntype GetUserInput = InferRouteInput<typeof getUser>;\n// { id: number }\n\ntype GetUserOutput = InferRouteOutput<typeof getUser>;\n// { id: number; name: string; email: string; ... }\n```\n\n### Route Validation at Definition Time\n\nRoutes validate configuration immediately — catch mistakes during development:\n\n```ts\n// ❌ Throws: \"Route has path params [id] but no pathParams schema\"\nconst bad = route({\n  method: \"GET\",\n  path: path`/users/${param(\"id\")}`,\n  response: UserSchema,\n  // Missing pathParams!\n});\n\n// ❌ Throws: \"Path param ':userId' not found in pathParams schema\"\nconst mismatch = route({\n  method: \"GET\",\n  path: path`/users/${param(\"userId\")}`,\n  pathParams: v.object({ id: v.number() }), // Wrong key!\n  response: UserSchema,\n});\n```\n\n---\n\n## Design Principles\n\n1. **Tree-shakeable by default** — Routes are plain imports, not registered in a global client\n2. **Minimal runtime** — Client is ~50 lines, no dependencies beyond Valibot\n3. **User owns composition** — No built-in middleware, just a replaceable fetcher\n4. **Type-safe end-to-end** — Params validated in, response validated out\n5. **No magic** — Everything is explicit and inspectable\n\n---\n\n## Stack\n\n- **Runtime:** Bun\n- **Validation:** Valibot\n- **Language:** TypeScript (strict)\n- **Formatting:** Prettier (100 char width)\n- **Bundling:** tsdown\n\n---\n\n## Dev Info\n\n### Publishing\n\nPublishing to npm and JSR uses **trusted OIDC publishing** via GitHub Actions - no tokens required. Manual `npm publish` or `jsr publish` will not work locally.\n\nTo release a new version:\n1. Update version in `package.json` and `jsr.json`\n2. Update `CHANGELOG.md` and README (Latest Changelog section)\n3. Commit, tag, and push:\n   ```bash\n   git add -A && git commit -m \"release: X.Y.Z\" && git tag X.Y.Z && git push && git push --tags\n   ```\n\nThe GitHub Actions workflow will automatically publish to both npm and JSR.\n\n### Dry-run Scripts\n\n```bash\nnpm run dry-npm   # Verify npm package contents\nnpm run dry-jsr   # Verify JSR package contents\n```\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}