{"_id":"@awesomeeng/awesome-config","_rev":"8-e558d98db3fdf36c3206ba5195a0ebaa","name":"@awesomeeng/awesome-config","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@awesomeeng/awesome-config","version":"1.0.0","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^2.1.0","@awesomeeng/awesome-utils":"^1.2.0"},"devDependencies":{"jsdoc-to-markdown":"*","mocha":"*"},"optionalDependencies":{},"scripts":{"docs":"jsdoc2md src/** --separators > docs/API.md","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise ready node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support fo","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"d2d9de4c0fe28a2cfbfbd82ffd18ba4cf86523ae","_id":"@awesomeeng/awesome-config@1.0.0","_npmVersion":"6.4.0","_nodeVersion":"10.9.0","_npmUser":{"name":"arei","email":"arei@usa.com"},"dist":{"integrity":"sha512-wa/Ovpd1QgpD1BYR/HjZrq/siO32dMhOXra2JRQOheAo3bRg0mBJX7g7Iv/VOHCpFdgDIDBYVcWLScphcIDMfg==","shasum":"cb363e215820cce8a23afb8d0016357aaca276be","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.0.0.tgz","fileCount":54,"unpackedSize":138436,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbrqjPCRA9TVsSAnZWagAAJdoQAITu1/Ym9eE7/pRDpmTJ\n+OYXHoLIppcsQV4T6tHRJLiWVPQ38u6v60eZXIBJYhO/givQUhGKQW08KZ0u\nk+6WO75IWiRbbOh/nxONkkRVsTW0/RuuIStyKKh8Zf4pv9B2JhnL/6irJ3sB\nvvObmXY2HX3I1pmYV855z43002jgo5D4PrT8+/E9uWSIfqVaDhzijHgs/EQt\nHobTZaHufI5VkRpfkivToJtL4F6Pw0bCx1WBCtzgqGrtpTzTF9vswW7opWnq\nayv/VB/9SRKH00Licvd4U2GYexDgtj6lzi446BGwB8Hcc7x8/YJPJr7K6d6a\nkWMoT+VKN2s95zUvKtuF/oEvLm8QMeQcrGap3N6r6aK+Kp35J4l4BCQZ+Npq\nj2OOkbxWH7EARA7TlQdmsqqUuSJVo31blX2pcYm6cl2wtNMm+OW80gfrM3fS\neqNkQ6CXmg393fuVtId7jKAIIk7D0Vpr95zrCb7F2OUMq8hPZK77VAFjknBt\nIOYpH4Ai4rFUYLQXWjFXLtZ/QDNIzvZ7nzOJskIe9kkGx0nID4rIkkrwEjEi\nuF9LnVFyXfNcV9NdzozjVllem/NLgjNx7KcgMuN+7Uod2dRXeaBK4kHjVxUp\npc2VNvrjWgQeD89ezSbrf67ZgS9SANd+rkIe0XuFElR7OyGg3zJ03RZ8sAau\ngH2V\r\n=ZDzg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWsvAR2M9XrHRynDWJ7HOUi9iPY1WIxg1bVYL7f9dG7wIgWD+6OnW8c9SLj1zUrVG8QX/n8+2Q10GBPUAVY4Uc7Vc="}]},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.0.0_1538173134124_0.38269105227077804"},"_hasShrinkwrap":false},"1.0.1":{"name":"@awesomeeng/awesome-config","version":"1.0.1","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^2.1.0","@awesomeeng/awesome-utils":"^1.2.0"},"devDependencies":{"jsdoc-to-markdown":"*","mocha":"*"},"optionalDependencies":{},"scripts":{"docs":"jsdoc2md src/** --separators > docs/API.md","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise ready node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support fo","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"540a6a89261951583062644bb238f76066ae77bf","_id":"@awesomeeng/awesome-config@1.0.1","_npmVersion":"6.4.0","_nodeVersion":"10.12.0","_npmUser":{"name":"arei","email":"arei@usa.com"},"dist":{"integrity":"sha512-NdC6M/cAr2B99HHjb8I9HEd33tSe9RWt1dmJZPsAy73EFVgngnzZbRljEvl1Oin/x7E1lNfv3QsL9PfLp633cw==","shasum":"2e3acb55e5f0592b03866cf1b9963f8090305178","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.0.1.tgz","fileCount":55,"unpackedSize":143425,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcXI/OCRA9TVsSAnZWagAA/KAP/1NF+iI+qvPgVjAkji33\nI9A/s8r1u1+vLIsSXxjvZSq1FX4Rk5SgeqOksASy5+mHC72DnIy9dcSszknS\nP0NKi0QwehyPEpotDAIngdhhQAyfzbaqOhnCClaqCN5SoGoYwRDX1y3oz42C\nH86PH4h/wpNc7unORF9wL3NIeK/L7ys8s500cB+cTg6S1lQMw/vPCXEJaHwL\nFYoRPSDAl6/2FM8FDb6xU19gFAS/4LiMU/NQ0VgbMpk3zubJ7zOb0IAbSwJD\nm8jMTJsVo1gJ0cmXufi95NcodD8e9FsVyjYbIozBZp89VJHnEhqMZS1G44PX\nKjeItMcgXbgL9GhgQad+H1Cv+l2+rgu530u0taCtnZIAsfIMX682y+g32c3Y\ncrKnBuW7BEPP9wYH3nfoLxaQwYFJPmINpNwG34PMQUo5f5+/X2cMfM91k/aA\nHvgVAUcCBlJwNTFBWVoNaiyroIIDca4bR+W94ZejH8fgtQa8Vt3DNca83vX/\n/cI1S2fo/lzfuUcSB3MWzVmrPBWJCEFti4gepCbIYvMdEjd2GfGwy55TuiVK\ncJEY8Avvcbiv1nyb+3LCjmfQT7BTbykkLm7x48RYF+VYIS9WqPKSr5Huccwe\ng173B6HFkMhd67NqRPORnHRQtLA7BMakqMotKGGhkejOVCw6eDI+RlTeGUE/\n5hRx\r\n=JSes\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCe3rSQK7A2OdXrzZ+u3gRcsj/anxXXAT9oniJM9fsrZQIgXw+ry0pYX5i3VbDpfqkQjWWAn+8xqf+yQ8lyJKl7pSM="}]},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.0.1_1549569997664_0.6578950943359492"},"_hasShrinkwrap":false},"1.0.2":{"name":"@awesomeeng/awesome-config","version":"1.0.2","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^3.0.2","@awesomeeng/awesome-utils":"^1.4.7"},"devDependencies":{"jsdoc-to-markdown":"*","mocha":"*"},"optionalDependencies":{},"scripts":{"lint":"eslint src examples test","docs":"jsdoc2md src/** --separators > docs/API.md","test":"mocha test","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise ready node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support fo","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"54acbc58eacbaa5dc9da3694f23822c4068cc9ea","_id":"@awesomeeng/awesome-config@1.0.2","_npmVersion":"6.4.0","_nodeVersion":"10.12.0","_npmUser":{"name":"arei","email":"arei@usa.com"},"dist":{"integrity":"sha512-5qMYBubEICiJrfqBf7L8p2lFgDcPeVwoWDvv73gooGRk6Irin5MwA2M5K3eR6BY9oYn62HyPg4aj7p5fYNz0FA==","shasum":"168d2a048f6820d40e47d0a9678a4625c2d0dd69","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.0.2.tgz","fileCount":55,"unpackedSize":138934,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcXh9ECRA9TVsSAnZWagAAx2sP/jQOGVDp36hVazCEYcI8\n74qgz7LmLOCXp3CgUQElEgqTTVWZ5R8JAJh0Y5Ht3lv3YKEREFdQg2PExBUT\nNmhJFKbUnmljH/o+U1zt3HT6wRpQQ4U0++ZwMdtVcbnM4iS6AIitKymydp0J\nr7EKWxlSJcm1zoCnPE32afTH6gU+8v7zkc3GRyhgUm17/tW/bLYXzRT8HSJH\nbP8xzqqFV08BtKkDBU5obdpuMSnbpJI0DQYOIf1NOJ4nFs4wazQhdNHacRe+\nryFpqwIdOM9Tx8hen3MA95/TQm41A0/4NzxrVxSvYOdFAXpCXvvtZnVg3vPu\nmSrnufuhflDt66v6vk9sWNmfmNOr08zaXPCUcm07PlGNRXIOIULndLs0291p\nE9i3vAwZEq01wlEtHqb9KL987TAk7q9huc5UeZE55DD+DY9tuVqRAVRyYTSK\nIT4prtxM2FZE9gx0KX6P4g+/FHCoegHw04rAOiPfSV/JKGUV2H4B8HSgMaVd\nTrodTyZPtK+WjDFoIxLWCJRKxax4+R7B+LLLS4bumPLSX6NffEwyvvsehr9O\n0SelmuUpoKrXA+jOJ8z6ZsQDftq5iMr1HGY1xZAh+Q9XhYHF63wLnKwCttse\nsggtba8AcI3HwHcEnIe5o0RWSmFkCWGkkJWMyWfET7nvD9RmhGCGaVR8vfX3\nWS9Y\r\n=RirS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDR7Q+5a18VkPWwE2bGo7XPBuJ1jnuqjG3BMQrqtwCqWAIgUL2e0qRKcRfWhJAJTg+dDHIcygjuhff/1Inr9UNpsGI="}]},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.0.2_1549672259214_0.7947457070220509"},"_hasShrinkwrap":false},"1.1.0":{"name":"@awesomeeng/awesome-config","version":"1.1.0","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^3.2.2","@awesomeeng/awesome-utils":"^1.5.1"},"devDependencies":{"jsdoc-to-markdown":"^6.0.1","mocha":"^8.2.1"},"optionalDependencies":{},"scripts":{"lint":"eslint src examples test","docs":"jsdoc2md src/** --separators > docs/API.md","test":"mocha test","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support for cond","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"452cb52cebc549a210b76a106262351390d79716","_id":"@awesomeeng/awesome-config@1.1.0","_nodeVersion":"13.14.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-EZWv5NPjcoZAO1xAudzacap0fXPX3PTO1rYSLQ/TAubpkbl+UkZO7A9yCtKkBJ+OLNe+WzZLjPAp/E/wTSLO1w==","shasum":"42536a12293818cc0d42d90ebbae6bcf6da33be0","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.1.0.tgz","fileCount":57,"unpackedSize":153327,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf2ma5CRA9TVsSAnZWagAA5SoP/1qNzOplRw50kx6zbwPV\n6MZoqnePKJh2EzFyZ6lCjTQQOzDw61L9DOp34KyRnNlJDUVFouRG0wLDU/cO\n17xDiyKzqatxdG1hWlSGy+tcaFnK+B1biHgBsaeBWOEgA/7opav4k/lGzq/B\nTpESP+oGpmZzCkQCyDmTj8dzVz41w+mv4IPrZJ95vLhiwsw76cmyG5xVHQ9r\nelJMId9lJCvPhwEZWPVwxDz43RZVNzd9U7ctBQGItKVjSkJXga89PgOkvZdx\n0pWHehgROu8JFFog4t0uy7wXVhdYpVvblhwCxXGiKi5F47DhHxbFK2h4YlvK\nlNIgArIetEXDiE3Nk+QmDwKS58R2sGLA7waBsgpH7ta3p3grabdpIzXcAtLd\nqeC3L8+IgSF1S8hPUX8Nn7OKmBk2mSGBxtHElBhSdnp9AKlcPRodtwYvV9xK\ng8k0W7DphmS7e/NNBGEpUEEpcGkzKfzjoQgXzd4JAeWHJLZ2qgu/e3M9rhYl\nV5vaMVgY+CvfFoPPMOQ2aNFmBCdd/YPiXx/DOuQ47J/vIgGssW3g4O2Ceyuz\npSmRFYXN2iE9w22agnRNcg9cBSSE47xf3ROVC1KkpYzw+WH8x0tGyLn1rUCj\nOSrvzp/Fe+fQUhqJAEMJn/4aHjJ3EbDIHBvuOoCUK5Gak9OW5Jb+OZvCq1tH\nKYFP\r\n=xqU1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEY86hj4M38rwqWNNry0ScBSsrHnAmgfJb4dDBRSWbgIAiBzKGYyaAHOQ6zGQ3f+6EpPAJ9V7eCe/SbRYLGzyV8m5A=="}]},"_npmUser":{"name":"arei","email":"arei@usa.com"},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.1.0_1608148664590_0.21192917385697707"},"_hasShrinkwrap":false},"1.1.1":{"name":"@awesomeeng/awesome-config","version":"1.1.1","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^3.2.2","@awesomeeng/awesome-utils":"^1.5.1"},"devDependencies":{"jsdoc-to-markdown":"^6.0.1","mocha":"^8.2.1"},"optionalDependencies":{},"scripts":{"lint":"eslint src examples test","docs":"jsdoc2md src/** --separators > docs/API.md","test":"mocha test","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support for cond","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"4d03ee3b59f891912ed6e00dd3a427e2f3c5a775","_id":"@awesomeeng/awesome-config@1.1.1","_nodeVersion":"13.14.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-8grFcxTRNUv3JssVsTvHNOuKUUotEnTFx0l2nayHePmKikJTO4vyB1g1XXPulf3qir187Ao17uqDdprydRJdRQ==","shasum":"22bb47aee5c202b79f53d93e0ba4a078c3e92de4","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.1.1.tgz","fileCount":57,"unpackedSize":153466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf2nVPCRA9TVsSAnZWagAA+zEP/2bN+piE/G+DfRN7PCQ7\nqNtr3ahl6Qdl3lUup6F6ng6k9/zGsv2nIVycjcpY27akNPZgOkLUA8mI7LCp\njOIoelIsbaPAYlGLbyN83ypV5Fphnbx8tszzdsE/K/pzbsI58RRKhJ5I1/7v\nA2hAa1tYZt6P7JD+I1XK0NAfFjS/7IdyQM+MwkO7E3VhcJf8L6UgKumsAN+9\nt1u7QIPZsW97YbgkfREQEqt4b6cHDKVIx2aHR86ISNXCXGcDOAwOOE97s08Z\nVRv2o0PbikvjL4emLgFGwYkH6sAVhP7H3GhhxVlTgQCrNUSRBia/4b3KwDha\noppyZUdsWqqyv4LiwloPefiCJB2RhKqdk6gZy3fll6Y6h0LHOnsgCRv+R2BQ\nrIbR64h0h9WBDbgHyeaOlrbbhJcsgocN+XoKBaAi412TGN9M4eQrmsLI3tqm\nPgOOFwaMQVCfAVtaDuTBeMNLZXu0B/iY0LBRrtLWCOVDO0CwJw1N6lTtd7SH\nU02ROS2dPft7dB35c8+VdX4WXHDsJIvIai6qURt+Eyw5QMXNhVd1nV/Bh6Dn\naYVQlfWi3nrC72MjiHzYt/QGfEG1M7P8Jc7YdULRQFH2XvtlM/pKM3MbMXuv\nWTbEzedN7MWzgtNvK5uEpofOikWOfoj3zcU1uT66egSOz1WVROV+RCe2ODFI\nbdWx\r\n=LZkB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBsUqmcrSdDOs0rhy7pCTs8llFDlVCz4zK8a0ghYWxcwIgcfDuLgCxaBLmYApRCmLIqKqV1J+KO6BgAslkoaL/LHA="}]},"_npmUser":{"name":"arei","email":"arei@usa.com"},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.1.1_1608152398747_0.4465499288299315"},"_hasShrinkwrap":false},"1.2.0":{"name":"@awesomeeng/awesome-config","version":"1.2.0","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^3.2.2","@awesomeeng/awesome-utils":"^1.5.1"},"devDependencies":{"jsdoc-to-markdown":"^6.0.1","mocha":"^8.4.0","eslint":"^7.27.0"},"optionalDependencies":{},"scripts":{"lint":"eslint src examples test","docs":"jsdoc2md src/** --separators > docs/API.md","test":"mocha test","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support for cond","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"0a3f8e6094d48af22d99c7ab00a4816cd54a96a7","_id":"@awesomeeng/awesome-config@1.2.0","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-ri60m2cb0dutB5RKgoKA0lgxScDFTOHLxipdYCw4qEuLw0CjHBlt3z81/AmRA1bjbZwdWLakqNSha6wBCXSUHw==","shasum":"a5a6ff9c6f01e080ad99af2d501d968cb7316379","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.2.0.tgz","fileCount":57,"unpackedSize":153646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrW01CRA9TVsSAnZWagAAMi4P/0l1xLV3hyxaNFow2vqk\nxMDHlCH2JlEUj3yu/Az9wEkDuhr3+Ya9E0HAY8ZJn9sOpbGBhColTSVhwPBV\nen3k6p0Pn8fRUM3JqAjXmIbedU6hGaKn9r122XCV3k1w5c3tLoovOPyQR5M6\npwUVIpc7VeGpgclnaQ315EbNjQwkO0UtPYmJTa8Dd2wScQb3vrayYjEaCYAM\nlXh9u7ldCAoKxIXyT4Qp+fmoukM8HQSUNXG9a3Jg2mRUJaC2IrctIv52U5qG\nwAMtSYEPzYjYzXgtIXjMrRoB4m8LVT1SwZVqyamzXZuVjeQ65d52uWQ9YlLw\nPxcmufGuF/toHVWCmkhR00mAExSZNqyemvYcaqNMQB01jhpFA2Y56Pein+xi\nthnOhDVlo1bzN4AXGLcGl+G2MO9OgrzDI7Y438fgIzS5itkJMz3JnwUTieAf\nidTnwd3uEJJFcwklj1/vGBXG3C61CbMqMAMFClTBKkEtemUHlaDq2pCm+XvS\n6bDiNMv3ta/mFKjMitOWllWzDI7EklK7KcgP8iAvYR7F0NOe1CViDo9thI42\n39D6WuQfrnVYcX0gOEA4rXOw+XBVKaydBMUw13RJeBHCyIUiB1V6hjZEM2Ce\nzjUtVtZzm3fOgyvbzZw9+6kFwA3xl5RFwsTdpCJyAAVYd0pjhQ+1jk3L1ad5\nHeKl\r\n=bXMK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIATzOFtHxItYUIt6xtzWy7YuawT8LusyAeV1b0DDpJJvAiANA6dCXLe0vhrrnWsH/eUhWSYsBITVfSMh6eo7R5jrZQ=="}]},"_npmUser":{"name":"arei","email":"arei@usa.com"},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.2.0_1621978420697_0.6173392320318478"},"_hasShrinkwrap":false},"1.3.0":{"name":"@awesomeeng/awesome-config","version":"1.3.0","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^3.2.2","@awesomeeng/awesome-utils":"^1.5.1"},"devDependencies":{"eslint":"^7.32.0","jsdoc-to-markdown":"^6.0.1","mocha":"^8.4.0"},"optionalDependencies":{},"scripts":{"lint":"eslint src examples test","docs":"jsdoc2md src/** --separators > docs/API.md","test":"mocha test","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support for cond","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"cd486df77a2314262bbeede2f74c9880f0ca3207","_id":"@awesomeeng/awesome-config@1.3.0","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-91/eGltDEC9ag9+s7Dm+WILaMSSlQu+x2a7fu18F9BupwHgS03fJ9Qb+2eKpDZRwRnBAqQ9hhEaS9lz8HaAgYw==","shasum":"487da7de0c00ef3f486cc6dc7292a8d858f353a3","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.3.0.tgz","fileCount":57,"unpackedSize":154037,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE98DCRA9TVsSAnZWagAA72EP/1he0r5UNKFUA/toE+TT\nRuJOSN4rHDKOLE2ial2Hg02Xc2A4ypnGr+p+oModyo/NhcusgrOgaqT54g8m\nJCBF30X4Bnem0l70KBaLnq2/v4ofCnuk004gB6C9LdU5hLiaFJmROmW3XJ1T\nGHcG3JpvAf3d52AHzffte106VxZ/nd2T0g1SoLMFJImW2Uj97cUFXjGfnQb+\nBg7G6XVe6+W4unpcb1sa5O71N48F0GhBI8ChLNjfPR4H9IdxuR1aqRSLdN4v\neds7EZz7yt/cJUeQVYLZ/lcXWs29MutJjQNXdEWrQy95/eEsz33oIK+ts8PG\n4lH7noxxB6utO6myKybi4Fn7h9xhJ0wQ/ITqIERZd7RSN7foVDfx6DsjlSCd\npZMxr3gR5tZFcKOYPs5rH+NOrAb447PI32PeQ9bdzUPpCByTby5rEzdgaEhz\nMuboln7wHQCmONEH7Qyz4/lxx87lz2yzXSKOnHkKy5Qifv5a/dzM4NUigXs4\n70JDj9IkpMlwcT7WkTjytipmT0aw4Gv/zwlYyDbDgwxXRT337CjBHrF2eTgQ\n0dEicQDuMuJ37gCxivNemX7yB9Qg+9uwvuhzrU54mtbiu8T2VtvgEmBP6zgM\nD3cM+7KVF5h8NzR6usVDN3eTNxXLmpfG9IplqT27SECtdvNbl0ugwsJgazBA\nkDID\r\n=hFmj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUpuLCpjdU0pa40OC+tA4gVvog0JjB5n/xUOUv/2N80gIgb7gU1BpZhoB73Jqh/kafa+tS+iDa/L/5TmOFXO2zULM="}]},"_npmUser":{"name":"arei","email":"arei@usa.com"},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.3.0_1628692227082_0.47851810607654754"},"_hasShrinkwrap":false},"1.4.0":{"name":"@awesomeeng/awesome-config","version":"1.4.0","author":{"name":"the awesome engineering company"},"license":"MIT","contributors":[{"name":"Glen R. Goodwin"}],"main":"./src/AwesomeConfig.js","engines":{"node":">=10.5.0"},"dependencies":{"@awesomeeng/awesome-log":"^4.4.0","@awesomeeng/awesome-utils":"^1.6.0"},"devDependencies":{"eslint":"^7.32.0","jsdoc-to-markdown":"^6.0.1","mocha":"^8.4.0"},"optionalDependencies":{},"scripts":{"lint":"eslint src examples test","docs":"jsdoc2md src/** --separators > docs/API.md","test":"mocha test","tests":"mocha test"},"description":"AwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support for cond","directories":{"doc":"docs","test":"test"},"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"keywords":["awesome","awesomeeng","awesome","engineering"],"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"homepage":"https://github.com/awesomeeng/awesome-config#readme","gitHead":"737f6331042850a6fc7e66b262b4cfe7d7931173","_id":"@awesomeeng/awesome-config@1.4.0","_nodeVersion":"14.17.6","_npmVersion":"6.14.13","dist":{"integrity":"sha512-i8vywnNg0ozhnilj6eEmEs0t8VlwDoGW8xlEnhL9vgpHfsx0zmneatacR84+kf8TuTyFMH+AjQJgLlp5kWpwIA==","shasum":"c0877a2b744d687451153dcd9673216d41ce06da","tarball":"https://registry.npmjs.org/@awesomeeng/awesome-config/-/awesome-config-1.4.0.tgz","fileCount":57,"unpackedSize":154120,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdUBrl+1LLxw/3x+WpnF5SJSKSWjUnOyAFSfbAw+YYtAIhALvpMoShScMwSAun81+cWbEnXhkCdazB6fMDSPowqvpC"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9o0MACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJbQ//XgsjXxFHoDwAm/XluuoJ3kiqyjsPBM2SXOvCEG9jbQi/rU9v\r\nvKH/kT5hd0y/21hBdB63GHlzMWHqIukadB1TJR3LemUdi9+mw89svbqbLuT3\r\n5NsQQCTq/QF4O6L6C/7D051TURuaOxID6+hc5yymXdM9nnW5UfKs59mVrtpV\r\nCZLKMVTEt1X2LDEeGnMbUYvIQvkVxcP1Tqz116u2mmvdVyJHJzdEj9LMxNhD\r\nCwz+7cLrunRpwDyMbpSFPn3/hZ9xigR4reqmqRBojwND4pf0mj1JWEdT75Ur\r\nEnjXeZQ94W9GsK7tT9nRjjO4+6PZiGDK0dGfYwC9UMJGYiokkM7eUB6a8OWQ\r\n+PvhdYsw6dOrykTkxS1a4p2SXLrzwd8lX3P/pXzLaYaNdCHNbdVNxI4iq5OW\r\njD/8MM+0ZX5Y8+jXyFclkc/HwmIgoGF22YS2O+p+jdladNcMumDUTefZpOKA\r\nT1b8NtJinXpIPF32yJykWt4Z/HRgx2Y3NiCPrIKWCpJqSJtmMigz2htIP/cI\r\nfWCi6ymKDBsItm3BF/B7mj7zgbsLI6la03syKoA8U52id9CsVwRSe+FOECzB\r\n7qb/YYaBksmVPOm2xiaNUU8lc2QL4jwzeXT96L+G1fm2NtvvDSuN9OfTZ/m8\r\nCIsqHnyHpgxxWR8JcatyTNHR6uH8J9sS0aM=\r\n=B/hw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"arei","email":"arei@usa.com"},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awesome-config_1.4.0_1660325132010_0.24095421698991015"},"_hasShrinkwrap":false}},"time":{"created":"2018-09-28T22:18:54.058Z","1.0.0":"2018-09-28T22:18:54.299Z","modified":"2022-08-12T17:25:32.441Z","1.0.1":"2019-02-07T20:06:37.818Z","1.0.2":"2019-02-09T00:30:59.356Z","1.1.0":"2020-12-16T19:57:44.781Z","1.1.1":"2020-12-16T20:59:58.899Z","1.2.0":"2021-05-25T21:33:40.924Z","1.3.0":"2021-08-11T14:30:27.310Z","1.4.0":"2022-08-12T17:25:32.323Z"},"maintainers":[{"name":"arei","email":"arei@usa.com"}],"description":"AwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified transparent configuration object to your application based on configuration files or objects that you define.  It includes support for cond","homepage":"https://github.com/awesomeeng/awesome-config#readme","keywords":["awesome","awesomeeng","awesome","engineering"],"repository":{"type":"git","url":"git+https://github.com/awesomeeng/awesome-config.git"},"contributors":[{"name":"Glen R. Goodwin"}],"author":{"name":"the awesome engineering company"},"bugs":{"url":"https://github.com/awesomeeng/awesome-config/issues"},"license":"MIT","readme":"<a href=\"https://www.npmjs.com/package/@awesomeeng/awesome-config\">![npm](https://img.shields.io/npm/v/@awesomeeng/awesome-config.svg \"npm Details\")</a>\n<a href=\"./LICENSE\">![GitHub](https://img.shields.io/github/license/awesomeeng/awesome-config.svg \"License Details\")</a>\n<a href=\"http://npm-stats.com/~packages/@awesomeeng/awesome-config\">![npm](https://img.shields.io/npm/dt/@awesomeeng/awesome-config.svg \"npm download stats\")</a>\n<a href=\"https://github.com/awesomeeng/awesome-config/graphs/contributors\">![GitHub contributors](https://img.shields.io/github/contributors-anon/awesomeeng/awesome-config.svg \"Github Contributors\")</a>\n<a href=\"https://github.com/awesomeeng/awesome-config/commits/master\">![GitHub last commit](https://img.shields.io/github/last-commit/awesomeeng/awesome-config.svg \"Github Commit Log\")</a>\n<br/><a href=\"https://nodejs.org/en/\">![node](https://img.shields.io/node/v/@awesomeeng/awesome-config.svg \"NodeJS\")</a>\n<a href=\"https://github.com/awesomeeng/awesome-config/issues\">![GitHub issues](https://img.shields.io/github/issues/awesomeeng/awesome-config.svg \"Github Issues\")</a>\n<a href=\"https://snyk.io/vuln/search?type=npm&q=@awesomeeng/awesome-config\">![Snyk Vulnerabilities for GitHub Repo](https://img.shields.io/snyk/vulnerabilities/github/awesomeeng/awesome-config.svg \"Synk Vulnerabilities Database\")</a>\n<a href=\"https://www.npmjs.com/package/@awesomeeng/awesome-config\">![David](https://img.shields.io/david/awesomeeng/awesome-config.svg)</a>\n\n# AwesomeConfig\n\nAwesomeConfig is a powerful configuration system for building enterprise node.js application. It provides a unified, transparent configuration object to your application based on configuration files or objects that you define.  It includes support for conditional configuration based on external values like environment variables, hostname, or OS; variables to reference one part of your configuration from another; and lots more.\n\n## Features\n\nAwesomeConfig provides...\n - Add configuration from files, directories, as JSON, or as a plain javascript objects;\n - Uses JSON notation or our custom notation that supports mixing JSON style config and key/value style config;\n - Globally accessable config without the need to pass config objects around;\n - Configuration is exposed as a plain JavaScript object for easy usage;\n - Support for namespaced instances to isolate usage as needed;\n - Configuration is immutable once started;\n - Configuration Variables allow cross referencing other parts of your configuration;\n - Configuration Conditions allow you to toggle on/off different parts of your configuration based on external values like hostname, OS, or environment variables.\n - Configuration Plcaeholders to force users to provide key configuration values.\n - No reserved words.\n\n## Contents\n - [Installation](#installation)\n - [Setup](#setup)\n - [Adding Configurations](#adding-configurations)\n - [Configuration Notation](#configuration-notation)\n - [Namespaces](#namespaces)\n - [Variables](#variables)\n - [Placeholders](#placeholders)\n - [Conditions](#conditions)\n - [Documentation](#documentation)\n - [Examples](#examples)\n - [Awesome Engineering](#the-awesome-engineering-company)\n - [Support and Help](#support-and-help)\n - [License](#license)\n\n## Installation\n\nCouldn't be easier.\n```\nnpm install --save @awesomeeng/awesome-config\n```\n\n## Setup\n\nTo use AwesomeConifg you need to go through four steps to set it up and add configuration into it. These four steps should be done at the top module of your project or as close to the top as possible.  Once AwesomeConfig is started all subsquent requires of config (aka `const config = require(\"@awesomeeng/awesome-config\")`) will return the fully started configuration. This allows you to setup your config at the top of your application and then just use it in subsequent parts of your application without needing to pass a configuration around manually.\n\n### Initial Setup\n\nYou initially Setup configuration with 4 easy steps...\n\n1). Require AwesomeConfig:\n\n```\nconst config = require(\"@awesomeeng/awesome-config\");\n```\n\n2). Initialize AwesomeConfig. This setups configuration and prepares configuration for additions.\n\n```\nconst config = require(\"@awesomeeng/awesome-config\");\nconfig().init();\n```\n\n**Note that we call `config()` when we are referencing our configuration management systems like `init()` or 'start()'. We use just `config` when we are referencing actual configuration properties.  This separation allows AwesomeConfig to have zero reserved words and lets you express your configuration however you want.**\n\n3). Add zero or more configurations:\n\n```\nconst config = require(\"@awesomeeng/awesome-config\");\nconfig().init();\nconfig().add(someconfig);\n```\n\nThere are a variety of ways to add configurations, so make sure to read the [Adding Configurations](#adding-configurations) section below.\n\n4). Start AwesomeConfig:\n\n```\nconst config = require(\"@awesomeeng/awesome-config\");\nconfig().init();\nconfig().add(someconfig);\nconfig().start();\n```\n\nOnce `config().start()` is called your configuration gets merged into a single configuration view based on any conditions you specified, variables are resolved, placeholders are checked, and the entire resulting structure is made immutable.\n\n### Usage\n\nYou access configuration as you would any JavaScript object. Say you have a configuration property called \"one.two.three\".  Simply access it thus:\n\n```\nconfig.one.two.three\n```\n\nIf the property doesnt exist or any of its ancestors (\"one\" for example) does not exist, the property throws an exception. This ensures that your configuration is always met or fails fast.\n\nRegardless of where you require AwesomeConfig, it exposes the same configuration details. This lets you initialize and start config once in your application, but access it from anywhere without the need to pass the config object around.\n\n```\nconst config = require(\"@awesomeeng/awesome-config\");\nconsole.log(config.this.is.cool);\n```\n\nThere is a little more nuance to it, but that is basically all there is to using AwesomeConfig.\n\n## Adding Configurations\n\nYou can add configuration in five basic ways: A JavaScript Object, a JSON String, an AwesomeConfig Notation string, a resolved filename, or a resolved directory. Each approach has slight differences and fits different needs.\n\nYou may add as many configurations you want before calling `config().start()`.\n\nWhen `config().start()` is called, all of the added configurations are merged together into a single configuration view.  The order they are merged is the order in which they are added, thus things added later will overwrite things added earlier if they have the same property names. This intentionally lets you provide some values, but then override them later as needed.\n\n### Adding A JavaScrpt Object Configuration\n\nYou may add a JavaScript object as a configuration.  The object must be a plain JavaScript object and cannot be an Array or other primative.\n\n```\nconfig().add({\n\tone: {\n\t\ttwo: {\n\t\t\tthree: 123\n\t\t}\n\t},\n\tfour: {\n\t\tfive: 45\n\t}\n});\n```\n\nThis would result in the following properties:\n\n```\nconfig.one.two.three === 123\nconfig.four.five === 45\n```\n\n### Adding A JSON String Configuration\n\nYou can add a JSON String. AwesomeConfig will parse the JSON using `JSON.parse()` and the resulting object will be added as if `config().add(object)` was called.  The parsed JSON must return a JavaScript object and cannot return an Array or other Primative.\n\n```\nconfig().add(\"{\\\"one\\\":1}\");\n```\n\nThis would result in the following properties:\n\n```\nconfig.one === 1\n```\n\n### Adding an AwesomeConfig Notation String Configuration\n\nYou can add a AwesomeConfig Notation String. AwesomeConfig will parse the string using the AwesomeConfig Notation parser and the resulting configuration will be added.\n\n```\nconfig().add(`\n\tone.two.three: 123\n\t{\n\t\tfour: {\n\t\t\tfive: 45\n\t\t}\n\t}\n`);\n```\n\nThis would result in the following properties:\n\n```\nconfig.one.two.three === 123\nconfig.four.five === 45\n```\n\n### Adding A Filename Configuration\n\nYou may pass a filename into `config().add()` and the file contents will be loaded, parsed using the AwesomeConfig Notation parser (see [Configuration Notation](#configuration-notation) below), and the resulting objects and conditions are added.\n\nThe passed filename is resolved relative to the current working directory, or the calling module if not found in the current working directory. If the file is not found or otherwise unreadable, an exception will be thrown.\n\n```\nconfig().add(\"./MyConfig.cfg\");\n```\n\n### Adding A Directory Configuration\n\nPassing a directory into `config().add()` will result in all files within the directory that match `*.cfg` being loaded (via `config().add(filename)` from above). The order the files are loaded is based on their case sensitive alphabetical order in the directory.\n\n### Adding with Conditions\n\nThe second argument in `config().add()` may specify a condition string that is applied as the default conditions to the configuration being added. This allows you to control configurations more programatically.\n\n```\nconfig().add(\"./MyConfig.cfg\",\"hostname==localhost and os=windows\");\n```\n\nSee [Conditions](#conditions) below for more information on condition strings.\n\n## Configuration Notation\n\nAwesomeConfig configuration files use a custom configuration notation that is a hybrid of both JSON and key/value pairs.  If you want to just use pure JSON that is fine. However, AwesomeConfig notation gives you a little bit more such as comments, conditions, key/values, variables, placeholders, and mixing key/values with json.\n\n### Example\n\nHere's an example configuration file:\n\n```\n//\n// this is an example configuration.\n//\n\none.two.three: 123\nfour.five: {\n\tsix: {\n\t\tseven: some string value # and a comment\n\t}\n}\neight: [{\n\tnine: 89\n}]\n```\n\nThis configuration would result in the following properties:\n\n```\none.two.three = 123\nfour.five.six.seven = \"some string value\"\neight.0.nine = 89\n```\n\nIn the example you will notice a few things going on:\n\nFirst we have a standard key/value pair in \"one.two.three\". The dot notation is used to separate the path into levels.  The key/value pair notation form saves a lot of space and creates cleaner configurations. If we wanted to write the same using JSON it would look like this:\n\n```\n{\n\t\"one\": {\n\t\t\"two\": {\n\t\t\t\"three\": 123\n\t\t}\n\t}\n}\n```\n\nSecond, we have a key/value pair again, but the value side is a JSON object. This mixing of key/value and JSON can result in very clear, easy to read configurations.  Also, you might notice that the quotes around the key names are optional.\n\nFinally, we have a key in \"eight\" which takes an array as its argument, which in turn has some JSON inside of it.\n\n### Structure\n\nAn AwesomeConfig file has the following structure:\n\n```\nconfig = [<comment>|<json_block>|<key_value_pair>|<condition>]*\n```\n\nThat is the top level have a comment, a json block, a key/value pair, or a condition.  We look at each of these below...\n\n### Comments\n\n```\ncomment = [<double_slash_comment>|<hash_comment>|<multi_line_comment>]\n```\n\nAwesomeConfig files support three different types of comments:\n\n - Double Slash Comments: starts with two forward slash characters (\"//\") and terminate at a newline character.\n \t```\n\t// this is a double slash comment\n\tblah=123 // and so is this\n\t```\n - Hash Comments start with the hash character \"#\" (sometimes called the pound sign) and terminate at a newline character.\n \t```\n\t# this is a hash comment\n\tblah=123 # and so is this\n\t```\n - Multi-Line Comments start with a \"/*\" and run until a corresponding \"*/\" string is detected.  Multi-Line comments can span multiple lines and are great for large blocks of comment text.\n \t```\n \t/*\n \t\tThis is a\n\t\tmultiline\n\t\tcomment.\n \t */\n \t```\n\n### JSON Block\n\n```\njson_block = \"{\" [<json>] \"}\"\n```\n\nA JSON block is a valid JSON string that begins with the open brace character (\"{\") and ends with the close brace character (\"}\"). Array JSON blocks are not supported at the top level.\n\n### Key/Value Pairs\n\n```\nkey_value_pair = <key> <assignment_operator> <value>\n```\n\nA key/value pair matches some key or key path with a value.  The following are all examples of key/value pairs...\n\n```\none: 1\ntwo = two\nthree.four = {\n\tfive: 345\n}\n```\n\n#### Keys\n\nA key consist of one or more letter (\"Abc\"), digit (\"123\"), underscore (\"_\"), dash (\"-\"), or dollar sign (\"$\") characters. No other character is a valid key and it would be best to avoid them.\n\nYou can use the dot character to separate keys into multiple level keys, or a key path. `one.two.three` is a key path with three levels of nesting where \"three\" is a child of \"two\" which in turn is a child of \"one\".\n\n#### Assignment Operators\n\nIn key/value pairs you may use either the color (\":\") or equal (\"=\") characters as assignment characters. So both are valid:\n\n```\none.two: 12\none.two=12\n```\n\n#### Values\n\n```\nvalue = [\"null\"|<boolean>|<number>|<string>|<quoted_string>|<array>|<object>]\n```\n\nA value may be a null, a boolean, a number, a string, a quoted string, an array, or an object.\n\n - **null**: the value `null`. This is case sensative, so make sure it is all lower case.\n \t```\n\tone.two: null\n\t```\n\n - **boolean**: the values `true` or `false`. These are case sensative, so make sure they are all lower case.\n \t```\n\tone.two: true\n\tone.two: false\n\t```\n - **number**: Any valid number such as 123 or 123.45 or -123.45.\n\t```\n\tone.two: 12\n\tone.two: 0.12\n\tone.two: -12\n\t```\n - **string**: A string is any amount of text that is not a boolean or a number.  Strings may be quoted with single ('blah') quotes or double quotes (\"blah\"). If you are doing a url like (https://google.com) or have a comment chaaracter (\"#\" or \"//\" or \"/*\") in your string, quote it!\n\t```\n\tone.two: \"onetwo\",\n\tone.two: onetwo,\n\tone.two: 'onetwo'\n\t```\n - **Array**: An Array starts with a open bracket (\"[\") and ends with a close bracket (\"]\") and contains zero or more values. The values themselves do not need to be of the same type. They roughly adhere to the same types for the values in this section with one exception: strings MUST be quoted. Each value is separated by a comma. Arrays may span multiple lines.\n\t```\n\tone.two: []\n\tone.two: [\"asdf\"]\n\tone.two: [\"asdf\",123,false,{\n\t\tfour: 124\n\t}]\n\t```\n - **Object**: Objects here are the same as JSON blocks described above.  They begin with a open brace (\"{\") and end with a close brace (\"}\") character.  Keys do not need to be quoted, but they can be.\n\t```\n\tone.two: {\n\t\tthree: 123\n\t\tfour: {\n\t\t\tfive: \"12345\"\n\t\t}\n\t}\n\t```\n\n### Conditions\n\n```\ncondition = \"[\" [<condition>] \"]\"\n```\n\nConditions describe certain criteria that must be met in order for the configuration that follows to be included when merged (during `config().start()`).  Conditions within the Configuration Notation start with an open brakcet (\"[\") character and terminate in a close bracket (\"]\") character. Condition may never be nested in another object like a key/value pair or a JSON block; they may only be used at the top level.\n\nHere's an example:\n\n```\n// Example of conditions\none.two: \"unknown\"\n\n[os:type=windows]\none.two: \"windows\"\n\n[os:type=linux]\none.two: \"unix\"\n\n[os:type=darwin] // mac\none.two: \"mac\"\n\n[]\none.three: 13\n```\n\nIn AwesomeConfig's Configuration Notation, a condition impacts all of the configuration that follows it, until a different condition is applied. In the above example, if the OS is \"windows\" the value of `one.two` after merging will be \"windows\".\n\nAn empty condition `[]` signals that **no condition* applies, thus returning the configuration to the default condition state.\n\nFor more information on conditions check out the [Conditions](#conditions) section below.\n\nNote that conditions are only valid in AwesomeConfig Configuration Notation or if you pass them into the `config().add()` method as the second argument.\n\n### Variables and Placeholders\n\nThe configuration format supports both Variables and Placeholders. See the documentation for [Variables](#variables) and [Placeholders](#placeholders) below for more details.\n\n## Namespaces\n\nAwesomeConfig is a global object, meaning that when you use AwesomeConfig in one part of your application, a second usage of it in a different part of your application uses the same object. If you are writing an application that uses AwesomeConfig, but also requires a module that uses AwesomeConfig as well, the potential for conflicting views of config or overwriting keys exists.  To resolve this, AwesomeConfig allows you to use an optional namespace parameter during require. If you are writing a library that you expect others to require and are using AwesomeConfig, consider using a namespace instead of global usage.\n\nWhen you use a namespace you are creating an entirely separate instance of AwesomeConfig to which you can `init()`, `start()`, and `add()` without fear of conflicting with another namespace or the global namespace.  Furthermore, you can reference your namespace in other parts of your application without having to pass AwesomeConfig around; you just need to know the namespace name.\n\n### Using a Namespace\n\nWhen you require AwesomeConfig as shown below you are return the global instance of AwesomeConfig.\n\n```\nconst AwesomeConfig = require(\"@awesomeeng/awesome-config\");\n```\n\nTo switch to a different name space, change your require statement like this:\n\n```\nconst AwesomeConfig = require(\"@awesomeeng/awesome-config\");\nconst config = AwesomeConfig(\"your namespace name\");\n```\n\nYou can shortcut this to one line if you like, thus:\n\n```\nconst config = require(\"@awesomeeng/awesome-config\")(\"your namespace name\");\n```\n\nAny time you require with the same namespace name, you get the same instance. If you require without a namespace name, you get the global namespace. This lets you access a specific namespaced instance anywhere you like. Because of this it is recommended that you use fairly unique namespace names. Calling your namespace \"config\" or \"namespace\" is probably a poor idea; consider something like \"MyAwsesomeModuleNamespace\".\n\nHere's an example of setting up AwesomeConfig using a custom namespace.\n\n```\nconst AwesomeConfig = require(\"@awesomeeng/awesome-config\");\nconst config = AwesomeConfig(\"MyAwesomeModuleNamespace\");\n\nconfig().init();\nconfig().add(...);\nconfig().start();\n```\n\nAnd here's an example of using it elsewhere.\n\n```\nconst AwesomeConfig = require(\"@awesomeeng/awesome-config\");\nconst config = AwesomeConfig(\"MyAwesomeModuleNamespace\");\n\nconsole.log(config.one.two.three);\n```\n\n## Variables\n\nVariables allow you to reference one point in configuration from a different part of configuration.  Coupled with [Conditions](#conditions) Variables can be really powerful.\n\nA variable has the form `${path}` where path is some configuration property dot notation path, you might use if you were getting the value itself.\n\n```\none.two: 12\none.three: ${one.two}\none.four: ${one.three}\none.five: \"${one.four} and FIVE!\"\n```\n\nWhen you call `config().start()` AwesomeConfig merges all the added configurations together to form a single configuration view.  Then it iterates the entire configuration looking for any variables and replaces those variables with their appropriate values.  You can even have variables that reference variables and so on, as shown in the example above.\n\nIf for some reason a variable cannot resolve, you will get an exception immediately.\n\nYou can use a variable anywhere you would have a value.  In key/value pairs you can simply have the variable in place of the string; in JSON blocks you should wrap the variable in quotes like `\"${blah}\"` so the JSON will validate.\n\nVariables get replaced by the exact content they are referencing.  If the variable is the entire content of the string, it will replace the string with the type of the resolved variable as for `one.three` and `one.four` from the example above.  However, if the variable is only a portion of the content, it will **string concatenate** the contents together, as shown in the example above for `one.five` which would return `12 and FIVE!` as a string.\n\n### Special Variables\n\nIn addition to referencing specific portions of config using variables you can also use variables to get a number of special values as described below:\n\n - **${env:xyz}**: Returns the envionment variables specified, xyz in this case.\n\n - **${hostname:domain}**: Returns the last two parts of the hostname, the \"google.com\" portion.\n - **${hostname:fqdn}**: Same as `${hostname:full}`.\n - **${hostname:full}**: Returns the entire hostname string.\n - **${hostname:name}**: Returns the first part of the hostname strig, everything up tot he first dot.\n\n - **${process:args}**: Returns the arguments passed to the process, as a string.\n - **${process:cwd}**: Returns the current working directory.\n - **${process:exec}**: Returns the executable (usually \"node\" or \"node.exe\") that ran node.\n - **${process:execPath}**: Returns the executable (usually \"node\" or \"node.exe\") that ran node.\n - **${process:main}**: Returns the script executed by node at startup.\n - **${process:pid}**: Returns the process pid.\n - **${process:ppid}**: Returns te process parent pid.\n - **${process:script}**: Returns the script executed by node at startup.\n - **${process:version}**: Returns node.js version, as a string.\n\n - **${os:arch}**: Returns the OS arch string, currently one of the following: arm | arm64 | ia32 | mips | mipsel | ppc | ppc64 | s390 | s390x | x32 | x64\n - **${os:type}**: Returns the OS uname type string; for example \"Linux\", or \"Windows_NT\", or \"Darwin\"\n - **${os:bits}**: Returns the number of bits in the system (32 or 64)\n - **${os:cpus}**: Returns the number of CPUs reported to node.js\n - **${os:home}**: Returns the home directory path.\n - **${os:homedir}**: Returns the home directory path.\n - **${os:platform}**: Returns the OS platform string, currently one of the following:  aix | darwin | freebsd | linux | openbsd | sunos | win32\n - **${os:user}**: Returns the OS family name.\n - **${os:username}**: Returns the OS family name.\n\n - **${string:encoding}**: Returns the default encoding type for strings, usually \"utf-8\".\n - **${string:eol}**: Returns the system EOL character like \"\\n\".\n\n## Placeholders\n\nPlaceholders are a lot like variables but they are used to mark portions of your configuration that must be completed before the configuration is valid.  Placeholders are a great way of saying that some value in your configuration must be overwritten by a later configuration in order to be valid.  Here's an example:\n\n```\none.two: <<one.two is missing>>\none.three: <<one.three is required for this product.>>\n...\none.two: blah\n````\n\nA placeholder has the form `<<description>>`. The `description` is used in the resulting exception if the placeholder is not overwritten at the time `config().start()` is called.\n\nIn the above example the first instance of `one.two` and the instance of `one.three` both contain placeholders.  Later, `one.two` is overwritten and thus the placeholder is removed.  But `one.three` never gets overwritten (at least in this example) and thus when `config().start()` is called, an exception will occur to indicate that the placeholder has not been replaced.\n\nPlaceholders work in conjunction with varaibles really nicely, but they are entirely optional.\n\n## Conditions\n\nConditions describe certain criteria that must be met in order for the configuration to which it applies to be included when merged (during `config().start()`). Conditions can be applied as the second argument of `config().add()` or they can be used inline in the AwesomeConfig Configuration Notation (see [Configuration Notation](#configuration-notation) above).\n\nA condition is a string that express one or more conditions that must be met.  Here are some examples:\n\n```\nos:name=linux\ntrue\nhostname:full=localhost and os:cpus>1\nhostname:name=test or hostname:name=dev\n(hostname:domain=acme.com and env:target=development) or hostname:full=localhost\n```\n\nA conditions support boolean operators like `not` and `and` and `or` as well as grouping with `(<condition>)`.  Each condition is slightly different in how it works, so we suggest you read the [Condition Expressions](./docs/Conditions.md) documentation to learn more.\n\n## Documentation\n\n - [Understanding Merging](./docs/Merging.md)\n - [Variables and Placeholders](./docs/VariablesAndPlaceholders.md)\n - [Condition Expressions](./docs/Conditions.md)\n\n - [API Documentation](./docs/API.md)\n\n## Examples\n\nAwesomeConfig ships with a set of examples for your reference.\n\n - [Adding Files](./examples/AddFiles): An example of using AwesomeConfig with Confiuration Files.\n\n - [Adding Directories](./examples/AddDirectory): An example of using AwesomeConfig with a directory of configuration.\n\n - [Variables, Placeholders, and Conditions](./examples/VarsPlaceholdersConditions): An example of using AwesomeConfig variables, placeholders and conditions.\n\n - [Namespaces](./examples/Namespaces): An example of how to use namespaces.\n\n## The Awesome Engineering Company\n\nAwesomeConfig is written and maintained by The Awesome Engineering Company. We belive in building clean, configurable, creative software for engineers and architects and customers.\n\nTo learn more about The Awesome Engineering Company and our suite of products, visit us on the web at https://awesomeeng.com.\n\n## Support and Help\n\nThis product is maintained and supported by The Awesome Engineering Company.  For support please [file an issue](./issues) or contact us via our Webiste at [https://awesomeeng.com](https://awesomeeng.com).  We will do our best to respond to you in a timely fashion.\n\n## License\n\nAwesomeConfig is released under the MIT License. Please read the  [LICENSE](./LICENSE) file for details.\n","readmeFilename":"README.md"}