import {z} from 'zod' export type GetApiThemesThemeIdArgs = {themeId: string, Accept: string}; export type GetApiThemesThemeIdOptions = {baseUrl?: string | undefined, JWTBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const overlaySettings = z.object({width: z.number().int(), height: z.number().int(), name: z.string()}); export const listeners = z.object({"tip-latest": z.boolean(), "subscriber-latest": z.boolean(), "follower-latest": z.boolean(), "cheer-latest": z.boolean(), "host-latest": z.boolean(), "raid-latest": z.boolean(), "redemption-latest": z.boolean().optional()}); export const css = z.object({"z-index": z.number().int(), top: z.string(), left: z.string(), width: z.string(), height: z.string(), opacity: z.number().int()}); export const scrolling = z.object({direction: z.string(), speed: z.number().int()}); export const message = z.object({enableShadow: z.boolean(), "font-family": z.string(), "font-size": z.number().int(), "line-height": z.number(), color: z.string(), "text-align": z.string()}); export const css1 = z.object({position: z.string(), "z-index": z.number().int(), "font-family": z.string(), "font-size": z.number().int(), color: z.string(), "font-weight": z.string(), "text-shadow": z.string(), "text-align": z.string(), "line-height": z.number(), message: message}); export const text = z.object({type: z.string(), enableShadow: z.boolean(), scrolling: scrolling, css: css1}); export const css2 = z.object({"max-width": z.string()}); export const image = z.object({type: z.string(), css: css2}); export const css3 = z.object({widget: z.number().int(), height: z.number().int()}); export const video = z.object({type: z.string(), css: css3}); export const audio = z.object({type: z.string(), volume: z.number().int()}); export const animation = z.object({in: z.string(), out: z.string(), timeout: z.number().int().optional(), hide: z.boolean().optional()}); export const highlights = z.object({color: z.string()}); export const message1 = z.object({"font-size": z.number().int(), "font-family": z.string(), color: z.string(), "text-shadow": z.string(), "text-align": z.string(), margin: z.string()}); export const textCSS = z.object({"font-family": z.string(), "font-size": z.number().int(), color: z.string(), "font-weight": z.string(), "text-shadow": z.string(), "text-align": z.string(), highlights: highlights, message: message1}); export const text1 = z.object({animation: z.string(), css: textCSS, enableShadow: z.boolean(), message: z.string()}); export const graphics = z.object({src: z.string().nullable(), type: z.string()}); export const audio1 = z.object({src: z.string().nullable(), volume: z.number().optional()}); export const follower = z.object({enableRandomPick: z.boolean(), enabled: z.boolean(), duration: z.number().int(), layout: z.string(), text: text1, graphics: graphics, audio: audio1, animation: animation, variations: z.array(z.string())}); export const css6 = z.object({"margin-top": z.number().int()}); export const text3 = z.object({message: z.string(), css: css6.optional()}); export const subVariationSettings = z.object({layout: z.string(), text: text3, graphics: graphics}); export const variation = z.object({name: z.string(), type: z.string(), condition: z.string().optional(), requirement: z.number().int().optional(), settings: subVariationSettings}); export const tts = z.object({enabled: z.boolean(), voice: z.string(), volume: z.number(), minAmount: z.number().int()}); export const subscriber1 = z.object({enableRandomPick: z.boolean(), enabled: z.boolean(), duration: z.number().int(), layout: z.string(), text: text1, graphics: graphics, audio: audio1, animation: animation, variations: z.array(variation), tts: tts}); export const tip1 = z.object({enableRandomPick: z.boolean(), enabled: z.boolean(), duration: z.number().int(), layout: z.string(), text: text1, graphics: graphics, audio: audio1, animation: animation, variations: z.array(z.string()), tts: tts}); export const host1 = z.object({enableRandomPick: z.boolean(), enabled: z.boolean(), duration: z.number().int(), layout: z.string(), text: text1, graphics: graphics, audio: audio1, animation: animation, variations: z.array(z.string()), minAmount: z.number().int()}); export const raid1 = z.object({enableRandomPick: z.boolean(), enabled: z.boolean(), duration: z.number().int(), layout: z.string(), text: text1, graphics: graphics, audio: audio1, animation: animation, variations: z.array(z.string())}); export const cheerAlertSettings = z.object({graphics: graphics, audio: audio1, text: text1}); export const variation1 = z.object({name: z.string(), condition: z.string(), requirement: z.number().int(), layout: z.string().optional(), settings: cheerAlertSettings}); export const cheer1 = z.object({enableRandomPick: z.boolean(), enabled: z.boolean(), duration: z.number().int(), layout: z.string(), text: text1, graphics: graphics, audio: audio1, animation: animation, variations: z.array(variation1), tts: tts}); export const variables = z.object({css: z.string().optional(), html: z.string().optional(), js: z.string().optional(), follower: follower.optional(), subscriber: subscriber1.optional(), tip: tip1.optional(), host: host1.optional(), raid: raid1.optional(), cheer: cheer1.optional()}); export const widget = z.object({id: z.number().int(), type: z.string(), visible: z.boolean(), locked: z.boolean(), listeners: listeners, css: css, text: text, image: image, video: video, audio: audio, animation: animation, variables: variables, provider: z.string(), staffOnly: z.boolean(), version: z.number().optional()}); export const overlayData = z.object({settings: overlaySettings, widgets: widget.optional(), type: z.string(), preview: z.string(), mobile: z.boolean(), _id: z.string(), game: z.string().nullable(), name: z.string(), channel: z.string(), createdAt: z.string(), updatedAt: z.string()}); 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 }; /** * /:themeId * * GET /themes/{themeId} * * Also accepts auth: OAuth2, ApiKeyBearer */ export const getApiThemesThemeId = async (args: GetApiThemesThemeIdArgs, options?: GetApiThemesThemeIdOptions) => { const {baseUrl = "https://api.streamelements.com/kappa/v2", fetch: fetchFn = fetch, JWTBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json; charset=utf-8") if (args.Accept != null) headers.set("Accept", String(args.Accept)) if (JWTBearer !== undefined) headers.set('authorization', `Bearer ${JWTBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/themes/${encodeURIComponent(String(args.themeId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(overlayData, await res.json()) };