Files
payloadcms/test/helpers/sdk/index.ts
Jacob Fletcher f19053e049 fix(next): properly threads field permissions through versions diff (#9543)
The version diff view at
`/admin/collections/:collection/:id/versions/:version` was not properly
displaying diffs for iterable fields, such as blocks. There were two
main things wrong here:

1. Fields not properly inheriting parent permissions based on the new
sanitized permissions pattern in #7335
1. The diff components were expecting `permissions` but receiving
`fieldPermissions`. This was not picked up by TS because of our use of
dynamic keys when choosing which component to render for that particular
field. We should change this in the future to use a switch case that
explicitly renders each diff component. This way props are strictly
typed.
2024-11-26 19:33:10 +00:00

135 lines
2.9 KiB
TypeScript

import type { PaginatedDocs, SendEmailOptions } from 'payload'
import type {
CreateArgs,
DeleteArgs,
FetchOptions,
FindArgs,
GeneratedTypes,
LoginArgs,
UpdateArgs,
UpdateGlobalArgs,
} from './types.js'
type Args = {
serverURL: string
}
export class PayloadTestSDK<TGeneratedTypes extends GeneratedTypes<TGeneratedTypes>> {
private fetch = async <T>({ jwt, reduceJSON, args, operation }: FetchOptions): Promise<T> => {
const headers: HeadersInit = {
'Content-Type': 'application/json',
}
if (jwt) {
headers.Authorization = `JWT ${jwt}`
}
const json: T = await fetch(`${this.serverURL}/api/local-api`, {
method: 'post',
headers,
body: JSON.stringify({
args,
operation,
}),
}).then((res) => res.json())
if (reduceJSON) {
return reduceJSON<T>(json)
}
return json
}
create = async <T extends keyof TGeneratedTypes['collections']>({
jwt,
...args
}: CreateArgs<TGeneratedTypes, T>) => {
return this.fetch<TGeneratedTypes['collections'][T]>({
operation: 'create',
args,
jwt,
})
}
delete = async <T extends keyof TGeneratedTypes['collections']>({
jwt,
...args
}: DeleteArgs<TGeneratedTypes, T>) => {
return this.fetch<PaginatedDocs<TGeneratedTypes['collections'][T]>>({
operation: 'delete',
args,
jwt,
})
}
find = async <T extends keyof TGeneratedTypes['collections']>({
jwt,
...args
}: FindArgs<TGeneratedTypes, T>) => {
return this.fetch<PaginatedDocs<TGeneratedTypes['collections'][T]>>({
operation: 'find',
args,
jwt,
})
}
findVersions = async <T extends keyof TGeneratedTypes['collections']>({
jwt,
...args
}: FindArgs<TGeneratedTypes, T>) => {
return this.fetch<PaginatedDocs<TGeneratedTypes['collections'][T]>>({
operation: 'findVersions',
args,
jwt,
})
}
login = async <T extends keyof TGeneratedTypes['collections']>({
jwt,
...args
}: LoginArgs<TGeneratedTypes, T>) => {
return this.fetch<TGeneratedTypes['collections'][T]>({
operation: 'login',
args,
jwt,
})
}
sendEmail = async ({ jwt, ...args }: { jwt?: string } & SendEmailOptions): Promise<unknown> => {
return this.fetch({
operation: 'sendEmail',
args,
jwt,
})
}
serverURL: string
update = async <T extends keyof TGeneratedTypes['collections']>({
jwt,
...args
}: UpdateArgs<TGeneratedTypes, T>) => {
return this.fetch<TGeneratedTypes['collections'][T]>({
operation: 'update',
args,
jwt,
})
}
updateGlobal = async <T extends keyof TGeneratedTypes['globals']>({
jwt,
...args
}: UpdateGlobalArgs<TGeneratedTypes, T>) => {
return this.fetch<TGeneratedTypes['collections'][T]>({
operation: 'updateGlobal',
args,
jwt,
})
}
constructor({ serverURL }: Args) {
this.serverURL = serverURL
}
}