import { z } from "zod"; import { ProjectId } from "../../projects"; import { ExternalApplication, InternalApplication, } from "../brett-applications"; const WorkspaceSchema = z.object({ name: z.string(), title: z.string(), subtitle: z.string().nullable().optional(), basePath: z.string(), projectId: ProjectId, dataset: z.string().optional(), icon: z.string().nullable().optional(), }); /** * @public */ export type Workspace = z.output; /** * @public */ export const LocalStudioApplicationManifest = z.object({ version: z.number(), createdAt: z.string(), studioVersion: z.string().optional(), workspaces: z.array( WorkspaceSchema.extend({ dataset: z.string(), schema: z.string(), tools: z.string().optional(), }), ), }); /** * @public */ export type LocalStudioApplicationManifest = z.output< typeof LocalStudioApplicationManifest >; const internalStudioApplication = InternalApplication.extend({ type: z.literal("studio"), title: z.string(), config: z.object({ studio: z.object({ projectId: ProjectId, autoUpdatingVersion: z.string().nullable(), }), mfManifest: z.unknown().optional(), }), }); const externalStudioApplication = ExternalApplication.extend({ type: z.literal("studio"), title: z.string(), config: z.object({ studio: z.object({ projectId: ProjectId, autoUpdatingVersion: z.string().nullable(), }), mfManifest: z.unknown().optional(), }), }); /** * A studio from `GET /applications?type=studio`, brett's shape verbatim. * @public */ export const Studio = z.union([ internalStudioApplication, externalStudioApplication, ]); /** * A Sanity-hosted studio (`slug` set, `externalUrl: null`). * @public */ export type InternalStudioApplication = z.output< typeof internalStudioApplication >; /** * An externally hosted studio (`externalUrl` set, `slug: null`). * @public */ export type ExternalStudioApplication = z.output< typeof externalStudioApplication >; /** * @public */ export type Studio = z.output; /** * Validates and parses a raw API response into a branded * Studio. * @public */ export function parseStudioApplication(data: unknown): Studio { return Studio.parse(data); }