Files
hoppscotch/packages/hoppscotch-app/helpers/import-export/import/insomnia.ts
2022-01-13 02:32:22 +05:30

56 lines
1.7 KiB
TypeScript

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"
// This Importer definition is less than ideal,
// would love an attempt at refactoring this
export default defineImporter({
name: "Insomnia Collection",
icon: "insomnia",
steps: [
step({
stepName: "FILE_IMPORT",
metadata: {
acceptedFileTypes: ".json",
},
}),
] as const,
importer: ([fileContent]) => {
try {
let collections = parseInsomniaCollection(fileContent)
const content = JSON.stringify(collections)
if (collections[0]) {
const [name, folders, requests] = Object.keys(collections[0])
if (
name === "name" &&
folders === "folders" &&
requests === "requests"
) {
return TE.right(collections as Collection<HoppRESTRequest>[])
}
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 <<var>>
collections = JSON.parse(content.replaceAll(/{{([a-z]+)}}/gi, "<<$1>>"))
collections = [getHoppCollection(collections)]
return TE.right(collections as Collection<HoppRESTRequest>[])
} else {
return TE.left(IMPORTER_INVALID_FILE_FORMAT)
}
} catch (_e) {
return TE.left(IMPORTER_INVALID_FILE_FORMAT)
}
},
})