A generator that reads swagger / open api 3 json configs and generates typescript client services with axios.
Hint: implemented with specific use case in mind.
Your open-api 3 json config file:
{ "openapi": "3.0.1", "info": { "title": "Awesome project API", "description": "The API that is just awesome.", "version": "1.3.8" }, "tags" : [ { "name" : "users" } ], ... "paths": { "/users": { "get": { "tags": [ "users" ], "operationId": "getAllUsers", "description": "Gets all users. Can optionally be filtered by group id.", "parameters": [ { "name": "groupId", "in": "query", "description": "The group of the users to retrieve.", "required": false, "schema": { "type": "integer", "format": "int32" } } ], "responses": { "default": { "description": "The users.", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref" : "#/components/schemas/User" } } } } } } } }, "/users/{userId}": { "get": { "tags": [ "users" ], "operationId": "getUserById", "description": "Retrieve a user by id.", "parameters": [ { "name": "userId", "in": "path", "description": "The id of the user to retrieve.", "required": true, "schema": { "type": "integer", "format": "int32" } } ], "responses": { "default": { "description": "The user.", "content": { "application/json": { "schema": { "$ref" : "#/components/schemas/User" } } } } } } } }, "components": { "schemas": { "User": { "description": "The user.", "type": "object", "properties": { "id": { "type": "integer", "format": "int32", "description": "The id of the user." }, "name": { "type": "string", "description": "The name of the user." }, "groupId": { "type": "integer", "format": "int32", "description": "The group id of the user." } } } } } }
Generated model ( user.ts
)
/** * Awesome project API 1.3.8 (OpenAPI: 3.0.1) * The API that is just awesome. * * NOTE: This class is auto generated by openapi-typescript-client-api-generator. * Do not edit the file manually. */ export class User { /** * Creates a ListColumn. * * @param {number} id The id of the user. * @param {string} name The name of the user. * @param {number} groupId The group id of the user. */ constructor(id: number, name: string, groupId: number) { this.id = id; this.name = name; this.groupId = groupId; } /** * The id of the user. */ public id: number; /** * The name of the user. */ public name: string; /** * The group id of the user. */ public group id: number; }
Generated service ( usersService.ts
)
/** * Awesome project API 1.3.8 (OpenAPI: 3.0.1) * The API that is just awesome. * * NOTE: This class is auto generated by openapi-typescript-client-api-generator. * Do not edit the file manually. */ import axios from "axios"; import { ServiceBase } from "../../services/serviceBase"; import { IUsersService } from "./usersService.interface"; import { User } from "../models/user"; export class UsersService extends ServiceBase implements IUsersService { /** * Gets all users. Can optionally be filtered by group id. * * @param {number} [groupId] The group of the users to retrieve. */ public async getAllUsers(groupId?: number): Promise<User[]> { const config = this.getAxiosConfiguration(); const queryList: string[] = []; if (groupId !== undefined) { queryList.push(`groupId=${groupId}`); } const query = `?${queryList.join("&")}`; const response = await axios.get<User[]>(`/users${query}`, config); return response.data; } /** * Retrieve a user by id.. * * @param {number} userId The id of the user to retrieve. */ public async getUserById(userId?: number): Promise<User[]> { const config = this.getAxiosConfiguration(); const response = await axios.get<User[]>(`/users/${userId}`, config); return response.data; } }
$ yarn add @progresso/openapi-typescript-client-api-generator --dev
Add a swagger (open-api 2.0) or open-api 3 json config file into your project. I.e. at
[project-root]/api/awesone-api.json
Add a script line into your package.json
:
{ ... "scripts": { "generate": "openapi-typescript-client-api-generator" } }
Implement a service base class called ServiceBase
that implements the following method so you are able to pass custom headers like authentication tokens to your requests:
protected getAxiosConfiguration(): AxiosRequestConfig
Execute the generator with
$ yarn generate -c /api/awesome-api.json -sb /client/services -s /client/api/services -m /client/api/models -sm /server/modules/api/models
All parameters are required currently. All pathes are relative to the project root.
Parameter | Description | Example |
---|---|---|
-c <path> |
The path to your json config file. | /api/awesome-api.json |
-sb <path> |
The path to the directory where your ServiceBase class is located. |
/client/services |
-s <path> |
The path to the directory where the generated services should be saved to. Will be created if neccessary. | /client/api/services |
-m <path> |
The path to the directory where the generated models should be saved to. Will be created if neccessary. | /client/api/models |
-sm <path> |
The path to a directory that contains server side models decorated for @nestjs/swagger generation. Used when the config file's version is 2.0 (swagger) to augment services and models by inheritance information. Not used when config file's version is >= 3.0.0 (open-api 3). |
/server/modules/api/models |