{"id":19988767,"url":"https://github.com/e22m4u/ts-rest-router","last_synced_at":"2025-09-19T22:31:05.936Z","repository":{"id":261934242,"uuid":"885723916","full_name":"e22m4u/ts-rest-router","owner":"e22m4u","description":"Controllers-based REST router implementation for TypeScript","archived":false,"fork":false,"pushed_at":"2025-01-11T17:27:05.000Z","size":185,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-11T18:31:14.123Z","etag":null,"topics":["controller","esm","http","rest","router","server","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/e22m4u.png","metadata":{"files":{"readme":"README-ru.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-09T08:11:57.000Z","updated_at":"2025-01-11T17:27:08.000Z","dependencies_parsed_at":"2024-11-09T11:27:41.161Z","dependency_job_id":"4579cca7-5c5b-4be7-a496-e450a3e5ef3d","html_url":"https://github.com/e22m4u/ts-rest-router","commit_stats":null,"previous_names":["e22m4u/ts-rest-router"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fts-rest-router","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fts-rest-router/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fts-rest-router/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e22m4u%2Fts-rest-router/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/e22m4u","download_url":"https://codeload.github.com/e22m4u/ts-rest-router/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233600570,"owners_count":18700691,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["controller","esm","http","rest","router","server","typescript"],"created_at":"2024-11-13T04:44:04.964Z","updated_at":"2025-09-19T22:31:05.108Z","avatar_url":"https://github.com/e22m4u.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @e22m4u/ts-rest-router\n\n*[English](./README.md) | Русский*\n\nРеализация REST маршрутизатора на основе контроллеров для TypeScript.\n\n#### Основные возможности\n\n- Декларативное определение маршрутов через декораторы.\n- Типизированные параметры запросов (body, query, params).\n- Поддержка middleware до и после обработки запроса.\n- Валидация входящих данных.\n- Поддержка всех HTTP методов (GET, POST, PUT, DELETE и т.д.).\n\n## Установка\n\n```bash\nnpm install @e22m4u/ts-rest-router\n```\n\n#### Поддержка декораторов\n\nДля включения поддержки декораторов, добавьте указанные\nниже опции в файл `tsconfig.json` вашего проекта.\n\n```json\n{\n  \"emitDecoratorMetadata\": true,\n  \"experimentalDecorators\": true\n}\n```\n\n## Базовое использование\n\nСоздание контроллера и методов\n\n```ts\nimport {get} from '@e22m4u/ts-rest-router';\nimport {post} from '@e22m4u/ts-rest-router';\nimport {field} from '@e22m4u/ts-rest-router';\nimport {DataType} from '@e22m4u/ts-rest-router';\nimport {controller} from '@e22m4u/ts-rest-router';\n\n@controller('/users')         // путь контроллера\nclass UserController {        // класс контроллера\n  @post('/login')             // метод POST /users/login\n  async login(\n    @field('username', {      // поле \"username\" в теле запроса\n      type: DataType.STRING,  // тип параметра допускает только строки\n      required: true,         // параметр является обязательным\n    })\n    username: string,\n    @field('password', {      // поле \"password\" в теле запроса\n      type: DataType.STRING,  // тип параметра допускает только строки\n      required: true,         // параметр является обязательным\n    })\n    password: string,\n  ) {\n    return {                  // если метод возвращает объект,\n      id: '123',              // то результат будет представлен как\n      firstName: 'John',      // \"Content-Type: application/json\"\n      lastName: 'Doe',\n    };\n  }\n}\n```\n\nРегистрация контроллеров и запуск сервера\n\n```ts\nimport http from 'http';\nimport {RestRouter} from '@e22m4u/ts-rest-router';\n\n// создание роутера и регистрация контроллеров\nconst router = new RestRouter();\nrouter.registerController(UserController);\nrouter.registerController(ProductController);\n\n// создание сервера и регистрация обработчика запросов\nconst server = new http.Server();\nserver.on('request', router.requestListener);\n\n// запуск сервера\nserver.listen('8080', '0.0.0.0', () =\u003e {\n  console.log(`Server is running on http://localhost:8080`);\n});\n```\n\n## Декораторы\n\nКонтроллер и методы:\n\n- `@controller` - определяет класс как контроллер\n- `@action` - базовый декоратор для методов\n- `@get` - GET запросы\n- `@post` - POST запросы\n- `@put` - PUT запросы\n- `@patch` - PATCH запросы\n- `@del` - DELETE запросы\n\nХуки запроса:\n\n- `@before` - middleware перед обработкой запроса\n- `@after` - middleware после обработки запроса\n\nПараметры запроса:\n\n- `@param` - один параметр URL\n- `@params` - все параметры URL как объект\n- `@query` - один query параметр\n- `@queries` - все query параметры как объект\n- `@body` - тело запроса\n- `@field` - поле в теле запроса\n- `@header` - один заголовок\n- `@headers` - все заголовки как объект\n- `@cookie` - одна cookie\n- `@cookies` - все cookies как объект\n- `@requestContext` - доступ к контексту запроса\n- `@requestData` - универсальный декоратор для доступа к данным запроса\n\n#### `@controller(options?: ControllerOptions)`\n\nОпределение контроллера.\n\n```ts\n@controller()\nclass UserController {\n  // методы контроллера\n}\n```\n\nОпределение пути контроллера.\n\n```ts\n@controller('/users')  // путь контроллера\nclass UserController {\n  // методы контроллера\n}\n```\n\nДополнительные параметры декоратора.\n\n```ts\n@controller({\n  path: '/api',              // путь контроллера\n  before: [authMiddleware],  // middleware до обработки запроса\n  after: [loggerMiddleware], // middleware после обработки запроса\n})\nclass UserController {\n  // методы контроллера\n}\n```\n\n#### `@get(path: string, options?: ActionOptions)`\n\nОпределение метода GET.\n\n```ts\n@controller('/users')  // путь контроллера\nclass UserController { // класс контроллера\n  @get('/whoAmI')      // маршрут GET /users/whoAmI\n  async whoAmI() {\n    return {           // если метод возвращает объект,\n      name: 'John',    // то результат будет представлен\n      surname: 'Doe',  // как \"Content-Type: application/json\"\n    };\n  }\n}\n```\n\nДополнительные параметры декоратора.\n\n```ts\n@controller('/users')          // путь контроллера\nclass UserController {         // класс контроллера\n  @get('/whoAmI', {            // маршрут GET /users/whoAmI\n    before: [authMiddleware],  // middleware до обработки запроса\n    after: [loggerMiddleware], // middleware после обработки запроса\n  })\n  async whoAmI() {\n    return {\n      name: 'John',\n      surname: 'Doe',\n    };\n  }\n}\n```\n\n#### `@requestContext(propertyName?: string)`\n\nДоступ к контексту запроса.\n\n```ts\nimport {RequestContext} from '@e22m4u/js-trie-router';\n\n@controller('/users')          // путь контроллера\nclass UserController {         // класс контроллера\n  @get('/:id')                 // маршрут GET /users/:id\n  findById(\n    @requestContext()          // включениее контекста запроса\n    ctx: RequestContext,       // в качестве параметра метода\n  ) {\n    console.log(ctx.req);      // IncomingMessage\n    console.log(ctx.res);      // ServerResponse\n    console.log(ctx.params);   // {id: 10}\n    console.log(ctx.query);    // {include: 'city'}\n    console.log(ctx.headers);  // {cookie: 'foo=bar; baz=qux;'}\n    console.log(ctx.cookie);   // {foo: 'bar', baz: 'qux'}\n    console.log(ctx.method);   // \"GET\"\n    console.log(ctx.path);     // \"/users/10?include=city\"\n    console.log(ctx.pathname); // \"/users/10\"\n    // ...\n  }\n}\n```\n\nДоступ к свойствам контекста.\n\n```ts\nimport {ServerResponse} from 'http';\nimport {IncomingMessage} from 'http';\n\n@controller('/users')      // путь контроллера\nclass UserController {     // класс контроллера\n  @get('/:id')             // маршрут GET /users/:id\n  findById(\n    @requestContext('req') // декоратор контекста запроса\n    req: IncomingMessage,  // включающий свойство \"req\"\n    @requestContext('res') // декоратор контекста запроса\n    res: ServerResponse,   // включающий свойство \"res\"\n  ) {\n    console.log(req);      // IncomingMessage\n    console.log(res);      // ServerResponse\n  }\n}\n```\n\nСвойства контекста:\n\n- `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service)\n- `req: IncomingMessage` нативный поток входящего запроса\n- `res: ServerResponse` нативный поток ответа сервера\n- `params: ParsedParams` объект ключ-значение с параметрами пути\n- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса\n- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса \n- `cookie: ParsedCookie` объект ключ-значение разобранного заголовка `cookie`\n- `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.\n- `path: string` путь включающий строку запроса, например `/myPath?foo=bar`\n- `pathname: string` путь запроса, например `/myMath`\n- `body: unknown` тело запроса\n\n## Отладка\n\nУстановка переменной `DEBUG` включает вывод логов.\n\n```bash\nDEBUG=tsRestRouter* npm run test\n```\n\n## Тесты\n\n```bash\nnpm run test\n```\n\n## Лицензия\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fe22m4u%2Fts-rest-router","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fe22m4u%2Fts-rest-router","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fe22m4u%2Fts-rest-router/lists"}