From 7d3660c8f04cfcb51fa8c6cda8f8a9b7cd78b3fb Mon Sep 17 00:00:00 2001 From: Opender Singh Date: Tue, 30 Jun 2020 12:00:33 +1200 Subject: [PATCH] CLI linting + exit codes (#2318) --- .../__mocks__/insomnia-testing.js | 1 + .../flow-typed/@stoplight/spectral.js | 5 + packages/insomnia-cli/package-lock.json | 947 ++++++++++++++++-- packages/insomnia-cli/package.json | 1 + .../__snapshots__/inso-snapshot.test.js.snap | 26 + .../insomnia-cli/src/__tests__/cli.test.js | 7 +- .../src/__tests__/inso-snapshot.test.js | 12 +- .../insomnia-cli/src/__tests__/util.test.js | 44 +- packages/insomnia-cli/src/cli.js | 24 +- ...nerate.test.js => generate-config.test.js} | 4 +- .../__tests__/lint-specification.test.js | 20 + .../src/commands/__tests__/run-tests.test.js | 25 +- .../src/commands/generate-config.js | 30 +- .../src/commands/lint-specification.js | 30 + .../insomnia-cli/src/commands/run-tests.js | 9 +- .../spc_46c5a4a40e83445a9bd9d9758b86c16c.yml | 32 + ...046a738f001eb3090261a537b1b78f86c2094c.yml | 14 + ...738f001eb3090261a537b1b78f86c2094c_sub.yml | 14 + ...2d4860c7da418a85ffea7406e1292a21946b60.yml | 21 + ...2d4860c7da418a85ffea7406e1292ab410454b.yml | 21 + ...2d4860c7da418a85ffea7406e1292a30baa249.yml | 10 + .../wrk_012d4860c7da418a85ffea7406e1292a.yml | 8 + packages/insomnia-cli/src/util.js | 16 +- packages/insomnia-testing/index.js | 2 +- 24 files changed, 1200 insertions(+), 123 deletions(-) create mode 100644 packages/insomnia-cli/flow-typed/@stoplight/spectral.js rename packages/insomnia-cli/src/commands/__tests__/{generate.test.js => generate-config.test.js} (94%) create mode 100644 packages/insomnia-cli/src/commands/__tests__/lint-specification.test.js create mode 100644 packages/insomnia-cli/src/commands/lint-specification.js create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml create mode 100755 packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml diff --git a/packages/insomnia-cli/__mocks__/insomnia-testing.js b/packages/insomnia-cli/__mocks__/insomnia-testing.js index dc6f497a39..a8a12bce3d 100644 --- a/packages/insomnia-cli/__mocks__/insomnia-testing.js +++ b/packages/insomnia-cli/__mocks__/insomnia-testing.js @@ -3,6 +3,7 @@ const mod = jest.requireActual('insomnia-testing'); module.exports = { ...mod, generate: jest.fn(), + generateToFile: jest.fn(), runTests: jest.fn(), runTestsCli: jest.fn(), }; diff --git a/packages/insomnia-cli/flow-typed/@stoplight/spectral.js b/packages/insomnia-cli/flow-typed/@stoplight/spectral.js new file mode 100644 index 0000000000..10091eeb01 --- /dev/null +++ b/packages/insomnia-cli/flow-typed/@stoplight/spectral.js @@ -0,0 +1,5 @@ +// @flow + +declare module '@stoplight/spectral' { + declare module.exports: *; +} diff --git a/packages/insomnia-cli/package-lock.json b/packages/insomnia-cli/package-lock.json index 118156d06c..3d03fd0aa6 100644 --- a/packages/insomnia-cli/package-lock.json +++ b/packages/insomnia-cli/package-lock.json @@ -39,7 +39,6 @@ "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, "requires": { "@babel/highlight": "^7.10.1" } @@ -302,8 +301,7 @@ "@babel/helper-validator-identifier": { "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" }, "@babel/helper-wrap-function": { "version": "7.10.1", @@ -332,7 +330,6 @@ "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", @@ -998,7 +995,6 @@ "version": "7.10.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -1644,6 +1640,29 @@ } } }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, "@sinonjs/commons": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", @@ -1662,6 +1681,157 @@ "@sinonjs/commons": "^1.7.0" } }, + "@stoplight/json": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.6.0.tgz", + "integrity": "sha512-6hJN735r+aPzHP28HnBj30uC+RGyf/ZWEtAMlrXI4DntzocWvhgDqxLuLgOlmXkMd/4OAlD7fJQ/cI2RXNuWvQ==", + "requires": { + "@stoplight/types": "^11.4.0", + "jsonc-parser": "~2.2.0", + "lodash": "^4.17.15", + "safe-stable-stringify": "^1.1" + } + }, + "@stoplight/json-ref-readers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.1.1.tgz", + "integrity": "sha512-yE6SpGaBlj+QM4ony1+ST1Unz4TimZglU1lSJOlyCrVrAC1VoFpoJ1exMnU8Cg/++YzmBN9qBa4jk9s0CBnrTA==", + "requires": { + "node-fetch": "^2.6.0" + } + }, + "@stoplight/json-ref-resolver": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.0.8.tgz", + "integrity": "sha512-Ns0jsq/qqDdhpd9iPXLUx5YRddUF5gfg0zkxmskV+srXrWlndg0S50dkX/GF0yrExKjru4veqW8Xx+Wo0noPtg==", + "requires": { + "@stoplight/json": "^3.1.2", + "@stoplight/path": "^1.3.0", + "@stoplight/types": "^11.1.1", + "@types/urijs": "^1.19", + "dependency-graph": "~0.8.0", + "fast-memoize": "^2.5.1", + "immer": "^4.0.1", + "lodash": "^4.17.15", + "tslib": "^1.10.0", + "urijs": "~1.19.1" + } + }, + "@stoplight/lifecycle": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@stoplight/lifecycle/-/lifecycle-2.2.1.tgz", + "integrity": "sha512-XOyfoJyWp5tXRFWq43mvnOoYTvkupwqGjDQnQ2o1qRNnfTrE70bjNK5ptD9A6m3zajAXgbl0puFa7P2CMg7+ew==", + "requires": { + "strict-event-emitter-types": "^2.0.0", + "wolfy87-eventemitter": "~5.2.8" + } + }, + "@stoplight/path": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.1.tgz", + "integrity": "sha512-I6YEfxspGglxt7MbgNbKThHdqh8CJWnDC1x1JUk2rka2D7mCpMSEu5I8IiAp997Dp4YIXDY6Did6gge8OY8KnA==" + }, + "@stoplight/spectral": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral/-/spectral-5.4.0.tgz", + "integrity": "sha512-c9NFKnzkiFqkF9RVgr7clfow6pXFKbEs+4bfKvn6PuUAYrTeOwxwYm7Nypf4KlxRGB+01epi9shrLMv4Nb2Kag==", + "requires": { + "@stoplight/json": "3.6.0", + "@stoplight/json-ref-readers": "1.1.1", + "@stoplight/json-ref-resolver": "3.0.8", + "@stoplight/lifecycle": "^2.2.1", + "@stoplight/path": "1.3.1", + "@stoplight/types": "^11.6.0", + "@stoplight/yaml": "3.7.0", + "abort-controller": "3.0.0", + "ajv": "6.12.2", + "ajv-oai": "1.2.0", + "better-ajv-errors": "0.6.7", + "blueimp-md5": "2.13.0", + "chalk": "4.0.0", + "eol": "0.9.1", + "fast-glob": "3.1.0", + "jsonpath-plus": "4.0.0", + "lodash": "4.17.15", + "nanoid": "2.1.11", + "node-fetch": "2.6", + "proxy-agent": "3.1.1", + "strip-ansi": "6.0", + "text-table": "0.2", + "tslib": "1.11.1", + "yargs": "15.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@stoplight/types": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-11.8.0.tgz", + "integrity": "sha512-JSCLtuy9Buf89rRV9AmnK452mUqen3cpZgx0eOQdv+ayDuy8uuezU6hcsC93cfQ9E3OOpWs91El4sTrjZkv9IQ==", + "requires": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + } + }, + "@stoplight/yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-3.7.0.tgz", + "integrity": "sha512-lYs577C0tqs3WHtused0hclE+YHVshgeZT8i6kkqSIt1GUP3Hbe4AwZDEvFgZ9+9pa0JGlmKMrm0PJfvfKFxkw==", + "requires": { + "@stoplight/types": "^11.1.1", + "@stoplight/yaml-ast-parser": "0.0.44", + "lodash": "^4.17.15" + } + }, + "@stoplight/yaml-ast-parser": { + "version": "0.0.44", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.44.tgz", + "integrity": "sha512-PdY8p2Ufgtorf4d2DbKMfknILMa8KwuyyMMR/2lgK1mLaU8F5PKWYc+h9hIzC+ar0bh7m9h2rINo32m7ADfVyA==" + }, "@types/babel__core": { "version": "7.1.8", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", @@ -1706,8 +1876,7 @@ "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/graceful-fs": { "version": "4.1.3", @@ -1743,6 +1912,11 @@ "@types/istanbul-lib-report": "*" } }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" + }, "@types/node": { "version": "14.0.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.11.tgz", @@ -1767,6 +1941,11 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, + "@types/urijs": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.9.tgz", + "integrity": "sha512-/tiJyrc0GPcsReHzgC0SXwOmoPjLqYe01W7dLYB0yasQXMbcRee+ZIk+g8MIQhoBS8fPoBQO3Y93+aeBrI93Ug==" + }, "@types/yargs": { "version": "15.0.5", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", @@ -1788,6 +1967,14 @@ "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", @@ -1810,11 +1997,18 @@ "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", "dev": true }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1822,6 +2016,14 @@ "uri-js": "^4.2.2" } }, + "ajv-oai": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ajv-oai/-/ajv-oai-1.2.0.tgz", + "integrity": "sha512-BQ2HL/ZfiMm68Xdy7dkS49Vnnq+gSsxfOugJB4TA8Kmu4Ie9ZIa4K4VQYbcHxyW4ccg6l9VB57PjRA2RPh1elw==", + "requires": { + "decimal.js": "^10.2.0" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1847,8 +2049,7 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "3.2.1", @@ -1948,6 +2149,11 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-types": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz", + "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==" + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -2185,6 +2391,20 @@ "tweetnacl": "^0.14.3" } }, + "better-ajv-errors": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz", + "integrity": "sha512-PYgt/sCzR4aGpyNy5+ViSQ77ognMnWq7745zM+/flYO4/Yisdtp9wDQW2IKCyVYPUxQt3E/b5GBSwfhd1LPdlg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/runtime": "^7.0.0", + "chalk": "^2.4.1", + "core-js": "^3.2.1", + "json-to-ast": "^2.0.3", + "jsonpointer": "^4.0.1", + "leven": "^3.1.0" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -2202,6 +2422,11 @@ "file-uri-to-path": "1.0.0" } }, + "blueimp-md5": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.13.0.tgz", + "integrity": "sha512-lmp0m647R5e77ORduxLW5mISIDcvgJZa52vMBv5uVI3UmSWTQjkJsZVBfaFqQPw/QFogJwvY6e3Gl9nP+Loe+Q==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2278,6 +2503,11 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -2295,6 +2525,11 @@ "unset-value": "^1.0.0" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -2409,7 +2644,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2419,8 +2653,12 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==" }, "collect-v8-coverage": { "version": "1.0.1", @@ -2491,6 +2729,11 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, "core-js-compat": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", @@ -2512,8 +2755,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-spawn": { "version": "7.0.3", @@ -2558,6 +2800,11 @@ "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -2573,7 +2820,6 @@ "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" } @@ -2586,8 +2832,7 @@ "decimal.js": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", - "dev": true + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==" }, "decode-uri-component": { "version": "0.2.0", @@ -2606,8 +2851,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "4.2.2", @@ -2664,12 +2908,39 @@ } } }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "dependency-graph": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.1.tgz", + "integrity": "sha512-g213uqF8fyk40W8SBjm079n3CZB4qSpCrA2ye1fLGzH/4HEgB6tzuW2CbLE7leb4t45/6h44Ud59Su1/ROTfqw==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -2723,8 +2994,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "end-of-stream": { "version": "1.4.4", @@ -2735,6 +3005,11 @@ "once": "^1.4.0" } }, + "eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2798,6 +3073,19 @@ "is-symbol": "^1.0.2" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2807,7 +3095,6 @@ "version": "1.14.2", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", - "dev": true, "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -2820,7 +3107,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true } } @@ -2833,14 +3119,17 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, "exec-sh": { "version": "0.3.4", @@ -2965,8 +3254,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -3063,20 +3351,90 @@ "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz", + "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "requires": { + "reusify": "^1.0.4" + } }, "fb-watchman": { "version": "2.0.1", @@ -3090,9 +3448,7 @@ "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "fill-range": { "version": "4.0.0", @@ -3224,6 +3580,38 @@ "nan": "^2.12.1" } }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3270,6 +3658,34 @@ "pump": "^3.0.0" } }, + "get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3333,6 +3749,11 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -3437,6 +3858,42 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -3448,6 +3905,25 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -3458,11 +3934,15 @@ "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" } }, + "immer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-4.0.2.tgz", + "integrity": "sha512-Q/tm+yKqnKy4RIBmmtISBlhXuSDrB69e9EKTYiIenIKQkXBQir43w+kN/eGiax3wt1J0O1b2fYcNqLSbEcXA7w==" + }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -3512,6 +3992,11 @@ "loose-envify": "^1.0.0" } }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -3644,8 +4129,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -3764,8 +4248,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -5341,14 +5824,12 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5412,11 +5893,20 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, + "json-schema-ref-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-7.1.4.tgz", + "integrity": "sha512-AD7bvav0vak1/63w3jH8F7eHId/4E4EPdMAEZhGxtjktteUv9dnNB/cJy6nVnMyoTPBJnLwFK6tiQPSTeleCtQ==", + "requires": { + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1", + "ono": "^6.0.0" + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", @@ -5424,6 +5914,15 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", + "requires": { + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -5433,6 +5932,21 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" + }, + "jsonpath-plus": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", + "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==" + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -5460,8 +5974,7 @@ "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levenary": { "version": "1.1.1", @@ -5476,7 +5989,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -5501,6 +6013,16 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -5524,6 +6046,14 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -5564,6 +6094,11 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -5916,6 +6451,11 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5941,12 +6481,22 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -6124,11 +6674,36 @@ "mimic-fn": "^2.1.0" } }, + "ono": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ono/-/ono-6.0.1.tgz", + "integrity": "sha512-5rdYW/106kHqLeG22GE2MHKq+FlsxMERZev9DCzQX1zwkxnFwBivSn5i17a5O/rDmOJOdf4Wyt80UZljzx9+DA==" + }, + "openapi-2-kong": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/openapi-2-kong/-/openapi-2-kong-2.2.9.tgz", + "integrity": "sha512-KVfyrqMugb5LHNH+QSG9QPn1WR+wWLbNNhaF9PGvhVyltKPhXchSV6DqFx8VK5l+EO3YmE21rLjqelCf2rUOxQ==", + "requires": { + "slugify": "^1.3.6", + "swagger-parser": "^8.0.3", + "url-join": "^4.0.1", + "yaml": "^1.7.2" + } + }, + "openapi-schemas": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/openapi-schemas/-/openapi-schemas-1.0.3.tgz", + "integrity": "sha512-KtMWcK2VtOS+nD8RKSIyScJsj8JrmVWcIX7Kjx4xEHijFYuvMTDON8WfeKOgeSb4uNG6UsqLj5Na7nKbSav9RQ==" + }, + "openapi-types": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.5.tgz", + "integrity": "sha512-11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==" + }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -6171,6 +6746,33 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "requires": { + "agent-base": "^4.2.0", + "debug": "^4.1.1", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -6321,8 +6923,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "pretty-format": { "version": "26.0.1", @@ -6372,9 +6973,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise.allsettled": { "version": "1.0.2", @@ -6398,6 +6997,26 @@ "sisteransi": "^1.0.4" } }, + "proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "requires": { + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -6417,8 +7036,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", @@ -6426,6 +7044,17 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -6481,8 +7110,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6523,8 +7150,7 @@ "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, "regenerator-transform": { "version": "0.14.4", @@ -6727,6 +7353,11 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6742,11 +7373,15 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -6757,11 +7392,15 @@ "ret": "~0.1.10" } }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -6912,6 +7551,11 @@ } } }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6952,6 +7596,16 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slugify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.2.tgz", + "integrity": "sha512-7UfMG5rtkxfOI5jg/+f4DMQS3ikUqfWnfMvitrhwdTV4pibWXq9mN4RNLHSV3M1lR++x7z+AG7znsiozdBP+aA==" + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7074,6 +7728,34 @@ } } }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -7218,12 +7900,22 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "strict-event-emitter-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", + "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==" + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -7238,7 +7930,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7267,8 +7958,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -7277,7 +7966,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -7340,6 +8028,25 @@ } } }, + "swagger-methods": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-2.0.2.tgz", + "integrity": "sha512-/RNqvBZkH8+3S/FqBPejHxJxZenaYq3MrpeXnzi06aDIS39Mqf5YCUNb/ZBjsvFFt8h9FxfKs8EXPtcYdfLiRg==" + }, + "swagger-parser": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-8.0.4.tgz", + "integrity": "sha512-KGRdAaMJogSEB7sPKI31ptKIWX8lydEDAwWgB4pBMU7zys5cd54XNhoPSVlTxG/A3LphjX47EBn9j0dOGyzWbA==", + "requires": { + "call-me-maybe": "^1.0.1", + "json-schema-ref-parser": "^7.1.3", + "ono": "^6.0.0", + "openapi-schemas": "^1.0.2", + "openapi-types": "^1.3.5", + "swagger-methods": "^2.0.1", + "z-schema": "^4.2.2" + } + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -7367,12 +8074,22 @@ "minimatch": "^3.0.4" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -7427,6 +8144,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "tough-cookie": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", @@ -7447,6 +8169,11 @@ "punycode": "^2.1.1" } }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7466,7 +8193,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -7531,6 +8257,11 @@ "set-value": "^2.0.1" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7582,17 +8313,26 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } }, + "urijs": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", + "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==" + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -7602,9 +8342,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" }, "uuid": { "version": "7.0.3", @@ -7642,6 +8385,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -7770,11 +8518,15 @@ } } }, + "wolfy87-eventemitter": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz", + "integrity": "sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workerpool": { "version": "6.0.0", @@ -7785,7 +8537,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7796,7 +8547,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -7806,7 +8556,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -7814,8 +8563,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -7854,11 +8602,21 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "yaml": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", @@ -7868,7 +8626,6 @@ "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -7887,7 +8644,6 @@ "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -8013,6 +8769,25 @@ } } } + }, + "z-schema": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz", + "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==", + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^12.0.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + } + } } } } diff --git a/packages/insomnia-cli/package.json b/packages/insomnia-cli/package.json index a552ce15b8..e46a94bb67 100644 --- a/packages/insomnia-cli/package.json +++ b/packages/insomnia-cli/package.json @@ -37,6 +37,7 @@ "rimraf": "^3.0.2" }, "dependencies": { + "@stoplight/spectral": "^5.4.0", "commander": "^5.1.0", "insomnia-testing": "^2.2.9", "openapi-2-kong": "^2.2.10", diff --git a/packages/insomnia-cli/src/__tests__/__snapshots__/inso-snapshot.test.js.snap b/packages/insomnia-cli/src/__tests__/__snapshots__/inso-snapshot.test.js.snap index 19a69d171e..cf6fb1955f 100644 --- a/packages/insomnia-cli/src/__tests__/__snapshots__/inso-snapshot.test.js.snap +++ b/packages/insomnia-cli/src/__tests__/__snapshots__/inso-snapshot.test.js.snap @@ -13,6 +13,7 @@ Options: Commands: generate Code generation utilities run Execution utilities + lint Linting utilities help [command] display help for command" `; @@ -29,6 +30,7 @@ Options: Commands: generate Code generation utilities run Execution utilities + lint Linting utilities help [command] display help for command" `; @@ -70,9 +72,32 @@ Options: Commands: generate Code generation utilities run Execution utilities + lint Linting utilities help [command] display help for command" `; +exports[`Snapshot for "inso lint -h" 1`] = ` +"Usage: inso lint [options] [command] + +Linting utilities + +Options: + -h, --help display help for command + +Commands: + spec Lint an API Specification + help [command] display help for command" +`; + +exports[`Snapshot for "inso lint spec -h" 1`] = ` +"Usage: inso lint spec [options] + +Lint an API Specification + +Options: + -h, --help display help for command" +`; + exports[`Snapshot for "inso run -h" 1`] = ` "Usage: inso run [options] [command] @@ -95,5 +120,6 @@ Options: -r, --reporter reporter to use, options are [dot, list, spec, min, progress] (default: \\"spec\\") -b, --bail abort (\\"bail\\") after first test failure + --keep-file do not delete the generated test file -h, --help display help for command" `; diff --git a/packages/insomnia-cli/src/__tests__/cli.test.js b/packages/insomnia-cli/src/__tests__/cli.test.js index 62a2ca1644..dda4ca2514 100644 --- a/packages/insomnia-cli/src/__tests__/cli.test.js +++ b/packages/insomnia-cli/src/__tests__/cli.test.js @@ -3,7 +3,6 @@ import * as cli from '../cli'; import { generateConfig } from '../commands/generate-config'; jest.mock('../commands/generate-config'); -const originalError = console.error; const initInso = () => { return (args: string): void => { @@ -21,11 +20,13 @@ describe('cli', () => { let inso = initInso(); beforeEach(() => { inso = initInso(); - (console: any).error = jest.fn(); + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(process, 'exit').mockImplementation(() => {}); + (generateConfig: any).mockResolvedValue(true); }); afterEach(() => { - (console: any).error = originalError; + jest.restoreAllMocks(); }); it('should error when required --type option is missing', () => diff --git a/packages/insomnia-cli/src/__tests__/inso-snapshot.test.js b/packages/insomnia-cli/src/__tests__/inso-snapshot.test.js index b1b90d97d6..240c5b204d 100644 --- a/packages/insomnia-cli/src/__tests__/inso-snapshot.test.js +++ b/packages/insomnia-cli/src/__tests__/inso-snapshot.test.js @@ -7,7 +7,17 @@ import * as packageJson from '../../package.json'; // These tests use the executable /bin/inso, which relies on /dist. describe('Snapshot for', () => { - it.each(['-h', '--help', 'help', 'generate -h', 'generate config -h', 'run -h', 'run test -h'])( + it.each([ + '-h', + '--help', + 'help', + 'generate -h', + 'generate config -h', + 'run -h', + 'run test -h', + 'lint -h', + 'lint spec -h', + ])( '"inso %s"', async args => { const { stdout } = await execa(getBinPathSync(), args.split(' ')); diff --git a/packages/insomnia-cli/src/__tests__/util.test.js b/packages/insomnia-cli/src/__tests__/util.test.js index 41ecbf08d4..d74ff11646 100644 --- a/packages/insomnia-cli/src/__tests__/util.test.js +++ b/packages/insomnia-cli/src/__tests__/util.test.js @@ -1,6 +1,6 @@ // @flow import commander from 'commander'; -import { getAllOptions } from '../util'; +import { getAllOptions, exit, logErrorExit1 } from '../util'; describe('getAllOptions()', () => { it('should combine options from all commands into one object', () => { @@ -21,3 +21,45 @@ describe('getAllOptions()', () => { parent.parse('node test command subCommand --global --subCmd'.split(' ')); }); }); + +describe('exit()', () => { + it('should exit 0 if successful result', async () => { + const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); + + await exit(new Promise(resolve => resolve(true))); + + expect(exitSpy).toHaveBeenCalledWith(0); + }); + + it('should exit 1 if unsuccessful result', async () => { + const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); + + await exit(new Promise(resolve => resolve(false))); + + expect(exitSpy).toHaveBeenCalledWith(1); + }); + + it('should exit 1 and print to console and if rejected', async () => { + const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); + const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + + const error = new Error('message'); + await exit(new Promise((resolve, reject) => reject(error))); + + expect(errorSpy).toHaveBeenCalledWith(error); + expect(exitSpy).toHaveBeenCalledWith(1); + }); +}); + +describe('logErrorExit1()', () => { + it('should exit 1 and print error to console', async () => { + const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); + const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + + const error = new Error('message'); + await logErrorExit1(error); + + expect(errorSpy).toHaveBeenCalledWith(error); + expect(exitSpy).toHaveBeenCalledWith(1); + }); +}); diff --git a/packages/insomnia-cli/src/cli.js b/packages/insomnia-cli/src/cli.js index 17a5773666..016e1f875e 100755 --- a/packages/insomnia-cli/src/cli.js +++ b/packages/insomnia-cli/src/cli.js @@ -1,7 +1,8 @@ // @flow import { ConversionTypeMap, generateConfig } from './commands/generate-config'; -import { getVersion, createCommand, getAllOptions } from './util'; +import { getVersion, createCommand, getAllOptions, logErrorExit1, exit } from './util'; import { runInsomniaTests, TestReporterEnum } from './commands/run-tests'; +import { lintSpecification } from './commands/lint-specification'; function makeGenerateCommand(exitOverride: boolean) { // inso generate @@ -18,7 +19,7 @@ function makeGenerateCommand(exitOverride: boolean) { `type of configuration to generate, options are [${conversionTypes}]`, ) .option('-o, --output ', 'save the generated config to a file') - .action((identifier, cmd) => generateConfig(identifier, getAllOptions(cmd))); + .action((identifier, cmd) => exit(generateConfig(identifier, getAllOptions(cmd)))); return generate; } @@ -39,11 +40,25 @@ function makeTestCommand(exitOverride: boolean) { TestReporterEnum.spec, ) .option('-b, --bail', 'abort ("bail") after first test failure') - .action(cmd => runInsomniaTests(getAllOptions(cmd))); + .option('--keep-file', 'do not delete the generated test file') + .action(cmd => exit(runInsomniaTests(getAllOptions(cmd)))); return run; } +function makeLintCommand(exitOverride: boolean) { + // inso lint + const lint = createCommand(exitOverride, 'lint').description('Linting utilities'); + + // inso lint spec + lint + .command('spec ') + .description('Lint an API Specification') + .action((identifier, cmd) => exit(lintSpecification(identifier, getAllOptions(cmd)))); + + return lint; +} + export function go(args?: Array, exitOverride?: boolean): void { if (!args) { args = process.argv; @@ -56,6 +71,7 @@ export function go(args?: Array, exitOverride?: boolean): void { .option('--working-dir ', 'set working directory') .addCommand(makeGenerateCommand(!!exitOverride)) .addCommand(makeTestCommand(!!exitOverride)) + .addCommand(makeLintCommand(!!exitOverride)) .parseAsync(args) - .catch(err => console.log('An error occurred', err)); + .catch(logErrorExit1); } diff --git a/packages/insomnia-cli/src/commands/__tests__/generate.test.js b/packages/insomnia-cli/src/commands/__tests__/generate-config.test.js similarity index 94% rename from packages/insomnia-cli/src/commands/__tests__/generate.test.js rename to packages/insomnia-cli/src/commands/__tests__/generate-config.test.js index ec398f2728..ec9ec980a2 100644 --- a/packages/insomnia-cli/src/commands/__tests__/generate.test.js +++ b/packages/insomnia-cli/src/commands/__tests__/generate-config.test.js @@ -57,7 +57,7 @@ describe('generateConfig()', () => { it('should write generated documents to file system', async () => { const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); - const writeFileSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); + const writeFileSpy = jest.spyOn(fs.promises, 'writeFile').mockImplementation(() => {}); mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); await generateConfig(filePath, { ...base, output: 'output.yaml' }); @@ -69,7 +69,7 @@ describe('generateConfig()', () => { it('should generate documents using workingDir', async () => { const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); - const writeFileSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); + const writeFileSpy = jest.spyOn(fs.promises, 'writeFile').mockImplementation(() => {}); mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); await generateConfig('file.yaml', { diff --git a/packages/insomnia-cli/src/commands/__tests__/lint-specification.test.js b/packages/insomnia-cli/src/commands/__tests__/lint-specification.test.js new file mode 100644 index 0000000000..849a4a2d8a --- /dev/null +++ b/packages/insomnia-cli/src/commands/__tests__/lint-specification.test.js @@ -0,0 +1,20 @@ +// @flow +import { lintSpecification } from '../lint-specification'; + +describe('lint specification', () => { + it('should return true for linting passed', async () => { + const result = await lintSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', { + workingDir: 'src/db/__fixtures__/git-repo', + }); + + expect(result).toBe(true); + }); + + it('should return false for linting failed', async () => { + const result = await lintSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', { + workingDir: 'src/db/__fixtures__/git-repo-malformed-spec', + }); + + expect(result).toBe(false); + }); +}); diff --git a/packages/insomnia-cli/src/commands/__tests__/run-tests.test.js b/packages/insomnia-cli/src/commands/__tests__/run-tests.test.js index 9b95f6dc5a..1568b56193 100644 --- a/packages/insomnia-cli/src/commands/__tests__/run-tests.test.js +++ b/packages/insomnia-cli/src/commands/__tests__/run-tests.test.js @@ -7,7 +7,12 @@ import type { RunTestsOptions } from '../run-tests'; jest.mock('insomnia-testing'); jest.mock('os'); -jest.mock('console'); +jest.mock('fs', () => ({ + promises: { + mkdir: jest.fn(), + unlink: jest.fn(), + }, +})); describe('runInsomniaTests()', () => { // make flow happy @@ -39,9 +44,25 @@ describe('runInsomniaTests()', () => { const contents = 'generated test contents'; mock(insomniaTesting.generate).mockResolvedValue(contents); - const options = { ...base, reporter: 'min', bail: true }; + const options = { ...base, reporter: 'min', bail: true, keepFile: false }; await runInsomniaTests(options); expect(insomniaTesting.runTestsCli).toHaveBeenCalledWith(contents, options); }); + + it('should return false if test results have any failures', async function() { + mock(insomniaTesting.runTestsCli).mockResolvedValue(false); + + const result = await runInsomniaTests(base); + + expect(result).toBe(false); + }); + + it('should return true if test results have no failures', async function() { + mock(insomniaTesting.runTestsCli).mockResolvedValue(true); + + const result = await runInsomniaTests(base); + + expect(result).toBe(true); + }); }); diff --git a/packages/insomnia-cli/src/commands/generate-config.js b/packages/insomnia-cli/src/commands/generate-config.js index 6270bde582..ffbdd83687 100644 --- a/packages/insomnia-cli/src/commands/generate-config.js +++ b/packages/insomnia-cli/src/commands/generate-config.js @@ -11,10 +11,10 @@ export const ConversionTypeMap: { [string]: ConversionResultType } = { declarative: 'kong-declarative-config', }; -export type GenerateConfigOptions = GlobalOptions<{| +export type GenerateConfigOptions = GlobalOptions & { type: $Keys, output?: string, -|}>; +}; function validateOptions({ type }: GenerateConfigOptions): boolean { if (!ConversionTypeMap[type]) { @@ -29,9 +29,9 @@ function validateOptions({ type }: GenerateConfigOptions): boolean { export async function generateConfig( identifier: string, options: GenerateConfigOptions, -): Promise { +): Promise { if (!validateOptions(options)) { - return; + return false; } const { type, output } = options; @@ -44,17 +44,13 @@ export async function generateConfig( // try get from db const specFromDb = db.ApiSpec.get(identifier); - try { - if (specFromDb?.contents) { - result = await o2k.generateFromString(specFromDb.contents, ConversionTypeMap[type]); - } else { - // try load as a file - const fileName = path.join(workingDir, identifier); - result = await o2k.generate(fileName, ConversionTypeMap[type]); - } - } catch (err) { - console.log('Config failed to generate:', err.message); - return; + + if (specFromDb?.contents) { + result = await o2k.generateFromString(specFromDb.contents, ConversionTypeMap[type]); + } else { + // try load as a file + const fileName = path.join(workingDir, identifier); + result = await o2k.generate(fileName, ConversionTypeMap[type]); } const yamlDocs = result.documents.map(d => YAML.stringify(d)); @@ -64,8 +60,10 @@ export async function generateConfig( if (output) { const fullOutputPath = path.join(workingDir, output); - fs.writeFileSync(fullOutputPath, document); + await fs.promises.writeFile(fullOutputPath, document); } else { console.log(document); } + + return true; } diff --git a/packages/insomnia-cli/src/commands/lint-specification.js b/packages/insomnia-cli/src/commands/lint-specification.js new file mode 100644 index 0000000000..38c139dacd --- /dev/null +++ b/packages/insomnia-cli/src/commands/lint-specification.js @@ -0,0 +1,30 @@ +// @flow + +import { Spectral } from '@stoplight/spectral'; +import type { GlobalOptions } from '../util'; +import { gitDataDirDb } from '../db/mem-db'; + +export type LintSpecificationOptions = GlobalOptions; + +export async function lintSpecification( + identifier: string, + options: LintSpecificationOptions, +): Promise { + const { workingDir } = options; + + const db = await gitDataDirDb({ dir: workingDir, filterTypes: ['ApiSpec'] }); + + const specFromDb = db.ApiSpec.get(identifier); + + const spectral = new Spectral(); + const results = await spectral.run(specFromDb?.contents); + + if (results.length) { + results.forEach(r => + console.log(`${r.range.start.line}:${r.range.start.character} - ${r.message}`), + ); + return false; + } + + return true; +} diff --git a/packages/insomnia-cli/src/commands/run-tests.js b/packages/insomnia-cli/src/commands/run-tests.js index 8c1cb43be2..9b70604d60 100644 --- a/packages/insomnia-cli/src/commands/run-tests.js +++ b/packages/insomnia-cli/src/commands/run-tests.js @@ -11,10 +11,11 @@ export const TestReporterEnum = { progress: 'progress', }; -export type RunTestsOptions = GlobalOptions<{| +export type RunTestsOptions = GlobalOptions & { reporter: $Keys, bail?: boolean, -|}>; + keepFile?: boolean, +}; function validateOptions({ reporter }: RunTestsOptions): boolean { if (reporter && !TestReporterEnum[reporter]) { @@ -31,7 +32,7 @@ export async function runInsomniaTests(options: RunTestsOptions): Promise return; } - const { reporter, bail } = options; + const { reporter, bail, keepFile } = options; const suites = [ { @@ -55,5 +56,5 @@ export async function runInsomniaTests(options: RunTestsOptions): Promise ]; const testFileContents = await generate(suites); - await runTestsCli(testFileContents, { reporter, bail }); + return await runTestsCli(testFileContents, { reporter, bail, keepFile }); } diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml new file mode 100755 index 0000000000..200c4818bb --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml @@ -0,0 +1,32 @@ +_id: spc_46c5a4a40e83445a9bd9d9758b86c16c +contentType: yaml +contents: | + openapi: '3.0.2' + info: + title: Global Security + version: '1.2' + servers: + - url: https://api.server.test/v1 + tags: + - name: Folder + + paths: + /global: + get: + tags: + - Folder + responses: + '200': + description: OK + /override: + get: + security: + - Key-Query: [] + responses: + '200': + description: OK +created: 1589851906273 +fileName: Global Security +modified: 1592254074772 +parentId: wrk_012d4860c7da418a85ffea7406e1292a +type: ApiSpec diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml new file mode 100755 index 0000000000..8eced02ede --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml @@ -0,0 +1,14 @@ +_id: env_ca046a738f001eb3090261a537b1b78f86c2094c +color: null +created: 1589851906358 +data: + base_url: "{{ scheme }}://{{ host }}{{ base_path }}" +dataPropertyOrder: + "&": + - base_url +isPrivate: false +metaSortKey: 1589851906358 +modified: 1592254074769 +name: Base environment +parentId: wrk_012d4860c7da418a85ffea7406e1292a +type: Environment diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml new file mode 100755 index 0000000000..354252fb22 --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml @@ -0,0 +1,14 @@ +_id: env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub +color: null +created: 1592252904087 +data: + base_path: /v1 + host: api.server.test + scheme: https +dataPropertyOrder: null +isPrivate: false +metaSortKey: 1592252904087 +modified: 1592254074767 +name: OpenAPI env +parentId: env_ca046a738f001eb3090261a537b1b78f86c2094c +type: Environment diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml new file mode 100755 index 0000000000..b5e8dd00ea --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml @@ -0,0 +1,21 @@ +_id: req_wrk_012d4860c7da418a85ffea7406e1292a21946b60 +authentication: {} +body: {} +created: 1592254074764 +description: "" +headers: [] +isPrivate: false +metaSortKey: -1592254074764 +method: GET +modified: 1592254074764 +name: /global +parameters: [] +parentId: fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249 +settingDisableRenderRequestBody: false +settingEncodeUrl: true +settingFollowRedirects: global +settingRebuildPath: true +settingSendCookies: true +settingStoreCookies: true +type: Request +url: "{{ base_url }}/global" diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml new file mode 100755 index 0000000000..f36b742a8a --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml @@ -0,0 +1,21 @@ +_id: req_wrk_012d4860c7da418a85ffea7406e1292ab410454b +authentication: {} +body: {} +created: 1592254074762 +description: "" +headers: [] +isPrivate: false +metaSortKey: -1592254074762 +method: GET +modified: 1592254074762 +name: /override +parameters: [] +parentId: wrk_012d4860c7da418a85ffea7406e1292a +settingDisableRenderRequestBody: false +settingEncodeUrl: true +settingFollowRedirects: global +settingRebuildPath: true +settingSendCookies: true +settingStoreCookies: true +type: Request +url: "{{ base_url }}/override" diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml new file mode 100755 index 0000000000..672cb2da92 --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml @@ -0,0 +1,10 @@ +_id: fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249 +created: 1592254074765 +description: "" +environment: {} +environmentPropertyOrder: null +metaSortKey: -1592254074765 +modified: 1592254074765 +name: Folder +parentId: wrk_012d4860c7da418a85ffea7406e1292a +type: RequestGroup diff --git a/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml new file mode 100755 index 0000000000..b54ee1cd5f --- /dev/null +++ b/packages/insomnia-cli/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml @@ -0,0 +1,8 @@ +_id: wrk_012d4860c7da418a85ffea7406e1292a +created: 1589851906270 +description: "" +modified: 1592254074771 +name: Global Security 1.2 +parentId: null +scope: spec +type: Workspace diff --git a/packages/insomnia-cli/src/util.js b/packages/insomnia-cli/src/util.js index 37b63bc012..443e02125c 100644 --- a/packages/insomnia-cli/src/util.js +++ b/packages/insomnia-cli/src/util.js @@ -2,14 +2,14 @@ import commander from 'commander'; import * as packageJson from '../package.json'; -export type GlobalOptions = {| +export type GlobalOptions = { workingDir?: string, - ...T, -|}; +}; export function createCommand(exitOverride: boolean, cmd?: string) { const command = new commander.Command(cmd).storeOptionsAsProperties(false); + // TODO: can probably remove this if (exitOverride) { return command.exitOverride(); } @@ -33,3 +33,13 @@ export function getAllOptions(cmd: Object): T { return opts; } + +export function logErrorExit1(err: Error) { + console.error(err); + + process.exit(1); +} + +export async function exit(result: Promise): Promise { + return result.then(r => process.exit(r ? 0 : 1)).catch(logErrorExit1); +} diff --git a/packages/insomnia-testing/index.js b/packages/insomnia-testing/index.js index 78654a9b2b..78b664f145 100644 --- a/packages/insomnia-testing/index.js +++ b/packages/insomnia-testing/index.js @@ -1,3 +1,3 @@ // @flow -export { generate } from './src/generate'; +export { generate, generateToFile } from './src/generate'; export { runTests, runTestsCli } from './src/run';