diff --git a/api-openbis-typescript/source/java/ch/ethz/sis/openbis/generic/typescript/OpenBISExtension.java b/api-openbis-typescript/source/java/ch/ethz/sis/openbis/generic/typescript/OpenBISExtension.java index 808cf23d978442ac335676f16c65aab535b6b5cf..9d53120d04b70379dda41db128c5d4131b55ae8c 100644 --- a/api-openbis-typescript/source/java/ch/ethz/sis/openbis/generic/typescript/OpenBISExtension.java +++ b/api-openbis-typescript/source/java/ch/ethz/sis/openbis/generic/typescript/OpenBISExtension.java @@ -260,6 +260,16 @@ public class OpenBISExtension extends Extension List<TsType.GenericVariableType> tsBeanTypeParametersWithoutBounds = resolveTypeParameters(processingContext, tsBean, tsBean.getOrigin().getTypeParameters(), false); + String tsBeanAdditionalName = null; + + if (tsBeanJsonObject != null) + { + tsBeanAdditionalName = tsBeanJsonObject.value().replaceAll("\\.", "_"); + } else + { + tsBeanAdditionalName = tsBeanTypeScriptObject.value(); + } + List<TsMethodModel> tsBeanMethods = new ArrayList<>(); for (Method method : tsBean.getOrigin().getMethods()) @@ -350,6 +360,26 @@ public class OpenBISExtension extends Extension } } + /* + + Generate part (if there are constructors): + + interface XConstructor { + new <T>(p:string): X<T> + } + + bundle { + ... + X:XConstructor, + a_b_c_X:XConstructor + ... + } + + export const X:XConstructor + export const a_b_c_X:XConstructor + + */ + if (!tsConstructors.isEmpty()) { String tsConstructorBeanName = tsBean.getName().getSimpleName() + "Constructor"; @@ -368,39 +398,37 @@ public class OpenBISExtension extends Extension new TsHelper( Collections.singletonList("export const " + tsBean.getName().getSimpleName() + ":" + tsConstructorBeanName))); - String tsBeanName = null; - - if (tsBeanJsonObject != null) - { - tsBeanName = tsBeanJsonObject.value().replaceAll("\\.", "_"); - } else + if (!Strings.isNullOrEmpty(tsBeanAdditionalName) && !tsBeanAdditionalName.equals(tsBean.getName().getSimpleName())) { - tsBeanName = tsBeanTypeScriptObject.value(); + tsBundleProperties.add(new TsPropertyModel(tsBeanAdditionalName, + new TsType.ReferenceType(new Symbol(tsConstructorBeanName)), null, true, null)); + + tsHelpers.add(new TsHelper(Collections.singletonList("export const " + tsBeanAdditionalName + ":" + tsConstructorBeanName))); } + } - if (!Strings.isNullOrEmpty(tsBeanName) && !tsBeanName.equals(tsBean.getName().getSimpleName())) - { - tsBundleProperties.add(new TsPropertyModel(tsBeanName, - new TsType.ReferenceType(new Symbol(tsConstructorBeanName)), null, true, null)); + /* - tsHelpers.add(new TsHelper(Collections.singletonList("export const " + tsBeanName + ":" + tsConstructorBeanName))); + Generate part (with or without generic parameters): - if (tsBeanTypeParametersWithBounds.isEmpty()) - { - tsHelpers.add( - new TsHelper(Collections.singletonList("type " + tsBeanName + " = " + tsBean.getName().getSimpleName()))); - } else - { - String tsBeanTypeParametersWithBoundsString = - tsBeanTypeParametersWithBounds.stream().map(TsType::toString).collect(Collectors.joining(",")); - String tsBeanTypeParametersWithoutBoundsString = - tsBeanTypeParametersWithoutBounds.stream().map(TsType::toString).collect(Collectors.joining(",")); - - tsHelpers.add(new TsHelper(Collections.singletonList( - "type " + tsBeanName + "<" + tsBeanTypeParametersWithBoundsString + "> = " + tsBean.getName() - .getSimpleName() + "<" + tsBeanTypeParametersWithoutBoundsString + ">"))); - } - } + type a_b_c_X<T> = X<T> + + */ + + if (tsBeanTypeParametersWithBounds.isEmpty()) + { + tsHelpers.add( + new TsHelper(Collections.singletonList("type " + tsBeanAdditionalName + " = " + tsBean.getName().getSimpleName()))); + } else + { + String tsBeanTypeParametersWithBoundsString = + tsBeanTypeParametersWithBounds.stream().map(TsType::toString).collect(Collectors.joining(",")); + String tsBeanTypeParametersWithoutBoundsString = + tsBeanTypeParametersWithoutBounds.stream().map(TsType::toString).collect(Collectors.joining(",")); + + tsHelpers.add(new TsHelper(Collections.singletonList( + "type " + tsBeanAdditionalName + "<" + tsBeanTypeParametersWithBoundsString + "> = " + tsBean.getName() + .getSimpleName() + "<" + tsBeanTypeParametersWithoutBoundsString + ">"))); } tsBeanMethods.sort(Comparator.comparing(TsMethodModel::getName).thenComparing(m -> m.getParameters().size()) @@ -487,6 +515,23 @@ public class OpenBISExtension extends Extension continue; } + /* + + Generate part: + + interface XObject { + VALUE1:X, + VALUE2:X + } + + bundle { + ... + X:XObject, + ... + } + + */ + String tsEnumObjectBeanName = tsEnum.getName().getSimpleName() + "Object"; List<TsPropertyModel> tsEnumObjectBeanProperties = new ArrayList<>(); List<String> tsEnumConstProperties = new ArrayList<>(); @@ -511,6 +556,19 @@ public class OpenBISExtension extends Extension tsBundleProperties.add(new TsPropertyModel(tsEnum.getName().getSimpleName(), new TsType.ReferenceType(new Symbol(tsEnumObjectBeanName)), null, true, null)); + /* + + Generate part: + + const X = { + VALUE1 : "VALUE1", + VALUE2 : "VALUE2" + } as const + + type X = typeof X[keyof typeof X]; + + */ + tsHelpers.add(new TsHelper( Collections.singletonList( "const " + tsEnum.getName().getSimpleName() + " = {\n" + String.join(",\n", tsEnumConstProperties) + "} as const"))); @@ -518,19 +576,39 @@ public class OpenBISExtension extends Extension "type " + tsEnum.getName().getSimpleName() + " = typeof " + tsEnum.getName().getSimpleName() + "[keyof typeof " + tsEnum.getName().getSimpleName() + "]"))); - String tsEnumJsonName = tsEnumJsonObject.value().replaceAll("\\.", "_"); + String tsEnumAdditionalName = tsEnumJsonObject.value().replaceAll("\\.", "_"); + + /* + + Generate part: + + const a_b_c_X = { + VALUE1 : "VALUE1", + VALUE2 : "VALUE2" + } as const + + type a_b_c_X = typeof a_b_c_X[keyof typeof a_b_c_X]; + + + bundle { + ... + a_b_c_X:XObject + ... + } + + */ - if (!tsEnumJsonName.equals(tsEnum.getName().getSimpleName())) + if (!tsEnumAdditionalName.equals(tsEnum.getName().getSimpleName())) { - tsBundleProperties.add(new TsPropertyModel(tsEnumJsonName, + tsBundleProperties.add(new TsPropertyModel(tsEnumAdditionalName, new TsType.ReferenceType(new Symbol(tsEnumObjectBeanName)), null, true, null)); tsHelpers.add( new TsHelper(Collections.singletonList( - "const " + tsEnumJsonName + " = {\n" + String.join(",\n", tsEnumConstProperties) + "} as const"))); + "const " + tsEnumAdditionalName + " = {\n" + String.join(",\n", tsEnumConstProperties) + "} as const"))); tsHelpers.add(new TsHelper(Collections.singletonList( - "type " + tsEnumJsonName + " = typeof " + tsEnumJsonName + "[keyof typeof " - + tsEnumJsonName + "]"))); + "type " + tsEnumAdditionalName + " = typeof " + tsEnumAdditionalName + "[keyof typeof " + + tsEnumAdditionalName + "]"))); } }