package com.intellij.lang.javascript.linter.tslint.ui;
import com.intellij.javascript.nodejs.PackageJsonData;
import com.intellij.lang.javascript.JSBundle;
import com.intellij.lang.javascript.buildTools.npm.PackageJsonUtil;
import com.intellij.lang.javascript.linter.JSLinterBaseView;
import com.intellij.lang.javascript.linter.JSLinterConfigurable;
import com.intellij.lang.javascript.linter.tslint.config.TsLintConfiguration;
import com.intellij.lang.javascript.linter.tslint.config.TsLintState;
import com.intellij.lang.javascript.linter.tslint.service.TsLintLanguageService;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
/**
* @author Irina.Chernushina on 6/3/2015.
*/
public class TsLintConfigurable extends JSLinterConfigurable<TsLintState> {
@NonNls public static final String SETTINGS_JAVA_SCRIPT_LINTERS_TSLINT = "settings.javascript.linters.tslint";
public TsLintConfigurable(@NotNull Project project) {
super(project, TsLintConfiguration.class, false);
}
public TsLintConfigurable(@NotNull Project project, boolean fullModeDialog) {
super(project, TsLintConfiguration.class, fullModeDialog);
}
@NotNull
@Override
protected JSLinterBaseView<TsLintState> createView() {
return new TsLintView(getProject(), isFullModeDialog());
}
@NotNull
@Override
public String getId() {
return SETTINGS_JAVA_SCRIPT_LINTERS_TSLINT;
}
@Nls
@Override
public String getDisplayName() {
return JSBundle.message("settings.javascript.linters.tslint.configurable.name");
}
@Override
public void apply() throws ConfigurationException {
super.apply();
final TsLintState state = getExtendedState(TsLintConfiguration.class).getState();
if (!StringUtil.isEmptyOrSpaces(state.getPackagePath()) && state.isAllowJs()) {
if (!checkPackageVersionForJs(state.getPackagePath())) throw new ConfigurationException("Linting JavaScript is not supported for this version of TSLint.");
}
final TsLintLanguageService service = TsLintLanguageService.getService(myProject);
service.terminateStartedProcess(false);
}
private static boolean checkPackageVersionForJs(final String packagePath) {
final VirtualFile packageVf = LocalFileSystem.getInstance().findFileByPath(packagePath);
if (packageVf != null) {
final VirtualFile packageJson = packageVf.findChild(PackageJsonUtil.FILE_NAME);
if (packageJson != null) {
final PackageJsonData data = PackageJsonUtil.getOrCreateData(packageJson);
return data.getVersion() != null && data.getVersion().getMajor() >= 4;
}
}
return false;
}
}