refactor: revamped postman collection importer

This commit is contained in:
Andrew Bastin
2022-01-13 02:31:32 +05:30
parent ffb063ad94
commit aeb848399a
4 changed files with 318 additions and 206 deletions

View File

@@ -1,7 +1,7 @@
import * as TE from "fp-ts/TaskEither" import * as TE from "fp-ts/TaskEither"
import { HoppRESTRequest } from "@hoppscotch/data" import { HoppRESTRequest } from "@hoppscotch/data"
import { step } from "../steps" import { step } from "../steps"
import { parsePostmanCollection } from "./postman" import { getHoppCollection } from "./postman"
import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "." import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "."
import { parseInsomniaCollection } from "~/helpers/utils/parseInsomniaCollection" import { parseInsomniaCollection } from "~/helpers/utils/parseInsomniaCollection"
import { Collection } from "~/newstore/collections" import { Collection } from "~/newstore/collections"
@@ -42,7 +42,7 @@ export default defineImporter({
) { ) {
// replace the variables, postman uses {{var}}, Hoppscotch uses <<var>> // replace the variables, postman uses {{var}}, Hoppscotch uses <<var>>
collections = JSON.parse(content.replaceAll(/{{([a-z]+)}}/gi, "<<$1>>")) collections = JSON.parse(content.replaceAll(/{{([a-z]+)}}/gi, "<<$1>>"))
collections = [parsePostmanCollection(collections)] collections = [getHoppCollection(collections)]
return TE.right(collections as Collection<HoppRESTRequest>[]) return TE.right(collections as Collection<HoppRESTRequest>[])
} else { } else {

View File

@@ -1,182 +1,233 @@
import { HoppRESTRequest, translateToNewRequest } from "@hoppscotch/data" import {
import { pipe } from "fp-ts/function" 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 O from "fp-ts/Option"
import * as TE from "fp-ts/TaskEither" import * as TE from "fp-ts/TaskEither"
import { step } from "../steps" import { step } from "../steps"
import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "." import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "."
import { Collection, makeCollection } from "~/newstore/collections" import { Collection, makeCollection } from "~/newstore/collections"
// TODO: I don't even know what is going on here :/ const safeParseJSON = (jsonStr: string) => O.tryCatch(() => JSON.parse(jsonStr))
type PostmanCollection = {
info?: { const isPMItem = (x: unknown): x is Item => Item.isItem(x)
name: string
const replacePMVarTemplating = flow(
S.replace(/{{/g, "<<"),
S.replace(/}}/g, ">>")
)
const isPMItemGroup = (x: unknown): x is ItemGroup<Item> =>
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 <HoppRESTHeader>{
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 <HoppRESTHeader>{
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: { return { authType: "none", authActive: true }
name: string
request: any
item?: any
}[]
folders?: any
} }
const hasFolder = (item: { item?: any }) => { type PMFormDataParamType = FormParam & {
return Object.prototype.hasOwnProperty.call(item, "item") type: "file" | "text"
} }
export const parsePostmanCollection = ({ const getHoppReqBody = (item: Item): HoppRESTReqBody => {
info, if (!item.request.body) return { contentType: null, body: null }
name,
item, // TODO: Implement
}: PostmanCollection) => { const body = item.request.body
const hoppscotchCollection: Collection<HoppRESTRequest> = makeCollection({
name: "", if (body.mode === "formdata") {
folders: [], return {
requests: [], 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<Item>): Collection<HoppRESTRequest> =>
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 export const getHoppCollection = (coll: PMCollection) => getHoppFolder(coll)
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 default defineImporter({ export default defineImporter({
name: "Postman Collection", name: "Postman Collection",
@@ -191,14 +242,12 @@ export default defineImporter({
] as const, ] as const,
importer: ([fileContent]) => importer: ([fileContent]) =>
pipe( pipe(
// Parse to JSON // Try reading
fileContent, fileContent,
safeParseJSON, readPMCollection,
// Parse To Postman Collection O.map(flow(getHoppCollection, A.of)),
O.chain((data) => O.tryCatch(() => parsePostmanCollection(data))),
// Convert Option to Task Either
TE.fromOption(() => IMPORTER_INVALID_FILE_FORMAT) TE.fromOption(() => IMPORTER_INVALID_FILE_FORMAT)
), ),
}) })

View File

@@ -92,6 +92,7 @@
"nuxt": "^2.15.8", "nuxt": "^2.15.8",
"openapi-types": "^10.0.0", "openapi-types": "^10.0.0",
"paho-mqtt": "^1.1.0", "paho-mqtt": "^1.1.0",
"postman-collection": "^4.1.1",
"rxjs": "^7.5.1", "rxjs": "^7.5.1",
"socket.io-client-v2": "npm:socket.io-client@^2.4.0", "socket.io-client-v2": "npm:socket.io-client@^2.4.0",
"socket.io-client-v3": "npm:socket.io-client@^3.1.3", "socket.io-client-v3": "npm:socket.io-client@^3.1.3",
@@ -142,6 +143,7 @@
"@types/har-format": "^1.2.8", "@types/har-format": "^1.2.8",
"@types/httpsnippet": "^1.23.1", "@types/httpsnippet": "^1.23.1",
"@types/lodash": "^4.14.178", "@types/lodash": "^4.14.178",
"@types/postman-collection": "^3.5.7",
"@types/splitpanes": "^2.2.1", "@types/splitpanes": "^2.2.1",
"@types/uuid": "^8.3.3", "@types/uuid": "^8.3.3",
"@urql/devtools": "^2.0.3", "@urql/devtools": "^2.0.3",

127
pnpm-lock.yaml generated
View File

@@ -106,6 +106,7 @@ importers:
'@types/har-format': ^1.2.8 '@types/har-format': ^1.2.8
'@types/httpsnippet': ^1.23.1 '@types/httpsnippet': ^1.23.1
'@types/lodash': ^4.14.178 '@types/lodash': ^4.14.178
'@types/postman-collection': ^3.5.7
'@types/splitpanes': ^2.2.1 '@types/splitpanes': ^2.2.1
'@types/uuid': ^8.3.3 '@types/uuid': ^8.3.3
'@urql/core': ^2.3.6 '@urql/core': ^2.3.6
@@ -148,6 +149,7 @@ importers:
nuxt-windicss: ^2.2.2 nuxt-windicss: ^2.2.2
openapi-types: ^10.0.0 openapi-types: ^10.0.0
paho-mqtt: ^1.1.0 paho-mqtt: ^1.1.0
postman-collection: ^4.1.1
prettier: ^2.5.1 prettier: ^2.5.1
raw-loader: ^4.0.2 raw-loader: ^4.0.2
rxjs: ^7.5.1 rxjs: ^7.5.1
@@ -239,6 +241,7 @@ importers:
nuxt: 2.15.8_typescript@4.5.4 nuxt: 2.15.8_typescript@4.5.4
openapi-types: 10.0.0 openapi-types: 10.0.0
paho-mqtt: 1.1.0 paho-mqtt: 1.1.0
postman-collection: 4.1.1
rxjs: 7.5.1 rxjs: 7.5.1
socket.io-client-v2: /socket.io-client/2.4.0 socket.io-client-v2: /socket.io-client/2.4.0
socket.io-client-v3: /socket.io-client/3.1.3 socket.io-client-v3: /socket.io-client/3.1.3
@@ -288,6 +291,7 @@ importers:
'@types/har-format': 1.2.8 '@types/har-format': 1.2.8
'@types/httpsnippet': 1.23.1 '@types/httpsnippet': 1.23.1
'@types/lodash': 4.14.178 '@types/lodash': 4.14.178
'@types/postman-collection': 3.5.7
'@types/splitpanes': 2.2.1 '@types/splitpanes': 2.2.1
'@types/uuid': 8.3.3 '@types/uuid': 8.3.3
'@urql/devtools': 2.0.3_@urql+core@2.3.6+graphql@15.7.2 '@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} engines: {node: ^8.13.0 || >=10.10.0}
dependencies: dependencies:
'@grpc/proto-loader': 0.6.7 '@grpc/proto-loader': 0.6.7
'@types/node': 16.11.12 '@types/node': 17.0.6
dev: false dev: false
/@grpc/proto-loader/0.6.7: /@grpc/proto-loader/0.6.7:
@@ -4530,7 +4534,7 @@ packages:
resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==}
dependencies: dependencies:
'@types/connect': 3.4.34 '@types/connect': 3.4.34
'@types/node': 12.20.12 '@types/node': 17.0.6
dev: true dev: true
/@types/browserslist/4.15.0: /@types/browserslist/4.15.0:
@@ -4545,7 +4549,7 @@ packages:
dependencies: dependencies:
'@types/http-cache-semantics': 4.0.1 '@types/http-cache-semantics': 4.0.1
'@types/keyv': 3.1.3 '@types/keyv': 3.1.3
'@types/node': 16.11.12 '@types/node': 17.0.6
'@types/responselike': 1.0.0 '@types/responselike': 1.0.0
dev: true dev: true
@@ -4559,7 +4563,7 @@ packages:
/@types/clean-css/4.2.5: /@types/clean-css/4.2.5:
resolution: {integrity: sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==} resolution: {integrity: sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
source-map: 0.6.1 source-map: 0.6.1
dev: true dev: true
@@ -4582,7 +4586,7 @@ packages:
/@types/connect/3.4.34: /@types/connect/3.4.34:
resolution: {integrity: sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==} resolution: {integrity: sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
dev: true dev: true
/@types/cookie/0.4.1: /@types/cookie/0.4.1:
@@ -4609,13 +4613,13 @@ packages:
/@types/etag/1.8.0: /@types/etag/1.8.0:
resolution: {integrity: sha512-EdSN0x+Y0/lBv7YAb8IU4Jgm6DWM+Bqtz7o5qozl96fzaqdqbdfHS5qjdpFeIv7xQ8jSLyjMMNShgYtMajEHyQ==} resolution: {integrity: sha512-EdSN0x+Y0/lBv7YAb8IU4Jgm6DWM+Bqtz7o5qozl96fzaqdqbdfHS5qjdpFeIv7xQ8jSLyjMMNShgYtMajEHyQ==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
dev: true dev: true
/@types/express-serve-static-core/4.17.24: /@types/express-serve-static-core/4.17.24:
resolution: {integrity: sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==} resolution: {integrity: sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
'@types/qs': 6.9.7 '@types/qs': 6.9.7
'@types/range-parser': 1.2.4 '@types/range-parser': 1.2.4
dev: true dev: true
@@ -4664,7 +4668,7 @@ packages:
/@types/http-proxy/1.17.7: /@types/http-proxy/1.17.7:
resolution: {integrity: sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==} resolution: {integrity: sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==}
dependencies: dependencies:
'@types/node': 16.11.12 '@types/node': 17.0.6
dev: false dev: false
/@types/httpsnippet/1.23.1: /@types/httpsnippet/1.23.1:
@@ -4714,13 +4718,13 @@ packages:
/@types/jsonwebtoken/8.5.6: /@types/jsonwebtoken/8.5.6:
resolution: {integrity: sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ==} resolution: {integrity: sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ==}
dependencies: dependencies:
'@types/node': 17.0.5 '@types/node': 17.0.6
dev: true dev: true
/@types/keyv/3.1.3: /@types/keyv/3.1.3:
resolution: {integrity: sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==} resolution: {integrity: sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==}
dependencies: dependencies:
'@types/node': 16.11.12 '@types/node': 17.0.6
dev: true dev: true
/@types/less/3.0.2: /@types/less/3.0.2:
@@ -4746,32 +4750,23 @@ packages:
/@types/node-sass/4.11.2: /@types/node-sass/4.11.2:
resolution: {integrity: sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==} resolution: {integrity: sha512-pOFlTw/OtZda4e+yMjq6/QYuvY0RDMQ+mxXdWj7rfSyf18V8hS4SfgurO+MasAkQsv6Wt6edOGlwh5QqJml9gw==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
dev: true dev: true
/@types/node/12.20.12: /@types/node/12.20.12:
resolution: {integrity: sha512-KQZ1al2hKOONAs2MFv+yTQP1LkDWMrRJ9YCVRalXltOfXsBmH5IownLxQaiq0lnAHwAViLnh2aTYqrPcRGEbgg==} resolution: {integrity: sha512-KQZ1al2hKOONAs2MFv+yTQP1LkDWMrRJ9YCVRalXltOfXsBmH5IownLxQaiq0lnAHwAViLnh2aTYqrPcRGEbgg==}
dev: true
/@types/node/12.20.36: /@types/node/12.20.36:
resolution: {integrity: sha512-+5haRZ9uzI7rYqzDznXgkuacqb6LJhAti8mzZKWxIXn/WEtvB+GHVJ7AuMwcN1HMvXOSJcrvA6PPoYHYOYYebA==} resolution: {integrity: sha512-+5haRZ9uzI7rYqzDznXgkuacqb6LJhAti8mzZKWxIXn/WEtvB+GHVJ7AuMwcN1HMvXOSJcrvA6PPoYHYOYYebA==}
dev: false dev: false
/@types/node/16.11.12:
resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==}
/@types/node/16.11.17: /@types/node/16.11.17:
resolution: {integrity: sha512-C1vTZME8cFo8uxY2ui41xcynEotVkczIVI5AjLmy5pkpBv/FtG+jhtOlfcPysI8VRVwoOMv6NJm44LGnoMSWkw==} resolution: {integrity: sha512-C1vTZME8cFo8uxY2ui41xcynEotVkczIVI5AjLmy5pkpBv/FtG+jhtOlfcPysI8VRVwoOMv6NJm44LGnoMSWkw==}
dev: true 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: /@types/node/17.0.6:
resolution: {integrity: sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==} resolution: {integrity: sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==}
dev: true
/@types/normalize-package-data/2.4.1: /@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@@ -4790,6 +4785,12 @@ packages:
/@types/parse-json/4.0.0: /@types/parse-json/4.0.0:
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} 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: /@types/prettier/2.4.2:
resolution: {integrity: sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==} resolution: {integrity: sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==}
dev: true dev: true
@@ -4816,7 +4817,7 @@ packages:
/@types/responselike/1.0.0: /@types/responselike/1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies: dependencies:
'@types/node': 16.11.12 '@types/node': 17.0.6
dev: true dev: true
/@types/sass-loader/8.0.1: /@types/sass-loader/8.0.1:
@@ -4830,13 +4831,13 @@ packages:
/@types/sass/1.43.0: /@types/sass/1.43.0:
resolution: {integrity: sha512-DPSXNJ1rYLo88GyF9tuB4bsYGfpKI1a4+wOQmc+LI1SUoocm9QLRSpz0GxxuyjmJsYFIQo/dDlRSSpIXngff+w==} resolution: {integrity: sha512-DPSXNJ1rYLo88GyF9tuB4bsYGfpKI1a4+wOQmc+LI1SUoocm9QLRSpz0GxxuyjmJsYFIQo/dDlRSSpIXngff+w==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
dev: true dev: true
/@types/sax/1.2.3: /@types/sax/1.2.3:
resolution: {integrity: sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==} resolution: {integrity: sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==}
dependencies: dependencies:
'@types/node': 12.20.36 '@types/node': 17.0.6
dev: false dev: false
/@types/semver/7.3.9: /@types/semver/7.3.9:
@@ -4847,7 +4848,7 @@ packages:
resolution: {integrity: sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==} resolution: {integrity: sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==}
dependencies: dependencies:
'@types/mime': 1.3.2 '@types/mime': 1.3.2
'@types/node': 12.20.12 '@types/node': 17.0.6
dev: true dev: true
/@types/source-list-map/0.1.2: /@types/source-list-map/0.1.2:
@@ -4939,7 +4940,7 @@ packages:
/@types/webpack-sources/3.2.0: /@types/webpack-sources/3.2.0:
resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==}
dependencies: dependencies:
'@types/node': 12.20.12 '@types/node': 17.0.6
'@types/source-list-map': 0.1.2 '@types/source-list-map': 0.1.2
source-map: 0.7.3 source-map: 0.7.3
@@ -4947,7 +4948,7 @@ packages:
resolution: {integrity: sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ==} resolution: {integrity: sha512-Nn84RAiJjKRfPFFCVR8LC4ueTtTdfWAMZ03THIzZWRJB+rX24BD3LqPSFnbMscWauEsT4segAsylPDIaZyZyLQ==}
dependencies: dependencies:
'@types/anymatch': 3.0.0 '@types/anymatch': 3.0.0
'@types/node': 12.20.12 '@types/node': 17.0.6
'@types/tapable': 1.0.8 '@types/tapable': 1.0.8
'@types/uglify-js': 3.13.1 '@types/uglify-js': 3.13.1
'@types/webpack-sources': 3.2.0 '@types/webpack-sources': 3.2.0
@@ -4957,7 +4958,7 @@ packages:
/@types/webpack/4.41.31: /@types/webpack/4.41.31:
resolution: {integrity: sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==} resolution: {integrity: sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==}
dependencies: dependencies:
'@types/node': 16.11.12 '@types/node': 17.0.6
'@types/tapable': 1.0.8 '@types/tapable': 1.0.8
'@types/uglify-js': 3.13.1 '@types/uglify-js': 3.13.1
'@types/webpack-sources': 3.2.0 '@types/webpack-sources': 3.2.0
@@ -4968,12 +4969,12 @@ packages:
/@types/websocket/1.0.4: /@types/websocket/1.0.4:
resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==} resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==}
dependencies: dependencies:
'@types/node': 17.0.5 '@types/node': 17.0.6
/@types/ws/8.2.2: /@types/ws/8.2.2:
resolution: {integrity: sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==} resolution: {integrity: sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==}
dependencies: dependencies:
'@types/node': 17.0.5 '@types/node': 17.0.6
/@types/yargs-parser/20.2.1: /@types/yargs-parser/20.2.1:
resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==}
@@ -6902,6 +6903,11 @@ packages:
/chardet/0.7.0: /chardet/0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 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: /cheerio-select/1.5.0:
resolution: {integrity: sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==} resolution: {integrity: sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==}
dependencies: dependencies:
@@ -9309,6 +9315,10 @@ packages:
css: 2.2.4 css: 2.2.4
dev: true dev: true
/faker/5.5.3:
resolution: {integrity: sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==}
dev: false
/fast-deep-equal/3.1.3: /fast-deep-equal/3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -9424,6 +9434,11 @@ packages:
webpack: 4.46.0 webpack: 4.46.0
dev: false 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: /file-uri-to-path/1.0.0:
resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
@@ -10560,6 +10575,10 @@ packages:
- debug - debug
dev: false dev: false
/http-reasons/0.1.0:
resolution: {integrity: sha1-qVPKZwB4Zp3eFCzomUAbnW6F07Q=}
dev: false
/http-shutdown/1.2.2: /http-shutdown/1.2.2:
resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
@@ -10624,6 +10643,13 @@ packages:
dependencies: dependencies:
safer-buffer: 2.1.2 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: /icss-utils/4.1.1:
resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@@ -11825,7 +11851,7 @@ packages:
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
engines: {node: '>= 10.13.0'} engines: {node: '>= 10.13.0'}
dependencies: dependencies:
'@types/node': 16.11.6 '@types/node': 17.0.6
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 7.2.0 supports-color: 7.2.0
@@ -11833,7 +11859,7 @@ packages:
resolution: {integrity: sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==} resolution: {integrity: sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==}
engines: {node: '>= 10.13.0'} engines: {node: '>= 10.13.0'}
dependencies: dependencies:
'@types/node': 16.11.12 '@types/node': 17.0.6
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 8.1.1 supports-color: 8.1.1
dev: true dev: true
@@ -12237,6 +12263,11 @@ packages:
- enquirer - enquirer
dev: false dev: false
/liquid-json/0.3.1:
resolution: {integrity: sha1-kVWhgTbYprJhXl8W+aJEira1Duo=}
engines: {node: '>=4'}
dev: false
/listhen/0.2.5: /listhen/0.2.5:
resolution: {integrity: sha512-7stTOFjeQHVkDqpPl0AtGdzXNu1XN5sE2Pi4mudeZ597c100OKvUpmPuv3MKemDScIWqmIbeUOeP3PBo0w49XQ==} resolution: {integrity: sha512-7stTOFjeQHVkDqpPl0AtGdzXNu1XN5sE2Pi4mudeZ597c100OKvUpmPuv3MKemDScIWqmIbeUOeP3PBo0w49XQ==}
dependencies: dependencies:
@@ -12824,6 +12855,12 @@ packages:
resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==}
engines: {node: '>= 0.6'} 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: /mime-types/2.1.33:
resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==} resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
@@ -14758,6 +14795,30 @@ packages:
posthtml-render: 1.4.0 posthtml-render: 1.4.0
dev: true 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: /prelude-ls/1.1.2:
resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@@ -14906,7 +14967,7 @@ packages:
'@protobufjs/pool': 1.1.0 '@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0 '@protobufjs/utf8': 1.1.0
'@types/long': 4.0.1 '@types/long': 4.0.1
'@types/node': 16.11.12 '@types/node': 17.0.6
long: 4.0.0 long: 4.0.0
dev: false dev: false