diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java index 0046f1c98bc..2b761abafd9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java @@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; +import static org.apache.commons.lang3.StringUtils.capitalize; import static org.openapitools.codegen.utils.StringUtils.camelize; public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen { @@ -189,7 +190,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen if (!im.equals(cm.classname)) { HashMap tsImport = new HashMap<>(); tsImport.put("classname", im); - tsImport.put("filename", toModelFilename(im)); + tsImport.put("filename", toModelFilename(removeModelPrefixSuffix(im))); tsImports.add(tsImport); } } @@ -309,6 +310,20 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen return toApiFilename(name); } + private String removeModelPrefixSuffix(String name) { + String result = name; + final String prefix = capitalize(this.modelNamePrefix); + final String suffix = capitalize(this.modelNameSuffix); + + if (prefix.length() > 0 && result.startsWith(prefix)) { + result = result.substring(prefix.length()); + } + if (suffix.length() > 0 && result.endsWith(suffix)) { + result = result.substring(0, result.length() - suffix.length()); + } + return result; + } + @Override protected void addAdditionPropertiesToCodeGenModel(CodegenModel codegenModel, Schema schema) { super.addAdditionPropertiesToCodeGenModel(codegenModel, schema); 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 d48db3981e4..b950e55a645 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 @@ -1,6 +1,10 @@ package org.openapitools.codegen.typescript.typescriptnode; import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.media.ObjectSchema; +import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.media.StringSchema; +import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.TestUtils; import org.openapitools.codegen.languages.TypeScriptNodeClientCodegen; import org.testng.Assert; @@ -157,6 +161,64 @@ public class TypeScriptNodeClientCodegenTest { Assert.assertEquals(extractedImports.get(0).get("filename"), importName); } + @Test(description = "correctly produces imports with model name suffix") + public void postProcessOperationsWithModelsTestWithModelNameSuffix() { + final OpenAPI openAPI = TestUtils.createOpenAPI(); + final Schema rootSchema = new ObjectSchema() + .addProperties("child", new Schema().$ref("Child")); + final Schema childSchema = new ObjectSchema() + .addProperties("key", new StringSchema()); + + openAPI.getComponents() + .addSchemas("Root", rootSchema) + .addSchemas("Child", childSchema); + + final TypeScriptNodeClientCodegen codegen = new TypeScriptNodeClientCodegen(); + codegen.setModelNameSuffix("Suffix"); + + final HashMap allModels = createParameterForPostProcessAllModels( + codegen.fromModel("Root", rootSchema), + codegen.fromModel("Child", childSchema) + ); + final Map results = codegen.postProcessAllModels(allModels); + final Map root = (Map) results.get("Root"); + final List> modelsOfRoot = (List>) root.get("models"); + final List> tsImports = (List>) modelsOfRoot.get(0) + .get("tsImports"); + + Assert.assertEquals(tsImports.size(), 1); + Assert.assertEquals(tsImports.get(0).get("filename"), "./childSuffix"); + } + + @Test(description = "correctly produces imports with model name prefix") + public void postProcessOperationsWithModelsTestWithModelNamePrefix() { + final OpenAPI openAPI = TestUtils.createOpenAPI(); + final Schema rootSchema = new ObjectSchema() + .addProperties("child", new Schema().$ref("Child")); + final Schema childSchema = new ObjectSchema() + .addProperties("key", new StringSchema()); + + openAPI.getComponents() + .addSchemas("Root", rootSchema) + .addSchemas("Child", childSchema); + + final TypeScriptNodeClientCodegen codegen = new TypeScriptNodeClientCodegen(); + codegen.setModelNamePrefix("Prefix"); + + final HashMap allModels = createParameterForPostProcessAllModels( + codegen.fromModel("Root", rootSchema), + codegen.fromModel("Child", childSchema) + ); + final Map results = codegen.postProcessAllModels(allModels); + final Map root = (Map) results.get("Root"); + final List> modelsOfRoot = (List>) root.get("models"); + final List> tsImports = (List>) modelsOfRoot.get(0) + .get("tsImports"); + + Assert.assertEquals(tsImports.size(), 1); + Assert.assertEquals(tsImports.get(0).get("filename"), "./prefixChild"); + } + private Map createPostProcessOperationsMapWithImportName(String importName) { Map operations = new HashMap() {{ put("operation", Collections.emptyList()); @@ -174,4 +236,30 @@ public class TypeScriptNodeClientCodegenTest { put("imports", imports); }}; } + + private HashMap createParameterForPostProcessAllModels(CodegenModel root, CodegenModel child) { + return new HashMap() {{ + put("Child", new HashMap() {{ + put("models", Collections.singletonList( + new HashMap() {{ + put("importPath", "../model/child"); + put("model", child); + }} + )); + }}); + put("Root", new HashMap() {{ + put("models", Collections.singletonList( + new HashMap() {{ + put("importPath", "../model/root"); + put("model", root); + }} + )); + put("imports", Collections.singletonList( + new HashMap() {{ + put("import", "../model/child"); + }} + )); + }}); + }}; + } }