{"_id":"@bereasoftware/nexa","_rev":"13-1a90c3a51e23bd7de981dcf0b69bf17f","name":"@bereasoftware/nexa","dist-tags":{"latest":"1.8.0"},"versions":{"0.0.1":{"name":"@bereasoftware/nexa","version":"0.0.1","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@0.0.1","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"907a8cab0d3b748ddc4378e1cb5923c49063d61a","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-0.0.1.tgz","fileCount":13,"integrity":"sha512-ncZ44AytBpkbINmnEDLUlpSzmM7ZnssLT+Jyvfn63zuZ5gSXOBeekybZxpoLi6NscEPWBbxfxb58I9Jz/iiEIw==","signatures":[{"sig":"MEYCIQCzBKAuAFcOq0vW/UQp3/kcz1gflTj5ZsvGtKzb27u88QIhAN+BUUELboztAIPykruK9NTwDtNZNTV/2PjSi+67prUg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199972},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"254f1ed8ab4c4906c76acc3a73add605998bdb0a","scripts":{"dev":"vite","lint":"tsc --noEmit","test":"vitest run","build":"tsc && vite build","test:ui":"vitest --ui","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.4","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"_nodeVersion":"22.22.1","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.3","vitest":"^4.1.2","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","vite-plugin-dts":"^4.5.4","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@microsoft/api-extractor":"^7.58.0","@semantic-release/github":"^12.0.6","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/nexa_0.0.1_1775095660906_0.8365236529962738","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@bereasoftware/nexa","version":"1.0.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.0.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"c368d7102193dfda0b7c92b4805a97a17a381266","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.0.0.tgz","fileCount":13,"integrity":"sha512-UO6K7hfTEInvcZcnEu1sJRH2IswjwvXZVGR8B63LXE0mmbA443p38duUeOsZ+CUYlx2tKjtCY8Dy8RkPw9x8lA==","signatures":[{"sig":"MEQCIH26lQv0SJlAQgy+8yVDrLKhfSOJJj603MKapNuGRYJ1AiBaSj/ROuAOX0DlKWWX/KQvQVUIRkDYrYSVWZTn9Vw1og==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199972},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"254f1ed8ab4c4906c76acc3a73add605998bdb0a","scripts":{"dev":"vite","lint":"tsc --noEmit","test":"vitest run","build":"tsc && vite build","test:ui":"vitest --ui","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.4","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"_nodeVersion":"22.22.1","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.3","vitest":"^4.1.2","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","vite-plugin-dts":"^4.5.4","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@microsoft/api-extractor":"^7.58.0","@semantic-release/github":"^12.0.6","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.0.0_1775095702087_0.03230750270696081","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bereasoftware/nexa","version":"1.0.4","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.0.4","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"3ae1343d4933d77e682dfd1df7dbfd36b84ea429","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.0.4.tgz","fileCount":13,"integrity":"sha512-9TJx6W1m0r6H6wqPkeKZJbuw049NWlrAUmEvcDDQ5tWxuU+jmBg1P9Sm/cIGlMYvZzr7Wc8yk95QVfj//JOlpA==","signatures":[{"sig":"MEQCIAEgl9Iw6W4Sz20PCJonsDELfMK3FKKwIqTT8A3jmsL0AiBjBoYORJ5SPLz2fl6gIql0WJyl7u0miD0wViVrp50trA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199972},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"26f6cb805662534649ed42d9519ce172a1011c3f","scripts":{"dev":"vite","lint":"tsc --noEmit","test":"vitest run","build":"tsc && vite build","test:ui":"vitest --ui","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"11.12.1","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"_nodeVersion":"22.22.1","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.3","vitest":"^4.1.2","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","vite-plugin-dts":"^4.5.4","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@microsoft/api-extractor":"^7.58.0","@semantic-release/github":"^12.0.6","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.0.4_1775139765369_0.6394548811250802","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bereasoftware/nexa","version":"1.0.5","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.0.5","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"dfad49f1e8851057a6a6bf028fdc5e3f11da1a54","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.0.5.tgz","fileCount":13,"integrity":"sha512-PYfKhSlyRPPzZDQzBUpoD5dLruNDqZw6KZCQZZTq7ZtNf+xdD3atHjo6thFjPnVxPi4hGnTRBes7e5aBnHIYmA==","signatures":[{"sig":"MEUCIChNTOBEU/Lx0KukJ2kOEKtyOs6b2b7Bva2VXPb0U/DwAiEAj5Q/THuUOTicTERcMaN6tsnfgFywEgkfUp3x4hFrjT8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199972},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"87deb1f54b7697f7a965d146a084824a6bb3827b","scripts":{"dev":"vite","lint":"tsc --noEmit","test":"vitest run","build":"tsc && vite build","test:ui":"vitest --ui","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"11.12.1","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.3","vitest":"^4.1.2","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","vite-plugin-dts":"^4.5.4","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@microsoft/api-extractor":"^7.58.0","@semantic-release/github":"^12.0.6","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.0.5_1775140053895_0.35193671548017225","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bereasoftware/nexa","version":"1.1.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.1.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"cf3e27837a51407328157fa069f584f3d966b9d5","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.1.0.tgz","fileCount":25,"integrity":"sha512-9C3qadbn6jZ2DOCOWrx5ph0l0s/TrBP2UxpRFrKdtgsdep9mBS6+IPVDridaMCyC8yU6jkbzktMHDI1uIaf12g==","signatures":[{"sig":"MEQCIHiU7YJt+Gyo9MvKe2H0MEjuScOm0qXlR92428sAE5eSAiAavcHlg7eYS0GxQasWejfuyv06dCBXxmSWwu/3LDhaQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1535205},"main":"./dist/nexa.cjs.js","type":"module","about":"Nexa is designed to be a modern, type-safe HTTP client that simplifies the process of making API requests in TypeScript. It offers features such as request and response interceptors, automatic retries with exponential backoff, caching mechanisms, and a result type for better error handling. With support for both ESM and CommonJS, Nexa can be easily integrated into any TypeScript project.","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"},"./testing":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"e8bcb81f5fefcf340146b17a4b91dea1b7eb589e","scripts":{"dev":"vite","lint":"tsc --noEmit","test":"vitest run","build":"tsc && vite build","test:ui":"vitest --ui","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"11.12.1","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.8","vitest":"^4.1.4","@vitest/ui":"^4.1.4","typescript":"~6.0.3","@types/node":"^25.6.0","vite-plugin-dts":"^4.5.4","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.4","@types/cookie-parser":"^1.4.10","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@microsoft/api-extractor":"^7.58.5","@semantic-release/github":"^12.0.6","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.1.0_1776641864870_0.4552974159205043","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bereasoftware/nexa","version":"1.2.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.2.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"510d0ba7eb852d0b95bddfc423ec200d8bb8ecb0","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.2.0.tgz","fileCount":25,"integrity":"sha512-XacSprvXhH8FnY1ilz5gBZaQihrrNAETDHp3bfZxBbtZNJdvgpFt42eSPhN2nWpl+zxRDTKInLN8EmzaTjQ9wg==","signatures":[{"sig":"MEUCIFELXudEHVAP7zSs5SQgk02yjB/xQD884y64380qoo9TAiEAgXngm8y2CuS0p2kH4nEilsKxnqGCuJJc1rnzQxfP7tA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1537981},"main":"./dist/nexa.cjs.js","type":"module","about":"Nexa is designed to be a modern, type-safe HTTP client that simplifies the process of making API requests in TypeScript. It offers features such as request and response interceptors, automatic retries with exponential backoff, caching mechanisms, and a result type for better error handling. With support for both ESM and CommonJS, Nexa can be easily integrated into any TypeScript project.","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"},"./testing":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"e176e8e23db28b1e2f1b8e6d52009eb5daa56d74","scripts":{"dev":"vite","lint":"tsc --noEmit","test":"vitest run","build":"tsc && vite build","test:ui":"vitest --ui","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"11.12.1","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{"npm":"^11.12.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.8","vitest":"^4.1.4","@vitest/ui":"^4.1.4","typescript":"~6.0.3","@types/node":"^25.6.0","vite-plugin-dts":"^4.5.4","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.4","@types/cookie-parser":"^1.4.10","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@microsoft/api-extractor":"^7.58.5","@semantic-release/github":"^12.0.6","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.2.0_1776650417497_0.5453621805833415","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bereasoftware/nexa","version":"1.3.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.3.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"4e9c79d1001ca2428f9f992390a65d84b5327955","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.3.0.tgz","fileCount":27,"integrity":"sha512-go6dhCTbT59B03MS9sruGrN6EQY/j/HRj5gnPLTopK0YxmCIanONWMPiZSJW+umu/VEBi+GoexH70meW+le2mQ==","signatures":[{"sig":"MEQCIAU5aAxi/GVxa7/aQrB9ZRISca85rKKDR4qz56ucmfXDAiBSSJfLHwTWGKycXgrdwZU7Q9rm3t4sUBnvtmnUMPAoBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1466494},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"0c41703bc50d97af771b09c5f894e56308be7f3d","scripts":{"dev":"vite --config playground/vite.config.ts","lint":"eslint \"src/**/*.ts\" --max-warnings=0","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"echo \"husky ready\"","test:ui":"vitest --ui","lint:fix":"eslint \"src/**/*.ts\" --fix","benchmark":"node scripts/benchmark.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.7","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"vite":"^8.0.3","husky":"^9.0.0","eslint":"^9.0.0","vitest":"^4.1.2","prettier":"^3.0.0","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","lint-staged":"^15.0.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@typescript-eslint/parser":"^8.0.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.3.0_1779078164776_0.9670099800734511","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bereasoftware/nexa","version":"1.4.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.4.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"f66cd7867889bbaf5c3ff272dfa756cd87980b26","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.4.0.tgz","fileCount":27,"integrity":"sha512-k3bZCiSafi96bo58FPF6K3sw5K+YRxfId9pgMuXpFrOGGYu9InjaARAUUxcyQv/fHpxlrqoomhH+OVUOUK7syQ==","signatures":[{"sig":"MEUCIQCEsuKJO65G+I3w7d7tp6Lr4A1xuzmo8raKJKU5Y4Jj+QIgRqCdKPHbk4t8zoeAsAeYCt4IGcuVoyFW8HdRhCM5fwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1476227},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"a370701c173ddf5ab541c63fe4e4a692863cd574","scripts":{"dev":"vite --config playground/vite.config.ts","lint":"eslint \"src/**/*.ts\" --max-warnings=0","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"echo \"husky ready\"","test:ui":"vitest --ui","lint:fix":"eslint \"src/**/*.ts\" --fix","benchmark":"node scripts/benchmark.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.7","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"vite":"^8.0.3","husky":"^9.0.0","eslint":"^9.0.0","vitest":"^4.1.2","prettier":"^3.0.0","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","lint-staged":"^15.0.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@typescript-eslint/parser":"^8.0.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.4.0_1779079949600_0.014436170176819196","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@bereasoftware/nexa","version":"1.4.1","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.4.1","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"f994ba4737c999768b396d7b989e5f02acda3187","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.4.1.tgz","fileCount":27,"integrity":"sha512-TZoGs04oHGw0ky66vTu19kMfhmjj28a9GAy5snccnNSLzYd2oFWwHCbT+Aa1yseqR7GIWPkMct9t4v8Hu+oI2A==","signatures":[{"sig":"MEYCIQDVWw9CjLUsYM6al3j/5xUytQnYITeR9yU+HLXep9PGQgIhAKqlwPrl0m3cc9eUY/o9lgTECKV3d22tm7Gw0/3Fc6My","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1478596},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"3529e0b70a1b1efe6882b7da299ed8d2ec92d056","scripts":{"dev":"vite --config playground/vite.config.ts","lint":"eslint \"src/**/*.ts\" --max-warnings=0","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"echo \"husky ready\"","test:ui":"vitest --ui","lint:fix":"eslint \"src/**/*.ts\" --fix","benchmark":"node scripts/benchmark.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.7","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"vite":"^8.0.3","husky":"^9.0.0","eslint":"^9.0.0","vitest":"^4.1.2","prettier":"^3.0.0","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","lint-staged":"^15.0.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@typescript-eslint/parser":"^8.0.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.4.1_1779114336172_0.6761970768830143","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bereasoftware/nexa","version":"1.5.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.5.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"de2a6c4e3b3c607781800e7ef8d20a5914a3c7bb","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.5.0.tgz","fileCount":27,"integrity":"sha512-Xt6xcSQjCqYMXJd7NhWaTYDxH9aWE5l9UpeB999r0i6qns/RjtHy3++X6a0awwUYIhAqXEgeC1tpojfLJhflnQ==","signatures":[{"sig":"MEUCIQC5Ueg2Robfw0fqiRKzXRCuCVxj4kwgA4GfNklZFHeDTQIgQthrP9BJx5k8/Pg2Bd5Bn2lufDVQcUiKQWb4Ue3ocwM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1682478},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"941c28169a089f870313fa59465a0644ede4f184","scripts":{"dev":"vite --config playground/vite.config.ts","lint":"eslint \"src/**/*.ts\" --max-warnings=0","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"echo \"husky ready\"","test:ui":"vitest --ui","lint:fix":"eslint \"src/**/*.ts\" --fix","benchmark":"node scripts/benchmark.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.7","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"vite":"^8.0.3","husky":"^9.0.0","eslint":"^9.0.0","vitest":"^4.1.2","prettier":"^3.0.0","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","lint-staged":"^15.0.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@typescript-eslint/parser":"^8.0.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.5.0_1779129677715_0.5359804921117484","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@bereasoftware/nexa","version":"1.6.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.6.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"069129d53de858e4c2aa444e03cc667bb960be31","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.6.0.tgz","fileCount":27,"integrity":"sha512-n+fhMkr2waCbFgBnAiD6e9EtSQNOJuHujddmBw82bkmIG02aT4yzMOm2K1UKmT0c0djMuzmbmwP3Ur2PfdZFpw==","signatures":[{"sig":"MEYCIQD5Y8mdPtAfPSjq2AqCaAk0tOPdX3QoVSOu6H0m4SdhZgIhAJ6Tdw1c4TiTFakaqV4ieZeOfhbT5OTPIN8XoOQm2Mif","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1765249},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"1a42aea630d7c696d785bf3b5f904f0ad5c49574","scripts":{"dev":"vite --config playground/vite.config.ts","lint":"eslint \"src/**/*.ts\" --max-warnings=0","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"echo \"husky ready\"","test:ui":"vitest --ui","lint:fix":"eslint \"src/**/*.ts\" --fix","benchmark":"node scripts/benchmark.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.7","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"vite":"^8.0.3","husky":"^9.0.0","eslint":"^9.0.0","vitest":"^4.1.2","prettier":"^3.0.0","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","lint-staged":"^15.0.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@typescript-eslint/parser":"^8.0.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.6.0_1779165456552_0.4638509452494235","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@bereasoftware/nexa","version":"1.7.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","_id":"@bereasoftware/nexa@1.7.0","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"homepage":"https://github.com/Berea-Soft/nexa#readme","bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"dist":{"shasum":"8f9a12352eea7bf998269410948d87aa118cef8c","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.7.0.tgz","fileCount":27,"integrity":"sha512-GPyNP18mxeGGnErn0j3JTuDsnQk7mjxYrfTkgzqYCbAvBmcT49lWySEdsDAh2oMe0iICRkhiUo6jII8oQvRB+w==","signatures":[{"sig":"MEYCIQDCneD8ICkH/aFNSV2JdHa6faOSw+Hxx8CyOEBqURxcvgIhAIliQWOqD3c/SGX1wI7u97UTzsRtT02Zd0sQBtKlUKRZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1770746},"main":"./dist/nexa.cjs.js","type":"module","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","module":"./dist/nexa.es.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"engines":{"npm":">=10.8.2","node":">=20.18.0"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","default":"./dist/nexa.umd.js","require":"./dist/nexa.cjs.js"}},"gitHead":"9e75906a17e63738c6b4ab52597d49b44fc90e03","scripts":{"dev":"vite --config playground/vite.config.ts","lint":"eslint \"src/**/*.ts\" --max-warnings=0","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"echo \"husky ready\"","test:ui":"vitest --ui","lint:fix":"eslint \"src/**/*.ts\" --fix","benchmark":"node scripts/benchmark.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build"},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"repository":{"url":"git+https://github.com/Berea-Soft/nexa.git","type":"git"},"_npmVersion":"10.9.7","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"_nodeVersion":"22.22.2","browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"vite":"^8.0.3","husky":"^9.0.0","eslint":"^9.0.0","vitest":"^4.1.2","prettier":"^3.0.0","@vitest/ui":"^4.1.2","typescript":"~6.0.2","@types/node":"^25.5.0","lint-staged":"^15.0.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^4.1.2","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@semantic-release/github":"^12.0.6","@typescript-eslint/parser":"^8.0.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nexa_1.7.0_1779204884051_0.9036148157062878","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@bereasoftware/nexa","version":"1.8.0","type":"module","main":"./dist/nexa.cjs.js","module":"./dist/nexa.es.js","types":"./dist/types/index.d.ts","unpkg":"./dist/nexa.umd.js","browser":{"./dist/nexa.umd.js":"./dist/nexa.umd.js","./dist/nexa.iife.js":"./dist/nexa.iife.js"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/nexa.es.js","require":"./dist/nexa.cjs.js","default":"./dist/nexa.umd.js"}},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"packageManager":"pnpm@11.9.0","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"repository":{"type":"git","url":"git+https://github.com/Berea-Soft/nexa.git"},"bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"engines":{"node":">=20.18.0","npm":">=10.8.2"},"browserslist":["last 2 versions","not dead","not IE 11","> 1%"],"scripts":{"dev":"vite --config playground/vite.config.ts","build":"tsc -p tsconfig.build.json && vite build","test":"vitest run","test:watch":"vitest","test:ui":"vitest --ui","test:coverage":"vitest run --coverage","lint":"eslint \"src/**/*.ts\" --max-warnings=0","lint:fix":"eslint \"src/**/*.ts\" --fix","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","typecheck":"tsc --noEmit","benchmark":"node scripts/benchmark.mjs","prepare":"echo \"husky ready\"","prepublishOnly":"pnpm build"},"devDependencies":{"@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@semantic-release/github":"^12.0.8","@semantic-release/npm":"^13.1.5","@types/node":"^26.1.0","@typescript-eslint/eslint-plugin":"^8.62.1","@typescript-eslint/parser":"^8.62.1","@vitest/coverage-v8":"^4.1.9","@vitest/ui":"^4.1.9","eslint":"^10.6.0","husky":"^9.1.7","lint-staged":"^17.0.8","prettier":"^3.9.4","semantic-release":"^25.0.5","typescript":"~6.0.3","vite":"^8.1.2","vitest":"^4.1.9"},"lint-staged":{"*.ts":["prettier --write","eslint --fix --max-warnings=0"]},"dependencies":{},"gitHead":"b95346d08e7ccadf826bc580d60705a48fa91030","_id":"@bereasoftware/nexa@1.8.0","homepage":"https://github.com/Berea-Soft/nexa#readme","_nodeVersion":"24.17.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-N17weZE577tKTyKUFVdNvlEIdDa5geekUFuWQlxj1qjJfBpWRxb8wfJJNHwCMFGwoyPbGpj7+pbMGakZLy5SuA==","shasum":"5a159bd935d95db924bec79dae876614e2673726","tarball":"https://registry.npmjs.org/@bereasoftware/nexa/-/nexa-1.8.0.tgz","fileCount":31,"unpackedSize":1859673,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICFEWkyW5rFN1dxhwz7b0/RNlwAvay0+JmaZlPWLMqmwAiBtHqEgvM7pS/dh5FHnTtVM22jCRb5aVQL8tw3IgDMPWw=="}]},"_npmUser":{"name":"kamuz0218","email":"sistemas@johnandrade.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nexa_1.8.0_1782918324353_0.6838883343985094"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-02T02:07:40.769Z","modified":"2026-07-01T15:05:24.690Z","0.0.1":"2026-04-02T02:07:41.114Z","1.0.0":"2026-04-02T02:08:22.247Z","1.0.4":"2026-04-02T14:22:45.516Z","1.0.5":"2026-04-02T14:27:34.093Z","1.1.0":"2026-04-19T23:37:45.112Z","1.2.0":"2026-04-20T02:00:17.668Z","1.3.0":"2026-05-18T04:22:45.003Z","1.4.0":"2026-05-18T04:52:29.811Z","1.4.1":"2026-05-18T14:25:36.337Z","1.5.0":"2026-05-18T18:41:18.105Z","1.6.0":"2026-05-19T04:37:36.704Z","1.7.0":"2026-05-19T15:34:44.279Z","1.8.0":"2026-07-01T15:05:24.534Z"},"bugs":{"url":"https://github.com/Berea-Soft/nexa/issues"},"author":{"name":"John Andrade","email":"johnandrade@bereasoft.com"},"license":"MIT","homepage":"https://github.com/Berea-Soft/nexa#readme","keywords":["http","client","typescript","fetch","api","request","library","retry","interceptor","cache","result-type","error-handling","validator","transformer","esm","commonjs","type-safe"],"repository":{"type":"git","url":"git+https://github.com/Berea-Soft/nexa.git"},"description":"Nexa is a TypeScript HTTP client library that combines the power of fetch with the convenience of axios, while adhering to SOLID principles. It provides a flexible and extensible API for making HTTP requests, handling retries, caching, and more.","maintainers":[{"name":"kamuz0218","email":"sistemas@johnandrade.com"}],"readme":"<p align=\"center\">\r\n  <img src=\"src/assets/Logo.png\" alt=\"Nexa Logo\" />\r\n  <h1 align=\"center\">@bereasoftware/nexa</h1>\r\n  <p align=\"center\">\r\n    Un cliente HTTP moderno y type-safe que combina el poder de <code>fetch</code> con la comodidad de <code>axios</code>, y añade observabilidad integrada para desarrollo con <code>Dev Overlay</code>.\r\n  </p>\r\n</p>\r\n\r\n<p align=\"center\">\r\n  <a href=\"#tests\"><img src=\"https://img.shields.io/badge/Tests-219_pasando-brightgreen?style=for-the-badge\" alt=\"Tests\" /></a>\r\n  <a href=\"#test-coverage\"><img src=\"https://img.shields.io/badge/Coverage-Ver_reporte-orange?style=for-the-badge\" alt=\"Coverage\" /></a>\r\n  <a href=\"https://www.npmjs.com/package/@bereasoftware/nexa\"><img src=\"https://img.shields.io/npm/v/@bereasoftware/nexa?style=for-the-badge\" alt=\"NPM Version\" /></a>\r\n  <a href=\"https://bundlephobia.com/package/@bereasoftware/nexa\"><img src=\"https://img.shields.io/bundlephobia/minzip/@bereasoftware/nexa?label=Bundle&style=for-the-badge\" alt=\"Bundle Size\" /></a>\r\n  <a href=\"https://www.npmjs.com/package/@bereasoftware/nexa\"><img src=\"https://img.shields.io/npm/dm/@bereasoftware/nexa?style=for-the-badge\" alt=\"NPM Downloads\" /></a>\r\n  <img src=\"https://img.shields.io/badge/Node-20%2B-success?style=for-the-badge\" alt=\"Node\" />\r\n  <img src=\"https://img.shields.io/badge/TypeScript-6.x-3178C6?style=for-the-badge\" alt=\"TypeScript\" />\r\n  <img src=\"https://img.shields.io/badge/Dependencias-Cero-brightgreen?style=for-the-badge\" alt=\"Dependencies\" />\r\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/Licencia-MIT-yellow?style=for-the-badge\" alt=\"License\" /></a>\r\n  <img src=\"https://img.shields.io/badge/Mantenimiento-Activo-success?style=for-the-badge\" alt=\"Maintenance\" />\r\n  <a href=\"https://github.com/Berea-Soft/nexa\"><img src=\"https://img.shields.io/badge/github-Repositorio-blue?logo=github&style=for-the-badge\" alt=\"Repository\" /></a>\r\n</p>\r\n\r\n> 📚 **Documentación disponible en otros idiomas:**\r\n>\r\n> - 🇪🇸 **Español** (este archivo - README.md)\r\n> - 🇬🇧 **English** (README.en.md)\r\n\r\n> 📖 **Documentación adicional:**\r\n>\r\n> - [Arquitectura](ARCHITECTURE.md) — Diseño del sistema\r\n> - [Diseño](DESIGN.md) — Filosofía y decisiones de diseño\r\n> - [Seguridad](SECURITY.md) — Política de seguridad\r\n> - [Contribuir](CONTRIBUTING.md) — Guía para colaboradores\r\n> - [Migración](MIGRATION.md) — Desde axios/fetch\r\n> - [Soporte](SUPPORT.md) — Cómo obtener ayuda\r\n> - [Skills](SKILLS.md) — Competencias del proyecto\r\n\r\n---\r\n\r\n## Posicionamiento\r\n\r\nNexa no busca ser solo otro wrapper de `fetch`.\r\n\r\nLa librería está diseñada para combinar tres cosas en un solo paquete:\r\n\r\n- una API HTTP type-safe y sin dependencias runtime\r\n- extensibilidad real con retries, caché, middlewares y plugins\r\n- observabilidad integrada para desarrollo con `Dev Overlay`\r\n\r\nEso la hace útil no solo como cliente HTTP, sino también como base para SDKs, tooling interno y flujos donde la experiencia de depuración importa.\r\n\r\n---\r\n\r\n## ¿Por qué Nexa?\r\n\r\n| Característica                             | `fetch` | `axios` | **Nexa** |\r\n| ------------------------------------------ | :-----: | :-----: | :------: |\r\n| Cero dependencias                          |   ✅    |   ❌    |    ✅    |\r\n| Errores type-safe (Result monad)           |   ❌    |   ❌    |    ✅    |\r\n| Serialización automática del body          |   ❌    |   ✅    |    ✅    |\r\n| Interpolación de parámetros en ruta        |   ❌    |   ❌    |    ✅    |\r\n| Estrategias de reintentos (pluggable)      |   ❌    |   ❌    |    ✅    |\r\n| Caché integrado                            |   ❌    |   ❌    |    ✅    |\r\n| Deduplicación de peticiones                |   ❌    |   ❌    |    ✅    |\r\n| Progreso de descarga                       |   ❌    |   ✅    |    ✅    |\r\n| Hooks de ciclo de vida                     |   ❌    |   ❌    |    ✅    |\r\n| Limitación de peticiones concurrentes      |   ❌    |   ❌    |    ✅    |\r\n| Auto-paginación                            |   ❌    |   ❌    |    ✅    |\r\n| Polling inteligente                        |   ❌    |   ❌    |    ✅    |\r\n| Extensión de cliente (`.extend()`)         |   ❌    |   ✅    |    ✅    |\r\n| Disposal de interceptores                  |   ❌    |   ❌    |    ✅    |\r\n| Pipeline de middleware                     |   ❌    |   ❌    |    ✅    |\r\n| Sistema de plugins                         |   ❌    |   ❌    |    ✅    |\r\n| Validadores y transformadores              |   ❌    |   ❌    |    ✅    |\r\n| Tracking de duración de respuesta          |   ❌    |   ❌    |    ✅    |\r\n| Detección inteligente de tipo de respuesta |   ❌    |   ✅    |    ✅    |\r\n| WebSocket/SSE con reconexión automática    |   ❌    |   ❌    |    ✅    |\r\n| Rate limiting integrado                    |   ❌    |   ❌    |    ✅    |\r\n| Circuit breaker para fallos en cascada     |   ❌    |   ❌    |    ✅    |\r\n| Tree-shakeable                             |   ✅    |   ❌    |    ✅    |\r\n| Dev Overlay (herramientas de desarrollo)   |   ❌    |   ❌    |    ✅    |\r\n\r\n---\r\n\r\n## Tabla de Contenidos\r\n\r\n- [Instalación](#instalación)\r\n- [Inicio Rápido](#inicio-rápido)\r\n- [Conceptos Fundamentales](#conceptos-fundamentales)\r\n  - [Result Monad (Sin try/catch)](#result-monad)\r\n  - [Creando un Cliente](#creando-un-cliente)\r\n- [Métodos HTTP](#métodos-http)\r\n- [Configuración de Peticiones](#configuración-de-peticiones)\r\n  - [Parámetros de Ruta](#parámetros-de-ruta)\r\n  - [Parámetros de Query](#parámetros-de-query)\r\n  - [Serialización Automática del Body](#serialización-automática-del-body)\r\n  - [Transformación de Requests (transformRequest)](#transformación-de-requests-transformrequest)\r\n  - [Política de Credenciales](#política-de-credenciales)\r\n  - [Patrón Adapter](#patrón-adapter)\r\n  - [Configuración de Transporte](#configuración-de-transporte)\r\n  - [Tipos de Respuesta](#tipos-de-respuesta)\r\n  - [Timeout](#timeout)\r\n- [Estrategias de Reintentos](#estrategias-de-reintentos)\r\n  - [Configuración Inline](#configuración-inline)\r\n  - [AggressiveRetry](#aggressiveretry)\r\n  - [ConservativeRetry](#conservativeretry)\r\n  - [CircuitBreakerRetry](#circuitbreakerretry)\r\n  - [Estrategia Personalizada](#estrategia-personalizada)\r\n- [Interceptores](#interceptores)\r\n  - [Interceptores de Petición](#interceptores-de-petición)\r\n  - [Interceptores de Respuesta](#interceptores-de-respuesta)\r\n  - [Disposal de Interceptores](#disposal-de-interceptores)\r\n- [Caché](#caché)\r\n- [Hooks de Ciclo de Vida](#hooks-de-ciclo-de-vida)\r\n- [Progreso de Descarga](#progreso-de-descarga)\r\n- [Limitación de Peticiones Concurrentes](#limitación-de-peticiones-concurrentes)\r\n- [Extensión de Cliente](#extensión-de-cliente)\r\n- [Auto-Paginación](#auto-paginación)\r\n- [Polling Inteligente](#polling-inteligente)\r\n- [Cancelación de Peticiones](#cancelación-de-peticiones)\r\n- [Validadores](#validadores)\r\n- [Transformadores](#transformadores)\r\n- [Pipeline de Middleware](#pipeline-de-middleware)\r\n- [Sistema de Plugins](#sistema-de-plugins)\r\n- [Dev Overlay](#dev-overlay)\r\n- [Streaming](#streaming)\r\n- [Generics Tipados](#generics-tipados)\r\n- [Manejo de Errores](#manejo-de-errores)\r\n  - [Contexto de Error Enriquecido](#contexto-de-error-enriquecido)\r\n- [Referencia de API](#referencia-de-api)\r\n- [Formatos de Build](#formatos-de-build)\r\n- [Desarrollo](#desarrollo)\r\n- [Contribución](#contribución)\r\n- [Seguridad](#seguridad)\r\n- [Licencia](#licencia)\r\n\r\n---\r\n\r\n## Instalación\r\n\r\n```bash\r\nnpm install @bereasoftware/nexa\r\n```\r\n\r\n```bash\r\nyarn add @bereasoftware/nexa\r\n```\r\n\r\n```bash\r\npnpm add @bereasoftware/nexa\r\n```\r\n\r\n---\r\n\r\n## Inicio Rápido\r\n\r\n```typescript\r\nimport { createHttpClient } from \"@bereasoftware/nexa\";\r\n\r\nconst client = createHttpClient({\r\n  baseURL: \"https://api.example.com\",\r\n});\r\n\r\n// Type-safe, sin necesidad de try/catch\r\nconst result = await client.get<User>(\"/users/1\");\r\n\r\nif (result.ok) {\r\n  console.log(result.value.data); // User\r\n  console.log(result.value.status); // 200\r\n  console.log(result.value.duration); // 42 (ms)\r\n} else {\r\n  console.log(result.error.message); // \"Request failed with status 404\"\r\n  console.log(result.error.code); // \"HTTP_ERROR\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## Conceptos Fundamentales\r\n\r\n### Result Monad\r\n\r\nNexa retorna un tipo `Result<T, E>` en lugar de lanzar excepciones. Esto elimina la necesidad de bloques `try/catch` y te da seguridad de tipos completa tanto en el camino de éxito como en el de error.\r\n\r\n```typescript\r\ntype Result<T, E> = { ok: true; value: T } | { ok: false; error: E };\r\n```\r\n\r\nTambién puedes construir resultados manualmente:\r\n\r\n```typescript\r\nimport { Ok, Err } from \"@bereasoftware/nexa\";\r\n\r\nconst exito = Ok({ name: \"John\" }); // { ok: true, value: { name: 'John' } }\r\nconst fallo = Err({ message: \"No encontrado\", code: \"HTTP_ERROR\" });\r\n```\r\n\r\nCada método del cliente retorna `Promise<Result<HttpResponse<T>, HttpErrorDetails>>`:\r\n\r\n```typescript\r\nconst result = await client.get<User[]>('/users');\r\n\r\nif (result.ok) {\r\n  // result.value es HttpResponse<User[]>\r\n  const users: User[] = result.value.data;\r\n  const status: number = result.value.status;\r\n  const duration: number = result.value.duration;\r\n  const headers: Headers = result.value.headers;\r\n} else {\r\n  // result.error es HttpErrorDetails\r\n  const message: string = result.error.message;\r\n  const code: string = result.error.code;       // 'HTTP_ERROR' | 'TIMEOUT' | 'NETWORK_ERROR' | 'ABORTED' | ...\r\n  const status?: number = result.error.status;\r\n}\r\n```\r\n\r\n### Creando un Cliente\r\n\r\n```typescript\r\nimport { createHttpClient } from \"@bereasoftware/nexa\";\r\n\r\nconst client = createHttpClient({\r\n  baseURL: \"https://api.example.com\",\r\n  defaultHeaders: { Authorization: \"Bearer token123\" },\r\n  defaultTimeout: 10000, // 10s (por defecto: 30s)\r\n  validateStatus: (status) => status < 400, // Validación de status personalizada\r\n  maxConcurrent: 5, // Máximo 5 peticiones simultáneas\r\n  defaultResponseType: \"json\", // 'json' | 'text' | 'blob' | 'auto' | ...\r\n  defaultHooks: {\r\n    onStart: (req) => console.log(\"Iniciando:\", req.url),\r\n    onFinally: () => console.log(\"Listo\"),\r\n  },\r\n});\r\n```\r\n\r\n**Opciones completas de `HttpClientConfig`:**\r\n\r\n| Opción                | Tipo                          | Por defecto                              | Descripción                                                  |\r\n| --------------------- | ----------------------------- | ---------------------------------------- | ------------------------------------------------------------ |\r\n| `baseURL`             | `string`                      | `''`                                     | URL base que se antepone a todas las peticiones              |\r\n| `defaultHeaders`      | `Record<string, string>`      | `{ 'Content-Type': 'application/json' }` | Headers por defecto para cada petición                       |\r\n| `defaultTimeout`      | `number`                      | `30000`                                  | Timeout por defecto en ms                                    |\r\n| `validateStatus`      | `(status: number) => boolean` | `status >= 200 && status < 300`          | Qué códigos HTTP se consideran exitosos                      |\r\n| `cacheStrategy`       | `CacheStrategy`               | `MemoryCache`                            | Implementación de caché personalizada                        |\r\n| `maxConcurrent`       | `number`                      | `0` (ilimitado)                          | Máximo de peticiones concurrentes                            |\r\n| `defaultResponseType` | `ResponseType`                | `'auto'`                                 | Estrategia de parseo de respuesta por defecto                |\r\n| `defaultHooks`        | `RequestHooks`                | `{}`                                     | Hooks de ciclo de vida por defecto para todas las peticiones |\r\n| `debug`               | `boolean \\| 'verbose'`        | `undefined`                              | Habilita logging de debug para requests/responses. `true` para logs básicos, `'verbose'` para logs detallados. |\r\n| `logger`              | `(message: string, data?: unknown) => void` | `undefined`                              | Función de logging personalizada. Si se proporciona, reemplaza el console.log por defecto con logging personalizado. |\r\n\r\n**Nota:** Las opciones avanzadas `transformRequest`, `credentials`, `withCredentials`, `debug`, `logger`, `transport`, `nodeOptions` y `autoFormData` ya están tipadas, pero no todas están completamente integradas en el pipeline principal de `HttpClient` en esta versión. Úsalas con validación manual hasta que se cierre esa integración.\r\n\r\n---\r\n\r\n## Métodos HTTP\r\n\r\n```typescript\r\n// GET\r\nconst result = await client.get<User>(\"/users/1\");\r\n\r\n// POST\r\nconst result = await client.post<User>(\"/users\", {\r\n  name: \"John\",\r\n  email: \"john@example.com\",\r\n});\r\n\r\n// PUT\r\nconst result = await client.put<User>(\"/users/1\", { name: \"John Actualizado\" });\r\n\r\n// PATCH\r\nconst result = await client.patch<User>(\"/users/1\", {\r\n  email: \"nuevo@example.com\",\r\n});\r\n\r\n// DELETE\r\nconst result = await client.delete<void>(\"/users/1\");\r\n\r\n// HEAD (verificar existencia de recurso)\r\nconst result = await client.head(\"/users/1\");\r\n\r\n// OPTIONS (preflight CORS, métodos disponibles)\r\nconst result = await client.options(\"/users\");\r\n\r\n// QUERY (método IETF-draft: seguro, idempotente, con body JSON)\r\n// Ideal para búsquedas/filtros complejos que no entran en una URL.\r\nconst result = await client.query<User[]>(\"/users/search\", {\r\n  filters: { role: \"admin\", active: true },\r\n  sort: [\"-createdAt\"],\r\n});\r\n```\r\n\r\nTodos los métodos aceptan un objeto de configuración opcional como último parámetro:\r\n\r\n```typescript\r\nconst result = await client.get<User>(\"/users/1\", {\r\n  timeout: 5000,\r\n  headers: { \"X-Custom\": \"valor\" },\r\n  cache: { enabled: true, ttlMs: 60000 },\r\n  retry: { maxAttempts: 3, backoffMs: 1000 },\r\n});\r\n```\r\n\r\n---\r\n\r\n## Configuración de Peticiones\r\n\r\n### Parámetros de Ruta\r\n\r\nNexa soporta interpolación de rutas estilo `:param` con codificación URI automática:\r\n\r\n```typescript\r\nconst result = await client.get<User>(\"/users/:id/posts/:postId\", {\r\n  params: { id: 42, postId: \"hola mundo\" },\r\n});\r\n// → GET /users/42/posts/hola%20mundo\r\n```\r\n\r\n### Parámetros de Query\r\n\r\n```typescript\r\nconst result = await client.get<User[]>(\"/users\", {\r\n  query: { page: 1, limit: 20, active: true },\r\n});\r\n// → GET /users?page=1&limit=20&active=true\r\n```\r\n\r\nLos arrays se serializan como claves repetidas, y un nivel de objetos anidados usa notación de corchetes. Los valores `null`/`undefined` se omiten:\r\n\r\n```typescript\r\nawait client.get(\"/users\", {\r\n  query: {\r\n    tag: [\"admin\", \"vip\"], // → tag=admin&tag=vip\r\n    filter: { status: \"active\" }, // → filter[status]=active\r\n    sort: undefined, // se omite\r\n  },\r\n});\r\n```\r\n\r\n### Método QUERY: búsquedas complejas con body\r\n\r\nEl método HTTP `QUERY` (propuesta IETF) es seguro e idempotente como `GET`, pero permite enviar un body JSON — útil para filtros complejos que excederían el largo práctico de una URL. Nexa lo cachea igual que `GET` cuando `cache.enabled` está activo (el body forma parte de la clave de caché):\r\n\r\n```typescript\r\nconst result = await client.query(\"/users/search\", {\r\n  filters: { role: \"admin\" },\r\n  sort: [\"-createdAt\"],\r\n}, {\r\n  cache: { enabled: true, ttlMs: 30000 },\r\n});\r\n```\r\n\r\n### Serialización Automática del Body\r\n\r\nNexa detecta y serializa automáticamente el cuerpo de la petición:\r\n\r\n| Tipo de Body       | Serialización      | Content-Type                        |\r\n| ------------------ | ------------------ | ----------------------------------- |\r\n| `object` / `array` | `JSON.stringify()` | `application/json`                  |\r\n| `string`           | Se envía tal cual  | `text/plain`                        |\r\n| `FormData`         | Se envía tal cual  | Auto (boundary multipart)           |\r\n| `URLSearchParams`  | Se envía tal cual  | `application/x-www-form-urlencoded` |\r\n| `Blob`             | Se envía tal cual  | Tipo del Blob                       |\r\n| `ArrayBuffer`      | Se envía tal cual  | `application/octet-stream`          |\r\n| `ReadableStream`   | Se envía tal cual  | `application/octet-stream`          |\r\n\r\nCuando `autoFormData` está habilitado (por defecto), los objetos que contienen instancias de `File` o `Blob` se convierten automáticamente a `FormData`. Esto es útil para subir archivos sin crear manualmente instancias de `FormData`.\r\n\r\n```typescript\r\n// JSON (automático)\r\nawait client.post(\"/users\", { name: \"John\" });\r\n\r\n// FormData (content-type automático con boundary)\r\nconst form = new FormData();\r\nform.append(\"file\", fileBlob);\r\nawait client.post(\"/upload\", form);\r\n\r\n// URL-encoded\r\nawait client.post(\r\n  \"/login\",\r\n  new URLSearchParams({ user: \"john\", pass: \"secreto\" }),\r\n);\r\n```\r\n\r\n### Transformación de Requests (transformRequest)\r\n\r\nNexa soporta transformación de requests similar a `transformRequest` de axios. Puedes proporcionar una función o un array de funciones que transformen el body de la request antes de la serialización. La transformación se aplica después de los interceptores y antes de la serialización.\r\n\r\n```typescript\r\n// Configuración global\r\nconst client = createHttpClient({\r\n  transformRequest: [(data, headers) => {\r\n    // Agregar timestamp a todas las requests\r\n    if (data && typeof data === 'object') {\r\n      return { ...data, timestamp: Date.now() };\r\n    }\r\n    return data;\r\n  }]\r\n});\r\n\r\n// Configuración por request\r\nawait client.post('/api', { foo: 'bar' }, {\r\n  transformRequest: [(data) => ({ ...data, extra: 'value' })]\r\n});\r\n```\r\n\r\n### Política de Credenciales\r\n\r\nNexa soporta la opción estándar fetch `credentials` así como el booleano compatible con axios `withCredentials`. Esto controla si las cookies y otras credenciales se envían con requests cross-origin.\r\n\r\n```typescript\r\n// Usando credentials estilo fetch\r\nawait client.get('/api', { credentials: 'include' });\r\n\r\n// Usando withCredentials estilo axios (true = 'include', false = 'same-origin')\r\nawait client.post('/api', data, { withCredentials: true });\r\n\r\n// Configuración global\r\nconst client = createHttpClient({\r\n  credentials: 'same-origin',\r\n  // o\r\n  withCredentials: true, // Equivalente a credentials: 'include'\r\n});\r\n```\r\n\r\nPrioridad: `credentials` anula `withCredentials` si ambos se especifican.\r\n\r\n### Patrón Adapter\r\n\r\nNexa soporta adapters personalizados para mocking, testing, o integración con diferentes entornos (Cloudflare Workers, Node.js, etc.). El adapter tiene la misma firma que la función global `fetch`.\r\n\r\n```typescript\r\n// Mock adapter para testing\r\nconst mockAdapter = async (input: RequestInfo, init?: RequestInit) => {\r\n  return new Response(JSON.stringify({ mock: true }), { status: 200 });\r\n};\r\n\r\n// Adapter global\r\nconst client = createHttpClient({\r\n  adapter: mockAdapter,\r\n});\r\n\r\n// Adapter por request (anula el global)\r\nawait client.get('/api', { adapter: mockAdapter });\r\n```\r\n\r\nLos adapters pueden usarse para interceptar requests antes de que lleguen a la red, facilitando testing sin llamadas HTTP reales.\r\n\r\n### Utilidades de Mocking (estilo axios-mock-adapter)\r\n\r\nPara escenarios de testing más sofisticados, Nexa proporciona una utilidad de mocking similar a `axios-mock-adapter`. Esto te permite configurar respuestas mock para rutas y métodos HTTP específicos.\r\n\r\n```typescript\r\nimport { createHttpClient } from '@bereasoftware/nexa';\r\nimport { createMockClient } from '@bereasoftware/nexa/testing';\r\n\r\nconst client = createHttpClient({ baseURL: 'https://api.example.com' });\r\nconst mockClient = createMockClient(client);\r\n\r\n// Configurar respuestas mock\r\nmockClient.onGet('/users').reply(200, [{ id: 1, name: 'John' }]);\r\nmockClient.onPost('/users').reply(201, { id: 2, name: 'Jane' });\r\nmockClient.onPut('/users/1').reply(200, { id: 1, name: 'Updated' });\r\nmockClient.onDelete('/users/1').reply(204);\r\n\r\n// Simulación de error de red\r\nmockClient.onGet('/error').networkError('Network failure');\r\n\r\n// Usar el cliente mock-enabled para requests\r\nconst result = await mockClient.client.get('/users');\r\nif (result.ok) {\r\n  console.log(result.value.data); // [{ id: 1, name: 'John' }]\r\n}\r\n\r\n// Avanzado: responder una vez, luego dejar pasar\r\nmockClient.onGet('/once').replyOnce(200, { data: 'first' });\r\n// Segunda llamada a la misma ruta no coincidirá (a menos que passthrough esté habilitado)\r\n\r\n// Avanzado: respuestas basadas en funciones\r\nmockClient.onGet('/dynamic').reply((config) => ({\r\n  status: 200,\r\n  data: { url: config.url, query: config.query },\r\n}));\r\n\r\n// Reiniciar rutas mock entre tests\r\nmockClient.reset();\r\n```\r\n\r\n**Características principales:**\r\n- **API fluida**: `onGet(url).reply(status, data)` similar a axios-mock-adapter\r\n- **Patrones de URL**: Soporta coincidencia exacta de string o RegExp\r\n- **Funciones de respuesta**: Respuestas dinámicas basadas en configuración de request\r\n- **Límites de llamadas**: `replyOnce()` para mock de una sola vez\r\n- **Errores de red**: Simula fallos de red con `networkError()`\r\n- **Simulación de timeout**: Método `timeout()` para testing de timeouts\r\n- **Modo passthrough**: Opcionalmente enviar requests no coincidentes al adapter real\r\n- **Soporte de base URL**: Automáticamente elimina baseURL al hacer matching\r\n\r\n**Opciones** para `createMockClient`:\r\n- `passthrough`: Enviar requests no coincidentes al adapter original (predeterminado: `false`)\r\n- `baseURL`: Base URL a eliminar al hacer matching de rutas\r\n- `delay`: Delay predeterminado para todas las respuestas (ms)\r\n\r\n### Configuración de Transporte\r\n\r\nNexa soporta múltiples capas de transporte para diferentes entornos. Por defecto, utiliza la API global `fetch` (disponible en navegadores y Node.js 18+). Para escenarios avanzados en Node.js, puedes usar los módulos nativos HTTP/1.1 o HTTP/2 con keep-alive, pooling de conexiones y otras optimizaciones específicas de Node.js.\r\n\r\n```typescript\r\nimport { createHttpClient } from '@bereasoftware/nexa';\r\n\r\n// Usar Node.js HTTP/1.1 con keep-alive y pooling de conexiones\r\nconst client = createHttpClient({\r\n  transport: 'node', // 'fetch' (predeterminado), 'node', o 'http2'\r\n  nodeOptions: {\r\n    keepAlive: true,\r\n    maxSockets: 50,\r\n    maxFreeSockets: 10,\r\n    maxRequestsPerSocket: 0, // ilimitado\r\n    timeout: 60000,\r\n  },\r\n});\r\n\r\n// Usar HTTP/2 para mejor rendimiento con multiplexación\r\nconst http2Client = createHttpClient({\r\n  transport: 'http2',\r\n  nodeOptions: {\r\n    http2Settings: {\r\n      enablePush: false,\r\n    },\r\n  },\r\n});\r\n\r\n// Anular transporte por request\r\nawait client.get('/api', {\r\n  transport: 'http2',\r\n  nodeOptions: { keepAlive: true },\r\n});\r\n```\r\n\r\n**Nota:** Los transportes de Node (`'node'` y `'http2'`) solo están disponibles en entornos Node.js. En navegadores, automáticamente se usará `'fetch'`.\r\n\r\n**Opciones disponibles en `nodeOptions`:**\r\n- `keepAlive` (boolean): Habilitar conexiones keep-alive (predeterminado: `true`)\r\n- `maxSockets` (number): Máximo de sockets por host (predeterminado: `50`)\r\n- `maxFreeSockets` (number): Máximo de sockets libres a mantener abiertos (predeterminado: `10`)\r\n- `maxRequestsPerSocket` (number): Máximo de requests por socket (predeterminado: `0` = ilimitado)\r\n- `timeout` (number): Timeout del socket en milisegundos (predeterminado: `60000`)\r\n- `http2` (boolean): Obsoleto - usar `transport: 'http2'` en su lugar\r\n- `http2Settings` (Record<string, unknown>): Configuración específica de HTTP/2 (solo para `transport: 'http2'`)\r\n\r\n### Tipos de Respuesta\r\n\r\nControla cómo se parsea el cuerpo de la respuesta:\r\n\r\n```typescript\r\n// Auto-detección basada en el header Content-Type (por defecto)\r\nconst result = await client.get(\"/data\", { responseType: \"auto\" });\r\n\r\n// Forzar parseo JSON\r\nconst result = await client.get<User>(\"/user\", { responseType: \"json\" });\r\n\r\n// Obtener texto crudo\r\nconst result = await client.get<string>(\"/page\", { responseType: \"text\" });\r\n\r\n// Descargar como Blob\r\nconst result = await client.get<Blob>(\"/file.pdf\", { responseType: \"blob\" });\r\n\r\n// Obtener ArrayBuffer\r\nconst result = await client.get<ArrayBuffer>(\"/binary\", {\r\n  responseType: \"arrayBuffer\",\r\n});\r\n\r\n// Obtener FormData\r\nconst result = await client.get<FormData>(\"/form\", {\r\n  responseType: \"formData\",\r\n});\r\n\r\n// Obtener ReadableStream (para streaming manual)\r\nconst result = await client.get<ReadableStream>(\"/stream\", {\r\n  responseType: \"stream\",\r\n});\r\n```\r\n\r\n**Lógica de auto-detección:** `application/json` → JSON, `text/*` → texto, `multipart/form-data` → FormData, `application/octet-stream` / `image/*` / `audio/*` / `video/*` → Blob, fallback → intenta JSON luego texto.\r\n\r\n### Timeout\r\n\r\n```typescript\r\n// Timeout por petición\r\nconst result = await client.get(\"/endpoint-lento\", { timeout: 5000 });\r\n\r\n// El timeout produce un código de error específico\r\nif (!result.ok && result.error.code === \"TIMEOUT\") {\r\n  console.log(\"La petición expiró\");\r\n```\r\n\r\nNexa también soporta timeouts diferenciados para las fases de conexión y respuesta, yendo más allá del timeout único de axios/fetch. Puedes especificar timeouts como un objeto:\r\n\r\n```typescript\r\n// Timeouts diferenciados\r\nawait client.get('/api', {\r\n  timeout: {\r\n    connection: 3000,  // 3 segundos para establecer conexión\r\n    response: 10000,   // 10 segundos para recibir respuesta completa\r\n    total: 15000       // Timeout total opcional (anula connection/response)\r\n  }\r\n});\r\n\r\n// Compatibilidad hacia atrás: número aún funciona (timeout total)\r\nawait client.get('/api', { timeout: 5000 });\r\n```\r\n\r\nCódigos de error: `TIMEOUT` para timeouts de conexión/total, `RESPONSE_TIMEOUT` para timeouts de fase de respuesta.\r\n\r\n### Logging de Debug\r\n\r\nNexa provee logging de debug similar a axios para desarrollo. Habilítalo globalmente o por petición:\r\n\r\n```typescript\r\n// Logging de debug global\r\nconst client = createHttpClient({\r\n  debug: true, // logs básicos\r\n  // debug: 'verbose', // logs detallados\r\n});\r\n\r\n// Override por petición\r\nawait client.get('/api', { debug: 'verbose' });\r\n```\r\n\r\nLos logs incluyen método/URL de la petición, status de respuesta, duración, errores, reintentos y cache hits. Con modo `verbose`, también ves requests transformados, salidas de interceptores y datos de respuesta.\r\n\r\n#### Logger Personalizado\r\n\r\nPuedes proporcionar una función de logger personalizada para redirigir logs a tu sistema de logging preferido:\r\n\r\n```typescript\r\nconst client = createHttpClient({\r\n  debug: true,\r\n  logger: (message, data) => {\r\n    // Enviar a tu servicio de logging\r\n    myLogger.info(message, data);\r\n  },\r\n});\r\n\r\n// Override de logger a nivel de petición\r\nawait client.post('/api', data, { \r\n  debug: true,\r\n  logger: (msg, data) => console.warn(msg, data)\r\n});\r\n```\r\n\r\nEl logger recibe dos argumentos: el mensaje de log (con prefijo `[Nexa HTTP]`) y un objeto de datos opcional.\r\n\r\n---\r\n\r\n## Estrategias de Reintentos\r\n\r\n### Configuración Inline\r\n\r\nReintento simple con backoff exponencial:\r\n\r\n```typescript\r\nconst result = await client.get(\"/api-inestable\", {\r\n  retry: { maxAttempts: 3, backoffMs: 1000 },\r\n});\r\n// Reintenta hasta 3 veces con backoff exponencial + jitter\r\n```\r\n\r\n### AggressiveRetry\r\n\r\nReintenta todos los errores hasta el máximo de intentos con delay mínimo:\r\n\r\n```typescript\r\nimport { AggressiveRetry } from \"@bereasoftware/nexa\";\r\n\r\nconst result = await client.get(\"/api\", {\r\n  retry: new AggressiveRetry(5), // 5 intentos, delay de 50ms * intento\r\n});\r\n```\r\n\r\n### ConservativeRetry\r\n\r\nSolo reintenta en códigos HTTP específicos (408, 429, 500, 502, 503, 504) y timeouts:\r\n\r\n```typescript\r\nimport { ConservativeRetry } from \"@bereasoftware/nexa\";\r\n\r\nconst result = await client.get(\"/api\", {\r\n  retry: new ConservativeRetry(3), // 3 intentos, backoff exponencial con tope de 10s\r\n});\r\n```\r\n\r\n### CircuitBreakerRetry\r\n\r\nPatrón fail-fast — deja de reintentar después de un umbral de fallos:\r\n\r\n```typescript\r\nimport { CircuitBreakerRetry } from \"@bereasoftware/nexa\";\r\n\r\nconst breaker = new CircuitBreakerRetry(\r\n  3, // maxAttempts por petición\r\n  5, // failureThreshold antes de abrir el circuito\r\n  60000, // resetTimeMs — el circuito se resetea después de 60s\r\n);\r\n\r\nconst result = await client.get(\"/api\", { retry: breaker });\r\n\r\n// Resetear el circuito manualmente\r\nbreaker.reset();\r\n```\r\n\r\n### Estrategia Personalizada\r\n\r\nImplementa la interfaz `RetryStrategy`:\r\n\r\n```typescript\r\nimport type { RetryStrategy, HttpErrorDetails } from \"@bereasoftware/nexa\";\r\n\r\nconst reintentoCustom: RetryStrategy = {\r\n  shouldRetry(attempt: number, error: HttpErrorDetails): boolean {\r\n    // Solo reintentar errores de red y 503\r\n    return (\r\n      (error.code === \"NETWORK_ERROR\" || error.status === 503) && attempt < 5\r\n    );\r\n  },\r\n  delayMs(attempt: number): number {\r\n    // Backoff lineal: 500ms, 1000ms, 1500ms...\r\n    return attempt * 500;\r\n  },\r\n};\r\n\r\nconst result = await client.get(\"/api\", { retry: reintentoCustom });\r\n```\r\n\r\n---\r\n\r\n## Interceptores\r\n\r\n### Interceptores de Petición\r\n\r\nModifica las peticiones antes de que se envíen:\r\n\r\n```typescript\r\nclient.addRequestInterceptor({\r\n  onRequest(request) {\r\n    // Agregar token de auth a cada petición\r\n    return {\r\n      ...request,\r\n      headers: {\r\n        ...request.headers,\r\n        Authorization: `Bearer ${getToken()}`,\r\n      },\r\n    };\r\n  },\r\n});\r\n```\r\n\r\n### Interceptores de Respuesta\r\n\r\nTransforma respuestas o maneja errores globalmente:\r\n\r\n```typescript\r\nclient.addResponseInterceptor({\r\n  onResponse(response) {\r\n    // Loguear todas las respuestas exitosas\r\n    console.log(\r\n      `[${response.status}] ${response.request.url} (${response.duration}ms)`,\r\n    );\r\n    return response;\r\n  },\r\n  onError(error) {\r\n    // Manejar 401 globalmente\r\n    if (error.status === 401) {\r\n      redirigirAlLogin();\r\n    }\r\n    return error;\r\n  },\r\n});\r\n```\r\n\r\n### Disposal de Interceptores\r\n\r\nTanto `addRequestInterceptor` como `addResponseInterceptor` retornan una función disposer para remover el interceptor:\r\n\r\n```typescript\r\nconst dispose = client.addRequestInterceptor({\r\n  onRequest(request) {\r\n    return { ...request, headers: { ...request.headers, \"X-Temp\": \"valor\" } };\r\n  },\r\n});\r\n\r\n// Después: remover el interceptor\r\ndispose();\r\n\r\n// O limpiar todos los interceptores\r\nclient.clearInterceptors();\r\n```\r\n\r\n---\r\n\r\n## Caché\r\n\r\nCaché en memoria integrado con soporte TTL. Solo cachea peticiones GET:\r\n\r\n```typescript\r\nconst result = await client.get<User>(\"/users/1\", {\r\n  cache: { enabled: true, ttlMs: 60000 }, // Cachear por 1 minuto\r\n});\r\n\r\n// La segunda llamada retorna la respuesta cacheada instantáneamente\r\nconst cached = await client.get<User>(\"/users/1\", {\r\n  cache: { enabled: true, ttlMs: 60000 },\r\n});\r\n```\r\n\r\n**Implementación de caché personalizada:**\r\n\r\n```typescript\r\nimport type { CacheStrategy } from \"@bereasoftware/nexa\";\r\n\r\nconst redisCache: CacheStrategy = {\r\n  get(key: string) {\r\n    return redis.get(key);\r\n  },\r\n  set(key: string, value: unknown, ttlMs?: number) {\r\n    redis.set(key, value, \"PX\", ttlMs);\r\n  },\r\n  has(key: string) {\r\n    return redis.exists(key);\r\n  },\r\n  clear() {\r\n    redis.flushdb();\r\n  },\r\n};\r\n\r\nconst client = createHttpClient({ cacheStrategy: redisCache });\r\n```\r\n\r\n---\r\n\r\n## Hooks de Ciclo de Vida\r\n\r\nMonitorea el ciclo de vida completo de la petición:\r\n\r\n```typescript\r\nconst result = await client.get<User>(\"/users/1\", {\r\n  hooks: {\r\n    onStart(request) {\r\n      console.log(\"Iniciando petición a:\", request.url);\r\n    },\r\n    onSuccess(response) {\r\n      console.log(\"Éxito:\", response.status, `(${response.duration}ms)`);\r\n    },\r\n    onError(error) {\r\n      console.error(\"Falló:\", error.message, error.code);\r\n    },\r\n    onRetry(attempt, error) {\r\n      console.warn(`Reintento #${attempt}:`, error.message);\r\n    },\r\n    onFinally() {\r\n      console.log(\"Petición completada (éxito o fallo)\");\r\n    },\r\n  },\r\n});\r\n```\r\n\r\nLos hooks por defecto se pueden configurar a nivel de cliente:\r\n\r\n```typescript\r\nconst client = createHttpClient({\r\n  defaultHooks: {\r\n    onError: (error) => reportarASentry(error),\r\n    onFinally: () => ocultarSpinnerDeCarga(),\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## Progreso de Descarga\r\n\r\nTrackea el progreso de descarga con un callback:\r\n\r\n```typescript\r\nconst result = await client.get<Blob>(\"/archivo-grande.zip\", {\r\n  responseType: \"blob\",\r\n  onDownloadProgress(event) {\r\n    console.log(\r\n      `Descargado: ${event.percent}% (${event.loaded}/${event.total} bytes)`,\r\n    );\r\n    actualizarBarraDeProgreso(event.percent);\r\n  },\r\n});\r\n```\r\n\r\nLa interfaz `ProgressEvent`:\r\n\r\n```typescript\r\ninterface ProgressEvent {\r\n  loaded: number; // Bytes descargados hasta ahora\r\n  total: number; // Total de bytes (del header Content-Length)\r\n  percent: number; // 0-100\r\n}\r\n```\r\n\r\n---\r\n\r\n## Limitación de Peticiones Concurrentes\r\n\r\nLimita el número de peticiones simultáneas para no sobrecargar el servidor:\r\n\r\n```typescript\r\nconst client = createHttpClient({\r\n  baseURL: \"https://api.example.com\",\r\n  maxConcurrent: 3, // Solo 3 peticiones a la vez\r\n});\r\n\r\n// Lanza 10 peticiones — solo 3 corren simultáneamente, el resto se encola automáticamente\r\nconst results = await Promise.all(urls.map((url) => client.get(url)));\r\n```\r\n\r\nConsultar el estado de la cola:\r\n\r\n```typescript\r\nconsole.log(client.queueStats);\r\n// { active: 3, pending: 7 }\r\n\r\nconsole.log(client.activeRequests);\r\n// 3\r\n```\r\n\r\n---\r\n\r\n## Extensión de Cliente\r\n\r\nCrea clientes hijo que heredan configuración e interceptores:\r\n\r\n```typescript\r\nconst clienteBase = createHttpClient({\r\n  baseURL: \"https://api.example.com\",\r\n  defaultHeaders: { \"X-App\": \"MiApp\" },\r\n});\r\n\r\nclienteBase.addRequestInterceptor({\r\n  onRequest(req) {\r\n    return {\r\n      ...req,\r\n      headers: { ...req.headers, Authorization: \"Bearer token\" },\r\n    };\r\n  },\r\n});\r\n\r\n// El hijo hereda baseURL, headers, interceptores — y agrega header de versión\r\nconst clienteV2 = clienteBase.extend({\r\n  defaultHeaders: { \"X-API-Version\": \"2\" },\r\n});\r\n\r\n// clienteV2 tiene headers: { 'X-App': 'MiApp', 'X-API-Version': '2' }\r\n// clienteV2 también tiene el interceptor de auth del clienteBase\r\n```\r\n\r\n---\r\n\r\n## Auto-Paginación\r\n\r\nItera a través de APIs paginadas con generadores asíncronos:\r\n\r\n```typescript\r\ninterface PageResponse {\r\n  items: User[];\r\n  nextCursor: string | null;\r\n}\r\n\r\nfor await (const users of client.paginate<PageResponse>(\"/users\", {\r\n  getItems: (data) => data.items,\r\n  getNextPage: (data, config) =>\r\n    data.nextCursor\r\n      ? {\r\n          ...config,\r\n          query: { ...(config.query as any), cursor: data.nextCursor },\r\n        }\r\n      : null,\r\n})) {\r\n  console.log(\"Página con\", users.length, \"usuarios\");\r\n  // Procesar cada página de usuarios\r\n}\r\n```\r\n\r\nLa paginación se detiene automáticamente cuando `getNextPage` retorna `null` o una petición falla.\r\n\r\n---\r\n\r\n## Polling Inteligente\r\n\r\nConsulta un endpoint repetidamente hasta que se cumpla una condición:\r\n\r\n```typescript\r\ninterface Job {\r\n  id: string;\r\n  status: \"pending\" | \"running\" | \"completed\" | \"failed\";\r\n  result?: string;\r\n}\r\n\r\nconst result = await client.poll<Job>(\"/jobs/abc123\", {\r\n  intervalMs: 2000, // Consultar cada 2 segundos\r\n  maxAttempts: 30, // Rendirse después de 30 intentos (0 = ilimitado)\r\n  until: (job) => job.status === \"completed\" || job.status === \"failed\",\r\n  onPoll: (job, attempt) => {\r\n    console.log(`Intento ${attempt}: ${job.status}`);\r\n  },\r\n});\r\n\r\nif (result.ok) {\r\n  console.log(\"Job terminado:\", result.value.data.result);\r\n} else if (result.error.code === \"POLL_EXHAUSTED\") {\r\n  console.log(\"El polling expiró\");\r\n}\r\n```\r\n\r\n---\r\n\r\n## Cancelación de Peticiones\r\n\r\nCancela todas las peticiones pendientes:\r\n\r\n```typescript\r\n// Iniciar varias peticiones\r\nconst promise1 = client.get(\"/lento-1\");\r\nconst promise2 = client.get(\"/lento-2\");\r\n\r\n// Cancelar todo\r\nclient.cancelAll();\r\n\r\n// O usar AbortSignal para peticiones individuales\r\nconst controller = new AbortController();\r\nconst result = client.get(\"/data\", { signal: controller.signal });\r\ncontroller.abort();\r\n```\r\n\r\n---\r\n\r\n## Validadores\r\n\r\nValida los datos de respuesta antes de que lleguen a tu código:\r\n\r\n```typescript\r\nimport {\r\n  createSchemaValidator,\r\n  createRequiredFieldsValidator,\r\n  validatorIsArray,\r\n  validatorIsObject,\r\n} from \"@bereasoftware/nexa\";\r\n\r\n// Validador de esquema\r\nconst userValidator = createSchemaValidator<User>({\r\n  id: (v) => typeof v === \"number\",\r\n  name: (v) => typeof v === \"string\" && (v as string).length > 0,\r\n  email: (v) => typeof v === \"string\" && (v as string).includes(\"@\"),\r\n});\r\n\r\nconst result = await client.get<User>(\"/users/1\", {\r\n  validate: userValidator,\r\n});\r\n// Si la validación falla: result.error.code === 'VALIDATION_ERROR'\r\n\r\n// Validador de campos requeridos\r\nconst result = await client.get(\"/api/data\", {\r\n  validate: createRequiredFieldsValidator([\"id\", \"name\", \"createdAt\"]),\r\n});\r\n\r\n// Validador de array\r\nconst result = await client.get(\"/users\", {\r\n  validate: validatorIsArray,\r\n});\r\n\r\n// Validador de objeto\r\nconst result = await client.get(\"/user/1\", {\r\n  validate: validatorIsObject,\r\n});\r\n```\r\n\r\n---\r\n\r\n## Transformadores\r\n\r\nTransforma los datos de respuesta después del parseo:\r\n\r\n```typescript\r\nimport {\r\n  transformSnakeToCamel,\r\n  transformCamelToSnake,\r\n  transformFlatten,\r\n  createProjectionTransformer,\r\n  createWrapperTransformer,\r\n} from \"@bereasoftware/nexa\";\r\n\r\n// Convertir respuestas snake_case de la API a camelCase\r\nconst result = await client.get(\"/users/1\", {\r\n  transform: transformSnakeToCamel,\r\n});\r\n// { first_name: 'John' } → { firstName: 'John' }\r\n\r\n// Convertir camelCase a snake_case (para enviar datos)\r\nconst result = await client.get(\"/data\", {\r\n  transform: transformCamelToSnake,\r\n});\r\n\r\n// Aplanar objetos anidados\r\nconst result = await client.get(\"/nested\", {\r\n  transform: transformFlatten,\r\n});\r\n// { user: { name: 'John' } } → { 'user.name': 'John' }\r\n\r\n// Seleccionar campos específicos\r\nconst result = await client.get(\"/users/1\", {\r\n  transform: createProjectionTransformer([\"id\", \"name\"]),\r\n});\r\n// Solo mantiene { id, name } de la respuesta\r\n\r\n// Envolver datos en un contenedor\r\nconst result = await client.get(\"/items\", {\r\n  transform: createWrapperTransformer(\"data\"),\r\n});\r\n// [1, 2, 3] → { data: [1, 2, 3] }\r\n```\r\n\r\n---\r\n\r\n## Pipeline de Middleware\r\n\r\nPipeline de middleware estilo Express/Koa para procesamiento avanzado de peticiones:\r\n\r\n```typescript\r\nimport {\r\n  createPipeline,\r\n  createCacheMiddleware,\r\n  createDedupeMiddleware,\r\n  createStreamingMiddleware,\r\n  type HttpContext,\r\n  type Middleware,\r\n} from \"@bereasoftware/nexa\";\r\n\r\n// Crear middleware personalizado\r\nconst loggingMiddleware: Middleware<HttpContext> = async (ctx, next) => {\r\n  console.log(`→ ${ctx.request.method} ${ctx.request.url}`);\r\n  const start = Date.now();\r\n  await next();\r\n  console.log(`← ${ctx.response.status} (${Date.now() - start}ms)`);\r\n};\r\n\r\nconst authMiddleware: Middleware<HttpContext> = async (ctx, next) => {\r\n  ctx.request.headers[\"Authorization\"] = `Bearer ${getToken()}`;\r\n  await next();\r\n};\r\n\r\n// Construir y ejecutar pipeline\r\nconst pipeline = createPipeline([\r\n  loggingMiddleware,\r\n  authMiddleware,\r\n  createCacheMiddleware({ ttlMs: 30000 }),\r\n  createDedupeMiddleware(),\r\n]);\r\n\r\nconst ctx: HttpContext = {\r\n  request: { method: \"GET\", url: \"/users\", headers: {} },\r\n  response: { status: 0, headers: {} },\r\n  state: {},\r\n};\r\n\r\nawait pipeline(ctx);\r\n```\r\n\r\n**Middleware pre-construidos:**\r\n\r\n| Middleware                            | Descripción                                    |\r\n| ------------------------------------- | ---------------------------------------------- |\r\n| `createCacheMiddleware(options?)`     | Cachea respuestas GET con TTL                  |\r\n| `cacheMiddleware`                     | Caché pre-configurado (60s TTL)                |\r\n| `createDedupeMiddleware(options?)`    | Deduplica peticiones concurrentes idénticas    |\r\n| `dedupeMiddleware`                    | Deduplicación pre-configurada para GET         |\r\n| `createStreamingMiddleware(options?)` | Maneja respuestas streaming con progreso       |\r\n| `streamingMiddleware`                 | Streaming pre-configurado con salida a consola |\r\n\r\n---\r\n\r\n## Comunicación en Tiempo Real\r\n\r\nNexa incluye clientes WebSocket y SSE (Server-Sent Events) con reconexión automática, heartbeat y soporte de plugins:\r\n\r\n```typescript\r\nimport { createWebSocketClient, createSSEClient } from \"@bereasoftware/nexa\";\r\n\r\n// WebSocket con reconexión automática y heartbeat\r\nconst wsClient = createWebSocketClient(\"wss://echo.websocket.org\", {\r\n  reconnect: { enabled: true, maxAttempts: 10 },\r\n  heartbeat: { interval: 30000 },\r\n});\r\n\r\nawait wsClient.connect();\r\nconst result = wsClient.sendJson({ type: \"message\", data: \"Hello\" });\r\nif (!result.ok) console.error(\"No se pudo enviar:\", result.error.message);\r\nwsClient.onMessage((event) => console.log(\"Mensaje:\", event.data));\r\n\r\n// SSE para streams de eventos\r\nconst sseClient = createSSEClient(\"https://stream.example.com/events\");\r\nawait sseClient.connect();\r\nsseClient.onEvent(\"update\", (data) => console.log(\"Actualización:\", data));\r\n```\r\n\r\n**Características:**\r\n- ✅ Reconexión automática con backoff exponencial\r\n- ✅ Heartbeat/ping-pong para mantener conexiones activas\r\n- ✅ Soporte para JSON y mensajes binarios\r\n- ✅ Estadísticas de conexión y métricas\r\n- ✅ Integración con sistema de plugins de Nexa\r\n\r\n---\r\n\r\n## Adaptadores Multi-Entorno\r\n\r\nNexa soporta múltiples entornos de ejecución con adaptadores optimizados:\r\n\r\n```typescript\r\nimport { createHttpClient } from \"@bereasoftware/nexa\";\r\n\r\n// Usa fetch global (navegador, Node.js 18+, Deno, Bun, Cloudflare Workers)\r\nconst client = createHttpClient({ transport: \"fetch\" });\r\n\r\n// Usa módulos nativos de Node.js (HTTP/1.1 con connection pooling)\r\nconst nodeClient = createHttpClient({ \r\n  transport: \"node\",\r\n  nodeOptions: { keepAlive: true }\r\n});\r\n\r\n// Usa HTTP/2 de Node.js con session pooling\r\nconst http2Client = createHttpClient({ transport: \"http2\" });\r\n\r\n// Entornos específicos (detección automática)\r\nconst denoClient = createHttpClient({ transport: \"deno\" });\r\nconst bunClient = createHttpClient({ transport: \"bun\" });\r\nconst cloudflareClient = createHttpClient({ transport: \"cloudflare\" });\r\n```\r\n\r\n**Entornos soportados:**\r\n- ✅ **Navegador:** fetch API global\r\n- ✅ **Node.js:** http/https (HTTP/1.1), http2 (HTTP/2 con pooling)\r\n- ✅ **Deno:** fetch nativo de Deno\r\n- ✅ **Bun:** fetch optimizado de Bun\r\n- ✅ **Cloudflare Workers:** fetch con bindings de Cloudflare\r\n\r\n---\r\n\r\n## Plugins Avanzados\r\n\r\nNexa incluye plugins listos para producción:\r\n\r\n```typescript\r\nimport { \r\n  RateLimitPlugin, \r\n  CircuitBreakerPlugin,\r\n  LoggerPlugin,\r\n  MetricsPlugin \r\n} from \"@bereasoftware/nexa\";\r\n\r\nconst manager = new PluginManager();\r\nmanager\r\n  .register(new LoggerPlugin())\r\n  .register(new MetricsPlugin())\r\n  .register(new RateLimitPlugin({ maxRequests: 100, windowMs: 60000 }))\r\n  .register(new CircuitBreakerPlugin({ \r\n    failureThreshold: 5, \r\n    resetTimeout: 30000 \r\n  }));\r\n```\r\n\r\n**Plugins disponibles:**\r\n- ✅ **RateLimitPlugin:** Limita peticiones por ventana de tiempo\r\n- ✅ **CircuitBreakerPlugin:** Previene fallos en cascada\r\n- ✅ **LoggerPlugin:** Logs detallados de peticiones/respuestas\r\n- ✅ **MetricsPlugin:** Métricas de rendimiento\r\n- ✅ **CachePlugin:** Cache automático de respuestas\r\n- ✅ **DedupePlugin:** Deduplicación de peticiones concurrentes\r\n\r\n---\r\n\r\n## Sistema de Plugins\r\n\r\nExtiende Nexa con una arquitectura de plugins:\r\n\r\n```typescript\r\nimport {\r\n  PluginManager,\r\n  LoggerPlugin,\r\n  MetricsPlugin,\r\n  CachePlugin,\r\n  DedupePlugin,\r\n} from \"@bereasoftware/nexa\";\r\n\r\nconst manager = new PluginManager();\r\n\r\n// Registrar plugins\r\nmanager\r\n  .register(LoggerPlugin)\r\n  .register(new MetricsPlugin())\r\n  .register(new CachePlugin(30000)) // 30s TTL\r\n  .register(new DedupePlugin());\r\n\r\n// Escuchar eventos\r\nmanager.on(\"request:start\", (url) => console.log(\"Petición a:\", url));\r\nmanager.on(\"request:success\", (url, status) =>\r\n  console.log(\"Éxito:\", url, status),\r\n);\r\n\r\n// Obtener métricas\r\nconst metrics = (\r\n  manager.getPlugins().find((p) => p.name === \"metrics\") as MetricsPlugin\r\n).getMetrics();\r\nconsole.log(metrics); // { requests: 10, errors: 1, totalTime: 4200, avgTime: 420 }\r\n```\r\n\r\n**Crear plugins personalizados:**\r\n\r\n```typescript\r\nimport type { Plugin } from \"@bereasoftware/nexa\";\r\n\r\nconst rateLimitPlugin: Plugin = {\r\n  name: \"rate-limit\",\r\n  setup(client) {\r\n    // Agregar middleware de rate limiting, event listeners, etc.\r\n    const manager = client as PluginManager;\r\n    manager.on(\"request:start\", () => {\r\n      // Lógica de rate limiting personalizada\r\n    });\r\n  },\r\n};\r\n\r\nmanager.register(rateLimitPlugin);\r\n```\r\n\r\n---\r\n\r\n## Dev Overlay\r\n\r\nHerramienta visual de desarrollo integrada para depurar y monitorear requests HTTP en tiempo real.\r\n\r\n> Estado de API: disponible públicamente y pensada para flujos de desarrollo en navegador. No está orientada a entornos SSR o Node sin DOM.\r\n\r\n```typescript\r\nimport { createHttpClient, createDevOverlay } from \"@bereasoftware/nexa\";\r\n\r\n// Crear el Dev Overlay - aparece automáticamente\r\nconst { tracker, ui } = createDevOverlay({\r\n  position: \"bottom-right\", // top-right, top-left, bottom-left\r\n  theme: \"dark\",\r\n  maxHistory: 200,\r\n});\r\n\r\n// Pasar el tracker al cliente HTTP\r\nconst client = createHttpClient({\r\n  baseURL: \"https://api.example.com\",\r\n  devTracker: tracker,\r\n});\r\n\r\n// ¡Listo! Todas las requests aparecerán en el overlay\r\nconst result = await client.get(\"/users\");\r\n```\r\n\r\n### Características\r\n\r\n- **Toggle con teclado** — Presiona `Ctrl+Shift+N` o `Cmd+Shift+N` para mostrar/ocultar\r\n- **Lista de requests** — Muestra método, status, URL, duración y badges (cache, retries)\r\n- **Métricas en tiempo real** — Total requests, promedio, throughput, éxitos y fallos\r\n- **Búsqueda y filtro** — Filtra por URL, método o status (`Ctrl+F`)\r\n- **Detalle de request** — Click en cualquier request para ver headers, body y timing\r\n\r\n### Persistencia de configuración\r\n\r\nEl `Dev Overlay` persiste la configuración del usuario (posición, tema, tamaño del botón flotante, etc.) en `localStorage` bajo la clave `nexa.devOverlay.config`.\r\n\r\n\r\nAl llamar a `createDevOverlay()` la configuración que se aplica sigue el orden de preferencia (los valores persistidos en `localStorage` tienen prioridad por diseño):\r\n\r\n- Valores por defecto ← (`defaultDevOverlayConfig`)\r\n- Opciones pasadas a `createDevOverlay()` (argumento `config`)\r\n- Valores persistidos en `localStorage` (sobrescriben los anteriores)\r\n\r\nEn entornos sin DOM (por ejemplo, durante tests en Node) el componente visual no se monta, pero el `tracker` sigue inicializándose y respeta la carga y persistencia de la configuración.\r\n- **Retry rápido** — Reejecuta la URL seleccionada con `fetch` para una verificación rápida\r\n- **Keyboard shortcuts** — `Ctrl+Shift+N` / `Cmd+Shift+N` (toggle), `Escape` (cerrar), `Ctrl+F` / `Cmd+F` (buscar)\r\n\r\n### API\r\n\r\n```typescript\r\ncreateDevOverlay(config?: DevOverlayConfig): { tracker: RequestTracker; ui: DevOverlayUI; config: Required<DevOverlayConfig> }\r\n```\r\n\r\n**Opciones de configuración:**\r\n\r\n| Opción | Tipo | Por defecto | Descripción |\r\n|--------|------|-------------|-------------|\r\n| `enabled` | `boolean` | `true` | Flag de configuración almacenado por el tracker para habilitar o deshabilitar el overlay desde tu flujo |\r\n| `position` | `'top-right' \\| 'top-left' \\| 'bottom-right' \\| 'bottom-left'` | `'bottom-right'` | Posición del overlay |\r\n| `theme` | `'dark' \\| 'light'` | `'dark'` | Tema visual tipado; la UI actual está optimizada para el tema oscuro |\r\n| `maxHistory` | `number` | `500` |Máximo de requests en historial |\r\n| `keyboardShortcut` | `string` | `'ctrl+shift+n'` | Atajo de teclado |\r\n| `devOnly` | `boolean` | `true` | Cuando es true, la UI solo se monta en entornos de desarrollo (NODE_ENV=development o localhost) |\r\n| `floatingButtonSize` | `number` | `64` | Tamaño (ancho & alto) del botón flotante en píxeles |\r\n| `floatingButtonOffset` | `number` | `24` | Offset desde los bordes de la ventana en píxeles |\r\n| `floatingButtonTheme` | `'inherit' \\| 'dark' \\| 'light'` | `'inherit'` | Tema del botón flotante; `'inherit'` usa el `theme` del overlay |\r\n\r\n**Notas de comportamiento:**\r\n\r\n- `createDevOverlay()` es singleton. Si lo llamas varias veces, reutiliza la misma instancia.\r\n- El overlay solo monta UI cuando hay DOM disponible. En SSR o Node puedes importar el módulo sin romper el proceso, pero no se renderiza panel.\r\n- `theme` está tipado como `'dark' | 'light'`, pero la UI actual está diseñada principalmente para tema oscuro.\r\n- El botón de retry del panel usa `fetch()` directo para revalidación rápida; no reaplica automáticamente interceptores ni configuración avanzada del `HttpClient`.\r\n- `destroyDevOverlay()` limpia la instancia singleton, desmonta el panel y remueve listeners globales registrados por el overlay.\r\n\r\n**Métodos del UI:**\r\n\r\n```typescript\r\nui.show()   // Mostrar overlay\r\nui.hide()   // Ocultar overlay\r\nui.toggle() // Alternar visibilidad\r\nui.destroy() // Desmontar el panel del DOM\r\n\r\ntracker.clear() // Limpiar historial\r\ntracker.getHistory() // Obtener todos los requests\r\ntracker.getMetrics() // Obtener métricas\r\ntracker.getConfig() // Obtener configuración resuelta\r\ntracker.onChange((request) => {}) // Escuchar nuevos requests\r\n```\r\n\r\n**Métodos del módulo:**\r\n\r\n```typescript\r\ngetDevOverlay() // Obtener { tracker, ui } actuales o null si no existen\r\ndestroyDevOverlay() // Destruir la instancia singleton actual\r\n```\r\n\r\n**Cuándo usar cada export:**\r\n\r\n- `createDevOverlay()` crea o reutiliza el overlay y devuelve el `tracker` que debes pasar a `createHttpClient({ devTracker })`.\r\n- `getDevOverlay()` te permite consultar la instancia actual sin crear una nueva.\r\n- `destroyDevOverlay()` sirve para cerrar completamente la herramienta en hot reloads, tests o limpieza manual.\r\n- `RequestTracker` puede usarse por separado si quieres recolectar historial y métricas sin montar la UI.\r\n\r\n**Estructuras expuestas:**\r\n\r\n```typescript\r\ntype TrackedRequest = {\r\n  id: string;\r\n  method: string;\r\n  url: string;\r\n  status?: number;\r\n  duration: number;\r\n  timestamp: number;\r\n  cached: boolean;\r\n  ok: boolean;\r\n  code?: string;\r\n  headers: Record<string, string>;\r\n  body?: unknown;\r\n  responseHeaders?: Record<string, string>;\r\n  retryCount: number;\r\n};\r\n\r\ntype DevMetrics = {\r\n  totalRequests: number;\r\n  successfulRequests: number;\r\n  failedRequests: number;\r\n  cachedRequests: number;\r\n  avgDuration: number;\r\n  maxDuration: number;\r\n  minDuration: number;\r\n  requestsPerSecond: number;\r\n  slowestRequests: TrackedRequest[];\r\n};\r\n```\r\n\r\n---\r\n\r\n## Streaming\r\n\r\nManeja archivos grandes y respuestas streaming:\r\n\r\n```typescript\r\nimport { handleStream, streamToFile } from \"@bereasoftware/nexa\";\r\n\r\n// Procesamiento de stream manual\r\nconst response = await fetch(\"https://example.com/archivo-grande\");\r\nconst data = await handleStream(response, {\r\n  onChunk(chunk) {\r\n    console.log(\"Chunk recibido:\", chunk.length, \"bytes\");\r\n  },\r\n  onProgress(loaded, total) {\r\n    console.log(`Progreso: ${Math.round((loaded / total) * 100)}%`);\r\n  },\r\n});\r\n\r\n// Descargar stream a archivo\r\nconst response = await fetch(\"https://example.com/datos.csv\");\r\nawait streamToFile(response, \"salida.csv\");\r\n// Funciona tanto en Node.js (fs.writeFile) como en navegador (descarga Blob)\r\n```\r\n\r\n---\r\n\r\n## Generics Tipados\r\n\r\nUtilidades avanzadas type-safe para diseño de clientes API:\r\n\r\n### Cliente API Tipado\r\n\r\n```typescript\r\nimport { createTypedApiClient, type ApiEndpoint } from \"@bereasoftware/nexa\";\r\n\r\n// Define tu esquema API con tipos completos\r\ninterface UserApi {\r\n  getUser: ApiEndpoint<void, User>;\r\n  createUser: ApiEndpoint<CreateUserDto, User>;\r\n  listUsers: ApiEndpoint<void, User[]>;\r\n}\r\n\r\nconst api = createTypedApiClient<UserApi>({\r\n  getUser: { method: \"GET\", path: \"/users/1\", response: {} as User },\r\n  createUser: { method: \"POST\", path: \"/users\", response: {} as User },\r\n  listUsers: { method: \"GET\", path: \"/users\", response: [] as User[] },\r\n});\r\n\r\n// Petición totalmente tipada — conoce los tipos de entrada y salida\r\nconst user = await api.request(client, \"getUser\");\r\nconst newUser = await api.request(client, \"createUser\", {\r\n  name: \"Ella\",\r\n  email: \"ella@example.com\",\r\n});\r\n```\r\n\r\n### Tipos Branded\r\n\r\n```typescript\r\nimport {\r\n  createUrl,\r\n  createApiUrl,\r\n  type Url,\r\n  type ApiUrl,\r\n  type FileUrl,\r\n} from \"@bereasoftware/nexa\";\r\n\r\n// Las URLs branded previenen mezclar diferentes tipos de URL en tiempo de compilación\r\nconst apiUrl: ApiUrl = createApiUrl(\"/users/1\");\r\nconst genericUrl: Url = createUrl(\"https://example.com\");\r\n```\r\n\r\n### Type Guards\r\n\r\n```typescript\r\nimport { createTypeGuard } from \"@bereasoftware/nexa\";\r\n\r\ninterface User {\r\n  id: number;\r\n  name: string;\r\n}\r\n\r\nconst asegurarUser = createTypeGuard<User>(\r\n  (value): value is User =>\r\n    typeof value === \"object\" &&\r\n    value !== null &&\r\n    \"id\" in value &&\r\n    \"name\" in value,\r\n);\r\n\r\nconst user = asegurarUser(datosDesconocidos); // lanza TypeError si es inválido\r\n```\r\n\r\n### Patrón Observable\r\n\r\n```typescript\r\nimport { TypedObservable } from \"@bereasoftware/nexa\";\r\n\r\nconst stream = new TypedObservable<User>();\r\n\r\nconst sub = stream.subscribe(\r\n  (user) => console.log(\"Usuario:\", user.name),\r\n  (err) => console.error(\"Error:\", err),\r\n  () => console.log(\"Completado\"),\r\n);\r\n\r\n// Operadores encadenables\r\nconst nombres = stream.filter((user) => user.active).map((user) => user.name);\r\n\r\nstream.next({ id: 1, name: \"John\", active: true });\r\nstream.complete();\r\n\r\nsub.unsubscribe();\r\n```\r\n\r\n### Defer (Promesa Lazy)\r\n\r\n```typescript\r\nimport { Defer } from \"@bereasoftware/nexa\";\r\n\r\nconst deferred = new Defer<string>();\r\n\r\n// Pasar la promesa a los consumidores\r\nalgunConsumidor(deferred.promise_());\r\n\r\n// Resolver después\r\ndeferred.resolve(\"listo\");\r\n// O rechazar\r\ndeferred.reject(new Error(\"falló\"));\r\n```\r\n\r\n---\r\n\r\n## Manejo de Errores\r\n\r\n### Códigos de Error\r\n\r\n| Código             | Descripción                                                       |\r\n| ------------------ | ----------------------------------------------------------------- |\r\n| `HTTP_ERROR`       | Status HTTP no-2xx (configurable vía `validateStatus`)            |\r\n| `TIMEOUT`          | La petición excedió la duración del timeout                       |\r\n| `NETWORK_ERROR`    | Fallo de red (DNS, conexión rechazada, etc.)                      |\r\n| `ABORTED`          | La petición fue cancelada manualmente                             |\r\n| `VALIDATION_ERROR` | Los datos de respuesta no pasaron la validación                   |\r\n| `POLL_EXHAUSTED`   | El polling alcanzó el máximo de intentos sin cumplir la condición |\r\n| `MAX_RETRIES`      | Todos los intentos de reintento agotados                          |\r\n| `UNKNOWN_ERROR`    | Error no clasificado                                              |\r\n\r\n### Contexto de Error Enriquecido\r\n\r\n`HttpErrorDetails` incluye campos opcionales para `request`, `response` y `config`, pero en esta versión no todos los caminos de error los rellenan de forma consistente. Úsalos como metadatos opcionales, no como garantía fuerte.\r\n\r\n```typescript\r\nconst result = await client.get('/api');\r\nif (!result.ok) {\r\n  const { request, response, config } = result.error;\r\n  console.log('URL de request fallida:', request?.url);\r\n  console.log('Status de respuesta:', response?.status);\r\n  console.log('Timeout de configuración:', config?.timeout);\r\n}\r\n```\r\n\r\nSi necesitas ese contexto en todos los errores, conviene complementarlo temporalmente con hooks o interceptores propios.\r\n\r\n### Clase HttpError\r\n\r\n```typescript\r\nimport { HttpError, isHttpError } from \"@bereasoftware/nexa\";\r\n\r\n// Verificar si un error es un HttpError\r\nif (isHttpError(error)) {\r\n  console.log(error.status); // Código de status HTTP\r\n  console.log(error.code); // Cadena de código de error\r\n}\r\n```\r\n\r\n### Patrón: Manejar Diferentes Tipos de Error\r\n\r\n```typescript\r\nconst result = await client.get<User>(\"/users/1\");\r\n\r\nif (!result.ok) {\r\n  switch (result.error.code) {\r\n    case \"TIMEOUT\":\r\n      mostrarNotificacion(\"La petición expiró, intenta de nuevo\");\r\n      break;\r\n    case \"NETWORK_ERROR\":\r\n      mostrarNotificacion(\"Sin conexión a internet\");\r\n      break;\r\n    case \"HTTP_ERROR\":\r\n      if (result.error.status === 404)\r\n        mostrarNotificacion(\"Usuario no encontrado\");\r\n      else if (result.error.status === 403) redirigirAlLogin();\r\n      break;\r\n    case \"VALIDATION_ERROR\":\r\n      reportarBug(\"La API retornó un formato de datos inesperado\");\r\n      break;\r\n    default:\r\n      reportarError(result.error);\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Referencia de API\r\n\r\n### `createHttpClient(config?: HttpClientConfig): HttpClient`\r\n\r\nFunción factory para crear una nueva instancia del cliente HTTP.\r\n\r\n### Métodos de `HttpClient`\r\n\r\n| Método                   | Firma                                                                                 | Descripción                              |\r\n| ------------------------ | ------------------------------------------------------------------------------------- | ---------------------------------------- |\r\n| `request`                | `<T>(config: HttpRequestConfig) → Promise<Result<HttpResponse<T>, HttpErrorDetails>>` | Método core de petición                  |\r\n| `get`                    | `<T>(url, config?) → Promise<Result<...>>`                                            | Petición GET                             |\r\n| `post`                   | `<T>(url, body?, config?) → Promise<Result<...>>`                                     | Petición POST                            |\r\n| `put`                    | `<T>(url, body?, config?) → Promise<Result<...>>`                                     | Petición PUT                             |\r\n| `patch`                  | `<T>(url, body?, config?) → Promise<Result<...>>`                                     | Petición PATCH                           |\r\n| `delete`                 | `<T>(url, config?) → Promise<Result<...>>`                                            | Petición DELETE                          |\r\n| `head`                   | `(url, config?) → Promise<Result<...>>`                                               | Petición HEAD                            |\r\n| `options`                | `(url, config?) → Promise<Result<...>>`                                               | Petición OPTIONS                         |\r\n| `extend`                 | `(overrides?: HttpClientConfig) → HttpClient`                                         | Crear cliente hijo                       |\r\n| `paginate`               | `<T>(url, options, config?) → AsyncGenerator<T[]>`                                    | Auto-paginación                          |\r\n| `poll`                   | `<T>(url, options, config?) → Promise<Result<...>>`                                   | Polling inteligente                      |\r\n| `addRequestInterceptor`  | `(interceptor) → Disposer`                                                            | Agregar interceptor de petición          |\r\n| `addResponseInterceptor` | `(interceptor) → Disposer`                                                            | Agregar interceptor de respuesta         |\r\n| `clearInterceptors`      | `() → void`                                                                           | Remover todos los interceptores          |\r\n| `cancelAll`              | `() → void`                                                                           | Cancelar todas las peticiones pendientes |\r\n| `activeRequests`         | `number` (getter)                                                                     | Número de peticiones en vuelo            |\r\n| `queueStats`             | `{ active, pending }` (getter)                                                        | Estadísticas de la cola                  |\r\n\r\n### Tipos\r\n\r\n| Tipo                  | Descripción                                                                       |\r\n| --------------------- | --------------------------------------------------------------------------------- |\r\n| `Result<T, E>`        | Unión discriminada éxito/fallo                                                    |\r\n| `HttpRequest`         | Configuración de petición (url, method, headers, body, query, params)             |\r\n| `HttpResponse<T>`     | Respuesta con data, status, headers, duration                                     |\r\n| `HttpErrorDetails`    | Error con message, code, status, originalError                                    |\r\n| `HttpRequestConfig`   | Config completa de petición (extiende HttpRequest + retry, cache, hooks, etc.)    |\r\n| `HttpClientConfig`    | Configuración a nivel de cliente                                                  |\r\n| `RequestInterceptor`  | Interceptar peticiones salientes                                                  |\r\n| `ResponseInterceptor` | Interceptar respuestas entrantes                                                  |\r\n| `RetryStrategy`       | Interfaz de lógica de reintento personalizada                                     |\r\n| `CacheStrategy`       | Interfaz de implementación de caché personalizada                                 |\r\n| `Validator`           | Interfaz de validación de respuesta                                               |\r\n| `Transformer`         | Interfaz de transformación de respuesta                                           |\r\n| `PaginateOptions<T>`  | Configuración de paginación                                                       |\r\n| `PollOptions<T>`      | Configuración de polling                                                          |\r\n| `RequestHooks<T>`     | Callbacks de hooks de ciclo de vida                                               |\r\n| `ProgressEvent`       | Datos de progreso de descarga                                                     |\r\n| `ResponseType`        | `'json' \\| 'text' \\| 'blob' \\| 'arrayBuffer' \\| 'formData' \\| 'stream' \\| 'auto'` |\r\n| `Disposer`            | Función que remueve un interceptor                                                |\r\n\r\n---\r\n\r\n## Formatos de Build\r\n\r\nNexa se distribuye en múltiples formatos de módulo:\r\n\r\n| Formato   | Archivo                 | Caso de Uso                               |\r\n| --------- | ----------------------- | ----------------------------------------- |\r\n| **ESM**   | `dist/nexa.es.js`       | Bundlers modernos (Vite, Rollup, esbuild) |\r\n| **CJS**   | `dist/nexa.cjs.js`      | Node.js `require()`                       |\r\n| **UMD**   | `dist/nexa.umd.js`      | Universal (AMD, CJS, global)              |\r\n| **IIFE**  | `dist/nexa.iife.js`     | Tags de script (`<script>`)               |\r\n| **Types** | `dist/types/index.d.ts` | Declaraciones de tipos TypeScript         |\r\n\r\n---\r\n\r\n## Desarrollo\r\n\r\n### Pruebas\r\n\r\n**205 tests en total**: 88 tests de HTTP Client + 69 tests de utilities + 24 tests de mocking + 4 tests de adaptadores Node.js + 20 tests adicionales\r\n\r\n```bash\r\n# Ejecutar todos los tests\r\nnpm test\r\n\r\n# Watch mode\r\nnpm run test:watch\r\n\r\n# Test coverage\r\nnpm run test:coverage\r\n\r\n# UI de tests\r\nnpm run test:ui\r\n```\r\n\r\nLos tests usan **Vitest** (globals mode) con BDD style (`describe`/`it`/`expect`).\r\n\r\n### Linting y Formato\r\n\r\n```bash\r\n# Verificar tipo\r\nnpm run lint\r\n\r\n# Corregir errores de estilo\r\nnpm run lint:fix\r\n\r\n# Formatear código\r\nnpm run format\r\n\r\n# Verificar formato\r\nnpm run format:check\r\n```\r\n\r\n### Build\r\n\r\n```bash\r\n# Generar distribución\r\nnpm run build\r\n```\r\n\r\n**Configuración de build:**\r\n\r\n- **Formatos**: ES, CommonJS, UMD, IIFE\r\n- **Minificación**: OXC (ultra-rápido)\r\n- **Type Definitions**: Bundled en `/dist/types`\r\n- **Tree-shakeable**: Solo importa lo que usas\r\n- **Externas**: `fs` (Node.js only para `streamToFile`)\r\n\r\n**Output:**\r\n\r\n```\r\ndist/\r\n  ├── nexa.es.js        (24.9 KB, gzip: 7.53 KB)\r\n  ├── nexa.cjs.js       (19.9 KB, gzip: 6.68 KB)\r\n  ├── nexa.umd.js       (19.8 KB, gzip: 6.75 KB)\r\n  ├── nexa.iife.js      (19.6 KB, gzip: 6.68 KB)\r\n  └── types/            (Tipo definitivo .d.ts)\r\n```\r\n\r\n### Benchmark\r\n\r\n```bash\r\n# Ejecutar benchmark de performance\r\nnpm run benchmark\r\n```\r\n\r\n### Ejemplos\r\n\r\nVer la carpeta `examples/` para ejemplos de uso con diferentes frameworks:\r\n\r\n- `react-example.ts` — Uso con React\r\n- `vue-example.ts` — Uso con Vue\r\n- `svelte-example.ts` — Uso con Svelte\r\n- `node-example.ts` — Uso con Node.js\r\n\r\n### Cobertura de Tests\r\n\r\n**Cobertura General: 71.4%** — sólida cobertura de tests unitarios con mocking HTTP\r\n\r\n| Componente  | Cobertura  | Detalles                          |\r\n| ----------- | ---------- | --------------------------------- |\r\n| HTTP Client | **66.7%** | 67.3% ramas, 67.0% funciones   |\r\n| Types       | **100%**   | Cobertura perfecta de tipos       |\r\n| Testing     | **93.7%**  | 85.1% ramas, 95.8% funciones     |\r\n| Utils       | **71.8%**  | 66.7% ramas, 81.1% funciones     |\r\n\r\n**HTTP Client** (`test/http-client.test.ts`) — **88 tests**:\r\n\r\n- ✓ Métodos core: create, GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS/QUERY (8 tests)\r\n- ✓ Estrategias de reintentos & timeouts (3 tests)\r\n- ✓ Interceptores & disposal (5 tests)\r\n- ✓ Caché & validación (4 tests)\r\n- ✓ Type safety & extensiones (3 tests)\r\n- ✓ Paginación & polling (5 tests)\r\n- ✓ Manejo de tipos de respuesta: 8+ tipos + auto-detección (13 tests)\r\n- ✓ Detección de content-type binario: image/*, audio/*, video/*, octet-stream (5 tests)\r\n- ✓ Serialización de body: JSON, null, strings, Blob, URLSearchParams, ArrayBuffer, TypedArray, FormData, ReadableStream (7 tests)\r\n- ✓ Normalización de errores: TimeoutError, AbortError, TypeError, unknown, NETWORK_ERROR (5+ tests)\r\n- ✓ Gestión de peticiones: activeRequests, cancelAll, clearCache (2 tests)\r\n- ✓ Verificación de exports: todas las 8 cat","readmeFilename":"README.md"}