+const readVersionWith = (lookup, discard = () => {}) => name => {
+ const key = formatVersionKey(name);
+ const version = lookup(key);
+ return version ? {
+ get version() { return String(version).trim() },
+ discard() { discard(key, version) },
+ orElse(alt) { alt.discard(); return this }
+ } : {
+ get version() {
+ throw new Error(`Missing \`${name}\` version! You can provide it as a \`${prefixNpmCfgKey(key)}\` npm configuration parameter or as a \`${formatEnvVar(key)}\` environment variable.`);
+ },
+ discard() {},
+ orElse(alt) { return alt }
+ };
+};
+
+const readPkgVersion = readVersionWith(key => pkg[key]);
+const readCfgVersion = readVersionWith(key => {
+ return process.env[`npm_config_${formatNpmCfgVar(pkg.name)}_${formatNpmCfgVar(key)}`];
+}, (key, version) => {
+ console.warn(`Ignoring \`${prefixNpmCfgKey(key)}\` npm configuration parameter (${version}).`);
+});
+const readEnvVersion = readVersionWith(key => {
+ return process.env[formatEnvVar(key)];
+}, (key, version) => {
+ console.warn(`Ignoring \`${formatEnvVar(key)}\` environment variable (${version}).`);
+});
+
+const readVersion = name =>
+ readPkgVersion(name)
+ .orElse(readEnvVersion(name))
+ .orElse(readCfgVersion(name))
+ .version;