package com.eslint.utils;
import com.eslint.ESLintProjectComponent;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.process.ProcessOutput;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.diagnostic.Logger;
import com.wix.nodejs.NodeRunner;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.concurrent.TimeUnit;
public final class ESLintRunner {
private ESLintRunner() {
}
private static final Logger LOG = Logger.getInstance(ESLintRunner.class);
private static final int TIME_OUT = (int) TimeUnit.SECONDS.toMillis(120L);
public static class ESLintSettings {
public String node;
public String eslintExecutablePath;
public String rules;
public String config;
public String cwd;
public String targetFile;
public String ext;
}
public static ESLintSettings buildSettings(@NotNull String cwd, @NotNull String path, @NotNull ESLintProjectComponent component) {
return ESLintRunner.buildSettings(cwd, path, component.nodeInterpreter, component.eslintExecutable, component.eslintRcFile, component.customRulesPath, component.ext);
}
public static ESLintSettings buildSettings(@NotNull String cwd, @NotNull String path, @NotNull String nodeInterpreter, @NotNull String eslintBin, @Nullable String eslintrc, @Nullable String rulesdir, @Nullable String ext) {
ESLintRunner.ESLintSettings settings = new ESLintRunner.ESLintSettings();
settings.cwd = cwd;
settings.eslintExecutablePath = eslintBin;
settings.node = nodeInterpreter;
settings.rules = rulesdir;
settings.config = eslintrc;
settings.targetFile = path;
settings.ext = ext;
return settings;
}
@NotNull
public static ProcessOutput lint(@NotNull ESLintSettings settings) throws ExecutionException {
GeneralCommandLine commandLine = CliBuilder.createLint(settings);
return NodeRunner.execute(commandLine, TIME_OUT);
}
@NotNull
public static Result lint(@NotNull String cwd, @NotNull String path, @NotNull String nodeInterpreter, @NotNull String eslintBin, @Nullable String eslintrc, @Nullable String rulesdir, @Nullable String ext) {
ESLintRunner.ESLintSettings settings = ESLintRunner.buildSettings(cwd, path, nodeInterpreter, eslintBin, eslintrc, rulesdir, ext);
try {
ProcessOutput output = ESLintRunner.lint(settings);
return Result.processResults(output);
} catch (ExecutionException e) {
LOG.warn("Could not lint file", e);
ESLintProjectComponent.showNotification("Error running ESLint inspection: " + e.getMessage() + "\ncwd: " + cwd + "\ncommand: " + eslintBin, NotificationType.WARNING);
e.printStackTrace();
return Result.createError(e.getMessage());
}
}
@NotNull
public static ProcessOutput fix(@NotNull ESLintSettings settings) throws ExecutionException {
GeneralCommandLine commandLine = CliBuilder.createFix(settings);
return NodeRunner.execute(commandLine, TIME_OUT);
}
@NotNull
private static ProcessOutput version(@NotNull ESLintSettings settings) throws ExecutionException {
GeneralCommandLine commandLine = CliBuilder.createVersion(settings);
return NodeRunner.execute(commandLine, TIME_OUT);
}
@NotNull
public static String runVersion(@NotNull ESLintSettings settings) throws ExecutionException {
if (!new File(settings.eslintExecutablePath).exists()) {
LOG.warn("Calling version with invalid eslint exe " + settings.eslintExecutablePath);
return "";
}
ProcessOutput out = version(settings);
if (out.getExitCode() == 0) {
return out.getStdout().trim();
}
return "";
}
}