Typescript array alias array (#4981)

* Add failing tests for typescript type declaration

* Refactor array and map child type string fallback

* Add unaliasSchema to typescript getTypeDeclaration

* TypeScriptRxjs: Use Blob as file type declaration

This was inadvertantly changed in
https://github.com/OpenAPITools/openapi-generator/pull/5266
This commit is contained in:
Bodo Graumann 2020-03-03 10:20:49 +01:00 committed by GitHub
parent 3b94ce7821
commit c27d4001e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 31 deletions

View File

@ -1734,12 +1734,23 @@ public class DefaultCodegen implements CodegenConfig {
}
protected Schema<?> getSchemaItems(ArraySchema schema) {
if (schema.getItems() != null) {
return schema.getItems();
} else {
Schema<?> items = schema.getItems();
if (items == null) {
LOGGER.error("Undefined array inner type for `{}`. Default to String.", schema.getName());
return new StringSchema().description("TODO default missing array inner type to string");
items = new StringSchema().description("TODO default missing array inner type to string");
schema.setItems(items);
}
return items;
}
protected Schema<?> getSchemaAdditionalProperties(Schema schema) {
Schema<?> inner = ModelUtils.getAdditionalProperties(schema);
if (inner == null) {
LOGGER.error("`{}` (map property) does not have a proper inner type defined. Default to type:string", schema.getName());
inner = new StringSchema().description("TODO default missing map inner type to string");
schema.setAdditionalProperties(inner);
}
return inner;
}
/**
@ -2534,9 +2545,6 @@ public class DefaultCodegen implements CodegenConfig {
// default to string if inner item is undefined
ArraySchema arraySchema = (ArraySchema) p;
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
if (arraySchema.getItems() == null) {
arraySchema.setItems(innerSchema);
}
} else if (ModelUtils.isMapSchema(p)) {
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p),
importMapping);
@ -2616,9 +2624,6 @@ public class DefaultCodegen implements CodegenConfig {
}
ArraySchema arraySchema = (ArraySchema) p;
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
if (arraySchema.getItems() == null) {
arraySchema.setItems(innerSchema);
}
CodegenProperty cp = fromProperty(itemName, innerSchema);
updatePropertyForArray(property, cp);
} else if (ModelUtils.isMapSchema(p)) {
@ -3499,9 +3504,6 @@ public class DefaultCodegen implements CodegenConfig {
if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter
final ArraySchema arraySchema = (ArraySchema) parameterSchema;
Schema inner = getSchemaItems(arraySchema);
if (arraySchema.getItems() == null) {
arraySchema.setItems(inner);
}
collectionFormat = getCollectionFormat(parameter);
// default to csv:
@ -5098,9 +5100,6 @@ public class DefaultCodegen implements CodegenConfig {
if (ModelUtils.isArraySchema(s)) {
final ArraySchema arraySchema = (ArraySchema) s;
Schema inner = getSchemaItems(arraySchema);
if (arraySchema.getItems() == null) {
arraySchema.setItems(inner);
}
codegenParameter = fromFormProperty(entry.getKey(), inner, imports);
CodegenProperty codegenProperty = fromProperty("inner", inner);
@ -5300,9 +5299,6 @@ public class DefaultCodegen implements CodegenConfig {
} else if (ModelUtils.isArraySchema(schema)) {
final ArraySchema arraySchema = (ArraySchema) schema;
Schema inner = getSchemaItems(arraySchema);
if (arraySchema.getItems() == null) {
arraySchema.setItems(inner);
}
CodegenProperty codegenProperty = fromProperty("property", arraySchema);
imports.add(codegenProperty.baseType);
CodegenProperty innerCp = codegenProperty;

View File

@ -740,12 +740,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
Schema<?> items = getSchemaItems((ArraySchema) p);
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
} else if (ModelUtils.isMapSchema(p)) {
Schema inner = ModelUtils.getAdditionalProperties(p);
if (inner == null) {
LOGGER.error("`{}` (map property) does not have a proper inner type defined. Default to type:string", p.getName());
inner = new StringSchema().description("TODO default missing map inner type to string");
p.setAdditionalProperties(inner);
}
Schema<?> inner = getSchemaAdditionalProperties(p);
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
}
return super.getTypeDeclaration(p);

View File

@ -378,13 +378,12 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp
@Override
public String getTypeDeclaration(Schema p) {
if (ModelUtils.isArraySchema(p)) {
ArraySchema ap = (ArraySchema) p;
Schema inner = ap.getItems();
return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">";
Schema<?> items = getSchemaItems((ArraySchema) p);
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
} else if (ModelUtils.isMapSchema(p)) {
Schema inner = ModelUtils.getAdditionalProperties(p);
Schema<?> inner = getSchemaAdditionalProperties(p);
String nullSafeSuffix = getNullSafeAdditionalProps() ? " | undefined" : "";
return "{ [key: string]: " + getTypeDeclaration(inner) + nullSafeSuffix + "; }";
return "{ [key: string]: " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + nullSafeSuffix + "; }";
} else if (ModelUtils.isFileSchema(p)) {
return "any";
} else if (ModelUtils.isBinarySchema(p)) {

View File

@ -107,7 +107,9 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen
@Override
public String getTypeDeclaration(Schema p) {
if (ModelUtils.isBinarySchema(p)) {
if (ModelUtils.isFileSchema(p)) {
return "Blob";
} else if (ModelUtils.isBinarySchema(p)) {
return "Blob";
}
return super.getTypeDeclaration(p);

View File

@ -1,9 +1,11 @@
package org.openapitools.codegen.typescript.fetch;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.*;
import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.TestUtils;
import org.openapitools.codegen.languages.TypeScriptFetchClientCodegen;
import org.openapitools.codegen.utils.ModelUtils;
import org.testng.Assert;
import org.testng.annotations.Test;
@ -69,4 +71,35 @@ public class TypeScriptFetchClientCodegenTest {
Assert.assertEquals(codegen.toVarName("valid_var"), "valid_var");
}
@Test
public void getTypeDeclarationTest() {
Schema<?> childSchema = new ArraySchema().items(new StringSchema());
OpenAPI api = TestUtils.createOpenAPI();
api.getComponents().addSchemas("Child", childSchema);
TypeScriptFetchClientCodegen codegen = new TypeScriptFetchClientCodegen();
codegen.setOpenAPI(api);
// Cf. issue #4968: Array of Alias of Array
Schema<?> parentSchema = new ArraySchema().items(
new Schema().$ref("#/components/schemas/Child")
);
ModelUtils.setGenerateAliasAsModel(false);
Assert.assertEquals(codegen.getTypeDeclaration(parentSchema), "Array<Array<string>>");
ModelUtils.setGenerateAliasAsModel(true);
Assert.assertEquals(codegen.getTypeDeclaration(parentSchema), "Array<Child>");
// Same for Map
parentSchema = new MapSchema().additionalProperties(new Schema().$ref("#/components/schemas/Child"));
ModelUtils.setGenerateAliasAsModel(false);
Assert.assertEquals(codegen.getTypeDeclaration(parentSchema), "{ [key: string]: Array<string>; }");
ModelUtils.setGenerateAliasAsModel(true);
Assert.assertEquals(codegen.getTypeDeclaration(parentSchema), "{ [key: string]: Child; }");
}
}