import {z} from 'zod' export type DeleteApiAuthArgs = {provider?: string | undefined, State?: string | undefined, oauth_token?: string | undefined, oauth_verifier?: string | undefined, UserName?: string | undefined, Password?: string | undefined, RememberMe?: boolean | undefined, Continue?: string | undefined, nonce?: string | undefined, uri?: string | undefined, response?: string | undefined, qop?: string | undefined, nc?: string | undefined, cnonce?: string | undefined, UseTokenCookie?: boolean | undefined, AccessToken?: string | undefined, AccessTokenSecret?: string | undefined, Meta?: string | undefined}; export type DeleteApiAuthOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const dictionaryStringString = z.record(z.string(), z.string()); export const responseError = z.object({ErrorCode: z.string().optional(), FieldName: z.string().optional(), Message: z.string().optional(), Meta: dictionaryStringString.optional()}); export const responseStatus = z.object({ErrorCode: z.string().optional(), Message: z.string().optional(), StackTrace: z.string().optional(), Errors: z.array(responseError).optional(), Meta: dictionaryStringString.optional()}); export const authenticateResponse = z.object({UserId: z.string().optional(), SessionId: z.string().optional(), UserName: z.string().optional(), DisplayName: z.string().optional(), ReferrerUrl: z.string().optional(), BearerToken: z.string().optional(), RefreshToken: z.string().optional(), ResponseStatus: responseStatus.optional(), Meta: dictionaryStringString.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * DELETE /auth */ export const deleteApiAuth = async (args: DeleteApiAuthArgs, options?: DeleteApiAuthOptions) => { const {baseUrl = "https://ws.yourmembership.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.provider != null) query.append("provider", String(args.provider)) if (args.State != null) query.append("State", String(args.State)) if (args.oauth_token != null) query.append("oauth_token", String(args.oauth_token)) if (args.oauth_verifier != null) query.append("oauth_verifier", String(args.oauth_verifier)) if (args.UserName != null) query.append("UserName", String(args.UserName)) if (args.Password != null) query.append("Password", String(args.Password)) if (args.RememberMe != null) query.append("RememberMe", String(args.RememberMe)) if (args.Continue != null) query.append("Continue", String(args.Continue)) if (args.nonce != null) query.append("nonce", String(args.nonce)) if (args.uri != null) query.append("uri", String(args.uri)) if (args.response != null) query.append("response", String(args.response)) if (args.qop != null) query.append("qop", String(args.qop)) if (args.nc != null) query.append("nc", String(args.nc)) if (args.cnonce != null) query.append("cnonce", String(args.cnonce)) if (args.UseTokenCookie != null) query.append("UseTokenCookie", String(args.UseTokenCookie)) if (args.AccessToken != null) query.append("AccessToken", String(args.AccessToken)) if (args.AccessTokenSecret != null) query.append("AccessTokenSecret", String(args.AccessTokenSecret)) if (args.Meta != null) query.append("Meta", String(args.Meta)) const url = `${baseUrl.replace(/\/+$/, '')}/auth${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "DELETE", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(authenticateResponse, await res.json()) };