feat: steps system infra
This commit is contained in:
@@ -1,23 +1,22 @@
|
|||||||
import { HoppRESTRequest } from "@hoppscotch/data"
|
|
||||||
import { pipe } from "fp-ts/function"
|
import { pipe } from "fp-ts/function"
|
||||||
import * as TE from "fp-ts/TaskEither"
|
import * as TE from "fp-ts/TaskEither"
|
||||||
import * as E from "fp-ts/Either"
|
import * as E from "fp-ts/Either"
|
||||||
import { HoppImporter, IMPORTER_INVALID_FILE_FORMAT } from "."
|
import { step } from "../steps"
|
||||||
import {
|
import { defineImporter, IMPORTER_INVALID_FILE_FORMAT } from "."
|
||||||
Collection,
|
import { translateToNewRESTCollection } from "~/newstore/collections"
|
||||||
translateToNewRESTCollection,
|
|
||||||
} from "~/newstore/collections"
|
|
||||||
|
|
||||||
const importer: HoppImporter<Collection<HoppRESTRequest>[]> = (content) =>
|
export default defineImporter({
|
||||||
pipe(
|
name: "Hoppscotch REST Collection",
|
||||||
E.tryCatch(
|
steps: [step("FILE_OR_URL_IMPORT", "Select a file or URL")] as const,
|
||||||
() =>
|
importer: ([content]) =>
|
||||||
JSON.parse(content).map((coll: any) =>
|
pipe(
|
||||||
translateToNewRESTCollection(coll)
|
E.tryCatch(
|
||||||
),
|
() =>
|
||||||
() => IMPORTER_INVALID_FILE_FORMAT
|
JSON.parse(content).map((coll: any) =>
|
||||||
|
translateToNewRESTCollection(coll)
|
||||||
|
),
|
||||||
|
() => IMPORTER_INVALID_FILE_FORMAT
|
||||||
|
),
|
||||||
|
TE.fromEither
|
||||||
),
|
),
|
||||||
TE.fromEither
|
})
|
||||||
)
|
|
||||||
|
|
||||||
export default importer
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as TE from "fp-ts/TaskEither"
|
import * as TE from "fp-ts/TaskEither"
|
||||||
import { HoppRESTRequest } from "@hoppscotch/data"
|
import { StepsOutputList } from "../steps"
|
||||||
import { Collection } from "~/newstore/collections"
|
import HoppRESTCollImporter from "../import/hopp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The error state to be used when the file formats do not match
|
* The error state to be used when the file formats do not match
|
||||||
@@ -10,14 +10,14 @@ export const IMPORTER_INVALID_FILE_FORMAT =
|
|||||||
|
|
||||||
export type HoppImporterError = typeof IMPORTER_INVALID_FILE_FORMAT
|
export type HoppImporterError = typeof IMPORTER_INVALID_FILE_FORMAT
|
||||||
|
|
||||||
export type HoppImporter<T> = (
|
type HoppImporter<T, StepsType> = (
|
||||||
content: string
|
stepValues: StepsOutputList<StepsType>
|
||||||
) => TE.TaskEither<HoppImporterError, T>
|
) => TE.TaskEither<HoppImporterError, T>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Definition for importers
|
* Definition for importers
|
||||||
*/
|
*/
|
||||||
export type HoppImporterDefintion<T> = {
|
type HoppImporterDefintion<T, Y> = {
|
||||||
/**
|
/**
|
||||||
* Name of the importer, shown on the Select Importer dropdown
|
* Name of the importer, shown on the Select Importer dropdown
|
||||||
*/
|
*/
|
||||||
@@ -26,14 +26,24 @@ export type HoppImporterDefintion<T> = {
|
|||||||
/**
|
/**
|
||||||
* The importer function, It is a Promise because its supposed to be loaded in lazily (dynamic imports ?)
|
* The importer function, It is a Promise because its supposed to be loaded in lazily (dynamic imports ?)
|
||||||
*/
|
*/
|
||||||
importer: () => Promise<HoppImporter<T>>
|
importer: HoppImporter<T, Y>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The steps to fetch information required to run an importer
|
||||||
|
*/
|
||||||
|
steps: Y
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RESTCollectionImporters: HoppImporterDefintion<
|
/**
|
||||||
Collection<HoppRESTRequest>[]
|
* Defines a Hoppscotch importer
|
||||||
>[] = [
|
*/
|
||||||
{
|
export const defineImporter = <ReturnType, StepType>(input: {
|
||||||
name: "Hoppscotch REST Collection",
|
name: string
|
||||||
importer: () => import("./hopp").then((m) => m.default),
|
importer: HoppImporter<ReturnType, StepType>
|
||||||
},
|
steps: StepType
|
||||||
]
|
}) =>
|
||||||
|
<HoppImporterDefintion<ReturnType, StepType>>{
|
||||||
|
...input,
|
||||||
|
}
|
||||||
|
|
||||||
|
export const RESTCollectionImporters = [HoppRESTCollImporter] as const
|
||||||
|
|||||||
40
packages/hoppscotch-app/helpers/import-export/steps.ts
Normal file
40
packages/hoppscotch-app/helpers/import-export/steps.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* Defines which type of content a Step returns.
|
||||||
|
* Add an entry here when you define a step
|
||||||
|
*/
|
||||||
|
export type StepReturnTypes = {
|
||||||
|
FILE_OR_URL_IMPORT: string // String content of the file/url
|
||||||
|
TARGET_MY_COLLECTION: number // folderPath
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines what the data structure of a step
|
||||||
|
*/
|
||||||
|
export type Step<T extends keyof StepReturnTypes> = {
|
||||||
|
name: T
|
||||||
|
caption?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The return output value of an individual step
|
||||||
|
*/
|
||||||
|
export type StepReturnType<T> = T extends Step<infer U>
|
||||||
|
? StepReturnTypes[U]
|
||||||
|
: never
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the value of the output list generated by a step
|
||||||
|
*/
|
||||||
|
export type StepsOutputList<T> = {
|
||||||
|
[K in keyof T]: StepReturnType<T[K]>
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Use this function to define a step */
|
||||||
|
export const step = <T extends keyof StepReturnTypes>(
|
||||||
|
stepName: T,
|
||||||
|
caption?: string
|
||||||
|
) =>
|
||||||
|
<Step<T>>{
|
||||||
|
name: stepName,
|
||||||
|
caption,
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user