feat: add individual content types for formadata (#4550)

Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com>
This commit is contained in:
Akash K
2024-11-24 19:36:10 +05:30
committed by GitHub
parent b78cd57884
commit c74c42ebaf
10 changed files with 161 additions and 10 deletions

View File

@@ -12,19 +12,18 @@ import V2_VERSION, { HoppRESTRequestVariables } from "./v/2"
import V3_VERSION from "./v/3"
import V4_VERSION from "./v/4"
import V5_VERSION from "./v/5"
import V6_VERSION, { HoppRESTReqBody } from "./v/6"
import V6_VERSION from "./v/6"
import V7_VERSION, { HoppRESTHeaders, HoppRESTParams } from "./v/7"
import V8_VERSION, { HoppRESTAuth, HoppRESTRequestResponses } from "./v/8"
import V9_VERSION, { HoppRESTReqBody } from "./v/9"
export * from "./content-types"
export {
FormDataKeyValue,
HoppRESTAuthBasic,
HoppRESTAuthBearer,
HoppRESTAuthInherit,
HoppRESTAuthNone,
HoppRESTReqBodyFormData,
} from "./v/1"
export { HoppRESTRequestVariables } from "./v/2"
@@ -35,8 +34,6 @@ export { HoppRESTAuthAPIKey } from "./v/4"
export { AuthCodeGrantTypeParams } from "./v/5"
export { HoppRESTReqBody } from "./v/6"
export {
HoppRESTAuthAWSSignature,
HoppRESTHeaders,
@@ -54,13 +51,15 @@ export {
HoppRESTRequestResponses,
} from "./v/8"
export { FormDataKeyValue, HoppRESTReqBody } from "./v/9"
const versionedObject = z.object({
// v is a stringified number
v: z.string().regex(/^\d+$/).transform(Number),
})
export const HoppRESTRequest = createVersionedEntity({
latestVersion: 8,
latestVersion: 9,
versionMap: {
0: V0_VERSION,
1: V1_VERSION,
@@ -71,6 +70,7 @@ export const HoppRESTRequest = createVersionedEntity({
6: V6_VERSION,
7: V7_VERSION,
8: V8_VERSION,
9: V9_VERSION,
},
getVersion(data) {
// For V1 onwards we have the v string storing the number
@@ -113,7 +113,7 @@ const HoppRESTRequestEq = Eq.struct<HoppRESTRequest>({
responses: lodashIsEqualEq,
})
export const RESTReqSchemaVersion = "8"
export const RESTReqSchemaVersion = "9"
export type HoppRESTParam = HoppRESTRequest["params"][number]
export type HoppRESTHeader = HoppRESTRequest["headers"][number]

View File

@@ -0,0 +1,70 @@
import { defineVersion } from "verzod"
import { z } from "zod"
import { V8_SCHEMA } from "./8"
export const FormDataKeyValue = z
.object({
key: z.string(),
active: z.boolean(),
contentType: z.string().optional().catch(undefined),
})
.and(
z.union([
z.object({
isFile: z.literal(true),
value: z.array(z.instanceof(Blob).nullable()),
}),
z.object({
isFile: z.literal(false),
value: z.string(),
}),
])
)
export type FormDataKeyValue = z.infer<typeof FormDataKeyValue>
export const HoppRESTReqBody = z.union([
z.object({
contentType: z.literal(null),
body: z.literal(null).catch(null),
}),
z.object({
contentType: z.literal("multipart/form-data"),
body: z.array(FormDataKeyValue).catch([]),
showIndividualContentType: z.boolean().optional().catch(false),
}),
z.object({
contentType: z.union([
z.literal("application/json"),
z.literal("application/ld+json"),
z.literal("application/hal+json"),
z.literal("application/vnd.api+json"),
z.literal("application/xml"),
z.literal("text/xml"),
z.literal("application/x-www-form-urlencoded"),
z.literal("text/html"),
z.literal("text/plain"),
]),
body: z.string().catch(""),
}),
])
export type HoppRESTReqBody = z.infer<typeof HoppRESTReqBody>
export const V9_SCHEMA = V8_SCHEMA.extend({
v: z.literal("9"),
body: HoppRESTReqBody,
})
export default defineVersion({
schema: V9_SCHEMA,
initial: false,
up(old: z.infer<typeof V8_SCHEMA>) {
// No migration, the new contentType added to each formdata field is optional
return {
...old,
v: "9" as const,
}
},
})