getenv
Advanced tools
Comparing version 0.7.0 to 1.0.0
151
index.js
@@ -1,1 +0,150 @@ | ||
module.exports = require('./lib/getenv'); | ||
const util = require('util'); | ||
const url = require('url'); | ||
let fallbacksDisabled = false; | ||
let throwError = true; | ||
function _value(varName, fallback) { | ||
const value = process.env[varName]; | ||
if (value === undefined) { | ||
if (fallback === undefined && !throwError) { | ||
return value; | ||
} | ||
if (fallback === undefined) { | ||
throw new Error( | ||
'GetEnv.Nonexistent: ' + varName + ' does not exist ' + 'and no fallback value provided.' | ||
); | ||
} | ||
if (fallbacksDisabled) { | ||
throw new Error( | ||
'GetEnv.DisabledFallbacks: ' + | ||
varName + | ||
' relying on fallback ' + | ||
'when fallbacks have been disabled' | ||
); | ||
} | ||
return '' + fallback; | ||
} | ||
return value; | ||
} | ||
const convert = { | ||
string: function(value) { | ||
return '' + value; | ||
}, | ||
int: function(value) { | ||
const isInt = value.match(/^-?\d+$/); | ||
if (!isInt) { | ||
throw new Error('GetEnv.NoInteger: ' + value + ' is not an integer.'); | ||
} | ||
return +value; | ||
}, | ||
float: function(value) { | ||
const isInfinity = +value === Infinity || +value === -Infinity; | ||
if (isInfinity) { | ||
throw new Error('GetEnv.Infinity: ' + value + ' is set to +/-Infinity.'); | ||
} | ||
const isFloat = !(isNaN(value) || value === ''); | ||
if (!isFloat) { | ||
throw new Error('GetEnv.NoFloat: ' + value + ' is not a number.'); | ||
} | ||
return +value; | ||
}, | ||
bool: function(value) { | ||
const isBool = value === 'true' || value === 'false'; | ||
if (!isBool) { | ||
throw new Error('GetEnv.NoBoolean: ' + value + ' is not a boolean.'); | ||
} | ||
return value === 'true'; | ||
}, | ||
boolish: function(value) { | ||
try { | ||
return convert.bool(value); | ||
} catch (err) { | ||
const isBool = value === '1' || value === '0'; | ||
if (!isBool) { | ||
throw new Error('GetEnv.NoBoolean: ' + value + ' is not a boolean.'); | ||
} | ||
return value === '1'; | ||
} | ||
}, | ||
url: url.parse, | ||
}; | ||
function converter(type) { | ||
return function(varName, fallback) { | ||
if (typeof varName == 'string') { | ||
// default | ||
const value = _value(varName, fallback); | ||
return convert[type](value); | ||
} else { | ||
// multibert! | ||
return getenv.multi(varName); | ||
} | ||
}; | ||
} | ||
const getenv = converter('string'); | ||
Object.keys(convert).forEach(function(type) { | ||
getenv[type] = converter(type); | ||
}); | ||
getenv.array = function array(varName, type, fallback) { | ||
type = type || 'string'; | ||
if (Object.keys(convert).indexOf(type) === -1) { | ||
throw new Error('GetEnv.ArrayUndefinedType: Unknown array type ' + type); | ||
} | ||
const value = _value(varName, fallback); | ||
return value.split(/\s*,\s*/).map(convert[type]); | ||
}; | ||
getenv.multi = function multi(spec) { | ||
const result = {}; | ||
for (let key in spec) { | ||
const value = spec[key]; | ||
if (util.isArray(value)) { | ||
// default value & typecast | ||
switch (value.length) { | ||
case 1: // no default value | ||
case 2: // no type casting | ||
result[key] = getenv(value[0], value[1]); // dirty, when case 1: value[1] is undefined | ||
break; | ||
case 3: // with typecast | ||
result[key] = getenv[value[2]](value[0], value[1]); | ||
break; | ||
default: | ||
// wtf? | ||
throw 'getenv.multi(): invalid spec'; | ||
break; | ||
} | ||
} else { | ||
// value or throw | ||
result[key] = getenv(value); | ||
} | ||
} | ||
return result; | ||
}; | ||
getenv.disableFallbacks = function() { | ||
fallbacksDisabled = true; | ||
}; | ||
getenv.enableFallbacks = function() { | ||
fallbacksDisabled = false; | ||
}; | ||
getenv.disableErrors = function() { | ||
throwError = false; | ||
}; | ||
getenv.enableErrors = function() { | ||
throwError = true; | ||
}; | ||
module.exports = getenv; |
@@ -12,3 +12,4 @@ { | ||
], | ||
"version": "0.7.0", | ||
"version": "1.0.0", | ||
"license": "MIT", | ||
"homepage": "https://github.com/ctavan/node-getenv", | ||
@@ -19,11 +20,14 @@ "repository": { | ||
}, | ||
"main": "./index", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "make test" | ||
"prettier": "prettier --write *.{js,md} **/*.js", | ||
"test": "bash -ec 'for F in test/*.js; do echo \"$F\": ; node $F; done;'" | ||
}, | ||
"engines": { | ||
"node": "*" | ||
"node": ">=6" | ||
}, | ||
"dependencies": {}, | ||
"devDependencies": {}, | ||
"devDependencies": { | ||
"prettier": "^1.18.2" | ||
}, | ||
"keywords": [ | ||
@@ -30,0 +34,0 @@ "env", |
@@ -13,2 +13,4 @@ # getenv | ||
TypeScript types are available from the `@types/getenv` module. | ||
## Usage | ||
@@ -30,14 +32,14 @@ | ||
```javascript | ||
var getenv = require('getenv'); | ||
const getenv = require('getenv'); | ||
var host = getenv('HTTP_HOST'); // same as getenv.string('HTTP_HOST'); | ||
var port = getenv.int('HTTP_PORT'); | ||
var start = getenv.bool('HTTP_START'); | ||
const host = getenv('HTTP_HOST'); // same as getenv.string('HTTP_HOST'); | ||
const port = getenv.int('HTTP_PORT'); | ||
const start = getenv.bool('HTTP_START'); | ||
if (start === true) { | ||
// var server = http.createServer(); | ||
// const server = http.createServer(); | ||
// server.listen(port, host); | ||
} | ||
var abTestRatio = getenv.float('AB_TEST_RATIO'); | ||
const abTestRatio = getenv.float('AB_TEST_RATIO'); | ||
@@ -50,3 +52,3 @@ if (Math.random() < abTestRatio) { | ||
var keywords = getenv.array('KEYWORDS'); | ||
const keywords = getenv.array('KEYWORDS'); | ||
keywords.forEach(function(keyword) { | ||
@@ -56,3 +58,3 @@ // console.log(keyword); | ||
var primes = getenv.array('PRIMES', 'int'); | ||
const primes = getenv.array('PRIMES', 'int'); | ||
primes.forEach(function(prime) { | ||
@@ -100,9 +102,8 @@ // console.log(prime, typeof prime); | ||
```javascript | ||
var config = getenv.multi({ | ||
foo: "FOO", // throws if FOO doesn't exist | ||
bar: ["BAR", "defaultval"], // set a default value | ||
baz: ["BAZ", "defaultval", "string"], // parse into type | ||
quux: ["QUUX", undefined, "int"] // parse & throw | ||
const config = getenv.multi({ | ||
foo: 'FOO', // throws if FOO doesn't exist | ||
bar: ['BAR', 'defaultval'], // set a default value | ||
baz: ['BAZ', 'defaultval', 'string'], // parse into type | ||
quux: ['QUUX', undefined, 'int'], // parse & throw | ||
}); | ||
``` | ||
@@ -115,3 +116,3 @@ | ||
```javascript | ||
var serviceUrl = getenv.url('SERVICE_URL'); | ||
const serviceUrl = getenv.url('SERVICE_URL'); | ||
@@ -137,3 +138,3 @@ serviceUrl.port; // parsed port number | ||
getenv.disableErrors(); | ||
console.log(getenv("RANDOM")); | ||
console.log(getenv('RANDOM')); | ||
// undefined | ||
@@ -148,7 +149,7 @@ ``` | ||
getenv.disableErrors(); | ||
console.log(getenv("RANDOM")); | ||
console.log(getenv('RANDOM')); | ||
// undefined | ||
getenv.enableErrors(); | ||
console.log(getenv("RANDOM")); | ||
console.log(getenv('RANDOM')); | ||
// Error: GetEnv.Nonexistent: RANDOM does not exist and no fallback value provided. | ||
@@ -159,18 +160,34 @@ ``` | ||
### v1.0.0 | ||
- Drop support for Node.js older than 6. | ||
- Modernize code. | ||
- Add MIT License in package.json and LICENSE.md. | ||
### v0.7.0 | ||
- Add env.disableErrors() / getenv.enableErrors() support. | ||
### v0.6.0 | ||
- Added getenv.boolish() support. | ||
### v0.5.0 | ||
- Add getenv.url() support. | ||
### v0.4.0 | ||
- Add getenv.disableFallbacks() support. | ||
### v0.3.0 | ||
- Add getenv.multi() support. | ||
### v0.2.0 | ||
- Rename git repository | ||
### v0.1.0 | ||
- Initial release | ||
@@ -177,0 +194,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Copyleft License
License(Experimental) Copyleft license information was found
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 34 instances in 1 package
No License Found
License(Experimental) License information could not be found
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found
Found 1 instance in 1 package
0
0
198
1
10184
1
4
132
1