From ca5d3840819039856c7d0ac29b1712ab8ac5cbca Mon Sep 17 00:00:00 2001 From: Mahir Kothary Date: Thu, 17 Sep 2020 18:46:39 -0700 Subject: [PATCH] [bug][typescript] Fix node client generator import file paths (#7410) --- .../TypeScriptNodeClientCodegen.java | 14 +++--- .../typescript-node/api-single.mustache | 2 +- .../TypeScriptNodeClientCodegenTest.java | 44 ++++++++++++++++++- 3 files changed, 48 insertions(+), 12 deletions(-) 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 09d5ae4df4e..0016d23595d 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 @@ -36,7 +36,8 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen private static final Logger LOGGER = LoggerFactory.getLogger(TypeScriptNodeClientCodegen.class); public static final String NPM_REPOSITORY = "npmRepository"; - private static final String DEFAULT_IMPORT_PREFIX = "./"; + private static final String DEFAULT_MODEL_FILENAME_DIRECTORY_PREFIX = "./"; + private static final String DEFAULT_MODEL_IMPORT_DIRECTORY_PREFIX = "../"; protected String npmRepository = null; protected String apiSuffix = "Api"; @@ -153,7 +154,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen return importMapping.get(name); } - return DEFAULT_IMPORT_PREFIX + camelize(toModelName(name), true); + return DEFAULT_MODEL_FILENAME_DIRECTORY_PREFIX + camelize(toModelName(name), true); } @Override @@ -162,7 +163,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen return importMapping.get(name); } - return modelPackage() + "/" + camelize(toModelName(name), true); + return DEFAULT_MODEL_IMPORT_DIRECTORY_PREFIX + modelPackage() + "/" + camelize(toModelName(name), true); } @Override @@ -222,8 +223,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen // Add additional filename information for model imports in the apis List> imports = (List>) operations.get("imports"); for (Map im : imports) { - im.put("filename", im.get("import")); - im.put("classname", getModelnameFromModelFilename(im.get("filename").toString())); + im.put("filename", im.get("import").toString()); } return operations; @@ -309,10 +309,6 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen return toApiFilename(name); } - private String getModelnameFromModelFilename(String filename) { - String name = filename.substring((modelPackage() + File.separator).length()); - return camelize(name); - } @Override protected void addAdditionPropertiesToCodeGenModel(CodegenModel codegenModel, Schema schema) { super.addAdditionPropertiesToCodeGenModel(codegenModel, schema); diff --git a/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache b/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache index 97d4a27f93f..84d6739fa28 100644 --- a/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache @@ -5,7 +5,7 @@ import http from 'http'; /* tslint:disable:no-unused-locals */ {{#imports}} -import { {{classname}} } from '../{{filename}}'; +import { {{classname}} } from '{{filename}}'; {{/imports}} import { ObjectSerializer, Authentication, VoidAuth, Interceptor } from '../model/models'; 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 5cce4a425ea..d48db3981e4 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 @@ -7,6 +7,8 @@ import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.util.*; + public class TypeScriptNodeClientCodegenTest { private TypeScriptNodeClientCodegen codegen; @@ -87,9 +89,9 @@ public class TypeScriptNodeClientCodegenTest { Assert.assertEquals(codegen.toModelFilename("ApiResponse"), mappedName); } - @Test(description = "prepend model import with ./ by default") + @Test(description = "prepend model import with ../model by default") public void defaultModelImportTest() { - Assert.assertEquals(codegen.toModelImport("ApiResponse"), "model/apiResponse"); + Assert.assertEquals(codegen.toModelImport("ApiResponse"), "../model/apiResponse"); } @Test(description = "use mapped name for model import when provided") @@ -134,4 +136,42 @@ public class TypeScriptNodeClientCodegenTest { Assert.assertEquals(codegen.toApiImport("Category"), mappedName); } + @Test(description = "correctly produces imports without import mapping") + public void postProcessOperationsWithModelsTestWithoutImportMapping() { + final String importName = "../model/pet"; + Map operations = createPostProcessOperationsMapWithImportName(importName); + + codegen.postProcessOperationsWithModels(operations, Collections.emptyList()); + List> extractedImports = (List>) operations.get("imports"); + Assert.assertEquals(extractedImports.get(0).get("filename"), importName); + } + + @Test(description = "correctly produces imports with import mapping") + public void postProcessOperationsWithModelsTestWithImportMapping() { + final String importName = "@namespace/dir/category"; + Map operations = createPostProcessOperationsMapWithImportName(importName); + + codegen.postProcessOperationsWithModels(operations, Collections.emptyList()); + List> extractedImports = (List>) operations.get("imports"); + + Assert.assertEquals(extractedImports.get(0).get("filename"), importName); + } + + private Map createPostProcessOperationsMapWithImportName(String importName) { + Map operations = new HashMap() {{ + put("operation", Collections.emptyList()); + put("classname", "Pet"); + }}; + + Map importList = new HashMap() {{ + put("import", importName); + put("classname", "Pet"); + }}; + List> imports = new ArrayList<>(); + imports.add(importList); + return new HashMap() {{ + put("operations", operations); + put("imports", imports); + }}; + } }