Skip to content

Commit 1a10578

Browse files
committed
Extract reusable logic into central functions
1 parent 701b6bd commit 1a10578

3 files changed

Lines changed: 81 additions & 89 deletions

File tree

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

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ import { BaseServerConfiguration, server1 } from "./servers{{importFileExtension
1212
import { configureAuthMethods, AuthMethods, AuthMethodsConfiguration } from "./auth/auth{{importFileExtension}}";
1313

1414
export interface Configuration<M = Middleware> {
15-
readonly baseServer: BaseServerConfiguration;
16-
readonly httpApi: HttpLibrary;
17-
readonly middleware: M[];
18-
readonly authMethods: AuthMethods;
15+
readonly baseServer: BaseServerConfiguration;
16+
readonly httpApi: HttpLibrary;
17+
readonly middleware: M[];
18+
readonly authMethods: AuthMethods;
1919
}
2020

2121
// Additional option specific to middleware merge strategy
2222
export interface MiddlewareMergeOptions {
2323
// default is `'replace'` for backwards compatibility
24-
middlewareMergeStrategy?: 'replace' | 'append' | 'prepend';
24+
middlewareMergeStrategy?: "replace" | "append" | "prepend";
2525
}
2626

2727
// Unify configuration options using Partial plus extra merge strategy
@@ -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,60 @@ 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+
return options || conf;
109+
}
110+
{{/useInversify}}
111+
{{^useInversify}}
112+
export function mergeConfiguration(conf: Configuration, options?: ConfigurationOptions): Configuration {
113+
if (!options) {
114+
return conf;
115+
}
116+
let allMiddleware: Middleware[] = [];
117+
return {
118+
baseServer: options.baseServer || conf.baseServer,
119+
httpApi: options.httpApi || conf.httpApi,
120+
authMethods: options.authMethods || conf.authMethods,
121+
middleware: mergeMiddleware(conf.middleware, options?.middleware, options?.middlewareMergeStrategy),
122+
};
123+
}
124+
125+
function mergeMiddleware(staticMiddleware: Middleware[], calltimeMiddleware?: Middleware[], strategy?: "append" | "prepend" | "replace") {
126+
if (!calltimeMiddleware) {
127+
return staticMiddleware;
128+
}
129+
// default to replace behavior
130+
switch(strategy ?? "replace") {
131+
case "append":
132+
return staticMiddleware.concat(calltimeMiddleware);
133+
case "prepend":
134+
return calltimeMiddleware.concat(staticMiddleware)
135+
case "replace":
136+
return calltimeMiddleware
137+
}
138+
throw new Error(`Unrecognized middleware merge strategy '${strategy}'`)
139+
}
140+
{{/useInversify}}
141+
142+
/**
143+
* Convert Promise-based configuration options to Observable-based configuration options.
144+
*/
145+
export function wrapOptions(options?: PromiseConfigurationOptions): StandardConfigurationOptions | undefined {
146+
if (!options) {
147+
return;
148+
}
149+
return {
150+
baseServer: options.baseServer,
151+
httpApi: options.httpApi,
152+
middleware: options.middleware?.map(
153+
m => new PromiseMiddlewareWrapper(m)
154+
),
155+
middlewareMergeStrategy: options.middlewareMergeStrategy,
156+
authMethods: options.authMethods
157+
}
158+
}

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

Lines changed: 5 additions & 42 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,18 @@ 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}}
103-
66+
const _config = mergeConfiguration(this.configuration, _options);
10467
const requestContextPromise = this.requestFactory.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}{{#useInversify}}_options{{/useInversify}}{{^useInversify}}_config{{/useInversify}});
10568
// build promise chain
10669
let middlewarePreObservable = from<RequestContext>(requestContextPromise);
107-
for (const middleware of allMiddleware) {
70+
for (const middleware of _config.middleware) {
10871
middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx)));
10972
}
11073

111-
return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))).
74+
return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => _config.httpApi.send(ctx))).
11275
pipe(mergeMap((response: ResponseContext) => {
11376
let middlewarePostObservable = of(response);
114-
for (const middleware of allMiddleware.reverse()) {
77+
for (const middleware of _config.middleware.reverse()) {
11578
middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp)));
11679
}
11780
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 & 31 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}}, ConfigurationOptions, PromiseConfigurationOptions, wrapOptions{{/useInversify}} } from '../configuration{{importFileExtension}}'
33
{{^useInversify}}
44
import { PromiseMiddleware, Middleware, PromiseMiddlewareWrapper } from '../middleware{{importFileExtension}}';
55
{{/useInversify}}
@@ -55,21 +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}}
72-
const result = this.api.{{nickname}}WithHttpInfo({{#allParams}}{{paramName}}, {{/allParams}}observableOptions);
58+
const result = this.api.{{nickname}}WithHttpInfo({{#allParams}}{{paramName}}, {{/allParams}}{{#useInversify}}_options{{/useInversify}}{{^useInversify}}wrapOptions(_options){{/useInversify}});
7359
return result.toPromise();
7460
}
7561

@@ -85,21 +71,7 @@ export class Promise{{classname}} {
8571
{{/allParams}}
8672
*/
8773
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}}
102-
const result = this.api.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}observableOptions);
74+
const result = this.api.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}{{#useInversify}}_options{{/useInversify}}{{^useInversify}}wrapOptions(_options){{/useInversify}});
10375
return result.toPromise();
10476
}
10577

0 commit comments

Comments
 (0)