forked from loafle/openapi-generator-original
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:
parent
3b94ce7821
commit
c27d4001e1
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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; }");
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user