Skip to content

Commit 7881152

Browse files
authored
[typescript] Avoid code duplication (#20978)
* Update test dependencies to make them run * Use spaces instead of tabs * Remove duplicate test * Remove unused variable * Add failing test for missing options * Move config merge logic into shared function * Regenerate samples * Move option wrap logic into shared function * Regenerate samples * Inline wrapOptions call * Regenerate samples * Clean up code formatting * Regenerate samples * Separate mergeConfiguration definitions * Regenerate samples * Rename parameters * Regenerate samples * Add missing semicolon * Revert inlining wrapOptions call * Revert format changes in untouched lines
1 parent a8d56fd commit 7881152

62 files changed

Lines changed: 6274 additions & 24283 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-generator/src/main/resources/typescript/configuration.mustache

Lines changed: 74 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,44 +36,44 @@ export type PromiseConfigurationOptions = ConfigurationOptions<PromiseMiddleware
3636
*/
3737
export interface ConfigurationParameters {
3838
/**
39-
* Default server to use - a list of available servers (according to the
39+
* Default server to use - a list of available servers (according to the
4040
* OpenAPI yaml definition) is included in the `servers` const in `./servers`. You can also
41-
* create your own server with the `ServerConfiguration` class from the same
41+
* create your own server with the `ServerConfiguration` class from the same
4242
* file.
4343
*/
4444
baseServer?: BaseServerConfiguration;
4545
/**
46-
* HTTP library to use e.g. IsomorphicFetch. This can usually be skipped as
46+
* HTTP library to use e.g. IsomorphicFetch. This can usually be skipped as
4747
* all generators come with a default library.
4848
* If available, additional libraries can be imported from `./http/*`
4949
*/
5050
httpApi?: HttpLibrary;
5151
5252
/**
53-
* The middlewares which will be applied to requests and responses. You can
54-
* add any number of middleware components to modify requests before they
53+
* The middlewares which will be applied to requests and responses. You can
54+
* add any number of middleware components to modify requests before they
5555
* are sent or before they are deserialized by implementing the `Middleware`
5656
* interface defined in `./middleware`
5757
*/
5858
middleware?: Middleware[];
5959
/**
60-
* Configures middleware functions that return promises instead of
61-
* Observables (which are used by `middleware`). Otherwise allows for the
62-
* same functionality as `middleware`, i.e., modifying requests before they
60+
* Configures middleware functions that return promises instead of
61+
* Observables (which are used by `middleware`). Otherwise allows for the
62+
* same functionality as `middleware`, i.e., modifying requests before they
6363
* are sent and before they are deserialized.
6464
*/
6565
promiseMiddleware?: PromiseMiddleware[];
6666
/**
67-
* Configuration for the available authentication methods (e.g., api keys)
68-
* according to the OpenAPI yaml definition. For the definition, please refer to
67+
* Configuration for the available authentication methods (e.g., api keys)
68+
* according to the OpenAPI yaml definition. For the definition, please refer to
6969
* `./auth/auth`
7070
*/
7171
authMethods?: AuthMethodsConfiguration
7272
}
7373

7474
/**
7575
* Provide your `ConfigurationParameters` to this function to get a `Configuration`
76-
* object that can be used to configure your APIs (in the constructor or
76+
* object that can be used to configure your APIs (in the constructor or
7777
* for each request individually).
7878
*
7979
* If a property is not included in conf, a default is used:
@@ -99,3 +99,66 @@ export function createConfiguration(conf: ConfigurationParameters = {}): Configu
9999
}
100100
return configuration;
101101
}
102+
103+
/**
104+
* Merge configuration options into a configuration.
105+
*/
106+
{{#useInversify}}
107+
export function mergeConfiguration(conf: Configuration, options?: Configuration): Configuration {
108+
if (options) {
109+
conf = options;
110+
}
111+
return conf;
112+
}
113+
{{/useInversify}}
114+
{{^useInversify}}
115+
export function mergeConfiguration(conf: Configuration, options?: ConfigurationOptions): Configuration {
116+
let allMiddleware: Middleware[] = [];
117+
if (options && options.middleware) {
118+
const middlewareMergeStrategy = options.middlewareMergeStrategy || "replace" // default to replace behavior
119+
// call-time middleware provided
120+
const calltimeMiddleware: Middleware[] = options.middleware;
121+
122+
switch(middlewareMergeStrategy) {
123+
case "append":
124+
allMiddleware = conf.middleware.concat(calltimeMiddleware);
125+
break;
126+
case "prepend":
127+
allMiddleware = calltimeMiddleware.concat(conf.middleware)
128+
break;
129+
case "replace":
130+
allMiddleware = calltimeMiddleware
131+
break;
132+
default:
133+
throw new Error(`unrecognized middleware merge strategy '${middlewareMergeStrategy}'`);
134+
}
135+
}
136+
if (options) {
137+
conf = {
138+
baseServer: options.baseServer || conf.baseServer,
139+
httpApi: options.httpApi || conf.httpApi,
140+
authMethods: options.authMethods || conf.authMethods,
141+
middleware: allMiddleware || conf.middleware
142+
};
143+
}
144+
return conf;
145+
}
146+
{{/useInversify}}
147+
148+
/**
149+
* Convert Promise-based configuration options to Observable-based configuration options.
150+
*/
151+
export function wrapOptions(options?: PromiseConfigurationOptions): StandardConfigurationOptions | undefined {
152+
if (options) {
153+
return {
154+
baseServer: options.baseServer,
155+
httpApi: options.httpApi,
156+
middleware: options.middleware?.map(
157+
m => new PromiseMiddlewareWrapper(m)
158+
),
159+
middlewareMergeStrategy: options.middlewareMergeStrategy,
160+
authMethods: options.authMethods,
161+
};
162+
}
163+
return;
164+
}

modules/openapi-generator/src/main/resources/typescript/types/ObservableAPI.mustache

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ResponseContext, RequestContext, HttpFile, HttpInfo } from '../http/http{{importFileExtension}}';
2-
import { Configuration{{^useInversify}}, ConfigurationOptions{{/useInversify}} } from '../configuration{{importFileExtension}}'
2+
import { Configuration{{^useInversify}}, ConfigurationOptions{{/useInversify}}, mergeConfiguration } from '../configuration{{importFileExtension}}'
33
import type { Middleware } from '../middleware{{importFileExtension}}';
44
import { Observable, of, from } from {{#useRxJS}}'rxjs'{{/useRxJS}}{{^useRxJS}}'../rxjsStub{{importFileExtension}}'{{/useRxJS}};
55
import {mergeMap, map} from {{#useRxJS}}'rxjs/operators'{{/useRxJS}}{{^useRxJS}}'../rxjsStub{{importFileExtension}}'{{/useRxJS}};
@@ -63,55 +63,19 @@ export class Observable{{classname}} {
6363
{{/allParams}}
6464
*/
6565
public {{nickname}}WithHttpInfo({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}_options?: Configuration{{^useInversify}}Options{{/useInversify}}): Observable<HttpInfo<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
66-
let _config = this.configuration;
67-
let allMiddleware: Middleware[] = [];
68-
{{#useInversify}}
69-
if (_options){
70-
_config = _options;
71-
}
72-
allMiddleware = _config?.middleware;
73-
{{/useInversify}}
74-
{{^useInversify}}
75-
if (_options && _options.middleware){
76-
const middlewareMergeStrategy = _options.middlewareMergeStrategy || 'replace' // default to replace behavior
77-
// call-time middleware provided
78-
const calltimeMiddleware: Middleware[] = _options.middleware;
79-
80-
switch(middlewareMergeStrategy){
81-
case 'append':
82-
allMiddleware = this.configuration.middleware.concat(calltimeMiddleware);
83-
break;
84-
case 'prepend':
85-
allMiddleware = calltimeMiddleware.concat(this.configuration.middleware)
86-
break;
87-
case 'replace':
88-
allMiddleware = calltimeMiddleware
89-
break;
90-
default:
91-
throw new Error(`unrecognized middleware merge strategy '${middlewareMergeStrategy}'`)
92-
}
93-
}
94-
if (_options){
95-
_config = {
96-
baseServer: _options.baseServer || this.configuration.baseServer,
97-
httpApi: _options.httpApi || this.configuration.httpApi,
98-
authMethods: _options.authMethods || this.configuration.authMethods,
99-
middleware: allMiddleware || this.configuration.middleware
100-
};
101-
}
102-
{{/useInversify}}
66+
const _config = mergeConfiguration(this.configuration, _options);
10367
10468
const requestContextPromise = this.requestFactory.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}{{#useInversify}}_options{{/useInversify}}{{^useInversify}}_config{{/useInversify}});
10569
// build promise chain
10670
let middlewarePreObservable = from<RequestContext>(requestContextPromise);
107-
for (const middleware of allMiddleware) {
71+
for (const middleware of _config.middleware) {
10872
middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx)));
10973
}
11074

11175
return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))).
11276
pipe(mergeMap((response: ResponseContext) => {
11377
let middlewarePostObservable = of(response);
114-
for (const middleware of allMiddleware.reverse()) {
78+
for (const middleware of _config.middleware.reverse()) {
11579
middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp)));
11680
}
11781
return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.{{nickname}}WithHttpInfo(rsp)));

modules/openapi-generator/src/main/resources/typescript/types/PromiseAPI.mustache

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ResponseContext, RequestContext, HttpFile, HttpInfo } from '../http/http{{importFileExtension}}';
2-
import { Configuration{{^useInversify}}, ConfigurationOptions, PromiseConfigurationOptions{{/useInversify}} } from '../configuration{{importFileExtension}}'
2+
import { Configuration{{^useInversify}}, PromiseConfigurationOptions, wrapOptions{{/useInversify}} } from '../configuration{{importFileExtension}}'
33
{{^useInversify}}
44
import { PromiseMiddleware, Middleware, PromiseMiddlewareWrapper } from '../middleware{{importFileExtension}}';
55
{{/useInversify}}
@@ -55,20 +55,7 @@ export class Promise{{classname}} {
5555
{{/allParams}}
5656
*/
5757
public {{nickname}}WithHttpInfo({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}_options?: {{#useInversify}}Configuration{{/useInversify}}{{^useInversify}}PromiseConfigurationOptions{{/useInversify}}): Promise<HttpInfo<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
58-
let observableOptions: undefined | Configuration{{^useInversify}}Options{{/useInversify}}{{#useInversify}} = _options{{/useInversify}}
59-
{{^useInversify}}
60-
if (_options){
61-
observableOptions = {
62-
baseServer: _options.baseServer,
63-
httpApi: _options.httpApi,
64-
middleware: _options.middleware?.map(
65-
m => new PromiseMiddlewareWrapper(m)
66-
),
67-
middlewareMergeStrategy: _options.middlewareMergeStrategy,
68-
authMethods: _options.authMethods
69-
}
70-
}
71-
{{/useInversify}}
58+
const observableOptions = {{#useInversify}}_options{{/useInversify}}{{^useInversify}}wrapOptions(_options){{/useInversify}};
7259
const result = this.api.{{nickname}}WithHttpInfo({{#allParams}}{{paramName}}, {{/allParams}}observableOptions);
7360
return result.toPromise();
7461
}
@@ -85,20 +72,7 @@ export class Promise{{classname}} {
8572
{{/allParams}}
8673
*/
8774
public {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}_options?: {{#useInversify}}Configuration{{/useInversify}}{{^useInversify}}PromiseConfigurationOptions{{/useInversify}}): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}> {
88-
let observableOptions: undefined | Configuration{{^useInversify}}Options{{/useInversify}}{{#useInversify}} = _options{{/useInversify}}
89-
{{^useInversify}}
90-
if (_options){
91-
observableOptions = {
92-
baseServer: _options.baseServer,
93-
httpApi: _options.httpApi,
94-
middleware: _options.middleware?.map(
95-
m => new PromiseMiddlewareWrapper(m)
96-
),
97-
middlewareMergeStrategy: _options.middlewareMergeStrategy,
98-
authMethods: _options.authMethods
99-
}
100-
}
101-
{{/useInversify}}
75+
const observableOptions = {{#useInversify}}_options{{/useInversify}}{{^useInversify}}wrapOptions(_options){{/useInversify}};
10276
const result = this.api.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}observableOptions);
10377
return result.toPromise();
10478
}

samples/client/echo_api/typescript/build/configuration.ts

Lines changed: 64 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)