Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

api-client-generator

flowup2kMIT4.7.1

Angular REST API client generator from Swagger YAML or JSON file with camel case settings

swagger, rest, angular10, angular9, angular8, angular7, angular6, angular5, angular, ngx, scaffolding, webapi, api, apiclient, generator, camelCase, HTTP, HTTPClient

readme

npm license npm

Caretaker code style: prettier Conventional Commits Gitter chat

Total alerts Language grade: JavaScript

GitHub stars tweet

API client generator

Angular REST API client generator from Swagger YAML or JSON file with camel case settings

Logo

Description

This package generates an Angular TypeScript class from a Swagger v2.0 specification file. The code is generated using Mustache templates.

The generated service class uses new HttpClient module of Angular (introduced in version 4.3).

Motivation

This tool provides an easy and sustainable solution for making the classic REST API feel like you wish it has felt in TypeScript.

It starts by having the same data models at front-end and back-end, then continues with API client interface in form of service build on Angular HTTP client. Everything is typed and described in the way developer don't even need to study the API endpoints.

All you need to set it up is an up to date swagger file and Angular project.

How is this relevant for you?

A lot of developers is struggling with how to properly use the REST API in their apps. In Angular, we have a great opportunity which is HTTP Client supporting types. It is a great experience when you can work on a project where your models and data service are pre-generated and you can focus on state management, UI and business logic.

Compatibility

This generator focuses on supporting latest Angular/RxJS versions.

  • Angular 9+
  • RxJS 6+ (Observable imports)

    • in case of rxjs <6 please update or rewrite the rxjs imports to match the older version

Older versions

If you need compatibility for Angular 7 and less, It might require some additional steps. In case of problems try editing necessary imports manually or downgrading to older generator versions (4.6.0 and bellow), although it is not recommended as patches and fixes might not be present in older versions.

See the Changelog to keep up with the features and changes.

Usage

This command will generate API client described in the swagger.json file to the ./output folder.

npx api-client-generator -s ./path/to/swagger.json -o ./output

This command will do the same, but it will split all of the tags to separate API services and models folder will be shared. All will be generated to specified path and that is ./src/api folder.

npx api-client-generator -t all -s ./path/to/swagger.yaml -o ./src/api"

Script in Package JSON

npm install api-client-generator --save-dev

  • for quick usage create run script in your package.json scripts.
"scripts": {
  "generate-api-client": "api-client-generator -s ./swagger.yaml -o ./output-folder"
},

Recommended:

  • use a "tag" (-t all) option to generate all (or list of specific) services separately
"scripts": {
  "generate-api-client": "api-client-generator -s ./swagger.yaml -o ./output-folder -t all"
},
  • then just run

npm run generate-api-client

NOTE: if you want to skip the installation for project, you can use npx but be careful as you'll be using the latest version every time you run the script (We use SEMVER so it is safer to update over the time).

Options

Option Description
-h/--help print help and exit
-s/--source path to the swagger file (YAML or JSON)
-o/--output path where the generated files should be emitted
-C/--commit git commit generated changes *
-v/--verbose supply stack traces with outputted error messages
-t/--splitPathTags generate services and models only for the specified tags. Use , as the separator for multiple tags
| use all to emit all as a service per tag
-m/--skipModule skip creating the index file with module export

* The author of the commit will be api-client-generator <api-client-generator@flowup.cz>. If there are any staged changes in your repository, the generator will halt pre-generation with an error to prevent including your changes in the automatic commit.*

How to use generated client

  1. import the APIClientModule in your app.module.ts (main module)

  2. domain and configuration should be passed to module imports using .forRoot method

  3. options and domain are optional
  4. when a domain is not passed, host property form swagger file is used as a default
    • if host property is not defined window.href with a current port is used instead
@NgModule({
  imports: [
    /* Default configuration and all of it's properties is optional */
    APIClientModule.forRoot({
      domain: 'https://api.url', // or use value defined in environment `environment.apiUrl`
      httpOptions: {
        headers: {
          myCustomHeader:
            'this will appear in every request as one of the headers',
        },
        params: { someParam: 'customParam' },
      },
    }),
    /* ... other imports */
    HttpClientModule, // <<= this is very important import
    // API client relies on HttpClient module and will throw and provider error if not there
  ],
  /* ... other stuff */
})
export class AppModule {}
  1. use APIClient service in your components/services/...
@Component({
  selector: 'my-component',
  templateUrl: `
    <div *ngFor="let user of users">
      <p>User name: {{user.name}}</p>
    </div>
  `,
})
export class MyComponent {
  users: User[] = [];

  constructor(private readonly api: APIClient) {
    this.api.getUsers().subscribe(users => (this.users = users));
  }
}

Generated structure

  • if you are interested in how will the generated client with models look like, take a look in an example/ folder
output
 ├─ models
 │   ├─ some.enum.ts
 │   ├─ some.model.ts
 │   │  ...
 │   ├─ another.model.ts
 │   └─ index.ts
 ├─ api-client.interface.ts
 ├─ api-client.service.ts
 └─ index.ts

Common problems

HttpClient not provided

This or very similar error means that you forgot to import HttpClientModule in your root module

StaticInjectorError(AppModule)[APIClient -> HttpClient]:
  StaticInjectorError(Platform: core)[APIClient -> HttpClient]:
    NullInjectorError: No provider for HttpClient!

Fix:

  • add HttpClientModule to your root module (see NgModule imports in usage)

Numeric Enums keys generated as plane number

If some of your numeric enums look like this, the problem might be that in the swagger file you are not describing the keys properly.

export enum MyEnum {
  0 = 0,
  1 = 1,
  2 = 2,
}

Fix We currently support two options:

  • formatting description into array of ['1 Foo', '2 Bar']
  • using 'x-enumNames' custom property that should be in format ['Foo', 'Bar']

Problem reporting and contributions

Please report any problems you have any issues you find so they can be resolved. If the generator terminates with an error message, please re-run it with the -v flag and post the outputted stack trace.

Feel free to discuss desired improvements or functionality in issues. Afterwards, the pull requests are very welcome.

Development

If you are interested in contributing please follow these steps:

  1. Create the issue and discuss the problem
  2. Fork the repo
  3. Run npm run dev:install instead of npm install to install all (even test) dependencies
  4. Add your feature/fix
    • follow the code style
    • check for the lint errors
    • in case of questions visit gitter to chat with contributors
  5. Run the tests npm run tests
  6. Open the PR to upstream master
    • mention the issue/bug/feature it solves/closes

.

.

.

.

Inspired by swagger-js-codegen

Generator based on angular4-swagger-client-generator

changelog

Changelog

All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

4.7.1 (2020-10-19)

Bug Fixes

  • cli: rethrow errors in catch to see full trace stack in console (943f7d2)
  • enums: x-enumNames specified integers and description with new lines (6a98b82)

4.7.0 (2020-07-03)

Features

  • angular 10 module with providers compatibility (7f69cc8)

4.6.4 (2020-07-03)

Bug Fixes

  • parser: reference model name contains build-in type (4593fae)

4.6.3 (2020-06-24)

Bug Fixes

  • parser: filtering already existing parent definitions to overcome recursion (e292567)

4.6.2 (2020-01-24)

Bug Fixes

  • generator: object instad of { [key: string]: any } (0c29141)
  • guards: array nested in additionalProperties (4f23f92)
  • guards: method response basic type guards used instead of custom function for primitive types (96ce207)
  • models: object instead of any in case of nested properties (e8b7667)
  • service: object instead of any in case of nested properties in method parameter (4443ac3)
  • service: object instead of any in case of nested properties in response (277ee3f)

4.6.1 (2020-01-23)

Bug Fixes

  • generator: toCamelCase method removes duplicate words (abe073d)
  • guards: array item typed as unknown for the guard iteration (da654f7)
  • guards: circular dependency (ecd1080)
  • guards: escaped property names accessed via brackets (1dbfe3a)
  • guards: guarded service response type as explicit any (785f022)
  • guards: nested array types (89da76c)
  • guards: object array types (30113fe)
  • guards: objects with index signature as additional properties (a6ef06c)
  • guards: union type string or enum with one value only (ec040c4)

4.6.0 (2020-01-16)

Bug Fixes

  • guard: circular dependencies (eae41be)
  • guards: object guard comparing typeof 'object' (ffc8560)

Features

  • method-params: union types determined for enum like union strings and numbers (324a95a)
  • models: union types for properties of enum like union strings and numbers (0023555)

4.5.1 (2019-11-14)

Bug Fixes

  • type-guards: guards name definition and usage inconsistency (5e00535)

4.5.0 (2019-11-04)

Features

  • generator: type guards for each data model (8cbdbbe)

4.4.0 (2019-08-28)

Bug Fixes

  • cli: option for tags now automatically uses "all" if tags are generated and no tag is provided (e2cef2f)

Features

  • models: additional properties supported (535386c), closes #81
  • models: embedded allOf properties supported (a42aa4f), closes #80

4.3.0 (2019-06-28)

Bug Fixes

  • api-client: support for blob response type (d14ef9d), closes #77
  • methods: recognizing return type if TS primitive or complex type (8ee08e2)

Build System

Features

  • api-client: generating response for "lowest" of HTML success codes (72a7b14)
  • api-client: void return type for methods with empty schema (f1977eb)
  • enums: custom enum key names via custom x-enumNames property (9cf1c8f)
  • form-data: send form parameters as multi part form data (c18c296), closes #78

Tests

  • jest instead of jasmine (0836c0b)
  • angular-project: jest instead of jasmine and karma (2de02e7)
  • angular-project: removed jasmine and karma deps (784b181)
  • angular-project: updated deps (c4e8b97)

4.2.0 (2019-01-11)

Features

  • models: properties are optional as default, required stated explicitly (04111d9)

4.1.1 (2019-01-11)

4.1.0 (2019-01-11)

Bug Fixes

  • api-client: method parameters description and required flag (8e02cc1)
  • enum: substitution of disallowed characters in key string (7214f2b), closes #74
  • generator: Expose error from spec validation (ebb74c7)
  • license: redundant lt/gt characters removed (3b5f8d9)

Features

  • model: objects generated as key value maps (b775b44)

4.0.1 (2018-09-01)

Bug Fixes

  • models: recursive model definitions filter (c80631f)

4.0.0 (2018-08-31)

Features

  • models: model export index sorted and filtered for duplicates (ca325d3)
  • tags: clients generated to folder services when tag option used (e7d3a08)

BREAKING CHANGES

  • tags: models import path had changed as services now share the models folder

3.6.2 (2018-08-22)

Bug Fixes

  • tags: definition type name filter (48b4fff)

3.6.1 (2018-08-22)

Bug Fixes

  • post install dependencies (b511914)

3.6.0 (2018-08-22)

Bug Fixes

  • api-client: empty string as valid domain URL (c99265e)
  • api-client: tag services names and module injection tokens (6624de2)
  • parser: type prefixing fixed for nullables (7aee02b)

Features

  • git: generated files added separately instead of whole path (1a00bbd)
  • main: warning logged on legacy model discovery (ad66cf7)
  • parser: x-nullable response flag supported (d73924c)

3.5.0 (2018-07-12)

Bug Fixes

  • generator: validate swagger file before parse (cafa99f), closes #58

Features

  • api-client: interface generated for service mocking purposes (f10c9b3)
  • autocommit: implemented (a9d5fd0)
  • api-client: option to generate separate clients based on the path tags (20addd1)

3.4.1 (2018-06-22)

Bug Fixes

  • generator: swagger file validate against spec and schema (59c3c1b), closes #58

3.4.0 (2018-06-20)

Features

  • api-client: global parameters for paths (3cf7219)

3.3.0 (2018-06-11)

Bug Fixes

  • enums: numeric enums values (ce511c8)

Features

  • api-client: API method descriptions (e7e767f), closes #29
  • api-client: API method parameter descriptions (320fabc), closes #29
  • models, enums: description for models and enums (ae7262d), closes #29

3.2.2 (2018-06-08)

Bug Fixes

  • models: extended interface name CamelCase instead of camelCase (f6e39ad)

3.2.1 (2018-06-08)

Bug Fixes

  • models: extending interface name corrected to camelCase (b02dc2f)

3.2.0 (2018-06-07)

Bug Fixes

  • models: escape keys with non-word characters and ones starting with a number (1757135), closes #54

Features

  • models: extend interface with model in allOf property definition (0d7b83c), closes #53

3.2.0 (2018-06-01)

Bug Fixes

  • api-client: http options without headers and params constructing (AOT compatible) (eca03c3), closes #47
  • api-client: possibly undefined http options params and headers (539ba46)
  • models: model no longer stripped from the name of file if explicitly named that way (dfdf90d), closes #49

3.1.0 (2018-05-07)

Features

  • api-client: rxjs 6 compatible import for Observable (431d61f)

3.0.3 (2018-04-06)

Bug Fixes

  • api-client: array method parameters and headers appended (34ded75), closes #36
  • api-client: basic types regex checks word boundaries (f588fed), closes #44
  • api-client: File, Blob, Date and Object types are not imported from models (37e358b), closes #27
  • api-client: form parameter used as body in request (ce9f124), closes #40
  • api-client: models are not imported if there are none (42cf4c0), closes #31
  • parser: empty or native types parameters won't be generated into models (ff55939)
  • parser: interface properties were skipped during generation (3e694ad)

Features

  • api-client: create output dir even if path does not exists (8ff9be8), closes #34
  • api-client: method names with underscore converted to camelCase (b09a679), closes #37
  • api-client: method parameters nested to args object (efaca5b), closes #8
  • api-client: optional param skipped if not in args (135db91)
  • api-client: reference parameters are dereferenced (0a0de44)
  • api-client: referenced method parameters generated and used (0e26c53)
  • api-client: support for head, options and patch http methods (bd240f5)
  • api-client: support for optional method parameters (9d0cedc), closes #8
  • api-client: when no operation id, method names generated from path and method type (4afcdbc)
  • enums: numeric enums, using keys from description (45bb096), closes #28
  • parser: interface property type improvements, including nested array types (c70d2a3), closes #35

3.0.0 (2018-03-15)

Bug Fixes

  • api-client: array method parameters and headers appended (34ded75), closes #36
  • api-client: File, Blob, Date and Object types are not imported from models (37e358b), closes #27
  • api-client: form parameter used as body in request (ce9f124), closes #40
  • api-client: models are not imported if there are none (42cf4c0), closes #31
  • parser: empty or native types parameters won't be generated into models (ff55939)
  • parser: interface properties were skipped during generation (3e694ad)

Features

  • api-client: create output dir even if path does not exists (8ff9be8), closes #34
  • api-client: method names with underscore converted to camelCase (b09a679), closes #37
  • api-client: method parameters nested to args object (efaca5b), closes #8
  • api-client: optional param skipped if not in args (135db91)
  • api-client: reference parameters are dereferenced (0a0de44)
  • api-client: referenced method parameters generated and used (0e26c53)
  • api-client: support for head, options and patch http methods (bd240f5)
  • api-client: support for optional method parameters (9d0cedc), closes #8
  • api-client: when no operation id, method names generated from path and method type (4afcdbc)
  • enums: numeric enums, using keys from description (45bb096), closes #28
  • parser: interface property type improvements, including nested array types (c70d2a3), closes #35

3.0.0-alpha.1 (2018-02-26)

Bug Fixes

3.0.0-alpha.0 (2018-02-26)

Features

  • module: API client exported as module (7eaf673), closes #23

BREAKING CHANGES

  • module:
    • renamed to APIClient
    • domain and configuration are now provided using .forRoot method
      APIClientModule.forRoot({
      domain: 'https://api.url',
      }),
    • cli command renamed to api-client-generator

2.1.0 (2018-02-25)

Bug Fixes

  • models: enum property names same as values (7a0b171), closes #18

Features

  • api-client: models imported as module (3492d8f), closes #22
  • domain: relative path instead of localhost (e19fffe)