UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

96 lines (88 loc) 2.92 kB
import {type SanityClient} from '@sanity/client' import {type CurrentUser} from '@sanity/types' import {combineLatest, firstValueFrom, type Observable} from 'rxjs' import {map} from 'rxjs/operators' import {createMockAuthStore} from '../store' import {prepareConfig} from './prepareConfig' import { type Config, type SchemaPluginOptions, type SingleWorkspace, type Source, type Workspace, } from './types' /** * Fully resolves a configuration including subscribing to all sources and * workspaces from a config. Returns an `Observable` that waits till all sources * emit once before emitting an array of fully resolved sources and workspaces. * * @internal */ export function resolveConfig(config: Config): Observable<Workspace[]> { const {workspaces} = prepareConfig(config) return combineLatest( // eslint-disable-next-line @typescript-eslint/no-unused-vars workspaces.flatMap((workspaceSummary) => combineLatest(workspaceSummary.__internal.sources.map(({source}) => source)).pipe( map( (sources): Workspace => ({ ...workspaceSummary, ...sources[0], unstable_sources: sources, type: 'workspace', }), ), ), ), ) } /** @internal */ export type CreateWorkspaceFromConfigOptions = | SingleWorkspace | (SingleWorkspace & { currentUser: CurrentUser getClient: (options: {apiVersion: string}) => SanityClient schema?: SchemaPluginOptions }) /** * PRIMARILY FOR TESTING PURPOSES. * * This will create a fully resolved workspace from a config and optionally * allows a `client` and `currentUser` override. This exists primarily for * testing purposes. If you need to use a workspace, we recommend using the * `useWorkspace` hook to grab the fully resolved workspace from the * `StudioProvider` * * @internal */ export async function createWorkspaceFromConfig( options: CreateWorkspaceFromConfigOptions, ): Promise<Workspace> { const client = 'getClient' in options ? options.getClient({apiVersion: '2023-11-13'}) : undefined const [workspace] = await firstValueFrom( resolveConfig({ ...options, ...(client && 'currentUser' in options && { auth: createMockAuthStore({...options, client}), }), }), ) return workspace } /** * PRIMARILY FOR TESTING PURPOSES. * * This will create a fully resolved source from a config and optionally * allows a `client` and `currentUser` override. This exists primarily for * testing purposes. If you need to use a source, we recommend using the * `useSource` hook to grab the fully resolved source from the `StudioProvider` * * @internal */ export async function createSourceFromConfig( options: CreateWorkspaceFromConfigOptions, ): Promise<Source> { const workspace = await createWorkspaceFromConfig(options) return workspace.unstable_sources[0] }