Skip to content

Commit bceae56

Browse files
authored
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
1 parent 9cc5513 commit bceae56

File tree

3 files changed

+88
-7
lines changed

3 files changed

+88
-7
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,9 @@ public String modelFileFolder() {
512512

513513
@Override
514514
public String toParamName(String name) {
515-
// obtain the name from nameMapping directly if provided
516-
if (nameMapping.containsKey(name)) {
517-
return nameMapping.get(name);
515+
// obtain the name from parameterNameMapping directly if provided
516+
if (parameterNameMapping.containsKey(name)) {
517+
return parameterNameMapping.get(name);
518518
}
519519

520520
name = sanitizeName(name, "[^\\w$]");
@@ -557,6 +557,11 @@ private String toSafeIdentifier(String name) {
557557

558558
@Override
559559
public String toModelName(final String name) {
560+
// obtain the name from modelNameMapping directly if provided
561+
if (modelNameMapping.containsKey(name)) {
562+
return modelNameMapping.get(name);
563+
}
564+
560565
String fullModelName = name;
561566
fullModelName = addPrefix(fullModelName, modelNamePrefix);
562567
fullModelName = addSuffix(fullModelName, modelNameSuffix);
@@ -630,6 +635,7 @@ public String getTypeDeclaration(Schema p) {
630635
} else if (ModelUtils.isBinarySchema(p)) {
631636
return "ArrayBuffer";
632637
}
638+
633639
return super.getTypeDeclaration(p);
634640
}
635641

@@ -754,6 +760,17 @@ protected boolean isReservedWord(String word) {
754760

755761
@Override
756762
public String getSchemaType(Schema p) {
763+
// check if $ref is a model and modelNameMapping is used
764+
if (StringUtils.isNotBlank(p.get$ref())) {
765+
Schema unaliasSchema = unaliasSchema(p);
766+
Schema actualSchema = ModelUtils.getReferencedSchema(openAPI, unaliasSchema);
767+
String modelName = ModelUtils.getSimpleRef(unaliasSchema.get$ref());
768+
769+
if (ModelUtils.isModel(actualSchema) && modelNameMapping.containsKey(modelName)) {
770+
return toModelName(modelNameMapping.get(modelName));
771+
}
772+
}
773+
757774
String openAPIType = super.getSchemaType(p);
758775
String type = null;
759776
if (ModelUtils.isComposedSchema(p)) {

modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,10 @@ public void testKebabCasedModelFilenames() {
226226

227227
final String modelName = "FooResponse__links";
228228
final Schema schema = new Schema()
229-
.name(modelName)
230-
.description("an inline model with name previously prefixed with underscore")
231-
.addRequiredItem("self")
232-
.addProperty("self", new StringSchema());
229+
.name(modelName)
230+
.description("an inline model with name previously prefixed with underscore")
231+
.addRequiredItem("self")
232+
.addProperty("self", new StringSchema());
233233

234234
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("test", schema);
235235
codegen.setOpenAPI(openAPI);
@@ -313,4 +313,35 @@ public void testTaggedUnionImports() throws Exception {
313313
"export type Token = ExpressionToken | StringToken"
314314
);
315315
}
316+
317+
@Test
318+
public void testModelNameMappings() throws Exception {
319+
final String specPath = "src/test/resources/2_0/issue_8289.json";
320+
321+
Map<String, Object> properties = new HashMap<>();
322+
properties.put(TypeScriptAngularClientCodegen.TAGGED_UNIONS, "true");
323+
324+
File output = Files.createTempDirectory("test").toFile();
325+
output.deleteOnExit();
326+
327+
Map<String, String> modelNames = new HashMap<>();
328+
modelNames.put("File", "SystemFile");
329+
330+
final CodegenConfigurator configurator = new CodegenConfigurator()
331+
.setModelNameMappings(modelNames)
332+
.setGeneratorName("typescript-angular")
333+
.setInputSpec(specPath)
334+
.setAdditionalProperties(properties)
335+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
336+
337+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
338+
339+
Generator generator = new DefaultGenerator();
340+
generator.opts(clientOptInput).generate();
341+
342+
TestUtils.assertFileContains(
343+
Paths.get(output + "/model/folder.ts"),
344+
"files?: Array<SystemFile>;" // ensure it's an array of SystemFile (not Any)
345+
);
346+
}
316347
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"swagger": "2.0",
3+
"info": {
4+
"title": "Test swagger",
5+
"version": "0.1.0"
6+
},
7+
"definitions": {
8+
"File": {
9+
"title": "File",
10+
"type": "object",
11+
"properties": {
12+
"name": {
13+
"type": "string"
14+
}
15+
}
16+
},
17+
"Folder": {
18+
"title": "Folder",
19+
"type": "object",
20+
"properties": {
21+
"files": {
22+
"type": "array",
23+
"items": {
24+
"$ref": "#/definitions/File"
25+
}
26+
}
27+
}
28+
}
29+
},
30+
"paths": {},
31+
"host": "localhost:3000",
32+
"schemes": ["http"]
33+
}

0 commit comments

Comments
 (0)