From ae4e2515dcc82da57a200a22122cfec98bf64606 Mon Sep 17 00:00:00 2001 From: Tobias Brauneis <34739665+tobifb@users.noreply.github.com> Date: Thu, 31 Oct 2024 07:48:45 +0100 Subject: [PATCH] add parameter 'useURLSearchParams' to use JS build-in UrlSearchParams, instead of deprecated npm lib 'querystring' (#19949) --- docs/generators/javascript.md | 1 + .../codegen/languages/JavascriptClientCodegen.java | 10 ++++++++++ .../libraries/javascript/ApiClient.mustache | 13 ++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/generators/javascript.md b/docs/generators/javascript.md index 2c4a02eee8f..e8b1fa4b511 100644 --- a/docs/generators/javascript.md +++ b/docs/generators/javascript.md @@ -43,6 +43,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |sourceFolder|source folder for generated code| |src| |useInheritance|use JavaScript prototype chains & delegation for inheritance| |true| |usePromises|use Promises as return values from the client API, instead of superagent callbacks| |false| +|useURLSearchParams|use JS build-in UrlSearchParams, instead of deprecated npm lib 'querystring'| |false| ## IMPORT MAPPING diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java index a03647b9106..06d0c634ae8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java @@ -57,6 +57,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo public static final String EMIT_JS_DOC = "emitJSDoc"; public static final String USE_ES6 = "useES6"; public static final String NPM_REPOSITORY = "npmRepository"; + public static final String USE_URL_SEARCH_PARAMS = "useURLSearchParams"; public static final String LIBRARY_JAVASCRIPT = "javascript"; public static final String LIBRARY_APOLLO = "apollo"; @@ -80,6 +81,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo protected boolean useES6 = true; // default is ES6 @Setter protected String npmRepository = null; @Getter private String modelPropertyNaming = "camelCase"; + @Setter protected boolean useURLSearchParams = false; public JavascriptClientCodegen() { super(); @@ -190,6 +192,10 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo .defaultValue(Boolean.TRUE.toString())); cliOptions.add(new CliOption(CodegenConstants.MODEL_PROPERTY_NAMING, CodegenConstants.MODEL_PROPERTY_NAMING_DESC).defaultValue("camelCase")); cliOptions.add(new CliOption(NPM_REPOSITORY, "Use this property to set an url your private npmRepo in the package.json")); + cliOptions.add(new CliOption(USE_URL_SEARCH_PARAMS, + "use JS build-in UrlSearchParams, instead of deprecated npm lib 'querystring'") + .defaultValue(Boolean.FALSE.toString()) + ); supportedLibraries.put(LIBRARY_JAVASCRIPT, "JavaScript client library"); supportedLibraries.put(LIBRARY_APOLLO, "Apollo REST DataSource"); @@ -267,6 +273,9 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (additionalProperties.containsKey(NPM_REPOSITORY)) { setNpmRepository(((String) additionalProperties.get(NPM_REPOSITORY))); } + if (additionalProperties.containsKey(USE_URL_SEARCH_PARAMS)) { + setUseURLSearchParams(convertPropertyToBooleanAndWriteBack(USE_URL_SEARCH_PARAMS)); + } if (additionalProperties.containsKey(CodegenConstants.LIBRARY)) { setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY)); } @@ -334,6 +343,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo additionalProperties.put(EMIT_JS_DOC, emitJSDoc); additionalProperties.put(USE_ES6, useES6); additionalProperties.put(NPM_REPOSITORY, npmRepository); + additionalProperties.put(USE_URL_SEARCH_PARAMS, useURLSearchParams); // make api and model doc path available in mustache template additionalProperties.put("apiDocPath", apiDocPath); diff --git a/modules/openapi-generator/src/main/resources/Javascript/libraries/javascript/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Javascript/libraries/javascript/ApiClient.mustache index 542398b7f03..77bdd5ff1ea 100644 --- a/modules/openapi-generator/src/main/resources/Javascript/libraries/javascript/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Javascript/libraries/javascript/ApiClient.mustache @@ -1,7 +1,10 @@ {{>licenseInfo}} import superagent from "superagent"; +{{^useURLSearchParams}} import querystring from "querystring"; +{{! see https://www.npmjs.com/package/querystring && https://github.com/Gozala/querystring }} +{{/useURLSearchParams}} {{#emitJSDoc}}/** * @module {{#invokerPackage}}{{.}}/{{/invokerPackage}}ApiClient @@ -455,7 +458,15 @@ class ApiClient { } if (contentType === 'application/x-www-form-urlencoded') { - request.send(querystring.stringify(this.normalizeParams(formParams))); + {{^useURLSearchParams}} + let queryString = querystring.stringify(this.normalizeParams(formParams)); + {{/useURLSearchParams}} + {{#useURLSearchParams}} + let normalizedParams = this.normalizeParams(formParams) + let urlSearchParams = new URLSearchParams(normalizedParams); + let queryString = urlSearchParams.toString(); + {{/useURLSearchParams}} + request.send(queryString); } else if (contentType == 'multipart/form-data') { var _formParams = this.normalizeParams(formParams); for (var key in _formParams) {