Skip to content

Commit 855c61d

Browse files
author
Artem Parkhomenko
committed
Merge remote-tracking branch 'origin/master' into response-type-support
# Conflicts: # src/language/typescript/3.0/serializers/operation-object.ts
2 parents eb708a5 + 24437cd commit 855c61d

File tree

12 files changed

+227
-33
lines changed

12 files changed

+227
-33
lines changed

CHANGELOG.md

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
# [2.0.0-alpha.24](https://github.com/devexperts/swagger-codegen-ts/compare/v2.0.0-alpha.23...v2.0.0-alpha.24) (2020-12-24)
2+
3+
4+
### Bug Fixes
5+
6+
* fix path to utils file when using date types ([#131](https://github.com/devexperts/swagger-codegen-ts/issues/131)) ([7448720](https://github.com/devexperts/swagger-codegen-ts/commit/7448720)), closes [#117](https://github.com/devexperts/swagger-codegen-ts/issues/117)
7+
8+
9+
### Features
10+
11+
* Support headers ([#133](https://github.com/devexperts/swagger-codegen-ts/issues/133)) ([24b70fa](https://github.com/devexperts/swagger-codegen-ts/commit/24b70fa)), closes [#57](https://github.com/devexperts/swagger-codegen-ts/issues/57)
12+
13+
14+
115
# [2.0.0-alpha.23](https://github.com/devexperts/swagger-codegen-ts/compare/v2.0.0-alpha.22...v2.0.0-alpha.23) (2020-11-02)
216

317

@@ -39,21 +53,7 @@
3953

4054

4155

42-
# [2.0.0-alpha.19](https://github.com/devexperts/swagger-codegen-ts/compare/v2.0.0-alpha.18...v2.0.0-alpha.19) (2020-05-20)
43-
44-
45-
### Features
46-
47-
* support arbitrary strings as type names in TS for OA3 ([79cd66e](https://github.com/devexperts/swagger-codegen-ts/commit/79cd66e)), closes [#114](https://github.com/devexperts/swagger-codegen-ts/issues/114)
48-
49-
50-
### BREAKING CHANGES
51-
52-
* type names and IO constant names now replace all non-alphanumeric characters with '_'
53-
54-
55-
56-
# [2.0.0-alpha.18](https://github.com/devexperts/swagger-codegen-ts/compare/v2.0.0-alpha.17...v2.0.0-alpha.18) (2020-04-17)
56+
# [2.0.0-alpha.19](https://github.com/devexperts/swagger-codegen-ts/compare/v2.0.0-alpha.17...v2.0.0-alpha.19) (2020-05-20)
5757

5858

5959
### Bug Fixes
@@ -66,10 +66,12 @@
6666
### Features
6767

6868
* filter operations response ([6164744](https://github.com/devexperts/swagger-codegen-ts/commit/6164744))
69+
* support arbitrary strings as type names in TS for OA3 ([79cd66e](https://github.com/devexperts/swagger-codegen-ts/commit/79cd66e)), closes [#114](https://github.com/devexperts/swagger-codegen-ts/issues/114)
6970

7071

7172
### BREAKING CHANGES
7273

74+
* type names and IO constant names now replace all non-alphanumeric characters with '_'
7375
* void response is added to resulting response type
7476
* non-successful response types are filtered out of resulting response type
7577

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devexperts/swagger-codegen-ts",
3-
"version": "2.0.0-alpha.23",
3+
"version": "2.0.0-alpha.24",
44
"description": "TS generator for swagger spec",
55
"main": "dist/index.js",
66
"scripts": {

src/language/typescript/2.0/serializers/operation-object.ts

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import {
2525
ArrayParameterObjectCollectionFormat,
2626
BodyParameterObject,
2727
FormDataParameterObject,
28-
HeaderParameterObject,
2928
ParameterObject,
3029
ParameterObjectCodec,
3130
PathParameterObject,
@@ -53,13 +52,18 @@ import {
5352
} from '../../common/data/serialized-fragment';
5453
import { sequenceOptionEither } from '../../../../utils/option';
5554
import { identity } from 'fp-ts/lib/function';
55+
import {
56+
fromSerializedHeaderParameter,
57+
getSerializedHeaderParameterType,
58+
SerializedHeaderParameter,
59+
} from '../../common/data/serialized-header-parameters';
5660

5761
interface Parameters {
5862
readonly pathParameters: PathParameterObject[];
5963
readonly serializedPathParameters: SerializedPathParameter[];
6064
readonly serializedQueryParameter: Option<SerializedType>;
6165
readonly serializedBodyParameter: Option<SerializedType>;
62-
readonly headerParameters: HeaderParameterObject[];
66+
readonly serializedHeadersParameter: Option<SerializedType>;
6367
readonly formDataParameters: FormDataParameterObject[];
6468
readonly queryString: Option<SerializedFragment>;
6569
}
@@ -79,7 +83,7 @@ const getParameters = combineReader(
7983
const serializedPathParameters: SerializedPathParameter[] = [];
8084
const serializedQueryParameters: SerializedType[] = [];
8185
const bodyParameters: BodyParameterObject[] = [];
82-
const headerParameters: HeaderParameterObject[] = [];
86+
const serializedHeaderParameters: SerializedHeaderParameter[] = [];
8387
const formDataParameters: FormDataParameterObject[] = [];
8488
const queryStringFragments: SerializedFragment[] = [];
8589

@@ -129,7 +133,13 @@ const getParameters = combineReader(
129133
break;
130134
}
131135
case 'header': {
132-
headerParameters.push(resolved.right);
136+
const serializedParameter = pipe(
137+
serialized.right,
138+
fromSerializedHeaderParameter(resolved.right.name),
139+
getSerializedHeaderParameterType,
140+
);
141+
142+
serializedHeaderParameters.push(serializedParameter);
133143
break;
134144
}
135145
case 'formData': {
@@ -195,6 +205,16 @@ const getParameters = combineReader(
195205
sequenceOptionEither,
196206
);
197207

208+
const serializedHeadersParameter = pipe(
209+
nonEmptyArray.fromArray(serializedHeaderParameters),
210+
option.map(parameters =>
211+
pipe(
212+
intercalateSerializedTypes(serializedType(';', ',', [], []), parameters),
213+
getSerializedObjectType(),
214+
),
215+
),
216+
);
217+
198218
const queryString = pipe(
199219
nonEmptyArray.fromArray(queryStringFragments),
200220
option.map(queryStringFragments =>
@@ -215,7 +235,7 @@ const getParameters = combineReader(
215235
serializedPathParameters,
216236
serializedQueryParameter,
217237
serializedBodyParameter,
218-
headerParameters,
238+
serializedHeadersParameter,
219239
formDataParameters,
220240
queryString,
221241
}));
@@ -274,7 +294,8 @@ export const serializeOperationObject = combineReader(
274294
(parameters, serializedResponses, clientRef) => {
275295
const hasQueryParameters = isSome(parameters.serializedQueryParameter);
276296
const hasBodyParameters = isSome(parameters.serializedBodyParameter);
277-
const hasParameters = hasQueryParameters || hasBodyParameters;
297+
const hasHeaderParameters = isSome(parameters.serializedHeadersParameter);
298+
const hasParameters = hasQueryParameters || hasBodyParameters || hasHeaderParameters;
278299

279300
const bodyType = pipe(
280301
parameters.serializedBodyParameter,
@@ -298,10 +319,22 @@ export const serializeOperationObject = combineReader(
298319
option.getOrElse(() => ''),
299320
);
300321

322+
const headersType = pipe(
323+
parameters.serializedHeadersParameter,
324+
option.map(headers => `headers: ${headers.type}`),
325+
option.getOrElse(() => ''),
326+
);
327+
328+
const headersIO = pipe(
329+
parameters.serializedHeadersParameter,
330+
option.map(headers => `const headers = ${headers.io}.encode(parameters.headers)`),
331+
option.getOrElse(() => ''),
332+
);
333+
301334
const argsType = concatIf(
302335
hasParameters,
303336
parameters.serializedPathParameters.map(p => p.type),
304-
[`parameters: { ${queryType}${bodyType} }`],
337+
[`parameters: { ${queryType}${bodyType}${headersType} }`],
305338
).join(',');
306339

307340
const type = `
@@ -319,6 +352,7 @@ export const serializeOperationObject = combineReader(
319352
${operationName}: (${argsIO}) => {
320353
${bodyIO}
321354
${queryIO}
355+
${headersIO}
322356
323357
return e.httpClient.chain(
324358
e.httpClient.request({
@@ -327,6 +361,7 @@ export const serializeOperationObject = combineReader(
327361
responseType: '${responseType}',
328362
${when(hasQueryParameters, 'query,')}
329363
${when(hasBodyParameters, 'body,')}
364+
${when(hasHeaderParameters, 'headers')}
330365
}),
331366
value =>
332367
pipe(
@@ -359,6 +394,10 @@ export const serializeOperationObject = combineReader(
359394
parameters.queryString,
360395
option.map(p => p.dependencies),
361396
),
397+
pipe(
398+
parameters.serializedHeadersParameter,
399+
option.map(p => p.dependencies),
400+
),
362401
]),
363402
]),
364403
];

src/language/typescript/3.0/serializers/operation-object.ts

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ import {
6060
import { SchemaObjectCodec } from '../../../../schema/3.0/schema-object';
6161
import { lookup, keys } from 'fp-ts/lib/Record';
6262
import { ResponseObjectCodec } from '../../../../schema/3.0/response-object';
63+
import {
64+
fromSerializedHeaderParameter,
65+
getSerializedHeaderParameterType,
66+
SerializedHeaderParameter,
67+
} from '../../common/data/serialized-header-parameters';
6368

6469
const getOperationName = (pattern: string, operation: OperationObject, method: HTTPMethod): string =>
6570
pipe(
@@ -72,6 +77,7 @@ interface Parameters {
7277
readonly serializedPathParameters: SerializedPathParameter[];
7378
readonly serializedQueryParameter: Option<SerializedType>;
7479
readonly serializedBodyParameter: Option<SerializedType>;
80+
readonly serializedHeadersParameter: Option<SerializedType>;
7581
readonly serializedQueryString: Option<SerializedFragment>;
7682
}
7783

@@ -90,6 +96,7 @@ export const getParameters = combineReader(
9096
const serializedQueryParameters: SerializedType[] = [];
9197
let serializedBodyParameter: Option<SerializedType> = none;
9298
const queryStringFragments: SerializedFragment[] = [];
99+
const serializedHeaderParameters: SerializedHeaderParameter[] = [];
93100

94101
// note that PathItem parameters should go after OperationObject parameters because they have lower priority
95102
// this means that OperationObject can override PathItemObject parameters
@@ -137,6 +144,16 @@ export const getParameters = combineReader(
137144
serializedPathParameters.push(serializedParameter);
138145
break;
139146
}
147+
case 'header': {
148+
const serializedParameter = pipe(
149+
serialized.right,
150+
fromSerializedHeaderParameter(resolved.right.name),
151+
getSerializedHeaderParameterType,
152+
);
153+
154+
serializedHeaderParameters.push(serializedParameter);
155+
break;
156+
}
140157
case 'query': {
141158
const serializedParameter = getSerializedOptionalType(required, serialized.right);
142159
const schema = getParameterObjectSchema(resolved.right);
@@ -228,10 +245,21 @@ export const getParameters = combineReader(
228245
),
229246
);
230247

248+
const serializedHeadersParameter = pipe(
249+
nonEmptyArray.fromArray(serializedHeaderParameters),
250+
option.map(parameters =>
251+
pipe(
252+
intercalateSerializedTypes(serializedType(';', ',', [], []), parameters),
253+
getSerializedObjectType(),
254+
),
255+
),
256+
);
257+
231258
return right({
232259
pathParameters,
233260
serializedPathParameters,
234261
serializedQueryParameter,
262+
serializedHeadersParameter,
235263
serializedBodyParameter,
236264
serializedQueryString,
237265
});
@@ -289,7 +317,8 @@ export const serializeOperationObject = combineReader(
289317
(parameters, serializedResponses, clientRef) => {
290318
const hasQueryParameters = isSome(parameters.serializedQueryParameter);
291319
const hasBodyParameter = isSome(parameters.serializedBodyParameter);
292-
const hasParameters = hasQueryParameters || hasBodyParameter;
320+
const hasHeaderParameters = isSome(parameters.serializedHeadersParameter);
321+
const hasParameters = hasQueryParameters || hasBodyParameter || hasHeaderParameters;
293322

294323
const bodyType = pipe(
295324
parameters.serializedBodyParameter,
@@ -313,10 +342,22 @@ export const serializeOperationObject = combineReader(
313342
option.getOrElse(() => ''),
314343
);
315344

345+
const headersType = pipe(
346+
parameters.serializedHeadersParameter,
347+
option.map(headers => `headers: ${headers.type}`),
348+
option.getOrElse(() => ''),
349+
);
350+
351+
const headersIO = pipe(
352+
parameters.serializedHeadersParameter,
353+
option.map(headers => `const headers = ${headers.io}.encode(parameters.headers)`),
354+
option.getOrElse(() => ''),
355+
);
356+
316357
const argsType = concatIf(
317358
hasParameters,
318359
parameters.serializedPathParameters.map(p => p.type),
319-
[`parameters: { ${queryType}${bodyType} }`],
360+
[`parameters: { ${queryType}${bodyType}${headersType} }`],
320361
).join(',');
321362

322363
const type = `
@@ -334,6 +375,7 @@ export const serializeOperationObject = combineReader(
334375
${operationName}: (${argsIO}) => {
335376
${bodyIO}
336377
${queryIO}
378+
${headersIO}
337379
338380
return e.httpClient.chain(
339381
e.httpClient.request({
@@ -342,6 +384,7 @@ export const serializeOperationObject = combineReader(
342384
responseType: '${responseType}',
343385
${when(hasQueryParameters, 'query,')}
344386
${when(hasBodyParameter, 'body,')}
387+
${when(hasHeaderParameters, 'headers')}
345388
}),
346389
value =>
347390
pipe(
@@ -374,6 +417,10 @@ export const serializeOperationObject = combineReader(
374417
parameters.serializedQueryString,
375418
option.map(p => p.dependencies),
376419
),
420+
pipe(
421+
parameters.serializedHeadersParameter,
422+
option.map(p => p.dependencies),
423+
),
377424
]),
378425
]),
379426
];

src/language/typescript/common/bundled/client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const client = `
1919
readonly responseType: 'json' | 'blob' | 'text';
2020
readonly query?: string;
2121
readonly body?: unknown;
22+
readonly headers?: Record<string, unknown>;
2223
}
2324
2425
export interface HTTPClient<F> extends MonadThrow<F> {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { Ref, uniqRefs } from '../../../../utils/ref';
2+
import { getTypeName } from '../utils';
3+
import { serializedDependency, SerializedDependency, uniqSerializedDependencies } from './serialized-dependency';
4+
import { SerializedParameter } from './serialized-parameter';
5+
6+
export interface SerializedHeaderParameter extends SerializedParameter {
7+
readonly name: string;
8+
}
9+
10+
export const serializedHeaderParameter = (
11+
name: string,
12+
type: string,
13+
io: string,
14+
isRequired: boolean,
15+
dependencies: SerializedDependency[],
16+
refs: Ref[],
17+
): SerializedHeaderParameter => ({
18+
name,
19+
type,
20+
io,
21+
isRequired,
22+
dependencies: uniqSerializedDependencies(dependencies),
23+
refs: uniqRefs(refs),
24+
});
25+
26+
export const fromSerializedHeaderParameter = (name: string) => (
27+
serialized: SerializedParameter,
28+
): SerializedHeaderParameter => ({
29+
...serialized,
30+
name,
31+
});
32+
33+
export const getSerializedHeaderParameterType = (serialized: SerializedHeaderParameter): SerializedHeaderParameter => {
34+
const name = getTypeName(serialized.name);
35+
return serializedHeaderParameter(
36+
name,
37+
`${name}: ${serialized.isRequired ? serialized.type : `option.Option<${serialized.type}>`}`,
38+
`${name}: ${serialized.isRequired ? serialized.io : `optionFromNullable(${serialized.io})`}`,
39+
serialized.isRequired,
40+
serialized.dependencies.concat(
41+
serialized.isRequired
42+
? []
43+
: [
44+
serializedDependency('optionFromNullable', 'io-ts-types/lib/optionFromNullable'),
45+
serializedDependency('option', 'fp-ts'),
46+
],
47+
),
48+
serialized.refs,
49+
);
50+
};

0 commit comments

Comments
 (0)