/** * Copyright (c) 2013-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 tern.server.nodejs.process; import java.io.File; import java.util.ArrayList; import java.util.List; import tern.OS; /** * NPM path helper. * */ public class NPMProcessHelper { private static final String[] WINDOWS_NODE_PATHS = new String[] { "C:/Program Files/nodejs/npm.cmd".replace('/', File.separatorChar), "C:/Program Files (x86)/nodejs/npm.cmd".replace('/', File.separatorChar), "npm.cmd" }; private static final String[] MACOS_NODE_PATHS = new String[] { "/usr/local/bin/npm", "/opt/local/bin/npm", "npm" }; private static final String[] LINUX_NODE_PATHS = new String[] { "/usr/local/bin/npm", "npm" }; private NPMProcessHelper() { } public static String getNPMPath(OS os) { String path = getDefaultNPMPath(os); if (path != null) { return path; } File nodeFile = findNPM(os); if (nodeFile != null) { return nodeFile.getAbsolutePath(); } return "npm"; } public static String getDefaultNPMPath(OS os) { String[] paths = getDefaultNPMPaths(os); String path = null; for (int i = 0; i < paths.length; i++) { path = paths[i]; if (new File(path).exists()) { return path; } } return null; } public static String[] getDefaultNPMPaths(OS os) { switch (os) { case Windows: return WINDOWS_NODE_PATHS; case MacOS: return MACOS_NODE_PATHS; default: return LINUX_NODE_PATHS; } } public static File findNPM(OS os) { String nodeFileName = getNodeFileName(os); String path = System.getenv("PATH"); String[] paths = path.split("" + File.pathSeparatorChar, 0); List<String> directories = new ArrayList<String>(); for (String p : paths) { directories.add(p); } // ensure /usr/local/bin is included for OS X if (os == OS.MacOS) { directories.add("/usr/local/bin"); } // search for Node.js in the PATH directories for (String directory : directories) { File nodeFile = new File(directory, nodeFileName); if (nodeFile.exists()) { return nodeFile; } } return null; } private static String getNodeFileName(OS os) { if (os == OS.Windows) { return "npm.cmd"; } return "npm"; } }