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) {
|
protected Schema<?> getSchemaItems(ArraySchema schema) {
|
||||||
if (schema.getItems() != null) {
|
Schema<?> items = schema.getItems();
|
||||||
return schema.getItems();
|
if (items == null) {
|
||||||
} else {
|
|
||||||
LOGGER.error("Undefined array inner type for `{}`. Default to String.", schema.getName());
|
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
|
// default to string if inner item is undefined
|
||||||
ArraySchema arraySchema = (ArraySchema) p;
|
ArraySchema arraySchema = (ArraySchema) p;
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
|
||||||
if (arraySchema.getItems() == null) {
|
|
||||||
arraySchema.setItems(innerSchema);
|
|
||||||
}
|
|
||||||
} else if (ModelUtils.isMapSchema(p)) {
|
} else if (ModelUtils.isMapSchema(p)) {
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p),
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p),
|
||||||
importMapping);
|
importMapping);
|
||||||
@ -2616,9 +2624,6 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
}
|
}
|
||||||
ArraySchema arraySchema = (ArraySchema) p;
|
ArraySchema arraySchema = (ArraySchema) p;
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
|
||||||
if (arraySchema.getItems() == null) {
|
|
||||||
arraySchema.setItems(innerSchema);
|
|
||||||
}
|
|
||||||
CodegenProperty cp = fromProperty(itemName, innerSchema);
|
CodegenProperty cp = fromProperty(itemName, innerSchema);
|
||||||
updatePropertyForArray(property, cp);
|
updatePropertyForArray(property, cp);
|
||||||
} else if (ModelUtils.isMapSchema(p)) {
|
} else if (ModelUtils.isMapSchema(p)) {
|
||||||
@ -3499,9 +3504,6 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter
|
if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter
|
||||||
final ArraySchema arraySchema = (ArraySchema) parameterSchema;
|
final ArraySchema arraySchema = (ArraySchema) parameterSchema;
|
||||||
Schema inner = getSchemaItems(arraySchema);
|
Schema inner = getSchemaItems(arraySchema);
|
||||||
if (arraySchema.getItems() == null) {
|
|
||||||
arraySchema.setItems(inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
collectionFormat = getCollectionFormat(parameter);
|
collectionFormat = getCollectionFormat(parameter);
|
||||||
// default to csv:
|
// default to csv:
|
||||||
@ -5098,9 +5100,6 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
if (ModelUtils.isArraySchema(s)) {
|
if (ModelUtils.isArraySchema(s)) {
|
||||||
final ArraySchema arraySchema = (ArraySchema) s;
|
final ArraySchema arraySchema = (ArraySchema) s;
|
||||||
Schema inner = getSchemaItems(arraySchema);
|
Schema inner = getSchemaItems(arraySchema);
|
||||||
if (arraySchema.getItems() == null) {
|
|
||||||
arraySchema.setItems(inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
codegenParameter = fromFormProperty(entry.getKey(), inner, imports);
|
codegenParameter = fromFormProperty(entry.getKey(), inner, imports);
|
||||||
CodegenProperty codegenProperty = fromProperty("inner", inner);
|
CodegenProperty codegenProperty = fromProperty("inner", inner);
|
||||||
@ -5300,9 +5299,6 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
} else if (ModelUtils.isArraySchema(schema)) {
|
} else if (ModelUtils.isArraySchema(schema)) {
|
||||||
final ArraySchema arraySchema = (ArraySchema) schema;
|
final ArraySchema arraySchema = (ArraySchema) schema;
|
||||||
Schema inner = getSchemaItems(arraySchema);
|
Schema inner = getSchemaItems(arraySchema);
|
||||||
if (arraySchema.getItems() == null) {
|
|
||||||
arraySchema.setItems(inner);
|
|
||||||
}
|
|
||||||
CodegenProperty codegenProperty = fromProperty("property", arraySchema);
|
CodegenProperty codegenProperty = fromProperty("property", arraySchema);
|
||||||
imports.add(codegenProperty.baseType);
|
imports.add(codegenProperty.baseType);
|
||||||
CodegenProperty innerCp = codegenProperty;
|
CodegenProperty innerCp = codegenProperty;
|
||||||
|
@ -740,12 +740,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
|||||||
Schema<?> items = getSchemaItems((ArraySchema) p);
|
Schema<?> items = getSchemaItems((ArraySchema) p);
|
||||||
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
|
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
|
||||||
} else if (ModelUtils.isMapSchema(p)) {
|
} else if (ModelUtils.isMapSchema(p)) {
|
||||||
Schema inner = ModelUtils.getAdditionalProperties(p);
|
Schema<?> inner = getSchemaAdditionalProperties(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);
|
|
||||||
}
|
|
||||||
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
|
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
|
||||||
}
|
}
|
||||||
return super.getTypeDeclaration(p);
|
return super.getTypeDeclaration(p);
|
||||||
|
@ -378,13 +378,12 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp
|
|||||||
@Override
|
@Override
|
||||||
public String getTypeDeclaration(Schema p) {
|
public String getTypeDeclaration(Schema p) {
|
||||||
if (ModelUtils.isArraySchema(p)) {
|
if (ModelUtils.isArraySchema(p)) {
|
||||||
ArraySchema ap = (ArraySchema) p;
|
Schema<?> items = getSchemaItems((ArraySchema) p);
|
||||||
Schema inner = ap.getItems();
|
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
|
||||||
return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">";
|
|
||||||
} else if (ModelUtils.isMapSchema(p)) {
|
} else if (ModelUtils.isMapSchema(p)) {
|
||||||
Schema inner = ModelUtils.getAdditionalProperties(p);
|
Schema<?> inner = getSchemaAdditionalProperties(p);
|
||||||
String nullSafeSuffix = getNullSafeAdditionalProps() ? " | undefined" : "";
|
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)) {
|
} else if (ModelUtils.isFileSchema(p)) {
|
||||||
return "any";
|
return "any";
|
||||||
} else if (ModelUtils.isBinarySchema(p)) {
|
} else if (ModelUtils.isBinarySchema(p)) {
|
||||||
|
@ -107,7 +107,9 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getTypeDeclaration(Schema p) {
|
public String getTypeDeclaration(Schema p) {
|
||||||
if (ModelUtils.isBinarySchema(p)) {
|
if (ModelUtils.isFileSchema(p)) {
|
||||||
|
return "Blob";
|
||||||
|
} else if (ModelUtils.isBinarySchema(p)) {
|
||||||
return "Blob";
|
return "Blob";
|
||||||
}
|
}
|
||||||
return super.getTypeDeclaration(p);
|
return super.getTypeDeclaration(p);
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
package org.openapitools.codegen.typescript.fetch;
|
package org.openapitools.codegen.typescript.fetch;
|
||||||
|
|
||||||
import io.swagger.v3.oas.models.OpenAPI;
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.oas.models.media.*;
|
||||||
import org.openapitools.codegen.CodegenConstants;
|
import org.openapitools.codegen.CodegenConstants;
|
||||||
import org.openapitools.codegen.TestUtils;
|
import org.openapitools.codegen.TestUtils;
|
||||||
import org.openapitools.codegen.languages.TypeScriptFetchClientCodegen;
|
import org.openapitools.codegen.languages.TypeScriptFetchClientCodegen;
|
||||||
|
import org.openapitools.codegen.utils.ModelUtils;
|
||||||
import org.testng.Assert;
|
import org.testng.Assert;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
@ -69,4 +71,35 @@ public class TypeScriptFetchClientCodegenTest {
|
|||||||
Assert.assertEquals(codegen.toVarName("valid_var"), "valid_var");
|
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