diff --git a/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts b/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts index 02f41112f..c2068eb57 100644 --- a/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts +++ b/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts @@ -1,13 +1,212 @@ +import { convert, ImportRequest } from "insomnia-importers" +import { pipe, flow } from "fp-ts/function" +import { + HoppRESTAuth, + HoppRESTHeader, + HoppRESTParam, + HoppRESTReqBody, + HoppRESTRequest, + knownContentTypes, + makeRESTRequest, +} from "@hoppscotch/data" +import * as A from "fp-ts/Array" +import * as S from "fp-ts/string" +import * as TO from "fp-ts/TaskOption" import * as TE from "fp-ts/TaskEither" -import { HoppRESTRequest } from "@hoppscotch/data" import { step } from "../steps" -import { getHoppCollection } from "./postman" import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "." -import { parseInsomniaCollection } from "~/helpers/utils/parseInsomniaCollection" -import { Collection } from "~/newstore/collections" +import { Collection, makeCollection } from "~/newstore/collections" -// This Importer definition is less than ideal, -// would love an attempt at refactoring this +// TODO: Insomnia allows custom prefixes for Bearer token auth, Hoppscotch doesn't. We just ignore the prefix for now + +type UnwrapPromise> = T extends Promise + ? Y + : never + +type InsomniaDoc = UnwrapPromise> +type InsomniaResource = ImportRequest + +type InsomniaFolderResource = ImportRequest & { _type: "request_group" } +type InsomniaRequestResource = ImportRequest & { _type: "request" } + +const parseInsomniaDoc = (content: string) => + TO.tryCatch(() => convert(content)) + +const replaceVarTemplating = flow( + S.replace(/{{\s+/g, "<<"), + S.replace(/\s+}}/g, ">>") +) + +const getFoldersIn = ( + folder: InsomniaFolderResource | null, + resources: InsomniaResource[] +) => + pipe( + resources, + A.filter( + (x): x is InsomniaFolderResource => + (x._type === "request_group" || x._type === "workspace") && + x.parentId === (folder?._id ?? null) + ) + ) + +const getRequestsIn = ( + folder: InsomniaFolderResource | null, + resources: InsomniaResource[] +) => + pipe( + resources, + A.filter( + (x): x is InsomniaRequestResource => + x._type === "request" && x.parentId === (folder?._id ?? null) + ) + ) + +/** + * The provided type by insomnia-importers, this type corrects it + */ +type InsoReqAuth = + | { type: "basic"; disabled?: boolean; username?: string; password?: string } + | { + type: "oauth2" + disabled?: boolean + accessTokenUrl?: string + authorizationUrl?: string + clientId?: string + scope?: string + } + | { + type: "bearer" + disabled?: boolean + token?: string + } + +const getHoppReqAuth = (req: InsomniaRequestResource): HoppRESTAuth => { + if (!req.authentication) return { authType: "none", authActive: true } + + const auth = req.authentication as InsoReqAuth + + if (auth.type === "basic") + return { + authType: "basic", + authActive: true, + username: replaceVarTemplating(auth.username ?? ""), + password: replaceVarTemplating(auth.password ?? ""), + } + else if (auth.type === "oauth2") + return { + authType: "oauth-2", + authActive: !(auth.disabled ?? false), + accessTokenURL: replaceVarTemplating(auth.accessTokenUrl ?? ""), + authURL: replaceVarTemplating(auth.authorizationUrl ?? ""), + clientID: replaceVarTemplating(auth.clientId ?? ""), + oidcDiscoveryURL: "", + scope: replaceVarTemplating(auth.scope ?? ""), + token: "", + } + else if (auth.type === "bearer") + return { + authType: "bearer", + authActive: true, + token: replaceVarTemplating(auth.token ?? ""), + } + + return { authType: "none", authActive: true } +} + +const getHoppReqBody = (req: InsomniaRequestResource): HoppRESTReqBody => { + if (!req.body) return { contentType: null, body: null } + + if (typeof req.body === "string") { + const contentType = + req.headers?.find( + (header) => header.name.toLowerCase() === "content-type" + )?.value ?? "text/plain" + + return { contentType, body: replaceVarTemplating(req.body) } + } + + if (req.body.mimeType === "multipart/form-data") { + return { + contentType: "multipart/form-data", + body: + req.body.params?.map((param) => ({ + key: replaceVarTemplating(param.name), + value: replaceVarTemplating(param.value ?? ""), + active: !(param.disabled ?? false), + isFile: false, + })) ?? [], + } + } else if (req.body.mimeType === "application/x-www-form-urlencoded") { + return { + contentType: "application/x-www-form-urlencoded", + body: + req.body.params + ?.filter((param) => !(param.disabled ?? false)) + .map( + (param) => + `${replaceVarTemplating(param.name)}: ${replaceVarTemplating( + param.value ?? "" + )}` + ) + .join("\n") ?? "", + } + } else if ( + Object.keys(knownContentTypes).includes(req.body.mimeType ?? "text/plain") + ) { + return { + contentType: (req.body.mimeType ?? "text/plain") as any, + body: replaceVarTemplating(req.body.text ?? "") as any, + } + } + + return { contentType: null, body: null } +} + +const getHoppReqHeaders = (req: InsomniaRequestResource): HoppRESTHeader[] => + req.headers?.map((header) => ({ + key: replaceVarTemplating(header.name), + value: replaceVarTemplating(header.value), + active: !header.disabled, + })) ?? [] + +const getHoppReqParams = (req: InsomniaRequestResource): HoppRESTParam[] => + req.parameters?.map((param) => ({ + key: replaceVarTemplating(param.name), + value: replaceVarTemplating(param.value ?? ""), + active: !(param.disabled ?? false), + })) ?? [] + +const getHoppRequest = (req: InsomniaRequestResource): HoppRESTRequest => + makeRESTRequest({ + name: req.name ?? "Untitled Request", + method: req.method ?? "GET", + endpoint: replaceVarTemplating(req.url ?? ""), + auth: getHoppReqAuth(req), + body: getHoppReqBody(req), + headers: getHoppReqHeaders(req), + params: getHoppReqParams(req), + + preRequestScript: "", + testScript: "", + }) + +const getHoppFolder = ( + folderRes: InsomniaFolderResource, + resources: InsomniaResource[] +): Collection => + makeCollection({ + name: folderRes.name ?? "", + folders: getFoldersIn(folderRes, resources).map((f) => + getHoppFolder(f, resources) + ), + requests: getRequestsIn(folderRes, resources).map(getHoppRequest), + }) + +const getHoppCollections = (doc: InsomniaDoc) => + getFoldersIn(null, doc.data.resources).map((f) => + getHoppFolder(f, doc.data.resources) + ) export default defineImporter({ name: "Insomnia Collection", @@ -16,40 +215,17 @@ export default defineImporter({ step({ stepName: "FILE_IMPORT", metadata: { - acceptedFileTypes: ".json", + acceptedFileTypes: ".json, .yaml", }, }), ] as const, - importer: ([fileContent]) => { - try { - let collections = parseInsomniaCollection(fileContent) - const content = JSON.stringify(collections) + importer: ([fileContent]) => + pipe( + fileContent, + parseInsomniaDoc, - if (collections[0]) { - const [name, folders, requests] = Object.keys(collections[0]) - if ( - name === "name" && - folders === "folders" && - requests === "requests" - ) { - return TE.right(collections as Collection[]) - } + TO.map(getHoppCollections), - return TE.left(IMPORTER_INVALID_FILE_FORMAT) - } else if ( - collections.info && - collections.info.schema.includes("v2.1.0") - ) { - // replace the variables, postman uses {{var}}, Hoppscotch uses <> - collections = JSON.parse(content.replaceAll(/{{([a-z]+)}}/gi, "<<$1>>")) - collections = [getHoppCollection(collections)] - - return TE.right(collections as Collection[]) - } else { - return TE.left(IMPORTER_INVALID_FILE_FORMAT) - } - } catch (_e) { - return TE.left(IMPORTER_INVALID_FILE_FORMAT) - } - }, + TE.fromTaskOption(() => IMPORTER_INVALID_FILE_FORMAT) + ), }) diff --git a/packages/hoppscotch-app/package.json b/packages/hoppscotch-app/package.json index b81ee81ab..eaa8d5e01 100644 --- a/packages/hoppscotch-app/package.json +++ b/packages/hoppscotch-app/package.json @@ -83,6 +83,7 @@ "graphql-language-service-parser": "^1.10.4", "graphql-tag": "^2.12.6", "httpsnippet": "^2.0.0", + "insomnia-importers": "^2.4.1", "io-ts": "^2.2.16", "js-yaml": "^4.1.0", "json-loader": "^0.5.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf6f6314b..a122a251d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,6 +136,7 @@ importers: graphql-language-service-parser: ^1.10.4 graphql-tag: ^2.12.6 httpsnippet: ^2.0.0 + insomnia-importers: ^2.4.1 io-ts: ^2.2.16 jest: ^27.4.5 jest-serializer-vue: ^2.0.2 @@ -232,6 +233,7 @@ importers: graphql-language-service-parser: 1.10.4_6fc3d2884cf7cc5ceaa63c063181dac6 graphql-tag: 2.12.6_graphql@15.7.2 httpsnippet: 2.0.0 + insomnia-importers: 2.4.1_openapi-types@10.0.0 io-ts: 2.2.16_fp-ts@2.11.5 js-yaml: 4.1.0 json-loader: 0.5.7 @@ -400,6 +402,20 @@ packages: resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} dev: false + /@apidevtools/swagger-parser/10.0.2_openapi-types@10.0.0: + resolution: {integrity: sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==} + peerDependencies: + openapi-types: '>=7' + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.9 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.1 + openapi-types: 10.0.0 + z-schema: 4.2.4 + dev: false + /@apidevtools/swagger-parser/10.0.3_openapi-types@10.0.0: resolution: {integrity: sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==} peerDependencies: @@ -3708,19 +3724,19 @@ packages: ufo: 0.7.9 dev: false - /@nuxt/kit-edge/3.0.0-27356801.e9128f3: - resolution: {integrity: sha512-hGiqZydtMiK+UhHBsdD0WC+fHeI3xyJixhY2rNPGwFrzdeTrbUy8YH451SbRPOJ8TS0RYQ+cUT6JfMr0YTpnfg==} + /@nuxt/kit-edge/3.0.0-27366343.1d741cb: + resolution: {integrity: sha512-7R9f5xoH+8gLiGSeVyKVpEPwqdbptoJ1X852gbGSMEATLb7Wc0eDVUj4/PTBMSjvYuNm54a0bGO0OG02nXZViw==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0} dependencies: - '@nuxt/schema': /@nuxt/schema-edge/3.0.0-27356801.e9128f3 + '@nuxt/schema': /@nuxt/schema-edge/3.0.0-27366343.1d741cb consola: 2.15.3 defu: 5.0.0 - dotenv: 10.0.0 - globby: 11.0.4 + dotenv: 11.0.0 + globby: 11.1.0 hash-sum: 2.0.0 jiti: 1.12.9 lodash.template: 4.5.0 - mlly: 0.3.16 + mlly: 0.3.17 pathe: 0.2.0 pkg-types: 0.3.2 rc9: 1.2.0 @@ -3750,8 +3766,8 @@ packages: node-fetch: 2.6.6 dev: false - /@nuxt/schema-edge/3.0.0-27356801.e9128f3: - resolution: {integrity: sha512-LOi5OLFzxrHL7t/a7sn2+fnkNN8y9ipnLG6l6McI+vEuzXi11YeHCYt7PmoqqySXx411hd6lISmYd/aZzBgYkg==} + /@nuxt/schema-edge/3.0.0-27366343.1d741cb: + resolution: {integrity: sha512-u3EFLXiisctQlKFLEsuVYxdZroO7FnrMZV1uAOHUbgyX4/0oakhCeFbKko754HaD4wgawFHIPZ2YDJGi1eTO5g==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0} dependencies: create-require: 1.1.1 @@ -5857,6 +5873,21 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 + /apiconnect-wsdl/1.8.31: + resolution: {integrity: sha512-kNs26If9xCJnGolVTAt0VWIA8KrqwodQLqDRTrfc7txD54LJ+hFx638sPYEdG9jw78eifWyy+FBlS5befYSa8Q==} + engines: {node: '>=8'} + dependencies: + iconv-lite: 0.4.24 + js-yaml: 3.14.1 + jszip: 3.7.1 + lodash: 4.17.21 + q: 1.5.1 + swagger-parser: 8.0.3 + xml2js: 0.4.23 + xmldom: 0.1.31 + yauzl: 2.10.0 + dev: false + /aproba/1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} dev: false @@ -6578,6 +6609,10 @@ packages: node-int64: 0.4.0 dev: true + /buffer-crc32/0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: false + /buffer-equal-constant-time/1.0.1: resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} dev: true @@ -6828,7 +6863,6 @@ packages: no-case: 3.0.4 tslib: 2.3.1 upper-case-first: 2.0.2 - dev: true /chalk/1.1.3: resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} @@ -6893,7 +6927,6 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.3.1 - dev: true /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -7345,7 +7378,6 @@ packages: no-case: 3.0.4 tslib: 2.3.1 upper-case: 2.0.2 - dev: true /constants-browserify/1.0.0: resolution: {integrity: sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=} @@ -8269,6 +8301,11 @@ packages: engines: {node: '>=10'} dev: true + /dotenv/11.0.0: + resolution: {integrity: sha512-Fp/b504Y5W+e+FpCxTFMUZ7ZEQkQYF0rx+KZtmwixJxGQbLHrhCwo3FjZgNC8vIfrSi29PABNbMoCGD9YoiXbQ==} + engines: {node: '>=12'} + dev: true + /dotenv/8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -9326,6 +9363,17 @@ packages: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true + /fast-glob/3.2.10: + resolution: {integrity: sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.4 + dev: true + /fast-glob/3.2.7: resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} engines: {node: '>=8'} @@ -9381,6 +9429,12 @@ packages: ua-parser-js: 0.7.31 dev: true + /fd-slicer/1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + dependencies: + pend: 1.2.0 + dev: false + /figgy-pudding/3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} dev: false @@ -10010,6 +10064,18 @@ packages: merge2: 1.4.1 slash: 3.0.0 + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.10 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globjoin/0.1.4: resolution: {integrity: sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=} dev: true @@ -10368,7 +10434,6 @@ packages: dependencies: capital-case: 1.0.4 tslib: 2.3.1 - dev: true /helpertypes/0.0.17: resolution: {integrity: sha512-muWKRSBsqN3MzqLdh82QfV7vWWwAYvHh3On87z898X+xZ5H2tPRQ5Y6hHA3BXSE+TueztA07iw5bInjwAT3x8A==} @@ -10838,6 +10903,21 @@ packages: through: 2.3.8 dev: true + /insomnia-importers/2.4.1_openapi-types@10.0.0: + resolution: {integrity: sha512-KufwGydt6WUlf7Oukqem0ra40ZPWImEBK1gqICarEMydVuzeaoPvyXDCP1r9RLHoJpV1sKUDSv14LZ6CE2j6Qg==} + hasBin: true + dependencies: + '@apidevtools/swagger-parser': 10.0.2_openapi-types@10.0.0 + apiconnect-wsdl: 1.8.31 + change-case: 4.1.2 + commander: 7.2.0 + lodash: 4.17.21 + shell-quote: 1.7.3 + yaml: 1.10.2 + transitivePeerDependencies: + - openapi-types + dev: false + /internal-slot/1.0.3: resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} engines: {node: '>= 0.4'} @@ -12016,6 +12096,14 @@ packages: /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + /json-schema-ref-parser/7.1.4: + resolution: {integrity: sha512-AD7bvav0vak1/63w3jH8F7eHId/4E4EPdMAEZhGxtjktteUv9dnNB/cJy6nVnMyoTPBJnLwFK6tiQPSTeleCtQ==} + dependencies: + call-me-maybe: 1.0.1 + js-yaml: 3.14.1 + ono: 6.0.1 + dev: false + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -13020,8 +13108,8 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly/0.3.16: - resolution: {integrity: sha512-DVydmuR8fmiMetH39kp8VXYslN0XDh+OxULuU/ov8TMwVIxDGQ8PsJIrNi6cZZaHiIYL6wtO6+sjGpVc7msKUg==} + /mlly/0.3.17: + resolution: {integrity: sha512-C3v8eHB9KqmS1ewOB5DUgljX13C3xuoaXZd5bOLtwpxk9pBZhA+wyVgYXPuP4aukQ9bKYWjy+YQVC+DmniIsgA==} dev: true /mocha/9.1.3: @@ -13405,7 +13493,7 @@ packages: /nuxt-windicss/2.2.2: resolution: {integrity: sha512-4tvzk9d2TUFxloty187D+wmO8ZNAvpSmRJ5HQO3/AvZdMMhAl4gomXR9fCgFKQe7Fxcj9nIKNInOx8TWowjiqA==} dependencies: - '@nuxt/kit': /@nuxt/kit-edge/3.0.0-27356801.e9128f3 + '@nuxt/kit': /@nuxt/kit-edge/3.0.0-27366343.1d741cb '@windicss/plugin-utils': 1.6.1 consola: 2.15.3 defu: 5.0.0 @@ -13551,6 +13639,14 @@ packages: dependencies: mimic-fn: 2.1.0 + /ono/5.1.0: + resolution: {integrity: sha512-GgqRIUWErLX4l9Up0khRtbrlH8Fyj59A0nKv8V6pWEto38aUgnOGOOF7UmgFFLzFnDSc8REzaTXOc0hqEe7yIw==} + dev: false + + /ono/6.0.1: + resolution: {integrity: sha512-5rdYW/106kHqLeG22GE2MHKq+FlsxMERZev9DCzQX1zwkxnFwBivSn5i17a5O/rDmOJOdf4Wyt80UZljzx9+DA==} + dev: false + /open/8.4.0: resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} engines: {node: '>=12'} @@ -13560,6 +13656,15 @@ packages: is-wsl: 2.2.0 dev: true + /openapi-schemas/1.0.3: + resolution: {integrity: sha512-KtMWcK2VtOS+nD8RKSIyScJsj8JrmVWcIX7Kjx4xEHijFYuvMTDON8WfeKOgeSb4uNG6UsqLj5Na7nKbSav9RQ==} + engines: {node: '>=8'} + dev: false + + /openapi-types/1.3.5: + resolution: {integrity: sha512-11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==} + dev: false + /openapi-types/10.0.0: resolution: {integrity: sha512-Y8xOCT2eiKGYDzMW9R4x5cmfc3vGaaI4EL2pwhDmodWw1HlK18YcZ4uJxc7Rdp7/gGzAygzH9SXr6GKYIXbRcQ==} dev: false @@ -13866,7 +13971,6 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.3.1 - dev: true /path-dirname/1.0.2: resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=} @@ -13941,6 +14045,10 @@ packages: sha.js: 2.4.11 dev: false + /pend/1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + dev: false + /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} @@ -14021,7 +14129,7 @@ packages: resolution: {integrity: sha512-eBYzX/7NYsQEOR2alWY4rnQB49G62oHzFpoi9Som56aUr8vB8UGcmcIia9v8fpBeuhH3Ltentuk2OGpp4IQV3Q==} dependencies: jsonc-parser: 3.0.0 - mlly: 0.3.16 + mlly: 0.3.17 pathe: 0.2.0 dev: true @@ -15801,7 +15909,6 @@ packages: no-case: 3.0.4 tslib: 2.3.1 upper-case-first: 2.0.2 - dev: true /serialize-javascript/3.1.0: resolution: {integrity: sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==} @@ -16004,7 +16111,6 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.3.1 - dev: true /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} @@ -16807,6 +16913,22 @@ packages: unquote: 1.1.1 util.promisify: 1.0.1 + /swagger-methods/2.0.2: + resolution: {integrity: sha512-/RNqvBZkH8+3S/FqBPejHxJxZenaYq3MrpeXnzi06aDIS39Mqf5YCUNb/ZBjsvFFt8h9FxfKs8EXPtcYdfLiRg==} + dev: false + + /swagger-parser/8.0.3: + resolution: {integrity: sha512-y2gw+rTjn7Z9J+J1qwbBm0UL93k/VREDCveKBK6iGjf7KXC6QGshbnpEmeHL0ZkCgmIghsXzpNzPSbBH91BAEQ==} + dependencies: + call-me-maybe: 1.0.1 + json-schema-ref-parser: 7.1.4 + ono: 5.1.0 + openapi-schemas: 1.0.3 + openapi-types: 1.3.5 + swagger-methods: 2.0.2 + z-schema: 4.2.4 + dev: false + /swap-case/2.0.2: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} dependencies: @@ -17635,7 +17757,6 @@ packages: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.3.1 - dev: true /upper-case/1.1.3: resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} @@ -17645,7 +17766,6 @@ packages: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.3.1 - dev: true /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -18480,6 +18600,19 @@ packages: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} dev: true + /xml2js/0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder/11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + /xmlbuilder/13.0.2: resolution: {integrity: sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==} engines: {node: '>=6.0'} @@ -18489,6 +18622,12 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true + /xmldom/0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + dev: false + /xmlhttprequest-ssl/1.6.3: resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} engines: {node: '>=0.4.0'} @@ -18608,6 +18747,13 @@ packages: yargs-parser: 21.0.0 dev: true + /yauzl/2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + /yeast/0.1.2: resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=} dev: false @@ -18620,6 +18766,18 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /z-schema/4.2.4: + resolution: {integrity: sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.7.0 + optionalDependencies: + commander: 2.20.3 + dev: false + /z-schema/5.0.2: resolution: {integrity: sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==} engines: {node: '>=8.0.0'}