diff --git a/.eslintrc.json b/.eslintrc.json index be3757b..f95df7c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,6 +2,9 @@ "env": { "node": true }, + "parserOptions": { + "ecmaVersion": 6 + }, "rules": { "no-unused-vars": "error" } diff --git a/.travis.yml b/.travis.yml index feeba3b..0cecc82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,8 @@ node_js: - "4" - "6" - "8" - - "9" + - "10" + - "12" script: - npm test @@ -19,7 +20,6 @@ matrix: allow_failures: - node_js: "0.10" - node_js: "0.12" - - node_js: "9" notifications: email: diff --git a/lib/nconf/stores/argv.js b/lib/nconf/stores/argv.js index bc65168..772a2fd 100644 --- a/lib/nconf/stores/argv.js +++ b/lib/nconf/stores/argv.js @@ -27,6 +27,7 @@ var Argv = exports.Argv = function (options, usage) { if(typeof options.readOnly === 'boolean') { this.readOnly = options.readOnly; delete options.readOnly; + // FIXME; should not mutate options!!!! } else { this.readOnly = true; } diff --git a/package-lock.json b/package-lock.json index 78486e2..b3a05ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,14 +22,42 @@ "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } } }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" + }, "acorn": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz", "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==", "dev": true }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "^4.0.4" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, "acorn-jsx": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", @@ -43,7 +71,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", - "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -57,11 +84,25 @@ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" }, "ansi-regex": { "version": "2.1.1", @@ -69,23 +110,53 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "color-convert": "^1.9.0" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "requires": { + "default-require-extensions": "^1.0.0" } }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -101,32 +172,35 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, "requires": { "lodash": "^4.17.10" }, @@ -134,55 +208,302 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" } } }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", + "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", + "requires": { + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^21.2.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", + "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "requires": { + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.7.5", + "test-exclude": "^4.1.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", + "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-preset-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", + "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", + "requires": { + "babel-plugin-jest-hoist": "^21.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { "tweetnacl": "^0.14.3" } }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.x.x" + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "requires": { + "resolve": "1.1.7" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "requires": { + "node-int64": "^0.4.0" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -206,18 +527,44 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "requires": { - "ansi-styles": "^3.2.1", + "ansi-styles": "^3.1.0", "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "supports-color": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + } } }, "chardet": { @@ -226,6 +573,11 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "ci-info": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", + "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==" + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", @@ -288,8 +640,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", @@ -297,25 +648,22 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" } @@ -323,14 +671,27 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { "version": "3.0.2", @@ -346,6 +707,66 @@ "request": "^2.85.0" }, "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", @@ -356,11 +777,94 @@ "esprima": "^4.0.0" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true } } }, @@ -374,11 +878,41 @@ "which": "^1.2.9" } }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.x.x" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.x.x" + } + } + } + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "requires": { + "cssom": "0.3.x" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -387,7 +921,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -400,8 +933,15 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "requires": { + "strip-bom": "^2.0.0" + } }, "del": { "version": "2.2.2", @@ -421,14 +961,15 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "diff": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", - "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=", - "dev": true + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } }, "doctrine": { "version": "2.1.0", @@ -440,21 +981,53 @@ } }, "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "~0.1.0" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "requires": { + "prr": "~0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", + "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.5.6" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + } + } }, "eslint": { "version": "5.5.0", @@ -533,6 +1106,12 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", @@ -554,6 +1133,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -592,8 +1177,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" }, "esquery": { "version": "1.0.1", @@ -616,14 +1200,20 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "requires": { + "merge": "^1.1.3" + } }, "execa": { "version": "0.7.0", @@ -639,11 +1229,49 @@ "strip-eof": "^1.0.0" } }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", + "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "external-editor": { "version": "3.0.3", @@ -654,37 +1282,54 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "^2.0.0" + } }, "figures": { "version": "2.0.0", @@ -705,6 +1350,32 @@ "object-assign": "^4.0.1" } }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -725,28 +1396,827 @@ "write": "^0.2.1" } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.5", "mime-types": "^2.1.12" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } }, "functional-red-black-tree": { "version": "1.0.1", @@ -768,7 +2238,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -777,7 +2246,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -787,11 +2255,27 @@ "path-is-absolute": "^1.0.0" } }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { "version": "5.0.0", @@ -810,8 +2294,7 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { "version": "1.10.5", @@ -819,33 +2302,106 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "^5.3.0", + "ajv": "^5.1.0", "har-schema": "^2.0.0" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -853,13 +2409,9 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "ignore": { "version": "4.0.6", @@ -870,14 +2422,12 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -886,8 +2436,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", @@ -923,16 +2472,97 @@ } } }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "^1.0.0" + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "requires": { + "ci-info": "^1.0.0" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -957,6 +2587,16 @@ "path-is-inside": "^1.0.1" } }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -977,19 +2617,35 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { "version": "0.4.5", @@ -1497,17 +3153,557 @@ } } }, + "istanbul-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.9.1", + "istanbul-lib-report": "^1.1.2", + "istanbul-lib-source-maps": "^1.2.2", + "istanbul-reports": "^1.1.3", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==" + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "requires": { + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + } + }, + "istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", + "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", + "requires": { + "jest-cli": "^21.2.1" + }, + "dependencies": { + "jest-cli": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", + "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^21.2.0", + "jest-config": "^21.2.1", + "jest-environment-jsdom": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve-dependencies": "^21.2.0", + "jest-runner": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-snapshot": "^21.2.1", + "jest-util": "^21.2.1", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^3.0.0", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^9.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "jest-changed-files": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", + "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", + "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^21.2.1", + "jest-environment-node": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "jest-validate": "^21.2.1", + "pretty-format": "^21.2.1" + } + }, + "jest-diff": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", + "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + } + } + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==" + }, + "jest-environment-jsdom": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", + "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", + "requires": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1", + "jsdom": "^9.12.0" + } + }, + "jest-environment-node": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", + "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", + "requires": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1" + } + }, + "jest-get-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", + "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==" + }, + "jest-haste-map": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", + "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^21.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0", + "worker-farm": "^1.3.1" + } + }, + "jest-jasmine2": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", + "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", + "requires": { + "chalk": "^2.0.1", + "expect": "^21.2.1", + "graceful-fs": "^4.1.11", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-snapshot": "^21.2.1", + "p-cancelable": "^0.3.0" + } + }, + "jest-matcher-utils": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", + "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "jest-message-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", + "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", + "requires": { + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0" + } + }, + "jest-mock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", + "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==" + }, + "jest-regex-util": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", + "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==" + }, + "jest-resolve": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", + "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1", + "is-builtin-module": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", + "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", + "requires": { + "jest-regex-util": "^21.2.0" + } + }, + "jest-runner": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", + "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", + "requires": { + "jest-config": "^21.2.1", + "jest-docblock": "^21.2.0", + "jest-haste-map": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-util": "^21.2.1", + "pify": "^3.0.0", + "throat": "^4.0.0", + "worker-farm": "^1.3.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "jest-runtime": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", + "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^21.2.0", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^9.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "jest-snapshot": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", + "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^21.2.1" + } + }, + "jest-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", + "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "jest-message-util": "^21.2.1", + "jest-mock": "^21.2.0", + "jest-validate": "^21.2.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "jest-validate": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", + "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1517,38 +3713,92 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, "optional": true }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "requires": { + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -1556,6 +3806,20 @@ "verror": "1.10.0" } }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "optional": true + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -1570,16 +3834,32 @@ "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -1592,8 +3872,7 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "log-driver": { "version": "1.2.7", @@ -1601,6 +3880,19 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -1610,6 +3902,14 @@ "yallist": "^2.1.2" } }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", @@ -1618,19 +3918,42 @@ "mimic-fn": "^1.0.0" } }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "requires": { - "mime-db": "~1.36.0" + "mime-db": "~1.30.0" } }, "mimic-fn": { @@ -1642,7 +3965,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1650,14 +3972,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -1665,8 +3985,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mute-stream": { "version": "0.0.7", @@ -1674,11 +3993,16 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "nconf-yaml": { "version": "1.0.2", @@ -1695,6 +4019,41 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-notifier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "requires": { + "growly": "^1.3.0", + "semver": "^5.3.0", + "shellwords": "^0.1.0", + "which": "^1.2.12" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -1708,23 +4067,34 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", + "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==" + }, "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -1738,11 +4108,26 @@ "mimic-fn": "^1.0.0" } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -1752,6 +4137,11 @@ "wordwrap": "~1.0.0" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -1765,8 +4155,12 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" }, "p-finally": { "version": "1.0.0", @@ -1786,6 +4180,30 @@ "p-limit": "^1.1.0" } }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -1794,8 +4212,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -1808,29 +4225,40 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -1844,8 +4272,41 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-format": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", + "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "progress": { "version": "2.0.0", @@ -1853,6 +4314,11 @@ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -1867,14 +4333,100 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } }, "regexpp": { "version": "2.0.0", @@ -1882,40 +4434,56 @@ "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", "dev": true }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", + "aws4": "^1.6.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "uuid": "^3.1.0" } }, "require-directory": { @@ -1938,6 +4506,11 @@ "resolve-from": "^1.0.0" } }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", @@ -1954,11 +4527,19 @@ "signal-exit": "^3.0.2" } }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -1984,8 +4565,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safer-buffer": { "version": "2.1.2", @@ -1993,16 +4573,42 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sane": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.2.0.tgz", + "integrity": "sha512-OSJxhHO0CgPUw3lUm3GhfREAfza45smvEI9ozuFrxKG10GHVo0ryW9FK5VYlLvxj0SV7HVKHW0voYJIRu27GWg==", + "requires": { + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.1.1", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "secure-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "set-blocking": { "version": "2.0.0", @@ -2022,11 +4628,21 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", @@ -2036,17 +4652,54 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.x.x" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -2055,10 +4708,18 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -2068,6 +4729,11 @@ "strip-ansi": "^4.0.0" } }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -2083,6 +4749,14 @@ } } }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -2095,13 +4769,14 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { "version": "4.0.3", @@ -2143,12 +4818,29 @@ } } }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -2164,16 +4856,34 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "requires": { - "psl": "^1.1.24", "punycode": "^1.4.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", @@ -2184,7 +4894,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -2193,18 +4902,70 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, "optional": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -2223,31 +4984,80 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "vows": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/vows/-/vows-0.8.2.tgz", - "integrity": "sha1-aR95qybM3oC6cm3en+yOc9a88us=", - "dev": true, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { - "diff": "~1.0.8", - "eyes": "~0.1.6", - "glob": "^7.1.2" + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + } } }, "which": { @@ -2263,11 +5073,25 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "optional": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "worker-farm": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.1.tgz", + "integrity": "sha512-T5NH6Wqsd8MwGD4AK8BBllUy6LmHaqjEOyo/YIUEegZui6/v5Bqde//3jwyE3PGiGYMmWi06exFBi5LNhhPFNw==", + "requires": { + "errno": "^0.1.4", + "xtend": "^4.0.1" + } }, "wrap-ansi": { "version": "2.1.0", @@ -2309,8 +5133,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -2321,6 +5144,26 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", diff --git a/package.json b/package.json index 2994afe..5ebcd6e 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ ], "dependencies": { "ini": "^1.3.0", + "jest": "^21.2.1", "secure-keys": "^1.0.0", "yargs": "^10.0.3" }, @@ -28,13 +29,12 @@ "coveralls": "^3.0.2", "eslint": "^5.5.0", "istanbul": "^0.4.1", - "nconf-yaml": "^1.0.2", - "vows": "^0.8.2" + "nconf-yaml": "^1.0.2" }, "main": "./lib/nconf", "scripts": { - "test": "vows test/*-test.js test/**/*-test.js --spec", - "cover": "istanbul cover vows -- test/*-test.js test/**/*-test.js --spec", + "test": "jest --verbose", + "cover": "jest --coverage", "coveralls": "cat coverage/lcov.info | coveralls", "lint": "eslint ." }, diff --git a/test/common-test.js b/test/common-test.js deleted file mode 100644 index 4f0a3fb..0000000 --- a/test/common-test.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * common.js: Tests for common utility function in nconf. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var fs = require('fs'), - path = require('path'), - vows = require('vows'), - helpers = require('./helpers'), - nconf = require('../lib/nconf'); - -var mergeDir = path.join(__dirname, 'fixtures', 'merge'), - files = fs.readdirSync(mergeDir).map(function (f) { return path.join(mergeDir, f) }); - -vows.describe('nconf/common').addBatch({ - "Using nconf.common module": { - "the loadFiles() method": { - topic: function () { - nconf.loadFiles(files, this.callback); - }, - "should merge the files correctly": helpers.assertMerged - }, - "the loadFilesSync() method": { - "should merge the files correctly": function () { - helpers.assertMerged(null, nconf.loadFilesSync(files)); - } - } - } -}).export(module); \ No newline at end of file diff --git a/test/common.test.js b/test/common.test.js new file mode 100644 index 0000000..122b0fb --- /dev/null +++ b/test/common.test.js @@ -0,0 +1,28 @@ +/* + * common.js: Tests for common utility function in nconf. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var fs = require('fs'); +var path = require('path'); +var helpers = require('./helpers'); +var nconf = require('../lib/nconf'); + +var mergeDir = path.join(__dirname, 'fixtures', 'merge'); +var files = fs.readdirSync(mergeDir).map(function (f) { return path.join(mergeDir, f) }); + +describe('nconf/common', () => { + describe('Using nconf.common module', () => { + it('the loadFiles() method should merge the files correctly', done => { + nconf.loadFiles(files, (err, res) => { + helpers.assertMerged(err, res); + done(); + }); + }); + it("the loadFilesSync() method should merge the files correctly", () => { + helpers.assertMerged(null, nconf.loadFilesSync(files)); + }); + }); +}); \ No newline at end of file diff --git a/test/complete-test.js b/test/complete-test.js deleted file mode 100644 index 57ec667..0000000 --- a/test/complete-test.js +++ /dev/null @@ -1,357 +0,0 @@ -/* - * complete-test.js: Complete test for multiple stores. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var fs = require('fs'), - vows = require('vows'), - assert = require('assert'), - nconf = require('../lib/nconf'), - data = require('./fixtures/data').data, - helpers = require('./helpers'); - -var completeTest = helpers.fixture('complete-test.json'), - complete = helpers.fixture('complete.json'); - -// prime the process.env -process.env['NCONF_foo'] = 'bar'; -process.env.FOO = 'bar'; -process.env.BAR = 'zalgo'; -process.env.NODE_ENV = 'debug'; -process.env.FOOBAR = 'should not load'; -process.env.TES = 'TING'; -process.env.json_array = JSON.stringify(['foo', 'bar', 'baz']); -process.env.json_obj = JSON.stringify({foo: 'bar', baz: 'foo'}); -process.env.NESTED__VALUE = 'nested'; -process.env.NESTED___VALUE_EXTRA_LODASH = '_nested_'; - -vows.describe('nconf/multiple-stores').addBatch({ - "When using the nconf with multiple providers": { - topic: function () { - var that = this; - helpers.cp(complete, completeTest, function () { - nconf.env({ - // separator: '__', - match: /^NCONF_/, - whitelist: ['NODE_ENV', 'FOO', 'BAR', 'TES'] - }); - nconf.file({ file: completeTest }); - nconf.use('argv', { type: 'literal', store: data }); - that.callback(); - }); - }, - "should have the correct `stores`": function () { - assert.isObject(nconf.stores.env); - assert.isObject(nconf.stores.argv); - assert.isObject(nconf.stores.file); - }, - "env vars": { - "are present": function () { - ['NODE_ENV', 'FOO', 'BAR', 'NCONF_foo'].forEach(function (key) { - assert.equal(nconf.get(key), process.env[key]); - }); - }, - "are readOnly": function () { - nconf.set('tes', 'broken'); - assert(nconf.get('tes'), 'TING'); - } - }, - "json vars": { - topic: function () { - fs.readFile(complete, 'utf8', this.callback); - }, - "are present": function (err, data) { - assert.isNull(err); - data = JSON.parse(data); - Object.keys(data).forEach(function (key) { - assert.deepEqual(nconf.get(key), data[key]); - }); - } - }, - "literal vars": { - "are present": function () { - Object.keys(data).forEach(function (key) { - assert.deepEqual(nconf.get(key), data[key]); - }); - } - }, - "and saving *synchronously*": { - topic: function () { - nconf.set('weebls', 'stuff'); - return nconf.save(); - }, - "correct return value": function (topic) { - Object.keys(topic).forEach(function (key) { - assert.deepEqual(topic[key], nconf.get(key)); - }); - }, - "the file": { - topic: function () { - fs.readFile(completeTest, 'utf8', this.callback); - }, - "saved correctly": function (err, data) { - data = JSON.parse(data); - Object.keys(data).forEach(function (key) { - assert.deepEqual(data[key], nconf.get(key)); - }); - assert.equal(nconf.get('weebls'), 'stuff'); - } - } - }, - teardown: function () { - // remove the file so that we can test saving it async - fs.unlinkSync(completeTest); - } - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using the nconf with multiple providers": { - "and saving *asynchronously*": { - topic: function () { - nconf.set('weebls', 'crap'); - nconf.save(this.callback); - }, - "correct return value": function (err, data) { - assert.isNull(err); - Object.keys(data).forEach(function (key) { - assert.deepEqual(data[key], nconf.get(key)); - }); - }, - "the file": { - topic: function () { - fs.readFile(completeTest, 'utf8', this.callback); - }, - "saved correctly": function (err, data) { - assert.isNull(err); - data = JSON.parse(data); - Object.keys(data).forEach(function (key) { - assert.deepEqual(nconf.get(key), data[key]); - }); - assert.equal(nconf.get('weebls'), 'crap'); - } - } - }, - teardown: function () { - fs.unlinkSync(completeTest); - nconf.remove('file'); - nconf.remove('memory'); - nconf.remove('argv'); - nconf.remove('env'); - } - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with lowerCase:true": { - topic: function () { - var that = this; - helpers.cp(complete, completeTest, function () { - nconf.env({ lowerCase: true }); - that.callback(); - }); - }, - "env vars": { - "keys also available as lower case": function () { - Object.keys(process.env).forEach(function (key) { - assert.equal(nconf.get(key.toLowerCase()), process.env[key]); - }); - } - }, - teardown: function () { - nconf.remove('env'); - } - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with parseValues:true": { - topic: function () { - var that = this; - helpers.cp(complete, completeTest, function () { - nconf.env({ parseValues: true }); - that.callback(); - }); - }, - "env vars": { - "JSON keys properly parsed": function () { - Object.keys(process.env).forEach(function (key) { - var val = process.env[key]; - - try { - val = JSON.parse(val); - } catch (err) {} - - assert.deepEqual(nconf.get(key), val); - }); - } - }, - teardown: function () { - nconf.remove('env'); - } - }, -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with transform:fn": { - topic: function () { - - function testTransform(obj) { - if (obj.key === 'FOO') { - obj.key = 'FOOD'; - obj.value = 'BARFOO'; - } - - return obj; - } - - var that = this; - helpers.cp(complete, completeTest, function () { - nconf.env({ transform: testTransform }) - that.callback(); - }); - }, "env vars": { - "port key/value properly transformed": function() { - assert.equal(nconf.get('FOOD'), 'BARFOO'); - } - } - }, - teardown: function () { - nconf.remove('env'); - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with a transform:fn that drops an entry": { - topic: function () { - - function testTransform(obj) { - if (obj.key === 'FOO') { - return false; - } - - return obj; - } - - var that = this; - helpers.cp(complete, completeTest, function () { - nconf.env({ transform: testTransform }); - that.callback(); - }); - }, "env vars": { - "port key/value properly transformed": function() { - assert.equal(typeof nconf.get('FOO'), 'undefined'); - } - } - }, - teardown: function () { - nconf.remove('env'); - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with a transform:fn that return an undefined value": { - topic: function () { - - function testTransform(obj) { - if (obj.key === 'FOO') { - return {key: 'FOO', value: undefined}; - } - - return obj; - } - - var that = this; - helpers.cp(complete, completeTest, function () { - nconf.env({ transform: testTransform }); - that.callback(); - }); - }, "env vars": { - "port key/value properly transformed": function() { - assert.equal(typeof nconf.get('FOO'), 'undefined'); - } - } - }, - teardown: function () { - nconf.remove('env'); - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with a bad transform:fn": { - topic: function () { - function testTransform() { - return {foo: 'bar'}; - } - - var that = this; - helpers.cp(complete, completeTest, function () { - try { - nconf.env({ transform: testTransform }); - that.callback(); - } catch (err) { - that.callback(null, err); - } - }); - }, "env vars": { - "port key/value throws transformation error": function(err) { - assert.equal(err.name, 'RuntimeError'); - } - } - }, - teardown: function () { - nconf.remove('env'); - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with a bad transform:fn": { - topic: function () { - - var that = this; - helpers.cp(complete, completeTest, function () { - try { - nconf.env({ separator: /__+/ }); - that.callback(); - } catch (err) { - that.callback(null, err); - } - }); - }, "env vars": { - "can access to nested values": function(/*err*/) { - assert.deepEqual(nconf.get('NESTED'), {VALUE:'nested', VALUE_EXTRA_LODASH: '_nested_'}); - } - } - }, - teardown: function () { - nconf.remove('env'); - } -}).addBatch({ - // Threw this in it's own batch to make sure it's run separately from the - // sync check - "When using env with a readOnly:false": { - topic: function () { - - var that = this; - helpers.cp(complete, completeTest, function () { - try { - nconf.env({ readOnly: false }); - that.callback(); - } catch (err) { - that.callback(null, err); - } - }); - }, "env vars": { - "can be changed when readOnly is false": function() { - assert.equal(nconf.get('TES'), 'TING'); - nconf.set('TES', 'changed'); - assert.equal(nconf.get('TES'), 'changed'); - } - } - }, - teardown: function () { - nconf.remove('env'); - } -}).export(module); diff --git a/test/complete.test.js b/test/complete.test.js new file mode 100644 index 0000000..c7f3dfb --- /dev/null +++ b/test/complete.test.js @@ -0,0 +1,258 @@ +/* + * complete-test.js: Complete test for multiple stores. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var fs = require('fs'); +var nconf = require('../lib/nconf'); +var data = require('./fixtures/data').data; +var helpers = require('./helpers'); + +var completeTest = helpers.fixture('complete-test.json'); +var complete = helpers.fixture('complete.json'); + +// prime the process.env +process.env['NCONF_foo'] = 'bar'; +process.env.FOO = 'bar'; +process.env.BAR = 'zalgo'; +process.env.NODE_ENV = 'debug'; +process.env.FOOBAR = 'should not load'; +process.env.json_array = JSON.stringify(['foo', 'bar', 'baz']); +process.env.json_obj = JSON.stringify({foo: 'bar', baz: 'foo'}); +process.env.NESTED__VALUE = 'nested'; +process.env.NESTED___VALUE_EXTRA_LODASH = '_nested_'; + +describe('nconf/multiple-stores', () => { + describe("When using the nconf with multiple providers", () => { + beforeAll(done => { + helpers.cp(complete, completeTest, function () { + nconf.env({ + // separator: '__', + match: /^NCONF_/, + whitelist: ['NODE_ENV', 'FOO', 'BAR'] + }); + nconf.file({file: completeTest}); + nconf.use('argv', {type: 'literal', store: data}); + done(); + }); + }); + afterAll(() => { + fs.unlinkSync(completeTest); + nconf.remove('file'); + nconf.remove('memory'); + nconf.remove('argv'); + nconf.remove('env'); + }) + it("should have the correct `stores`", () => { + expect(typeof nconf.stores.env).toBe('object'); + expect(typeof nconf.stores.argv).toBe('object'); + expect(typeof nconf.stores.file).toBe('object'); + }); + it("env vars, are present", () => { + ['NODE_ENV', 'FOO', 'BAR', 'NCONF_foo'].forEach(function (key) { + expect(nconf.get(key)).toEqual(process.env[key]); + }); + }); + it("json vars are present", done => { + fs.readFile(complete, 'utf8', (err, data) => { + expect(err).toBe(null); + data = JSON.parse(data); + Object.keys(data).forEach(function (key) { + expect(nconf.get(key)).toEqual(data[key]); + }); + done(); + }) + }); + it("literal vars are present", () => { + Object.keys(data).forEach(function (key) { + expect(nconf.get(key)).toEqual(data[key]); + }); + }); + describe('saving', () => { + afterEach(() => { + // remove the file so that we can test saving it async + fs.unlinkSync(completeTest); + }); + it("and saving *synchronously* correct return value, the file, saved correctly", done => { + nconf.set('weebls', 'stuff'); + var topic = nconf.save(); + Object.keys(topic).forEach(function (key) { + expect(topic[key]).toEqual(nconf.get(key)); + }); + fs.readFile(completeTest, 'utf8', function (err, data) { + expect(err).toBe(null); + data = JSON.parse(data); + Object.keys(data).forEach(function (key) { + expect(data[key]).toEqual(nconf.get(key)); + }); + expect(nconf.get('weebls')).toEqual('stuff'); + done(); + }); + }); + it("and saving *asynchronously* correct return value, the file, saved correctly", done => { + nconf.set('weebls', 'crap'); + nconf.save((err, data) => { + Object.keys(data).forEach(function (key) { + expect(data[key]).toEqual(nconf.get(key)); + }); + fs.readFile(completeTest, 'utf8', function (err, data) { + expect(err).toBe(null); + data = JSON.parse(data); + Object.keys(data).forEach(function (key) { + expect(data[key]).toEqual(nconf.get(key)); + }); + expect(nconf.get('weebls')).toEqual('crap'); + done(); + }); + }); + }); + }); + }); + describe("When using the nconf env with custom options", () => { + + describe("When using env with lowerCase:true", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + beforeAll(done => { + helpers.cp(complete, completeTest, () => { + nconf.env({lowerCase: true}); + done(); + }) + }) + it("env vars keys also available as lower case", () => { + Object.keys(process.env).forEach(function (key) { + expect(nconf.get(key.toLowerCase())).toEqual(process.env[key]); + }); + }) + afterAll(() => nconf.remove('env')) + }); + + + describe("When using env with parseValues:true", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + beforeAll(done => { + helpers.cp(complete, completeTest, () => { + nconf.env({parseValues: true}); + done(); + }) + }) + it("JSON keys properly parsed", () => { + Object.keys(process.env).forEach(function (key) { + var val = process.env[key]; + + try { + val = JSON.parse(val); + } catch (err) { + } + + expect(nconf.get(key)).toEqual(val); + }) + afterAll(() => nconf.remove('env')) + }); + + }); + + describe("When using env with transform:fn", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + beforeAll(done => { + function testTransform(obj) { + if (obj.key === 'FOO') { + obj.key = 'FOOD'; + obj.value = 'BARFOO'; + } + + return obj; + } + + helpers.cp(complete, completeTest, () => { + nconf.env({transform: testTransform}); + done(); + }) + }); + it("env vars port key/value properly transformed", () => { + expect(nconf.get('FOOD')).toEqual('BARFOO'); + }); + + afterAll(() => nconf.remove('env')) + }); + describe("When using env with transform:fn that drops an entry", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + beforeAll(done => { + function testTransform(obj) { + if (obj.key === 'FOO') { + return false; + } + + return obj; + } + + helpers.cp(complete, completeTest, () => { + nconf.env({transform: testTransform}); + done(); + }) + }); + it("env vars port key/value properly transformed", () => { + expect(nconf.get('FOO')).toBe(undefined); + }); + + afterAll(() => nconf.remove('env')) + }); + describe("When using env with transform:fn that return an undefined value", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + beforeAll(done => { + function testTransform(obj) { + if (obj.key === 'FOO') { + return {key: 'FOO', value: undefined}; + } + return obj; + } + + helpers.cp(complete, completeTest, () => { + nconf.env({transform: testTransform}); + done(); + }) + }); + it("env vars port key/value properly transformed", () => { + expect(nconf.get('FOO')).toBe(undefined); + }); + + afterAll(() => nconf.remove('env')) + }); + describe("When using env with bad transform:fn", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + it(" port key/value throws transformation error", done => { + + function testTransform(obj) { + return {foo: 'bar'}; + } + + helpers.cp(complete, completeTest, () => { + try { + nconf.env({transform: testTransform}); + } catch (err) { + expect(err.name).toEqual('RuntimeError') + done(); + } + }) + }); + + afterAll(() => nconf.remove('env')) + }); + describe("When using env with a separator", () => { + // Threw this in it's own batch to make sure it's run separately from the sync check + beforeAll(done => { + helpers.cp(complete, completeTest, () => { + nconf.env({separator: /__+/}); + done(); + }) + }); + it("can access to nested values", () => { + expect(nconf.get('NESTED')).toEqual({VALUE: 'nested', VALUE_EXTRA_LODASH: '_nested_'}); + }); + + afterAll(() => nconf.remove('env')) + }); + + }); +}); diff --git a/test/helpers.js b/test/helpers.js index 8402ae7..fa35e6c 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -5,52 +5,51 @@ * */ -var assert = require('assert'), - spawn = require('child_process').spawn, - fs = require('fs'), - path = require('path'), - nconf = require('../lib/nconf'); +var spawn = require('child_process').spawn; +var fs = require('fs'); +var path = require('path'); +var nconf = require('../lib/nconf'); exports.assertMerged = function (err, merged) { merged = merged instanceof nconf.Provider ? merged.store.store : merged; - assert.isNull(err); - assert.isObject(merged); - assert.isTrue(merged.apples); - assert.isTrue(merged.bananas); - assert.isObject(merged.candy); - assert.isTrue(merged.candy.something1); - assert.isTrue(merged.candy.something2); - assert.isTrue(merged.candy.something3); - assert.isTrue(merged.candy.something4); - assert.isTrue(merged.dates); - assert.isTrue(merged.elderberries); + expect() + expect(err).toBeNull(); + expect(typeof merged).toBe('object'); + expect(merged.apples).toBeTruthy(); + expect(merged.bananas).toBeTruthy(); + expect(typeof merged.candy).toBe('object'); + expect(merged.candy.something1).toBeTruthy(); + expect(merged.candy.something2).toBeTruthy(); + expect(merged.candy.something3).toBeTruthy(); + expect(merged.candy.something4).toBeTruthy(); + expect(merged.dates).toBeTruthy(); + expect(merged.elderberries).toBeTruthy(); }; +//FIXME TODO exports.assertSystemConf = function (options) { - return { - topic: function () { - var env = null; + return done => { + var env = null; - if (options.env) { - env = {} - Object.keys(process.env).forEach(function (key) { - env[key] = process.env[key]; - }); + if (options.env) { + env = {} + Object.keys(process.env).forEach(function (key) { + env[key] = process.env[key]; + }); - Object.keys(options.env).forEach(function (key) { - env[key] = options.env[key]; - }); - } - - var child = spawn('node', [options.script].concat(options.argv), { env: env }); - child.stdout.once('data', this.callback.bind(this, null)); - }, - "should respond with the value passed into the script": function (_, data) { - assert.equal(data.toString(), 'foobar'); + Object.keys(options.env).forEach(function (key) { + env[key] = options.env[key]; + }); } + + var child = spawn('node', [options.script].concat(options.argv), {env: env}); + child.stdout.once('data', data => { + expect(data.toString()).toEqual('foobar'); + done(); + }); } } diff --git a/test/hierarchy-test.js b/test/hierarchy-test.js deleted file mode 100644 index a76e2b5..0000000 --- a/test/hierarchy-test.js +++ /dev/null @@ -1,183 +0,0 @@ -/* - * hierarchy-test.js: Basic tests for hierarchical file stores. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var assert = require('assert'), - fs = require('fs'), - path = require('path'), - spawn = require('child_process').spawn, - vows = require('vows'), - nconf = require('../lib/nconf'); - -var configDir = path.join(__dirname, 'fixtures', 'hierarchy'), - globalConfig = path.join(configDir, 'global.json'), - userConfig = path.join(configDir, 'user.json'); - -vows.describe('nconf/hierarchy').addBatch({ - "When using nconf": { - "configured with two file stores": { - topic: function () { - nconf.add('user', { type: 'file', file: userConfig }); - nconf.add('global', { type: 'file', file: globalConfig }); - nconf.load(); - return nconf; - }, - "should have the appropriate keys present": function () { - assert.equal(nconf.get('title'), 'My specific title'); - assert.equal(nconf.get('color'), 'green'); - assert.equal(nconf.get('movie'), 'Kill Bill'); - } - }, - "configured with two file stores using `file`": { - topic: function () { - nconf.file('user', userConfig); - nconf.file('global', globalConfig); - nconf.load(); - return nconf; - }, - "should have the appropriate keys present": function () { - assert.equal(nconf.get('title'), 'My specific title'); - assert.equal(nconf.get('color'), 'green'); - assert.equal(nconf.get('movie'), 'Kill Bill'); - } - }, - "configured with .argv(), .env() and .file()": { - topic: function () { - var configFile = path.join(__dirname, 'fixtures', 'load-save.json'), - script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-save.js'), - argv = ['--foo', 'foo', '--bar', 'bar'], - that = this, - data = '', - child; - - try { fs.unlinkSync(configFile) } - catch (ex) { - // No-op - } - - child = spawn('node', [script].concat(argv)); - - child.stdout.on('data', function (d) { - data += d; - }); - - child.on('close', function () { - fs.readFile(configFile, 'utf8', that.callback.bind(null, null, data)); - }); - }, - "should not persist information passed in to process.env and process.argv to disk ": function (_, data, _, ondisk){ - assert.equal(data, 'foo'); - assert.deepEqual(JSON.parse(ondisk), { - database: { - host: '127.0.0.1', - port: 5984 - } - }); - } - }, - "configured with .argv(), .file() and invoked with nested command line options": { - topic: function () { - var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-merge.js'), - argv = ['--candy:something', 'foo', '--candy:something5:second', 'bar'], - that = this, - data = '', - child; - - child = spawn('node', [script].concat(argv)); - - child.stdout.on('data', function (d) { - data += d; - }); - - child.on('close', function() { - that.callback(null, data); - }); - }, - "should merge nested objects ": function (err, data) { - assert.deepEqual(JSON.parse(data), { - apples: true, - candy: { - something: 'foo', - something1: true, - something2: true, - something5: { - first: 1, - second: 'bar' - } - } - }); - } - }, - "configured with .argv() and separator, .file() and invoked with nested command line options": { - topic: function () { - var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-merge-with-separator.js'), - argv = ['--candy--something', 'foo', '--candy--something5--second', 'bar'], - that = this, - data = '', - child; - process.env.candy__bonbon = 'sweet'; - child = spawn('node', [script].concat(argv)); - delete process.env.candy__bonbon; - child.stdout.on('data', function (d) { - data += d; - }); - - child.on('close', function() { - that.callback(null, data); - }); - }, - "should merge nested objects ": function (err, data) { - console.log(data) - assert.deepEqual(JSON.parse(data), { - apples: true, - candy: { - bonbon: 'sweet', - something: 'foo', - something1: true, - something2: true, - something5: { - first: 1, - second: 'bar' - } - } - }); - } - }, - - "configured with .file(), .defaults() should deep merge objects": { - topic: function () { - var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-defaults-merge.js'), - that = this, - data = '', - child; - - child = spawn('node', [script]); - - child.stdout.on('data', function (d) { - data += d; - }); - - child.on('close', function() { - that.callback(null, data); - }); - }, - "should merge nested objects ": function (err, data) { - assert.deepEqual(JSON.parse(data), { - candy: { - something: 'much better something for you', - something1: true, - something2: true, - something18: 'completely unique', - something5: { - first: 1, - second: 99 - } - } - }); - } - } - } -}).export(module); diff --git a/test/hierarchy.test.js b/test/hierarchy.test.js new file mode 100644 index 0000000..12010ba --- /dev/null +++ b/test/hierarchy.test.js @@ -0,0 +1,159 @@ +/* + * hierarchy-test.js: Basic tests for hierarchical file stores. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var fs = require('fs'); +var path = require('path'); +var spawn = require('child_process').spawn; +var nconf = require('../lib/nconf'); + +var configDir = path.join(__dirname, 'fixtures', 'hierarchy'); +var globalConfig = path.join(configDir, 'global.json'); +var userConfig = path.join(configDir, 'user.json'); + +describe('nconf/hierarchy, When using nconf', () => { + it("configured with two file stores, should have the appropriate keys present", () => { + nconf.add('user', {type: 'file', file: userConfig}); + nconf.add('global', {type: 'file', file: globalConfig}); + nconf.load(); + + expect(nconf.get('title')).toEqual('My specific title'); + expect(nconf.get('color')).toEqual('green'); + expect(nconf.get('movie')).toEqual('Kill Bill'); + + }); + it("configured with two file stores using `file` should have the appropriate keys present", () => { + nconf.file('user', userConfig); + nconf.file('global', globalConfig); + nconf.load(); + + expect(nconf.get('title')).toEqual('My specific title'); + expect(nconf.get('color')).toEqual('green'); + expect(nconf.get('movie')).toEqual('Kill Bill'); + + }); + + it("configured with .argv(), .env() and .file() should not persist information passed in to process.env and process.argv to disk", + done => { + var configFile = path.join(__dirname, 'fixtures', 'load-save.json'); + var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-save.js'); + var argv = ['--foo', 'foo', '--bar', 'bar']; + var data = ''; + + try { + fs.unlinkSync(configFile) + } + catch (ex) { + // No-op + } + + var child = spawn('node', [script].concat(argv)); + + child.stdout.on('data', function (d) { + data += d; + }); + + child.on('close', function () { + fs.readFile(configFile, 'utf8', (err, ondisk) => { + expect(data).toEqual('foo'); + expect(JSON.parse(ondisk)).toEqual({ + database: { + host: '127.0.0.1', + port: 5984 + } + }); + }); + done(); + }); + + }); + + it("configured with .argv(), .file() and invoked with nested command line options, should merge nested objects", + done => { + var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-merge.js'); + var argv = ['--candy:something', 'foo', '--candy:something5:second', 'bar']; + var data = ''; + + var child = spawn('node', [script].concat(argv)); + + child.stdout.on('data', function (d) { + data += d; + }); + + child.on('close', function () { + expect(JSON.parse(data)).toEqual({ + apples: true, + candy: { + something: 'foo', + something1: true, + something2: true, + something5: { + first: 1, + second: 'bar' + } + } + }); + done(); + }); + }); + it("configured with .argv() and separator, .file() and invoked with nested command line options should merge nested objects", done => { + + var script = path.join(__dirname, 'fixtures', + 'scripts', 'nconf-hierarchical-load-merge-with-separator.js'); + var argv = ['--candy--something', 'foo', '--candy--something5--second', 'bar']; + var data = ''; + process.env.candy__bonbon = 'sweet'; + var child = spawn('node', [script].concat(argv)); + delete process.env.candy__bonbon; + child.stdout.on('data', function (d) { + data += d; + }); + + child.on('close', function () { + console.log(data) + expect(JSON.parse(data)).toEqual({ + apples: true, + candy: { + bonbon: 'sweet', + something: 'foo', + something1: true, + something2: true, + something5: { + first: 1, + second: 'bar' + } + } + }); + done(); + }); + }); + + it("configured with .file(), .defaults() should deep merge objects should merge nested objects ", done => { + var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-defaults-merge.js'); + var data = ''; + var child = spawn('node', [script]); + + child.stdout.on('data', function (d) { + data += d; + }); + + child.on('close', function () { + expect(JSON.parse(data)).toEqual({ + candy: { + something: 'much better something for you', + something1: true, + something2: true, + something18: 'completely unique', + something5: { + first: 1, + second: 99 + } + } + }); + done(); + }); + }) +}) diff --git a/test/nconf-test.js b/test/nconf-test.js deleted file mode 100644 index 76394b8..0000000 --- a/test/nconf-test.js +++ /dev/null @@ -1,147 +0,0 @@ -/* - * file-store-test.js: Tests for the nconf File store. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var fs = require('fs'), - path = require('path'), - vows = require('vows'), - assert = require('assert'), - nconf = require('../lib/nconf') - -vows.describe('nconf').addBatch({ - "When using the nconf": { - "should have the correct methods set": function () { - assert.isFunction(nconf.key); - assert.isFunction(nconf.path); - assert.isFunction(nconf.use); - assert.isFunction(nconf.any); - assert.isFunction(nconf.get); - assert.isFunction(nconf.set); - assert.isFunction(nconf.clear); - assert.isFunction(nconf.load); - assert.isFunction(nconf.save); - assert.isFunction(nconf.reset); - assert.isFunction(nconf.required); - }, - "the use() method": { - "should instaniate the correct store": function () { - nconf.use('memory'); - nconf.load(); - assert.instanceOf(nconf.stores['memory'], nconf.Memory); - } - }, - "it should": { - topic: function () { - fs.readFile(path.join(__dirname, '..', 'package.json'), this.callback); - }, - "have the correct version set": function (err, data) { - assert.isNull(err); - data = JSON.parse(data.toString()); - assert.equal(nconf.version, data.version); - } - }, - "the required() method": { - "should throw error with missing keys": function() { - nconf.set('foo:bar:bazz', 'buzz'); - assert.throws(nconf.required.bind(nconf, ['missing', 'foo:bar:bazz']), Error); - }, - "should return the provider if all required keys exist": function() { - var Provider = nconf.Provider; - nconf.set('foo:bar:bazz', 'buzz'); - assert.isTrue(nconf.required(['foo:bar:bazz']) instanceof Provider); - } - } - } -}).addBatch({ - "When using the nconf": { - "with the memory store": { - "the set() method": { - "should respond with true": function () { - assert.isTrue(nconf.set('foo:bar:bazz', 'buzz')); - } - }, - "the get() method": { - "without a callback": { - "should respond with the correct value": function () { - assert.equal(nconf.get('foo:bar:bazz'), 'buzz'); - }, - "should not step inside strings": function () { - assert.equal(nconf.get('foo:bar:bazz:0'), undefined); - } - }, - "with a callback": { - topic: function () { - nconf.get('foo:bar:bazz', this.callback); - }, - "should respond with the correct value": function (err, value) { - assert.equal(value, 'buzz'); - } - } - } - } - } -}).addBatch({ - "When using the nconf": { - "with the memory store": { - "the get() method": { - "should respond allow access to the root": function () { - assert(nconf.get(null)); - assert(nconf.get(undefined)); - assert(nconf.get()); - } - }, - "the set() method": { - "should respond allow access to the root and complain about non-objects": function () { - assert(!nconf.set(null, null)); - assert(!nconf.set(null, undefined)); - assert(!nconf.set(null)); - assert(!nconf.set(null, '')); - assert(!nconf.set(null, 1)); - var original = nconf.get(); - assert(nconf.set(null, nconf.get())); - assert.notEqual(nconf.get(), original); - assert.deepEqual(nconf.get(), original) - } - } - } - } -}).addBatch({ - "When using nconf": { - "with the memory store": { - "the clear() method": { - "should respond with the true": function () { - assert.equal(nconf.get('foo:bar:bazz'), 'buzz'); - assert.isTrue(nconf.clear('foo:bar:bazz')); - assert.isTrue(typeof nconf.get('foo:bar:bazz') === 'undefined'); - } - }, - "the load() method": { - "without a callback": { - "should respond with the merged store": function () { - assert.deepEqual(nconf.load(), { - title: 'My specific title', - color: 'green', - movie: 'Kill Bill' - }); - } - }, - "with a callback": { - topic: function () { - nconf.load(this.callback.bind(null, null)); - }, - "should respond with the merged store": function (ign, err, store) { - assert.isNull(err); - assert.deepEqual(store, { - title: 'My specific title', - color: 'green', - movie: 'Kill Bill' - }); - } - } - } - } - } -}).export(module); diff --git a/test/nconf.test.js b/test/nconf.test.js new file mode 100644 index 0000000..377560f --- /dev/null +++ b/test/nconf.test.js @@ -0,0 +1,108 @@ +/* + * file-store-test.js: Tests for the nconf File store. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var fs = require('fs'); +var path = require('path'); +var nconf = require('../lib/nconf'); + +describe('nconf, When using the nconf', () => { + it("should have the correct methods set", () => { + expect(typeof nconf.key).toBe('function'); + expect(typeof nconf.path).toBe('function'); + expect(typeof nconf.use).toBe('function'); + expect(typeof nconf.any).toBe('function'); + expect(typeof nconf.get).toBe('function'); + expect(typeof nconf.set).toBe('function'); + expect(typeof nconf.clear).toBe('function'); + expect(typeof nconf.load).toBe('function'); + expect(typeof nconf.save).toBe('function'); + expect(typeof nconf.reset).toBe('function'); + expect(typeof nconf.required).toBe('function'); + }); + it("the use() method should instaniate the correct store", () => { + nconf.use('memory'); + nconf.load(); + expect(nconf.stores['memory'] instanceof nconf.Memory).toBe(true); + }); + it("nconf should have the correct version set", done => { + fs.readFile(path.join(__dirname, '..', 'package.json'), (err, data) => { + expect(err).toBe(null); + data = JSON.parse(data.toString()); + expect(nconf.version).toEqual(data.version); + done(); + }) + }); + describe("the required() method", () => { + it("should throw error with missing keys", () => { + nconf.set('foo:bar:bazz', 'buzz'); + expect(nconf.required.bind(nconf, ['missing', 'foo:bar:bazz'])).toThrow(Error); + }); + it("should return the provider if all required keys exist", () => { + var Provider = nconf.Provider; + nconf.set('foo:bar:bazz', 'buzz'); + expect(nconf.required(['foo:bar:bazz']) instanceof Provider).toBe(true); + }); + }); + describe("with the memory store", () => { + describe("the set() method", () => { + it("should respond with true", () => { + expect(nconf.set('foo:bar:bazz', 'buzz')).toBeTruthy(); + }); + it("should respond allow access to the root and complain about non-objects", () => { + expect(nconf.set(null, null)).toBeFalsy(); + expect(nconf.set(null, undefined)).toBeFalsy(); + expect(nconf.set(null)).toBeFalsy(); + expect(nconf.set(null, '')).toBeFalsy(); + expect(nconf.set(null, 1)).toBeFalsy(); + var original = nconf.get(); + expect(nconf.set(null, nconf.get())).toBeTruthy(); + expect(nconf.get()).not.toBe(original); + expect(nconf.get()).toEqual(original) + }) + }); + describe("the get() method", () => { + it("should respond with the correct value without a callback", () => { + expect(nconf.get('foo:bar:bazz')).toEqual('buzz'); + }) + it("should not step inside strings without a callback", () => { + expect(nconf.get('foo:bar:bazz:0')).toEqual(undefined); + }); + it("should respond with the correct value with a callback", done => { + + nconf.get('foo:bar:bazz', (err, value) => { + expect(value).toEqual('buzz'); + done(); + }) + }) + it("should respond allow access to the root", () => { + expect(nconf.get(null)).toBeTruthy(); + expect(nconf.get(undefined)).toBeTruthy(); + expect(nconf.get()).toBeTruthy(); + }) + }); + describe("the clear() method", () => { + it("should respond with the true", () => { + expect(nconf.get('foo:bar:bazz')).toEqual('buzz'); + expect(nconf.clear('foo:bar:bazz')).toBeTruthy(); + expect(typeof nconf.get('foo:bar:bazz') === 'undefined').toBeTruthy(); + }) + }) + describe("the load() method", () => { + + it("should respond with the merged store without a callback", () => { + expect(nconf.load()).toEqual({"foo": {"bar": {}}}); + }); + it("should respond with the merged store", done => { + nconf.load((err, store) => { + expect(err).toBe(null); + expect(store).toEqual({"foo": {"bar": {}}}); + done(); + }); + }) + }) + }) +}) diff --git a/test/provider-save-test.js b/test/provider-save-test.js deleted file mode 100644 index 75339b7..0000000 --- a/test/provider-save-test.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * provider-save-test.js: Ensures consistency for Provider `save` operations. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var assert = require('assert'), - vows = require('vows'), - nconf = require('../lib/nconf'); - -// -// Expose `nconf.Mock` -// -require('./mocks/mock-store'); - -vows.describe('nconf/provider/save').addBatch({ - "When using nconf": { - "an instance of 'nconf.Provider'": { - "with a Mock store": { - topic: function () { - return nconf.use('mock'); - }, - "the save() method": { - topic: function () { - var mock = nconf.stores.mock, - that = this; - - mock.on('save', function () { that.saved = true }); - nconf.save(this.callback); - }, - "should actually save before responding": function () { - assert.isTrue(this.saved); - } - } - } - } - } -}).export(module); \ No newline at end of file diff --git a/test/provider-save.test.js b/test/provider-save.test.js new file mode 100644 index 0000000..c2a8775 --- /dev/null +++ b/test/provider-save.test.js @@ -0,0 +1,31 @@ +/* + * provider-save-test.js: Ensures consistency for Provider `save` operations. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var nconf = require('../lib/nconf'); + +// +// Expose `nconf.Mock` +// +require('./mocks/mock-store'); + +describe('nconf/provider/save', () => { + describe("When using nconf an instance of 'nconf.Provider' with a Mock store", () => { + var nconfMock = nconf.use('mock'); + it("the save() method should actually save before responding", done => { + var mock = nconf.stores.mock; + + mock.on('save', function () { + nconfMock.saved = true; + }); + + nconf.save(() => { + expect(nconfMock.saved).toBeTruthy(); + done(); + }); + }) + }) +}); \ No newline at end of file diff --git a/test/provider-test.js b/test/provider-test.js deleted file mode 100644 index e063671..0000000 --- a/test/provider-test.js +++ /dev/null @@ -1,273 +0,0 @@ -/* - * provider-test.js: Tests for the nconf Provider object. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var assert = require('assert'), - fs = require('fs'), - path = require('path'), - vows = require('vows'), - helpers = require('./helpers'), - nconf = require('../lib/nconf'); - -var fixturesDir = path.join(__dirname, 'fixtures'), - mergeFixtures = path.join(fixturesDir, 'merge'), - files = [path.join(mergeFixtures, 'file1.json'), path.join(mergeFixtures, 'file2.json')], - override = JSON.parse(fs.readFileSync(files[0]), 'utf8'); - -function assertProvider(test) { - return { - topic: new nconf.Provider(), - "should use the correct File store": test - }; -} - -vows.describe('nconf/provider').addBatch({ - "When using nconf": { - "an instance of 'nconf.Provider'": { - "calling the use() method with the same store type and different options": { - topic: new nconf.Provider().use('file', { file: files[0] }), - "should use a new instance of the store type": function (provider) { - var old = provider.stores['file']; - - assert.equal(provider.stores.file.file, files[0]); - provider.use('file', { file: files[1] }); - - assert.notStrictEqual(old, provider.stores.file); - assert.equal(provider.stores.file.file, files[1]); - } - }, - "when 'argv' is true": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'provider-argv.js'), - argv: ['--something', 'foobar'] - }), - "when 'env' is true": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'provider-env.js'), - env: { SOMETHING: 'foobar' } - }), - "when 'env' is true and 'parseValues' option is true": { - topic: function() { - var env = { - SOMETHING: 'foobar', - SOMEBOOL: 'true', - SOMENULL: 'null', - SOMEUNDEF: 'undefined', - SOMEINT: '3600', - SOMEFLOAT: '0.5', - SOMEBAD: '5.1a' - }; - var oenv = {}; - Object.keys(env).forEach(function (key) { - if (process.env[key]) oenv[key] = process.env[key]; - process.env[key] = env[key]; - }); - var provider = new nconf.Provider().use('env', {parseValues: true}); - Object.keys(env).forEach(function (key) { - delete process.env[key]; - if (oenv[key]) process.env[key] = oenv[key]; - }); - return provider; - }, - "should respond with parsed values": function (provider) { - - assert.equal(provider.get('SOMETHING'), 'foobar'); - assert.strictEqual(provider.get('SOMEBOOL'), true); - assert.notEqual(provider.get('SOMEBOOL'), 'true'); - assert.strictEqual(provider.get('SOMENULL'), null); - assert.strictEqual(provider.get('SOMEUNDEF'), undefined); - assert.strictEqual(provider.get('SOMEINT'), 3600); - assert.strictEqual(provider.get('SOMEFLOAT'), .5); - assert.strictEqual(provider.get('SOMEBAD'), '5.1a'); - } - } - }, - "the default nconf provider": { - "when 'argv' is set to true": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'nconf-argv.js'), - argv: ['--something', 'foobar'], - env: { SOMETHING: true } - }), - "when 'env' is set to true": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'nconf-env.js'), - env: { SOMETHING: 'foobar' } - }), - "when 'argv' is set to true and process.argv is modified": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'nconf-change-argv.js'), - argv: ['--something', 'badValue', 'evenWorse', 'OHNOEZ', 'foobar'] - }), - "when hierarchical 'argv' get": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'nconf-hierarchical-file-argv.js'), - argv: ['--something', 'foobar'], - env: { SOMETHING: true } - }), - "when 'env' is set to true with a nested separator": helpers.assertSystemConf({ - script: path.join(fixturesDir, 'scripts', 'nconf-nested-env.js'), - env: { SOME_THING: 'foobar' } - }) - } - } -}).addBatch({ - "When using nconf": { - "an instance of 'nconf.Provider'": { - "the merge() method": { - topic: new nconf.Provider().use('file', { file: files[1] }), - "should have the result merged in": function (provider) { - provider.load(); - provider.merge(override); - helpers.assertMerged(null, provider.stores.file.store); - assert.equal(provider.stores.file.store.candy.something, 'file1'); - }, - "should merge Objects over null": function (provider) { - provider.load(); - provider.merge(override); - assert.equal(provider.stores.file.store.unicorn.exists, true); - } - } - } - } -}).addBatch({ - "When using nconf": { - "an instance of 'nconf.Provider'": { - "the load() method": { - "when sources are passed in": { - topic: new nconf.Provider({ - sources: { - user: { - type: 'file', - file: files[0] - }, - global: { - type: 'file', - file: files[1] - } - } - }), - "should respect the hierarchy ": function (provider) { - var merged = provider.load(); - - helpers.assertMerged(null, merged); - assert.equal(merged.candy.something, 'file1'); - } - }, - "when multiple stores are used": { - topic: new nconf.Provider().overrides({foo: {bar: 'baz'}}) - .add('file1', {type: 'file', file: files[0]}) - .add('file2', {type: 'file', file: files[1]}), - "should respect the hierarchy": function(provider) { - var merged = provider.load(); - - helpers.assertMerged(null, merged); - assert.equal(merged.foo.bar, 'baz'); - assert.equal(merged.candy.something, 'file1'); - } - } - } - } - } -}).addBatch({ - "When using nconf": { - "an instance of 'nconf.Provider'": { - "the .file() method": { - "with a single filepath": assertProvider(function (provider) { - provider.file(helpers.fixture('store.json')); - assert.isObject(provider.stores.file); - }), - "with a name and a filepath": assertProvider(function (provider) { - provider.file('custom', helpers.fixture('store.json')); - assert.isObject(provider.stores.custom); - }), - "with a single object": assertProvider(function (provider) { - provider.file({ - dir: helpers.fixture(''), - file: 'store.json', - search: true - }); - - assert.isObject(provider.stores.file); - assert.equal(provider.stores.file.file, helpers.fixture('store.json')); - }), - "with a name and an object": assertProvider(function (provider) { - provider.file('custom', { - dir: helpers.fixture(''), - file: 'store.json', - search: true - }); - - assert.isObject(provider.stores.custom); - assert.equal(provider.stores.custom.file, helpers.fixture('store.json')); - }) - } - } - } -}).addBatch({ - "When using nconf": { - "an instance of 'nconf.Provider'": { - "the any() method": { - topic: new nconf.Provider({ - type: 'literal', - store: { - key: "getThisValue" - } - }), - "without a callback": { - "given an array of keys with one matching": { - "should respond with the correct value": function (provider) { - assert.equal(provider.any(["notthis", "orthis", "key"]), 'getThisValue'); - } - }, - "given an array of keys with no match": { - "should respond with null": function (provider) { - assert.isNull(provider.any(["notthis", "orthis"])); - } - }, - "given a variable argument list of keys with one matching": { - "should respond with the correct value": function (provider) { - assert.equal(provider.any("notthis", "orthis", "key"), 'getThisValue'); - } - }, - "given no arguments": { - "should respond with null": function (provider) { - assert.isNull(provider.any()); - } - } - }, - "with a callback": { - "given an array of keys with one matching": { - topic: function(provider) { - provider.any(["notthis", "orthis", "key"], this.callback); - }, - "should respond with the correct value": function (err, value) { - assert.equal(value, 'getThisValue'); - } - }, - "given an array of keys with no match": { - topic: function(provider) { - provider.any(["notthis", "orthis"], this.callback); - }, - "should respond with an undefined value": function (err, value) { - assert.isUndefined(value); - } - }, - "given a variable argument list of keys with one matching": { - topic: function(provider) { - provider.any("notthis", "orthis", "key", this.callback); - }, - "should respond with the correct value": function (err, value) { - assert.equal(value, 'getThisValue'); - } - }, - "given no keys": { - topic: function(provider) { - provider.any(this.callback); - }, - "should respond with an undefined value": function (err, value) { - assert.isUndefined(value); - } - } - } - } - } - } -}).export(module); diff --git a/test/provider.test.js b/test/provider.test.js new file mode 100644 index 0000000..7c160b4 --- /dev/null +++ b/test/provider.test.js @@ -0,0 +1,233 @@ +/* + * provider-test.js: Tests for the nconf Provider object. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var fs = require('fs'); +var path = require('path'); +var helpers = require('./helpers'); +var nconf = require('../lib/nconf'); + +var fixturesDir = path.join(__dirname, 'fixtures'); +var mergeFixtures = path.join(fixturesDir, 'merge'); +var files = [path.join(mergeFixtures, 'file1.json'), path.join(mergeFixtures, 'file2.json')]; +var override = JSON.parse(fs.readFileSync(files[0]), 'utf8'); + +describe('nconf/provider When using nconf', () => { + describe("an instance of 'nconf.Provider'", () => { + it("calling the use() method with the same store type and different options" + + " should use a new instance of the store type", () => { + var provider = new nconf.Provider().use('file', {file: files[0]}); + var old = provider.stores['file']; + + expect(provider.stores.file.file).toEqual(files[0]); + provider.use('file', {file: files[1]}); + + expect(old).not.toEqual(provider.stores.file); + expect(provider.stores.file.file).toEqual(files[1]); + }) + }); + it("respond with correct arg when 'argv' is true", + helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'provider-argv.js'), + argv: ['--something', 'foobar'] + })); + it("respond with correct arg when 'env' is true", helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'provider-env.js'), + env: {SOMETHING: 'foobar'} + })); + + it("respond with correct arg when 'env' is true and 'parseValues' option is true", () => { + var env = { + SOMETHING: 'foobar', + SOMEBOOL: 'true', + SOMENULL: 'null', + SOMEUNDEF: 'undefined', + SOMEINT: '3600', + SOMEFLOAT: '0.5', + SOMEBAD: '5.1a' + }; + var oenv = {}; + Object.keys(env).forEach(function (key) { + if (process.env[key]) oenv[key] = process.env[key]; + process.env[key] = env[key]; + }); + var provider = new nconf.Provider().use('env', {parseValues: true}); + Object.keys(env).forEach(function (key) { + delete process.env[key]; + if (oenv[key]) process.env[key] = oenv[key]; + }); + + expect(provider.get('SOMETHING')).toEqual('foobar'); + expect(provider.get('SOMEBOOL')).toEqual(true); + expect(provider.get('SOMEBOOL')).not.toEqual('true'); + expect(provider.get('SOMENULL')).toEqual(null); + expect(provider.get('SOMEUNDEF')).toEqual(undefined); + expect(provider.get('SOMEINT')).toEqual(3600); + expect(provider.get('SOMEFLOAT')).toEqual(.5); + expect(provider.get('SOMEBAD')).toEqual('5.1a'); + }); + + describe("the default nconf provider", () => { + + it("respond with correct arg when 'argv' is set to true", helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'nconf-argv.js'), + argv: ['--something', 'foobar'], + env: {SOMETHING: true} + })); + + it("respond with correct arg when 'env' is set to true", helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'nconf-env.js'), + env: {SOMETHING: 'foobar'} + })); + + it("respond with correct arg when 'argv' is set to true and process.argv is modified", helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'nconf-change-argv.js'), + argv: ['--something', 'badValue', 'evenWorse', 'OHNOEZ', 'foobar'] + })); + + it("respond with correct arg when hierarchical 'argv' get", helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'nconf-hierarchical-file-argv.js'), + argv: ['--something', 'foobar'], + env: {SOMETHING: true} + })); + + it("respond with correct arg when 'env' is set to true with a nested separator", helpers.assertSystemConf({ + script: path.join(fixturesDir, 'scripts', 'nconf-nested-env.js'), + env: {SOME_THING: 'foobar'} + })); + }); + + describe("an instance of 'nconf.Provider'", () => { + describe("the merge() method", () => { + it("should have the result merged in", () => { + var provider = new nconf.Provider().use('file', {file: files[1]}); + provider.load(); + provider.merge(override); + helpers.assertMerged(null, provider.stores.file.store); + expect(provider.stores.file.store.candy.something).toEqual('file1'); + }); + it("should merge Objects over null", () => { + var provider = new nconf.Provider().use('file', {file: files[1]}); + provider.load(); + provider.merge(override); + expect(provider.stores.file.store.unicorn.exists).toEqual(true); + }); + }) + describe("the load() method", () => { + it("should respect the hierarchy when sources are passed in", () => { + var provider = new nconf.Provider({ + sources: { + user: { + type: 'file', + file: files[0] + }, + global: { + type: 'file', + file: files[1] + } + } + }); + var merged = provider.load(); + helpers.assertMerged(null, merged); + expect(merged.candy.something).toEqual('file1'); + }) + it("should respect the hierarchy when multiple stores are used", () => { + var provider = new nconf.Provider().overrides({foo: {bar: 'baz'}}) + .add('file1', {type: 'file', file: files[0]}) + .add('file2', {type: 'file', file: files[1]}); + + var merged = provider.load(); + + helpers.assertMerged(null, merged); + expect(merged.foo.bar).toEqual('baz'); + expect(merged.candy.something).toEqual('file1'); + }) + }) + }) + describe("the .file() method", () => { + it("should use the correct File store with a single filepath", () => { + var provider = new nconf.Provider(); + provider.file(helpers.fixture('store.json')); + expect(typeof provider.stores.file).toBe('object'); + }); + it("should use the correct File store with a name and a filepath", () => { + var provider = new nconf.Provider(); + provider.file('custom', helpers.fixture('store.json')); + expect(typeof provider.stores.custom).toBe('object'); + }); + it("should use the correct File store with a single object", () => { + var provider = new nconf.Provider(); + provider.file({ + dir: helpers.fixture(''), + file: 'store.json', + search: true + }); + + expect(typeof provider.stores.file).toBe('object'); + expect(provider.stores.file.file).toEqual(helpers.fixture('store.json')); + }); + it("should use the correct File store with a name and an object", () => { + var provider = new nconf.Provider(); + provider.file('custom', { + dir: helpers.fixture(''), + file: 'store.json', + search: true + }); + + expect(typeof provider.stores.custom).toBe('object'); + expect(provider.stores.custom.file).toEqual(helpers.fixture('store.json')); + }) + describe("the any() method", () => { + var provider = new nconf.Provider({ + type: 'literal', + store: { + key: "getThisValue" + } + }) + describe("without a callback", () => { + it("should respond with the correct value given an array of keys with one matching", () => { + expect(provider.any(["notthis", "orthis", "key"])).toEqual('getThisValue'); + }) + it("should respond with null given an array of keys with no match", () => { + expect(provider.any(["notthis", "orthis"])).toBe(null); + }); + it("should respond with the correct value given a variable argument list of keys with one matching", () => { + expect(provider.any("notthis", "orthis", "key")).toEqual('getThisValue'); + }); + it("should respond with null given no arguments", () => { + expect(provider.any()).toBe(null); + }); + }) + describe("with a callback", () => { + it("should respond with the correct value given an array of keys with one matching", done => { + provider.any(["notthis", "orthis", "key"], (err, value) => { + expect(value).toEqual('getThisValue'); + done(); + }); + }); + it("should respond with an undefined value given an array of keys with no match", done => { + provider.any(["notthis", "orthis"], (err, value) => { + expect(value).toBe(undefined) + done(); + }); + }); + it("should respond with the correct value given a variable argument list of keys with one matching", done => { + provider.any("notthis", "orthis", "key", (err, value) => { + expect(value).toEqual('getThisValue'); + done(); + }); + }); + + it("should respond with an undefined value given no keys", done => { + provider.any((err, value) => { + expect(value).toBe(undefined) + done(); + }); + }); + }) + }) + }) +}); diff --git a/test/stores/argv-test.js b/test/stores/argv-test.js deleted file mode 100644 index 265ea41..0000000 --- a/test/stores/argv-test.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * argv-test.js: Tests for the nconf argv store. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var vows = require('vows'), - assert = require('assert'), - yargs = require('yargs') - nconf = require('../../lib/nconf'); - -vows.describe('nconf/stores/argv').addBatch({ - "An instance of nconf.Argv": { - topic: new nconf.Argv(), - "should have the correct methods defined": function (argv) { - assert.isFunction(argv.loadSync); - assert.isFunction(argv.loadArgv); - assert.deepEqual(argv.options, {}); - }, - "can be created with a custom yargs":{ - topic: function(){ - var yargsInstance = yargs.alias('v', 'verbose').default('v', 'false'); - return [yargsInstance, new nconf.Argv(yargsInstance)]; - }, - "and can give access to them": function (argv) { - var yargsInstance = argv[0]; - argv = argv[1] - assert.equal(argv.options, yargsInstance) - }, - "values are the one from the custom yargv": function (argv) { - argv = argv[1] - argv.loadSync() - assert.equal(argv.get('verbose'), 'false'); - assert.equal(argv.get('v'), 'false'); - } - }, - "can be created with a nconf yargs":{ - topic: function(){ - var options = {verbose: {alias: 'v', default: 'false'}}; - return new nconf.Argv(options); - }, - "and can give access to them": function (argv) { - assert.deepEqual(argv.options, {verbose: {alias: 'v', default: 'false'}}) - }, - "values are the one from the custom yargv": function (argv) { - argv.loadSync() - assert.equal(argv.get('verbose'), 'false'); - assert.equal(argv.get('v'), 'false'); - }, - "values cannot be altered with set when readOnly:true": function (argv) { - argv.set('verbose', 'true'); - assert.equal(argv.get('verbose'), 'false'); - } - }, - "can be created with readOnly set to be false":{ - topic: function(){ - var options = {verbose: {alias: 'v', default: 'false'}, readOnly: false}; - return new nconf.Argv(options); - }, - "readOnly is actually false": function (argv) { - assert.equal(argv.readOnly, false); - }, - "values can be changed by calling .set": function (argv) { - argv.loadSync() - assert.equal(argv.get('verbose'), 'false'); - argv.set('verbose', 'true'); - assert.equal(argv.get('verbose'), 'true'); - } - } - } -}).export(module); diff --git a/test/stores/argv.test.js b/test/stores/argv.test.js new file mode 100644 index 0000000..5d3a841 --- /dev/null +++ b/test/stores/argv.test.js @@ -0,0 +1,72 @@ +/* + * argv-test.js: Tests for the nconf argv store. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var yargs = require('yargs'); +var nconf = require('../../lib/nconf'); + +describe('nconf/stores/argv, An instance of nconf.Argv', () => { + + it("should have the correct methods defined", () => { + var argv = new nconf.Argv(); + expect(typeof argv.loadSync).toBe('function'); + expect(typeof argv.loadArgv).toBe('function'); + expect(argv.options).toEqual({}); + }); + + describe("can be created with a custom yargs", () => { + var yargsInstance = yargs.alias('s', 'somearg').default('s', 'false'); + + it("and can give access to them", () => { + var argv = new nconf.Argv(yargsInstance); + expect(argv.options).toBe(yargsInstance); + }); + + it("values are the one from the custom yargv", () => { + var argv = new nconf.Argv(yargsInstance); + argv.loadSync(); + expect(argv.get('somearg')).toBe('false'); + expect(argv.get('s')).toBe('false'); + }); + }); + + describe("can be created with a nconf yargs", () => { + var options = {somearg: {alias: 's', default: 'false'}}; + it("and can give access to them", () => { + var argv = new nconf.Argv(options); + expect(argv.options).toEqual({somearg: {alias: 's', default: 'false'}}); + }); + + it("values are the one from the custom yargv", () => { + var argv = new nconf.Argv(options); + argv.loadSync(); + expect(argv.get('somearg')).toBe('false'); + expect(argv.get('s')).toBe('false'); + }); + + it("values cannot be altered with set when readOnly:true", () => { + var argv = new nconf.Argv(options); + argv.loadSync(); + argv.set('somearg', 'true'); + expect(argv.get('somearg')).toBe('false'); + }); + }); + describe("can be created with readOnly set to be false", () => { + + it("readOnly is actually false", () => { + var argv = new nconf.Argv({readOnly: false}); + expect(argv.readOnly).toBe(false); + }); + + it("values can be changed by calling .set", () => { + var argv = new nconf.Argv({somearg: {alias: 's', default: 'false'}, readOnly: false}); + argv.loadSync(); + expect(argv.get('somearg')).toBe('false'); + argv.set('somearg', 'true'); + expect(argv.get('somearg')).toBe('true'); + }); + }); +}); diff --git a/test/stores/env-test.js b/test/stores/env-test.js deleted file mode 100644 index 05cdc40..0000000 --- a/test/stores/env-test.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * env-test.js: Tests for the nconf env store. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var vows = require('vows'), - assert = require('assert'), - nconf = require('../../lib/nconf'); - -process.env.TES = 'TING'; - -vows.describe('nconf/stores/env').addBatch({ - "An instance of nconf.Env": { - topic: new nconf.Env(), - "should have the correct methods defined": function (env) { - assert.isFunction(env.loadSync); - assert.isFunction(env.loadEnv); - assert.isArray(env.whitelist); - assert.lengthOf(env.whitelist, 0); - assert.equal(env.separator, ''); - } - }, - "An instance of nconf.Env with readOnly option set to false": { - topic: new nconf.Env({readOnly: false}), - "should have it's readOnly property set to false": function (env) { - assert.isFunction(env.loadSync); - assert.isFunction(env.loadEnv); - assert.isArray(env.whitelist); - assert.lengthOf(env.whitelist, 0); - assert.ok(!env.readOnly); - } -} -}).export(module); diff --git a/test/stores/env.test.js b/test/stores/env.test.js new file mode 100644 index 0000000..22837d1 --- /dev/null +++ b/test/stores/env.test.js @@ -0,0 +1,28 @@ +/* + * env-test.js: Tests for the nconf env store. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var nconf = require('../../lib/nconf'); + +describe('nconf/stores/env, An instance of nconf.Env', () => { + it("should have the correct methods defined", () => { + var env = new nconf.Env(); + expect(typeof env.loadSync).toBe('function'); + expect(typeof env.loadEnv).toBe('function'); + expect(env.whitelist instanceof Array).toBeTruthy(); + expect(env.whitelist.length).toEqual(0); + expect(env.separator).toEqual(''); + }); + it("should have the correct methods defined and with readOnly false", () => { + var env = new nconf.Env({readOnly: false}); + expect(typeof env.loadSync).toBe('function'); + expect(typeof env.loadEnv).toBe('function'); + expect(env.whitelist instanceof Array).toBeTruthy(); + expect(env.whitelist.length).toEqual(0); + expect(env.separator).toEqual(''); + expect(env.readOnly).toBe(false); + }); +}); diff --git a/test/stores/file-store-test.js b/test/stores/file-store-test.js deleted file mode 100644 index 89e873a..0000000 --- a/test/stores/file-store-test.js +++ /dev/null @@ -1,310 +0,0 @@ -/* - * file-store-test.js: Tests for the nconf File store. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var fs = require('fs'), - path = require('path'), - vows = require('vows'), - assert = require('assert'), - nconf = require('../../lib/nconf'), - yamlFormat = require('nconf-yaml'), - data = require('../fixtures/data').data, - store; - -vows.describe('nconf/stores/file').addBatch({ - "When using the nconf file store": { - "with a valid JSON file": { - topic: function () { - var filePath = path.join(__dirname, '..', 'fixtures', 'store.json'); - fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); - this.store = store = new nconf.File({ file: filePath }); - return null; - }, - "the load() method": { - topic: function () { - this.store.load(this.callback); - }, - "should load the data correctly": function (err, data) { - assert.isNull(err); - assert.deepEqual(data, this.store.store); - } - } - }, - "with a malformed JSON file": { - topic: function () { - var filePath = path.join(__dirname, '..', 'fixtures', 'malformed.json'); - this.store = new nconf.File({ file: filePath }); - return null; - }, - "the load() method with a malformed JSON config file": { - topic: function () { - this.store.load(this.callback.bind(null, null)); - }, - "should respond with an error and indicate file name": function (_, err) { - assert.isTrue(!!err); - assert.match(err, /malformed\.json/); - } - } - }, - "with a valid UTF8 JSON file that contains a BOM": { - topic: function () { - var filePath = path.join(__dirname, '..', 'fixtures', 'bom.json'); - this.store = store = new nconf.File({ file: filePath }); - return null; - }, - "the load() method": { - topic: function () { - this.store.load(this.callback); - }, - "should load the data correctly": function (err, data) { - assert.isNull(err); - assert.deepEqual(data, this.store.store); - } - }, - "the loadSync() method": { - topic: function () { - var data = this.store.loadSync(); - return data; - }, - "should load the data correctly": function (result) { - assert.deepEqual(result, this.store.store); - } - } - }, - "with a valid UTF8 JSON file that contains no BOM": { - topic: function () { - var filePath = path.join(__dirname, '..', 'fixtures', 'no-bom.json'); - this.store = store = new nconf.File({ file: filePath }); - return null; - }, - "the load() method": { - topic: function () { - this.store.load(this.callback); - }, - "should load the data correctly": function (err, data) { - assert.isNull(err); - assert.deepEqual(data, this.store.store); - } - }, - "the loadSync() method": { - topic: function () { - var data = this.store.loadSync(); - return data; - }, - "should load the data correctly": function (result) { - assert.deepEqual(result, this.store.store); - } - } - } - } -}).addBatch({ - "When using the nconf file store": { - topic: function () { - var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'), - tmpStore = new nconf.File({ file: tmpPath }); - return tmpStore; - }, - "the save() method": { - topic: function (tmpStore) { - var that = this; - - Object.keys(data).forEach(function (key) { - tmpStore.set(key, data[key]); - }); - - tmpStore.save(function () { - fs.readFile(tmpStore.file, function (err, d) { - fs.unlinkSync(tmpStore.file); - - return err - ? that.callback(err) - : that.callback(err, JSON.parse(d.toString())); - }); - }); - }, - "should save the data correctly": function (err, read) { - assert.isNull(err); - assert.deepEqual(read, data); - } - }, - "the saveToFile() method": { - topic: function (tmpStore) { - var that = this, - pathFile = '/tmp/nconf-save-toFile.json'; - - Object.keys(data).forEach(function (key) { - tmpStore.set(key, data[key]); - }); - - tmpStore.saveToFile(pathFile, function () { - fs.readFile(pathFile, function (err, d) { - fs.unlinkSync(pathFile); - - return err - ? that.callback(err) - : that.callback(err, JSON.parse(d.toString())); - }); - }); - }, - "should save the data correctly": function (err, read) { - assert.isNull(err); - assert.deepEqual(read, data); - } - }, - "the saveToFile() method with custom format": { - topic: function (tmpStore) { - var that = this, - pathFile = '/tmp/nconf-save-toFile.yaml'; - - Object.keys(data).forEach(function (key) { - tmpStore.set(key, data[key]); - }); - - tmpStore.saveToFile(pathFile, yamlFormat, function () { - fs.readFile(pathFile, function (err, d) { - fs.unlinkSync(pathFile); - return err - ? that.callback(err) - : that.callback(err, yamlFormat.parse(d.toString())); - }); - }); - }, - "should save the data correctly": function (err, read) { - assert.isNull(err); - assert.deepEqual(read, data); - } - } - } -}).addBatch({ - "When using the nconf file store": { - topic: function () { - var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'), - tmpStore = new nconf.File({ file: tmpPath }); - return tmpStore; - }, - "the saveSync() method": { - topic: function (tmpStore) { - var that = this; - - Object.keys(data).forEach(function (key) { - tmpStore.set(key, data[key]); - }); - - var saved = tmpStore.saveSync(); - - fs.readFile(tmpStore.file, function (err, d) { - fs.unlinkSync(tmpStore.file); - - return err - ? that.callback(err) - : that.callback(err, JSON.parse(d.toString()), saved); - }); - }, - "should save the data correctly": function (err, read, saved) { - assert.isNull(err); - assert.deepEqual(read, data); - assert.deepEqual(read, saved); - } - } - } -}).addBatch({ - "When using the nconf file store": { - "the set() method": { - "should respond with true": function () { - assert.isTrue(store.set('foo:bar:bazz', 'buzz')); - assert.isTrue(store.set('falsy:number', 0)); - assert.isTrue(store.set('falsy:string', '')); - assert.isTrue(store.set('falsy:boolean', false)); - assert.isTrue(store.set('falsy:object', null)); - } - }, - "the get() method": { - "should respond with the correct value": function () { - assert.equal(store.get('foo:bar:bazz'), 'buzz'); - assert.equal(store.get('falsy:number'), 0); - assert.equal(store.get('falsy:string'), ''); - assert.equal(store.get('falsy:boolean'), false); - assert.equal(store.get('falsy:object'), null); - } - }, - "the clear() method": { - "should respond with the true": function () { - assert.equal(store.get('foo:bar:bazz'), 'buzz'); - assert.isTrue(store.clear('foo:bar:bazz')); - assert.isTrue(typeof store.get('foo:bar:bazz') === 'undefined'); - } - } - } -}).addBatch({ - "When using the nconf file store": { - "the search() method": { - "when the target file exists higher in the directory tree": { - topic: function () { - var searchBase = this.searchBase = process.env.HOME; - var filePath = this.filePath = path.join(searchBase, '.nconf'); - fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); - return new (nconf.File)({ - file: '.nconf' - }) - }, - "should update the file appropriately": function (store) { - store.search(this.searchBase); - assert.equal(store.file, this.filePath); - fs.unlinkSync(this.filePath); - } - }, - "when the target file doesn't exist higher in the directory tree": { - topic: function () { - var filePath = this.filePath = path.join(__dirname, '..', 'fixtures', 'search-store.json'); - return new (nconf.File)({ - dir: path.dirname(filePath), - file: 'search-store.json' - }) - }, - "should update the file appropriately": function (store) { - store.search(); - assert.equal(store.file, this.filePath); - } - } - } - } -}).addBatch({ - "When using the nconf file store": { - topic: function () { - var secureStore = new nconf.File({ - file: path.join(__dirname, '..', 'fixtures', 'secure.json'), - secure: 'super-secretzzz' - }); - - secureStore.store = data; - return secureStore; - }, - "the stringify() method should encrypt properly": function (store) { - var contents = JSON.parse(store.stringify()); - Object.keys(data).forEach(function (key) { - assert.isObject(contents[key]); - assert.isString(contents[key].value); - assert.equal(contents[key].alg, 'aes-256-ctr'); - }); - }, - "the parse() method should decrypt properly": function (store) { - var contents = store.stringify(); - var parsed = store.parse(contents); - assert.deepEqual(parsed, data); - }, - "the load() method should decrypt properly": function (store) { - store.load(function (err, loaded) { - assert.isNull(err); - assert.deepEqual(loaded, data); - }); - }, - "the loadSync() method should decrypt properly": function (store) { - var loaded = store.loadSync() - assert.deepEqual(loaded, data); - } - } -}).export(module); - diff --git a/test/stores/file-store.test.js b/test/stores/file-store.test.js new file mode 100644 index 0000000..88329b8 --- /dev/null +++ b/test/stores/file-store.test.js @@ -0,0 +1,239 @@ +/* + * file-store-test.js: Tests for the nconf File store. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var fs = require('fs'); +var path = require('path'); +var nconf = require('../../lib/nconf'); +var yamlFormat = require('nconf-yaml'); +var data = require('../fixtures/data').data; + +// FIXME TO RENAME +describe('nconf/stores/file', () => { + describe("When using the nconf file store", () => { + describe("with a valid JSON file", () => { + var filePath = path.join(__dirname, '..', 'fixtures', 'store.json'); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); + + it("the load() method should load the data correctly", done => { + var store = new nconf.File({file: filePath}); + store.load((err, data) => { + expect(err).toBe(null); + expect(data).toEqual(store.store); + done(); + }) + }); + }); + describe("with a malformed JSON file", () => { + var filePath = path.join(__dirname, '..', 'fixtures', 'malformed.json'); + + it("the load() method with a malformed JSON config file, should respond with an error and indicate file name", + done => { + var store = new nconf.File({file: filePath}); + //FIXME this.store.load(this.callback.bind(null, null)); + store.load((err) => { + expect(err).toBeTruthy(); + expect(err.message).toMatch(/malformed\.json/); + done(); + }) + }); + }); + describe("with a valid UTF8 JSON file that contains a BOM", () => { + var filePath = path.join(__dirname, '..', 'fixtures', 'bom.json'); + var store = new nconf.File({file: filePath}); + + it("the load() method should load the data correctly", done => { + store.load((err, data) => { + expect(err).toBe(null); + expect(data).toEqual(store.store); + done(); + }); + }); + it("the loadSync() method should load the data correctly", () => { + var data = store.loadSync(); + expect(data).toEqual(store.store); + }); + }); + describe("with a valid UTF8 JSON file that contains no BOM", () => { + var filePath = path.join(__dirname, '..', 'fixtures', 'no-bom.json'); + var store = new nconf.File({file: filePath}); + + it("the load() method should load the data correctly", done => { + store.load((err, data) => { + expect(err).toBe(null); + expect(data).toEqual(store.store); + done(); + }); + }); + it("the loadSync() method should load the data correctly", () => { + var data = store.loadSync(); + expect(data).toEqual(store.store); + }); + }) + }); + + describe("When using the nconf file store", () => { + var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'); + + it("the save() method should save the data correctly", done => { + var tmpStore = new nconf.File({file: tmpPath}); + + Object.keys(data).forEach(function (key) { + tmpStore.set(key, data[key]); + }); + + tmpStore.save(function () { + fs.readFile(tmpStore.file, function (err, d) { + fs.unlinkSync(tmpStore.file); + + expect(err).toBe(null); + expect(JSON.parse(d.toString())).toEqual(data); + done(); + }); + }); + }); + it("the saveToFile() method should save the data correctly", done => { + var tmpStore = new nconf.File({file: tmpPath}); + var pathFile = '/tmp/nconf-save-toFile.json'; + + Object.keys(data).forEach(function (key) { + tmpStore.set(key, data[key]); + }); + + tmpStore.saveToFile(pathFile, function () { + fs.readFile(pathFile, function (err, d) { + fs.unlinkSync(pathFile); + + expect(err).toBe(null); + expect(JSON.parse(d.toString())).toEqual(data); + done(); + }); + }); + + }); + it("the saveToFile() method with custom format should save the data correctly", done => { + var tmpStore = new nconf.File({file: tmpPath}); + var pathFile = '/tmp/nconf-save-toFile.yaml'; + + Object.keys(data).forEach(function (key) { + tmpStore.set(key, data[key]); + }); + + tmpStore.saveToFile(pathFile, yamlFormat, function () { + fs.readFile(pathFile, function (err, d) { + fs.unlinkSync(pathFile); + + expect(err).toBe(null); + expect(yamlFormat.parse(d.toString())).toEqual(data); + done(); + }); + }); + }); + }); + + describe("When using the nconf file store", () => { + var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'); + it("the saveSync() method should save the data correctly", done => { + var tmpStore = new nconf.File({file: tmpPath}); + Object.keys(data).forEach(function (key) { + tmpStore.set(key, data[key]); + }); + + var saved = tmpStore.saveSync(); + + fs.readFile(tmpStore.file, function (err, d) { + fs.unlinkSync(tmpStore.file); + + expect(err).toBe(null); + var read = JSON.parse(d.toString()); + expect(read).toEqual(data); + expect(read).toEqual(saved); + done(); + }); + + }); + }); + describe("When using the nconf file store", () => { + var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'); + var store = new nconf.File({file: tmpPath}); + + it("the set() method should respond with true", () => { + expect(store.set('foo:bar:bazz', 'buzz')).toBeTruthy(); + expect(store.set('falsy:number', 0)).toBeTruthy(); + expect(store.set('falsy:string', '')).toBeTruthy(); + expect(store.set('falsy:boolean', false)).toBeTruthy(); + expect(store.set('falsy:object', null)).toBeTruthy(); + }); + it("the get() method should respond with the correct value", () => { + expect(store.get('foo:bar:bazz')).toEqual('buzz'); + expect(store.get('falsy:number')).toEqual(0); + expect(store.get('falsy:string')).toEqual(''); + expect(store.get('falsy:boolean')).toEqual(false); + expect(store.get('falsy:object')).toEqual(null); + }); + it("the clear() method should respond with the true", () => { + expect(store.get('foo:bar:bazz')).toEqual('buzz'); + expect(store.clear('foo:bar:bazz')).toBeTruthy(); + expect(typeof store.get('foo:bar:bazz') === 'undefined').toBeTruthy(); + }); + }); + describe("When using the nconf file store", () => { + + it("the search() method when the target file exists higher in the directory tree should update the file appropriately", () => { + var searchBase = process.env.HOME; + var filePath = path.join(searchBase, '.nconf'); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); + var store = new nconf.File({ + file: '.nconf' + }); + store.search(store.searchBase); + expect(store.file).toEqual(filePath); + fs.unlinkSync(filePath); + }); + it("the search() method when the target file doesn't exist higher in the directory tree should update the file appropriately", () => { + var filePath = path.join(__dirname, '..', 'fixtures', 'search-store.json'); + var store = new nconf.File({ + dir: path.dirname(filePath), + file: 'search-store.json' + }); + store.search(); + expect(store.file).toEqual(filePath); + }); + + }) + describe("When using the nconf file store", () => { + var secureStore = new nconf.File({ + file: path.join(__dirname, '..', 'fixtures', 'secure.json'), + secure: 'super-secretzzz' + }); + + secureStore.store = data; + + it("the stringify() method should encrypt properly", () => { + var contents = JSON.parse(secureStore.stringify()); + Object.keys(data).forEach(key => { + expect(typeof contents[key]).toBe('object'); + expect(typeof contents[key].value).toBe('string'); + expect(contents[key].alg).toEqual('aes-256-ctr'); + }); + }); + it("the parse() method should decrypt properly", () => { + var contents = secureStore.stringify(); + var parsed = secureStore.parse(contents); + expect(parsed).toEqual(data); + }); + it("the load() method should decrypt properly", () => { + secureStore.load(function (err, loaded) { + expect(err).toBe(null); + expect(loaded).toEqual(data); + }); + }); + it("the loadSync() method should decrypt properly", () => { + var loaded = secureStore.loadSync() + expect(loaded).toEqual(data); + }); + }) +}); diff --git a/test/stores/literal-test.js b/test/stores/literal-test.js deleted file mode 100644 index 6c1e46e..0000000 --- a/test/stores/literal-test.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * literal-test.js: Tests for the nconf literal store. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var vows = require('vows'), - assert = require('assert'), - nconf = require('../../lib/nconf'); - -vows.describe('nconf/stores/literal').addBatch({ - "An instance of nconf.Literal": { - topic: new nconf.Literal({ - foo: 'bar', - one: 2 - }), - "should have the correct methods defined": function (literal) { - assert.equal(literal.type, 'literal'); - assert.isFunction(literal.get); - assert.isFunction(literal.set); - assert.isFunction(literal.merge); - assert.isFunction(literal.loadSync); - }, - "should have the correct values in the store": function (literal) { - assert.equal(literal.store.foo, 'bar'); - assert.equal(literal.store.one, 2); - } - } -}).export(module); \ No newline at end of file diff --git a/test/stores/literal.test.js b/test/stores/literal.test.js new file mode 100644 index 0000000..2ff9254 --- /dev/null +++ b/test/stores/literal.test.js @@ -0,0 +1,25 @@ +/* + * literal-test.js: Tests for the nconf literal store. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var nconf = require('../../lib/nconf'); + +describe('nconf/stores/literal, An instance of nconf.Literal', () => { + var envOptions = {foo: 'bar', one: 2}; + it("should have the correct methods defined", () => { + var literal = new nconf.Literal(envOptions); + expect(literal.type).toEqual('literal'); + expect(typeof literal.get).toBe('function'); + expect(typeof literal.set).toBe('function'); + expect(typeof literal.merge).toBe('function'); + expect(typeof literal.loadSync).toBe('function'); + }); + it("should have the correct values in the store", () => { + var literal = new nconf.Literal(envOptions); + expect(literal.store.foo).toEqual('bar'); + expect(literal.store.one).toEqual(2); + }); +}); diff --git a/test/stores/memory-store-test.js b/test/stores/memory-store-test.js deleted file mode 100644 index 76489ca..0000000 --- a/test/stores/memory-store-test.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - * memory-store-test.js: Tests for the nconf Memory store. - * - * (C) 2011, Charlie Robbins and the Contributors. - * - */ - -var vows = require('vows'), - assert = require('assert'), - nconf = require('../../lib/nconf'), - merge = require('../fixtures/data').merge; - -vows.describe('nconf/stores/memory').addBatch({ - "When using the nconf memory store": { - topic: new nconf.Memory(), - "the set() method": { - "should respond with true": function (store) { - assert.isTrue(store.set('foo:bar:bazz', 'buzz')); - assert.isTrue(store.set('falsy:number', 0)); - assert.isTrue(store.set('falsy:string:empty', '')); - assert.isTrue(store.set('falsy:string:value', 'value')); - assert.isTrue(store.set('falsy:boolean', false)); - assert.isTrue(store.set('falsy:object', null)); - } - }, - "the get() method": { - "should respond with the correct value": function (store) { - assert.equal(store.get('foo:bar:bazz'), 'buzz'); - assert.equal(store.get('falsy:number'), 0); - assert.equal(store.get('falsy:string:empty'), ''); - assert.equal(store.get('falsy:string:value'), 'value'); - assert.equal(store.get('falsy:boolean'), false); - assert.equal(store.get('falsy:object'), null); - }, - "should not fail when retrieving non-existent keys": { - "at the root level": function (store) { - assert.doesNotThrow(function() { - assert.equal(store.get('this:key:does:not:exist'), undefined); - }, TypeError); - }, - "within numbers": function (store) { - assert.doesNotThrow(function() { - assert.equal(store.get('falsy:number:not:exist'), undefined); - }, TypeError); - }, - "within booleans": function (store) { - assert.doesNotThrow(function() { - assert.equal(store.get('falsy:boolean:not:exist'), undefined); - }, TypeError); - }, - "within objects": function (store) { - assert.doesNotThrow(function() { - assert.equal(store.get('falsy:object:not:exist'), undefined); - }, TypeError); - }, - "within empty strings": function (store) { - assert.doesNotThrow(function() { - assert.equal(store.get('falsy:string:empty:not:exist'), undefined); - }, TypeError); - }, - "within non-empty strings": function (store) { - assert.doesNotThrow(function() { - assert.equal(store.get('falsy:string:value:not:exist'), undefined); - }, TypeError); - } - } - }, - "the clear() method": { - "should respond with the true": function (store) { - assert.equal(store.get('foo:bar:bazz'), 'buzz'); - assert.isTrue(store.clear('foo:bar:bazz')); - assert.isTrue(typeof store.get('foo:bar:bazz') === 'undefined'); - } - }, - "the merge() method": { - "when overriding an existing literal value": function (store) { - store.set('merge:literal', 'string-value'); - store.merge('merge:literal', merge); - assert.deepEqual(store.get('merge:literal'), merge); - }, - "when overriding an existing Array value": function (store) { - store.set('merge:array', [1,2,3,4]); - store.merge('merge:array', merge); - assert.deepEqual(store.get('merge:literal'), merge); - }, - "when merging into an existing Object value": function (store) { - store.set('merge:object', { - prop1: 2, - prop2: 'prop2', - prop3: { - bazz: 'bazz' - }, - prop4: ['foo', 'bar'] - }); - store.merge('merge:object', merge); - - assert.equal(store.get('merge:object:prop1'), 1); - assert.equal(store.get('merge:object:prop2').length, 3); - assert.deepEqual(store.get('merge:object:prop3'), { - foo: 'bar', - bar: 'foo', - bazz: 'bazz' - }); - assert.equal(store.get('merge:object:prop4').length, 2); - } - } - }, - "When using the nconf memory store with different logical separator": { - topic: new nconf.Memory({logicalSeparator: '||' }), - "when storing with : (colon)": { - "should store the config atomicly": function (store) { - store.set('foo:bar:bazz', 'buzz'); - assert.isTrue(typeof store.get('foo:bar') === 'undefined'); - assert.equal(store.get('foo:bar:bazz'), 'buzz'); - } - }, - "when storing with separator": { - "should be able to read the object": function (store) { - store.set('foo||bar||bazz', 'buzz'); - assert.equal(store.get('foo||bar').bazz, 'buzz'); - assert.equal(store.get('foo').bar.bazz, 'buzz'); - } - } - } -}).export(module); diff --git a/test/stores/memory-store.test.js b/test/stores/memory-store.test.js new file mode 100644 index 0000000..9196354 --- /dev/null +++ b/test/stores/memory-store.test.js @@ -0,0 +1,114 @@ +/* + * memory-store-test.js: Tests for the nconf Memory store. + * + * (C) 2011, Charlie Robbins and the Contributors. + * + */ + +var nconf = require('../../lib/nconf'); +var merge = require('../fixtures/data').merge; + +describe('nconf/stores/memory', () => { + describe("When using the nconf memory store", () => { + var store = new nconf.Memory(); + it("the set() method should respond with true", () => { + expect(store.set('foo:bar:bazz', 'buzz')).toBeTruthy(); + expect(store.set('falsy:number', 0)).toBeTruthy(); + expect(store.set('falsy:string:empty', '')).toBeTruthy(); + expect(store.set('falsy:string:value', 'value')).toBeTruthy(); + expect(store.set('falsy:boolean', false)).toBeTruthy(); + expect(store.set('falsy:object', null)).toBeTruthy(); + }); + + it("the get() method should respond with the correct value", () => { + expect(store.get('foo:bar:bazz')).toEqual('buzz'); + expect(store.get('falsy:number')).toEqual(0); + expect(store.get('falsy:string:empty')).toEqual(''); + expect(store.get('falsy:string:value')).toEqual('value'); + expect(store.get('falsy:boolean')).toEqual(false); + expect(store.get('falsy:object')).toEqual(null); + }); + + describe("the get() method should not fail when retrieving non-existent keys", () => { + it("at the root level", () => { + expect(store.get('this:key:does:not:exist')).toEqual(undefined); + }); + + it("within numbers", () => { + expect(store.get('falsy:number:not:exist')).toEqual(undefined); + }); + + it("within booleans", () => { + expect(store.get('falsy:boolean:not:exist')).toEqual(undefined); + }); + + it("within objects", () => { + expect(store.get('falsy:object:not:exist')).toEqual(undefined); + }); + + it("within empty strings", () => { + expect(store.get('falsy:string:empty:not:exist')).toEqual(undefined); + }); + + it("within non-empty strings", () => { + expect(store.get('falsy:string:value:not:exist')).toEqual(undefined); + }); + }); + + it("the clear() method, should respond with the true", () => { + expect(store.get('foo:bar:bazz')).toEqual('buzz'); + expect(store.clear('foo:bar:bazz')).toBeTruthy(); + expect(typeof store.get('foo:bar:bazz') === 'undefined').toBeTruthy(); + }); + + describe("the merge() method", () => { + it("when overriding an existing literal value", () => { + store.set('merge:literal', 'string-value'); + store.merge('merge:literal', merge); + expect(store.get('merge:literal')).toEqual(merge); + }); + + it("when overriding an existing Array value", () => { + store.set('merge:array', [1, 2, 3, 4]); + store.merge('merge:array', merge); + expect(store.get('merge:literal')).toEqual(merge); + }); + + it("when merging into an existing Object value", () => { + store.set('merge:object', { + prop1: 2, + prop2: 'prop2', + prop3: { + bazz: 'bazz' + }, + prop4: ['foo', 'bar'] + }); + store.merge('merge:object', merge); + + expect(store.get('merge:object:prop1')).toEqual(1); + expect(store.get('merge:object:prop2').length).toEqual(3); + expect(store.get('merge:object:prop3')).toEqual({ + foo: 'bar', + bar: 'foo', + bazz: 'bazz' + }); + expect(store.get('merge:object:prop4').length).toEqual(2); + }); + }); + }); + describe("When using the nconf memory store with different logical separator", () => { + var store = new nconf.Memory({logicalSeparator: '||'}); + + it("when storing with : (colon), should store the config atomicly", () => { + store.set('foo:bar:bazz', 'buzz'); + expect(typeof store.get('foo:bar') === 'undefined').toBeTruthy(); + expect(store.get('foo:bar:bazz')).toEqual('buzz'); + }); + + it("when storing with separator, should be able to read the object", () => { + store.set('foo||bar||bazz', 'buzz'); + expect(store.get('foo||bar').bazz).toEqual('buzz'); + expect(store.get('foo').bar.bazz).toEqual('buzz'); + }) + }); +});