From 850af39e80ffa7d6fbcb9ab3abca393f79d05900 Mon Sep 17 00:00:00 2001 From: Quinn Mikelson Date: Fri, 11 Oct 2024 17:49:01 -0700 Subject: [PATCH] Fix missing prefix on map types where value is an array or slice of structs. Add tests. --- typescriptify/typescriptify.go | 5 +++-- typescriptify/typescriptify_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/typescriptify/typescriptify.go b/typescriptify/typescriptify.go index c7e4aed..3e2c47c 100644 --- a/typescriptify/typescriptify.go +++ b/typescriptify/typescriptify.go @@ -262,7 +262,8 @@ func (t *typeScriptClassBuilder) AddMapField(fieldName string, field reflect.Str if name, ok := t.types[valueType.Kind()]; ok { valueTypeName = name } - if valueType.Kind() == reflect.Array || valueType.Kind() == reflect.Slice { + isArray := valueType.Kind() == reflect.Array || valueType.Kind() == reflect.Slice + if isArray { valueTypeName = valueType.Elem().Name() + "[]" } if valueType.Kind() == reflect.Ptr { @@ -277,7 +278,7 @@ func (t *typeScriptClassBuilder) AddMapField(fieldName string, field reflect.Str // keyTypeStr = t.prefix + keyType.Name() + t.suffix // } - if valueType.Kind() == reflect.Struct { + if valueType.Kind() == reflect.Struct || (isArray && valueType.Elem().Kind() == reflect.Struct) { t.fields = append(t.fields, fmt.Sprintf("%s%s: {[key: %s]: %s};", t.indent, fieldName, keyTypeStr, t.prefix+valueTypeName)) t.constructorBody = append(t.constructorBody, fmt.Sprintf("%s%sthis.%s = this.convertValues(source[\"%s\"], %s, true);", t.indent, t.indent, strippedFieldName, strippedFieldName, t.prefix+valueTypeName+t.suffix)) } else { diff --git a/typescriptify/typescriptify_test.go b/typescriptify/typescriptify_test.go index ac8189c..d567006 100644 --- a/typescriptify/typescriptify_test.go +++ b/typescriptify/typescriptify_test.go @@ -1034,3 +1034,32 @@ func TestTypescriptifyCustomJsonTag(t *testing.T) { }` testConverter(t, converter, false, desiredResult, nil) } + +type MapArrayValue struct { + Name string `json:"name"` +} +type StructWithEnumMapArrayStruct struct { + Value string `json:"value"` + Values map[string][]MapArrayValue `json:"values"` +} + +func TestTypescriptifyWithStructWithEnumMapArrayStruct(t *testing.T) { + t.Parallel() + converter := New() + converter.Prefix = "test_" + + converter.AddType(reflect.TypeOf(StructWithEnumMapArrayStruct{})) + converter.AddType(reflect.TypeOf(MapArrayValue{})) + converter.CreateInterface = true + converter.CreateConstructor = false + converter.BackupDir = "" + + desiredResult := `export interface test_StructWithEnumMapArrayStruct { + value: string; + values: {[key: string]: test_MapArrayValue[]}; + } + export interface test_MapArrayValue { + name: string; + }` + testConverter(t, converter, false, desiredResult, nil) +}