{"_id":"@metis-w/api-client","_rev":"26-e251534b66246f5eda9bfbe7fe616609","name":"@metis-w/api-client","dist-tags":{"latest":"1.2.6"},"versions":{"1.1.0":{"name":"@metis-w/api-client","version":"1.1.0","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.1.0","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"3b2e51106101f5d291f3a7c004b3d62972ca8ff0","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.1.0.tgz","fileCount":55,"integrity":"sha512-sRwmRuRqZiF0CFRnW/up+NtQW+29iE9LnAjI85Sv9QoJnfiSDGzlCukDSdbbfLX87AToCUx4crbKI6Okb9ShYw==","signatures":[{"sig":"MEYCIQCWkf7MseRIEtR8FR6qwZ9XWALbgVy0ZSatNR+SJgkFxgIhAPsrCnxGtolP5bsurjezQrWAi5Fxt5aQ7L+OmqdjGkwC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72745},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"fad94c7a6557bfb3967c5813d61e4f479f37f171","scripts":{"build":"tsc"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.1.0_1751410858981_0.8220029783604923","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@metis-w/api-client","version":"1.2.0","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.2.0","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"dc77c2cafeda1f74bf3260a8eff5cf8c6c26befc","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.0.tgz","fileCount":55,"integrity":"sha512-0WDXHPH8UnmmNiuZAC8pVXl0kzq3rZYjYYM95Jt+97PDxf09k0/g8rRF/x/NQAtDWqgr7MX9IN4EPYYAWaC35Q==","signatures":[{"sig":"MEYCIQDRnFt0YUDuKq/SsIAAkDSsJhT1J8D5B6ym1JvKX5taiAIhAMJlFDx3u+weKSyeCCA53tzrDghHfMtlJu8ZNlIELe1G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87822},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"016f4bbe8f04ef4f4f9dc938188866fa526bb870","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","ts-jest":"^29.4.0","node-fetch":"^2.6.7","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.2.0_1751492201294_0.9045409569582248","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@metis-w/api-client","version":"1.2.1","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.2.1","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"2dafcd801217ec87c3a4e0bfa7bf3e74fbe88d15","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.1.tgz","fileCount":55,"integrity":"sha512-MgibiG0fFk22D++ILh4JtNSzapFSR9WTeaP70ceDompqiBHrd7etxDXpowxU2mnDXFemK33TFw2eexc0evaRJw==","signatures":[{"sig":"MEUCIAGGpTDvCcivh9C0HB3O9kw1YbvT7SUw5ClGXIaGqAKHAiEA09cJzbS0kKB3FJLHPWK1bxhxWMcw3NtFBEMxTrS+qJo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88338},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d094bc05f21faa8096fa8b36a85f5484c6da9aa7","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","ts-jest":"^29.4.0","node-fetch":"^2.6.7","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.2.1_1751498904250_0.31102760734017965","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@metis-w/api-client","version":"1.2.2","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.2.2","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"bce52be5a2215086473321712f6baeb247fc4c42","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.2.tgz","fileCount":91,"integrity":"sha512-Uyn0CVNzfwOTBa7GoRXeElV6OVN3yUt5Kgz6SNR9zt9gtma7QI4jlHFTgCmWRZtJ0lyY/asPZF1u9yrDLhux6Q==","signatures":[{"sig":"MEQCIAa3YHCuNodq5553lwGUEyD0xyYalV2AfMRpsrlYWWeKAiBc1zojcUuwCwhaXGZXkF0TckHJVUfON+CVoKE1Dj04JQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148297},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d094bc05f21faa8096fa8b36a85f5484c6da9aa7","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","ts-jest":"^29.4.0","node-fetch":"^2.6.7","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.2.2_1751499104178_0.12753599467618892","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@metis-w/api-client","version":"1.2.3","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.2.3","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"e5770f37026ff0b7b2d25faa6df6d299299436d8","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.3.tgz","fileCount":91,"integrity":"sha512-BGlz6qZykwqq/s914xUxwcQkuFs9pK2FTwR44i8szBdczkdKckyacnFpL21ehh+iWMiw6Re2s6Pto1dAI0lysQ==","signatures":[{"sig":"MEUCIQDMbf2Z6H0I8SVYWYTCAC6qMQgU0pA+K45I/yoKuLx3vQIgddrBEwNe9KJTL4ldPO3/EKy2SX9AgKbyeSKM8eUD1Zk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151562},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1cbbcce9844371a92269bf4f9c17297376675b7e","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","ts-jest":"^29.4.0","node-fetch":"^2.6.7","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.2.3_1751504996598_0.06869455976402383","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@metis-w/api-client","version":"1.2.4","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.2.4","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"ec561c95d46b3eec3373a6a0b99b032da201fcb2","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.4.tgz","fileCount":95,"integrity":"sha512-vKHIjgE+3oxFuEGIDbErP5hTTa0UppFdt8ewe3P9vSp9HlMJurl8XjvODi6PPAWLTydf7q3VaMdate/CHhmSYA==","signatures":[{"sig":"MEUCIE/neHkXdqwgDY0SCiOLlTMZAOn5xcaRB91oVC/G/wm5AiEAp9rgActVVGcijGc0y1qCJgF5uUYVSy4LATv6u5pmPAs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167131},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"5a598ea0713aa61c679f793d9805ef8b1c42e854","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","ts-jest":"^29.4.0","node-fetch":"^2.6.7","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.2.4_1751666607267_0.9365455472854991","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@metis-w/api-client","version":"1.2.5","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"author":{"name":"whiteakyloff"},"license":"MIT","_id":"@metis-w/api-client@1.2.5","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"dist":{"shasum":"49d3c8a04d3e6d82442158a6c02d3c5b9433a32f","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.5.tgz","fileCount":95,"integrity":"sha512-9irBhI7Qy2EH3jFY9PZiXHpAj9qRnylA4YvesHexF2i1g22TFDeXNise/Yn0s39VPkNphNkBsAfmU7rW4OVGzA==","signatures":[{"sig":"MEUCIBK84P/2aUB9OC0X6qTz+7BB6QM3WfsVm2rzp0ibtsnCAiEAmugbhlxBDcHo6q19ZpwA1URyc32oE27MNO/aMgrWDFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167131},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"5a598ea0713aa61c679f793d9805ef8b1c42e854","scripts":{"test":"jest","build":"tsc","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"whiteakyloff","actor":{"name":"whiteakyloff","type":"user","email":"whiteakyloff@gmail.com"},"email":"whiteakyloff@gmail.com"},"repository":{"url":"github.com:metis-w/api-client","type":"git"},"_npmVersion":"11.3.0","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","directories":{},"_nodeVersion":"20.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","ts-jest":"^29.4.0","node-fetch":"^2.6.7","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12"},"_npmOperationalInternal":{"tmp":"tmp/api-client_1.2.5_1751667707410_0.608547267494475","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"@metis-w/api-client","version":"1.2.6","description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","author":{"name":"whiteakyloff"},"homepage":"https://github.com/metis-w/api-client","bugs":{"url":"https://github.com/metis-w/api-client/issues"},"repository":{"type":"git","url":"github.com:metis-w/api-client"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./interceptors":{"types":"./dist/interceptors/index.d.ts","import":"./dist/interceptors/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./libs":{"types":"./dist/libs/index.d.ts","import":"./dist/libs/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"sideEffects":false,"scripts":{"build":"tsc","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"publishConfig":{"access":"public"},"keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"devDependencies":{"@types/jest":"^30.0.0","@types/node-fetch":"^2.6.12","jest":"^30.0.3","node-fetch":"^2.6.7","ts-jest":"^29.4.0","typescript":"^5.8.3"},"_id":"@metis-w/api-client@1.2.6","gitHead":"517854b694b974e52d27fc2cb1cd852ec7a4e686","_nodeVersion":"20.18.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-EQdKtDr8nENp7Q0r2ARfT4IX3T80ffj40EwKqsMVdXuprZTX+klWUt0/PKV3VhjB0gSRJU5sLiXe5EWjdLfCHQ==","shasum":"ab0e9d67cfaeef8450833bad76fbbdc7f9714a74","tarball":"https://registry.npmjs.org/@metis-w/api-client/-/api-client-1.2.6.tgz","fileCount":131,"unpackedSize":170222,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDRJwrBc6olCLWoQLCY70MgFeIUp/Uvij0tS4lshGN+ewIgJ4Dn628rWInDvwi/iOZdW88ebEnMJmmZaeb9dtUAsvE="}]},"_npmUser":{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"},"directories":{},"maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/api-client_1.2.6_1755119894757_0.24789549674191114"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-01T23:00:58.840Z","modified":"2025-08-13T21:18:15.536Z","1.0.0":"2025-06-29T16:36:17.311Z","1.0.1":"2025-06-29T17:03:32.506Z","1.0.2":"2025-06-29T18:06:21.583Z","1.0.3":"2025-06-29T20:40:39.167Z","1.0.4":"2025-06-30T20:17:37.063Z","1.0.5":"2025-06-30T20:51:42.549Z","1.0.6":"2025-06-30T21:08:17.177Z","1.0.7":"2025-06-30T21:32:36.271Z","1.0.8":"2025-06-30T21:54:15.709Z","1.0.9":"2025-06-30T21:57:49.557Z","1.0.10":"2025-06-30T22:15:22.066Z","1.0.11":"2025-06-30T22:24:59.623Z","1.1.0":"2025-07-01T23:00:59.180Z","1.2.0":"2025-07-02T21:36:41.475Z","1.2.1":"2025-07-02T23:28:24.426Z","1.2.2":"2025-07-02T23:31:44.380Z","1.2.3":"2025-07-03T01:09:56.795Z","1.2.4":"2025-07-04T22:03:27.480Z","1.2.5":"2025-07-04T22:21:47.638Z","1.2.6":"2025-08-13T21:18:14.981Z"},"bugs":{"url":"https://github.com/metis-w/api-client/issues"},"author":{"name":"whiteakyloff"},"license":"MIT","homepage":"https://github.com/metis-w/api-client","keywords":["api","client","typescript","fetch","http","dynamic-routes","interceptors","modern","rest"],"repository":{"type":"git","url":"github.com:metis-w/api-client"},"description":"Modern TypeScript HTTP API client with dynamic routes, parameterized endpoints, interceptors, and advanced features","maintainers":[{"name":"whiteakyloff","email":"whiteakyloff@gmail.com"}],"readme":"# Metis API Client\r\n\r\n[![NPM](https://nodei.co/npm/@metis-w/api-client.png)](https://npmjs.com/package/@metis-w/api-client)\r\n\r\n## Features\r\n\r\n- 🎯 **Dynamic Routes** - `api.users.getProfile()`, `api.admin.users.ban()`\r\n- 📊 **Parameterized Endpoints** - `api.users(123).follow()`, `api.posts('slug').view()`\r\n- 🔧 **TypeScript First** - Full type safety and IntelliSense support\r\n- 🚀 **Modern Fetch API** - No XMLHttpRequest, pure modern JavaScript\r\n- 🔄 **Interceptors** - Request/Response middleware with logging, caching, performance\r\n- ⚡ **Automatic Retries** - Configurable retry logic with exponential backoff\r\n- 🏷️ **Case Conversion** - Automatic camelCase ↔ kebab-case conversion\r\n- 📁 **File Upload** - Automatic FormData handling for File/Blob objects\r\n- 🎨 **Flexible Configuration** - Per-request and global settings\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @metis-w/api-client\r\n```\r\n\r\n## Quick Start\r\n\r\n### Basic Usage\r\n\r\n```typescript\r\nimport { APIClient } from '@metis-w/api-client';\r\n\r\nconst api = new APIClient({\r\n    baseUrl: 'https://api.example.com',\r\n    timeout: 5000\r\n});\r\n\r\n// Simple requests\r\nconst users = await api.get('/users');\r\nconst newUser = await api.post('/users', { name: 'John', email: 'john@example.com' });\r\n\r\n// Alternative: Use convenience functions\r\nimport { createClient, createDynamicClient, IDynamicClient } from '@metis-w/api-client';\r\n\r\nconst apiClient = createClient({ baseUrl: 'https://api.example.com' });\r\nconst dynamicApi: IDynamicClient = createDynamicClient({ baseUrl: 'https://api.example.com' });\r\n```\r\n\r\n#### Subpath imports (опційно)\r\n\r\n```typescript\r\nimport { DynamicClient } from '@metis-w/api-client/core';\r\nimport { CacheInterceptor } from '@metis-w/api-client/interceptors';\r\n```\r\n\r\n### Dynamic Routes\r\n\r\n```typescript\r\nimport { DynamicClient, IDynamicClient } from '@metis-w/api-client';\r\n\r\nconst api: IDynamicClient = new DynamicClient({\r\n    baseUrl: 'https://api.example.com',\r\n    useKebabCase: true // converts getUserInfo → get-user-info\r\n});\r\n\r\n// Dynamic routing magic - no 'as any' needed!\r\nconst profile = await api.users.getProfile({ id: 123 });\r\nconst result = await api.admin.users.ban({ userId: 456, reason: 'spam' });\r\n\r\n// Multi-level routes\r\nconst settings = await api.users.profile.getSettings({ theme: 'dark' });\r\n```\r\n\r\n### Parameterized Routes\r\n\r\nEnhanced parameterized routes with direct call support:\r\n\r\n```typescript\r\n// Traditional parameterized routes with actions (creates nested paths)\r\nconst userProfile = await api.users(123).getProfile();      // GET /users/123/getProfile\r\nconst follow = await api.users(123).follow({ notify: true }); // POST /users/123/follow\r\nconst profile = await api.users(456).profile.update({ bio: 'New bio' }); // PUT /users/456/profile/update\r\n\r\n// NEW: Direct parameterized route calls (RESTful) - URL will reflect useKebabCase if enabled (e.g. getProfile → get-profile)\r\nconst user = await api.users(123)();                        // GET /users/123\r\nconst updated = await api.users(123)({ name: \"John\" });     // PUT /users/123 (with payload = update)\r\nconst deleted = await api.users(123)({ method: \"DELETE\" }); // DELETE /users/123 (explicit method)\r\n\r\n// With query parameters\r\nconst user = await api.users(123)({}, { include: \"profile\" }); // GET /users/123?include=profile\r\nconst updated = await api.users(123)({ name: \"John\" }, { format: \"json\" }); // PUT /users/123?format=json\r\n```\r\n\r\n#### Direct Call Logic\r\n\r\n- **No payload**: `GET /resource/id` - Retrieve the resource\r\n- **With payload**: `PUT /resource/id` - Update the resource (default semantic)\r\n- **Explicit method**: Override with `{ method: \"DELETE\" }` etc.\r\n- **Query params**: Second parameter for URL query string\r\n\r\n### HTTP Method Resolution\r\n\r\nThe DynamicClient intelligently determines the appropriate HTTP method based on several factors:\r\n\r\n#### 1. Explicit Method (Highest Priority)\r\n\r\n```typescript\r\n// Override any automatic method detection\r\nawait api.users.create({ name: \"John\", method: \"PUT\" });  // Forces PUT method\r\nawait api.users.delete({ confirm: true, method: \"POST\" }); // Forces POST method\r\n```\r\n\r\n#### 2. Direct HTTP Methods\r\n\r\n```typescript\r\n// Direct method calls\r\nawait api.users.get();     // GET /users/get\r\nawait api.users.post();    // POST /users/post\r\nawait api.users.put();     // PUT /users/put\r\nawait api.users.delete();  // DELETE /users/delete\r\nawait api.users.patch();   // PATCH /users/patch\r\n```\r\n\r\n#### 3. Semantic Analysis (Auto-detection)\r\n\r\nThe library automatically detects the intent from action names:\r\n\r\n```typescript\r\n// GET methods (reading data)\r\nawait api.users.fetch();           // GET\r\nawait api.users.load();            // GET\r\nawait api.users.find();            // GET\r\nawait api.users.retrieve();        // GET\r\nawait api.users.show();            // GET\r\nawait api.users.view();            // GET\r\nawait api.users.getProfile();      // GET (starts with 'get')\r\nawait api.users.loadSettings();    // GET (starts with 'load')\r\n\r\n// POST methods (creating data)\r\nawait api.users.create();          // POST\r\nawait api.users.add();             // POST\r\nawait api.users.save();            // POST\r\nawait api.users.store();           // POST\r\nawait api.users.insert();          // POST\r\nawait api.users.register();        // POST\r\nawait api.users.submit();          // POST\r\nawait api.users.createUser();      // POST (starts with 'create')\r\n\r\n// PUT methods (updating/replacing data)\r\nawait api.users.update();          // PUT\r\nawait api.users.replace();         // PUT\r\nawait api.users.modify();          // PUT\r\nawait api.users.edit();            // PUT\r\nawait api.users.change();          // PUT\r\nawait api.users.set();             // PUT\r\nawait api.users.updateProfile();   // PUT (starts with 'update')\r\n\r\n// DELETE methods (removing data)\r\nawait api.users.delete();          // DELETE\r\nawait api.users.remove();          // DELETE\r\nawait api.users.destroy();         // DELETE\r\nawait api.users.clear();           // DELETE\r\nawait api.users.drop();            // DELETE\r\nawait api.users.deleteUser();      // DELETE (starts with 'delete')\r\n\r\n// PATCH methods (partial updates)\r\nawait api.users.patch();           // PATCH\r\nawait api.users.partial();         // PATCH\r\nawait api.users.toggle();          // PATCH\r\nawait api.users.enable();          // PATCH\r\nawait api.users.disable();         // PATCH\r\nawait api.users.activate();        // PATCH\r\nawait api.users.deactivate();      // PATCH\r\n```\r\n\r\n#### 4. Custom Method Rules\r\n\r\nDefine custom patterns for your API. Patterns are matched against action names (not controller names), case-insensitively. Matching supports prefix/suffix wildcards and kebab-case or camelCase action names:\r\n\r\n```typescript\r\nconst api = new DynamicClient({\r\n    baseUrl: 'https://api.example.com',\r\n    methodRules: {\r\n        'validate*': 'POST',   // e.g., validateInput → POST\r\n        '*report': 'GET',      // e.g., monthlyReport → GET\r\n        'verify*': 'GET',      // e.g., verifyToken → GET\r\n        'delete*': 'DELETE'    // e.g., deleteUser → DELETE\r\n    }\r\n});\r\n\r\nawait api.data.validateInput();    // POST (pattern match)\r\nawait api.sales.monthlyReport();   // GET (pattern match)\r\nawait api.auth.verifyToken();      // GET (pattern match)\r\n```\r\n\r\n#### 5. Default Method\r\n\r\nSet a fallback method for unrecognized actions:\r\n\r\n```typescript\r\nconst api = new DynamicClient({\r\n    baseUrl: 'https://api.example.com',\r\n    defaultMethod: 'GET' // Default to GET instead of POST\r\n});\r\n\r\nawait api.users.unknownAction();   // GET (fallback to default)\r\n```\r\n\r\n#### Priority Order\r\n\r\nThe method resolution follows this priority:\r\n\r\n1. **Explicit method** in payload (`{ method: \"DELETE\" }`)\r\n2. **Direct HTTP method** (`get`, `post`, `put`, `delete`, `patch`)\r\n3. **Custom method rules** (from `methodRules` config)\r\n4. **Semantic analysis** (action name patterns)\r\n5. **Default method** (from `defaultMethod` config, defaults to `POST`)\r\n\r\n### File Uploads\r\n\r\n```typescript\r\nconst fileInput = document.querySelector('input[type=\"file\"]') as HTMLInputElement;\r\nconst file = fileInput.files?.[0];\r\n\r\nif (file) {\r\n    // Automatic FormData handling\r\n    const response = await api.post('/upload/avatar', {\r\n        file: file,\r\n        userId: 123,\r\n        metadata: { title: 'Profile Picture' }\r\n    });\r\n}\r\n\r\n// Multiple files\r\nconst files = Array.from(fileInput.files || []);\r\nconst response = await api.post('/upload/gallery', {\r\n    files: files,\r\n    albumId: 456,\r\n    tags: ['vacation', 'summer']\r\n});\r\n```\r\n\r\n### TypeScript Support\r\n\r\nFull TypeScript integration with intelligent type inference and strict settings. Public APIs are generic-first; a few internal defaults use `any` for flexibility.\r\n\r\n```typescript\r\n// Import types for proper typing\r\nimport { DynamicClient, IDynamicClient, APIClient } from '@metis-w/api-client';\r\n\r\n// Define your API response types\r\ninterface User {\r\n    id: number;\r\n    name: string;\r\n    email: string;\r\n    avatar?: string;\r\n}\r\n\r\ninterface CreateUserRequest {\r\n    name: string;\r\n    email: string;\r\n    password: string;\r\n}\r\n\r\n// Type-safe API calls with APIClient\r\nconst client = new APIClient({ baseUrl: 'https://api.example.com' });\r\nconst user = await client.get<User>('/users/123');\r\n// user.data is typed as User | undefined\r\n\r\nconst newUser = await client.post<User, CreateUserRequest>('/users', {\r\n    name: 'John Doe',\r\n    email: 'john@example.com',\r\n    password: 'secure123'\r\n});\r\n\r\n// Type-safe dynamic client - no 'as any' casting needed!\r\nconst dynamicClient: IDynamicClient = new DynamicClient({ \r\n    baseUrl: 'https://api.example.com',\r\n    defaultMethod: 'GET',\r\n    methodRules: {\r\n        'auth*': 'POST'\r\n    }\r\n});\r\n\r\n// TypeScript understands these are dynamic routes with proper return types\r\nconst userData = await dynamicClient.users.getProfile({ id: 123 });\r\n// userData is typed as APIResponse<unknown>\r\n\r\n// All HTTP methods work seamlessly\r\nawait dynamicClient.users.create({ name: \"John\" });     // POST (semantic)\r\nawait dynamicClient.users.update({ id: 1 });            // PUT (semantic)\r\nawait dynamicClient.users.fetch();                      // GET (semantic)\r\nawait dynamicClient.users.remove();                     // DELETE (semantic)\r\nawait dynamicClient.users.patch({ status: \"active\" });  // PATCH (semantic)\r\n\r\n// Custom method rules\r\nawait dynamicClient.auth.login({ email: \"test@test.com\" }); // POST (rule)\r\n\r\n// Explicit method override\r\nawait dynamicClient.users.action({ data: \"test\", method: \"DELETE\" }); // DELETE (explicit)\r\n\r\n// RESTful parameterized routes\r\nconst user = await dynamicClient.users(123)();              // GET /users/123\r\nconst updated = await dynamicClient.users(123)({ name: 'John Smith' }); // PUT /users/123\r\n\r\n// Traditional action-based parameterized routes  \r\nconst profile = await dynamicClient.users(123).getProfile(); // GET /users/123/getProfile\r\nconst follow = await dynamicClient.users(123).follow();     // POST /users/123/follow\r\n```\r\n\r\n### Generic Type Support\r\n\r\n```typescript\r\n// Create a typed API client\r\nclass TypedAPIClient extends APIClient {\r\n    async getUser(id: number): Promise<User> {\r\n        const response = await this.get<User>(`/users/${id}`);\r\n        if (!response.success || !response.data) {\r\n            throw new Error(response.error?.message || 'User not found');\r\n        }\r\n        return response.data;\r\n    }\r\n\r\n    async createUser(userData: CreateUserRequest): Promise<User> {\r\n        const response = await this.post<User, CreateUserRequest>('/users', userData);\r\n        if (!response.success || !response.data) {\r\n            throw new Error(response.error?.message || 'Failed to create user');\r\n        }\r\n        return response.data;\r\n    }\r\n}\r\n\r\nconst typedApi = new TypedAPIClient({ baseUrl: 'https://api.example.com' });\r\nconst user = await typedApi.getUser(123); // Returns User directly\r\n```\r\n\r\n## API Reference\r\n\r\n### APIClient\r\n\r\n| Method | Description |\r\n|--------|-------------|\r\n| `get<T>(url, config?)` | GET request |\r\n| `post<T>(url, data?, config?)` | POST request |\r\n| `put<T>(url, data?, config?)` | PUT request |\r\n| `delete<T>(url, config?)` | DELETE request |\r\n| `patch<T>(url, data?, config?)` | PATCH request |\r\n| `interceptors.addRequestInterceptor(fn)` | Add request middleware |\r\n| `interceptors.addResponseInterceptor(fn)` | Add response middleware |\r\n| `destroy()` | Clean up client resources |\r\n\r\n### DynamicClient\r\n\r\nAll APIClient methods plus:\r\n\r\n| Method | Description |\r\n|--------|-------------|\r\n| `cache.getStats()` | Get cache statistics for dynamic routes |\r\n| `cache.clearProxyCache()` | Clear dynamic route cache |\r\n\r\n### Configuration\r\n\r\n```typescript\r\ntype HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n\r\ninterface APIConfig {\r\n    baseUrl: string;\r\n    timeout?: number;\r\n    headers?: Record<string, string>;\r\n    withCredentials?: boolean;\r\n    retries?: number;\r\n    retryDelay?: number;\r\n    useKebabCase?: boolean;\r\n    // Method resolution options\r\n    defaultMethod?: HTTPMethod;                 // Fallback method, default: 'POST'\r\n    methodRules?: Record<string, HTTPMethod>;   // Action-based wildcard rules\r\n}\r\n```\r\n\r\n### Response Format\r\n\r\n```typescript\r\ninterface APIResponse<T> {\r\n    success: boolean;\r\n    data?: T;\r\n    error?: {\r\n        code?: number;\r\n        message?: string;\r\n    };\r\n}\r\n\r\ninterface ClientError {\r\n    message: string;\r\n    type: \"network\" | \"timeout\" | \"abort\" | \"parse\";\r\n    originalError?: Error;\r\n    response?: RawResponse;\r\n}\r\n```\r\n\r\n## Testing\r\n\r\nThe project includes comprehensive test coverage using Jest and TypeScript.\r\n\r\n### Running Tests\r\n\r\n```bash\r\n# Run all tests\r\nnpm test\r\n\r\n# Run tests in watch mode\r\nnpm run test:watch\r\n\r\n# Run tests with coverage\r\nnpm run test:coverage\r\n```\r\n\r\n### Test Structure\r\n\r\nOur test suite covers all major functionality:\r\n\r\n```\r\ntest/\r\n├── api-client.test.ts     # Core APIClient functionality\r\n├── dynamic-client.test.ts # Dynamic routing and parameterized endpoints\r\n├── converter.test.ts      # Case conversion utilities\r\n├── serializer.test.ts     # Data serialization and FormData handling\r\n├── url-builder.test.ts    # URL construction utilities\r\n├── setup.ts              # Test configuration and global mocks\r\n└── globals.d.ts          # TypeScript definitions for test environment\r\n```\r\n\r\n### Key Test Scenarios\r\n\r\n#### APIClient Tests\r\n- ✅ Basic HTTP methods (GET, POST, PUT, DELETE, PATCH)\r\n- ✅ Request/Response interceptors\r\n- ✅ Error handling and retry logic\r\n- ✅ FormData handling for file uploads\r\n- ✅ Configuration merging and validation\r\n\r\n#### DynamicClient Tests\r\n- ✅ Dynamic route generation (`api.users.getProfile()`)\r\n- ✅ Parameterized endpoints (`api.users(123).follow()`)\r\n- ✅ Multi-level routing (`api.admin.users.ban()`)\r\n- ✅ Case conversion (camelCase ↔ kebab-case)\r\n- ✅ Nested parameters and complex data structures\r\n\r\n#### Data Serialization Tests\r\n- ✅ FormData handling for file uploads\r\n- ✅ JSON serialization and content-type detection\r\n- ✅ Deep object transformation\r\n- ✅ File and Blob object detection\r\n- ✅ Edge cases and performance validation\r\n\r\n#### URL Builder Tests\r\n- ✅ URL construction with path segments\r\n- ✅ Query parameter handling\r\n- ✅ Base URL normalization\r\n- ✅ Special characters and encoding\r\n\r\n#### Case Conversion Tests\r\n- ✅ camelCase to kebab-case conversion\r\n- ✅ kebab-case to camelCase conversion\r\n- ✅ Deep object key transformation\r\n- ✅ Array handling with nested objects\r\n\r\n### Writing Tests\r\n\r\nWhen contributing, follow these testing patterns:\r\n\r\n```typescript\r\nimport { APIClient } from '../src/core/api-client';\r\n\r\ndescribe('APIClient', () => {\r\n    let client: APIClient;\r\n    \r\n    beforeEach(() => {\r\n        client = new APIClient({ baseUrl: 'https://test.api' });\r\n        jest.clearAllMocks();\r\n    });\r\n    \r\n    afterEach(() => {\r\n        client.destroy(); // Important: Clean up resources\r\n    });\r\n    \r\n    it('should make GET request', async () => {\r\n        const mockResponse = { success: true, data: { id: 1 } };\r\n        (global.fetch as jest.Mock).mockResolvedValueOnce({\r\n            ok: true,\r\n            json: async () => mockResponse\r\n        });\r\n        \r\n        const result = await client.get('/test');\r\n        expect(result).toEqual(mockResponse);\r\n    });\r\n});\r\n```\r\n\r\n## Architecture\r\n\r\nThe project follows a modular architecture for maintainability and testability:\r\n\r\n### Core Components\r\n\r\n```\r\nsrc/\r\n├── core/                  # Main client classes\r\n│   ├── api-client.ts     # Core HTTP client\r\n│   └── dynamic-client.ts # Dynamic routing client\r\n├── libs/                 # Reusable libraries\r\n│   ├── builders/         # Request and route builders\r\n│   ├── constants/        # Configuration constants\r\n│   ├── managers/         # Cache, interceptor, retry managers\r\n│   ├── parsers/          # Response parsing logic\r\n│   └── security/         # Input sanitization\r\n├── utils/                # Utility functions\r\n│   ├── case-converter.ts # Case conversion logic\r\n│   ├── data-serializer.ts# Data transformation and FormData handling\r\n│   ├── url-builder.ts    # URL construction\r\n│   └── route-validator.ts# Route validation\r\n├── types/                # TypeScript definitions\r\n│   ├── config.ts         # Configuration types\r\n│   ├── request.ts        # Request types\r\n│   └── response.ts       # Response types\r\n└── interceptors/         # Pre-built interceptors\r\n    ├── logging.ts        # Request/response logging\r\n    ├── cache.ts          # Response caching\r\n    └── timing.ts         # Performance monitoring\r\n```\r\n\r\n### Design Principles\r\n\r\n1. **Separation of Concerns** - Each component has a single responsibility\r\n2. **Dependency Injection** - Components accept dependencies, making testing easier\r\n3. **Resource Management** - Proper cleanup with `destroy()` methods\r\n4. **Type Safety** - Strict TypeScript configuration with full type coverage\r\n5. **Immutability** - Configurations are cloned, not mutated\r\n6. **Error Boundaries** - Graceful error handling at every level\r\n\r\n## Integration Examples\r\n\r\n### Next.js Integration\r\n\r\n```typescript\r\n// lib/api.ts\r\nimport { DynamicClient, IDynamicClient } from '@metis-w/api-client';\r\n\r\nexport const api: IDynamicClient = new DynamicClient({\r\n    baseUrl: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000/api',\r\n    timeout: 10000,\r\n    headers: {\r\n        'Content-Type': 'application/json',\r\n    },\r\n});\r\n\r\n// Add auth interceptor\r\napi.interceptors.addRequestInterceptor(async (config) => {\r\n    const token = localStorage.getItem('authToken');\r\n    if (token) {\r\n        config.headers = { ...config.headers, Authorization: `Bearer ${token}` };\r\n    }\r\n    return config;\r\n});\r\n\r\n// pages/users/[id].tsx\r\nimport { api } from '../../lib/api';\r\n\r\nexport default function UserProfile({ user }) {\r\n    const handleFollow = async () => {\r\n        try {\r\n            await api.users(user.id).follow();\r\n            // Update UI\r\n        } catch (error) {\r\n            console.error('Failed to follow user:', error);\r\n        }\r\n    };\r\n\r\n    return <div>{/* Component JSX */}</div>;\r\n}\r\n\r\nexport async function getServerSideProps(context) {\r\n    const { id } = context.params;\r\n    const user = await api.users(id).get();\r\n    \r\n    return { props: { user: user.data } };\r\n}\r\n```\r\n\r\n### React Query Integration\r\n\r\n```typescript\r\nimport { useQuery, useMutation } from '@tanstack/react-query';\r\nimport { api } from '../lib/api';\r\n\r\n// Custom hooks\r\nexport const useUser = (id: number) => {\r\n    return useQuery({\r\n        queryKey: ['user', id],\r\n        queryFn: () => api.users(id).get(),\r\n        staleTime: 5 * 60 * 1000, // 5 minutes\r\n    });\r\n};\r\n\r\nexport const useFollowUser = () => {\r\n    return useMutation({\r\n        mutationFn: (userId: number) => api.users(userId).follow(),\r\n        onSuccess: () => {\r\n            // Invalidate and refetch user data\r\n            queryClient.invalidateQueries({ queryKey: ['user'] });\r\n        },\r\n    });\r\n};\r\n```\r\n\r\n## Comparison with Other Libraries\r\n\r\n### vs. Axios\r\n\r\n| Feature | @metis-w/api-client | Axios |\r\n|---------|-------------------|-------|\r\n| Bundle Size | ~15KB | ~45KB |\r\n| Dynamic Routes | ✅ `api.users.get()` | ❌ Manual URLs |\r\n| TypeScript | ✅ Built-in | ⚠️ Community types |\r\n| Modern Fetch | ✅ Native | ❌ XMLHttpRequest |\r\n| Tree Shaking | ✅ Full support | ⚠️ Limited |\r\n| Interceptors | ✅ Async/await | ✅ Promise-based |\r\n\r\n### vs. Native Fetch\r\n\r\n| Feature | @metis-w/api-client | Fetch API |\r\n|---------|-------------------|-----------|\r\n| Dynamic Routes | ✅ `api.users(123).follow()` | ❌ Manual |\r\n| Error Handling | ✅ Automatic | ❌ Manual |\r\n| Retries | ✅ Built-in | ❌ Manual |\r\n| Interceptors | ✅ Built-in | ❌ Manual |\r\n| File Uploads | ✅ Automatic | ❌ Manual FormData |\r\n| TypeScript | ✅ Full support | ⚠️ Basic |\r\n\r\n## Performance Considerations\r\n\r\n### Bundle Size Optimization\r\n\r\n```typescript\r\n// Import only what you need\r\nimport { APIClient } from '@metis-w/api-client';\r\nimport { requestLoggingInterceptor } from '@metis-w/api-client';\r\n\r\n// Or import specific modules\r\nimport { DynamicClient } from '@metis-w/api-client/core';\r\nimport { CacheInterceptor } from '@metis-w/api-client/interceptors';\r\n\r\n// Tree-shaking will remove unused code\r\n```\r\n\r\n### Memory Management\r\n\r\n```typescript\r\n// Always destroy clients when done\r\nconst api = new APIClient(config);\r\n\r\n// In cleanup (useEffect, componentWillUnmount, etc.)\r\nuseEffect(() => {\r\n    return () => api.destroy();\r\n}, []);\r\n\r\n// For DynamicClient, cache is automatically cleared\r\nconst dynamicApi = new DynamicClient(config);\r\nuseEffect(() => {\r\n    return () => dynamicApi.destroy(); // Clears both client and cache\r\n}, []);\r\n```\r\n\r\n### Caching Strategy\r\n\r\n```typescript\r\nimport { CacheInterceptor } from '@metis-w/api-client';\r\n\r\nconst cache = new CacheInterceptor({\r\n    ttl: 5 * 60 * 1000,  // 5 minutes\r\n    maxSize: 100         // Max 100 cached responses\r\n});\r\n\r\n// Add to client\r\napi.interceptors.addRequestInterceptor(cache.requestInterceptor);\r\napi.interceptors.addResponseInterceptor(cache.responseInterceptor);\r\n\r\n// Check cache statistics\r\nconsole.log(cache.getStats());\r\n```\r\n\r\n## Examples\r\n\r\nCheck out the comprehensive test suite for real-world examples:\r\n\r\n- [`test/api-client.test.ts`](./test/api-client.test.ts) - Core APIClient functionality\r\n- [`test/dynamic-client.test.ts`](./test/dynamic-client.test.ts) - Dynamic routing examples\r\n- [`test/converter.test.ts`](./test/converter.test.ts) - Case conversion examples\r\n- [`test/serializer.test.ts`](./test/serializer.test.ts) - Data transformation examples\r\n- [`test/url-builder.test.ts`](./test/url-builder.test.ts) - URL construction examples\r\n\r\n## 🤝 Contributing\r\n\r\nWe welcome contributions! Here's how to get started:\r\n\r\n### Development Setup\r\n\r\n```bash\r\n# Clone the repository\r\ngit clone https://github.com/metis-w/api-client.git\r\ncd api-client\r\n\r\n# Install dependencies\r\nnpm install\r\n\r\n# Run tests\r\nnpm test\r\n\r\n# Run tests in watch mode during development\r\nnpm run test:watch\r\n```\r\n\r\n### Contribution Guidelines\r\n\r\n1. **Code Style** - Follow the existing TypeScript patterns\r\n2. **Tests Required** - All new features must include tests\r\n3. **Documentation** - Update README.md for new features\r\n4. **Type Safety** - Maintain strict TypeScript compliance\r\n5. **Performance** - Consider bundle size and runtime performance\r\n\r\n### Adding New Features\r\n\r\n1. Create feature branch: `git checkout -b feature/new-feature`\r\n2. Add implementation in appropriate `src/` directory\r\n3. Write comprehensive tests in `test/` directory\r\n4. Update documentation and examples\r\n5. Submit pull request with detailed description\r\n\r\n### Reporting Issues\r\n\r\nWhen reporting bugs, please include:\r\n- Environment details (Node.js version, TypeScript version)\r\n- Minimal reproduction case\r\n- Expected vs actual behavior\r\n- Test case if possible\r\n\r\n## 📄 License\r\n\r\nMIT © [whiteakyloff](https://github.com/metis-w)\r\n\r\n---\r\n","readmeFilename":"README.md"}