{"id":15286114,"url":"https://github.com/hoseungme/request-typer","last_synced_at":"2026-02-12T09:32:45.885Z","repository":{"id":45361038,"uuid":"435120485","full_name":"hoseungme/request-typer","owner":"hoseungme","description":"Declare a schema of HTTP Request and Response, and then create type vaildator and openAPI Specification object.","archived":false,"fork":false,"pushed_at":"2023-07-17T15:12:01.000Z","size":66,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-17T22:15:04.300Z","etag":null,"topics":["json-schema","openapi","typescript","validation"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hoseungme.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-12-05T09:11:28.000Z","updated_at":"2023-07-17T15:11:38.000Z","dependencies_parsed_at":"2022-07-20T21:18:26.520Z","dependency_job_id":"e058f9f7-1679-42de-9f88-bcec208f9930","html_url":"https://github.com/hoseungme/request-typer","commit_stats":{"total_commits":95,"total_committers":1,"mean_commits":95.0,"dds":0.0,"last_synced_commit":"3e015d2b2f2af1606a5cb9335817fedf16cd8e32"},"previous_names":["hoseungme/request-typer"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/hoseungme/request-typer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoseungme%2Frequest-typer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoseungme%2Frequest-typer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoseungme%2Frequest-typer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoseungme%2Frequest-typer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hoseungme","download_url":"https://codeload.github.com/hoseungme/request-typer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoseungme%2Frequest-typer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29362820,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["json-schema","openapi","typescript","validation"],"created_at":"2024-09-30T15:10:30.468Z","updated_at":"2026-02-12T09:32:45.870Z","avatar_url":"https://github.com/hoseungme.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# request-typer\n[![npm version](https://badge.fury.io/js/request-typer.svg)](https://badge.fury.io/js/request-typer)\n[![npm download](https://badgen.net/npm/dt/request-typer)](https://badgen.net/npm/dt/request-typer)\n\nDeclare a schema of HTTP Request and Response, and then create type vaildator and openAPI Specification object.\n\n## Features\n- [Schema](#schema)\n- [Validator](#validator)\n- [HTTP](#http)\n- [OASBuilder](#oasbuilder)\n\n## Schema\nuse ```Schema``` to create type definition.\n\n```typescript\nconst user = Schema.Object({\n  id: Schema.String(),\n  name: Schema.String(),\n  email: Schema.Optional(Schema.String()),\n  gender: Schema.Nullable(Schema.Enum([\"women\", \"men\"])),\n  createdAt: Schema.Number(),\n});\n\nconst union = Schema.Union([\n  Schema.Number(),\n  Schema.String(),\n  Schema.Union([\n    Schema.Number(),\n    Schema.String(),\n    Schema.Bolean()\n  ]),\n]);\n```\n\nand it supports static type resolution. import ```Resolve```.\n\n```typescript\nconst user = Schema.Object({\n  id: Schema.String(),\n  name: Schema.String(),\n  email: Schema.Optional(Schema.String()),\n  gender: Schema.Nullable(Schema.Enum([\"women\", \"men\"])),\n  createdAt: Schema.Number(),\n});\n\n/*\n{\n  id: string;\n  name: string;\n  email?: string | undefined;\n  gender: \"women\" | \"men\" | null;\n  createdAt: number;\n}\n*/\ntype User = Resolve\u003ctypeof user\u003e;\n```\n\n## Validator\nuse ```Validator``` to compare [Schema](#schema) with value.\n\nit returns ```{ success: true }``` if validation succeeded. otherwise, it returns error which includes message.\n\n```typescript\nValidator.validate(Schema.Number(), 1234).success; // true\n\nValidator.validate(Schema.Array(Schema.String()), [1, 2, 3, 4]).success; // false\nValidator.validate(Schema.Array(Schema.String()), [1, 2, 3, 4]).error.description; // \"should be Array\u003cstring\u003e\"\n```\n\n## HTTP\nuse ```HTTP``` to define HTTP request and response body schema.\nuse ```Parameter``` to define request parameter.\n\n```typescript\n/*\nGET /users/:id\n{\n  user: {\n    id: string\n  }\n}\n*/\nHTTP.GET(\n  // unique ID for this request\n  \"getUser\",\n  // path\n  \"/users/:id\",\n  // request parameters\n  {\n    id: Parameter.Path(Schema.String()),\n  },\n  // response json schema\n  Schema.Object({\n    id: Schema.String(),\n  }),\n);\n```\n\nand it supports static type resolution for request parameters and response body.\n```typescript\nconst request = HTTP.PUT(\n  \"updateUser\",\n  \"/users/:id\",\n  {\n    id: Parameter.Path(Schema.String()),\n    name: Parameter.Body(Schema.String()),\n    email: Parameter.Body(Schema.String()),\n  },\n  Schema.Object({\n    success: Schema.Boolean(),\n  }),\n);\n\n// {}\ntype QueryParameters = ResolveQueryParameters\u003ctypeof request.parameters\u003e;\n\n// { id: string }\ntype PathParameters = ResolvePathParameters\u003ctypeof request.parameters\u003e;\n\n// { name: string, email: string }\ntype RequestBody = ResolveRequestBody\u003ctypeof request.parameters\u003e;\n\n// { success: boolean }\ntype ResponseBody = Resolve\u003cObjectSchema\u003ctypeof request.response\u003e\u003e;\n```\n\n## OASBuilder\nuse ```OASBuilder``` to create OpenAPI Specification from [HTTP request schemas](#http).\n\n```typescript\nconst Responses = {\n  User: Schema.Object({\n    id: Schema.String(),\n    name: Schema.String(),\n    gender: Schema.Nullable(Schema.Enum([\"men\", \"women\"])),\n    email: Schema.Optional(Schema.String()),\n  }),\n};\n\nconst httpRequestSchemas = [\n  HTTP.PATCH(\n    \"updateUser\",\n    \"/user/{id}\",\n    {\n      id: Parameter.Path(Schema.String()),\n      name: Parameter.Body(Schema.String()),\n    },\n    Responses.User,\n  ),\n];\n\nconst oas = new OASBuilder({ title: \"api-v1\", version: \"1.0.0\" }, httpRequestSchemas, Responses).build();\n\nconsole.log(JSON.stringify(oas));\n```\n\nthe code above prints:\n\n```json\n{\n  \"info\": {\n    \"title\": \"api-v1\",\n    \"version\": \"1.0.0\"\n  },\n  \"openapi\": \"3.0.1\",\n  \"paths\": {\n    \"/user/{id}\": {\n      \"patch\": {\n        \"operationId\": \"updateUser\",\n        \"parameters\": [\n          {\n            \"required\": true,\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"name\"\n                ]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/User\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"User\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"gender\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"men\",\n              \"women\"\n            ],\n            \"nullable\": true\n          },\n          \"email\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"gender\"\n        ]\n      }\n    }\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoseungme%2Frequest-typer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhoseungme%2Frequest-typer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoseungme%2Frequest-typer/lists"}