{"_id":"@alis-kit/routers","_rev":"6-57055b1c9137856f9e7e7c9bc2ac1b98","name":"@alis-kit/routers","dist-tags":{"latest":"3.0.1"},"versions":{"1.0.0":{"name":"@alis-kit/routers","version":"1.0.0","keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"license":"MIT","_id":"@alis-kit/routers@1.0.0","maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"dist":{"shasum":"4b6a5868a4dc81dca63cdbe84d9ab6c7c8b09e27","tarball":"https://registry.npmjs.org/@alis-kit/routers/-/routers-1.0.0.tgz","fileCount":90,"integrity":"sha512-nwYiX0MTQanEQeJmrOeC+mx3/gmja7ksgC9Co/cflewfyszIiPWzOL9jmLIi8vDLsWb3dwiWaS7mB/RUkK7NKg==","signatures":[{"sig":"MEUCIBQk8Nx/qhBmU8WDKzqKW14Y3Us1ifNdEAVM/UxEFXoFAiEAyWKFORRrJhfym+kMpzF+OKaNamjUtSvWJW2RZBpbE0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179365},"main":"./dist/index.js","type":"module","_from":"file:alis-kit-routers-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18","typescript":">=5.2"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"alisdev","email":"ibnu.ali56@gmail.com"},"_resolved":"C:\\Users\\ibnu-pc\\AppData\\Local\\Temp\\657e352214eddb8f77ae6fa56000717f\\alis-kit-routers-1.0.0.tgz","_integrity":"sha512-nwYiX0MTQanEQeJmrOeC+mx3/gmja7ksgC9Co/cflewfyszIiPWzOL9jmLIi8vDLsWb3dwiWaS7mB/RUkK7NKg==","_npmVersion":"10.9.2","description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"zod":"^3.23.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"optionalDependencies":{"express":"^4.18.0","fastify":"^4.0.0","swagger-ui-express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/routers_1.0.0_1784434938521_0.8652151216827277","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@alis-kit/routers","version":"2.0.0","keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"license":"MIT","_id":"@alis-kit/routers@2.0.0","maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"dist":{"shasum":"fca7f283dfeed95b2747a593d7a9b8ada56ed944","tarball":"https://registry.npmjs.org/@alis-kit/routers/-/routers-2.0.0.tgz","fileCount":90,"integrity":"sha512-tGRrZmRIVeDKeLnJG73I4rcittSnWtNB3AQsCaVG8+Hqcakk4jhkeWBQvtIR/QLX/XpYrU9o7cLx5LGIWPQlRA==","signatures":[{"sig":"MEYCIQCuWi622KhtSEnq5ElIS5oKPtsoyX1PYKeC17yfqdFqUwIhAIfT8tJh5f2JxpooAR8o06X1GU8czakVsjWSiVdJgaH0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170295},"main":"./dist/index.js","type":"module","_from":"file:alis-kit-routers-2.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18","typescript":">=5.2"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"alisdev","email":"ibnu.ali56@gmail.com"},"_resolved":"C:\\Users\\ibnu-pc\\AppData\\Local\\Temp\\5edfc4c8baa146be3704bf7e6629b3bb\\alis-kit-routers-2.0.0.tgz","_integrity":"sha512-tGRrZmRIVeDKeLnJG73I4rcittSnWtNB3AQsCaVG8+Hqcakk4jhkeWBQvtIR/QLX/XpYrU9o7cLx5LGIWPQlRA==","_npmVersion":"11.16.0","description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"optionalDependencies":{"express":"^4.18.0","fastify":"^4.0.0","swagger-ui-express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/routers_2.0.0_1784474967352_0.3647429105703963","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@alis-kit/routers","version":"2.1.0","keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"license":"MIT","_id":"@alis-kit/routers@2.1.0","maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"dist":{"shasum":"929bc18c2c2114081d9ad49873d6ff8e412724f1","tarball":"https://registry.npmjs.org/@alis-kit/routers/-/routers-2.1.0.tgz","fileCount":90,"integrity":"sha512-Ov+aMoVTt4d+Qpv/kKqJ7AeTSHI8PApryyDG594BZmG3JADC74JqQtJZDONuzze9I9fp4JCaRKST6H6DjtOSog==","signatures":[{"sig":"MEUCIGJJGjLcJGGbvDgqzLK4t1XkoqCxWi1mArLDAxJIzsObAiEAujaMw03S3LzuRctWX67bbzavjjLU8hkCFB3lJ4t4/2g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170006},"main":"./dist/index.js","type":"module","_from":"file:alis-kit-routers-2.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18","typescript":">=5.2"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"alisdev","email":"ibnu.ali56@gmail.com"},"_resolved":"C:\\Users\\ibnu-pc\\AppData\\Local\\Temp\\c85349223aa311d2a6f44afb0d2cfe24\\alis-kit-routers-2.1.0.tgz","_integrity":"sha512-Ov+aMoVTt4d+Qpv/kKqJ7AeTSHI8PApryyDG594BZmG3JADC74JqQtJZDONuzze9I9fp4JCaRKST6H6DjtOSog==","_npmVersion":"11.16.0","description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"optionalDependencies":{"express":"^4.18.0","fastify":"^4.0.0","swagger-ui-express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/routers_2.1.0_1784476674431_0.3599591102990827","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@alis-kit/routers","version":"2.2.0","keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"license":"MIT","_id":"@alis-kit/routers@2.2.0","maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"dist":{"shasum":"87d2e1f90c95f39ab55355963f696f047566c78f","tarball":"https://registry.npmjs.org/@alis-kit/routers/-/routers-2.2.0.tgz","fileCount":122,"integrity":"sha512-Da+515KZYUfEN8STJMU5jgS8dkPfNLqClmSpXdRJClxZIuomoFWowXgF0V/6D64Mbm0LEO3sy6HuzTQ/5Qb2sQ==","signatures":[{"sig":"MEUCIDGUXSaH4eXfhnwBCbBMboqa1mEhRAmy9YEbfWcQ8Ph8AiEAiPM7rK2x0XJm6D1UOmd8pYV2cMYJJfF48MmDBG3zjls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":211829},"main":"./dist/index.js","type":"module","_from":"file:alis-kit-routers-2.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18","typescript":">=5.2"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"alisdev","email":"ibnu.ali56@gmail.com"},"_resolved":"C:\\Users\\IBNU~1.BAD\\AppData\\Local\\Temp\\076a75f6c744ba5033bff0b31d585156\\alis-kit-routers-2.2.0.tgz","_integrity":"sha512-Da+515KZYUfEN8STJMU5jgS8dkPfNLqClmSpXdRJClxZIuomoFWowXgF0V/6D64Mbm0LEO3sy6HuzTQ/5Qb2sQ==","_npmVersion":"11.6.2","description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"optionalDependencies":{"express":"^4.18.0","fastify":"^4.0.0","swagger-ui-express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/routers_2.2.0_1785123119779_0.2927741068959586","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@alis-kit/routers","version":"3.0.0","keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"license":"MIT","_id":"@alis-kit/routers@3.0.0","maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"dist":{"shasum":"57dde2a71e0db8412a4077b17d496a1dc3001e4e","tarball":"https://registry.npmjs.org/@alis-kit/routers/-/routers-3.0.0.tgz","fileCount":122,"integrity":"sha512-wGxfmrqtTAifhbLLViaT1AXZRj93NOGq2mrG0jOi02J3qe4kGI9r5ui3pskOOotFbb+Io5JLEHcs7yQNL/n82A==","signatures":[{"sig":"MEUCIFy6Zsj+p4Cp8+33SDibewoeIV9YOAAJi1LuNwWoUno1AiEAiesqDfneCT8FX7Xgz9za/1JDT6EmmWwHBHEQZChDhHI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":212014},"main":"./dist/index.js","type":"module","_from":"file:alis-kit-routers-3.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.0","typescript":">=5.6"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"alisdev","email":"ibnu.ali56@gmail.com"},"_resolved":"C:\\Users\\IBNU~1.BAD\\AppData\\Local\\Temp\\b04e0647f7e8240f97a78e690ec2c7db\\alis-kit-routers-3.0.0.tgz","_integrity":"sha512-wGxfmrqtTAifhbLLViaT1AXZRj93NOGq2mrG0jOi02J3qe4kGI9r5ui3pskOOotFbb+Io5JLEHcs7yQNL/n82A==","_npmVersion":"11.6.2","description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1"},"optionalDependencies":{"express":"^5.2.1","fastify":"^5.10.0","swagger-ui-express":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/routers_3.0.0_1785131155769_0.4168015820799198","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@alis-kit/routers","version":"3.0.1","description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"engines":{"node":">=20.19.0","typescript":">=5.6"},"keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"license":"MIT","dependencies":{"zod":"^4.4.3"},"devDependencies":{"@types/node":"^26.1.1","typescript":"^7.0.2","vitest":"^4.1.10"},"optionalDependencies":{"express":"^5.2.1","fastify":"^5.10.0","swagger-ui-express":"^5.0.1"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run","test:watch":"vitest","lint":"tsc --noEmit"},"_id":"@alis-kit/routers@3.0.1","_integrity":"sha512-vwA/V4ooCgg1AclR8pcEmQpaqh6m8gTA2lLcsoI1LpOAWnYd8BMPN5XJc/+mUgcj69yYIiQHZvN+D3bfM6hVYw==","_resolved":"C:\\Users\\IBNU~1.BAD\\AppData\\Local\\Temp\\1e33a815f6f27e48bbd04a9ea0dc5960\\alis-kit-routers-3.0.1.tgz","_from":"file:alis-kit-routers-3.0.1.tgz","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-vwA/V4ooCgg1AclR8pcEmQpaqh6m8gTA2lLcsoI1LpOAWnYd8BMPN5XJc/+mUgcj69yYIiQHZvN+D3bfM6hVYw==","shasum":"2170a89c3a85d6a2a341b74a33ca2b31b34a4adb","tarball":"https://registry.npmjs.org/@alis-kit/routers/-/routers-3.0.1.tgz","fileCount":122,"unpackedSize":212947,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCQEtJQtJgKeknyWqX3M5MBF0c1BxlplEMljevHhHZ/twIhAI5FboNSEpn7VziyGYUbjyTuT3KHWL03YWSE9Tdg1IJf"}]},"_npmUser":{"name":"alisdev","email":"ibnu.ali56@gmail.com"},"directories":{},"maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/routers_3.0.1_1785393989901_0.5252484346346453"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-19T04:22:18.298Z","modified":"2026-07-30T06:46:30.235Z","1.0.0":"2026-07-19T04:22:18.657Z","2.0.0":"2026-07-19T15:29:27.486Z","2.1.0":"2026-07-19T15:57:54.555Z","2.2.0":"2026-07-27T03:32:00.015Z","3.0.0":"2026-07-27T05:45:55.909Z","3.0.1":"2026-07-30T06:46:30.078Z"},"license":"MIT","keywords":["router","decorator","tc39","express","fastify","zod","swagger","api"],"description":"TC39 decorator-based controller library for Node.js APIs. Supports Express and Fastify with Zod validation.","maintainers":[{"name":"alisdev","email":"ibnu.ali56@gmail.com"}],"readme":"# @alis-kit/routers\r\n\r\nA **TC39 native decorator** based controller library for Node.js APIs. Supports **Express** and **Fastify**, includes **Zod-based request validation**, structured **exception handling**, optional **Swagger UI** generation, and **cookie management**.\r\n\r\n[![npm version](https://img.shields.io/npm/v/@alis-kit/routers.svg)](https://www.npmjs.com/package/@alis-kit/routers)\r\n[![license](https://img.shields.io/npm/l/@alis-kit/routers.svg)](#license)\r\n\r\n> 🚧 **v3.0.0 in development** — Stackable decorators (`@RestController`, `@ReqBody`, `@ReqQuery`, `@Response`, etc.) are being introduced.\r\n> See [Sprint 2 Plan](docs/sprint2/tasks.md) and [ADR-002](docs/adr/ADR-002-stackable-decorators.md) for details.\r\n\r\n---\r\n\r\n## Table of Contents\r\n\r\n- [Installation](#installation)\r\n- [Requirements](#requirements)\r\n- [Quick Start (v2.x)](#quick-start-v2x)\r\n- [Coming in v3.0 — Stackable Decorators](#-coming-in-v30--stackable-decorators)\r\n- [API Reference (v2.x — current)](#api-reference-v2x--current)\r\n    - [`RouterKit`](#routerkit)\r\n    - [`@ReqController`](#reqcontrollerbasepath-options)\r\n    - [Method Mapping Decorators](#method-mapping-decorators)\r\n    - [Method Decorators](#method-decorators)\r\n    - [Exceptions](#exceptions)\r\n    - [`CookieSetter`](#cookiesetter)\r\n- [Response Format](#response-format)\r\n- [Architecture](#architecture)\r\n- [Development](#development)\r\n- [License](#license)\r\n\r\n---\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @alis-kit/routers zod\r\n```\r\n\r\n> **Note:** You also need one of the supported frameworks:\r\n> ```bash\r\n> npm install express          # for Express\r\n> npm install fastify          # for Fastify\r\n> ```\r\n\r\n## Requirements\r\n\r\n- **Node.js** >= 20.19.0\r\n- **TypeScript** >= 5.6\r\n\r\nNo `reflect-metadata` needed — this library uses **TC39 native decorators** (stage 3):\r\n\r\n```json\r\n{\r\n  \"compilerOptions\": {\r\n    \"experimentalDecorators\": false,\r\n    \"useDefineForClassFields\": true,\r\n    \"strict\": true\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Quick Start (v2.x)\r\n\r\n```typescript\r\nimport express from \"express\";\r\nimport { RouterKit, ReqController, GetMapping } from \"@alis-kit/routers\";\r\n\r\n@ReqController(\"/hello\")\r\nclass HelloController {\r\n  @GetMapping(\"/\")\r\n  async sayHello() {\r\n    return { greeting: \"Hello, World!\" };\r\n  }\r\n}\r\n\r\nconst app = express();\r\napp.use(express.json());\r\n\r\nRouterKit.setup({\r\n  framework: \"express\",\r\n  app,\r\n  swagger: { enabled: true, path: \"/api/docs\" },\r\n});\r\n\r\nRouterKit.register(HelloController);\r\n\r\napp.listen(3000, () => console.log(\"Server running on port 3000\"));\r\n```\r\n\r\n---\r\n\r\n## 🚀 Coming in v3.0 — Stackable Decorators\r\n\r\nSprint 2 introduces **stackable** decorators that separate each concern into its own decorator.\r\n`@ReqController` is replaced by `@RestController`, `@Authentication`, `@Tag`, and `@Description`.\r\nParameter injection via `MappingOptions.params` is replaced by the `@ReqBody`, `@ReqQuery`, `@ReqParam`, etc. decorators.\r\n\r\n```typescript\r\nimport express from \"express\";\r\nimport { z } from \"zod\";\r\nimport {\r\n  RouterKit,\r\n  RestController, Authentication, Tag, Description,\r\n  GetMapping, PostMapping, PutMapping, DeleteMapping,\r\n  ReqBody, ReqQuery, ReqParam, ReqCookie,\r\n  Response, HttpStatus,\r\n  BadRequestException, NotFoundException,\r\n} from \"@alis-kit/routers\";\r\n\r\n// ── Zod Schemas ───────────────────────────────────────────────────\r\n\r\nconst PaginationSchema = z.object({\r\n  page: z.coerce.number().default(1),\r\n  size: z.coerce.number().default(10),\r\n});\r\n\r\nconst CreateUserSchema = z.object({\r\n  firstName: z.string().min(1),\r\n  lastName: z.string().min(1),\r\n  email: z.string().email(),\r\n  age: z.coerce.number().min(1),\r\n});\r\n\r\ntype ICreateUser = z.infer<typeof CreateUserSchema>;\r\ntype IPagination = z.infer<typeof PaginationSchema>;\r\n\r\n// ── Controllers ───────────────────────────────────────────────────\r\n\r\n@RestController(\"/auth\")\r\n@Tag(\"Authentication\")\r\n@Description(\"Public authentication endpoints\")\r\nclass AuthController {\r\n  @PostMapping(\"/login\")\r\n  @Description(\"Login with email and password\")\r\n  @ReqBody(z.object({ email: z.string().email(), password: z.string().min(6) }))\r\n  @ReqCookie()\r\n  @Response(200, \"Login successful, refresh token set in cookie\")\r\n  async login(body: { email: string; password: string }, cookie: CookieSetter) {\r\n    cookie.set(\"refresh_token\", \"token-value\", { httpOnly: true, secure: true });\r\n    return { accessToken: \"jwt-token\" };\r\n  }\r\n}\r\n\r\n@RestController(\"/users\")\r\n@Authentication(\"auth\")\r\n@Tag(\"User Management\")\r\n@Description(\"User management CRUD\")\r\nclass UserController {\r\n  @GetMapping(\"/\")\r\n  @Description(\"List users with pagination\")\r\n  @ReqQuery(PaginationSchema)\r\n  @Response(200, \"List of users\")\r\n  async getAll(query: IPagination) {\r\n    return { items: [], page: query.page, size: query.size };\r\n  }\r\n\r\n  @GetMapping(\"/:id\")\r\n  @Description(\"Get user detail by ID\")\r\n  @ReqParam(\"id\")\r\n  @Response(200, \"User detail\")\r\n  @Response(404, \"User not found\")\r\n  async getById(id: string) {\r\n    // if (!user) throw new NotFoundException(\"User not found\");\r\n    return { id, name: \"John Doe\" };\r\n  }\r\n\r\n  @PostMapping(\"/\")\r\n  @HttpStatus(201)\r\n  @ReqBody(CreateUserSchema)\r\n  @Response(201, \"User created successfully\")\r\n  @Response(400, \"Validation failed\")\r\n  async create(body: ICreateUser) {\r\n    return { id: \"new-id\", ...body };\r\n  }\r\n\r\n  @PutMapping(\"/:id\")\r\n  @ReqParam(\"id\")\r\n  @ReqBody(CreateUserSchema.partial())\r\n  @Response(200, \"User updated successfully\")\r\n  async update(id: string, body: Partial<ICreateUser>) {\r\n    return { id, ...body };\r\n  }\r\n\r\n  @DeleteMapping(\"/:id\")\r\n  @ReqParam(\"id\")\r\n  @Response(200, \"User deleted successfully\")\r\n  async delete(id: string) {\r\n    return { deleted: true, id };\r\n  }\r\n}\r\n\r\n// ── App Setup ─────────────────────────────────────────────────────\r\n\r\nconst app = express();\r\napp.use(express.json());\r\n\r\nRouterKit.setup({\r\n  framework: \"express\",\r\n  app,\r\n  swagger: { enabled: true, path: \"/api/docs\", title: \"My API\", version: \"2.0.0\" },\r\n});\r\n\r\nRouterKit.register(AuthController, UserController);\r\nRouterKit.handleNotFound();\r\n\r\napp.listen(3000, () => console.log(\"Server running on port 3000\"));\r\n```\r\n\r\n---\r\n\r\n## API Reference (v2.x — current)\r\n\r\n### `RouterKit`\r\n\r\nCentral setup class. Configured once at the application entry point.\r\n\r\n```typescript\r\nRouterKit.setup(config: RouterKitConfig): void\r\nRouterKit.register(...controllers: Class[]): void\r\nRouterKit.handleNotFound(): void\r\n```\r\n\r\n**Configuration:**\r\n\r\n```typescript\r\ninterface RouterKitConfig {\r\n  framework: \"express\" | \"fastify\";\r\n  app: express.Application | FastifyInstance;\r\n  authMiddleware?: MiddlewareFn;       // for authentication: \"auth\"\r\n  refreshMiddleware?: MiddlewareFn;    // for authentication: \"refresh\"\r\n  swagger?: {\r\n    enabled: boolean;\r\n    path?: string;            // default: \"/api/docs\"\r\n    title?: string;           // default: \"API Documentation\"\r\n    version?: string;         // default: \"1.0.0\"\r\n    sortBy?: \"path\" | \"method\";\r\n    searchByPath?: boolean;\r\n    searchByMethod?: boolean;\r\n    searchByTag?: boolean;\r\n  };\r\n  logger?: boolean | {\r\n    enabled?: boolean;\r\n    handler?: (level: \"info\" | \"error\", message: string, meta: LoggerMeta) => void;\r\n  };\r\n  responseEnvelope?: \"wrap\" | \"raw\";  // \"wrap\" (default) or \"raw\"\r\n  globalPrefix?: string;              // e.g. \"/api\"\r\n}\r\n```\r\n\r\n### `@ReqController(basePath, options?)`\r\n\r\n> ⚠️ **Deprecated in v3.0** — use `@RestController` + `@Authentication` + `@Tag` instead.\r\n\r\nMarks a class as a route controller with a base path and default authentication.\r\n\r\n```typescript\r\n@ReqController(\"/users\", { authentication: \"auth\", tag: \"User Management\" })\r\nclass UserController { ... }\r\n```\r\n\r\n**Options:**\r\n\r\n| Option | Type | Default | Description |\r\n|---|---|---|---|\r\n| `authentication` | `\"auth\" \\| \"refresh\" \\| false` | `false` | Default auth for all routes |\r\n| `tag` | `string` | Derived from class name | Swagger tag |\r\n| `swagger` | `boolean` | `true` | Include in Swagger docs |\r\n\r\n### Method Mapping Decorators\r\n\r\n```typescript\r\n@GetMapping(path, options?)\r\n@PostMapping(path, options?)\r\n@PutMapping(path, options?)\r\n@PatchMapping(path, options?)\r\n@DeleteMapping(path, options?)\r\n```\r\n\r\n**Options:**\r\n\r\n| Option | Type | Description |\r\n|---|---|---|\r\n| `authentication` | `\"auth\" \\| \"refresh\" \\| false` | Override controller-level auth |\r\n| `swagger` | `boolean` | Include in Swagger docs |\r\n| `tag` | `string` | Override controller tag |\r\n| `summary` | `string` | Swagger summary |\r\n| `description` | `string` | Swagger description |\r\n| `status` | `number` | Default response status code |\r\n| `params` | `ParamDescriptor[]` | Parameter injection descriptors (v2.x) |\r\n\r\n### Method Decorators\r\n\r\n| Decorator | Description |\r\n|---|---|\r\n| `@UseMiddleware(...fns)` | Applies middleware to a route |\r\n| `@HttpStatus(code)` | Sets default response status code |\r\n\r\n### Exceptions\r\n\r\nAll exceptions extend `BaseException` and automatically send the appropriate HTTP response.\r\n\r\n| Exception | Status | Code |\r\n|---|---|---|\r\n| `BadRequestException` | 400 | `BAD_REQUEST` |\r\n| `UnauthorizedException` | 401 | `UNAUTHORIZED` |\r\n| `ForbiddenException` | 403 | `FORBIDDEN` |\r\n| `NotFoundException` | 404 | `NOT_FOUND` |\r\n| `ConflictException` | 409 | `CONFLICT` |\r\n| `ServerErrorException` | 500 | `INTERNAL_ERROR` |\r\n\r\n### `CookieSetter`\r\n\r\nInjected via the `@ReqCookie()` decorator (v3) or via `{ type: \"cookie\" }` in `params` (v2).\r\nAbstracts cookie operations across frameworks.\r\n\r\n```typescript\r\ncookie.set(key, value, options?)   // Set a cookie\r\ncookie.get(key)                    // Get a cookie value\r\ncookie.delete(key)                 // Delete a cookie\r\n```\r\n\r\n---\r\n\r\n## Response Format\r\n\r\n**Success (wrap mode):**\r\n```json\r\n{ \"message\": \"OK\", \"data\": { \"id\": \"...\", \"firstName\": \"Dudi\" } }\r\n```\r\n\r\n**Success (raw mode):**\r\n```json\r\n{ \"id\": \"...\", \"firstName\": \"Dudi\" }\r\n```\r\n\r\n**Error:**\r\n```json\r\n{ \"statusCode\": 404, \"code\": \"NOT_FOUND\", \"message\": \"User not found\", \"details\": null }\r\n```\r\n\r\n---\r\n\r\n## Architecture\r\n\r\nThis library follows a **Functional Core + Decorator Sugar** pattern:\r\n\r\n- **`core/`** — All logic lives here: route resolution, parameter injection, Zod validation, error handling\r\n- **`decorators/`** — Pure metadata writers using TC39 native decorators (`context.metadata`)\r\n- **`adapters/`** — Framework-agnostic adapters for Express and Fastify\r\n\r\n---\r\n\r\n## Development\r\n\r\n```bash\r\npnpm install          # Install dependencies\r\npnpm build            # Compile TypeScript\r\npnpm test             # Run tests (Vitest)\r\npnpm lint             # TypeScript check (noEmit)\r\n```\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT","readmeFilename":"README.md"}