feat: steps system infra

This commit is contained in:
Andrew Bastin
2021-12-23 14:43:46 +05:30
parent a9292eed9e
commit 5175a86145
3 changed files with 81 additions and 32 deletions

View File

@@ -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

View File

@@ -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

View 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,
}