{"_id":"hono-shaking","_rev":"11-de266e06def94c76ee0e0882219ecaad","name":"hono-shaking","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"hono-shaking","version":"0.1.0","keywords":["hono","hono-rpc","hc","unused-code","dead-code","tree-shaking","static-analysis","typescript","monorepo","cli","svelte","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.1.0","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.js"},"dist":{"shasum":"1ec54bcbef0f0baf4744a74b76830332ae4857db","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.1.0.tgz","fileCount":9,"integrity":"sha512-bYSSfjQ4hwaXILqU7s97g0sM2MyEfT8/sGo22hWk4HY2f3AJiQkvizhNkxQCSH+duwgYko2d6wIIoG/fDDjqFQ==","signatures":[{"sig":"MEQCIFHg8NvTW3sWfqomnxQhK/9UaU/9EGAG6VrKOll6jjzbAiBTDAdWBt4Xh+eWBNzn03WuyAQAMtAkHGWne20/IjO+oQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":271927},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@biomejs/biome","esbuild"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"8eae33d281e071232401fa04b45429a1ef511f76","scripts":{"lint":"biome lint .","test":"vitest run","build":"tsup","format":"biome format --write .","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"biome format .","prepublishOnly":"pnpm build"},"_npmUser":{"name":"baseballyama","email":"xydybaseball@gmail.com"},"repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.6.2","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.0.0","devDependencies":{"hono":"^4.6.0","tsup":"^8.3.0","svelte":"^5.0.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@biomejs/biome":"^1.9.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"peerDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"peerDependenciesMeta":{"svelte":{"optional":true},"svelte2tsx":{"optional":true},"@vue/compiler-sfc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.1.0_1779610810569_0.890366651942925","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"hono-shaking","version":"0.1.1","keywords":["hono","hono-rpc","hc","unused-code","dead-code","tree-shaking","static-analysis","typescript","monorepo","cli","svelte","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.1.1","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"508ba12243975d30a837515fe23c92fec9762f9d","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.1.1.tgz","fileCount":11,"integrity":"sha512-mVB4Xbu0ihejmYUvMl9orjzj1AHC0hiJTIvc57Tu1QfYRnMVlM/of5hk/rIFHdJnw8IEWwXw8hUJGPHuCAmCcw==","signatures":[{"sig":"MEYCIQCHzKBDLB483dbvm2c48wjBPuJ8BJHWwmIcO6AFIK7t7gIhAIClp6EvDrDf1fdK7/TAmGQp+oWydfkDqfLXd9p94OHH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":169061},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.1.1.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome lint .","test":"vitest run","build":"tsdown","format":"biome format --write .","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"biome format ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/485ff1d54e50a572aaa4935b5dd249ff/hono-shaking-0.1.1.tgz","_integrity":"sha512-mVB4Xbu0ihejmYUvMl9orjzj1AHC0hiJTIvc57Tu1QfYRnMVlM/of5hk/rIFHdJnw8IEWwXw8hUJGPHuCAmCcw==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@biomejs/biome":"^1.9.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"peerDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"peerDependenciesMeta":{"svelte":{"optional":true},"svelte2tsx":{"optional":true},"@vue/compiler-sfc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.1.1_1779611412272_0.0956102407669357","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"hono-shaking","version":"0.1.2","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.1.2","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"090a7b498595c8477bf1f4fb34c3c38b0d01b462","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.1.2.tgz","fileCount":11,"integrity":"sha512-Q8z8wF7ordP06xlvohPCZoAmo99QjY4zKrMWesl0C2KG31y/oK9YXpeD7DLMV4x/AeRmMuhbwcykagOesvgPyw==","signatures":[{"sig":"MEQCIDu4kAgPawVh/mToDn6ssNtsYHmvyIfzJwXWwOfOx4B1AiApIDznW5Zaj68CPupciYU4l90PMcO3B3wct6t3YRzjwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":169726},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.1.2.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/bffe511dc3f1aaa57ac1efebc9194bc1/hono-shaking-0.1.2.tgz","_integrity":"sha512-Q8z8wF7ordP06xlvohPCZoAmo99QjY4zKrMWesl0C2KG31y/oK9YXpeD7DLMV4x/AeRmMuhbwcykagOesvgPyw==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"peerDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"peerDependenciesMeta":{"svelte":{"optional":true},"svelte2tsx":{"optional":true},"@vue/compiler-sfc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.1.2_1779612106340_0.880401344920086","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"hono-shaking","version":"0.1.3","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.1.3","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"e0378e68502b30620d4ea7a4f77fa6a01e05c283","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.1.3.tgz","fileCount":11,"integrity":"sha512-7uQYBVuV9w1kV3onExqwyZGJDDVEjKk0Q+2WQ/ppivONgKEB3Mymklyp4YKdQahX4L7wobw6NUf0NgXNphgPAg==","signatures":[{"sig":"MEYCIQCfxNBiED6Iw6g58KgnNllVmbWaX42U/SPmNqG+g9G9vgIhALC90ZCbZ9BLGb2JdylHryVCXtJPzTZqze5jSi8C7Vcf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":171716},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.1.3.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/8a24a3a630bcd71872c115f5c38c67a9/hono-shaking-0.1.3.tgz","_integrity":"sha512-7uQYBVuV9w1kV3onExqwyZGJDDVEjKk0Q+2WQ/ppivONgKEB3Mymklyp4YKdQahX4L7wobw6NUf0NgXNphgPAg==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"peerDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"peerDependenciesMeta":{"svelte":{"optional":true},"svelte2tsx":{"optional":true},"@vue/compiler-sfc":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.1.3_1779613848909_0.7836032664030561","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"hono-shaking","version":"0.1.4","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.1.4","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"a03c0e8fd93ff92399c22daaa2caa4f755c1f24f","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.1.4.tgz","fileCount":11,"integrity":"sha512-3mO7L7PBUpFZc+TWLfXRTg0/IlJOL4z16tlvgOt1Lpl9gc0UHcpbDtxKcx5kg/wWnjytYdKsHeZ+qPsJiuywKw==","signatures":[{"sig":"MEYCIQDJBCAry76LuTNF2F/wTfUE6Q8RqYHbSfo2Umn4Z10xpwIhAIIH6Ss0rGt44dcKDOaLTYVNJzJ6vAD2IzSxFh7+9Syg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":171535},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.1.4.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/f1ac8dc0863ee465777aaf89232e8d0e/hono-shaking-0.1.4.tgz","_integrity":"sha512-3mO7L7PBUpFZc+TWLfXRTg0/IlJOL4z16tlvgOt1Lpl9gc0UHcpbDtxKcx5kg/wWnjytYdKsHeZ+qPsJiuywKw==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"optionalDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.1.4_1779616561134_0.9537305575498229","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"hono-shaking","version":"0.2.0","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.2.0","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"38c37a44a0325b3fd8235e062510bd84444e4d53","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.2.0.tgz","fileCount":11,"integrity":"sha512-EzCTfRd3iTowkjLrmYQ8M/VqgpIQcWYSu1C1ulYWRYjSvC7UaBUYNVk7YdbkW9TPtrh2guJ4tdUHLxkNmGKo/Q==","signatures":[{"sig":"MEUCIQC7/Ekp2kBSRNvl6VcOTr6ruR23Uu3e0pIB/sw2KM8OmAIgI+LUhpQXUbMCJ7/OVOp8zCxl6X+NlQ+qEZjyT24sPfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":178189},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.2.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/31def853993355359fdbeadc5f2d24fc/hono-shaking-0.2.0.tgz","_integrity":"sha512-EzCTfRd3iTowkjLrmYQ8M/VqgpIQcWYSu1C1ulYWRYjSvC7UaBUYNVk7YdbkW9TPtrh2guJ4tdUHLxkNmGKo/Q==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"optionalDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.2.0_1779617780639_0.5255932330936486","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"hono-shaking","version":"0.3.0","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.3.0","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"b60ea9f5f8d8e620b312929c68c2f74065f15731","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.3.0.tgz","fileCount":11,"integrity":"sha512-xIAXCqDSlwDaR59/DRpmmcKoaL0Q3rL9QyTT68hHAkCQktjFRf8REMNiH+oCHLSs5gHl1sL6Y9RhZfWO4qH2kQ==","signatures":[{"sig":"MEUCIAlEXjpwToZNTm7KljZ9H613dgQnNdpm3Hd8uo0WF/pPAiEAiCLdiSxkihOPLcxjC7qFCSG+KkbMh4YOpvv87ylampI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":199742},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.3.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/24555b15877a34e28d74c2c322e290e1/hono-shaking-0.3.0.tgz","_integrity":"sha512-xIAXCqDSlwDaR59/DRpmmcKoaL0Q3rL9QyTT68hHAkCQktjFRf8REMNiH+oCHLSs5gHl1sL6Y9RhZfWO4qH2kQ==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"optionalDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.3.0_1779630221354_0.5630806999114295","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"hono-shaking","version":"0.3.1","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.3.1","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"9360c94fe8bcdb93cd8fa497c4c901a351198055","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.3.1.tgz","fileCount":11,"integrity":"sha512-9qji3yf/LHzJNJ9bvIMeWBApWcZNc0iEZVl95xdMu1E76AxN2RSaRM9JB5rC78eDuQeJEjmbLBSjOAJZFDIrNw==","signatures":[{"sig":"MEUCIQCpMenKvkG+3qHwd7M44Pq+ji9usvS3nug05ScUjOjC2AIgRZ8STrI5ODXCEhL1g7HtUnPNpAnTQaAsEeNo2GFWbs0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":193146},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.3.1.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/1de116b792770b7db1a073622b0d5555/hono-shaking-0.3.1.tgz","_integrity":"sha512-9qji3yf/LHzJNJ9bvIMeWBApWcZNc0iEZVl95xdMu1E76AxN2RSaRM9JB5rC78eDuQeJEjmbLBSjOAJZFDIrNw==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"optionalDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.3.1_1779630957080_0.5489689005649843","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"hono-shaking","version":"0.3.2","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.3.2","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"d4c12a772852fadec8a2dc58b8be4be764188869","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.3.2.tgz","fileCount":11,"integrity":"sha512-UHhyv0bUfPUoaRSnyc67ihv4wwHTjuh9S2lrrHMin/C5TThoAcruyQldjSfXGt+S88BE3v/yIC3LUbAd7j/JtA==","signatures":[{"sig":"MEUCIQDGcFDYG/0kBmdwGXrcY5cpVgB37fYN8pOJIJ4FdOiHRQIgJNIKJrz+JrDtdMapFchsgEl2Y5jLU6BwiJ2/HvYD1ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":196634},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.3.2.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/b2eb60f9d06f56aec20e7d85f8f4a6f3/hono-shaking-0.3.2.tgz","_integrity":"sha512-UHhyv0bUfPUoaRSnyc67ihv4wwHTjuh9S2lrrHMin/C5TThoAcruyQldjSfXGt+S88BE3v/yIC3LUbAd7j/JtA==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"optionalDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.3.2_1779631645589_0.7682419560918619","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"hono-shaking","version":"0.3.3","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"author":{"name":"Yuichiro Yamashita"},"license":"MIT","_id":"hono-shaking@0.3.3","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"bin":{"hono-shaking":"dist/cli.mjs"},"dist":{"shasum":"4111bded733465bcadd495be1e0ab8895c133258","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.3.3.tgz","fileCount":11,"integrity":"sha512-GF4aNmQyPMpo/RnApcxGu0gr6dZD1S2UC+ISz2rNdWyTeNGWVeWxJmh3Sz3lkErlJ0TzU3/aSLqN92W6+IWpIw==","signatures":[{"sig":"MEQCIDMBth86ld7DlOQ/lDv4a80lNf1eyex5883B1xAuMbg2AiAH+UcfPZ1HgWaqgziQjQndDZfJehijGXX8gBcCJobzzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":199347},"main":"./dist/index.mjs","type":"module","_from":"file:hono-shaking-0.3.3.tgz","types":"./dist/index.d.mts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"oxlint","test":"vitest run","build":"tsdown","format":"oxfmt --write","release":"pnpm build && changeset publish","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"oxfmt --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"_resolved":"/tmp/32921f7f59fc453744b3fed238a3f045/hono-shaking-0.3.3.tgz","_integrity":"sha512-GF4aNmQyPMpo/RnApcxGu0gr6dZD1S2UC+ISz2rNdWyTeNGWVeWxJmh3Sz3lkErlJ0TzU3/aSLqN92W6+IWpIw==","repository":{"url":"git+https://github.com/baseballyama/hono-shaking.git","type":"git"},"_npmVersion":"11.12.1","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@jridgewell/trace-mapping":"^0.3.30"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","tsdown":"^0.22.0","vitest":"^2.1.0","svelte2tsx":"^0.7.0","@types/node":"^22.0.0","@changesets/cli":"^2.27.0","@vue/compiler-sfc":"^3.4.0"},"optionalDependencies":{"svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0","@vue/compiler-sfc":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hono-shaking_0.3.3_1779632587546_0.6041110613769582","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"hono-shaking","version":"0.4.0","description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"homepage":"https://github.com/baseballyama/hono-shaking","bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"license":"MIT","author":{"name":"Yuichiro Yamashita"},"repository":{"type":"git","url":"git+https://github.com/baseballyama/hono-shaking.git"},"bin":{"hono-shaking":"dist/cli.mjs"},"type":"module","sideEffects":false,"main":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"dependencies":{"@jridgewell/trace-mapping":"^0.3.30","jiti":"^2.4.0","typescript":"^5.6.0"},"devDependencies":{"@changesets/cli":"^2.27.0","@types/node":"^22.0.0","@vue/compiler-sfc":"^3.4.0","hono":"^4.6.0","oxfmt":"^0.51.0","oxlint":"^1.66.0","svelte":"^5.0.0","svelte2tsx":"^0.7.0","tsdown":"^0.22.0","vitest":"^2.1.0"},"optionalDependencies":{"@vue/compiler-sfc":"^3.4.0","svelte":"^4.0.0 || ^5.0.0","svelte2tsx":"^0.7.0"},"engines":{"node":">=20"},"scripts":{"build":"tsdown","typecheck":"tsc --noEmit","lint":"oxlint","format:check":"oxfmt --check","format":"oxfmt --write","test":"vitest run","test:watch":"vitest","release":"pnpm build && changeset publish"},"_id":"hono-shaking@0.4.0","_integrity":"sha512-NjjqPjqygfbMXcdo19M51PR58q+tTh+WKjbQb5XHQqzP0XEcoewkk9YBrVlzWQH80l9jpt7mw4hwok3ngPRAEg==","_resolved":"/tmp/1d099071b0b8b2fda671f10fea72ad2d/hono-shaking-0.4.0.tgz","_from":"file:hono-shaking-0.4.0.tgz","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-NjjqPjqygfbMXcdo19M51PR58q+tTh+WKjbQb5XHQqzP0XEcoewkk9YBrVlzWQH80l9jpt7mw4hwok3ngPRAEg==","shasum":"99de25b9f14b09cb0310ab015c0c783ebd8c2829","tarball":"https://registry.npmjs.org/hono-shaking/-/hono-shaking-0.4.0.tgz","fileCount":11,"unpackedSize":217257,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hono-shaking@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC9SrtFDWQDrskgPUnW4fVa4UTpyWCHSb1Zt8QfChjSgwIgMK4YfwaGNWmzAsx3KcBKhU9heJE75w2aFfE8oLzKGY4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dffc6d0f-1acf-4e33-b6f6-f64af84920b1"}},"directories":{},"maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hono-shaking_0.4.0_1779778141438_0.9137091631602803"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-24T08:20:10.429Z","modified":"2026-05-26T06:49:01.874Z","0.1.0":"2026-05-24T08:20:10.820Z","0.1.1":"2026-05-24T08:30:12.436Z","0.1.2":"2026-05-24T08:41:46.473Z","0.1.3":"2026-05-24T09:10:49.061Z","0.1.4":"2026-05-24T09:56:01.275Z","0.2.0":"2026-05-24T10:16:20.793Z","0.3.0":"2026-05-24T13:43:41.546Z","0.3.1":"2026-05-24T13:55:57.235Z","0.3.2":"2026-05-24T14:07:25.742Z","0.3.3":"2026-05-24T14:23:07.693Z","0.4.0":"2026-05-26T06:49:01.592Z"},"bugs":{"url":"https://github.com/baseballyama/hono-shaking/issues"},"author":{"name":"Yuichiro Yamashita"},"license":"MIT","homepage":"https://github.com/baseballyama/hono-shaking","keywords":["cli","dead-code","hc","hono","hono-rpc","monorepo","static-analysis","svelte","tree-shaking","typescript","unused-code","vue"],"repository":{"type":"git","url":"git+https://github.com/baseballyama/hono-shaking.git"},"description":"Find unused Hono RPC endpoints. Type-driven detection that auto-discovers server/client pairs across a monorepo. Svelte / Vue / tsgo friendly.","maintainers":[{"name":"baseballyama","email":"xydybaseball@gmail.com"}],"readme":"# hono-shaking\n\n> Find unused [Hono RPC](https://hono.dev/docs/guides/rpc) endpoints.\n> Type-driven, monorepo-aware, Svelte / Vue / tsgo friendly.\n\n`hono-shaking` is a static analyzer for projects that use Hono's\n[RPC client](https://hono.dev/docs/guides/rpc) (`hc<AppType>()`). It reads\nthe server's exported `AppType` via the TypeScript Compiler API, walks the\nclient source for `hc<>()` call sites, and reports the routes the server\ndefines that nobody actually calls.\n\n```\n$ npx hono-shaking\n\n# Discovered servers\n  apps/api/src/index.ts :: AppType (124 routes)\n\n# Discovered bindings\n  apps/web/src/lib/client.ts :: backendClient  →  apps/api/src/index.ts :: AppType\n\n== apps/api :: AppType ==\n  consumers: apps/web::backendClient(118)\n  defined routes : 124\n  used routes    : 118\n  unused routes  : 6\n  orphan calls   : 0\n\n  Unused routes (6)\n    POST    /api/v1/integrations/zendesk/webhook\n    GET     /api/v1/integrations/salesforce/oauth/callback\n    GET     /api/v1/dashboards\n    ...\n```\n\n## Why\n\nHono RPC ties every client call to a server route through the type system.\nOnce you have that wire — `hc<AppType>` — you also have everything you need\nto ask the opposite question: **which server routes does nobody on the\nclient ever call?**\n\nExisting dead-code tools (`knip`, `ts-prune`, …) reason at the export level.\nThey can't say \"this route handler is unused\" because the route is reachable\nvia its registration in `app.get(...)`. `hono-shaking` operates at the\nroute-schema level instead, which is the unit of dead code that actually\nmatters for an HTTP API.\n\nUse cases:\n\n- **PR gate**: fail CI if a PR adds a new endpoint with no client call.\n- **Refactor planning**: find handlers safe to delete after a frontend\n  rewrite.\n- **Schema drift detection**: orphan call sites surface typos and removed\n  routes that the type checker missed (e.g. inside `.svelte` / `.vue`).\n\n## When NOT to use this\n\n- Your API isn't called via `hc<AppType>(...)` (REST clients, fetch wrappers,\n  generated SDKs). The analyzer keys on the hc proxy; outside that shape\n  every route looks unused.\n- Your endpoints are called only by external systems (webhook receivers,\n  OAuth callbacks, public APIs). They'll show up as \"unused\" — list them\n  under `ignore.routes` to suppress.\n- You're looking for unused functions / files in general. Use\n  [`knip`](https://github.com/webpro-nl/knip) for that.\n\n## Install\n\n```bash\npnpm add -D hono-shaking          # or npm / yarn\n```\n\nFramework support is via optional peer dependencies; install only the ones\nyour project uses.\n\n```bash\n# For .svelte files\npnpm add -D svelte2tsx svelte\n\n# For .vue files\npnpm add -D @vue/compiler-sfc\n```\n\nWithout these, hono-shaking still works on `.ts` / `.tsx` files; framework\nfiles are just skipped.\n\n### tsgo\n\n`hono-shaking` uses the standard [`typescript`](https://www.npmjs.com/package/typescript)\npackage's Compiler API to read your `AppType`. It never invokes `tsc` as a\nbinary. Projects that have switched their build / type-check to\n[tsgo](https://github.com/microsoft/typescript-go) are unaffected — the\nbundled `typescript` runs alongside, reading the same `tsconfig.json`.\n\n## Usage\n\n### Auto-detect (recommended)\n\nRun with no arguments from the repository root:\n\n```bash\nnpx hono-shaking\n```\n\nThis is equivalent to `--root .`. Pass `--root <dir>` to point at a\ndifferent location.\n\nIt walks the tree, finds every `export type X = typeof Y` that looks like a\nHono app, finds every `hc<T>(...)` call, and resolves each `T` through the\nTypeScript checker to pair them up. Monorepos with multiple servers and\nmultiple frontends are supported out of the box.\n\nAuto-detect handles two binding patterns:\n\n| Pattern | Example                                                      |\n| ------- | ------------------------------------------------------------ |\n| Direct  | `const client = hc<AppType>(url)`                            |\n| Factory | `const make = () => hc<AppType>(url); const client = make()` |\n\nThe factory pattern is common when you wrap `hc()` in a function to inject\nheaders / fetch options — auto-detect follows the function definition and\nfinds the consumers.\n\n### Manual\n\nIf you only want to analyze one server / client pair, pass them explicitly:\n\n```bash\nnpx hono-shaking \\\n  --server-tsconfig apps/api/tsconfig.json \\\n  --app-type-file   apps/api/src/index.ts \\\n  --client-tsconfig apps/web/tsconfig.json \\\n  --client-dir      apps/web/src\n```\n\n### CI\n\n```bash\n# Fail the build if a PR introduces an unused route (or call sites with no matching server route).\nnpx hono-shaking --fail-on-unused --fail-on-orphans\n```\n\nThe exit code reflects findings _after_ the config-driven ignore list is\napplied. Adding a route to `ignore.routes` is how a team explicitly accepts\na non-hc endpoint without breaking the build.\n\n### JSON output\n\n```bash\nnpx hono-shaking --json > report.json\n```\n\nDiagnostic messages (`# adapters loaded: ...`, `# config: ...`) go to stderr\nso JSON on stdout stays clean for pipelines.\n\n## Configuration\n\nDrop a `hono-shaking.config.ts` (or `.mts` / `.mjs` / `.js` / `.cjs`) in the\nworking directory — or, in a monorepo, in the repo root. The loader walks\nup the filesystem from the directory you run `hono-shaking` in, so a single\nconfig at the repo root applies whether you run from the root or from any\nsub-package. It's loaded by [`jiti`](https://github.com/unjs/jiti) — the\nsame TS loader Nuxt and Vitest use — so transitive `.ts` imports work\nwithout a build step.\n\n```ts\n// hono-shaking.config.ts\nimport { defineConfig } from \"hono-shaking\";\n\nexport default defineConfig({\n  ignore: {\n    routes: [\n      // SSE / streaming endpoints — called via raw fetch, not hc.\n      { method: null, path: \"/api/sse/**\", reason: \"SSE — raw fetch\" },\n\n      // OAuth callbacks — invoked by the IdP, not the frontend.\n      { method: \"GET\", path: \"/api/oauth/**\", reason: \"IdP callback\" },\n\n      // Webhooks called by external systems.\n      { method: \"POST\", path: \"/api/webhooks/zendesk\" },\n    ],\n    orphans: [\n      // A call to a different backend that legitimately doesn't appear\n      // in the AppType we're analyzing.\n      { method: \"GET\", path: \"/token\", file: \"**/tiptap/Editor.svelte\" },\n    ],\n  },\n});\n```\n\n### Monorepo\n\nIn a monorepo, place the config at the repo root. Path-shaped fields\n(`serverAppTypeFile` on route ignores, `file` on orphan ignores) without a\nleading `/` or `*` are interpreted **relative to the config file's\ndirectory** — so you can scope rules to a specific package without\nremembering `**/` prefixes:\n\n```ts\n// <repo-root>/hono-shaking.config.ts\nimport { defineConfig } from \"hono-shaking\";\n\nexport default defineConfig({\n  ignore: {\n    routes: [\n      // Only ignore on the `apps/api` server, not on any other server in\n      // the repo that happens to expose the same path.\n      {\n        method: \"POST\",\n        path: \"/api/v1/webhooks/**\",\n        serverAppTypeFile: \"apps/api/src/index.ts\",\n        reason: \"External webhooks\",\n      },\n    ],\n    orphans: [\n      // Scope an orphan-ignore to one package.\n      { method: \"GET\", path: \"/token\", file: \"apps/web/src/lib/tiptap/Editor.svelte\" },\n    ],\n  },\n});\n```\n\nRun `hono-shaking` from the repo root, from `apps/api`, or from anywhere\nin between — the same config is used.\n\n### Schema\n\n```ts\ninterface HonoShakingUserConfig {\n  ignore: {\n    routes: IgnoreRoutePattern[] | null;\n    orphans: IgnoreOrphanPattern[] | null;\n  } | null;\n}\n\ninterface IgnoreRoutePattern {\n  /** `null` matches any method. */\n  method: HttpMethod | HttpMethod[] | null;\n  /** Glob (`*` = one segment, `**` = any depth) or array. */\n  path: string | string[];\n  /** Restrict to a specific server's AppType file (glob, optional). */\n  serverAppTypeFile: string | null;\n  /** Documentation only. */\n  reason: string | null;\n}\n\ninterface IgnoreOrphanPattern {\n  method: HttpMethod | HttpMethod[] | null;\n  path: string | string[] | null;\n  /** Glob against the call site's file path. */\n  file: string | null;\n  reason: string | null;\n}\n```\n\n### CLI overrides\n\n| Flag                    | Purpose                                                           |\n| ----------------------- | ----------------------------------------------------------------- |\n| `--config <path>`       | Explicit config file path.                                        |\n| `--no-config`           | Skip config auto-discovery.                                       |\n| `--fail-on-dead-config` | Exit `1` if any ignore rule never matched (good for CI).          |\n| `--no-warn-dead-config` | Silence the default-on warning that lists unmatched ignore rules. |\n\n### Dead-config detection\n\nRoutes get renamed and removed. Without a check, the corresponding entries\nin `ignore.routes` / `ignore.orphans` quietly outlive the code they refer\nto — adding visual noise to the config and, worse, masking a future\nunused-route that happens to match the stale rule.\n\nBy default `hono-shaking` warns (on stderr) when any ignore rule never\nmatched anything during the run:\n\n```\nwarning: 2 ignore rules in hono-shaking.config.ts never matched:\n  ignore.routes[1]   method=\"DELETE\" path=\"/api/v1/this-was-removed\"  (Removed last quarter)\n  ignore.orphans[0]  method=\"GET\" path=\"/never-called\"\n  Rules may be unmatched because the route was renamed/removed, or\n  because an earlier rule shadowed them.\n```\n\nPass `--fail-on-dead-config` in CI to turn this into a hard error so the\nconfig can't rot. Pass `--no-warn-dead-config` to suppress the warning.\n\n## How it works\n\n1. **Extract** routes from the server. We resolve the `AppType` symbol via\n   the Compiler API and walk Hono's schema type parameter\n   `{ [path]: { $get: Endpoint, $post: Endpoint, ... } }`. Chained\n   `.route(...)` calls accumulate the schema as a union; we flatten the\n   union and merge all members' keys.\n\n2. **Detect** call sites in the client. For every `obj.$get(...)` (or\n   `$post`, etc.) we ask the type checker whether the receiver has Hono's\n   `$url` property — that's a unique marker on the RPC proxy's _leaf_\n   nodes, and it's the central precision gate that keeps us from matching\n   `obj.$get(...)` on unrelated objects.\n\n3. **Truncate** the chain at the rightmost known hc client name. This is\n   what handles `params.backendClient.api.v1.users.$get()` — the client\n   variable lives in the middle of the chain, not at the root.\n\n4. **Diff** defined vs called by `(method, path)` to produce\n   `unused` / `used` / `orphan`.\n\n5. **Discover** (for `--root` mode) walks the repo for server and client\n   candidates, runs the type checker to validate each candidate and to\n   resolve `hc<T>` to its declaring file, and groups bindings by server so\n   \"unused\" is calculated across _all_ consumers of a server, not per\n   consumer.\n\nFor `.svelte` and `.vue`, each file is run through a `FrameworkAdapter`\n(`svelte2tsx` or `@vue/compiler-sfc`) that emits a virtual TS source plus a\nsourcemap-style position remapping. Adapter scans don't have a type\nchecker, so they rely on the whitelist of hc client names discovered by the\nTS pass.\n\n## Library API\n\nThe CLI is a thin shell over a library API. Use it directly when you need\nsomething the CLI doesn't expose (custom output, custom ignores derived\nfrom runtime data, etc.).\n\n```ts\nimport {\n  discoverProject,\n  extractRoutes,\n  findCallsites,\n  diffRoutes,\n  buildIgnoreFilter,\n  loadConfig,\n} from \"hono-shaking\";\n\nconst { servers, bindings } = discoverProject(\".\");\n\nfor (const binding of bindings) {\n  const defined = extractRoutes({\n    tsconfigPath: binding.server.tsconfigPath,\n    appTypeFile: binding.server.appTypeFile,\n    exportName: binding.server.exportName,\n  });\n\n  const called = await findCallsites({\n    tsconfigPath: binding.clientTsconfigPath,\n    includeDir: binding.clientPackageDir,\n    exclude: null,\n    knownClientNames: null,\n    restrictToClientNames: [binding.variableName],\n    adapters: null, // auto-load svelte / vue if installed\n  });\n\n  const diff = diffRoutes(defined, called);\n  // diff.unused, diff.used, diff.orphanCalls\n}\n```\n\n## Known limitations\n\n- **Computed access**: `client[someVar].$get()` with a non-literal key is\n  skipped. Literal keys (`client['users'].$get()`) work fine.\n- **Cross-repo clients**: a `.ts` file outside the analyzed program isn't\n  visible. Run hono-shaking in the repo where both server and client live,\n  or run it twice (once per repo) and union the results.\n\n### Imports we _do_ handle\n\n`hc` resolution goes through the TypeScript symbol resolver, so any shape\nthe compiler can follow works — including aliases, namespace imports, and\nre-exports through your own barrels:\n\n```ts\nimport { hc } from \"hono/client\";\nimport { hc as createClient } from \"hono/client\";\nimport * as hono from \"hono/client\";\n//        ^ then called as hono.hc<T>(...)\n\n// Re-export through your own barrel:\n//   @org/backend/client.ts:  export { hc } from 'hono/client';\nimport { hc } from \"@org/backend/client\";\nimport { hc as createClient } from \"@org/backend/client\";\n```\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md"}