Support importMapping definitions for TypeScriptNodeClientCodegen (#3469)

* Support importMapping definitions for TypeScriptNodeClientCodegen

* Use import mappings for all file references
This commit is contained in:
scottydawg
2019-07-29 01:48:20 -04:00
committed by Esteban Gehring
parent 981b3a53ef
commit 74eeb07b22
5 changed files with 155 additions and 51 deletions

View File

@@ -18,7 +18,6 @@
package org.openapitools.codegen.languages;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.parser.util.SchemaTypeUtil;
import org.openapitools.codegen.*;
import org.openapitools.codegen.utils.ModelUtils;
import org.slf4j.Logger;
@@ -33,6 +32,7 @@ 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 = "./";
protected String npmRepository = null;
protected String apiSuffix = "Api";
@@ -96,22 +96,37 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
if (name.length() == 0) {
return "default" + apiSuffix;
}
if (importMapping.containsKey(name)) {
return importMapping.get(name);
}
return camelize(name, true) + apiSuffix;
}
@Override
public String toApiImport(String name) {
if (importMapping.containsKey(name)) {
return importMapping.get(name);
}
return apiPackage() + "/" + toApiFilename(name);
}
@Override
public String toModelFilename(String name) {
return camelize(toModelName(name), true);
if (importMapping.containsKey(name)) {
return importMapping.get(name);
}
return DEFAULT_IMPORT_PREFIX + camelize(toModelName(name), true);
}
@Override
public String toModelImport(String name) {
return modelPackage() + "/" + toModelFilename(name);
if (importMapping.containsKey(name)) {
return importMapping.get(name);
}
return modelPackage() + "/" + camelize(toModelName(name), true);
}
@Override

View File

@@ -2,7 +2,7 @@
{{#models}}
{{#model}}
{{#tsImports}}
import { {{classname}} } from './{{filename}}';
import { {{classname}} } from '{{filename}}';
{{/tsImports}}
{{#description}}

View File

@@ -1,6 +1,6 @@
{{#models}}
{{#model}}
export * from './{{{ classFilename }}}';
export * from '{{{ classFilename }}}';
{{/model}}
{{/models}}
@@ -8,7 +8,7 @@ import localVarRequest = require('request');
{{#models}}
{{#model}}
import { {{classname}} } from './{{{ classFilename }}}';
import { {{classname}} } from '{{{ classFilename }}}';
{{/model}}
{{/models}}

View File

@@ -4,68 +4,131 @@ import io.swagger.v3.oas.models.OpenAPI;
import org.openapitools.codegen.TestUtils;
import org.openapitools.codegen.languages.TypeScriptNodeClientCodegen;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TypeScriptNodeClientCodegenTest {
private TypeScriptNodeClientCodegen codegen;
@BeforeMethod
public void setUp() {
codegen = new TypeScriptNodeClientCodegen();
}
@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");
Assert.assertEquals(codegen.toVarName("user-name"), "userName");
Assert.assertEquals(codegen.toVarName("user_name"), "userName");
Assert.assertEquals(codegen.toVarName("user|name"), "userName");
Assert.assertEquals(codegen.toVarName("user !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~name"), "user$Name");
}
Assert.assertEquals(codegen.toVarName("name"), "name");
Assert.assertEquals(codegen.toVarName("$name"), "$name");
Assert.assertEquals(codegen.toVarName("nam$$e"), "nam$$e");
Assert.assertEquals(codegen.toVarName("user-name"), "userName");
Assert.assertEquals(codegen.toVarName("user_name"), "userName");
Assert.assertEquals(codegen.toVarName("user|name"), "userName");
Assert.assertEquals(codegen.toVarName("user !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~name"), "user$Name");
}
@Test
public void testSnapshotVersion() {
OpenAPI api = TestUtils.createOpenAPI();
TypeScriptNodeClientCodegen codegen = new TypeScriptNodeClientCodegen();
@Test
public void testSnapshotVersion() {
OpenAPI api = TestUtils.createOpenAPI();
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", true);
codegen.additionalProperties().put("npmVersion", "1.0.0-SNAPSHOT");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", true);
codegen.additionalProperties().put("npmVersion", "1.0.0-SNAPSHOT");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
Assert.assertTrue(codegen.getNpmVersion().matches("^1.0.0-SNAPSHOT.[0-9]{12}$"));
Assert.assertTrue(codegen.getNpmVersion().matches("^1.0.0-SNAPSHOT.[0-9]{12}$"));
codegen = new TypeScriptNodeClientCodegen();
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", true);
codegen.additionalProperties().put("npmVersion", "3.0.0-M1");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
codegen = new TypeScriptNodeClientCodegen();
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", true);
codegen.additionalProperties().put("npmVersion", "3.0.0-M1");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
Assert.assertTrue(codegen.getNpmVersion().matches("^3.0.0-M1-SNAPSHOT.[0-9]{12}$"));
Assert.assertTrue(codegen.getNpmVersion().matches("^3.0.0-M1-SNAPSHOT.[0-9]{12}$"));
}
}
@Test
public void testWithoutSnapshotVersion() {
OpenAPI api = TestUtils.createOpenAPI();
@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);
codegen.additionalProperties().put("npmVersion", "1.0.0-SNAPSHOT");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", false);
codegen.additionalProperties().put("npmVersion", "1.0.0-SNAPSHOT");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
Assert.assertTrue(codegen.getNpmVersion().matches("^1.0.0-SNAPSHOT$"));
Assert.assertTrue(codegen.getNpmVersion().matches("^1.0.0-SNAPSHOT$"));
codegen = new TypeScriptNodeClientCodegen();
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", false);
codegen.additionalProperties().put("npmVersion", "3.0.0-M1");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
codegen = new TypeScriptNodeClientCodegen();
codegen.additionalProperties().put("npmName", "@openapi/typescript-angular-petstore");
codegen.additionalProperties().put("snapshot", false);
codegen.additionalProperties().put("npmVersion", "3.0.0-M1");
codegen.processOpts();
codegen.preprocessOpenAPI(api);
Assert.assertTrue(codegen.getNpmVersion().matches("^3.0.0-M1$"));
}
Assert.assertTrue(codegen.getNpmVersion().matches("^3.0.0-M1$"));
@Test(description = "prepend model filename with ./ by default")
public void defaultModelFilenameTest() {
Assert.assertEquals(codegen.toModelFilename("ApiResponse"), "./apiResponse");
}
}
@Test(description = "use mapped name for model filename when provided")
public void modelFilenameWithMappingTest() {
final String mappedName = "@namespace/dir/response";
codegen.importMapping().put("ApiResponse", mappedName);
Assert.assertEquals(codegen.toModelFilename("ApiResponse"), mappedName);
}
@Test(description = "prepend model import with ./ by default")
public void defaultModelImportTest() {
Assert.assertEquals(codegen.toModelImport("ApiResponse"), "model/apiResponse");
}
@Test(description = "use mapped name for model import when provided")
public void modelImportWithMappingTest() {
final String mappedName = "@namespace/dir/response";
codegen.importMapping().put("ApiResponse", mappedName);
Assert.assertEquals(codegen.toModelImport("ApiResponse"), mappedName);
}
@Test(description = "append api suffix to default api filename")
public void emptyApiFilenameTest() {
Assert.assertEquals(codegen.toApiFilename(""), "defaultApi");
}
@Test(description = "appends api suffix to api filename")
public void defaultApiFilenameTest() {
Assert.assertEquals(codegen.toApiFilename("Category"), "categoryApi");
}
@Test(description = "appends api suffix to mapped api filename")
public void mappedApiFilenameTest() {
final String mappedName = "@namespace/dir/category";
codegen.importMapping().put("Category", mappedName);
Assert.assertEquals(codegen.toApiFilename("Category"), mappedName);
}
@Test(description = "append api suffix to default api import")
public void emptyApiImportTest() {
Assert.assertEquals(codegen.toApiImport(""), "api/defaultApi");
}
@Test(description = "appends api suffix to api import")
public void defaultApiImportTest() {
Assert.assertEquals(codegen.toApiImport("Category"), "api/categoryApi");
}
@Test(description = "appends api suffix to mapped api filename")
public void mappedApiImportTest() {
final String mappedName = "@namespace/dir/category";
codegen.importMapping().put("Category", mappedName);
Assert.assertEquals(codegen.toApiImport("Category"), mappedName);
}
}

View File

@@ -205,4 +205,30 @@ public class TypeScriptNodeModelTest {
Assert.assertEquals(cm.imports.size(), 1);
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("Children")).size(), 1);
}
@Test(description = "prepend imports with ./ by default")
public void defaultFromModelTest() {
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
final DefaultCodegen codegen = new TypeScriptNodeClientCodegen();
codegen.setOpenAPI(openAPI);
final Schema categorySchema = openAPI.getComponents().getSchemas().get("ApiResponse");
final CodegenModel cm = codegen.fromModel("ApiResponse", categorySchema);
Assert.assertEquals(cm.name, "ApiResponse");
Assert.assertEquals(cm.classFilename, "./apiResponse");
}
@Test(description = "use mapped imports for type")
public void mappedFromModelTest() {
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
final DefaultCodegen codegen = new TypeScriptNodeClientCodegen();
final String mappedName = "@namespace/dir/response";
codegen.importMapping().put("ApiResponse", mappedName);
codegen.setOpenAPI(openAPI);
final Schema categorySchema = openAPI.getComponents().getSchemas().get("ApiResponse");
final CodegenModel cm = codegen.fromModel("ApiResponse", categorySchema);
Assert.assertEquals(cm.name, "ApiResponse");
Assert.assertEquals(cm.classFilename, mappedName);
}
}