From 2063f8e8cbdb35e0493e32014e40d561ccfdbe59 Mon Sep 17 00:00:00 2001 From: kyle Date: Thu, 6 Jun 2019 11:09:14 -0700 Subject: [PATCH] fix: handle allOf/ref/circular structure interactions (via #1435) * fix: support path parameter inclusion when used twice in a path * fix quote * add document test runner * harness! * break test cases into two files * rework runner * generateAbsoluteRefPatches in allOf * handle nock interception state * migrate expect@1 spies to jest via `jscodeshift -t node_modules/jest-codemods/dist/transformers/expect.js test` * install `jest-stare` test reporter * guard externally-nullable values in generateAbsoluteRefPatches * migrate misc. tests to new $$ref format * absolutify $$ref artifact pointers * use absolutifyPointer in generateAbsoluteRefPatches * expect circular reference resolution * add test cases for multi-member nested remoteRef->localRef allOf * add nested allOf->local+remoteRef->localRef->remoteRelativeRef cases * modify test to cover $ref nested within allOf member * clean up generateAbsoluteRefPatches * assert no errors in instantiation test cases * uninstall `mocha-webpack` * uninstall `jest-stare` * update lockfile * linter fixes * remove comment * add failing circular reference cases * update SWOS-109 circular reference tests * add file-level skips * create new `useCircularStructures` option * absolutify $refs that will be left unresolved because they complete a circular link * ignore presence of allOf path portions in ref plugin's pointerAlreadyInPath --- .gitignore | 2 + package-lock.json | 1398 +++++++++++------ package.json | 5 +- src/index.js | 1 + src/resolver.js | 5 +- src/specmap/helpers.js | 34 +- src/specmap/index.js | 4 +- src/specmap/lib/all-of.js | 36 +- src/specmap/lib/refs.js | 43 +- src/subtree-resolver/index.js | 6 +- test/client.js | 15 +- test/resolver.js | 6 +- .../circular-references-instantiation.yaml | 83 + .../circular-references-subtree-resolver.yaml | 146 ++ test/resolver/index.js | 118 ++ test/resolver/swos-109-instantiation.yaml | 263 ++++ test/resolver/swos-109-subtree-resolver.yaml | 251 +++ test/specmap/data/cyclic/external/1.js | 2 +- test/specmap/data/cyclic/external/10.js | 2 +- test/specmap/data/cyclic/external/2.js | 2 +- test/specmap/data/cyclic/external/20.js | 2 +- test/specmap/data/cyclic/external/21.js | 2 +- test/specmap/data/cyclic/external/40.js | 2 +- test/specmap/index.js | 4 +- test/subtree-resolver.js | 17 +- test/webpack-bundle/index.js | 1 + 26 files changed, 1884 insertions(+), 566 deletions(-) create mode 100644 test/resolver/circular-references-instantiation.yaml create mode 100644 test/resolver/circular-references-subtree-resolver.yaml create mode 100644 test/resolver/index.js create mode 100644 test/resolver/swos-109-instantiation.yaml create mode 100644 test/resolver/swos-109-subtree-resolver.yaml diff --git a/.gitignore b/.gitignore index e21645921..ab3298168 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,7 @@ test/specmap/data/private test/webpack-bundle/.tmp browser +jest-stare + # Automated releases release/.version diff --git a/package-lock.json b/package-lock.json index babdab1f7..71431f33d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,23 +5,23 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.54", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.54.tgz", - "integrity": "sha1-ACT5b99wKKIdaOJzr9TpUyFKHq0=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.54" + "@babel/highlight": "^7.0.0" } }, "@babel/highlight": { - "version": "7.0.0-beta.54", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.54.tgz", - "integrity": "sha1-FV1Qc1gym45waJcAF8P9dKmwhYQ=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { @@ -34,9 +34,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -50,10 +50,16 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -61,6 +67,113 @@ } } }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "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 + } + } + }, + "@jest/test-result": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", + "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, "@kyleshockey/js-yaml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@kyleshockey/js-yaml/-/js-yaml-1.0.1.tgz", @@ -129,6 +242,43 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, "JSONStream": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", @@ -140,9 +290,9 @@ } }, "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", "dev": true }, "abbrev": { @@ -175,12 +325,21 @@ } }, "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==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", "dev": true, "requires": { - "acorn": "^5.0.0" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } } }, "acorn-jsx": { @@ -200,6 +359,12 @@ } } }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, "add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", @@ -348,12 +513,12 @@ } }, "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "default-require-extensions": "^1.0.0" } }, "aproba": { @@ -510,6 +675,12 @@ } } }, + "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", @@ -563,12 +734,6 @@ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, "axios": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", @@ -784,9 +949,9 @@ } }, "babel-jest": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.4.0.tgz", - "integrity": "sha1-IsNMOS4hdvakw2eZKn/P9p0uhVc=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", "dev": true, "requires": { "babel-plugin-istanbul": "^4.1.6", @@ -1643,9 +1808,9 @@ } }, "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=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", "dev": true }, "browser-resolve": { @@ -2081,6 +2246,20 @@ "lazy-cache": "^1.0.3" } }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -2100,6 +2279,12 @@ "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==", "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 + }, "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", @@ -2285,12 +2470,6 @@ "dot-prop": "^3.0.0" } }, - "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", @@ -2779,15 +2958,15 @@ "dev": true }, "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", "dev": true }, "cssstyle": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", - "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "dev": true, "requires": { "cssom": "0.3.x" @@ -2838,14 +3017,27 @@ } }, "data-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", - "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "abab": "^1.0.4", - "whatwg-mimetype": "^2.0.0", - "whatwg-url": "^6.4.0" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } } }, "date-now": { @@ -2914,6 +3106,15 @@ "mimic-response": "^1.0.0" } }, + "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", @@ -2937,12 +3138,23 @@ "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=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "^3.0.0" + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } } }, "defaults": { @@ -3100,6 +3312,12 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -3389,9 +3607,9 @@ "dev": true }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -3834,18 +4052,157 @@ "dev": true }, "expect": { - "version": "1.20.2", - "resolved": "http://registry.npmjs.org/expect/-/expect-1.20.2.tgz", - "integrity": "sha1-1Fj+TFYAQDa64yMkFqP2Nh8E+WU=", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", "dev": true, "requires": { - "define-properties": "~1.1.2", - "has": "^1.0.1", - "is-equal": "^1.5.1", - "is-regex": "^1.0.3", - "object-inspect": "^1.1.0", - "object-keys": "^1.0.9", - "tmatch": "^2.0.1" + "@jest/types": "^24.8.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jest-diff": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + } + }, + "jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + } + }, + "jest-message-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "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 + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.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" + } + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "extend": { @@ -3964,9 +4321,9 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-glob": { @@ -4920,6 +5277,12 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "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-pkg-repo": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", @@ -5709,15 +6072,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-arrow-function": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-arrow-function/-/is-arrow-function-2.0.3.tgz", - "integrity": "sha1-Kb4sLY2UUIUri7r7Y1unuNjofsI=", - "dev": true, - "requires": { - "is-callable": "^1.0.4" - } - }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -5727,12 +6081,6 @@ "binary-extensions": "^1.0.0" } }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5803,25 +6151,6 @@ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", "dev": true }, - "is-equal": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/is-equal/-/is-equal-1.5.5.tgz", - "integrity": "sha1-XoXxlX4FKIMkf+s4aWWju6Ffuz0=", - "dev": true, - "requires": { - "has": "^1.0.1", - "is-arrow-function": "^2.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-date-object": "^1.0.1", - "is-generator-function": "^1.0.6", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.3", - "is-string": "^1.0.4", - "is-symbol": "^1.0.1", - "object.entries": "^1.0.4" - } - }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", @@ -5867,12 +6196,6 @@ "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", "dev": true }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", - "dev": true - }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -5934,12 +6257,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -6047,12 +6364,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, "is-subset": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", @@ -6092,6 +6403,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6125,44 +6442,55 @@ "dev": true }, "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", "dev": true, "requires": { "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", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", "js-yaml": "^3.7.0", "mkdirp": "^0.5.1", "once": "^1.4.0" + }, + "dependencies": { + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", "dev": true }, "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", "dev": true, "requires": { - "append-transform": "^1.0.0" + "append-transform": "^0.4.0" } }, "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==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { "babel-generator": "^6.18.0", @@ -6170,17 +6498,17 @@ "babel-traverse": "^6.18.0", "babel-types": "^6.18.0", "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-coverage": "^1.2.1", "semver": "^5.3.0" } }, "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==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-coverage": "^1.2.1", "mkdirp": "^0.5.1", "path-parse": "^1.0.5", "supports-color": "^3.1.2" @@ -6204,33 +6532,39 @@ } }, "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==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", "dev": true, "requires": { "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-coverage": "^1.2.1", "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==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, "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==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", "dev": true, "requires": { "handlebars": "^4.0.3" @@ -6247,19 +6581,19 @@ } }, "jest": { - "version": "23.4.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.4.1.tgz", - "integrity": "sha512-HTOuA9epknN7RKdzhmp9qrbP0z3TibAMXI+sluLOcrEoF54ZCG8/urFB2DK/sOINcMeyX6epMUqka8i0+d0xOA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", "dev": true, "requires": { "import-local": "^1.0.0", - "jest-cli": "^23.4.1" + "jest-cli": "^23.6.0" }, "dependencies": { "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -6284,9 +6618,9 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6327,9 +6661,9 @@ "dev": true }, "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==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -6343,19 +6677,19 @@ "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-changed-files": "^23.4.2", + "jest-config": "^23.6.0", "jest-environment-jsdom": "^23.4.0", "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.4.1", + "jest-haste-map": "^23.6.0", "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-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", "jest-util": "^23.4.0", - "jest-validate": "^23.4.0", + "jest-validate": "^23.6.0", "jest-watcher": "^23.4.0", "jest-worker": "^23.2.0", "micromatch": "^2.3.11", @@ -6390,9 +6724,9 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6430,33 +6764,34 @@ } }, "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=", + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", "dev": true, "requires": { "throat": "^4.0.0" } }, "jest-config": { - "version": "23.4.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.4.1.tgz", - "integrity": "sha512-OT29qlcw9Iw7u0PC04wD9tjLJL4vpGdMZrrHMFwYSO3HxOikbHywjmtQ7rntW4qvBcpbi7iCMTPPRmpDjImQEw==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", "dev": true, "requires": { "babel-core": "^6.0.0", - "babel-jest": "^23.4.0", + "babel-jest": "^23.6.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-jasmine2": "^23.6.0", "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.4.1", + "jest-resolve": "^23.6.0", "jest-util": "^23.4.0", - "jest-validate": "^23.4.0", - "pretty-format": "^23.2.0" + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" }, "dependencies": { "ansi-styles": { @@ -6469,9 +6804,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6486,9 +6821,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6497,15 +6832,15 @@ } }, "jest-diff": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.2.0.tgz", - "integrity": "sha1-nyz0tR4Sx5FVAgCrwWtHEwrxBio=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", "dev": true, "requires": { "chalk": "^2.0.1", "diff": "^3.2.0", "jest-get-type": "^22.1.0", - "pretty-format": "^23.2.0" + "pretty-format": "^23.6.0" }, "dependencies": { "ansi-styles": { @@ -6518,9 +6853,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6535,9 +6870,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6555,13 +6890,13 @@ } }, "jest-each": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", - "integrity": "sha1-L6nt2J2qGk7cn/m/YGKja3E0UUM=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", "dev": true, "requires": { "chalk": "^2.0.1", - "pretty-format": "^23.2.0" + "pretty-format": "^23.6.0" }, "dependencies": { "ansi-styles": { @@ -6574,9 +6909,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6591,9 +6926,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6629,13 +6964,14 @@ "dev": true }, "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==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", "dev": true, "requires": { "fb-watchman": "^2.0.0", "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", "jest-docblock": "^23.2.0", "jest-serializer": "^23.0.1", "jest-worker": "^23.2.0", @@ -6644,22 +6980,23 @@ } }, "jest-jasmine2": { - "version": "23.4.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.4.1.tgz", - "integrity": "sha512-nHmRgTtM9fuaK3RBz2z4j9mYVEJwB7FdoflQSvrwHV8mCT5z4DeHoKCvPp2R27F8fZTYJUYVMb36xn+ydg0tfA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", "dev": true, "requires": { + "babel-traverse": "^6.0.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^23.4.0", + "expect": "^23.6.0", "is-generator-fn": "^1.0.0", - "jest-diff": "^23.2.0", - "jest-each": "^23.4.0", - "jest-matcher-utils": "^23.2.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", "jest-message-util": "^23.4.0", - "jest-snapshot": "^23.4.1", + "jest-snapshot": "^23.6.0", "jest-util": "^23.4.0", - "pretty-format": "^23.2.0" + "pretty-format": "^23.6.0" }, "dependencies": { "ansi-styles": { @@ -6672,9 +7009,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6683,15 +7020,15 @@ } }, "expect": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.4.0.tgz", - "integrity": "sha1-baTsyZwUcSU+cogziYOtHrrbYMM=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", "dev": true, "requires": { "ansi-styles": "^3.2.0", - "jest-diff": "^23.2.0", + "jest-diff": "^23.6.0", "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.2.0", + "jest-matcher-utils": "^23.6.0", "jest-message-util": "^23.4.0", "jest-regex-util": "^23.3.0" } @@ -6703,9 +7040,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6714,23 +7051,23 @@ } }, "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=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", "dev": true, "requires": { - "pretty-format": "^23.2.0" + "pretty-format": "^23.6.0" } }, "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=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.1.0", - "pretty-format": "^23.2.0" + "pretty-format": "^23.6.0" }, "dependencies": { "ansi-styles": { @@ -6743,9 +7080,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6760,9 +7097,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6793,9 +7130,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6810,9 +7147,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6833,9 +7170,9 @@ "dev": true }, "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==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", "dev": true, "requires": { "browser-resolve": "^1.11.3", @@ -6853,9 +7190,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6870,9 +7207,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6881,30 +7218,30 @@ } }, "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==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", "dev": true, "requires": { "jest-regex-util": "^23.3.0", - "jest-snapshot": "^23.4.1" + "jest-snapshot": "^23.6.0" } }, "jest-runner": { - "version": "23.4.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.4.1.tgz", - "integrity": "sha512-78KyhObsx0VEuUQ74ikGt68NpP6PApTjGpJPSyZ7AvwOFRqFlxdHpCU/lFPQxW/fLEghl4irz9OHjRLGcGFNyQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", "dev": true, "requires": { "exit": "^0.1.2", "graceful-fs": "^4.1.11", - "jest-config": "^23.4.1", + "jest-config": "^23.6.0", "jest-docblock": "^23.2.0", - "jest-haste-map": "^23.4.1", - "jest-jasmine2": "^23.4.1", - "jest-leak-detector": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", "jest-message-util": "^23.4.0", - "jest-runtime": "^23.4.1", + "jest-runtime": "^23.6.0", "jest-util": "^23.4.0", "jest-worker": "^23.2.0", "source-map-support": "^0.5.6", @@ -6918,9 +7255,9 @@ "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==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6930,9 +7267,9 @@ } }, "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==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", "dev": true, "requires": { "babel-core": "^6.0.0", @@ -6942,14 +7279,14 @@ "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-config": "^23.6.0", + "jest-haste-map": "^23.6.0", "jest-message-util": "^23.4.0", "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.4.1", - "jest-snapshot": "^23.4.1", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", "jest-util": "^23.4.0", - "jest-validate": "^23.4.0", + "jest-validate": "^23.6.0", "micromatch": "^2.3.11", "realpath-native": "^1.0.0", "slash": "^1.0.0", @@ -6980,9 +7317,9 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7042,9 +7379,9 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -7088,21 +7425,20 @@ "dev": true }, "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==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", "dev": true, "requires": { - "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-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", "jest-message-util": "^23.4.0", - "jest-resolve": "^23.4.1", + "jest-resolve": "^23.6.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^23.2.0", + "pretty-format": "^23.6.0", "semver": "^5.5.0" }, "dependencies": { @@ -7116,9 +7452,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7133,9 +7469,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -7175,9 +7511,9 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7198,9 +7534,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -7209,15 +7545,15 @@ } }, "jest-validate": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.4.0.tgz", - "integrity": "sha1-2W7t4B7wOskJwAnpyORVGX1IwgE=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.1.0", "leven": "^2.1.0", - "pretty-format": "^23.2.0" + "pretty-format": "^23.6.0" }, "dependencies": { "ansi-styles": { @@ -7230,9 +7566,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7247,9 +7583,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -7269,9 +7605,9 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-styles": { @@ -7284,9 +7620,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7301,9 +7637,9 @@ "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -7326,16 +7662,6 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -7344,49 +7670,49 @@ "optional": true }, "jsdom": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", - "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, "requires": { - "abab": "^1.0.4", - "acorn": "^5.3.0", + "abab": "^2.0.0", + "acorn": "^5.5.3", "acorn-globals": "^4.1.0", "array-equal": "^1.0.0", "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.3.1 < 0.4.0", + "cssstyle": "^1.0.0", "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwsapi": "^2.0.0", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", "parse5": "4.0.0", "pn": "^1.1.0", - "request": "^2.83.0", + "request": "^2.87.0", "request-promise-native": "^1.0.5", "sax": "^1.2.4", "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", + "tough-cookie": "^2.3.4", "w3c-hr-time": "^1.0.1", "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.3", "whatwg-mimetype": "^2.1.0", "whatwg-url": "^6.4.1", - "ws": "^4.0.0", + "ws": "^5.2.0", "xml-name-validator": "^3.0.0" }, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "assert-plus": { @@ -7401,14 +7727,20 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -7419,12 +7751,12 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, @@ -7439,38 +7771,62 @@ "sshpk": "^1.7.0" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } } } } @@ -7506,9 +7862,9 @@ "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=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify": { @@ -7589,9 +7945,9 @@ } }, "kleur": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-1.0.2.tgz", - "integrity": "sha512-4u2TF1/mKmiawrkjzCxRKszdCvqRsPgTJwjmZZt0RE4OiZMzvFfb4kwqfFP/p0gvakH1lhQOfCMYXUOYI9dTgA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", "dev": true }, "latest-version": { @@ -8121,9 +8477,9 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, "merge-stream": { @@ -8416,6 +8772,40 @@ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", "dev": true }, + "nock": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-10.0.6.tgz", + "integrity": "sha512-b47OWj1qf/LqSQYnmokNWM8D88KvUl2y7jT0567NB3ZBAZFz2bWp2PC81Xn7u8F2/vJxzkzNZybnemeFa7AZ2w==", + "dev": true, + "requires": { + "chai": "^4.1.2", + "debug": "^4.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": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, "node-abi": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.8.0.tgz", @@ -8485,13 +8875,14 @@ } }, "node-notifier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", - "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", "dev": true, "requires": { "growly": "^1.3.0", - "semver": "^5.4.1", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" } @@ -8664,15 +9055,9 @@ "dev": true }, "nwsapi": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.7.tgz", - "integrity": "sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q==", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "object-assign": { @@ -8703,12 +9088,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.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -8724,18 +9103,6 @@ "isobject": "^3.0.0" } }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -9192,6 +9559,12 @@ "pinkie-promise": "^2.0.0" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -9313,9 +9686,9 @@ "dev": true }, "pretty-format": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.2.0.tgz", - "integrity": "sha1-OwqqY8AYpTWDNzwcs6XZbMXoMBc=", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", "dev": true, "requires": { "ansi-regex": "^3.0.0", @@ -9404,15 +9777,21 @@ "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==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", "dev": true, "requires": { - "kleur": "^1.0.0", + "kleur": "^2.0.1", "sisteransi": "^0.1.1" } }, + "propagate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", + "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -9434,6 +9813,12 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "dev": true + }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", @@ -9576,6 +9961,12 @@ } } }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, "read-installed": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", @@ -9676,9 +10067,9 @@ } }, "realpath-native": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.1.tgz", - "integrity": "sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { "util.promisify": "^1.0.0" @@ -10117,23 +10508,31 @@ } }, "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=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } } }, "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=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, "require-directory": { @@ -10761,9 +11160,9 @@ } }, "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, "static-extend": { @@ -11054,45 +11453,16 @@ } }, "test-exclude": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", "dev": true, "requires": { "arrify": "^1.0.1", - "micromatch": "^3.1.8", + "micromatch": "^2.3.11", "object-assign": "^4.1.0", "read-pkg-up": "^1.0.1", "require-main-filename": "^1.0.1" - }, - "dependencies": { - "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": { - "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" - } - } } }, "text-extensions": { @@ -11144,12 +11514,6 @@ "setimmediate": "^1.0.4" } }, - "tmatch": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", - "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -11325,6 +11689,12 @@ "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 + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -12076,19 +12446,22 @@ } }, "whatwg-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", - "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "0.4.24" }, "dependencies": { "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } } } }, @@ -12098,9 +12471,9 @@ "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" }, "whatwg-mimetype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", - "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { @@ -12261,13 +12634,12 @@ } }, "ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "dev": true, "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" + "async-limiter": "~1.0.0" } }, "xdg-basedir": { diff --git a/package.json b/package.json index f40cd4b45..5833a5ce5 100644 --- a/package.json +++ b/package.json @@ -73,12 +73,13 @@ "eslint": "^3.18.0", "eslint-config-airbnb-base": "^11.1.1", "eslint-plugin-import": "^2.11.0", - "expect": "^1.20.2", + "expect": "^24.8.0", "fetch-mock": "^5.12.0", "glob": "^7.1.1", - "jest": "^23.1.0", + "jest": "^23.6.0", "json-loader": "^0.5.4", "license-checker": "^8.0.3", + "nock": "^10.0.6", "npm-run-all": "^4.1.3", "release-it": "^7.4.8", "traverse": "^0.6.6", diff --git a/src/index.js b/src/index.js index c5cf107a8..14d4f54e2 100644 --- a/src/index.js +++ b/src/index.js @@ -71,6 +71,7 @@ Swagger.prototype = { spec: this.spec, url: this.url, allowMetaPatches: this.allowMetaPatches, + useCircularStructures: this.useCircularStructures, requestInterceptor: this.requestInterceptor || null, responseInterceptor: this.responseInterceptor || null }).then((obj) => { diff --git a/src/resolver.js b/src/resolver.js index 8272cabd3..139fe9b06 100644 --- a/src/resolver.js +++ b/src/resolver.js @@ -32,7 +32,7 @@ export default function resolve(obj) { const { fetch, spec, url, mode, allowMetaPatches = true, pathDiscriminator, modelPropertyMacro, parameterMacro, requestInterceptor, - responseInterceptor, skipNormalization + responseInterceptor, skipNormalization, useCircularStructures, } = obj let {http, baseDoc} = obj @@ -81,7 +81,8 @@ export default function resolve(obj) { allowMetaPatches, // allows adding .meta patches, which include adding `$$ref`s to the spec pathDiscriminator, // for lazy resolution parameterMacro, - modelPropertyMacro + modelPropertyMacro, + useCircularStructures, }).then(skipNormalization ? async a => a : normalizeSwagger) } } diff --git a/src/specmap/helpers.js b/src/specmap/helpers.js index 66c3e22c4..ad668307c 100644 --- a/src/specmap/helpers.js +++ b/src/specmap/helpers.js @@ -1,7 +1,5 @@ -/* eslint-disable import/prefer-default-export */ -// -// if/when another helper is added to this file, -// please remove the eslint override and this comment! +import traverse from 'traverse' +import URL from 'url' // This will match if the direct parent's key exactly matches an item. const freelyNamedKeyParents = [ @@ -53,3 +51,31 @@ export function isFreelyNamed(parentPath) { (freelyNamedAncestors.some(el => parentStr.indexOf(el) > -1)) ) } + +export function generateAbsoluteRefPatches(obj, basePath, { + specmap, + getBaseUrlForNodePath = path => specmap.getContext([...basePath, ...path]).baseDoc, + targetKeys = ['$ref', '$$ref'] +} = {}) { + const patches = [] + + traverse(obj).forEach(function () { + if (targetKeys.indexOf(this.key) > -1) { + const nodePath = this.path // this node's path, relative to `obj` + const fullPath = basePath.concat(this.path) + + const absolutifiedRefValue = absolutifyPointer(this.node, getBaseUrlForNodePath(nodePath)) + + patches.push(specmap.replace(fullPath, absolutifiedRefValue)) + } + }) + + return patches +} + +export function absolutifyPointer(pointer, baseUrl) { + const [urlPart, fragmentPart] = pointer.split('#') + const newRefUrlPart = URL.resolve(urlPart || '', baseUrl || '') + + return fragmentPart ? `${newRefUrlPart}#${fragmentPart}` : newRefUrlPart +} diff --git a/src/specmap/index.js b/src/specmap/index.js index 49ef0c350..702bce234 100644 --- a/src/specmap/index.js +++ b/src/specmap/index.js @@ -26,7 +26,9 @@ class SpecMap { showDebug: false, allPatches: [], // only populated if showDebug is true pluginProp: 'specMap', - libMethods: Object.assign(Object.create(this), lib), + libMethods: Object.assign(Object.create(this), lib, { + getInstance: () => this + }), allowMetaPatches: false, }, opts) diff --git a/src/specmap/lib/all-of.js b/src/specmap/lib/all-of.js index ebe4905b4..848a4894e 100644 --- a/src/specmap/lib/all-of.js +++ b/src/specmap/lib/all-of.js @@ -1,4 +1,4 @@ -import {isFreelyNamed} from '../helpers' +import {isFreelyNamed, generateAbsoluteRefPatches} from '../helpers' export default { key: 'allOf', @@ -34,7 +34,12 @@ export default { originalDefinitionObj = Object.assign({}, originalDefinitionObj) delete originalDefinitionObj.allOf - const allOfPatches = [specmap.replace(parent, {})].concat(val.map((toMerge, index) => { + const patches = [] + + // remove existing content + patches.push(specmap.replace(parent, {})) + + val.forEach((toMerge, i) => { if (!specmap.isObject(toMerge)) { if (alreadyAddError) { return null @@ -43,21 +48,36 @@ export default { const err = new TypeError('Elements in allOf must be objects') err.fullPath = fullPath // This is an array - return err + return patches.push(err) } - return specmap.mergeDeep(parent, toMerge) - })) + // Deeply merge the member's contents onto the parent location + patches.push(specmap.mergeDeep(parent, toMerge)) + + // Generate patches that migrate $ref values based on ContextTree information + + // remove ["allOf"], which will not be present when these patches are applied + const collapsedFullPath = fullPath.slice(0, -1) + + const absoluteRefPatches = generateAbsoluteRefPatches(toMerge, collapsedFullPath, { + getBaseUrlForNodePath: (nodePath) => { + return specmap.getContext([...fullPath, i, ...nodePath]).baseDoc + }, + specmap + }) + + patches.push(...absoluteRefPatches) + }) // Merge back the values from the original definition - allOfPatches.push(specmap.mergeDeep(parent, originalDefinitionObj)) + patches.push(specmap.mergeDeep(parent, originalDefinitionObj)) // If there was not an original $$ref value, make sure to remove // any $$ref value that may exist from the result of `allOf` merges if (!originalDefinitionObj.$$ref) { - allOfPatches.push(specmap.remove([].concat(parent, '$$ref'))) + patches.push(specmap.remove([].concat(parent, '$$ref'))) } - return allOfPatches + return patches } } diff --git a/src/specmap/lib/refs.js b/src/specmap/lib/refs.js index 11733e375..75281c46c 100644 --- a/src/specmap/lib/refs.js +++ b/src/specmap/lib/refs.js @@ -4,7 +4,7 @@ import qs from 'querystring-browser' import url from 'url' import lib from '../lib' import createError from '../lib/create-error' -import {isFreelyNamed} from '../helpers' +import {isFreelyNamed, absolutifyPointer} from '../helpers' const ABSOLUTE_URL_REGEXP = new RegExp('^([a-z]+://|//)', 'i') @@ -43,6 +43,7 @@ const specmapRefs = new WeakMap() const plugin = { key: '$ref', plugin: (ref, key, fullPath, specmap) => { + const specmapInstance = specmap.getInstance() const parent = fullPath.slice(0, -1) if (isFreelyNamed(parent)) { return @@ -78,7 +79,20 @@ const plugin = { let tokens if (pointerAlreadyInPath(pointer, basePath, parent, specmap)) { - return // TODO: add some meta data, to indicate its cyclic! + // Cyclic reference! + // if `useCircularStructures` is not set, just leave the reference + // unresolved, but absolutify it so that we don't leave an invalid $ref + // path in the content + if (!specmapInstance.useCircularStructures) { + const absolutifiedRef = absolutifyPointer(ref, basePath) + + if (ref === absolutifiedRef) { + // avoids endless looping + // without this, the ref plugin never stops seeing this $ref + return null + } + return lib.replace(fullPath, absolutifiedRef) + } } if (basePath == null) { @@ -115,13 +129,17 @@ const plugin = { return [lib.remove(fullPath), promOrVal] } - const patch = lib.replace(parent, promOrVal, {$$ref: ref}) + const absolutifiedRef = absolutifyPointer(ref, basePath) + + const patch = lib.replace(parent, promOrVal, {$$ref: absolutifiedRef}) if (basePath && basePath !== baseDoc) { return [patch, lib.context(parent, {baseDoc: basePath})] } try { - if (!patchValueAlreadyInPath(specmap.state, patch)) { + // prevents circular values from being constructed, unless we specifically + // want that to happen + if (!patchValueAlreadyInPath(specmap.state, patch) || specmapInstance.useCircularStructures) { return patch } } @@ -383,11 +401,23 @@ function pointerAlreadyInPath(pointer, basePath, parent, specmap) { const parentPointer = arrayToJsonPointer(parent) const fullyQualifiedPointer = `${basePath || ''}#${pointer}` + // dirty hack to strip `allof/[index]` from the path, in order to avoid cases + // where we get false negatives because: + // - we resolve a path, then + // - allOf plugin collapsed `allOf/[index]` out of the path, then + // - we try to work on a child $ref within that collapsed path. + // + // because of the path collapse, we lose track of it in our specmapRefs hash + // solution: always throw the allOf constructs out of paths we store + // TODO: solve this with a global register, or by writing more metadata in + // either allOf or refs plugin + const safeParentPointer = parentPointer.replace(/allOf\/\d+\/?/g, '') + // Case 1: direct cycle, e.g. a.b.c.$ref: '/a.b' // Detect by checking that the parent path doesn't start with pointer. // This only applies if the pointer is internal, i.e. basePath === rootPath (could be null) const rootDoc = specmap.contextTree.get([]).baseDoc - if (basePath == rootDoc && pointerIsAParent(parentPointer, pointer)) { // eslint-disable-line + if (basePath == rootDoc && pointerIsAParent(safeParentPointer, pointer)) { // eslint-disable-line return true } @@ -413,7 +443,8 @@ function pointerAlreadyInPath(pointer, basePath, parent, specmap) { // No cycle, this ref will be resolved, so stores it now for future detection. // No need to store if has cycle, as parent path is a dead-end and won't be checked again. - refs[parentPointer] = (refs[parentPointer] || []).concat(fullyQualifiedPointer) + + refs[safeParentPointer] = (refs[safeParentPointer] || []).concat(fullyQualifiedPointer) } /** diff --git a/src/subtree-resolver/index.js b/src/subtree-resolver/index.js index 108b725fd..4bca6f565 100644 --- a/src/subtree-resolver/index.js +++ b/src/subtree-resolver/index.js @@ -33,7 +33,8 @@ export default async function resolveSubtree(obj, path, opts = {}) { requestInterceptor, responseInterceptor, parameterMacro, - modelPropertyMacro + modelPropertyMacro, + useCircularStructures, } = opts const resolveOptions = { @@ -42,7 +43,8 @@ export default async function resolveSubtree(obj, path, opts = {}) { requestInterceptor, responseInterceptor, parameterMacro, - modelPropertyMacro + modelPropertyMacro, + useCircularStructures, } const {spec: normalized} = normalizeSwagger({ diff --git a/test/client.js b/test/client.js index f2bbd9f0b..2adde5f1b 100644 --- a/test/client.js +++ b/test/client.js @@ -2,7 +2,6 @@ import http from 'http' import url from 'url' import path from 'path' import fs from 'fs' -import {createSpy} from 'expect' import Swagger from '../src/index' @@ -288,25 +287,25 @@ describe('http', () => { }) test('should use requestInterceptor for resolving nested $refs', () => { - const requestInterceptor = createSpy().andCallThrough(req => req) + const requestInterceptor = jest.fn() return Swagger({ url: 'http://localhost:8000/nested/one.yaml', requestInterceptor }).then((client) => { - expect(requestInterceptor.calls.length).toEqual(3) - expect(requestInterceptor.calls[0].arguments[0].url).toEqual('http://localhost:8000/nested/one.yaml') - expect(requestInterceptor.calls[1].arguments[0].url).toEqual('http://localhost:8000/nested/two.yaml') - expect(requestInterceptor.calls[2].arguments[0].url).toEqual('http://localhost:8000/nested/three.yaml') + expect(requestInterceptor.mock.calls.length).toEqual(3) + expect(requestInterceptor.mock.calls[0][0].url).toEqual('http://localhost:8000/nested/one.yaml') + expect(requestInterceptor.mock.calls[1][0].url).toEqual('http://localhost:8000/nested/two.yaml') + expect(requestInterceptor.mock.calls[2][0].url).toEqual('http://localhost:8000/nested/three.yaml') expect(client.spec).toEqual({ data: { value: 'one!', nested: { - $$ref: './two.yaml', + $$ref: 'http://localhost:8000/nested/two.yaml', data: { value: 'two!', nested: { - $$ref: './three.yaml', + $$ref: 'http://localhost:8000/nested/three.yaml', value: 'three!' } } diff --git a/test/resolver.js b/test/resolver.js index 4c90d5eac..37f4ddf9f 100644 --- a/test/resolver.js +++ b/test/resolver.js @@ -144,19 +144,19 @@ describe('resolver', () => { one: { a: { b: { - $ref: '#/two' + $ref: 'http://example.com/swagger.json#/two' } } }, three: { b: { - $ref: '#/two' + $ref: 'http://example.com/swagger.json#/two' } }, two: { a: { b: { - $ref: '#/two' + $ref: 'http://example.com/swagger.json#/two' } } } diff --git a/test/resolver/circular-references-instantiation.yaml b/test/resolver/circular-references-instantiation.yaml new file mode 100644 index 000000000..3b8a715c6 --- /dev/null +++ b/test/resolver/circular-references-instantiation.yaml @@ -0,0 +1,83 @@ +meta: + title: "circular references - client instance instantiation" +cases: +- name: cross-document circular reference + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $ref: "./b.yaml#/components/schemas/Action" + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: "#/components/schemas/Action" + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" +- name: cross-document circular reference with `useCircularStructures` set + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $ref: "./b.yaml#/components/schemas/Action" + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: "#/components/schemas/Action" + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + useCircularStructures: true + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: &circularRefAnchor + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: *circularRefAnchor \ No newline at end of file diff --git a/test/resolver/circular-references-subtree-resolver.yaml b/test/resolver/circular-references-subtree-resolver.yaml new file mode 100644 index 000000000..736498590 --- /dev/null +++ b/test/resolver/circular-references-subtree-resolver.yaml @@ -0,0 +1,146 @@ +meta: + title: "circular references - subtree resolver" + only: true +cases: +- name: cross-document circular reference + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: "#/components/schemas/Action" + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $ref: "./b.yaml#/components/schemas/Action" + path: [] + opts: + returnEntireTree: true + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" +- name: cross-document circular reference with `useCircularStructures` set + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: "#/components/schemas/Action" + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $ref: "./b.yaml#/components/schemas/Action" + path: [] + opts: + returnEntireTree: true + useCircularStructures: true + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: &circularRefAnchor + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: *circularRefAnchor +- name: already-resolved circular reference input + description: should resolve the document one more level deep + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: "#/components/schemas/Action" + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + path: [] + opts: + returnEntireTree: true + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - only: true + equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" \ No newline at end of file diff --git a/test/resolver/index.js b/test/resolver/index.js new file mode 100644 index 000000000..42005f532 --- /dev/null +++ b/test/resolver/index.js @@ -0,0 +1,118 @@ +// Test runner +// + +import YAML from '@kyleshockey/js-yaml' +import fs from 'fs' +import Path from 'path' +import nock from 'nock' + +import Swagger from '../../src/index' + +const testDocuments = fs + .readdirSync(Path.join(__dirname)) + .filter(path => path.endsWith('yaml')) + .map(path => ({ + path: `${path}`, + contentString: fs.readFileSync(`${__dirname}/${path}`, 'utf8'), + })) + .map(doc => ({ + path: doc.path, + content: YAML.safeLoad(doc.contentString) + })) + + +testDocuments.forEach((doc) => { + const {path, content} = doc + const {meta = {}, cases = []} = content + + let rootDescribe + + if (meta.skip) rootDescribe = describe.skip + else if (meta.only) rootDescribe = describe.only + else rootDescribe = describe + + rootDescribe(`declarative resolver test suite - ${meta.title || path}`, function () { + if (cases && cases.length) { + return cases.forEach((currentCase) => { + describe(currentCase.name || '', function () { + beforeAll(() => { + Swagger.clearCache() + + if (!nock.isActive()) { + nock.activate() + } + + nock.cleanAll() + nock.disableNetConnect() + + const nockScope = nock('http://mock.swagger.test') + + if (currentCase.remoteDocuments) { + Object.keys(currentCase.remoteDocuments).forEach((key) => { + const docContent = currentCase.remoteDocuments[key] + nockScope + .get(`/${key}`) + .reply(200, docContent, { + 'Content-Type': 'application/yaml' + }) + }) + } + }) + + afterAll(nock.restore) + + return assertCaseExpectations( + currentCase, + async () => getValueForAction(currentCase.action) + ) + }) + }) + } + }) +}) + +async function getValueForAction(action) { + switch (action.type) { + case 'instantiateResolve': { + const client = await Swagger(action.config) + return { + spec: client.spec, + errors: client.errors + } + } + case 'resolveSubtree': { + return Swagger.resolveSubtree(action.config.obj, action.config.path, action.config.opts) + } + default: + throw new Error('case did not specify a valid action type') + } +} + +async function assertCaseExpectations(currentCase, resultGetter) { + currentCase.assertions.forEach((assertion) => { + let itFn + + if (assertion.skip) itFn = it.skip + else if (assertion.only) itFn = it.only + else itFn = it + + // if (assertion.output.match !== undefined) { + // itFn('should match expected error output', function () { + // expect(result).toMatch(assertion.output.match) + // }) + // } + + // if (assertion.output.length !== undefined) { + // itFn('should have expected array length', function () { + // expect(result).toBeAn(Array) + // expect(result.length).toBe(assertion.output.length) + // }) + // } + + if (assertion.equal !== undefined) { + itFn('should equal expected value', async function () { + expect(await resultGetter()).toEqual(assertion.equal) + }) + } + }) +} diff --git a/test/resolver/swos-109-instantiation.yaml b/test/resolver/swos-109-instantiation.yaml new file mode 100644 index 000000000..ae6aea5c7 --- /dev/null +++ b/test/resolver/swos-109-instantiation.yaml @@ -0,0 +1,263 @@ +meta: + title: "SWOS-109: instantiation cases" +cases: +- name: cross-document $ref + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $ref: "./b.yaml#/components/schemas/Action" + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + type: string + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + type: string +- name: cross-document $ref within allOf + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + allOf: + - $ref: "./b.yaml#/components/schemas/Action" + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + type: string + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + type: string +- name: cross-document $ref within allOf with a circular reference + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + allOf: + - $ref: "./b.yaml#/components/schemas/Action" + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: '#/components/schemas/Action' + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + # $$ref intentionally omitted here + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $ref: 'http://mock.swagger.test/b.yaml#/components/schemas/Action' +- name: cross-document $refs within nested members of multi-member allOf + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MyThing: + allOf: + - $ref: "#/components/schemas/AThing" + - $ref: "./b.yaml#/components/schemas/BThing" + - properties: + cContent: + $ref: "./c.yaml#/components/schemas/CThing" + AThing: + type: object + properties: + aContent: + $ref: "#/components/schemas/APrivateThing" + APrivateThing: + type: string + b.yaml: + openapi: 3.0.2 + components: + schemas: + BThing: + properties: + bContent: + $ref: '#/components/schemas/BPrivateThing' + BPrivateThing: + type: string + c.yaml: + openapi: 3.0.2 + components: + schemas: + CThing: + $ref: '#/components/schemas/CPrivateThing' + CPrivateThing: + type: string + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + AThing: + type: object + properties: + aContent: + $$ref: "http://mock.swagger.test/a.yaml#/components/schemas/APrivateThing" + type: string + APrivateThing: + type: string + MyThing: + type: object + properties: + aContent: + $$ref: "http://mock.swagger.test/a.yaml#/components/schemas/APrivateThing" + type: string + bContent: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/BPrivateThing" + type: string + cContent: + $$ref: "http://mock.swagger.test/c.yaml#/components/schemas/CPrivateThing" + type: string +- name: nested cross-document $refs within multi-member allOf + remoteDocuments: + a.yaml: + openapi: 3.0.2 + components: + schemas: + MyThing: + allOf: + - $ref: "#/components/schemas/AThing" + - $ref: "./documents/b.yaml#/components/schemas/BThing" + - $ref: "./documents/c.yaml#/components/schemas/CThing" + AThing: + type: object + properties: + aContent: + $ref: "#/components/schemas/APrivateThing" + APrivateThing: + type: string + documents/b.yaml: + openapi: 3.0.2 + components: + schemas: + BThing: + properties: + bContent: + allOf: + - $ref: '#/components/schemas/BPrivateThing' + BPrivateThing: + $ref: "../partials/d.yaml" + documents/c.yaml: + openapi: 3.0.2 + components: + schemas: + CThing: + properties: + cContent: + allOf: + - $ref: '#/components/schemas/CPrivateThing' + CPrivateThing: + $ref: "../partials/e.yaml" + partials/d.yaml: + type: string + partials/e.yaml: + type: object + action: + type: instantiateResolve + config: + url: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + AThing: + type: object + properties: + aContent: + $$ref: "http://mock.swagger.test/a.yaml#/components/schemas/APrivateThing" + type: string + APrivateThing: + type: string + MyThing: + type: object + properties: + aContent: + $$ref: "http://mock.swagger.test/a.yaml#/components/schemas/APrivateThing" + type: string + bContent: + type: string + cContent: + type: object \ No newline at end of file diff --git a/test/resolver/swos-109-subtree-resolver.yaml b/test/resolver/swos-109-subtree-resolver.yaml new file mode 100644 index 000000000..857045973 --- /dev/null +++ b/test/resolver/swos-109-subtree-resolver.yaml @@ -0,0 +1,251 @@ +meta: + title: "SWOS-109: subtree resolver cases" +cases: +- name: cross-document $ref + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + type: string + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $ref: "./b.yaml#/components/schemas/Action" + path: [] + opts: + returnEntireTree: true + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/Action" + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + type: string +- name: cross-document $ref to a remote document within allOf + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + type: string + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + allOf: + - $ref: "./b.yaml#/components/schemas/Action" + path: [] + opts: + returnEntireTree: true + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + type: string +- name: cross-document $ref to a remote document within allOf with a circular reference + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + Action: + properties: + confirmation: + $ref: '#/components/schemas/ActionConfirmation' + ActionConfirmation: + properties: + dismiss_action: + $ref: '#/components/schemas/Action' + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + allOf: + - $ref: "./b.yaml#/components/schemas/Action" + path: [] + opts: + returnEntireTree: true + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + openapi: 3.0.2 + components: + schemas: + MessageWidgetData: + properties: + confirmation: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/ActionConfirmation" + properties: + dismiss_action: + $ref: 'http://mock.swagger.test/b.yaml#/components/schemas/Action' +- name: cross-document $refs within nested members of multi-member allOf + remoteDocuments: + b.yaml: + openapi: 3.0.2 + components: + schemas: + BThing: + properties: + bContent: + $ref: '#/components/schemas/BPrivateThing' + BPrivateThing: + type: string + c.yaml: + openapi: 3.0.2 + components: + schemas: + CThing: + $ref: '#/components/schemas/CPrivateThing' + CPrivateThing: + type: string + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MyThing: + allOf: + - $ref: "#/components/schemas/AThing" + - $ref: "./b.yaml#/components/schemas/BThing" + - properties: + cContent: + $ref: "./c.yaml#/components/schemas/CThing" + AThing: + type: object + properties: + aContent: + $ref: "#/components/schemas/APrivateThing" + APrivateThing: + type: string + path: [components, schemas, MyThing] + opts: + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + type: object + properties: + aContent: + $$ref: "http://mock.swagger.test/a.yaml#/components/schemas/APrivateThing" + type: string + bContent: + $$ref: "http://mock.swagger.test/b.yaml#/components/schemas/BPrivateThing" + type: string + cContent: + $$ref: "http://mock.swagger.test/c.yaml#/components/schemas/CPrivateThing" + type: string +- name: nested cross-document $refs within multi-member allOf + remoteDocuments: + documents/b.yaml: + openapi: 3.0.2 + components: + schemas: + BThing: + properties: + bContent: + allOf: + - $ref: '#/components/schemas/BPrivateThing' + BPrivateThing: + $ref: "../partials/d.yaml" + documents/c.yaml: + openapi: 3.0.2 + components: + schemas: + CThing: + properties: + cContent: + allOf: + - $ref: '#/components/schemas/CPrivateThing' + CPrivateThing: + $ref: "../partials/e.yaml" + partials/d.yaml: + type: string + partials/e.yaml: + type: object + action: + type: resolveSubtree + config: + obj: + openapi: 3.0.2 + components: + schemas: + MyThing: + allOf: + - $ref: "#/components/schemas/AThing" + - $ref: "./documents/b.yaml#/components/schemas/BThing" + - $ref: "./documents/c.yaml#/components/schemas/CThing" + AThing: + type: object + properties: + aContent: + $ref: "#/components/schemas/APrivateThing" + APrivateThing: + type: string + path: [components, schemas, MyThing] + opts: + baseDoc: "http://mock.swagger.test/a.yaml" + assertions: + - equal: + errors: [] + spec: + type: object + properties: + aContent: + $$ref: "http://mock.swagger.test/a.yaml#/components/schemas/APrivateThing" + type: string + bContent: + type: string + cContent: + type: object \ No newline at end of file diff --git a/test/specmap/data/cyclic/external/1.js b/test/specmap/data/cyclic/external/1.js index cdb0733dd..39921ab67 100644 --- a/test/specmap/data/cyclic/external/1.js +++ b/test/specmap/data/cyclic/external/1.js @@ -17,7 +17,7 @@ module.exports = { output: { x: { b: { - $ref: '#/a' + $ref: 'http://1/spec#/a' } } } diff --git a/test/specmap/data/cyclic/external/10.js b/test/specmap/data/cyclic/external/10.js index 770766b5b..c4995aa88 100644 --- a/test/specmap/data/cyclic/external/10.js +++ b/test/specmap/data/cyclic/external/10.js @@ -17,7 +17,7 @@ module.exports = { }, output: { x: { - $ref: '#/a' + $ref: 'http://2/spec#/a' } } } diff --git a/test/specmap/data/cyclic/external/2.js b/test/specmap/data/cyclic/external/2.js index 199ae1bcf..1f73bdf36 100644 --- a/test/specmap/data/cyclic/external/2.js +++ b/test/specmap/data/cyclic/external/2.js @@ -27,7 +27,7 @@ module.exports = { output: { x: { d: { - $ref: '#/c' + $ref: 'http://8/spec3#/c' } } } diff --git a/test/specmap/data/cyclic/external/20.js b/test/specmap/data/cyclic/external/20.js index 43d4857e2..266287dab 100644 --- a/test/specmap/data/cyclic/external/20.js +++ b/test/specmap/data/cyclic/external/20.js @@ -31,7 +31,7 @@ module.exports = { d1k: { d2k: { d3k: { - $ref: '#/defs/d1' + $ref: 'http://3/spec#/defs/d1' } } } diff --git a/test/specmap/data/cyclic/external/21.js b/test/specmap/data/cyclic/external/21.js index 8c1674d31..a075ee605 100644 --- a/test/specmap/data/cyclic/external/21.js +++ b/test/specmap/data/cyclic/external/21.js @@ -31,7 +31,7 @@ module.exports = { d1k: { d2k: { d3k: { - $ref: '#/defs/0' + $ref: 'http://4/spec#/defs/0' } } } diff --git a/test/specmap/data/cyclic/external/40.js b/test/specmap/data/cyclic/external/40.js index df0d87f39..c6b1479e3 100644 --- a/test/specmap/data/cyclic/external/40.js +++ b/test/specmap/data/cyclic/external/40.js @@ -25,7 +25,7 @@ module.exports = { x: { b: { d: { - $ref: '../spec1#/a' + $ref: 'http://7/spec1#/a' } } } diff --git a/test/specmap/index.js b/test/specmap/index.js index ad957177e..08d7969d6 100644 --- a/test/specmap/index.js +++ b/test/specmap/index.js @@ -591,7 +591,7 @@ describe('specmap', () => { }).then(() => xapp.restore()) }) - test('should retain local $refs inside external $refs', () => { + test('should rewrite $$ref artifacts inside external $refs', () => { plugins.refs.clearCache() const xapp = xmock() @@ -610,7 +610,7 @@ describe('specmap', () => { allowMetaPatches: true, }).then((res) => { expect(res.spec.$$ref).toEqual('http://example.com/common.json#/works') - expect(res.spec.one.$$ref).toEqual('#/works/two') + expect(res.spec.one.$$ref).toEqual('http://example.com/common.json#/works/two') }).then(() => xapp.restore()) }) }) diff --git a/test/subtree-resolver.js b/test/subtree-resolver.js index d6d0e01a0..34cc32035 100644 --- a/test/subtree-resolver.js +++ b/test/subtree-resolver.js @@ -1,5 +1,4 @@ import xmock from 'xmock' -import {createSpy} from 'expect' import resolve from '../src/subtree-resolver' describe('subtree $ref resolver', () => { @@ -732,7 +731,7 @@ describe('subtree $ref resolver', () => { } } - const requestInterceptor = createSpy((req) => { + const requestInterceptor = jest.fn((req) => { req.headers.authorization = 'wow' if (req.url === 'http://example.com/fake-remote.json') { @@ -742,7 +741,7 @@ describe('subtree $ref resolver', () => { req.url = 'http://example.com/nested.json' } return req - }).andCallThrough() + }) xmock() .get('http://example.com/remote.json', function (req, res, next) { @@ -772,22 +771,22 @@ describe('subtree $ref resolver', () => { requestInterceptor }) - expect(requestInterceptor.calls.length).toEqual(2) - expect(requestInterceptor.calls[0].arguments[0].url).toEqual('http://example.com/remote.json') - expect(requestInterceptor.calls[1].arguments[0].url).toEqual('http://example.com/nested.json') + expect(requestInterceptor.mock.calls.length).toEqual(2) + expect(requestInterceptor.mock.calls[0][0].url).toEqual('http://example.com/remote.json') + expect(requestInterceptor.mock.calls[1][0].url).toEqual('http://example.com/nested.json') expect(res).toEqual({ errors: [], spec: { foo: { bar: { - $$ref: './fake-remote.json', + $$ref: 'http://example.com/fake-remote.json', baz: { - $$ref: './fake-nested.json', + $$ref: 'http://example.com/fake-nested.json', result: 'it works!' }, remoteOther: { - $$ref: './fake-nested.json', + $$ref: 'http://example.com/fake-nested.json', result: 'it works!' } } diff --git a/test/webpack-bundle/index.js b/test/webpack-bundle/index.js index 3f3211dee..ba9f06dc2 100755 --- a/test/webpack-bundle/index.js +++ b/test/webpack-bundle/index.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-unresolved const Swagger = require('./.tmp/swagger-client.js') describe('webpack build', () => {