class FrontendTools {

    public void validateNodeAndNpmVersion() {
        if (ignoreVersionChecks) {
            return;
        }
        try {
            List<String> nodeVersionCommand = new ArrayList<>();
            nodeVersionCommand.add(getNodeExecutable());
            nodeVersionCommand.add("--version"); // NOSONAR
            FrontendVersion foundNodeVersion = FrontendUtils.getVersion("node",
                    nodeVersionCommand);
            FrontendUtils.validateToolVersion("node", foundNodeVersion,
                    SUPPORTED_NODE_VERSION, SHOULD_WORK_NODE_VERSION);
        } catch (UnknownVersionException e) {
            getLogger().warn("Error checking if node is new enough", e);
        }

        try {
            List<String> npmVersionCommand = new ArrayList<>(
                    getNpmExecutable(false));
            npmVersionCommand.add("--version"); // NOSONAR
            FrontendVersion npmVersion = FrontendUtils.getVersion("npm",
                    npmVersionCommand);
            FrontendUtils.validateToolVersion("npm", npmVersion,
                    SUPPORTED_NPM_VERSION, SHOULD_WORK_NPM_VERSION);
            checkForFaultyNpmVersion(npmVersion);
        } catch (UnknownVersionException e) {
            getLogger().warn("Error checking if npm is new enough", e);
        }

    }

    public  FrontendTools(String baseDir,
            Supplier<String> alternativeDirGetter);
    public  FrontendTools(String baseDir,
                         Supplier<String> alternativeDirGetter,
                         String nodeVersion,
                         URI nodeDownloadRoot);
      FrontendTools(String baseDir, Supplier<String> alternativeDirGetter,
            String nodeVersion, URI nodeDownloadRoot,
            boolean ignoreVersionChecks);

}