From bceae5695ed8622c4dcfbe84af319effb3a73eef Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 30 Aug 2023 19:24:54 +0800 Subject: [PATCH] Fix model name being a type in TS abstract codegen (#16392) * fix model name being a type in ts abstract codegen * add a test * better code format --- .../AbstractTypeScriptClientCodegen.java | 23 +++++++++-- .../TypeScriptAngularClientCodegenTest.java | 39 +++++++++++++++++-- .../src/test/resources/2_0/issue_8289.json | 33 ++++++++++++++++ 3 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/2_0/issue_8289.json diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 0a79193d69d..a6811795de3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -512,9 +512,9 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp @Override public String toParamName(String name) { - // obtain the name from nameMapping directly if provided - if (nameMapping.containsKey(name)) { - return nameMapping.get(name); + // obtain the name from parameterNameMapping directly if provided + if (parameterNameMapping.containsKey(name)) { + return parameterNameMapping.get(name); } name = sanitizeName(name, "[^\\w$]"); @@ -557,6 +557,11 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp @Override public String toModelName(final String name) { + // obtain the name from modelNameMapping directly if provided + if (modelNameMapping.containsKey(name)) { + return modelNameMapping.get(name); + } + String fullModelName = name; fullModelName = addPrefix(fullModelName, modelNamePrefix); fullModelName = addSuffix(fullModelName, modelNameSuffix); @@ -630,6 +635,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp } else if (ModelUtils.isBinarySchema(p)) { return "ArrayBuffer"; } + return super.getTypeDeclaration(p); } @@ -754,6 +760,17 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp @Override public String getSchemaType(Schema p) { + // check if $ref is a model and modelNameMapping is used + if (StringUtils.isNotBlank(p.get$ref())) { + Schema unaliasSchema = unaliasSchema(p); + Schema actualSchema = ModelUtils.getReferencedSchema(openAPI, unaliasSchema); + String modelName = ModelUtils.getSimpleRef(unaliasSchema.get$ref()); + + if (ModelUtils.isModel(actualSchema) && modelNameMapping.containsKey(modelName)) { + return toModelName(modelNameMapping.get(modelName)); + } + } + String openAPIType = super.getSchemaType(p); String type = null; if (ModelUtils.isComposedSchema(p)) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java index 6611b3372a0..dca939d1354 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java @@ -226,10 +226,10 @@ public class TypeScriptAngularClientCodegenTest { final String modelName = "FooResponse__links"; final Schema schema = new Schema() - .name(modelName) - .description("an inline model with name previously prefixed with underscore") - .addRequiredItem("self") - .addProperty("self", new StringSchema()); + .name(modelName) + .description("an inline model with name previously prefixed with underscore") + .addRequiredItem("self") + .addProperty("self", new StringSchema()); OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("test", schema); codegen.setOpenAPI(openAPI); @@ -313,4 +313,35 @@ public class TypeScriptAngularClientCodegenTest { "export type Token = ExpressionToken | StringToken" ); } + + @Test + public void testModelNameMappings() throws Exception { + final String specPath = "src/test/resources/2_0/issue_8289.json"; + + Map properties = new HashMap<>(); + properties.put(TypeScriptAngularClientCodegen.TAGGED_UNIONS, "true"); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + Map modelNames = new HashMap<>(); + modelNames.put("File", "SystemFile"); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setModelNameMappings(modelNames) + .setGeneratorName("typescript-angular") + .setInputSpec(specPath) + .setAdditionalProperties(properties) + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + + Generator generator = new DefaultGenerator(); + generator.opts(clientOptInput).generate(); + + TestUtils.assertFileContains( + Paths.get(output + "/model/folder.ts"), + "files?: Array;" // ensure it's an array of SystemFile (not Any) + ); + } } diff --git a/modules/openapi-generator/src/test/resources/2_0/issue_8289.json b/modules/openapi-generator/src/test/resources/2_0/issue_8289.json new file mode 100644 index 00000000000..6dd597da9b9 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/2_0/issue_8289.json @@ -0,0 +1,33 @@ +{ + "swagger": "2.0", + "info": { + "title": "Test swagger", + "version": "0.1.0" + }, + "definitions": { + "File": { + "title": "File", + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "Folder": { + "title": "Folder", + "type": "object", + "properties": { + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + } + } + } + }, + "paths": {}, + "host": "localhost:3000", + "schemes": ["http"] +}