Angular REST API client generator from Swagger YAML or JSON file with camel case settings
Generated files are compatible with Angular 6 (should be compatible with 5 version too). RxJS imports are targeted for version 6+.
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).
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.
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.
- Angular 6+ (it should also work with 5 and 4.3+)
- RxJS 6 (Observable imports)
- in case of rxjs <6 please update or rewrite the rxjs imports to match the older version
See the Changelog to keep up with the features and changes.
[sudo] npm install -g api-client-generator
This command will generate API client described in the swagger.json file to the./output folder
api-client-generator -s ./path/to/swagger.json -o ./output
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"
},
- then just run
npm run generate-api-client
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 <[email protected]>
.
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.*
- import the
APIClientModule
in yourapp.module.ts
(main module)
- domain and configuration should be passed to module imports using
.forRoot
method - options and domain are optional
- 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
- if host property is not defined
@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 {
}
- 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
);
}
}
- 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
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)
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']
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.
If you are interested in contributing please follow these steps:
- Create the issue and discuss the problem
- Fork the repo
- Run
npm run dev:install
instead ofnpm install
to install all (even test) dependencies - Add your feature/fix
- follow the code style
- check for the lint errors
- in case of questions visit gitter to chat with contributors
- Run the tests
npm run tests
- 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