{"_id":"@alvin0/http-driver","_rev":"21-7d4093d7d696701936d6b1431d0ca73e","name":"@alvin0/http-driver","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@alvin0/http-driver","version":"0.1.0","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.0","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"85805d676d2306681756cd5eef025dc76bb8f9ff","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.0.tgz","fileCount":11,"integrity":"sha512-M2Mln4BZpq8yAmneDtN5jyzYIcqaodNG7CUYPN0GLq+XW06zid7fFZya8tjdyKaOZuhnbiuaxJalswavwp3RqQ==","signatures":[{"sig":"MEYCIQDvM9pLDe5xxRMli8jWDVFtGT4INptcA2gD7DfwKabimgIhAIZ5EF7U6N3srOOO5XUPLqaka0FMbsC6rqAb87/F6/uE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28317},"main":"src/index.ts","gitHead":"e376e2aa0cdf0d59a2a60e4df195e256218ed174","scripts":{"test":"jest"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","_hasShrinkwrap":false,"devDependencies":{"qs":"^6.13.0","jest":"^29.7.0","axios":"^1.7.7","apisauce":"^3.1.0","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.0_1729667031195_0.046725969021560454","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@alvin0/http-driver","version":"0.1.1","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.1","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"99a73d8f61cf68dde8b2e74b36361aaf6bb7ed28","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.1.tgz","fileCount":11,"integrity":"sha512-nIBTmJJX0iqLOY7L2p7e0/00emPtTLcGhf2LxayVc3gU5unpmYECL0HrVHmuZB3sOqiqpyFID0Wy0tPzYGtiPw==","signatures":[{"sig":"MEYCIQC2peI6/en13EimVtswlqAuQOoVJnVeBElHnnin/mLDPwIhAJ+63tziiOg+rxviTu9d3Fpqe/PvHlaJgUj+TcYAIGww","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28349},"main":"src/index.ts","gitHead":"630cfbb957e0cc51d3936c923a45aabe5d23fcde","scripts":{"test":"jest"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","_hasShrinkwrap":false,"devDependencies":{"qs":"^6.13.0","jest":"^29.7.0","axios":"^1.7.7","apisauce":"^3.1.0","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.1_1729667579710_0.4838385200948132","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"@alvin0/http-driver","version":"0.1.2","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.2","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"ce7b613865231fba8077a69e82bea0383ceebd23","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.2.tgz","fileCount":11,"integrity":"sha512-nxnMXltdAT2SdXXbnIdqKMBliq2qUt4kACnk0ksTm7JycVXW5P8UyMUnICrpNZ9yTwRRskyUpcNs0zloHnjStA==","signatures":[{"sig":"MEUCIQC4RJcIqbgL71JhjXAztsIgiJwxyBVlKAbcx/c3s/R93wIgE6SJjXh/F1UWAnh29e+Rj/aDhfCE9nnoj5zODv6BZDA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28373},"main":"src/index.ts","gitHead":"7b6f41b81187c8e130a3268ce20d8da6dc6292bd","scripts":{"test":"jest"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.2_1729668894383_0.17889054901500168","host":"s3://npm-registry-packages"}},"0.1.3":{"name":"@alvin0/http-driver","version":"0.1.3","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.3","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"49f522bc19beff6298a53a5b64ccfa544d618aee","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.3.tgz","fileCount":14,"integrity":"sha512-j2EpyevjLtjtW9Ws2ksBkcLuB9a0sa69wsXOeUjZpAfj/9LFCRhDQ+UTCj1cC2IdKfoXwSGU5cC5TXIgVDKJ6g==","signatures":[{"sig":"MEUCIBYTAQJGuylT0r7ayYbS4fHuf1i4Hl26Y9siSASvBeeRAiEAtYqI3J6409oZb3pRwbs5TstYCrUhXaLDET5R1KMjctU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29128},"main":"src/index.ts","gitHead":"6a03e07cb7abe90c037f1be22590388f800d7fe3","scripts":{"test":"jest"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","@jest/globals":"^29.7.0","@babel/preset-typescript":"^7.25.9"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.3_1729669316588_0.4835262469545809","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"@alvin0/http-driver","version":"0.1.4","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.4","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"ffb9cc473410aaff5972cd77e62f8b3b1b448efa","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.4.tgz","fileCount":14,"integrity":"sha512-xR6W7QGsVEkMa7z250BCmy3RP+UaoJnuZxE9TpsPknc4KwNcdMvswPKaCx1WD0qqw5EAKaOEWhKf4rcqHDMAaA==","signatures":[{"sig":"MEUCIQC/+opPSlC3/7wuTxek3mMv6e9BgYX5XE6G/dZWQ3zfeAIgFXP5NewREjzP9K23ZH18HDWBFnkxBhCq5orT/LbmfrE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29128},"main":"src/index.ts","gitHead":"1ecd813767370df4737d5943009cb34a93ffb3bd","scripts":{"test":"jest"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","@jest/globals":"^29.7.0","@babel/preset-typescript":"^7.25.9"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.4_1729669387624_0.33678170973982224","host":"s3://npm-registry-packages"}},"0.1.5":{"name":"@alvin0/http-driver","version":"0.1.5","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.5","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"9f2f3f485056703b4298a30cdeb3470bd000661f","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.5.tgz","fileCount":14,"integrity":"sha512-VkEWx9GR2VOz4KFNTuOJEd8qIfqzfk9MjzjEc6iFvALyR7Sw2Y0ThouyswlQ4Cfl5t3GI2AX4QEAHHXHZ3o8dg==","signatures":[{"sig":"MEUCID0H2eohmH++w4hB8b2veUGPZ9jtNENy1gD+Px4sbE8pAiEA6nFxrfCILcHgN5g8yT+eFVngkTDixH0TfzGucxyy9X4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29088},"main":"src/index.ts","gitHead":"c60d05123ec8337ccd4965000a6adbf9ca60c2bd","scripts":{"test":"jest"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","@jest/globals":"^29.7.0","@babel/preset-typescript":"^7.25.9"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.5_1729669735369_0.5712172267261537","host":"s3://npm-registry-packages"}},"0.1.6":{"name":"@alvin0/http-driver","version":"0.1.6","keywords":["javascript","axios","apisauce","fetch","typescript","http","http-driver"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.6","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"14b7bdc3e78f7416df2a89489539cffc0d904ef4","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.6.tgz","fileCount":17,"integrity":"sha512-10I3jes9f6IBW5SIyDsgwoZUarY0oEI9Zu83s9iuINpFuENuq14Zb6WC2tM8eCGlaqhsQrycoB0ycLpGSKHVwQ==","signatures":[{"sig":"MEUCIGF79aCtGJwMdTN8zlLsKmLCbSB8kHQk9WRwoFNb6B8fAiEAlJipvPBWIsSbgj7T4lj2U2P/ApM00uNHF/JMo2qO9q0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47877},"main":"src/index.ts","gitHead":"34f33782ae327549d888a8ebeb93ce1f66d67c23","scripts":{"test":"jest","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0","@types/qs":"^6.9.16"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","@jest/globals":"^29.7.0","@babel/preset-typescript":"^7.25.9"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.6_1729670182044_0.4705943569039974","host":"s3://npm-registry-packages"}},"0.1.7":{"name":"@alvin0/http-driver","version":"0.1.7","keywords":["javascript","axios","apisauce","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.7","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"5adbaa702e8d4356716e5f5ccfd1dbead3d1f3d5","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.7.tgz","fileCount":19,"integrity":"sha512-DsNTqWbwY9++SvQraACNvBgc0FTsmLG1q/RKscygSyQk/2/ZiT6er3UbArKugE4KaxkopAQvYlYxEDI7nytsPA==","signatures":[{"sig":"MEUCIF8er9lFApJlhJ8Q7R37eM54Htjn07sEeQrL/U2d4WxKAiEAkGeSU9vF/4SEt7LlgvYfavE3TGWsYVM5C4oyQuTBjns=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":62444},"main":"src/index.ts","types":"./src/index.d.ts","gitHead":"36d5ccf8e3ddd6708ca2e3b1a1efab55be79e446","scripts":{"test":"jest","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0","@types/qs":"^6.9.16"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","typescript":"5.1.3","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.7_1729671389160_0.026115572809871868","host":"s3://npm-registry-packages"}},"0.1.8":{"name":"@alvin0/http-driver","version":"0.1.8","keywords":["javascript","axios","apisauce","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.8","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"26523b18d4fcb63dc9e9d23da160c181f5937291","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.8.tgz","fileCount":19,"integrity":"sha512-rkXzPiOwsF0y8F8mZvSQvEmLxtwXzqeIhIISRQtKXB4K41u2OzMQQsalGyHRms7lo2FBPFq1xO71SiZzm68X6A==","signatures":[{"sig":"MEQCIAq7D9gu/ilaeihXWZslsbHoA6AOefebRGrkoJiiUYSAAiBxWyFMzoxY7ick+HEkSL7eva7ZyTY0N0ZFWbdSa8OgnQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":62444},"main":"src/index.js","types":"./src/index.d.ts","gitHead":"b65aad007877da595d1d39d4e238b988672c2043","scripts":{"test":"jest","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0","@types/qs":"^6.9.16"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","typescript":"5.1.3","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.8_1729671538710_0.8042839989438308","host":"s3://npm-registry-packages"}},"0.1.9":{"name":"@alvin0/http-driver","version":"0.1.9","keywords":["javascript","axios","apisauce","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.9","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"752ac8c1fc50d58229bc237d85105d902edbffe4","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.9.tgz","fileCount":19,"integrity":"sha512-avEjdmp9tVkWm1hks378WVbzH4Yh/MTFWjoTC3xnt1aKZPZUKyNGb+RO2vZQuM9wy4yM8+IzeBHHTlXIl3D0mQ==","signatures":[{"sig":"MEYCIQDbqAmxK5G2J4I5P0R4U+2GnVTmfRQCNoocx00DlF/vUQIhALnQwzEkGFP4SvaQ6zUwbFyXOwf/V+7jOIAPSfVeXR5A","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":89722},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"4a411d2e9d3e604a1a8d51297c480226fc6bf41d","scripts":{"test":"jest","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0","@types/qs":"^6.9.16"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","typescript":"5.1.3","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.9_1729741640684_0.3444776260035918","host":"s3://npm-registry-packages"}},"0.1.10":{"name":"@alvin0/http-driver","version":"0.1.10","keywords":["javascript","axios","apisauce","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.10","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"67e70e0814cb677ce322a973779efaa0a0a79948","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.10.tgz","fileCount":19,"integrity":"sha512-b2pkKrqo/K+7C+zD2AiuiJ6RCm8rBJqcZk6O1uoScoz3Oqg8GOaOrQtpkQUUC++Buc9wq1hIHsT+maCrCiu/sw==","signatures":[{"sig":"MEUCIQCOib1Ya7e8l+qqWQXWFjFwzShqhE+p97X78bIw5hKPHgIgXWukEAVXAcvCWzJhA/lQXnP0cqOCc4ltHJKzouMkIA4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":92556},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"f82db8d38132360ced02f64943f9a5db612d9ab1","scripts":{"test":"jest","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0","@types/qs":"^6.9.16"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","typescript":"5.1.3","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.10_1734427064390_0.5418142119212701","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@alvin0/http-driver","version":"0.1.11","keywords":["javascript","axios","apisauce","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.1.11","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"4bd1906e0e47a44009f5e07cbefa82d0a8aa346f","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.1.11.tgz","fileCount":19,"integrity":"sha512-ZFgBSukvV5tOLc6m2UKgRZDO+lI2vpFXjYvhISMlFOoiSHCECGyTVf+cppArIM7fW0PU1cague8H1/ZtrHqMdw==","signatures":[{"sig":"MEUCIQCMT1FMvGePtPneX4iwxo0Ac0k0LxsvvFLLh9yeXedpAQIgN6iExTi3yDuhZCjNtwMEBC22ME7VbwYcLbLViScDR6E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":92830},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"ea7b4467ec771148d7449117c8241e491c441993","scripts":{"test":"jest","build":"tsc","start":"node dist/index.js"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"10.8.3","description":"HttpDriver will help you manage APIs on a per-service basis. HttpDriver utilizes apisauce to wrap and also provides support for fetch.","directories":{"example":"example"},"_nodeVersion":"22.1.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7","apisauce":"^3.1.0","@types/qs":"^6.9.16"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-loader":"^9.5.1","typescript":"5.1.3","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.1.11_1734428275424_0.550438053165411","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alvin0/http-driver","version":"0.2.0","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.0","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"2e717e843dbe67780f71508f998858ff60cd7fa5","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.0.tgz","fileCount":68,"integrity":"sha512-tAG5ZqebGD6OV3tQMDXICgD0CuCfIl5pFnaQJfikXzH+8y7qyxyZs/Azn9t3FePjFBa4lfWLrTveqgwGrPfSmg==","signatures":[{"sig":"MEQCIA6E1OQ/qx+9vZ40Ae5cW3G3sN9GzHUSNDz8A23zqdDtAiAuPiw/qP7ledYp4hrsDQrVtkvagKl2CPWgmeLF3gY9Sw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363964},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"c96aca25918cf899bc1dc933d9c9c2141c95507e","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.4.2","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"23.5.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.9.18","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.0_1755359360505_0.4995774014214671","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@alvin0/http-driver","version":"0.2.1","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.1","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"e19b2cba69ea6c59ca831389330ad7afbe4fb287","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.1.tgz","fileCount":68,"integrity":"sha512-hoQN8NzjUEdFhvHnmJnJlc6mVk08BILNKvXQPDMX7khQpRyvX8/+KPTBlRUiqOLffP+FILbzDq8LQ/RUr9+DWg==","signatures":[{"sig":"MEYCIQDtowFzmmdi83Q5v/0McAFNSoj4tkOowoOTrLEYcGGx4AIhANQBCfGcHpIOVF9KkjcHOI8uc9gAEg71Ly/fpE1JxzIy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":366376},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"c96aca25918cf899bc1dc933d9c9c2141c95507e","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.4.2","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"23.5.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.9.18","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.1_1755360041254_0.6518705817365107","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@alvin0/http-driver","version":"0.2.2","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.2","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"6005e08fe234c674b098d5164b536e6bdd87c206","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.2.tgz","fileCount":70,"integrity":"sha512-C0wOW3uF/y/ml6p5P2WlgnH809fBESS0WCtmXswnooaKa6Z8IGmr6EWd0p8zItvPKgotbYRtpEFMbS8bFl4pBA==","signatures":[{"sig":"MEUCIQDnn936peMqhaUc40t2s5PKDKcTRonzjAYOUMTrsSszuwIgXDC58amg0f9KiLqYscId+IQyboo+JvhTB7z7hOVjrXw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389380},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"09c4ee25d97f64de2b50990cc2e287ad0920cb35","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.5.1","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"23.7.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.9.18","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.2_1756293263800_0.5793768809933779","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@alvin0/http-driver","version":"0.2.3","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.3","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"34bec45e763f5467ce300a77f16647520abd8f20","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.3.tgz","fileCount":70,"integrity":"sha512-WNPw2KwEcfp4N998ayIv8/Hi7SUNb9L3/7D9N3CRcX0vqguI/rCYjUhv+szfKesAZ1N7B+dkTk/AsP85M00KRA==","signatures":[{"sig":"MEUCIEus/geHODpY94iOBm0FRT8boD3CCRMW0ejigmKq8/aKAiEAkS8Qs+ClcMBHtDq3nd0xRAglT0Ohw0F/5djC1LGKYMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389356},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"09c4ee25d97f64de2b50990cc2e287ad0920cb35","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.5.1","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"23.7.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.9.18","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.3_1756293368452_0.11142307978015786","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@alvin0/http-driver","version":"0.2.4","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.4","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"30fc12d7e6d0d84a30a6bbda33c1706d562f8053","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.4.tgz","fileCount":71,"integrity":"sha512-lSyhEDDZi0jffagUgv32Qqi5nSN/AdWkv/SnWq+HpfLkACm5vHg24DDLTiS8cJA3AOEXTmCV4msIIl9u+0zSSw==","signatures":[{"sig":"MEQCICU4us7DEf1shWkaIheJWOhX/evkOUIHsqBjDXSBEE1gAiAxftKYJKVjvyhzbO0Fg5B4Ux+KrONrhjT0G8lloQx8Pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392981},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"da46ab1f7035d0d7d4421f66a763b08d78e7f311","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.5.1","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"23.7.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.9.18","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.4_1756366524177_0.46881391935022054","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@alvin0/http-driver","version":"0.2.5","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.5","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"dbb9a6da5a8e053dddfd15b1a05df2616cf971c2","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.5.tgz","fileCount":71,"integrity":"sha512-TYuTzeX6cDXGfSrBkpkgLaGmW3MzJX/auNlKnME/14wQs9GbnGetEC+Oo2OY9D0SuXPwejJF9bTtwC0Huxdx3Q==","signatures":[{"sig":"MEQCIGoizcDblXSoNltnR2POHp/YQeK7qXy/3iOrGnyPsSJWAiAg5pkumzUzY4Rdz7VZjOmfIxAXEsbMu/OaTch1Pn/udQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392907},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"da46ab1f7035d0d7d4421f66a763b08d78e7f311","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.5.1","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"23.7.0","dependencies":{"qs":"^6.13.0","axios":"^1.7.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.9.18","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.5_1756366570017_0.5984752576494881","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@alvin0/http-driver","version":"0.2.6","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.2.6","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"6118532c013659dafa4472bbc411a43e66c1c0ec","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.2.6.tgz","fileCount":72,"integrity":"sha512-mqslZhOyitucEbJvEwPGPA3bODfGdKT0Hz1rWguRnjjp5GPrOYKUqOpKQKn0yIvSsyje9ZQElwlGkWmLUdcDGQ==","signatures":[{"sig":"MEUCIQDoY9Wce0f/senV2G3nSu7hLAywT2Fk8O+u8OGnrSn3lgIgTChA3/twgD8s2SZI9JAKARRGGr0q/iKUtzel0PZ0tOk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":399492},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"c7c692302bd01aba7bdcd0b982e5ca106c524f2a","scripts":{"test":"jest --coverage","build":"tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.6.1","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support (no apisauce).","directories":{"example":"example"},"_nodeVersion":"24.11.0","dependencies":{"qs":"^6.14.0","axios":"^1.13.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.14.0","ts-loader":"^9.5.1","typescript":"5.1.3","@types/jest":"^29.5.14","@jest/globals":"^29.7.0","@babel/preset-env":"^7.26.7","@babel/preset-typescript":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.2.6_1765434296068_0.16719116689762825","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alvin0/http-driver","version":"0.3.0","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","_id":"@alvin0/http-driver@0.3.0","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"homepage":"https://github.com/alvin0/http-driver#readme","bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"dist":{"shasum":"9c8f101d8c4f153577f35ad340bdb370516a618e","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.3.0.tgz","fileCount":23,"integrity":"sha512-kIa443+qIRYlyTyYxcuiOA7PQZRY2mGDHSm9IwIh5V+3WHhOplL+sYtDpEI+nFwLKwnD8h1zFeQKziJSdz2aEg==","signatures":[{"sig":"MEUCIQDGQenavtRrsFNKG8HkHOGtUZ8S+cpJlOJReJ8A7RMl+wIgMi/xxDJNKUhwjHQ6W46GvLdrPOhc9LvksV8U7u1fCvY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82203},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./dist/utils":{"types":"./dist/utils/index.d.ts","default":"./dist/utils/index.js"}},"gitHead":"2668dbbf5813f4cc8a93bf698c4320bc1af963b7","scripts":{"test":"jest --coverage","build":"rm -rf dist && tsc","start":"node dist/index.js","start:example":"ts-node example/index.ts"},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"repository":{"url":"git+https://github.com/alvin0/http-driver.git","type":"git"},"_npmVersion":"11.6.0","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support.","directories":{"example":"example"},"_nodeVersion":"24.9.0","dependencies":{"qs":"^6.14.0","axios":"^1.13.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@types/qs":"^6.14.0","typescript":"^5.7.0","@types/jest":"^29.5.14","@jest/globals":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/http-driver_0.3.0_1774626188706_0.1045661165548244","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alvin0/http-driver","version":"0.4.0","description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support.","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./dist/utils":{"types":"./dist/utils/index.d.ts","default":"./dist/utils/index.js"}},"repository":{"type":"git","url":"git+https://github.com/alvin0/http-driver.git"},"keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"author":{"name":"alvin0"},"license":"MIT","scripts":{"build":"rm -rf dist && tsc","start":"node dist/index.js","test":"jest --coverage","start:example":"ts-node example/index.ts"},"dependencies":{"axios":"^1.13.2","qs":"^6.14.0"},"devDependencies":{"@jest/globals":"^29.7.0","@types/jest":"^29.5.14","@types/qs":"^6.14.0","jest":"^29.7.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","typescript":"^5.7.0"},"directories":{"example":"example"},"bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"homepage":"https://github.com/alvin0/http-driver#readme","_id":"@alvin0/http-driver@0.4.0","gitHead":"d49d2d62915fa5d71f1876695552440da688ceea","_nodeVersion":"24.9.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-og2Wq/DKSCYbefJuC+Yr5xvnEPrZ4A1yD35MYzSGosqZTXoxVX5o6pp7x6jeSqqSpT5p+PFnCk/hcMTOsgzCIQ==","shasum":"3353ef86874824c1df37c96cb37d2fffe24beb26","tarball":"https://registry.npmjs.org/@alvin0/http-driver/-/http-driver-0.4.0.tgz","fileCount":33,"unpackedSize":126945,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCsf7hMuPcL6uxe8L5bWdJtY6zE4jUSGr0Pm5jtbnDDXwIhAPLKZS6NxsO+mFWvXL+38feTeUjq7Nb+CsnY6//b6dS5"}]},"_npmUser":{"name":"alvin0","email":"chaulamdinhai@gmail.com"},"maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/http-driver_0.4.0_1774753884093_0.5342414954585446"},"_hasShrinkwrap":false}},"time":{"created":"2024-10-23T07:03:51.054Z","modified":"2026-03-29T03:11:24.400Z","0.1.0":"2024-10-23T07:03:51.371Z","0.1.1":"2024-10-23T07:12:59.917Z","0.1.2":"2024-10-23T07:34:54.581Z","0.1.3":"2024-10-23T07:41:56.802Z","0.1.4":"2024-10-23T07:43:07.801Z","0.1.5":"2024-10-23T07:48:55.536Z","0.1.6":"2024-10-23T07:56:22.264Z","0.1.7":"2024-10-23T08:16:29.318Z","0.1.8":"2024-10-23T08:18:59.051Z","0.1.9":"2024-10-24T03:47:20.883Z","0.1.10":"2024-12-17T09:17:44.540Z","0.1.11":"2024-12-17T09:37:55.619Z","0.2.0":"2025-08-16T15:49:20.727Z","0.2.1":"2025-08-16T16:00:41.471Z","0.2.2":"2025-08-27T11:14:23.997Z","0.2.3":"2025-08-27T11:16:08.656Z","0.2.4":"2025-08-28T07:35:24.382Z","0.2.5":"2025-08-28T07:36:10.190Z","0.2.6":"2025-12-11T06:24:56.254Z","0.3.0":"2026-03-27T15:43:08.859Z","0.4.0":"2026-03-29T03:11:24.267Z"},"bugs":{"url":"https://github.com/alvin0/http-driver/issues"},"author":{"name":"alvin0"},"license":"MIT","homepage":"https://github.com/alvin0/http-driver#readme","keywords":["javascript","axios","fetch","typescript","http-driver","api","network","http"],"repository":{"type":"git","url":"git+https://github.com/alvin0/http-driver.git"},"description":"HttpDriver helps manage APIs on a per-service basis with direct Axios and Fetch support.","maintainers":[{"name":"alvin0","email":"chaulamdinhai@gmail.com"}],"readme":"# HttpDriver\n\n![Test Coverage](https://img.shields.io/badge/Coverage-100%25-brightgreen.svg)\n\nFully typed, per-service HTTP client for Axios and Fetch with built-in retry, caching, deduplication, middleware, and observability.\n\n## Install\n\n```bash\nnpm install @alvin0/http-driver\n```\n\n## Quick Start\n\n```ts\nimport { DriverBuilder, MethodAPI } from \"@alvin0/http-driver\";\n\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices([\n    { id: \"users.list\", url: \"users\", method: MethodAPI.get },\n    { id: \"users.detail\", url: \"users/{id}\", method: MethodAPI.get },\n    { id: \"users.create\", url: \"users\", method: MethodAPI.post },\n  ])\n  .build();\n\n// Axios path\nconst users = await api.execService({ id: \"users.list\" });\n\n// Fetch path\nconst user = await api.execServiceByFetch(\n  { id: \"users.detail\", params: { id: \"1\" } }\n);\n\n// Both return the same shape\nconsole.log(user.ok, user.status, user.data, user.duration);\n```\n\n## Features\n\n- Dual HTTP paths — Axios (`execService`) and Fetch (`execServiceByFetch`)\n- Full TypeScript support with generic `ResponseFormat<T>`\n- SSE streaming (`execServiceByStream`) with spec-compliant parser\n- NDJSON streaming (`execServiceByNDJSON`) for line-delimited JSON\n- GraphQL client helper (`createGraphQLClient`) with query/mutation shortcuts\n- Upload/download progress tracking via ReadableStream\n- WebSocket client with auto-reconnect and typed messages\n- Retry with fixed/exponential backoff (global or per-service)\n- In-memory response caching with TTL, max-size eviction, and periodic cleanup\n- Automatic request deduplication for concurrent bodyless calls (GET, HEAD, DELETE)\n- Per-service and global timeout via `AbortSignal.timeout()` with fallback\n- Middleware pipeline (onion model) with double-call protection\n- Observability hooks (`onRequest` / `onResponse`)\n- URL versioning with multiple positioning strategies\n- URL parameter encoding via `encodeURIComponent` for safe URL construction\n- Sync/async request and response transforms (Axios & Fetch)\n- Token refresh interceptor with queue management\n- Multipart/form-data with bracket notation (`parent[child]`) and automatic boundary handling\n- Standardized error normalization (TimeoutError, NetworkError, etc.)\n- Proper handling of 204 No Content and 304 Not Modified responses\n\n## Response Shape\n\nEvery call returns:\n\n```ts\ninterface ResponseFormat<T = unknown> {\n  ok: boolean;           // true if status 200-299\n  status: number;        // HTTP status code\n  data: T;               // Response body\n  problem: string | null;\n  originalError: string | null;\n  headers?: Headers | Record<string, string> | null;\n  duration: number;      // Request time in ms\n}\n```\n\n## Service Definition\n\n```ts\nimport { MethodAPI, type ServiceApi } from \"@alvin0/http-driver\";\n\nconst services: ServiceApi[] = [\n  { id: \"posts.list\", url: \"posts\", method: MethodAPI.get },\n  { id: \"posts.detail\", url: \"posts/{id}\", method: MethodAPI.get },\n  { id: \"posts.create\", url: \"posts\", method: MethodAPI.post },\n  // Per-service timeout and retry\n  {\n    id: \"reports.generate\",\n    url: \"reports\",\n    method: MethodAPI.get,\n    timeout: 30000,\n    retry: { maxAttempts: 3, delay: 2000, backoff: \"exponential\" },\n  },\n];\n```\n\n## Retry\n\n```ts\n// Global — applies to all services\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withRetry({ maxAttempts: 3, delay: 1000, backoff: \"exponential\" })\n  .build();\n\n// Per-service — overrides global\nconst services: ServiceApi[] = [\n  {\n    id: \"flaky\",\n    url: \"api/flaky\",\n    method: MethodAPI.get,\n    retry: { maxAttempts: 5, delay: 500, retryOn: [502, 503] },\n  },\n];\n```\n\n```ts\ninterface RetryConfig {\n  maxAttempts?: number;                    // default: 0 (disabled)\n  delay?: number;                          // default: 1000ms\n  backoff?: \"fixed\" | \"exponential\";       // default: \"fixed\"\n  retryOn?: number[];                      // default: [408, 429, 500, 502, 503, 504]\n}\n```\n\n## Caching\n\n```ts\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withCache({ enabled: true, ttl: 30000, getOnly: true })\n  .build();\n```\n\nOnly successful responses are cached. Error responses are never cached.\nThe cache has a max size of 1000 entries with LRU eviction and automatic periodic cleanup of expired entries.\n\n```ts\ninterface CacheConfig {\n  enabled?: boolean;   // default: false\n  ttl?: number;        // default: 30000ms\n  getOnly?: boolean;   // default: true\n}\n```\n\n## Timeout\n\n```ts\n// Global timeout\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withTimeout(5000)\n  .build();\n\n// Per-service timeout (overrides global)\nconst services: ServiceApi[] = [\n  { id: \"slow\", url: \"reports\", method: MethodAPI.get, timeout: 30000 },\n];\n```\n\nTimeout uses `AbortSignal.timeout()` when available (Node 17.3+, modern browsers) for automatic cleanup. Falls back to `AbortController` + `setTimeout` with `unref()` in older environments. If a `signal` is already provided in options, timeout is skipped.\n\n## Middleware\n\nOnion-model pipeline. Each middleware wraps the next.\n\n```ts\nimport type { MiddlewareContext, MiddlewareFn } from \"@alvin0/http-driver\";\n\nconst logger: MiddlewareFn = async (ctx, next) => {\n  console.log(`→ ${ctx.method.toUpperCase()} ${ctx.url}`);\n  await next();\n  console.log(`← ${ctx.response?.status}`);\n};\n\nconst auth: MiddlewareFn = async (ctx, next) => {\n  ctx.options = { ...ctx.options, headers: { Authorization: \"Bearer ...\" } };\n  await next();\n};\n\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .use(logger)\n  .use(auth)\n  .build();\n```\n\nMiddleware can short-circuit by not calling `next()`. Calling `next()` multiple times is safe — the core function will only execute once.\n## Observability Hooks\n\n```ts\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .onRequest(({ url, method, serviceId, timestamp }) => {\n    console.log(`[${serviceId}] ${method} ${url}`);\n  })\n  .onResponse(({ serviceId, status, duration, ok }) => {\n    metrics.record(serviceId, { status, duration, ok });\n  })\n  .build();\n```\n\n## AbortController\n\n```ts\nconst controller = new AbortController();\nconst promise = api.execService(\n  { id: \"posts.list\" }, undefined, { signal: controller.signal }\n);\ncontroller.abort();\nconst res = await promise;\n// res.ok === false, res.status === 408\n```\n\nWorks on both Axios and Fetch paths. You can also pass `{ abortController }` and the library forwards `.signal`.\n\n## Version Configuration\n\nDisabled by default. Must be explicitly enabled.\n\n```ts\n// Simple\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .enableVersioning()\n  .withGlobalVersion(1)\n  .build();\n// → https://api.example.com/v1/users\n\n// Custom template (auto-enables versioning)\nconst api2 = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withVersionTemplate(\"{baseURL}/api/{version}/{endpoint}\")\n  .withGlobalVersion(2)\n  .build();\n// → https://api.example.com/api/v2/users\n\n// Full config\nconst api3 = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withVersionConfig({\n    enabled: true,\n    position: \"prefix\",      // \"after-base\" | \"before-endpoint\" | \"prefix\" | \"custom\"\n    prefix: \"v\",             // default: \"v\"\n    defaultVersion: 1,\n  })\n  .build();\n// → https://v1.api.example.com/users\n```\n\nPosition strategies:\n- `after-base` (default): `https://api.example.com/v1/users`\n- `before-endpoint`: `https://api.example.com/v1/users` (version inserted between base and endpoint)\n- `prefix`: `https://v1.api.example.com/users` (version as subdomain)\n- `custom`: uses `template` string with `{baseURL}`, `{version}`, `{endpoint}` placeholders\n\nService-level `version` overrides the global default:\n\n```ts\nconst services: ServiceApi[] = [\n  { id: \"users\", url: \"users\", method: MethodAPI.get },           // uses global\n  { id: \"legacy\", url: \"old\", method: MethodAPI.get, version: 1 }, // uses v1\n];\n```\n\n## Transforms (Axios)\n\n```ts\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  // Sync request transform\n  .withAddRequestTransformAxios((req) => {\n    req.headers = { ...req.headers, \"X-App\": \"demo\" };\n  })\n  // Async request transform\n  .withAddAsyncRequestTransformAxios((register) => {\n    register(async (req) => {\n      const token = await getToken();\n      req.headers = { ...req.headers, Authorization: `Bearer ${token}` };\n    });\n  })\n  // Sync response transform\n  .withAddResponseTransformAxios((resp) => {\n    // resp is ApiResponseLike shape\n  })\n  // Async response transform\n  .withAddAsyncResponseTransformAxios((register) => {\n    register(async (res) => { /* async work */ });\n  })\n  .build();\n```\n\n## Transforms (Fetch)\n\n```ts\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withAddRequestTransformFetch((url, requestOptions) => ({\n    url: url + \"?via=fetch\",\n    requestOptions: { ...requestOptions, headers: { ...requestOptions.headers, \"X-Fetch\": \"1\" } },\n  }))\n  .withAddTransformResponseFetch((response) => ({\n    ...response,\n    data: { wrapped: true, original: response.data },\n  }))\n  .build();\n```\n\n## Token Refresh Interceptor\n\n```ts\nconst api = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(services)\n  .withHandleInterceptorErrorAxios(\n    (axiosInstance, processQueue, isRefreshing, addToQueue) => async (error) => {\n      if (error?.response?.status === 401 && !isRefreshing.value) {\n        isRefreshing.value = true;\n        try {\n          const { data } = await axiosInstance.post(\"/auth/refresh\");\n          processQueue(null, data.token);\n          return axiosInstance.request(error.config);\n        } catch (refreshError) {\n          processQueue(refreshError, null);\n          return Promise.reject(refreshError);\n        } finally {\n          isRefreshing.value = false;\n        }\n      }\n\n      if (isRefreshing.value) {\n        return new Promise((resolve, reject) => {\n          addToQueue(\n            (token) => { error.config.headers.Authorization = `Bearer ${token}`; resolve(axiosInstance.request(error.config)); },\n            reject\n          );\n        });\n      }\n\n      return Promise.reject(error);\n    }\n  )\n  .build();\n```\n\n`isRefreshing` is passed by reference (`{ value: boolean }`) so the consumer can mutate it. `addToQueue` lets you push failed requests to the internal queue, and `processQueue` resolves/rejects them all at once.\n\n## getInfoURL\n\nCompile a URL without making a request:\n\n```ts\nconst info = api.getInfoURL(\n  { id: \"posts.detail\", params: { id: 1 } },\n  { q: \"abc\", page: 2 }\n);\n// info.fullUrl → \"https://api.example.com/posts/1?q=abc&page=2\"\n```\n\n## Standalone httpClientFetch\n\n```ts\nimport { httpClientFetch } from \"@alvin0/http-driver/dist/utils\";\nimport { MethodAPI } from \"@alvin0/http-driver\";\n\nconst res = await httpClientFetch({\n  url: \"https://example.com/posts/{id}\",\n  method: MethodAPI.get,\n  param: { id: \"1\" },\n});\n```\n\n## Multipart\n\nWhen `Content-Type` is `multipart/form-data`, the library removes the explicit header so the platform sets the boundary automatically. The payload is converted to FormData using bracket notation for nested objects (`parent[child]`) and arrays (`items[0]`), which is compatible with most backend frameworks (Express, Django, Rails, Spring).\n\n## SSE Streaming\n\nStream Server-Sent Events via Fetch ReadableStream:\n\n```ts\nconst services = [\n  { id: \"chat.stream\", url: \"api/chat/completions\", method: MethodAPI.post },\n];\n\nconst result = await api.execServiceByStream(\n  { id: \"chat.stream\" },\n  { model: \"gpt-4\", messages: [{ role: \"user\", content: \"Hello\" }], stream: true }\n);\n\nif (result.ok) {\n  for await (const event of result.stream) {\n    // event: { event: \"message\", data: \"...\", id: \"\", retry?: number }\n    const chunk = JSON.parse(event.data);\n    process.stdout.write(chunk.choices[0].delta.content ?? \"\");\n  }\n}\n\n// Abort anytime\nresult.abort();\n```\n\nReturns `StreamResponseFormat` with `stream: AsyncGenerator<SSEEvent>` and `abort()`.\n\n## NDJSON Streaming\n\nStream Newline-Delimited JSON (one JSON object per line):\n\n```ts\nconst services = [\n  { id: \"logs.stream\", url: \"api/logs/tail\", method: MethodAPI.get },\n];\n\nconst result = await api.execServiceByNDJSON<LogEntry>({ id: \"logs.stream\" });\n\nif (result.ok) {\n  for await (const entry of result.stream) {\n    console.log(entry.timestamp, entry.message); // typed LogEntry\n  }\n}\n```\n\nReturns `NDJSONStreamResponseFormat<T>` with `stream: AsyncGenerator<T>` and `abort()`.\n\n## GraphQL\n\nConvenience wrapper over `execService` / `execServiceByFetch`:\n\n```ts\nimport { createGraphQLClient } from \"@alvin0/http-driver\";\n\nconst services = [\n  { id: \"graphql\", url: \"graphql\", method: MethodAPI.post },\n];\n\nconst gql = createGraphQLClient(api, \"graphql\");\n\n// Query\nconst users = await gql.query<{ users: User[] }>(`\n  query($limit: Int) { users(limit: $limit) { id name } }\n`, { limit: 10 });\n// users.data.data.users\n\n// Mutation\nconst created = await gql.mutation<{ createUser: User }>(`\n  mutation($input: CreateUserInput!) { createUser(input: $input) { id name } }\n`, { input: { name: \"John\" } });\n\n// Use Fetch path instead of Axios\nconst gqlFetch = createGraphQLClient(api, \"graphql\", { useFetch: true });\n```\n\n## Upload & Download Progress\n\nStandalone utilities for progress tracking with Fetch:\n\n```ts\nimport { fetchWithDownloadProgress, createUploadProgressBody } from \"@alvin0/http-driver\";\n\n// Download progress\nconst res = await fetch(\"https://example.com/large-file.zip\");\nconst buffer = await fetchWithDownloadProgress(res, ({ loaded, total, percent }) => {\n  console.log(`${percent}% (${loaded}/${total} bytes)`);\n});\n\n// Upload progress\nconst jsonBody = JSON.stringify(largePayload);\nconst { body } = createUploadProgressBody(jsonBody, ({ loaded, total, percent }) => {\n  console.log(`Uploading: ${percent}%`);\n});\nawait fetch(\"https://example.com/upload\", { method: \"POST\", body });\n```\n\n`percent` is -1 when total size is unknown.\n\n## WebSocket\n\nLightweight wrapper with auto-reconnect and typed messages:\n\n```ts\nimport { createWebSocketClient } from \"@alvin0/http-driver\";\n\nconst ws = createWebSocketClient({\n  url: \"wss://api.example.com/ws\",\n  autoReconnect: true,\n  maxReconnectAttempts: 5,\n  reconnectDelay: 1000,\n  reconnectBackoff: \"exponential\",\n});\n\nws.onOpen(() => console.log(\"Connected\"));\nws.onMessage<ChatMessage>((msg) => console.log(msg.data));\nws.onError((err) => console.error(err));\nws.onClose(() => console.log(\"Disconnected\"));\n\nws.send({ type: \"subscribe\", channel: \"updates\" });\nws.close();\nws.reconnect(); // manual reconnect\nconsole.log(ws.state); // \"connecting\" | \"open\" | \"closing\" | \"closed\"\n```\n\n## Usage with React Hooks\n\n### SWR\n\n```ts\nimport useSWR from \"swr\";\nimport type { ResponseFormat } from \"@alvin0/http-driver\";\n\n// Generic fetcher\nconst axiosFetcher = <T>(idService: { id: string; params?: Record<string, string | number> }) =>\n  api.execService<T>(idService).then((res) => {\n    if (!res.ok) throw res;\n    return res.data;\n  });\n\n// Hook\nexport function useUser(id: string) {\n  return useSWR(\n    id ? [\"users.detail\", id] : null,\n    () => axiosFetcher<User>({ id: \"users.detail\", params: { id } })\n  );\n}\n\n// Usage in component\nfunction Profile({ id }: { id: string }) {\n  const { data, error, isLoading } = useUser(id);\n  if (isLoading) return <p>Loading...</p>;\n  if (error) return <p>Error: {error.problem}</p>;\n  return <h1>{data?.name}</h1>;\n}\n```\n\n### TanStack Query (React Query)\n\n```ts\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\n\nexport function useUsers() {\n  return useQuery({\n    queryKey: [\"users\"],\n    queryFn: async () => {\n      const res = await api.execService<User[]>({ id: \"users.list\" });\n      if (!res.ok) throw res;\n      return res.data;\n    },\n  });\n}\n\nexport function useCreateUser() {\n  const queryClient = useQueryClient();\n  return useMutation({\n    mutationFn: async (payload: CreateUserPayload) => {\n      const res = await api.execService<User>({ id: \"users.create\" }, payload);\n      if (!res.ok) throw res;\n      return res.data;\n    },\n    onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"users\"] }),\n  });\n}\n```\n\n### Custom Hook (no library)\n\n```ts\nimport { useState, useEffect } from \"react\";\nimport type { ResponseFormat } from \"@alvin0/http-driver\";\n\nexport function useService<T>(\n  idService: { id: string; params?: Record<string, string | number> } | null,\n  payload?: Record<string, unknown>\n) {\n  const [data, setData] = useState<T | null>(null);\n  const [error, setError] = useState<ResponseFormat | null>(null);\n  const [loading, setLoading] = useState(false);\n\n  useEffect(() => {\n    if (!idService) return;\n    let cancelled = false;\n    setLoading(true);\n\n    api.execService<T>(idService, payload).then((res) => {\n      if (cancelled) return;\n      if (res.ok) { setData(res.data); setError(null); }\n      else { setError(res); setData(null); }\n    }).finally(() => { if (!cancelled) setLoading(false); });\n\n    return () => { cancelled = true; };\n  }, [idService?.id, JSON.stringify(idService?.params), JSON.stringify(payload)]);\n\n  return { data, error, loading };\n}\n\n// Usage\nfunction UserList() {\n  const { data, error, loading } = useService<User[]>({ id: \"users.list\" });\n  if (loading) return <p>Loading...</p>;\n  if (error) return <p>Error: {error.problem}</p>;\n  return <ul>{data?.map((u) => <li key={u.id}>{u.name}</li>)}</ul>;\n}\n```\n\n### Vue Composable\n\n```ts\nimport { ref, watchEffect } from \"vue\";\nimport type { ResponseFormat } from \"@alvin0/http-driver\";\n\nexport function useService<T>(\n  idService: () => { id: string; params?: Record<string, string | number> } | null\n) {\n  const data = ref<T | null>(null);\n  const error = ref<ResponseFormat | null>(null);\n  const loading = ref(false);\n\n  watchEffect(async () => {\n    const svc = idService();\n    if (!svc) return;\n    loading.value = true;\n    const res = await api.execService<T>(svc);\n    if (res.ok) { data.value = res.data as T; error.value = null; }\n    else { error.value = res; data.value = null; }\n    loading.value = false;\n  });\n\n  return { data, error, loading };\n}\n```\n\n## Multiple Drivers\n\n```ts\nconst postsApi = new DriverBuilder()\n  .withBaseURL(\"https://api.example.com\")\n  .withServices(postServices)\n  .build();\n\nconst adminApi = new DriverBuilder()\n  .withBaseURL(\"https://admin.example.com\")\n  .withServices(adminServices)\n  .withRetry({ maxAttempts: 2 })\n  .build();\n```\n\n## Service ID Convention\n\nFor maintainability and strong typing, define service IDs as an enum with a namespaced pattern: `v{version}.{domain}.{resource}.{action}`\n\n```ts\nimport { MethodAPI, type ServiceApi } from \"@alvin0/http-driver\";\n\nexport enum GameServiceIds {\n  List = \"v1.admin.games.list\",\n  Store = \"v1.admin.games.store\",\n  Detail = \"v1.admin.games.detail\",\n  Update = \"v1.admin.games.update\",\n  Destroy = \"v1.admin.games.destroy\",\n  Restore = \"v1.admin.games.restore\",\n  DownloadCSV = \"v1.admin.games.download-csv\",\n}\n\nexport default [\n  { id: GameServiceIds.List, url: \"v1/admin/games\", method: MethodAPI.get },\n  { id: GameServiceIds.Store, url: \"v1/admin/games\", method: MethodAPI.post },\n  { id: GameServiceIds.Detail, url: \"v1/admin/games/{id}\", method: MethodAPI.get },\n  { id: GameServiceIds.Update, url: \"v1/admin/games/{id}\", method: MethodAPI.put },\n  { id: GameServiceIds.Destroy, url: \"v1/admin/games/{id}\", method: MethodAPI.delete },\n  { id: GameServiceIds.Restore, url: \"v1/admin/games/{id}/restore\", method: MethodAPI.patch },\n  { id: GameServiceIds.DownloadCSV, url: \"v1/admin/games/csv\", method: MethodAPI.get },\n] as ServiceApi[];\n```\n\nUsage:\n\n```ts\nconst detail = await api.execService({\n  id: GameServiceIds.Detail,\n  params: { id: 123 },\n});\n\nconst list = await api.execServiceByFetch({ id: GameServiceIds.List });\n```\n\nBenefits: type-safe IDs with auto-complete, consistent naming, easier refactors.\n\n## API Reference\n\n### DriverBuilder\n\n| Method | Description |\n|--------|-------------|\n| `withBaseURL(url)` | Set base URL |\n| `withServices(services)` | Set service definitions |\n| `withRetry(config)` | Global retry config |\n| `withCache(config)` | Response cache config |\n| `withTimeout(ms)` | Global timeout in ms |\n| `use(middleware)` | Add middleware to pipeline |\n| `onRequest(hook)` | Set request observability hook |\n| `onResponse(hook)` | Set response observability hook |\n| `enableVersioning(enabled?)` | Enable/disable version building |\n| `withGlobalVersion(version)` | Set global version |\n| `withVersionConfig(config)` | Full version configuration |\n| `withVersionTemplate(template)` | Set custom template (auto-enables) |\n| `withAddRequestTransformAxios(fn)` | Sync Axios request transform |\n| `withAddResponseTransformAxios(fn)` | Sync Axios response transform |\n| `withAddAsyncRequestTransformAxios(fn)` | Async Axios request transform |\n| `withAddAsyncResponseTransformAxios(fn)` | Async Axios response transform |\n| `withHandleInterceptorErrorAxios(fn)` | Axios error interceptor |\n| `withAddRequestTransformFetch(fn)` | Fetch request transform |\n| `withAddTransformResponseFetch(fn)` | Fetch response transform |\n| `build()` | Build and return driver instance |\n\n### Driver Instance\n\n| Method | Description |\n|--------|-------------|\n| `execService(idService, payload?, options?)` | Execute via Axios |\n| `execServiceByFetch(idService, payload?, options?)` | Execute via Fetch |\n| `execServiceByStream(idService, payload?, options?)` | SSE streaming via Fetch |\n| `execServiceByNDJSON(idService, payload?, options?)` | NDJSON streaming via Fetch |\n| `getInfoURL(idService, payload?)` | Compile URL without request |\n\nThe built driver also exposes all Axios instance methods (`get`, `post`, `put`, `delete`, etc.).\n\n### Standalone Utilities\n\n| Export | Description |\n|--------|-------------|\n| `createGraphQLClient(driver, serviceId, options?)` | GraphQL query/mutation helper |\n| `fetchWithDownloadProgress(response, onProgress)` | Download progress tracking |\n| `createUploadProgressBody(body, onProgress)` | Upload progress tracking |\n| `createWebSocketClient(config)` | WebSocket with auto-reconnect |\n| `parseNDJSONStream(stream, signal?)` | Raw NDJSON stream parser |\n\n### ServiceApi\n\n```ts\ninterface ServiceApi {\n  id: string;\n  url: string;                        // supports {param} placeholders\n  method: MethodAPI;\n  version?: number | string;\n  options?: Record<string, unknown>;\n  timeout?: number;                    // per-service timeout in ms\n  retry?: RetryConfig;                 // per-service retry config\n}\n```\n\n## Examples\n\n```bash\nnpm run start:example\n```\n\nEntry point: `example/index.ts`\n\n## License\n\nMIT\n\n## Author\n\nChâu Lâm Đình Ái (alvin0)\nGitHub: https://github.com/alvin0\n","readmeFilename":"README.MD"}