public static nvmSupport()

in src/utils/nodeVersionHelper.ts [54:122]


	public static nvmSupport(config: ICordovaAttachRequestArgs | ICordovaLaunchRequestArgs): void {

		let bin: string | undefined = undefined;
		let versionManagerName: string | undefined = undefined;

		// first try the Node Version Switcher 'nvs'
		let nvsHome = process.env["NVS_HOME"];
		if (!nvsHome) {
			// NVS_HOME is not always set. Probe for 'nvs' directory instead
			const nvsDir = process.platform === "win32" ? path.join(process.env["LOCALAPPDATA"] || "", "nvs") : path.join(process.env["HOME"] || "", ".nvs");
			if (fs.existsSync(nvsDir)) {
				nvsHome = nvsDir;
			}
		}

		const { nvsFormat, remoteName, semanticVersion, arch } = NodeVersionHelper.parseVersionString(config.runtimeVersion);

		if (nvsFormat || nvsHome) {
			if (nvsHome) {
				bin = path.join(nvsHome, remoteName, semanticVersion, arch);
				if (process.platform !== "win32") {
					bin = path.join(bin, "bin");
				}
				versionManagerName = "nvs";
			} else {
				throw new Error(localize("nvsHomeNotFoundMessage", "Attribute 'runtimeVersion' requires Node.js version manager 'nvs'."));
			}
		}

		if (!bin) {

			// now try the Node Version Manager "nvm"
			if (process.platform === "win32") {
				const nvmHome = process.env["NVM_HOME"];
				if (!nvmHome) {
					throw new Error(localize("nvmWindowsNotFoundMessage", "Attribute 'runtimeVersion' requires Node.js version manager 'nvm-windows' or 'nvs'."));
				}
				bin = path.join(nvmHome, `v${config.runtimeVersion}`);
				versionManagerName = "nvm-windows";
			} else {	// macOS and linux
				let nvmHome = process.env["NVM_DIR"];
				if (!nvmHome) {
					// if NVM_DIR is not set. Probe for '.nvm' directory instead
					const nvmDir = path.join(process.env["HOME"] || "", ".nvm");
					if (fs.existsSync(nvmDir)) {
						nvmHome = nvmDir;
					}
				}
				if (!nvmHome) {
					throw new Error(localize("nvmHomeNotFoundMessage", "Attribute 'runtimeVersion' requires Node.js version manager 'nvm' or 'nvs'."));
				}
				bin = path.join(nvmHome, "versions", "node", `v${config.runtimeVersion}`, "bin");
				versionManagerName = "nvm";
			}
		}

		if (fs.existsSync(bin)) {
			if (!config.env) {
				config.env = {};
			}
			if (process.platform === "win32") {
				process.env["Path"] = `${bin};${process.env["Path"]}`;
			} else {
				process.env["PATH"] = `${bin}:${process.env["PATH"]}`;
			}
		} else {
			throw new Error(localize("runtimeVersionNotFoundMessage", "Node.js version '{0}' not installed for '{1}'.", config.runtimeVersion, versionManagerName));
		}
	}