From b4f15819411936f0c0dc3f3be12f67036d16b9c9 Mon Sep 17 00:00:00 2001 From: Steven Masala Date: Mon, 29 Jul 2019 11:30:34 +0200 Subject: [PATCH] Fix: Remove spec 3 references keys in imports for TypeScript (#1932) * fix name sanitation when using kebab case filenaming * remove whitespaces * sanitize names by removing spec 3 ref keys * Revert "sanitize names by removing spec 3 ref keys" This reverts commit 7e58719317bb936884f5ed0049177ef961871464. * add pipes to datatype names * split imports * remove comment * fix when using a mixture of (any|one) and standard imports * sanitize names by removing spec 3 ref keys * Revert "sanitize names by removing spec 3 ref keys" This reverts commit 7e58719317bb936884f5ed0049177ef961871464. * Merge conflict DefMerge branch 'master' into name-ref-fix # Conflicts: # modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java * split imports * remove comment * fix when using a mixture of (any|one) and standard imports * Fix merge error import missing package, merge error. * format * fix tests * create test, fi regex --- .../openapitools/codegen/DefaultCodegen.java | 38 ++++++++++++++----- .../AbstractTypeScriptClientCodegen.java | 14 ++++++- .../TypeScriptAngularClientCodegen.java | 24 +++++++++++- .../TypeScriptAngularClientCodegenTest.java | 23 +++++++++++ .../TypeScriptNodeClientCodegenTest.java | 3 ++ 5 files changed, 91 insertions(+), 11 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 39415e2698d..661a7ab7f09 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4017,6 +4017,19 @@ public class DefaultCodegen implements CodegenConfig { * @return sanitized string */ public String sanitizeName(String name, String removeCharRegEx) { + return sanitizeName(name, removeCharRegEx, new ArrayList()); + } + + /** + * Sanitize name (parameter, property, method, etc) + * + * @param name string to be sanitize + * @param removeCharRegEx a regex containing all char that will be removed + * @param exceptionList a list of matches which should not be sanitized (i.e expections) + * @return sanitized string + */ + @SuppressWarnings("static-method") + public String sanitizeName(String name, String removeCharRegEx, ArrayList exceptionList) { // NOTE: performance wise, we should have written with 2 replaceAll to replace desired // character with _ or empty character. Below aims to spell out different cases we've // encountered so far and hopefully make it easier for others to add more special @@ -4034,27 +4047,27 @@ public class DefaultCodegen implements CodegenConfig { } // input[] => input - name = name.replaceAll("\\[\\]", ""); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + name = this.sanitizeValue(name, "\\[\\]", "", exceptionList); // input[a][b] => input_a_b - name = name.replaceAll("\\[", "_"); - name = name.replaceAll("\\]", ""); + name = this.sanitizeValue(name, "\\[", "_", exceptionList); + name = this.sanitizeValue(name, "\\]", "", exceptionList); // input(a)(b) => input_a_b - name = name.replaceAll("\\(", "_"); - name = name.replaceAll("\\)", ""); + name = this.sanitizeValue(name, "\\(", "_", exceptionList); + name = this.sanitizeValue(name, "\\)", "", exceptionList); // input.name => input_name - name = name.replaceAll("\\.", "_"); + name = this.sanitizeValue(name, "\\.", "_", exceptionList); // input-name => input_name - name = name.replaceAll("-", "_"); + name = this.sanitizeValue(name, "-", "_", exceptionList); // a|b => a_b - name = name.replace("|", "_"); + name = this.sanitizeValue(name, "\\|", "_", exceptionList); // input name and age => input_name_and_age - name = name.replaceAll(" ", "_"); + name = this.sanitizeValue(name, " ", "_", exceptionList); // /api/films/get => _api_films_get // \api\films\get => _api_films_get @@ -4072,6 +4085,13 @@ public class DefaultCodegen implements CodegenConfig { return name; } + private String sanitizeValue(String value, String replaceMatch, String replaceValue, ArrayList exceptionList) { + if (exceptionList.size() == 0 || !exceptionList.contains(replaceMatch)) { + return value.replaceAll(replaceMatch, replaceValue); + } + return value; + } + /** * Sanitize tag * diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 9e5e01123df..3646427b27d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -19,6 +19,7 @@ package org.openapitools.codegen.languages; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.ComposedSchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import org.apache.commons.io.FilenameUtils; @@ -266,7 +267,8 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp @Override public String toModelName(String name) { - name = sanitizeName(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + ArrayList exceptions = new ArrayList(Arrays.asList("\\|", " ")); + name = sanitizeName(name, "(?![| ])\\W", exceptions); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. if (!StringUtils.isEmpty(modelNamePrefix)) { name = modelNamePrefix + "_" + name; @@ -696,4 +698,14 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp } } } + + @Override + public String toAnyOfName(List names, ComposedSchema composedSchema) { + return String.join(" | ", names); + } + + @Override + public String toOneOfName(List names, ComposedSchema composedSchema) { + return String.join(" | ", names); + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java index 745e9747b2c..922628e2438 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java @@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; +import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.capitalize; import static org.openapitools.codegen.utils.StringUtils.*; @@ -458,12 +459,33 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode } } // Add additional filename information for imports - mo.put("tsImports", toTsImports(cm, cm.imports)); + Set parsedImports = parseImports(cm); + mo.put("tsImports", toTsImports(cm, parsedImports)); } } return result; } + /** + * Parse imports + */ + private Set parseImports(CodegenModel cm) { + Set newImports = new HashSet(); + if (cm.imports.size() > 0) { + for (String name : cm.imports) { + if (name.indexOf(" | ") >= 0) { + String[] parts = name.split(" \\| "); + for (String s : parts) { + newImports.add(s); + } + } else { + newImports.add(name); + } + } + } + return newImports; + } + private List> toTsImports(CodegenModel cm, Set imports) { List> tsImports = new ArrayList<>(); for (String im : imports) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java index 21cb66f7767..8adc9328ec5 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java @@ -3,6 +3,8 @@ package org.openapitools.codegen.typescript.typescriptangular; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; +import io.swagger.v3.oas.models.media.ComposedSchema; +import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import org.openapitools.codegen.CodegenOperation; @@ -109,4 +111,25 @@ public class TypeScriptAngularClientCodegenTest { Assert.assertEquals("TestName", codegen.removeModelPrefixSuffix("TestNameDefGhi")); } + @Test + public void testSchema() { + TypeScriptAngularClientCodegen codegen = new TypeScriptAngularClientCodegen(); + + ComposedSchema composedSchema = new ComposedSchema(); + + Schema schema1 = new Schema<>(); + schema1.set$ref("SchemaOne"); + Schema schema2 = new Schema<>(); + schema2.set$ref("SchemaTwo"); + Schema schema3 = new Schema<>(); + schema3.set$ref("SchemaThree"); + + composedSchema.addAnyOfItem(schema1); + composedSchema.addAnyOfItem(schema2); + composedSchema.addAnyOfItem(schema3); + + String schemaType = codegen.getSchemaType(composedSchema); + Assert.assertEquals(schemaType, "SchemaOne | SchemaTwo | SchemaThree"); + } + } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptnode/TypeScriptNodeClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptnode/TypeScriptNodeClientCodegenTest.java index b4372c0e73e..5cce4a425ea 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptnode/TypeScriptNodeClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptnode/TypeScriptNodeClientCodegenTest.java @@ -18,6 +18,7 @@ public class TypeScriptNodeClientCodegenTest { @Test public void convertVarName() throws Exception { + TypeScriptNodeClientCodegen codegen = new TypeScriptNodeClientCodegen(); Assert.assertEquals(codegen.toVarName("name"), "name"); Assert.assertEquals(codegen.toVarName("$name"), "$name"); Assert.assertEquals(codegen.toVarName("nam$$e"), "nam$$e"); @@ -30,6 +31,7 @@ public class TypeScriptNodeClientCodegenTest { @Test public void testSnapshotVersion() { OpenAPI api = TestUtils.createOpenAPI(); + TypeScriptNodeClientCodegen codegen = new TypeScriptNodeClientCodegen(); codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore"); codegen.additionalProperties().put("snapshot", true); @@ -52,6 +54,7 @@ public class TypeScriptNodeClientCodegenTest { @Test public void testWithoutSnapshotVersion() { OpenAPI api = TestUtils.createOpenAPI(); + TypeScriptNodeClientCodegen codegen = new TypeScriptNodeClientCodegen(); codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore"); codegen.additionalProperties().put("snapshot", false);