diff --git a/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts b/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts index 96f3bb801..02f41112f 100644 --- a/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts +++ b/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts @@ -1,7 +1,7 @@ import * as TE from "fp-ts/TaskEither" import { HoppRESTRequest } from "@hoppscotch/data" import { step } from "../steps" -import { parsePostmanCollection } from "./postman" +import { getHoppCollection } from "./postman" import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "." import { parseInsomniaCollection } from "~/helpers/utils/parseInsomniaCollection" import { Collection } from "~/newstore/collections" @@ -42,7 +42,7 @@ export default defineImporter({ ) { // replace the variables, postman uses {{var}}, Hoppscotch uses <> collections = JSON.parse(content.replaceAll(/{{([a-z]+)}}/gi, "<<$1>>")) - collections = [parsePostmanCollection(collections)] + collections = [getHoppCollection(collections)] return TE.right(collections as Collection[]) } else { diff --git a/packages/hoppscotch-app/helpers/import-export/import/postman.ts b/packages/hoppscotch-app/helpers/import-export/import/postman.ts index bc6b4da6e..5ea7d9753 100644 --- a/packages/hoppscotch-app/helpers/import-export/import/postman.ts +++ b/packages/hoppscotch-app/helpers/import-export/import/postman.ts @@ -1,182 +1,233 @@ -import { HoppRESTRequest, translateToNewRequest } from "@hoppscotch/data" -import { pipe } from "fp-ts/function" +import { + Collection as PMCollection, + FormParam, + Item, + ItemGroup, + RequestAuthDefinition, + VariableDefinition, +} from "postman-collection" +import { + HoppRESTAuth, + HoppRESTHeader, + HoppRESTParam, + HoppRESTReqBody, + HoppRESTRequest, + makeRESTRequest, +} from "@hoppscotch/data" +import { pipe, flow } from "fp-ts/function" +import * as S from "fp-ts/string" +import * as A from "fp-ts/Array" import * as O from "fp-ts/Option" import * as TE from "fp-ts/TaskEither" import { step } from "../steps" import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "." import { Collection, makeCollection } from "~/newstore/collections" -// TODO: I don't even know what is going on here :/ -type PostmanCollection = { - info?: { - name: string +const safeParseJSON = (jsonStr: string) => O.tryCatch(() => JSON.parse(jsonStr)) + +const isPMItem = (x: unknown): x is Item => Item.isItem(x) + +const replacePMVarTemplating = flow( + S.replace(/{{/g, "<<"), + S.replace(/}}/g, ">>") +) + +const isPMItemGroup = (x: unknown): x is ItemGroup => + ItemGroup.isItemGroup(x) + +const readPMCollection = (def: string) => + pipe( + def, + safeParseJSON, + O.chain((data) => O.tryCatch(() => new PMCollection(data))) + ) + +const getHoppReqHeaders = (item: Item): HoppRESTHeader[] => + pipe( + item.request.headers.all(), + A.map((header) => { + return { + key: replacePMVarTemplating(header.key), + value: replacePMVarTemplating(header.value), + active: !header.disabled, + } + }) + ) + +const getHoppReqParams = (item: Item): HoppRESTParam[] => + pipe( + item.request.headers.all(), + A.map((header) => { + return { + key: replacePMVarTemplating(header.key), + value: replacePMVarTemplating(header.value), + active: !header.disabled, + } + }) + ) + +type PMRequestAuthDef< + AuthType extends RequestAuthDefinition["type"] = RequestAuthDefinition["type"] +> = AuthType extends RequestAuthDefinition["type"] & string + ? // eslint-disable-next-line no-unused-vars + { type: AuthType } & { [x in AuthType]: VariableDefinition[] } + : { type: AuthType } + +const getVariableValue = (defs: VariableDefinition[], key: string) => + defs.find((param) => param.key === key)?.value as string | undefined + +const getHoppReqAuth = (item: Item): HoppRESTAuth => { + if (!item.request.auth) return { authType: "none", authActive: true } + + // Cast to the type for more stricter checking down the line + const auth = item.request.auth as unknown as PMRequestAuthDef + + if (auth.type === "basic") { + return { + authType: "basic", + authActive: true, + username: replacePMVarTemplating( + getVariableValue(auth.basic, "username") ?? "" + ), + password: replacePMVarTemplating( + getVariableValue(auth.basic, "password") ?? "" + ), + } + } else if (auth.type === "apikey") { + return { + authType: "api-key", + authActive: true, + key: replacePMVarTemplating(getVariableValue(auth.apikey, "key") ?? ""), + value: replacePMVarTemplating( + getVariableValue(auth.apikey, "value") ?? "" + ), + addTo: + (getVariableValue(auth.apikey, "in") ?? "query") === "query" + ? "Query params" + : "Headers", + } + } else if (auth.type === "bearer") { + return { + authType: "bearer", + authActive: true, + token: replacePMVarTemplating( + getVariableValue(auth.bearer, "token") ?? "" + ), + } + } else if (auth.type === "oauth2") { + return { + authType: "oauth-2", + authActive: true, + accessTokenURL: replacePMVarTemplating( + getVariableValue(auth.oauth2, "accessTokenUrl") ?? "" + ), + authURL: replacePMVarTemplating( + getVariableValue(auth.oauth2, "authUrl") ?? "" + ), + clientID: replacePMVarTemplating( + getVariableValue(auth.oauth2, "clientId") ?? "" + ), + scope: replacePMVarTemplating( + getVariableValue(auth.oauth2, "scope") ?? "" + ), + token: replacePMVarTemplating( + getVariableValue(auth.oauth2, "accessToken") ?? "" + ), + oidcDiscoveryURL: "", + } } - name: string - item: { - name: string - request: any - item?: any - }[] - folders?: any + + return { authType: "none", authActive: true } } -const hasFolder = (item: { item?: any }) => { - return Object.prototype.hasOwnProperty.call(item, "item") +type PMFormDataParamType = FormParam & { + type: "file" | "text" } -export const parsePostmanCollection = ({ - info, - name, - item, -}: PostmanCollection) => { - const hoppscotchCollection: Collection = makeCollection({ - name: "", - folders: [], - requests: [], +const getHoppReqBody = (item: Item): HoppRESTReqBody => { + if (!item.request.body) return { contentType: null, body: null } + + // TODO: Implement + const body = item.request.body + + if (body.mode === "formdata") { + return { + contentType: "multipart/form-data", + body: + (body.formdata?.all() as PMFormDataParamType[]).map((param) => ({ + key: replacePMVarTemplating(param.key), + value: replacePMVarTemplating( + param.type === "text" ? (param.value as string) : "" + ), + active: !param.disabled, + isFile: false, // TODO: Preserve isFile state ? + })) ?? [], + } + } else if (body.mode === "urlencoded") { + return { + contentType: "application/x-www-form-urlencoded", + body: + body.urlencoded + ?.all() + .map( + (param) => + `${replacePMVarTemplating( + param.key ?? "" + )}: ${replacePMVarTemplating(param.value ?? "")}` + ) + .join("\n") ?? "", + } + } else if (body.mode === "raw") { + // Find content type from the content type header + const contentType = getHoppReqHeaders(item).find( + ({ key }) => key.toLowerCase() === "content-type" + )?.value + + if (contentType && body.raw !== undefined && body.raw !== null) + return { + contentType: contentType as any, + body: replacePMVarTemplating(body.raw), + } + else return { contentType: null, body: null } // TODO: Any sort of recovery ? + } + + // TODO: File + // TODO: GraphQL ? + + return { contentType: null, body: null } +} + +const getHoppReqURL = (item: Item): string => + pipe(item.request.url.toString(true), S.replace(/\?.+/g, "")) + +const getHoppRequest = (item: Item): HoppRESTRequest => { + return makeRESTRequest({ + name: item.name, + endpoint: getHoppReqURL(item), + method: item.request.method, + headers: getHoppReqHeaders(item), + params: getHoppReqParams(item), + auth: getHoppReqAuth(item), + body: getHoppReqBody(item), + + // TODO: Decide about this + preRequestScript: "", + testScript: "", + }) +} + +const getHoppFolder = (ig: ItemGroup): Collection => + makeCollection({ + name: ig.name, + folders: pipe( + ig.items.all(), + A.filter(isPMItemGroup), + A.map(getHoppFolder) + ), + requests: pipe(ig.items.all(), A.filter(isPMItem), A.map(getHoppRequest)), }) - hoppscotchCollection.name = info ? info.name : name - - if (item && item.length > 0) { - for (const collectionItem of item) { - if (collectionItem.request) { - if ( - Object.prototype.hasOwnProperty.call(hoppscotchCollection, "folders") - ) { - hoppscotchCollection.name = info ? info.name : name - hoppscotchCollection.requests.push( - parsePostmanRequest(collectionItem) - ) - } else { - hoppscotchCollection.name = name || "" - hoppscotchCollection.requests.push( - parsePostmanRequest(collectionItem) - ) - } - } else if (hasFolder(collectionItem)) { - hoppscotchCollection.folders.push( - parsePostmanCollection(collectionItem as any) - ) - } else { - hoppscotchCollection.requests.push(parsePostmanRequest(collectionItem)) - } - } - } - return hoppscotchCollection -} - -// TODO: Rewrite -const parsePostmanRequest = ({ - name, - request, -}: { - name: string - request: any -}) => { - const pwRequest = { - url: "", - path: "", - method: "", - auth: "", - httpUser: "", - httpPassword: "", - passwordFieldType: "password", - bearerToken: "", - headers: [] as { name?: string; type?: string }[], - params: [] as { disabled?: boolean }[], - bodyParams: [] as { type?: string }[], - body: { - body: "", - contentType: "application/json", - }, - rawParams: "", - rawInput: false, - contentType: "", - requestType: "", - name: "", - } - - pwRequest.name = name - if (request.url) { - const requestObjectUrl = request.url.raw.match( - /^(.+:\/\/[^/]+|{[^/]+})(\/[^?]+|).*$/ - ) - if (requestObjectUrl) { - pwRequest.url = requestObjectUrl[1] - pwRequest.path = requestObjectUrl[2] ? requestObjectUrl[2] : "" - } else { - pwRequest.url = request.url.raw - } - } - - pwRequest.method = request.method - const itemAuth = request.auth ? request.auth : "" - const authType = itemAuth ? itemAuth.type : "" - - try { - if (authType === "basic") { - pwRequest.auth = "Basic Auth" - pwRequest.httpUser = - itemAuth.basic[0].key === "username" - ? itemAuth.basic[0].value - : itemAuth.basic[1].value - pwRequest.httpPassword = - itemAuth.basic[0].key === "password" - ? itemAuth.basic[0].value - : itemAuth.basic[1].value - } else if (authType === "oauth2") { - pwRequest.auth = "OAuth 2.0" - pwRequest.bearerToken = - itemAuth.oauth2[0].key === "accessToken" - ? itemAuth.oauth2[0].value - : itemAuth.oauth2[1].value - } else if (authType === "bearer") { - pwRequest.auth = "Bearer Token" - pwRequest.bearerToken = itemAuth.bearer[0].value - } - } catch (error) { - console.error(error) - } - - const requestObjectHeaders = request.header - if (requestObjectHeaders) { - pwRequest.headers = requestObjectHeaders - for (const header of pwRequest.headers) { - delete header.name - delete header.type - } - } - if (request.url) { - const requestObjectParams = request.url.query - if (requestObjectParams) { - pwRequest.params = requestObjectParams - for (const param of pwRequest.params) { - delete param.disabled - } - } - } - if (request.body) { - if (request.body.mode === "urlencoded") { - const params = request.body.urlencoded - pwRequest.bodyParams = params || [] - for (const param of pwRequest.bodyParams) { - delete param.type - } - } else if (request.body.mode === "raw") { - pwRequest.rawInput = true - pwRequest.rawParams = request.body.raw - try { - const body = JSON.parse(request.body.raw) - pwRequest.body.body = JSON.stringify(body, null, 2) - } catch (error) { - console.error(error) - } - } - } - return translateToNewRequest(pwRequest) -} - -const safeParseJSON = (str: string) => O.tryCatch(() => JSON.parse(str)) +export const getHoppCollection = (coll: PMCollection) => getHoppFolder(coll) export default defineImporter({ name: "Postman Collection", @@ -191,14 +242,12 @@ export default defineImporter({ ] as const, importer: ([fileContent]) => pipe( - // Parse to JSON + // Try reading fileContent, - safeParseJSON, + readPMCollection, - // Parse To Postman Collection - O.chain((data) => O.tryCatch(() => parsePostmanCollection(data))), + O.map(flow(getHoppCollection, A.of)), - // Convert Option to Task Either TE.fromOption(() => IMPORTER_INVALID_FILE_FORMAT) ), }) diff --git a/packages/hoppscotch-app/package.json b/packages/hoppscotch-app/package.json index 7b8a22663..b81ee81ab 100644 --- a/packages/hoppscotch-app/package.json +++ b/packages/hoppscotch-app/package.json @@ -92,6 +92,7 @@ "nuxt": "^2.15.8", "openapi-types": "^10.0.0", "paho-mqtt": "^1.1.0", + "postman-collection": "^4.1.1", "rxjs": "^7.5.1", "socket.io-client-v2": "npm:socket.io-client@^2.4.0", "socket.io-client-v3": "npm:socket.io-client@^3.1.3", @@ -142,6 +143,7 @@ "@types/har-format": "^1.2.8", "@types/httpsnippet": "^1.23.1", "@types/lodash": "^4.14.178", + "@types/postman-collection": "^3.5.7", "@types/splitpanes": "^2.2.1", "@types/uuid": "^8.3.3", "@urql/devtools": "^2.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88bfca941..cf6f6314b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,6 +106,7 @@ importers: '@types/har-format': ^1.2.8 '@types/httpsnippet': ^1.23.1 '@types/lodash': ^4.14.178 + '@types/postman-collection': ^3.5.7 '@types/splitpanes': ^2.2.1 '@types/uuid': ^8.3.3 '@urql/core': ^2.3.6 @@ -148,6 +149,7 @@ importers: nuxt-windicss: ^2.2.2 openapi-types: ^10.0.0 paho-mqtt: ^1.1.0 + postman-collection: ^4.1.1 prettier: ^2.5.1 raw-loader: ^4.0.2 rxjs: ^7.5.1 @@ -239,6 +241,7 @@ importers: nuxt: 2.15.8_typescript@4.5.4 openapi-types: 10.0.0 paho-mqtt: 1.1.0 + postman-collection: 4.1.1 rxjs: 7.5.1 socket.io-client-v2: /socket.io-client/2.4.0 socket.io-client-v3: /socket.io-client/3.1.3 @@ -288,6 +291,7 @@ importers: '@types/har-format': 1.2.8 '@types/httpsnippet': 1.23.1 '@types/lodash': 4.14.178 + '@types/postman-collection': 3.5.7 '@types/splitpanes': 2.2.1 '@types/uuid': 8.3.3 '@urql/devtools': 2.0.3_@urql+core@2.3.6+graphql@15.7.2 @@ -3179,7 +3183,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.6.7 - '@types/node': 16.11.12 + '@types/node': 17.0.6 dev: false /@grpc/proto-loader/0.6.7: @@ -4530,7 +4534,7 @@ packages: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.34 - '@types/node': 12.20.12 + '@types/node': 17.0.6 dev: true /@types/browserslist/4.15.0: @@ -4545,7 +4549,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.3 - '@types/node': 16.11.12 + '@types/node': 17.0.6 '@types/responselike': 1.0.0 dev: true @@ -4559,7 +4563,7 @@ packages: /@types/clean-css/4.2.5: resolution: {integrity: sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 source-map: 0.6.1 dev: true @@ -4582,7 +4586,7 @@ packages: /@types/connect/3.4.34: resolution: {integrity: sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 dev: true /@types/cookie/0.4.1: @@ -4609,13 +4613,13 @@ packages: /@types/etag/1.8.0: resolution: {integrity: sha512-EdSN0x+Y0/lBv7YAb8IU4Jgm6DWM+Bqtz7o5qozl96fzaqdqbdfHS5qjdpFeIv7xQ8jSLyjMMNShgYtMajEHyQ==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 dev: true /@types/express-serve-static-core/4.17.24: resolution: {integrity: sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -4664,7 +4668,7 @@ packages: /@types/http-proxy/1.17.7: resolution: {integrity: sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==} dependencies: - '@types/node': 16.11.12 + '@types/node': 17.0.6 dev: false /@types/httpsnippet/1.23.1: @@ -4714,13 +4718,13 @@ packages: /@types/jsonwebtoken/8.5.6: resolution: {integrity: sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ==} dependencies: - '@types/node': 17.0.5 + '@types/node': 17.0.6 dev: true /@types/keyv/3.1.3: resolution: {integrity: sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==} dependencies: - '@types/node': 16.11.12 + '@types/node': 17.0.6 dev: true /@types/less/3.0.2: @@ -4746,32 +4750,23 @@ packages: /@types/node-sass/4.11.2: resolution: {integrity: sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 dev: true /@types/node/12.20.12: resolution: {integrity: sha512-KQZ1al2hKOONAs2MFv+yTQP1LkDWMrRJ9YCVRalXltOfXsBmH5IownLxQaiq0lnAHwAViLnh2aTYqrPcRGEbgg==} + dev: true /@types/node/12.20.36: resolution: {integrity: sha512-+5haRZ9uzI7rYqzDznXgkuacqb6LJhAti8mzZKWxIXn/WEtvB+GHVJ7AuMwcN1HMvXOSJcrvA6PPoYHYOYYebA==} dev: false - /@types/node/16.11.12: - resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==} - /@types/node/16.11.17: resolution: {integrity: sha512-C1vTZME8cFo8uxY2ui41xcynEotVkczIVI5AjLmy5pkpBv/FtG+jhtOlfcPysI8VRVwoOMv6NJm44LGnoMSWkw==} dev: true - /@types/node/16.11.6: - resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} - - /@types/node/17.0.5: - resolution: {integrity: sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==} - /@types/node/17.0.6: resolution: {integrity: sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==} - dev: true /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -4790,6 +4785,12 @@ packages: /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + /@types/postman-collection/3.5.7: + resolution: {integrity: sha512-wqZ/MlGEYP+RoiofnAnKDJAHxRzmMK97CeFLoHPNoHdHX0uyBLCDl+uZV9x4xuPVRjkeM4xcarIaUaUk47c7SQ==} + dependencies: + '@types/node': 17.0.6 + dev: true + /@types/prettier/2.4.2: resolution: {integrity: sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==} dev: true @@ -4816,7 +4817,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 16.11.12 + '@types/node': 17.0.6 dev: true /@types/sass-loader/8.0.1: @@ -4830,13 +4831,13 @@ packages: /@types/sass/1.43.0: resolution: {integrity: sha512-DPSXNJ1rYLo88GyF9tuB4bsYGfpKI1a4+wOQmc+LI1SUoocm9QLRSpz0GxxuyjmJsYFIQo/dDlRSSpIXngff+w==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 dev: true /@types/sax/1.2.3: resolution: {integrity: sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==} dependencies: - '@types/node': 12.20.36 + '@types/node': 17.0.6 dev: false /@types/semver/7.3.9: @@ -4847,7 +4848,7 @@ packages: resolution: {integrity: sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==} dependencies: '@types/mime': 1.3.2 - '@types/node': 12.20.12 + '@types/node': 17.0.6 dev: true /@types/source-list-map/0.1.2: @@ -4939,7 +4940,7 @@ packages: /@types/webpack-sources/3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 12.20.12 + '@types/node': 17.0.6 '@types/source-list-map': 0.1.2 source-map: 0.7.3 @@ -4947,7 +4948,7 @@ packages: resolution: {integrity: sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ==} dependencies: '@types/anymatch': 3.0.0 - '@types/node': 12.20.12 + '@types/node': 17.0.6 '@types/tapable': 1.0.8 '@types/uglify-js': 3.13.1 '@types/webpack-sources': 3.2.0 @@ -4957,7 +4958,7 @@ packages: /@types/webpack/4.41.31: resolution: {integrity: sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==} dependencies: - '@types/node': 16.11.12 + '@types/node': 17.0.6 '@types/tapable': 1.0.8 '@types/uglify-js': 3.13.1 '@types/webpack-sources': 3.2.0 @@ -4968,12 +4969,12 @@ packages: /@types/websocket/1.0.4: resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==} dependencies: - '@types/node': 17.0.5 + '@types/node': 17.0.6 /@types/ws/8.2.2: resolution: {integrity: sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==} dependencies: - '@types/node': 17.0.5 + '@types/node': 17.0.6 /@types/yargs-parser/20.2.1: resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} @@ -6902,6 +6903,11 @@ packages: /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + /charset/1.0.1: + resolution: {integrity: sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==} + engines: {node: '>=4.0.0'} + dev: false + /cheerio-select/1.5.0: resolution: {integrity: sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==} dependencies: @@ -9309,6 +9315,10 @@ packages: css: 2.2.4 dev: true + /faker/5.5.3: + resolution: {integrity: sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==} + dev: false + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -9424,6 +9434,11 @@ packages: webpack: 4.46.0 dev: false + /file-type/3.9.0: + resolution: {integrity: sha1-JXoHg4TR24CHvESdEH1SpSZyuek=} + engines: {node: '>=0.10.0'} + dev: false + /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -10560,6 +10575,10 @@ packages: - debug dev: false + /http-reasons/0.1.0: + resolution: {integrity: sha1-qVPKZwB4Zp3eFCzomUAbnW6F07Q=} + dev: false + /http-shutdown/1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -10624,6 +10643,13 @@ packages: dependencies: safer-buffer: 2.1.2 + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + /icss-utils/4.1.1: resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} engines: {node: '>= 6'} @@ -11825,7 +11851,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.11.6 + '@types/node': 17.0.6 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -11833,7 +11859,7 @@ packages: resolution: {integrity: sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.11.12 + '@types/node': 17.0.6 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -12237,6 +12263,11 @@ packages: - enquirer dev: false + /liquid-json/0.3.1: + resolution: {integrity: sha1-kVWhgTbYprJhXl8W+aJEira1Duo=} + engines: {node: '>=4'} + dev: false + /listhen/0.2.5: resolution: {integrity: sha512-7stTOFjeQHVkDqpPl0AtGdzXNu1XN5sE2Pi4mudeZ597c100OKvUpmPuv3MKemDScIWqmIbeUOeP3PBo0w49XQ==} dependencies: @@ -12824,6 +12855,12 @@ packages: resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} engines: {node: '>= 0.6'} + /mime-format/2.0.1: + resolution: {integrity: sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==} + dependencies: + charset: 1.0.1 + dev: false + /mime-types/2.1.33: resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==} engines: {node: '>= 0.6'} @@ -14758,6 +14795,30 @@ packages: posthtml-render: 1.4.0 dev: true + /postman-collection/4.1.1: + resolution: {integrity: sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==} + engines: {node: '>=10'} + dependencies: + faker: 5.5.3 + file-type: 3.9.0 + http-reasons: 0.1.0 + iconv-lite: 0.6.3 + liquid-json: 0.3.1 + lodash: 4.17.21 + mime-format: 2.0.1 + mime-types: 2.1.34 + postman-url-encoder: 3.0.5 + semver: 7.3.5 + uuid: 8.3.2 + dev: false + + /postman-url-encoder/3.0.5: + resolution: {integrity: sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==} + engines: {node: '>=10'} + dependencies: + punycode: 2.1.1 + dev: false + /prelude-ls/1.1.2: resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} engines: {node: '>= 0.8.0'} @@ -14906,7 +14967,7 @@ packages: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.1 - '@types/node': 16.11.12 + '@types/node': 17.0.6 long: 4.0.0 dev: false