Skip to content

Commit 75a648c

Browse files
committed
- Added support for the Angular client with --name parameter
1 parent ca1c2a7 commit 75a648c

17 files changed

+437
-89
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [0.19.0] - 2022-02-02
5+
### Added
6+
- Support for Angular client with `--name` option
7+
- Added test cases for Angular client
8+
49
## [0.18.2] - 2022-02-02
510
### Fixed
611
- Updated dependencies

jest.config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const config: Config.InitialOptions = {
3232
'<rootDir>/test/e2e/client.node.spec.ts',
3333
'<rootDir>/test/e2e/client.axios.spec.ts',
3434
'<rootDir>/test/e2e/client.babel.spec.ts',
35+
'<rootDir>/test/e2e/client.angular.spec.ts',
3536
],
3637
modulePathIgnorePatterns: ['<rootDir>/test/e2e/generated'],
3738
},

src/index.ts

-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { parse as parseV2 } from './openApi/v2';
44
import { parse as parseV3 } from './openApi/v3';
55
import { getOpenApiSpec } from './utils/getOpenApiSpec';
66
import { getOpenApiVersion, OpenApiVersion } from './utils/getOpenApiVersion';
7-
import { isDefined } from './utils/isDefined';
87
import { isString } from './utils/isString';
98
import { postProcessClient } from './utils/postProcessClient';
109
import { registerHandlebarTemplates } from './utils/registerHandlebarTemplates';
@@ -65,10 +64,6 @@ export const generate = async ({
6564
request,
6665
write = true,
6766
}: Options): Promise<void> => {
68-
if (httpClient === HttpClient.ANGULAR && isDefined(clientName)) {
69-
throw new Error('Angular client does not support --name property');
70-
}
71-
7267
const openApi = isString(input) ? await getOpenApiSpec(input) : input;
7368
const openApiVersion = getOpenApiVersion(openApi);
7469
const templates = registerHandlebarTemplates({

src/templates/client.hbs

+40
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,54 @@
11
{{>header}}
22

3+
{{#equals @root.httpClient 'angular'}}
4+
import { NgModule} from '@angular/core';
5+
import { HttpClientModule } from '@angular/common/http';
6+
7+
import { AngularHttpRequest } from './core/AngularHttpRequest';
8+
import { BaseHttpRequest } from './core/BaseHttpRequest';
9+
import type { OpenAPIConfig } from './core/OpenAPI';
10+
import { OpenAPI } from './core/OpenAPI';
11+
{{else}}
312
import type { BaseHttpRequest } from './core/BaseHttpRequest';
413
import type { OpenAPIConfig } from './core/OpenAPI';
514
import { {{{httpRequest}}} } from './core/{{{httpRequest}}}';
15+
{{/equals}}
616

717
{{#if services}}
818
{{#each services}}
919
import { {{{name}}}{{{@root.postfix}}} } from './services/{{{name}}}{{{@root.postfix}}}';
1020
{{/each}}
1121
{{/if}}
1222

23+
{{#equals @root.httpClient 'angular'}}
24+
@NgModule({
25+
imports: [HttpClientModule],
26+
providers: [
27+
{
28+
provide: OpenAPI,
29+
useValue: {
30+
BASE: OpenAPI?.BASE ?? '{{{server}}}',
31+
VERSION: OpenAPI?.VERSION ?? '{{{version}}}',
32+
WITH_CREDENTIALS: OpenAPI?.WITH_CREDENTIALS ?? false,
33+
CREDENTIALS: OpenAPI?.CREDENTIALS ?? 'include',
34+
TOKEN: OpenAPI?.TOKEN,
35+
USERNAME: OpenAPI?.USERNAME,
36+
PASSWORD: OpenAPI?.PASSWORD,
37+
HEADERS: OpenAPI?.HEADERS,
38+
ENCODE_PATH: OpenAPI?.ENCODE_PATH,
39+
} as OpenAPIConfig,
40+
},
41+
{
42+
provide: BaseHttpRequest,
43+
useClass: AngularHttpRequest,
44+
},
45+
{{#each services}}
46+
{{{name}}}{{{@root.postfix}}},
47+
{{/each}}
48+
]
49+
})
50+
export class {{{clientName}}} {}
51+
{{else}}
1352
type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest;
1453

1554
export class {{{clientName}}} {
@@ -38,3 +77,4 @@ export class {{{clientName}}} {
3877
{{/each}}
3978
}
4079
}
80+
{{/equals}}
+21
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,35 @@
11
{{>header}}
22

3+
{{#equals @root.httpClient 'angular'}}
4+
import type { HttpClient } from '@angular/common/http';
5+
import type { Observable } from 'rxjs';
6+
7+
import type { ApiRequestOptions } from './ApiRequestOptions';
8+
import type { OpenAPIConfig } from './OpenAPI';
9+
{{else}}
310
import type { ApiRequestOptions } from './ApiRequestOptions';
411
import type { CancelablePromise } from './CancelablePromise';
512
import type { OpenAPIConfig } from './OpenAPI';
13+
{{/equals}}
614

715
export class BaseHttpRequest {
816

17+
{{#equals @root.httpClient 'angular'}}
18+
constructor(
19+
public readonly config: OpenAPIConfig,
20+
public readonly http: HttpClient,
21+
) {}
22+
{{else}}
923
constructor(public readonly config: OpenAPIConfig) {}
24+
{{/equals}}
1025

26+
{{#equals @root.httpClient 'angular'}}
27+
public request<T>(options: ApiRequestOptions): Observable<T> {
28+
throw new Error('Not Implemented');
29+
}
30+
{{else}}
1131
public request<T>(options: ApiRequestOptions): CancelablePromise<T> {
1232
throw new Error('Not Implemented');
1333
}
34+
{{/equals}}
1435
}

src/templates/core/HttpRequest.hbs

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,61 @@
11
{{>header}}
22

3+
{{#equals @root.httpClient 'angular'}}
4+
import { HttpClient } from '@angular/common/http';
5+
import { Inject, Injectable } from '@angular/core';
6+
import type { Observable } from 'rxjs';
7+
8+
import type { ApiRequestOptions } from './ApiRequestOptions';
9+
import { BaseHttpRequest } from './BaseHttpRequest';
10+
import type { OpenAPIConfig } from './OpenAPI';
11+
import { OpenAPI } from './OpenAPI';
12+
import { request as __request } from './request';
13+
{{else}}
314
import type { ApiRequestOptions } from './ApiRequestOptions';
415
import { BaseHttpRequest } from './BaseHttpRequest';
516
import type { CancelablePromise } from './CancelablePromise';
617
import type { OpenAPIConfig } from './OpenAPI';
718
import { request as __request } from './request';
19+
{{/equals}}
820

21+
{{#equals @root.httpClient 'angular'}}
22+
@Injectable()
23+
{{/equals}}
924
export class {{httpRequest}} extends BaseHttpRequest {
1025

26+
{{#equals @root.httpClient 'angular'}}
27+
constructor(
28+
@Inject(OpenAPI)
29+
config: OpenAPIConfig,
30+
http: HttpClient,
31+
) {
32+
super(config, http);
33+
}
34+
{{else}}
1135
constructor(config: OpenAPIConfig) {
1236
super(config);
1337
}
38+
{{/equals}}
1439

40+
{{#equals @root.httpClient 'angular'}}
41+
/**
42+
* Request method
43+
* @param options The request options from the service
44+
* @returns Observable<T>
45+
* @throws ApiError
46+
*/
47+
public override request<T>(options: ApiRequestOptions): Observable<T> {
48+
return __request(this.config, this.http, options);
49+
}
50+
{{else}}
1551
/**
1652
* Request method
1753
* @param options The request options from the service
1854
* @returns CancelablePromise<T>
1955
* @throws ApiError
2056
*/
21-
public request<T>(options: ApiRequestOptions): CancelablePromise<T> {
57+
public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {
2258
return __request(this.config, options);
2359
}
60+
{{/equals}}
2461
}

src/templates/exportService.hbs

+18-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
{{>header}}
22

33
{{#equals @root.httpClient 'angular'}}
4+
{{#if @root.exportClient}}
5+
import { Injectable } from '@angular/core';
6+
import type { Observable } from 'rxjs';
7+
{{else}}
48
import { Injectable } from '@angular/core';
59
import { HttpClient } from '@angular/common/http';
610
import type { Observable } from 'rxjs';
11+
{{/if}}
712

813
{{/equals}}
914
{{#if imports}}
@@ -16,7 +21,11 @@ import type { {{{this}}} } from '../models/{{{this}}}';
1621
import type { CancelablePromise } from '../core/CancelablePromise';
1722
{{/notEquals}}
1823
{{#if @root.exportClient}}
24+
{{#equals @root.httpClient 'angular'}}
25+
import { BaseHttpRequest } from '../core/BaseHttpRequest';
26+
{{else}}
1927
import type { BaseHttpRequest } from '../core/BaseHttpRequest';
28+
{{/equals}}
2029
{{else}}
2130
import { OpenAPI } from '../core/OpenAPI';
2231
import { request as __request } from '../core/request';
@@ -28,12 +37,13 @@ import { request as __request } from '../core/request';
2837
export class {{{name}}}{{{@root.postfix}}} {
2938
{{#if @root.exportClient}}
3039

31-
constructor(private readonly httpRequest: BaseHttpRequest) {}
32-
{{/if}}
40+
constructor(public readonly httpRequest: BaseHttpRequest) {}
41+
{{else}}
3342
{{#equals @root.httpClient 'angular'}}
3443

35-
constructor(private readonly http: HttpClient) {}
44+
constructor(public readonly http: HttpClient) {}
3645
{{/equals}}
46+
{{/if}}
3747

3848
{{#each operations}}
3949
/**
@@ -59,8 +69,13 @@ export class {{{name}}}{{{@root.postfix}}} {
5969
* @throws ApiError
6070
*/
6171
{{#if @root.exportClient}}
72+
{{#equals @root.httpClient 'angular'}}
73+
public {{{name}}}({{>parameters}}): Observable<{{>result}}> {
74+
return this.httpRequest.request({
75+
{{else}}
6276
public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
6377
return this.httpRequest.request({
78+
{{/equals}}
6479
{{else}}
6580
{{#equals @root.httpClient 'angular'}}
6681
public {{{name}}}({{>parameters}}): Observable<{{>result}}> {

src/templates/index.hbs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{{>header}}
22

33
{{#if @root.exportClient}}
4-
export { {{{clientName}}} } from './client';
4+
export { {{{clientName}}} } from './{{{clientName}}}';
5+
56
{{/if}}
67
{{#if @root.exportCore}}
78
export { ApiError } from './core/ApiError';

src/utils/writeClientClass.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export const writeClientClass = async (
3434
): Promise<void> => {
3535
const templateResult = templates.client({
3636
clientName,
37+
httpClient,
3738
postfix,
3839
server: client.server,
3940
version: client.version,
@@ -42,5 +43,5 @@ export const writeClientClass = async (
4243
httpRequest: getHttpRequestName(httpClient),
4344
});
4445

45-
await writeFile(resolve(outputPath, 'client.ts'), i(f(templateResult), indent));
46+
await writeFile(resolve(outputPath, `${clientName}.ts`), i(f(templateResult), indent));
4647
};
+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { HttpClientModule } from '@angular/common/http';
2+
import { Component, NgModule } from '@angular/core';
3+
import { BrowserModule } from '@angular/platform-browser';
4+
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
5+
6+
import { ApiModule } from './ApiModule';
7+
import { OpenAPI } from './core/OpenAPI';
8+
import { CollectionFormatService } from './services/CollectionFormatService';
9+
import { ComplexService } from './services/ComplexService';
10+
import { DefaultService } from './services/DefaultService';
11+
import { DefaultsService } from './services/DefaultsService';
12+
import { DuplicateService } from './services/DuplicateService';
13+
import { ErrorService } from './services/ErrorService';
14+
import { HeaderService } from './services/HeaderService';
15+
import { MultipleTags1Service } from './services/MultipleTags1Service';
16+
import { MultipleTags2Service } from './services/MultipleTags2Service';
17+
import { MultipleTags3Service } from './services/MultipleTags3Service';
18+
import { NoContentService } from './services/NoContentService';
19+
import { ParametersService } from './services/ParametersService';
20+
import { ResponseService } from './services/ResponseService';
21+
import { SimpleService } from './services/SimpleService';
22+
import { TypesService } from './services/TypesService';
23+
24+
@Component({
25+
selector: 'app-root',
26+
template: `<div>Angular is ready</div>`,
27+
})
28+
export class AppComponent {
29+
constructor(
30+
private readonly collectionFormatService: CollectionFormatService,
31+
private readonly complexService: ComplexService,
32+
private readonly defaultService: DefaultService,
33+
private readonly defaultsService: DefaultsService,
34+
private readonly duplicateService: DuplicateService,
35+
private readonly errorService: ErrorService,
36+
private readonly headerService: HeaderService,
37+
private readonly multipleTags1Service: MultipleTags1Service,
38+
private readonly multipleTags2Service: MultipleTags2Service,
39+
private readonly multipleTags3Service: MultipleTags3Service,
40+
private readonly noContentService: NoContentService,
41+
private readonly parametersService: ParametersService,
42+
private readonly responseService: ResponseService,
43+
private readonly simpleService: SimpleService,
44+
private readonly typesService: TypesService
45+
) {
46+
(window as any).api = {
47+
OpenAPI,
48+
ApiModule,
49+
CollectionFormatService: this.collectionFormatService,
50+
ComplexService: this.complexService,
51+
DefaultService: this.defaultService,
52+
DefaultsService: this.defaultsService,
53+
DuplicateService: this.duplicateService,
54+
ErrorService: this.errorService,
55+
HeaderService: this.headerService,
56+
MultipleTags1Service: this.multipleTags1Service,
57+
MultipleTags2Service: this.multipleTags2Service,
58+
MultipleTags3Service: this.multipleTags3Service,
59+
NoContentService: this.noContentService,
60+
ParametersService: this.parametersService,
61+
ResponseService: this.responseService,
62+
SimpleService: this.simpleService,
63+
TypesService: this.typesService,
64+
};
65+
}
66+
}
67+
68+
@NgModule({
69+
imports: [BrowserModule, HttpClientModule, ApiModule],
70+
bootstrap: [AppComponent],
71+
})
72+
export class AppModule {}
73+
74+
platformBrowserDynamic()
75+
.bootstrapModule(AppModule)
76+
.catch(err => console.error(err));

0 commit comments

Comments
 (0)