{"_id":"@artonramadani/express-swagger-autogen","_rev":"8-79bf051ab2bdac0511bc0af5f4af44c8","name":"@artonramadani/express-swagger-autogen","dist-tags":{"latest":"1.2.4"},"versions":{"1.0.0":{"name":"@artonramadani/express-swagger-autogen","version":"1.0.0","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.0.0","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/yourusername/express-swagger-autogen#readme","bugs":{"url":"https://github.com/yourusername/express-swagger-autogen/issues"},"dist":{"shasum":"0f182bd34076e2569c8b05148c05e6007f244e9d","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.0.0.tgz","fileCount":6,"integrity":"sha512-WM/1n4wb91YEbfLXmvueFOLUKIvC1dTetJuKw+qU5isZZRKDH5Xeey0/LFa4kZrSBBaon4jiCoxT7Afb+t95Ng==","signatures":[{"sig":"MEUCIDfIH52/nQNjpXSim8j6fsq4rqvpZ6jU1tFrMxNyF4pKAiEAmmiW5L6B2WZ5w9cRfmI6Aef7kmJw8Csz8BaCFMwYhtY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18614},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"5468cae280b20ddb188b57c983a68bb0da457da7","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/yourusername/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and zero-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.0.0_1764204909436_0.7854637340377892","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@artonramadani/express-swagger-autogen","version":"1.1.0","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.1.0","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/yourusername/express-swagger-autogen#readme","bugs":{"url":"https://github.com/yourusername/express-swagger-autogen/issues"},"dist":{"shasum":"7be8ff7d1ce337f2b4366ee113e2c81fcf48e4d1","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.1.0.tgz","fileCount":6,"integrity":"sha512-eG1TYcDrwCdCuD6KGa3Sm6viqvLOQqtbPh3wa59wRvyEwuRMyjh3B8lECRBiguirrQKIH94zSfyJK3SnmSX0cA==","signatures":[{"sig":"MEUCIBCzEz0+eI85FQdrrpS9QZtaf+hmmtlNKGCJU7SrS839AiEAvBrrEyOr5SWnQEeNKyHal6QJtpv21RF9I8EnD1M5u/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18629},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"dcaa1646be943d291aee1e2b19c4de2b45c50546","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/yourusername/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and zero-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.1.0_1764205209677_0.6922386515653061","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@artonramadani/express-swagger-autogen","version":"1.1.1","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.1.1","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/yourusername/express-swagger-autogen#readme","bugs":{"url":"https://github.com/yourusername/express-swagger-autogen/issues"},"dist":{"shasum":"1c033b3e9002bebd3e76cc29887b284e6c6c05ad","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.1.1.tgz","fileCount":6,"integrity":"sha512-h3YbAUtZJWhmmmzzty7X4O+UJ8xtH/f8jV/4gnmRFti7FrqVLXkH8zsQYzUF5Oi4f6xN8z2QwRm95X8YG7qW9w==","signatures":[{"sig":"MEYCIQCBGFWLvsrHvWAOdfEsrbUVzRsVmwMcYiwcEpHAi6CxpgIhAOz82uzqAIvAHHp2cpzV9+3hRBe7rd7NcuM+iDG7iUfV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19133},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"4f0a8d2482a9041518e6cb399728dc20cf648f7c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/yourusername/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and zero-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.1.1_1764205562499_0.7668406006053314","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@artonramadani/express-swagger-autogen","version":"1.2.0","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.2.0","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/ArtonRamadani/express-swagger-autogen#readme","bugs":{"url":"https://github.com/ArtonRamadani/express-swagger-autogen/issues"},"dist":{"shasum":"efc2acefec6f970929621ee286e4b0e1a7ad6c87","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.2.0.tgz","fileCount":8,"integrity":"sha512-y/3mcCAN9EXh7NRZorW48rWpSSq3w4+4PJRf7OGksO5lNveHijYPt4x2vS2NX6ULwE8nt4j3E9EeTwn3Xw3ZQQ==","signatures":[{"sig":"MEYCIQDngZg53H7fDZz+BjRygiAvMbufIsv8OfuQWJrMjIIKNAIhAN9vMqpMKMh2+2KqNKOWxShcKhz9PE7AF331D+HOH7pG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26890},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"4f0a8d2482a9041518e6cb399728dc20cf648f7c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/ArtonRamadani/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and zero-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.2.0_1764206430494_0.43617124300947885","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@artonramadani/express-swagger-autogen","version":"1.2.1","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.2.1","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/ArtonRamadani/express-swagger-autogen#readme","bugs":{"url":"https://github.com/ArtonRamadani/express-swagger-autogen/issues"},"dist":{"shasum":"df0ef428968ce25083cc6f3d95195b3301c76c9c","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.2.1.tgz","fileCount":8,"integrity":"sha512-dYbEcWY9kjruCWclvV1vii1vwf6e+uZuL673vtPkSLiMf0bvvRF/aNPMqVGuuHBdO2qoPfCNxgFoo7hftb7CgQ==","signatures":[{"sig":"MEQCIHdhfodzCYiFb9U8/dt+cb783IA2iEhcrPElpVN46N4xAiBwQtTb+0FnhRQCJEVX8VFX+qTr+m97BOPAmeqT482IjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30668},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"1cd4700953be1c716e2755e43cb774a3d337d99b","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/ArtonRamadani/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and zero-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.2.1_1764207441447_0.9675153290899707","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@artonramadani/express-swagger-autogen","version":"1.2.2","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.2.2","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/ArtonRamadani/express-swagger-autogen#readme","bugs":{"url":"https://github.com/ArtonRamadani/express-swagger-autogen/issues"},"dist":{"shasum":"14658ec1fd3794c1214bc77d1ad30799be234a26","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.2.2.tgz","fileCount":25,"integrity":"sha512-5vg9ymdFPGadySCPexyC3xTSpx6n9e/eb7SIL0H32P9yBPIQy5+RZyFaytH3fExylCMVaJA5H5auilrYAc5X6Q==","signatures":[{"sig":"MEQCIHQlRlBSffV/6GH6yxpv15huP8sM7rU6QJcpwZT63RruAiApfFDwbj0vFNdoUw0tIBoNnBu/eoh13JupthmELMIGsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111764},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"b4f34b86bf360e3dcd4f7357e1e70b9148b672e0","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/ArtonRamadani/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and minimal-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.2.2_1764208626689_0.3701945868617209","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@artonramadani/express-swagger-autogen","version":"1.2.3","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","_id":"@artonramadani/express-swagger-autogen@1.2.3","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"homepage":"https://github.com/ArtonRamadani/express-swagger-autogen#readme","bugs":{"url":"https://github.com/ArtonRamadani/express-swagger-autogen/issues"},"dist":{"shasum":"a50d11f219065b1a8dd2ddf038fdb98b953a272a","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.2.3.tgz","fileCount":25,"integrity":"sha512-IRLUSkghvJUS3euGlGZ9vRsfKw1f2MRgr7bmLWIuBQ4ZwVA51T/emvqmX5s2xjqoaVp65pHj6Go54PfSTh3PUw==","signatures":[{"sig":"MEUCIQCEz4mfxPpkRuaFN2hHKw7+fTtPOfXw2zmlTdjAYBUEdAIgYlbPpIhHzMqrKBG/HrjlT35tfZ15Nvj9wSHM5jHFUD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112354},"main":"index.js","engines":{"node":">=14.0.0"},"gitHead":"b4f34b86bf360e3dcd4f7357e1e70b9148b672e0","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"repository":{"url":"git+https://github.com/ArtonRamadani/express-swagger-autogen.git","type":"git"},"_npmVersion":"10.7.0","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and minimal-config setup","directories":{},"_nodeVersion":"22.1.0","dependencies":{"swagger-ui-express":"^5.0.0"},"_hasShrinkwrap":false,"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-swagger-autogen_1.2.3_1764215943440_0.6224006977066885","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@artonramadani/express-swagger-autogen","version":"1.2.4","description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and minimal-config setup","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"author":{"name":"Arton Ramadani"},"license":"MIT","peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"dependencies":{"swagger-ui-express":"^5.0.0"},"engines":{"node":">=14.0.0"},"repository":{"type":"git","url":"git+https://github.com/ArtonRamadani/express-swagger-autogen.git"},"_id":"@artonramadani/express-swagger-autogen@1.2.4","gitHead":"52f7f7c5aae8c82420051ec55dc85dba72a19dd1","bugs":{"url":"https://github.com/ArtonRamadani/express-swagger-autogen/issues"},"homepage":"https://github.com/ArtonRamadani/express-swagger-autogen#readme","_nodeVersion":"22.1.0","_npmVersion":"10.7.0","dist":{"integrity":"sha512-qg0Sq1uVx8j/9w/BDWnUkybDvHDKvPWDKzjv5Y7pHl01IcpSunFQHkqrDAemBPsDD54LfB3lTlrIxGeAVSOQ1Q==","shasum":"3a88d605bdcb5a99be330ce4a3f201193879bf65","tarball":"https://registry.npmjs.org/@artonramadani/express-swagger-autogen/-/express-swagger-autogen-1.2.4.tgz","fileCount":28,"unpackedSize":154635,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGheIH4mZXtH/tvLcAM580gjsRvTW2SZCRb/+EAD6TX2AiBkeGYjjBDE1MnVQu+F19yQNivLyY9DVHopgpNH0Oo53A=="}]},"_npmUser":{"name":"artonramadani","email":"artonramadani25@gmail.com"},"directories":{},"maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/express-swagger-autogen_1.2.4_1764218056438_0.23530968191060686"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-27T00:55:09.373Z","modified":"2025-11-27T04:34:16.868Z","1.0.0":"2025-11-27T00:55:09.671Z","1.1.0":"2025-11-27T01:00:09.866Z","1.1.1":"2025-11-27T01:06:02.678Z","1.2.0":"2025-11-27T01:20:30.689Z","1.2.1":"2025-11-27T01:37:21.650Z","1.2.2":"2025-11-27T01:57:07.561Z","1.2.3":"2025-11-27T03:59:03.672Z","1.2.4":"2025-11-27T04:34:16.658Z"},"bugs":{"url":"https://github.com/ArtonRamadani/express-swagger-autogen/issues"},"author":{"name":"Arton Ramadani"},"license":"MIT","homepage":"https://github.com/ArtonRamadani/express-swagger-autogen#readme","keywords":["express","swagger","openapi","documentation","api","auto-generate","swagger-ui"],"repository":{"type":"git","url":"git+https://github.com/ArtonRamadani/express-swagger-autogen.git"},"description":"Automatic Swagger/OpenAPI documentation generator for Express.js with controller analysis and minimal-config setup","maintainers":[{"name":"artonramadani","email":"artonramadani25@gmail.com"}],"readme":"# Express Swagger Autogen\r\n\r\n🚀 **Minimal-config automatic Swagger/OpenAPI documentation generator for Express.js**\r\n\r\nAutomatically generates beautiful, interactive API documentation from your Express routes with minimal setup. No need to write extensive JSDoc comments or maintain separate documentation files!\r\n\r\n## Features\r\n\r\n- ✅ **Minimal Configuration** - Works out of the box with sensible defaults\r\n- ✅ **Auto-Detection** - Automatically discovers all Express routes\r\n- ✅ **Smart Middleware Detection** - Automatically detects authentication and validation middleware\r\n- ✅ **Controller Analysis** - Extracts parameters from your controllers\r\n- ✅ **JWT Support** - Built-in Bearer token authentication\r\n- ✅ **Interactive UI** - Beautiful Swagger UI with \"Try it out\" functionality\r\n- ✅ **Express 4 & 5** - Compatible with both major versions\r\n- ✅ **Manual Schemas** - Override auto-detection for complex endpoints\r\n- ✅ **TypeScript Ready** - Works with TypeScript projects\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @artonramadani/express-swagger-autogen\r\n```\r\n\r\n## Quick Start\r\n\r\n```javascript\r\nconst express = require('express');\r\nconst { initSwagger } = require('express-swagger-autogen');\r\n\r\nconst app = express();\r\n\r\n// Your routes\r\napp.use('/api/v1', require('./routes'));\r\n\r\n// Initialize Swagger (AFTER routes are registered)\r\ninitSwagger(app, {\r\n  title: 'My API',\r\n  version: '1.0.0',\r\n  description: 'My awesome API documentation',\r\n  basePath: '/api/v1'\r\n});\r\n\r\napp.listen(3000, () => {\r\n  console.log('Server running on http://localhost:3000');\r\n  console.log('Swagger UI: http://localhost:3000/api-docs');\r\n});\r\n```\r\n\r\nThat's it! Open `http://localhost:3000/api-docs` and see your documentation! 🎉\r\n\r\n### 📚 Complete Example\r\n\r\nWant to see a full working example? Check out the [example directory](./example) which includes:\r\n- Complete Express app with authentication\r\n- JWT middleware (automatically detected)\r\n- CRUD operations\r\n- Request/response schemas\r\n- Step-by-step guide\r\n\r\n**Quick start the example:**\r\n```bash\r\ncd example\r\nnpm install\r\nnpm start\r\n# Open http://localhost:3000/api-docs\r\n```\r\n\r\nSee [example/QUICKSTART.md](./example/QUICKSTART.md) for detailed instructions!\r\n\r\n## Configuration Options\r\n\r\n```javascript\r\ninitSwagger(app, {\r\n  // Basic Info\r\n  title: 'My API',                    // API title\r\n  version: '1.0.0',                   // API version\r\n  description: 'API Documentation',   // API description\r\n  \r\n  // Routing\r\n  basePath: '/api/v1',                // Base path to filter routes\r\n  docsPath: '/api-docs',              // Where Swagger UI is served\r\n  \r\n  // Servers\r\n  servers: [\r\n    {\r\n      url: 'http://localhost:3000',\r\n      description: 'Development'\r\n    },\r\n    {\r\n      url: 'https://api.example.com',\r\n      description: 'Production'\r\n    }\r\n  ],\r\n  \r\n  // Security\r\n  securitySchemes: {\r\n    bearerAuth: {\r\n      type: 'http',\r\n      scheme: 'bearer',\r\n      bearerFormat: 'JWT',\r\n      description: 'Enter your JWT token'\r\n    }\r\n  },\r\n  \r\n  // Manual Schemas - Option 1: Load from file (recommended)\r\n  manualSchemasPath: './swagger/manualSchemas.js',\r\n  \r\n  // Manual Schemas - Option 2: Define inline\r\n  manualSchemas: {\r\n    'createOrderHandler': {\r\n      body: {\r\n        items: {\r\n          type: 'array',\r\n          description: 'Order items',\r\n          items: {\r\n            type: 'object',\r\n            required: ['productId', 'quantity'],\r\n            properties: {\r\n              productId: {\r\n                type: 'integer',\r\n                example: 123\r\n              },\r\n              quantity: {\r\n                type: 'integer',\r\n                example: 5\r\n              }\r\n            }\r\n          }\r\n        },\r\n        customerId: {\r\n          type: 'integer',\r\n          example: 456\r\n        }\r\n      }\r\n    }\r\n  },\r\n  \r\n  // Swagger UI Options\r\n  swaggerUiOptions: {\r\n    explorer: true,\r\n    customCss: '.swagger-ui .topbar { display: none }'\r\n  }\r\n});\r\n```\r\n\r\n## Manual Schemas\r\n\r\nFor complex endpoints with arrays or nested objects, you can provide manual schemas in two ways:\r\n\r\n### Option 1: External File (Recommended)\r\n\r\nCreate a separate file for your schemas to keep your code clean:\r\n\r\n```javascript\r\n// swagger/manualSchemas.js\r\nmodule.exports = {\r\n  // Key is the handler function name\r\n  'saveOrderHandler': {\r\n    body: {\r\n      items: {\r\n        type: 'array',\r\n        description: 'List of products',\r\n        items: {\r\n          type: 'object',\r\n          required: ['ItemID', 'Quantity'],\r\n          properties: {\r\n            ItemID: { type: 'integer', example: 123 },\r\n            Quantity: { type: 'integer', example: 5 }\r\n          }\r\n        },\r\n        example: [\r\n          { ItemID: 123, Quantity: 5 },\r\n          { ItemID: 456, Quantity: 3 }\r\n        ]\r\n      },\r\n      CustomerID: { type: 'integer', example: 789 },\r\n      Notes: { type: 'string', example: 'Fast delivery' }\r\n    }\r\n  }\r\n};\r\n```\r\n\r\n```javascript\r\n// server.js\r\ninitSwagger(app, {\r\n  title: 'My API',\r\n  basePath: '/api/v1',\r\n  manualSchemasPath: './swagger/manualSchemas.js'  // Load from file\r\n});\r\n```\r\n\r\n### Option 2: Inline Definition\r\n\r\n```javascript\r\ninitSwagger(app, {\r\n  title: 'My API',\r\n  basePath: '/api/v1',\r\n  manualSchemas: {\r\n    'saveOrderHandler': {\r\n      body: {\r\n        items: { /* ... */ },\r\n        CustomerID: { type: 'integer', example: 789 }\r\n      }\r\n    }\r\n  }\r\n});\r\n```\r\n\r\n**Note:** You can use both approaches together. Inline schemas will override file-based schemas for the same handler.\r\n\r\n### Organizing Your Schemas\r\n\r\nWe recommend creating a dedicated directory for Swagger configuration:\r\n\r\n```\r\nyour-project/\r\n├── controllers/\r\n├── routes/\r\n├── middleware/\r\n├── swagger/                    # ← Swagger configuration\r\n│   ├── manualSchemas.js       # Schema definitions\r\n│   └── README.md              # Documentation\r\n└── server.js\r\n```\r\n\r\nThis keeps your configuration organized and your `server.js` clean!\r\n\r\n📖 **See [MANUAL_SCHEMAS_GUIDE.md](./MANUAL_SCHEMAS_GUIDE.md) for complete guide with examples and best practices.**\r\n\r\n## Authentication\r\n\r\nThe library automatically detects JWT authentication middleware by analyzing your route middleware chain. Any middleware with names like `verifyToken`, `authenticate`, `checkAuth`, or containing JWT verification code will be automatically recognized.\r\n\r\n### Using Authentication in Swagger UI\r\n\r\n1. Call your login endpoint\r\n2. Copy the JWT token from the response\r\n3. Click the \"Authorize\" 🔒 button at the top\r\n4. Paste your token (without \"Bearer\" prefix)\r\n5. All subsequent requests will include the token automatically!\r\n\r\n### Supported Authentication Patterns\r\n\r\nThe middleware analyzer detects various authentication patterns:\r\n\r\n```javascript\r\n// Pattern 1: Named middleware\r\nconst verifyToken = (req, res, next) => { /* JWT verification */ };\r\nrouter.get('/protected', verifyToken, handler);\r\n\r\n// Pattern 2: Inline middleware\r\nrouter.get('/secure', authenticate, handler);\r\n\r\n// Pattern 3: Custom auth middleware\r\nconst checkUserAuth = (req, res, next) => { /* auth logic */ };\r\nrouter.post('/data', checkUserAuth, handler);\r\n```\r\n\r\nAll these patterns are automatically detected and documented with proper security requirements!\r\n\r\n## Advanced Usage\r\n\r\n### Custom Server URLs\r\n\r\n```javascript\r\ninitSwagger(app, {\r\n  title: 'My API',\r\n  servers: [\r\n    {\r\n      url: 'http://localhost:3000',\r\n      description: 'Local'\r\n    },\r\n    {\r\n      url: 'https://staging-api.example.com',\r\n      description: 'Staging'\r\n    },\r\n    {\r\n      url: 'https://api.example.com',\r\n      description: 'Production'\r\n    }\r\n  ]\r\n});\r\n```\r\n\r\n### Multiple Security Schemes\r\n\r\n```javascript\r\ninitSwagger(app, {\r\n  title: 'My API',\r\n  securitySchemes: {\r\n    bearerAuth: {\r\n      type: 'http',\r\n      scheme: 'bearer',\r\n      bearerFormat: 'JWT'\r\n    },\r\n    apiKey: {\r\n      type: 'apiKey',\r\n      in: 'header',\r\n      name: 'X-API-Key'\r\n    }\r\n  }\r\n});\r\n```\r\n\r\n### Access Raw OpenAPI Spec\r\n\r\nThe OpenAPI specification is available as JSON at `/api-docs.json` (or `${docsPath}.json`).\r\n\r\nYou can also access it programmatically:\r\n\r\n```javascript\r\nconst { spec } = initSwagger(app, options);\r\nconsole.log(spec); // Full OpenAPI 3.0 spec object\r\n```\r\n\r\n### Middleware Detection Details\r\n\r\nThe library includes a sophisticated middleware analyzer that examines your code to understand its purpose:\r\n\r\n**What Gets Analyzed:**\r\n- Middleware function names\r\n- Middleware file contents (if accessible)\r\n- Code patterns and indicators\r\n- Common library usage (express-validator, jsonwebtoken, etc.)\r\n\r\n**Authentication Detection Indicators:**\r\n- Function names: `auth`, `token`, `jwt`, `verify`, `authenticate`, `protected`, `secure`, `guard`\r\n- Code patterns: `jwt.verify()`, `req.headers.authorization`, `Bearer`, HTTP 401/403 responses\r\n- Automatically adds security requirements to endpoints\r\n\r\n**Validation Detection Indicators:**\r\n- Function names: `validat`, `check`, `sanitiz`, `rules`\r\n- Code patterns: `express-validator`, `validationResult()`, `body()`, `param()`, `query()`\r\n- Automatically documents validation errors\r\n\r\n**Example Middleware File Analysis:**\r\n```javascript\r\n// middleware/verifyToken.js\r\nconst jwt = require('jsonwebtoken');\r\n\r\nconst verifyToken = (req, res, next) => {\r\n  const token = req.headers.authorization?.split(' ')[1];\r\n  \r\n  if (!token) {\r\n    return res.status(401).json({ message: 'No token provided' });\r\n  }\r\n  \r\n  try {\r\n    const decoded = jwt.verify(token, process.env.SECRET);\r\n    req.user = decoded;\r\n    next();\r\n  } catch (error) {\r\n    return res.status(403).json({ message: 'Invalid token' });\r\n  }\r\n};\r\n\r\n// ✅ This middleware will be automatically detected as authentication\r\n// because it contains: jwt.verify, authorization header, 401/403 responses\r\n```\r\n\r\nThe analyzer looks for multiple indicators to ensure accurate detection!\r\n\r\n## How It Works\r\n\r\n1. **Route Discovery**: Scans your Express app's router stack to find all routes\r\n2. **Middleware Analysis**: Intelligently detects authentication and validation middleware by analyzing:\r\n   - Middleware function names (e.g., `verifyToken`, `authenticate`, `checkAuth`)\r\n   - Middleware code patterns (JWT verification, token validation)\r\n   - Common authentication libraries (jsonwebtoken, passport, etc.)\r\n3. **Parameter Extraction**: Automatically identifies path, query, and body parameters\r\n4. **Schema Generation**: Creates OpenAPI schemas from your route definitions\r\n5. **UI Generation**: Serves interactive Swagger UI with all your endpoints\r\n\r\n### Middleware Detection\r\n\r\nThe library automatically detects middleware and applies appropriate security schemes:\r\n\r\n**Authentication Middleware** - Automatically detected by:\r\n- Function names containing: `auth`, `token`, `jwt`, `verify`, `authenticate`, `protected`, `secure`, `guard`\r\n- Code patterns: JWT verification, authorization headers, bearer tokens\r\n- Automatically adds 🔒 lock icon and security requirements in Swagger UI\r\n\r\n**Validation Middleware** - Automatically detected by:\r\n- Function names containing: `validat`, `check`, `sanitiz`, `rules`\r\n- Express-validator usage patterns\r\n- Automatically documents validation errors (400 responses)\r\n\r\n**Example:**\r\n```javascript\r\n// These middleware will be automatically detected\r\nrouter.post('/users', \r\n  verifyToken,           // ✅ Detected as auth middleware\r\n  validateUser(),        // ✅ Detected as validation middleware\r\n  createUserHandler\r\n);\r\n```\r\n\r\nMinimal configuration needed - the library analyzes your middleware and generates appropriate documentation!\r\n\r\n## Requirements\r\n\r\n- Node.js >= 14.0.0\r\n- Express >= 4.0.0 or >= 5.0.0\r\n\r\n## License\r\n\r\nMIT\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please feel free to submit a Pull Request.\r\n\r\n## Support\r\n\r\nIf you encounter any issues or have questions, please file an issue on GitHub.\r\n\r\n---\r\n\r\nMade with ❤️ for the Express.js community\r\n","readmeFilename":"README.md"}