UNPKG

@iobroker/create-adapter

Version:

Command line utility to create customized ioBroker adapters

97 lines 4.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const axios_1 = require("axios"); const semver = require("semver"); const tools_1 = require("./tools"); const allVersionsCache = new Map(); const latestVersionCache = new Map(); function hasVersionSpecifier(packageName) { return packageName.lastIndexOf("@") > 0; } exports.hasVersionSpecifier = hasVersionSpecifier; function getVersionSpecifier(packageNameAndVersion) { const atIndex = packageNameAndVersion.lastIndexOf("@"); if (atIndex > 0) return packageNameAndVersion.slice(atIndex + 1); } exports.getVersionSpecifier = getVersionSpecifier; /** Returns only the package name from a string of the form [@scope/]package-name@version */ function getPackageName(packageNameAndVersion) { const atIndex = packageNameAndVersion.lastIndexOf("@"); if (atIndex > 0) { return packageNameAndVersion.slice(0, atIndex); } return packageNameAndVersion; } exports.getPackageName = getPackageName; /** * Returns the latest version of an npm package * @param packageName The npm package name * @param fallbackVersion The fallback version to return in case anything goes wrong. If this is set, no error is thrown. */ async function fetchAllPackageVersions(packageName) { if (allVersionsCache.has(packageName)) return allVersionsCache.get(packageName); const packageURIComponent = encodeURIComponent(packageName); const url = `https://registry.npmjs.org/${packageURIComponent}`; let options = { url, timeout: tools_1.getRequestTimeout() }; // If an https-proxy is defined as an env variable, use it options = tools_1.applyHttpsProxy(options); const response = await axios_1.default(options); if (response.status !== 200) { throw new Error(`Failed to fetch the versions for ${packageName} (${response.status})`); } const allVersions = Object.keys(response.data.versions); allVersionsCache.set(packageName, allVersions); return allVersions; } async function fetchSpecificPackageVersion(packageNameAndVersion, fallbackVersion) { // A specific version is requested, return the highest version matching the specifier try { const versionSpecifier = getVersionSpecifier(packageNameAndVersion); const packageName = getPackageName(packageNameAndVersion); const allVersions = await fetchAllPackageVersions(packageName); const ret = semver.maxSatisfying(allVersions, versionSpecifier); if (!ret) throw new Error(`No version of ${packageName} found matching ${versionSpecifier}`); return ret; } catch (e) { if (fallbackVersion) return fallbackVersion; throw e; } } async function fetchLatestPackageVersion(packageName, fallbackVersion) { if (latestVersionCache.has(packageName)) return latestVersionCache.get(packageName); const packageURIComponent = encodeURIComponent(packageName); const url = `https://registry.npmjs.org/-/package/${packageURIComponent}/dist-tags`; let options = { url, timeout: tools_1.getRequestTimeout() }; // If an https-proxy is defined as an env variable, use it options = tools_1.applyHttpsProxy(options); const response = await axios_1.default(options); if (response.status !== 200) { if (fallbackVersion) return fallbackVersion; throw new Error(`Failed to fetch the version for ${packageName} (${response.status})`); } const version = response.data.latest; latestVersionCache.set(packageName, version); return version; } /** * Returns the latest version of an npm package * @param packageName The npm package name * @param fallbackVersion The fallback version to return in case anything goes wrong. If this is set, no error is thrown. */ async function fetchPackageVersion(packageName, fallbackVersion) { if (hasVersionSpecifier(packageName)) { return fetchSpecificPackageVersion(packageName, fallbackVersion); } else { return fetchLatestPackageVersion(packageName, fallbackVersion); } } exports.fetchPackageVersion = fetchPackageVersion; //# sourceMappingURL=packageVersions.js.map