From 3dae9b617efaa3cc872f1e01084a82d60d7d2a4f Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Sat, 20 Feb 2021 16:49:34 +0300 Subject: [PATCH 01/20] refactor: init full refactoring --- .babelrc | 11 + .eslintrc | 2 +- .gitignore | 2 +- .vscode/settings.json | 3 + dist/cli/index.js | 48 + dist/index.js | 49 + .../api/multi-file-ref-url-v2-yaml/index.js | 2 +- examples/api/multi-file-v2-yaml/index.js | 2 +- examples/api/simple-v2-json/index.js | 2 +- examples/api/simple-v2-yaml/index.js | 2 +- examples/api/simple-v3-json/index.js | 2 +- examples/api/use-templates/index.js | 5 +- jsconfig.json | 6 - .../cli/fixtures/apply-preset-from-file.js | 0 .../cli/fixtures/apply-preset-from-package.js | 0 .../change-code-and-types-file-name.js | 0 .../cli/fixtures/change-code-file-name.js | 0 .../cli/fixtures/change-types-file-name.js | 0 ...disable-request-importing-or-generating.js | 0 .../cli/fixtures/disable-types-generating.js | 0 {src => lib}/cli/fixtures/load-config.js | 0 .../fixtures/pass-change-case-to-templates.js | 0 .../pass-request-swagger-data-to-templates.js | 0 .../pass-swagger-data-to-templates.js | 0 .../cli/fixtures/works-with-v2-json.js | 0 .../cli/fixtures/works-with-v2-yaml.js | 0 .../cli/fixtures/works-with-v3-json.js | 0 .../cli/fixtures/works-with-v3-yaml.js | 0 {src => lib}/cli/index.js | 0 {src => lib}/cli/index.snap.js | 0 {src => lib}/cli/index.test.js | 0 {src => lib}/common/build-base.js | 0 {src => lib}/common/build-object-by-mode.js | 0 {src => lib}/common/build-object-by-refs.js | 0 {src => lib}/common/build-path-name.js | 0 {src => lib}/common/build-paths.js | 4 +- {src => lib}/common/get-mode.js | 0 {src => lib}/common/is-path-exception.js | 0 {src => lib}/common/load-api-json.js | 0 {src => lib}/common/path-default-params.js | 0 {src => lib}/common/path-parameters-by-in.js | 0 {src => lib}/common/templates/request-code.js | 0 .../common/templates/request-types.js | 0 {src => lib}/common/templates/swagger-type.js | 0 {src => lib}/common/templates/types-before.js | 0 {src => lib}/index.d.ts | 0 {src => lib}/index.js | 0 {src => lib}/lib/async-for-each.js | 0 {src => lib}/lib/async-map.js | 0 {src => lib}/lib/async-rebuild-object.js | 0 {src => lib}/lib/async-reduce.js | 0 {src => lib}/lib/capitalize.js | 0 {src => lib}/lib/content-to-json.js | 0 {src => lib}/lib/get-ref.js | 0 {src => lib}/lib/is-object.js | 0 {src => lib}/lib/join-strings.js | 0 {src => lib}/lib/json-to-xml.js | 0 {src => lib}/lib/presets/index.js | 0 .../lib/presets/mocks/demo-preset/another.js | 0 .../lib/presets/mocks/demo-preset/index.js | 0 .../presets/mocks/demo-preset/package.json | 0 .../lib/presets/mocks/demo2-preset/index.js | 0 .../lib/presets/mocks/demo2-preset/local.js | 0 .../presets/mocks/demo2-preset/package.json | 0 .../lib/presets/mocks/demo3-preset/index.js | 0 .../presets/mocks/demo3-preset/package.json | 0 .../lib/presets/mocks/demo3-preset/unused.js | 0 .../lib/presets/mocks/demo3-preset/yarn.lock | 0 .../lib/presets/mocks/preset-nested.js | 0 .../presets/mocks/preset-options-nested.js | 0 .../lib/presets/mocks/preset-options.js | 0 .../lib/presets/mocks/preset-second.js | 0 .../lib/presets/mocks/preset-simple.js | 0 {src => lib}/lib/presets/presets.test.js | 0 {src => lib}/lib/print-object.js | 0 {src => lib}/lib/rebuild-object.js | 0 {src => lib}/lib/request.js | 0 {src => lib}/lib/xml-to-json.js | 0 .../mocks/petstore-v2-multi-file.yaml | 0 .../petstore-v2-multi-file/definitions.yaml | 0 .../mocks/petstore-v2-multi-file/paths.yaml | 0 {src => lib}/mocks/petstore-v2-ref-url.yaml | 0 {src => lib}/mocks/petstore-v2.json | 0 {src => lib}/mocks/petstore-v2.yaml | 0 {src => lib}/mocks/petstore-v3-short.json | 0 {src => lib}/mocks/petstore-v3.json | 0 {src => lib}/mocks/petstore-v3.yaml | 0 {src => lib}/package.test.js | 0 {src => lib}/v2/extended.test.js | 0 {src => lib}/v2/fixtures/ignore-deprecated.js | 0 .../v2/fixtures/ignore-description.js | 0 .../v2/fixtures/import-request-on-disabled.js | 0 .../v2/fixtures/import-request-on-false.js | 0 .../v2/fixtures/import-request-on-true.js | 0 .../v2/fixtures/insert-original-body.js | 0 .../fixtures/throw-exception-on-deprecated.js | 0 .../v2/fixtures/work-with-api-in-config.js | 0 .../v2/fixtures/work-without-config.js | 0 {src => lib}/v2/fixtures/works-with-preset.js | 0 {src => lib}/v2/index.js | 0 {src => lib}/v2/index.snap.js | 0 {src => lib}/v2/index.test.js | 0 {src => lib}/v2/mocks/example-preset.js | 0 {src => lib}/v3/extended.snap.js | 0 {src => lib}/v3/extended.test.js | 0 {src => lib}/v3/fixtures/add-original-body.js | 0 {src => lib}/v3/fixtures/ignore-deprecated.js | 0 .../v3/fixtures/ignore-description.js | 0 .../v3/fixtures/import-request-on-disabled.js | 0 .../v3/fixtures/import-request-on-false.js | 0 .../v3/fixtures/import-request-on-true.js | 0 .../fixtures/throw-exception-on-deprecated.js | 0 {src => lib}/v3/fixtures/works-with-preset.js | 0 .../v3/fixtures/works-without-config.js | 0 {src => lib}/v3/index.js | 0 {src => lib}/v3/index.snap.js | 0 {src => lib}/v3/index.test.js | 0 {src => lib}/v3/mocks/api.github.com.json | 0 {src => lib}/v3/mocks/example-preset.js | 0 package.json | 22 +- src/cli/index.ts | 50 + src/index.ts | 37 + tsconfig.json | 22 + yarn.lock | 1453 ++++++++++++++++- 124 files changed, 1676 insertions(+), 48 deletions(-) create mode 100644 .babelrc create mode 100644 .vscode/settings.json create mode 100644 dist/cli/index.js create mode 100644 dist/index.js delete mode 100644 jsconfig.json rename {src => lib}/cli/fixtures/apply-preset-from-file.js (100%) rename {src => lib}/cli/fixtures/apply-preset-from-package.js (100%) rename {src => lib}/cli/fixtures/change-code-and-types-file-name.js (100%) rename {src => lib}/cli/fixtures/change-code-file-name.js (100%) rename {src => lib}/cli/fixtures/change-types-file-name.js (100%) rename {src => lib}/cli/fixtures/disable-request-importing-or-generating.js (100%) rename {src => lib}/cli/fixtures/disable-types-generating.js (100%) rename {src => lib}/cli/fixtures/load-config.js (100%) rename {src => lib}/cli/fixtures/pass-change-case-to-templates.js (100%) rename {src => lib}/cli/fixtures/pass-request-swagger-data-to-templates.js (100%) rename {src => lib}/cli/fixtures/pass-swagger-data-to-templates.js (100%) rename {src => lib}/cli/fixtures/works-with-v2-json.js (100%) rename {src => lib}/cli/fixtures/works-with-v2-yaml.js (100%) rename {src => lib}/cli/fixtures/works-with-v3-json.js (100%) rename {src => lib}/cli/fixtures/works-with-v3-yaml.js (100%) rename {src => lib}/cli/index.js (100%) rename {src => lib}/cli/index.snap.js (100%) rename {src => lib}/cli/index.test.js (100%) rename {src => lib}/common/build-base.js (100%) rename {src => lib}/common/build-object-by-mode.js (100%) rename {src => lib}/common/build-object-by-refs.js (100%) rename {src => lib}/common/build-path-name.js (100%) rename {src => lib}/common/build-paths.js (92%) rename {src => lib}/common/get-mode.js (100%) rename {src => lib}/common/is-path-exception.js (100%) rename {src => lib}/common/load-api-json.js (100%) rename {src => lib}/common/path-default-params.js (100%) rename {src => lib}/common/path-parameters-by-in.js (100%) rename {src => lib}/common/templates/request-code.js (100%) rename {src => lib}/common/templates/request-types.js (100%) rename {src => lib}/common/templates/swagger-type.js (100%) rename {src => lib}/common/templates/types-before.js (100%) rename {src => lib}/index.d.ts (100%) rename {src => lib}/index.js (100%) rename {src => lib}/lib/async-for-each.js (100%) rename {src => lib}/lib/async-map.js (100%) rename {src => lib}/lib/async-rebuild-object.js (100%) rename {src => lib}/lib/async-reduce.js (100%) rename {src => lib}/lib/capitalize.js (100%) rename {src => lib}/lib/content-to-json.js (100%) rename {src => lib}/lib/get-ref.js (100%) rename {src => lib}/lib/is-object.js (100%) rename {src => lib}/lib/join-strings.js (100%) rename {src => lib}/lib/json-to-xml.js (100%) rename {src => lib}/lib/presets/index.js (100%) rename {src => lib}/lib/presets/mocks/demo-preset/another.js (100%) rename {src => lib}/lib/presets/mocks/demo-preset/index.js (100%) rename {src => lib}/lib/presets/mocks/demo-preset/package.json (100%) rename {src => lib}/lib/presets/mocks/demo2-preset/index.js (100%) rename {src => lib}/lib/presets/mocks/demo2-preset/local.js (100%) rename {src => lib}/lib/presets/mocks/demo2-preset/package.json (100%) rename {src => lib}/lib/presets/mocks/demo3-preset/index.js (100%) rename {src => lib}/lib/presets/mocks/demo3-preset/package.json (100%) rename {src => lib}/lib/presets/mocks/demo3-preset/unused.js (100%) rename {src => lib}/lib/presets/mocks/demo3-preset/yarn.lock (100%) rename {src => lib}/lib/presets/mocks/preset-nested.js (100%) rename {src => lib}/lib/presets/mocks/preset-options-nested.js (100%) rename {src => lib}/lib/presets/mocks/preset-options.js (100%) rename {src => lib}/lib/presets/mocks/preset-second.js (100%) rename {src => lib}/lib/presets/mocks/preset-simple.js (100%) rename {src => lib}/lib/presets/presets.test.js (100%) rename {src => lib}/lib/print-object.js (100%) rename {src => lib}/lib/rebuild-object.js (100%) rename {src => lib}/lib/request.js (100%) rename {src => lib}/lib/xml-to-json.js (100%) rename {src => lib}/mocks/petstore-v2-multi-file.yaml (100%) rename {src => lib}/mocks/petstore-v2-multi-file/definitions.yaml (100%) rename {src => lib}/mocks/petstore-v2-multi-file/paths.yaml (100%) rename {src => lib}/mocks/petstore-v2-ref-url.yaml (100%) rename {src => lib}/mocks/petstore-v2.json (100%) rename {src => lib}/mocks/petstore-v2.yaml (100%) rename {src => lib}/mocks/petstore-v3-short.json (100%) rename {src => lib}/mocks/petstore-v3.json (100%) rename {src => lib}/mocks/petstore-v3.yaml (100%) rename {src => lib}/package.test.js (100%) rename {src => lib}/v2/extended.test.js (100%) rename {src => lib}/v2/fixtures/ignore-deprecated.js (100%) rename {src => lib}/v2/fixtures/ignore-description.js (100%) rename {src => lib}/v2/fixtures/import-request-on-disabled.js (100%) rename {src => lib}/v2/fixtures/import-request-on-false.js (100%) rename {src => lib}/v2/fixtures/import-request-on-true.js (100%) rename {src => lib}/v2/fixtures/insert-original-body.js (100%) rename {src => lib}/v2/fixtures/throw-exception-on-deprecated.js (100%) rename {src => lib}/v2/fixtures/work-with-api-in-config.js (100%) rename {src => lib}/v2/fixtures/work-without-config.js (100%) rename {src => lib}/v2/fixtures/works-with-preset.js (100%) rename {src => lib}/v2/index.js (100%) rename {src => lib}/v2/index.snap.js (100%) rename {src => lib}/v2/index.test.js (100%) rename {src => lib}/v2/mocks/example-preset.js (100%) rename {src => lib}/v3/extended.snap.js (100%) rename {src => lib}/v3/extended.test.js (100%) rename {src => lib}/v3/fixtures/add-original-body.js (100%) rename {src => lib}/v3/fixtures/ignore-deprecated.js (100%) rename {src => lib}/v3/fixtures/ignore-description.js (100%) rename {src => lib}/v3/fixtures/import-request-on-disabled.js (100%) rename {src => lib}/v3/fixtures/import-request-on-false.js (100%) rename {src => lib}/v3/fixtures/import-request-on-true.js (100%) rename {src => lib}/v3/fixtures/throw-exception-on-deprecated.js (100%) rename {src => lib}/v3/fixtures/works-with-preset.js (100%) rename {src => lib}/v3/fixtures/works-without-config.js (100%) rename {src => lib}/v3/index.js (100%) rename {src => lib}/v3/index.snap.js (100%) rename {src => lib}/v3/index.test.js (100%) rename {src => lib}/v3/mocks/api.github.com.json (100%) rename {src => lib}/v3/mocks/example-preset.js (100%) create mode 100644 src/cli/index.ts create mode 100644 src/index.ts create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..56e07d3 --- /dev/null +++ b/.babelrc @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { "node": "14" } + } + ], + "@babel/preset-typescript" + ] +} diff --git a/.eslintrc b/.eslintrc index 9935b8c..1be3bfe 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,7 +2,7 @@ "parser": "babel-eslint", "rules": { "no-unused-vars": [ - "error", + "warn", { "vars": "all", "args": "after-used", diff --git a/.gitignore b/.gitignore index e5903cd..e066bf9 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,4 @@ api-multi-file ttt.js */**/code.js */**/code.d.ts -examples/**/api \ No newline at end of file +examples/**/apidist diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3662b37 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/dist/cli/index.js b/dist/cli/index.js new file mode 100644 index 0000000..19b6dd7 --- /dev/null +++ b/dist/cli/index.js @@ -0,0 +1,48 @@ +"use strict"; + +var _commander = require("commander"); + +var _cosmiconfig = require("cosmiconfig"); + +var _ = require(".."); + +var _package = _interopRequireDefault(require("../../package.json")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_commander.program.version(_package.default.version) // Cli Options +.option("--output-dir ", "Where to save compiled files").option("--config ", "Path to a config").option("--file ", "Path to Swagger/OpenAPI file (JSON, YAML, or URL").option("--authorization ", "An auth token for getting OpenAPI file from URL (used as header)").option("--presets ", "List of presets to generate files from"); + +async function main() { + _commander.program.parse(process.argv); + + const cosmic = (0, _cosmiconfig.cosmiconfigSync)(_package.default.name); + const resolved = _commander.program.config ? cosmic.load(_commander.program.config) : cosmic.search() || { + config: {} + }; + const loaded = resolved?.config || {}; + const config = { + outputDir: _commander.program.outputDir || loaded.outputDir || "./api", + file: _commander.program.file || loaded.file, + authorization: _commander.program.authorization || loaded.authorization, + presets: _commander.program.presets || loaded.presets || [] + }; + + if (!config.file) { + throw new Error("Please, provide path to a file with Swagger/OpenAPI spec"); + } + + if (config.presets.length === 0) { + console.warn("[openapi] No presets were specified. Nothing to generate."); + } + + const timeLog = `✨ ${_package.default.name}`; + console.time(timeLog); + await (0, _.openapi)(config); + console.timeEnd(timeLog); +} + +main().catch(error => { + console.error(error); + process.exit(1); +}); \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..104cde7 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,49 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.openapi = openapi; + +var fs = _interopRequireWildcard(require("fs")); + +var _promises = require("fs/promises"); + +var path = _interopRequireWildcard(require("path")); + +var _ono = require("@jsdevtools/ono"); + +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +async function openapi(config) { + const content = await readFile(config.file); + assertDirectory(config.outputDir); +} + +async function readFile(file) { + let handle = null; + + try { + handle = await (0, _promises.open)(file, "r"); + return await handle?.readFile({ + encoding: "utf8", + flag: "r" + }); + } catch (error) { + throw (0, _ono.ono)(error, `Cannot read file ${file}`); + } finally { + await handle?.close(); + } +} + +function assertDirectory(dir) { + const outputDirPath = path.resolve(process.cwd(), dir); + + if (!fs.existsSync(outputDirPath)) { + fs.mkdirSync(outputDirPath, { + recursive: true + }); + } +} \ No newline at end of file diff --git a/examples/api/multi-file-ref-url-v2-yaml/index.js b/examples/api/multi-file-ref-url-v2-yaml/index.js index 84a4671..68dc22e 100644 --- a/examples/api/multi-file-ref-url-v2-yaml/index.js +++ b/examples/api/multi-file-ref-url-v2-yaml/index.js @@ -1,7 +1,7 @@ const fs = require("fs"); const path = require("path"); -const { openapiGenerate: swaggerToJs } = require("../../../src"); +const { openapiGenerate: swaggerToJs } = require("../../../lib"); swaggerToJs({ file: "./src/mocks/petstore-v2-ref-url.yaml", diff --git a/examples/api/multi-file-v2-yaml/index.js b/examples/api/multi-file-v2-yaml/index.js index 10ffd4e..b141398 100644 --- a/examples/api/multi-file-v2-yaml/index.js +++ b/examples/api/multi-file-v2-yaml/index.js @@ -1,7 +1,7 @@ const fs = require("fs"); const path = require("path"); -const { openapiGenerate: swaggerToJs } = require("../../../src"); +const { openapiGenerate: swaggerToJs } = require("../../../lib"); swaggerToJs({ file: "./src/mocks/petstore-v2-multi-file.yaml", diff --git a/examples/api/simple-v2-json/index.js b/examples/api/simple-v2-json/index.js index d7420fc..9e27401 100644 --- a/examples/api/simple-v2-json/index.js +++ b/examples/api/simple-v2-json/index.js @@ -1,7 +1,7 @@ const fs = require("fs"); const path = require("path"); -const { openapiGenerate: swaggerToJs } = require("../../../src"); +const { openapiGenerate: swaggerToJs } = require("../../../lib"); swaggerToJs({ file: "./src/mocks/petstore-v2.json", diff --git a/examples/api/simple-v2-yaml/index.js b/examples/api/simple-v2-yaml/index.js index 38a4bcf..862521f 100644 --- a/examples/api/simple-v2-yaml/index.js +++ b/examples/api/simple-v2-yaml/index.js @@ -1,7 +1,7 @@ const fs = require("fs"); const path = require("path"); -const { openapiGenerate: swaggerToJs } = require("../../../src"); +const { openapiGenerate: swaggerToJs } = require("../../../lib"); swaggerToJs({ file: "./src/mocks/petstore-v2.yaml", diff --git a/examples/api/simple-v3-json/index.js b/examples/api/simple-v3-json/index.js index bcb28c8..17bb936 100644 --- a/examples/api/simple-v3-json/index.js +++ b/examples/api/simple-v3-json/index.js @@ -1,7 +1,7 @@ const fs = require("fs"); const path = require("path"); -const { openapiGenerate: swaggerToJs } = require("../../../src"); +const { openapiGenerate: swaggerToJs } = require("../../../lib"); swaggerToJs({ file: "./src/mocks/petstore-v3.json", diff --git a/examples/api/use-templates/index.js b/examples/api/use-templates/index.js index ffb0db3..7d7ff25 100644 --- a/examples/api/use-templates/index.js +++ b/examples/api/use-templates/index.js @@ -1,14 +1,13 @@ const fs = require("fs"); const path = require("path"); -const { openapiGenerate: swaggerToJs } = require("../../../src"); +const { openapiGenerate: swaggerToJs } = require("../../../lib"); swaggerToJs({ file: "./src/mocks/petstore-v3.json", templateCodeBefore: () => `import * as ef from "effector";\n\n`, - templateRequestCode: ({ name }) => - `export function ${name}() {\n return ef.createEffect();\n};`, + templateRequestCode: ({ name }) => `export function ${name}() {\n return ef.createEffect();\n};`, templateTypesBefore: () => `import * as ef from "effector";\n\n`, templateRequestTypes: ({ name, index }) => diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index b416fc1..0000000 --- a/jsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "lib": ["esnext"], - "types": ["jest", "node"] - } -} diff --git a/src/cli/fixtures/apply-preset-from-file.js b/lib/cli/fixtures/apply-preset-from-file.js similarity index 100% rename from src/cli/fixtures/apply-preset-from-file.js rename to lib/cli/fixtures/apply-preset-from-file.js diff --git a/src/cli/fixtures/apply-preset-from-package.js b/lib/cli/fixtures/apply-preset-from-package.js similarity index 100% rename from src/cli/fixtures/apply-preset-from-package.js rename to lib/cli/fixtures/apply-preset-from-package.js diff --git a/src/cli/fixtures/change-code-and-types-file-name.js b/lib/cli/fixtures/change-code-and-types-file-name.js similarity index 100% rename from src/cli/fixtures/change-code-and-types-file-name.js rename to lib/cli/fixtures/change-code-and-types-file-name.js diff --git a/src/cli/fixtures/change-code-file-name.js b/lib/cli/fixtures/change-code-file-name.js similarity index 100% rename from src/cli/fixtures/change-code-file-name.js rename to lib/cli/fixtures/change-code-file-name.js diff --git a/src/cli/fixtures/change-types-file-name.js b/lib/cli/fixtures/change-types-file-name.js similarity index 100% rename from src/cli/fixtures/change-types-file-name.js rename to lib/cli/fixtures/change-types-file-name.js diff --git a/src/cli/fixtures/disable-request-importing-or-generating.js b/lib/cli/fixtures/disable-request-importing-or-generating.js similarity index 100% rename from src/cli/fixtures/disable-request-importing-or-generating.js rename to lib/cli/fixtures/disable-request-importing-or-generating.js diff --git a/src/cli/fixtures/disable-types-generating.js b/lib/cli/fixtures/disable-types-generating.js similarity index 100% rename from src/cli/fixtures/disable-types-generating.js rename to lib/cli/fixtures/disable-types-generating.js diff --git a/src/cli/fixtures/load-config.js b/lib/cli/fixtures/load-config.js similarity index 100% rename from src/cli/fixtures/load-config.js rename to lib/cli/fixtures/load-config.js diff --git a/src/cli/fixtures/pass-change-case-to-templates.js b/lib/cli/fixtures/pass-change-case-to-templates.js similarity index 100% rename from src/cli/fixtures/pass-change-case-to-templates.js rename to lib/cli/fixtures/pass-change-case-to-templates.js diff --git a/src/cli/fixtures/pass-request-swagger-data-to-templates.js b/lib/cli/fixtures/pass-request-swagger-data-to-templates.js similarity index 100% rename from src/cli/fixtures/pass-request-swagger-data-to-templates.js rename to lib/cli/fixtures/pass-request-swagger-data-to-templates.js diff --git a/src/cli/fixtures/pass-swagger-data-to-templates.js b/lib/cli/fixtures/pass-swagger-data-to-templates.js similarity index 100% rename from src/cli/fixtures/pass-swagger-data-to-templates.js rename to lib/cli/fixtures/pass-swagger-data-to-templates.js diff --git a/src/cli/fixtures/works-with-v2-json.js b/lib/cli/fixtures/works-with-v2-json.js similarity index 100% rename from src/cli/fixtures/works-with-v2-json.js rename to lib/cli/fixtures/works-with-v2-json.js diff --git a/src/cli/fixtures/works-with-v2-yaml.js b/lib/cli/fixtures/works-with-v2-yaml.js similarity index 100% rename from src/cli/fixtures/works-with-v2-yaml.js rename to lib/cli/fixtures/works-with-v2-yaml.js diff --git a/src/cli/fixtures/works-with-v3-json.js b/lib/cli/fixtures/works-with-v3-json.js similarity index 100% rename from src/cli/fixtures/works-with-v3-json.js rename to lib/cli/fixtures/works-with-v3-json.js diff --git a/src/cli/fixtures/works-with-v3-yaml.js b/lib/cli/fixtures/works-with-v3-yaml.js similarity index 100% rename from src/cli/fixtures/works-with-v3-yaml.js rename to lib/cli/fixtures/works-with-v3-yaml.js diff --git a/src/cli/index.js b/lib/cli/index.js similarity index 100% rename from src/cli/index.js rename to lib/cli/index.js diff --git a/src/cli/index.snap.js b/lib/cli/index.snap.js similarity index 100% rename from src/cli/index.snap.js rename to lib/cli/index.snap.js diff --git a/src/cli/index.test.js b/lib/cli/index.test.js similarity index 100% rename from src/cli/index.test.js rename to lib/cli/index.test.js diff --git a/src/common/build-base.js b/lib/common/build-base.js similarity index 100% rename from src/common/build-base.js rename to lib/common/build-base.js diff --git a/src/common/build-object-by-mode.js b/lib/common/build-object-by-mode.js similarity index 100% rename from src/common/build-object-by-mode.js rename to lib/common/build-object-by-mode.js diff --git a/src/common/build-object-by-refs.js b/lib/common/build-object-by-refs.js similarity index 100% rename from src/common/build-object-by-refs.js rename to lib/common/build-object-by-refs.js diff --git a/src/common/build-path-name.js b/lib/common/build-path-name.js similarity index 100% rename from src/common/build-path-name.js rename to lib/common/build-path-name.js diff --git a/src/common/build-paths.js b/lib/common/build-paths.js similarity index 92% rename from src/common/build-paths.js rename to lib/common/build-paths.js index 3420571..66187f2 100644 --- a/src/common/build-paths.js +++ b/lib/common/build-paths.js @@ -1,5 +1,5 @@ -const { isPathException } = require("../common/is-path-exception"); -const { buildPathName } = require("../common/build-path-name"); +const { isPathException } = require("./is-path-exception"); +const { buildPathName } = require("./build-path-name"); const changeCase = require("change-case"); function buildPaths(buildOptions) { diff --git a/src/common/get-mode.js b/lib/common/get-mode.js similarity index 100% rename from src/common/get-mode.js rename to lib/common/get-mode.js diff --git a/src/common/is-path-exception.js b/lib/common/is-path-exception.js similarity index 100% rename from src/common/is-path-exception.js rename to lib/common/is-path-exception.js diff --git a/src/common/load-api-json.js b/lib/common/load-api-json.js similarity index 100% rename from src/common/load-api-json.js rename to lib/common/load-api-json.js diff --git a/src/common/path-default-params.js b/lib/common/path-default-params.js similarity index 100% rename from src/common/path-default-params.js rename to lib/common/path-default-params.js diff --git a/src/common/path-parameters-by-in.js b/lib/common/path-parameters-by-in.js similarity index 100% rename from src/common/path-parameters-by-in.js rename to lib/common/path-parameters-by-in.js diff --git a/src/common/templates/request-code.js b/lib/common/templates/request-code.js similarity index 100% rename from src/common/templates/request-code.js rename to lib/common/templates/request-code.js diff --git a/src/common/templates/request-types.js b/lib/common/templates/request-types.js similarity index 100% rename from src/common/templates/request-types.js rename to lib/common/templates/request-types.js diff --git a/src/common/templates/swagger-type.js b/lib/common/templates/swagger-type.js similarity index 100% rename from src/common/templates/swagger-type.js rename to lib/common/templates/swagger-type.js diff --git a/src/common/templates/types-before.js b/lib/common/templates/types-before.js similarity index 100% rename from src/common/templates/types-before.js rename to lib/common/templates/types-before.js diff --git a/src/index.d.ts b/lib/index.d.ts similarity index 100% rename from src/index.d.ts rename to lib/index.d.ts diff --git a/src/index.js b/lib/index.js similarity index 100% rename from src/index.js rename to lib/index.js diff --git a/src/lib/async-for-each.js b/lib/lib/async-for-each.js similarity index 100% rename from src/lib/async-for-each.js rename to lib/lib/async-for-each.js diff --git a/src/lib/async-map.js b/lib/lib/async-map.js similarity index 100% rename from src/lib/async-map.js rename to lib/lib/async-map.js diff --git a/src/lib/async-rebuild-object.js b/lib/lib/async-rebuild-object.js similarity index 100% rename from src/lib/async-rebuild-object.js rename to lib/lib/async-rebuild-object.js diff --git a/src/lib/async-reduce.js b/lib/lib/async-reduce.js similarity index 100% rename from src/lib/async-reduce.js rename to lib/lib/async-reduce.js diff --git a/src/lib/capitalize.js b/lib/lib/capitalize.js similarity index 100% rename from src/lib/capitalize.js rename to lib/lib/capitalize.js diff --git a/src/lib/content-to-json.js b/lib/lib/content-to-json.js similarity index 100% rename from src/lib/content-to-json.js rename to lib/lib/content-to-json.js diff --git a/src/lib/get-ref.js b/lib/lib/get-ref.js similarity index 100% rename from src/lib/get-ref.js rename to lib/lib/get-ref.js diff --git a/src/lib/is-object.js b/lib/lib/is-object.js similarity index 100% rename from src/lib/is-object.js rename to lib/lib/is-object.js diff --git a/src/lib/join-strings.js b/lib/lib/join-strings.js similarity index 100% rename from src/lib/join-strings.js rename to lib/lib/join-strings.js diff --git a/src/lib/json-to-xml.js b/lib/lib/json-to-xml.js similarity index 100% rename from src/lib/json-to-xml.js rename to lib/lib/json-to-xml.js diff --git a/src/lib/presets/index.js b/lib/lib/presets/index.js similarity index 100% rename from src/lib/presets/index.js rename to lib/lib/presets/index.js diff --git a/src/lib/presets/mocks/demo-preset/another.js b/lib/lib/presets/mocks/demo-preset/another.js similarity index 100% rename from src/lib/presets/mocks/demo-preset/another.js rename to lib/lib/presets/mocks/demo-preset/another.js diff --git a/src/lib/presets/mocks/demo-preset/index.js b/lib/lib/presets/mocks/demo-preset/index.js similarity index 100% rename from src/lib/presets/mocks/demo-preset/index.js rename to lib/lib/presets/mocks/demo-preset/index.js diff --git a/src/lib/presets/mocks/demo-preset/package.json b/lib/lib/presets/mocks/demo-preset/package.json similarity index 100% rename from src/lib/presets/mocks/demo-preset/package.json rename to lib/lib/presets/mocks/demo-preset/package.json diff --git a/src/lib/presets/mocks/demo2-preset/index.js b/lib/lib/presets/mocks/demo2-preset/index.js similarity index 100% rename from src/lib/presets/mocks/demo2-preset/index.js rename to lib/lib/presets/mocks/demo2-preset/index.js diff --git a/src/lib/presets/mocks/demo2-preset/local.js b/lib/lib/presets/mocks/demo2-preset/local.js similarity index 100% rename from src/lib/presets/mocks/demo2-preset/local.js rename to lib/lib/presets/mocks/demo2-preset/local.js diff --git a/src/lib/presets/mocks/demo2-preset/package.json b/lib/lib/presets/mocks/demo2-preset/package.json similarity index 100% rename from src/lib/presets/mocks/demo2-preset/package.json rename to lib/lib/presets/mocks/demo2-preset/package.json diff --git a/src/lib/presets/mocks/demo3-preset/index.js b/lib/lib/presets/mocks/demo3-preset/index.js similarity index 100% rename from src/lib/presets/mocks/demo3-preset/index.js rename to lib/lib/presets/mocks/demo3-preset/index.js diff --git a/src/lib/presets/mocks/demo3-preset/package.json b/lib/lib/presets/mocks/demo3-preset/package.json similarity index 100% rename from src/lib/presets/mocks/demo3-preset/package.json rename to lib/lib/presets/mocks/demo3-preset/package.json diff --git a/src/lib/presets/mocks/demo3-preset/unused.js b/lib/lib/presets/mocks/demo3-preset/unused.js similarity index 100% rename from src/lib/presets/mocks/demo3-preset/unused.js rename to lib/lib/presets/mocks/demo3-preset/unused.js diff --git a/src/lib/presets/mocks/demo3-preset/yarn.lock b/lib/lib/presets/mocks/demo3-preset/yarn.lock similarity index 100% rename from src/lib/presets/mocks/demo3-preset/yarn.lock rename to lib/lib/presets/mocks/demo3-preset/yarn.lock diff --git a/src/lib/presets/mocks/preset-nested.js b/lib/lib/presets/mocks/preset-nested.js similarity index 100% rename from src/lib/presets/mocks/preset-nested.js rename to lib/lib/presets/mocks/preset-nested.js diff --git a/src/lib/presets/mocks/preset-options-nested.js b/lib/lib/presets/mocks/preset-options-nested.js similarity index 100% rename from src/lib/presets/mocks/preset-options-nested.js rename to lib/lib/presets/mocks/preset-options-nested.js diff --git a/src/lib/presets/mocks/preset-options.js b/lib/lib/presets/mocks/preset-options.js similarity index 100% rename from src/lib/presets/mocks/preset-options.js rename to lib/lib/presets/mocks/preset-options.js diff --git a/src/lib/presets/mocks/preset-second.js b/lib/lib/presets/mocks/preset-second.js similarity index 100% rename from src/lib/presets/mocks/preset-second.js rename to lib/lib/presets/mocks/preset-second.js diff --git a/src/lib/presets/mocks/preset-simple.js b/lib/lib/presets/mocks/preset-simple.js similarity index 100% rename from src/lib/presets/mocks/preset-simple.js rename to lib/lib/presets/mocks/preset-simple.js diff --git a/src/lib/presets/presets.test.js b/lib/lib/presets/presets.test.js similarity index 100% rename from src/lib/presets/presets.test.js rename to lib/lib/presets/presets.test.js diff --git a/src/lib/print-object.js b/lib/lib/print-object.js similarity index 100% rename from src/lib/print-object.js rename to lib/lib/print-object.js diff --git a/src/lib/rebuild-object.js b/lib/lib/rebuild-object.js similarity index 100% rename from src/lib/rebuild-object.js rename to lib/lib/rebuild-object.js diff --git a/src/lib/request.js b/lib/lib/request.js similarity index 100% rename from src/lib/request.js rename to lib/lib/request.js diff --git a/src/lib/xml-to-json.js b/lib/lib/xml-to-json.js similarity index 100% rename from src/lib/xml-to-json.js rename to lib/lib/xml-to-json.js diff --git a/src/mocks/petstore-v2-multi-file.yaml b/lib/mocks/petstore-v2-multi-file.yaml similarity index 100% rename from src/mocks/petstore-v2-multi-file.yaml rename to lib/mocks/petstore-v2-multi-file.yaml diff --git a/src/mocks/petstore-v2-multi-file/definitions.yaml b/lib/mocks/petstore-v2-multi-file/definitions.yaml similarity index 100% rename from src/mocks/petstore-v2-multi-file/definitions.yaml rename to lib/mocks/petstore-v2-multi-file/definitions.yaml diff --git a/src/mocks/petstore-v2-multi-file/paths.yaml b/lib/mocks/petstore-v2-multi-file/paths.yaml similarity index 100% rename from src/mocks/petstore-v2-multi-file/paths.yaml rename to lib/mocks/petstore-v2-multi-file/paths.yaml diff --git a/src/mocks/petstore-v2-ref-url.yaml b/lib/mocks/petstore-v2-ref-url.yaml similarity index 100% rename from src/mocks/petstore-v2-ref-url.yaml rename to lib/mocks/petstore-v2-ref-url.yaml diff --git a/src/mocks/petstore-v2.json b/lib/mocks/petstore-v2.json similarity index 100% rename from src/mocks/petstore-v2.json rename to lib/mocks/petstore-v2.json diff --git a/src/mocks/petstore-v2.yaml b/lib/mocks/petstore-v2.yaml similarity index 100% rename from src/mocks/petstore-v2.yaml rename to lib/mocks/petstore-v2.yaml diff --git a/src/mocks/petstore-v3-short.json b/lib/mocks/petstore-v3-short.json similarity index 100% rename from src/mocks/petstore-v3-short.json rename to lib/mocks/petstore-v3-short.json diff --git a/src/mocks/petstore-v3.json b/lib/mocks/petstore-v3.json similarity index 100% rename from src/mocks/petstore-v3.json rename to lib/mocks/petstore-v3.json diff --git a/src/mocks/petstore-v3.yaml b/lib/mocks/petstore-v3.yaml similarity index 100% rename from src/mocks/petstore-v3.yaml rename to lib/mocks/petstore-v3.yaml diff --git a/src/package.test.js b/lib/package.test.js similarity index 100% rename from src/package.test.js rename to lib/package.test.js diff --git a/src/v2/extended.test.js b/lib/v2/extended.test.js similarity index 100% rename from src/v2/extended.test.js rename to lib/v2/extended.test.js diff --git a/src/v2/fixtures/ignore-deprecated.js b/lib/v2/fixtures/ignore-deprecated.js similarity index 100% rename from src/v2/fixtures/ignore-deprecated.js rename to lib/v2/fixtures/ignore-deprecated.js diff --git a/src/v2/fixtures/ignore-description.js b/lib/v2/fixtures/ignore-description.js similarity index 100% rename from src/v2/fixtures/ignore-description.js rename to lib/v2/fixtures/ignore-description.js diff --git a/src/v2/fixtures/import-request-on-disabled.js b/lib/v2/fixtures/import-request-on-disabled.js similarity index 100% rename from src/v2/fixtures/import-request-on-disabled.js rename to lib/v2/fixtures/import-request-on-disabled.js diff --git a/src/v2/fixtures/import-request-on-false.js b/lib/v2/fixtures/import-request-on-false.js similarity index 100% rename from src/v2/fixtures/import-request-on-false.js rename to lib/v2/fixtures/import-request-on-false.js diff --git a/src/v2/fixtures/import-request-on-true.js b/lib/v2/fixtures/import-request-on-true.js similarity index 100% rename from src/v2/fixtures/import-request-on-true.js rename to lib/v2/fixtures/import-request-on-true.js diff --git a/src/v2/fixtures/insert-original-body.js b/lib/v2/fixtures/insert-original-body.js similarity index 100% rename from src/v2/fixtures/insert-original-body.js rename to lib/v2/fixtures/insert-original-body.js diff --git a/src/v2/fixtures/throw-exception-on-deprecated.js b/lib/v2/fixtures/throw-exception-on-deprecated.js similarity index 100% rename from src/v2/fixtures/throw-exception-on-deprecated.js rename to lib/v2/fixtures/throw-exception-on-deprecated.js diff --git a/src/v2/fixtures/work-with-api-in-config.js b/lib/v2/fixtures/work-with-api-in-config.js similarity index 100% rename from src/v2/fixtures/work-with-api-in-config.js rename to lib/v2/fixtures/work-with-api-in-config.js diff --git a/src/v2/fixtures/work-without-config.js b/lib/v2/fixtures/work-without-config.js similarity index 100% rename from src/v2/fixtures/work-without-config.js rename to lib/v2/fixtures/work-without-config.js diff --git a/src/v2/fixtures/works-with-preset.js b/lib/v2/fixtures/works-with-preset.js similarity index 100% rename from src/v2/fixtures/works-with-preset.js rename to lib/v2/fixtures/works-with-preset.js diff --git a/src/v2/index.js b/lib/v2/index.js similarity index 100% rename from src/v2/index.js rename to lib/v2/index.js diff --git a/src/v2/index.snap.js b/lib/v2/index.snap.js similarity index 100% rename from src/v2/index.snap.js rename to lib/v2/index.snap.js diff --git a/src/v2/index.test.js b/lib/v2/index.test.js similarity index 100% rename from src/v2/index.test.js rename to lib/v2/index.test.js diff --git a/src/v2/mocks/example-preset.js b/lib/v2/mocks/example-preset.js similarity index 100% rename from src/v2/mocks/example-preset.js rename to lib/v2/mocks/example-preset.js diff --git a/src/v3/extended.snap.js b/lib/v3/extended.snap.js similarity index 100% rename from src/v3/extended.snap.js rename to lib/v3/extended.snap.js diff --git a/src/v3/extended.test.js b/lib/v3/extended.test.js similarity index 100% rename from src/v3/extended.test.js rename to lib/v3/extended.test.js diff --git a/src/v3/fixtures/add-original-body.js b/lib/v3/fixtures/add-original-body.js similarity index 100% rename from src/v3/fixtures/add-original-body.js rename to lib/v3/fixtures/add-original-body.js diff --git a/src/v3/fixtures/ignore-deprecated.js b/lib/v3/fixtures/ignore-deprecated.js similarity index 100% rename from src/v3/fixtures/ignore-deprecated.js rename to lib/v3/fixtures/ignore-deprecated.js diff --git a/src/v3/fixtures/ignore-description.js b/lib/v3/fixtures/ignore-description.js similarity index 100% rename from src/v3/fixtures/ignore-description.js rename to lib/v3/fixtures/ignore-description.js diff --git a/src/v3/fixtures/import-request-on-disabled.js b/lib/v3/fixtures/import-request-on-disabled.js similarity index 100% rename from src/v3/fixtures/import-request-on-disabled.js rename to lib/v3/fixtures/import-request-on-disabled.js diff --git a/src/v3/fixtures/import-request-on-false.js b/lib/v3/fixtures/import-request-on-false.js similarity index 100% rename from src/v3/fixtures/import-request-on-false.js rename to lib/v3/fixtures/import-request-on-false.js diff --git a/src/v3/fixtures/import-request-on-true.js b/lib/v3/fixtures/import-request-on-true.js similarity index 100% rename from src/v3/fixtures/import-request-on-true.js rename to lib/v3/fixtures/import-request-on-true.js diff --git a/src/v3/fixtures/throw-exception-on-deprecated.js b/lib/v3/fixtures/throw-exception-on-deprecated.js similarity index 100% rename from src/v3/fixtures/throw-exception-on-deprecated.js rename to lib/v3/fixtures/throw-exception-on-deprecated.js diff --git a/src/v3/fixtures/works-with-preset.js b/lib/v3/fixtures/works-with-preset.js similarity index 100% rename from src/v3/fixtures/works-with-preset.js rename to lib/v3/fixtures/works-with-preset.js diff --git a/src/v3/fixtures/works-without-config.js b/lib/v3/fixtures/works-without-config.js similarity index 100% rename from src/v3/fixtures/works-without-config.js rename to lib/v3/fixtures/works-without-config.js diff --git a/src/v3/index.js b/lib/v3/index.js similarity index 100% rename from src/v3/index.js rename to lib/v3/index.js diff --git a/src/v3/index.snap.js b/lib/v3/index.snap.js similarity index 100% rename from src/v3/index.snap.js rename to lib/v3/index.snap.js diff --git a/src/v3/index.test.js b/lib/v3/index.test.js similarity index 100% rename from src/v3/index.test.js rename to lib/v3/index.test.js diff --git a/src/v3/mocks/api.github.com.json b/lib/v3/mocks/api.github.com.json similarity index 100% rename from src/v3/mocks/api.github.com.json rename to lib/v3/mocks/api.github.com.json diff --git a/src/v3/mocks/example-preset.js b/lib/v3/mocks/example-preset.js similarity index 100% rename from src/v3/mocks/example-preset.js rename to lib/v3/mocks/example-preset.js diff --git a/package.json b/package.json index df79166..33f89a9 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "scripts": { "test": "jest --testPathIgnorePatterns package.test", "prepublishOnly": "yarn test && yarn test-pack", - "test-pack": "yarn jest -i ./src/package.test.js" + "test-pack": "yarn jest -i ./src/package.test.js", + "build": "babel -d ./dist --extensions '.ts' ./src" }, "files": [ "src/common", @@ -43,17 +44,27 @@ "openapi": "./src/cli/index.js" }, "dependencies": { - "@types/jest": "^26.0.14", + "@jsdevtools/ono": "^7.1.3", "change-case": "^4.1.1", "commander": "^6.1.0", - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", "is-url": "^1.2.4", "js-yaml": "^3.13.1", "node-fetch": "^2.6.0", "object-hash": "^2.0.3", + "swagger2openapi": "^7.0.5", "url-parse": "^1.4.7" }, "devDependencies": { + "@babel/cli": "^7.12.17", + "@babel/core": "^7.12.17", + "@babel/preset-env": "^7.12.17", + "@babel/preset-typescript": "^7.12.17", + "@tsconfig/node14": "^1.0.0", + "@types/debug": "^4.1.5", + "@types/jest": "^26.0.14", + "@types/node": "^14.14.31", "babel-eslint": "^10.1.0", "demo-swagger-to-js-preset": "^0.2.0", "demo2-swagger-to-js-preset": "^0.1.0", @@ -62,11 +73,12 @@ "eslint-plugin-prettier": "^3.1.3", "husky": "^4.2.5", "jest": "^26.5.2", - "prettier": "^2.1.2" + "prettier": "^2.1.2", + "typescript": "^4.1.5" }, "husky": { "hooks": { - "pre-commit": "yarn eslint ./src", + "-pre-commit": "yarn eslint ./src", "pre-push": "yarn test" } } diff --git a/src/cli/index.ts b/src/cli/index.ts new file mode 100644 index 0000000..302ac1b --- /dev/null +++ b/src/cli/index.ts @@ -0,0 +1,50 @@ +import { program } from "commander"; +import { cosmiconfigSync } from "cosmiconfig"; +import { openapi } from ".."; + +import Package from "../../package.json"; + +program + .version(Package.version) + + // Cli Options + .option("--output-dir ", "Where to save compiled files") + .option("--config ", "Path to a config") + .option("--file ", "Path to Swagger/OpenAPI file (JSON, YAML, or URL") + .option( + "--authorization ", + "An auth token for getting OpenAPI file from URL (used as header)", + ) + .option("--presets ", "List of presets to generate files from"); + +async function main() { + program.parse(process.argv); + + const cosmic = cosmiconfigSync(Package.name); + const resolved = program.config ? cosmic.load(program.config) : cosmic.search() || { config: {} }; + const loaded = resolved?.config || {}; + + const config = { + outputDir: program.outputDir || loaded.outputDir || "./api", + file: program.file || loaded.file, + authorization: program.authorization || loaded.authorization, + presets: program.presets || loaded.presets || [], + }; + + if (!config.file) { + throw new Error("Please, provide path to a file with Swagger/OpenAPI spec"); + } + if (config.presets.length === 0) { + console.warn("[openapi] No presets were specified. Nothing to generate."); + } + + const timeLog = `✨ ${Package.name}`; + console.time(timeLog); + await openapi(config); + console.timeEnd(timeLog); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..0e69e15 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,37 @@ +import * as fs from "fs"; +import { open, FileHandle } from "fs/promises"; +import * as path from "path"; +import { ono } from "@jsdevtools/ono"; + +type Preset = string | [string, Record]; + +export interface Config { + outputDir: string; + file: string; + authorization: string | void; + presets: Preset[]; +} + +export async function openapi(config: Config) { + const content = await readFile(config.file); + assertDirectory(config.outputDir); +} + +async function readFile(file: string): Promise { + let handle: FileHandle | null = null; + try { + handle = await open(file, "r"); + return await handle?.readFile({ encoding: "utf8", flag: "r" }); + } catch (error) { + throw ono(error, `Cannot read file ${file}`); + } finally { + await handle?.close(); + } +} + +function assertDirectory(dir: string): void { + const outputDirPath = path.resolve(process.cwd(), dir); + if (!fs.existsSync(outputDirPath)) { + fs.mkdirSync(outputDirPath, { recursive: true }); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f907c90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "lib": ["es2020"], + "module": "commonjs", + "moduleResolution": "Node", + "noImplicitAny": true, + "outDir": "./dist", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "strictNullChecks": true, + "target": "es2020", + "types": ["jest", "node"] + }, + // "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.test.ts", "**/*.spec.ts"] +} diff --git a/yarn.lock b/yarn.lock index 9dbe153..a71bb7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,23 @@ # yarn lockfile v1 +"@babel/cli@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.12.17.tgz#2db13a0f2ba9c05bed78b8aad9669b473dd7f267" + integrity sha512-R9dQbDshWvAp3x5XjANsfthqka+ToEdDUonKgtALNgzQxgiUg2Xa4ZwKIcE84wnoiobIJFXF+TCM4ylJvUuW5w== + dependencies: + commander "^4.0.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.19" + make-dir "^2.1.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents" + chokidar "^3.4.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" @@ -9,6 +26,18 @@ dependencies: "@babel/highlight" "^7.8.3" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" + integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== + "@babel/core@^7.1.0", "@babel/core@^7.7.5": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" @@ -31,6 +60,36 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2" + integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-module-transforms" "^7.12.17" + "@babel/helpers" "^7.12.17" + "@babel/parser" "^7.12.17" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.17.tgz#9ef1dd792d778b32284411df63f4f668a9957287" + integrity sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg== + dependencies: + "@babel/types" "^7.12.17" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/generator@^7.9.6": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" @@ -41,6 +100,66 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-compilation-targets@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.17.tgz#91d83fae61ef390d39c3f0507cb83979bab837c7" + integrity sha512-5EkibqLVYOuZ89BSg2lv+GG8feywLuvMXNYgf0Im4MssE0mFWPztSpJbildNnUgw0bLI2EsIN4MpSHC2iUJkQA== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944" + integrity sha512-I/nurmTxIxHV0M+rIpfQBF1oN342+yvl2kwZUrQuOClMamHF1w5tknfZubgNOLRoA73SzBFAdFcpb4M9HwOeWQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.12.17" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" + integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-function-name@^7.9.5": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" @@ -50,6 +169,13 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.9.5" +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -57,6 +183,20 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-hoist-variables@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" + integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac" + integrity sha512-Bzv4p3ODgS/qpBE0DiJ9qf5WxSmrQ8gVTe8ClMfwwsY2x/rhykxxy3bXzG7AGTnPB2ij37zGJ/Q/6FruxHxsxg== + dependencies: + "@babel/types" "^7.12.17" + "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -64,6 +204,13 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-imports@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" @@ -71,6 +218,21 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.17.tgz#7c75b987d6dfd5b48e575648f81eaac891539509" + integrity sha512-sFL+p6zOCQMm9vilo06M4VHuTxUAwa6IxgL56Tq1DVtA0ziAGTH1ThmJq7xwPqdQlgAbKX3fb0oZNbtRIyA5KQ== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + lodash "^4.17.19" + "@babel/helper-module-transforms@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" @@ -84,6 +246,13 @@ "@babel/types" "^7.9.0" lodash "^4.17.13" +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -101,6 +270,30 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + +"@babel/helper-remap-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" + integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-replace-supers@^7.8.6": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" @@ -111,6 +304,13 @@ "@babel/traverse" "^7.9.6" "@babel/types" "^7.9.6" +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-simple-access@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" @@ -119,6 +319,20 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -126,11 +340,40 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helper-wrap-function@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" + integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helpers@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc" + integrity sha512-tEpjqSBGt/SFEsFikKds1sLNChKKGGR17flIgQKXH4fG6m9gTgl3gnOC1giHNyaBCSKuTfxaSzHi7UnvqiVKxg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + "@babel/helpers@^7.9.6": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" @@ -140,6 +383,15 @@ "@babel/traverse" "^7.9.6" "@babel/types" "^7.9.6" +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -154,7 +406,119 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== -"@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/parser@^7.12.13", "@babel/parser@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848" + integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg== + +"@babel/plugin-proposal-async-generator-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" + integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" + integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-proposal-dynamic-import@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512" + integrity sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" + integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" + integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.13" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c" + integrity sha512-TvxwI80pWftrGPKHNfkvX/HnoeSTR7gC4ezWnAL39PuktYUe6r8kEpOLTYnkBTsaoeazXm2jHJ22EQ81sdgfcA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" + integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -168,6 +532,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-class-properties@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" @@ -175,6 +546,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -182,13 +567,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" @@ -196,13 +588,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" @@ -210,27 +609,397 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-arrow-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" + integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" + integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-classes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" + integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" + integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-destructuring@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" + integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-for-of@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" + integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-modules-amd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" + integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" + integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== + dependencies: + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" + integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + +"@babel/plugin-transform-parameters@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" + integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" + integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-template-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" + integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typescript@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.17.tgz#4aa6a5041888dd2e5d316ec39212b0cf855211bb" + integrity sha512-1bIYwnhRoetxkFonuZRtDZPFEjl1l5r+3ITkxLC3mlMaFja+GQFo94b/WHEPjqWLU9Bc+W4oFZbvCGe9eYMu1g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.17" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-typescript" "^7.12.13" + +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa" + integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-compilation-targets" "^7.12.17" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-proposal-async-generator-functions" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-dynamic-import" "^7.12.17" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.12.17" + "@babel/plugin-proposal-private-methods" "^7.12.13" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.12.13" + "@babel/plugin-transform-async-to-generator" "^7.12.13" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.12.13" + "@babel/plugin-transform-computed-properties" "^7.12.13" + "@babel/plugin-transform-destructuring" "^7.12.13" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.12.13" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.12.13" + "@babel/plugin-transform-modules-commonjs" "^7.12.13" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.12.13" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.12.13" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.12.13" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.17" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.17.tgz#8ecf04618956c268359dd9feab775dc14a666eb5" + integrity sha512-T513uT4VSThRcmWeqcLkITKJ1oGQho9wfWuhQm10paClQkp1qyd0Wf8mvC8Se7UYssMyRSj4tZYpVTkCmAK/mA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-transform-typescript" "^7.12.17" + +"@babel/runtime@^7.8.4": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" + integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.9.2": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" @@ -238,6 +1007,15 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -262,6 +1040,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.17.tgz#40ec8c7ffb502c4e54c7f95492dc11b88d718619" + integrity sha512-LGkTqDqdiwC6Q7fWSwQoas/oyiEYw6Hqjve5KOSykXkmFJFqzvGMb9niaUEag3Rlve492Mkye3gLw9FTv94fdQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.17" + "@babel/types" "^7.12.17" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" @@ -271,6 +1064,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.4.4": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963" + integrity sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -284,6 +1086,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.0.0-rc.3.tgz#dda2fbf3dafa5ad8c63dadff7e01d3fdf4736025" + integrity sha512-GoXw0U2Qaa33m3eUcxuHnHpNvHjNlLo0gtV091XBpaRINaB4X6FGCG5XKxSFNFiPpugUDqNruHzaqpTdDm4AOg== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" @@ -480,6 +1287,28 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": + version "2.1.8-no-fsevents" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" + integrity sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + "@sinonjs/commons@^1.7.0": version "1.7.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" @@ -494,6 +1323,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@tsconfig/node14@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.0.tgz#5bd046e508b1ee90bc091766758838741fdefd6e" + integrity sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ== + "@types/babel__core@^7.0.0": version "7.1.10" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" @@ -550,6 +1384,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/debug@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + "@types/graceful-fs@^4.1.2": version "4.1.3" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" @@ -597,6 +1436,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== +"@types/node@^14.14.31": + version "14.14.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" + integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -707,7 +1551,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3: +anymatch@^3.0.3, anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== @@ -764,6 +1608,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -810,6 +1659,13 @@ babel-jest@^26.5.2: graceful-fs "^4.2.4" slash "^3.0.0" +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-istanbul@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" @@ -881,6 +1737,16 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -889,7 +1755,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -905,7 +1771,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -917,6 +1783,17 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browserslist@^4.14.5, browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -944,6 +1821,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -967,6 +1857,11 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== +caniuse-lite@^1.0.30001181: + version "1.0.30001190" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001190.tgz#acc6d4a53c68be16cfc314d55c9cab637e558cba" + integrity sha512-62KVw474IK8E+bACBYhRS0/L6o/1oeAVkpF2WetjV58S5vkzNh0/Rz3lD8D4YCbOTqi0/aD4X3LtoP7V5xnuAg== + capital-case@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.3.tgz#339bd77e8fab6cf75111d4fca509b3edf7c117c8" @@ -1041,6 +1936,21 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chokidar@^3.4.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -1077,6 +1987,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1119,6 +2038,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1126,6 +2050,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" @@ -1155,7 +2084,7 @@ constant-case@^3.0.3: tslib "^1.10.0" upper-case "^2.0.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -1167,7 +2096,15 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-util-is@1.0.2: +core-js-compat@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" + integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -1183,6 +2120,17 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1250,6 +2198,13 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" +debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1275,6 +2230,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1362,6 +2324,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-to-chromium@^1.3.649: + version "1.3.671" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz#8feaed6eae42d279fa4611f58c42a5a1eb81b2a0" + integrity sha512-RTD97QkdrJKaKwRv9h/wGAaoR2lGxNXEcBXS31vjitgTPwTWAbLdS7cEsBK68eEQy7p6YyT8D5BxBEYHu2SuwQ== + emittery@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" @@ -1391,6 +2358,16 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1662,6 +2639,11 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -1755,6 +2737,11 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1765,6 +2752,16 @@ fsevents@^2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -1775,11 +2772,20 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -1806,14 +2812,22 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^5.0.0: +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -1837,6 +2851,11 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +graceful-fs@^4.1.11: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -1870,6 +2889,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -1901,6 +2925,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + header-case@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.3.tgz#8a7407d16edfd5c970f8ebb116e6383f855b5a72" @@ -1935,6 +2966,11 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-client@^1.2.5: + version "1.3.3" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.3.tgz#90fc15d646cca86956b156d07c83947d57d659a9" + integrity sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA== + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -1976,6 +3012,14 @@ import-fresh@^3.0.0, import-fresh@^3.1.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -1997,7 +3041,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2045,6 +3089,20 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -2106,7 +3164,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.1: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -2126,7 +3184,14 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1: +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -2189,7 +3254,7 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -2711,6 +3776,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -2836,6 +3906,14 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -2867,7 +3945,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -2943,7 +4021,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -2988,7 +4066,14 @@ no-case@^3.0.3: lower-case "^2.0.1" tslib "^1.10.0" -node-fetch@^2.6.0: +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -3015,6 +4100,18 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha1-271K8SE04uY1wkXvk//Pb2BnOl0= + dependencies: + es6-promise "^3.2.1" + +node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== + normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -3032,7 +4129,7 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -3056,6 +4153,52 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.1.tgz#1a6d9117d146805b58e56df479861de0293b6e5b" + integrity sha512-e5G6bbq3Nrfxm+SDPR5AiZ6n2smVUmhLA1OgI2/Bl8e2ywfWsKw/yuqrwiXXiNHb1wdM/GyPMX6QjCGJODlaaA== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.4.tgz#81fa1aaa7e2387ab2dba1045827e9d7b79822326" + integrity sha512-1vIj5Wkjmi+kZj5sFamt95LkuXoalmoKUohtaUQoCQZjLfPFaY8uZ7nw6IZaWuE6eLON2b6xrXhxD4hiTdYl0g== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.8" + yaml "^1.10.0" + yargs "^16.1.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.5.tgz#f42d5a9f0422a46caafa4f007007fdb7c6872aca" + integrity sha512-d10yy6xlhRTh6np44k2U0gm5M66pioYTllH8J1ZTj+WSY3cpTvU+Dt51iWOT85HJqyGHo0RZKXF3u/NGQWDFgg== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.1" + oas-resolver "^2.5.4" + oas-schema-walker "^1.1.5" + reftools "^1.1.8" + should "^13.2.1" + yaml "^1.10.0" + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -3075,6 +4218,11 @@ object-hash@^2.0.3: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -3082,6 +4230,16 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -3205,6 +4363,11 @@ path-case@^3.0.3: dot-case "^3.0.3" tslib "^1.10.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -3240,11 +4403,16 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -3308,6 +4476,11 @@ pretty-format@^26.5.2: ansi-styles "^4.0.0" react-is "^16.12.0" +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -3373,11 +4546,64 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" +readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +reftools@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.8.tgz#cc08fd67eb913d779fd330657d010cc080c7d643" + integrity sha512-Yvz9NH8uFHzD/AXX82Li1GdAP6FzDBxEZw+njerNBBQv/XHihqsWAjNfXtaq4QD2l4TEZVnp4UbktdYSegAM3g== + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -3391,6 +4617,30 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -3541,7 +4791,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -3590,11 +4840,16 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -3660,6 +4915,50 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE= + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM= + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -3670,6 +4969,11 @@ sisteransi@^1.0.4: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -3860,6 +5164,13 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -3916,6 +5227,23 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +swagger2openapi@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.5.tgz#9f622d8bc3a281aad850386994c0dc35d18654a8" + integrity sha512-Hzxse+VTX0u8xBgYJ665EjO6BfvW2PN9Yv+yIjBDm6ga9jl83+4CEdCCpznH+ILr5MS8bIIXB+XcQUM3u25w4g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.4" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.5" + reftools "^1.1.8" + yaml "^1.10.0" + yargs "^16.1.1" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -4092,6 +5420,34 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -4110,6 +5466,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + upper-case-first@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.1.tgz#32ab436747d891cc20ab1e43d601cb4d0a7fbf4a" @@ -4149,6 +5510,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -4280,6 +5646,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4322,11 +5697,21 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yaml@^1.7.2: version "1.9.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.2.tgz#f0cfa865f003ab707663e4f04b3956957ea564ed" @@ -4342,6 +5727,11 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.5" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" + integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== + yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -4358,3 +5748,16 @@ yargs@^15.4.1: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.2" + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" From e91c5e0c13c27436bcb616de82bede1d0fda7baa Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Sat, 20 Feb 2021 18:49:44 +0300 Subject: [PATCH 02/20] feat: add base hooks and iterating over presets --- .eslintrc | 37 ++++++---- .gitignore | 1 + dist/cli/index.js | 48 ------------ dist/index.js | 49 ------------- lib/lib/presets/mocks/preset-options.js | 19 +++-- package.json | 10 ++- src/api-file.ts | 68 +++++++++++++++++ src/config.ts | 8 ++ src/index.ts | 98 ++++++++++++++++++++----- src/presets.ts | 88 ++++++++++++++++++++++ tsconfig.json | 7 +- typings/swagger2openapi.d.ts | 11 +++ yarn.lock | 48 +++++++++++- 13 files changed, 347 insertions(+), 145 deletions(-) delete mode 100644 dist/cli/index.js delete mode 100644 dist/index.js create mode 100644 src/api-file.ts create mode 100644 src/config.ts create mode 100644 src/presets.ts create mode 100644 typings/swagger2openapi.d.ts diff --git a/.eslintrc b/.eslintrc index 1be3bfe..262ac0a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,19 +1,24 @@ { - "parser": "babel-eslint", - "rules": { - "no-unused-vars": [ - "warn", - { - "vars": "all", - "args": "after-used", - "ignoreRestSiblings": false + "overrides": [ + { + "files": ["*.js"], + "parser": "babel-eslint", + "rules": { + "no-unused-vars": [ + "warn", + { + "vars": "all", + "args": "after-used", + "ignoreRestSiblings": false + } + ] + }, + "parserOptions": { + "ecmaVersion": 2017 + }, + "env": { + "es6": true } - ] - }, - "parserOptions": { - "ecmaVersion": 2017 - }, - "env": { - "es6": true - } + } + ] } diff --git a/.gitignore b/.gitignore index e066bf9..8a22709 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ ttt.js */**/code.js */**/code.d.ts examples/**/apidist +dist diff --git a/dist/cli/index.js b/dist/cli/index.js deleted file mode 100644 index 19b6dd7..0000000 --- a/dist/cli/index.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; - -var _commander = require("commander"); - -var _cosmiconfig = require("cosmiconfig"); - -var _ = require(".."); - -var _package = _interopRequireDefault(require("../../package.json")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_commander.program.version(_package.default.version) // Cli Options -.option("--output-dir ", "Where to save compiled files").option("--config ", "Path to a config").option("--file ", "Path to Swagger/OpenAPI file (JSON, YAML, or URL").option("--authorization ", "An auth token for getting OpenAPI file from URL (used as header)").option("--presets ", "List of presets to generate files from"); - -async function main() { - _commander.program.parse(process.argv); - - const cosmic = (0, _cosmiconfig.cosmiconfigSync)(_package.default.name); - const resolved = _commander.program.config ? cosmic.load(_commander.program.config) : cosmic.search() || { - config: {} - }; - const loaded = resolved?.config || {}; - const config = { - outputDir: _commander.program.outputDir || loaded.outputDir || "./api", - file: _commander.program.file || loaded.file, - authorization: _commander.program.authorization || loaded.authorization, - presets: _commander.program.presets || loaded.presets || [] - }; - - if (!config.file) { - throw new Error("Please, provide path to a file with Swagger/OpenAPI spec"); - } - - if (config.presets.length === 0) { - console.warn("[openapi] No presets were specified. Nothing to generate."); - } - - const timeLog = `✨ ${_package.default.name}`; - console.time(timeLog); - await (0, _.openapi)(config); - console.timeEnd(timeLog); -} - -main().catch(error => { - console.error(error); - process.exit(1); -}); \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 104cde7..0000000 --- a/dist/index.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.openapi = openapi; - -var fs = _interopRequireWildcard(require("fs")); - -var _promises = require("fs/promises"); - -var path = _interopRequireWildcard(require("path")); - -var _ono = require("@jsdevtools/ono"); - -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -async function openapi(config) { - const content = await readFile(config.file); - assertDirectory(config.outputDir); -} - -async function readFile(file) { - let handle = null; - - try { - handle = await (0, _promises.open)(file, "r"); - return await handle?.readFile({ - encoding: "utf8", - flag: "r" - }); - } catch (error) { - throw (0, _ono.ono)(error, `Cannot read file ${file}`); - } finally { - await handle?.close(); - } -} - -function assertDirectory(dir) { - const outputDirPath = path.resolve(process.cwd(), dir); - - if (!fs.existsSync(outputDirPath)) { - fs.mkdirSync(outputDirPath, { - recursive: true - }); - } -} \ No newline at end of file diff --git a/lib/lib/presets/mocks/preset-options.js b/lib/lib/presets/mocks/preset-options.js index 4d538b4..67c41b5 100644 --- a/lib/lib/presets/mocks/preset-options.js +++ b/lib/lib/presets/mocks/preset-options.js @@ -1,5 +1,14 @@ -module.exports = (options) => ({ - options, - demo: 1, - just: 2, -}); +module.exports = (options) => { + const schemas = []; + + return { + name: "preset-options", + onSchema(name, schema) { + schemas.push(schema); + }, + build(files) { + files.addFile("schemas-count.js", "wrooong"); + files.addFile("schemas-count.js", String(schemas.length), { overwrite: true }); + }, + }; +}; diff --git a/package.json b/package.json index 33f89a9..f6ee109 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "scripts": { "test": "jest --testPathIgnorePatterns package.test", - "prepublishOnly": "yarn test && yarn test-pack", + "prepublishOnly": "yarn test --passWIthNoTests && yarn test-pack", "test-pack": "yarn jest -i ./src/package.test.js", "build": "babel -d ./dist --extensions '.ts' ./src" }, @@ -50,9 +50,10 @@ "cosmiconfig": "^7.0.0", "debug": "^4.3.1", "is-url": "^1.2.4", - "js-yaml": "^3.13.1", - "node-fetch": "^2.6.0", + "js-yaml": "^4.0.0", + "node-fetch": "^2.6.1", "object-hash": "^2.0.3", + "openapi-types": "^7.2.3", "swagger2openapi": "^7.0.5", "url-parse": "^1.4.7" }, @@ -63,8 +64,11 @@ "@babel/preset-typescript": "^7.12.17", "@tsconfig/node14": "^1.0.0", "@types/debug": "^4.1.5", + "@types/is-url": "^1.2.28", "@types/jest": "^26.0.14", + "@types/js-yaml": "^4.0.0", "@types/node": "^14.14.31", + "@types/node-fetch": "^2.5.8", "babel-eslint": "^10.1.0", "demo-swagger-to-js-preset": "^0.2.0", "demo2-swagger-to-js-preset": "^0.1.0", diff --git a/src/api-file.ts b/src/api-file.ts new file mode 100644 index 0000000..2780ff9 --- /dev/null +++ b/src/api-file.ts @@ -0,0 +1,68 @@ +import { open, FileHandle } from "fs/promises"; +import * as path from "path"; +import { ono } from "@jsdevtools/ono"; +import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; +import isUrl from "is-url"; +import fetch from "node-fetch"; +import yaml from "js-yaml"; +import { Config } from "./config"; + +export async function readApiFile(config: Config): Promise { + return isUrl(config.file) ? await readFileFromWeb(config) : await readFileFromDisk(config); +} + +export async function parseContent( + filepath: string, + content: string, +): Promise { + const extension = path.extname(filepath); + + switch (extension) { + case ".yaml": { + const result: any = yaml.load(content, { filename: filepath }); + if (!result) { + throw new Error(`Read file has incorrect content: ${result}`); + } + return result; + } + + case ".json": + case "": { + const result: any = JSON.parse(content); + if (!result) { + throw new Error(`Read file has incorrect content: ${result}`); + } + return result; + } + + default: + throw new Error(`Cannot parse file ${filepath} with extension "${extension}"`); + } +} + +export function createFetchOptions(config: Config) { + return { + headers: config.authorization ? { authorization: config.authorization } : undefined, + }; +} + +async function readFileFromWeb(config: Config): Promise { + const response = await fetch(config.file, createFetchOptions(config)); + + if (response.ok) { + return await response.text(); + } + throw new Error(`Failed to fetch api file ${config.file}`); +} + +async function readFileFromDisk(config: Config): Promise { + let handle: FileHandle | null = null; + try { + handle = await open(config.file, "r"); + return await handle?.readFile({ encoding: "utf8", flag: "r" }); + } catch (error) { + throw ono(error, `Cannot read file ${config.file}`); + } finally { + await handle?.close(); + } +} diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..41da0d8 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,8 @@ +export type PresetConfig = string | [string, Record]; + +export interface Config { + outputDir: string; + file: string; + authorization: string | void; + presets: PresetConfig[]; +} diff --git a/src/index.ts b/src/index.ts index 0e69e15..22e1114 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,34 +1,96 @@ import * as fs from "fs"; -import { open, FileHandle } from "fs/promises"; import * as path from "path"; -import { ono } from "@jsdevtools/ono"; +import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; +import { convertObj } from "swagger2openapi"; +import * as changeCase from "change-case"; -type Preset = string | [string, Record]; +import { Config } from "./config"; +import { parseContent, readApiFile, createFetchOptions } from "./api-file"; +import { createPresetIterator, Preset, FilesApi } from "./presets"; -export interface Config { - outputDir: string; - file: string; - authorization: string | void; - presets: Preset[]; +// File system per preset +interface PFileSystem { + files: Map; + api: FilesApi; } export async function openapi(config: Config) { - const content = await readFile(config.file); assertDirectory(config.outputDir); + const content = await readApiFile(config); + const apiObject = await parseContent(config.file, content); + const api = isSwagger(apiObject) + ? (await convertObj(apiObject, { fetchOptions: createFetchOptions(config) })).openapi + : apiObject; + + const internal = { changeCase }; + const fileSystemsMap = new Map(); + const presets = createPresetIterator(config.presets, internal); + + // Create files API for each preset + presets.forEach((preset) => { + const files = new Map(); + const api: FilesApi = { + addFile(name, content, { overwrite } = {}) { + if (files.has(name) && !overwrite) { + return; + } + files.set(name, content); + }, + }; + const system: PFileSystem = { files, api }; + fileSystemsMap.set(preset, system); + }); + + forEach(api.components?.parameters, (name, parameter) => + presets.forEach((preset) => preset.onParameter(name, parameter)), + ); + + forEach(api.components?.schemas, (name, schema) => + presets.forEach((preset) => preset.onSchema(name, schema)), + ); + + // TODO: add hooks for each component type + // TODO: add hook for operation + // TODO: add pre/post hooks + + presets.forEach((preset) => { + const fileSystem = fileSystemsMap.get(preset); + if (!fileSystem) { + throw new ReferenceError( + `Cannot find fileSystem for preset "${preset.name}". Unexpected error`, + ); + } + preset.build(fileSystem.api); + }); + + // TODO: merge all filesystems into single one + // TODO: validate that files has no conflicts + // TODO: save files to FS + + for (const [preset, fs] of fileSystemsMap.entries()) { + const files = Object.fromEntries(fs.files.entries()); + console.log(`File system of preset "${preset.name}":`, files); + } } -async function readFile(file: string): Promise { - let handle: FileHandle | null = null; - try { - handle = await open(file, "r"); - return await handle?.readFile({ encoding: "utf8", flag: "r" }); - } catch (error) { - throw ono(error, `Cannot read file ${file}`); - } finally { - await handle?.close(); +function forEach( + map: Record | undefined, + fn: (name: string, value: Exclude) => void, +) { + for (const name in map) { + const value: OpenAPIV3.ReferenceObject | T | undefined = map[name]; + if (noRef(value) && value) fn(name, value as any); } } +function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude { + return typeof value && !(value as any)["$ref"]; +} + +function isSwagger(input: OpenAPIV3.Document | OpenAPIV2.Document): input is OpenAPIV2.Document { + return typeof (input as any)["swagger"] === "string"; +} + function assertDirectory(dir: string): void { const outputDirPath = path.resolve(process.cwd(), dir); if (!fs.existsSync(outputDirPath)) { diff --git a/src/presets.ts b/src/presets.ts new file mode 100644 index 0000000..cf226a6 --- /dev/null +++ b/src/presets.ts @@ -0,0 +1,88 @@ +import path from "path"; +import { OpenAPIV3 } from "openapi-types"; +import { PresetConfig } from "./config"; + +export interface FilesApi { + addFile(name: string, content: string, options?: { overwrite?: boolean }): void; +} + +export interface Preset { + name: string; + onSchema: (name: string, schema: OpenAPIV3.SchemaObject) => void; + onParameter: (name: string, schema: OpenAPIV3.ParameterObject) => void; + build(filesApi: FilesApi): void; +} + +const defaultPreset: Preset = { + name: "(default)", + onSchema() {}, + onParameter() {}, + build() {}, +}; + +type OptionalPreset = Partial; + +export function createPresetIterator(list: PresetConfig[], internal: unknown) { + const presets: Preset[] = []; + + list.forEach((presetConfigName) => { + const [name, readPreset] = loadPreset(presetConfigName, internal); + presets.push({ ...defaultPreset, name, ...readPreset }); + }); + + return { + forEach(fn: (preset: Preset) => void) { + presets.forEach((preset) => fn(preset)); + }, + }; +} + +function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, OptionalPreset] { + if (Array.isArray(presetConfig)) { + const [name, options] = presetConfig; + if (typeof name !== "string") { + throw new TypeError( + `A name of the preset should be a string. "${name === null ? "null" : typeof name}" passed`, + ); + } + + const imported = require(resolvePath(name)); + + // Here we know that user passed options to preset + if (typeof imported !== "function") { + throw new TypeError( + `Preset "${name}" must be used without options. Please, remove options or check that you use correct preset`, + ); + } + const preset = imported(options || {}, internal); + assertPreset(preset, name); + + return [name, preset]; + } + + const imported = require(resolvePath(presetConfig)); + // Package exports preset constructor + if (typeof imported === "function") { + const preset = imported({}, internal); + assertPreset(preset, presetConfig); + return [presetConfig, preset]; + } + // Here package exports preset object + assertPreset(imported, presetConfig); + return [presetConfig, imported]; +} + +function resolvePath(name: string): string { + if (name[0] === ".") { + return path.resolve(process.cwd(), name); + } + return name; +} + +function assertPreset(preset: any, name: string): void { + if (typeof preset !== "object") { + throw new TypeError( + `Preset "${name}" must return an object from default exported function. Please, check that you use correct preset name.`, + ); + } +} diff --git a/tsconfig.json b/tsconfig.json index f907c90..c300890 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,10 @@ { - "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { "declaration": true, "emitDeclarationOnly": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "lib": ["es2020"], + "lib": ["es2020", "ESNext"], "module": "commonjs", "moduleResolution": "Node", "noImplicitAny": true, @@ -15,8 +14,8 @@ "strict": true, "strictNullChecks": true, "target": "es2020", - "types": ["jest", "node"] + "types": ["jest", "node", "./typings/swagger2openapi"] }, - // "include": ["src/**/*"], + "include": ["src/**/*"], "exclude": ["node_modules", "**/*.test.ts", "**/*.spec.ts"] } diff --git a/typings/swagger2openapi.d.ts b/typings/swagger2openapi.d.ts new file mode 100644 index 0000000..0b48323 --- /dev/null +++ b/typings/swagger2openapi.d.ts @@ -0,0 +1,11 @@ +declare module "swagger2openapi" { + import { OpenAPIV3 } from "openapi-types"; + declare function convertObj( + swagger: object, + options?: { + fetchOptions?: Record; + }, + ): Promise<{ + openapi: OpenAPIV3.Document; + }>; +} diff --git a/yarn.lock b/yarn.lock index a71bb7c..6112eb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1396,6 +1396,11 @@ dependencies: "@types/node" "*" +"@types/is-url@^1.2.28": + version "1.2.28" + resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787" + integrity sha1-kU2r1QVG2bAUKAbkLHK8fCt+B4c= + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -1431,6 +1436,19 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" +"@types/js-yaml@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.0.tgz#d1a11688112091f2c711674df3a65ea2f47b5dfb" + integrity sha512-4vlpCM5KPCL5CfGmTbpjwVKbISRYhduEJvvUWsH5EB7QInhEj94XPZ3ts/9FPiLZFqYO0xoW4ZL8z2AabTGgJA== + +"@types/node-fetch@^2.5.8": + version "2.5.8" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" + integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node@*": version "13.13.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" @@ -1566,6 +1584,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -2043,7 +2066,7 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2721,6 +2744,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -3734,6 +3766,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -4073,7 +4112,7 @@ node-fetch-h2@^2.3.0: dependencies: http2-client "^1.2.5" -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -4261,6 +4300,11 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +openapi-types@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-7.2.3.tgz#83829911a3410a022f0e0cf2b0b2e67232ccf96e" + integrity sha512-olbaNxz12R27+mTyJ/ZAFEfUruauHH27AkeQHDHRq5AF0LdNkK1SSV7EourXQDK+4aX7dv2HtyirAGK06WMAsA== + opencollective-postinstall@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" From 805d4383f2cefa261d00f825c08ca284ddd56e71 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Sun, 21 Feb 2021 18:13:21 +0300 Subject: [PATCH 03/20] feat: add hooks for each component type --- src/index.ts | 32 +++++++++----------------------- src/presets.ts | 44 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/index.ts b/src/index.ts index 22e1114..8442e7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import * as changeCase from "change-case"; import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; -import { createPresetIterator, Preset, FilesApi } from "./presets"; +import { createPresetIterator, Preset, FilesApi, forEach } from "./presets"; // File system per preset interface PFileSystem { @@ -41,15 +41,15 @@ export async function openapi(config: Config) { fileSystemsMap.set(preset, system); }); - forEach(api.components?.parameters, (name, parameter) => - presets.forEach((preset) => preset.onParameter(name, parameter)), - ); + presets.traverse(api.components?.callbacks, (preset) => preset.onCallback); + presets.traverse(api.components?.headers, (preset) => preset.onHeader); + presets.traverse(api.components?.links, (preset) => preset.onLink); + presets.traverse(api.components?.parameters, (preset) => preset.onParameter); + presets.traverse(api.components?.requestBodies, (preset) => preset.onRequestBody); + presets.traverse(api.components?.responses, (preset) => preset.onResponse); + presets.traverse(api.components?.schemas, (preset) => preset.onSchema); + presets.traverse(api.components?.securitySchemes, (preset) => preset.onSecurityScheme); - forEach(api.components?.schemas, (name, schema) => - presets.forEach((preset) => preset.onSchema(name, schema)), - ); - - // TODO: add hooks for each component type // TODO: add hook for operation // TODO: add pre/post hooks @@ -73,20 +73,6 @@ export async function openapi(config: Config) { } } -function forEach( - map: Record | undefined, - fn: (name: string, value: Exclude) => void, -) { - for (const name in map) { - const value: OpenAPIV3.ReferenceObject | T | undefined = map[name]; - if (noRef(value) && value) fn(name, value as any); - } -} - -function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude { - return typeof value && !(value as any)["$ref"]; -} - function isSwagger(input: OpenAPIV3.Document | OpenAPIV2.Document): input is OpenAPIV2.Document { return typeof (input as any)["swagger"] === "string"; } diff --git a/src/presets.ts b/src/presets.ts index cf226a6..3553c44 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -8,16 +8,28 @@ export interface FilesApi { export interface Preset { name: string; - onSchema: (name: string, schema: OpenAPIV3.SchemaObject) => void; - onParameter: (name: string, schema: OpenAPIV3.ParameterObject) => void; build(filesApi: FilesApi): void; + onCallback: (name: string, callback: OpenAPIV3.CallbackObject) => void; + onHeader: (name: string, header: OpenAPIV3.HeaderObject) => void; + onLink: (name: string, link: OpenAPIV3.LinkObject) => void; + onParameter: (name: string, parameter: OpenAPIV3.ParameterObject) => void; + onRequestBody: (name: string, requestBody: OpenAPIV3.RequestBodyObject) => void; + onResponse: (name: string, response: OpenAPIV3.ResponseObject) => void; + onSchema: (name: string, schema: OpenAPIV3.SchemaObject) => void; + onSecurityScheme: (name: string, securityScheme: OpenAPIV3.SecuritySchemeObject) => void; } const defaultPreset: Preset = { name: "(default)", - onSchema() {}, - onParameter() {}, build() {}, + onCallback() {}, + onHeader() {}, + onLink() {}, + onParameter() {}, + onRequestBody() {}, + onResponse() {}, + onSchema() {}, + onSecurityScheme() {}, }; type OptionalPreset = Partial; @@ -34,9 +46,33 @@ export function createPresetIterator(list: PresetConfig[], internal: unknown) { forEach(fn: (preset: Preset) => void) { presets.forEach((preset) => fn(preset)); }, + traverse( + schemas: Record | undefined, + fn: ( + preset: Preset, + ) => (name: string, item: Exclude) => void, + ) { + forEach(schemas, (name, schema) => { + presets.forEach((preset) => fn(preset)(name, schema)); + }); + }, }; } +export function forEach( + map: Record | undefined, + fn: (name: string, value: Exclude) => void, +) { + for (const name in map) { + const value: OpenAPIV3.ReferenceObject | T | undefined = map[name]; + if (noRef(value) && value) fn(name, value as any); + } +} + +function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude { + return typeof value && !(value as any)["$ref"]; +} + function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, OptionalPreset] { if (Array.isArray(presetConfig)) { const [name, options] = presetConfig; From 13ce754292975609215d271679a5967c507687a6 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Sun, 21 Feb 2021 19:11:26 +0300 Subject: [PATCH 04/20] feat: call hook for each operation --- lib/lib/presets/mocks/preset-options.js | 2 +- src/index.ts | 39 +++++++++++++++++++++++-- src/presets.ts | 11 ++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/lib/lib/presets/mocks/preset-options.js b/lib/lib/presets/mocks/preset-options.js index 67c41b5..93ccff0 100644 --- a/lib/lib/presets/mocks/preset-options.js +++ b/lib/lib/presets/mocks/preset-options.js @@ -1,4 +1,4 @@ -module.exports = (options) => { +module.exports = (options, internal) => { const schemas = []; return { diff --git a/src/index.ts b/src/index.ts index 8442e7c..2c465fc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import * as changeCase from "change-case"; import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; -import { createPresetIterator, Preset, FilesApi, forEach } from "./presets"; +import { createPresetIterator, Preset, FilesApi, forEach, noRef, Method } from "./presets"; // File system per preset interface PFileSystem { @@ -22,7 +22,7 @@ export async function openapi(config: Config) { ? (await convertObj(apiObject, { fetchOptions: createFetchOptions(config) })).openapi : apiObject; - const internal = { changeCase }; + const internal = { changeCase, root: () => api }; const fileSystemsMap = new Map(); const presets = createPresetIterator(config.presets, internal); @@ -50,7 +50,24 @@ export async function openapi(config: Config) { presets.traverse(api.components?.schemas, (preset) => preset.onSchema); presets.traverse(api.components?.securitySchemes, (preset) => preset.onSecurityScheme); - // TODO: add hook for operation + // Call hook for operation + forEach(api.paths, (pattern, path) => { + const methods = pick(path, [ + "get", + "put", + "post", + "delete", + "options", + "head", + "patch", + "trace", + ]); + + forEach(methods, (method, operation) => + presets.forEach((preset) => preset.onOperation(pattern, method as Method, operation, path)), + ); + }); + // TODO: add pre/post hooks presets.forEach((preset) => { @@ -73,6 +90,22 @@ export async function openapi(config: Config) { } } +function onOperation( + path: OpenAPIV3.PathItemObject, + method: Method, + fn: (operation: OpenAPIV3.OperationObject) => void, +) { + const operation = path[method]; + if (operation) { + fn(operation); + } +} + +function pick(object: T, keys: K[]): Pick { + const entries = (Object.entries(object) as [K, T[K]][]).filter(([key]) => keys.includes(key)); + return Object.fromEntries(entries) as Pick; +} + function isSwagger(input: OpenAPIV3.Document | OpenAPIV2.Document): input is OpenAPIV2.Document { return typeof (input as any)["swagger"] === "string"; } diff --git a/src/presets.ts b/src/presets.ts index 3553c44..d87d2ac 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -6,12 +6,20 @@ export interface FilesApi { addFile(name: string, content: string, options?: { overwrite?: boolean }): void; } +export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; + export interface Preset { name: string; build(filesApi: FilesApi): void; onCallback: (name: string, callback: OpenAPIV3.CallbackObject) => void; onHeader: (name: string, header: OpenAPIV3.HeaderObject) => void; onLink: (name: string, link: OpenAPIV3.LinkObject) => void; + onOperation: ( + pattern: string, + method: Method, + operation: OpenAPIV3.OperationObject, + path: OpenAPIV3.PathItemObject, + ) => void; onParameter: (name: string, parameter: OpenAPIV3.ParameterObject) => void; onRequestBody: (name: string, requestBody: OpenAPIV3.RequestBodyObject) => void; onResponse: (name: string, response: OpenAPIV3.ResponseObject) => void; @@ -25,6 +33,7 @@ const defaultPreset: Preset = { onCallback() {}, onHeader() {}, onLink() {}, + onOperation() {}, onParameter() {}, onRequestBody() {}, onResponse() {}, @@ -69,7 +78,7 @@ export function forEach( } } -function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude { +export function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude { return typeof value && !(value as any)["$ref"]; } From e55320f7aae360954e53d60b2c96b803b6c065c7 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 16:30:00 +0300 Subject: [PATCH 05/20] feat: add pre/post hooks --- lib/lib/presets/mocks/preset-options.js | 4 ++++ src/index.ts | 10 ++++++---- src/presets.ts | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/lib/presets/mocks/preset-options.js b/lib/lib/presets/mocks/preset-options.js index 93ccff0..fe95e5a 100644 --- a/lib/lib/presets/mocks/preset-options.js +++ b/lib/lib/presets/mocks/preset-options.js @@ -4,8 +4,12 @@ module.exports = (options, internal) => { return { name: "preset-options", onSchema(name, schema) { + schema.name = name; schemas.push(schema); }, + postComponents() { + console.log("POST COMPONENTS", schemas); + }, build(files) { files.addFile("schemas-count.js", "wrooong"); files.addFile("schemas-count.js", String(schemas.length), { overwrite: true }); diff --git a/src/index.ts b/src/index.ts index 2c465fc..72d28df 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import * as changeCase from "change-case"; import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; -import { createPresetIterator, Preset, FilesApi, forEach, noRef, Method } from "./presets"; +import { createPresetIterator, FilesApi, forEach, Internal, Method, Preset } from "./presets"; // File system per preset interface PFileSystem { @@ -22,7 +22,7 @@ export async function openapi(config: Config) { ? (await convertObj(apiObject, { fetchOptions: createFetchOptions(config) })).openapi : apiObject; - const internal = { changeCase, root: () => api }; + const internal: Internal = { changeCase, root: () => api }; const fileSystemsMap = new Map(); const presets = createPresetIterator(config.presets, internal); @@ -41,6 +41,7 @@ export async function openapi(config: Config) { fileSystemsMap.set(preset, system); }); + presets.forEach((preset) => preset.preComponents()); presets.traverse(api.components?.callbacks, (preset) => preset.onCallback); presets.traverse(api.components?.headers, (preset) => preset.onHeader); presets.traverse(api.components?.links, (preset) => preset.onLink); @@ -49,7 +50,9 @@ export async function openapi(config: Config) { presets.traverse(api.components?.responses, (preset) => preset.onResponse); presets.traverse(api.components?.schemas, (preset) => preset.onSchema); presets.traverse(api.components?.securitySchemes, (preset) => preset.onSecurityScheme); + presets.forEach((preset) => preset.postComponents()); + presets.forEach((preset) => preset.preOperations()); // Call hook for operation forEach(api.paths, (pattern, path) => { const methods = pick(path, [ @@ -67,8 +70,7 @@ export async function openapi(config: Config) { presets.forEach((preset) => preset.onOperation(pattern, method as Method, operation, path)), ); }); - - // TODO: add pre/post hooks + presets.forEach((preset) => preset.postOperations()); presets.forEach((preset) => { const fileSystem = fileSystemsMap.get(preset); diff --git a/src/presets.ts b/src/presets.ts index d87d2ac..110cc74 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -1,11 +1,19 @@ import path from "path"; import { OpenAPIV3 } from "openapi-types"; +import * as changeCase from "change-case"; import { PresetConfig } from "./config"; export interface FilesApi { addFile(name: string, content: string, options?: { overwrite?: boolean }): void; } +export interface Internal { + changeCase: typeof changeCase; + root(): OpenAPIV3.Document; +} + +export type PresetConstructor = (options: T, internal: Internal) => Preset; + export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; export interface Preset { @@ -25,6 +33,10 @@ export interface Preset { onResponse: (name: string, response: OpenAPIV3.ResponseObject) => void; onSchema: (name: string, schema: OpenAPIV3.SchemaObject) => void; onSecurityScheme: (name: string, securityScheme: OpenAPIV3.SecuritySchemeObject) => void; + postComponents: () => void; + postOperations: () => void; + preComponents: () => void; + preOperations: () => void; } const defaultPreset: Preset = { @@ -39,6 +51,10 @@ const defaultPreset: Preset = { onResponse() {}, onSchema() {}, onSecurityScheme() {}, + postComponents() {}, + postOperations() {}, + preComponents() {}, + preOperations() {}, }; type OptionalPreset = Partial; From edaf156ab834f37d8c83642fa6e34319e66c675f Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 17:00:30 +0300 Subject: [PATCH 06/20] feat: add filesystem conflict solver --- lib/lib/presets/mocks/preset-options.js | 11 +++-- lib/lib/presets/mocks/preset-second.js | 11 +++-- src/fs.ts | 63 +++++++++++++++++++++++++ src/index.ts | 56 +++++----------------- 4 files changed, 89 insertions(+), 52 deletions(-) create mode 100644 src/fs.ts diff --git a/lib/lib/presets/mocks/preset-options.js b/lib/lib/presets/mocks/preset-options.js index fe95e5a..2d82278 100644 --- a/lib/lib/presets/mocks/preset-options.js +++ b/lib/lib/presets/mocks/preset-options.js @@ -1,4 +1,4 @@ -module.exports = (options, internal) => { +module.exports = (options = {}, internal) => { const schemas = []; return { @@ -8,11 +8,14 @@ module.exports = (options, internal) => { schemas.push(schema); }, postComponents() { - console.log("POST COMPONENTS", schemas); + // console.log("POST COMPONENTS", schemas); }, build(files) { - files.addFile("schemas-count.js", "wrooong"); - files.addFile("schemas-count.js", String(schemas.length), { overwrite: true }); + const name = + options.fileCase === "paramCase" + ? internal.changeCase.paramCase(internal.root().info.title) + : internal.changeCase.camelCase(internal.root().info.title); + files.addFile(`${name}.json`, JSON.stringify(schemas[0].xml, null, 2)); }, }; }; diff --git a/lib/lib/presets/mocks/preset-second.js b/lib/lib/presets/mocks/preset-second.js index cc295ef..3b7378c 100644 --- a/lib/lib/presets/mocks/preset-second.js +++ b/lib/lib/presets/mocks/preset-second.js @@ -1,4 +1,9 @@ -module.exports = { - bar: 5000, - monster: "hi", +module.exports = (options = {}, { changeCase, root } = {}) => { + const { fileName = "readme" } = options; + return { + name: "preset-second", + build(files) { + files.addFile(`${fileName}.md`, `# ${changeCase.sentenceCase(root().info.title)}`); + }, + }; }; diff --git a/src/fs.ts b/src/fs.ts new file mode 100644 index 0000000..19c6259 --- /dev/null +++ b/src/fs.ts @@ -0,0 +1,63 @@ +import { FilesApi } from "./presets"; + +// File system per preset +interface VirtualFileSystem { + files: Map; + api: FilesApi; +} + +export class SeparatedFileSystem { + map = new Map(); + + createFor(key: Key) { + const files = new Map(); + const api: FilesApi = { + addFile(name, content, { overwrite } = {}) { + if (files.has(name) && !overwrite) { + return; + } + files.set(name, content); + }, + }; + const system: VirtualFileSystem = { files, api }; + this.map.set(key, system); + } + + /** + * @throws ReferenceError + */ + get(key: Key): VirtualFileSystem { + const fileSystem = this.map.get(key); + if (!fileSystem) + throw new ReferenceError(`Cannot find fileSystem for "${key.name}". Unexpected error`); + + return fileSystem; + } + + /** + * @throws Error + */ + combineTogether(): Map { + const files = new Map(); + + for (const [key, fs] of this.map.entries()) { + for (const [name, content] of fs.files.entries()) { + const exists = files.get(name); // TODO: normalize path + if (exists) { + throw new Error( + `The file with the name "${name}" created by "${exists.createdBy}", but "${key.name}" wants to create a file with the same name. Change options for these presets to solve conflict.`, + ); + } + files.set(name, { name, createdBy: key.name, content }); + } + } + + return files; + } +} + +interface VFile { + name: string; + createdBy: string; + content: string; +} diff --git a/src/index.ts b/src/index.ts index 72d28df..be2d291 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,13 +6,8 @@ import * as changeCase from "change-case"; import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; -import { createPresetIterator, FilesApi, forEach, Internal, Method, Preset } from "./presets"; - -// File system per preset -interface PFileSystem { - files: Map; - api: FilesApi; -} +import { createPresetIterator, forEach, Internal, Method, Preset } from "./presets"; +import { SeparatedFileSystem } from "./fs"; export async function openapi(config: Config) { assertDirectory(config.outputDir); @@ -23,23 +18,11 @@ export async function openapi(config: Config) { : apiObject; const internal: Internal = { changeCase, root: () => api }; - const fileSystemsMap = new Map(); + const fileSystems = new SeparatedFileSystem(); const presets = createPresetIterator(config.presets, internal); // Create files API for each preset - presets.forEach((preset) => { - const files = new Map(); - const api: FilesApi = { - addFile(name, content, { overwrite } = {}) { - if (files.has(name) && !overwrite) { - return; - } - files.set(name, content); - }, - }; - const system: PFileSystem = { files, api }; - fileSystemsMap.set(preset, system); - }); + presets.forEach((preset) => fileSystems.createFor(preset)); presets.forEach((preset) => preset.preComponents()); presets.traverse(api.components?.callbacks, (preset) => preset.onCallback); @@ -72,35 +55,18 @@ export async function openapi(config: Config) { }); presets.forEach((preset) => preset.postOperations()); - presets.forEach((preset) => { - const fileSystem = fileSystemsMap.get(preset); - if (!fileSystem) { - throw new ReferenceError( - `Cannot find fileSystem for preset "${preset.name}". Unexpected error`, - ); - } - preset.build(fileSystem.api); - }); + // Finish building and create files in Virtual file system + presets.forEach((preset) => preset.build(fileSystems.get(preset).api)); // TODO: merge all filesystems into single one // TODO: validate that files has no conflicts // TODO: save files to FS - for (const [preset, fs] of fileSystemsMap.entries()) { - const files = Object.fromEntries(fs.files.entries()); - console.log(`File system of preset "${preset.name}":`, files); - } -} - -function onOperation( - path: OpenAPIV3.PathItemObject, - method: Method, - fn: (operation: OpenAPIV3.OperationObject) => void, -) { - const operation = path[method]; - if (operation) { - fn(operation); - } + // for (const [preset, fs] of fileSystems.entries()) { + // const files = Object.fromEntries(fs.files.entries()); + // console.log(`File system of preset "${preset.name}":`, files); + // } + console.log(Object.fromEntries(fileSystems.combineTogether().entries())); } function pick(object: T, keys: K[]): Pick { From c5d1b20c6ecf0b0ce3eb473a583ee8546681321b Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 22:34:38 +0300 Subject: [PATCH 07/20] feat: save files to fs --- src/index.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index be2d291..3540fca 100644 --- a/src/index.ts +++ b/src/index.ts @@ -58,15 +58,9 @@ export async function openapi(config: Config) { // Finish building and create files in Virtual file system presets.forEach((preset) => preset.build(fileSystems.get(preset).api)); - // TODO: merge all filesystems into single one - // TODO: validate that files has no conflicts - // TODO: save files to FS - - // for (const [preset, fs] of fileSystems.entries()) { - // const files = Object.fromEntries(fs.files.entries()); - // console.log(`File system of preset "${preset.name}":`, files); - // } - console.log(Object.fromEntries(fileSystems.combineTogether().entries())); + for (const file of fileSystems.combineTogether().values()) { + fs.writeFileSync(path.join(config.outputDir, file.name), file.content); + } } function pick(object: T, keys: K[]): Pick { From 5f044fd23fc7d03f0402750b5e00fa12327fdfa4 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 23:07:07 +0300 Subject: [PATCH 08/20] v2.0.0-1 --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f6ee109..978a989 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "1.0.0", + "version": "2.0.0-1", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./src/index.js", "types": "./src/index.d.ts", @@ -24,9 +24,9 @@ "url": "https://github.com/openapi/openapi/issues" }, "scripts": { - "test": "jest --testPathIgnorePatterns package.test", - "prepublishOnly": "yarn test --passWIthNoTests && yarn test-pack", - "test-pack": "yarn jest -i ./src/package.test.js", + "test": "jest --testPathIgnorePatterns package.test --passWithNoTests", + "prepublishOnly": "yarn test --passWithNoTests && yarn test-pack", + "test-pack": "yarn jest --passWithNoTests -i ./src/package.test.js", "build": "babel -d ./dist --extensions '.ts' ./src" }, "files": [ From 9b6bb8a6a55f7b5781ece0840a99aae5d5d10412 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 23:27:47 +0300 Subject: [PATCH 09/20] fix: bin and main path to files in package --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 978a989..2cac47d 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "openapi", - "version": "2.0.0-1", + "version": "2.0.0-2", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", - "main": "./src/index.js", - "types": "./src/index.d.ts", + "main": "./dist/index.js", + "--types": "./src/index.d.ts", "repository": "openapijs/openapi", "contributors": [ "e.fedotov ", @@ -41,7 +41,7 @@ "request.js" ], "bin": { - "openapi": "./src/cli/index.js" + "openapi": "./dist/cli/index.js" }, "dependencies": { "@jsdevtools/ono": "^7.1.3", From e28c63fe35bfb0926ffc491aa45470c0b7589e28 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 23:29:28 +0300 Subject: [PATCH 10/20] fix: add hashbang to cli js file --- src/cli/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cli/index.ts b/src/cli/index.ts index 302ac1b..7336ed2 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -1,3 +1,5 @@ +#!/usr/bin/env node + import { program } from "commander"; import { cosmiconfigSync } from "cosmiconfig"; import { openapi } from ".."; From 37922f627f3197382e127e3fc7fdaf2ef4879abd Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Mon, 22 Feb 2021 23:32:18 +0300 Subject: [PATCH 11/20] fix: dist files should be in the package --- .gitignore | 1 + package.json | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8a22709..bb68595 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ ttt.js */**/code.d.ts examples/**/apidist dist +openapi-2.0.0-3.tgz diff --git a/package.json b/package.json index 2cac47d..16f7d6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-2", + "version": "2.0.0-4", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "--types": "./src/index.d.ts", @@ -38,7 +38,8 @@ "src/cli/index.js", "src/index.d.ts", "src/index.js", - "request.js" + "request.js", + "dist/" ], "bin": { "openapi": "./dist/cli/index.js" From 516c9322b6b27c88fb2039021b4f8974616877f6 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Tue, 23 Feb 2021 00:06:40 +0300 Subject: [PATCH 12/20] feat: add ref checker and resolver --- .gitignore | 33 +++++++++++++ package.json | 2 +- src/index.ts | 16 ++++++- src/object-path.test.ts | 103 ++++++++++++++++++++++++++++++++++++++++ src/object-path.ts | 20 ++++++++ src/presets.ts | 3 ++ 6 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 src/object-path.test.ts create mode 100644 src/object-path.ts diff --git a/.gitignore b/.gitignore index bb68595..3e27555 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,36 @@ ttt.js examples/**/apidist dist openapi-2.0.0-3.tgz + +# Created by https://www.toptal.com/developers/gitignore/api/macos +# Edit at https://www.toptal.com/developers/gitignore?templates=macos + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# End of https://www.toptal.com/developers/gitignore/api/macos diff --git a/package.json b/package.json index 16f7d6f..a8ccad0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-4", + "version": "2.0.0-5", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "--types": "./src/index.d.ts", diff --git a/src/index.ts b/src/index.ts index 3540fca..1cfe054 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; import { createPresetIterator, forEach, Internal, Method, Preset } from "./presets"; import { SeparatedFileSystem } from "./fs"; +import { getByPath } from "./object-path"; export async function openapi(config: Config) { assertDirectory(config.outputDir); @@ -17,7 +18,20 @@ export async function openapi(config: Config) { ? (await convertObj(apiObject, { fetchOptions: createFetchOptions(config) })).openapi : apiObject; - const internal: Internal = { changeCase, root: () => api }; + function resolveRef(path: string): unknown | null { + if (path[0] !== "#") { + throw new TypeError(`Passed non local reference ${path}. Unexpected error`); + } + return getByPath(path.substr(1), api); + } + + function isRef(object: unknown | Record): boolean { + return ( + typeof object === "object" && object !== null && typeof (object as any)["$ref"] === "string" + ); + } + + const internal: Internal = { changeCase, root: () => api, isRef, resolveRef }; const fileSystems = new SeparatedFileSystem(); const presets = createPresetIterator(config.presets, internal); diff --git a/src/object-path.test.ts b/src/object-path.test.ts new file mode 100644 index 0000000..33ec4cd --- /dev/null +++ b/src/object-path.test.ts @@ -0,0 +1,103 @@ +import { getByPath } from "./object-path"; + +const root = { + theA: { + theB: { + theC: 1, + }, + }, +}; + +test("should resolve first level", () => { + expect(getByPath("theA", root)).toBe(root.theA); +}); + +test("should resolve second level", () => { + expect(getByPath("theA/theB", root)).toBe(root.theA.theB); +}); + +test("should resolve third level", () => { + expect(getByPath("theA/theB/theC", root)).toBe(root.theA.theB.theC); +}); + +test("should return null if not found", () => { + expect(getByPath("theA/theB/theZ", root)).toBe(null); + expect(getByPath("theA/theZ/theC", root)).toBe(null); + expect(getByPath("theZ/theB/theC", root)).toBe(null); + expect(getByPath("theA/theZ", root)).toBe(null); + expect(getByPath("theZ/theB", root)).toBe(null); + expect(getByPath("theZ", root)).toBe(null); +}); + +test("should return the same object if passed empty string", () => { + expect(getByPath("", root)).toBe(root); +}); + +test("should return the same object if passed /", () => { + expect(getByPath("/", root)).toBe(root); +}); + +test("should skip duplicates /", () => { + expect(getByPath("////", root)).toBe(root); + expect(getByPath("theA///theB", root)).toBe(root.theA.theB); + expect(getByPath("theA///theB", root)).toBe(root.theA.theB); + expect(getByPath("theA//theB////theC", root)).toBe(root.theA.theB.theC); +}); + +test("should skip leading /", () => { + expect(getByPath("/theA", root)).toBe(root.theA); + expect(getByPath("/theA//theB", root)).toBe(root.theA.theB); + expect(getByPath("/theA//theB////theC", root)).toBe(root.theA.theB.theC); +}); + +test("should skip trailing /", () => { + expect(getByPath("theA/", root)).toBe(root.theA); + expect(getByPath("theA//theB/", root)).toBe(root.theA.theB); + expect(getByPath("/theA//theB////theC/", root)).toBe(root.theA.theB.theC); +}); + +test("realistic openapi refs", () => { + const openapi = { + components: { + requestBodies: { + Register: { + required: true, + content: { + "application/json": { + schema: { + required: ["email"], + properties: { + email: { + type: "string", + }, + }, + }, + }, + }, + }, + }, + schemas: { + SessionUser: { + description: "Current user in a session", + type: "object", + required: ["firstName", "lastName"], + properties: { + firstName: { + type: "string", + }, + lastName: { + type: "string", + }, + }, + }, + }, + }, + }; + + expect(getByPath("/components/requestBodies/Register", openapi)).toBe( + openapi.components.requestBodies.Register, + ); + expect(getByPath("/components/schemas/SessionUser", openapi)).toBe( + openapi.components.schemas.SessionUser, + ); +}); diff --git a/src/object-path.ts b/src/object-path.ts new file mode 100644 index 0000000..01f85b8 --- /dev/null +++ b/src/object-path.ts @@ -0,0 +1,20 @@ +export function getByPath(path: string, object: object): unknown | null { + const chunks = path + .trim() + .split("/") + .map((chunk) => chunk.trim()) + .filter((chunk) => chunk.length > 0); + + let level = object; + while (chunks.length) { + const key = chunks.shift() as string; + const value = (level as any)[key]; + if (value) { + level = value; + } else { + return null; + } + } + + return level; +} diff --git a/src/presets.ts b/src/presets.ts index 110cc74..be0e8d1 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -1,6 +1,7 @@ import path from "path"; import { OpenAPIV3 } from "openapi-types"; import * as changeCase from "change-case"; +import get from "lodash.get"; import { PresetConfig } from "./config"; export interface FilesApi { @@ -10,6 +11,8 @@ export interface FilesApi { export interface Internal { changeCase: typeof changeCase; root(): OpenAPIV3.Document; + resolveRef(ref: string): unknown | null; + isRef(object: unknown): boolean; } export type PresetConstructor = (options: T, internal: Internal) => Preset; From c261e059ad848d5673f75e392a731c1245c05f36 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Tue, 23 Feb 2021 00:16:46 +0300 Subject: [PATCH 13/20] fix: build before publish --- lib/lib/presets/mocks/preset-options.js | 1 + package.json | 4 ++-- src/presets.ts | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/lib/presets/mocks/preset-options.js b/lib/lib/presets/mocks/preset-options.js index 2d82278..688d2f4 100644 --- a/lib/lib/presets/mocks/preset-options.js +++ b/lib/lib/presets/mocks/preset-options.js @@ -1,5 +1,6 @@ module.exports = (options = {}, internal) => { const schemas = []; + console.log(internal); return { name: "preset-options", diff --git a/package.json b/package.json index a8ccad0..9b6d135 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-5", + "version": "2.0.0-6", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "--types": "./src/index.d.ts", @@ -25,7 +25,7 @@ }, "scripts": { "test": "jest --testPathIgnorePatterns package.test --passWithNoTests", - "prepublishOnly": "yarn test --passWithNoTests && yarn test-pack", + "prepublishOnly": "yarn build && yarn test --passWithNoTests && yarn test-pack", "test-pack": "yarn jest --passWithNoTests -i ./src/package.test.js", "build": "babel -d ./dist --extensions '.ts' ./src" }, diff --git a/src/presets.ts b/src/presets.ts index be0e8d1..d1a30b2 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -1,7 +1,6 @@ import path from "path"; import { OpenAPIV3 } from "openapi-types"; import * as changeCase from "change-case"; -import get from "lodash.get"; import { PresetConfig } from "./config"; export interface FilesApi { From 5c24836d0faf9a8f4b877ebb7741737787b312c1 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Tue, 23 Feb 2021 00:25:04 +0300 Subject: [PATCH 14/20] fix(object-path): check for undefined not for falsy --- package.json | 2 +- src/object-path.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9b6d135..5d7ac59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-6", + "version": "2.0.0-8", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "--types": "./src/index.d.ts", diff --git a/src/object-path.ts b/src/object-path.ts index 01f85b8..287a999 100644 --- a/src/object-path.ts +++ b/src/object-path.ts @@ -9,7 +9,7 @@ export function getByPath(path: string, object: object): unknown | null { while (chunks.length) { const key = chunks.shift() as string; const value = (level as any)[key]; - if (value) { + if (value !== undefined) { level = value; } else { return null; From 9eda090ef9928231e5c2988d954069d5becda988 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 25 Feb 2021 21:41:50 +0300 Subject: [PATCH 15/20] feat: add types --- index.d.ts | 1 + package.json | 18 ++++++------------ src/index.ts | 15 +++++++++++++-- src/presets.ts | 16 ++++++++-------- tsconfig.build.json | 9 +++++++++ tsconfig.json | 5 +---- typings/swagger2openapi.d.ts | 2 +- yarn.lock | 15 ++++++++++++++- 8 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 index.d.ts create mode 100644 tsconfig.build.json diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..ba16237 --- /dev/null +++ b/index.d.ts @@ -0,0 +1 @@ +export * from "./dist"; diff --git a/package.json b/package.json index 5d7ac59..71bde86 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "openapi", - "version": "2.0.0-8", + "version": "2.0.0-9", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", - "--types": "./src/index.d.ts", + "types": "./dist/index.d.ts", "repository": "openapijs/openapi", "contributors": [ "e.fedotov ", @@ -27,18 +27,11 @@ "test": "jest --testPathIgnorePatterns package.test --passWithNoTests", "prepublishOnly": "yarn build && yarn test --passWithNoTests && yarn test-pack", "test-pack": "yarn jest --passWithNoTests -i ./src/package.test.js", - "build": "babel -d ./dist --extensions '.ts' ./src" + "build": "yarn build:types && yarn build:code", + "build:code": "babel -d ./dist --extensions '.ts' ./src", + "build:types": "dts-bundle-generator -o ./dist/index.d.ts ./src/index.ts" }, "files": [ - "src/common", - "src/lib", - "!src/lib/presets/mocks", - "src/v2/index.js", - "src/v3/index.js", - "src/cli/index.js", - "src/index.d.ts", - "src/index.js", - "request.js", "dist/" ], "bin": { @@ -74,6 +67,7 @@ "demo-swagger-to-js-preset": "^0.2.0", "demo2-swagger-to-js-preset": "^0.1.0", "demo3-swagger-to-js-preset": "^0.1.0", + "dts-bundle-generator": "^5.7.0", "eslint": "^6.8.0", "eslint-plugin-prettier": "^3.1.3", "husky": "^4.2.5", diff --git a/src/index.ts b/src/index.ts index 1cfe054..7941088 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,10 +6,21 @@ import * as changeCase from "change-case"; import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; -import { createPresetIterator, forEach, Internal, Method, Preset } from "./presets"; +import { + createPresetIterator, + FilesApi, + forEach, + Internal, + Method, + Preset, + PresetConstructor, + PresetCore, +} from "./presets"; import { SeparatedFileSystem } from "./fs"; import { getByPath } from "./object-path"; +export { PresetConstructor, Preset, OpenAPIV3, Internal, FilesApi }; + export async function openapi(config: Config) { assertDirectory(config.outputDir); const content = await readApiFile(config); @@ -32,7 +43,7 @@ export async function openapi(config: Config) { } const internal: Internal = { changeCase, root: () => api, isRef, resolveRef }; - const fileSystems = new SeparatedFileSystem(); + const fileSystems = new SeparatedFileSystem(); const presets = createPresetIterator(config.presets, internal); // Create files API for each preset diff --git a/src/presets.ts b/src/presets.ts index d1a30b2..44453a8 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -14,11 +14,11 @@ export interface Internal { isRef(object: unknown): boolean; } -export type PresetConstructor = (options: T, internal: Internal) => Preset; +export type PresetConstructor = (options: T, internal: Internal) => PresetCore; export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; -export interface Preset { +export interface PresetCore { name: string; build(filesApi: FilesApi): void; onCallback: (name: string, callback: OpenAPIV3.CallbackObject) => void; @@ -41,7 +41,7 @@ export interface Preset { preOperations: () => void; } -const defaultPreset: Preset = { +const defaultPreset: PresetCore = { name: "(default)", build() {}, onCallback() {}, @@ -59,10 +59,10 @@ const defaultPreset: Preset = { preOperations() {}, }; -type OptionalPreset = Partial; +export type Preset = Partial; export function createPresetIterator(list: PresetConfig[], internal: unknown) { - const presets: Preset[] = []; + const presets: PresetCore[] = []; list.forEach((presetConfigName) => { const [name, readPreset] = loadPreset(presetConfigName, internal); @@ -70,13 +70,13 @@ export function createPresetIterator(list: PresetConfig[], internal: unknown) { }); return { - forEach(fn: (preset: Preset) => void) { + forEach(fn: (preset: PresetCore) => void) { presets.forEach((preset) => fn(preset)); }, traverse( schemas: Record | undefined, fn: ( - preset: Preset, + preset: PresetCore, ) => (name: string, item: Exclude) => void, ) { forEach(schemas, (name, schema) => { @@ -100,7 +100,7 @@ export function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude return typeof value && !(value as any)["$ref"]; } -function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, OptionalPreset] { +function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, Preset] { if (Array.isArray(presetConfig)) { const [name, options] = presetConfig; if (typeof name !== "string") { diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..41db1f7 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "./dist", + "emitDeclarationOnly": true, + "inlineSourceMap": true + } +} diff --git a/tsconfig.json b/tsconfig.json index c300890..dabd63a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,11 @@ { "compilerOptions": { - "declaration": true, - "emitDeclarationOnly": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "lib": ["es2020", "ESNext"], "module": "commonjs", "moduleResolution": "Node", "noImplicitAny": true, - "outDir": "./dist", "resolveJsonModule": true, "skipLibCheck": true, "strict": true, @@ -16,6 +13,6 @@ "target": "es2020", "types": ["jest", "node", "./typings/swagger2openapi"] }, - "include": ["src/**/*"], + // "include": ["src/**/*"], "exclude": ["node_modules", "**/*.test.ts", "**/*.spec.ts"] } diff --git a/typings/swagger2openapi.d.ts b/typings/swagger2openapi.d.ts index 0b48323..1efe5db 100644 --- a/typings/swagger2openapi.d.ts +++ b/typings/swagger2openapi.d.ts @@ -1,6 +1,6 @@ declare module "swagger2openapi" { import { OpenAPIV3 } from "openapi-types"; - declare function convertObj( + export function convertObj( swagger: object, options?: { fetchOptions?: Record; diff --git a/yarn.lock b/yarn.lock index 6112eb5..9e61bef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2339,6 +2339,14 @@ dot-case@^3.0.3: no-case "^3.0.3" tslib "^1.10.0" +dts-bundle-generator@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/dts-bundle-generator/-/dts-bundle-generator-5.7.0.tgz#914b90b96dfb19dd7b9696567c02b6fe71595b9a" + integrity sha512-sSFtdHL/G8y90wWRB8HCWPwdXXbToOuPLgON1q8f1+vXuiDdRez12M4RAf770dLWb05ekaFdYYGaT68jUU52zw== + dependencies: + typescript ">=3.0.1" + yargs "^15.3.1" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -5464,6 +5472,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript@>=3.0.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.2.tgz#1450f020618f872db0ea17317d16d8da8ddb8c4c" + integrity sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ== + typescript@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" @@ -5776,7 +5789,7 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== -yargs@^15.4.1: +yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== From 1496ac2c6b63c226c39f84b15759353e3dcb7959 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 25 Feb 2021 22:01:39 +0300 Subject: [PATCH 16/20] fix: preset constructor should return partial preset --- package.json | 2 +- src/presets.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71bde86..bb60661 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-9", + "version": "2.0.0-10", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/presets.ts b/src/presets.ts index 44453a8..4b514ef 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -14,7 +14,7 @@ export interface Internal { isRef(object: unknown): boolean; } -export type PresetConstructor = (options: T, internal: Internal) => PresetCore; +export type PresetConstructor = (options: T, internal: Internal) => Preset; export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; From 426608753ae6a33a5a0144112446519707a029a3 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 25 Feb 2021 22:07:25 +0300 Subject: [PATCH 17/20] fix: preset constructor should be generic --- package.json | 6 +++--- src/presets.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index bb60661..ae6ceb0 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "openapi", - "version": "2.0.0-10", + "version": "2.0.0-11", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "types": "./dist/index.d.ts", "repository": "openapijs/openapi", "contributors": [ - "e.fedotov ", - "Sergey Sova (https://sova.dev)" + "Sergey Sova (https://sova.dev)", + "e.fedotov " ], "license": "MIT", "keywords": [ diff --git a/src/presets.ts b/src/presets.ts index 4b514ef..56e81e3 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -14,7 +14,7 @@ export interface Internal { isRef(object: unknown): boolean; } -export type PresetConstructor = (options: T, internal: Internal) => Preset; +export type PresetConstructor = (options: T, internal: Internal) => Preset; export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; From 1d7cdf07153effcb18eb33bdcf58b30ff1f5bc7e Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 25 Feb 2021 23:01:37 +0300 Subject: [PATCH 18/20] feat: export status codes --- package.json | 2 +- src/index.ts | 2 + src/status.ts | 259 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 262 insertions(+), 1 deletion(-) create mode 100644 src/status.ts diff --git a/package.json b/package.json index ae6ceb0..ecc2511 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-11", + "version": "2.0.0-12", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/index.ts b/src/index.ts index 7941088..1a3fae3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,6 +19,8 @@ import { import { SeparatedFileSystem } from "./fs"; import { getByPath } from "./object-path"; +export { status } from "./status"; + export { PresetConstructor, Preset, OpenAPIV3, Internal, FilesApi }; export async function openapi(config: Config) { diff --git a/src/status.ts b/src/status.ts new file mode 100644 index 0000000..02dba51 --- /dev/null +++ b/src/status.ts @@ -0,0 +1,259 @@ +export const status = { + // 100 Continue + // [[RFC7231, Section 6.2.1](https://tools.ietf.org/html/rfc7231#section-6.2.1)] + 100: { code: "CONTINUE", label: "Continue" }, + + // 101 Switching Protocols + // [[RFC7231, Section 6.2.2](https://tools.ietf.org/html/rfc7231#section-6.2.2)] + 101: { code: "SWITCHING_PROTOCOLS", label: "Switching Protocols" }, + + // 102 Processing + // [[RFC2518](https://tools.ietf.org/html/rfc2518)] + 102: { code: "PROCESSING", label: "Processing" }, + + // 200 OK + // [[RFC7231, Section 6.3.1](https://tools.ietf.org/html/rfc7231#section-6.3.1)] + 200: { code: "OK", label: "OK" }, + + // 201 Created + // [[RFC7231, Section 6.3.2](https://tools.ietf.org/html/rfc7231#section-6.3.2)] + 201: { code: "CREATED", label: "Created" }, + + // 202 Accepted + // [[RFC7231, Section 6.3.3](https://tools.ietf.org/html/rfc7231#section-6.3.3)] + 202: { code: "ACCEPTED", label: "Accepted" }, + + // 203 Non-Authoritative Information + // [[RFC7231, Section 6.3.4](https://tools.ietf.org/html/rfc7231#section-6.3.4)] + 203: { + code: "NON_AUTHORITATIVE_INFORMATION", + label: "Non Authoritative Information", + }, + + // 204 No Content + // [[RFC7231, Section 6.3.5](https://tools.ietf.org/html/rfc7231#section-6.3.5)] + 204: { code: "NO_CONTENT", label: "No Content" }, + + // 205 Reset Content + // [[RFC7231, Section 6.3.6](https://tools.ietf.org/html/rfc7231#section-6.3.6)] + 205: { code: "RESET_CONTENT", label: "Reset Content" }, + + // 206 Partial Content + // [[RFC7233, Section 4.1](https://tools.ietf.org/html/rfc7233#section-4.1)] + 206: { code: "PARTIAL_CONTENT", label: "Partial Content" }, + + // 207 Multi-Status + // [[RFC4918](https://tools.ietf.org/html/rfc4918)] + 207: { code: "MULTI_STATUS", label: "Multi-Status" }, + + // 208 Already Reported + // [[RFC5842](https://tools.ietf.org/html/rfc5842)] + 208: { code: "ALREADY_REPORTED", label: "Already Reported" }, + + // 226 IM Used + // [[RFC3229](https://tools.ietf.org/html/rfc3229)] + 226: { code: "IM_USED", label: "IM Used" }, + + // 300 Multiple Choices + // [[RFC7231, Section 6.4.1](https://tools.ietf.org/html/rfc7231#section-6.4.1)] + 300: { code: "MULTIPLE_CHOICES", label: "Multiple Choices" }, + + // 301 Moved Permanently + // [[RFC7231, Section 6.4.2](https://tools.ietf.org/html/rfc7231#section-6.4.2)] + 301: { code: "MOVED_PERMANENTLY", label: "Moved Permanently" }, + + // 302 Found + // [[RFC7231, Section 6.4.3](https://tools.ietf.org/html/rfc7231#section-6.4.3)] + 302: { code: "FOUND", label: "Found" }, + + // 303 See Other + // [[RFC7231, Section 6.4.4](https://tools.ietf.org/html/rfc7231#section-6.4.4)] + 303: { code: "SEE_OTHER", label: "See Other" }, + + // 304 Not Modified + // [[RFC7232, Section 4.1](https://tools.ietf.org/html/rfc7232#section-4.1)] + 304: { code: "NOT_MODIFIED", label: "Not Modified" }, + + // 305 Use Proxy + // [[RFC7231, Section 6.4.5](https://tools.ietf.org/html/rfc7231#section-6.4.5)] + 305: { code: "USE_PROXY", label: "Use Proxy" }, + + // 307 Temporary Redirect + // [[RFC7231, Section 6.4.7](https://tools.ietf.org/html/rfc7231#section-6.4.7)] + 307: { code: "TEMPORARY_REDIRECT", label: "Temporary Redirect" }, + + // 308 Permanent Redirect + // [[RFC7238](https://tools.ietf.org/html/rfc7238)] + 308: { code: "PERMANENT_REDIRECT", label: "Permanent Redirect" }, + + // 400 Bad Request + // [[RFC7231, Section 6.5.1](https://tools.ietf.org/html/rfc7231#section-6.5.1)] + 400: { code: "BAD_REQUEST", label: "Bad Request" }, + + // 401 Unauthorized + // [[RFC7235, Section 3.1](https://tools.ietf.org/html/rfc7235#section-3.1)] + 401: { code: "UNAUTHORIZED", label: "Unauthorized" }, + + // 402 Payment Required + // [[RFC7231, Section 6.5.2](https://tools.ietf.org/html/rfc7231#section-6.5.2)] + 402: { code: "PAYMENT_REQUIRED", label: "Payment Required" }, + + // 403 Forbidden + // [[RFC7231, Section 6.5.3](https://tools.ietf.org/html/rfc7231#section-6.5.3)] + 403: { code: "FORBIDDEN", label: "Forbidden" }, + + // 404 Not Found + // [[RFC7231, Section 6.5.4](https://tools.ietf.org/html/rfc7231#section-6.5.4)] + 404: { code: "NOT_FOUND", label: "Not Found" }, + + // 405 Method Not Allowed + // [[RFC7231, Section 6.5.5](https://tools.ietf.org/html/rfc7231#section-6.5.5)] + 405: { code: "METHOD_NOT_ALLOWED", label: "Method Not Allowed" }, + + // 406 Not Acceptable + // [[RFC7231, Section 6.5.6](https://tools.ietf.org/html/rfc7231#section-6.5.6)] + 406: { code: "NOT_ACCEPTABLE", label: "Not Acceptable" }, + + // 407 Proxy Authentication Required + // [[RFC7235, Section 3.2](https://tools.ietf.org/html/rfc7235#section-3.2)] + 407: { + code: "PROXY_AUTHENTICATION_REQUIRED", + label: "Proxy Authentication Required", + }, + + // 408 Request Timeout + // [[RFC7231, Section 6.5.7](https://tools.ietf.org/html/rfc7231#section-6.5.7)] + 408: { code: "REQUEST_TIMEOUT", label: "Request Timeout" }, + + // 409 Conflict + // [[RFC7231, Section 6.5.8](https://tools.ietf.org/html/rfc7231#section-6.5.8)] + 409: { code: "CONFLICT", label: "Conflict" }, + + // 410 Gone + // [[RFC7231, Section 6.5.9](https://tools.ietf.org/html/rfc7231#section-6.5.9)] + 410: { code: "GONE", label: "Gone" }, + + // 411 Length Required + // [[RFC7231, Section 6.5.10](https://tools.ietf.org/html/rfc7231#section-6.5.10)] + 411: { code: "LENGTH_REQUIRED", label: "Length Required" }, + + // 412 Precondition Failed + // [[RFC7232, Section 4.2](https://tools.ietf.org/html/rfc7232#section-4.2)] + 412: { code: "PRECONDITION_FAILED", label: "Precondition Failed" }, + + // 413 Payload Too Large + // [[RFC7231, Section 6.5.11](https://tools.ietf.org/html/rfc7231#section-6.5.11)] + 413: { code: "PAYLOAD_TOO_LARGE", label: "Payload Too Large" }, + + // 414 URI Too Long + // [[RFC7231, Section 6.5.12](https://tools.ietf.org/html/rfc7231#section-6.5.12)] + 414: { code: "URI_TOO_LONG", label: "URI Too Long" }, + + // 415 Unsupported Media Type + // [[RFC7231, Section 6.5.13](https://tools.ietf.org/html/rfc7231#section-6.5.13)] + 415: { code: "UNSUPPORTED_MEDIA_TYPE", label: "Unsupported Media Type" }, + + // 416 Range Not Satisfiable + // [[RFC7233, Section 4.4](https://tools.ietf.org/html/rfc7233#section-4.4)] + 416: { code: "RANGE_NOT_SATISFIABLE", label: "Range Not Satisfiable" }, + + // 417 Expectation Failed + // [[RFC7231, Section 6.5.14](https://tools.ietf.org/html/rfc7231#section-6.5.14)] + 417: { code: "EXPECTATION_FAILED", label: "Expectation Failed" }, + + // 418 I'm a teapot + // [curiously not registered by IANA but [RFC2324](https://tools.ietf.org/html/rfc2324)] + 418: { code: "IM_A_TEAPOT", label: "I'm a teapot" }, + + // 421 Misdirected Request + // [RFC7540, Section 9.1.2](http://tools.ietf.org/html/rfc7540#section-9.1.2) + 421: { code: "MISDIRECTED_REQUEST", label: "Misdirected Request" }, + + // 422 Unprocessable Entity + // [[RFC4918](https://tools.ietf.org/html/rfc4918)] + 422: { code: "UNPROCESSABLE_ENTITY", label: "Unprocessable Entity" }, + + // 423 Locked + // [[RFC4918](https://tools.ietf.org/html/rfc4918)] + 423: { code: "LOCKED", label: "Locked" }, + + // 424 Failed Dependency + // [[RFC4918](https://tools.ietf.org/html/rfc4918)] + 424: { code: "FAILED_DEPENDENCY", label: "Failed Dependency" }, + + // 426 Upgrade Required + // [[RFC7231, Section 6.5.15](https://tools.ietf.org/html/rfc7231#section-6.5.15)] + 426: { code: "UPGRADE_REQUIRED", label: "Upgrade Required" }, + + // 428 Precondition Required + // [[RFC6585](https://tools.ietf.org/html/rfc6585)] + 428: { code: "PRECONDITION_REQUIRED", label: "Precondition Required" }, + + // 429 Too Many Requests + // [[RFC6585](https://tools.ietf.org/html/rfc6585)] + 429: { code: "TOO_MANY_REQUESTS", label: "Too Many Requests" }, + + // 431 Request Header Fields Too Large + // [[RFC6585](https://tools.ietf.org/html/rfc6585)] + 431: { + code: "REQUEST_HEADER_FIELDS_TOO_LARGE", + label: "Request Header Fields Too Large", + }, + + // 451 Unavailable For Legal Reasons + // [[RFC7725](http://tools.ietf.org/html/rfc7725)] + 451: { + code: "UNAVAILABLE_FOR_LEGAL_REASONS", + label: "Unavailable For Legal Reasons", + }, + + // 500 Internal Server Error + // [[RFC7231, Section 6.6.1](https://tools.ietf.org/html/rfc7231#section-6.6.1)] + 500: { code: "INTERNAL_SERVER_ERROR", label: "Internal Server Error" }, + + // 501 Not Implemented + // [[RFC7231, Section 6.6.2](https://tools.ietf.org/html/rfc7231#section-6.6.2)] + 501: { code: "NOT_IMPLEMENTED", label: "Not Implemented" }, + + // 502 Bad Gateway + // [[RFC7231, Section 6.6.3](https://tools.ietf.org/html/rfc7231#section-6.6.3)] + 502: { code: "BAD_GATEWAY", label: "Bad Gateway" }, + + // 503 Service Unavailable + // [[RFC7231, Section 6.6.4](https://tools.ietf.org/html/rfc7231#section-6.6.4)] + 503: { code: "SERVICE_UNAVAILABLE", label: "Service Unavailable" }, + + // 504 Gateway Timeout + // [[RFC7231, Section 6.6.5](https://tools.ietf.org/html/rfc7231#section-6.6.5)] + 504: { code: "GATEWAY_TIMEOUT", label: "Gateway Timeout" }, + + // 505 HTTP Version Not Supported + // [[RFC7231, Section 6.6.6](https://tools.ietf.org/html/rfc7231#section-6.6.6)] + 505: { + code: "HTTP_VERSION_NOT_SUPPORTED", + label: "HTTP Version Not Supported", + }, + + // 506 Variant Also Negotiates + // [[RFC2295](https://tools.ietf.org/html/rfc2295)] + 506: { code: "VARIANT_ALSO_NEGOTIATES", label: "Variant Also Negotiates" }, + + // 507 Insufficient Storage + // [[RFC4918](https://tools.ietf.org/html/rfc4918)] + 507: { code: "INSUFFICIENT_STORAGE", label: "Insufficient Storage" }, + + // 508 Loop Detected + // [[RFC5842](https://tools.ietf.org/html/rfc5842)] + 508: { code: "LOOP_DETECTED", label: "Loop Detected" }, + + // 510 Not Extended + // [[RFC2774](https://tools.ietf.org/html/rfc2774)] + 510: { code: "NOT_EXTENDED", label: "Not Extended" }, + + // 511 Network Authentication Required + // [[RFC6585](https://tools.ietf.org/html/rfc6585)] + 511: { + code: "NETWORK_AUTHENTICATION_REQUIRED", + label: "Network Authentication Required", + }, +}; From 8f648d5ed911f962c2a5ddfb05b2df9023fb40ad Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 25 Feb 2021 23:41:39 +0300 Subject: [PATCH 19/20] fix: isRef should be type guard --- package.json | 2 +- src/index.ts | 2 +- src/presets.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ecc2511..50ab346 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-12", + "version": "2.0.0-13", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/index.ts b/src/index.ts index 1a3fae3..2652683 100644 --- a/src/index.ts +++ b/src/index.ts @@ -38,7 +38,7 @@ export async function openapi(config: Config) { return getByPath(path.substr(1), api); } - function isRef(object: unknown | Record): boolean { + function isRef(object: unknown | Record): object is OpenAPIV3.ReferenceObject { return ( typeof object === "object" && object !== null && typeof (object as any)["$ref"] === "string" ); diff --git a/src/presets.ts b/src/presets.ts index 56e81e3..47a9001 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -11,7 +11,7 @@ export interface Internal { changeCase: typeof changeCase; root(): OpenAPIV3.Document; resolveRef(ref: string): unknown | null; - isRef(object: unknown): boolean; + isRef(object: unknown): object is OpenAPIV3.ReferenceObject; } export type PresetConstructor = (options: T, internal: Internal) => Preset; From a80fb7dbc0222510b0b7373320c2575edf6a8255 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Wed, 3 Mar 2021 11:38:18 +0300 Subject: [PATCH 20/20] feat: resolve file, outputDir and presets relates to cwd or config --- package.json | 2 +- src/api-file.ts | 4 ++++ src/cli/index.ts | 44 ++++++++++++++++++++++++++++++++++++-------- src/config.ts | 1 + src/index.ts | 25 +++++++++++++++++-------- src/presets.ts | 30 +++++++++++++++++++++++------- 6 files changed, 82 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 50ab346..150b227 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openapi", - "version": "2.0.0-13", + "version": "2.0.0-14", "description": "Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/api-file.ts b/src/api-file.ts index 2780ff9..bcf76c6 100644 --- a/src/api-file.ts +++ b/src/api-file.ts @@ -5,8 +5,12 @@ import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; import isUrl from "is-url"; import fetch from "node-fetch"; import yaml from "js-yaml"; +import createDebug from "debug"; + import { Config } from "./config"; +const debug = createDebug("openapi:api-file"); + export async function readApiFile(config: Config): Promise { return isUrl(config.file) ? await readFileFromWeb(config) : await readFileFromDisk(config); } diff --git a/src/cli/index.ts b/src/cli/index.ts index 7336ed2..442718b 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -2,9 +2,15 @@ import { program } from "commander"; import { cosmiconfigSync } from "cosmiconfig"; +import path from "path"; import { openapi } from ".."; +import isUrl from "is-url"; +import createDebug from "debug"; import Package from "../../package.json"; +import { Config } from "../config"; + +const debug = createDebug("openapi:cli"); program .version(Package.version) @@ -21,21 +27,37 @@ program async function main() { program.parse(process.argv); - + const workingDirectory = process.cwd(); const cosmic = cosmiconfigSync(Package.name); - const resolved = program.config ? cosmic.load(program.config) : cosmic.search() || { config: {} }; - const loaded = resolved?.config || {}; + + const configFullPath = program.config + ? path.resolve(workingDirectory, program.config) + : cosmic.search()?.filepath; + + const resolved = configFullPath ? cosmic.load(configFullPath) : null; + const configFromFs: Partial = resolved?.config ?? {}; + + const configDirectory = configFullPath ? path.dirname(configFullPath) : process.cwd(); const config = { - outputDir: program.outputDir || loaded.outputDir || "./api", - file: program.file || loaded.file, - authorization: program.authorization || loaded.authorization, - presets: program.presets || loaded.presets || [], + outputDir: + resolveDirectory(workingDirectory, program.outputDir) || + resolveDirectory(configDirectory, configFromFs.outputDir) || + path.resolve(workingDirectory, "./api"), + file: + resolveDirectory(process.cwd(), program.file) || + resolveDirectory(configDirectory, configFromFs.file), + authorization: program.authorization || configFromFs.authorization, + presets: program.presets || configFromFs.presets || [], + workingDirectory: configDirectory, }; if (!config.file) { - throw new Error("Please, provide path to a file with Swagger/OpenAPI spec"); + throw new Error( + "Please, provide path to a file with Swagger/OpenAPI spec via --file parameter", + ); } + if (config.presets.length === 0) { console.warn("[openapi] No presets were specified. Nothing to generate."); } @@ -50,3 +72,9 @@ main().catch((error) => { console.error(error); process.exit(1); }); + +function resolveDirectory(relates: string, link?: string): string | void { + if (link) { + return path.resolve(relates, link); + } +} diff --git a/src/config.ts b/src/config.ts index 41da0d8..bea75f5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,4 +5,5 @@ export interface Config { file: string; authorization: string | void; presets: PresetConfig[]; + workingDirectory?: string; } diff --git a/src/index.ts b/src/index.ts index 2652683..00e4f99 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,9 @@ -import * as fs from "fs"; -import * as path from "path"; +import fs from "fs"; +import path from "path"; import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; import { convertObj } from "swagger2openapi"; -import * as changeCase from "change-case"; +import changeCase from "change-case"; +import createDebug from "debug"; import { Config } from "./config"; import { parseContent, readApiFile, createFetchOptions } from "./api-file"; @@ -21,10 +22,16 @@ import { getByPath } from "./object-path"; export { status } from "./status"; -export { PresetConstructor, Preset, OpenAPIV3, Internal, FilesApi }; +export { PresetConstructor, Preset, Internal, FilesApi }; + +const debug = createDebug("openapi:core"); export async function openapi(config: Config) { - assertDirectory(config.outputDir); + const openapiFileDirectory = config.workingDirectory + ? path.resolve(config.workingDirectory) + : path.dirname(path.resolve(process.cwd(), config.file)); + assertDirectory(config.outputDir, openapiFileDirectory); + const content = await readApiFile(config); const apiObject = await parseContent(config.file, content); const api = isSwagger(apiObject) @@ -46,7 +53,9 @@ export async function openapi(config: Config) { const internal: Internal = { changeCase, root: () => api, isRef, resolveRef }; const fileSystems = new SeparatedFileSystem(); - const presets = createPresetIterator(config.presets, internal); + const presets = createPresetIterator(config.presets, internal, { + resolveLocalPresetsDir: openapiFileDirectory, + }); // Create files API for each preset presets.forEach((preset) => fileSystems.createFor(preset)); @@ -99,8 +108,8 @@ function isSwagger(input: OpenAPIV3.Document | OpenAPIV2.Document): input is Ope return typeof (input as any)["swagger"] === "string"; } -function assertDirectory(dir: string): void { - const outputDirPath = path.resolve(process.cwd(), dir); +function assertDirectory(dir: string, relatesAt: string = process.cwd()): void { + const outputDirPath = path.resolve(relatesAt, dir); if (!fs.existsSync(outputDirPath)) { fs.mkdirSync(outputDirPath, { recursive: true }); } diff --git a/src/presets.ts b/src/presets.ts index 47a9001..9d4ba77 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -1,8 +1,12 @@ import path from "path"; import { OpenAPIV3 } from "openapi-types"; import * as changeCase from "change-case"; +import createDebug from "debug"; + import { PresetConfig } from "./config"; +const debug = createDebug("openapi:presets"); + export interface FilesApi { addFile(name: string, content: string, options?: { overwrite?: boolean }): void; } @@ -61,11 +65,19 @@ const defaultPreset: PresetCore = { export type Preset = Partial; -export function createPresetIterator(list: PresetConfig[], internal: unknown) { +interface PresetIteratorOptions { + resolveLocalPresetsDir: string; +} + +export function createPresetIterator( + list: PresetConfig[], + internal: unknown, + options: PresetIteratorOptions, +) { const presets: PresetCore[] = []; list.forEach((presetConfigName) => { - const [name, readPreset] = loadPreset(presetConfigName, internal); + const [name, readPreset] = loadPreset(presetConfigName, internal, options); presets.push({ ...defaultPreset, name, ...readPreset }); }); @@ -100,7 +112,11 @@ export function noRef(value: OpenAPIV3.ReferenceObject | T): value is Exclude return typeof value && !(value as any)["$ref"]; } -function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, Preset] { +function loadPreset( + presetConfig: PresetConfig, + internal: unknown, + iteratorOptions: PresetIteratorOptions, +): [string, Preset] { if (Array.isArray(presetConfig)) { const [name, options] = presetConfig; if (typeof name !== "string") { @@ -109,7 +125,7 @@ function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, Pre ); } - const imported = require(resolvePath(name)); + const imported = require(resolvePath(name, iteratorOptions.resolveLocalPresetsDir)); // Here we know that user passed options to preset if (typeof imported !== "function") { @@ -123,7 +139,7 @@ function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, Pre return [name, preset]; } - const imported = require(resolvePath(presetConfig)); + const imported = require(resolvePath(presetConfig, iteratorOptions.resolveLocalPresetsDir)); // Package exports preset constructor if (typeof imported === "function") { const preset = imported({}, internal); @@ -135,9 +151,9 @@ function loadPreset(presetConfig: PresetConfig, internal: unknown): [string, Pre return [presetConfig, imported]; } -function resolvePath(name: string): string { +function resolvePath(name: string, resolveAt: string): string { if (name[0] === ".") { - return path.resolve(process.cwd(), name); + return path.resolve(resolveAt, name); } return name; }