diff --git a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java index 729aa8be8..4e1c957f3 100644 --- a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java +++ b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/Settings.java @@ -136,6 +136,8 @@ public class Settings { public boolean jackson2ModuleDiscovery = false; public List> jackson2Modules = new ArrayList<>(); public ClassLoader classLoader = null; + public boolean disableTrailingSemiColon = false; + public Map> injectCustomProperties = Map.of(); private boolean defaultStringEnumsOverriddenByExtension = false; @@ -903,5 +905,4 @@ private static int modifierToBitMask(javax.lang.model.element.Modifier modifier) default: return 0; } } - } diff --git a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TsProperty.java b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TsProperty.java index a12b38d83..689212fe6 100644 --- a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TsProperty.java +++ b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TsProperty.java @@ -24,7 +24,8 @@ public TsType getTsType() { public String format(Settings settings) { final String questionMark = (tsType instanceof TsType.OptionalType) ? "?" : ""; - return Emitter.quoteIfNeeded(name, settings) + questionMark + ": " + tsType.format(settings) + ";"; + final String trailingChar = settings.disableTrailingSemiColon ? "" : ";"; + return Emitter.quoteIfNeeded(name, settings) + questionMark + ": " + tsType.format(settings) + trailingChar; } } diff --git a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TypeScriptGenerator.java b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TypeScriptGenerator.java index 41ffefcc8..6d4445b7d 100644 --- a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TypeScriptGenerator.java +++ b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/TypeScriptGenerator.java @@ -148,7 +148,7 @@ public TypeProcessor getCommonTypeProcessor() { final ModelParser.Factory modelParserFactory = getModelParserFactory(); final List specificTypeProcessors = Stream .concat( - restFactories.stream().map(factory -> factory.getSpecificTypeProcessor()), + restFactories.stream().map(RestApplicationParser.Factory::getSpecificTypeProcessor), Stream.of(modelParserFactory.getSpecificTypeProcessor()) ) .filter(Objects::nonNull) @@ -167,8 +167,7 @@ private TypeProcessor createTypeProcessor(List specificTypeProces processors.add(new CustomMappingTypeProcessor(settings.getValidatedCustomTypeMappings())); processors.addAll(specificTypeProcessors); processors.add(new DefaultTypeProcessor(settings.getLoadedDataLibraries())); - final TypeProcessor typeProcessor = new TypeProcessor.Chain(processors); - return typeProcessor; + return new TypeProcessor.Chain(processors); } public ModelParser getModelParser() { diff --git a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/Emitter.java b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/Emitter.java index 3d2760fdb..4405d4b4d 100644 --- a/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/Emitter.java +++ b/typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/Emitter.java @@ -76,14 +76,14 @@ private void emitImports() { writeNewLine(); for (ModuleDependency dependency : settings.moduleDependencies) { if (!dependency.global) { - writeIndentedLine("import * as " + dependency.importAs + " from " + quote(dependency.importFrom, settings) + ";"); + writeIndentedLine("import * as " + dependency.importAs + " from " + quote(dependency.importFrom, settings) + getTrailingChar()); } } } if (settings.importDeclarations != null && !settings.importDeclarations.isEmpty()) { writeNewLine(); for (String importDeclaration : settings.importDeclarations) { - writeIndentedLine(importDeclaration + ";"); + writeIndentedLine(importDeclaration + getTrailingChar()); } } } @@ -194,6 +194,7 @@ private void emitBean(TsBeanModel bean, boolean exportKeyword) { for (TsPropertyModel property : bean.getProperties()) { emitProperty(property); } + emitInjectedProperties(bean); if (bean.getConstructor() != null) { emitCallable(bean.getConstructor()); } @@ -212,7 +213,23 @@ private void emitProperty(TsPropertyModel property) { final String readonlyString = property.modifiers.isReadonly ? "readonly " : ""; final String questionMark = tsType instanceof TsType.OptionalType ? "?" : ""; final String defaultString = property.getDefaultValue() != null ? " = " + property.getDefaultValue().format(settings) : ""; - writeIndentedLine(staticString + readonlyString + quoteIfNeeded(property.getName(), settings) + questionMark + ": " + tsType.format(settings) + defaultString + ";"); + writeIndentedLine(staticString + readonlyString + quoteIfNeeded(property.getName(), settings) + questionMark + ": " + tsType.format(settings) + defaultString + getTrailingChar()); + } + + private void emitInjectedProperties(TsBeanModel bean) { + + settings.injectCustomProperties + .keySet() + .stream() + .filter(className -> className.equals(bean.getName().getSimpleName())) + .findFirst().ifPresent((ignored) -> writeIndentedLine("// custom properties")); + + settings.injectCustomProperties + .entrySet() + .stream() + .filter(entry -> entry.getKey().equals(bean.getName().getSimpleName())) + .flatMap(matched -> matched.getValue().stream()) + .forEach(this::writeIndentedLine); } private void emitDecorators(List decorators) { @@ -271,7 +288,7 @@ private void emitCallable(TsCallableModel method) { indent--; writeIndentedLine("}"); } else { - writeIndentedLine(signature + ";"); + writeIndentedLine(signature + getTrailingChar()); } } @@ -326,7 +343,7 @@ private void emitStatements(List statements) { private void emitReturnStatement(TsReturnStatement returnStatement) { if (returnStatement.getExpression() != null) { - writeIndentedLine("return " + returnStatement.getExpression().format(settings) + ";"); + writeIndentedLine("return " + returnStatement.getExpression().format(settings) + getTrailingChar()); } else { writeIndentedLine("return;"); } @@ -347,7 +364,7 @@ private void emitIfStatement(TsIfStatement ifStatement) { } private void emitExpressionStatement(TsExpressionStatement expressionStatement) { - writeIndentedLine(expressionStatement.getExpression().format(settings) + ";"); + writeIndentedLine(expressionStatement.getExpression().format(settings) + getTrailingChar()); } private void emitVariableDeclarationStatement(TsVariableDeclarationStatement variableDeclarationStatement) { @@ -356,7 +373,7 @@ private void emitVariableDeclarationStatement(TsVariableDeclarationStatement var + variableDeclarationStatement.getName() + (variableDeclarationStatement.getType() != null ? ": " + variableDeclarationStatement.getType().format(settings) : "") + (variableDeclarationStatement.getInitializer() != null ? " = " + variableDeclarationStatement.getInitializer().format(settings) : "") - + ";" + + getTrailingChar() ); } @@ -385,7 +402,7 @@ private void emitTypeAlias(TsAliasModel alias, boolean exportKeyword) { final String genericParameters = alias.getTypeParameters().isEmpty() ? "" : "<" + formatList(settings, alias.getTypeParameters()) + ">"; - writeIndentedLine(exportKeyword, "type " + alias.getName().getSimpleName() + genericParameters + " = " + alias.getDefinition().format(settings) + ";"); + writeIndentedLine(exportKeyword, "type " + alias.getName().getSimpleName() + genericParameters + " = " + alias.getDefinition().format(settings) + getTrailingChar()); } private void emitLiteralEnum(TsEnumModel enumModel, boolean exportKeyword, boolean declareKeyword) { @@ -438,7 +455,7 @@ public void writeIndentedLine(String line) { private void emitUmdNamespace() { if (settings.umdNamespace != null) { writeNewLine(); - writeIndentedLine("export as namespace " + settings.umdNamespace + ";"); + writeIndentedLine("export as namespace " + settings.umdNamespace + getTrailingChar()); } } @@ -502,4 +519,7 @@ private void close() { } } + private String getTrailingChar() { + return settings.disableTrailingSemiColon ? "" : ";"; + } } diff --git a/typescript-generator-gradle-plugin/src/main/java/cz/habarta/typescript/generator/gradle/GenerateTask.java b/typescript-generator-gradle-plugin/src/main/java/cz/habarta/typescript/generator/gradle/GenerateTask.java index 12b282619..23739240a 100644 --- a/typescript-generator-gradle-plugin/src/main/java/cz/habarta/typescript/generator/gradle/GenerateTask.java +++ b/typescript-generator-gradle-plugin/src/main/java/cz/habarta/typescript/generator/gradle/GenerateTask.java @@ -31,6 +31,7 @@ import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.gradle.api.DefaultTask; import org.gradle.api.Task; @@ -129,6 +130,8 @@ public class GenerateTask extends DefaultTask { public boolean jackson2ModuleDiscovery; public List jackson2Modules; public Logger.Level loggingLevel; + public boolean disableTrailingSemiColon; + public Map> injectCustomProperties; private Settings createSettings(URLClassLoader classLoader) { final Settings settings = new Settings(); @@ -212,6 +215,8 @@ private Settings createSettings(URLClassLoader classLoader) { settings.jackson2ModuleDiscovery = jackson2ModuleDiscovery; settings.loadJackson2Modules(classLoader, jackson2Modules); settings.classLoader = classLoader; + settings.disableTrailingSemiColon = disableTrailingSemiColon; + settings.injectCustomProperties = injectCustomProperties; return settings; }