diff --git a/.babelrc b/.babelrc index b311fdc..3008343 100644 --- a/.babelrc +++ b/.babelrc @@ -26,9 +26,6 @@ } } ] - ], - "plugins": [ - "istanbul" ] } } diff --git a/.nycrc b/.nycrc deleted file mode 100644 index 7fbf8d9..0000000 --- a/.nycrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "reporter": [ - "lcov", - "text", - "html" - ], - "include": [ - "src/**/*.js" - ], - "exclude": [ - "src/**/*.spec.js" - ], - "all": true, - "sourceMap": false, - "instrument": false -} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index f059ed3..af006dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: node_js node_js: - "node" - "lts/*" - - "6" cache: directories: - "node_modules" diff --git a/package-lock.json b/package-lock.json index d503ec6..4e1f276 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,56 +13,6 @@ "@babel/highlight": "7.0.0-beta.49" } }, - "@babel/generator": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.49.tgz", - "integrity": "sha1-6c/9qROZaszseTu8JauRvBnQv3o=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.49", - "jsesc": "^2.5.1", - "lodash": "^4.17.5", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.49.tgz", - "integrity": "sha1-olwRGbnwNSeGcBJuAiXAMEHI3jI=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.49", - "@babel/template": "7.0.0-beta.49", - "@babel/types": "7.0.0-beta.49" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.49.tgz", - "integrity": "sha1-z1Aj8y0q2S0Ic3STnOwJUby1FEE=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.49" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.49.tgz", - "integrity": "sha1-QNeO2glo0BGxxShm5XRs+yPldUg=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.49" - } - }, "@babel/highlight": { "version": "7.0.0-beta.49", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.49.tgz", @@ -105,78 +55,6 @@ } } }, - "@babel/parser": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.49.tgz", - "integrity": "sha1-lE0MW6KBK7FZ7b0iZ0Ov0mUXm9w=", - "dev": true - }, - "@babel/template": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.49.tgz", - "integrity": "sha1-44q+ghfLl5P0YaUwbXrXRdg+HSc=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.49", - "@babel/parser": "7.0.0-beta.49", - "@babel/types": "7.0.0-beta.49", - "lodash": "^4.17.5" - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.49.tgz", - "integrity": "sha1-TypzaCoYM07WYl0QCo0nMZ98LWg=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.49", - "@babel/generator": "7.0.0-beta.49", - "@babel/helper-function-name": "7.0.0-beta.49", - "@babel/helper-split-export-declaration": "7.0.0-beta.49", - "@babel/parser": "7.0.0-beta.49", - "@babel/types": "7.0.0-beta.49", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.17.5" - }, - "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" - } - }, - "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.49.tgz", - "integrity": "sha1-t+Oxw/TUz+Eb34yJ8e/V4WF7h6Y=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.5", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -199,6 +77,12 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/jest": { + "version": "23.1.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.1.6.tgz", + "integrity": "sha512-lBu2tjrfGuj0gARErNmHZJrnWBdRrYk2XqlBY3LRv8Dqxk3w3461uuFMKmwfDDiOa5kzXocUnunCBBacGwF3+A==", + "dev": true + }, "@types/node": { "version": "10.5.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz", @@ -544,6 +428,12 @@ "long": "^3.2.0" } }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -575,6 +465,15 @@ "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", "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.0.0" + } + }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", @@ -610,12 +509,29 @@ "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", "dev": true }, + "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.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, + "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", @@ -645,6 +561,15 @@ "normalize-path": "^2.0.0" } }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -681,6 +606,12 @@ "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-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -763,18 +694,35 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "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.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -1073,6 +1021,16 @@ "babel-template": "^6.24.1" } }, + "babel-jest": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.4.0.tgz", + "integrity": "sha1-IsNMOS4hdvakw2eZKn/P9p0uhVc=", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", @@ -1126,6 +1084,12 @@ } } }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -1492,6 +1456,16 @@ "semver": "^5.3.0" } }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", @@ -1742,6 +1716,29 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "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.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -1822,6 +1819,15 @@ "electron-to-chromium": "^1.3.47" } }, + "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" + } + }, "buble": { "version": "0.19.3", "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.3.tgz", @@ -1895,10 +1901,10 @@ "isarray": "^1.0.0" } }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", "dev": true }, "buffer-xor": { @@ -2050,24 +2056,30 @@ "integrity": "sha512-vMrE8BED4MJC9IhDJKP8ok6bJUfn5+YHvxwXMYfiPqQOJ3r2B9ihcArlUnXu6yPWf7b3jHqiEBwXZEbrbiFUqg==", "dev": true }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "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": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -2089,12 +2101,6 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, "check-types": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", @@ -2134,6 +2140,12 @@ "tslib": "^1.9.0" } }, + "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 + }, "ci-job-number": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ci-job-number/-/ci-job-number-0.3.0.tgz", @@ -2209,6 +2221,27 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "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.1", + "right-align": "^0.1.1", + "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 + } + } + }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -2319,6 +2352,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", + "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2741,6 +2780,21 @@ "source-map": "^0.5.3" } }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true + }, + "cssstyle": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -2756,6 +2810,17 @@ "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": { + "abab": "^1.0.4", + "whatwg-mimetype": "^2.0.0", + "whatwg-url": "^6.4.0" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2783,27 +2848,21 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, "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": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -2925,6 +2984,18 @@ "repeating": "^2.0.0" } }, + "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 + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -2961,6 +3032,15 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "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": { + "webidl-conversions": "^4.0.2" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -3132,6 +3212,34 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "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 + } + } + }, "eslint": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", @@ -3339,6 +3447,15 @@ "safe-buffer": "^5.1.1" } }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -3354,6 +3471,12 @@ "strip-eof": "^1.0.0" } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -3372,6 +3495,31 @@ "fill-range": "^2.1.0" } }, + "expect": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.4.0.tgz", + "integrity": "sha1-baTsyZwUcSU+cogziYOtHrrbYMM=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.2.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.2.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", @@ -3827,13 +3975,22 @@ "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", "dev": true }, - "figures": { + "fb-watchman": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "bser": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -3862,6 +4019,16 @@ "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.0.3", + "minimatch": "^3.0.3" + } + }, "filesize": { "version": "3.5.11", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", @@ -3962,15 +4129,6 @@ "readable-stream": "^2.0.4" } }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4645,12 +4803,6 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -4749,6 +4901,12 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, "gzip-size": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", @@ -4767,6 +4925,76 @@ } } }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "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": { + "amdefine": ">=0.0.4" + } + }, + "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": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -4926,6 +5154,15 @@ "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", "dev": true }, + "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": { + "whatwg-encoding": "^1.0.1" + } + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -5068,6 +5305,16 @@ } } }, + "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": { + "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", @@ -5242,6 +5489,15 @@ "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.0.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -5324,6 +5580,12 @@ "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", @@ -5527,504 +5789,810 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-lib-coverage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz", - "integrity": "sha512-yMSw5xLIbdaxiVXHk3amfNM2WeBxLrwH/BCyZ9HvA/fylwziAIJOG2rKqWyLqEJqwKT725vxxqidv+SyynnGAA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-2.2.0.tgz", - "integrity": "sha512-ozQGtlIw+/a/F3n6QwWiuuyRAPp64+g2GVsKYsIez0sgIEzkU5ZpL2uZ5pmAzbEJ82anlRaPlOQZzkRXspgJyg==", + "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": { - "@babel/generator": "7.0.0-beta.49", - "@babel/parser": "7.0.0-beta.49", - "@babel/template": "7.0.0-beta.49", - "@babel/traverse": "7.0.0-beta.49", - "@babel/types": "7.0.0-beta.49", - "istanbul-lib-coverage": "^2.0.0", - "semver": "^5.5.0" + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "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.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "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 + }, + "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": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + } + } } }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", - "dev": true - }, - "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", - "dev": true - }, - "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.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "istanbul-lib-hook": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", + "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "append-transform": "^1.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "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, - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "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-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "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 - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "requires": { + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "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 + }, + "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" + } + } + } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "istanbul-lib-source-maps": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "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" + } + }, + "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 + } } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "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": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "handlebars": "^4.0.3" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "jest": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.4.1.tgz", + "integrity": "sha512-HTOuA9epknN7RKdzhmp9qrbP0z3TibAMXI+sluLOcrEoF54ZCG8/urFB2DK/sOINcMeyX6epMUqka8i0+d0xOA==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "import-local": "^1.0.0", + "jest-cli": "^23.4.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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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 + }, + "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": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + } + }, + "jest-cli": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.4.1.tgz", + "integrity": "sha512-Cmd7bex+kYmMGwGrIh/crwUieUFr+4PCTaK32tEA0dm0wklXV8zGgWh8n+8WbhsFPNzacolxdtcfBKIorcV5FQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.0", + "jest-config": "^23.4.1", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.4.1", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.4.1", + "jest-runner": "^23.4.1", + "jest-runtime": "^23.4.1", + "jest-snapshot": "^23.4.1", + "jest-util": "^23.4.0", + "jest-validate": "^23.4.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.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" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "jest-changed-files": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.0.tgz", + "integrity": "sha1-8bME+YwjWvXZox7FJCYsXk3jxv8=", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "throat": "^4.0.0" } }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "leb": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", - "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "jest-config": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.4.1.tgz", + "integrity": "sha512-OT29qlcw9Iw7u0PC04wD9tjLJL4vpGdMZrrHMFwYSO3HxOikbHywjmtQ7rntW4qvBcpbi7iCMTPPRmpDjImQEw==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "babel-core": "^6.0.0", + "babel-jest": "^23.4.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.4.1", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.4.1", + "jest-util": "^23.4.0", + "jest-validate": "^23.4.0", + "pretty-format": "^23.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "jest-diff": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.2.0.tgz", + "integrity": "sha1-nyz0tR4Sx5FVAgCrwWtHEwrxBio=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.2.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", "dev": true }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "jest-each": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", + "integrity": "sha1-L6nt2J2qGk7cn/m/YGKja3E0UUM=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "chalk": "^2.0.1", + "pretty-format": "^23.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" } }, - "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.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", - "dev": true + "jest-fetch-mock": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-1.6.5.tgz", + "integrity": "sha512-qPz5Zf8+W16pu6cvdwXkb2SwRfxGoQbbGB6HcIBFND0gnWKMfQilZew3PSODnOWQZF/pzBPi7ZIT6Yz5D0va1Q==", + "dev": true, + "requires": { + "@types/jest": "^23.0.0", + "isomorphic-fetch": "^2.2.1", + "promise-polyfill": "^7.1.1" + } }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "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 }, - "lodash.sumby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.sumby/-/lodash.sumby-4.6.0.tgz", - "integrity": "sha1-fYdzfdshbaL35efNLdnEA6eIc0Y=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "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=", + "jest-haste-map": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.4.1.tgz", + "integrity": "sha512-PGQxOEGAfRbTyJkmZeOKkVSs+KVeWgG625p89KUuq+sIIchY5P8iPIIc+Hw2tJJPBzahU3qopw1kF/qyhDdNBw==", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + }, + "dependencies": { + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + } } }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "jest-jasmine2": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.4.1.tgz", + "integrity": "sha512-nHmRgTtM9fuaK3RBz2z4j9mYVEJwB7FdoflQSvrwHV8mCT5z4DeHoKCvPp2R27F8fZTYJUYVMb36xn+ydg0tfA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.4.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.2.0", + "jest-each": "^23.4.0", + "jest-matcher-utils": "^23.2.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.4.1", + "jest-util": "^23.4.0", + "pretty-format": "^23.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "jest-leak-detector": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz", + "integrity": "sha1-wonZYdxjjxQ1fU75bgQx7MGqN30=", "dev": true, "requires": { - "vlq": "^0.2.2" - }, - "dependencies": { - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - } + "pretty-format": "^23.2.0" } }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "jest-matcher-utils": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz", + "integrity": "sha1-TUmB8jIT6Tnjzt8j3DTHR7WuGRM=", "dev": true, "requires": { - "pify": "^3.0.0" + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.2.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", "dev": true }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", "dev": true }, - "maxmin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", - "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", + "jest-resolve": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.4.1.tgz", + "integrity": "sha512-VNk4YRNR5gsHhNS0Lp46/DzTT11e+ecbUC61ikE593cKbtdrhrMO+zXkOJaE8YDD5sHxH9W6OfssNn4FkZBzZQ==", "dev": true, "requires": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^3.0.0", - "pretty-bytes": "^3.0.0" + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" }, "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "color-convert": "^1.9.0" } }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "duplexer": "^0.1.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "has-flag": "^3.0.0" } } } }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "jest-resolve-dependencies": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.1.tgz", + "integrity": "sha512-Jp0wgNJg3OYPvXJfNVX4k4/niwGS6ARuKacum/vue48+4A1XPJ2H3aVFuNb3gUaiB/6Le7Zyl8AUb4MELBfcmg==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.4.1" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "jest-runner": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.4.1.tgz", + "integrity": "sha512-78KyhObsx0VEuUQ74ikGt68NpP6PApTjGpJPSyZ7AvwOFRqFlxdHpCU/lFPQxW/fLEghl4irz9OHjRLGcGFNyQ==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.4.1", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.4.1", + "jest-jasmine2": "^23.4.1", + "jest-leak-detector": "^23.2.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.4.1", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "jest-runtime": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.4.1.tgz", + "integrity": "sha512-fnInrsEAbLpNctQa+RLnKZyQLMmb5u4YdoT9CbRKWhjMY7q6ledOu+x+ORZ3glQOK/vJIS701RaJRp1pc5ziaA==", "dev": true, "requires": { - "source-map": "^0.6.1" + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.4.1", + "jest-haste-map": "^23.4.1", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.4.1", + "jest-snapshot": "^23.4.1", + "jest-util": "^23.4.0", + "jest-validate": "^23.4.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" }, "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 + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "merge2": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", - "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", "dev": true }, - "microbundle": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/microbundle/-/microbundle-0.5.1.tgz", - "integrity": "sha512-ZzLXsX1Xwh1Oq4Ss923e04i/DySacyJZf5jBsbjQE+RjR9N5kI4+3ehAw40yrq7krmWT/lEOntc4TOUuhh+eyw==", + "jest-snapshot": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.4.1.tgz", + "integrity": "sha512-oMjaQ4vB4uT211zx00X0R7hg+oLVRDvhVKiC6+vSg7Be9S/AmkDMCVUoaPcLRK/0NkZBTzrh4WCzrSZgUEZW3g==", "dev": true, "requires": { - "acorn-jsx": "^4.1.1", - "asyncro": "^3.0.0", - "autoprefixer": "^8.3.0", - "babel-polyfill": "^6.26.0", - "camelcase": "^5.0.0", - "chalk": "^2.4.0", - "cssnano": "^3.10.0", - "es6-promisify": "^6.0.0", - "gzip-size": "^4.1.0", - "pretty-bytes": "^5.1.0", - "regenerator-runtime": "^0.11.1", - "rollup": "^0.62.0", - "rollup-plugin-buble": "^0.19.2", - "rollup-plugin-bundle-size": "^1.0.1", - "rollup-plugin-commonjs": "^9.0.0", - "rollup-plugin-es3": "^1.1.0", - "rollup-plugin-flow": "^1.1.1", - "rollup-plugin-node-resolve": "^3.3.0", - "rollup-plugin-nodent": "^0.2.2", - "rollup-plugin-postcss": "^1.6.1", - "rollup-plugin-preserve-shebang": "^0.1.6", - "rollup-plugin-sizes": "^0.4.2", - "rollup-plugin-strict-alias": "^1.0.0", - "rollup-plugin-typescript2": "^0.13.0", - "rollup-plugin-uglify": "^3.0.0", - "sade": "^1.4.0", - "tiny-glob": "^0.2.0", - "tslib": "^1.9.0", - "typescript": "^2.8.3" + "babel-traverse": "^6.0.0", + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.2.0", + "jest-matcher-utils": "^23.2.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.4.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.2.0", + "semver": "^5.5.0" }, "dependencies": { - "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -6034,24 +6602,57 @@ "color-convert": "^1.9.0" } }, - "autoprefixer": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", - "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "browserslist": "^3.2.8", - "caniuse-lite": "^1.0.30000864", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.23", - "postcss-value-parser": "^3.2.3" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "caniuse-lite": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", - "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, "chalk": { @@ -6065,17 +6666,6 @@ "supports-color": "^5.3.0" } }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6093,2448 +6683,1119 @@ } } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "jest-validate": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.4.0.tgz", + "integrity": "sha1-2W7t4B7wOskJwAnpyORVGX1IwgE=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-base64": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", + "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", "dev": true }, - "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==", + "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 }, - "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==", + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "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==", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", + "dev": true, + "requires": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.3.1 < 0.4.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwsapi": "^2.0.0", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "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.1", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "minimalistic-crypto-utils": { + "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-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "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 }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "graceful-fs": "^4.1.6" } }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "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" - } - } + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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": { - "minimist": "0.0.8" + "is-buffer": "^1.1.5" } }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=", + "kleur": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-1.0.1.tgz", + "integrity": "sha512-8srIZ5BK5PCJw1L/JN741xgNfSjuQNK9ImYbYzv7ZUD3WPfuywaY+yd7lQOphJ+2vwXnMLnRZoAh5X+orRt4LQ==", "dev": true }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "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 + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "invert-kv": "^1.0.0" } }, - "mri": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.1.tgz", - "integrity": "sha1-haom09ru7t+A3FmEr5XMXKXK2fE=", + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "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 }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, - "optional": true + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "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 - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "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=", + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", "dev": true }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "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": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.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 }, - "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", "dev": true }, - "nock": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-9.3.3.tgz", - "integrity": "sha512-FBgnx25er2ly7KBr0Est5F0z5g+lnyr6a72vZI1KMi7nTL4ojU6XpFhlrfw6CXRdnT2FA5i8exHiT1uVNUM1qA==", - "dev": true, - "requires": { - "chai": "^4.1.2", - "debug": "^3.1.0", - "deep-equal": "^1.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.5", - "mkdirp": "^0.5.0", - "propagate": "^1.0.0", - "qs": "^6.5.1", - "semver": "^5.5.0" - }, - "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" - } - } - } + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.sumby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.sumby/-/lodash.sumby-4.6.0.tgz", + "integrity": "sha1-fYdzfdshbaL35efNLdnEA6eIc0Y=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "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": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "js-tokens": "^3.0.0" } }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "nodent-compiler": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/nodent-compiler/-/nodent-compiler-3.2.6.tgz", - "integrity": "sha512-6Zu15pXyMZgWUCp1xZMb+iUexFAUnixeAn3x4U+mqLAnOskWq8/fiBG03vn/pbHl9ZS61LTWSbYtHRzNkZS8ow==", + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { - "acorn": ">=2.5.2", - "acorn-es7-plugin": "^1.1.7", - "nodent-transform": "^3.2.6", - "source-map": "^0.5.7" + "vlq": "^0.2.2" + }, + "dependencies": { + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + } } }, - "nodent-transform": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/nodent-transform/-/nodent-transform-3.2.6.tgz", - "integrity": "sha512-CMa5JFCWhfv6SbG7GPNwxww9dyZuxHdC1vzGELodIPIklecH5FJzvB/gS5jb62jAnNqeQWPEoPY7AJcxvzmz2A==", - "dev": true - }, - "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==", + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "tmpl": "1.0.x" } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", "dev": true }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, - "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=", + "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": { - "path-key": "^2.0.0" + "object-visit": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", "dev": true }, - "number-is-nan": { + "math-random": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", "dev": true }, - "nyc": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-12.0.2.tgz", - "integrity": "sha1-ikpO1pCWbBHsWH/4fuoMEsl0upk=", + "maxmin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", "dev": true, "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^2.1.0", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^2.1.0", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.5", - "istanbul-reports": "^1.4.1", - "md5-hex": "^1.2.0", - "merge-source-map": "^1.1.0", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.1", - "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.0", - "yargs": "11.1.0", - "yargs-parser": "^8.0.0" + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^3.0.0", + "pretty-bytes": "^3.0.0" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ansi-regex": { + "gzip-size": { "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "duplexer": "^0.1.1" } }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "bundled": true, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + } + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "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 + } + } + }, + "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": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "microbundle": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/microbundle/-/microbundle-0.5.1.tgz", + "integrity": "sha512-ZzLXsX1Xwh1Oq4Ss923e04i/DySacyJZf5jBsbjQE+RjR9N5kI4+3ehAw40yrq7krmWT/lEOntc4TOUuhh+eyw==", + "dev": true, + "requires": { + "acorn-jsx": "^4.1.1", + "asyncro": "^3.0.0", + "autoprefixer": "^8.3.0", + "babel-polyfill": "^6.26.0", + "camelcase": "^5.0.0", + "chalk": "^2.4.0", + "cssnano": "^3.10.0", + "es6-promisify": "^6.0.0", + "gzip-size": "^4.1.0", + "pretty-bytes": "^5.1.0", + "regenerator-runtime": "^0.11.1", + "rollup": "^0.62.0", + "rollup-plugin-buble": "^0.19.2", + "rollup-plugin-bundle-size": "^1.0.1", + "rollup-plugin-commonjs": "^9.0.0", + "rollup-plugin-es3": "^1.1.0", + "rollup-plugin-flow": "^1.1.1", + "rollup-plugin-node-resolve": "^3.3.0", + "rollup-plugin-nodent": "^0.2.2", + "rollup-plugin-postcss": "^1.6.1", + "rollup-plugin-preserve-shebang": "^0.1.6", + "rollup-plugin-sizes": "^0.4.2", + "rollup-plugin-strict-alias": "^1.0.0", + "rollup-plugin-typescript2": "^0.13.0", + "rollup-plugin-uglify": "^3.0.0", + "sade": "^1.4.0", + "tiny-glob": "^0.2.0", + "tslib": "^1.9.0", + "typescript": "^2.8.3" + }, + "dependencies": { + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", + "dev": true, + "requires": { + "acorn": "^5.0.3" + } }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true + "autoprefixer": { + "version": "8.6.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", + "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", + "dev": true, + "requires": { + "browserslist": "^3.2.8", + "caniuse-lite": "^1.0.30000864", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.23", + "postcss-value-parser": "^3.2.3" + } }, - "assign-symbols": { - "version": "1.0.0", - "bundled": true, + "caniuse-lite": { + "version": "1.0.30000865", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", + "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==", "dev": true }, - "async": { - "version": "1.5.2", - "bundled": true, - "dev": true + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } }, - "atob": { - "version": "2.1.1", - "bundled": true, - "dev": true + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } }, - "balanced-match": { - "version": "1.0.0", - "bundled": 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 }, - "base": { - "version": "0.11.2", - "bundled": true, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "bundled": true, - "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.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "bundled": true, - "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" + "has-flag": "^3.0.0" } - }, - "caching-transform": { + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "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", - "bundled": true, - "dev": true, - "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" - } - }, - "camelcase": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "class-utils": { - "version": "0.3.6", - "bundled": true, - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "bundled": true, - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - }, - "define-property": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "error-ex": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "bundled": true, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "fill-range": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fragment-cache": { - "version": "0.2.1", - "bundled": true, - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "get-value": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "bundled": true, - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "has-value": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.6.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-odd": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "bundled": true, - "dev": true - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - } - }, - "istanbul-reports": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "map-cache": { - "version": "0.2.2", - "bundled": true, - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "bundled": true, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "regex-not": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "ret": { - "version": "0.1.15", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-regex": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "set-value": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "bundled": true, - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "split-string": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "static-extend": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - } - }, - "to-object-path": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "union-value": { - "version": "1.0.0", - "bundled": true, - "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", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "bundled": true, - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "bundled": true, - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "bundled": true, - "dev": true - }, - "use": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "11.1.0", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "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" + } + }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "mri": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.1.tgz", + "integrity": "sha1-haom09ru7t+A3FmEr5XMXKXK2fE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.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 }, - "yargs-parser": { - "version": "8.1.0", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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 + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "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-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "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.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "nodent-compiler": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/nodent-compiler/-/nodent-compiler-3.2.6.tgz", + "integrity": "sha512-6Zu15pXyMZgWUCp1xZMb+iUexFAUnixeAn3x4U+mqLAnOskWq8/fiBG03vn/pbHl9ZS61LTWSbYtHRzNkZS8ow==", + "dev": true, + "requires": { + "acorn": ">=2.5.2", + "acorn-es7-plugin": "^1.1.7", + "nodent-transform": "^3.2.6", + "source-map": "^0.5.7" + } + }, + "nodent-transform": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/nodent-transform/-/nodent-transform-3.2.6.tgz", + "integrity": "sha512-CMa5JFCWhfv6SbG7GPNwxww9dyZuxHdC1vzGELodIPIklecH5FJzvB/gS5jb62jAnNqeQWPEoPY7AJcxvzmz2A==", + "dev": true + }, + "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.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.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.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "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 + }, + "nwsapi": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.5.tgz", + "integrity": "sha512-cqfA/wLUW6YbFQLkd5ZKq2SCaZkCoxehU9qt6ccMwH3fHbzUkcien9BzOgfBXfIkxeWnRFKb1ZKmjwaa9MYOMw==", + "dev": true + }, "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", @@ -8569,12 +7830,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -8598,6 +7853,16 @@ } } }, + "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.5.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -8658,6 +7923,24 @@ "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", "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.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -8809,10 +8092,10 @@ "json-parse-better-errors": "^1.0.1" } }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, "parseurl": { @@ -8892,12 +8175,6 @@ } } }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, "pbkdf2": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", @@ -8947,18 +8224,18 @@ "find-up": "^2.1.0" } }, - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "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", @@ -9738,15 +9015,31 @@ "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==", "dev": true }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", + "pretty-format": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.2.0.tgz", + "integrity": "sha1-OwqqY8AYpTWDNzwcs6XZbMXoMBc=", "dev": true, "requires": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } } }, "private": { @@ -9779,17 +9072,27 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise-polyfill": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", + "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==", + "dev": true + }, "promise.series": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=", "dev": true }, - "propagate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", - "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", - "dev": true + "prompts": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.12.tgz", + "integrity": "sha512-pgR1GE1JM8q8UsHVIgjdK62DPwvrf0kvaKWJ/mfMoCm2lwfIReX/giQ1p0AlMoUXNhQap/8UiOdqi3bOROm/eg==", + "dev": true, + "requires": { + "kleur": "^1.0.0", + "sisteransi": "^0.1.1" + } }, "proxy-addr": { "version": "2.0.3", @@ -9972,14 +9275,8 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", "dev": true - } - } - }, - "re-emitter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", - "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", - "dev": true + } + } }, "read-pkg": { "version": "3.0.0", @@ -10029,6 +9326,15 @@ "set-immediate-shim": "^1.0.1" } }, + "realpath-native": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.1.tgz", + "integrity": "sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -10202,6 +9508,26 @@ "uuid": "^3.1.0" } }, + "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.13.1" + } + }, + "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.0", + "tough-cookie": ">=2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10245,6 +9571,23 @@ "path-parse": "^1.0.5" } }, + "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" + }, + "dependencies": { + "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-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", @@ -10267,21 +9610,22 @@ "signal-exit": "^3.0.2" } }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, "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.1" + } + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -10374,258 +9718,573 @@ "integrity": "sha1-bOVo8d1Vlma3erdrS64lFAdSjbY=", "dev": true, "requires": { - "flow-remove-types": "^1.1.0", - "rollup-pluginutils": "^1.5.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", - "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", - "dev": true - }, - "rollup-pluginutils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", - "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", - "dev": true, - "requires": { - "estree-walker": "^0.2.1", - "minimatch": "^3.0.2" - } - } + "flow-remove-types": "^1.1.0", + "rollup-pluginutils": "^1.5.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true, + "requires": { + "estree-walker": "^0.2.1", + "minimatch": "^3.0.2" + } + } + } + }, + "rollup-plugin-node-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", + "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", + "dev": true, + "requires": { + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" + }, + "dependencies": { + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "dev": true + } + } + }, + "rollup-plugin-nodent": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-nodent/-/rollup-plugin-nodent-0.2.2.tgz", + "integrity": "sha512-mFomzLjxhS3pVQ0ZAuiLqDtWLXACqylO/sfw9b4JF6nGmiLNyeYmwCgm7hICgMcSFMWOA+IiQQr373HRKg776A==", + "dev": true, + "requires": { + "acorn-dynamic-import": "^3.0.0", + "nodent-compiler": "^3.1.6", + "rollup-pluginutils": "^2.0.1" + } + }, + "rollup-plugin-postcss": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-1.6.2.tgz", + "integrity": "sha512-kKUdZRWSG7IQwXztKA4NTxFKcII7dn5rxAuJyNRJ9QTErRaM6mH4GoFCBPm0KT9TUZDOGCREdRI4VHUdEV+MJA==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^1.0.0", + "chalk": "^2.0.0", + "concat-with-sourcemaps": "^1.0.5", + "cssnano": "^3.10.0", + "fs-extra": "^5.0.0", + "import-cwd": "^2.1.0", + "p-queue": "^2.4.2", + "pify": "^3.0.0", + "postcss": "^6.0.21", + "postcss-load-config": "^1.2.0", + "postcss-modules": "^1.1.0", + "promise.series": "^0.2.0", + "reserved-words": "^0.1.2", + "resolve": "^1.5.0", + "rollup-pluginutils": "^2.0.1", + "style-inject": "^0.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-plugin-preserve-shebang": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/rollup-plugin-preserve-shebang/-/rollup-plugin-preserve-shebang-0.1.6.tgz", + "integrity": "sha512-b+psdlXZOjmlnKmL6/YAkR8PR15VPcUNXdT35urBRJ8jE6UxHyb4HXeeN3qRZJbMJJaX1eRP72XwH6IvGFh5Jw==", + "dev": true, + "requires": { + "magic-string": "^0.22.4" + } + }, + "rollup-plugin-sizes": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sizes/-/rollup-plugin-sizes-0.4.2.tgz", + "integrity": "sha512-6VsnWb4aBPcW++3IBMNPo4NLSheoaXh+itXk1OcaolLhYemoQFb7A9hVNocwa0j2BctdmPNFcP7UJ3g///VVaA==", + "dev": true, + "requires": { + "filesize": "^3.5.11", + "lodash.foreach": "^4.5.0", + "lodash.sumby": "^4.6.0", + "module-details-from-path": "^1.0.3" + } + }, + "rollup-plugin-strict-alias": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-strict-alias/-/rollup-plugin-strict-alias-1.0.0.tgz", + "integrity": "sha1-cHnuJXhcX5UG5EMLWr/0xYGsjPw=", + "dev": true + }, + "rollup-plugin-typescript2": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.13.0.tgz", + "integrity": "sha512-E+NgtKWuT7QaQAjWz9KKFqC+aoBRR9HeiN/N2EJcAzGggqpcK+jLJGeqnyq+/g0ptaVQCzkyDGhqG0skSn4JHg==", + "dev": true, + "requires": { + "fs-extra": "^5.0.0", + "resolve": "^1.7.1", + "rollup-pluginutils": "^2.0.1", + "tslib": "^1.9.0" + } + }, + "rollup-plugin-uglify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-3.0.0.tgz", + "integrity": "sha512-dehLu9eRRoV4l09aC+ySntRw1OAfoyKdbk8Nelblj03tHoynkSybqyEpgavemi1LBOH6S1vzI58/mpxkZIe1iQ==", + "dev": true, + "requires": { + "uglify-es": "^3.3.7" + } + }, + "rollup-pluginutils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", + "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", + "dev": true, + "requires": { + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" } }, - "rollup-plugin-node-resolve": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", - "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", + "sade": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.4.1.tgz", + "integrity": "sha512-r2S6GwNeYFYx02w2SYUfhYI9PzxdfNWxsX1QpI3Z4rK9bu9K3FtNVg2awp54Y9iivcYqR2iWqI3nT5jEihNyBg==", "dev": true, "requires": { - "builtin-modules": "^2.0.0", - "is-module": "^1.0.0", - "resolve": "^1.1.6" - }, - "dependencies": { - "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "dev": true - } + "mri": "^1.1.0", + "pad-right": "^0.2.2" } }, - "rollup-plugin-nodent": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-nodent/-/rollup-plugin-nodent-0.2.2.tgz", - "integrity": "sha512-mFomzLjxhS3pVQ0ZAuiLqDtWLXACqylO/sfw9b4JF6nGmiLNyeYmwCgm7hICgMcSFMWOA+IiQQr373HRKg776A==", + "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": { - "acorn-dynamic-import": "^3.0.0", - "nodent-compiler": "^3.1.6", - "rollup-pluginutils": "^2.0.1" + "ret": "~0.1.10" } }, - "rollup-plugin-postcss": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-1.6.2.tgz", - "integrity": "sha512-kKUdZRWSG7IQwXztKA4NTxFKcII7dn5rxAuJyNRJ9QTErRaM6mH4GoFCBPm0KT9TUZDOGCREdRI4VHUdEV+MJA==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", "dev": true, "requires": { - "@vue/component-compiler-utils": "^1.0.0", - "chalk": "^2.0.0", - "concat-with-sourcemaps": "^1.0.5", - "cssnano": "^3.10.0", - "fs-extra": "^5.0.0", - "import-cwd": "^2.1.0", - "p-queue": "^2.4.2", - "pify": "^3.0.0", - "postcss": "^6.0.21", - "postcss-load-config": "^1.2.0", - "postcss-modules": "^1.1.0", - "promise.series": "^0.2.0", - "reserved-words": "^0.1.2", - "resolve": "^1.5.0", - "rollup-pluginutils": "^2.0.1", - "style-inject": "^0.3.0" + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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.4", + "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.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.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.0" + } + } + } + }, + "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.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "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.0" + } + }, + "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.0" + } + }, + "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.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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.0.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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "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.0" + } + }, + "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.0" + } + } + } + }, + "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": { - "color-convert": "^1.9.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.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.0" + } + } } }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "kind-of": "^6.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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": { - "has-flag": "^3.0.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "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.0", + "snapdragon": "^0.8.1", + "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 } } }, - "rollup-plugin-preserve-shebang": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/rollup-plugin-preserve-shebang/-/rollup-plugin-preserve-shebang-0.1.6.tgz", - "integrity": "sha512-b+psdlXZOjmlnKmL6/YAkR8PR15VPcUNXdT35urBRJ8jE6UxHyb4HXeeN3qRZJbMJJaX1eRP72XwH6IvGFh5Jw==", - "dev": true, - "requires": { - "magic-string": "^0.22.4" - } - }, - "rollup-plugin-sizes": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-sizes/-/rollup-plugin-sizes-0.4.2.tgz", - "integrity": "sha512-6VsnWb4aBPcW++3IBMNPo4NLSheoaXh+itXk1OcaolLhYemoQFb7A9hVNocwa0j2BctdmPNFcP7UJ3g///VVaA==", - "dev": true, - "requires": { - "filesize": "^3.5.11", - "lodash.foreach": "^4.5.0", - "lodash.sumby": "^4.6.0", - "module-details-from-path": "^1.0.3" - } - }, - "rollup-plugin-strict-alias": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-strict-alias/-/rollup-plugin-strict-alias-1.0.0.tgz", - "integrity": "sha1-cHnuJXhcX5UG5EMLWr/0xYGsjPw=", - "dev": true - }, - "rollup-plugin-typescript2": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.13.0.tgz", - "integrity": "sha512-E+NgtKWuT7QaQAjWz9KKFqC+aoBRR9HeiN/N2EJcAzGggqpcK+jLJGeqnyq+/g0ptaVQCzkyDGhqG0skSn4JHg==", - "dev": true, - "requires": { - "fs-extra": "^5.0.0", - "resolve": "^1.7.1", - "rollup-pluginutils": "^2.0.1", - "tslib": "^1.9.0" - } - }, - "rollup-plugin-uglify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-3.0.0.tgz", - "integrity": "sha512-dehLu9eRRoV4l09aC+ySntRw1OAfoyKdbk8Nelblj03tHoynkSybqyEpgavemi1LBOH6S1vzI58/mpxkZIe1iQ==", - "dev": true, - "requires": { - "uglify-es": "^3.3.7" - } - }, - "rollup-pluginutils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", - "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", - "dev": true, - "requires": { - "estree-walker": "^0.5.2", - "micromatch": "^2.3.11" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "sade": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.4.1.tgz", - "integrity": "sha512-r2S6GwNeYFYx02w2SYUfhYI9PzxdfNWxsX1QpI3Z4rK9bu9K3FtNVg2awp54Y9iivcYqR2iWqI3nT5jEihNyBg==", - "dev": true, - "requires": { - "mri": "^1.1.0", - "pad-right": "^0.2.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.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -10785,12 +10444,24 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "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": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, "size-limit": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-0.18.2.tgz", @@ -11137,15 +10808,6 @@ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, - "split": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", - "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", - "dev": true, - "requires": { - "through": "2" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -11187,6 +10849,12 @@ "safe-buffer": "^5.1.1" } }, + "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", @@ -11214,6 +10882,12 @@ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -11291,6 +10965,33 @@ "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", "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", @@ -11318,17 +11019,6 @@ } } }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.0", - "function-bind": "^1.0.2" - } - }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -11420,6 +11110,12 @@ } } }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -11471,133 +11167,12 @@ } } }, - "tap-out": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", - "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", - "dev": true, - "requires": { - "re-emitter": "1.1.3", - "readable-stream": "2.2.9", - "split": "1.0.0", - "trim": "0.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", - "dev": true, - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - } - } - }, - "tap-spec": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", - "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "duplexer": "^0.1.1", - "figures": "^1.4.0", - "lodash": "^4.17.10", - "pretty-ms": "^2.1.0", - "repeat-string": "^1.5.2", - "tap-out": "^2.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } - } - }, "tapable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", "dev": true }, - "tape": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz", - "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "defined": "~1.0.0", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.2", - "has": "~1.0.3", - "inherits": "~2.0.3", - "minimist": "~1.2.0", - "object-inspect": "~1.6.0", - "resolve": "~1.7.1", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.1.2", - "through": "~2.3.8" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - } - } - }, "test-exclude": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", @@ -11975,6 +11550,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -12019,6 +11600,12 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -12082,11 +11669,22 @@ "punycode": "^1.4.1" } }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } }, "trim-right": { "version": "1.0.1", @@ -12137,12 +11735,6 @@ "prelude-ls": "~1.1.2" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -12189,6 +11781,13 @@ } } }, + "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 + }, "uglifyjs-webpack-plugin": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", @@ -12437,6 +12036,16 @@ "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" + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -12512,6 +12121,42 @@ "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", "dev": true }, + "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.x" + } + }, + "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.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", @@ -12865,6 +12510,12 @@ } } }, + "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 + }, "webpack": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.12.0.tgz", @@ -13273,12 +12924,38 @@ } } }, + "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-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "dev": true }, + "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.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "whet.extend": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", @@ -13300,6 +12977,13 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "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 + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -13362,6 +13046,17 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "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", @@ -13372,6 +13067,12 @@ "safe-buffer": "~5.1.0" } }, + "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 + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -13390,6 +13091,60 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.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" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, "yargs-parser": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", diff --git a/package.json b/package.json index acd79a3..c383aed 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,9 @@ "scripts": { "build": "babel src --out-dir es && microbundle --entry src/index.js --compress false --strict --format cjs,umd", "postbuild": "npm run size", - "clean": "rimraf es lib coverage .nyc_output", - "test": "cross-env BABEL_ENV=test babel-node test/index.js | tap-spec", - "cover": "nyc npm test", + "clean": "rimraf es lib coverage", + "test": "cross-env BABEL_ENV=test jest", + "cover": "npm test -- --verbose --coverage --collectCoverageFrom \"src/**/*.js\"", "lint": "eslint src test", "prepublishOnly": "npm run lint && npm test && npm run clean && npm run build", "size": "size-limit" @@ -34,27 +34,32 @@ "dependencies": {}, "devDependencies": { "babel-cli": "^6.26.0", - "babel-plugin-istanbul": "^4.1.6", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-preset-env": "^1.7.0", "coveralls": "^3.0.1", "cross-env": "^5.2.0", "eslint": "^4.19.1", "eslint-plugin-prettier": "^2.6.0", - "isomorphic-fetch": "^2.2.1", + "jest": "^23.4.1", + "jest-fetch-mock": "^1.6.5", "microbundle": "^0.5.1", - "nock": "^9.3.3", - "nyc": "^12.0.2", "prettier": "^1.13.5", "rimraf": "^2.6.2", - "size-limit": "^0.18.2", - "tap-spec": "^5.0.0 ", - "tape": "^4.9.1" + "size-limit": "^0.18.2" }, "files": [ "README.md", "LICENSE.md", "es", "lib" - ] + ], + "jest": { + "automock": false, + "resetMocks": true, + "restoreMocks": true, + "resetModules": true, + "setupFiles": [ + "./test/setupJest.js" + ] + } } diff --git a/src/__snapshots__/errors.test.js.snap b/src/__snapshots__/errors.test.js.snap new file mode 100644 index 0000000..9d164df --- /dev/null +++ b/src/__snapshots__/errors.test.js.snap @@ -0,0 +1,82 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ApiError matches snapshot 1`] = `[ApiError: 404 - Not Found]`; + +exports[`ApiError matches snapshot: object.entries 1`] = ` +Array [ + Array [ + "name", + "ApiError", + ], + Array [ + "status", + 404, + ], + Array [ + "statusText", + "Not Found", + ], + Array [ + "response", + Object { + "error": "Resource not found", + }, + ], + Array [ + "message", + "404 - Not Found", + ], +] +`; + +exports[`InternalError matches snapshot 1`] = `[InternalError: error thrown in payload function]`; + +exports[`InternalError matches snapshot: object.entries 1`] = ` +Array [ + Array [ + "name", + "InternalError", + ], + Array [ + "message", + "error thrown in payload function", + ], +] +`; + +exports[`InvalidRSAA matches snapshot 1`] = `[InvalidRSAA: Invalid RSAA]`; + +exports[`InvalidRSAA matches snapshot: object.entries 1`] = ` +Array [ + Array [ + "name", + "InvalidRSAA", + ], + Array [ + "message", + "Invalid RSAA", + ], + Array [ + "validationErrors", + Array [ + "validation error 1", + "validation error 2", + ], + ], +] +`; + +exports[`RequestError matches snapshot 1`] = `[RequestError: Network request failed]`; + +exports[`RequestError matches snapshot: object.entries 1`] = ` +Array [ + Array [ + "name", + "RequestError", + ], + Array [ + "message", + "Network request failed", + ], +] +`; diff --git a/src/__snapshots__/middleware.test.js.snap b/src/__snapshots__/middleware.test.js.snap new file mode 100644 index 0000000..94a90e2 --- /dev/null +++ b/src/__snapshots__/middleware.test.js.snap @@ -0,0 +1,2011 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-JSON response: final result 1`] = ` +Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-empty JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-empty JSON response: final result 1`] = ` +Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-empty JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with an empty JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with an empty JSON response: final result 1`] = ` +Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA on an unsuccessful API call with an empty JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "failureMeta", + "payload": [ApiError: 404 - Not Found], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA when [RSAA].ok returns false on a successful request: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA when [RSAA].ok returns false on a successful request: final result 1`] = ` +Object { + "error": true, + "meta": undefined, + "payload": [ApiError: 200 - OK], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA when [RSAA].ok returns false on a successful request: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": undefined, + "payload": [ApiError: 200 - OK], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": undefined, + "payload": [ApiError: 200 - OK], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA when [RSAA].ok returns false on a successful request: ok() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Body { + "_abort": false, + "_bytes": 16, + "_raw": Array [ + Object { + "data": Array [ + 123, + 34, + 100, + 97, + 116, + 97, + 34, + 58, + 34, + 49, + 50, + 51, + 52, + 53, + 34, + 125, + ], + "type": "Buffer", + }, + ], + "body": "{\\"data\\":\\"12345\\"}", + "bodyUsed": true, + "headers": Headers { + "_headers": Object { + "content-type": Array [ + "application/json", + ], + }, + }, + "ok": true, + "size": 0, + "status": 200, + "statusText": "OK", + "timeout": 0, + "url": undefined, + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": false, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA with an error on a request error: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA with an error on a request error: final result 1`] = ` +Object { + "error": true, + "meta": undefined, + "payload": [RequestError: Test request error], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch a failure FSA with an error on a request error: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "someMeta", + "payload": "ignoredPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": undefined, + "payload": [RequestError: Test request error], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "someMeta", + "payload": "ignoredPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": undefined, + "payload": [RequestError: Test request error], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-JSON response: final result 1`] = ` +Object { + "meta": "successMeta", + "payload": undefined, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": "successMeta", + "payload": undefined, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": "successMeta", + "payload": undefined, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response: fetch mock 2`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response: final result 1`] = ` +Object { + "meta": "successMeta", + "payload": Object { + "username": "Alice", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response: final result 2`] = ` +Object { + "meta": "successMeta", + "payload": Object { + "username": "Alice", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": "successMeta", + "payload": Object { + "username": "Alice", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": "successMeta", + "payload": Object { + "username": "Alice", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response: next mock 2`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": "successMeta", + "payload": Object { + "username": "Alice", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": "successMeta", + "payload": Object { + "username": "Alice", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with an empty JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with an empty JSON response: final result 1`] = ` +Object { + "meta": "successMeta", + "payload": Object {}, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must dispatch a success FSA on a successful API call with an empty JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": "successMeta", + "payload": Object {}, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": "successMeta", + "payload": Object {}, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA with an error state on a successful API call with an invalid JSON response: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch a success FSA with an error state on a successful API call with an invalid JSON response: final result 1`] = ` +Object { + "error": true, + "meta": "successMeta", + "payload": [InternalError: Expected error - simulating invalid JSON], + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must dispatch a success FSA with an error state on a successful API call with an invalid JSON response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": "successMeta", + "payload": [InternalError: Expected error - simulating invalid JSON], + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "successMeta", + "payload": [InternalError: Expected error - simulating invalid JSON], + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA for an invalid RSAA with a descriptor request type: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "payload": [InvalidRSAA: Invalid RSAA], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "payload": [InvalidRSAA: Invalid RSAA], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA for an invalid RSAA with a string request type: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "payload": [InvalidRSAA: Invalid RSAA], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "payload": [InvalidRSAA: Invalid RSAA], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].bailout fails: final result 1`] = ` +Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].bailout function failed], + "type": "REQUEST", +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].bailout fails: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].bailout function failed], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].bailout function failed], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].body fails: final result 1`] = ` +Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].body function failed], + "type": "REQUEST", +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].body fails: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].body function failed], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].body function failed], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].endpoint fails: final result 1`] = ` +Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].endpoint function failed], + "type": "REQUEST", +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].endpoint fails: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].endpoint function failed], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].endpoint function failed], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].headers fails: final result 1`] = ` +Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].headers function failed], + "type": "REQUEST", +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].headers fails: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].headers function failed], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].headers function failed], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].ok fails: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].ok fails: final result 1`] = ` +Object { + "error": true, + "meta": undefined, + "payload": [InternalError: [RSAA].ok function failed], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].ok fails: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": undefined, + "payload": [InternalError: [RSAA].ok function failed], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": undefined, + "payload": [InternalError: [RSAA].ok function failed], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].options fails: final result 1`] = ` +Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].options function failed], + "type": "REQUEST", +} +`; + +exports[`#apiMiddleware must dispatch an error request FSA when [RSAA].options fails: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].options function failed], + "type": "REQUEST", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": "someMeta", + "payload": [RequestError: [RSAA].options function failed], + "type": "REQUEST", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must dispatch correct error payload when [RSAA].fetch wrapper returns an error response: final result 1`] = ` +Object { + "error": true, + "meta": undefined, + "payload": [ApiError: 500 - Internal Server Error], + "type": "FAILURE", +} +`; + +exports[`#apiMiddleware must dispatch correct error payload when [RSAA].fetch wrapper returns an error response: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "error": true, + "meta": undefined, + "payload": [ApiError: 500 - Internal Server Error], + "type": "FAILURE", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "error": true, + "meta": undefined, + "payload": [ApiError: 500 - Internal Server Error], + "type": "FAILURE", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must pass actions without an [RSAA] property to the next handler: final result 1`] = `Object {}`; + +exports[`#apiMiddleware must pass actions without an [RSAA] property to the next handler: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object {}, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use a [RSAA].fetch custom fetch wrapper when present: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use a [RSAA].fetch custom fetch wrapper when present: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "error": false, + "foo": "bar", + "id": 1, + "name": "Alan", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use a [RSAA].fetch custom fetch wrapper when present: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "error": false, + "foo": "bar", + "id": 1, + "name": "Alan", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "error": false, + "foo": "bar", + "id": 1, + "name": "Alan", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].bailout function when present: bailout() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": true, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].body function when present: body() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": "mockBody", + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].body function when present: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": "mockBody", + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].body function when present: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use an [RSAA].body function when present: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].endpoint function when present: endpoint() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": "http://127.0.0.1/api/users/1", + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].endpoint function when present: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].endpoint function when present: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use an [RSAA].endpoint function when present: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].headers function when present: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object { + "Test-Header": "test", + }, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].headers function when present: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use an [RSAA].headers function when present: headers() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "Test-Header": "test", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].headers function when present: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].ok function when present: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].ok function when present: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use an [RSAA].ok function when present: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].ok function when present: ok() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Body { + "_abort": false, + "_bytes": 16, + "_raw": Array [ + Object { + "data": Array [ + 123, + 34, + 100, + 97, + 116, + 97, + 34, + 58, + 34, + 49, + 50, + 51, + 52, + 53, + 34, + 125, + ], + "type": "Buffer", + }, + ], + "body": "{\\"data\\":\\"12345\\"}", + "bodyUsed": true, + "headers": Headers { + "_headers": Object { + "content-type": Array [ + "application/json", + ], + }, + }, + "ok": true, + "size": 0, + "status": 200, + "statusText": "OK", + "timeout": 0, + "url": undefined, + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": true, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].options function when present: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].options function when present: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use an [RSAA].options function when present: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use an [RSAA].options function when present: options() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use meta property of request type descriptor when it is a function: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use meta property of request type descriptor when it is a function: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use meta property of request type descriptor when it is a function: meta() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "@@redux-api-middleware/RSAA": Object { + "endpoint": "http://127.0.0.1/api/users/1", + "method": "GET", + "types": Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + "SUCCESS", + "FAILURE", + ], + }, + }, + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": "requestMeta", + }, + ], +} +`; + +exports[`#apiMiddleware must use meta property of request type descriptor when it is a function: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use payload property of request type descriptor when it is a function: fetch mock 1`] = ` +Object { + "calls": Array [ + Array [ + "http://127.0.0.1/api/users/1", + Object { + "body": undefined, + "credentials": undefined, + "headers": Object {}, + "method": "GET", + }, + ], + ], + "instances": Array [ + undefined, + ], + "invocationCallOrder": Any, + "results": Array [ + Object { + "isThrow": false, + "value": Promise {}, + }, + ], +} +`; + +exports[`#apiMiddleware must use payload property of request type descriptor when it is a function: final result 1`] = ` +Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", +} +`; + +exports[`#apiMiddleware must use payload property of request type descriptor when it is a function: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + ], + Array [ + Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + }, + Object { + "isThrow": false, + "value": Object { + "meta": undefined, + "payload": Object { + "data": "12345", + }, + "type": "SUCCESS", + }, + }, + ], +} +`; + +exports[`#apiMiddleware must use payload property of request type descriptor when it is a function: payload() 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object { + "@@redux-api-middleware/RSAA": Object { + "endpoint": "http://127.0.0.1/api/users/1", + "method": "GET", + "types": Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + "SUCCESS", + "FAILURE", + ], + }, + }, + undefined, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": "requestPayload", + }, + ], +} +`; + +exports[`#apiMiddleware mustn't return a promise on actions without a [RSAA] property: final result 1`] = `Object {}`; + +exports[`#apiMiddleware mustn't return a promise on actions without a [RSAA] property: next mock 1`] = ` +[MockFunction] { + "calls": Array [ + Array [ + Object {}, + ], + ], + "results": Array [ + Object { + "isThrow": false, + "value": Object {}, + }, + ], +} +`; diff --git a/src/__snapshots__/util.test.js.snap b/src/__snapshots__/util.test.js.snap new file mode 100644 index 0000000..ca1c50a --- /dev/null +++ b/src/__snapshots__/util.test.js.snap @@ -0,0 +1,109 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`#actionWith handles a synchronous meta function 1`] = ` +Object { + "meta": "someMeta", + "payload": undefined, + "type": "REQUEST", +} +`; + +exports[`#actionWith handles a synchronous payload function 1`] = ` +Object { + "meta": undefined, + "payload": "somePayload", + "type": "REQUEST", +} +`; + +exports[`#actionWith handles an asynchronous meta function 1`] = ` +Object { + "meta": Promise {}, + "payload": undefined, + "type": "REQUEST", +} +`; + +exports[`#actionWith handles an asynchronous payload function 1`] = ` +Object { + "meta": undefined, + "payload": Promise {}, + "type": "REQUEST", +} +`; + +exports[`#actionWith handles an error in the meta function 1`] = ` +Object { + "error": true, + "payload": [InternalError: test error in meta function], + "type": "REQUEST", +} +`; + +exports[`#actionWith handles an error in the payload function 1`] = ` +Object { + "error": true, + "meta": undefined, + "payload": [InternalError: test error in payload function], + "type": "REQUEST", +} +`; + +exports[`#actionWith handles function payload and meta descriptor properties 1`] = ` +Object { + "meta": "someMetaFromFn", + "payload": "somePayloadFromFn", + "type": "REQUEST", +} +`; + +exports[`#actionWith handles string payload and meta descriptor properties 1`] = ` +Object { + "error": true, + "meta": "someMeta", + "payload": "somePayload", + "type": "REQUEST", +} +`; + +exports[`#getJSON returns the JSON body of a response with a JSONy 'Content-Type' header 1`] = ` +Object { + "message": "ok", +} +`; + +exports[`#normalizeTypeDescriptors handles object types 1`] = ` +Array [ + Object { + "meta": "requestMeta", + "payload": "requestPayload", + "type": "REQUEST", + }, + Object { + "meta": "successMeta", + "payload": "successPayload", + "type": "SUCCESS", + }, + Object { + "meta": "failureMeta", + "payload": "failurePayload", + "type": "FAILURE", + }, +] +`; + +exports[`#normalizeTypeDescriptors handles string types 1`] = ` +Array [ + Object { + "type": "REQUEST", + }, + Object { + "payload": [Function], + "type": "SUCCESS", + }, + Object { + "payload": [Function], + "type": "FAILURE", + }, +] +`; diff --git a/src/__snapshots__/validation.test.js.snap b/src/__snapshots__/validation.test.js.snap new file mode 100644 index 0000000..5236a0b --- /dev/null +++ b/src/__snapshots__/validation.test.js.snap @@ -0,0 +1,139 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].bailout property 1`] = ` +Array [ + "[RSAA].bailout property must be undefined, a boolean, or a function", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].credentials property 1`] = ` +Array [ + "[RSAA].credentials property must be undefined, or a string", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].credentials property 2`] = ` +Array [ + "Invalid [RSAA].credentials: InvalidCredentials", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].endpoint property 1`] = ` +Array [ + "[RSAA].endpoint property must be a string or a function", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].fetch property 1`] = ` +Array [ + "[RSAA].fetch property must be a function", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].headers property 1`] = ` +Array [ + "[RSAA].headers property must be undefined, a plain JavaScript object, or a function", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].method property 1`] = ` +Array [ + "[RSAA].method property must be a string", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].method property 2`] = ` +Array [ + "Invalid [RSAA].method: INVALID_METHOD", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].ok property 1`] = ` +Array [ + "[RSAA].ok property must be a function", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].options property 1`] = ` +Array [ + "[RSAA].options property must be undefined, a plain JavaScript object, or a function", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].types property 1`] = ` +Array [ + "[RSAA].types property must be an array of length 3", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].types property 2`] = ` +Array [ + "[RSAA].types property must be an array of length 3", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid [RSAA].types property 3`] = ` +Array [ + "Invalid request type", + "Invalid success type", + "Invalid failure type", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid RSAA value 1`] = ` +Array [ + "[RSAA] property must be a plain JavaScript object", + "[RSAA] must have an endpoint property", + "[RSAA] must have a method property", + "[RSAA] must have a types property", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid RSAA value 2`] = ` +Array [ + "Invalid [RSAA] key: invalidKey", + "[RSAA] must have an endpoint property", + "[RSAA] must have a method property", + "[RSAA] must have a types property", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles invalid actions 1`] = ` +Array [ + "RSAAs must be plain JavaScript objects with an [RSAA] property", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles missing RSAA properties 1`] = ` +Array [ + "[RSAA] must have an endpoint property", + "[RSAA] must have a method property", + "[RSAA] must have a types property", +] +`; + +exports[`#validateRSAA / #isValidRSAA handles top-level string properties other than RSAA 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles top-level symbol properties other than RSAA 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with bailout boolean 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with bailout function 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with endpoint function 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with endpoint string 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with fetch function 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with headers function 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with headers object 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with options function 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with options object 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with types of symbols 1`] = `Array []`; + +exports[`#validateRSAA / #isValidRSAA handles valid RSAA with types of type descriptors 1`] = `Array []`; diff --git a/src/errors.test.js b/src/errors.test.js new file mode 100644 index 0000000..c0e482d --- /dev/null +++ b/src/errors.test.js @@ -0,0 +1,61 @@ +// Public package exports +import { + InvalidRSAA, + InternalError, + RequestError, + ApiError +} from './index.js'; + +describe('InvalidRSAA', () => { + const validationErrors = ['validation error 1', 'validation error 2']; + const error = new InvalidRSAA(validationErrors); + + it('is an error object', () => { + expect(error).toBeInstanceOf(Error) + }) + + it('matches snapshot', () => { + expect(error).toMatchSnapshot() + expect(Object.entries(error)).toMatchSnapshot('object.entries') + }) +}) + +describe('InternalError', () => { + const error = new InternalError('error thrown in payload function'); + + it('is an error object', () => { + expect(error).toBeInstanceOf(Error) + }) + + it('matches snapshot', () => { + expect(error).toMatchSnapshot() + expect(Object.entries(error)).toMatchSnapshot('object.entries') + }) +}) + +describe('RequestError', () => { + const error = new RequestError('Network request failed'); + + it('is an error object', () => { + expect(error).toBeInstanceOf(Error) + }) + + it('matches snapshot', () => { + expect(error).toMatchSnapshot() + expect(Object.entries(error)).toMatchSnapshot('object.entries') + }) +}) + +describe('ApiError', () => { + const json = { error: 'Resource not found' }; + const error = new ApiError(404, 'Not Found', json); + + it('is an error object', () => { + expect(error).toBeInstanceOf(Error) + }) + + it('matches snapshot', () => { + expect(error).toMatchSnapshot() + expect(Object.entries(error)).toMatchSnapshot('object.entries') + }) +}) \ No newline at end of file diff --git a/src/middleware.test.js b/src/middleware.test.js new file mode 100644 index 0000000..582a31a --- /dev/null +++ b/src/middleware.test.js @@ -0,0 +1,944 @@ +// Public package exports +import { + RSAA, + apiMiddleware, + createMiddleware, + InternalError +} from './index.js'; + +const fetchMockSnapshotMatcher = { + invocationCallOrder: expect.any(Object) +}; +// const fetchMockSnapshotMatcher = {}; + +const doTestMiddleware = async ({ response, action }) => { + if (response) { + const { body, ...mockConfig } = response + fetch.mockResponseOnce( + body, + mockConfig + ) + } + + const doGetState = jest.fn(); + doGetState.mockImplementation(() => {}); + const doNext = jest.fn(); + doNext.mockImplementation(it => it); + + const nextHandler = apiMiddleware({ getState: doGetState }); + const actionHandler = nextHandler(doNext); + const result = actionHandler(action); + + if (result) { + const final = await result; + if (final) { + expect(final).toMatchSnapshot({}, 'final result') + } + } + + if (doNext.mock.calls.length) { + expect(doNext).toMatchSnapshot({}, 'next mock') + } + + if (fetch.mock.calls.length) { + expect(fetch.mock).toMatchSnapshot({ + invocationCallOrder: expect.any(Object) + }, 'fetch mock'); + } + + return { + doGetState, + nextHandler, + doNext, + actionHandler, + result + } +} + +describe('#createMiddleware', () => { + it('returns a redux middleware', () => { + const doGetState = () => {}; + const middleware = createMiddleware(); + const nextHandler = middleware({ getState: doGetState }); + const doNext = () => {}; + const actionHandler = nextHandler(doNext); + + expect(typeof middleware).toEqual('function') + expect(middleware.length).toEqual(1) + + expect(typeof nextHandler).toEqual('function') + expect(nextHandler.length).toEqual(1) + + expect(typeof actionHandler).toEqual('function') + expect(actionHandler.length).toEqual(1) + }) +}) + +describe('#apiMiddleware', () => { + it('is a redux middleware', () => { + const doGetState = () => {}; + const nextHandler = apiMiddleware({ getState: doGetState }); + const doNext = () => {}; + const actionHandler = nextHandler(doNext); + + expect(typeof apiMiddleware).toEqual('function') + expect(apiMiddleware.length).toEqual(1) + + expect(typeof nextHandler).toEqual('function') + expect(nextHandler.length).toEqual(1) + + expect(typeof actionHandler).toEqual('function') + expect(actionHandler.length).toEqual(1) + }) + + it('must pass actions without an [RSAA] property to the next handler', async () => { + const action = {}; + + const { doNext } = await doTestMiddleware({ + action + }) + expect(doNext).toHaveBeenCalledWith(action) + }) + + it("mustn't return a promise on actions without a [RSAA] property", async () => { + const action = {}; + + const { result } = await doTestMiddleware({ + action + }) + + expect(result.then).toBeUndefined(); + }) + + it("must return a promise on actions without a [RSAA] property", async () => { + const action = { [RSAA]: {} }; + + const { result } = await doTestMiddleware({ + action + }) + + expect(typeof result.then).toEqual('function'); + }) + + it('must dispatch an error request FSA for an invalid RSAA with a string request type', async () => { + const action = { + [RSAA]: { + types: ['REQUEST'] + } + }; + + await doTestMiddleware({ + action + }) + + }) + + it('must dispatch an error request FSA for an invalid RSAA with a descriptor request type', async () => { + const action = { + [RSAA]: { + types: [ + { + type: 'REQUEST' + } + ] + } + }; + + await doTestMiddleware({ + action + }) + + }) + + it('must do nothing for an invalid RSAA without a request type', async () => { + const action = { + [RSAA]: {} + }; + + const { doNext } = await doTestMiddleware({ + action + }) + + expect(doNext).not.toHaveBeenCalled(); + }) + + + it('must dispatch an error request FSA when [RSAA].bailout fails', async () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + bailout: () => { + throw new Error(); + }, + types: [ + { + type: 'REQUEST', + payload: () => 'ignoredPayload', + meta: () => 'someMeta' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action + }) + }) + + // FIXME this doesnt seem like it needs async/await, + // but actionHandler is returning a promise + it('must dispatch an error request FSA when [RSAA].body fails', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + body: () => { + throw new Error(); + }, + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'ignoredPayload', + meta: 'someMeta' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action + }) + }) + + it('must dispatch an error request FSA when [RSAA].endpoint fails', async () => { + const action = { + [RSAA]: { + endpoint: () => { + throw new Error(); + }, + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'ignoredPayload', + meta: 'someMeta' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action + }) + }) + + it('must dispatch an error request FSA when [RSAA].headers fails', async () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + headers: () => { + throw new Error(); + }, + types: [ + { + type: 'REQUEST', + payload: 'ignoredPayload', + meta: 'someMeta' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action + }) + }) + + it('must dispatch an error request FSA when [RSAA].options fails', async () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + options: () => { + throw new Error(); + }, + types: [ + { + type: 'REQUEST', + payload: 'ignoredPayload', + meta: 'someMeta' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action + }) + }) + + it('must dispatch an error request FSA when [RSAA].ok fails', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + ok: () => { + throw new Error(); + }, + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + }) + + it('must dispatch a failure FSA with an error on a request error', async () => { + fetch.mockRejectOnce(new Error('Test request error')) + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'ignoredPayload', + meta: 'someMeta' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action + }) + }) + + it('must use an [RSAA].bailout boolean when present', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + bailout: true + } + }; + + await doTestMiddleware({ + action, + }) + }) + + it('must use an [RSAA].bailout function when present', async () => { + const bailout = jest.fn(); + bailout.mockReturnValue(true) + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + bailout + } + }; + + const { doNext } = await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(bailout).toMatchSnapshot({}, 'bailout()'); + expect(doNext).not.toHaveBeenCalled() + }) + + it('must use an [RSAA].body function when present', async () => { + const body = jest.fn(); + body.mockReturnValue('mockBody') + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + body + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(body).toMatchSnapshot({}, 'body()'); + }) + + it('must use an [RSAA].endpoint function when present', async () => { + const endpoint = jest.fn(); + endpoint.mockReturnValue('http://127.0.0.1/api/users/1') + + const action = { + [RSAA]: { + endpoint, + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(endpoint).toMatchSnapshot({}, 'endpoint()'); + }) + + it('must use an [RSAA].headers function when present', async () => { + const headers = jest.fn(); + headers.mockReturnValue({ 'Test-Header': 'test' }) + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + headers + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(headers).toMatchSnapshot({}, 'headers()'); + }) + + it('must use an [RSAA].options function when present', async () => { + const options = jest.fn(); + options.mockReturnValue({}) + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + options + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(options).toMatchSnapshot({}, 'options()'); + }) + + it('must use an [RSAA].ok function when present', async () => { + const ok = jest.fn(); + ok.mockReturnValue(true) + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + ok + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(ok).toMatchSnapshot({}, 'ok()'); + }) + + it('must dispatch a failure FSA when [RSAA].ok returns false on a successful request', async () => { + const ok = jest.fn(); + ok.mockReturnValue(false) + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + ok + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(ok).toMatchSnapshot({}, 'ok()'); + }) + + it('must use a [RSAA].fetch custom fetch wrapper when present', async () => { + const myFetch = async (endpoint, opts) => { + const res = await fetch(endpoint, opts); + const json = await res.json(); + + return new Response( + JSON.stringify({ + ...json, + foo: 'bar' + }), + { + // Example of custom `res.ok` + status: json.error ? 500 : 200, + headers: { + 'Content-Type': 'application/json' + } + } + ); + }; + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + fetch: myFetch + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ + id: 1, + name: 'Alan', + error: false + }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + }) + + it('must dispatch correct error payload when [RSAA].fetch wrapper returns an error response', async () => { + const myFetch = async (endpoint, opts) => { + return new Response( + JSON.stringify({ + foo: 'bar' + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json' + } + } + ); + }; + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + fetch: myFetch + } + }; + + await doTestMiddleware({ + action + }) + }) + + it('must use payload property of request type descriptor when it is a function', async () => { + const payload = jest.fn() + payload.mockReturnValue('requestPayload') + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + meta: 'requestMeta', + payload + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(payload).toMatchSnapshot({}, 'payload()'); + }) + + it('must use meta property of request type descriptor when it is a function', async () => { + const meta = jest.fn() + meta.mockReturnValue('requestMeta') + + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + meta, + payload: 'requestPayload' + }, + 'SUCCESS', + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ data: '12345' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + expect(meta).toMatchSnapshot({}, 'meta()'); + }) + + it('must dispatch a success FSA on a successful API call with a non-empty JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + meta: 'successMeta' + }, + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ username: 'Alice' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + }) + + it('must dispatch a success FSA on a successful API call with a non-empty JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + meta: 'successMeta' + }, + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ username: 'Alice' }), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + }) + + it('must dispatch a success FSA on a successful API call with an empty JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + meta: 'successMeta' + }, + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({}), + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + }) + + it('must dispatch a success FSA with an error state on a successful API call with an invalid JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + meta: 'successMeta', + payload: () => { + throw new InternalError('Expected error - simulating invalid JSON'); + } + }, + 'FAILURE' + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: '', + status: 200, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + }) + + it('must dispatch a success FSA on a successful API call with a non-JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + meta: 'successMeta' + }, + 'FAILURE' + ] + + } + }; + + await doTestMiddleware({ + action, + response: { + body: null, + status: 200, + } + }) + + }) + + it('must dispatch a failure FSA on an unsuccessful API call with a non-empty JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + 'SUCCESS', + { + type: 'FAILURE', + meta: 'failureMeta' + } + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ error: 'Resource not found' }), + status: 404, + headers: { + 'Content-Type': 'application/json' + } + } + }) + + }) + + it('must dispatch a failure FSA on an unsuccessful API call with an empty JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + 'SUCCESS', + { + type: 'FAILURE', + meta: 'failureMeta' + } + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: JSON.stringify({ }), + status: 404, + headers: { + 'Content-Type': 'application/json' + } + } + }) + }) + + it('must dispatch a failure FSA on an unsuccessful API call with a non-JSON response', async () => { + const action = { + [RSAA]: { + endpoint: 'http://127.0.0.1/api/users/1', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + 'SUCCESS', + { + type: 'FAILURE', + meta: 'failureMeta' + } + ] + } + }; + + await doTestMiddleware({ + action, + response: { + body: '', + status: 404 + } + }) + }) +}) diff --git a/src/util.test.js b/src/util.test.js new file mode 100644 index 0000000..3455ab5 --- /dev/null +++ b/src/util.test.js @@ -0,0 +1,165 @@ +// Public package exports +import { + RSAA, + getJSON +} from './index.js'; + +// Private package import +import { normalizeTypeDescriptors, actionWith } from './util'; + +describe('#normalizeTypeDescriptors', () => { + it('handles string types', () => { + const types = ['REQUEST', 'SUCCESS', 'FAILURE']; + const descriptors = normalizeTypeDescriptors(types); + expect(descriptors).toMatchSnapshot() + }) + + it('handles object types', () => { + const types = [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + payload: 'successPayload', + meta: 'successMeta' + }, + { + type: 'FAILURE', + payload: 'failurePayload', + meta: 'failureMeta' + } + ]; + const descriptors = normalizeTypeDescriptors(types); + expect(descriptors).toMatchSnapshot() + }) +}) + +describe('#actionWith', () => { + it('handles string payload and meta descriptor properties', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + payload: 'somePayload', + meta: 'someMeta', + error: true + }) + + expect(fsa).toMatchSnapshot() + }) + + it('handles function payload and meta descriptor properties', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + payload: () => 'somePayloadFromFn', + meta: () => 'someMetaFromFn' + }) + expect(fsa).toMatchSnapshot() + }) + + it('passes function payload and meta descriptor properties arguments', async () => { + const payload = jest.fn(); + payload.mockReturnValue('somePayloadFromMock') + const meta = jest.fn(); + meta.mockReturnValue('someMetaFromMock') + + const passedArgs = ['action', 'state', 'res']; + const fsa = await actionWith({ + type: 'REQUEST', + payload, + meta + }, passedArgs) + + expect(payload).toHaveBeenCalledWith(...passedArgs) + expect(meta).toHaveBeenCalledWith(...passedArgs) + }) + + it('handles an error in the payload function', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + payload: () => { + throw new Error('test error in payload function'); + } + }) + + expect(fsa).toMatchSnapshot() + }) + + it('handles an error in the meta function', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + meta: () => { + throw new Error('test error in meta function'); + } + }) + + expect(fsa).toMatchSnapshot() + }) + + it('handles a synchronous payload function', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + payload: () => 'somePayload', + }) + + expect(fsa).toMatchSnapshot() + }) + + it('handles an asynchronous payload function', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + payload: new Promise(resolve => setTimeout(() => resolve('somePayloadAsync'), 250)), + }) + + expect(fsa).toMatchSnapshot() + }) + + it('handles a synchronous meta function', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + meta: () => 'someMeta', + }) + + expect(fsa).toMatchSnapshot() + }) + + it('handles an asynchronous meta function', async () => { + const fsa = await actionWith({ + type: 'REQUEST', + meta: new Promise(resolve => setTimeout(() => resolve('someMetaAsync'), 250)), + }) + + expect(fsa).toMatchSnapshot() + }) +}) + +describe('#getJSON', () => { + it("returns the JSON body of a response with a JSONy 'Content-Type' header", async () => { + const res = { + headers: { + get(name) { + return name === 'Content-Type' ? 'application/json' : undefined; + } + }, + json() { + return Promise.resolve({ message: 'ok' }); + } + }; + + const result = await getJSON(res); + expect(result).toMatchSnapshot(); + }) + + it("returns a resolved promise for a response with a not-JSONy 'Content-Type' header", async () => { + const res = { + headers: { + get(name) { + return name === 'Content-Type' ? 'not it' : undefined; + } + } + }; + const result = await getJSON(res); + expect(result).toBeUndefined() + }) +}) diff --git a/src/validation.test.js b/src/validation.test.js new file mode 100644 index 0000000..336bb6f --- /dev/null +++ b/src/validation.test.js @@ -0,0 +1,469 @@ +// Public package exports +import { + RSAA, + isRSAA, + validateRSAA, + isValidRSAA +} from './index.js'; + +// Private package import +import { isValidTypeDescriptor } from './validation'; + +describe('#isValidTypeDescriptor', () => { + it('must be a plain JavaScript object', () => { + var descriptor = ''; + expect(isValidTypeDescriptor(descriptor)).toBeFalsy(); + }) + + it('must not have properties other than type, payload and meta', () => { + var descriptor = { + type: '', + invalidKey: '' + }; + expect(isValidTypeDescriptor(descriptor)).toBeFalsy(); + }) + + it('must have a type property', () => { + var descriptor = {}; + expect(isValidTypeDescriptor(descriptor)).toBeFalsy(); + }) + + it('must not have a type property that is not a string or a symbol', () => { + var descriptor = { + type: {} + }; + expect(isValidTypeDescriptor(descriptor)).toBeFalsy(); + }) + + it('may have a type property that is a string', () => { + var descriptor = { + type: '' + }; + expect(isValidTypeDescriptor(descriptor)).toBeTruthy(); + }) + + it('may have a type property that is a symbol', () => { + var descriptor = { + type: Symbol() + }; + expect(isValidTypeDescriptor(descriptor)).toBeTruthy(); + }) +}) + +describe('#isRSAA', () => { + it('RSAAs must be plain JavaScript objects', () => { + expect(isRSAA('')).toBeFalsy() + }) + + it('RSAAs must have an [RSAA] property', () => { + expect(isRSAA({})).toBeFalsy() + }) + + it('returns true for an RSAA', () => { + expect(isRSAA({ [RSAA]: {}})).toBeTruthy() + }) +}) + +describe('#validateRSAA / #isValidRSAA', () => { + it('handles invalid actions', () => { + expect(isValidRSAA('')).toBeFalsy(); + expect(validateRSAA('')).toMatchSnapshot(); + }) + + it('handles invalid RSAA value', () => { + const action = { + [RSAA]: '' + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid RSAA value', () => { + const action = { + [RSAA]: { invalidKey: '' } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles missing RSAA properties', () => { + const action = { + [RSAA]: {} + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].endpoint property', () => { + const action = { + [RSAA]: { + endpoint: {}, + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].method property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: {}, + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].method property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'INVALID_METHOD', + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].headers property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + headers: '' + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].credentials property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + credentials: {} + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].credentials property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + credentials: 'InvalidCredentials' + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].bailout property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + bailout: '' + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].types property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: {} + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].types property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['a', 'b'] + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].types property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: [{}, {}, {}] + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].options property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + options: '' + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].fetch property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + fetch: {} + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles invalid [RSAA].ok property', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + ok: {} + } + }; + + expect(isValidRSAA(action)).toBeFalsy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with endpoint string', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with endpoint function', () => { + const action = { + [RSAA]: { + endpoint: () => '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with headers object', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + headers: {} + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with headers function', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + headers: () => ({}) + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with bailout boolean', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + bailout: false + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with bailout function', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + bailout: () => false + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with types of symbols', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: [Symbol(), Symbol(), Symbol()] + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with types of type descriptors', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: [ + { + type: 'REQUEST', + payload: 'requestPayload', + meta: 'requestMeta' + }, + { + type: 'SUCCESS', + payload: 'successPayload', + meta: 'successMeta' + }, + { + type: 'FAILURE', + payload: 'failurePayload', + meta: 'failureMeta' + } + ] + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with options object', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + options: {} + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with options function', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + options: () => ({}) + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles valid RSAA with fetch function', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'], + fetch: () => {} + } + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }); + + it('handles top-level string properties other than RSAA', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + }, + anotherKey: 'foo' + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }) + + it('handles top-level symbol properties other than RSAA', () => { + const action = { + [RSAA]: { + endpoint: '', + method: 'GET', + types: ['REQUEST', 'SUCCESS', 'FAILURE'] + }, + [Symbol('action30 Symbol')]: 'foo' + }; + + expect(isValidRSAA(action)).toBeTruthy(); + expect(validateRSAA(action)).toMatchSnapshot(); + }) +}) \ No newline at end of file diff --git a/test/index.js b/test/index.js deleted file mode 100644 index a822851..0000000 --- a/test/index.js +++ /dev/null @@ -1,2251 +0,0 @@ -import test from 'tape'; -import 'isomorphic-fetch'; -import nock from 'nock'; - -// Public package exports -import { - RSAA, - isRSAA, - validateRSAA, - isValidRSAA, - InvalidRSAA, - InternalError, - RequestError, - ApiError, - getJSON, - apiMiddleware, - createMiddleware -} from '../src'; - -// Private module exports -import { isValidTypeDescriptor } from '../src/validation'; -import { normalizeTypeDescriptors, actionWith } from '../src/util'; - -test('isRSAA must identify RSAAs', t => { - const action1 = ''; - t.notOk(isRSAA(action1), 'RSAAs must be plain JavaScript objects'); - - const action2 = {}; - t.notOk(isRSAA(action2), 'RSAAs must have an [RSAA] property'); - - const action3 = { - [RSAA]: {} - }; - t.ok(isRSAA(action3), 'isRSAA must return true for an RSAA'); - - t.end(); -}); - -test('isValidTypeDescriptor must identify conformant type descriptors', t => { - var descriptor1 = ''; - t.notOk( - isValidTypeDescriptor(descriptor1), - 'type descriptors must be plain JavaScript objects' - ); - - var descriptor2 = { - type: '', - invalidKey: '' - }; - t.notOk( - isValidTypeDescriptor(descriptor2), - 'type descriptors must not have properties other than type, payload and meta' - ); - - var descriptor3 = {}; - t.notOk( - isValidTypeDescriptor(descriptor3), - 'type descriptors must have a type property' - ); - - var descriptor4 = { - type: {} - }; - t.notOk( - isValidTypeDescriptor(descriptor4), - 'type property must be a string, or a symbol' - ); - - var descriptor5 = { - type: '' - }; - t.ok(isValidTypeDescriptor(descriptor5), 'type property may be a string'); - - var descriptor6 = { - type: Symbol() - }; - t.ok(isValidTypeDescriptor(descriptor6), 'type property may be a symbol'); - - t.end(); -}); - -test('validateRSAA/isValidRSAA must identify conformant RSAAs', t => { - const action1 = ''; - t.ok( - validateRSAA(action1).length === 1 && - validateRSAA(action1).includes( - 'RSAAs must be plain JavaScript objects with an [RSAA] property' - ), - 'RSAAs must be plain JavaScript objects with an [RSAA] property (validateRSAA)' - ); - t.notOk( - isValidRSAA(action1), - 'RSAAs must be plain JavaScript objects with an [RSAA] property (isValidRSAA)' - ); - - const action2 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - }, - anotherKey: 'foo' - }; - t.equal( - validateRSAA(action2).length, - 0, - 'RSAAs may have properties other than [RSAA] (validateRSAA)' - ); - - const action3 = { - [RSAA]: '' - }; - t.ok( - validateRSAA(action3).includes( - '[RSAA] property must be a plain JavaScript object' - ), - '[RSAA] property must be a plain JavaScript object (validateRSAA)' - ); - t.notOk( - isValidRSAA(action3), - '[RSAA] property must be a plain JavaScript object (isValidRSAA)' - ); - - const action4 = { - [RSAA]: { invalidKey: '' } - }; - t.ok( - validateRSAA(action4).includes('Invalid [RSAA] key: invalidKey'), - '[RSAA] must not have properties other than endpoint, method, types, body, headers, credentials, options and bailout (validateRSAA)' - ); - t.notOk( - isValidRSAA(action4), - '[RSAA] must not have properties other than endpoint, method, types, body, headers, credentials, options and bailout (isValidRSAA)' - ); - - const action5 = { - [RSAA]: {} - }; - t.ok( - validateRSAA(action5).includes( - '[RSAA] must have an endpoint property', - '[RSAA] must have a method property', - '[RSAA] must have a types property' - ), - '[RSAA] must have endpoint, method, and types properties (validateRSAA)' - ); - t.notOk( - isValidRSAA(action5), - '[RSAA] must have endpoint, method, and types properties (isValidRSAA)' - ); - - const action6 = { - [RSAA]: { - endpoint: {}, - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - t.ok( - validateRSAA(action6).includes( - '[RSAA].endpoint property must be a string or a function' - ), - '[RSAA].endpoint must be a string or a function (validateRSAA)' - ); - t.notOk( - isValidRSAA(action6), - '[RSAA].endpoint must be a string or a function (isValidRSAA)' - ); - - const action7 = { - [RSAA]: { - endpoint: '', - method: {}, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - t.ok( - validateRSAA(action7).includes('[RSAA].method property must be a string'), - '[RSAA].method property must be a string (validateRSAA)' - ); - t.notOk( - isValidRSAA(action7), - '[RSAA].method property must be a string (isValidRSAA)' - ); - - const action8 = { - [RSAA]: { - endpoint: '', - method: 'InvalidMethod', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - t.ok( - validateRSAA(action8).includes('Invalid [RSAA].method: INVALIDMETHOD'), - "[RSAA].method must be one of the strings 'GET', 'HEAD', 'POST', 'PUT', 'PATCH' 'DELETE', or 'OPTIONS' (validateRSAA)" - ); - t.notOk( - isValidRSAA(action8), - "[RSAA].method must be one of the strings 'GET', 'HEAD', 'POST', 'PUT', 'PATCH' 'DELETE', or 'OPTIONS' (isValidRSAA)" - ); - - const action9 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - headers: '' - } - }; - t.ok( - validateRSAA(action9).includes( - '[RSAA].headers property must be undefined, a plain JavaScript object, or a function' - ), - '[RSAA].headers property must be undefined, a plain JavaScript object, or a function (validateRSAA)' - ); - t.notOk( - isValidRSAA(action9), - '[RSAA].headers property must be undefined, a plain JavaScript object, or a function (isValidRSAA)' - ); - - const action10 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - credentials: {} - } - }; - t.ok( - validateRSAA(action10).includes( - '[RSAA].credentials property must be undefined, or a string' - ), - '[RSAA].credentials property must be undefined or a string (validateRSAA)' - ); - t.notOk( - isValidRSAA(action10), - '[RSAA].credentials property must be undefined or a string (isValidRSAA)' - ); - - const action11 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - credentials: 'InvalidCredentials' - } - }; - t.ok( - validateRSAA(action11).includes( - 'Invalid [RSAA].credentials: InvalidCredentials' - ), - "[RSAA].credentials property must be one of the string 'omit', 'same-origin', or 'include' (validateRSAA)" - ); - t.notOk( - isValidRSAA(action11), - "[RSAA].credentials property must be one of the string 'omit', 'same-origin', or 'include' (isValidRSAA)" - ); - - const action111 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - credentials: 'same-origin' - } - }; - t.ok( - validateRSAA(action111).length === 0, - "[RSAA].credentials property must be one of the string 'omit', 'same-origin', or 'include' (validateRSAA)" - ); - t.ok( - isValidRSAA(action111), - "[RSAA].credentials property must be one of the string 'omit', 'same-origin', or 'include' (isValidRSAA)" - ); - - const action12 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - bailout: '' - } - }; - t.ok( - validateRSAA(action12).includes( - '[RSAA].bailout property must be undefined, a boolean, or a function' - ), - '[RSAA].bailout must be undefined, a boolean, or a function (validateRSAA)' - ); - t.notOk( - isValidRSAA(action12), - '[RSAA].bailout must be undefined, a boolean, or a function (isValidRSAA)' - ); - - const action13 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: {} - } - }; - t.ok( - validateRSAA(action13).includes( - '[RSAA].types property must be an array of length 3' - ), - '[RSAA].types property must be an array (validateRSAA)' - ); - t.notOk( - isValidRSAA(action13), - '[RSAA].types property must be an array (isRSAA)' - ); - - const action14 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['a', 'b'] - } - }; - t.ok( - validateRSAA(action14).includes( - '[RSAA].types property must be an array of length 3' - ), - '[RSAA].types property must have length 3 (validateRSAA)' - ); - t.notOk( - isValidRSAA(action14), - '[RSAA].types property must have length 3 (isRSAA)' - ); - - const action15 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: [{}, {}, {}] - } - }; - t.ok( - validateRSAA(action15).includes( - 'Invalid request type', - 'Invalid success type', - 'Invalid failure type' - ), - 'Each element in [RSAA].types property must be a string, a symbol, or a type descriptor (validateRSAA)' - ); - t.notOk( - isValidRSAA(action15), - 'Each element in [RSAA].types property must be a string, a symbol, or a type descriptor (isRSAA)' - ); - - const action16 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - t.equal( - validateRSAA(action16).length, - 0, - '[RSAA].endpoint may be a string (validateRSAA)' - ); - t.ok(isValidRSAA(action16), '[RSAA].endpoint may be a string (isValidRSAA)'); - - const action17 = { - [RSAA]: { - endpoint: () => '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - t.equal( - validateRSAA(action17).length, - 0, - '[RSAA].endpoint may be a function (validateRSAA)' - ); - t.ok( - isValidRSAA(action17), - '[RSAA].endpoint may be a function (isValidRSAA)' - ); - - const action18 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - headers: {} - } - }; - t.equal( - validateRSAA(action18).length, - 0, - '[RSAA].headers may be a plain JavaScript object (validateRSAA)' - ); - t.ok( - isValidRSAA(action18), - '[RSAA].headers may be a plain JavaScript object (isRSAA)' - ); - - const action19 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - headers: () => {} - } - }; - t.equal( - validateRSAA(action19).length, - 0, - '[RSAA].headers may be a function (validateRSAA)' - ); - t.ok(isValidRSAA(action19), '[RSAA].headers may be a function (isRSAA)'); - - const action20 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - bailout: false - } - }; - t.equal( - validateRSAA(action20).length, - 0, - '[RSAA].bailout may be a boolean (validateRSAA)' - ); - t.ok(isValidRSAA(action20), '[RSAA].bailout may be a boolean (isRSAA)'); - - const action21 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - bailout: () => false - } - }; - t.equal( - validateRSAA(action21).length, - 0, - '[RSAA].bailout may be a function (validateRSAA)' - ); - t.ok(isValidRSAA(action21), '[RSAA].bailout may be a function (isRSAA)'); - - const action22 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: [Symbol(), Symbol(), Symbol()] - } - }; - t.equal( - validateRSAA(action22).length, - 0, - 'Each element in [RSAA].types may be a symbol (validateRSAA)' - ); - t.ok( - isValidRSAA(action22), - 'Each element in [RSAA].types may be a symbol (isRSAA)' - ); - - const action23 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - { - type: 'SUCCESS', - payload: 'successPayload', - meta: 'successMeta' - }, - { - type: 'FAILURE', - payload: 'failurePayload', - meta: 'failureMeta' - } - ] - } - }; - t.equal( - validateRSAA(action23).length, - 0, - 'Each element in [RSAA].types may be a type descriptor (validateRSAA)' - ); - t.ok( - isValidRSAA(action23), - 'Each element in [RSAA].types may be a type descriptor (isRSAA)' - ); - - const action24 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - options: '' - } - }; - t.ok( - validateRSAA(action24).includes( - '[RSAA].options property must be undefined, a plain JavaScript object, or a function' - ), - '[RSAA].options property must be undefined, a plain JavaScript object, or a function (validateRSAA)' - ); - t.notOk( - isValidRSAA(action24), - '[RSAA].options property must be undefined, a plain JavaScript object, or a function (isValidRSAA)' - ); - - const action25 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - options: {} - } - }; - t.equal( - validateRSAA(action25).length, - 0, - '[RSAA].options may be a plain JavaScript object (validateRSAA)' - ); - t.ok( - isValidRSAA(action25), - '[RSAA].options may be a plain JavaScript object (isRSAA)' - ); - - const action26 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - options: () => {} - } - }; - t.equal( - validateRSAA(action26).length, - 0, - '[RSAA].options may be a function (validateRSAA)' - ); - t.ok(isValidRSAA(action26), '[RSAA].options may be a function (isRSAA)'); - - const action27 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - fetch: () => {} - } - }; - t.ok( - isValidRSAA(action27), - '[RSAA].fetch property must be a function (isRSAA)' - ); - - const action28 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - fetch: {} - } - }; - t.notOk( - isValidRSAA(action28), - '[RSAA].fetch property must be a function (isRSAA)' - ); - - const action29 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - ok: {} - } - }; - t.notOk( - isValidRSAA(action29), - '[RSAA].ok property must be a function (isRSAA)' - ); - - const action30 = { - [RSAA]: { - endpoint: '', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - }, - [Symbol('action30 Symbol')]: 'foo' - }; - t.equal( - validateRSAA(action30).length, - 0, - 'RSAAs may have Symbol properties other than [RSAA] (validateRSAA)' - ); - - t.end(); -}); - -test('InvalidRSAA', t => { - const validationErrors = ['validation error 1', 'validation error 2']; - const error = new InvalidRSAA(validationErrors); - - t.ok(error instanceof Error, 'is an error object'); - t.equal(error.name, 'InvalidRSAA', 'has correct name property'); - t.equal(error.message, 'Invalid RSAA', 'has correct message'); - t.deepEqual( - error.validationErrors, - validationErrors, - 'has correct validationErrors property' - ); - - t.end(); -}); - -test('InternalError', t => { - const error = new InternalError('error thrown in payload function'); - - t.ok(error instanceof Error, 'is an error object'); - t.equal(error.name, 'InternalError', 'has correct name property'); - t.equal( - error.message, - 'error thrown in payload function', - 'has correct message' - ); - - t.end(); -}); - -test('RequestError', t => { - const error = new RequestError('Network request failed'); - - t.ok(error instanceof Error, 'is an error object'); - t.equal(error.name, 'RequestError', 'has correct name property'); - t.equal(error.message, 'Network request failed', 'has correct message'); - - t.end(); -}); - -test('ApiError', t => { - const json = { error: 'Resource not found' }; - const error = new ApiError(404, 'Not Found', json); - - t.ok(error instanceof Error, 'is an error object'); - t.equal(error.name, 'ApiError', 'has correct name property'); - t.equal(error.message, '404 - Not Found', 'has correct message'); - t.equal(error.status, 404, 'has correct status property'); - t.equal(error.statusText, 'Not Found', 'has correct statusText property'); - t.equal(error.response, json, 'has correct response property'); - - t.end(); -}); - -test('getJSON', async t => { - const res1 = { - headers: { - get(name) { - return name === 'Content-Type' ? 'application/json' : undefined; - } - }, - json() { - return Promise.resolve({ message: 'ok' }); - } - }; - const result1 = await getJSON(res1); - t.deepEqual( - result1, - { message: 'ok' }, - "returns the JSON body of a response with a JSONy 'Content-Type' header" - ); - - const res2 = { - headers: { - get(name) { - return; - } - } - }; - try { - const result2 = await getJSON(res2); - } catch (e) { - t.pass( - "returns a rejected promise for a response with a not-JSONy 'Content-Type' header" - ); - } - - t.end(); -}); - -test('normalizeTypeDescriptors', t => { - const types1 = ['REQUEST', 'SUCCESS', 'FAILURE']; - const descriptors1 = normalizeTypeDescriptors(types1); - t.ok( - Array.isArray(descriptors1) && descriptors1.length === 3, - 'returns an array of length 3' - ); - t.deepEqual( - descriptors1[0].type, - 'REQUEST', - 'request type has the correct type property' - ); - t.equal( - Object.keys(descriptors1[0]).length, - 1, - 'request type has no other properties by default' - ); - t.deepEqual( - descriptors1[1].type, - 'SUCCESS', - 'success type has the correct type property' - ); - t.ok( - 'payload' in descriptors1[1], - 'success type has a payload property by default' - ); - t.equal( - Object.keys(descriptors1[1]).length, - 2, - 'success type has no other properties by default' - ); - t.deepEqual( - descriptors1[2].type, - 'FAILURE', - 'failure type has the correct type property' - ); - t.ok( - 'payload' in descriptors1[2], - 'failure type has a payload property by default' - ); - t.equal( - Object.keys(descriptors1[2]).length, - 2, - 'failure type has no other properties by default' - ); - - const types2 = [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - { - type: 'SUCCESS', - payload: 'successPayload', - meta: 'successMeta' - }, - { - type: 'FAILURE', - payload: 'failurePayload', - meta: 'failureMeta' - } - ]; - const descriptors2 = normalizeTypeDescriptors(types2); - t.equal( - descriptors2[0].payload, - 'requestPayload', - 'request type must accept a custom payload property' - ); - t.equal( - descriptors2[0].meta, - 'requestMeta', - 'request type must accept a custom meta property' - ); - t.equal( - descriptors2[1].payload, - 'successPayload', - 'success type must accept a custom payload property' - ); - t.equal( - descriptors2[1].meta, - 'successMeta', - 'success type must accept a custom meta property' - ); - t.equal( - descriptors2[2].payload, - 'failurePayload', - 'failure type must accept a custom payload property' - ); - t.equal( - descriptors2[2].meta, - 'failureMeta', - 'failure type must accept a custom meta property' - ); - - t.end(); -}); - -test('actionWith', async t => { - const descriptor1 = { - type: 'REQUEST', - payload: 'somePayload', - meta: 'someMeta', - error: true - }; - const fsa1 = await actionWith(descriptor1); - t.equal( - fsa1.type, - 'REQUEST', - 'must set FSA type property to incoming descriptor type property' - ); - t.equal( - fsa1.payload, - 'somePayload', - 'must set FSA payload property to incoming descriptor payload property' - ); - t.equal( - fsa1.meta, - 'someMeta', - 'must set FSA meta property to incoming descriptor meta property' - ); - t.ok( - fsa1.error, - 'must set FSA error property to incoming descriptor error property' - ); - - const passedArgs = ['action', 'state', 'res']; - const descriptor2 = { - type: 'REQUEST', - payload: (...args) => { - t.pass('must call a payload function'); - t.deepEqual( - args, - passedArgs, - 'payload function must receive its arguments' - ); - }, - meta: (...args) => { - t.pass('must call a meta function'); - t.deepEqual(args, passedArgs, 'meta function must receive its arguments'); - } - }; - const fsa2 = await actionWith(descriptor2, passedArgs); - - const descriptor3 = { - type: 'REQUEST', - payload: (...args) => { - throw new Error('error in payload function'); - } - }; - const fsa3 = await actionWith(descriptor3, passedArgs); - t.equal( - fsa3.payload.message, - 'error in payload function', - 'must set FSA payload property to an error if a custom payload function throws' - ); - t.ok( - fsa3.error, - 'must set FSA error property to true if a custom payload function throws' - ); - - const descriptor4 = { - type: 'REQUEST', - meta: (...args) => { - throw new Error('error in meta function'); - } - }; - const fsa4 = await actionWith(descriptor4, passedArgs); - t.equal( - fsa4.payload.message, - 'error in meta function', - 'must set FSA payload property to an error if a custom meta function throws' - ); - t.ok( - fsa4.error, - 'must set FSA error property to true if a custom meta function throws' - ); - - const descriptor5 = { - type: 'REQUEST', - payload: () => 'somePayload', - meta: () => new Promise(resolve => setTimeout(() => resolve('someMeta'), 250)), - error: true - }; - const fsa5 = await actionWith(descriptor5); - t.equal( - fsa5.type, - 'REQUEST', - 'must set FSA type property to incoming descriptor type property' - ); - t.equal( - fsa5.payload, - 'somePayload', - 'must set FSA payload property to incoming descriptor payload property' - ); - t.equal( - fsa5.meta, - 'someMeta', - 'must set FSA meta property to incoming descriptor meta property' - ); - t.ok( - fsa5.error, - 'must set FSA error property to incoming descriptor error property' - ); - - t.end(); -}); - -test('createMiddleware must return a Redux middleware', t => { - const doGetState = () => {}; - const middleware = createMiddleware(); - const nextHandler = middleware({ getState: doGetState }); - const doNext = () => {}; - const actionHandler = nextHandler(doNext); - - t.equal(middleware.length, 1, 'apiMiddleware must take one argument'); - - t.equal( - typeof nextHandler, - 'function', - 'apiMiddleware must return a function to handle next' - ); - - t.equal(nextHandler.length, 1, 'next handler must take one argument'); - - t.equal( - typeof actionHandler, - 'function', - 'next handler must return a function to handle action' - ); - - t.equal(actionHandler.length, 1, 'action handler must take one argument'); - - t.end(); -}); - -test('apiMiddleware must be a Redux middleware', t => { - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = () => {}; - const actionHandler = nextHandler(doNext); - - t.equal(apiMiddleware.length, 1, 'apiMiddleware must take one argument'); - - t.equal( - typeof nextHandler, - 'function', - 'apiMiddleware must return a function to handle next' - ); - - t.equal(nextHandler.length, 1, 'next handler must take one argument'); - - t.equal( - typeof actionHandler, - 'function', - 'next handler must return a function to handle action' - ); - - t.equal(actionHandler.length, 1, 'action handler must take one argument'); - - t.end(); -}); - -test('apiMiddleware must pass actions without an [RSAA] property to the next handler', t => { - const anAction = {}; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(anAction, action, 'original action passed to the next handler'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(2); - actionHandler(anAction); -}); - -test("apiMiddleware mustn't return a promise on actions without a [RSAA] property", t => { - const anAction = {}; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => action; - const actionHandler = nextHandler(doNext); - - t.plan(1); - const noProm = actionHandler(anAction); - t.notEqual(typeof noProm.then, 'function', 'no promise returned'); -}); - -test('apiMiddleware must return a promise on actions with a [RSAA] property', t => { - const anAction = { [RSAA]: {} }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => action; - const actionHandler = nextHandler(doNext); - - t.plan(1); - const yesProm = actionHandler(anAction); - t.equal(typeof yesProm.then, 'function', 'promise returned'); -}); - -test('apiMiddleware must dispatch an error request FSA for an invalid RSAA with a string request type', t => { - const anAction = { - [RSAA]: { - types: ['REQUEST'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.name, - 'InvalidRSAA', - 'dispatched FSA has correct payload property' - ); - t.equal(action.meta, undefined, 'dispatched FSA has no meta property'); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch an error request FSA for an invalid RSAA with a descriptor request type', t => { - const anAction = { - [RSAA]: { - types: [ - { - type: 'REQUEST' - } - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.name, - 'InvalidRSAA', - 'dispatched FSA has correct payload property' - ); - t.equal(action.meta, undefined, 'dispatched FSA has no meta property'); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must do nothing for an invalid RSAA without a request type', t => { - const anAction = { - [RSAA]: {} - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.fail('next handler called'); - }; - const actionHandler = nextHandler(doNext); - - actionHandler(anAction); - setTimeout(() => { - t.pass('next handler not called'); - t.end(); - }, 200); -}); - -test('apiMiddleware must dispatch an error request FSA when [RSAA].bailout fails', t => { - const anAction = { - [RSAA]: { - endpoint: '', - method: 'GET', - bailout: () => { - throw new Error(); - }, - types: [ - { - type: 'REQUEST', - payload: () => 'ignoredPayload', - meta: () => 'someMeta' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.message, - '[RSAA].bailout function failed', - 'dispatched FSA has correct payload property' - ); - t.equal( - action.meta, - 'someMeta', - 'dispatched FSA has correct meta property' - ); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch an error request FSA when [RSAA].body fails', t => { - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - body: () => { - throw new Error(); - }, - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'ignoredPayload', - meta: 'someMeta' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.message, - '[RSAA].body function failed', - 'dispatched FSA has correct payload property' - ); - t.equal( - action.meta, - 'someMeta', - 'dispatched FSA has correct meta property' - ); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch an error request FSA when [RSAA].endpoint fails', t => { - const anAction = { - [RSAA]: { - endpoint: () => { - throw new Error(); - }, - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'ignoredPayload', - meta: 'someMeta' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.message, - '[RSAA].endpoint function failed', - 'dispatched FSA has correct payload property' - ); - t.equal( - action.meta, - 'someMeta', - 'dispatched FSA has correct meta property' - ); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch an error request FSA when [RSAA].headers fails', t => { - const anAction = { - [RSAA]: { - endpoint: '', - method: 'GET', - headers: () => { - throw new Error(); - }, - types: [ - { - type: 'REQUEST', - payload: 'ignoredPayload', - meta: 'someMeta' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.message, - '[RSAA].headers function failed', - 'dispatched FSA has correct payload property' - ); - t.equal( - action.meta, - 'someMeta', - 'dispatched FSA has correct meta property' - ); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch an error request FSA when [RSAA].options fails', t => { - const anAction = { - [RSAA]: { - endpoint: '', - method: 'GET', - options: () => { - throw new Error(); - }, - types: [ - { - type: 'REQUEST', - payload: 'ignoredPayload', - meta: 'someMeta' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.pass('next handler called'); - t.equal(action.type, 'REQUEST', 'dispatched FSA has correct type property'); - t.equal( - action.payload.message, - '[RSAA].options function failed', - 'dispatched FSA has correct payload property' - ); - t.equal( - action.meta, - 'someMeta', - 'dispatched FSA has correct meta property' - ); - t.ok(action.error, 'dispatched FSA has correct error property'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(5); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a failure FSA when [RSAA].ok fails', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - ok: () => { - throw new Error(); - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('next handler called'); - break; - case 'SUCCESS': - t.fail('success action should not be dispatched'); - break; - case 'FAILURE': - t.equal( - action.payload.message, - '[RSAA].ok function failed', - 'dispatched FSA has correct payload property' - ); - t.ok(action.error, 'dispatched FSA has correct error property'); - break; - } - }; - - const actionHandler = nextHandler(doNext); - - t.plan(3); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a failure FSA with an error on a request error', t => { - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', // We haven't mocked this - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'ignoredPayload', - meta: 'someMeta' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - if (action.error) { - t.fail('Request FSA should not have an error'); - } else { - t.pass('next handler called'); - t.equal( - action.type, - 'REQUEST', - 'dispatched non-error FSA has correct type property' - ); - t.equal( - action.payload, - 'ignoredPayload', - 'dispatched non-error FSA has correct payload property' - ); - t.equal( - action.meta, - 'someMeta', - 'dispatched non-error FSA has correct meta property' - ); - t.notOk( - action.error, - 'dispatched non-error FSA has correct error property' - ); - } - break; - case 'FAILURE': - t.equal( - action.type, - 'FAILURE', - 'dispatched error FSA has correct type property' - ); - t.equal( - action.payload.name, - 'RequestError', - 'dispatched error FSA has correct payload property' - ); - t.ok(action.error, 'dispatched error FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must use an [RSAA].bailout boolean when present', t => { - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - bailout: true - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.fail('next handler called'); - }; - const actionHandler = nextHandler(doNext); - - actionHandler(anAction); - setTimeout(() => { - t.pass('next handler not called'); - t.end(); - }, 200); -}); - -test('apiMiddleware must use an [RSAA].bailout function when present', t => { - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'], - bailout: () => { - t.pass('[RSAA].bailout function called'); - return true; - } - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - t.fail('next handler called'); - }; - const actionHandler = nextHandler(doNext); - - t.plan(1); - actionHandler(anAction); -}); - -test('apiMiddleware must use an [RSAA].body function when present', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - body: () => { - t.pass('[RSAA].body function called'); - return 'body'; - }, - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => {}; - const actionHandler = nextHandler(doNext); - - t.plan(1); - actionHandler(anAction); -}); - -test('apiMiddleware must use an [RSAA].endpoint function when present', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: () => { - t.pass('[RSAA].endpoint function called'); - return 'http://127.0.0.1/api/users/1'; - }, - method: 'GET', - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => {}; - const actionHandler = nextHandler(doNext); - - t.plan(1); - actionHandler(anAction); -}); - -test('apiMiddleware must use an [RSAA].headers function when present', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - headers: () => { - t.pass('[RSAA].headers function called'); - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => {}; - const actionHandler = nextHandler(doNext); - - t.plan(1); - actionHandler(anAction); -}); - -test('apiMiddleware must use an [RSAA].options function when present', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - options: () => { - t.pass('[RSAA].options function called'); - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => {}; - const actionHandler = nextHandler(doNext); - - t.plan(1); - actionHandler(anAction); -}); - -test('apiMiddleware must use an [RSAA].ok function when present', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - ok: () => { - t.pass('[RSAA].ok function called'); - return true; - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => {}; - const actionHandler = nextHandler(doNext); - - t.plan(1); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a failure FSA when [RSAA].ok returns false on a successful request', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - ok: () => { - return false; - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('next handler called'); - break; - case 'SUCCESS': - t.fail('success action should not be dispatched'); - break; - case 'FAILURE': - t.ok(action.error, 'dispatched FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(2); - actionHandler(anAction); -}); - -test('apiMiddleware must use a [RSAA].fetch custom fetch wrapper when present', t => { - const asyncWorker = async () => 'Done!'; - const responseBody = { - id: 1, - name: 'Alan', - error: false - }; - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200, responseBody); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - fetch: async (endpoint, opts) => { - t.pass('custom fetch handler called'); - - // Simulate some async process like retrieving cache - await asyncWorker(); - - const res = await fetch(endpoint, opts); - const json = await res.json(); - - return new Response( - JSON.stringify({ - ...json, - foo: 'bar' - }), - { - // Example of custom `res.ok` - status: json.error ? 500 : 200, - headers: { - 'Content-Type': 'application/json' - } - } - ); - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'SUCCESS': - t.deepEqual( - action.payload, - { - ...responseBody, - foo: 'bar' - }, - 'custom response passed to the next handler' - ); - break; - } - }; - - const actionHandler = nextHandler(doNext); - - t.plan(2); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch correct error payload when custom fetch wrapper returns an error response', t => { - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - fetch: async (endpoint, opts) => { - return new Response( - JSON.stringify({ - foo: 'bar' - }), - { - status: 500, - headers: { - 'Content-Type': 'application/json' - } - } - ); - }, - types: ['REQUEST', 'SUCCESS', 'FAILURE'] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'FAILURE': - t.ok(action.payload instanceof Error); - t.pass('error action dispatched'); - t.deepEqual( - action.payload.response, - { - foo: 'bar' - }, - 'custom response passed to the next handler' - ); - break; - } - }; - - const actionHandler = nextHandler(doNext); - - t.plan(3); - actionHandler(anAction); -}); - -test('apiMiddleware must use payload property of request type descriptor when it is a function', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const expectedState = { foo: 'bar' }; - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - meta: 'requestMeta', - payload: (action, state) => { - t.pass('request type descriptor payload function has been called'); - t.equal( - action, - anAction, - 'request type descriptor payload function has been called with correct action parameter' - ); - t.equal( - state, - expectedState, - 'request type descriptor payload function has been called with correct state parameter' - ); - return 'requestPayload'; - } - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => { - return expectedState; - }; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - if (action.type === 'REQUEST') { - t.pass('request FSA passed to the next handler'); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(7); - actionHandler(anAction); -}); - -test('apiMiddleware must use meta property of request type descriptor when it is a function', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const expectedState = { foo: 'bar' }; - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - meta: (action, state) => { - t.pass('request type descriptor meta function has been called'); - t.equal( - action, - anAction, - 'request type descriptor meta function has been called with correct action parameter' - ); - t.equal( - state, - expectedState, - 'request type descriptor meta function has been called with correct state parameter' - ); - return 'requestMeta'; - }, - payload: 'requestPayload' - }, - 'SUCCESS', - 'FAILURE' - ] - } - }; - const doGetState = () => { - return expectedState; - }; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - if (action.type === 'REQUEST') { - t.pass('request FSA passed to the next handler'); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(7); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a success FSA on a successful API call with a non-empty JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200, { username: 'Alice' }, { 'Content-Type': 'application/json' }); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - { - type: 'SUCCESS', - meta: 'successMeta' - }, - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'SUCCESS': - t.pass('success FSA passed to the next handler'); - t.deepEqual( - action.payload, - { username: 'Alice' }, - 'success FSA has correct payload property' - ); - t.equal( - action.meta, - 'successMeta', - 'success FSA has correct meta property' - ); - t.notOk(action.error, 'success FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a success FSA on a successful API call with an empty JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200, {}, { 'Content-Type': 'application/json' }); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - { - type: 'SUCCESS', - meta: 'successMeta' - }, - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'SUCCESS': - t.pass('success FSA passed to the next handler'); - t.deepEqual( - action.payload, - {}, - 'success FSA has correct payload property' - ); - t.equal( - action.meta, - 'successMeta', - 'success FSA has correct meta property' - ); - t.notOk(action.error, 'success FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a success FSA with an error state on a successful API call with an invalid JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200, '', { 'Content-Type': 'application/json' }); - - const error = new InternalError('Expected error - simulating invalid JSON'); - - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - { - type: 'SUCCESS', - meta: 'successMeta', - payload: () => { - throw error; - } - }, - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'SUCCESS': - t.pass('success FSA passed to the next handler'); - t.deepEqual( - action.payload, - error, - 'success FSA has correct payload property' - ); - t.equal( - action.meta, - 'successMeta', - 'success FSA has correct meta property' - ); - t.ok(action.error, 'success FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a success FSA on a successful API call with a non-JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(200); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - { - type: 'SUCCESS', - meta: 'successMeta' - }, - 'FAILURE' - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'SUCCESS': - t.pass('success FSA passed to the next handler'); - t.deepEqual( - typeof action.payload, - 'undefined', - 'success FSA has correct payload property' - ); - t.equal( - action.meta, - 'successMeta', - 'success FSA has correct meta property' - ); - t.notOk(action.error, 'success FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-empty JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply( - 404, - { error: 'Resource not found' }, - { 'Content-Type': 'application/json' } - ); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - 'SUCCESS', - { - type: 'FAILURE', - meta: 'failureMeta' - } - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'FAILURE': - t.pass('failure FSA passed to the next handler'); - t.deepEqual( - action.payload.response, - { error: 'Resource not found' }, - 'failure FSA has correct payload property' - ); - t.equal( - action.meta, - 'failureMeta', - 'failure FSA has correct meta property' - ); - t.ok(action.error, 'failure FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a failure FSA on an unsuccessful API call with an empty JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(404, {}, { 'Content-Type': 'application/json' }); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - 'SUCCESS', - { - type: 'FAILURE', - meta: 'failureMeta' - } - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'FAILURE': - t.pass('failure FSA passed to the next handler'); - t.deepEqual( - action.payload.response, - {}, - 'failure FSA has correct payload property' - ); - t.equal( - action.meta, - 'failureMeta', - 'failure FSA has correct meta property' - ); - t.ok(action.error, 'failure FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); - -test('apiMiddleware must dispatch a failure FSA on an unsuccessful API call with a non-JSON response', t => { - const api = nock('http://127.0.0.1') - .get('/api/users/1') - .reply(404); - const anAction = { - [RSAA]: { - endpoint: 'http://127.0.0.1/api/users/1', - method: 'GET', - types: [ - { - type: 'REQUEST', - payload: 'requestPayload', - meta: 'requestMeta' - }, - 'SUCCESS', - { - type: 'FAILURE', - meta: 'failureMeta' - } - ] - } - }; - const doGetState = () => {}; - const nextHandler = apiMiddleware({ getState: doGetState }); - const doNext = action => { - switch (action.type) { - case 'REQUEST': - t.pass('request FSA passed to the next handler'); - t.equal( - action.payload, - 'requestPayload', - 'request FSA has correct payload property' - ); - t.equal( - action.meta, - 'requestMeta', - 'request FSA has correct meta property' - ); - t.notOk(action.error, 'request FSA has correct error property'); - break; - case 'FAILURE': - t.pass('failure FSA passed to the next handler'); - t.deepEqual( - typeof action.payload.response, - 'undefined', - 'failure FSA has correct payload property' - ); - t.equal( - action.meta, - 'failureMeta', - 'failure FSA has correct meta property' - ); - t.ok(action.error, 'failure FSA has correct error property'); - break; - } - }; - const actionHandler = nextHandler(doNext); - - t.plan(8); - actionHandler(anAction); -}); diff --git a/test/setupJest.js b/test/setupJest.js new file mode 100644 index 0000000..2b6260b --- /dev/null +++ b/test/setupJest.js @@ -0,0 +1 @@ +global.fetch = require('jest-fetch-mock')