diff --git a/.editorconfig b/.editorconfig index 65be2f56..8b827bec 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,9 @@ indent_style = tab end_of_line = lf charset = utf-8 trim_trailing_whitespace = true -insert_final_newline = false +insert_final_newline = true +# See http://stackoverflow.com/a/729795 +max_line_length = 160 [*.md] -trim_trailing_whitespace = false \ No newline at end of file +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 3aae374f..48ad2930 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +coverage .DS_Store *.sublime-project *.sublime-workspace @@ -11,4 +12,4 @@ tmp .idea npm-debug.log bin/ -index.js \ No newline at end of file +index.js diff --git a/README.md b/README.md index f88e573d..1e39cf55 100644 --- a/README.md +++ b/README.md @@ -349,10 +349,18 @@ Please look at the coding style and work with it, not against it ;) ## Test -The package comes with a testing tool for the font json format. Run the test with: +The package comes with a bunch of unit tests and a test suite for font files. + +Run the unit tests via: + +```shell +npm test:unit +``` + +Run the font test suite via: ```shell -npm test +npm test:fonts ``` This tool checks: @@ -363,8 +371,15 @@ This tool checks: - consistent width - consistent lines +Or run all tests via: + +```shell +npm run test +``` + ## Release History +* 2.0.0 - Added tests, split into more pure functions * 1.2.0 - Added `transparent` and `system` as default background and color option, added `backgroundColor` as alias for `background`, upgraded deps * 1.1.3 - Fixed help text, removing old -t option * 1.1.2 - Fixed issue with older commander version #3, updated docs diff --git a/package-lock.json b/package-lock.json index 29101f07..a4856410 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,94 @@ { "name": "cfonts", - "version": "1.2.0", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, + "requires": { + "acorn": "5.5.3" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "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 }, "ansi-regex": { @@ -34,6 +115,15 @@ "normalize-path": "2.1.1" } }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -41,14 +131,6 @@ "dev": true, "requires": { "sprintf-js": "1.0.3" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } } }, "arr-diff": { @@ -66,10 +148,16 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, "array-unique": { @@ -84,18 +172,75 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", + "dev": true + }, + "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 + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", @@ -302,6 +447,16 @@ "babel-template": "6.26.0" } }, + "babel-jest": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz", + "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "22.4.3" + } + }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", @@ -320,6 +475,30 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.10.1", + "test-exclude": "4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz", + "integrity": "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==", + "dev": true + }, + "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=", + "dev": true + }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", @@ -633,6 +812,16 @@ "babel-plugin-transform-regenerator": "6.26.0" } }, + "babel-preset-jest": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz", + "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "22.4.3", + "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", @@ -711,12 +900,54 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -738,12 +969,67 @@ "repeat-element": "1.1.2" } }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "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=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -754,19 +1040,27 @@ } }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, + "optional": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -821,22 +1115,141 @@ "readdirp": "2.1.0" } }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "exit": "0.1.2", - "glob": "7.1.2" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", @@ -850,32 +1263,38 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true + "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, + "requires": { + "delayed-stream": "1.0.0" + } }, "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "compare-versions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", + "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "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 }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, "constant-case": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", @@ -891,6 +1310,12 @@ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.4.tgz", @@ -913,29 +1338,59 @@ "which": "1.2.14" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", "dev": true }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "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" + } + }, + "data-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", + "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "abab": "1.0.4", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.4.0" } }, "debug": { @@ -953,70 +1408,79 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "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 + }, + "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=", "dev": true, "requires": { - "repeating": "2.0.1" + "strip-bom": "2.0.0" } }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } + "foreach": "2.0.5", + "object-keys": "1.0.11" } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "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 }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "repeating": "2.0.1" } }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "webidl-conversions": "4.0.2" } }, "dot-case": { @@ -1027,11 +1491,15 @@ "no-case": "2.3.2" } }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, "error-ex": { "version": "1.3.1", @@ -1042,15 +1510,73 @@ "is-arrayish": "0.2.1" } }, + "es-abstract": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.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=" }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, "esutils": { @@ -1059,11 +1585,29 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true + "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==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } }, "exit": { "version": "0.1.2", @@ -1089,6 +1633,47 @@ "fill-range": "2.2.3" } }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "jest-diff": "22.4.3", + "jest-get-type": "22.4.3", + "jest-matcher-utils": "22.4.3", + "jest-message-util": "22.4.3", + "jest-regex-util": "22.4.3" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -1098,12 +1683,55 @@ "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 + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "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 + }, + "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 + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "2.0.0" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", @@ -1138,37 +1766,12 @@ } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "locate-path": "2.0.0" } }, "for-in": { @@ -1186,6 +1789,38 @@ "for-in": "1.0.2" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "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, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -2102,18 +2737,39 @@ } } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "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" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -2159,207 +2815,132 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "grunt": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", - "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", - "dev": true, - "requires": { - "coffeescript": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.1", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.21", - "js-yaml": "3.5.5", - "minimatch": "3.0.4", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" - } - } - } + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true }, - "grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "chalk": "1.1.3", - "hooker": "0.2.3", - "jshint": "2.9.5" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "amdefine": "1.0.1" } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, - "grunt-exec": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-3.0.0.tgz", - "integrity": "sha512-cgAlreXf3muSYS5LzW0Cc4xHK03BjFOYk0MqCQ/MZ3k1Xz2GU7D+IAJg4UKicxpO+XdONJdx/NJ6kpy2wI+uHg==", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } }, - "grunt-legacy-log": { + "has": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.1.tgz", - "integrity": "sha512-rwuyqNKlI0IPz0DvxzJjcEiQEBaBNVeb1LFoZKxSmHLETFUwhwUrqOsPIxURTKSwNZHZ4ht1YLBYmVU0YZAzHQ==", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "4.17.5", - "underscore.string": "3.3.4" + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" } }, - "grunt-legacy-log-utils": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, - "grunt-legacy-util": { + "has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - }, - "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", - "dev": true + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } } } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "header-case": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", @@ -2369,6 +2950,12 @@ "upper-case": "1.1.3" } }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -2379,75 +2966,54 @@ "os-tmpdir": "1.0.2" } }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "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==", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.3.0", - "domutils": "1.5.1", - "entities": "1.0.0", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "whatwg-encoding": "1.0.3" } }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "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": { - "safer-buffer": "2.1.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" } }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "repeating": "2.0.1" + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2473,6 +3039,12 @@ "loose-envify": "1.3.1" } }, + "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=", + "dev": true + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -2510,6 +3082,21 @@ "builtin-modules": "1.1.1" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", @@ -2518,6 +3105,12 @@ "kind-of": "6.0.2" } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -2564,6 +3157,18 @@ "number-is-nan": "1.0.1" } }, + "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=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -2599,6 +3204,40 @@ } } }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -2611,6 +3250,33 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-upper-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", @@ -2625,6 +3291,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2646,648 +3318,2106 @@ "isarray": "1.0.0" } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "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 }, - "jshint": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", - "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", - "dev": true, - "requires": { - "cli": "1.0.1", - "console-browserify": "1.1.0", - "exit": "0.1.2", - "htmlparser2": "3.8.3", - "lodash": "3.7.0", - "minimatch": "3.0.4", - "shelljs": "0.3.0", - "strip-json-comments": "1.0.4" + "istanbul-api": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "dev": true, + "requires": { + "async": "2.6.0", + "compare-versions": "3.1.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.11.0", + "mkdirp": "0.5.1", + "once": "1.4.0" }, "dependencies": { - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true + "debug": { + "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" + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + } } } }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "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=", + "istanbul-lib-hook": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "append-transform": "0.4.0" } }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "istanbul-lib-source-maps": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "dev": true, "requires": { - "lower-case": "1.1.4" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "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" + } + } } }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "handlebars": "4.0.11" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "throat": "4.1.0" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "jest-cli": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz", + "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "ansi-escapes": "3.1.0", + "chalk": "2.3.2", + "exit": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "import-local": "1.0.0", + "is-ci": "1.1.0", + "istanbul-api": "1.3.1", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-source-maps": "1.2.3", + "jest-changed-files": "22.4.3", + "jest-config": "22.4.3", + "jest-environment-jsdom": "22.4.3", + "jest-get-type": "22.4.3", + "jest-haste-map": "22.4.3", + "jest-message-util": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve-dependencies": "22.4.3", + "jest-runner": "22.4.3", + "jest-runtime": "22.4.3", + "jest-snapshot": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "jest-worker": "22.4.3", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "realpath-native": "1.0.0", + "rimraf": "2.6.2", + "slash": "1.0.0", + "string-length": "2.0.0", + "strip-ansi": "4.0.0", + "which": "1.2.14", + "yargs": "10.1.2" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "ansi-regex": "3.0.0" } } } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "jest-config": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz", + "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "chalk": "2.3.2", + "glob": "7.1.2", + "jest-environment-jsdom": "22.4.3", + "jest-environment-node": "22.4.3", + "jest-get-type": "22.4.3", + "jest-jasmine2": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "pretty-format": "22.4.3" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "diff": "3.5.0", + "jest-get-type": "22.4.3", + "pretty-format": "22.4.3" + } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", "dev": true, "requires": { - "minimist": "0.0.8" + "detect-newline": "2.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "22.4.3", + "jest-util": "22.4.3", + "jsdom": "11.7.0" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "22.4.3", + "jest-util": "22.4.3" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", "dev": true }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", "dev": true, - "optional": true + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "22.4.3", + "jest-serializer": "22.4.3", + "jest-worker": "22.4.3", + "micromatch": "2.3.11", + "sane": "2.5.0" + } }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "jest-jasmine2": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz", + "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", + "dev": true, "requires": { - "lower-case": "1.1.4" + "chalk": "2.3.2", + "co": "4.6.0", + "expect": "22.4.3", + "graceful-fs": "4.1.11", + "is-generator-fn": "1.0.0", + "jest-diff": "22.4.3", + "jest-matcher-utils": "22.4.3", + "jest-message-util": "22.4.3", + "jest-snapshot": "22.4.3", + "jest-util": "22.4.3", + "source-map-support": "0.5.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + } } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", "dev": true, "requires": { - "abbrev": "1.1.1" + "pretty-format": "22.4.3" } }, - "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==", + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "chalk": "2.3.2", + "jest-get-type": "22.4.3", + "pretty-format": "22.4.3" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "@babel/code-frame": "7.0.0-beta.44", + "chalk": "2.3.2", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "browser-resolve": "1.11.2", + "chalk": "2.3.2" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", "dev": true, "requires": { - "wrappy": "1.0.2" + "jest-regex-util": "22.4.3" } }, - "onchange": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/onchange/-/onchange-3.3.0.tgz", - "integrity": "sha512-0ZQIdGkhG8Y+r8BIcjjDV93X59KkZ4Cc+ZxA9N+wA/3vm1cvd8/f2NXlCPCZpowSd78eCERk29dtuS8+X97MLg==", + "jest-runner": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz", + "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", "dev": true, "requires": { - "arrify": "1.0.1", - "chokidar": "1.7.0", - "cross-spawn": "5.1.0", - "minimist": "1.2.0", - "tree-kill": "1.2.0" + "exit": "0.1.2", + "jest-config": "22.4.3", + "jest-docblock": "22.4.3", + "jest-haste-map": "22.4.3", + "jest-jasmine2": "22.4.3", + "jest-leak-detector": "22.4.3", + "jest-message-util": "22.4.3", + "jest-runtime": "22.4.3", + "jest-util": "22.4.3", + "jest-worker": "22.4.3", + "throat": "4.1.0" + } + }, + "jest-runtime": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz", + "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "22.4.3", + "babel-plugin-istanbul": "4.1.6", + "chalk": "2.3.2", + "convert-source-map": "1.5.1", + "exit": "0.1.2", + "graceful-fs": "4.1.11", + "jest-config": "22.4.3", + "jest-haste-map": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "realpath-native": "1.0.0", + "slash": "1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "2.3.0", + "yargs": "10.1.2" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true } } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "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=", + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", "dev": true }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", + "chalk": "2.3.2", + "jest-diff": "22.4.3", + "jest-matcher-utils": "22.4.3", "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "natural-compare": "1.4.0", + "pretty-format": "22.4.3" } }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, "requires": { - "no-case": "2.3.2" + "callsites": "2.0.0", + "chalk": "2.3.2", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "jest-message-util": "22.4.3", + "mkdirp": "0.5.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "jest-validate": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz", + "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "chalk": "2.3.2", + "jest-config": "22.4.3", + "jest-get-type": "22.4.3", + "leven": "2.1.0", + "pretty-format": "22.4.3" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", "dev": true, "requires": { - "error-ex": "1.3.1" + "merge-stream": "1.0.1" } }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", - "requires": { - "camel-case": "3.0.0", - "upper-case-first": "1.1.2" - } + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, - "path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, "requires": { - "no-case": "2.3.2" + "argparse": "1.0.10", + "esprima": "4.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=", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, - "requires": { - "pinkie-promise": "2.0.1" + "optional": true + }, + "jsdom": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.7.0.tgz", + "integrity": "sha512-9NzSc4Iz4gN9p4uoPbBUzro21QdgL32swaWIaWS8eEVQ2I69fRJAy/MKyvlEIk0V7HtKgfMbbOKyTZUrzR2Hsw==", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "5.5.3", + "acorn-globals": "4.1.0", + "array-equal": "1.0.0", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "data-urls": "1.0.0", + "domexception": "1.0.1", + "escodegen": "1.9.1", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.3.0", + "nwmatcher": "1.4.4", + "parse5": "4.0.0", + "pn": "1.1.0", + "request": "2.85.0", + "request-promise-native": "1.0.5", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.4", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.4.0", + "ws": "4.1.0", + "xml-name-validator": "3.0.0" } }, - "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=", + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "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=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "jsonify": "0.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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 }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { - "pinkie": "2.0.4" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", "dev": true }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, - "read-pkg": { + "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.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=", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "js-tokens": "3.0.2" } }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "requires": { + "lower-case": "1.1.4" + } + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "tmpl": "1.0.4" } }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "object-visit": "1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "mimic-fn": "1.2.0" } }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "readable-stream": "2.3.6" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "jsesc": "0.5.0" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } } } }, - "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=", + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "is-finite": "1.0.2" + "brace-expansion": "1.1.11" } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": 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 + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "1.1.4" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" + }, + "dependencies": { + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "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 + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onchange": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/onchange/-/onchange-3.3.0.tgz", + "integrity": "sha512-0ZQIdGkhG8Y+r8BIcjjDV93X59KkZ4Cc+ZxA9N+wA/3vm1cvd8/f2NXlCPCZpowSd78eCERk29dtuS8+X97MLg==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chokidar": "1.7.0", + "cross-spawn": "5.1.0", + "minimist": "1.2.0", + "tree-kill": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "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.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "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 + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "2.3.2" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "requires": { + "camel-case": "3.0.0", + "upper-case-first": "1.1.2" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "requires": { + "no-case": "2.3.2" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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 + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "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.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "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 + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "3.0.0", + "ansi-styles": "3.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.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=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" + } + }, + "realpath-native": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", + "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", + "dev": true, + "requires": { + "util.promisify": "1.0.0" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "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=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "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.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.4" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "safer-buffer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.0.tgz", - "integrity": "sha512-HQhCIIl7TrF1aa7d352EXG+xumPERvoIWxOqq2CagDId0FVGtlG/fuQ7kZT+wZ7ytyGiP3pnYUVni5otBzOVmA==", + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "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.1.2" + } + }, + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "sane": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", + "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "exec-sh": "0.2.1", + "fb-watchman": "2.0.0", + "fsevents": "1.1.3", + "micromatch": "3.1.10", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.18.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "semver": { @@ -3305,12 +5435,41 @@ "upper-case-first": "1.1.2" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -3326,10 +5485,10 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, "signal-exit": { @@ -3352,12 +5511,166 @@ "no-case": "2.3.2" } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.1.0", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -3367,6 +5680,12 @@ "source-map": "0.5.7" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", @@ -3399,12 +5718,181 @@ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "stealthy-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "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=", + "dev": true, + "requires": { + "astral-regex": "1.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3414,97 +5902,573 @@ "safe-buffer": "5.1.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "requires": { + "has-flag": "3.0.0" + } + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "requires": { + "lower-case": "1.1.4", + "upper-case": "1.1.3" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "test-exclude": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "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=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "is-utf8": "0.2.1" + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, - "strip-indent": { + "tr46": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "punycode": "2.1.0" } }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", "dev": true }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { - "has-flag": "3.0.0" + "safe-buffer": "5.1.1" } }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "tweetnacl": { + "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": { - "lower-case": "1.1.4", - "upper-case": "1.1.3" + "prelude-ls": "1.1.2" } }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } } }, - "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=", - "dev": true - }, - "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", - "dev": true + "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=", + "dev": true, + "optional": true }, - "trim-newlines": { + "union-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } }, - "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "sprintf-js": "1.1.1", - "util-deprecate": "1.0.2" + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "upper-case": { @@ -3520,6 +6484,21 @@ "upper-case": "1.1.3" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", @@ -3532,6 +6511,22 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", @@ -3551,6 +6546,85 @@ "spdx-expression-parse": "3.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.3.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "0.2.1", + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", + "dev": true + }, + "whatwg-url": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "dev": true, + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } + }, "which": { "version": "1.2.14", "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", @@ -3560,6 +6634,12 @@ "isexe": "2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "window-size": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.0.tgz", @@ -3569,17 +6649,153 @@ "is-number": "3.0.0" } }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "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==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } } } } diff --git a/package.json b/package.json index 82255f88..3af893c7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cfonts", "description": "Sexy fonts for the console", - "version": "1.2.0", + "version": "2.0.0", "homepage": "https://github.com/dominikwilkowski/cfonts", "author": { "name": "Dominik Wilkowski", @@ -30,20 +30,21 @@ "node": ">=0.12.15" }, "scripts": { - "prepublish": "npm run build", - "test": "node ./test/fonttest.js", + "prepublish": "npm run build && npm run test", + "test": "npm run build && npm run test:unit && npm run test:fonts", + "test:fonts": "node ./test/fonttest.js", + "test:watch": "jest --watchAll --coverage", + "test:unit": "jest", "build": "npm run build:bin & npm run build:lib", - "build:bin": "mkdir bin && babel src/bin.js --out-file bin/font.js --presets=es2015 --plugins transform-runtime", - "build:lib": "babel src/lib.js --out-file index.js --presets=es2015 --plugins transform-runtime", + "build:bin": "mkdir -p bin && babel src/bin.js --out-file bin/index.js --presets=es2015 --plugins transform-runtime", + "build:lib": "mkdir -p lib && babel src/lib.js --out-file lib/index.js --presets=es2015 --plugins transform-runtime", "watch": "npm run build && onchange 'src/**/*' -- npm run build" }, "devDependencies": { "babel-cli": "^6.22.2", "babel-plugin-transform-runtime": "^6.22.0", "babel-preset-es2015": "^6.22.0", - "grunt": "~1.0.1", - "grunt-contrib-jshint": "^1.0.0", - "grunt-exec": "^3.0.0", + "jest-cli": "^22.4.3", "onchange": "^3.2.1" }, "peerDependencies": {}, @@ -55,6 +56,21 @@ "commander": "^2.15.1", "window-size": "^1.1.0" }, + "jest": { + "testEnvironment": "node", + "testRegex": "\\.spec.js$", + "collectCoverageFrom": [ + "src/*.js" + ], + "coverageThreshold": { + "global": { + "branches": 0, + "functions": 0, + "lines": 0, + "statements": 0 + } + } + }, "keywords": [ "font", "banner", @@ -65,13 +81,13 @@ "pretty" ], "files": [ - "index.js", + "lib/*", "bin/*", "fonts/*" ], - "main": "index.js", + "main": "lib/index.js", "bin": { - "cfonts": "./bin/font.js" + "cfonts": "./bin/index.js" }, "license": "GNU-GPLv2" } diff --git a/src/bin.js b/src/bin.js index 88558f5b..457d0231 100644 --- a/src/bin.js +++ b/src/bin.js @@ -17,12 +17,13 @@ //-------------------------------------------------------------------------------------------------------------------------------------------------------------- // Dependencies //-------------------------------------------------------------------------------------------------------------------------------------------------------------- -const Fs = require('fs'); -const Chalk = require('chalk'); +const CFonts = require('../lib/index.js'); const Program = require('commander'); -const CFonts = require('./../index.js'); +const Chalk = require('chalk'); +const Path = require('path'); +const Fs = require('fs'); -const Package = JSON.parse(Fs.readFileSync(__dirname + '/../package.json', 'utf8')); +const Package = JSON.parse( Fs.readFileSync( Path.normalize(`${ __dirname }/../package.json`), 'utf8' ) ); const Version = Package.version; @@ -34,31 +35,31 @@ Program `"" [option1] [option2] , [option3]\n` + ` Example: $ ${ Chalk.bold(`cfonts "sexy font" -f chrome -a center -c red,green,gray`) }` ) - .description(`This is a tool for sexy fonts in the console. Give your cli some love.`) - .version(`v${Version}`) - .option(`-f, --font `, `define "font face"`, `block`) - .option(`-a, --align `, `define "alignment" for the text`, `left`) - .option(`-c, --colors ,...`, `provide colors for text; comma separated (no space)`, `system`) - .option(`-b, --background `, `provide background color`, `transparent`) - .option(`-l, --letter-spacing `, `define letter spacing {integer}`) - .option(`-z, --line-height `, `define line height {integer}`, 1) - .option(`-s, --spaceless`, `surpress space on top and on the bottom`) - .option(`-m, --max-length `, `define how many character can be on one line`) - .action(function( text ) { + .description( `This is a tool for sexy fonts in the console. Give your cli some love.` ) + .version( `v${ Version }`) + .option( `-f, --font `, `define "font face"`, `block` ) + .option( `-a, --align `, `define "alignment" for the text`, `left` ) + .option( `-c, --colors ,...`, `provide colors for text; comma separated (no space)`, `system` ) + .option( `-b, --background `, `provide background color`, `transparent` ) + .option( `-l, --letter-spacing `, `define letter spacing {integer}` ) + .option( `-z, --line-height `, `define line height {integer}`, 1 ) + .option( `-s, --spaceless`, `surpress space on top and on the bottom` ) + .option( `-m, --max-length `, `define how many character can be on one line` ) + .action( ( text ) => { Program.text = text; //add flagless option for text }) - .on('--help', function() { //adding options for each keyword section + .on( '--help', () => { //adding options for each keyword section console.log( Chalk.bold(` Font face options:`) ); - console.log(` [ ${CFonts.FONTFACES.join(', ')} ]\n`); + console.log(` [ ${ CFonts.FONTFACES.join(', ') } ]\n`); console.log( Chalk.bold(` Alignment options:`) ); - console.log(` [ ${CFonts.ALIGNMENT.join(', ')} ]\n`); + console.log(` [ ${ CFonts.ALIGNMENT.join(', ') } ]\n`); console.log( Chalk.bold(` Color options:`) ); - console.log(` [ ${CFonts.COLORS.join(', ')} ]\n`); + console.log(` [ ${ CFonts.COLORS.join(', ') } ]\n`); console.log( Chalk.bold(` background color options:`) ); - console.log(` [ ${CFonts.BGCOLORS.join(', ')} ]\n`); + console.log(` [ ${ CFonts.BGCOLORS.join(', ') } ]\n`); }) .parse( process.argv ); @@ -69,24 +70,24 @@ Program if(Program.text !== undefined) { //log OPTIONS for debugging if( CFonts.DEBUG ) { - CFonts.debugging.report( + CFonts.Debugging.report( `OPTIONS:\n` + - ` CFonts.say("${Program.text}", {\n` + - ` 'font': "${Program.font}",\n` + - ` 'align': "${Program.align}",\n` + - ` 'colors': ${Program.colors ? JSON.stringify( Program.colors.split(',') ) : []},\n` + - ` 'background': "${Program.background}",\n` + - ` 'letterSpacing': ${Program.letterSpacing},\n` + - ` 'lineHeight': ${Program.lineHeight},\n` + - ` 'space': ${Program.spaceless ? false : true},\n` + - ` 'maxLength': ${Program.maxLength}\n` + + ` CFonts.say("${ Program.text }", {\n` + + ` 'font': "${ Program.font }",\n` + + ` 'align': "${ Program.align }",\n` + + ` 'colors': ${ Program.colors ? JSON.stringify( Program.colors.split(',') ) : [] },\n` + + ` 'background': "${ Program.background }",\n` + + ` 'letterSpacing': ${ Program.letterSpacing },\n` + + ` 'lineHeight': ${ Program.lineHeight },\n` + + ` 'space': ${ Program.spaceless ? false : true },\n` + + ` 'maxLength': ${ Program.maxLength }\n` + ` });`, 3 ); } //execute cfonts - CFonts.say(Program.text, { + CFonts.say( Program.text, { 'font': Program.font, 'align': Program.align, 'colors': Program.colors ? Program.colors.split(',') : [], @@ -99,8 +100,8 @@ if(Program.text !== undefined) { } else { //we do need text to convert - CFonts.log.error( - `Please provide text to convert with ${Chalk.green(`cfonts "Text"`)}\n` + - `Run ${Chalk.green(`cfonts --help`)} for more infos` + CFonts.Log.error( + `Please provide text to convert with ${ Chalk.green(`cfonts "Text"`) }\n` + + `Run ${ Chalk.green(`cfonts --help`) } for more infos` ); } \ No newline at end of file diff --git a/src/lib.js b/src/lib.js index a0b3951f..72acc809 100644 --- a/src/lib.js +++ b/src/lib.js @@ -13,704 +13,848 @@ 'use strict'; -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- // Dependencies -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- const ChangeCase = require('change-case'); const WinSize = require('window-size'); const Style = require('ansi-styles'); const Chalk = require(`chalk`); +const Path = require(`path`); const Fs = require(`fs`); -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Constructor -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -const CFonts = (() => { //constructor factory +// settings +const DEBUG = false; +const DEBUGLEVEL = 2; +const CHARS = [ + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "|", + "!", "?", ".", "+", "-", "_", "=", "@", "#", "$", "%", "&", "(", ")", "/", ":", ";", ",", " ", +]; +const COLORS = [ + 'system', + 'black', + 'red', + 'green', + 'yellow', + 'blue', + 'magenta', + 'cyan', + 'white', + 'gray', + 'redBright', + 'greenBright', + 'yellowBright', + 'blueBright', + 'magentaBright', + 'cyanBright', + 'whiteBright', +]; +const BGCOLORS = [ + 'transparent', + 'black', + 'red', + 'green', + 'yellow', + 'blue', + 'magenta', + 'cyan', + 'white', + 'blackBright', + 'redBright', + 'greenBright', + 'yellowBright', + 'blueBright', + 'magentaBright', + 'cyanBright', + 'whiteBright', +]; +const ALIGNMENT = [ + 'left', + 'center', + 'right', +]; +const FONTFACES = [ + 'console', + 'block', + 'simpleBlock', + 'simple', + '3d', + 'simple3d', + 'chrome', + 'huge', +]; + + +/** + * Get a selected JSON font-file object + * + * @param {string} font - The name of the font to be returned + * + * @return {object} - The font object of that file + */ +const GetFont = ( font ) => { + Debugging.report( `Running GetFont`, 1 ); -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// GetFont, Get and set a selected JSON font-file object into global namespace -// -// @param font {string} The name of the font to be returned -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const GetFont = ( font ) => { - CFonts.debugging.report(`Running GetFont`, 1); + // try loading the font file + try { + let fontFile = Path.normalize( `${ __dirname }/../fonts/${ font }.json` ); // build font path + let FONTFACE = JSON.parse( Fs.readFileSync( fontFile, 'utf8' ) ); // read font file - //try loading the font file - try { - let fontFile = `${__dirname}/fonts/${font}.json`; //build font path - let FONTFACE = JSON.parse( Fs.readFileSync(fontFile, 'utf8') ); //read font file + Debugging.report( `GetFont: Fontface path selected: "${ fontFile }"`, 2 ); - CFonts.debugging.report(`GetFont: Fontface path selected: "${fontFile}"`, 2); + return FONTFACE; + } + catch( error ) { + Debugging.error( `Font file for "${ font }" errored out: ${ error }`, 2 ); - CFonts.FONTFACE = FONTFACE; - } - catch( error ) { - CFonts.debugging.error(`Font file for "${font}" errored out: ${error}`, 2); + return false; + } +}; + + +/** + * Return the max width of a character by looking at its longest line + * + * @param {array} character - The character array from the font face object + * @param {integer} fontLines - The number of lines this font has per character + * @param {integer} letterSpacing - The user defined letter spacing + * + * @return {integer} - The length of a longest line in a character + */ +const CharLength = ( character, fontLines, letterSpacing ) => { + Debugging.report( `Running CharLength`, 1 ); + + let charWidth = 0; - CFonts.log.error(`Font file for "${font}" failed to connect to us.\nTry reinstalling this package.`); + for( let i = 0; i < fontLines; i++ ) { + let char = character[ i ].replace( /(<([^>]+)>)/ig, '' ); // get character and strip color infos - process.exit(1); //exit program with failure code + if( char.length > charWidth ) { + charWidth = char.length; // assign only largest } }; + if( charWidth === 0 && letterSpacing > 0 ) { + Debugging.report( `CharLength: Adding space to letter spacing`, 1 ); -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// CharLength, return the max width of a character by looking at its longest line -// -// @param character {array} The character array from the font face object -// -// @return {integer} The length of a longest line in a charater -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const CharLength = ( character ) => { - CFonts.debugging.report(`Running CharLength`, 1); + charWidth = 1; + } - let charWidth = 0; + return charWidth; +}; - for(let i = 0; i < CFonts.FONTFACE.lines; i++) { - let char = character[ i ].replace(/(<([^>]+)>)/ig, ''); //get character and strip color infos - if( char.length > charWidth ) { - charWidth = char.length; //assign only largest - } - }; +/** + * Add a new line to the output array + * + * @param {array} output - The output array the line shall be appended to + * @param {integer} fontLines - The number of lines this font has per character + * @param {array} FontBuffer - An array of the space we add at the beginning of each line + * @param {integer} lineHeight - The user defined line height + * + * @return {array} - The output array with new line + */ +const AddLine = ( output, fontLines, FontBuffer, lineHeight ) => { + Debugging.report( `Running AddLine`, 1 ); - if( charWidth === 0 && CFonts.OPTIONS.letterSpacing > 0 ) { - CFonts.debugging.report(`CharLength: Adding space to letter spacing`, 1); + if( output.length === 0 ) { + lineHeight = 0; + } - charWidth = 1; + let lines = fontLines + output.length + lineHeight; + let length = output.length; + + for( let i = length; i < lines; i++ ) { + let index = i - length; + + if( index > lineHeight ) { + output[ i ] = FontBuffer[ ( index - lineHeight ) ]; + } + else { + output[ i ] = ''; } + } - return charWidth; - }; + return output; +}; -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// AddLine, Add a new line to the output array -// -// @param output {array} The output array the line shall be appended to -// -// @return {array} The output array with new line -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const AddLine = ( output ) => { - CFonts.debugging.report(`Running AddLine`, 1); - - let lineHeight = CFonts.OPTIONS.lineHeight; - if( output.length === 0 ) { - lineHeight = 0; - } +/** + * Abstraction for all ansi codes with open and close keys + * + * @type {object} + */ +const AnsiSytle = Object.assign( { system: { open: '', close: '' } }, Style ); - let lines = CFonts.FONTFACE.lines + output.length + lineHeight; - let length = output.length; - for(let i = length; i < lines; i++) { - let index = i - length; +/** + * Replace placeholders with color information + * + * @param {string} character - The string to be converted + * @param {integer} fontColors - The number of allowed colors for this font + * @param {array} optionColors - An array of user defined colors + * + * @return {string} - The character with color ansi escape sequences for CLI + */ +const Colorize = ( character, fontColors, optionColors ) => { + Debugging.report( `Running Colorize`, 1 ); + + let candyColors = [ // allowed candy colors + 'red', + 'green', + 'yellow', + 'magenta', + 'cyan', + 'redBright', + 'greenBright', + 'yellowBright', + 'blueBright', + 'magentaBright', + 'cyanBright', + ]; + + if( character !== undefined ) { + if( fontColors > 1 ) { + for( let i = 0; i < fontColors; i++ ) { // we have to replace all color placeholder with ansi escape sequences + let open = new RegExp(``, 'g'); + let close = new RegExp(``, 'g'); + + let color = optionColors[ i ] || 'system'; - if( index > lineHeight ) { - output[ i ] = CFonts.FONTFACE.buffer[ ( index - lineHeight ) ]; - } - else { - output[ i ] = ''; + if( color === 'candy' ) { + color = candyColors[ Math.floor( Math.random() * candyColors.length ) ]; + } + + character = character.replace( open, AnsiSytle[ color ].open ); + character = character.replace( close, AnsiSytle[ color ].close ); } } - return output; - }; + if( fontColors === 1 ) { // if only one color is allowed there won't be any color placeholders in the characters + let color = optionColors[ 0 ] || 'system'; + if( color === 'candy' ) { + color = candyColors[ Math.floor( Math.random() * candyColors.length ) ]; + } -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// AddChar, Add a new character to the output array -// -// @param CHAR {string} The character to be added -// @param output {array} The output array the line shall be appended to -// -// @return {array} The output array with new line -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const AddChar = ( CHAR, output ) => { - CFonts.debugging.report(`Running AddChar with "${CHAR}"`, 1); + character = AnsiSytle[ color ].open + character + AnsiSytle[ color ].close; + } + } - let lines = output.length - CFonts.FONTFACE.lines; //last line is CFonts.FONTFACE.lines tall and is located at the bottom of the output array + return character; +}; - for(let i = lines; i < output.length; i++) { //iterate over last line - let index = i - lines; - output[ i ] += Colorize( CFonts.FONTFACE.chars[ CHAR ][ index ] ); - } +/** + * Add a new character to the output array + * + * @param {string} CHAR - The character to be added + * @param {array} output - The output array the line shall be appended to + * @param {integer} fontLines - The number of lines this font has per character + * @param {object} fontChars - An object with all character arrays + * @param {integer} fontColors - The amount of colors allowed for this font + * @param {object} colors - Our options + * + * @return {array} - The output array with new line + */ +const AddChar = ( CHAR, output, fontLines, fontChars, fontColors, colors ) => { + Debugging.report( `Running AddChar with "${ CHAR }"`, 1 ); - return output; - }; + let lines = output.length - fontLines; // last line is fontLines tall and is located at the bottom of the output array + + for( let i = lines; i < output.length; i++ ) { // iterate over last line + let index = i - lines; + + output[ i ] += Colorize( fontChars[ CHAR ][ index ], fontColors, colors ); + } + return output; +}; -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// AddLetterSpacing, Add letter spacing for the next character -// -// @param output {array} The output array the line shall be appended to -// -// @return {array} The output array with space -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const AddLetterSpacing = ( output ) => { - CFonts.debugging.report(`Running AddLetterSpacing`, 1); - let lines = output.length - CFonts.FONTFACE.lines; //last line is CFonts.FONTFACE.lines tall and is located at the bottom of the output array +/** + * Add letter spacing for the next character + * + * @param {array} output - The output array the line shall be appended to + * @param {integer} fontLines - The number of lines this font has per character + * @param {array} fontLetterspace - A space between the letters + * @param {integer} fontColors - The amount of colors allowed for this font + * @param {array} colors - The user defined colors + * @param {integer} letterSpacing - The user defined letter spacing + * + * @return {array} - The output array with space + */ +const AddLetterSpacing = ( output, fontLines, fontLetterspace, fontColors, colors, letterSpacing ) => { + Debugging.report( `Running AddLetterSpacing`, 1 ); - for(let i = lines; i < output.length; i++) { //iterate over last line - let index = i - lines; - let space = Colorize( CFonts.FONTFACE.letterspace[ index ] ); + let lines = output.length - fontLines; // last line is fontLines tall and is located at the bottom of the output array - if( space.length === 0 && CFonts.OPTIONS.letterSpacing > 0 ) { - CFonts.debugging.report(`AddLetterSpacing: Adding space to letter spacing`, 1); + for( let i = lines; i < output.length; i++ ) { // iterate over last line + let index = i - lines; + let space = Colorize( fontLetterspace[ index ], fontColors, colors ); - space = ' '; - } + if( space.length === 0 && letterSpacing > 0 ) { + Debugging.report( `AddLetterSpacing: Adding space to letter spacing`, 1 ); - output[ i ] += String.repeat(space, CFonts.OPTIONS.letterSpacing ); + space = ' '; } - return output; - }; + output[ i ] += String.repeat( space, letterSpacing ); + } + return output; +}; -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// AnsiSytle, return all ansi codes with open and close keys -// -// @return {object} An object with all supported ansi escape sequences -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const AnsiSytle = Object.assign( { system: { open: '', close: '' } }, Style ); - - -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// Colorize, replace placeholders with color information -// -// @param character {string} The string to be converted -// -// @return {string} The character with color information for CLI -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const Colorize = ( character ) => { - CFonts.debugging.report(`Running Colorize`, 1); - - let candyColors = [ - 'red', - 'green', - 'yellow', - 'magenta', - 'cyan', - 'redBright', - 'greenBright', - 'yellowBright', - 'blueBright', - 'magentaBright', - 'cyanBright', - ]; //allowed candy colors - - if( character !== undefined ) { - if( CFonts.FONTFACE.colors > 1 ) { - for(let i = 0; i < CFonts.FONTFACE.colors; i++) { //convert all colors - let open = new RegExp(``, 'g'); - let close = new RegExp(``, 'g'); - - let color = CFonts.OPTIONS.colors[ i ] || 'system'; - - if( color === 'candy' ) { - color = candyColors[ Math.floor( Math.random() * candyColors.length ) ]; - } +/** + * Abstraction for windows size + * + * @type {object} + */ +const Size = { + width: WinSize.width || 80, + height: WinSize.height || 24, +}; - character = character.replace( open, AnsiSytle[ color ].open ); - character = character.replace( close, AnsiSytle[ color ].close ); - } - } - if( CFonts.FONTFACE.colors === 1 ) { - let color = CFonts.OPTIONS.colors[ 0 ] || 'system'; +/** + * Calculate the spaces to be added to the left of each line to align them either center or right + * + * @param {array} output - The output array the line shall be appended to + * @param {integer} lineLength - The current line length + * @param {integer} characterLines - The amount of line breaks in one character + * @param {string} align - The alignment of the text, only `center` and `right` will do anything + * @param {object} size - The size of the terminal as an object, default: Size + * @param {integer} size.width - The width of the terminal + * @param {integer} size.height - The height of the terminal + * + * @return {array} - The output array with space added on the left for alignment + */ +const AlignText = ( output, lineLength, characterLines, align, size = Size ) => { + Debugging.report( `Running AlignText`, 1 ); - if( color === 'candy' ) { - color = candyColors[ Math.floor( Math.random() * candyColors.length ) ]; - } + let space = 0; - character = AnsiSytle[ color ].open + character + AnsiSytle[ color ].close; - } - } + if( align === 'center' ) { // calculate the size for center alignment + space = Math.floor( ( size.width - lineLength ) / 2 ); - return character; - }; + Debugging.report( `AlignText: Center lineLength: ${ lineLength }, size.width: ${ size.width }, space: ${ space }`, 2 ); + } + if( align === 'right' ) { // calculate the size for right alignment + space = size.width - lineLength; -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Private function -// AlignText, calculate the spaces to be added to the left of each line to align them either center or right -// -// @param output {array} The output array the line shall be appended to -// @param lineLength {integer} the current line length -// -// @return {array} The output array with space added on the left for alignment -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - const AlignText = ( output, lineLength ) => { - CFonts.debugging.report(`Running AlignText`, 1); + Debugging.report( `AlignText: Right lineLength: ${ lineLength }, size.width: ${ size.width }, space: ${ space }`, 2 ); + } - let space = 0; - if( CFonts.OPTIONS.align === 'center' ) { //calculate the size for center alignment - space = Math.floor(( WinSize.width - lineLength ) / 2); + if( space > 0 ) { // only add if there is something to add + let lines = output.length - characterLines; // last line is characterLines tall and is located at the bottom of the output array + space = String.repeat(' ', space ); - CFonts.debugging.report(`AlignText: Center lineLength: ${lineLength}, WinSize.width: ${WinSize.width}, space: ${space}`, 2); + for( let i = lines; i < output.length; i++ ) { // iterate over last line (which can be several line breaks long) + output[ i ] = space + output[ i ]; } + } - if( CFonts.OPTIONS.align === 'right' ) { //calculate the size for right alignment - space = WinSize.width - lineLength; + return output; +}; - CFonts.debugging.report(`AlignText: Right lineLength: ${lineLength}, WinSize.width: ${WinSize.width}, space: ${space}`, 2); - } +/** + * Check input for human errors + * + * @param {string} INPUT - The string you want to write out + * @param {object} FONTFACES - All allowed fontfaces + * @param {string} font - The font the user chose + * @param {array} colors - The color the user chose + * @param {string} background - The background the user chose + * @param {string} align - The alignment the user chose + * + * @typedef {object} ReturnObject + * @property {boolean} pass - Whether the input is valid + * @property {string} message - Possible error messages + * + * @return {ReturnObject} - An object with error messages and a pass key + */ +const CheckInput = ( + INPUT, + userFont, + userColors, + userBackground, + userAlign, + fontfaces = FONTFACES, + colors = COLORS, + bgcolors = BGCOLORS, + alignment = ALIGNMENT +) => { + // checking input + if( INPUT === undefined || INPUT === '' ) { + return { + message: 'Please provide text to convert', + pass: false, + }; + } - if( space > 0 ) { //only add if there is something to add - let lines = output.length - CFonts.FONTFACE.lines; //last line is CFonts.FONTFACE.lines tall and is located at the bottom of the output array - space = String.repeat(' ', space ); + // checking font + if( fontfaces.indexOf( userFont ) === -1 ) { + return { + message: `"${ Chalk.red( userFont ) }" is not a valid font option.\n` + + `Please use a font from the supported stack:\n${ Chalk.green(`[ ${ FONTFACES.join(' | ') } ]`) }`, + pass: false, + }; + } - for(let i = lines; i < output.length; i++) { //iterate over last line - output[ i ] = space + output[ i ]; - } + // checking colors + for( let color in userColors ) { // check color usage + if( + colors.indexOf( userColors[ color ] ) === -1 && + userColors[ color ] !== 'candy' + ) { + return { + message: `"${ Chalk.red( userColors[ color ] ) }" is not a valid font color option.\n` + + `Please use a color from the supported stack:\n${ Chalk.green(`[ ${ colors.join(' | ') } | candy ]`) }`, + pass: false, + }; } + } - return output; - }; + // checking background colors + if( bgcolors.indexOf( userBackground ) === -1 ) { + return { + message: `"${ Chalk.red( userBackground ) }" is not a valid background option.\n` + + `Please use a color from the supported stack:\n${ Chalk.green(`[ ${ bgcolors.join(' | ') } ]`) }`, + pass: false, + }; + } + // CHECKING ALIGNMENT + if( alignment.indexOf( userAlign ) === -1 ) { + return { + message: `"${ Chalk.red( userAlign ) }" is not a valid alignment option.\n` + + `Please use an alignment option from the supported stack:\n${ Chalk.green(`[ ${ alignment.join(' | ') } ]`) }`, + pass: false, + }; + } -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- return { -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// settings -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - DEBUG: false, //Debug setting - DEBUGLEVEL: 2, //Debug level setting - COLORS: [ //All allowed font colors - 'system', - 'black', - 'red', - 'green', - 'yellow', - 'blue', - 'magenta', - 'cyan', - 'white', - 'gray', - 'redBright', - 'greenBright', - 'yellowBright', - 'blueBright', - 'magentaBright', - 'cyanBright', - 'whiteBright', - ], - BGCOLORS: [ //All allowed background colors - 'transparent', - 'black', - 'red', - 'green', - 'yellow', - 'blue', - 'magenta', - 'cyan', - 'white', - 'blackBright', - 'redBright', - 'greenBright', - 'yellowBright', - 'blueBright', - 'magentaBright', - 'cyanBright', - 'whiteBright', - ], - ALIGNMENT: [ //All allowed alignment options - 'left', - 'center', - 'right', - ], - FONTFACES: [ //All allowed fonts - 'console', - 'block', - 'simpleBlock', - 'simple', - '3d', - 'simple3d', - 'chrome', - 'huge', - ], - FONTFACE: {}, //Font face object to be filled with selected fontface - OPTIONS: {}, //User options - - -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Public function -// render, main method to get the ANSI output for a string -// -// @param INPUT {string} The string you want to write out -// @param SETTINGS {object} (optional) Settings object -// font {string} Font face, Default 'block' -// align {string} Text alignment, Default: 'left' -// colors {array} Colors for font, Default: [] -// background {string} Chalk color string for background, Default 'Black' -// letterSpacing {integer} Space between letters, Default: set by selected font face -// lineHeight {integer} Space between lines, Default: 1 -// space {boolean} Output space before and after output, Default: true -// maxLength {integer} Maximum amount of characters per line, Default width of console window -// -// @return {string} CLI output of INPUT to be consoled out -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - render: ( INPUT = '', SETTINGS = {} ) => { - CFonts.debugging.report(`Running render`, 1); - - let write = ''; //output in a string - let output = []; //output in an array - let lines = 0; //count each line - - //SETTINGS - CFonts.OPTIONS = { //SETTINGS and defaults - font: SETTINGS.font || 'block', - align: SETTINGS.align || 'left', - colors: SETTINGS.colors || [], - background: SETTINGS.background || SETTINGS.backgroundColor || 'transparent', - letterSpacing: SETTINGS.letterSpacing === undefined ? 1 : SETTINGS.letterSpacing, - lineHeight: SETTINGS.lineHeight === undefined ? 1 : parseInt( SETTINGS.lineHeight ), - space: SETTINGS.space === undefined ? true : SETTINGS.space, - maxLength: SETTINGS.maxLength || 0, - }; + message: '', + pass: true, + } +}; - //CHECKING INPUT - if( INPUT === undefined || INPUT === '' ) { - CFonts.log.error(`Please provide text to convert`); - process.exit(1); //exit program with failure code - } +/** + * Render our input with the console font + * + * @param {string} INPUT - The string you want to write out + * @param {object} OPTIONS - All user options + * @param {object} size - The size of the terminal as an object, default: Size + * @param {integer} size.width - The width of the terminal + * @param {integer} size.height - The height of the terminal + * + * @typedef {object} ReturnObject + * @property {array} output - An array of each line of the output + * @property {integer} lines - The count of line breaks + * + * @return {ReturnObject} - An object with the output and the line breaks + */ +const RenderConsole = ( INPUT, OPTIONS, size = Size ) => { + let output = []; + let i = 0; + + // the defaults need to cramp a little so console doesn't look silly + OPTIONS.letterSpacing = OPTIONS.letterSpacing <= 1 ? 0 : OPTIONS.letterSpacing - 1; + OPTIONS.lineHeight = OPTIONS.lineHeight <= 1 ? 0 : OPTIONS.lineHeight - 1; + + let space = ''; + if( OPTIONS.letterSpacing > 0 ) { + space = String.repeat( ' ', OPTIONS.letterSpacing ); + } - //CHECKING FONT - if( CFonts.FONTFACES.indexOf( CFonts.OPTIONS.font ) === -1 ) { - CFonts.log.error( - `"${Chalk.red( SETTINGS.font )}" is not a valid font option.\n` + - `Please use a font from the supported stack:\n${Chalk.green(`[ ${CFonts.FONTFACES.join(' | ')} ]`)}` - ); + // we have to add our letter spacing first + let outputLines = INPUT + .replace( /(?:\r\n|\r|\n)/g, '|' ) + .split( '|' ) + .map( line => + line + .trim() + .split('') + .join( space ) + ); + + // now we check each line for it's length and split them if too long + while( i < outputLines.length ) { + let line = outputLines[ i ]; + + if( line.length > size.width ) { + outputLines[ i ] = line.slice( 0, size.width ).trim(); + outputLines.splice( i + 1, 0, line.slice( size.width ).trim() ); + line = outputLines[ i ]; + } - process.exit(1); //exit program with failure code - } + if( OPTIONS.colors[ 0 ] === "candy" ) { + output.push( line + .split('') + .map( character => Colorize( character, 1, OPTIONS.colors ) ) + .join('') + ); + } + else { + output.push( line ); + } - //CHECKING COLORS - for( let color in CFonts.OPTIONS.colors ) { //check color usage - if( - CFonts.COLORS.indexOf( CFonts.OPTIONS.colors[ color ] ) === -1 && - CFonts.OPTIONS.colors[ color ] !== 'candy' - ) { - CFonts.log.error( - `"${Chalk.red( CFonts.OPTIONS.colors[ color ] )}" is not a valid font color option.\n` + - `Please use a color from the supported stack:\n${Chalk.green(`[ ${CFonts.COLORS.join(' | ')} | candy ]`)}` - ); + output = AlignText( output, line.length, 1, OPTIONS.align, size ); + output = AddLine( output, 0, [''], OPTIONS.lineHeight ); - process.exit(1); //exit program with failure code - } - } + i++; + } - //CHECKING BACKGROUND COLORS - if( CFonts.BGCOLORS.indexOf( CFonts.OPTIONS.background ) === -1 ) { - CFonts.log.error( - `"${Chalk.red( CFonts.OPTIONS.background )}" is not a valid background option.\n` + - `Please use a color from the supported stack:\n${Chalk.green(`[ ${CFonts.BGCOLORS.join(' | ')} ]`)}` - ); + return { + output, + lines: output.length, + }; +}; - process.exit(1); //exit program with failure code - } - //CHECKING ALIGNMENT - if( CFonts.ALIGNMENT.indexOf( CFonts.OPTIONS.align ) === -1 ) { - CFonts.log.error( - `"${Chalk.red( CFonts.OPTIONS.align )}" is not a valid alignment option.\n` + - `Please use an alignment option from the supported stack:\n${Chalk.green(`[ ${CFonts.ALIGNMENT.join(' | ')} ]`)}` - ); +/** + * Filter only allowed character + * + * @param {string} INPUT - The input text to be filtered + * @param {array} chars - An array of all allowed characters + * + * @return {string} - The filtered input text + */ +const CleanInput = ( INPUT, chars = CHARS ) => { + const clean = INPUT + .split('') + .filter( char => chars.includes( char.toUpperCase() ) ) + .join(''); - process.exit(1); //exit program with failure code - } + return clean; +}; - //DEBUG - if( CFonts.DEBUG ) { //log options - let outOption = `OPTIONS:\n Text: ${INPUT}`; +/** + * Merge user settings with default options + * + * @param {SETTINGS} SETTINGS - Some or all of the allowed settings + * + * @typedef {object} SETTINGS + * @param {string} font - Font face, Default 'block' + * @param {string} align - Text alignment, Default: 'left' + * @param {array} colors - Colors for font, Default: [] + * @param {string} background - Chalk color string for background, Default 'Black' + * @param {integer} letterSpacing - Space between letters, Default: set by selected font face + * @param {integer} lineHeight - Space between lines, Default: 1 + * @param {boolean} space - Output space before and after output, Default: true + * @param {integer} maxLength - Maximum amount of characters per line, Default width of console window + * + * @return {object} - Our merged options + */ +const GetOptions = ({ font, align, colors, background, backgroundColor, letterSpacing, lineHeight, space, maxLength }) => ({ + font: font || 'block', + align: align || 'left', + colors: colors || [], + background: background || backgroundColor || 'transparent', + letterSpacing: letterSpacing === undefined ? 1 : letterSpacing, + lineHeight: lineHeight === undefined ? 1 : parseInt( lineHeight ), + space: space === undefined ? true : space, + maxLength: maxLength || 0, +}); + + +/** + * Main method to get the ANSI output for a string + * + * @param {string} input - The string you want to write out + * @param {object} SETTINGS - Settings object + * @param {object} size - The size of the terminal as an object, default: Size + * @param {integer} size.width - The width of the terminal + * @param {integer} size.height - The height of the terminal + * + * @typedef {object} ReturnObject + * @property {string} string - The pure string for output with all line breaks + * @property {array} array - Each line of output in an array + * @property {integer} lines - The number of lines + * @property {object} options - All options used + * + * @return {ReturnObject} - CLI output of INPUT to be consoled out + */ +const Render = ( input, SETTINGS = {}, size = Size ) => { + Debugging.report(`Running render`, 1); + + const INPUT = CleanInput( input, CHARS ); + let output = []; // for output where each line is an output line + let lines = 0; // for counting each line + let FONTFACE = {}; // scoping the fontface object higher for fonts with just one color + const OPTIONS = GetOptions( SETTINGS ); + + const _isGoodHuman = CheckInput( INPUT, OPTIONS.font, OPTIONS.colors, OPTIONS.background, OPTIONS.align ); + if( !_isGoodHuman.pass ) { + Log.error( _isGoodHuman.message ); + + process.exit(1); // exit program with failure code + } - for( let key in CFonts.OPTIONS ) { - outOption += `\n Options.${key}: ${CFonts.OPTIONS[ key ]}`; - } - CFonts.debugging.report( outOption, 2 ); - } + // display an overview of options if debug flag is enabled + if( DEBUG ) { + let outOption = `OPTIONS:\n Text: ${ INPUT }`; + for( let key in OPTIONS ) { + outOption += `\n Options.${ key }: ${ OPTIONS[ key ] }`; + } - if( CFonts.OPTIONS.font === 'console' ) { //console fontface is pretty easy to process - let outputLines = INPUT.replace('\\', '').split('|'); //remove escape characters and split into each line + Debugging.report( outOption, 2 ); + } - CFonts.FONTFACE.colors = 1; //console defaults - CFonts.FONTFACE.lines = 1; - for(let line in outputLines) { //each line needs to be pushed into the output array - lines += Math.ceil( outputLines[ line ].length / WinSize.width ); //count each line even when they overflow + if( OPTIONS.font === 'console' ) { // console fontface is pretty easy to process + FONTFACE = { + colors: 1, + lines: 1, + }; - if( CFonts.OPTIONS.colors[0] === "candy" ) { //if the color is candy - let character = ''; + const consoleOutput = RenderConsole( INPUT, OPTIONS, size ); - for(let i = 0; i < outputLines[ line ].length; i++) { //iterate through the message - character += Colorize( outputLines[ line ][ i ] ); //and colorize each character individually - } + output = consoleOutput.output; + lines = consoleOutput.lines; + } + else { // all other fontfaces need the font-file and some more work + FONTFACE = GetFont( OPTIONS.font ); - output.push( character ); //push each line to the output array - } - else { - output.push( Colorize( outputLines[ line ] ) ); //colorize line - } + if( !FONTFACE ) { + Log.error( `Font file for "${ font }" could not be found.\nTry reinstalling this package.` ); + + process.exit( 1 ); + } - output = AlignText( output, outputLines[ line ].length ); //calculate alignment based on lineLength + // setting the letterspacing preference from font face if there is no user overwrite + if( SETTINGS.letterSpacing === undefined ) { + Debugging.report( `Looking up letter spacing from font face`, 1 ); + + let width = 0; + + for( let i in FONTFACE.letterspace ) { + let char = FONTFACE.letterspace[ i ].replace( /(<([^>]+)>)/ig, '' ); // get character and strip color infos + + if( width < char.length ) { + width = char.length; } } - else { //all other fontfaces need the font-file and some more work - GetFont( CFonts.OPTIONS.font ); //get fontface object and make it global - //setting the letterspacing preference from font face if there is no user overwrite - if( SETTINGS.letterSpacing === undefined ) { - CFonts.debugging.report(`Looking up letter spacing from font face`, 1); + Debugging.report(`Letter spacing set to font face default: "${ width }"`, 2); + OPTIONS.letterSpacing = width; + } - let width = 0; + let lineLength = CharLength( FONTFACE.buffer, FONTFACE.lines, OPTIONS ); // count each output character per line and start with the buffer + let maxChars = 0; // count each character we print for maxLength option - for( let i in CFonts.FONTFACE.letterspace ) { - let char = CFonts.FONTFACE.letterspace[ i ].replace(/(<([^>]+)>)/ig, ''); //get character and strip color infos + output = AddLine( [], FONTFACE.lines, FONTFACE.buffer, OPTIONS.lineHeight ); // create first lines with buffer + lines ++; - if( width < char.length ) { - width = char.length; - } - } + output = AddLetterSpacing( output, FONTFACE.lines, FONTFACE.letterspace, FONTFACE.colors, OPTIONS.colors, OPTIONS.letterSpacing ); // add letter spacing to the beginning + lineLength += CharLength( FONTFACE.letterspace, FONTFACE.lines, OPTIONS ) * OPTIONS.letterSpacing; // count the space for the letter spacing - CFonts.debugging.report(`Letter spacing set to font face default: "${width}"`, 2); - CFonts.OPTIONS.letterSpacing = width; - } + for( let i = 0; i < INPUT.length; i++ ) { // iterate through the message - let lineLength = CharLength( CFonts.FONTFACE.buffer ); //count each output character per line and start with the buffer - let maxChars = 0; //count each character we print for maxLength option + let CHAR = INPUT.charAt( i ).toUpperCase(); // the current character we convert, only upper case is supported at this time - output = AddLine( [] ); //create first lines with buffer - lines ++; + if( FONTFACE.chars[ CHAR ] === undefined && CHAR !== `|` ) { // make sure this character exists in the font + Debugging.error(`Character not found in font: "${ CHAR }"`, 2); // fail silently + } + else { + Debugging.report(`Character found in font: "${ CHAR }"`, 2); - output = AddLetterSpacing( output ); //add letter spacing to the beginning - lineLength += CharLength( CFonts.FONTFACE.letterspace ) * CFonts.OPTIONS.letterSpacing; //count the space for the letter spacing + let lastLineLength = lineLength; // we need the lineLength for alignment before we look up if the next char fits - for(let i = 0; i < INPUT.length; i++) { //iterate through the message + if( CHAR !== `|` ) { // what will the line length be if we add the next char? + lineLength += CharLength( FONTFACE.chars[ CHAR ], FONTFACE.lines, OPTIONS ); // get the length of this character + lineLength += CharLength( FONTFACE.letterspace, FONTFACE.lines, OPTIONS ) * OPTIONS.letterSpacing; // new line, new line length + } - let CHAR = INPUT.charAt( i ).toUpperCase(); //the current character we convert, only upper case is supported at this time + // jump to next line after OPTIONS.maxLength characters or when line break is found or the console windows would have ran out of space + if( maxChars >= OPTIONS.maxLength && OPTIONS.maxLength != 0 || CHAR === `|` || lineLength > size.width ) { + lines ++; - if( CFonts.FONTFACE.chars[ CHAR ] === undefined && CHAR !== `|` ) { //make sure this character exists in the font - CFonts.debugging.error(`Character not found in font: "${CHAR}"`, 2); //fail silently - } - else { - CFonts.debugging.report(`Character found in font: "${CHAR}"`, 2); - - let lastLineLength = lineLength; //we need the lineLength for alignment before we look up if the next char fits - - if( CHAR !== `|` ) { //what will the line length be if we add the next char? - lineLength += CharLength( CFonts.FONTFACE.chars[ CHAR ] ); //get the length of this character - lineLength += CharLength( CFonts.FONTFACE.letterspace ) * CFonts.OPTIONS.letterSpacing; //new line, new line length - } - - //jump to next line after OPTIONS.maxLength characters or when line break is found or the console windows would has ran out of space - if(maxChars >= CFonts.OPTIONS.maxLength && CFonts.OPTIONS.maxLength != 0 || CHAR === `|` || lineLength > WinSize.width) { - lines ++; - - CFonts.debugging.report( - `NEWLINE: maxChars: ${maxChars}, ` + - `CFonts.OPTIONS.maxLength: ${CFonts.OPTIONS.maxLength}, ` + - `CHAR: ${CHAR}, ` + - `lineLength: ${lineLength}, ` + - `WinSize.width: ${WinSize.width} `, 2 - ); - - output = AlignText( output, lastLineLength ); //calculate alignment based on lineLength - - lineLength = CharLength( CFonts.FONTFACE.buffer ); //new line: new line length - lineLength += CharLength( CFonts.FONTFACE.letterspace ) * CFonts.OPTIONS.letterSpacing; //each new line starts with letter spacing - if( CHAR !== `|` ) { //if this is a character - lineLength += CharLength( CFonts.FONTFACE.chars[ CHAR ] ); //get the length of this character - lineLength += CharLength( CFonts.FONTFACE.letterspace ) * CFonts.OPTIONS.letterSpacing; //add letter spacing at the end - } - maxChars = 0; //new line, new maxLength goal - - output = AddLine( output ); //adding new line - output = AddLetterSpacing( output ); //add letter spacing to the beginning - } - - CFonts.debugging.report(`lineLength at: "${lineLength}"`, 2); - - if( CHAR !== `|` ) { - maxChars++; //counting all printed characters - output = AddChar( CHAR, output ); //add new character - output = AddLetterSpacing( output ); //add letter spacing - } + Debugging.report( + `NEWLINE: maxChars: ${ maxChars }, ` + + `OPTIONS.maxLength: ${ OPTIONS.maxLength }, ` + + `CHAR: ${ CHAR }, ` + + `lineLength: ${ lineLength }, ` + + `Size.width: ${ size.width } `, 2 + ); + + output = AlignText( output, lastLineLength, FONTFACE.lines, OPTIONS.align, size ); // calculate alignment based on lineLength + + lineLength = CharLength( FONTFACE.buffer, FONTFACE.lines, OPTIONS ); // new line: new line length + lineLength += CharLength( FONTFACE.letterspace, FONTFACE.lines, OPTIONS ) * OPTIONS.letterSpacing; // each new line starts with letter spacing + + if( CHAR !== `|` ) { // if this is a character and not a line break + lineLength += CharLength( FONTFACE.chars[ CHAR ], FONTFACE.lines, OPTIONS ); // get the length of this character + lineLength += CharLength( FONTFACE.letterspace, FONTFACE.lines, OPTIONS ) * OPTIONS.letterSpacing; // add letter spacing at the end } + + maxChars = 0; // new line, new maxLength goal + + output = AddLine( output, FONTFACE.lines, FONTFACE.buffer, OPTIONS.lineHeight ); // adding new line + // add letter spacing to the beginning + output = AddLetterSpacing( output, FONTFACE.lines, FONTFACE.letterspace, FONTFACE.colors, OPTIONS.colors, OPTIONS.letterSpacing ); } - output = AlignText( output, lineLength ); //alignment last line + Debugging.report(`lineLength at: "${ lineLength }"`, 2); + + if( CHAR !== `|` ) { + maxChars++; // counting all printed characters + output = AddChar( CHAR, output, FONTFACE.lines, FONTFACE.chars, FONTFACE.colors, OPTIONS.colors ); // add new character + output = AddLetterSpacing( output, FONTFACE.lines, FONTFACE.letterspace, FONTFACE.colors, OPTIONS.colors, OPTIONS.letterSpacing ); + } } + } - write = output.join(`\n`); //convert to a string + output = AlignText( output, lineLength, FONTFACE.lines, OPTIONS.align, size ); // alignment last line + } + let write = output.join(`\n`); - if( CFonts.FONTFACE.colors <= 1 ) { //add text color if only one - write = Colorize( write ); - } + if( FONTFACE.colors <= 1 ) { + write = Colorize( write, FONTFACE.colors, OPTIONS.colors ); + } - if( CFonts.OPTIONS.space ) { //add space - write = `\n\n` + write + `\n\n`; - } + if( OPTIONS.space ) { // add space + write = `\n\n${ write }\n\n`; + } - if( CFonts.OPTIONS.background !== 'transparent' ) { - const bgcolor = `bg${ ChangeCase.upperCaseFirst( CFonts.OPTIONS.background ) }`; - write = AnsiSytle[ bgcolor ].open + '\n' + write + AnsiSytle[ bgcolor ].close; //result in one string with background - } + if( OPTIONS.background !== 'transparent' ) { + const bgcolor = `bg${ ChangeCase.upperCaseFirst( OPTIONS.background ) }`; + write = AnsiSytle[ bgcolor ].open + '\n' + write + AnsiSytle[ bgcolor ].close; // result in one string with background + } - return { - string: write, - array: output, - lines: lines, - options: CFonts.OPTIONS, - } - }, - - -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Public function -// say, print to console -// -// @param same as render method -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - say: ( INPUT = '', SETTINGS = {} ) => { - CFonts.debugging.report(`Running say`, 1); - - let write = CFonts.render( INPUT, SETTINGS ); - - console.log( write.string ); //write out - }, - - -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Debugging prettiness -// -// debugging, Print debug message that will be logged to console. -// -// @method headline Return a headline preferably at the beginning of your app -// @param [text] {string} The sting you want to log -// @param [level] {integer} (optional) The debug level. Show equal and greater levels. Default: 99 -// @return [ansi] {output} -// -// @method report Return a message to report starting a process -// @param [text] {string} The sting you want to log -// @param [level] {integer} (optional) The debug level. Show equal and greater levels. Default: 99 -// @return [ansi] {output} -// -// @method error Return a message to report an error -// @param [text] {string} The sting you want to log -// @param [level] {integer} (optional) The debug level. Show equal and greater levels. Default: 99 -// @return [ansi] {output} -// -// @method interaction Return a message to report an interaction -// @param [text] {string} The sting you want to log -// @param [level] {integer} (optional) The debug level. Show equal and greater levels. Default: 99 -// @return [ansi] {output} -// -// @method send Return a message to report data has been sent -// @param [text] {string} The sting you want to log -// @param [level] {integer} (optional) The debug level. Show equal and greater levels. Default: 99 -// @return [ansi] {output} -// -// @method received Return a message to report data has been received -// @param [text] {string} The sting you want to log -// @param [level] {integer} (optional) The debug level. Show equal and greater levels. Default: 99 -// @return [ansi] {output} -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - debugging: { - - headline: ( text, level = 99 ) => { - if( CFonts.DEBUG && level >= CFonts.DEBUGLEVEL ) { - console.log( - Chalk.bgWhite(`\n${Chalk.bold(' \u2611 ')} ${text}`) - ); - } - }, - report: ( text, level = 99 ) => { - if( CFonts.DEBUG && level >= CFonts.DEBUGLEVEL ) { - console.log( - Chalk.bgWhite(`\n${Chalk.bold.green(' \u2611 ')} ${Chalk.black(`${text} `)}`) - ); - } - }, + return { + string: write, + array: output, + lines: lines, + options: OPTIONS, + } +}; - error: ( text, level = 99 ) => { - if( CFonts.DEBUG && level >= CFonts.DEBUGLEVEL ) { - console.log( - Chalk.bgWhite(`\n${Chalk.red(' \u2612 ')} ${Chalk.black(`${text} `)}`) - ); - } - }, - interaction: ( text, level = 99 ) => { - if( CFonts.DEBUG && level >= CFonts.DEBUGLEVEL ) { - console.log( - Chalk.bgWhite(`\n${Chalk.blue(' \u261C ')} ${Chalk.black(`${text} `)}`) - ); - } - }, +/** + * Print to console + * + * @param same as render method + */ +const Say = ( INPUT, SETTINGS = {} ) => { + Debugging.report(`Running say`, 1); - send: ( text, level = 99 ) => { - if( CFonts.DEBUG && level >= CFonts.DEBUGLEVEL ) { - console.log( - Chalk.bgWhite(`\n${Chalk.bold.cyan(' \u219D ')} ${Chalk.black(`${text} `)}`) - ); - } - }, + let write = Render( INPUT, SETTINGS ); - received: ( text, level = 99 ) => { - if( CFonts.DEBUG && level >= CFonts.DEBUGLEVEL ) { - console.log( - Chalk.bgWhite(`\n${Chalk.bold.cyan(' \u219C ')} ${Chalk.black(`${text} `)}`) - ); - } - } - }, - - -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Logging prettiness -// -// log, Print error message to console. -// -// @method error Log an error out to the user -// @param [text] {string} The sting you want to log -// @return [ansi] {output} -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- - log: { - error: ( text ) => { - text = text.replace(/(?:\r\n|\r|\n)/g, '\n '); //indent each line - - console.log(`\n ${Chalk.bold.red('Ouch:')} ${text}\n`); - }, - }, - } + console.log( write.string ); // write out +}; + + +/** + * Debugging prettiness + * + * @type {object} + */ +const Debugging = { + /** + * Return a headline preferably at the beginning of your app + * + * @param {string} text - The sting you want to log + * @param {integer} level - The debug level. Show equal and greater levels. Default: 99 + */ + headline: ( text, level = 99, debug = DEBUG, debuglevel = DEBUGLEVEL ) => { + if( debug && level >= debuglevel ) { + console.log( + Chalk.bgWhite(`\n${ Chalk.bold(' \u2611 ') } ${ text }`) + ); + } + }, + + /** + * Return a message to report starting a process + * + * @param {string} text - The sting you want to log + * @param {integer} level - The debug level. Show equal and greater levels. Default: 99 + */ + report: ( text, level = 99, debug = DEBUG, debuglevel = DEBUGLEVEL ) => { + if( debug && level >= debuglevel ) { + console.log( + Chalk.bgWhite(`\n${ Chalk.bold.green(' \u2611 ') } ${ Chalk.black(`${ text } `) }`) + ); + } + }, + + /** + * Return a message to report an error + * + * @param {string} text - The sting you want to log + * @param {integer} level - The debug level. Show equal and greater levels. Default: 99 + */ + error: ( text, level = 99, debug = DEBUG, debuglevel = DEBUGLEVEL ) => { + if( debug && level >= debuglevel ) { + console.error( + Chalk.bgWhite(`\n${ Chalk.red(' \u2612 ') } ${ Chalk.black(`${ text } `) }`) + ); + } + }, +}; -})(); + +/** + * Logging prettiness + * + * @type {object} + */ +const Log = { + /** + * Print error message to console. + * + * @param {string} text - The sting you want to log + */ + error: ( text ) => { + text = text.replace( /(?:\r\n|\r|\n)/g, '\n ' ); // indent each line + + console.error(`\n ${ Chalk.bold.red('Ouch:') } ${ text }\n`); + }, +}; -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- // Module export -//-------------------------------------------------------------------------------------------------------------------------------------------------------------- -module.exports = CFonts; \ No newline at end of file +module.exports = exports = { + render: Render, + say: Say, + DEBUG, + DEBUGLEVEL, + CHARS, + COLORS, + BGCOLORS, + ALIGNMENT, + FONTFACES, + Debugging, + Log, + + __test__: { + GetFont, + CharLength, + AddLine, + AnsiSytle, + Colorize, + AddChar, + AddLetterSpacing, + Size, + AlignText, + CheckInput, + RenderConsole, + CleanInput, + GetOptions, + }, +}; \ No newline at end of file diff --git a/test/addchar.spec.js b/test/addchar.spec.js new file mode 100644 index 00000000..fcec40a2 --- /dev/null +++ b/test/addchar.spec.js @@ -0,0 +1,78 @@ +/*************************************************************************************************************************************************************** + * + * AddChar unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const AddChar = CFonts.__test__.AddChar; + + +test(`AddChar - Add a single line letter without color`, () => { + const fontChars = { + A: [ + 'A', + ], + }; + + expect( AddChar( 'A', [''], 1, fontChars, 1, [] ) ).toEqual( ['A'] ); +}); + +test(`AddChar - Add a single line letter with color`, () => { + const fontChars = { + A: [ + 'A', + ], + }; + + expect( AddChar( 'A', [''], 1, fontChars, 1, ['red'] ) ).toEqual( ['\u001b[31mA\u001b[39m'] ); +}); + +test(`AddChar - Add a multi line letter without color`, () => { + const fontChars = { + A: [ + ',-,', + '|-|', + '| |', + ], + }; + + expect( AddChar( 'A', ['','',''], 3, fontChars, 1, [] ) ).toEqual( fontChars.A ); +}); + +test(`AddChar - Add a multi line letter with color`, () => { + const fontChars = { + A: [ + ',-,', + '|-|', + '| |', + ], + }; + + const result = [ + '\u001b[31m,-,\u001b[39m', + '\u001b[31m|-|\u001b[39m', + '\u001b[31m| |\u001b[39m', + ]; + + expect( AddChar( 'A', ['','',''], 3, fontChars, 1, ['red'] ) ).toEqual( result ); +}); + +test(`AddChar - Add a multi line letter with multiple colors`, () => { + const fontChars = { + A: [ + ',-,', + '|-|', + '| |', + ], + }; + + const result = [ + ',\u001b[31m-\u001b[39m,', + '|-|', + '| \u001b[31m|\u001b[39m', + ]; + + expect( AddChar( 'A', ['','',''], 3, fontChars, 2, ['red', 'red'] ) ).toEqual( result ); +}); diff --git a/test/addletterspacing.spec.js b/test/addletterspacing.spec.js new file mode 100644 index 00000000..cbd70b8f --- /dev/null +++ b/test/addletterspacing.spec.js @@ -0,0 +1,48 @@ +/*************************************************************************************************************************************************************** + * + * AddLetterSpacing unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const AddLetterSpacing = CFonts.__test__.AddLetterSpacing; + + +test(`AddLetterSpacing - Add a letter space to the last line for single line font`, () => { + expect( AddLetterSpacing( ['','',''], 1, [' '], 1, [], 1 ) ).toEqual( ['','',' '] ); +}); + +test(`AddLetterSpacing - Add a letter space to the last line for single line font with one color`, () => { + expect( AddLetterSpacing( ['','',''], 1, [' '], 1, ['red'], 1 ) ).toEqual( ['','','\u001b[31m \u001b[39m'] ); +}); + +test(`AddLetterSpacing - Add a letter space to the last line for single line font with multiple colors`, () => { + expect( AddLetterSpacing( ['','',''], 1, [' '], 2, ['red', 'red'], 1 ) ).toEqual( ['','','\u001b[31m \u001b[39m'] ); + expect( AddLetterSpacing( ['','',''], 1, ['#'], 2, ['red', 'red'], 1 ) ).toEqual( ['','','\u001b[31m#\u001b[39m'] ); +}); + + +test(`AddLetterSpacing - Add a letter space to the last line for multiple line font`, () => { + expect( AddLetterSpacing( ['','','','','',''], 3, [' ',' ',' '], 1, [], 1 ) ).toEqual( ['','','',' ',' ',' '] ); + expect( AddLetterSpacing( ['','','','','',''], 3, ['_','_','_'], 1, [], 1 ) ).toEqual( ['','','','_','_','_'] ); +}); + +test(`AddLetterSpacing - Add a letter space to the last line for multiple line font with one color`, () => { + expect( AddLetterSpacing( ['','','','','',''], 3, [' ',' ',' '], 1, ['red'], 1 ) ) + .toEqual( ['','','','\u001b[31m \u001b[39m','\u001b[31m \u001b[39m','\u001b[31m \u001b[39m'] ); + expect( AddLetterSpacing( ['','','','','',''], 3, ['_','_','_'], 1, ['red'], 1 ) ) + .toEqual( ['','','','\u001b[31m_\u001b[39m','\u001b[31m_\u001b[39m','\u001b[31m_\u001b[39m'] ); +}); + +test(`AddLetterSpacing - Add a letter space to the last line for multiple line font with multiple colors`, () => { + expect( AddLetterSpacing( ['','','','','',''], 3, [' ',' ',' '], 2, ['red', 'red'], 1 ) ) + .toEqual( ['','','','\u001b[31m \u001b[39m','\u001b[31m \u001b[39m','\u001b[31m \u001b[39m'] ); + expect( AddLetterSpacing( ['','','','','',''], 3, [' ',' ',' '], 2, ['red', 'red'], 1 ) ) + .toEqual( ['','','','\u001b[31m \u001b[39m','\u001b[31m \u001b[39m','\u001b[31m \u001b[39m'] ); + + expect( AddLetterSpacing( ['','','','','',''], 3, ['_','_','_'], 2, ['red', 'red'], 1 ) ) + .toEqual( ['','','','\u001b[31m_\u001b[39m','\u001b[31m_\u001b[39m','\u001b[31m_\u001b[39m'] ); + expect( AddLetterSpacing( ['','','','','',''], 3, ['_','_','_'], 2, ['red', 'red'], 1 ) ) + .toEqual( ['','','','\u001b[31m_\u001b[39m','\u001b[31m_\u001b[39m','\u001b[31m_\u001b[39m'] ); +}); diff --git a/test/addline.spec.js b/test/addline.spec.js new file mode 100644 index 00000000..d3a18109 --- /dev/null +++ b/test/addline.spec.js @@ -0,0 +1,33 @@ +/*************************************************************************************************************************************************************** + * + * AddLine unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const AddLine = CFonts.__test__.AddLine; + + +test(`AddLine - Adding a line to a single-line font`, () => { + const input = [ + 'line 1', + 'line 2', + ]; + + expect( AddLine( [ ...input ], 1, [''], 0 ) ).toEqual( [ ...input, '' ] ); + expect( AddLine( [ ...input ], 1, [''], 1 ) ).toEqual( [ ...input, '', '' ] ); + expect( AddLine( [ ...input ], 1, [''], 5 ) ).toEqual( [ ...input, '', '', '', '', '', '' ] ); +}); + +test(`AddLine - Adding a line to a multi-line font`, () => { + const input = [ + ',-, ,-,', + '|-| |-}', + '| | |_}', + ]; + + expect( AddLine( [ ...input ], 3, ['', '', ''], 0 ) ).toEqual( [ ...input, '', '', '' ] ); + expect( AddLine( [ ...input ], 3, ['', '', ''], 1 ) ).toEqual( [ ...input, '', '', '', '' ] ); + expect( AddLine( [ ...input ], 3, ['', '', ''], 10 ) ).toEqual( [ ...input, '', '', '', '', '', '', '', '', '', '', '', '', '' ] ); +}); diff --git a/test/aligntext.spec.js b/test/aligntext.spec.js new file mode 100644 index 00000000..94b811da --- /dev/null +++ b/test/aligntext.spec.js @@ -0,0 +1,24 @@ +/*************************************************************************************************************************************************************** + * + * AlignText unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const AlignText = CFonts.__test__.AlignText; + + +test(`AlignText - Should align text in the center`, () => { + expect( AlignText( ['x'], 1, 1, 'center', { width: 21 } ) ).toEqual( [' x'] ); + expect( AlignText( ['x'], 1, 1, 'center', { width: 1 } ) ).toEqual( ['x'] ); +}); + +test(`AlignText - Should align text on the right`, () => { + expect( AlignText( ['x'], 1, 1, 'right', { width: 11 } ) ).toEqual( [' x'] ); + expect( AlignText( ['x'], 1, 1, 'right', { width: 1 } ) ).toEqual( ['x'] ); +}); + +test(`AlignText - Should do nothing on left alignment`, () => { + expect( AlignText( ['x'], 1, 1, 'left', { width: 11 } ) ).toEqual( ['x'] ); +}); diff --git a/test/ansisytle.spec.js b/test/ansisytle.spec.js new file mode 100644 index 00000000..e02f7107 --- /dev/null +++ b/test/ansisytle.spec.js @@ -0,0 +1,22 @@ +/*************************************************************************************************************************************************************** + * + * AnsiSytle unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const AnsiSytle = CFonts.__test__.AnsiSytle; + + +test(`AnsiSytle - Has a bunch of keys`, () => { + expect( Object.keys( AnsiSytle ).length ).toEqual( 42 ); +}); + +test(`AnsiSytle - Includes the system key`, () => { + expect( Object.keys( AnsiSytle ).includes('system') ).toEqual( true ); +}); + +test(`AnsiSytle - The system key contains open and close`, () => { + expect( Object.keys( AnsiSytle['system'] ) ).toEqual( [ 'open', 'close' ] ); +}); diff --git a/test/apitest.js b/test/apitest.js index bb264c0f..3c248d89 100644 --- a/test/apitest.js +++ b/test/apitest.js @@ -16,7 +16,7 @@ //-------------------------------------------------------------------------------------------------------------------------------------------------------------- // Dependencies //-------------------------------------------------------------------------------------------------------------------------------------------------------------- -const CFonts = require('../index'); +const CFonts = require('../lib/index.js'); let prettyFont = CFonts.render('H', { font: 'simple', diff --git a/test/charlength.spec.js b/test/charlength.spec.js new file mode 100644 index 00000000..10c36d5e --- /dev/null +++ b/test/charlength.spec.js @@ -0,0 +1,32 @@ +/*************************************************************************************************************************************************************** + * + * CharLength unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const CharLength = CFonts.__test__.CharLength; + + +test(`CharLength - Should return the largest character length`, () => { + const character1 = [ '' ]; + const character2 = [ '', ' ' ]; + const character3 = [ ' ', '' ]; + const character4 = [ '', ' ', '' ]; + const character5 = [ ' ', '', ' ', '', ' ', ' ' ]; + + expect( CharLength( character1, character1.length, 0 ) ).toEqual( 0 ); + expect( CharLength( character2, character2.length, 0 ) ).toEqual( 2 ); + expect( CharLength( character3, character3.length, 0 ) ).toEqual( 6 ); + expect( CharLength( character4, character4.length, 0 ) ).toEqual( 3 ); + expect( CharLength( character5, character5.length, 0 ) ).toEqual( 12 ); + + expect( CharLength( character1, character1.length, 5 ) ).toEqual( 1 ); + expect( CharLength( character2, character2.length, 5 ) ).toEqual( 2 ); + expect( CharLength( character3, character3.length, 5 ) ).toEqual( 6 ); + expect( CharLength( character4, character4.length, 5 ) ).toEqual( 3 ); + expect( CharLength( character5, character5.length, 5 ) ).toEqual( 12 ); + + expect( CharLength( character1, character1.length, 1 ) ).toEqual( 1 ); +}); diff --git a/test/checkinput.spec.js b/test/checkinput.spec.js new file mode 100644 index 00000000..0e653bda --- /dev/null +++ b/test/checkinput.spec.js @@ -0,0 +1,53 @@ +/*************************************************************************************************************************************************************** + * + * CheckInput unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const CheckInput = CFonts.__test__.CheckInput; + + +test(`CheckInput - Should pass with correct input`, () => { + const FONTFACES = [ 'font1', 'font2', 'font3' ]; + const COLORS = [ 'color1', 'color2', 'color3' ]; + const BGCOLORS = [ 'bgcolor1', 'bgcolor2', 'bgcolor3' ]; + const ALIGNMENT = [ 'left', 'center', 'right' ]; + + expect( CheckInput( 'INPUT', 'font1', ['color1'], 'bgcolor1', 'left', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ).pass ).toEqual( true ); + expect( CheckInput( 'INPUT', 'font2', ['color2', 'candy'], 'bgcolor2', 'center', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ).pass ).toEqual( true ); + expect( CheckInput( 'INPUT', 'font3', ['color3'], 'bgcolor3', 'right', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ).pass ).toEqual( true ); + expect( CheckInput( 'INPUT', 'font3', ['candy'], 'bgcolor3', 'right', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ).pass ).toEqual( true ); +}); + +test(`CheckInput - Should fail with wrong input`, () => { + const FONTFACES = [ 'font1', 'font2', 'font3' ]; + const COLORS = [ 'color1', 'color2', 'color3' ]; + const BGCOLORS = [ 'bgcolor1', 'bgcolor2', 'bgcolor3' ]; + const ALIGNMENT = [ 'left', 'center', 'right' ]; + + const fail = CheckInput( undefined, 'font1', ['color1'], 'bgcolor1', 'left', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ); + expect( fail.pass ).toEqual( false ); + expect( fail.message.length > 0 ).toEqual( true ); + + const fail0 = CheckInput( '', 'font1', ['color1'], 'bgcolor1', 'left', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ); + expect( fail0.pass ).toEqual( false ); + expect( fail0.message.length > 0 ).toEqual( true ); + + const fail1 = CheckInput( 'INPUT', 'notfound', ['color1'], 'bgcolor1', 'left', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ); + expect( fail1.pass ).toEqual( false ); + expect( fail1.message.length > 0 ).toEqual( true ); + + const fail2 = CheckInput( 'INPUT', 'font1', ['notfound'], 'bgcolor1', 'left', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ); + expect( fail2.pass ).toEqual( false ); + expect( fail2.message.length > 0 ).toEqual( true ); + + const fail3 = CheckInput( 'INPUT', 'font1', ['color1'], 'notfound', 'left', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ); + expect( fail3.pass ).toEqual( false ); + expect( fail3.message.length > 0 ).toEqual( true ); + + const fail4 = CheckInput( 'INPUT', 'font1', ['color1'], 'bgcolor1', 'notfound', FONTFACES, COLORS, BGCOLORS, ALIGNMENT ); + expect( fail4.pass ).toEqual( false ); + expect( fail4.message.length > 0 ).toEqual( true ); +}); diff --git a/test/cleaninput.spec.js b/test/cleaninput.spec.js new file mode 100644 index 00000000..5ff4527c --- /dev/null +++ b/test/cleaninput.spec.js @@ -0,0 +1,24 @@ +/*************************************************************************************************************************************************************** + * + * CleanInput unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const CleanInput = CFonts.__test__.CleanInput; +const CHARS = CFonts.CHARS; + + +test(`CleanInput - Should white list characters`, () => { + expect( CleanInput( 'abcd', ['A','B','C'] ) ).toEqual( 'abc' ); + expect( CleanInput( 'abdc', ['A','B','C'] ) ).toEqual( 'abc' ); + expect( CleanInput( 'ab c', ['A','B','C'] ) ).toEqual( 'abc' ); + expect( CleanInput( 'abc', ['A','B','C'] ) ).toEqual( 'abc' ); + expect( CleanInput( 'abc•', ['A','B','C'] ) ).toEqual( 'abc' ); + expect( CleanInput( ' abc', ['A','B','C'] ) ).toEqual( 'abc' ); +}); + +test(`CleanInput - Should keep all letters that are allowed`, () => { + expect( CleanInput( CHARS.join(' ') ) ).toEqual( CHARS.join(' ') ); +}); diff --git a/test/colorize.spec.js b/test/colorize.spec.js new file mode 100644 index 00000000..8cc52290 --- /dev/null +++ b/test/colorize.spec.js @@ -0,0 +1,32 @@ +/*************************************************************************************************************************************************************** + * + * Colorize unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const Colorize = CFonts.__test__.Colorize; + + +test(`Colorize - An undefined string will return just that`, () => { + expect( Colorize( undefined, 1, [] ) ).toEqual( undefined ); +}); + +test(`Colorize - Strings without color wont change`, () => { + const test = 'test string without color placeholders'; + + expect( Colorize( test, 1, [] ) ).toEqual( test ); +}); + +test(`Colorize - Strings with one color are replaced`, () => { + const test = 'test string with one color placeholders'; + + expect( Colorize( test, 1, ['red'] ) ).toEqual('\u001b[31mtest string with one color placeholders\u001b[39m'); +}); + +test(`Colorize - Strings with two colors are replaced`, () => { + const test = 'test string with one color placeholders'; + + expect( Colorize( test, 2, ['red', 'red'] ) ).toEqual('test string \u001b[31mwith\u001b[39m one \u001b[31mcolor\u001b[39m placeholders'); +}); diff --git a/test/debugging.spec.js b/test/debugging.spec.js new file mode 100644 index 00000000..054b5d56 --- /dev/null +++ b/test/debugging.spec.js @@ -0,0 +1,76 @@ +/*************************************************************************************************************************************************************** + * + * Debugging unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const Debugging = CFonts.Debugging; + + +const StripColor = ( text ) => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); + const ansi = new RegExp(pattern, 'g'); + + if( typeof text === 'string' ) { + return text.replace( ansi, '' ); + } + else { + return text; + } +}; + + +test(`Debugging - Show headline message when debug is enabled`, () => { + console.log = jest.fn(); + + Debugging.headline( 'text', 1, true, 1 ); + + expect( console.log.mock.calls[0][0] ).toBe( '\u001b[47m\u001b[49m\n\u001b[47m\u001b[1m ☑ \u001b[22m text\u001b[49m' ); +}); + + +test(`Debugging - Show report message when debug is enabled`, () => { + console.log = jest.fn(); + + Debugging.report( 'text', 1, true, 1 ); + + expect( console.log.mock.calls[0][0] ) + .toBe( '\u001b[47m\u001b[49m\n\u001b[47m\u001b[1m\u001b[32m ☑ \u001b[39m\u001b[22m \u001b[30mtext \u001b[39m\u001b[49m' ); +}); + + +test(`Debugging - Show error message when debug is enabled`, () => { + console.error = jest.fn(); + + Debugging.error( 'text', 1, true, 1 ); + + expect( console.error.mock.calls[0][0] ) + .toBe( '\u001b[47m\u001b[49m\n\u001b[47m\u001b[31m ☒ \u001b[39m \u001b[30mtext \u001b[39m\u001b[49m' ); +}); + + +test(`Debugging - Don’t show message when debug is disabled`, () => { + console.log = jest.fn(); + + Debugging.headline( 'text', 1, false, 1 ); + Debugging.report( 'text', 1, false, 1 ); + Debugging.error( 'text', 1, false, 1 ); + + expect( console.log.mock.calls.length ).toBe( 0 ); +}); + + +test(`Debugging - Don’t show message when debuglevel is too high`, () => { + console.log = jest.fn(); + + Debugging.headline( 'text', 1, true, 2 ); + Debugging.report( 'text', 1, true, 2 ); + Debugging.error( 'text', 1, true, 2 ); + + expect( console.log.mock.calls.length ).toBe( 0 ); +}); diff --git a/test/fonttest.js b/test/fonttest.js index 39b269ec..2768e1d6 100644 --- a/test/fonttest.js +++ b/test/fonttest.js @@ -20,6 +20,7 @@ //-------------------------------------------------------------------------------------------------------------------------------------------------------------- // Dependencies //-------------------------------------------------------------------------------------------------------------------------------------------------------------- +const CFonts = require('../lib/index.js'); const WinSize = require('window-size'); const Readline = require('readline'); const Chalk = require(`chalk`); @@ -30,28 +31,16 @@ const Fs = require(`fs`); //-------------------------------------------------------------------------------------------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------------------------------------------------------------------------------------------- -const FontText = (() => { //constructor factory +const FontTest = (() => { //constructor factory return { //-------------------------------------------------------------------------------------------------------------------------------------------------------------- // settings //-------------------------------------------------------------------------------------------------------------------------------------------------------------- - DEBUG: true, //Debug mode - DEBUGLEVEL: 2, //Debug level setting - CHARS: [ //All allowed font colors - "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "!", - "?", ".", "+", "-", "_", "=", "@", "#", "$", "%", "&", "(", ")", "/", ":", ";", ",", " " - ], - FONTFACES: [ //All allowed fonts - 'block', - 'simpleBlock', - 'simple', - '3d', - 'simple3d', - 'chrome', - 'huge', - ], + DEBUG: true, + DEBUGLEVEL: 2, + CHARS: CFonts.CHARS.filter( font => font !== '|' ), // we won't have the pip in the char-set + FONTFACES: CFonts.FONTFACES.filter( font => font !== 'console' ), // console is a font but not a font-file //-------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -59,33 +48,33 @@ const FontText = (() => { //constructor factory // fonts, test each font is there //-------------------------------------------------------------------------------------------------------------------------------------------------------------- fonts: () => { - FontText.debugging.report(`Running fonts`, 1); + FontTest.debugging.report(`Running fonts`, 1); let font = ''; let fontFile = ''; let FONTFACE = {}; - for( let i in FontText.FONTFACES ) { //iterate over all installed fonts - font = FontText.FONTFACES[ i ]; + for( let i in FontTest.FONTFACES ) { //iterate over all installed fonts + font = FontTest.FONTFACES[ i ]; fontFile = Path.normalize( `${__dirname}/../fonts/${font}.json` ); //build font path - FontText.log.headline(`${font}`); + FontTest.log.headline(`${font}`); - FontText.log.check(`Checking: "${font}" existence`); + FontTest.log.check(`Checking: "${font}" existence`); try { FONTFACE = JSON.parse( Fs.readFileSync(fontFile, 'utf8') ); //read font file - FontText.log.subdone(`FOUND!`); + FontTest.log.subdone(`FOUND!`); } catch( e ) { - FontText.log.suberror(`NOT FOUND: "${fontFile}"`); + FontTest.log.suberror(`NOT FOUND: "${fontFile}"`); } - FontText.attributes( FONTFACE ); //for this font run attributes test - FontText.chars( FONTFACE ); //for this font run char test - FontText.width( FONTFACE ); //for this font run width test - FontText.lines( FONTFACE ); //for this font run line test + FontTest.attributes( FONTFACE ); //for this font run attributes test + FontTest.chars( FONTFACE ); //for this font run char test + FontTest.width( FONTFACE ); //for this font run width test + FontTest.lines( FONTFACE ); //for this font run line test } console.log(`\n`); @@ -99,8 +88,8 @@ const FontText = (() => { //constructor factory // @param FONTFACE {object} The font object to be checked //-------------------------------------------------------------------------------------------------------------------------------------------------------------- attributes: ( FONTFACE ) => { - FontText.debugging.report(`Running attributes`, 1); - FontText.log.check(`Checking font attributes of "${FONTFACE.name}"`); + FontTest.debugging.report(`Running attributes`, 1); + FontTest.log.check(`Checking font attributes of "${FONTFACE.name}"`); let fails = []; if( FONTFACE.name === undefined ) { @@ -136,10 +125,10 @@ const FontText = (() => { //constructor factory } if( fails.length > 0 ) { - FontText.log.suberror(`Font has missing attributes: "${fails.join(' ')}" in font: "${FONTFACE.name}"`); + FontTest.log.suberror(`Font has missing attributes: "${fails.join(' ')}" in font: "${FONTFACE.name}"`); } else { - FontText.log.subdone(`All THERE!`); + FontTest.log.subdone(`All THERE!`); } }, @@ -151,12 +140,12 @@ const FontText = (() => { //constructor factory // @param FONTFACE {object} The font object to be checked //-------------------------------------------------------------------------------------------------------------------------------------------------------------- chars: ( FONTFACE ) => { - FontText.debugging.report(`Running chars`, 1); - FontText.log.check(`Checking all characters in "${FONTFACE.name}"`); + FontTest.debugging.report(`Running chars`, 1); + FontTest.log.check(`Checking all characters in "${FONTFACE.name}"`); let fails = []; - for( let i in FontText.CHARS ) { //each character - let char = FontText.CHARS[ i ]; + for( let i in FontTest.CHARS ) { //each character + let char = FontTest.CHARS[ i ]; if( FONTFACE.chars[ char ] === undefined ) { fails.push( char ); @@ -164,10 +153,10 @@ const FontText = (() => { //constructor factory } if( fails.length > 0 ) { - FontText.log.suberror(`Character could not be found: "${fails.join(' ')}" in font: "${FONTFACE.name}"`); + FontTest.log.suberror(`Character could not be found: "${fails.join(' ')}" in font: "${FONTFACE.name}"`); } else { - FontText.log.subdone(`All THERE!`); + FontTest.log.subdone(`All THERE!`); } }, @@ -179,8 +168,8 @@ const FontText = (() => { //constructor factory // @param FONTFACE {object} The font object to be checked //-------------------------------------------------------------------------------------------------------------------------------------------------------------- lines: ( FONTFACE ) => { - FontText.debugging.report(`Running lines`, 1); - FontText.log.check(`Checking all character lines in "${FONTFACE.name}"`); + FontTest.debugging.report(`Running lines`, 1); + FontTest.log.check(`Checking all character lines in "${FONTFACE.name}"`); let fails = []; if( FONTFACE.buffer.length !== FONTFACE.lines ) { @@ -191,8 +180,8 @@ const FontText = (() => { //constructor factory fails.push(`letterspace`); } - for( let i in FontText.CHARS ) { //each character - let char = FontText.CHARS[ i ]; + for( let i in FontTest.CHARS ) { //each character + let char = FontTest.CHARS[ i ]; if( FONTFACE.chars[ char ] !== undefined ) { @@ -203,10 +192,10 @@ const FontText = (() => { //constructor factory } if( fails.length > 0 ) { - FontText.log.suberror(`Character lines are not correct in "${fails.join(' ')}" in font: "${FONTFACE.name}"`); + FontTest.log.suberror(`Character lines are not correct in "${fails.join(' ')}" in font: "${FONTFACE.name}"`); } else { - FontText.log.subdone(`All CORRECT!`); + FontTest.log.subdone(`All CORRECT!`); } }, @@ -218,12 +207,12 @@ const FontText = (() => { //constructor factory // @param FONTFACE {object} The font object to be checked //-------------------------------------------------------------------------------------------------------------------------------------------------------------- width: ( FONTFACE ) => { - FontText.debugging.report(`Running width`, 1); - FontText.log.check(`Checking all character widths in "${FONTFACE.name}"`); + FontTest.debugging.report(`Running width`, 1); + FontTest.log.check(`Checking all character widths in "${FONTFACE.name}"`); let fails = []; - for( let i in FontText.CHARS ) { //each character - let char = FontText.CHARS[ i ]; + for( let i in FontTest.CHARS ) { //each character + let char = FontTest.CHARS[ i ]; if( FONTFACE.chars[ char ] !== undefined ) { let character = FONTFACE.chars[ char ]; @@ -245,10 +234,10 @@ const FontText = (() => { //constructor factory } if( fails.length > 0 ) { - FontText.log.suberror(`Character width is not consistent in "${fails.join(' ')}" in font: "${FONTFACE.name}"`); + FontTest.log.suberror(`Character width is not consistent in "${fails.join(' ')}" in font: "${FONTFACE.name}"`); } else { - FontText.log.subdone(`All CONSISTENT!`); + FontTest.log.subdone(`All CONSISTENT!`); } }, @@ -291,7 +280,7 @@ const FontText = (() => { //constructor factory debugging: { headline: ( text, level = 99 ) => { - if( FontText.DEBUG && level >= FontText.DEBUGLEVEL ) { + if( FontTest.DEBUG && level >= FontTest.DEBUGLEVEL ) { console.log( Chalk.bgWhite(`\n${Chalk.bold(' \u2611 ')} ${text}`) ); @@ -299,7 +288,7 @@ const FontText = (() => { //constructor factory }, report: ( text, level = 99 ) => { - if( FontText.DEBUG && level >= FontText.DEBUGLEVEL ) { + if( FontTest.DEBUG && level >= FontTest.DEBUGLEVEL ) { console.log( Chalk.bgWhite(`\n${Chalk.bold.green(' \u2611 ')} ${Chalk.black(`${text} `)}`) ); @@ -307,7 +296,7 @@ const FontText = (() => { //constructor factory }, error: ( text, level = 99 ) => { - if( FontText.DEBUG && level >= FontText.DEBUGLEVEL ) { + if( FontTest.DEBUG && level >= FontTest.DEBUGLEVEL ) { console.log( Chalk.bgWhite(`\n${Chalk.red(' \u2612 ')} ${Chalk.black(`${text} `)}`) ); @@ -315,7 +304,7 @@ const FontText = (() => { //constructor factory }, interaction: ( text, level = 99 ) => { - if( FontText.DEBUG && level >= FontText.DEBUGLEVEL ) { + if( FontTest.DEBUG && level >= FontTest.DEBUGLEVEL ) { console.log( Chalk.bgWhite(`\n${Chalk.blue(' \u261C ')} ${Chalk.black(`${text} `)}`) ); @@ -323,7 +312,7 @@ const FontText = (() => { //constructor factory }, send: ( text, level = 99 ) => { - if( FontText.DEBUG && level >= FontText.DEBUGLEVEL ) { + if( FontTest.DEBUG && level >= FontTest.DEBUGLEVEL ) { console.log( Chalk.bgWhite(`\n${Chalk.bold.cyan(' \u219D ')} ${Chalk.black(`${text} `)}`) ); @@ -331,7 +320,7 @@ const FontText = (() => { //constructor factory }, received: ( text, level = 99 ) => { - if( FontText.DEBUG && level >= FontText.DEBUGLEVEL ) { + if( FontTest.DEBUG && level >= FontTest.DEBUGLEVEL ) { console.log( Chalk.bgWhite(`\n${Chalk.bold.cyan(' \u219C ')} ${Chalk.black(`${text} `)}`) ); @@ -402,4 +391,4 @@ const FontText = (() => { //constructor factory //-------------------------------------------------------------------------------------------------------------------------------------------------------------- -FontText.fonts(); //running the test for fonts \ No newline at end of file +FontTest.fonts(); //running the test for fonts \ No newline at end of file diff --git a/test/getfont.spec.js b/test/getfont.spec.js new file mode 100644 index 00000000..cb67bbba --- /dev/null +++ b/test/getfont.spec.js @@ -0,0 +1,33 @@ +/*************************************************************************************************************************************************************** + * + * GetFont unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const GetFont = CFonts.__test__.GetFont; + + +const fontArray = [ + 'name', + 'version', + 'homepage', + 'colors', + 'lines', + 'buffer', + 'letterspace', + 'chars', +]; + +CFonts.FONTFACES + .filter( font => font !== 'console' ) + .map( font => { + test(`GetFont - ${ font } font should exist and have the right keys`, () => { + expect( Object.keys( GetFont( font ) ) ).toEqual( fontArray ); + }); +}); + +test(`GetFont - Should return false if the font doesn’t exist`, () => { + expect( GetFont( 'does-not-exist' ) ).toEqual( false ); +}); diff --git a/test/getoptions.spec.js b/test/getoptions.spec.js new file mode 100644 index 00000000..3983a796 --- /dev/null +++ b/test/getoptions.spec.js @@ -0,0 +1,124 @@ +/*************************************************************************************************************************************************************** + * + * GetOptions unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const GetOptions = CFonts.__test__.GetOptions; + + +test(`GetOptions - Should return default options`, () => { + expect( GetOptions({}) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + +test(`GetOptions - Should merge options with defaults`, () => { + expect( GetOptions({ font: 'xxx' }) ).toEqual({ + font: 'xxx', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ align: 'xxx' }) ).toEqual({ + font: 'block', + align: 'xxx', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ colors: ['xxx'] }) ).toEqual({ + font: 'block', + align: 'left', + colors: ['xxx'], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ background: 'xxx' }) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'xxx', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ backgroundColor: 'xxx' }) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'xxx', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ letterSpacing: 555 }) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 555, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ lineHeight: 555 }) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 555, + space: true, + maxLength: 0, + }); + + expect( GetOptions({ space: false }) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: false, + maxLength: 0, + }); + + expect( GetOptions({ maxLength: 555 }) ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 555, + }); +}); diff --git a/test/log.spec.js b/test/log.spec.js new file mode 100644 index 00000000..c4390464 --- /dev/null +++ b/test/log.spec.js @@ -0,0 +1,28 @@ +/*************************************************************************************************************************************************************** + * + * Log unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const Log = CFonts.Log; + + +test(`Log - Display error message`, () => { + console.error = jest.fn(); + + Log.error( 'text' ); + + expect( console.error.mock.calls[0][0] ) + .toBe( '\n \u001b[1m\u001b[31mOuch:\u001b[39m\u001b[22m text\n' ); +}); + +test(`Log - Indent each line in error message`, () => { + console.error = jest.fn(); + + Log.error( 'text\ntext' ); + + expect( console.error.mock.calls[0][0] ) + .toBe( '\n \u001b[1m\u001b[31mOuch:\u001b[39m\u001b[22m text\n text\n' ); +}); diff --git a/test/render.spec.js b/test/render.spec.js new file mode 100644 index 00000000..dc6bdb9a --- /dev/null +++ b/test/render.spec.js @@ -0,0 +1,473 @@ +/*************************************************************************************************************************************************************** + * + * Render unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const Render = CFonts.render; + + +test(`Render - Render console string`, () => { + const test = Render( 'text', { + font: 'console', + }, { width: 100, height: 10 }); + + expect( test.string ).toBe( '\n\ntext\n\n' ); + expect( test.array ).toEqual( ['text'] ); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'console', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 0, + lineHeight: 0, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Render console string with a color`, () => { + const test = Render( 'text', { + font: 'console', + colors: ['red'], + }, { width: 100, height: 10 }); + + expect( test.string ).toBe( '\n\n\u001b[31mtext\u001b[39m\n\n' ); + expect( test.array ).toEqual( ['text'] ); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'console', + align: 'left', + colors: ['red'], + background: 'transparent', + letterSpacing: 0, + lineHeight: 0, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Render block font`, () => { + const test = Render( 'text', { width: 100, height: 10 } ); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Render letter spacing`, () => { + const test1 = Render( 'text', { + letterSpacing: 2, + }, { width: 100, height: 10 }); + + expect( test1.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test1.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test1.lines ).toBe( 1 ); + expect( test1.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 2, + lineHeight: 1, + space: true, + maxLength: 0, + }); + + + const test2 = Render( 'text', { + letterSpacing: 10, + }, { width: 100, height: 10 }); + + expect( test2.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test2.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test2.lines ).toBe( 1 ); + expect( test2.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 10, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Center align block font`, () => { + const test = Render( 'text', { + align: 'center', + }, { width: 50, height: 10 }); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'center', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Right align block font`, () => { + const test = Render( 'text', { + align: 'right', + }, { width: 50, height: 10 }); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'right', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Break into new line on smaller viewports`, () => { + const test = Render( 'text', {}, { width: 20, height: 10 }); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ \n' + + ' ██║ █████╗ \n' + + ' ██║ ██╔══╝ \n' + + ' ██║ ███████╗ \n' + + ' ╚═╝ ╚══════╝ \n\n' + + ' ██╗ ██╗ ████████╗ \n' + + ' ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ╚███╔╝ ██║ \n' + + ' ██╔██╗ ██║ \n' + + ' ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ', + ' ╚══██╔══╝ ██╔════╝ ', + ' ██║ █████╗ ', + ' ██║ ██╔══╝ ', + ' ██║ ███████╗ ', + ' ╚═╝ ╚══════╝ ', + '', + ' ██╗ ██╗ ████████╗ ', + ' ╚██╗██╔╝ ╚══██╔══╝ ', + ' ╚███╔╝ ██║ ', + ' ██╔██╗ ██║ ', + ' ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 2 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Add line break`, () => { + const test = Render( 'te|xt', {}, { width: 100, height: 10 }); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ \n' + + ' ██║ █████╗ \n' + + ' ██║ ██╔══╝ \n' + + ' ██║ ███████╗ \n' + + ' ╚═╝ ╚══════╝ \n\n' + + ' ██╗ ██╗ ████████╗ \n' + + ' ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ╚███╔╝ ██║ \n' + + ' ██╔██╗ ██║ \n' + + ' ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ', + ' ╚══██╔══╝ ██╔════╝ ', + ' ██║ █████╗ ', + ' ██║ ██╔══╝ ', + ' ██║ ███████╗ ', + ' ╚═╝ ╚══════╝ ', + '', + ' ██╗ ██╗ ████████╗ ', + ' ╚██╗██╔╝ ╚══██╔══╝ ', + ' ╚███╔╝ ██║ ', + ' ██╔██╗ ██║ ', + ' ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 2 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Add line height`, () => { + const test = Render( 'te|xt', { lineHeight: 2 }, { width: 100, height: 10 }); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ \n' + + ' ██║ █████╗ \n' + + ' ██║ ██╔══╝ \n' + + ' ██║ ███████╗ \n' + + ' ╚═╝ ╚══════╝ \n\n\n' + + ' ██╗ ██╗ ████████╗ \n' + + ' ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ╚███╔╝ ██║ \n' + + ' ██╔██╗ ██║ \n' + + ' ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ', + ' ╚══██╔══╝ ██╔════╝ ', + ' ██║ █████╗ ', + ' ██║ ██╔══╝ ', + ' ██║ ███████╗ ', + ' ╚═╝ ╚══════╝ ', + '', + '', + ' ██╗ ██╗ ████████╗ ', + ' ╚██╗██╔╝ ╚══██╔══╝ ', + ' ╚███╔╝ ██║ ', + ' ██╔██╗ ██║ ', + ' ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 2 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 2, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Non supported characters are ignored`, () => { + const test = Render( 'te*xt', {}, { width: 100, height: 10 } ); + + expect( test.string ).toBe( + '\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); + + +test(`Render - Remove space`, () => { + const test = Render( 'text', { space: false }, { width: 100, height: 10 } ); + + expect( test.string ).toBe( + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'transparent', + letterSpacing: 1, + lineHeight: 1, + space: false, + maxLength: 0, + }); +}); + + +test(`Render - Add background color`, () => { + const test = Render( 'text', { background: 'red' }, { width: 100, height: 10 } ); + + expect( test.string ).toBe( + '\u001b[41m' + + '\n\n\n' + + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ \n' + + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ \n' + + ' ██║ █████╗ ╚███╔╝ ██║ \n' + + ' ██║ ██╔══╝ ██╔██╗ ██║ \n' + + ' ██║ ███████╗ ██╔╝ ██╗ ██║ \n' + + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ \n\n' + + '\u001b[49m' + ); + expect( test.array ).toEqual([ + ' ████████╗ ███████╗ ██╗ ██╗ ████████╗ ', + ' ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝ ╚══██╔══╝ ', + ' ██║ █████╗ ╚███╔╝ ██║ ', + ' ██║ ██╔══╝ ██╔██╗ ██║ ', + ' ██║ ███████╗ ██╔╝ ██╗ ██║ ', + ' ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ', + ]); + expect( test.lines ).toBe( 1 ); + expect( test.options ).toEqual({ + font: 'block', + align: 'left', + colors: [], + background: 'red', + letterSpacing: 1, + lineHeight: 1, + space: true, + maxLength: 0, + }); +}); diff --git a/test/renderconsole.spec.js b/test/renderconsole.spec.js new file mode 100644 index 00000000..9d8b6e1e --- /dev/null +++ b/test/renderconsole.spec.js @@ -0,0 +1,287 @@ +/*************************************************************************************************************************************************************** + * + * RenderConsole unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const RenderConsole = CFonts.__test__.RenderConsole; + + +test(`RenderConsole - Should output default text`, () => { + const test = RenderConsole( 'test', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test.output ).toEqual( ['test'] ); + expect( test.lines ).toEqual( 1 ); +}); + + +test(`RenderConsole - Should output multi-line text`, () => { + const test = RenderConsole( 'test|test', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test.output ).toEqual( ['test', 'test'] ); + expect( test.lines ).toEqual( 2 ); +}); + + +test(`RenderConsole - Should output long text`, () => { + const test = RenderConsole( 'this is a very long line to test multi lines', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 1, + }, { width: 10, height: 10 } ); + + expect( test.output ).toEqual( ['this is a', 'very long', 'line to te', 'st multi l', 'ines'] ); + expect( test.lines ).toEqual( 5 ); +}); + + +test(`RenderConsole - Should center align text`, () => { + const test = RenderConsole( 'center', { + align: 'center', + colors: [], + letterSpacing: 1, + lineHeight: 1, + }, { width: 10, height: 10 } ); + + expect( test.output ).toEqual( [' center'] ); + expect( test.lines ).toEqual( 1 ); +}); + + +test(`RenderConsole - Should right align text`, () => { + const test = RenderConsole( 'right', { + align: 'right', + colors: [], + letterSpacing: 1, + lineHeight: 1, + }, { width: 10, height: 10 } ); + + expect( test.output ).toEqual( [' right'] ); + expect( test.lines ).toEqual( 1 ); +}); + + +test(`RenderConsole - Should insert letter spacing`, () => { + const test1 = RenderConsole( 'text', { + align: 'left', + colors: [], + letterSpacing: 2, + lineHeight: 1, + }, { width: 10, height: 10 } ); + + expect( test1.output ).toEqual( ['t e x t'] ); + expect( test1.lines ).toEqual( 1 ); + + const test2 = RenderConsole( 'text', { + align: 'left', + colors: [], + letterSpacing: 3, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test2.output ).toEqual( ['t e x t'] ); + expect( test2.lines ).toEqual( 1 ); + + const test3 = RenderConsole( 'text', { + align: 'left', + colors: [], + letterSpacing: 10, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test3.output ).toEqual( ['t e x t'] ); + expect( test3.lines ).toEqual( 1 ); +}); + + +test(`RenderConsole - Should insert letter spacing with multi lines`, () => { + const test1 = RenderConsole( 'text|text', { + align: 'left', + colors: [], + letterSpacing: 2, + lineHeight: 1, + }, { width: 10, height: 10 } ); + + expect( test1.output ).toEqual( ['t e x t', 't e x t'] ); + expect( test1.lines ).toEqual( 2 ); + + const test2 = RenderConsole( 'text|text', { + align: 'left', + colors: [], + letterSpacing: 3, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test2.output ).toEqual( ['t e x t', 't e x t'] ); + expect( test2.lines ).toEqual( 2 ); + + const test3 = RenderConsole( 'text|text', { + align: 'left', + colors: [], + letterSpacing: 10, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test3.output ).toEqual( ['t e x t', 't e x t'] ); + expect( test3.lines ).toEqual( 2 ); +}); + + +test(`RenderConsole - Should insert line height`, () => { + const test1 = RenderConsole( 'text', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 2, + }, { width: 100, height: 10 } ); + + expect( test1.output ).toEqual( ['text', ''] ); + expect( test1.lines ).toEqual( 2 ); + + const test2 = RenderConsole( 'text', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 3, + }, { width: 100, height: 10 } ); + + expect( test2.output ).toEqual( ['text', '', ''] ); + expect( test2.lines ).toEqual( 3 ); + + const test3 = RenderConsole( 'text', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 10, + }, { width: 100, height: 10 } ); + + expect( test3.output ).toEqual( ['text', '', '', '', '', '', '', '', '', ''] ); + expect( test3.lines ).toEqual( 10 ); +}); + + +test(`RenderConsole - Should insert line height between lines`, () => { + const test1 = RenderConsole( 'text|text|text', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 2, + }, { width: 100, height: 10 } ); + + expect( test1.output ).toEqual( ['text', '', 'text', '', 'text', ''] ); + expect( test1.lines ).toEqual( 6 ); + + const test2 = RenderConsole( 'text|text|text', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 3, + }, { width: 100, height: 10 } ); + + expect( test2.output ).toEqual( ['text', '', '', 'text', '', '', 'text', '', ''] ); + expect( test2.lines ).toEqual( 9 ); + + const test3 = RenderConsole( 'text|text|text', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 10, + }, { width: 100, height: 10 } ); + + expect( test3.output ).toEqual([ + 'text', '', '', '', '', '', '', '', '', '', + 'text', '', '', '', '', '', '', '', '', '', + 'text', '', '', '', '', '', '', '', '', '', + ]); + expect( test3.lines ).toEqual( 30 ); +}); + + +test(`RenderConsole - Should insert line height for long lines`, () => { + const test1 = RenderConsole( 'this is a long line', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 2, + }, { width: 10, height: 10 } ); + + expect( test1.output ).toEqual( ['this is a', '', 'long line', ''] ); + expect( test1.lines ).toEqual( 4 ); + + const test2 = RenderConsole( 'this is a long line', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 3, + }, { width: 10, height: 10 } ); + + expect( test2.output ).toEqual( ['this is a', '', '', 'long line', '', ''] ); + expect( test2.lines ).toEqual( 6 ); + + const test3 = RenderConsole( 'this is a long line', { + align: 'left', + colors: [], + letterSpacing: 1, + lineHeight: 10, + }, { width: 10, height: 10 } ); + + expect( test3.output ).toEqual([ + 'this is a', '', '', '', '', '', '', '', '', '', + 'long line', '', '', '', '', '', '', '', '', '', + ]); + expect( test3.lines ).toEqual( 20 ); +}); + + +test(`RenderConsole - Should output colored text`, () => { + const test = RenderConsole( 'test', { + align: 'left', + colors: ['red'], + letterSpacing: 1, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( test.output ).toEqual( ['test'] ); +}); + + +test(`RenderConsole - Should output candy colored text`, () => { + const StripColor = ( text ) => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' + ].join('|'); + const ansi = new RegExp(pattern, 'g'); + + if( typeof text === 'string' ) { + return text.replace( ansi, '' ); + } + else { + return text; + } + }; + + const test = RenderConsole( 'test', { + align: 'left', + colors: ['candy'], + letterSpacing: 1, + lineHeight: 1, + }, { width: 100, height: 10 } ); + + expect( StripColor( test.output[ 0 ] ) ).toEqual( 'test' ); + expect( require('util').inspect( test.output[ 0 ] ).length > 'test'.length ).toEqual( true ); + expect( test.lines ).toEqual( 1 ); +}); diff --git a/test/say.spec.js b/test/say.spec.js new file mode 100644 index 00000000..605bc1d2 --- /dev/null +++ b/test/say.spec.js @@ -0,0 +1,18 @@ +/*************************************************************************************************************************************************************** + * + * Say unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const Say = CFonts.say; + + +test(`Say - Say will print to console log`, () => { + console.log = jest.fn(); + + Say( 'text' ); + + expect( console.log.mock.calls[0][0].length > 0 ).toBe( true ); +}); diff --git a/test/settings.spec.js b/test/settings.spec.js new file mode 100644 index 00000000..addaff12 --- /dev/null +++ b/test/settings.spec.js @@ -0,0 +1,49 @@ +/*************************************************************************************************************************************************************** + * + * DEBUG, DEBUGLEVEL, CHARS, COLORS, BGCOLORS, ALIGNMENT, FONTFACES unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const DEBUG = CFonts.DEBUG; +const DEBUGLEVEL = CFonts.DEBUGLEVEL; +const CHARS = CFonts.CHARS; +const COLORS = CFonts.COLORS; +const BGCOLORS = CFonts.BGCOLORS; +const ALIGNMENT = CFonts.ALIGNMENT; +const FONTFACES = CFonts.FONTFACES; + + +test(`DEBUG - Should be defined as boolean`, () => { + expect( typeof DEBUG ).toEqual( 'boolean' ); +}); + +test(`DEBUGLEVEL - Should be defined as number`, () => { + expect( typeof DEBUGLEVEL ).toEqual( 'number' ); +}); + + +test(`CHARS - Should have 56 characters defined`, () => { + expect( CHARS.length ).toEqual( 56 ); +}); + + +test(`COLORS - Should have n number of colors defined`, () => { + expect( COLORS.length > 0 ).toEqual( true ); +}); + +test(`BGCOLORS - Should have n number of colors defined`, () => { + expect( BGCOLORS.length > 0 ).toEqual( true ); +}); + + +test(`ALIGNMENT - Should have all alignment options`, () => { + expect( ALIGNMENT[ 0 ] ).toEqual( 'left' ); + expect( ALIGNMENT[ 1 ] ).toEqual( 'center' ); + expect( ALIGNMENT[ 2 ] ).toEqual( 'right' ); +}); + +test(`FONTFACES - Should have a bunch of fontfaces defined`, () => { + expect( FONTFACES.length > 0 ).toEqual( true ); +}); diff --git a/test/size.spec.js b/test/size.spec.js new file mode 100644 index 00000000..cf1f371f --- /dev/null +++ b/test/size.spec.js @@ -0,0 +1,15 @@ +/*************************************************************************************************************************************************************** + * + * Size unit tests + * + **************************************************************************************************************************************************************/ + + +const CFonts = require('../src/lib.js') +const Size = CFonts.__test__.Size; + + +test(`Size - Should have two keys with numbers`, () => { + expect( typeof Size.width ).toEqual( 'number' ); + expect( typeof Size.height ).toEqual( 'number' ); +});