diff --git a/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts b/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts index 723b2af77..2e144ce28 100644 --- a/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts +++ b/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts @@ -4,11 +4,12 @@ import * as O from "fp-ts/Option" import * as RA from "fp-ts/ReadonlyArray" import * as A from "fp-ts/Array" import { translateToNewRESTCollection, HoppCollection } from "@hoppscotch/data" -import { isPlainObject as _isPlainObject } from "lodash-es" import { IMPORTER_INVALID_FILE_FORMAT } from "." import { safeParseJSON } from "~/helpers/functional/json" import { translateToNewGQLCollection } from "@hoppscotch/data" +import { entityReference } from "verzod" +import { z } from "zod" export const hoppRESTImporter = (content: string[]) => pipe( @@ -26,26 +27,14 @@ export const hoppRESTImporter = (content: string[]) => TE.fromOption(() => IMPORTER_INVALID_FILE_FORMAT) ) -/** - * checks if a value is a plain object - */ -const isPlainObject = (value: any): value is object => _isPlainObject(value) - -/** - * checks if a collection matches the schema for a hoppscotch collection. - * here 2 is the latest version of the schema. - */ -const isValidCollection = (collection: unknown): collection is HoppCollection => - isPlainObject(collection) && "v" in collection && collection.v === 2 - /** * checks if a collection is a valid hoppscotch collection. * else translate it into one. */ const validateCollection = (collection: unknown) => { - if (isValidCollection(collection)) { - return O.some(collection) - } + const result = entityReference(HoppCollection).safeParse(collection) + if (result.success) return O.some(result.data) + return O.some(translateToNewRESTCollection(collection)) } @@ -75,8 +64,9 @@ export const hoppGQLImporter = (content: string) => * @returns the collection if it is valid, else a translated version of the collection */ export const validateGQLCollection = (collection: unknown) => { - if (isValidCollection(collection)) { - return O.some(collection) - } + const result = z.array(entityReference(HoppCollection)).safeParse(collection) + + if (result.success) return O.some(result.data) + return O.some(translateToNewGQLCollection(collection)) } diff --git a/packages/hoppscotch-data/src/collection/index.ts b/packages/hoppscotch-data/src/collection/index.ts index ee01b7098..47e5180c1 100644 --- a/packages/hoppscotch-data/src/collection/index.ts +++ b/packages/hoppscotch-data/src/collection/index.ts @@ -52,8 +52,6 @@ export function makeCollection(x: Omit): HoppCollection { * @returns The proper new collection format */ export function translateToNewRESTCollection(x: any): HoppCollection { - if (x.v && x.v === CollectionSchemaVersion) return x - // Legacy const name = x.name ?? "Untitled" const folders = (x.folders ?? []).map(translateToNewRESTCollection) @@ -81,8 +79,6 @@ export function translateToNewRESTCollection(x: any): HoppCollection { * @returns The proper new collection format */ export function translateToNewGQLCollection(x: any): HoppCollection { - if (x.v && x.v === CollectionSchemaVersion) return x - // Legacy const name = x.name ?? "Untitled" const folders = (x.folders ?? []).map(translateToNewGQLCollection) diff --git a/packages/hoppscotch-data/src/rest/v/2.ts b/packages/hoppscotch-data/src/rest/v/2.ts index 6c257e2ca..894a37271 100644 --- a/packages/hoppscotch-data/src/rest/v/2.ts +++ b/packages/hoppscotch-data/src/rest/v/2.ts @@ -18,22 +18,8 @@ export const HoppRESTRequestVariables = z.array( export type HoppRESTRequestVariables = z.infer -const V2_SCHEMA = z.object({ +const V2_SCHEMA = V1_SCHEMA.extend({ v: z.literal("2"), - id: z.optional(z.string()), // Firebase Firestore ID - - name: z.string(), - method: z.string(), - endpoint: z.string(), - params: HoppRESTParams, - headers: HoppRESTHeaders, - preRequestScript: z.string().catch(""), - testScript: z.string().catch(""), - - auth: HoppRESTAuth, - - body: HoppRESTReqBody, - requestVariables: HoppRESTRequestVariables, }) diff --git a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts index f4600e91a..38b3854e5 100644 --- a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts +++ b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts @@ -125,20 +125,34 @@ function exportedCollectionToHoppCollection( if (requestParsedResult.type === "ok") { return requestParsedResult.value } else { + const { + v, + id, + auth, + body, + endpoint, + headers, + method, + name, + params, + preRequestScript, + testScript, + requestVariables, + } = request return { - id: request.id, - v: "2", - auth: request.auth, - body: request.body, - endpoint: request.endpoint, - headers: request.headers, - method: request.method, - name: request.name, - params: request.params, - preRequestScript: request.preRequestScript, - testScript: request.testScript, - requestVariables: [], - } as HoppRESTRequest + v, + id, + name, + endpoint, + method, + params, + requestVariables: requestVariables, + auth, + headers, + body, + preRequestScript, + testScript, + } } }), auth: data.auth,