Skip to content

Commit d9069e2

Browse files
support paths without tags
1 parent e23135a commit d9069e2

File tree

8 files changed

+5284
-3469
lines changed

8 files changed

+5284
-3469
lines changed

src/templates/exportAppClient.hbs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ import { {{{httpClientRequest}}} } from './core/{{{httpClientRequest}}}';
88
import { {{{name}}} } from './services/{{{name}}}';
99
{{/each}}
1010
{{/if}}
11+
{{#if service}}
12+
import { {{{service.name}}} } from './services/{{{service.name}}}';
13+
{{/if}}
1114

12-
export class {{{clientName}}} {
15+
export class {{{clientName}}} {{#if service}}extends {{{service.name}}} {{/if}}{
1316
{{#each services}}
1417
readonly {{{shortName}}}: {{{name}}};
1518
{{/each}}
1619
readonly request: BaseHttpRequest;
1720

1821
constructor(openApiConfig?: OpenAPIConfig, HttpRequest: new (config: OpenAPIConfig) => BaseHttpRequest = {{{httpClientRequest}}}) {
19-
this.request = new HttpRequest({
22+
{{#if service}}const request{{else}}this.request{{/if}} = new HttpRequest({
2023
BASE: openApiConfig?.BASE ?? '{{{server}}}',
2124
VERSION: openApiConfig?.VERSION ?? '{{{version}}}',
2225
WITH_CREDENTIALS: openApiConfig?.WITH_CREDENTIALS ?? false,
@@ -25,6 +28,10 @@ export class {{{clientName}}} {
2528
PASSWORD: openApiConfig?.PASSWORD,
2629
HEADERS: openApiConfig?.HEADERS,
2730
});
31+
{{#if service}}
32+
super(request);
33+
this.request = request;
34+
{{/if}}
2835
{{#each services}}
2936
this.{{{shortName}}} = new {{{name}}}(this.request);
3037
{{/each}}

src/utils/writeAppClient.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ export async function writeAppClient(client: Client, templates: Templates, outpu
1919
await writeFile(
2020
resolve(outputPath, 'client.ts'),
2121
templates.client({
22-
services: sortServicesByName(client.services).map(s => ({
23-
name: s.name,
24-
shortName: s.name.replace('Service', '').toLowerCase(),
25-
})),
22+
services: sortServicesByName(client.services)
23+
.filter(s => s.name !== 'Service')
24+
.map(s => ({
25+
name: s.name,
26+
shortName: s.name.replace('Service', '').toLowerCase(),
27+
})),
28+
service: client.services.find(s => s.name === 'Service'),
2629
clientName,
2730
httpClientRequest: getHttpRequestName(httpClient),
2831
server: client.server,

test/__snapshots__/index.client.spec.js.snap

Lines changed: 5117 additions & 3437 deletions
Large diffs are not rendered by default.

test/index.client.spec.js

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,40 @@ const OpenAPI = require('../dist');
44
const glob = require('glob');
55
const fs = require('fs');
66

7+
async function gen(version, postfix) {
8+
await OpenAPI.generate({
9+
input: `./test/spec/v${version}${postfix}.json`,
10+
output: `./test/generated/v${version}_client${postfix}`,
11+
httpClient: OpenAPI.HttpClient.FETCH,
12+
useOptions: false,
13+
useUnionTypes: false,
14+
exportCore: true,
15+
exportSchemas: true,
16+
exportModels: true,
17+
exportServices: true,
18+
exportClient: true,
19+
clientName: 'TestClient',
20+
});
21+
return glob.sync(`./test/generated/v${version}_client${postfix}/**/*.ts`);
22+
}
23+
724
describe('v2', () => {
825
it('should generate with exportClient', async () => {
9-
await OpenAPI.generate({
10-
input: './test/spec/v2.json',
11-
output: './test/generated/v2_client',
12-
httpClient: OpenAPI.HttpClient.FETCH,
13-
useOptions: false,
14-
useUnionTypes: false,
15-
exportCore: true,
16-
exportSchemas: true,
17-
exportModels: true,
18-
exportServices: true,
19-
exportClient: true,
20-
clientName: 'TestClient',
26+
(await gen(2, '')).forEach(file => {
27+
const content = fs.readFileSync(file, 'utf8').toString();
28+
expect(content).toMatchSnapshot(file);
29+
});
30+
});
31+
32+
it('should generate with no tags', async () => {
33+
(await gen(2, '_no_tags')).forEach(file => {
34+
const content = fs.readFileSync(file, 'utf8').toString();
35+
expect(content).toMatchSnapshot(file);
2136
});
37+
});
2238

23-
glob.sync('./test/generated/v2_client/**/*.ts').forEach(file => {
39+
it('should generate with combined tags', async () => {
40+
(await gen(2, '_tags_combined')).forEach(file => {
2441
const content = fs.readFileSync(file, 'utf8').toString();
2542
expect(content).toMatchSnapshot(file);
2643
});
@@ -29,21 +46,21 @@ describe('v2', () => {
2946

3047
describe('v3', () => {
3148
it('should generate with exportClient', async () => {
32-
await OpenAPI.generate({
33-
input: './test/spec/v3.json',
34-
output: './test/generated/v3_client',
35-
httpClient: OpenAPI.HttpClient.FETCH,
36-
useOptions: false,
37-
useUnionTypes: false,
38-
exportCore: true,
39-
exportSchemas: true,
40-
exportModels: true,
41-
exportServices: true,
42-
exportClient: true,
43-
clientName: 'TestClient',
49+
(await gen(3, '')).forEach(file => {
50+
const content = fs.readFileSync(file, 'utf8').toString();
51+
expect(content).toMatchSnapshot(file);
4452
});
53+
});
54+
55+
it('should generate with no tags', async () => {
56+
(await gen(3, '_no_tags')).forEach(file => {
57+
const content = fs.readFileSync(file, 'utf8').toString();
58+
expect(content).toMatchSnapshot(file);
59+
});
60+
});
4561

46-
glob.sync('./test/generated/v3_client/**/*.ts').forEach(file => {
62+
it('should generate with combined tags', async () => {
63+
(await gen(3, '_tags_combined')).forEach(file => {
4764
const content = fs.readFileSync(file, 'utf8').toString();
4865
expect(content).toMatchSnapshot(file);
4966
});

test/spec/v2_no_tags.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"swagger": "2.0",
3+
"info": {
4+
"title": "swagger",
5+
"version": "v1.0"
6+
},
7+
"host": "localhost:3000",
8+
"basePath": "/base",
9+
"schemes": ["http"],
10+
"paths": {
11+
"/api/v{api-version}/simple": {
12+
"get": {
13+
"operationId": "GetCallWithoutParametersAndResponse"
14+
},
15+
"put": {
16+
"operationId": "PutCallWithoutParametersAndResponse"
17+
},
18+
"post": {
19+
"operationId": "PostCallWithoutParametersAndResponse"
20+
}
21+
}
22+
}
23+
}

test/spec/v2_tags_combined.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"swagger": "2.0",
3+
"info": {
4+
"title": "swagger",
5+
"version": "v1.0"
6+
},
7+
"host": "localhost:3000",
8+
"basePath": "/base",
9+
"schemes": ["http"],
10+
"paths": {
11+
"/api/v{api-version}/simple": {
12+
"get": {
13+
"tags": [
14+
"Simple"
15+
],
16+
"operationId": "GetCallWithoutParametersAndResponse"
17+
},
18+
"put": {
19+
"tags": [
20+
"Simple"
21+
],
22+
"operationId": "PutCallWithoutParametersAndResponse"
23+
},
24+
"post": {
25+
"operationId": "PostCallWithoutParametersAndResponse"
26+
}
27+
}
28+
}
29+
}

test/spec/v3_no_tags.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"openapi": "3.0.0",
3+
"info": {
4+
"title": "swagger",
5+
"version": "v1.0"
6+
},
7+
"servers": [
8+
{
9+
"url": "http://localhost:3000/base"
10+
}
11+
],
12+
"paths": {
13+
"/api/v{api-version}/simple": {
14+
"get": {
15+
"operationId": "GetCallWithoutParametersAndResponse"
16+
},
17+
"put": {
18+
"operationId": "PutCallWithoutParametersAndResponse"
19+
},
20+
"post": {
21+
"operationId": "PostCallWithoutParametersAndResponse"
22+
}
23+
}
24+
}
25+
}

test/spec/v3_tags_combined.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"openapi": "3.0.0",
3+
"info": {
4+
"title": "swagger",
5+
"version": "v1.0"
6+
},
7+
"servers": [
8+
{
9+
"url": "http://localhost:3000/base"
10+
}
11+
],
12+
"paths": {
13+
"/api/v{api-version}/simple": {
14+
"get": {
15+
"tags": [
16+
"Simple"
17+
],
18+
"operationId": "GetCallWithoutParametersAndResponse"
19+
},
20+
"put": {
21+
"tags": [
22+
"Simple"
23+
],
24+
"operationId": "PutCallWithoutParametersAndResponse"
25+
},
26+
"post": {
27+
"operationId": "PostCallWithoutParametersAndResponse"
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)