[bug][typescript] Fix node client generator import file paths (#7410)

This commit is contained in:
Mahir Kothary 2020-09-17 18:46:39 -07:00 committed by GitHub
parent 620f8db3d6
commit ca5d384081
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 12 deletions

View File

@ -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<Map<String, Object>> imports = (List<Map<String, Object>>) operations.get("imports");
for (Map<String, Object> 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);

View File

@ -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';

View File

@ -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<String, Object> operations = createPostProcessOperationsMapWithImportName(importName);
codegen.postProcessOperationsWithModels(operations, Collections.emptyList());
List<Map<String, Object>> extractedImports = (List<Map<String, Object>>) 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<String, Object> operations = createPostProcessOperationsMapWithImportName(importName);
codegen.postProcessOperationsWithModels(operations, Collections.emptyList());
List<Map<String, Object>> extractedImports = (List<Map<String, Object>>) operations.get("imports");
Assert.assertEquals(extractedImports.get(0).get("filename"), importName);
}
private Map<String, Object> createPostProcessOperationsMapWithImportName(String importName) {
Map<String, Object> operations = new HashMap<String, Object>() {{
put("operation", Collections.emptyList());
put("classname", "Pet");
}};
Map<String, Object> importList = new HashMap<String, Object>() {{
put("import", importName);
put("classname", "Pet");
}};
List<Map<String, Object>> imports = new ArrayList<>();
imports.add(importList);
return new HashMap<String, Object>() {{
put("operations", operations);
put("imports", imports);
}};
}
}