package com.scss.utils;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.process.ProcessOutput;
import com.intellij.openapi.diagnostic.Logger;
import com.scss.utils.scssLint.Lint;
import com.scss.utils.scssLint.LintResult;
import com.wix.nodejs.NodeRunner;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.concurrent.TimeUnit;
public final class ScssLintRunner {
private ScssLintRunner() {
}
private static final Logger LOG = Logger.getInstance(ScssLintRunner.class);
private static final int TIME_OUT = (int) TimeUnit.SECONDS.toMillis(120L);
/**
* One or more files specified were not found
*/
private static final int FILES_NOT_FOUND = 66;
public static class ScssLintSettings {
public ScssLintSettings() {
}
public ScssLintSettings(String config, String cwd, String targetFile, String scssLintExe) {
this.config = config;
this.cwd = cwd;
this.targetFile = targetFile;
this.scssLintExe = scssLintExe;
}
public String config;
public String cwd;
public String targetFile;
public String scssLintExe;
}
public static ScssLintSettings buildSettings(@NotNull String cwd, @NotNull String path, @NotNull String scssLintExe, @Nullable String config) {
return new ScssLintSettings(config, cwd, path, scssLintExe);
}
public static LintResult runLint(@NotNull String cwd, @NotNull String file, @NotNull String scssLintExe, @Nullable String config) {
LintResult result = new LintResult();
try {
ProcessOutput out = lint(cwd, file, scssLintExe, config);
// if (out.getExitCode() == 0) {
// } else {
result.errorOutput = out.getStderr();
try {
if (out.getExitCode() != FILES_NOT_FOUND) {
result.lint = Lint.parse(out.getStdout());
}
} catch (Exception e) {
result.errorOutput = out.getStdout();
}
// }
} catch (Exception e) {
e.printStackTrace();
result.errorOutput = e.toString();
}
return result;
}
@NotNull
public static ProcessOutput lint(@NotNull String cwd, @NotNull String file, @NotNull String scssLintExe, @Nullable String config) throws ExecutionException {
//scss-lint one.scss -f XML
GeneralCommandLine commandLine = new GeneralCommandLine();
commandLine.setWorkDirectory(cwd);
// if (SystemInfo.isWindows) {
// commandLine.setExePath(settings.eslintExecutablePath);
// } else {
// commandLine.setExePath(settings.node);
// commandLine.addParameter(settings.eslintExecutablePath);
// }
commandLine.setExePath(scssLintExe);
// GeneralCommandLine commandLine = createCommandLine(buildSettings(cwd, file, scssLintExe, config));
commandLine.addParameter(file);
commandLine.addParameter("-f");
commandLine.addParameter("JSON");
// commandLine.addParameter("XML");
if (StringUtils.isNotEmpty(config)) {
commandLine.addParameter("-c");
commandLine.addParameter(config);
}
return NodeRunner.execute(commandLine, TIME_OUT);
}
@NotNull
private static ProcessOutput version(@NotNull ScssLintSettings settings) throws ExecutionException {
GeneralCommandLine commandLine = createCommandLine(settings);
commandLine.addParameter("-v");
return NodeRunner.execute(commandLine, TIME_OUT);
}
@NotNull
public static String runVersion(@NotNull ScssLintSettings settings) throws ExecutionException {
if (!new File(settings.scssLintExe).exists()) {
LOG.warn("Calling version with invalid scssLintExe exe " + settings.scssLintExe);
return "";
}
ProcessOutput out = version(settings);
if (out.getExitCode() == 0) {
return out.getStdout().trim();
}
return "";
}
@NotNull
private static GeneralCommandLine createCommandLine(@NotNull ScssLintSettings settings) {
GeneralCommandLine commandLine = new GeneralCommandLine();
commandLine.setWorkDirectory(settings.cwd);
commandLine.setExePath(settings.scssLintExe);
return commandLine;
}
}