package cz.habarta.typescript.generator; import cz.habarta.typescript.generator.compiler.*; import cz.habarta.typescript.generator.emitter.*; import cz.habarta.typescript.generator.parser.*; import cz.habarta.typescript.generator.util.Utils; import java.io.*; import java.util.*; public class TypeScriptGenerator { public static final String Version = getVersion(); private final Settings settings; private TypeProcessor typeProcessor = null; private ModelParser modelParser = null; private ModelCompiler modelCompiler = null; private Emitter emitter = null; private NpmPackageJsonEmitter npmPackageJsonEmitter = null; public TypeScriptGenerator() { this (new Settings()); } public TypeScriptGenerator(Settings settings) { this.settings = settings; settings.validate(); } public static void printVersion() { System.out.println("Running TypeScriptGenerator version " + Version); } public String generateTypeScript(Input input) { final StringWriter stringWriter = new StringWriter(); generateTypeScript(input, Output.to(stringWriter)); return stringWriter.toString(); } public void generateTypeScript(Input input, Output output) { generateTypeScript(input, output, false, 0); } public void generateEmbeddableTypeScript(Input input, Output output, boolean addExportKeyword, int initialIndentationLevel) { generateTypeScript(input, output, addExportKeyword, initialIndentationLevel); } private void generateTypeScript(Input input, Output output, boolean forceExportKeyword, int initialIndentationLevel) { final Model model = getModelParser().parseModel(input.getSourceTypes()); final TsModel tsModel = getModelCompiler().javaToTypeScript(model); getEmitter().emit(tsModel, output.getWriter(), output.getName(), output.shouldCloseWriter(), forceExportKeyword, initialIndentationLevel); generateNpmPackageJson(output); } private void generateNpmPackageJson(Output output) { if (settings.generateNpmPackageJson) { if (output.getName() == null) { throw new RuntimeException("Generating NPM package.json can only be used when output is specified using file name"); } final File outputFile = new File(output.getName()); final Output npmOutput = Output.to(new File(outputFile.getParent(), "package.json")); final NpmPackageJson npmPackageJson = new NpmPackageJson(); npmPackageJson.name = settings.npmName; npmPackageJson.version = settings.npmVersion; npmPackageJson.types = outputFile.getName(); if (settings.outputFileType == TypeScriptFileType.implementationFile) { npmPackageJson.main = Utils.replaceExtension(outputFile, ".js").getName(); npmPackageJson.dependencies = !settings.npmPackageDependencies.isEmpty() ? settings.npmPackageDependencies : null; npmPackageJson.devDependencies = Collections.singletonMap("typescript", settings.typescriptVersion); npmPackageJson.scripts = Collections.singletonMap("build", "tsc --module umd --moduleResolution node --sourceMap " + outputFile.getName()); } getNpmPackageJsonEmitter().emit(npmPackageJson, npmOutput.getWriter(), npmOutput.getName(), npmOutput.shouldCloseWriter()); } } public TypeProcessor getTypeProcessor() { if (typeProcessor == null) { final List<TypeProcessor> processors = new ArrayList<>(); processors.add(new ExcludingTypeProcessor(settings.getExcludeFilter())); if (settings.customTypeProcessor != null) { processors.add(settings.customTypeProcessor); } processors.add(new CustomMappingTypeProcessor(settings.customTypeMappings)); processors.add(new DefaultTypeProcessor()); typeProcessor = new TypeProcessor.Chain(processors); } return typeProcessor; } public ModelParser getModelParser() { if (modelParser == null) { modelParser = createModelParser(); } return modelParser; } private ModelParser createModelParser() { switch (settings.jsonLibrary) { case jackson1: return new Jackson1Parser(settings, getTypeProcessor()); case jackson2: return new Jackson2Parser(settings, getTypeProcessor()); case jaxb: return new Jackson2Parser(settings, getTypeProcessor(), /*useJaxbAnnotations*/ true); default: throw new RuntimeException(); } } public ModelCompiler getModelCompiler() { if (modelCompiler == null) { modelCompiler = new ModelCompiler(settings, getTypeProcessor()); } return modelCompiler; } public Emitter getEmitter() { if (emitter == null) { emitter = new Emitter(settings); } return emitter; } public NpmPackageJsonEmitter getNpmPackageJsonEmitter() { if (npmPackageJsonEmitter == null) { npmPackageJsonEmitter = new NpmPackageJsonEmitter(); } return npmPackageJsonEmitter; } private static String getVersion() { try { final InputStream inputStream = TypeScriptGenerator.class.getResourceAsStream( "/META-INF/maven/cz.habarta.typescript-generator/typescript-generator-core/pom.properties"); if (inputStream != null) { final Properties properties = new Properties(); properties.load(inputStream); return (String) properties.get("version"); } return null; } catch (Exception e) { return null; } } }