ts.resources.jsonconfig.TsconfigJson.java Source code

Java tutorial

Introduction

Here is the source code for ts.resources.jsonconfig.TsconfigJson.java

Source

/**
 *  Copyright (c) 2015-2016 Angelo ZERR.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  Contributors:
 *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
 */
package ts.resources.jsonconfig;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;

import ts.cmd.tsc.CompilerOptions;
import ts.utils.BooleanUtils;
import ts.utils.FileUtils;
import ts.utils.StringUtils;

/**
 * Pojo for tsconfig.json
 * 
 * @see http://www.typescriptlang.org/docs/handbook/tsconfig-json.html
 *
 */
public class TsconfigJson {

    // See
    // https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/tsconfig.json

    private static final String DEFAULT_TARGET = "es3";
    private static final String[] AVAILABLE_TARGETS = new String[] { "es3", "es5", "es6", "es2015", "es2016",
            "es2017", "esnext" };
    private static final String[] AVAILABLE_MODULES = new String[] { "none", "commonjs", "amd", "umd", "system",
            "es6", "es2015" };
    private static final String DEFAULT_MODULE_RESOLUTION = "classic";
    private static final String[] AVAILABLE_MODULE_RESOLUTIONS = new String[] { "node", "classic" };

    private CompilerOptions compilerOptions;

    private Boolean compileOnSave;

    private Boolean buildOnSave;

    private List<String> files;

    private List<String> exclude;

    private List<String> defaultExclude;

    public TsconfigJson() {
    }

    public void setCompilerOptions(CompilerOptions compilerOptions) {
        this.compilerOptions = compilerOptions;
    }

    public CompilerOptions getCompilerOptions() {
        return compilerOptions;
    }

    public boolean isCompileOnSave() {
        return BooleanUtils.toBoolean(compileOnSave);
    }

    public void setCompileOnSave(Boolean compileOnSave) {
        this.compileOnSave = compileOnSave;
    }

    /**
     * Returns true if build must be done on save and false otherwise. This
     * property doesn't belong to the standard specification of tsconfig.json,
     * it comes from the atom-typescript.
     * 
     * Build means compile all files. Useful if for some reason you are using
     * --out. Default is false. Note that build is a slow process, therefore we
     * recommend leaving it off. But in case this is the way you want to go its
     * there for your convenience.
     * 
     * @see https://github.com/TypeStrong/atom-typescript/blob/master/docs/tsconfig.md#buildonsave
     * @return true if build must ne done on save and false otherwise.
     */
    public boolean isBuildOnSave() {
        return BooleanUtils.toBoolean(buildOnSave);
    }

    /**
     * Set to true if build must be done on save and false otherwise. This
     * property doesn't belong to the standard specification of tsconfig.json,
     * it comes from the atom-typescript.
     * 
     * Build means compile all files. Useful if for some reason you are using
     * --out. Default is false. Note that build is a slow process, therefore we
     * recommend leaving it off. But in case this is the way you want to go its
     * there for your convenience.
     * 
     * @see https://github.com/TypeStrong/atom-typescript/blob/master/docs/tsconfig.md#buildonsave
     * 
     * @param buildOnSave
     */
    public void setBuildOnSave(boolean buildOnSave) {
        this.buildOnSave = buildOnSave;
    }

    public List<String> getFiles() {
        return files;
    }

    public void setFiles(List<String> files) {
        this.files = files;
    }

    public boolean hasFiles() {
        return files != null;
    }

    public List<String> getExclude() {
        return exclude;
    }

    public void setExclude(List<String> exclude) {
        this.exclude = exclude;
    }

    public boolean hasExclude() {
        return exclude != null;
    }

    /**
     * Returns true if the "compilerOptions" defines "out" or "outFile" and
     * false otherwise.
     * 
     * @return true if the "compilerOptions" defines "out" or "outFile" and
     *         false otherwise.
     */
    public boolean hasOutFile() {
        CompilerOptions options = getCompilerOptions();
        if (options == null) {
            return false;
        }
        return !StringUtils.isEmpty(options.getOutFile()) || !StringUtils.isEmpty(options.getOut());
    }

    /**
     * Returns true if the "compilerOptions" defines "paths" and false
     * otherwise.
     * 
     * @return true if the "compilerOptions" defines "paths" and false
     *         otherwise.
     */
    public boolean hasPaths() {
        CompilerOptions options = getCompilerOptions();
        if (options == null) {
            return false;
        }
        return !options.getPathsKeys().isEmpty();
    }

    /**
     * Returns true if the "compilerOptions" defines "rootDirs" and false
     * otherwise.
     * 
     * @return true if the "compilerOptions" defines "rootDirs" and false
     *         otherwise.
     */
    public boolean hasRootDirs() {
        CompilerOptions options = getCompilerOptions();
        if (options == null) {
            return false;
        }
        return !options.getRootDirs().isEmpty();
    }

    /**
     * Returns the defined "exclude" list from the tsconfig.json other exclude
     * by default "node_modules" and "bower_components".
     * 
     * @return the defined "exclude" list from the tsconfig.json other exclude
     *         by default "node_modules" and "bower_components".
     */
    protected List<String> getDefaultOrDefinedExclude() {
        if (exclude != null) {
            return exclude;
        }
        if (defaultExclude != null) {
            return defaultExclude;
        }
        // by default exclude node_modules, bower_components and any specificied
        // output directory (see this rule used in the tsc.js)
        this.defaultExclude = new ArrayList<String>(
                Arrays.asList(FileUtils.NODE_MODULES, FileUtils.BOWER_COMPONENTS));
        CompilerOptions options = getCompilerOptions();
        if (options != null && !StringUtils.isEmpty(options.getOutDir())) {
            defaultExclude.add(options.getOutDir());
        }
        return defaultExclude;
    }

    /**
     * Load tsconfig.json instance from the given reader.
     * 
     * @param reader
     * @return tsconfig.json instance from the given reader.
     */
    public static TsconfigJson load(Reader reader) {
        return load(reader, TsconfigJson.class);
    }

    public static <T extends TsconfigJson> T load(Reader json, Class<T> classOfT) {
        Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
        T o = gson.fromJson(json, classOfT);
        if (o == null) {
            throw new JsonSyntaxException("JSON Syntax error");
        }
        return o;
    }

    public static <T extends TsconfigJson> T load(InputStream in, Class<T> classOfT) {
        Reader isr = null;
        try {
            isr = new InputStreamReader(in);
            return load(isr, classOfT);
        } finally {
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                }
            }
        }
    }

    /**
     * Load tsconfig.json instance from the given input stream.
     * 
     * @param in
     * @return tsconfig.json instance from the given input stream
     */
    public static TsconfigJson load(InputStream in) {
        return load(in, TsconfigJson.class);
    }

    /**
     * Returns the available targets.
     * 
     * @return the available targets.
     */
    public static String[] getAvailableTargets() {
        return AVAILABLE_TARGETS;
    }

    /**
     * Returns the default target.
     * 
     * @return the default target.
     */
    public static String getDefaultTarget() {
        return DEFAULT_TARGET;
    }

    /**
     * Returns the available modules.
     * 
     * @return the available modules.
     */
    public static String[] getAvailableModules() {
        return AVAILABLE_MODULES;
    }

    /**
     * Returns the available module resolutions.
     * 
     * @return the available module resolutions.
     */
    public static String[] getAvailableModuleResolutions() {
        return AVAILABLE_MODULE_RESOLUTIONS;
    }

    /**
     * Returns the default module resolution.
     * 
     * @return the default module resolution.
     */
    public static String getDefaultModuleResolution() {
        return DEFAULT_MODULE_RESOLUTION;
    }

}