{"_id":"@absxn/process-env-parser","_rev":"6-c2cd9a1cceb43b676147a237abbb39d5","name":"@absxn/process-env-parser","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0-beta.0":{"name":"@absxn/process-env-parser","version":"1.0.0-beta.0","description":"Straightforward and safe environment variable parser for bootstrapping node applications","keywords":["env","variable","environment","parser","typescript","node","process"],"homepage":"https://github.com/absxn/process-env-parser","main":"dist/process-env-parser.js","types":"dist/process-env-parser.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"scripts":{"build":"tsc -p .","test":"jest --coverage"},"author":{"name":"absxn.com"},"license":"ISC","devDependencies":{"@types/jest":"^24.0.15","@types/node":"^12.6.8","jest":"^24.8.0","prettier":"^1.18.2","ts-jest":"^24.0.2","ts-node":"^8.3.0","typescript":"^3.5.3"},"gitHead":"388b1a6fb9d7178a390dfb1e6669b6038d5a1257","bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"_id":"@absxn/process-env-parser@1.0.0-beta.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-X4uGhUxsuSCTsAMc+Lgnv2cfYTPNQxL/VK8Ej0jJcSEL812vdmxvGimW0EEsBEkQUJMBR5V/B87uDEeOZMlgTA==","shasum":"5a8b5d51877573e5d0316f83373c74e9caf6e4f4","tarball":"https://registry.npmjs.org/@absxn/process-env-parser/-/process-env-parser-1.0.0-beta.0.tgz","fileCount":4,"unpackedSize":19742,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT12iCRA9TVsSAnZWagAALK4QAIjMee0FnESki6/bKxk4\nmkrkgFmWsn1vTEL22mEtFtblELbTIrwzTQkIjTak3KvruPnN8YcX0TbFMPxb\niA11xP21LOBbCGdES2F6ik8fD3ZC212qtq+GzSY3aXw8TFGRZnJGniwr5z2t\nu25lKCUJpF5ah+SGeR2/AWCLPXWv2zPpGM0FTiRMs0Ibfmk0jwZLHGY6egdi\np7Zi1a70Kbl5OYk6XepauBFnRYiu+OPXC8OsxUCmj+FaJnIJxt51AIV6VAAC\nv/iGqmOEK6wAPlYOjVtiyPOR3WBqG04nbTUH7fT3smmwAxZB58yrlb0yhDAF\nualzMMx4RWjiDWWa93W9aiGXXQSUVLTQo/QfefRXtfxwjsxawHGJZQK2uieI\nHgk53hH8UyeH+HVf09oOSncm+LIdCXSYhijbCBKbDSi2Xn5OP4og2y5h0Nt9\nWKgRuDWtIIdxg/wkdYjDQsPHFC6gQLlpghemMWP0PxTmusRacUN9FONdekEx\n3c73scXnTjC+7bg2IjgvVpYv8PnfL8s4w2+vkP68lfu+/n5iTdiAvEpimdPO\nbwjyYfeufNoDcP+/q36VNoy2V+XSVT2see2NhzpYahFrOp7NufSUG7jP6Ttp\nVK7zZpPVOQ5aD58WThJklv/uirXPPKLFEvpS4qEib+3p3pNpNf9KfDa+9/Lc\nyXCr\r\n=D0AX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8cDOEdzKSTiIN9OODixnleVeJ3iCeQcDDHGsiPTaBeAIgF8+dJthdQvdcbiPb2hRS8CQ6aS9+b+touiREa6OJq9Y="}]},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"_npmUser":{"name":"teijo","email":"teijo@aropupu.fi"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/process-env-parser_1.0.0-beta.0_1565482401305_0.11438906339996091"},"_hasShrinkwrap":false},"1.0.0-beta.1":{"name":"@absxn/process-env-parser","version":"1.0.0-beta.1","description":"Straightforward and safe environment variable parser for bootstrapping node applications","keywords":["env","variable","environment","parser","typescript","node","process"],"homepage":"https://github.com/absxn/process-env-parser","main":"dist/process-env-parser.js","types":"dist/process-env-parser.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"scripts":{"build":"tsc -p .","test":"jest --coverage"},"author":{"name":"absxn.com"},"license":"ISC","devDependencies":{"@types/jest":"^24.0.15","@types/node":"^12.6.8","jest":"^24.8.0","prettier":"^1.18.2","ts-jest":"^24.0.2","ts-node":"^8.3.0","typescript":"^3.5.3"},"gitHead":"4380f2d43406325e5c519d63714b9bc8c0ba98bc","bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"_id":"@absxn/process-env-parser@1.0.0-beta.1","_nodeVersion":"12.3.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-e/HuTmjTepH6wUW9HtfBBUwZFWK9hX99XhanYX+jQF+uqme48n+eXRmMevLvZYTBzQguJ9TMQpp7tqkfgl2OzA==","shasum":"5ecbd166fa3dabbafb3c8f482a3234cba162b636","tarball":"https://registry.npmjs.org/@absxn/process-env-parser/-/process-env-parser-1.0.0-beta.1.tgz","fileCount":4,"unpackedSize":23307,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrQ9TCRA9TVsSAnZWagAASwAP/3J0brIOZGYhMdaPswt1\nr9D8a/C0Cp4GnxK9RMEGq8yapF3o/3UFttAEURVtoDIGFTQPb/0DU3M/7ZFS\nuarP4ZF5iRm3rBe6xVSgvIkDyZWxgfegu+Xo0adwB1HMtIcsLzD2oTUEs6nD\nDLh/Z8Sj2bBbYnoxZVgScWT7ugyo7F13mbjNtexXC7Wms/ViKtx7eCEvMdUb\niLt3a7kIgETq3gVkuyFHLYrOWvAbAgDmjdpfJE79rA8abGLhE2SJCw2/z+hX\nkjkKOY+4TKIfJmgZdSsuXHwUu1O8kroyIPEg5caLAbGhcKXOBrGji/Da5rLw\nFRqFX+ZEwGgcm7FrfozeH/T2j245UjTGZmmJtASoItshlrjpomIUn74bFl5k\nr74pNF7GPp6DO1mEtsYFKp9lWR8kRY6S9PBTE7qWaIczwEglkjsAeFDGdl21\npmRHekKSEz0NES0lUHfrACXcv0i9vVgOc2e3mUrNzYeLWqY9RexcbPZp2/kL\n3IfWmyraCELwJDmDXtqXCmxjqTIvy6ef8KH6Dj7H0Hx1M83Eb+BtA1bNGrNF\nmOgGXJO3jheawXRTpi8B73BGPv7AEEbpIRS9Ow+bx+fmuFXdgFZWA95YtKwT\nyrv9XZhHVsbkF/9jzaJOvpnQlJ9n1uF7tZgljvr85a0ZWIwQg+4cnRbFP7dX\nIdHO\r\n=uaoN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFB9d4UhWrH0jx47PE8F0b3/ZrDw5K/3ht3do7s4+vNhAiEA3VK+PIoCrVgw2Gkh5XZKAIrvmG9Cv4E/8PnUKmKuAe4="}]},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"_npmUser":{"name":"teijo","email":"teijo@aropupu.fi"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/process-env-parser_1.0.0-beta.1_1571622738855_0.8037347471804863"},"_hasShrinkwrap":false},"1.0.0-beta.2":{"name":"@absxn/process-env-parser","version":"1.0.0-beta.2","description":"Straightforward and safe environment variable parser for bootstrapping node applications","keywords":["env","variable","environment","parser","typescript","node","process"],"homepage":"https://github.com/absxn/process-env-parser","main":"dist/process-env-parser.js","types":"dist/process-env-parser.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"scripts":{"build":"tsc -p .","test":"tsc -p . -p __tests__ --noEmit && jest --coverage"},"author":{"name":"absxn.com"},"license":"ISC","devDependencies":{"@types/jest":"^24.0.15","@types/node":"^12.6.8","jest":"^24.8.0","prettier":"^1.18.2","ts-jest":"^24.0.2","ts-node":"^8.3.0","typescript":"^3.5.3"},"gitHead":"12306fdca77487276630b739e45377913eb407fd","bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"_id":"@absxn/process-env-parser@1.0.0-beta.2","_nodeVersion":"10.7.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-z7ear5FoJMuMvH3SCYce7S5aN6WeyE7zSaI7OQU4fM+Wj4g/++YL35QXXL6X08WUXbX/2Z3ipcTrjSaR/JNUGQ==","shasum":"6fb4d19a45c4e3f9ac06b98d45b08bc8add39665","tarball":"https://registry.npmjs.org/@absxn/process-env-parser/-/process-env-parser-1.0.0-beta.2.tgz","fileCount":4,"unpackedSize":24502,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdtpfKCRA9TVsSAnZWagAAyDYP/RmuTGQBQy1uC/0N5Tz9\nY+yXmIMp5Oj+tI5bHnWX/iQbnbAP7sWEuts5ULK14FKhQMnSdX2dkQIU9q9d\nPqTjBIUPhyLJq6rgz0E5x0oLPdyOjsOZ0vAjIyUBXTu7b72aV2ObvftizPjo\nXUfKSBR7GZ0CjvSCcaIxfoXsqahIEjwbc6FGk1HBxvdOQMhjHt9IJlSfGDjn\npfJRtVPG6KSdWBsUyLqG7I/dsMiMe/0065p2kFNRSmRgiqVacqJLBSXx0Jba\njqFNv2mb9STr2ENZShohYYDgjXP5gNFAM2vzXzNkcPjMmmcTZ+C6zkySh6/5\n3YTksqw4TeJ4mHot+1MWgKZBQHmuvxZXSaKJvb9j5CoghSYgcIOTkhsVOHpg\n/UFvt8U9jrSjaJQe6FfQaTI3jmlJU0AFE7lWxoL4mC67wLLm/DYbW4wdg4os\nNdkkqaam9phNcV0Q6icw7SH+BrwP8r5/PLKGqFxZYZig+UhEk580XUwbaJU2\n2aIHOBC/0pY+Z6dgASDl5ghochlGzF1jYY+puFn7cnz1YRrxtcr1bhQ6zsaS\ntixsEVPU4YbDdosxXcuM+Mju9m1M6cUG+yo3P3B1ZMSxMDjb155VmsWEwBwb\nYVv/lV3rtLL2ZFeBYLrle/Uz0t1uMeNI35t6OSgmSJBVDeO8qj5Adt+X8D0V\n7s9x\r\n=RwS6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJC9sBk9CukUoK28XzHDFaZlaNk6jrE3Wri+kkS9n88AIhAIWrqRLFTo67KuBtODLqRKHC6mcIo2c9JinFJ2mcQbpS"}]},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"_npmUser":{"name":"teijo","email":"teijo@aropupu.fi"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/process-env-parser_1.0.0-beta.2_1572247497559_0.28131524784744255"},"_hasShrinkwrap":false},"1.0.0":{"name":"@absxn/process-env-parser","version":"1.0.0","description":"Straightforward and safe environment variable parser for bootstrapping node applications","keywords":["env","variable","environment","parser","typescript","node","process"],"homepage":"https://github.com/absxn/process-env-parser","main":"dist/process-env-parser.js","types":"dist/process-env-parser.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"scripts":{"build":"tsc -p .","test":"tsc -p . -p __tests__ --noEmit && jest --coverage"},"author":{"name":"absxn.com"},"license":"ISC","devDependencies":{"@types/jest":"^24.0.15","@types/node":"^12.6.8","jest":"^24.8.0","prettier":"^1.18.2","ts-jest":"^24.0.2","ts-node":"^8.3.0","typescript":"^3.5.3"},"gitHead":"8d84e5efee81336d5128d0a95f6f8c38b35b738a","bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"_id":"@absxn/process-env-parser@1.0.0","_nodeVersion":"10.7.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-3HVS6W98ssJlRDYDvOLDGwzu0CmmQgeWI954irUauxBunVHeCgarHkP4wpiFMoQN44VdG1p9kj7Lo+yUB41Cqw==","shasum":"05e3e636ab33035cb3fe7caa13b48ba0f5007d6d","tarball":"https://registry.npmjs.org/@absxn/process-env-parser/-/process-env-parser-1.0.0.tgz","fileCount":4,"unpackedSize":25577,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4FfNCRA9TVsSAnZWagAAnuwP/3qOlIsiFntpqDgVbus9\nbuwoy1ZSS4tnyqpEIrp2FawsFqFKh7hTwkLB5sli6UeVB6UnuSPODe9A+JCG\nj61v3bf6NQc0qxMORa3qiNdRgxK3FnBHDCLPCzAe7q7WRvf361C3gJ7t7DYZ\nN1sV9cp3v2eATFnOyCJYPK0ZYuewZDKibM3gQRfjEEUGVXqIK7H4+dnIW/40\nBIxcAQQLRnFgy9qHqNE5ek/gO6pRmiASNLq8NstloRRHZhsZOcnAJeYKPeRO\nPakB8Hy44mD82mUuAH+lbUILMN2QkHqMEDV2Xw/lrdNYqsP7oSXFexzHkvJS\nWxIipDtlFQrQbUVkbEGVKM3a2pNmJuTQzkRdh2UbydReS2v9DvQDlXiSQ5SB\nDfiq0sZhkK7BBsszbzHCWOX8HpgYIyK/vfzdJ786z6qe56w7A1wS5pHS3zhB\nCVOZZxb833m9jh5JHuiqO4x/nYQQ1GSDJksni4NoR3aNN5X45tZutNukfX1T\nPWObCl+Ulst8jGfjt1ub2EOO87wjd97YpyNIRYPhV0lk+6MAnI6SFgWVKfYL\ndVAFXrDq6SKeTKYx4erK/oluS3VARcNWXVnEKD90QSf4KOKzi6425iVlFtjI\nTTCATwlAhgkw6W8QPrFcmmwkb2FZWqXlDviBhKetG+vvturrvrgH1qNimyGV\n7STT\r\n=DDgq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuo1MF6nMJasBZ/zbY36BF8RPrLlu891s1F74S5PPwUAIhAPxzVDkmNWvo/DYoYo446AjH+etV910a4xpu3ci1z8if"}]},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"_npmUser":{"name":"teijo","email":"teijo@aropupu.fi"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/process-env-parser_1.0.0_1574983628866_0.545912524407405"},"_hasShrinkwrap":false},"1.1.0":{"name":"@absxn/process-env-parser","version":"1.1.0","description":"Straightforward and safe environment variable parser for bootstrapping node applications","keywords":["env","variable","environment","parser","typescript","node","process"],"homepage":"https://github.com/absxn/process-env-parser","main":"dist/process-env-parser.js","types":"dist/process-env-parser.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"scripts":{"build":"tsc -p .","test":"tsc -p . -p __tests__ --noEmit && jest --coverage"},"author":{"name":"absxn.com"},"license":"ISC","devDependencies":{"@types/jest":"^24.0.25","@types/node":"^13.1.2","jest":"^24.9.0","prettier":"^1.19.1","ts-jest":"^24.2.0","ts-node":"^8.5.4","typescript":"^3.7.4"},"gitHead":"98fefbde8a64dfd5ffa90d5e00f2e19fee0e5101","bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"_id":"@absxn/process-env-parser@1.1.0","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-M8Yty7yrmaD/Omb9xuOrf25ORso+mr4qU7Y6pvZfcWPbLW0/hsJ2kmoDBLEwItJisZOmgTvv5h9SLhaJwGJUBA==","shasum":"39e0e6a817d20b9d02c9e17fe04a28d198b6be05","tarball":"https://registry.npmjs.org/@absxn/process-env-parser/-/process-env-parser-1.1.0.tgz","fileCount":4,"unpackedSize":29813,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeDaQ+CRA9TVsSAnZWagAA/0wQAIea22o9rCG5XEipvNvs\n2S0dyqUFn7DyKbqXUsX14TWWjFVI5pY6/c+oH6o7iYLyWFhajllWssENmoSP\nAYR+fOp4ZrPG4vt1Q1godbnUen/OK9IR7ikT59rcrkHAPQIc4huo3H076mRf\niy6c0QeZmqNIDIBTvyGHPxHws9It90YJftv/5C+u3jyIxj5Ut+loX1x6P0Jq\nMkV+TVfgaSeI7mfJSw1sfAIB4YEhGkgdn+/G0UmXJzehWSSq7IhVffQUJWhg\nJDqK+cORyMUN+KGw3Nrs0fPgHuz679zehqWP43Okr/uCOxklGezIxAcYXGTj\nQ2aAEo/PekRjaDuKOkdafPrR1/9lvo48WEafNHePt5CNL1/lOzYtBaOhQOVm\nl3smQkYAvmdKslulxIeonEJHKh0uLOvOMb3n8Y8xO6XXZJ4fImTiVNzemZk6\nRxwUhXTOCMaI/9E48LYXohfEMQqTvdapTfM5U7zpQXLnagZLczrc9hOb7lZD\n3BzgTFrVvtksRw49/0pRaxNh4GF8plBhMd9Zhe/e73kbYYCgIpC6uni1ZLBg\ntxFcYYR17FvuYpUOEG8zu2qTtEoZsZJLx77YnOACyUJOcLCZmg8amE6u6Oq3\nNDccx5duw/bPbf3shTK3g2OP6Prz5vo0AHJPc1C8XVEeJuKssjdEfyXJz4H5\nnwKT\r\n=UKnN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBVoWSyzMfH1Q9O9Lz/UqZZRyqXi30HjI9xBPxA7OyqwIhANrVz12cOswgP5JbKn+oaB6pcm/Y9X9bYZw66aOIQORh"}]},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"_npmUser":{"name":"teijo","email":"teijo@aropupu.fi"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/process-env-parser_1.1.0_1577952317733_0.3276518491152416"},"_hasShrinkwrap":false},"1.1.1":{"name":"@absxn/process-env-parser","version":"1.1.1","description":"Straightforward and safe environment variable parser for bootstrapping node applications","keywords":["env","variable","environment","parser","typescript","node","process"],"homepage":"https://github.com/absxn/process-env-parser","main":"dist/process-env-parser.js","types":"dist/process-env-parser.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"scripts":{"build":"tsc -p .","test":"tsc -p . -p __tests__ --noEmit && jest --coverage"},"author":{"name":"absxn.com"},"license":"ISC","devDependencies":{"@types/jest":"^24.0.25","@types/node":"^13.1.4","jest":"^24.9.0","prettier":"^1.19.1","ts-jest":"^24.3.0","ts-node":"^8.5.4","typescript":"^3.7.4"},"gitHead":"371e20249844c41c2b90641c43d2e6e71759c0b2","bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"_id":"@absxn/process-env-parser@1.1.1","_nodeVersion":"10.7.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-QhkpC22/vs8zi9gbcli/7OUaQyQeuRTa/r5QAzkB58giF8wxES2DbC9ubePm0wjcIN6sjhpOS/ot36XASon6Iw==","shasum":"6952a77f1f043ca86b591f60de5b8ceb4567029d","tarball":"https://registry.npmjs.org/@absxn/process-env-parser/-/process-env-parser-1.1.1.tgz","fileCount":4,"unpackedSize":29805,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFXbdCRA9TVsSAnZWagAA9qYQAJbwju/XcWwPPGDJxL9v\nkC2IB4gwtkos/fYqDwvR8Dz3LTPub5d7u6xPJ9hpIrzgpyBQQ5S6oieNV/BU\nZ6hsU3zk3+eS1XSeabJCTUvCqOScX/wYGhjf9nYmBKs9z/nSRY2e3xlabui2\nEY1Jp1TCNSQGXEyajitY4pA4Gm1yuph7/d+yvBQnS0a9P/S6IIcXUSyxdW38\nuGxYv5TJgJ8pJ9uubiZZSpUOwVwNror4QqfE8HPcel0lTxKtyQzpNyGFInOJ\nSFN5xGmd5Kgz3gdRg/vS72cjJhgDg4jPvfe0r+nUqpOXd6grOXQ6wSX4KfQb\nupRIPDCKmZJmFgm6QytsOeOv4Q19nnB+9jptYRMr6AgvVSllrpdu1ij0Ukha\nRTgPwoKonx6lC0givJgRzvCm64kIJ8TW7Wi776UMMXqnA9Bk28zI7CWXkfIZ\nzh8FiVKPEFFUJpxE4g9L2qlparpQD5uLpyoY2k9Qco4XFzo9KP4L/AulGWJ/\nGSy+Bg0S44rTDJ7Wgi1QzePDtQAiyywe6C6diuJ33sO3RJI4CjTeJ3GSVn4v\nSr/E16TA21RCpdHhogdZwjlaAtCyAC6UccMxnk5yS09jyAZ7iBQZ7dcFbBwc\ngw937aoseP5B1yeZ8/ZYxu+cNrEDQ57GoLd/zMlEcSdhtG5zJfUKu/5EpMBI\njQR9\r\n=ISKa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCkYtB002epYbR0LO4VfWIVWjhS0WeQShj+rA0tk9VnwgIgLwuP2uJwQAQK7C3Uny/JjFRPDWcgZxocuAL1/xo7cpw="}]},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"_npmUser":{"name":"teijo","email":"teijo@aropupu.fi"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/process-env-parser_1.1.1_1578464988769_0.31370969896133705"},"_hasShrinkwrap":false}},"time":{"created":"2019-08-11T00:13:21.099Z","1.0.0-beta.0":"2019-08-11T00:13:21.503Z","modified":"2022-04-04T11:02:53.036Z","1.0.0-beta.1":"2019-10-21T01:52:19.021Z","1.0.0-beta.2":"2019-10-28T07:24:57.681Z","1.0.0":"2019-11-28T23:27:08.976Z","1.1.0":"2020-01-02T08:05:17.907Z","1.1.1":"2020-01-08T06:29:48.909Z"},"maintainers":[{"name":"teijo","email":"teijo@aropupu.fi"}],"description":"Straightforward and safe environment variable parser for bootstrapping node applications","homepage":"https://github.com/absxn/process-env-parser","keywords":["env","variable","environment","parser","typescript","node","process"],"repository":{"type":"git","url":"git+ssh://git@github.com/absxn/process-env-parser.git"},"author":{"name":"absxn.com"},"bugs":{"url":"https://github.com/absxn/process-env-parser/issues"},"license":"ISC","readme":"# process-env-parser\n\nStraightforward and type-safe environment variable validation, parsing, and\ndebugging for `node` applications.\n\n```typescript\nconst result = parseEnvironmentVariables({\n  API_KEY: { mask: true, default: null },\n  DATABASE_URL: { parser: s => new URL(s), mask: Mask.url(\"password\") },\n  LISTEN_PORT: { parser: parseInt, default: 3000 },\n  SERVICE_NAME: {}\n});\n\nif (result.success) {\n  // Sample success output\n  console.table(result.envPrintable);\n  // ┌──────────────┬─────────────────────────────────────────────────────┐\n  // │   (index)    │                       Values                        │\n  // ├──────────────┼─────────────────────────────────────────────────────┤\n  // │   API_KEY    │                     '<masked>'                      │\n  // │ DATABASE_URL │ '<masked: \"mysql://user:*****@localhost:3306/app\">' │\n  // │ LISTEN_PORT  │                       '8080'                        │\n  // │ SERVICE_NAME │                      '\"app\"'                        │\n  // └──────────────┴─────────────────────────────────────────────────────┘\n\n  // Inferred type for successfully parsed environment\n  // {\n  //   API_KEY: string | null\n  //   DATABASE_URL: URL\n  //   LISTEN_PORT: number\n  //   SERVICE_NAME: string\n  // }\n  return result.env;\n} else {\n  // Sample formatted output\n  console.log(Formatter.multiLine(result));\n  // API_KEY = <masked>\n  // DATABASE_URL = <parser: \"Invalid URL: localhost\">\n  // LISTEN_PORT = 3000 (default)\n  // SERVICE_NAME = <missing>\n\n  throw new Error(\"Could not parse environment variables\");\n}\n```\n\n- [Rationale](#rationale)\n- [Installation and usage](#installation-and-usage)\n- [Examples](#examples)\n  - [`requireEnvironmentVariables()`: Simple usage with mandatory variables](#success-simple-usage-with-mandatory-variables)\n  - [`parseEnvironmentVariables()`: Optional and parsed variables](#success-optional-and-parsed-variables)\n  - [Fail: Variable missing](#fail-variable-missing)\n  - [Fail: Parser throwing](#fail-parser-throwing)\n- [Mask](#mask)\n  - [`url()`](#url)\n  - [`urlPassword()`](#urlpassword)\n  - [`urlUsernameAndPassword()`](#urlusernameandpassword)\n- [Combine](#combine)\n  - [Non-nullable](#non-nullable)\n- [Formatter](#formatter)\n  - [`console.table()`](#consoletable)\n  - [Oneliner](#oneliner)\n  - [Multi-line](#multi-line)\n\n## Rationale\n\nAt the start of every process there are two sources of inputs that can affect\nthe process execution: the program arguments, and the environment variables.\n\n```sh\n$ ENV_VAR_A=Hello ENV_VAR_B=World node app.js arg1 arg2 --arg3\n```\n\nIn order to build reliable software, and minimize runtime surprises, you'll\nwant to follow the [fail-fast design](https://en.wikipedia.org/wiki/Fail-fast)\nand _ensure that your program inputs are correct as early on as possible_.\nEverything the program does afterwards is be based on these inputs.\n\nFor example, ensuring that a required database URL is correctly passed to the\nprocess at the very beginning will alert the user clearly of a possible issue,\ninstead of the the app crashing 30 minutes later when the database connection\nis done the first time.\n\nThis library tries to provide useful tooling for handling the environment\nvariable part of startup.\n\n## Installation and usage\n\n```sh\n$ npm install --save @absxn/process-env-parser\n```\n\n```typescript\nimport {\n  parseEnvironmentVariables,\n  requireEnvironmentVariables\n} from \"@absxn/process-env-parser\";\n```\n\nBoth functions return the same `Success | Fail` object:\n\n```typescript\n// Types roughly as follows, read code and inline documentation for details\n\ntype Success = {\n  success: true;\n  env: {\n    [variableName: string]:\n      | InferredParserFunctionReturnType // If `parser` option used\n      | InferredDefaultValueType // If `default` option used\n      | string; // No options used\n  };\n  envPrintable: {\n    // Human readable results for logging and debugging\n    // E.g. `ENV_VAR_A=<missing>, ENV_VAR_B=\"World\", PASSWORD=<masked>`\n    [variableName: string]: string;\n  };\n};\n\ntype Fail = {\n  success: false;\n  // Same as for Success\n  envPrintable: { [variableName: string]: string };\n};\n```\n\n## Examples\n\n### Success: Simple usage with mandatory variables\n\nEasiest way to read the variables is to use\n`requireEnvironmentVariables(...variableNames: string[])`. It reads given\nvariables, must find them all, and returns their values as strings.\n\nTo succeed, all listed variables must exist in the environment\n\n#### Process startup\n\n```sh\n$ A=hello B=world node app\n```\n\n#### Code\n\n```typescript\n// Type: Success | Fail\nconst result = requireEnvironmentVariables(\"A\", \"B\");\n\nif (result.success) {\n  console.table(result.envPrintable);\n  // ┌─────────┬───────────┐\n  // │ (index) │  Values   │\n  // ├─────────┼───────────┤\n  // │    A    │ '\"hello\"' │\n  // │    B    │ '\"world\"' │\n  // └─────────┴───────────┘\n\n  // Type: { A: string, B: string }\n  // Value: { A: \"hello\", B: \"world\" }\n  return result.env;\n} else {\n  // Wont get here since we gave both A and B in the startup\n}\n```\n\n### Success: Optional and parsed variables\n\nIf you have a more complex setup for the variables, you can use\n`parseEnvironmentVariables(config: Config)`. This allows you to handle each\nvariable individually with additional functionality.\n\nThe `config` object has variable names as keys, and the value is an object\nspecifying how to handle that variable.\n\nThe available options are:\n\n```typescript\ninterface Config {\n  [variableName: string]: {\n    // If variable is not found, use this as its value. If `default` not\n    // given, variable is mandatory, in which case, a missing variable leads\n    // to Fail being returned. If default value was used, envPrintable will\n    // have \" (default)\" appended to the printable value.\n    default?: any;\n    // When variable is read, its value is passed first to the parser\n    // function. Return value of the parser is used as the variable value in\n    // the output. If the parser throws, the function will return a Fail\n    // object.\n    parser?: (value: string) => any;\n    // If `true`, the value of the variable is never shown in plain text in\n    // the `envPrintable` fields of the return object. Value is indicated as\n    // `<masked>`. If function, the argument is 1) return value of parser 2)\n    // environment variable value. Default value bypasses the function and gets\n    // displayed as `<masked> (default)`. Return value of the function is the\n    // value to be shown in `envPrintable`, formatted as <masked: \"value\">.\n    mask?: boolean | (value: any) => string;\n  };\n}\n```\n\nTo succeed:\n\n- All varibales with no `default` given must exist in the environment\n  - Empty string `\"\"` is considered as non-existing!\n- No `parser` may throw\n  - Parser exceptions turn result into `Fail` and the exception message is\n    captured in the `envPrintable` fields. See examples below.\n\nDefault value is used as is, also when parser is given, i.e. default value is\nnot passed to parser when used.\n\n#### Process startup\n\n```sh\n$ REQUIRED=value PARSED=12345 node app\n```\n\n#### Code\n\n```typescript\n// Ensure we return only valid numbers\nfunction parser(s: string): number {\n  const p = parseInt(s);\n\n  if (isNaN(p)) {\n    throw new Error(\"Not a number\");\n  } else {\n    return p;\n  }\n}\n\nconst result = parseEnvironmentVariables({\n  REQUIRED: {},\n  PARSED: { parser },\n  OPTIONAL: { default: \"OPTIONAL\" }\n});\n\nif (result.success) {\n  console.table(result.envPrintable);\n  // ┌──────────┬────────────────────────┐\n  // │ (index)  │         Values         │\n  // ├──────────┼────────────────────────┤\n  // │ REQUIRED │       '\"value\"'        │\n  // │  PARSED  │         '1234'         │\n  // │ OPTIONAL │ '\"OPTIONAL\" (default)' │\n  // └──────────┴────────────────────────┘\n\n  // Type: { REQUIRED: string, PARSER: number, OPTIONAL: \"OPTIONAL\" | string }\n  // Value: { REQUIRED: \"value\", PARSED: 1234, OPTIONAL: \"OPTIONAL\" }\n  return result.env;\n} else {\n  // Will not get here\n}\n```\n\n### Fail: Variable missing\n\n#### Process startup\n\n```sh\n$ VAR_A=value VAR_B= VAR_C=\"${X} ${Y} ${Z}\" node app\n```\n\nWARNING – Special cases for \"meaningless\" strings:\n- Empty string: `VAR_B` is also considered as missing. I.e. `process.env.VAR_B`\n  does exist, but the parser considers `\"\"` equal to not set.\n- Blank string: `VAR_C` is also considered not set. In this case, `X`, `Y`, `Z`\n  are all `\"\"`, so the resulting value of `VAR_C` is two spaces,\n  `\"  \"`. If value is surrounded by spaces, e.g. `\" A \"`, the spaces are\n  preserved as is through the parser.\n\n#### Code\n\n```typescript\nconst result = requireEnvironmentVariables(\"VAR_A\", \"VAR_B\", \"VAR_C\", \"VAR_D\");\n\nif (result.success) {\n  // Won't get there\n} else {\n  console.table(result.envPrintable);\n  //  ┌─────────┬─────────────┐\n  //  │ (index) │   Values    │\n  //  ├─────────┼─────────────┤\n  //  │  VAR_A  │  '\"value\"'  │\n  //  │  VAR_B  │ '<missing>' │\n  //  │  VAR_C  │ '<missing>' │\n  //  │  VAR_D  │ '<missing>' │\n  //  └─────────┴─────────────┘\n}\n```\n\n### Fail: Parser throwing\n\n#### Process startup\n\n```sh\n$ NOT_ACTUAL_NUMBER=xyz node app\n```\n\n#### Code\n\n```typescript\nfunction parser(s: string): number {\n  const p = parseInt(s);\n\n  if (isNaN(p)) {\n    throw new Error(\"Not a number\");\n  } else {\n    return p;\n  }\n}\n\nconst result = parseEnvironmentVariables({\n  NOT_ACTUAL_NUMBER: { parser }\n});\n\nif (result.success) {\n  // Won't get there\n} else {\n  console.table(result.envPrintable);\n  // ┌───────────────────┬────────────────────────────┐\n  // │      (index)      │           Values           │\n  // ├───────────────────┼────────────────────────────┤\n  // │ NOT_ACTUAL_NUMBER │ '<parser: \"Not a number\">' │\n  // └───────────────────┴────────────────────────────┘\n}\n```\n\n## Mask\n\nHelpers for masking parts of variables for output.\n\n```typescript\nimport { Mask } from \"@absxn/process-env-parser\";\n```\n\n### `url()`\n\nA function that returns a function that applies the mask to given URL parts.\nValid URL parts are `\"hash\"`, `\"hostname\"`, `\"password\"`, `\"pathname\"`,\n`\"port\"`, `\"protocol\"`, `\"search\"`, and `\"username\"`. Can handle both URL\nstrings and URL objects (from `parser` or `default`).\n\n```typescript\nconst result = parseEnvironmentVariables({\n  API_URL: { parser: s => new URL(s), mask: Mask.url(\"password\", \"path\") }\n});\n```\n\nFor `API_URL=https://user:pass@1.2.3.4/api/path`, the `envPrintable` would\ncontain `{ API_URL: \"https://user:*****@1.2.3.4/*****\" }`.\n\n### `urlPassword()`\n\nSame as `url(\"password\")`, resulting in\n`\"protocol://user:*****@hostname/api/path\"`\n\n### `urlUsernameAndPassword()`\n\nSame as `url(\"username\", \"password\")`, resulting in\n`\"protocol://*****:*****@hostname/api/path\"`.\n\n## Combine\n\nHelpers for manipulating parser results.\n\n```typescript\nimport { Combine } from \"@absxn/process-env-parser\";\n```\n\n### Non-nullable\n\nIf you have a subset of environment variables that depend on each other, i.e.\nyou either need all of them, or none of them, this function helps to ensure\nthat.\n\n\"Nullable\" is here defined by TypeScript's `NonNullable<T>`, that is, `null` or\n`undefined`.\n\nLets assume we have this setup:\n\n```typescript\nfunction getConfig() {\n  // For parsing purposes, both USERNAME and PASSWORD are optional...\n  const result = parseEnvironmentVariables({\n    DATABASE: {},\n    USERNAME: { default: null },\n    PASSWORD: { default: null }\n  });\n\n  if (!result.success) {\n    return null;\n  }\n\n  const { DATABASE, USERNAME, PASSWORD } = result.env;\n\n  return {\n    // ... but for actual authentication, you need both\n    auth: Combine.nonNullable({ USERNAME, PASSWORD }),\n    db: DATABASE\n  };\n}\n```\n\nWe would get the following results with given startup parameters:\n\n```\n$ DATABASE=db USERNAME=user PASSWORD=pass node app\ngetConfig() -> { auth: { USERNAME: \"user\", PASSWORD: \"pass\" }, db: \"db\" }\n\n$ DATABASE=db node app\ngetConfig() -> { auth: null, db: \"db\" }\n\n$ DATABASE=db USERNAME=user node app\ngetConfig() -> new Error(\"Mix of non-nullable (USERNAME) and nullable (PASSWORD) values\")\n\n$ node app\ngetConfig() -> null\n```\n\nIf the object is returned, the return type has nullability removed from each\nvalue:\n\n```typescript\n// Type before: { a: string | null, b: number | undefined }\nconst nullableValues = {\n  a: Math.random() > 0.5 ? \"X\" : null,\n  b: Math.random() > 0.5 ? 1 : undefined\n};\n// Type after: {a: string, b: number} | null\nconst nonNullableValues = Combine.nonNullable(nullableTypes);\n```\n\n## Formatter\n\nThe library contains additional helper functions for printing out the parser\nresults. These can be useful for storing the startup configuration into logs\nor printing out startup failure reasons.\n\nImporting `Formatter` from the package:\n\n```typescript\nimport { Formatter } from \"@absxn/process-env-parser\";\n```\n\n### `console.table()`\n\nAs a built-in, `console.table()` is the easiest way to get a readable dump from\nthe parser results.\n\n```typescript\nconst result = requireEnvironmentVariables(\"VARIABLE\"/*, ...*/);\n\nconsole.table(result.envPrintable);\n// ┌──────────┬─────────┐\n// │ (index)  │ Values  │\n// ├──────────┼─────────┤\n// │ VARIABLE │ 'value' │\n// │   ...    │   ...   │\n// └──────────┴─────────┘\n```\n\n### Oneliner\n\nUsing the data from the first example:\n\n```typescript\nconst result = parseEnvironmentVariables({\n  API_KEY: { mask: true, default: null },\n  DATABASE_URL: { parser: s => new URL(s).toString() },\n  LISTEN_PORT: { parser: parseInt, default: 3000 },\n  SERVICE_NAME: {}\n});\n\nconsole.log(Formatter.oneliner(result));\n// if (result.success === true):\n// > API_KEY=<masked>, DATABASE_URL=\"mysql://localhost:3306/app\", LISTEN_PORT=8080, SERVICE_NAME=\"app\"\n// else:\n// > API_KEY=<masked>, DATABASE_URL=<parser: \"Invalid URL: localhost\">, LISTEN_PORT=3000, SERVICE_NAME=<missing>\n```\n\n### Multi-line\n\nOutput using same data as above example:\n\n```typescript\nconsole.log(Formatter.multiLine(result));\n// if (result.success === true):\n// > API_KEY = <masked>\n//   DATABASE_URL = \"mysql://localhost:3306/app\"\n//   LISTEN_PORT = 8080\n//   SERVICE_NAME = \"app\"\n// else:\n// > API_KEY = <masked> (default)\n//   DATABASE_URL = <parser: \"Invalid URL: localhost\">\n//   LISTEN_PORT = 3000 (default)\n//   SERVICE_NAME = <missing>\n```\n","readmeFilename":"README.md"}