Skip to content

Commit 8e329fe

Browse files
authored
[typescript] Use static middleware when calltime options exist but specify no middleware (#20985)
* Keep static middleware when options contain no middleware field * Regenerate samples * Fix indentation and quotes * Extract middleware merge logic into function * Regenerate samples * Simplify extracted functions * Regenerate samples * Fix: Pass static config when no options are given for inversify * Fix: Allow overriding http api with options * Regenerate samples * Use default parameter for default middlware merge strategy * Throw exception for failed match within switch block
1 parent 7881152 commit 8e329fe

File tree

33 files changed

+721
-748
lines changed

33 files changed

+721
-748
lines changed

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

Lines changed: 26 additions & 33 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 {
23-
// default is `'replace'` for backwards compatibility
24-
middlewareMergeStrategy?: 'replace' | 'append' | 'prepend';
23+
// default is `"replace"` for backwards compatibility
24+
middlewareMergeStrategy?: "replace" | "append" | "prepend";
2525
}
2626

2727
// Unify configuration options using Partial plus extra merge strategy
@@ -105,43 +105,36 @@ export function createConfiguration(conf: ConfigurationParameters = {}): Configu
105105
*/
106106
{{#useInversify}}
107107
export function mergeConfiguration(conf: Configuration, options?: Configuration): Configuration {
108-
if (options) {
109-
conf = options;
110-
}
111-
return conf;
108+
return options || conf;
112109
}
113110
{{/useInversify}}
114111
{{^useInversify}}
115112
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;
113+
if (!options) {
114+
return conf;
115+
}
116+
return {
117+
baseServer: options.baseServer || conf.baseServer,
118+
httpApi: options.httpApi || conf.httpApi,
119+
authMethods: options.authMethods || conf.authMethods,
120+
middleware: mergeMiddleware(conf.middleware, options?.middleware, options?.middlewareMergeStrategy),
121+
};
122+
}
121123

122-
switch(middlewareMergeStrategy) {
124+
function mergeMiddleware(staticMiddleware: Middleware[], calltimeMiddleware?: Middleware[], strategy: "append" | "prepend" | "replace" = "replace") {
125+
if (!calltimeMiddleware) {
126+
return staticMiddleware;
127+
}
128+
switch(strategy) {
123129
case "append":
124-
allMiddleware = conf.middleware.concat(calltimeMiddleware);
125-
break;
130+
return staticMiddleware.concat(calltimeMiddleware);
126131
case "prepend":
127-
allMiddleware = calltimeMiddleware.concat(conf.middleware)
128-
break;
132+
return calltimeMiddleware.concat(staticMiddleware)
129133
case "replace":
130-
allMiddleware = calltimeMiddleware
131-
break;
134+
return calltimeMiddleware
132135
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-
};
136+
throw new Error(`Unrecognized middleware merge strategy '${strategy}'`)
143137
}
144-
return conf;
145138
}
146139
{{/useInversify}}
147140

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@ export class Observable{{classname}} {
6565
public {{nickname}}WithHttpInfo({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}_options?: Configuration{{^useInversify}}Options{{/useInversify}}): Observable<HttpInfo<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
6666
const _config = mergeConfiguration(this.configuration, _options);
6767
68-
const requestContextPromise = this.requestFactory.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}{{#useInversify}}_options{{/useInversify}}{{^useInversify}}_config{{/useInversify}});
68+
const requestContextPromise = this.requestFactory.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}_config);
6969
// build promise chain
7070
let middlewarePreObservable = from<RequestContext>(requestContextPromise);
7171
for (const middleware of _config.middleware) {
7272
middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx)));
7373
}
7474

75-
return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))).
75+
return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => _config.httpApi.send(ctx))).
7676
pipe(mergeMap((response: ResponseContext) => {
7777
let middlewarePostObservable = of(response);
7878
for (const middleware of _config.middleware.reverse()) {

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

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

0 commit comments

Comments
 (0)