{"_id":"@a_jackie_z/fastify","_rev":"22-80e31be6cd0385ebed937fe2e90d42d5","name":"@a_jackie_z/fastify","dist-tags":{"latest":"1.4.3"},"versions":{"1.0.0":{"name":"@a_jackie_z/fastify","version":"1.0.0","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.0.0","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"c9c3b93a6dc38f53b18c578a571a8ce3a52cb246","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.0.0.tgz","fileCount":5,"integrity":"sha512-N8hMoqkZBcwb1GiT9rdNJkFT9U3wORT1jpCMdTbqrAFXH2B8105L50nbCCq+Zx1F1tSRCuyMo8htVVXtfB02gQ==","signatures":[{"sig":"MEQCIDbQ6R0c/sX5WIZjVlBtukTHZug1QUErLGegWw3xvKHNAiBDyC4BQPbfAC/CGsM+CJqJWdIAmU6Cs4rCk9aUe8z9vA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23580},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"111cc413586f14397d4c9776d984ec18b74f9bf2","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"fastify":"^5.7.1","typebox":"^1.0.79","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@sinclair/typebox":"^0.34.47","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","@fastify/type-provider-typebox":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.0.0_1769060032190_0.052884620333262466","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@a_jackie_z/fastify","version":"1.0.1","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.0.1","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"a0312bf347ef37fac1da260426928b048640859f","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.0.1.tgz","fileCount":5,"integrity":"sha512-BaP/21PUiu6mVobeYLG5Ul9Zf8Um9n2m+eZxPNyntjM/cl2ULmOZoRYMfjwOBgyuDDuh+Sm2foq6XEg5GxdhGA==","signatures":[{"sig":"MEYCIQDUbN/Ps/4V2iEIL8zesPe3WOWiEv/C1lDw8WPuwflE8AIhAJWagaxJBkjN4z9Q8jLfma8lVv6XXDrnHrZvBfcS4NU9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24927},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8efcc57c523060d57576daec3a6809700374d597","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"fastify":"^5.7.1","typebox":"^1.0.79","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@sinclair/typebox":"^0.34.47","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","@fastify/type-provider-typebox":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.0.1_1769060517834_0.13473739299085108","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@a_jackie_z/fastify","version":"1.1.0","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.0","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"42b6487147db0dfa48cbbfdbbba7b563d1f7d789","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.0.tgz","fileCount":5,"integrity":"sha512-nzwkNjGNISHwlW2icFAbgWAHPEB8k+Jm3wY5aoy4p2dhLrb7GAcf66NEEjrsYyKGoth9wOVlFM1LmGuWZm74dw==","signatures":[{"sig":"MEUCICMGALyS266owH+gQ45BSZ2M+ZeSE7DvmsFQuatYVbDiAiEAxjtb7BpzrurcFbXQQXHRgU/zUli3wiHp9vpq4mUNdxg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25105},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8efcc57c523060d57576daec3a6809700374d597","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.0_1769062541069_0.3168765599380532","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@a_jackie_z/fastify","version":"1.1.1","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.1","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"233baa618b5d74c7c8730c69be12075db7adb922","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.1.tgz","fileCount":5,"integrity":"sha512-xfhdSxFn2w089xArkMpdd+ZLXhbbmEiUPg5DnhtdozP1aln7PDj+8UO0KJqUMAY9YgGZ0z99T++b/FfQ68jhlA==","signatures":[{"sig":"MEUCIQCE441A9gwdze20gW4R6FDMq1FYJNi5L4GiTasqqJ8GxAIgcTUaMz3rQOcaqCfLjer4DHdHuxrqqTlchl1PsYM0OJI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25679},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"9fb7d800a3da5bd2051076cf5fb06a7b68c2504c","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.1_1769398109839_0.9926646247891058","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@a_jackie_z/fastify","version":"1.1.2","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.2","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"d0e5f33f257247104b61dc6f110ae5b521e39c77","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.2.tgz","fileCount":5,"integrity":"sha512-gcqAtbOKK/LiSWzBQcPaa7qgR4YhbwwNXqjdxP/3EX72gPD4P/wRkAIixv++pSkdsx3MqXon3sh0W1S1MZeIYQ==","signatures":[{"sig":"MEYCIQDZbulhaEIY40MBY5NXZ13uP/l9pRQx7BkYnUgg+3iJOgIhAN+ztCezkfqrX4OD8s9vaWNXsABJiLLMRUed+neyprfM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27553},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c29587222714fa61ea4b82f77f0c68c8303b87ac","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.2_1769513191078_0.9348263505110661","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@a_jackie_z/fastify","version":"1.1.3","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.3","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"4b064310e445b3f74b3e27578e784dc8b08d52a7","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.3.tgz","fileCount":5,"integrity":"sha512-IBzgtqeFS/wWVPCzXP4A5XCDtXiEJfCky9Saz0INKMdejGKi79gRvtVvfaRg8m5RPNbGB4CG0qIDpgmWlZ2miw==","signatures":[{"sig":"MEUCIQCGAg1ADmuX0iFF9xay0hMGNQbbVDR38bEM8xZb+UludAIgV6mEsXK30/UtIOmljv8UDle3wV0wyIa5s4kUN67GA0Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43109},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"0c00b6a9caeb23c1575c31ef56309c140d865c68","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.3_1769519565654_0.006548795936021534","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@a_jackie_z/fastify","version":"1.1.4","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.4","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"fea73d67784fe438821dd91a8b654ec4e9e4fbeb","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.4.tgz","fileCount":5,"integrity":"sha512-3U/dFiwa03LUuyh9aUlSMqlk8gJS7UOZEn8/a0d/Ghj1NHlyI2Rv+qwq2CndgWJKao7MEIFcxcweFmY5AOIW/A==","signatures":[{"sig":"MEUCIQC31aYgxhYolrJ//gA7U+Npewqdw/ipTeYheEGv8kZWlQIgPO2xVvGFiYH0fJBilOQ6tPLXrpJNvvAxIagiuProvfQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44953},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4c07fa738de7149bff62c1a95a296f3e4b8a21fb","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.4_1769520307232_0.32839478985544934","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@a_jackie_z/fastify","version":"1.1.5","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.5","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"390e9f4856ecd32ae113f6e946e0ecf617599cf1","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.5.tgz","fileCount":5,"integrity":"sha512-P43yBP1cH9VpDn3sxx9JWrEiH5zmkl4skDiqtKGtlZ791xYfQ5Fipo8QPdng6ru8JwIQ06xyPN52ASLDGvU5ig==","signatures":[{"sig":"MEYCIQCIHStmKAn3n2v10h35kSKQta70R3h5VISZ1RVeN9DQHQIhAMO0G2QB6F4xgQod+u+7VrcpZ0JwImP1eYKxxP3nDobp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45102},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5bf9fb72e6aab7e0a00d732f22641f06e1913489","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.5_1769526356391_0.1456754711059609","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@a_jackie_z/fastify","version":"1.1.6","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.6","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"cfd137a5ebf7fb1e30abb28bd7b9e87c477dd577","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.6.tgz","fileCount":5,"integrity":"sha512-Ifta8jjLLJ0K2dOZxi5kfBbzGciqpOanNcvtY1eNjZgfaqvnu0nE0rSU6EBZ+3H1aMBCCCC9hJ/d8ZbzMt9i1Q==","signatures":[{"sig":"MEUCIQD1T+Pu0CYNwoGimel3tbrXeORnyjL5mc4wpfzfGV4LxAIgW3G7su9YKhrEuZ5d2HTC4JixO+EPoqTBEUKkBTYlfAw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64954},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"18d81726b7335ffed5ec9d574d7c4713ce99da74","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.6_1769533556300_0.32311441551208153","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@a_jackie_z/fastify","version":"1.1.7","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.7","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"56ad308d901a835179f90825e87743947f4d41d3","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.7.tgz","fileCount":5,"integrity":"sha512-i4UVhDq48HzDmZFBASUPSOJ391y/QxmVEdYu6+u5aq4zxCzt+Zf2fvPxqRqvOdCHbRGVsp8UNP9ydAob2L7SRQ==","signatures":[{"sig":"MEUCIQDufZGsUlu3OwPUBRb4yYJ+bnocxtRMxBBHh2zo9kWFjgIgf44FejdgbhXfwniYvUniCRPjce32GCuxznm5BEeegEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66144},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4207b948d01718df1a6eda378f0849b3e6a60078","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.7_1769587293324_0.9120684243500685","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@a_jackie_z/fastify","version":"1.1.8","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.8","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"28f66593c8bc0a1336a7e4f4ac9a6286e6916115","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.8.tgz","fileCount":5,"integrity":"sha512-d50x01XpJILYzkeVwk1jp3uyUM0UZEK1R15kPe2VnduoczeDffdFFQ4sdwsOLM0TlXyT+Rkmz9mh9JCe85ErgQ==","signatures":[{"sig":"MEQCIHbKMExFKMsrTdm4tqO16ETPf1fWnZlH5OL7zpVOIu7/AiAacze7BZaKx2vlzPdNLghqAJ5r3ayfjOCckVyyTIAglQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74370},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4a1089f69ea092c50de5a0dbf83803a0be70aa9e","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.8_1769596235508_0.7465807215626752","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@a_jackie_z/fastify","version":"1.1.9","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.9","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"59ef987a20829453217d31e49df89354adc14e7f","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.9.tgz","fileCount":5,"integrity":"sha512-4RzDpDrwad5emgE3zUdBirH/d0lUACj1W3qYHY1Pwd6SZmOrWVzKLvuUP4JYTIZotIdU4GoL1+Tn2AvmcStOUA==","signatures":[{"sig":"MEQCIAOzGsSBRUR0E7r+KlzesADarjHjpf8pun9nFvsjqRnOAiAlxaV8Fu0XktKKWgbQ/6RGuxSui5/Q1pE74KA2TRMdYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74758},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"3310cf86b1dabae19a6c68c2cb4ba01cb25255e3","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.9_1769597368685_0.93715202445757","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"@a_jackie_z/fastify","version":"1.1.10","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.10","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"6e6b2d4990a54b5e6b30476a7ef169f1c3c43c3f","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.10.tgz","fileCount":5,"integrity":"sha512-iOzfqBf9Or2daUo3E4tU1MxMkTcqzHeNPFkpNQf+EViLTlNA6PyO7XlbGSo0p0UfxSfCX8DNuvGS9HUwjQ8L2g==","signatures":[{"sig":"MEUCIEAsHEtGIwCXQJ9mzrwOAi62VTYm+jY51ZumpLKDLNbUAiEAvbcuTXVW9Tx1rZZiHUwYd15xBHxYw3Hlx3v433qbc9Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75611},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"61c9b0860e799f0b86c54f561d54923c98c631cd","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.10_1769608326655_0.6999854013495981","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"@a_jackie_z/fastify","version":"1.1.11","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.1.11","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"410dd0800588bd2a5301672fc6b03428b57307de","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.1.11.tgz","fileCount":5,"integrity":"sha512-+Qq7eGrjCOgsaKSIBB55HtWH01eU9yIjE14ftciqkFuMyEEaHlZivYzuYtAuscYbC7uCYUMoSO5eVUaxG3S0fg==","signatures":[{"sig":"MEYCIQDUzvw/pDC6hAKuaCRqaQuAaQXbSDrmQrBi6QfwmPlUVQIhAMQMmutRNjDxVgxMhmKTipCDsbW5JgF1P62BKAxAKVnU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76188},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c885c8e425542adf6dc92b3c344aa753f8ad97c7","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","@fastify/jwt":"^10.0.0","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.1.11_1769612105278_0.05173464308149622","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@a_jackie_z/fastify","version":"1.3.0","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.3.0","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"dist":{"shasum":"2db33936f2548da5edae1913f94636911ddeffbe","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.3.0.tgz","fileCount":5,"integrity":"sha512-IzgYejye1k4bXCTKKMb7uEspFib7b3NkcHJYZIs6u6P0HDumOrtwRYdyOk+sNsvTsIrd0fSskTuu9AHg8pxzSQ==","signatures":[{"sig":"MEUCIQD0kzPDNR3/XBz7cBYdo6rtJetSm0kckNT0MP3Kut2iRQIgBKc1HzAPOEt8ZbSaZYHVkG5K386FE9nku6Vly2sU7Z8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98587},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"d3f15aa91cc65d03b1ea434dd3ec2f087d16c798","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9","@types/jsonwebtoken":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.3.0_1769711345855_0.8251016052465385","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@a_jackie_z/fastify","version":"1.3.1","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.3.1","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/fastify#readme","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"dist":{"shasum":"1f0484712bd44c2b4d4a43a443e39a101af6dc35","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.3.1.tgz","fileCount":5,"integrity":"sha512-ztshUAd8eJ5HAbFraL16FSeqUeP228Q+GUUPwnGzgqrfcfayQ3HCaTgYNZ1l9FffzjiIxqUH0WID0q3/ImJneg==","signatures":[{"sig":"MEUCIQDC/+wvZ6XOmB87XKJdSIrgyMvJEEdiDv8RO9gSHCQjCAIgDB5UATgVFXPZQ7OCs38LYsy0eFEqPReMYR4IU4tYspg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98661},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"96907af114710996c2475ee8dfcf86ad21cecfe3","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.5","fastify":"^5.7.1","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.4","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.0.9","@types/jsonwebtoken":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.3.1_1770011897842_0.7296148569172023","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@a_jackie_z/fastify","version":"1.3.2","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.3.2","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/fastify#readme","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"dist":{"shasum":"f6ec23a3570852ab218726e0876f9f03ef46e025","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.3.2.tgz","fileCount":6,"integrity":"sha512-hWwWu4b67Q+/WHBRAwbkdNCjbj50GpHVh6gA2tKj9mciRHOBrntS2W15rD2Kk8YjXqU++4e31XWVEvD+avxYKQ==","signatures":[{"sig":"MEYCIQC9MVRsS/JGw/aeoiAeJbf3MDhFt0z7ijaAreN89emqPgIhANlNi0IDurMpIJ+vZzAxZOTzTZzTnC/RceN1F6ZJ/dOO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99735},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"667cd0d45ad84464c4ee4fec71ea3795be614686","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.6","fastify":"^5.7.4","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.5","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.2.0","@types/jsonwebtoken":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.3.2_1770141791614_0.6463390331988097","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@a_jackie_z/fastify","version":"1.3.3","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.3.3","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/fastify#readme","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"dist":{"shasum":"96e88cacc6fe2b3edcc551527a0425f2d642f1f5","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.3.3.tgz","fileCount":6,"integrity":"sha512-/+shAzZRLnuy/VbI82tC9olUqRGPjoDy7EHada2oweTC207vvAOF5IFSPiIOosz7F//Nl1A2LU3kL144bSX9+g==","signatures":[{"sig":"MEQCIDuazho9Ac3CEJxP3c4jA9qTWV6oi0+plqj/JTAt8E+kAiBy0K8i7JzlHGz0mqCuy8DwQzmW7O2J0H58KEo0t7gcVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99737},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"61d82de914b19b9468d04afd9faa916a26760184","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.6","fastify":"^5.7.4","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.5","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.2.0","@types/jsonwebtoken":"^9.0.10"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.3.3_1770142687990_0.6070621079997305","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@a_jackie_z/fastify","version":"1.4.0","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.4.0","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/fastify#readme","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"dist":{"shasum":"6f931021155d4ba5a5bb38290f1b7dc450eab958","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.4.0.tgz","fileCount":6,"integrity":"sha512-G+2M3AKCxSCr49EUxtv2XY4sHFdTaTC9BrMmiJOQB88cXZhErC0rGdz633EVmA8HV5ABfovPebuXUpYGcFF+7A==","signatures":[{"sig":"MEYCIQC+0sj3n1BlWXfa1XxvyjPmygFnclE/zGtpNCe7B6j42AIhANKss0UTMKyuHhc4xJQncvWJKzJivgp4vNZJDnnJDKsF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98490},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2be10f521f4c61fd6454550e224eaf4207f1048e","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.6","fastify":"^5.7.4","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.5","@a_jackie_z/fastify-types":"^1.0.0","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.2.0","@types/jsonwebtoken":"^9.0.10"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.4.0_1770392369931_0.5632653224524784","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@a_jackie_z/fastify","version":"1.4.1","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.4.1","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/fastify#readme","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"dist":{"shasum":"4e30da5096a4f0ff71466182642dad7262a23be2","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.4.1.tgz","fileCount":6,"integrity":"sha512-OdnqPJtjMxNssph56+mmJI3VUpCJEqxxTcS5v9om0Y4mrDDwQPohxIhJTXfMR+tcbLVZWF/Sbwb8UQOpbQI0aQ==","signatures":[{"sig":"MEUCIQCDvBaMgmI+ynJ9n4vbUIz6EfB+2CPTbtboGTK5b53x+AIgUAdhAkTgXc4kBI6uGU2feTUMvdgA/DFBDBcDhnXvq1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98966},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"430ea181bb08ff8c24aa0ee2068a3804778007f9","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"_npmVersion":"11.6.2","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^4.3.6","fastify":"^5.7.4","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.6.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.5","@a_jackie_z/fastify-types":"^1.0.1","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.2.0","@types/jsonwebtoken":"^9.0.10"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.4.1_1770633188509_0.22903635283303148","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@a_jackie_z/fastify","version":"1.4.2","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","_id":"@a_jackie_z/fastify@1.4.2","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"homepage":"https://github.com/a-jackie-z/fastify#readme","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"dist":{"shasum":"cb291814818e217ff907fe74d55ca421f63f9403","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.4.2.tgz","fileCount":6,"integrity":"sha512-0U2kAenBoqPgLv3FH4W2QZBmL4Ecmb5v/YMrfwvhFZazHTGtKkiHzrAagT4lxYDeZjE2FpWiWVjheHD077E1qg==","signatures":[{"sig":"MEUCIALT5La2on+1ktlBnwDPIjsnzxgkzsgORpnFeLYDMum6AiEA/rgB6XtjbEcBHPT7JH9tnYe1AzLynZwPvkUd+WmCYkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98966},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"b0351872fb2e548f6ce66869bc2c1bc6d7163cb9","scripts":{"build":"tsup"},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"_npmVersion":"11.8.0","description":"A collection of Fastify plugins and utilities for building robust web applications.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"zod":"^4.3.6","fastify":"^5.7.4","jsonwebtoken":"9.0.3","@fastify/swagger":"^9.7.0","@fastify/rate-limit":"^10.3.0","@fastify/swagger-ui":"^5.2.5","@a_jackie_z/fastify-types":"^1.0.1","fastify-type-provider-zod":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^25.3.0","@types/jsonwebtoken":"^9.0.10"},"_npmOperationalInternal":{"tmp":"tmp/fastify_1.4.2_1772032220026_0.23583489434407334","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"@a_jackie_z/fastify","version":"1.4.3","description":"A collection of Fastify plugins and utilities for building robust web applications.","license":"MIT","author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup"},"dependencies":{"@a_jackie_z/fastify-types":"^1.0.1","@fastify/rate-limit":"^10.3.0","@fastify/swagger":"^9.7.0","@fastify/swagger-ui":"^5.2.5","fastify":"^5.8.4","fastify-type-provider-zod":"^6.1.0","jsonwebtoken":"9.0.3","zod":"^4.3.6"},"devDependencies":{"@types/jsonwebtoken":"^9.0.10","@types/node":"^25.5.0","tsup":"^8.5.1","tsx":"^4.21.0","typescript":"^6.0.2"},"gitHead":"badd174401cd9a93e6aa763ebf8382552758db1a","_id":"@a_jackie_z/fastify@1.4.3","bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"homepage":"https://github.com/a-jackie-z/fastify#readme","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-fBY1NMeR8iSWzEFw/Lh3HLfqLF3NBik5lqNy9ntPNnAnVM19Z11/S3FDui+DAWC0rJpfrdUbND1RietgZA2Gqw==","shasum":"774b4d2d82df4c9da085286bfa7d1549a6a4c8d5","tarball":"https://registry.npmjs.org/@a_jackie_z/fastify/-/fastify-1.4.3.tgz","fileCount":6,"unpackedSize":98966,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF5gvSwS6xtKkA9xt3AeGp8jOb9PCNsPkQg3tgH12yhgAiEAgtBJ5ycaXyMTvYJUq7oVFHTmVZ5P+8iYOiBkv0CiGos="}]},"_npmUser":{"name":"sanglu","email":"connect.with.sang@gmail.com"},"directories":{},"maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fastify_1.4.3_1774347079691_0.34707481713523225"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-22T05:33:52.069Z","modified":"2026-03-24T10:11:20.280Z","1.0.0":"2026-01-22T05:33:52.334Z","1.0.1":"2026-01-22T05:41:57.975Z","1.1.0":"2026-01-22T06:15:41.204Z","1.1.1":"2026-01-26T03:28:29.994Z","1.1.2":"2026-01-27T11:26:31.222Z","1.1.3":"2026-01-27T13:12:45.793Z","1.1.4":"2026-01-27T13:25:07.447Z","1.1.5":"2026-01-27T15:05:56.509Z","1.1.6":"2026-01-27T17:05:56.448Z","1.1.7":"2026-01-28T08:01:33.504Z","1.1.8":"2026-01-28T10:30:35.744Z","1.1.9":"2026-01-28T10:49:28.826Z","1.1.10":"2026-01-28T13:52:06.815Z","1.1.11":"2026-01-28T14:55:05.430Z","1.3.0":"2026-01-29T18:29:06.021Z","1.3.1":"2026-02-02T05:58:18.005Z","1.3.2":"2026-02-03T18:03:11.832Z","1.3.3":"2026-02-03T18:18:08.121Z","1.4.0":"2026-02-06T15:39:30.107Z","1.4.1":"2026-02-09T10:33:08.656Z","1.4.2":"2026-02-25T15:10:20.199Z","1.4.3":"2026-03-24T10:11:19.829Z"},"bugs":{"url":"https://github.com/a-jackie-z/fastify/issues"},"author":{"name":"Sang Lu","email":"connect.with.sang@gmail.com"},"license":"MIT","homepage":"https://github.com/a-jackie-z/fastify#readme","repository":{"url":"git+https://github.com/a-jackie-z/fastify.git"},"description":"A collection of Fastify plugins and utilities for building robust web applications.","maintainers":[{"name":"sanglu","email":"connect.with.sang@gmail.com"}],"readme":"# @a_jackie_z/fastify\n\nA collection of Fastify plugins and utilities for building robust web applications with built-in support for dynamic JWT authentication, rate limiting, Swagger documentation, and Zod validation.\n\n## Installation\n\n```bash\n# For server-side Fastify applications\nnpm install @a_jackie_z/fastify\n\n# For frontend applications (types and schemas only)\nnpm install @a_jackie_z/fastify-types\n```\n\n> **Note:** If you're building a frontend application (React, Vue, etc.) and only need API types and response schemas, install `@a_jackie_z/fastify-types` instead. It's frontend-compatible and has no Node.js dependencies.\n\n## Quick Start\n\n### Basic Setup\n\n```typescript\nimport { createFastify, runFastify } from '@a_jackie_z/fastify'\nimport { formatSuccess } from '@a_jackie_z/fastify-types'\nimport { z } from 'zod'\n\nconst app = await createFastify()\n\napp.route({\n  method: 'GET',\n  url: '/hello',\n  schema: {\n    response: {\n      200: z.object({\n        status: z.number(),\n        success: z.boolean(),\n        data: z.object({\n          message: z.string(),\n        }),\n      }),\n    },\n  },\n  handler: async (_request, reply) => {\n    return reply.send(formatSuccess(200, { message: 'Hello World!' }))\n  },\n})\n\nawait runFastify(app, '0.0.0.0', 3000)\n```\n\n## Package Architecture\n\nThis package is split into two complementary packages for better frontend compatibility:\n\n### `@a_jackie_z/fastify` (Server Package)\n**For:** Node.js server applications\n**Includes:**\n- Fastify server creation and configuration (`createFastify`, `runFastify`)\n- JWT service with token generation/verification (`FastifyJwtService`)\n- Server-side crypto utilities (`generateId`, `generateSessionToken`)\n- Fastify plugins and middleware\n- Server-specific types (`CreateFastifyOptions`, `FastifyServer`)\n\n### `@a_jackie_z/fastify-types` (Types Package)  \n**For:** Frontend applications (React, Vue, etc.) and API contracts\n**Includes:**\n- Response types (`SuccessResponse`, `ErrorResponse`, `ValidationDetail`)\n- Response formatters (`formatSuccess`, `formatError`)  \n- Zod schemas (`successResponseSchema`, `errorResponseSchema`)\n- JWT configuration types (`TokenTypeConfig`, `SignTokenOptions`)\n- Error utilities (`createError`, `HTTP_STATUS_CODES`)\n- No Node.js dependencies - browser compatible\n\n```typescript\n// Server code\nimport { createFastify, generateId } from '@a_jackie_z/fastify'\nimport { formatSuccess } from '@a_jackie_z/fastify-types'\n\n// Frontend code  \nimport { successResponseSchema, type SuccessResponse } from '@a_jackie_z/fastify-types'\n```\n\n## Features\n\n- **Dynamic JWT Authentication** - Flexible multi-token-type JWT system with per-type configuration\n- **Multiple Secret Keys** - Support for key rotation with kid-based secret selection\n- **Per-Type Token Configuration** - Configure header names, expiration, algorithm, issuer per token type\n- **Issuer Validation** - Optional allowedIss validation for enhanced security\n- **Payload Schema Validation** - Zod schema validation for token payloads\n- **Flexible Route Protection** - Combine global required types with route-specific types\n- **Rate Limiting** - Global rate limiting for API protection\n- **Swagger Documentation** - Auto-generated API documentation with dynamic security schemes\n- **Zod Integration** - Type-safe request/response validation\n- **Standardized Response Formatting** - Consistent response shapes with `formatSuccess` and `formatError` utilities\n- **Automatic Error Handling** - Field-level validation errors, auth errors, and rate limit errors with consistent formatting\n- **Custom Logger Support** - Integrate any Fastify-compatible logger\n- **Health Check Plugin** - Ready-to-use health check endpoint\n- **Plugin Helper** - Utility for creating reusable Fastify plugins\n\n## Examples\n\n### 1. Complete Setup with All Features\n\n```typescript\nimport { createFastify, runFastify } from '@a_jackie_z/fastify'\nimport { z } from 'zod'\n\nconst app = await createFastify({\n  // Optional: Integrate your logger\n  // logger: yourFastifyLogger,\n  \n  // Rate limiting\n  rateLimit: {\n    global: {\n      max: 100,\n      timeWindow: '1 minute',\n    },\n  },\n  \n  // Dynamic JWT authentication with multiple token types\n  jwt: {\n    // Multiple secrets for key rotation\n    secrets: {\n      v1: 'your-secret-key-v1',\n      v2: 'your-secret-key-v2',\n    },\n    defaultKeyId: 'v2', // Use v2 for signing new tokens\n    \n    // Define token types with individual configurations\n    tokenTypes: {\n      access: {\n        headerName: 'authorization',\n        expiresIn: '15m',\n        algorithm: 'HS256',\n        iss: 'auth-service',\n        allowedIss: ['auth-service'],\n        payloadSchema: z.object({\n          identityId: z.string(),\n          role: z.string().optional(),\n        }),\n      },\n      refresh: {\n        headerName: 'authorization',\n        expiresIn: '7d',\n        algorithm: 'HS256',\n      },\n      service: {\n        headerName: 'x-service-authorization',\n        expiresIn: '1h',\n        algorithm: 'HS256',\n        iss: 'gateway',\n        allowedIss: ['gateway', 'internal-service'],\n      },\n    },\n    \n    // Token types always checked (unless route has jwtTypes: false)\n    requiredTypes: ['service'],\n    \n    debug: true, // Enable detailed error messages in development\n  },\n  \n  // Swagger documentation\n  swagger: {\n    title: 'My API',\n    version: '1.0.0',\n    description: 'API documentation',\n    routePrefix: '/docs',\n  },\n})\n\nawait runFastify(app, '0.0.0.0', 3000)\n```\n\n## JWT Authentication\n\n### Overview\n\nThe JWT system supports **dynamic token types** where each type can have its own:\n- Header name (e.g., `authorization`, `x-service-authorization`)\n- Expiration time\n- JWT algorithm, issuer (iss), and audience (aud)\n- Allowed issuers for verification\n- Zod schema for payload validation\n\n### Token Type Configuration\n\nEach token type is configured independently:\n\n```typescript\n// TokenTypeConfig is available in @a_jackie_z/fastify-types\nimport type { TokenTypeConfig } from '@a_jackie_z/fastify-types'\n\ninterface TokenTypeConfig {\n  headerName: string          // Header to extract token from\n  expiresIn: string          // Token expiration (e.g., '15m', '7d', '1h')\n  payloadSchema?: z.ZodSchema // Optional Zod schema for payload validation\n  algorithm?: Algorithm       // JWT signing algorithm (default: 'HS256')\n  iss?: string               // Token issuer\n  aud?: string               // Token audience\n  allowedIss?: string[]      // Allowed issuers for verification (bypass if undefined)\n  header?: {                 // Optional JWT header configuration\n    typ?: string             // Token type (typically 'JWT')\n    cty?: string             // Content type (e.g., 'application/json')\n    [key: string]: any       // Custom header claims\n  }\n}\n```\n\n### Multiple Secret Keys (Key Rotation)\n\nSupport multiple secrets for key rotation using kid-based selection:\n\n```typescript\njwt: {\n  secrets: {\n    v1: 'old-secret-key',\n    v2: 'new-secret-key',\n    v3: 'future-secret-key',\n  },\n  defaultKeyId: 'v2', // New tokens signed with v2\n  // Tokens with kid=v1, v2, or v3 can all be verified\n}\n```\n\n### Route Protection\n\nRoutes can specify which token types they require:\n\n```typescript\n// Public route - no authentication\napp.get('/public', {\n  config: { jwtTypes: false }\n}, handler)\n\n// Protected by access token only\napp.get('/user-data', {\n  config: { jwtTypes: ['access'] }\n}, handler)\n\n// Protected by both access and service tokens\napp.get('/gateway-protected', {\n  config: { jwtTypes: ['access', 'service'] }\n}, handler)\n\n// No config - uses requiredTypes from global config\napp.get('/auto-protected', handler)\n```\n\n### Global Required Types\n\nThe `requiredTypes` option specifies token types that are **ALWAYS** checked on all routes (unless explicitly bypassed with `jwtTypes: false`):\n\n```typescript\njwt: {\n  requiredTypes: ['service'], // Always verify service token\n  tokenTypes: { /* ... */ }\n}\n\n// Route A: No jwtTypes specified\n// Verifies: ['service']\napp.get('/api/data', handler)\n\n// Route B: jwtTypes: ['access']\n// Verifies: ['service', 'access'] (both combined!)\napp.get('/api/user', { config: { jwtTypes: ['access'] } }, handler)\n\n// Route C: jwtTypes: false\n// Verifies: nothing (explicitly public)\napp.get('/public', { config: { jwtTypes: false } }, handler)\n```\n\n### 2. Authentication Flow - Login Route\n\n```typescript\nimport { formatSuccess, formatError } from '@a_jackie_z/fastify-types'\n\napp.route({\n  method: 'POST',\n  url: '/auth/login',\n  config: {\n    jwtTypes: false, // Public route\n  },\n  schema: {\n    body: z.object({\n      username: z.string(),\n      password: z.string(),\n    }),\n    response: {\n      200: z.object({\n        status: z.number(),\n        success: z.boolean(),\n        data: z.object({\n          accessToken: z.string(),\n          refreshToken: z.string(),\n        }),\n      }),\n      401: z.object({\n        status: z.number(),\n        success: z.boolean(),\n        error: z.string(),\n        message: z.string(),\n      }),\n    },\n  },\n  handler: async (request, reply) => {\n    const { username, password } = request.body\n\n    // Validate credentials\n    if (username === 'admin' && password === 'secret') {\n      // Generate tokens using jwtService\n      const accessToken = app.jwtService.generateToken('access', {\n        identityId: 'user-123',\n        role: 'admin',\n      })\n      \n      const refreshToken = app.jwtService.generateToken('refresh', {\n        identityId: 'user-123',\n      })\n      \n      return reply.send(formatSuccess(200, { accessToken, refreshToken }))\n    }\n\n    return reply.status(401).send(\n      formatError(401, 'Unauthorized', 'Invalid credentials')\n    )\n  },\n})\n```\n\n### 3. Protected Route - Accessing JWT Payloads\n\n```typescript\napp.route({\n  method: 'GET',\n  url: '/user/profile',\n  config: {\n    jwtTypes: ['access'], // Requires access token (+ any global requiredTypes)\n  },\n  schema: {\n    response: {\n      200: z.object({\n        status: z.number(),\n        success: z.boolean(),\n        data: z.object({\n          identityId: z.string(),\n          role: z.string(),\n        }),\n      }),\n    },\n  },\n  handler: async (request, reply) => {\n    // Access verified token payloads from Map\n    const accessPayload = request.jwtPayloads.get('access')\n    const servicePayload = request.jwtPayloads.get('service') // If in requiredTypes\n    \n    return reply.send(formatSuccess(200, {\n      identityId: accessPayload.identityId,\n      role: accessPayload.role,\n    }))\n  },\n})\n```\n\n### 4. Service-to-Service Authentication\n\nConfigure service tokens for microservice communication:\n\n```typescript\njwt: {\n  tokenTypes: {\n    service: {\n      headerName: 'x-service-authorization',\n      expiresIn: '1h',\n      algorithm: 'HS256',\n      iss: 'gateway',\n      allowedIss: ['gateway', 'auth-service'],\n      payloadSchema: z.object({\n        serviceId: z.string(),\n      }),\n    },\n  },\n  requiredTypes: ['service'], // All routes require service token\n}\n\n// Gateway generates service token\nconst serviceToken = app.jwtService.generateToken('service', {\n  serviceId: 'gateway',\n})\n\n// Forward to backend service with service token\nfetch('http://backend-service/api/data', {\n  headers: {\n    'Authorization': `Bearer ${userAccessToken}`,\n    'X-Service-Authorization': serviceToken, // No Bearer prefix for custom headers\n  },\n})\n```\n\n### 5. Token Refresh Flow\n\n```typescript\napp.route({\n  method: 'POST',\n  url: '/auth/refresh',\n  config: {\n    jwtTypes: false, // Public endpoint\n  },\n  schema: {\n    body: z.object({\n      refreshToken: z.string(),\n    }),\n  },\n  handler: async (request, reply) => {\n    const { refreshToken } = request.body\n    \n    try {\n      // Verify refresh token\n      const payload = app.jwtService.verifyToken('refresh', refreshToken)\n      \n      // Generate new tokens\n      const newAccessToken = app.jwtService.generateToken('access', {\n        identityId: payload.identityId,\n      })\n      \n      const newRefreshToken = app.jwtService.generateToken('refresh', {\n        identityId: payload.identityId,\n      })\n      \n      return reply.send(formatSuccess(200, {\n        accessToken: newAccessToken,\n        refreshToken: newRefreshToken,\n      }))\n    } catch (err) {\n      return reply.status(401).send(\n        formatError(401, 'Unauthorized', 'Invalid or expired refresh token')\n      )\n    }\n  },\n})\n```\n\n### 6. Custom Authorization Logic\n\nImplement custom authorization in route handlers:\n\n```typescript\napp.route({\n  method: 'DELETE',\n  url: '/admin/users/:id',\n  config: {\n    jwtTypes: ['access'],\n  },\n  handler: async (request, reply) => {\n    const accessPayload = request.jwtPayloads.get('access')\n    \n    // Check role\n    if (accessPayload.role !== 'admin') {\n      return reply.status(403).send(\n        formatError(403, 'Forbidden', 'Admin role required')\n      )\n    }\n    \n    // Check permissions\n    if (!accessPayload.permissions?.includes('delete')) {\n      return reply.status(403).send(\n        formatError(403, 'Forbidden', 'Delete permission required')\n      )\n    }\n    \n    // Proceed with deletion\n    const { id } = request.params\n    await deleteUser(id)\n    \n    return reply.send(formatSuccess(200, { message: 'User deleted' }))\n  },\n})\n```\n\n### 7. Issuer Validation\n\nEnforce issuer validation for enhanced security:\n\n```typescript\njwt: {\n  tokenTypes: {\n    access: {\n      headerName: 'authorization',\n      expiresIn: '15m',\n      iss: 'auth-service',              // Tokens generated with iss='auth-service'\n      allowedIss: ['auth-service'],     // Only accept tokens from auth-service\n    },\n    service: {\n      headerName: 'x-service-authorization',\n      expiresIn: '1h',\n      iss: 'gateway',\n      allowedIss: ['gateway', 'legacy-gateway'], // Accept from multiple sources\n    },\n  },\n}\n\n// If allowedIss is undefined, issuer validation is bypassed\n```\n\n### 8. Payload Schema Validation\n\nDefine Zod schemas for runtime payload validation:\n\n```typescript\nimport { z } from 'zod'\n\njwt: {\n  tokenTypes: {\n    access: {\n      headerName: 'authorization',\n      expiresIn: '15m',\n      payloadSchema: z.object({\n        identityId: z.string().uuid(),\n        role: z.enum(['user', 'admin', 'moderator']),\n        permissions: z.array(z.string()).optional(),\n        exp: z.number(), // JWT standard field\n      }),\n    },\n  },\n}\n\n// Tokens with invalid payloads will be rejected during verification\n```\n\n### 9. JWT Header Configuration\n\nConfigure standard and custom JWT header claims per token type:\n\n```typescript\nimport { z } from 'zod'\n\njwt: {\n  tokenTypes: {\n    access: {\n      headerName: 'authorization',\n      expiresIn: '15m',\n      algorithm: 'HS256',\n      header: {\n        typ: 'JWT',                    // Standard: Token type\n        cty: 'application/json',       // Standard: Content type\n        ver: '2.0',                    // Custom: API version\n        ctx: 'web',                    // Custom: Client context\n      },\n    },\n    service: {\n      headerName: 'x-service-authorization',\n      expiresIn: '1h',\n      algorithm: 'HS256',\n      header: {\n        typ: 'JWT',\n        env: 'production',             // Custom: Environment\n      },\n    },\n  },\n}\n\n// Generated tokens will include these headers\n// Verification will validate headers match the configuration\n```\n\n**Standard JWT Headers:**\n- `typ` - Token type (typically 'JWT')\n- `cty` - Content type for nested JWTs or specific content\n- `alg` - Algorithm (set via `algorithm` field)\n- `kid` - Key ID (automatically set from `defaultKeyId`)\n\n**Custom Headers:**\n- Any additional key-value pairs for application-specific needs\n- Examples: `ver` (version), `ctx` (context), `env` (environment), `app` (application ID)\n\n**Header Validation:**\n- During token verification, headers are validated against the configured values\n- Tokens with mismatched headers will be rejected\n- Provides additional security layer for token authenticity\n\n### 10. Health Check Plugin\n\n```typescript\nimport { createFastify, runFastify, healthPlugin } from '@a_jackie_z/fastify'\n\nconst app = await createFastify()\n\n// Register health check plugin\nawait app.register(healthPlugin)\n\n// Health endpoint available at: GET /v1/health\n// Response: { status: 200, message: 'ok' }\n\nawait runFastify(app, '0.0.0.0', 3000)\n```\n\n### 10. Creating Custom Plugins\n\n```typescript\nimport { createFastify, runFastify, createFastifyPlugin } from '@a_jackie_z/fastify'\nimport { z } from 'zod'\n\n// Create a reusable plugin\nconst myPlugin = createFastifyPlugin((app) => {\n  app.get('/plugin-route', {\n    schema: {\n      response: {\n        200: z.object({\n          message: z.string(),\n        }),\n      },\n    },\n    handler: async () => {\n      return { message: 'From plugin' }\n    },\n  })\n})\n\n// Use the plugin\nconst app = await createFastify()\nawait app.register(myPlugin)\n\nawait runFastify(app, '0.0.0.0', 3000)\n```\n\n### 11. Zod Schema Validation\n\n```typescript\napp.route({\n  method: 'POST',\n  url: '/users',\n  schema: {\n    body: z.object({\n      name: z.string().min(1).max(100),\n      email: z.string().email(),\n      age: z.number().min(0).max(150).optional(),\n    }),\n    response: {\n      201: z.object({\n        id: z.string(),\n        name: z.string(),\n        email: z.string(),\n      }),\n      400: z.object({\n        error: z.string(),\n      }),\n    },\n  },\n  handler: async (request, reply) => {\n    const user = request.body\n    reply.status(201)\n    return {\n      id: 'generated-id',\n      ...user,\n    }\n  },\n})\n```\n\n### 12. Response Formatting\n\nAll responses should follow a consistent format using the provided utility functions:\n\n#### Success Response Format\n\n```typescript\nimport { formatSuccess } from '@a_jackie_z/fastify-types'\n\napp.route({\n  method: 'GET',\n  url: '/users/:id',\n  schema: {\n    params: z.object({\n      id: z.string(),\n    }),\n    response: {\n      200: z.object({\n        status: z.number(),\n        success: z.boolean(),\n        data: z.object({\n          id: z.string(),\n          name: z.string(),\n          email: z.string(),\n        }),\n      }),\n    },\n  },\n  handler: async (request, reply) => {\n    const { id } = request.params\n    const user = await findUser(id) // Your logic here\n    \n    return reply.status(200).send(\n      formatSuccess(200, user)\n    )\n    // Returns: { status: 200, success: true, data: { id, name, email } }\n  },\n})\n```\n\n#### Error Response Format\n\n```typescript\nimport { formatError } from '@a_jackie_z/fastify-types'\n\napp.route({\n  method: 'DELETE',\n  url: '/users/:id',\n  handler: async (request, reply) => {\n    const { id } = request.params\n    \n    const user = await findUser(id)\n    if (!user) {\n      return reply.status(404).send(\n        formatError(404, 'Not Found', `User with ID ${id} not found`)\n      )\n      // Returns: { status: 404, success: false, error: 'Not Found', message: '...' }\n    }\n    \n    await deleteUser(id)\n    return reply.send(formatSuccess(200, { message: 'User deleted' }))\n  },\n})\n```\n\n#### Automatic Validation Error Formatting\n\nValidation errors are automatically formatted with field-level details:\n\n```typescript\napp.route({\n  method: 'POST',\n  url: '/users',\n  config: { jwtTypes: false },\n  schema: {\n    body: z.object({\n      username: z.string().min(3, 'Username must be at least 3 characters'),\n      email: z.string().email('Invalid email format'),\n      age: z.number().int().min(18, 'Must be at least 18 years old'),\n    }),\n  },\n  handler: async (request, reply) => {\n    // If validation fails, automatic error response:\n    // {\n    //   status: 400,\n    //   success: false,\n    //   error: 'Validation Error',\n    //   message: 'Request validation failed',\n    //   details: [\n    //     { field: 'username', message: 'Username must be at least 3 characters' },\n    //     { field: 'email', message: 'Invalid email format' },\n    //     { field: 'age', message: 'Must be at least 18 years old' }\n    //   ]\n    // }\n    \n    return reply.send(formatSuccess(200, request.body))\n  },\n})\n```\n\n#### Automatic Error Handling\n\nAll errors follow the standardized format automatically:\n\n- **Validation Errors (400)**: Field-level details with field name and message\n- **Authentication Errors (401)**: JWT token missing or invalid\n- **Authorization Errors (403)**: Insufficient permissions\n- **Not Found Errors (404)**: Resource not found\n- **Rate Limit Errors (429)**: Too many requests\n- **Server Errors (500)**: Internal server errors\n\nAll errors are automatically logged via `fastify.log.error` with request context.\n\n```typescript\n// Authentication error (automatic)\n// GET /protected without JWT token\n// { status: 401, success: false, error: 'Unauthorized', message: 'Invalid or missing JWT token' }\n\n// Authorization error (automatic)\n// GET /admin without admin role\n// { status: 403, success: false, error: 'Forbidden', message: 'Authorization failed' }\n\n// Rate limit error (automatic)\n// Too many requests\n// { status: 429, success: false, error: 'Too Many Requests', message: 'Rate limit exceeded' }\n```\n\n## Configuration Options\n\n### `CreateFastifyOptions`\n\n```typescript\ninterface CreateFastifyOptions {\n  logger?: FastifyServerOptions['loggerInstance']\n  rateLimit?: {\n    global?: RateLimitPluginOptions\n  }\n  jwt?: {\n    secrets: Record<string, string>        // Multiple secrets for key rotation\n    defaultKeyId: string                   // Default secret key ID for signing\n    tokenTypes: Record<string, TokenTypeConfig>  // Token type configurations\n    requiredTypes?: string[]               // Token types always checked (unless jwtTypes: false)\n    debug?: boolean                        // Enable detailed error messages\n  }\n  swagger?: {\n    title: string\n    version: string\n    description: string\n    routePrefix?: string                   // Default: '/docs/'\n  }\n}\n\ninterface TokenTypeConfig {\n  headerName: string          // Header to extract token from\n  expiresIn: string          // Token expiration (e.g., '15m', '7d', '1h')\n  payloadSchema?: z.ZodSchema // Optional Zod schema for payload validation\n  algorithm?: Algorithm       // JWT signing algorithm (default: 'HS256')\n  iss?: string               // Token issuer\n  aud?: string               // Token audience\n  allowedIss?: string[]      // Allowed issuers for verification (bypass if undefined)\n  header?: {                 // Optional JWT header configuration\n    typ?: string             // Token type (typically 'JWT')\n    cty?: string             // Content type\n    [key: string]: any       // Custom header claims\n  }\n}\n```\n\n### Route JWT Configuration\n\nRoutes configure JWT requirements using `jwtTypes`:\n\n```typescript\n// Public route - no JWT required\nconfig: { jwtTypes: false }\n\n// Protected route - requires specific token types\nconfig: { jwtTypes: ['access'] }\n\n// Multiple token types required\nconfig: { jwtTypes: ['access', 'service'] }\n\n// No config - uses global requiredTypes (if configured)\n// No config specified\n```\n\n## API Reference\n\n### Server Functions (`@a_jackie_z/fastify`)\n\n#### `createFastify(options?: CreateFastifyOptions): Promise<FastifyServer>`\n\nCreates and configures a Fastify server instance with Zod support and optional plugins.\n\n#### `runFastify(fastify: FastifyServer, host: string, port: number): Promise<void>`\n\nStarts the Fastify server. Handles errors and exits the process if the server fails to start.\n\n**Parameters:**\n\n- `fastify` - The Fastify server instance\n- `host` - The host to bind to (e.g., '0.0.0.0' or 'localhost')\n- `port` - The port number to listen on\n\n**Example:**\n```typescript\nconst app = await createFastify()\nawait runFastify(app, '0.0.0.0', 3000)\n```\n\n#### Server-Side Crypto Utilities\n\n```typescript\nimport { generateId, generateSessionToken, generateSecureString } from '@a_jackie_z/fastify'\n\n// Generate 16-character alphanumeric ID\nconst id = generateId() // \"A1b2C3d4E5f6G7h8\"\n\n// Generate 64-character hex session token  \nconst token = generateSessionToken() // \"abc123...def789\"\n\n// Generate custom secure string\nconst customId = generateSecureString(8, '0123456789') // \"42875391\"\n```\n\n### Response Formatting Functions (`@a_jackie_z/fastify-types`)\n\n#### `formatSuccess<T>(status: number, data: T): SuccessResponse<T>`\n\nCreates a standardized success response.\n\n**Parameters:**\n- `status` - HTTP status code (e.g., 200, 201)\n- `data` - Response data of any type\n\n**Returns:** `SuccessResponse<T>`\n```typescript\n{\n  status: number\n  success: true\n  data: T\n}\n```\n\n**Example:**\n```typescript\nreturn reply.send(formatSuccess(200, { id: '123', name: 'John' }))\n// Returns: { status: 200, success: true, data: { id: '123', name: 'John' } }\n```\n\n#### `formatError(status: number, error: string, message: string, details?: ValidationDetail[]): ErrorResponse`\n\nCreates a standardized error response.\n\n**Parameters:**\n- `status` - HTTP status code (e.g., 400, 404, 500)\n- `error` - Error type/name (e.g., 'Not Found', 'Validation Error')\n- `message` - Human-readable error message\n- `details` - Optional array of validation error details\n\n**Returns:** `ErrorResponse`\n```typescript\n{\n  status: number\n  success: false\n  error: string\n  message: string\n  details?: ValidationDetail[]\n}\n```\n\n**Example:**\n```typescript\nreturn reply.status(404).send(\n  formatError(404, 'Not Found', 'User not found')\n)\n// Returns: { status: 404, success: false, error: 'Not Found', message: 'User not found' }\n```\n\n### Response Type Interfaces (`@a_jackie_z/fastify-types`)\n\n#### `SuccessResponse<T>`\n```typescript\ninterface SuccessResponse<T> {\n  status: number\n  success: true\n  data: T\n}\n```\n\n#### `ErrorResponse`\n```typescript\ninterface ErrorResponse {\n  status: number\n  success: false\n  error: string\n  message: string\n  details?: ValidationDetail[]\n}\n```\n\n#### `ValidationDetail`\n```typescript\ninterface ValidationDetail {\n  field: string\n  message: string\n}\n```\n\n### Zod Schema Helpers (`@a_jackie_z/fastify-types`)\n\nFor defining response schemas with Zod validation:\n\n#### `successResponseSchema<T>(dataSchema: T): ZodObject`\n\nCreates a Zod schema for standardized success responses.\n\n**Parameters:**\n- `dataSchema` - Zod schema for the data payload\n\n**Returns:** Zod object schema matching `SuccessResponse<T>`\n\n**Example:**\n```typescript\nimport { z } from 'zod'\nimport { successResponseSchema } from '@a_jackie_z/fastify-types'\n\nconst userSchema = z.object({\n  id: z.string(),\n  name: z.string(),\n})\n\nconst loginResponseSchema = {\n  body: z.object({\n    username: z.string(),\n    password: z.string(),\n  }),\n  response: {\n    200: successResponseSchema(z.object({\n      accessToken: z.string(),\n      refreshToken: z.string(),\n    })),\n  },\n}\n```\n\n#### `errorResponseSchema: ZodObject`\n\nZod schema for standardized error responses. Matches `ErrorResponse` interface.\n\n**Example:**\n```typescript\nimport { errorResponseSchema } from '@a_jackie_z/fastify-types'\n\nconst myRouteSchema = {\n  response: {\n    200: successResponseSchema(z.object({ success: z.boolean() })),\n    400: errorResponseSchema,\n    401: errorResponseSchema,\n    404: errorResponseSchema,\n  },\n}\n```\n\n## JWT Service API\n\n### FastifyJwtService\n\nThe `FastifyJwtService` is automatically decorated on your Fastify instance when JWT is configured. Access it via `app.jwtService`.\n\n#### Methods\n\n**`generateToken(typeName: string, payload: Record<string, any>): string`**\n\nGenerate a JWT token for a specific token type.\n\n```typescript\nconst accessToken = app.jwtService.generateToken('access', {\n  identityId: 'user-123',\n  role: 'admin',\n})\n\nconst serviceToken = app.jwtService.generateToken('service', {\n  serviceId: 'gateway',\n})\n```\n\n**`verifyToken(typeName: string, token: string): any`**\n\nVerify and decode a JWT token for a specific token type. Returns the payload if valid, throws error if invalid.\n\n```typescript\ntry {\n  const payload = app.jwtService.verifyToken('access', token)\n  console.log(payload.identityId)\n} catch (err) {\n  console.error('Invalid token:', err.message)\n}\n```\n\n**`extractTokenFromHeader(headerValue: string | string[] | undefined, typeName: string): string | null`**\n\nExtract a token from a header value for a specific token type.\n\n```typescript\nconst token = app.jwtService.extractTokenFromHeader(\n  request.headers.authorization,\n  'access'\n)\n```\n\n**`getTokenTypeConfig(typeName: string): TokenTypeConfig | undefined`**\n\nGet the configuration for a specific token type.\n\n```typescript\nconst config = app.jwtService.getTokenTypeConfig('access')\nconsole.log(config.expiresIn) // '15m'\n```\n\n**`getTokenTypeNames(): string[]`**\n\nGet all configured token type names.\n\n```typescript\nconst types = app.jwtService.getTokenTypeNames()\nconsole.log(types) // ['access', 'refresh', 'service']\n```\n\n## Testing Your API\n\n1. Start your server\n2. Access Swagger documentation at `http://localhost:3000/docs`\n3. Test authentication:\n\n```bash\n# Login\ncurl -X POST http://localhost:3000/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"username\":\"admin\",\"password\":\"secret\"}'\n\n# Use access token\ncurl http://localhost:3000/user/profile \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\"\n\n# Service-to-service (with both tokens)\ncurl http://localhost:3000/api/data \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"X-Service-Authorization: YOUR_SERVICE_TOKEN\"\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}