@sanity/vision 6.21.0 → 6.21.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"VistaGui-D3NHSIsK.js","names":["() => {\n if (!element) return undefined\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries.at(-1)\n if (!entry) return\n const {width, height} = entry.contentRect\n setSize((current) =>\n current && current.width === width && current.height === height ? current : {width, height},\n )\n })\n observer.observe(element)\n return () => observer.disconnect()\n }","[element]","_c","toError","() => {\n let timer: ReturnType<typeof setTimeout> | undefined\n const dropPendingWrite = () => {\n clearTimeout(timer)\n timer = undefined\n }\n const subscription = actorRef.subscribe((snapshot) => {\n dropPendingWrite()\n timer = setTimeout(() => {\n timer = undefined\n saveVistaState(projectId, selectPersistedState(snapshot))\n }, PERSIST_DEBOUNCE_MS)\n })\n const unsubscribeClear = onLocalStorageCleared(dropPendingWrite)\n return () => {\n subscription.unsubscribe()\n unsubscribeClear()\n if (timer !== undefined) {\n // Leaving the tool within the debounce window must not lose the last edit\n clearTimeout(timer)\n saveVistaState(projectId, selectPersistedState(actorRef.getSnapshot()))\n }\n }\n }","[actorRef, projectId]","_c","() => {\n if (Object.is(previous.current, value)) return\n const before = previous.current\n previous.current = value\n handleChange(value, before)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","[value]","_c","_key0","_key1","_key2","_key3","_key4","_key5","_key6","_key7","_key8","_key9","_key10","_key11","_key12","_key13","releases = []","useMemo((): PerspectiveStack | undefined => {\n if (!isScheduledDraftsEnabled) return undefined\n\n const scheduledDraftReleases = releases.filter(\n (release: ReleaseDocument) =>\n isCardinalityOneRelease(release) && release.state === 'scheduled',\n )\n const releaseIds = sortReleases(scheduledDraftReleases).map((release: ReleaseDocument) =>\n getReleaseIdFromReleaseDocumentId(release._id),\n )\n const defaultPerspective = isDraftModelEnabled ? ['drafts'] : ['published']\n return [...releaseIds, ...defaultPerspective] as PerspectiveStack\n }, [releases, isDraftModelEnabled, isScheduledDraftsEnabled])","[...releaseIds, ...defaultPerspective]","(release: ReleaseDocument) =>\n isCardinalityOneRelease(release) && release.state === 'scheduled'","(release: ReleaseDocument) =>\n getReleaseIdFromReleaseDocumentId(release._id)","isDraftModelEnabled ? ['drafts'] : ['published']","{\n workspaceDataset,\n perspectiveStack,\n selectedVariantNames,\n isVariantsEnabled,\n scheduledDraftsStack,\n isScheduledDraftsEnabled,\n }","useMemo(\n () => ({\n workspaceDataset,\n perspectiveStack,\n selectedVariantNames,\n isVariantsEnabled,\n scheduledDraftsStack,\n isScheduledDraftsEnabled,\n }),\n [\n isScheduledDraftsEnabled,\n isVariantsEnabled,\n perspectiveStack,\n scheduledDraftsStack,\n selectedVariantNames,\n workspaceDataset,\n ],\n )","release","resolveRequestOptions(options, environment)","useMemo(\n () => resolveRequestOptions(options, environment),\n [environment, options],\n )","{apiVersion}","baseClient.withConfig({\n apiVersion,\n dataset,\n perspective,\n variant,\n allowReconfigure: true,\n })","useMemo(\n () =>\n baseClient.withConfig({\n apiVersion,\n dataset,\n perspective,\n variant,\n allowReconfigure: true,\n }),\n [baseClient, apiVersion, dataset, perspective, variant],\n )","client.config()","isApiVersionBelow(apiVersion, SYNC_TAGS_API_VERSION)","{\n ...resolved,\n isCdnAnonymous: resolved.useCdn && !token && Boolean(withCredentials),\n supportsSyncTags: !isApiVersionBelow(apiVersion, SYNC_TAGS_API_VERSION),\n client,\n }","resolved.useCdn && !token && Boolean(withCredentials)","!isApiVersionBelow(apiVersion, SYNC_TAGS_API_VERSION)","useMemo(() => {\n const {token, withCredentials} = client.config()\n return {\n ...resolved,\n isCdnAnonymous: resolved.useCdn && !token && Boolean(withCredentials),\n supportsSyncTags: !isApiVersionBelow(apiVersion, SYNC_TAGS_API_VERSION),\n client,\n }\n }, [apiVersion, client, resolved])","_c","_temp","_temp2","(query: string, rawParams: string): QueryRequest | null => {\n const params = parseParams(rawParams, t)\n if (!params.valid || !isValidApiVersion || !query.trim()) {\n return null\n }\n const urlOptions: Record<string, string | string[]> = {\n ...(perspective !== undefined ? {perspective} : {}),\n ...(variant ? {variant} : {}),\n ...(includeSourceMap ? {resultSourceMap: 'true'} : {}),\n }\n const url = client.getUrl(\n client.getDataUrl('query', encodeQueryString(query, params.parsed, urlOptions)),\n useCdn,\n )\n return {client, query, params: params.parsed || {}, includeSourceMap, useCdn, url}\n }","useCallback(\n (query: string, rawParams: string): QueryRequest | null => {\n const params = parseParams(rawParams, t)\n if (!params.valid || !isValidApiVersion || !query.trim()) {\n return null\n }\n const urlOptions: Record<string, string | string[]> = {\n ...(perspective !== undefined ? {perspective} : {}),\n ...(variant ? {variant} : {}),\n ...(includeSourceMap ? {resultSourceMap: 'true'} : {}),\n }\n const url = client.getUrl(\n client.getDataUrl('query', encodeQueryString(query, params.parsed, urlOptions)),\n useCdn,\n )\n return {client, query, params: params.parsed || {}, includeSourceMap, useCdn, url}\n },\n [client, includeSourceMap, isValidApiVersion, perspective, t, useCdn, variant],\n )","parseParams(tab.rawParams, t)","rawParams","params","useMemo(() => parseParams(tab.rawParams, t), [tab.rawParams, t])","buildRequest(tab.query, tab.rawParams)","query","useMemo(\n () => buildRequest(tab.query, tab.rawParams),\n [buildRequest, tab.query, tab.rawParams],\n )","{resolved, params, request, buildRequest}","_c","MAX_TITLE_LENGTH","{request, buildRequest}: Pick<QueryRequestBuilder, 'request' | 'buildRequest'>","async () => {\n pendingEdits.commit()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id) ?? tab\n const current = buildRequest(latest.query, latest.rawParams)\n if (!current) return\n const duplicate = queries.find((query) => !query.shared && query.url === current.url)\n if (duplicate) {\n toast.push({\n closable: true,\n status: 'warning',\n title: t('save-query.already-saved'),\n description: duplicate.title,\n })\n return\n }\n try {\n await saveQuery({\n shared: false,\n url: current.url,\n savedAt: new Date().toISOString(),\n title: latest.title || deriveTabTitle(latest.query) || t('label.untitled-query'),\n })\n toast.push({closable: true, status: 'success', title: t('save-query.success')})\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: t('save-query.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n }\n }","tab.id","err","useCallback(async () => {\n pendingEdits.commit()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id) ?? tab\n const current = buildRequest(latest.query, latest.rawParams)\n if (!current) return\n const duplicate = queries.find((query) => !query.shared && query.url === current.url)\n if (duplicate) {\n toast.push({\n closable: true,\n status: 'warning',\n title: t('save-query.already-saved'),\n description: duplicate.title,\n })\n return\n }\n try {\n await saveQuery({\n shared: false,\n url: current.url,\n savedAt: new Date().toISOString(),\n title: latest.title || deriveTabTitle(latest.query) || t('label.untitled-query'),\n })\n toast.push({closable: true, status: 'success', title: t('save-query.success')})\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: t('save-query.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n }\n }, [actorRef, buildRequest, pendingEdits, queries, saveQuery, t, tab, toast])","{saveCurrent, canSave: Boolean(request) && !saving}","Boolean(request) && !saving","_c","{mode}: QueryListPanelProps","(snapshot) => snapshot.context.tabs","{dateStyle: 'medium', timeStyle: 'short'}","queries\n .filter((query) => (mode === 'shared' ? query.shared : !query.shared))\n .map((query) => {\n const parsed = parseQueryUrl(query.url, datasets)\n const preview = (parsed?.query || '').split('\\n')[0].split('{')[0].trim()\n return {query, parsed, preview}\n })","(query) => (mode === 'shared' ? query.shared : !query.shared)","(query) => {\n const parsed = parseQueryUrl(query.url, datasets)\n const preview = (parsed?.query || '').split('\\n')[0].split('{')[0].trim()\n return {query, parsed, preview}\n }","query","useMemo((): QueryListItem[] => {\n return queries\n .filter((query) => (mode === 'shared' ? query.shared : !query.shared))\n .map((query) => {\n const parsed = parseQueryUrl(query.url, datasets)\n const preview = (parsed?.query || '').split('\\n')[0].split('{')[0].trim()\n return {query, parsed, preview}\n })\n }, [datasets, mode, queries])","useMemo(() => {\n const term = search.trim().toLowerCase()\n if (!term) return items\n return items.filter(\n ({query, parsed}) =>\n (query.title || '').toLowerCase().includes(term) ||\n (parsed?.query || '').toLowerCase().includes(term),\n )\n }, [items, search])","{query, parsed}","parsed","(parsed: ParsedQueryUrl) =>\n tabs.find((tab: VistaTab) =>\n tabMatchesParsedQuery(tab, parsed, resolveRequestOptions(tab.options, environment)),\n )","useCallback(\n (parsed: ParsedQueryUrl) =>\n tabs.find((tab: VistaTab) =>\n tabMatchesParsedQuery(tab, parsed, resolveRequestOptions(tab.options, environment)),\n ),\n [environment, tabs],\n )","(parsed: ParsedQueryUrl | null) => parsed !== null && findTabShowing(parsed) !== undefined","useCallback(\n (parsed: ParsedQueryUrl | null) => parsed !== null && findTabShowing(parsed) !== undefined,\n [findTabShowing],\n )","(err: unknown) => {\n toast.push({\n closable: true,\n status: 'error',\n title: t('save-query.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n }","useCallback(\n (err: unknown) => {\n toast.push({\n closable: true,\n status: 'error',\n title: t('save-query.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n },\n [t, toast],\n )","(error) => {\n if (error) reportError(error)\n }","(parsed: ParsedQueryUrl) => {\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n id: 'vista-saved-query-dataset',\n status: 'warning',\n title: t('vista.saved.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n const {tabs: currentTabs, activeTabId} = actorRef.getSnapshot().context\n const target = currentTabs.find((tab) => tab.id === activeTabId)\n const sent = target && resolveRequestOptions(target.options, environment).variant\n if (parsed.variant !== undefined && parsed.variant !== sent) {\n toast.push({\n closable: true,\n id: 'vista-saved-query-variant',\n status: 'warning',\n title: t(\n environment.isVariantsEnabled\n ? 'vista.saved.unavailable-variant'\n : 'vista.saved.variants-disabled',\n {variant: parsed.variant},\n ),\n })\n }\n }","tab","useCallback(\n (parsed: ParsedQueryUrl) => {\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n id: 'vista-saved-query-dataset',\n status: 'warning',\n title: t('vista.saved.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n const {tabs: currentTabs, activeTabId} = actorRef.getSnapshot().context\n const target = currentTabs.find((tab) => tab.id === activeTabId)\n const sent = target && resolveRequestOptions(target.options, environment).variant\n if (parsed.variant !== undefined && parsed.variant !== sent) {\n toast.push({\n closable: true,\n id: 'vista-saved-query-variant',\n status: 'warning',\n title: t(\n environment.isVariantsEnabled\n ? 'vista.saved.unavailable-variant'\n : 'vista.saved.variants-disabled',\n {variant: parsed.variant},\n ),\n })\n }\n },\n [actorRef, environment, t, toast],\n )","({query, parsed}: QueryListItem) => {\n if (!parsed) return\n const existing = findTabShowing(parsed)\n if (existing) {\n actorRef.send({type: 'tab.select', id: existing.id})\n } else {\n actorRef.send({type: 'tab.add', tab: savedQueryToTabInit(query, parsed)})\n warnAboutUnrepresentable(parsed)\n }\n }","{query, parsed}: QueryListItem","useCallback(\n ({query, parsed}: QueryListItem) => {\n if (!parsed) return\n const existing = findTabShowing(parsed)\n if (existing) {\n actorRef.send({type: 'tab.select', id: existing.id})\n } else {\n actorRef.send({type: 'tab.add', tab: savedQueryToTabInit(query, parsed)})\n warnAboutUnrepresentable(parsed)\n }\n },\n [actorRef, findTabShowing, warnAboutUnrepresentable],\n )","({query, parsed}: QueryListItem) => {\n if (!parsed) return\n actorRef.send({type: 'tab.load', id: activeTab.id, tab: savedQueryToTabInit(query, parsed)})\n warnAboutUnrepresentable(parsed)\n }","id","useCallback(\n ({query, parsed}: QueryListItem) => {\n if (!parsed) return\n actorRef.send({type: 'tab.load', id: activeTab.id, tab: savedQueryToTabInit(query, parsed)})\n warnAboutUnrepresentable(parsed)\n },\n [actorRef, activeTab.id, warnAboutUnrepresentable],\n )","(query: QueryConfig) => {\n renameSettledRef.current = false\n setEditingKey(query._key)\n setEditingTitle(query.title || '')\n }","useCallback((query: QueryConfig) => {\n renameSettledRef.current = false\n setEditingKey(query._key)\n setEditingTitle(query.title || '')\n }, [])","() => {\n if (renameSettledRef.current) return\n renameSettledRef.current = true\n setEditingKey(null)\n }","useCallback(() => {\n if (renameSettledRef.current) return\n renameSettledRef.current = true\n setEditingKey(null)\n }, [])","async (query: QueryConfig) => {\n if (renameSettledRef.current) return\n renameSettledRef.current = true\n setEditingKey(null)\n const title = editingTitle.trim()\n if (!title || title === query.title) return\n try {\n await updateQuery({...query, title})\n } catch (err) {\n reportError(err)\n }\n }","err","useCallback(\n async (query: QueryConfig) => {\n if (renameSettledRef.current) return\n renameSettledRef.current = true\n setEditingKey(null)\n const title = editingTitle.trim()\n if (!title || title === query.title) return\n try {\n await updateQuery({...query, title})\n } catch (err) {\n reportError(err)\n }\n },\n [editingTitle, reportError, updateQuery],\n )","async () => {\n if (!shareCandidate) return\n const candidate = shareCandidate\n setShareCandidate(null)\n try {\n await shareQuery(candidate._key)\n toast.push({closable: true, status: 'success', title: t('save-query.shared-success')})\n } catch (err) {\n reportError(err)\n }\n }","useCallback(async () => {\n if (!shareCandidate) return\n const candidate = shareCandidate\n setShareCandidate(null)\n try {\n await shareQuery(candidate._key)\n toast.push({closable: true, status: 'success', title: t('save-query.shared-success')})\n } catch (err) {\n reportError(err)\n }\n }, [reportError, shareCandidate, shareQuery, t, toast])","async (query: QueryConfig) => {\n try {\n await unshareQuery(query._key)\n toast.push({closable: true, status: 'success', title: t('save-query.unshared-success')})\n } catch (err) {\n reportError(err)\n }\n }","useCallback(\n async (query: QueryConfig) => {\n try {\n await unshareQuery(query._key)\n toast.push({closable: true, status: 'success', title: t('save-query.unshared-success')})\n } catch (err) {\n reportError(err)\n }\n },\n [reportError, t, toast, unshareQuery],\n )","search.trim()\n ? t('vista.saved.empty-search')\n : mode === 'saved'\n ? t('vista.saved.empty')\n : t('vista.shared.empty')","(event) => setSearch(event.currentTarget.value)","t('label.search-queries')","<Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={(event) => setSearch(event.currentTarget.value)}\n padding={2}\n placeholder={t('label.search-queries')}\n value={search}\n />\n </Box>","mode === 'saved' && (\n <Tooltip animate content={<Text size={1}>{t('vista.saved.save-current')}</Text>} portal>\n <Button\n aria-label={t('vista.saved.save-current')}\n data-testid=\"vista-save-current-query\"\n disabled={!canSave}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => void saveCurrent()}\n padding={2}\n />\n </Tooltip>\n )","<Flex alignItems=\"center\" borderBottom flexShrink={0} gap={2} padding={2}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={(event) => setSearch(event.currentTarget.value)}\n padding={2}\n placeholder={t('label.search-queries')}\n value={search}\n />\n </Box>\n {mode === 'saved' && (\n <Tooltip animate content={<Text size={1}>{t('vista.saved.save-current')}</Text>} portal>\n <Button\n aria-label={t('vista.saved.save-current')}\n data-testid=\"vista-save-current-query\"\n disabled={!canSave}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => void saveCurrent()}\n padding={2}\n />\n </Tooltip>\n )}\n </Flex>","<Box className={styles.scrollArea} flexBasis=\"0%\" flexGrow={1}>\n {visibleItems.length === 0 ? (\n <Box padding={4}>\n <Text muted size={1}>\n {emptyText}\n </Text>\n </Box>\n ) : (\n <Flex flexDirection=\"column\" minWidth=\"0\">\n {visibleItems.map((item) => {\n const {query, parsed, preview} = item\n const canMutate = !query.shared || query.isOwnedByCurrentUser\n // A query on its way to the other list is left alone until it has arrived there\n const isMoving = moving.includes(query._key)\n const isEditing = editingKey === query._key\n const isOpen = isOpenInTab(parsed)\n\n return (\n <Card\n borderBottom\n data-testid=\"vista-saved-query\"\n key={query._key}\n padding={1}\n tone={isOpen ? 'transparent' : 'default'}\n >\n <Flex alignItems=\"flex-start\" gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n {isEditing ? (\n <Box padding={2}>\n <TextInput\n autoFocus\n fontSize={1}\n onBlur={() => void commitRename(query)}\n onChange={(event) => setEditingTitle(event.currentTarget.value)}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') void commitRename(query)\n if (event.key === 'Escape') cancelRename()\n }}\n padding={1}\n value={editingTitle}\n />\n </Box>\n ) : (\n <Button\n className={styles.listItemButton}\n data-testid=\"vista-saved-query-open\"\n justify=\"flex-start\"\n mode=\"bleed\"\n onClick={() => openInNewTab(item)}\n padding={2}\n selected={isOpen}\n width=\"fill\"\n >\n <Flex flexDirection=\"column\" gap={2} minWidth=\"0\">\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {query.title || t('label.untitled-query')}\n </Text>\n {preview && (\n <Box className={styles.previewCode}>\n <Code size={0}>{preview}</Code>\n </Box>\n )}\n <Flex alignItems=\"center\" gap={2}>\n {query.shared && query.authorId && (\n <UserAvatar size={0} user={query.authorId} withTooltip />\n )}\n <Text muted size={0}>\n {query.savedAt ? formatDate.format(new Date(query.savedAt)) : ''}\n </Text>\n </Flex>\n </Flex>\n </Button>\n )}\n </Box>\n <Box paddingTop={1}>\n <MenuButton\n button={<ContextMenuButton />}\n id={`vista-saved-query-menu-${query._key}`}\n menu={\n <Menu>\n <MenuItem\n icon={LaunchIcon}\n onClick={() => openInNewTab(item)}\n text={t('vista.saved.open-in-new-tab')}\n />\n <MenuItem\n icon={RetrieveIcon}\n onClick={() => loadIntoCurrentTab(item)}\n text={t('vista.saved.load-in-current-tab')}\n />\n {canMutate && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={isMoving}\n icon={EditIcon}\n onClick={() => startRename(query)}\n text={t('vista.saved.rename')}\n />\n {query.shared ? (\n <MenuItem\n data-testid=\"vista-saved-query-unshare\"\n disabled={isMoving}\n icon={UnpublishIcon}\n onClick={() => void handleUnshare(query)}\n text={t('action.unshare')}\n />\n ) : (\n <MenuItem\n data-testid=\"vista-saved-query-share\"\n disabled={isMoving}\n icon={UsersIcon}\n onClick={() => setShareCandidate(query)}\n text={t('label.share')}\n />\n )}\n <MenuItem\n disabled={isMoving}\n icon={TrashIcon}\n onClick={() => void deleteQuery(query._key)}\n text={t('action.delete')}\n tone=\"critical\"\n />\n </>\n )}\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'bottom-end'}}\n />\n </Box>\n </Flex>\n </Card>\n )\n })}\n </Flex>\n )}\n </Box>","visibleItems.length","event","preview","shareCandidate && (\n <Dialog\n animate\n footer={\n <Flex gap={2} justifyContent=\"flex-end\" padding={3}>\n <Button\n mode=\"bleed\"\n onClick={() => setShareCandidate(null)}\n text={t('action.query-cancel')}\n />\n <Button\n onClick={() => void handleConfirmShare()}\n text={t('action.save-shared-query')}\n tone=\"primary\"\n />\n </Flex>\n }\n header={t('label.share')}\n id=\"vista-share-query-dialog\"\n onClose={() => setShareCandidate(null)}\n width={0}\n >\n <Box padding={4}>\n <Text size={1}>{t('save-query.share-warning')}</Text>\n </Box>\n </Dialog>\n )","<Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\">\n <Flex alignItems=\"center\" borderBottom flexShrink={0} gap={2} padding={2}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={(event) => setSearch(event.currentTarget.value)}\n padding={2}\n placeholder={t('label.search-queries')}\n value={search}\n />\n </Box>\n {mode === 'saved' && (\n <Tooltip animate content={<Text size={1}>{t('vista.saved.save-current')}</Text>} portal>\n <Button\n aria-label={t('vista.saved.save-current')}\n data-testid=\"vista-save-current-query\"\n disabled={!canSave}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => void saveCurrent()}\n padding={2}\n />\n </Tooltip>\n )}\n </Flex>\n\n <Box className={styles.scrollArea} flexBasis=\"0%\" flexGrow={1}>\n {visibleItems.length === 0 ? (\n <Box padding={4}>\n <Text muted size={1}>\n {emptyText}\n </Text>\n </Box>\n ) : (\n <Flex flexDirection=\"column\" minWidth=\"0\">\n {visibleItems.map((item) => {\n const {query, parsed, preview} = item\n const canMutate = !query.shared || query.isOwnedByCurrentUser\n // A query on its way to the other list is left alone until it has arrived there\n const isMoving = moving.includes(query._key)\n const isEditing = editingKey === query._key\n const isOpen = isOpenInTab(parsed)\n\n return (\n <Card\n borderBottom\n data-testid=\"vista-saved-query\"\n key={query._key}\n padding={1}\n tone={isOpen ? 'transparent' : 'default'}\n >\n <Flex alignItems=\"flex-start\" gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n {isEditing ? (\n <Box padding={2}>\n <TextInput\n autoFocus\n fontSize={1}\n onBlur={() => void commitRename(query)}\n onChange={(event) => setEditingTitle(event.currentTarget.value)}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') void commitRename(query)\n if (event.key === 'Escape') cancelRename()\n }}\n padding={1}\n value={editingTitle}\n />\n </Box>\n ) : (\n <Button\n className={styles.listItemButton}\n data-testid=\"vista-saved-query-open\"\n justify=\"flex-start\"\n mode=\"bleed\"\n onClick={() => openInNewTab(item)}\n padding={2}\n selected={isOpen}\n width=\"fill\"\n >\n <Flex flexDirection=\"column\" gap={2} minWidth=\"0\">\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {query.title || t('label.untitled-query')}\n </Text>\n {preview && (\n <Box className={styles.previewCode}>\n <Code size={0}>{preview}</Code>\n </Box>\n )}\n <Flex alignItems=\"center\" gap={2}>\n {query.shared && query.authorId && (\n <UserAvatar size={0} user={query.authorId} withTooltip />\n )}\n <Text muted size={0}>\n {query.savedAt ? formatDate.format(new Date(query.savedAt)) : ''}\n </Text>\n </Flex>\n </Flex>\n </Button>\n )}\n </Box>\n <Box paddingTop={1}>\n <MenuButton\n button={<ContextMenuButton />}\n id={`vista-saved-query-menu-${query._key}`}\n menu={\n <Menu>\n <MenuItem\n icon={LaunchIcon}\n onClick={() => openInNewTab(item)}\n text={t('vista.saved.open-in-new-tab')}\n />\n <MenuItem\n icon={RetrieveIcon}\n onClick={() => loadIntoCurrentTab(item)}\n text={t('vista.saved.load-in-current-tab')}\n />\n {canMutate && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={isMoving}\n icon={EditIcon}\n onClick={() => startRename(query)}\n text={t('vista.saved.rename')}\n />\n {query.shared ? (\n <MenuItem\n data-testid=\"vista-saved-query-unshare\"\n disabled={isMoving}\n icon={UnpublishIcon}\n onClick={() => void handleUnshare(query)}\n text={t('action.unshare')}\n />\n ) : (\n <MenuItem\n data-testid=\"vista-saved-query-share\"\n disabled={isMoving}\n icon={UsersIcon}\n onClick={() => setShareCandidate(query)}\n text={t('label.share')}\n />\n )}\n <MenuItem\n disabled={isMoving}\n icon={TrashIcon}\n onClick={() => void deleteQuery(query._key)}\n text={t('action.delete')}\n tone=\"critical\"\n />\n </>\n )}\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'bottom-end'}}\n />\n </Box>\n </Flex>\n </Card>\n )\n })}\n </Flex>\n )}\n </Box>\n\n {shareCandidate && (\n <Dialog\n animate\n footer={\n <Flex gap={2} justifyContent=\"flex-end\" padding={3}>\n <Button\n mode=\"bleed\"\n onClick={() => setShareCandidate(null)}\n text={t('action.query-cancel')}\n />\n <Button\n onClick={() => void handleConfirmShare()}\n text={t('action.save-shared-query')}\n tone=\"primary\"\n />\n </Flex>\n }\n header={t('label.share')}\n id=\"vista-share-query-dialog\"\n onClose={() => setShareCandidate(null)}\n width={0}\n >\n <Box padding={4}>\n <Text size={1}>{t('save-query.share-warning')}</Text>\n </Box>\n </Dialog>\n )}\n </Flex>","_c","_temp","err_0","err_1","err_2","styles.scrollArea","styles.listItemButton","_Fragment","(event) => onChange(event.currentTarget.checked)","<Box flexShrink={0} paddingTop={1}>\n <Switch\n checked={checked}\n data-testid={testId}\n onChange={(event) => onChange(event.currentTarget.checked)}\n />\n </Box>","<Text size={1} weight=\"medium\">\n {title}\n </Text>","<Text muted size={1}>\n {description}\n </Text>","<Stack gap={2}>\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Text muted size={1}>\n {description}\n </Text>\n {children}\n </Stack>","<Flex alignItems=\"flex-start\" as=\"label\" gap={3}>\n {/* A ui5 box has no minimum width, so a long description would squeeze it and run over the\n switch */}\n <Box flexShrink={0} paddingTop={1}>\n <Switch\n checked={checked}\n data-testid={testId}\n onChange={(event) => onChange(event.currentTarget.checked)}\n />\n </Box>\n <Stack gap={2}>\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Text muted size={1}>\n {description}\n </Text>\n {children}\n </Stack>\n </Flex>","_c","{children, htmlFor}: {children: string; htmlFor: string}","<Text as=\"label\" htmlFor={htmlFor} muted size={1} weight=\"medium\">\n {children}\n </Text>","{\n id,\n mode,\n dataset,\n workspaceDataset,\n datasets,\n onChange,\n}: DatasetFieldProps","following\n ? t('vista.options.dataset.pin')\n : t('vista.options.dataset.use-workspace')","t('settings.dataset-label')","<FieldLabel htmlFor={id}>{t('settings.dataset-label')}</FieldLabel>","(event: ChangeEvent<HTMLSelectElement>) =>\n onChange({datasetMode: 'pinned', dataset: event.currentTarget.value})","datasets.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))","(name) => (\n <option key={name} value={name}>\n {name}\n </option>\n )","<Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Select\n data-testid={`${id}-select`}\n disabled={following}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange({datasetMode: 'pinned', dataset: event.currentTarget.value})\n }\n padding={2}\n value={following ? workspaceDataset : dataset}\n >\n {datasets.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))}\n </Select>\n </Box>","`${id}-select`","following ? workspaceDataset : dataset","<Text size={1}>{toggleLabel}</Text>","() =>\n onChange(\n following\n ? {datasetMode: 'pinned', dataset: workspaceDataset}\n : {datasetMode: 'workspace', dataset},\n )","<Button\n aria-label={toggleLabel}\n aria-pressed={!following}\n data-testid={`${id}-${following ? 'pin' : 'follow'}`}\n fontSize={1}\n icon={following ? PinIcon : PinRemovedIcon}\n mode=\"ghost\"\n onClick={() =>\n onChange(\n following\n ? {datasetMode: 'pinned', dataset: workspaceDataset}\n : {datasetMode: 'workspace', dataset},\n )\n }\n padding={2}\n />","!following","`${id}-${following ? 'pin' : 'follow'}`","following ? PinIcon : PinRemovedIcon","<Tooltip animate content={<Text size={1}>{toggleLabel}</Text>} placement=\"bottom\" portal>\n <Button\n aria-label={toggleLabel}\n aria-pressed={!following}\n data-testid={`${id}-${following ? 'pin' : 'follow'}`}\n fontSize={1}\n icon={following ? PinIcon : PinRemovedIcon}\n mode=\"ghost\"\n onClick={() =>\n onChange(\n following\n ? {datasetMode: 'pinned', dataset: workspaceDataset}\n : {datasetMode: 'workspace', dataset},\n )\n }\n padding={2}\n />\n </Tooltip>","<Flex gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Select\n data-testid={`${id}-select`}\n disabled={following}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange({datasetMode: 'pinned', dataset: event.currentTarget.value})\n }\n padding={2}\n value={following ? workspaceDataset : dataset}\n >\n {datasets.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))}\n </Select>\n </Box>\n <Tooltip animate content={<Text size={1}>{toggleLabel}</Text>} placement=\"bottom\" portal>\n <Button\n aria-label={toggleLabel}\n aria-pressed={!following}\n data-testid={`${id}-${following ? 'pin' : 'follow'}`}\n fontSize={1}\n icon={following ? PinIcon : PinRemovedIcon}\n mode=\"ghost\"\n onClick={() =>\n onChange(\n following\n ? {datasetMode: 'pinned', dataset: workspaceDataset}\n : {datasetMode: 'workspace', dataset},\n )\n }\n padding={2}\n />\n </Tooltip>\n </Flex>","following\n ? t('vista.options.dataset.follows-workspace')\n : t('vista.options.dataset.pinned')","<Text muted size={0}>\n {following\n ? t('vista.options.dataset.follows-workspace')\n : t('vista.options.dataset.pinned')}\n </Text>","<Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('settings.dataset-label')}</FieldLabel>\n <Flex gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Select\n data-testid={`${id}-select`}\n disabled={following}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange({datasetMode: 'pinned', dataset: event.currentTarget.value})\n }\n padding={2}\n value={following ? workspaceDataset : dataset}\n >\n {datasets.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))}\n </Select>\n </Box>\n <Tooltip animate content={<Text size={1}>{toggleLabel}</Text>} placement=\"bottom\" portal>\n <Button\n aria-label={toggleLabel}\n aria-pressed={!following}\n data-testid={`${id}-${following ? 'pin' : 'follow'}`}\n fontSize={1}\n icon={following ? PinIcon : PinRemovedIcon}\n mode=\"ghost\"\n onClick={() =>\n onChange(\n following\n ? {datasetMode: 'pinned', dataset: workspaceDataset}\n : {datasetMode: 'workspace', dataset},\n )\n }\n padding={2}\n />\n </Tooltip>\n </Flex>\n <Text muted size={0}>\n {following\n ? t('vista.options.dataset.follows-workspace')\n : t('vista.options.dataset.pinned')}\n </Text>\n </Stack>","{id, value, locked, onChange}: ApiVersionFieldProps","API_VERSIONS.includes(value)","validateApiVersion(value)","(event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n // Start the \"Other\" input with the prefix, so the API version is typed the way it is sent\n onChange(next === 'other' ? 'v' : next)\n }","useCallback(\n (event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n // Start the \"Other\" input with the prefix, so the API version is typed the way it is sent\n onChange(next === 'other' ? 'v' : next)\n },\n [onChange],\n )","t('settings.api-version-label')","<FieldLabel htmlFor={id}>{t('settings.api-version-label')}</FieldLabel>","t('settings.api-version-locked-for-variant')","<Text size={1}>{t('settings.api-version-locked-for-variant')}</Text>","locked ? t('settings.api-version-label') : undefined","locked && (\n <VisuallyHidden id={lockedHintId}>\n {t('settings.api-version-locked-for-variant')}\n </VisuallyHidden>\n )","API_VERSIONS.map((version) => (\n <option key={version} value={version}>\n {version}\n </option>\n ))","(version) => (\n <option key={version} value={version}>\n {version}\n </option>\n )","t('settings.other-api-version-label')","<option value=\"other\">{t('settings.other-api-version-label')}</option>","<Select\n data-testid={`${id}-select`}\n disabled={locked}\n fontSize={1}\n id={id}\n onChange={handleSelect}\n padding={2}\n value={locked ? 'vX' : isCustom ? 'other' : value}\n >\n {API_VERSIONS.map((version) => (\n <option key={version} value={version}>\n {version}\n </option>\n ))}\n <option value=\"other\">{t('settings.other-api-version-label')}</option>\n </Select>","locked ? 'vX' : isCustom ? 'other' : value","<Box\n aria-describedby={locked ? lockedHintId : undefined}\n aria-label={locked ? t('settings.api-version-label') : undefined}\n data-testid={`${id}-wrap`}\n role={locked ? 'group' : undefined}\n tabIndex={locked ? 0 : undefined}\n >\n {locked && (\n <VisuallyHidden id={lockedHintId}>\n {t('settings.api-version-locked-for-variant')}\n </VisuallyHidden>\n )}\n <Select\n data-testid={`${id}-select`}\n disabled={locked}\n fontSize={1}\n id={id}\n onChange={handleSelect}\n padding={2}\n value={locked ? 'vX' : isCustom ? 'other' : value}\n >\n {API_VERSIONS.map((version) => (\n <option key={version} value={version}>\n {version}\n </option>\n ))}\n <option value=\"other\">{t('settings.other-api-version-label')}</option>\n </Select>\n </Box>","`${id}-wrap`","locked ? 'group' : undefined","locked ? 0 : undefined","locked ? lockedHintId : undefined","<Tooltip\n animate\n content={<Text size={1}>{t('settings.api-version-locked-for-variant')}</Text>}\n disabled={!locked}\n placement=\"bottom\"\n portal\n >\n {/*\n A disabled select gets neither pointer events nor focus, so while the field is locked\n the wrapper stands in for it: the tooltip listens to the wrapper, and the wrapper takes\n the select's place in the tab order as a group described by the reason for the lock,\n so a keyboard user can reach it too\n */}\n <Box\n aria-describedby={locked ? lockedHintId : undefined}\n aria-label={locked ? t('settings.api-version-label') : undefined}\n data-testid={`${id}-wrap`}\n role={locked ? 'group' : undefined}\n tabIndex={locked ? 0 : undefined}\n >\n {locked && (\n <VisuallyHidden id={lockedHintId}>\n {t('settings.api-version-locked-for-variant')}\n </VisuallyHidden>\n )}\n <Select\n data-testid={`${id}-select`}\n disabled={locked}\n fontSize={1}\n id={id}\n onChange={handleSelect}\n padding={2}\n value={locked ? 'vX' : isCustom ? 'other' : value}\n >\n {API_VERSIONS.map((version) => (\n <option key={version} value={version}>\n {version}\n </option>\n ))}\n <option value=\"other\">{t('settings.other-api-version-label')}</option>\n </Select>\n </Box>\n </Tooltip>","!locked","!locked && isCustom && (\n <TextInput\n aria-label={t('settings.custom-api-version-label')}\n customValidity={isValid ? undefined : t('settings.error.invalid-api-version')}\n data-testid={`${id}-custom`}\n fontSize={1}\n maxLength={11}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.currentTarget.value || 'v')\n }\n padding={2}\n placeholder=\"v2025-02-19\"\n value={value}\n />\n )","event","<Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('settings.api-version-label')}</FieldLabel>\n <Tooltip\n animate\n content={<Text size={1}>{t('settings.api-version-locked-for-variant')}</Text>}\n disabled={!locked}\n placement=\"bottom\"\n portal\n >\n {/*\n A disabled select gets neither pointer events nor focus, so while the field is locked\n the wrapper stands in for it: the tooltip listens to the wrapper, and the wrapper takes\n the select's place in the tab order as a group described by the reason for the lock,\n so a keyboard user can reach it too\n */}\n <Box\n aria-describedby={locked ? lockedHintId : undefined}\n aria-label={locked ? t('settings.api-version-label') : undefined}\n data-testid={`${id}-wrap`}\n role={locked ? 'group' : undefined}\n tabIndex={locked ? 0 : undefined}\n >\n {locked && (\n <VisuallyHidden id={lockedHintId}>\n {t('settings.api-version-locked-for-variant')}\n </VisuallyHidden>\n )}\n <Select\n data-testid={`${id}-select`}\n disabled={locked}\n fontSize={1}\n id={id}\n onChange={handleSelect}\n padding={2}\n value={locked ? 'vX' : isCustom ? 'other' : value}\n >\n {API_VERSIONS.map((version) => (\n <option key={version} value={version}>\n {version}\n </option>\n ))}\n <option value=\"other\">{t('settings.other-api-version-label')}</option>\n </Select>\n </Box>\n </Tooltip>\n {!locked && isCustom && (\n <TextInput\n aria-label={t('settings.custom-api-version-label')}\n customValidity={isValid ? undefined : t('settings.error.invalid-api-version')}\n data-testid={`${id}-custom`}\n fontSize={1}\n maxLength={11}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.currentTarget.value || 'v')\n }\n padding={2}\n placeholder=\"v2025-02-19\"\n value={value}\n />\n )}\n </Stack>","t('vista.options.perspective.global', {name: globalName})","t('settings.perspectives.scheduled-drafts')","t('settings.perspectives.default')","{id, value, onChange}: PerspectiveSelectProps","getEffectivePerspective(value, isScheduledDraftsEnabled)","t('settings.perspective-label')","<FieldLabel htmlFor={id}>{t('settings.perspective-label')}</FieldLabel>","(event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n onChange(next === 'default' ? undefined : (next as Exclude<VistaPerspective, undefined>))\n }","<option value=\"global\">{t('vista.options.perspective.global', {name: globalName})}</option>","<option value=\"default\">{t('settings.perspectives.default')}</option>","<hr />","OWN_PERSPECTIVES.map((perspective) => (\n <option key={perspective} value={perspective}>\n {perspective}\n </option>\n ))","(perspective) => (\n <option key={perspective} value={perspective}>\n {perspective}\n </option>\n )","isScheduledDraftsEnabled && (\n <option value=\"scheduledDrafts\">{t('settings.perspectives.scheduled-drafts')}</option>\n )","<Select\n data-testid={`${id}-select`}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n onChange(next === 'default' ? undefined : (next as Exclude<VistaPerspective, undefined>))\n }}\n padding={2}\n value={shownValue ?? 'default'}\n >\n <option value=\"global\">{t('vista.options.perspective.global', {name: globalName})}</option>\n <option value=\"default\">{t('settings.perspectives.default')}</option>\n <hr />\n {OWN_PERSPECTIVES.map((perspective) => (\n <option key={perspective} value={perspective}>\n {perspective}\n </option>\n ))}\n {isScheduledDraftsEnabled && (\n <option value=\"scheduledDrafts\">{t('settings.perspectives.scheduled-drafts')}</option>\n )}\n </Select>","shownValue ?? 'default'","<Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('settings.perspective-label')}</FieldLabel>\n <Select\n data-testid={`${id}-select`}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n onChange(next === 'default' ? undefined : (next as Exclude<VistaPerspective, undefined>))\n }}\n padding={2}\n value={shownValue ?? 'default'}\n >\n <option value=\"global\">{t('vista.options.perspective.global', {name: globalName})}</option>\n <option value=\"default\">{t('settings.perspectives.default')}</option>\n <hr />\n {OWN_PERSPECTIVES.map((perspective) => (\n <option key={perspective} value={perspective}>\n {perspective}\n </option>\n ))}\n {isScheduledDraftsEnabled && (\n <option value=\"scheduledDrafts\">{t('settings.perspectives.scheduled-drafts')}</option>\n )}\n </Select>\n </Stack>","{testId, checked, onChange, notes = []}: UseCdnFieldProps","notes = []","t('vista.options.use-cdn.description')","t('vista.options.use-cdn')","notes.map((note) => (\n <Text data-testid={`${testId}-note`} key={note} size={1}>\n {note}\n </Text>\n ))","(note) => (\n <Text data-testid={`${testId}-note`} key={note} size={1}>\n {note}\n </Text>\n )","<SwitchField\n checked={checked}\n description={t('vista.options.use-cdn.description')}\n onChange={onChange}\n testId={testId}\n title={t('vista.options.use-cdn')}\n >\n {notes.map((note) => (\n <Text data-testid={`${testId}-note`} key={note} size={1}>\n {note}\n </Text>\n ))}\n </SwitchField>","{id, value, onChange}: VariantSelectProps","Select","Stack","\"global\"","<FieldLabel htmlFor={id}>{t('vista.options.variant-label')}</FieldLabel>","globalVariantName\n ? t('vista.options.variant.global', {name: globalVariantName})\n : t('vista.options.variant.global-none')","1","id","(event: ChangeEvent<HTMLSelectElement>) =>\n onChange(event.currentTarget.value === 'none' ? 'none' : 'global')","2","value","t('vista.options.variant-label')","<option value=\"global\">\n {globalVariantName\n ? t('vista.options.variant.global', {name: globalVariantName})\n : t('vista.options.variant.global-none')}\n </option>","t('vista.options.variant.none')","<option value=\"none\">{t('vista.options.variant.none')}</option>","<Select\n data-testid={`${id}-select`}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange(event.currentTarget.value === 'none' ? 'none' : 'global')\n }\n padding={2}\n value={value}\n >\n <option value=\"global\">\n {globalVariantName\n ? t('vista.options.variant.global', {name: globalVariantName})\n : t('vista.options.variant.global-none')}\n </option>\n <option value=\"none\">{t('vista.options.variant.none')}</option>\n </Select>","<Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('vista.options.variant-label')}</FieldLabel>\n <Select\n data-testid={`${id}-select`}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange(event.currentTarget.value === 'none' ? 'none' : 'global')\n }\n padding={2}\n value={value}\n >\n <option value=\"global\">\n {globalVariantName\n ? t('vista.options.variant.global', {name: globalVariantName})\n : t('vista.options.variant.global-none')}\n </option>\n <option value=\"none\">{t('vista.options.variant.none')}</option>\n </Select>\n </Stack>","_c","_temp","_temp2","unknownPerspective","_temp3","(snapshot) => snapshot.context.historyDiff.hiddenFields","draft && dequal(draft.fields, hiddenFields) ? draft.text : hiddenFields.join('\\n')","(fields: string[]) =>\n actorRef.send({type: 'historyDiff.update', settings: {hiddenFields: fields}})","t('vista.settings.history-diff.title')","<Text as=\"label\" htmlFor=\"vista-settings-hidden-diff-fields\" size={1} weight=\"medium\">\n {t('vista.settings.history-diff.title')}\n </Text>","t('vista.settings.history-diff.description')","<Text muted size={1}>\n {t('vista.settings.history-diff.description')}\n </Text>","<Stack gap={2}>\n <Text as=\"label\" htmlFor=\"vista-settings-hidden-diff-fields\" size={1} weight=\"medium\">\n {t('vista.settings.history-diff.title')}\n </Text>\n <Text muted size={1}>\n {t('vista.settings.history-diff.description')}\n </Text>\n </Stack>","(event) => {\n const next = event.currentTarget.value\n const fields = parseFieldList(next)\n setDraft({text: next, fields})\n update(fields)\n }","fields","<TextArea\n data-testid=\"vista-settings-hidden-diff-fields\"\n fontSize={1}\n id=\"vista-settings-hidden-diff-fields\"\n onChange={(event) => {\n const next = event.currentTarget.value\n const fields = parseFieldList(next)\n setDraft({text: next, fields})\n update(fields)\n }}\n rows={4}\n value={text}\n />","dequal(hiddenFields, DEFAULT_HIDDEN_DIFF_FIELDS)","() => update([...DEFAULT_HIDDEN_DIFF_FIELDS])","t('vista.settings.history-diff.reset')","<Flex>\n <Button\n data-testid=\"vista-settings-hidden-diff-fields-reset\"\n disabled={dequal(hiddenFields, DEFAULT_HIDDEN_DIFF_FIELDS)}\n fontSize={1}\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={() => update([...DEFAULT_HIDDEN_DIFF_FIELDS])}\n padding={2}\n text={t('vista.settings.history-diff.reset')}\n />\n </Flex>","<Stack gap={3}>\n <Stack gap={2}>\n <Text as=\"label\" htmlFor=\"vista-settings-hidden-diff-fields\" size={1} weight=\"medium\">\n {t('vista.settings.history-diff.title')}\n </Text>\n <Text muted size={1}>\n {t('vista.settings.history-diff.description')}\n </Text>\n </Stack>\n <TextArea\n data-testid=\"vista-settings-hidden-diff-fields\"\n fontSize={1}\n id=\"vista-settings-hidden-diff-fields\"\n onChange={(event) => {\n const next = event.currentTarget.value\n const fields = parseFieldList(next)\n setDraft({text: next, fields})\n update(fields)\n }}\n rows={4}\n value={text}\n />\n <Flex>\n <Button\n data-testid=\"vista-settings-hidden-diff-fields-reset\"\n disabled={dequal(hiddenFields, DEFAULT_HIDDEN_DIFF_FIELDS)}\n fontSize={1}\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={() => update([...DEFAULT_HIDDEN_DIFF_FIELDS])}\n padding={2}\n text={t('vista.settings.history-diff.reset')}\n />\n </Flex>\n </Stack>","(snapshot) => snapshot.context.settings","(apiVersion: string) => {\n setApiVersionDraft(apiVersion)\n if (validateApiVersion(apiVersion)) {\n actorRef.send({type: 'settings.update', settings: {apiVersion}})\n }\n }","useCallback(\n (apiVersion: string) => {\n setApiVersionDraft(apiVersion)\n if (validateApiVersion(apiVersion)) {\n actorRef.send({type: 'settings.update', settings: {apiVersion}})\n }\n },\n [actorRef],\n )","async () => {\n setConfirmClear(false)\n // The saved queries live on the server; nothing local is dropped until they are gone\n try {\n await clearQueries()\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: t('vista.settings.clear-storage.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n return\n }\n actorRef.send({type: 'storage.clear'})\n toast.push({\n closable: true,\n status: 'success',\n title: t('vista.settings.clear-storage.success'),\n })\n // Clearing storage also ends the redesigned experience, which unmounts this panel\n switchToClassic()\n }","err","useCallback(async () => {\n setConfirmClear(false)\n // The saved queries live on the server; nothing local is dropped until they are gone\n try {\n await clearQueries()\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: t('vista.settings.clear-storage.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n return\n }\n actorRef.send({type: 'storage.clear'})\n toast.push({\n closable: true,\n status: 'success',\n title: t('vista.settings.clear-storage.success'),\n })\n // Clearing storage also ends the redesigned experience, which unmounts this panel\n switchToClassic()\n }, [actorRef, clearQueries, switchToClassic, t, toast])","t('vista.settings.description')","<Text muted size={1}>\n {t('vista.settings.description')}\n </Text>","(dataset) => actorRef.send({type: 'settings.update', settings: dataset})","<DatasetField\n dataset={settings.dataset}\n datasets={datasets}\n id=\"vista-settings-dataset\"\n mode={settings.datasetMode}\n onChange={(dataset) => actorRef.send({type: 'settings.update', settings: dataset})}\n workspaceDataset={workspaceDataset}\n />","dataset","datasetMode","<ApiVersionField\n id=\"vista-settings-api-version\"\n locked={false}\n onChange={handleApiVersionChange}\n value={apiVersionDraft}\n />","(perspective) =>\n actorRef.send({type: 'settings.update', settings: {perspective}})","<PerspectiveSelect\n id=\"vista-settings-perspective\"\n onChange={(perspective) =>\n actorRef.send({type: 'settings.update', settings: {perspective}})\n }\n value={settings.perspective}\n />","perspective","(variant) => actorRef.send({type: 'settings.update', settings: {variant}})","<VariantSelect\n id=\"vista-settings-variant\"\n onChange={(variant) => actorRef.send({type: 'settings.update', settings: {variant}})}\n value={settings.variant}\n />","variant","t('vista.options.include-source-map.description')","(includeSourceMap) =>\n actorRef.send({type: 'settings.update', settings: {includeSourceMap}})","t('vista.options.include-source-map')","<SwitchField\n checked={settings.includeSourceMap}\n description={t('vista.options.include-source-map.description')}\n onChange={(includeSourceMap) =>\n actorRef.send({type: 'settings.update', settings: {includeSourceMap}})\n }\n title={t('vista.options.include-source-map')}\n />","includeSourceMap","settings.includeSourceMap","(useCdn) => actorRef.send({type: 'settings.update', settings: {useCdn}})","<UseCdnField\n checked={settings.useCdn}\n onChange={(useCdn) => actorRef.send({type: 'settings.update', settings: {useCdn}})}\n testId=\"vista-settings-use-cdn\"\n />","useCdn","<Card border padding={3} radius={2}>\n <HiddenDiffFieldsSetting />\n </Card>","t('vista.redesign.settings.title')","<Text size={1} weight=\"medium\">\n {t('vista.redesign.settings.title')}\n </Text>","t('vista.redesign.settings.description')","<Text muted size={1}>\n {t('vista.redesign.settings.description')}\n </Text>","t('vista.redesign.switch-to-classic')","<Flex>\n <Button\n data-testid=\"vista-settings-classic\"\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={switchToClassic}\n text={t('vista.redesign.switch-to-classic')}\n />\n </Flex>","<Card border padding={3} radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.redesign.settings.title')}\n </Text>\n <Text muted size={1}>\n {t('vista.redesign.settings.description')}\n </Text>\n <Flex>\n <Button\n data-testid=\"vista-settings-classic\"\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={switchToClassic}\n text={t('vista.redesign.switch-to-classic')}\n />\n </Flex>\n </Stack>\n </Card>","t('vista.settings.clear-storage.description')","<Text muted size={1}>\n {t('vista.settings.clear-storage.description')}\n </Text>","<Flex gap={2}>\n {confirmClear ? (\n <>\n <Button\n data-testid=\"vista-clear-storage-confirm\"\n icon={TrashIcon}\n onClick={() => void handleClearStorage()}\n text={t('vista.settings.clear-storage.confirm')}\n tone=\"critical\"\n />\n <Button\n mode=\"bleed\"\n onClick={() => setConfirmClear(false)}\n text={t('action.query-cancel')}\n />\n </>\n ) : (\n <Button\n data-testid=\"vista-clear-storage\"\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={() => setConfirmClear(true)}\n text={t('vista.settings.clear-storage')}\n tone=\"critical\"\n />\n )}\n </Flex>","<Stack gap={3}>\n <Text muted size={1}>\n {t('vista.settings.clear-storage.description')}\n </Text>\n <Flex gap={2}>\n {confirmClear ? (\n <>\n <Button\n data-testid=\"vista-clear-storage-confirm\"\n icon={TrashIcon}\n onClick={() => void handleClearStorage()}\n text={t('vista.settings.clear-storage.confirm')}\n tone=\"critical\"\n />\n <Button\n mode=\"bleed\"\n onClick={() => setConfirmClear(false)}\n text={t('action.query-cancel')}\n />\n </>\n ) : (\n <Button\n data-testid=\"vista-clear-storage\"\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={() => setConfirmClear(true)}\n text={t('vista.settings.clear-storage')}\n tone=\"critical\"\n />\n )}\n </Flex>\n </Stack>","<Card border padding={3} radius={2} tone={confirmClear ? 'critical' : 'default'}>\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.settings.clear-storage.description')}\n </Text>\n <Flex gap={2}>\n {confirmClear ? (\n <>\n <Button\n data-testid=\"vista-clear-storage-confirm\"\n icon={TrashIcon}\n onClick={() => void handleClearStorage()}\n text={t('vista.settings.clear-storage.confirm')}\n tone=\"critical\"\n />\n <Button\n mode=\"bleed\"\n onClick={() => setConfirmClear(false)}\n text={t('action.query-cancel')}\n />\n </>\n ) : (\n <Button\n data-testid=\"vista-clear-storage\"\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={() => setConfirmClear(true)}\n text={t('vista.settings.clear-storage')}\n tone=\"critical\"\n />\n )}\n </Flex>\n </Stack>\n </Card>","confirmClear ? 'critical' : 'default'","<Box data-testid=\"vista-settings\" padding={4}>\n <Stack gap={5}>\n <Text muted size={1}>\n {t('vista.settings.description')}\n </Text>\n\n <DatasetField\n dataset={settings.dataset}\n datasets={datasets}\n id=\"vista-settings-dataset\"\n mode={settings.datasetMode}\n onChange={(dataset) => actorRef.send({type: 'settings.update', settings: dataset})}\n workspaceDataset={workspaceDataset}\n />\n\n <ApiVersionField\n id=\"vista-settings-api-version\"\n locked={false}\n onChange={handleApiVersionChange}\n value={apiVersionDraft}\n />\n\n <PerspectiveSelect\n id=\"vista-settings-perspective\"\n onChange={(perspective) =>\n actorRef.send({type: 'settings.update', settings: {perspective}})\n }\n value={settings.perspective}\n />\n\n <VariantSelect\n id=\"vista-settings-variant\"\n onChange={(variant) => actorRef.send({type: 'settings.update', settings: {variant}})}\n value={settings.variant}\n />\n\n <SwitchField\n checked={settings.includeSourceMap}\n description={t('vista.options.include-source-map.description')}\n onChange={(includeSourceMap) =>\n actorRef.send({type: 'settings.update', settings: {includeSourceMap}})\n }\n title={t('vista.options.include-source-map')}\n />\n\n <UseCdnField\n checked={settings.useCdn}\n onChange={(useCdn) => actorRef.send({type: 'settings.update', settings: {useCdn}})}\n testId=\"vista-settings-use-cdn\"\n />\n\n <Card border padding={3} radius={2}>\n <HiddenDiffFieldsSetting />\n </Card>\n\n <Card border padding={3} radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.redesign.settings.title')}\n </Text>\n <Text muted size={1}>\n {t('vista.redesign.settings.description')}\n </Text>\n <Flex>\n <Button\n data-testid=\"vista-settings-classic\"\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={switchToClassic}\n text={t('vista.redesign.switch-to-classic')}\n />\n </Flex>\n </Stack>\n </Card>\n\n <Card border padding={3} radius={2} tone={confirmClear ? 'critical' : 'default'}>\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.settings.clear-storage.description')}\n </Text>\n <Flex gap={2}>\n {confirmClear ? (\n <>\n <Button\n data-testid=\"vista-clear-storage-confirm\"\n icon={TrashIcon}\n onClick={() => void handleClearStorage()}\n text={t('vista.settings.clear-storage.confirm')}\n tone=\"critical\"\n />\n <Button\n mode=\"bleed\"\n onClick={() => setConfirmClear(false)}\n text={t('action.query-cancel')}\n />\n </>\n ) : (\n <Button\n data-testid=\"vista-clear-storage\"\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={() => setConfirmClear(true)}\n text={t('vista.settings.clear-storage')}\n tone=\"critical\"\n />\n )}\n </Flex>\n </Stack>\n </Card>\n </Stack>\n </Box>","_c","_temp","_temp2","_Fragment","{drawer}: {drawer: VistaDrawer}","<Box\n data-testid={`vista-drawer-${drawer}-content`}\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n overflow=\"auto\"\n ref={setElement}\n />","`vista-drawer-${drawer}-content`","<QueryListPanel key={drawer} mode={drawer} />","<Box flexBasis=\"0%\" flexGrow={1} minHeight=\"0\" overflow=\"auto\">\n <SettingsPanel />\n </Box>","<TabDrawerSlotElement drawer={drawer} />","{drawer, overlay}: SidebarDrawerProps","() => actorRef.send({type: 'drawer.close'})","useCallback(() => actorRef.send({type: 'drawer.close'}), [actorRef])","drawerTitle(drawer, t)","(event: KeyboardEvent<HTMLDivElement>) => {\n if (overlay && event.key === 'Escape') {\n event.preventDefault()\n close()\n }\n }","useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (overlay && event.key === 'Escape') {\n event.preventDefault()\n close()\n }\n },\n [close, overlay],\n )","cx(\n styles.sidebarDrawer,\n drawer !== 'saved' && drawer !== 'shared' && styles.sidebarDrawerWide,\n overlay && styles.sidebarDrawerOverlay,\n )","drawer !== 'saved' && drawer !== 'shared' && styles.sidebarDrawerWide","overlay && styles.sidebarDrawerOverlay","<Text size={1} weight=\"medium\">\n {title}\n </Text>","t('vista.drawer.close')","<Button\n aria-label={t('vista.drawer.close')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={close}\n padding={2}\n />","<Flex\n alignItems=\"center\"\n borderBottom\n flexShrink={0}\n gap={2}\n justifyContent=\"space-between\"\n paddingLeft={3}\n paddingRight={2}\n paddingY={2}\n >\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Button\n aria-label={t('vista.drawer.close')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={close}\n padding={2}\n />\n </Flex>","<DrawerContent drawer={drawer} />","<Flex\n aria-label={overlay ? title : undefined}\n aria-modal={overlay || undefined}\n borderRight\n className={cx(\n styles.sidebarDrawer,\n drawer !== 'saved' && drawer !== 'shared' && styles.sidebarDrawerWide,\n overlay && styles.sidebarDrawerOverlay,\n )}\n data-testid={`vista-drawer-${drawer}`}\n flexDirection=\"column\"\n height=\"100%\"\n onKeyDown={handleKeyDown}\n role={overlay ? 'dialog' : undefined}\n >\n <Flex\n alignItems=\"center\"\n borderBottom\n flexShrink={0}\n gap={2}\n justifyContent=\"space-between\"\n paddingLeft={3}\n paddingRight={2}\n paddingY={2}\n >\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Button\n aria-label={t('vista.drawer.close')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={close}\n padding={2}\n />\n </Flex>\n <DrawerContent drawer={drawer} />\n </Flex>","`vista-drawer-${drawer}`","overlay ? 'dialog' : undefined","overlay ? title : undefined","overlay || undefined","<TrapFocus autoFocus disabled={!overlay} lockProps={TRAP_FOCUS_PROPS}>\n <Flex\n aria-label={overlay ? title : undefined}\n aria-modal={overlay || undefined}\n borderRight\n className={cx(\n styles.sidebarDrawer,\n drawer !== 'saved' && drawer !== 'shared' && styles.sidebarDrawerWide,\n overlay && styles.sidebarDrawerOverlay,\n )}\n data-testid={`vista-drawer-${drawer}`}\n flexDirection=\"column\"\n height=\"100%\"\n onKeyDown={handleKeyDown}\n role={overlay ? 'dialog' : undefined}\n >\n <Flex\n alignItems=\"center\"\n borderBottom\n flexShrink={0}\n gap={2}\n justifyContent=\"space-between\"\n paddingLeft={3}\n paddingRight={2}\n paddingY={2}\n >\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Button\n aria-label={t('vista.drawer.close')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={close}\n padding={2}\n />\n </Flex>\n <DrawerContent drawer={drawer} />\n </Flex>\n </TrapFocus>","!overlay","unknownDrawer","_c","styles.sidebarDrawer","{icon, label, expanded, selected, badge, testId, onClick}: SidebarItemProps","badge && (\n <Badge\n aria-hidden\n className={cx(styles.sidebarItemBadge, expanded && styles.sidebarItemBadgeExpanded)}\n data-testid={`${testId}-badge`}\n fontSize={0}\n tone={badge.tone}\n >\n {badge.count}\n </Badge>\n )","<Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n justify=\"flex-start\"\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n text={label}\n width=\"fill\"\n />","<div className={styles.sidebarItem}>\n <Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n justify=\"flex-start\"\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n text={label}\n width=\"fill\"\n />\n {count}\n </div>","<Text size={1}>{name}</Text>","<Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n />","<Tooltip animate content={<Text size={1}>{name}</Text>} placement=\"right\" portal>\n <Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n />\n </Tooltip>","<div className={styles.sidebarItem}>\n <Tooltip animate content={<Text size={1}>{name}</Text>} placement=\"right\" portal>\n <Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n />\n </Tooltip>\n {count}\n </div>","(snapshot) => snapshot.matches({sidebar: 'expanded'})","(target: VistaDrawer, event: MouseEvent<HTMLElement>) => {\n if (drawer === null) openerRef.current = event.currentTarget\n actorRef.send({type: 'drawer.toggle', drawer: target})\n }","useCallback(\n (target: VistaDrawer, event: MouseEvent<HTMLElement>) => {\n if (drawer === null) openerRef.current = event.currentTarget\n actorRef.send({type: 'drawer.toggle', drawer: target})\n },\n [actorRef, drawer],\n )","(next, previous) => {\n if (previous === null || next !== null) return\n openerRef.current?.focus()\n openerRef.current = null\n }","t('vista.sidebar.label')","cx(\n styles.sidebarRail,\n expanded ? styles.sidebarRailExpanded : styles.sidebarRailCollapsed,\n isMobile && expanded && styles.sidebarRailOverlay,\n )","expanded ? styles.sidebarRailExpanded : styles.sidebarRailCollapsed","isMobile && expanded && styles.sidebarRailOverlay","t('vista.sidebar.shared-queries')","(event) => toggleDrawer('shared', event)","event","<SidebarItem\n expanded={expanded}\n icon={UsersIcon}\n label={t('vista.sidebar.shared-queries')}\n onClick={(event) => toggleDrawer('shared', event)}\n selected={drawer === 'shared'}\n testId=\"vista-sidebar-shared\"\n />","drawer === 'shared'","t('vista.sidebar.saved-queries')","(event) => toggleDrawer('saved', event)","<SidebarItem\n expanded={expanded}\n icon={BookmarkIcon}\n label={t('vista.sidebar.saved-queries')}\n onClick={(event) => toggleDrawer('saved', event)}\n selected={drawer === 'saved'}\n testId=\"vista-sidebar-saved\"\n />","drawer === 'saved'","t('vista.panel.lint')","(event) => toggleDrawer('lint', event)","<SidebarItem\n badge={badges.lint}\n expanded={expanded}\n icon={ErrorOutlineIcon}\n label={t('vista.panel.lint')}\n onClick={(event) => toggleDrawer('lint', event)}\n selected={drawer === 'lint'}\n testId=\"vista-sidebar-lint\"\n />","lint","drawer === 'lint'","badges.lint","t('vista.panel.functions')","(event) => toggleDrawer('functions', event)","<SidebarItem\n badge={badges.functions}\n expanded={expanded}\n icon={CodeIcon}\n label={t('vista.panel.functions')}\n onClick={(event) => toggleDrawer('functions', event)}\n selected={drawer === 'functions'}\n testId=\"vista-sidebar-functions\"\n />","functions","drawer === 'functions'","badges.functions","t('vista.panel.delta')","(event) => toggleDrawer('delta', event)","<SidebarItem\n expanded={expanded}\n icon={TransferIcon}\n label={t('vista.panel.delta')}\n onClick={(event) => toggleDrawer('delta', event)}\n selected={drawer === 'delta'}\n testId=\"vista-sidebar-delta\"\n />","drawer === 'delta'","t('vista.panel.mutate')","(event) => toggleDrawer('mutate', event)","<SidebarItem\n expanded={expanded}\n icon={EditIcon}\n label={t('vista.panel.mutate')}\n onClick={(event) => toggleDrawer('mutate', event)}\n selected={drawer === 'mutate'}\n testId=\"vista-sidebar-mutate\"\n />","drawer === 'mutate'","<Box borderTop marginTop={1} paddingTop={1}>\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n badge={badges.lint}\n expanded={expanded}\n icon={ErrorOutlineIcon}\n label={t('vista.panel.lint')}\n onClick={(event) => toggleDrawer('lint', event)}\n selected={drawer === 'lint'}\n testId=\"vista-sidebar-lint\"\n />\n <SidebarItem\n badge={badges.functions}\n expanded={expanded}\n icon={CodeIcon}\n label={t('vista.panel.functions')}\n onClick={(event) => toggleDrawer('functions', event)}\n selected={drawer === 'functions'}\n testId=\"vista-sidebar-functions\"\n />\n <SidebarItem\n expanded={expanded}\n icon={TransferIcon}\n label={t('vista.panel.delta')}\n onClick={(event) => toggleDrawer('delta', event)}\n selected={drawer === 'delta'}\n testId=\"vista-sidebar-delta\"\n />\n <SidebarItem\n expanded={expanded}\n icon={EditIcon}\n label={t('vista.panel.mutate')}\n onClick={(event) => toggleDrawer('mutate', event)}\n selected={drawer === 'mutate'}\n testId=\"vista-sidebar-mutate\"\n />\n </Flex>\n </Box>","<Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n expanded={expanded}\n icon={UsersIcon}\n label={t('vista.sidebar.shared-queries')}\n onClick={(event) => toggleDrawer('shared', event)}\n selected={drawer === 'shared'}\n testId=\"vista-sidebar-shared\"\n />\n <SidebarItem\n expanded={expanded}\n icon={BookmarkIcon}\n label={t('vista.sidebar.saved-queries')}\n onClick={(event) => toggleDrawer('saved', event)}\n selected={drawer === 'saved'}\n testId=\"vista-sidebar-saved\"\n />\n <Box borderTop marginTop={1} paddingTop={1}>\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n badge={badges.lint}\n expanded={expanded}\n icon={ErrorOutlineIcon}\n label={t('vista.panel.lint')}\n onClick={(event) => toggleDrawer('lint', event)}\n selected={drawer === 'lint'}\n testId=\"vista-sidebar-lint\"\n />\n <SidebarItem\n badge={badges.functions}\n expanded={expanded}\n icon={CodeIcon}\n label={t('vista.panel.functions')}\n onClick={(event) => toggleDrawer('functions', event)}\n selected={drawer === 'functions'}\n testId=\"vista-sidebar-functions\"\n />\n <SidebarItem\n expanded={expanded}\n icon={TransferIcon}\n label={t('vista.panel.delta')}\n onClick={(event) => toggleDrawer('delta', event)}\n selected={drawer === 'delta'}\n testId=\"vista-sidebar-delta\"\n />\n <SidebarItem\n expanded={expanded}\n icon={EditIcon}\n label={t('vista.panel.mutate')}\n onClick={(event) => toggleDrawer('mutate', event)}\n selected={drawer === 'mutate'}\n testId=\"vista-sidebar-mutate\"\n />\n </Flex>\n </Box>\n </Flex>","t('vista.sidebar.shortcuts')","() => actorRef.send({type: 'dialog.open', dialog: 'shortcuts'})","<SidebarItem\n expanded={expanded}\n icon={BoltIcon}\n label={t('vista.sidebar.shortcuts')}\n onClick={() => actorRef.send({type: 'dialog.open', dialog: 'shortcuts'})}\n testId=\"vista-sidebar-shortcuts\"\n />","t('vista.sidebar.settings')","(event) => toggleDrawer('settings', event)","<SidebarItem\n expanded={expanded}\n icon={CogIcon}\n label={t('vista.sidebar.settings')}\n onClick={(event) => toggleDrawer('settings', event)}\n selected={drawer === 'settings'}\n testId=\"vista-sidebar-settings\"\n />","drawer === 'settings'","t('vista.redesign.switch-to-classic')","<SidebarItem\n expanded={expanded}\n icon={RestoreIcon}\n label={t('vista.redesign.switch-to-classic')}\n onClick={switchToClassic}\n testId=\"vista-sidebar-classic\"\n />","expanded ? t('vista.sidebar.collapse') : t('vista.sidebar.expand')","() => actorRef.send({type: 'sidebar.toggle'})","<Box borderTop paddingTop={1}>\n <SidebarItem\n expanded={expanded}\n icon={expanded ? DoubleChevronLeftIcon : DoubleChevronRightIcon}\n label={expanded ? t('vista.sidebar.collapse') : t('vista.sidebar.expand')}\n onClick={() => actorRef.send({type: 'sidebar.toggle'})}\n testId=\"vista-sidebar-toggle\"\n />\n </Box>","expanded ? DoubleChevronLeftIcon : DoubleChevronRightIcon","<Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n expanded={expanded}\n icon={BoltIcon}\n label={t('vista.sidebar.shortcuts')}\n onClick={() => actorRef.send({type: 'dialog.open', dialog: 'shortcuts'})}\n testId=\"vista-sidebar-shortcuts\"\n />\n <SidebarItem\n expanded={expanded}\n icon={CogIcon}\n label={t('vista.sidebar.settings')}\n onClick={(event) => toggleDrawer('settings', event)}\n selected={drawer === 'settings'}\n testId=\"vista-sidebar-settings\"\n />\n <SidebarItem\n expanded={expanded}\n icon={RestoreIcon}\n label={t('vista.redesign.switch-to-classic')}\n onClick={switchToClassic}\n testId=\"vista-sidebar-classic\"\n />\n <Box borderTop paddingTop={1}>\n <SidebarItem\n expanded={expanded}\n icon={expanded ? DoubleChevronLeftIcon : DoubleChevronRightIcon}\n label={expanded ? t('vista.sidebar.collapse') : t('vista.sidebar.expand')}\n onClick={() => actorRef.send({type: 'sidebar.toggle'})}\n testId=\"vista-sidebar-toggle\"\n />\n </Box>\n </Flex>","<Flex\n aria-label={t('vista.sidebar.label')}\n as=\"nav\"\n borderRight\n className={cx(\n styles.sidebarRail,\n expanded ? styles.sidebarRailExpanded : styles.sidebarRailCollapsed,\n isMobile && expanded && styles.sidebarRailOverlay,\n )}\n data-testid=\"vista-sidebar\"\n flexDirection=\"column\"\n gap={1}\n height=\"100%\"\n // Under a phone's full-width drawer the rail is covered and must not take focus\n inert={isMobile && drawer !== null}\n justifyContent=\"space-between\"\n padding={2}\n >\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n expanded={expanded}\n icon={UsersIcon}\n label={t('vista.sidebar.shared-queries')}\n onClick={(event) => toggleDrawer('shared', event)}\n selected={drawer === 'shared'}\n testId=\"vista-sidebar-shared\"\n />\n <SidebarItem\n expanded={expanded}\n icon={BookmarkIcon}\n label={t('vista.sidebar.saved-queries')}\n onClick={(event) => toggleDrawer('saved', event)}\n selected={drawer === 'saved'}\n testId=\"vista-sidebar-saved\"\n />\n <Box borderTop marginTop={1} paddingTop={1}>\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n badge={badges.lint}\n expanded={expanded}\n icon={ErrorOutlineIcon}\n label={t('vista.panel.lint')}\n onClick={(event) => toggleDrawer('lint', event)}\n selected={drawer === 'lint'}\n testId=\"vista-sidebar-lint\"\n />\n <SidebarItem\n badge={badges.functions}\n expanded={expanded}\n icon={CodeIcon}\n label={t('vista.panel.functions')}\n onClick={(event) => toggleDrawer('functions', event)}\n selected={drawer === 'functions'}\n testId=\"vista-sidebar-functions\"\n />\n <SidebarItem\n expanded={expanded}\n icon={TransferIcon}\n label={t('vista.panel.delta')}\n onClick={(event) => toggleDrawer('delta', event)}\n selected={drawer === 'delta'}\n testId=\"vista-sidebar-delta\"\n />\n <SidebarItem\n expanded={expanded}\n icon={EditIcon}\n label={t('vista.panel.mutate')}\n onClick={(event) => toggleDrawer('mutate', event)}\n selected={drawer === 'mutate'}\n testId=\"vista-sidebar-mutate\"\n />\n </Flex>\n </Box>\n </Flex>\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n expanded={expanded}\n icon={BoltIcon}\n label={t('vista.sidebar.shortcuts')}\n onClick={() => actorRef.send({type: 'dialog.open', dialog: 'shortcuts'})}\n testId=\"vista-sidebar-shortcuts\"\n />\n <SidebarItem\n expanded={expanded}\n icon={CogIcon}\n label={t('vista.sidebar.settings')}\n onClick={(event) => toggleDrawer('settings', event)}\n selected={drawer === 'settings'}\n testId=\"vista-sidebar-settings\"\n />\n <SidebarItem\n expanded={expanded}\n icon={RestoreIcon}\n label={t('vista.redesign.switch-to-classic')}\n onClick={switchToClassic}\n testId=\"vista-sidebar-classic\"\n />\n <Box borderTop paddingTop={1}>\n <SidebarItem\n expanded={expanded}\n icon={expanded ? DoubleChevronLeftIcon : DoubleChevronRightIcon}\n label={expanded ? t('vista.sidebar.collapse') : t('vista.sidebar.expand')}\n onClick={() => actorRef.send({type: 'sidebar.toggle'})}\n testId=\"vista-sidebar-toggle\"\n />\n </Box>\n </Flex>\n </Flex>","isMobile && drawer !== null","isMobile ? <div className={styles.sidebarSlot}>{rail}</div> : rail","drawer && <SidebarDrawer drawer={drawer} overlay={isMobile} />","<Flex flexShrink={0} height=\"100%\" minHeight=\"0\">\n {isMobile ? <div className={styles.sidebarSlot}>{rail}</div> : rail}\n {drawer && <SidebarDrawer drawer={drawer} overlay={isMobile} />}\n </Flex>","_c","styles.sidebarItem","_temp","styles.sidebarRailExpanded","styles.sidebarRailCollapsed","styles.sidebarRail","styles.sidebarSlot","async (text: string, successTitle: string) => {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n } else {\n copyWithTextarea(text)\n }\n toast.push({closable: true, status: 'success', title: successTitle})\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: err instanceof Error ? err.message : String(err),\n })\n }\n }","err","useCallback(\n async (text: string, successTitle: string) => {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n } else {\n copyWithTextarea(text)\n }\n toast.push({closable: true, status: 'success', title: successTitle})\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: err instanceof Error ? err.message : String(err),\n })\n }\n },\n [toast],\n )","_c","perspectiveStack.join(',')","() => {\n if (perspectiveStack.length > 0 && perspective !== 'global') {\n setPerspective('global')\n }\n }","length","_c","{\n runnerRef,\n dataset,\n enabled,\n tabId,\n}: LiveSubscriptionOptions","(snapshot) => snapshot.context.liveError","{apiVersion: LIVE_EVENTS_API_VERSION}","baseClient.withConfig({dataset})","useMemo(() => baseClient.withConfig({dataset}), [baseClient, dataset])","() => {\n if (!enabled) {\n runnerRef.send({type: 'live.disable'})\n return undefined\n }\n runnerRef.send({type: 'live.enable', client: liveClient})\n return () => runnerRef.send({type: 'live.disable'})\n }","[enabled, liveClient, runnerRef]","() => {\n if (liveError) {\n toast.push({\n closable: true,\n id: `vista-live-error-${tabId}`,\n status: 'warning',\n title: t('vista.live.error', {message: liveError.message}),\n })\n }\n }","[liveError, t, tabId, toast]","_c","_temp","{\n rootElement,\n onShortcut,\n onPaste,\n}: VistaDocumentEventsOptions","(event: KeyboardEvent) => {\n if (!rootElement || !(event.target instanceof Node) || !rootElement.contains(event.target)) {\n return\n }\n const shortcut = matchVistaShortcut(event)\n if (!shortcut) return\n event.preventDefault()\n event.stopPropagation()\n onShortcut(shortcut)\n }","(event: ClipboardEvent) => {\n if (!event.clipboardData || !isVisionPasteTarget(rootElement, event)) return\n if (onPaste(event.clipboardData.getData('text/plain'))) {\n event.preventDefault()\n }\n }","event","() => {\n const onKeyDown = (event: KeyboardEvent) => handleKeyDown(event)\n const onPasteEvent = (event: ClipboardEvent) => handlePaste(event)\n document.addEventListener('keydown', onKeyDown)\n document.addEventListener('paste', onPasteEvent)\n return () => {\n document.removeEventListener('keydown', onKeyDown)\n document.removeEventListener('paste', onPasteEvent)\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","[]","_c","describeValue","unhandled","evaluate","clamp","{children, testId}: {children: ReactNode; testId: string}","<Flex\n alignItems=\"center\"\n borderTop\n data-testid={testId}\n flexShrink={0}\n gap={2}\n justifyContent=\"flex-end\"\n padding={2}\n >\n {children}\n </Flex>","_c","placement = 'bottom'","title && <Text size={1}>{title}</Text>","t('vista.agent-actions.credits')","<Text muted size={1}>\n {t('vista.agent-actions.credits')}\n </Text>","<Stack gap={2}>\n {title && <Text size={1}>{title}</Text>}\n <Text muted size={1}>\n {t('vista.agent-actions.credits')}\n </Text>\n </Stack>","<Tooltip\n animate\n content={\n <Stack gap={2}>\n {title && <Text size={1}>{title}</Text>}\n <Text muted size={1}>\n {t('vista.agent-actions.credits')}\n </Text>\n </Stack>\n }\n placement={placement}\n portal\n >\n {children}\n </Tooltip>","_c","tabs.find((tab) => tab.id === activeTabId) || tabs[0]","tabs.map((tab) => tab.id).join(' ')","(tab) => tab.id","() => {\n const strip = stripRef.current\n if (!strip) return undefined\n const tabElement = (tabId: string) => document.getElementById(`${idPrefix}-${tabId}-tab`)\n const reveal = () => {\n const tab = tabElement(activeTab.id)\n if (!tab) return\n const stripBox = strip.getBoundingClientRect()\n const tabBox = tab.getBoundingClientRect()\n if (tabBox.left < stripBox.left) strip.scrollLeft -= stripBox.left - tabBox.left\n else if (tabBox.right > stripBox.right) strip.scrollLeft += tabBox.right - stripBox.right\n }\n reveal()\n const observer = new ResizeObserver(reveal)\n for (const tabId of tabIds.split(' ')) {\n const tab = tabElement(tabId)\n if (tab) observer.observe(tab)\n }\n return () => observer.disconnect()\n }","[activeTab.id, idPrefix, tabIds]","id","tab","tabId","tabs.map((tab) => (\n <Tab\n aria-controls={`${idPrefix}-${tab.id}-panel`}\n fontSize={1}\n icon={tab.icon}\n id={`${idPrefix}-${tab.id}-tab`}\n key={tab.id}\n label={tab.label}\n onClick={() => {\n onTabChange(tab.id)\n if (collapsed) onToggle()\n }}\n padding={2}\n // A tablist always has a selected tab; collapsing hides its panel, no more\n selected={tab.id === activeTab.id}\n />\n ))","(tab) => (\n <Tab\n aria-controls={`${idPrefix}-${tab.id}-panel`}\n fontSize={1}\n icon={tab.icon}\n id={`${idPrefix}-${tab.id}-tab`}\n key={tab.id}\n label={tab.label}\n onClick={() => {\n onTabChange(tab.id)\n if (collapsed) onToggle()\n }}\n padding={2}\n // A tablist always has a selected tab; collapsing hides its panel, no more\n selected={tab.id === activeTab.id}\n />\n )","<Box className={styles.panelTabs} ref={stripRef}>\n <TabList gap={1}>\n {tabs.map((tab) => (\n <Tab\n aria-controls={`${idPrefix}-${tab.id}-panel`}\n fontSize={1}\n icon={tab.icon}\n id={`${idPrefix}-${tab.id}-tab`}\n key={tab.id}\n label={tab.label}\n onClick={() => {\n onTabChange(tab.id)\n if (collapsed) onToggle()\n }}\n padding={2}\n // A tablist always has a selected tab; collapsing hides its panel, no more\n selected={tab.id === activeTab.id}\n />\n ))}\n </TabList>\n </Box>","collapsed ? t('vista.panel.expand') : t('vista.panel.collapse')","<Button\n aria-label={collapsed ? t('vista.panel.expand') : t('vista.panel.collapse')}\n data-testid={`${idPrefix}-panel-toggle`}\n fontSize={1}\n icon={collapsed ? ChevronUpIcon : ChevronDownIcon}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n />","collapsed ? ChevronUpIcon : ChevronDownIcon","`${idPrefix}-panel-toggle`","<Flex\n alignItems=\"center\"\n borderBottom={!collapsed}\n flexShrink={0}\n gap={2}\n height={`${PANEL_HEADER_HEIGHT}px`}\n justifyContent=\"space-between\"\n paddingX={2}\n >\n <Box className={styles.panelTabs} ref={stripRef}>\n <TabList gap={1}>\n {tabs.map((tab) => (\n <Tab\n aria-controls={`${idPrefix}-${tab.id}-panel`}\n fontSize={1}\n icon={tab.icon}\n id={`${idPrefix}-${tab.id}-tab`}\n key={tab.id}\n label={tab.label}\n onClick={() => {\n onTabChange(tab.id)\n if (collapsed) onToggle()\n }}\n padding={2}\n // A tablist always has a selected tab; collapsing hides its panel, no more\n selected={tab.id === activeTab.id}\n />\n ))}\n </TabList>\n </Box>\n <Button\n aria-label={collapsed ? t('vista.panel.expand') : t('vista.panel.collapse')}\n data-testid={`${idPrefix}-panel-toggle`}\n fontSize={1}\n icon={collapsed ? ChevronUpIcon : ChevronDownIcon}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n />\n </Flex>","!collapsed","!collapsed && (\n <TabPanel\n aria-labelledby={`${idPrefix}-${activeTab.id}-tab`}\n flex={1}\n id={`${idPrefix}-${activeTab.id}-panel`}\n overflow=\"auto\"\n >\n {activeTab.content}\n </TabPanel>\n )","content","<Flex data-testid={`${idPrefix}-panel`} flexDirection=\"column\" height=\"100%\" minHeight=\"0\">\n <Flex\n alignItems=\"center\"\n borderBottom={!collapsed}\n flexShrink={0}\n gap={2}\n height={`${PANEL_HEADER_HEIGHT}px`}\n justifyContent=\"space-between\"\n paddingX={2}\n >\n <Box className={styles.panelTabs} ref={stripRef}>\n <TabList gap={1}>\n {tabs.map((tab) => (\n <Tab\n aria-controls={`${idPrefix}-${tab.id}-panel`}\n fontSize={1}\n icon={tab.icon}\n id={`${idPrefix}-${tab.id}-tab`}\n key={tab.id}\n label={tab.label}\n onClick={() => {\n onTabChange(tab.id)\n if (collapsed) onToggle()\n }}\n padding={2}\n // A tablist always has a selected tab; collapsing hides its panel, no more\n selected={tab.id === activeTab.id}\n />\n ))}\n </TabList>\n </Box>\n <Button\n aria-label={collapsed ? t('vista.panel.expand') : t('vista.panel.collapse')}\n data-testid={`${idPrefix}-panel-toggle`}\n fontSize={1}\n icon={collapsed ? ChevronUpIcon : ChevronDownIcon}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n />\n </Flex>\n {!collapsed && (\n <TabPanel\n aria-labelledby={`${idPrefix}-${activeTab.id}-tab`}\n flex={1}\n id={`${idPrefix}-${activeTab.id}-panel`}\n overflow=\"auto\"\n >\n {activeTab.content}\n </TabPanel>\n )}\n </Flex>","`${idPrefix}-panel`","_c","_temp","styles.panelTabs","cx(styles.collapsibleSection, expanded && className)","expanded && className","<Button\n aria-controls={`${id}-content`}\n aria-expanded={expanded}\n data-testid={`${id}-toggle`}\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n id={`${id}-toggle`}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n text={title}\n />","`${id}-content`","`${id}-toggle`","expanded ? ChevronDownIcon : ChevronRightIcon","expanded && actions && (\n <>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </>\n )","<Flex\n alignItems=\"center\"\n borderBottom={expanded}\n flexShrink={0}\n gap={1}\n height={`${PANEL_HEADER_HEIGHT}px`}\n paddingX={2}\n >\n <Button\n aria-controls={`${id}-content`}\n aria-expanded={expanded}\n data-testid={`${id}-toggle`}\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n id={`${id}-toggle`}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n text={title}\n />\n {icon}\n {expanded && actions && (\n <>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </>\n )}\n </Flex>","expanded && (\n <Box\n aria-labelledby={`${id}-toggle`}\n className={styles.sectionBody}\n id={`${id}-content`}\n role=\"region\"\n >\n {children}\n </Box>\n )","<Flex\n as=\"section\"\n className={cx(styles.collapsibleSection, expanded && className)}\n data-expanded={expanded}\n data-testid={`${id}-panel`}\n ref={ref}\n style={expanded ? style : undefined}\n >\n {handle}\n <Flex\n alignItems=\"center\"\n borderBottom={expanded}\n flexShrink={0}\n gap={1}\n height={`${PANEL_HEADER_HEIGHT}px`}\n paddingX={2}\n >\n <Button\n aria-controls={`${id}-content`}\n aria-expanded={expanded}\n data-testid={`${id}-toggle`}\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n id={`${id}-toggle`}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n text={title}\n />\n {icon}\n {expanded && actions && (\n <>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </>\n )}\n </Flex>\n {expanded && (\n <Box\n aria-labelledby={`${id}-toggle`}\n className={styles.sectionBody}\n id={`${id}-content`}\n role=\"region\"\n >\n {children}\n </Box>\n )}\n </Flex>","`${id}-panel`","expanded ? style : undefined","_c","styles.collapsibleSection","_Fragment","{resolved, onReveal}: ApiVersionButtonProps","useCdn\n ? t('vista.api-version.tooltip-cdn', {version: apiVersion})\n : t('vista.api-version.tooltip', {version: apiVersion})","t('vista.api-version.tooltip-invalid')","t('vista.api-version.tooltip-cdn-blocked', {\n version: apiVersion,\n perspective: perspectiveName,\n })","t('vista.api-version.tooltip-locked', {version: apiVersion})","<Text size={1}>{tooltip}</Text>","() => onReveal(cdnBlocked ? 'perspective' : 'apiVersion')","isValidApiVersion\n ? t(useCdn ? 'vista.api-version.button-cdn' : 'vista.api-version.button', {\n version: apiVersion,\n })\n : t('vista.api-version.button-invalid')","<Button\n data-cdn-blocked={cdnBlocked || undefined}\n data-testid=\"vista-api-version-button\"\n fontSize={1}\n icon={cdnBlocked ? WarningOutlineIcon : undefined}\n mode=\"bleed\"\n onClick={() => onReveal(cdnBlocked ? 'perspective' : 'apiVersion')}\n padding={2}\n text={\n isValidApiVersion\n ? t(useCdn ? 'vista.api-version.button-cdn' : 'vista.api-version.button', {\n version: apiVersion,\n })\n : t('vista.api-version.button-invalid')\n }\n tone={isValidApiVersion && !cdnBlocked ? 'default' : 'caution'}\n />","cdnBlocked || undefined","cdnBlocked ? WarningOutlineIcon : undefined","isValidApiVersion && !cdnBlocked ? 'default' : 'caution'","<Tooltip animate content={<Text size={1}>{tooltip}</Text>} placement=\"top\" portal>\n <Button\n data-cdn-blocked={cdnBlocked || undefined}\n data-testid=\"vista-api-version-button\"\n fontSize={1}\n icon={cdnBlocked ? WarningOutlineIcon : undefined}\n mode=\"bleed\"\n onClick={() => onReveal(cdnBlocked ? 'perspective' : 'apiVersion')}\n padding={2}\n text={\n isValidApiVersion\n ? t(useCdn ? 'vista.api-version.button-cdn' : 'vista.api-version.button', {\n version: apiVersion,\n })\n : t('vista.api-version.button-invalid')\n }\n tone={isValidApiVersion && !cdnBlocked ? 'default' : 'caution'}\n />\n </Tooltip>","_c","AGENT_API_VERSION","INSTRUCTION","RETRY_INSTRUCTION","client.config()","() =>\n projectId ? entries.get(projectId)?.credits : undefined","() => {\n if (!projectId) return\n const entry = entries.get(projectId)\n if (entry && (entry.reading || Date.now() - entry.readAt < MAX_AGE)) return\n void read(projectId, client)\n }","[client, projectId]","_c","describeType","projectStore.getOrganizationId()","useMemo(() => projectStore.getOrganizationId(), [projectStore])","{used, quota, apiHost, size}: AiCreditsNoteProps","(value: number) => numberFormat.format(value)","t('vista.ai-credits.used', {used: format(used)})","t('vista.ai-credits.deficit', {\n used: format(used),\n deficit: format(used - quota),\n quota: format(quota),\n })","t('vista.ai-credits.balance', {balance: format(quota - used), quota: format(quota)})","aiUsageUrl(apiHost, organizationId)","t('vista.ai-credits.usage')","<a href={aiUsageUrl(apiHost, organizationId)} rel=\"noreferrer\" target=\"_blank\">\n {t('vista.ai-credits.usage')}\n </a>","<Text data-testid=\"vista-ai-credits\" muted size={size}>\n {note}{' '}\n <a href={aiUsageUrl(apiHost, organizationId)} rel=\"noreferrer\" target=\"_blank\">\n {t('vista.ai-credits.usage')}\n </a>\n </Text>","note","{credits, apiHost}: AiCreditsLimitCardProps","t('vista.ai-credits.limit.title')","<Text size={1} weight=\"medium\">\n {t('vista.ai-credits.limit.title')}\n </Text>","used === undefined || quota === undefined\n ? t('vista.ai-credits.limit.description-unknown')\n : t('vista.ai-credits.limit.description', {\n used: numberFormat.format(used),\n quota: numberFormat.format(quota),\n })","<Text muted size={1}>\n {used === undefined || quota === undefined\n ? t('vista.ai-credits.limit.description-unknown')\n : t('vista.ai-credits.limit.description', {\n used: numberFormat.format(used),\n quota: numberFormat.format(quota),\n })}\n </Text>","t('vista.ai-credits.limit.learn-more')","<Button\n as=\"a\"\n fontSize={1}\n href={AI_CREDITS_DOCS_URL}\n iconRight={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.learn-more')}\n />","aiSpendingLimitUrl(apiHost, organizationId)","t('vista.ai-credits.limit.manage')","<Button\n as=\"a\"\n data-testid=\"vista-ai-credits-manage\"\n fontSize={1}\n href={aiSpendingLimitUrl(apiHost, organizationId)}\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.manage')}\n tone=\"primary\"\n />","<Flex gap={2} justifyContent=\"flex-end\">\n <Button\n as=\"a\"\n fontSize={1}\n href={AI_CREDITS_DOCS_URL}\n iconRight={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.learn-more')}\n />\n <Button\n as=\"a\"\n data-testid=\"vista-ai-credits-manage\"\n fontSize={1}\n href={aiSpendingLimitUrl(apiHost, organizationId)}\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.manage')}\n tone=\"primary\"\n />\n </Flex>","<Card border data-testid=\"vista-ai-credits-limit\" padding={3} radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.ai-credits.limit.title')}\n </Text>\n <Text muted size={1}>\n {used === undefined || quota === undefined\n ? t('vista.ai-credits.limit.description-unknown')\n : t('vista.ai-credits.limit.description', {\n used: numberFormat.format(used),\n quota: numberFormat.format(quota),\n })}\n </Text>\n <Flex gap={2} justifyContent=\"flex-end\">\n <Button\n as=\"a\"\n fontSize={1}\n href={AI_CREDITS_DOCS_URL}\n iconRight={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.learn-more')}\n />\n <Button\n as=\"a\"\n data-testid=\"vista-ai-credits-manage\"\n fontSize={1}\n href={aiSpendingLimitUrl(apiHost, organizationId)}\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.manage')}\n tone=\"primary\"\n />\n </Flex>\n </Stack>\n </Card>","{credits, apiHost, size = 1}: AiCreditsStatusProps","size = 1","<AiCreditsLimitCard apiHost={apiHost} credits={credits} />","<AiCreditsNote apiHost={apiHost} quota={credits.quota} size={size} used={credits.used} />","quota","used","_c","organizationId$","(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onClose()\n } else if (event.key === 'Enter' && !pending) {\n event.preventDefault()\n onSubmit()\n }\n }","(event) => onChange(event.currentTarget.value)","event","<Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <TextInput\n aria-label={label}\n // Password managers ignore `autoComplete`, so each of them also gets its own opt-out\n autoComplete=\"off\"\n autoFocus\n data-1p-ignore\n data-bwignore\n data-form-type=\"other\"\n data-lpignore=\"true\"\n data-testid={`${testIdPrefix}-request`}\n disabled={pending}\n fontSize={1}\n icon={SparklesIcon}\n onChange={(event) => onChange(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n padding={2}\n placeholder={placeholder}\n value={value}\n />\n </Box>","`${testIdPrefix}-request`","!value.trim() || pending","t('vista.generate.submit')","<Button\n data-testid={`${testIdPrefix}-submit`}\n disabled={!value.trim() || pending}\n fontSize={1}\n loading={pending}\n onClick={onSubmit}\n padding={2}\n text={t('vista.generate.submit')}\n tone=\"primary\"\n />","`${testIdPrefix}-submit`","t('vista.generate.close')","<Button\n aria-label={t('vista.generate.close')}\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={2}\n />","<Flex alignItems=\"center\" gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <TextInput\n aria-label={label}\n // Password managers ignore `autoComplete`, so each of them also gets its own opt-out\n autoComplete=\"off\"\n autoFocus\n data-1p-ignore\n data-bwignore\n data-form-type=\"other\"\n data-lpignore=\"true\"\n data-testid={`${testIdPrefix}-request`}\n disabled={pending}\n fontSize={1}\n icon={SparklesIcon}\n onChange={(event) => onChange(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n padding={2}\n placeholder={placeholder}\n value={value}\n />\n </Box>\n <Button\n data-testid={`${testIdPrefix}-submit`}\n disabled={!value.trim() || pending}\n fontSize={1}\n loading={pending}\n onClick={onSubmit}\n padding={2}\n text={t('vista.generate.submit')}\n tone=\"primary\"\n />\n <Button\n aria-label={t('vista.generate.close')}\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={2}\n />\n </Flex>","_c","{tab, client, formatForEditor, onClose}: GenerateQueryBarProps","{type: 'idle'}","() => () => controllerRef.current?.abort()","[]","async (generated: GeneratedQuery, fetch: boolean, signal?: AbortSignal) => {\n const query = await formatForEditor(generated.query).catch(() => generated.query)\n if (signal?.aborted) return\n const named = tab.title === undefined && !tab.query.trim()\n actorRef.send({\n type: 'tab.load',\n id: tab.id,\n tab: {\n query,\n rawParams: JSON.stringify(generated.params, null, 2),\n ...(named ? {title: generated.title} : {}),\n },\n fetch: fetch ? 'generated' : undefined,\n })\n onClose()\n }","id","query","title","useCallback(\n async (generated: GeneratedQuery, fetch: boolean, signal?: AbortSignal) => {\n const query = await formatForEditor(generated.query).catch(() => generated.query)\n if (signal?.aborted) return\n const named = tab.title === undefined && !tab.query.trim()\n actorRef.send({\n type: 'tab.load',\n id: tab.id,\n tab: {\n query,\n rawParams: JSON.stringify(generated.params, null, 2),\n ...(named ? {title: generated.title} : {}),\n },\n fetch: fetch ? 'generated' : undefined,\n })\n onClose()\n },\n [actorRef, formatForEditor, onClose, tab.id, tab.query, tab.title],\n )","async () => {\n const description = request.trim()\n if (!description) return\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n setStatus({type: 'generating', attempt: 1})\n try {\n const generated = await generateQuery({\n request: description,\n schema: schema ? summarizeSchema(schema, description) : '',\n client,\n signal: controller.signal,\n onAttempt: (attempt) => setStatus({type: 'generating', attempt}),\n })\n reportAiCreditsGranted(client)\n await open(generated, true, controller.signal)\n } catch (error) {\n if (controller.signal.aborted) return\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(client, limit)\n setStatus({\n type: 'failed',\n message: error instanceof Error ? error.message : String(error),\n lastAttempt: error instanceof GenerateQueryError ? error.lastAttempt : undefined,\n limit,\n })\n }\n }","generated","error","useCallback(async () => {\n const description = request.trim()\n if (!description) return\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n setStatus({type: 'generating', attempt: 1})\n try {\n const generated = await generateQuery({\n request: description,\n schema: schema ? summarizeSchema(schema, description) : '',\n client,\n signal: controller.signal,\n onAttempt: (attempt) => setStatus({type: 'generating', attempt}),\n })\n reportAiCreditsGranted(client)\n await open(generated, true, controller.signal)\n } catch (error) {\n if (controller.signal.aborted) return\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(client, limit)\n setStatus({\n type: 'failed',\n message: error instanceof Error ? error.message : String(error),\n lastAttempt: error instanceof GenerateQueryError ? error.lastAttempt : undefined,\n limit,\n })\n }\n }, [client, open, request, schema])","t('vista.generate.label')","() => void generate()","t('vista.generate.placeholder')","<PromptRow\n label={t('vista.generate.label')}\n onChange={setRequest}\n onClose={onClose}\n onSubmit={() => void generate()}\n pending={generating}\n placeholder={t('vista.generate.placeholder')}\n testIdPrefix=\"vista-generate\"\n value={request}\n />","status.type === 'idle' && !atLimit && (\n <Text muted size={0}>\n {t('vista.generate.description')}\n </Text>\n )","type","status.type === 'generating' && (\n <Text data-testid=\"vista-generate-progress\" muted size={1}>\n {status.attempt > 1\n ? t('vista.generate.progress-retry', {\n attempt: status.attempt,\n max: MAX_GENERATE_ATTEMPTS,\n })\n : t('vista.generate.progress')}\n </Text>\n )","attempt","status.type === 'failed' && !atLimit && (\n <Card data-testid=\"vista-generate-error\" padding={3} radius={2} tone=\"critical\">\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.generate.failed')}\n </Text>\n <Text size={1}>{status.message}</Text>\n {lastAttempt && (\n <>\n <Code size={1}>{lastAttempt.query}</Code>\n <Flex>\n <Button\n data-testid=\"vista-generate-open-anyway\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => void open(lastAttempt, false)}\n padding={2}\n text={t('vista.generate.open-anyway')}\n />\n </Flex>\n </>\n )}\n </Stack>\n </Card>\n )","message","client.config()","<AiCreditsStatus apiHost={client.config().apiHost} credits={shownCredits} size={0} />","apiHost","<Card borderBottom data-testid=\"vista-generate-bar\" padding={2}>\n <Stack gap={2}>\n <PromptRow\n label={t('vista.generate.label')}\n onChange={setRequest}\n onClose={onClose}\n onSubmit={() => void generate()}\n pending={generating}\n placeholder={t('vista.generate.placeholder')}\n testIdPrefix=\"vista-generate\"\n value={request}\n />\n {status.type === 'idle' && !atLimit && (\n <Text muted size={0}>\n {t('vista.generate.description')}\n </Text>\n )}\n {status.type === 'generating' && (\n <Text data-testid=\"vista-generate-progress\" muted size={1}>\n {status.attempt > 1\n ? t('vista.generate.progress-retry', {\n attempt: status.attempt,\n max: MAX_GENERATE_ATTEMPTS,\n })\n : t('vista.generate.progress')}\n </Text>\n )}\n {status.type === 'failed' && !atLimit && (\n <Card data-testid=\"vista-generate-error\" padding={3} radius={2} tone=\"critical\">\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.generate.failed')}\n </Text>\n <Text size={1}>{status.message}</Text>\n {lastAttempt && (\n <>\n <Code size={1}>{lastAttempt.query}</Code>\n <Flex>\n <Button\n data-testid=\"vista-generate-open-anyway\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => void open(lastAttempt, false)}\n padding={2}\n text={t('vista.generate.open-anyway')}\n />\n </Flex>\n </>\n )}\n </Stack>\n </Card>\n )}\n <AiCreditsStatus apiHost={client.config().apiHost} credits={shownCredits} size={0} />\n </Stack>\n </Card>","_c","_Fragment","{active, supported, canFetch, onToggle}: LiveButtonProps","live ? t('vista.live.stop') : t('vista.live.button')","t('vista.query.auto-refetch.unsupported')","live ? t('vista.live.button.stop') : t('vista.live.button.start')","<Text size={1}>{tooltip}</Text>","<Button\n aria-hidden={unavailable || undefined}\n data-testid=\"vista-auto-refetch\"\n // Like Fetch it needs something to fetch, but a running session can always be stopped\n disabled={unavailable || (!live && !canFetch)}\n gap={2}\n icon={live ? StopIcon : SyncIcon}\n mode={live ? 'default' : 'ghost'}\n onClick={onToggle}\n padding={2}\n text={label}\n tone={live ? 'critical' : 'default'}\n />","unavailable || (!live && !canFetch)","live ? StopIcon : SyncIcon","live ? 'default' : 'ghost'","live ? 'critical' : 'default'","unavailable || undefined","unavailable && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>","<span\n aria-describedby={unavailable ? hintId : undefined}\n aria-disabled={unavailable || undefined}\n aria-label={unavailable ? label : undefined}\n role={unavailable ? 'button' : undefined}\n tabIndex={unavailable ? 0 : undefined}\n >\n <Button\n aria-hidden={unavailable || undefined}\n data-testid=\"vista-auto-refetch\"\n // Like Fetch it needs something to fetch, but a running session can always be stopped\n disabled={unavailable || (!live && !canFetch)}\n gap={2}\n icon={live ? StopIcon : SyncIcon}\n mode={live ? 'default' : 'ghost'}\n onClick={onToggle}\n padding={2}\n text={label}\n tone={live ? 'critical' : 'default'}\n />\n {unavailable && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>}\n </span>","unavailable ? hintId : undefined","unavailable ? label : undefined","unavailable ? 'button' : undefined","unavailable ? 0 : undefined","<Tooltip animate content={<Text size={1}>{tooltip}</Text>} placement=\"top\" portal>\n {/*\n A disabled button gets neither pointer events nor focus, so while the API version has no\n sync tags the wrapper stands in for it, as a disabled button described by the reason\n */}\n <span\n aria-describedby={unavailable ? hintId : undefined}\n aria-disabled={unavailable || undefined}\n aria-label={unavailable ? label : undefined}\n role={unavailable ? 'button' : undefined}\n tabIndex={unavailable ? 0 : undefined}\n >\n <Button\n aria-hidden={unavailable || undefined}\n data-testid=\"vista-auto-refetch\"\n // Like Fetch it needs something to fetch, but a running session can always be stopped\n disabled={unavailable || (!live && !canFetch)}\n gap={2}\n icon={live ? StopIcon : SyncIcon}\n mode={live ? 'default' : 'ghost'}\n onClick={onToggle}\n padding={2}\n text={label}\n tone={live ? 'critical' : 'default'}\n />\n {unavailable && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>}\n </span>\n </Tooltip>","_c","{testId, perspectiveName, onUsePublished}: CdnBlockedNoticeProps","<Text size={1}>\n <WarningOutlineIcon />\n </Text>","t('vista.options.use-cdn.blocked.title')","<Text size={1} weight=\"medium\">\n {t('vista.options.use-cdn.blocked.title')}\n </Text>","t('vista.options.use-cdn.blocked', {perspective: perspectiveName})","<Text size={1}>{t('vista.options.use-cdn.blocked', {perspective: perspectiveName})}</Text>","onUsePublished && (\n <Flex>\n <Button\n data-testid={`${testId}-use-published`}\n fontSize={1}\n mode=\"ghost\"\n onClick={onUsePublished}\n padding={2}\n text={t('vista.options.use-cdn.use-published')}\n />\n </Flex>\n )","<Flex gap={3}>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n <Stack flex={1} gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.options.use-cdn.blocked.title')}\n </Text>\n <Text size={1}>{t('vista.options.use-cdn.blocked', {perspective: perspectiveName})}</Text>\n {onUsePublished && (\n <Flex>\n <Button\n data-testid={`${testId}-use-published`}\n fontSize={1}\n mode=\"ghost\"\n onClick={onUsePublished}\n padding={2}\n text={t('vista.options.use-cdn.use-published')}\n />\n </Flex>\n )}\n </Stack>\n </Flex>","<Card border data-testid={testId} padding={3} radius={2} tone=\"caution\">\n <Flex gap={3}>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n <Stack flex={1} gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.options.use-cdn.blocked.title')}\n </Text>\n <Text size={1}>{t('vista.options.use-cdn.blocked', {perspective: perspectiveName})}</Text>\n {onUsePublished && (\n <Flex>\n <Button\n data-testid={`${testId}-use-published`}\n fontSize={1}\n mode=\"ghost\"\n onClick={onUsePublished}\n padding={2}\n text={t('vista.options.use-cdn.use-published')}\n />\n </Flex>\n )}\n </Stack>\n </Flex>\n </Card>","_c","{options, resolved, onChange}: OptionsPanelProps","<DatasetField\n dataset={options.dataset}\n datasets={datasets}\n id=\"vista-option-dataset\"\n mode={options.datasetMode}\n onChange={onChange}\n workspaceDataset={workspaceDataset}\n />","dataset","datasetMode","(apiVersion) => onChange({apiVersion})","<ApiVersionField\n id=\"vista-option-api-version\"\n locked={resolved.isApiVersionLocked}\n onChange={(apiVersion) => onChange({apiVersion})}\n value={options.apiVersion}\n />","apiVersion","isApiVersionLocked","(perspective) => onChange({perspective})","<PerspectiveSelect\n id=\"vista-option-perspective\"\n onChange={(perspective) => onChange({perspective})}\n value={options.perspective}\n />","perspective","(variant) => onChange({variant})","<VariantSelect\n id=\"vista-option-variant\"\n onChange={(variant) => onChange({variant})}\n value={options.variant}\n />","variant","<div className={styles.optionsGrid}>\n <DatasetField\n dataset={options.dataset}\n datasets={datasets}\n id=\"vista-option-dataset\"\n mode={options.datasetMode}\n onChange={onChange}\n workspaceDataset={workspaceDataset}\n />\n <ApiVersionField\n id=\"vista-option-api-version\"\n locked={resolved.isApiVersionLocked}\n onChange={(apiVersion) => onChange({apiVersion})}\n value={options.apiVersion}\n />\n <PerspectiveSelect\n id=\"vista-option-perspective\"\n onChange={(perspective) => onChange({perspective})}\n value={options.perspective}\n />\n <VariantSelect\n id=\"vista-option-variant\"\n onChange={(variant) => onChange({variant})}\n value={options.variant}\n />\n </div>","t('vista.options.include-source-map.description')","(includeSourceMap) => onChange({includeSourceMap})","t('vista.options.include-source-map')","<SwitchField\n checked={options.includeSourceMap}\n description={t('vista.options.include-source-map.description')}\n onChange={(includeSourceMap) => onChange({includeSourceMap})}\n testId=\"vista-option-source-map\"\n title={t('vista.options.include-source-map')}\n />","includeSourceMap","options.includeSourceMap","resolved.isCdnAnonymous ? [t('vista.options.use-cdn.anonymous')] : []","isCdnAnonymous","(useCdn) => onChange({useCdn})","<UseCdnField\n checked={options.useCdn}\n notes={resolved.isCdnAnonymous ? [t('vista.options.use-cdn.anonymous')] : []}\n onChange={(useCdn) => onChange({useCdn})}\n testId=\"vista-option-use-cdn\"\n />","useCdn","resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n onUsePublished={() => onChange({perspective: 'published'})}\n perspectiveName={perspectiveName}\n testId=\"vista-option-use-cdn-blocked\"\n />\n )","isCdnBlockedByPerspective","<Box data-testid=\"vista-options\" padding={3}>\n <Stack gap={4}>\n <div className={styles.optionsGrid}>\n <DatasetField\n dataset={options.dataset}\n datasets={datasets}\n id=\"vista-option-dataset\"\n mode={options.datasetMode}\n onChange={onChange}\n workspaceDataset={workspaceDataset}\n />\n <ApiVersionField\n id=\"vista-option-api-version\"\n locked={resolved.isApiVersionLocked}\n onChange={(apiVersion) => onChange({apiVersion})}\n value={options.apiVersion}\n />\n <PerspectiveSelect\n id=\"vista-option-perspective\"\n onChange={(perspective) => onChange({perspective})}\n value={options.perspective}\n />\n <VariantSelect\n id=\"vista-option-variant\"\n onChange={(variant) => onChange({variant})}\n value={options.variant}\n />\n </div>\n <SwitchField\n checked={options.includeSourceMap}\n description={t('vista.options.include-source-map.description')}\n onChange={(includeSourceMap) => onChange({includeSourceMap})}\n testId=\"vista-option-source-map\"\n title={t('vista.options.include-source-map')}\n />\n <UseCdnField\n checked={options.useCdn}\n notes={resolved.isCdnAnonymous ? [t('vista.options.use-cdn.anonymous')] : []}\n onChange={(useCdn) => onChange({useCdn})}\n testId=\"vista-option-use-cdn\"\n />\n {resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n onUsePublished={() => onChange({perspective: 'published'})}\n perspectiveName={perspectiveName}\n testId=\"vista-option-use-cdn-blocked\"\n />\n )}\n </Stack>\n </Box>","_c","styles.optionsGrid","useMemo((): SchemaType | undefined => {\n if (!schema) return undefined\n try {\n return getGroqSchema(schema)\n } catch {\n return undefined\n }\n }, [schema])","getGroqSchema(schema)","schema ? getDocumentTypeNames(schema) : []","useMemo(() => (schema ? getDocumentTypeNames(schema) : []), [schema])","inferQueryParams(query, {schema: groqSchema, documentTypes})","{\n ...inferQueryParams(query, {schema: groqSchema, documentTypes}),\n schemaUnavailable: !groqSchema,\n }","!groqSchema","useMemo(\n () => ({\n ...inferQueryParams(query, {schema: groqSchema, documentTypes}),\n schemaUnavailable: !groqSchema,\n }),\n [documentTypes, groqSchema, query],\n )","_c","draft && dequal(draft.value, value) ? draft.text : toText(value, kind)","(event) => {\n const next = event.currentTarget.value\n const nextValue = fromText(next, kind, empty)\n setDraft({text: next, value: nextValue})\n onChange(nextValue)\n }","<TextInput\n aria-label={label}\n disabled={disabled}\n fontSize={1}\n id={id}\n inputMode={kind === 'number' || kind === 'integer' ? 'decimal' : undefined}\n list={listId}\n onChange={(event) => {\n const next = event.currentTarget.value\n const nextValue = fromText(next, kind, empty)\n setDraft({text: next, value: nextValue})\n onChange(nextValue)\n }}\n placeholder={placeholder}\n value={text}\n />","kind === 'number' || kind === 'integer' ? 'decimal' : undefined","(event) => {\n const next = event.currentTarget.value\n if (next === 'other') return\n onChange(next === '' ? undefined : next === 'true')\n }","t('vista.params-form.not-set')","<option value=\"\">{t('vista.params-form.not-set')}</option>","<option value=\"true\">{String(true)}</option>","<option value=\"false\">{String(false)}</option>","selected === 'other' && <option value=\"other\">{preview(value)}</option>","<Select\n disabled={disabled}\n fontSize={1}\n id={id}\n onChange={(event) => {\n const next = event.currentTarget.value\n if (next === 'other') return\n onChange(next === '' ? undefined : next === 'true')\n }}\n value={selected}\n >\n <option value=\"\">{t('vista.params-form.not-set')}</option>\n <option value=\"true\">{String(true)}</option>\n <option value=\"false\">{String(false)}</option>\n {selected === 'other' && <option value=\"other\">{preview(value)}</option>}\n </Select>","selected","items.map((item, index) => (\n // Items have no identity of their own; an index keyed input shows the value it is given\n // oxlint-disable-next-line react/no-array-index-key\n <Flex alignItems=\"center\" gap={1} key={index}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <ValueInput\n disabled={disabled}\n empty=\"\"\n kind={kind}\n label={t('vista.params-form.item-label', {name: param.name, index: index + 1})}\n listId={listId}\n onChange={(value) => onChange(items.map((it, i) => (i === index ? value : it)))}\n placeholder={t('vista.params-form.item-placeholder')}\n value={item}\n />\n </Box>\n <Button\n aria-label={t('vista.params-form.remove-item')}\n disabled={disabled}\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onChange(items.filter((_, i) => i !== index))}\n padding={2}\n />\n </Flex>\n ))","name","i","() => onChange([...items, kind === 'number' || kind === 'integer' ? 0 : ''])","t('vista.params-form.add-item')","<Flex>\n <Button\n data-testid={`vista-params-form-${param.name}-add`}\n disabled={disabled}\n fontSize={1}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => onChange([...items, kind === 'number' || kind === 'integer' ? 0 : ''])}\n padding={2}\n text={t('vista.params-form.add-item')}\n />\n </Flex>","`vista-params-form-${param.name}-add`","<Stack gap={2}>\n {items.map((item, index) => (\n // Items have no identity of their own; an index keyed input shows the value it is given\n // oxlint-disable-next-line react/no-array-index-key\n <Flex alignItems=\"center\" gap={1} key={index}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <ValueInput\n disabled={disabled}\n empty=\"\"\n kind={kind}\n label={t('vista.params-form.item-label', {name: param.name, index: index + 1})}\n listId={listId}\n onChange={(value) => onChange(items.map((it, i) => (i === index ? value : it)))}\n placeholder={t('vista.params-form.item-placeholder')}\n value={item}\n />\n </Box>\n <Button\n aria-label={t('vista.params-form.remove-item')}\n disabled={disabled}\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onChange(items.filter((_, i) => i !== index))}\n padding={2}\n />\n </Flex>\n ))}\n <Flex>\n <Button\n data-testid={`vista-params-form-${param.name}-add`}\n disabled={disabled}\n fontSize={1}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => onChange([...items, kind === 'number' || kind === 'integer' ? 0 : ''])}\n padding={2}\n text={t('vista.params-form.add-item')}\n />\n </Flex>\n </Stack>","isSet ? describeProblem(type, value, t) : undefined","<BooleanInput\n disabled={disabled}\n id={inputId}\n isSet={isSet}\n onChange={onChange}\n value={value}\n />","Array.isArray(value) ? value : []","<ListInput\n disabled={disabled}\n items={Array.isArray(value) ? value : []}\n listId={options && listId}\n onChange={onChange}\n param={param}\n />","options && listId","type.kind === 'any' || type.array\n ? t('vista.params-form.any-placeholder')\n : t('vista.params-form.not-set')","array","kind","<Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <ValueInput\n disabled={disabled}\n empty={undefined}\n id={inputId}\n kind={type.array ? 'any' : type.kind}\n listId={options && listId}\n onChange={onChange}\n placeholder={\n type.kind === 'any' || type.array\n ? t('vista.params-form.any-placeholder')\n : t('vista.params-form.not-set')\n }\n value={value}\n />\n </Box>","type.array ? 'any' : type.kind","type.format === 'datetime' && (\n <Button\n disabled={disabled}\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onChange(new Date().toISOString())}\n padding={2}\n text={t('vista.params-form.now')}\n />\n )","format","<Flex alignItems=\"center\" gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <ValueInput\n disabled={disabled}\n empty={undefined}\n id={inputId}\n kind={type.array ? 'any' : type.kind}\n listId={options && listId}\n onChange={onChange}\n placeholder={\n type.kind === 'any' || type.array\n ? t('vista.params-form.any-placeholder')\n : t('vista.params-form.not-set')\n }\n value={value}\n />\n </Box>\n {type.format === 'datetime' && (\n <Button\n disabled={disabled}\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onChange(new Date().toISOString())}\n padding={2}\n text={t('vista.params-form.now')}\n />\n )}\n </Flex>","<code>{`$${param.name}`}</code>","`$${param.name}`","<Text as=\"label\" htmlFor={inputId} size={1} weight=\"medium\">\n <code>{`$${param.name}`}</code>\n </Text>","describeType(type, t)","<Text data-testid={`vista-params-form-${param.name}-type`} muted size={1}>\n {describeType(type, t)}\n </Text>","`vista-params-form-${param.name}-type`","<Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text as=\"label\" htmlFor={inputId} size={1} weight=\"medium\">\n <code>{`$${param.name}`}</code>\n </Text>\n <Text data-testid={`vista-params-form-${param.name}-type`} muted size={1}>\n {describeType(type, t)}\n </Text>\n </Flex>","options && (\n <datalist id={listId}>\n {options.map((option) => (\n <option key={option} value={option} />\n ))}\n </datalist>\n )","(option) => (\n <option key={option} value={option} />\n )","problem && (\n <Card\n data-testid={`vista-params-form-${param.name}-problem`}\n padding={2}\n radius={2}\n tone=\"caution\"\n >\n <Text size={1}>{problem}</Text>\n </Card>\n )","!isSet && (\n <Text muted size={1}>\n {t('vista.params-form.missing')}\n </Text>\n )","param.usages.length > 0 && (\n <Text muted size={0}>\n {t('vista.params-form.used-in')}{' '}\n {param.usages.map((usage, index) => (\n <span key={usage}>\n {index > 0 && ', '}\n <code>{usage}</code>\n </span>\n ))}\n </Text>\n )","usages","(usage, index) => (\n <span key={usage}>\n {index > 0 && ', '}\n <code>{usage}</code>\n </span>\n )","<Stack data-testid={`vista-params-form-${param.name}`} gap={2}>\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text as=\"label\" htmlFor={inputId} size={1} weight=\"medium\">\n <code>{`$${param.name}`}</code>\n </Text>\n <Text data-testid={`vista-params-form-${param.name}-type`} muted size={1}>\n {describeType(type, t)}\n </Text>\n </Flex>\n {input}\n {options && (\n <datalist id={listId}>\n {options.map((option) => (\n <option key={option} value={option} />\n ))}\n </datalist>\n )}\n {problem && (\n <Card\n data-testid={`vista-params-form-${param.name}-problem`}\n padding={2}\n radius={2}\n tone=\"caution\"\n >\n <Text size={1}>{problem}</Text>\n </Card>\n )}\n {!isSet && (\n <Text muted size={1}>\n {t('vista.params-form.missing')}\n </Text>\n )}\n {param.usages.length > 0 && (\n <Text muted size={0}>\n {t('vista.params-form.used-in')}{' '}\n {param.usages.map((usage, index) => (\n <span key={usage}>\n {index > 0 && ', '}\n <code>{usage}</code>\n </span>\n ))}\n </Text>\n )}\n </Stack>","`vista-params-form-${param.name}`","{query, params, onChange}: ParamsFormProps","params.parsed ?? {}","parsed","new Set(inference.params.map((param) => param.name))","params","(param) => param.name","params.valid ? Object.keys(values).filter((name) => !known.has(name)) : []","valid","(name: string, value: unknown) => {\n const next =\n value === undefined\n ? Object.fromEntries(Object.entries(values).filter(([key]) => key !== name))\n : {...values, [name]: value}\n onChange(JSON.stringify(next, null, 2))\n }","[key]","disabled && (\n <Card padding={3} radius={2} tone=\"caution\">\n <Text size={1}>{t('vista.params-form.invalid-json')}</Text>\n </Card>\n )","inference.syntaxError && (\n <Text muted size={1}>\n {t('vista.params-form.syntax-error')}\n </Text>\n )","syntaxError","inference.params.length === 0 && unused.length === 0 && (\n <Text muted size={1}>\n {t('vista.params-form.empty')}\n </Text>\n )","length","inference.params.map((param) => (\n <ParamField\n disabled={disabled}\n isSet={Object.hasOwn(values, param.name)}\n key={param.name}\n onChange={(value) => setValue(param.name, value)}\n param={param}\n value={values[param.name]}\n />\n ))","(param) => (\n <ParamField\n disabled={disabled}\n isSet={Object.hasOwn(values, param.name)}\n key={param.name}\n onChange={(value) => setValue(param.name, value)}\n param={param}\n value={values[param.name]}\n />\n )","param","value","unused.length > 0 && (\n <Stack data-testid=\"vista-params-form-unused\" gap={2}>\n <Text muted size={1} weight=\"medium\">\n {t('vista.params-form.unused')}\n </Text>\n {unused.map((name) => (\n <Flex alignItems=\"center\" gap={2} key={name}>\n <Text size={1}>\n <code>{`$${name}`}</code>\n </Text>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text muted size={1} textOverflow=\"ellipsis\">\n {preview(values[name])}\n </Text>\n </Box>\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => setValue(name, undefined)}\n padding={2}\n text={t('vista.params-form.remove')}\n />\n </Flex>\n ))}\n </Stack>\n )","unused.length","inference.params.length > 0 && inference.schemaUnavailable && (\n <Text muted size={0}>\n {t('vista.params-form.no-schema')}\n </Text>\n )","schemaUnavailable","<Stack data-testid=\"vista-params-form\" gap={4} padding={3}>\n {disabled && (\n <Card padding={3} radius={2} tone=\"caution\">\n <Text size={1}>{t('vista.params-form.invalid-json')}</Text>\n </Card>\n )}\n {inference.syntaxError && (\n <Text muted size={1}>\n {t('vista.params-form.syntax-error')}\n </Text>\n )}\n {inference.params.length === 0 && unused.length === 0 && (\n <Text muted size={1}>\n {t('vista.params-form.empty')}\n </Text>\n )}\n {inference.params.map((param) => (\n <ParamField\n disabled={disabled}\n isSet={Object.hasOwn(values, param.name)}\n key={param.name}\n onChange={(value) => setValue(param.name, value)}\n param={param}\n value={values[param.name]}\n />\n ))}\n {unused.length > 0 && (\n <Stack data-testid=\"vista-params-form-unused\" gap={2}>\n <Text muted size={1} weight=\"medium\">\n {t('vista.params-form.unused')}\n </Text>\n {unused.map((name) => (\n <Flex alignItems=\"center\" gap={2} key={name}>\n <Text size={1}>\n <code>{`$${name}`}</code>\n </Text>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text muted size={1} textOverflow=\"ellipsis\">\n {preview(values[name])}\n </Text>\n </Box>\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => setValue(name, undefined)}\n padding={2}\n text={t('vista.params-form.remove')}\n />\n </Flex>\n ))}\n </Stack>\n )}\n {inference.params.length > 0 && inference.schemaUnavailable && (\n <Text muted size={0}>\n {t('vista.params-form.no-schema')}\n </Text>\n )}\n </Stack>","toText","_c","_temp","_temp2","_temp3","{value, params, editorRef, onChange}: ParamsPanelProps","params.error && (\n <Card borderBottom padding={3} tone=\"critical\">\n <Text size={1}>{params.error}</Text>\n </Card>\n )","error","<VisionCodeMirror\n autoHeight\n extensions={paramsExtensions}\n initialValue={value}\n onChange={onChange}\n ref={editorRef}\n />","<div data-testid=\"vista-params-editor\">\n {params.error && (\n <Card borderBottom padding={3} tone=\"critical\">\n <Text size={1}>{params.error}</Text>\n </Card>\n )}\n <VisionCodeMirror\n autoHeight\n extensions={paramsExtensions}\n initialValue={value}\n onChange={onChange}\n ref={editorRef}\n />\n </div>","_c","{tab, request, resolved, onClose}: ExportQueryDialogProps","buildExportSnippets({\n query: request.query,\n params: request.params,\n url: request.url,\n projectId,\n dataset: resolved.dataset,\n apiVersion: resolved.apiVersion,\n perspective: resolved.perspective,\n variant: resolved.variant,\n includeSourceMap: tab.options.includeSourceMap,\n useCdn: request.useCdn,\n })","params","query","url","useCdn","apiVersion","dataset","perspective","variant","includeSourceMap","useMemo(\n () =>\n buildExportSnippets({\n query: request.query,\n params: request.params,\n url: request.url,\n projectId,\n dataset: resolved.dataset,\n apiVersion: resolved.apiVersion,\n perspective: resolved.perspective,\n variant: resolved.variant,\n includeSourceMap: tab.options.includeSourceMap,\n useCdn: request.useCdn,\n }),\n [projectId, request, resolved, tab.options.includeSourceMap],\n )","snippets.find((snippet) => snippet.id === activeId) || snippets[0]","t('vista.export-query.title')","t('vista.export-query.description')","<Text muted size={1}>\n {t('vista.export-query.description')}\n </Text>","snippets.map((snippet) => (\n <Tab\n aria-controls={`vista-export-${snippet.id}-panel`}\n fontSize={1}\n id={`vista-export-${snippet.id}-tab`}\n key={snippet.id}\n label={snippet.title}\n onClick={() => setActiveId(snippet.id)}\n selected={snippet.id === active.id}\n />\n ))","id","(snippet) => (\n <Tab\n aria-controls={`vista-export-${snippet.id}-panel`}\n fontSize={1}\n id={`vista-export-${snippet.id}-tab`}\n key={snippet.id}\n label={snippet.title}\n onClick={() => setActiveId(snippet.id)}\n selected={snippet.id === active.id}\n />\n )","snippet","<TabList gap={1}>\n {snippets.map((snippet) => (\n <Tab\n aria-controls={`vista-export-${snippet.id}-panel`}\n fontSize={1}\n id={`vista-export-${snippet.id}-tab`}\n key={snippet.id}\n label={snippet.title}\n onClick={() => setActiveId(snippet.id)}\n selected={snippet.id === active.id}\n />\n ))}\n </TabList>","<Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code language={active.language} size={1}>\n {active.code}\n </Code>\n </Card>","code","language","<TabPanel\n aria-labelledby={`vista-export-${active.id}-tab`}\n id={`vista-export-${active.id}-panel`}\n >\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code language={active.language} size={1}>\n {active.code}\n </Code>\n </Card>\n </TabPanel>","`vista-export-${active.id}-tab`","`vista-export-${active.id}-panel`","active.id === 'curl' ? t('vista.export-query.token-note') : ''","<Text muted size={1}>\n {active.id === 'curl' ? t('vista.export-query.token-note') : ''}\n </Text>","() => void copyToClipboard(active.code, t('vista.export-query.copied'))","t('vista.export-query.copy')","<Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(active.code, t('vista.export-query.copied'))}\n text={t('vista.export-query.copy')}\n />","<Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text muted size={1}>\n {active.id === 'curl' ? t('vista.export-query.token-note') : ''}\n </Text>\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(active.code, t('vista.export-query.copied'))}\n text={t('vista.export-query.copy')}\n />\n </Flex>","<Box padding={4}>\n <Stack gap={4}>\n <Text muted size={1}>\n {t('vista.export-query.description')}\n </Text>\n <TabList gap={1}>\n {snippets.map((snippet) => (\n <Tab\n aria-controls={`vista-export-${snippet.id}-panel`}\n fontSize={1}\n id={`vista-export-${snippet.id}-tab`}\n key={snippet.id}\n label={snippet.title}\n onClick={() => setActiveId(snippet.id)}\n selected={snippet.id === active.id}\n />\n ))}\n </TabList>\n <TabPanel\n aria-labelledby={`vista-export-${active.id}-tab`}\n id={`vista-export-${active.id}-panel`}\n >\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code language={active.language} size={1}>\n {active.code}\n </Code>\n </Card>\n </TabPanel>\n <Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text muted size={1}>\n {active.id === 'curl' ? t('vista.export-query.token-note') : ''}\n </Text>\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(active.code, t('vista.export-query.copied'))}\n text={t('vista.export-query.copy')}\n />\n </Flex>\n </Stack>\n </Box>","<Dialog\n animate\n data-testid=\"vista-export-query-dialog\"\n header={t('vista.export-query.title')}\n id=\"vista-export-query-dialog\"\n onClickOutside={onClose}\n onClose={onClose}\n width={2}\n >\n <Box padding={4}>\n <Stack gap={4}>\n <Text muted size={1}>\n {t('vista.export-query.description')}\n </Text>\n <TabList gap={1}>\n {snippets.map((snippet) => (\n <Tab\n aria-controls={`vista-export-${snippet.id}-panel`}\n fontSize={1}\n id={`vista-export-${snippet.id}-tab`}\n key={snippet.id}\n label={snippet.title}\n onClick={() => setActiveId(snippet.id)}\n selected={snippet.id === active.id}\n />\n ))}\n </TabList>\n <TabPanel\n aria-labelledby={`vista-export-${active.id}-tab`}\n id={`vista-export-${active.id}-panel`}\n >\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code language={active.language} size={1}>\n {active.code}\n </Code>\n </Card>\n </TabPanel>\n <Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text muted size={1}>\n {active.id === 'curl' ? t('vista.export-query.token-note') : ''}\n </Text>\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(active.code, t('vista.export-query.copied'))}\n text={t('vista.export-query.copy')}\n />\n </Flex>\n </Stack>\n </Box>\n </Dialog>","_c","styles.codeBlock","{request, buildRequest}","() => {\n // Params typed within the debounce window belong to the exported request; committing them\n // re-renders the dialog with the request built from them\n pendingEdits.commit()\n setExportOpen(true)\n }","useCallback(() => {\n // Params typed within the debounce window belong to the exported request; committing them\n // re-renders the dialog with the request built from them\n pendingEdits.commit()\n setExportOpen(true)\n }, [pendingEdits])","t('vista.query.actions')","<Button\n aria-label={t('vista.query.actions')}\n data-testid=\"vista-query-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />","t('vista.query.copy')","<MenuItem\n hotkeys={VISTA_SHORTCUTS['copy-query'].keys}\n icon={CopyIcon}\n onClick={onCopyQuery}\n text={t('vista.query.copy')}\n />","t('vista.query.prettify')","<MenuItem\n data-testid=\"vista-prettify\"\n hotkeys={VISTA_SHORTCUTS.prettify.keys}\n icon={CodeBlockIcon}\n onClick={onPrettify}\n text={t('vista.query.prettify')}\n />","<MenuDivider />","t('vista.query.export')","<MenuItem\n data-testid=\"vista-export-query\"\n disabled={!request}\n icon={CodeIcon}\n onClick={openExport}\n text={t('vista.query.export')}\n />","!request","() => void saveCurrent()","t('vista.query.save')","<MenuItem\n data-testid=\"vista-save-query\"\n disabled={!canSave}\n icon={BookmarkIcon}\n onClick={() => void saveCurrent()}\n text={t('vista.query.save')}\n />","!canSave","<Menu>\n <MenuItem\n hotkeys={VISTA_SHORTCUTS['copy-query'].keys}\n icon={CopyIcon}\n onClick={onCopyQuery}\n text={t('vista.query.copy')}\n />\n <MenuItem\n data-testid=\"vista-prettify\"\n hotkeys={VISTA_SHORTCUTS.prettify.keys}\n icon={CodeBlockIcon}\n onClick={onPrettify}\n text={t('vista.query.prettify')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-query\"\n disabled={!request}\n icon={CodeIcon}\n onClick={openExport}\n text={t('vista.query.export')}\n />\n <MenuItem\n data-testid=\"vista-save-query\"\n disabled={!canSave}\n icon={BookmarkIcon}\n onClick={() => void saveCurrent()}\n text={t('vista.query.save')}\n />\n </Menu>","{animate: true, portal: true, placement: 'top-end'}","<MenuButton\n button={\n <Button\n aria-label={t('vista.query.actions')}\n data-testid=\"vista-query-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />\n }\n id={`vista-query-menu-${tab.id}`}\n menu={\n <Menu>\n <MenuItem\n hotkeys={VISTA_SHORTCUTS['copy-query'].keys}\n icon={CopyIcon}\n onClick={onCopyQuery}\n text={t('vista.query.copy')}\n />\n <MenuItem\n data-testid=\"vista-prettify\"\n hotkeys={VISTA_SHORTCUTS.prettify.keys}\n icon={CodeBlockIcon}\n onClick={onPrettify}\n text={t('vista.query.prettify')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-query\"\n disabled={!request}\n icon={CodeIcon}\n onClick={openExport}\n text={t('vista.query.export')}\n />\n <MenuItem\n data-testid=\"vista-save-query\"\n disabled={!canSave}\n icon={BookmarkIcon}\n onClick={() => void saveCurrent()}\n text={t('vista.query.save')}\n />\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'top-end'}}\n />","`vista-query-menu-${tab.id}`","exportOpen && request && (\n <ExportQueryDialog\n onClose={() => setExportOpen(false)}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n )","<>\n <MenuButton\n button={\n <Button\n aria-label={t('vista.query.actions')}\n data-testid=\"vista-query-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />\n }\n id={`vista-query-menu-${tab.id}`}\n menu={\n <Menu>\n <MenuItem\n hotkeys={VISTA_SHORTCUTS['copy-query'].keys}\n icon={CopyIcon}\n onClick={onCopyQuery}\n text={t('vista.query.copy')}\n />\n <MenuItem\n data-testid=\"vista-prettify\"\n hotkeys={VISTA_SHORTCUTS.prettify.keys}\n icon={CodeBlockIcon}\n onClick={onPrettify}\n text={t('vista.query.prettify')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-query\"\n disabled={!request}\n icon={CodeIcon}\n onClick={openExport}\n text={t('vista.query.export')}\n />\n <MenuItem\n data-testid=\"vista-save-query\"\n disabled={!canSave}\n icon={BookmarkIcon}\n onClick={() => void saveCurrent()}\n text={t('vista.query.save')}\n />\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'top-end'}}\n />\n {exportOpen && request && (\n <ExportQueryDialog\n onClose={() => setExportOpen(false)}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n )}\n </>","_c","_Fragment","{\n containerRef,\n sectionRef,\n siblingRef,\n}: DragResizeOptions","(): Bounds | null => {\n const section = sectionRef.current\n const container = containerRef.current\n if (!section || !container) return null\n const siblingHeight = siblingRef.current?.getBoundingClientRect().height ?? 0\n return {\n current: Math.round(section.getBoundingClientRect().height),\n min: SECTION_MIN_HEIGHT,\n max: Math.round(\n Math.max(\n SECTION_MIN_HEIGHT,\n container.getBoundingClientRect().height - siblingHeight - QUERY_MIN_HEIGHT,\n ),\n ),\n }\n }","containerRef.current","sectionRef.current","siblingRef.current?.getBoundingClientRect","useCallback((): Bounds | null => {\n const section = sectionRef.current\n const container = containerRef.current\n if (!section || !container) return null\n const siblingHeight = siblingRef.current?.getBoundingClientRect().height ?? 0\n return {\n current: Math.round(section.getBoundingClientRect().height),\n min: SECTION_MIN_HEIGHT,\n max: Math.round(\n Math.max(\n SECTION_MIN_HEIGHT,\n container.getBoundingClientRect().height - siblingHeight - QUERY_MIN_HEIGHT,\n ),\n ),\n }\n }, [containerRef, sectionRef, siblingRef])","() => setMeasured(measure())","useCallback(() => setMeasured(measure()), [measure])","() => {\n requestAnimationFrame(() => setMeasured(measure()))\n }","useCallback(() => {\n requestAnimationFrame(() => setMeasured(measure()))\n }, [measure])","(event: ReactPointerEvent<HTMLElement>) => {\n const bounds = measure()\n if (event.button !== 0 || !bounds) return\n event.preventDefault()\n\n const handle = event.currentTarget\n const startY = event.clientY\n const onMove = (move: PointerEvent) => {\n setHeight(clamp(bounds.current - (move.clientY - startY), bounds))\n }\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onEnd)\n handle.removeEventListener('pointercancel', onEnd)\n setDragging(false)\n measureAfterRender()\n }\n handle.setPointerCapture(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onEnd)\n handle.addEventListener('pointercancel', onEnd)\n setDragging(true)\n }","useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const bounds = measure()\n if (event.button !== 0 || !bounds) return\n event.preventDefault()\n\n const handle = event.currentTarget\n const startY = event.clientY\n const onMove = (move: PointerEvent) => {\n setHeight(clamp(bounds.current - (move.clientY - startY), bounds))\n }\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onEnd)\n handle.removeEventListener('pointercancel', onEnd)\n setDragging(false)\n measureAfterRender()\n }\n handle.setPointerCapture(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onEnd)\n handle.addEventListener('pointercancel', onEnd)\n setDragging(true)\n },\n [measure, measureAfterRender],\n )","(event: ReactKeyboardEvent<HTMLElement>) => {\n const step = event.shiftKey ? LINE_HEIGHT * 5 : LINE_HEIGHT\n const next = (bounds: Bounds): number | null => {\n switch (event.key) {\n case 'ArrowUp':\n return bounds.current + step\n case 'ArrowDown':\n return bounds.current - step\n case 'Home':\n return bounds.min\n case 'End':\n return bounds.max\n case 'Enter':\n return null\n default:\n return bounds.current\n }\n }\n const bounds = measure()\n if (!bounds) return\n const target = next(bounds)\n if (target === bounds.current) return\n event.preventDefault()\n setHeight(target === null ? null : clamp(target, bounds))\n measureAfterRender()\n }","event","bounds","useCallback(\n (event: ReactKeyboardEvent<HTMLElement>) => {\n const step = event.shiftKey ? LINE_HEIGHT * 5 : LINE_HEIGHT\n const next = (bounds: Bounds): number | null => {\n switch (event.key) {\n case 'ArrowUp':\n return bounds.current + step\n case 'ArrowDown':\n return bounds.current - step\n case 'Home':\n return bounds.min\n case 'End':\n return bounds.max\n case 'Enter':\n return null\n default:\n return bounds.current\n }\n }\n const bounds = measure()\n if (!bounds) return\n const target = next(bounds)\n if (target === bounds.current) return\n event.preventDefault()\n setHeight(target === null ? null : clamp(target, bounds))\n measureAfterRender()\n },\n [measure, measureAfterRender],\n )","() => {\n setHeight(null)\n measureAfterRender()\n }","useCallback(() => {\n setHeight(null)\n measureAfterRender()\n }, [measureAfterRender])","{height, dragging, measured, onPointerDown, onKeyDown, onFocus, reset}","clamp","_c","createGroqLintExtensions(onLintFindings)","useMemo(() => createGroqLintExtensions(onLintFindings), [onLintFindings])","createGroqFunctionExtensions({\n reference: t('vista.functions.editor.reference'),\n apiVersion: (version) => t('vista.functions.editor.api-version', {version}),\n deltaOnly: t('vista.functions.editor.delta-only'),\n declaredOn: (line) => t('vista.functions.editor.declared-on', {line}),\n inLibrary: t('vista.functions.editor.in-library'),\n completionDeclared: t('vista.functions.editor.completion-declared'),\n completionLibrary: t('vista.functions.editor.completion-library'),\n extract: t('vista.functions.editor.extract'),\n addFromLibrary: t('vista.functions.editor.add-from-library'),\n useSuggestion: (suggestion) => t('vista.lint.use-suggestion', {suggestion}),\n })","useMemo(\n () =>\n createGroqFunctionExtensions({\n reference: t('vista.functions.editor.reference'),\n apiVersion: (version) => t('vista.functions.editor.api-version', {version}),\n deltaOnly: t('vista.functions.editor.delta-only'),\n declaredOn: (line) => t('vista.functions.editor.declared-on', {line}),\n inLibrary: t('vista.functions.editor.in-library'),\n completionDeclared: t('vista.functions.editor.completion-declared'),\n completionLibrary: t('vista.functions.editor.completion-library'),\n extract: t('vista.functions.editor.extract'),\n addFromLibrary: t('vista.functions.editor.add-from-library'),\n useSuggestion: (suggestion) => t('vista.lint.use-suggestion', {suggestion}),\n }),\n [t],\n )","schema ? createQuerySchema(schema) : undefined","useMemo(() => (schema ? createQuerySchema(schema) : undefined), [schema])","functionLibrary.of(library)","workspaceSchema ? [querySchema.of(workspaceSchema)] : []","[\n ...groqExtensions,\n ...lintExtensions,\n ...functionExtensions,\n functionLibrary.of(library),\n ...(workspaceSchema ? [querySchema.of(workspaceSchema)] : []),\n ]","useMemo(\n () => [\n ...groqExtensions,\n ...lintExtensions,\n ...functionExtensions,\n functionLibrary.of(library),\n ...(workspaceSchema ? [querySchema.of(workspaceSchema)] : []),\n ],\n [functionExtensions, library, lintExtensions, workspaceSchema],\n )","(snapshot) => isPanelExpanded(snapshot, 'params')","(snapshot) => isPanelExpanded(snapshot, 'options')","(panel: VistaPanel) => actorRef.send({type: 'panel.toggle', panel})","useCallback(\n (panel: VistaPanel) => actorRef.send({type: 'panel.toggle', panel}),\n [actorRef],\n )","(view: VistaParamsView) => actorRef.send({type: 'params.view', view})","useCallback(\n (view: VistaParamsView) => actorRef.send({type: 'params.view', view}),\n [actorRef],\n )","{containerRef, sectionRef: paramsRef, siblingRef: optionsRef}","() => {\n setGeneratorOpen(false)\n requestAnimationFrame(() =>\n containerRef.current\n ?.querySelector<HTMLElement>('[data-testid=\"vista-query-editor\"] .cm-content')\n ?.focus(),\n )\n }","useCallback(() => {\n setGeneratorOpen(false)\n requestAnimationFrame(() =>\n containerRef.current\n ?.querySelector<HTMLElement>('[data-testid=\"vista-query-editor\"] .cm-content')\n ?.focus(),\n )\n }, [])","(option: RevealedOption) => {\n if (!optionsExpanded) togglePanel('options')\n requestAnimationFrame(() => {\n const options = optionsRef.current\n const field =\n option === 'perspective'\n ? options?.querySelector<HTMLElement>('#vista-option-perspective')\n : (options?.querySelector<HTMLElement>(\n 'input[data-testid=\"vista-option-api-version-custom\"], [data-testid=\"vista-option-api-version-custom\"] input',\n ) ??\n options?.querySelector<HTMLElement>(\n '[data-testid=\"vista-option-api-version-wrap\"][tabindex]',\n ) ??\n options?.querySelector<HTMLElement>('#vista-option-api-version'))\n field?.focus()\n })\n }","useCallback(\n (option: RevealedOption) => {\n if (!optionsExpanded) togglePanel('options')\n requestAnimationFrame(() => {\n const options = optionsRef.current\n const field =\n option === 'perspective'\n ? options?.querySelector<HTMLElement>('#vista-option-perspective')\n : (options?.querySelector<HTMLElement>(\n 'input[data-testid=\"vista-option-api-version-custom\"], [data-testid=\"vista-option-api-version-custom\"] input',\n ) ??\n options?.querySelector<HTMLElement>(\n '[data-testid=\"vista-option-api-version-wrap\"][tabindex]',\n ) ??\n options?.querySelector<HTMLElement>('#vista-option-api-version'))\n field?.focus()\n })\n },\n [optionsExpanded, togglePanel],\n )","isFetching ? t('vista.query.stop') : t('action.query-execute')","isFetching ? t('vista.query.stop.description') : runLabel","generatorOpen && (\n <GenerateQueryBar\n client={resolved.client}\n formatForEditor={formatForEditor}\n onClose={closeGenerator}\n tab={tab}\n />\n )","client","t('query.label')","<Label muted size={1}>\n {t('query.label')}\n </Label>","<Box flexBasis=\"0%\" flexGrow={1} />","!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )","<Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>","<Box className={styles.editorLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('query.label')}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>\n </Flex>\n </Box>","<VisionCodeMirror\n extensions={queryExtensions}\n initialValue={tab.query}\n onChange={onQueryChange}\n ref={queryEditorRef}\n />","query","<Box\n className={styles.editorContainer}\n data-testid=\"vista-query-editor\"\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n minWidth=\"0\"\n >\n <Box className={styles.editorLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('query.label')}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <VisionCodeMirror\n extensions={queryExtensions}\n initialValue={tab.query}\n onChange={onQueryChange}\n ref={queryEditorRef}\n />\n </Box>","<Flex className={styles.querySection}>\n {generatorOpen && (\n <GenerateQueryBar\n client={resolved.client}\n formatForEditor={formatForEditor}\n onClose={closeGenerator}\n tab={tab}\n />\n )}\n <Box\n className={styles.editorContainer}\n data-testid=\"vista-query-editor\"\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n minWidth=\"0\"\n >\n <Box className={styles.editorLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('query.label')}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <VisionCodeMirror\n extensions={queryExtensions}\n initialValue={tab.query}\n onChange={onQueryChange}\n ref={queryEditorRef}\n />\n </Box>\n </Flex>","cx(\n styles.paramsSection,\n paramsResize.height !== null && styles.paramsSectionResized,\n )","paramsResize.height !== null && styles.paramsSectionResized","paramsExpanded && (\n // The focusable separator widget: drag or arrow keys resize, Enter resets\n <div\n aria-label={t('vista.params.resize')}\n aria-orientation=\"horizontal\"\n aria-valuemax={paramsResize.measured?.max}\n aria-valuemin={SECTION_MIN_HEIGHT}\n aria-valuenow={paramsHeightNow}\n aria-valuetext={\n paramsResize.height === null && paramsHeightNow !== undefined\n ? t('vista.params.fit-height', {height: paramsHeightNow})\n : undefined\n }\n className={styles.sectionResizer}\n data-dragging={paramsResize.dragging}\n data-testid=\"vista-request-params-resizer\"\n onDoubleClick={paramsResize.reset}\n onFocus={paramsResize.onFocus}\n onKeyDown={paramsResize.onKeyDown}\n onPointerDown={paramsResize.onPointerDown}\n role=\"separator\"\n tabIndex={0}\n title={t('vista.params.resize')}\n />\n )","dragging","height","max","onFocus","onKeyDown","onPointerDown","reset","params.valid ? undefined : (\n <Text size={1}>\n <ErrorOutlineIcon />\n </Text>\n )","valid","t('vista.params.view.label')","t('vista.params.view.json')","() => setParamsView('json')","<Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-json\"\n label={t('vista.params.view.json')}\n onClick={() => setParamsView('json')}\n padding={2}\n selected={paramsView === 'json'}\n />","paramsView === 'json'","t('vista.params.view.form')","() => setParamsView('form')","<Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-form\"\n label={t('vista.params.view.form')}\n onClick={() => setParamsView('form')}\n padding={2}\n selected={paramsView === 'form'}\n />","paramsView === 'form'","<TabList aria-label={t('vista.params.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-json\"\n label={t('vista.params.view.json')}\n onClick={() => setParamsView('json')}\n padding={2}\n selected={paramsView === 'json'}\n />\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-form\"\n label={t('vista.params.view.form')}\n onClick={() => setParamsView('form')}\n padding={2}\n selected={paramsView === 'form'}\n />\n </TabList>","() => togglePanel('params')","paramsResize.height === null ? undefined : {height: paramsResize.height}","t('params.label')","paramsView === 'form' ? (\n <ParamsForm onChange={onParamsReplace} params={params} query={tab.query} />\n ) : (\n <ParamsPanel\n editorRef={paramsEditorRef}\n onChange={onParamsChange}\n params={params}\n value={tab.rawParams}\n />\n )","rawParams","<CollapsibleSection\n className={cx(\n styles.paramsSection,\n paramsResize.height !== null && styles.paramsSectionResized,\n )}\n expanded={paramsExpanded}\n handle={\n paramsExpanded && (\n // The focusable separator widget: drag or arrow keys resize, Enter resets\n <div\n aria-label={t('vista.params.resize')}\n aria-orientation=\"horizontal\"\n aria-valuemax={paramsResize.measured?.max}\n aria-valuemin={SECTION_MIN_HEIGHT}\n aria-valuenow={paramsHeightNow}\n aria-valuetext={\n paramsResize.height === null && paramsHeightNow !== undefined\n ? t('vista.params.fit-height', {height: paramsHeightNow})\n : undefined\n }\n className={styles.sectionResizer}\n data-dragging={paramsResize.dragging}\n data-testid=\"vista-request-params-resizer\"\n onDoubleClick={paramsResize.reset}\n onFocus={paramsResize.onFocus}\n onKeyDown={paramsResize.onKeyDown}\n onPointerDown={paramsResize.onPointerDown}\n role=\"separator\"\n tabIndex={0}\n title={t('vista.params.resize')}\n />\n )\n }\n icon={\n params.valid ? undefined : (\n <Text size={1}>\n <ErrorOutlineIcon />\n </Text>\n )\n }\n actions={\n <TabList aria-label={t('vista.params.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-json\"\n label={t('vista.params.view.json')}\n onClick={() => setParamsView('json')}\n padding={2}\n selected={paramsView === 'json'}\n />\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-form\"\n label={t('vista.params.view.form')}\n onClick={() => setParamsView('form')}\n padding={2}\n selected={paramsView === 'form'}\n />\n </TabList>\n }\n id=\"vista-request-params\"\n onToggle={() => togglePanel('params')}\n ref={paramsRef}\n style={paramsResize.height === null ? undefined : {height: paramsResize.height}}\n title={t('params.label')}\n >\n {paramsView === 'form' ? (\n <ParamsForm onChange={onParamsReplace} params={params} query={tab.query} />\n ) : (\n <ParamsPanel\n editorRef={paramsEditorRef}\n onChange={onParamsChange}\n params={params}\n value={tab.rawParams}\n />\n )}\n </CollapsibleSection>","() => togglePanel('options')","t('vista.panel.options')","<OptionsPanel onChange={onOptionsChange} options={tab.options} resolved={resolved} />","options","<CollapsibleSection\n className={styles.optionsSection}\n expanded={optionsExpanded}\n id=\"vista-request-options\"\n onToggle={() => togglePanel('options')}\n ref={optionsRef}\n title={t('vista.panel.options')}\n >\n <OptionsPanel onChange={onOptionsChange} options={tab.options} resolved={resolved} />\n </CollapsibleSection>","<Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\" ref={containerRef}>\n <Flex className={styles.querySection}>\n {generatorOpen && (\n <GenerateQueryBar\n client={resolved.client}\n formatForEditor={formatForEditor}\n onClose={closeGenerator}\n tab={tab}\n />\n )}\n <Box\n className={styles.editorContainer}\n data-testid=\"vista-query-editor\"\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n minWidth=\"0\"\n >\n <Box className={styles.editorLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('query.label')}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <VisionCodeMirror\n extensions={queryExtensions}\n initialValue={tab.query}\n onChange={onQueryChange}\n ref={queryEditorRef}\n />\n </Box>\n </Flex>\n <CollapsibleSection\n className={cx(\n styles.paramsSection,\n paramsResize.height !== null && styles.paramsSectionResized,\n )}\n expanded={paramsExpanded}\n handle={\n paramsExpanded && (\n // The focusable separator widget: drag or arrow keys resize, Enter resets\n <div\n aria-label={t('vista.params.resize')}\n aria-orientation=\"horizontal\"\n aria-valuemax={paramsResize.measured?.max}\n aria-valuemin={SECTION_MIN_HEIGHT}\n aria-valuenow={paramsHeightNow}\n aria-valuetext={\n paramsResize.height === null && paramsHeightNow !== undefined\n ? t('vista.params.fit-height', {height: paramsHeightNow})\n : undefined\n }\n className={styles.sectionResizer}\n data-dragging={paramsResize.dragging}\n data-testid=\"vista-request-params-resizer\"\n onDoubleClick={paramsResize.reset}\n onFocus={paramsResize.onFocus}\n onKeyDown={paramsResize.onKeyDown}\n onPointerDown={paramsResize.onPointerDown}\n role=\"separator\"\n tabIndex={0}\n title={t('vista.params.resize')}\n />\n )\n }\n icon={\n params.valid ? undefined : (\n <Text size={1}>\n <ErrorOutlineIcon />\n </Text>\n )\n }\n actions={\n <TabList aria-label={t('vista.params.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-json\"\n label={t('vista.params.view.json')}\n onClick={() => setParamsView('json')}\n padding={2}\n selected={paramsView === 'json'}\n />\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-form\"\n label={t('vista.params.view.form')}\n onClick={() => setParamsView('form')}\n padding={2}\n selected={paramsView === 'form'}\n />\n </TabList>\n }\n id=\"vista-request-params\"\n onToggle={() => togglePanel('params')}\n ref={paramsRef}\n style={paramsResize.height === null ? undefined : {height: paramsResize.height}}\n title={t('params.label')}\n >\n {paramsView === 'form' ? (\n <ParamsForm onChange={onParamsReplace} params={params} query={tab.query} />\n ) : (\n <ParamsPanel\n editorRef={paramsEditorRef}\n onChange={onParamsChange}\n params={params}\n value={tab.rawParams}\n />\n )}\n </CollapsibleSection>\n <CollapsibleSection\n className={styles.optionsSection}\n expanded={optionsExpanded}\n id=\"vista-request-options\"\n onToggle={() => togglePanel('options')}\n ref={optionsRef}\n title={t('vista.panel.options')}\n >\n <OptionsPanel onChange={onOptionsChange} options={tab.options} resolved={resolved} />\n </CollapsibleSection>\n </Flex>","<ApiVersionButton onReveal={revealOption} resolved={resolved} />","<LiveButton\n active={tab.autoRefetch}\n canFetch={request !== null}\n onToggle={onToggleAutoRefetch}\n supported={resolved.supportsSyncTags}\n />","supportsSyncTags","request !== null","autoRefetch","<Text size={1}>{runDescription}</Text>","!isFetching && <Hotkeys fontSize={0} keys={VISTA_SHORTCUTS.fetch.keys} />","<Flex alignItems=\"center\" gap={2} padding={1}>\n <Text size={1}>{runDescription}</Text>\n {!isFetching && <Hotkeys fontSize={0} keys={VISTA_SHORTCUTS.fetch.keys} />}\n </Flex>","<Button\n aria-label={runDescription}\n data-testid=\"vista-fetch-button\"\n disabled={!isFetching && !request}\n gap={2}\n icon={isFetching ? StopIcon : PlayIcon}\n mode=\"default\"\n onClick={isFetching ? onCancel : onRun}\n padding={2}\n text={runLabel}\n tone={isFetching ? 'critical' : 'primary'}\n />","!isFetching && !request","isFetching ? StopIcon : PlayIcon","isFetching ? onCancel : onRun","isFetching ? 'critical' : 'primary'","<Tooltip\n animate\n content={\n <Flex alignItems=\"center\" gap={2} padding={1}>\n <Text size={1}>{runDescription}</Text>\n {!isFetching && <Hotkeys fontSize={0} keys={VISTA_SHORTCUTS.fetch.keys} />}\n </Flex>\n }\n placement=\"top\"\n portal\n >\n <Button\n aria-label={runDescription}\n data-testid=\"vista-fetch-button\"\n disabled={!isFetching && !request}\n gap={2}\n icon={isFetching ? StopIcon : PlayIcon}\n mode=\"default\"\n onClick={isFetching ? onCancel : onRun}\n padding={2}\n text={runLabel}\n tone={isFetching ? 'critical' : 'primary'}\n />\n </Tooltip>","<QueryActionsMenu\n buildRequest={buildRequest}\n onCopyQuery={onCopyQuery}\n onPrettify={onPrettify}\n request={request}\n resolved={resolved}\n tab={tab}\n />","<ActionRail testId=\"vista-query-actions\">\n <ApiVersionButton onReveal={revealOption} resolved={resolved} />\n <Box flexBasis=\"0%\" flexGrow={1} />\n <LiveButton\n active={tab.autoRefetch}\n canFetch={request !== null}\n onToggle={onToggleAutoRefetch}\n supported={resolved.supportsSyncTags}\n />\n <Tooltip\n animate\n content={\n <Flex alignItems=\"center\" gap={2} padding={1}>\n <Text size={1}>{runDescription}</Text>\n {!isFetching && <Hotkeys fontSize={0} keys={VISTA_SHORTCUTS.fetch.keys} />}\n </Flex>\n }\n placement=\"top\"\n portal\n >\n <Button\n aria-label={runDescription}\n data-testid=\"vista-fetch-button\"\n disabled={!isFetching && !request}\n gap={2}\n icon={isFetching ? StopIcon : PlayIcon}\n mode=\"default\"\n onClick={isFetching ? onCancel : onRun}\n padding={2}\n text={runLabel}\n tone={isFetching ? 'critical' : 'primary'}\n />\n </Tooltip>\n <QueryActionsMenu\n buildRequest={buildRequest}\n onCopyQuery={onCopyQuery}\n onPrettify={onPrettify}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n </ActionRail>","<Flex data-testid=\"vista-request-panel\" flexDirection=\"column\" height=\"100%\">\n <Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\" ref={containerRef}>\n <Flex className={styles.querySection}>\n {generatorOpen && (\n <GenerateQueryBar\n client={resolved.client}\n formatForEditor={formatForEditor}\n onClose={closeGenerator}\n tab={tab}\n />\n )}\n <Box\n className={styles.editorContainer}\n data-testid=\"vista-query-editor\"\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n minWidth=\"0\"\n >\n <Box className={styles.editorLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('query.label')}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <VisionCodeMirror\n extensions={queryExtensions}\n initialValue={tab.query}\n onChange={onQueryChange}\n ref={queryEditorRef}\n />\n </Box>\n </Flex>\n <CollapsibleSection\n className={cx(\n styles.paramsSection,\n paramsResize.height !== null && styles.paramsSectionResized,\n )}\n expanded={paramsExpanded}\n handle={\n paramsExpanded && (\n // The focusable separator widget: drag or arrow keys resize, Enter resets\n <div\n aria-label={t('vista.params.resize')}\n aria-orientation=\"horizontal\"\n aria-valuemax={paramsResize.measured?.max}\n aria-valuemin={SECTION_MIN_HEIGHT}\n aria-valuenow={paramsHeightNow}\n aria-valuetext={\n paramsResize.height === null && paramsHeightNow !== undefined\n ? t('vista.params.fit-height', {height: paramsHeightNow})\n : undefined\n }\n className={styles.sectionResizer}\n data-dragging={paramsResize.dragging}\n data-testid=\"vista-request-params-resizer\"\n onDoubleClick={paramsResize.reset}\n onFocus={paramsResize.onFocus}\n onKeyDown={paramsResize.onKeyDown}\n onPointerDown={paramsResize.onPointerDown}\n role=\"separator\"\n tabIndex={0}\n title={t('vista.params.resize')}\n />\n )\n }\n icon={\n params.valid ? undefined : (\n <Text size={1}>\n <ErrorOutlineIcon />\n </Text>\n )\n }\n actions={\n <TabList aria-label={t('vista.params.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-json\"\n label={t('vista.params.view.json')}\n onClick={() => setParamsView('json')}\n padding={2}\n selected={paramsView === 'json'}\n />\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-form\"\n label={t('vista.params.view.form')}\n onClick={() => setParamsView('form')}\n padding={2}\n selected={paramsView === 'form'}\n />\n </TabList>\n }\n id=\"vista-request-params\"\n onToggle={() => togglePanel('params')}\n ref={paramsRef}\n style={paramsResize.height === null ? undefined : {height: paramsResize.height}}\n title={t('params.label')}\n >\n {paramsView === 'form' ? (\n <ParamsForm onChange={onParamsReplace} params={params} query={tab.query} />\n ) : (\n <ParamsPanel\n editorRef={paramsEditorRef}\n onChange={onParamsChange}\n params={params}\n value={tab.rawParams}\n />\n )}\n </CollapsibleSection>\n <CollapsibleSection\n className={styles.optionsSection}\n expanded={optionsExpanded}\n id=\"vista-request-options\"\n onToggle={() => togglePanel('options')}\n ref={optionsRef}\n title={t('vista.panel.options')}\n >\n <OptionsPanel onChange={onOptionsChange} options={tab.options} resolved={resolved} />\n </CollapsibleSection>\n </Flex>\n <ActionRail testId=\"vista-query-actions\">\n <ApiVersionButton onReveal={revealOption} resolved={resolved} />\n <Box flexBasis=\"0%\" flexGrow={1} />\n <LiveButton\n active={tab.autoRefetch}\n canFetch={request !== null}\n onToggle={onToggleAutoRefetch}\n supported={resolved.supportsSyncTags}\n />\n <Tooltip\n animate\n content={\n <Flex alignItems=\"center\" gap={2} padding={1}>\n <Text size={1}>{runDescription}</Text>\n {!isFetching && <Hotkeys fontSize={0} keys={VISTA_SHORTCUTS.fetch.keys} />}\n </Flex>\n }\n placement=\"top\"\n portal\n >\n <Button\n aria-label={runDescription}\n data-testid=\"vista-fetch-button\"\n disabled={!isFetching && !request}\n gap={2}\n icon={isFetching ? StopIcon : PlayIcon}\n mode=\"default\"\n onClick={isFetching ? onCancel : onRun}\n padding={2}\n text={runLabel}\n tone={isFetching ? 'critical' : 'primary'}\n />\n </Tooltip>\n <QueryActionsMenu\n buildRequest={buildRequest}\n onCopyQuery={onCopyQuery}\n onPrettify={onPrettify}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n </ActionRail>\n </Flex>","snapshot","_c","_temp","_temp2","styles.labelActions","styles.editorLabel","styles.editorContainer","styles.querySection","styles.paramsSection","styles.optionsSection","primary = 'first'","allowResize = true","extent === undefined || extent <= 0\n ? null\n : {\n min: minSize,\n max: Math.max(minSize, Math.floor(extent - minSecondarySize - SPLIT_HANDLE_SIZE)),\n }","useMemo(\n (): Bounds | null =>\n extent === undefined || extent <= 0\n ? null\n : {\n min: minSize,\n max: Math.max(minSize, Math.floor(extent - minSecondarySize - SPLIT_HANDLE_SIZE)),\n },\n [extent, minSecondarySize, minSize],\n )","bounds ? clamp(size, bounds) : size","(event: ReactPointerEvent<HTMLDivElement>) => {\n if (!allowResize || event.button !== 0 || !bounds) return\n event.preventDefault()\n\n const handle = event.currentTarget\n const start = split === 'vertical' ? event.clientX : event.clientY\n const onMove = (move: PointerEvent) => {\n const position = split === 'vertical' ? move.clientX : move.clientY\n const delta = position - start\n onChange(clamp(shownSize + (primary === 'first' ? delta : -delta), bounds))\n }\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onEnd)\n handle.removeEventListener('pointercancel', onEnd)\n setDragging(false)\n }\n handle.setPointerCapture?.(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onEnd)\n handle.addEventListener('pointercancel', onEnd)\n setDragging(true)\n }","useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!allowResize || event.button !== 0 || !bounds) return\n event.preventDefault()\n\n const handle = event.currentTarget\n const start = split === 'vertical' ? event.clientX : event.clientY\n const onMove = (move: PointerEvent) => {\n const position = split === 'vertical' ? move.clientX : move.clientY\n const delta = position - start\n onChange(clamp(shownSize + (primary === 'first' ? delta : -delta), bounds))\n }\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onEnd)\n handle.removeEventListener('pointercancel', onEnd)\n setDragging(false)\n }\n handle.setPointerCapture?.(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onEnd)\n handle.addEventListener('pointercancel', onEnd)\n setDragging(true)\n },\n [allowResize, bounds, onChange, primary, shownSize, split],\n )","(event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!allowResize || !bounds) return\n const step = event.shiftKey ? KEYBOARD_STEP * 5 : KEYBOARD_STEP\n // The arrows move the divider along the axis; what that does to the size depends on the\n // side the primary pane is on\n const towardsEnd = primary === 'first' ? step : -step\n const [forwardKey, backKey] =\n split === 'vertical' ? ['ArrowRight', 'ArrowLeft'] : ['ArrowDown', 'ArrowUp']\n let target: number\n if (event.key === forwardKey) {\n target = shownSize + towardsEnd\n } else if (event.key === backKey) {\n target = shownSize - towardsEnd\n } else if (event.key === 'Home') {\n target = bounds.min\n } else if (event.key === 'End') {\n target = bounds.max\n } else if (event.key === 'Enter') {\n event.preventDefault()\n onReset?.()\n return\n } else {\n return\n }\n event.preventDefault()\n const next = clamp(target, bounds)\n if (next !== shownSize) onChange(next)\n }","event","useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!allowResize || !bounds) return\n const step = event.shiftKey ? KEYBOARD_STEP * 5 : KEYBOARD_STEP\n // The arrows move the divider along the axis; what that does to the size depends on the\n // side the primary pane is on\n const towardsEnd = primary === 'first' ? step : -step\n const [forwardKey, backKey] =\n split === 'vertical' ? ['ArrowRight', 'ArrowLeft'] : ['ArrowDown', 'ArrowUp']\n let target: number\n if (event.key === forwardKey) {\n target = shownSize + towardsEnd\n } else if (event.key === backKey) {\n target = shownSize - towardsEnd\n } else if (event.key === 'Home') {\n target = bounds.min\n } else if (event.key === 'End') {\n target = bounds.max\n } else if (event.key === 'Enter') {\n event.preventDefault()\n onReset?.()\n return\n } else {\n return\n }\n event.preventDefault()\n const next = clamp(target, bounds)\n if (next !== shownSize) onChange(next)\n },\n [allowResize, bounds, onChange, onReset, primary, shownSize, split],\n )","{flex: `0 0 ${shownSize}px`}","`0 0 ${shownSize}px`","cx(\n styles.splitRoot,\n split === 'vertical' ? styles.splitRootRow : styles.splitRootColumn,\n )","split === 'vertical' ? styles.splitRootRow : styles.splitRootColumn","<div className={styles.splitPane} style={primary === 'first' ? primaryStyle : undefined}>\n {children[0]}\n </div>","0","primary === 'first' ? primaryStyle : undefined","cx(\n styles.splitHandle,\n split === 'vertical' ? styles.splitHandleVertical : styles.splitHandleHorizontal,\n !allowResize && styles.splitHandleDisabled,\n )","split === 'vertical' ? styles.splitHandleVertical : styles.splitHandleHorizontal","!allowResize && styles.splitHandleDisabled","<div\n aria-disabled={allowResize ? undefined : true}\n aria-label={label}\n aria-orientation={split}\n aria-valuemax={bounds?.max}\n aria-valuemin={minSize}\n aria-valuenow={shownSize}\n className={cx(\n styles.splitHandle,\n split === 'vertical' ? styles.splitHandleVertical : styles.splitHandleHorizontal,\n !allowResize && styles.splitHandleDisabled,\n )}\n data-dragging={dragging}\n data-testid={testId && `${testId}-handle`}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n role=\"separator\"\n tabIndex={allowResize ? 0 : -1}\n title={label}\n />","allowResize ? undefined : true","bounds?.max","testId && `${testId}-handle`","allowResize ? 0 : -1","<div className={styles.splitPane} style={primary === 'second' ? primaryStyle : undefined}>\n {children[1]}\n </div>","1","primary === 'second' ? primaryStyle : undefined","<div\n className={cx(\n styles.splitRoot,\n split === 'vertical' ? styles.splitRootRow : styles.splitRootColumn,\n )}\n data-testid={testId}\n ref={setRoot}\n >\n <div className={styles.splitPane} style={primary === 'first' ? primaryStyle : undefined}>\n {children[0]}\n </div>\n <div\n aria-disabled={allowResize ? undefined : true}\n aria-label={label}\n aria-orientation={split}\n aria-valuemax={bounds?.max}\n aria-valuemin={minSize}\n aria-valuenow={shownSize}\n className={cx(\n styles.splitHandle,\n split === 'vertical' ? styles.splitHandleVertical : styles.splitHandleHorizontal,\n !allowResize && styles.splitHandleDisabled,\n )}\n data-dragging={dragging}\n data-testid={testId && `${testId}-handle`}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n role=\"separator\"\n tabIndex={allowResize ? 0 : -1}\n title={label}\n />\n <div className={styles.splitPane} style={primary === 'second' ? primaryStyle : undefined}>\n {children[1]}\n </div>\n </div>","_c","styles.splitRootRow","styles.splitRootColumn","styles.splitRoot","styles.splitPane","styles.splitHandleVertical","styles.splitHandleHorizontal","styles.splitHandle","async (current: QueryRequest): Promise<string | undefined> => {\n setPlan({status: 'loading', url: current.url})\n try {\n const text = await fetchQueryPlan(current.client, current)\n setPlan({status: 'done', url: current.url, text})\n return text\n } catch (error) {\n setPlan({status: 'failed', url: current.url, message: toMessage(error), limit: undefined})\n return undefined\n }\n }","error","useCallback(async (current: QueryRequest): Promise<string | undefined> => {\n setPlan({status: 'loading', url: current.url})\n try {\n const text = await fetchQueryPlan(current.client, current)\n setPlan({status: 'done', url: current.url, text})\n return text\n } catch (error) {\n setPlan({status: 'failed', url: current.url, message: toMessage(error), limit: undefined})\n return undefined\n }\n }, [])","() => {\n if (request) void loadPlan(request)\n }","useCallback(() => {\n if (request) void loadPlan(request)\n }, [loadPlan, request])","async () => {\n if (!request) return\n setExplanation({status: 'loading', url: request.url})\n const planText = currentPlan.status === 'done' ? currentPlan.text : await loadPlan(request)\n if (planText === undefined) {\n setExplanation(IDLE)\n return\n }\n try {\n const text = await explainQuery(request.client, request, planText)\n reportAiCreditsGranted(request.client)\n setExplanation({status: 'done', url: request.url, text})\n } catch (error) {\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(request.client, limit)\n setExplanation({status: 'failed', url: request.url, message: toMessage(error), limit})\n }\n }","currentPlan.status","text","useCallback(async () => {\n if (!request) return\n setExplanation({status: 'loading', url: request.url})\n const planText = currentPlan.status === 'done' ? currentPlan.text : await loadPlan(request)\n if (planText === undefined) {\n setExplanation(IDLE)\n return\n }\n try {\n const text = await explainQuery(request.client, request, planText)\n reportAiCreditsGranted(request.client)\n setExplanation({status: 'done', url: request.url, text})\n } catch (error) {\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(request.client, limit)\n setExplanation({status: 'failed', url: request.url, message: toMessage(error), limit})\n }\n }, [currentPlan, loadPlan, request])","{plan: currentPlan, explanation: currentExplanation, showPlan, explain}","_c","() => tabs[0].id","id","{}","t('vista.split.bottom-panel')","(size) => setBottomSizes((sizes) => ({...sizes, [layout]: size}))","() => setBottomSizes((sizes) => ({...sizes, [layout]: undefined}))","sizes","<Flex className={styles.paneFill}>{children}</Flex>","() => setCollapsed((current) => !current)","(current) => !current","<Box className={styles.paneFill}>\n <CollapsiblePanel\n activeTabId={activeTabId}\n collapsed={collapsed}\n id={id}\n onTabChange={setActiveTabId}\n onToggle={() => setCollapsed((current) => !current)}\n tabs={tabs}\n />\n </Box>","<Box className={styles.splitPaneContainer}>\n <ResizableSplit\n allowResize={!collapsed}\n label={t('vista.split.bottom-panel')}\n minSecondarySize={MIN_MAIN_HEIGHT}\n minSize={PANEL_HEADER_HEIGHT}\n onChange={(size) => setBottomSizes((sizes) => ({...sizes, [layout]: size}))}\n onReset={() => setBottomSizes((sizes) => ({...sizes, [layout]: undefined}))}\n primary=\"second\"\n size={collapsed ? PANEL_HEADER_HEIGHT : bottomSize}\n split=\"horizontal\"\n testId={`${testId}-split`}\n >\n <Flex className={styles.paneFill}>{children}</Flex>\n <Box className={styles.paneFill}>\n <CollapsiblePanel\n activeTabId={activeTabId}\n collapsed={collapsed}\n id={id}\n onTabChange={setActiveTabId}\n onToggle={() => setCollapsed((current) => !current)}\n tabs={tabs}\n />\n </Box>\n </ResizableSplit>\n </Box>","!collapsed","collapsed ? PANEL_HEADER_HEIGHT : bottomSize","`${testId}-split`","<Flex data-testid={testId} flexDirection=\"column\" height=\"100%\">\n <Box className={styles.splitPaneContainer}>\n <ResizableSplit\n allowResize={!collapsed}\n label={t('vista.split.bottom-panel')}\n minSecondarySize={MIN_MAIN_HEIGHT}\n minSize={PANEL_HEADER_HEIGHT}\n onChange={(size) => setBottomSizes((sizes) => ({...sizes, [layout]: size}))}\n onReset={() => setBottomSizes((sizes) => ({...sizes, [layout]: undefined}))}\n primary=\"second\"\n size={collapsed ? PANEL_HEADER_HEIGHT : bottomSize}\n split=\"horizontal\"\n testId={`${testId}-split`}\n >\n <Flex className={styles.paneFill}>{children}</Flex>\n <Box className={styles.paneFill}>\n <CollapsiblePanel\n activeTabId={activeTabId}\n collapsed={collapsed}\n id={id}\n onTabChange={setActiveTabId}\n onToggle={() => setCollapsed((current) => !current)}\n tabs={tabs}\n />\n </Box>\n </ResizableSplit>\n </Box>\n {footer}\n </Flex>","_c","styles.paneFill","_temp","styles.splitPaneContainer","{children}: {children: ReactNode}","<Portal>\n <PortalProvider __unstable_elements={portal.elements} element={portal.element}>\n {children}\n </PortalProvider>\n </Portal>","element","elements","<PortalProvider element={element}>\n <Portal>\n <PortalProvider __unstable_elements={portal.elements} element={portal.element}>\n {children}\n </PortalProvider>\n </Portal>\n </PortalProvider>","_c","() => {\n if (value === shown.current) return\n shown.current = value\n editorRef.current?.resetEditorContent(value)\n }","[value]","<Label muted size={0}>\n {label}\n </Label>","<Box flexBasis=\"0%\" flexGrow={1} />","<Flex alignItems=\"center\" flexShrink={0} gap={2}>\n <Label muted size={0}>\n {label}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </Flex>","(text) => {\n shown.current = text\n onChange(text)\n }","<VisionCodeMirror\n extensions={paramsExtensions}\n initialValue={value}\n onChange={(text) => {\n shown.current = text\n onChange(text)\n }}\n ref={editorRef}\n underHeader\n />","<Card border className={styles.jsonEditorBox} data-testid={testId} radius={2}>\n <VisionCodeMirror\n extensions={paramsExtensions}\n initialValue={value}\n onChange={(text) => {\n shown.current = text\n onChange(text)\n }}\n ref={editorRef}\n underHeader\n />\n </Card>","<Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} gap={2} minHeight=\"0\">\n <Flex alignItems=\"center\" flexShrink={0} gap={2}>\n <Label muted size={0}>\n {label}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </Flex>\n <Card border className={styles.jsonEditorBox} data-testid={testId} radius={2}>\n <VisionCodeMirror\n extensions={paramsExtensions}\n initialValue={value}\n onChange={(text) => {\n shown.current = text\n onChange(text)\n }}\n ref={editorRef}\n underHeader\n />\n </Card>\n </Flex>","_c","styles.jsonEditorBox","(documentId: string) => {\n setState((current) => ({...current, documentId}))\n }","useCallback((documentId: string) => {\n setState((current) => ({...current, documentId}))\n }, [])","async (client: HistoryClient, id: string) => {\n const documentId = id.trim()\n if (!documentId) return\n setState((current) => ({...current, loading: true, loadError: undefined}))\n try {\n const revisions = await loadRevisions(client, documentId)\n const [latest, previous] = revisions\n const [after, before] = await Promise.all([\n latest ? loadRevision(client, documentId, latest.id) : null,\n previous ? loadRevision(client, documentId, previous.id) : null,\n ])\n setState((current) => ({\n ...current,\n loading: false,\n revisions,\n afterRevision: latest?.id ?? '',\n beforeRevision: previous?.id ?? '',\n afterText: toText(after),\n beforeText: toText(before),\n }))\n } catch (error) {\n setState((current) => ({\n ...current,\n loading: false,\n loadError: error instanceof Error ? error.message : String(error),\n }))\n }\n }","documentId","(current) => ({...current, loading: true, loadError: undefined})","current","error","useCallback(async (client: HistoryClient, id: string) => {\n const documentId = id.trim()\n if (!documentId) return\n setState((current) => ({...current, loading: true, loadError: undefined}))\n try {\n const revisions = await loadRevisions(client, documentId)\n const [latest, previous] = revisions\n const [after, before] = await Promise.all([\n latest ? loadRevision(client, documentId, latest.id) : null,\n previous ? loadRevision(client, documentId, previous.id) : null,\n ])\n setState((current) => ({\n ...current,\n loading: false,\n revisions,\n afterRevision: latest?.id ?? '',\n beforeRevision: previous?.id ?? '',\n afterText: toText(after),\n beforeText: toText(before),\n }))\n } catch (error) {\n setState((current) => ({\n ...current,\n loading: false,\n loadError: error instanceof Error ? error.message : String(error),\n }))\n }\n }, [])","async (client: HistoryClient, id: string, side: 'before' | 'after', revision: string) => {\n const documentId = id.trim()\n const key = side === 'before' ? 'beforeRevision' : 'afterRevision'\n const textKey = side === 'before' ? 'beforeText' : 'afterText'\n setState((current) => ({...current, [key]: revision}))\n if (!revision) {\n setState((current) => ({...current, [textKey]: ''}))\n return\n }\n try {\n const document = await loadRevision(client, documentId, revision)\n setState((current) =>\n current[key] === revision ? {...current, [textKey]: toText(document)} : current,\n )\n } catch (error) {\n setState((current) => ({\n ...current,\n loadError: error instanceof Error ? error.message : String(error),\n }))\n }\n }","id","client","useCallback(\n async (client: HistoryClient, id: string, side: 'before' | 'after', revision: string) => {\n const documentId = id.trim()\n const key = side === 'before' ? 'beforeRevision' : 'afterRevision'\n const textKey = side === 'before' ? 'beforeText' : 'afterText'\n setState((current) => ({...current, [key]: revision}))\n if (!revision) {\n setState((current) => ({...current, [textKey]: ''}))\n return\n }\n try {\n const document = await loadRevision(client, documentId, revision)\n setState((current) =>\n current[key] === revision ? {...current, [textKey]: toText(document)} : current,\n )\n } catch (error) {\n setState((current) => ({\n ...current,\n loadError: error instanceof Error ? error.message : String(error),\n }))\n }\n },\n [],\n )","(side: 'before' | 'after', text: string) => {\n setState((current) => ({...current, [side === 'before' ? 'beforeText' : 'afterText']: text}))\n }","side","useCallback((side: 'before' | 'after', text: string) => {\n setState((current) => ({...current, [side === 'before' ? 'beforeText' : 'afterText']: text}))\n }, [])","{state, setDocumentId, load, select, setText}","{delta, request}: DeltaTabProps","ready\n ? JSON.stringify([query, paramsKey, state.beforeText, state.afterText])\n : ''","params","afterText","beforeText","request?.params ?? {}","readDocument(state.beforeText)","readDocument(state.afterText)","() => {\n if (!evaluationKey) return undefined\n const beforeValue = readDocumentValue(state.beforeText)\n const afterValue = readDocumentValue(state.afterText)\n const parsedParams: unknown = JSON.parse(paramsKey)\n const params =\n typeof parsedParams === 'object' && parsedParams !== null\n ? Object.fromEntries(Object.entries(parsedParams))\n : {}\n let cancelled = false\n const timer = setTimeout(() => {\n evaluateDelta({query, params, before: beforeValue, after: afterValue}).then(\n (value) => {\n if (!cancelled) setEvaluated({key: evaluationKey, outcome: {status: 'done', value}})\n },\n (error: unknown) => {\n if (cancelled) return\n setEvaluated({\n key: evaluationKey,\n outcome: {\n status: 'failed',\n message: error instanceof Error ? error.message : String(error),\n },\n })\n },\n )\n }, EVALUATE_DELAY_MS)\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n }","[evaluationKey, paramsKey, query, state.afterText, state.beforeText]","{status: 'idle'}","{status: 'invalid', side: 'before', message: before.error}","{status: 'invalid', side: 'after', message: after.error}","deltaOperation(\n readDocumentValue(state.beforeText),\n readDocumentValue(state.afterText),\n )","(state.revisions ?? []).map((revision) => (\n <option key={revision.id} value={revision.id}>\n {t('vista.delta.revision.option', {\n time: revision.timestamp ? formatTime.format(new Date(revision.timestamp)) : '',\n revision: revision.id,\n })}\n </option>\n ))","revisions","state.revisions ?? []","t('vista.delta.description')","<Text muted size={1}>\n {t('vista.delta.description')}\n </Text>","t('vista.delta.document-id')","<Label muted size={0}>\n {t('vista.delta.document-id')}\n </Label>","(event) => delta.setDocumentId(event.currentTarget.value)","(event) => {\n if (event.key === 'Enter' && client) void delta.load(client, state.documentId)\n }","event","<TextInput\n data-testid=\"vista-delta-document-id\"\n fontSize={1}\n onChange={(event) => delta.setDocumentId(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && client) void delta.load(client, state.documentId)\n }}\n padding={2}\n value={state.documentId}\n />","<Box flexBasis=\"0%\" flexGrow={1}>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.delta.document-id')}\n </Label>\n <TextInput\n data-testid=\"vista-delta-document-id\"\n fontSize={1}\n onChange={(event) => delta.setDocumentId(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && client) void delta.load(client, state.documentId)\n }}\n padding={2}\n value={state.documentId}\n />\n </Stack>\n </Box>","!client || !state.documentId.trim() || state.loading","loading","() => client && void delta.load(client, state.documentId)","t('vista.delta.load')","<Button\n data-testid=\"vista-delta-load\"\n disabled={!client || !state.documentId.trim() || state.loading}\n fontSize={1}\n loading={state.loading}\n mode=\"ghost\"\n onClick={() => client && void delta.load(client, state.documentId)}\n padding={2}\n text={t('vista.delta.load')}\n />","state.loading","<Flex alignItems=\"flex-end\" flexShrink={0} gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.delta.document-id')}\n </Label>\n <TextInput\n data-testid=\"vista-delta-document-id\"\n fontSize={1}\n onChange={(event) => delta.setDocumentId(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && client) void delta.load(client, state.documentId)\n }}\n padding={2}\n value={state.documentId}\n />\n </Stack>\n </Box>\n <Button\n data-testid=\"vista-delta-load\"\n disabled={!client || !state.documentId.trim() || state.loading}\n fontSize={1}\n loading={state.loading}\n mode=\"ghost\"\n onClick={() => client && void delta.load(client, state.documentId)}\n padding={2}\n text={t('vista.delta.load')}\n />\n </Flex>","state.loadError && (\n <Text data-testid=\"vista-delta-load-error\" size={1}>\n {t('vista.delta.load-failed', {message: state.loadError})}\n </Text>\n )","loadError","<DeltaResult evaluation={evaluation} operation={operation} request={request} />","state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.before')}\n data-testid=\"vista-delta-before-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'before',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.beforeRevision}\n >\n <option value=\"\">{t('vista.delta.revision.none-before')}</option>\n {revisionOptions}\n </Select>\n </Box>\n )","beforeRevision","t('vista.delta.before')","(text) => delta.setText('before', text)","<JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.before')}\n data-testid=\"vista-delta-before-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'before',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.beforeRevision}\n >\n <option value=\"\">{t('vista.delta.revision.none-before')}</option>\n {revisionOptions}\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.before')}\n onChange={(text) => delta.setText('before', text)}\n testId=\"vista-delta-before\"\n value={state.beforeText}\n />","state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.after')}\n data-testid=\"vista-delta-after-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'after',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.afterRevision}\n >\n {revisionOptions}\n <option value=\"\">{t('vista.delta.revision.none-after')}</option>\n </Select>\n </Box>\n )","afterRevision","t('vista.delta.after')","(text) => delta.setText('after', text)","text","<JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.after')}\n data-testid=\"vista-delta-after-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'after',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.afterRevision}\n >\n {revisionOptions}\n <option value=\"\">{t('vista.delta.revision.none-after')}</option>\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.after')}\n onChange={(text) => delta.setText('after', text)}\n testId=\"vista-delta-after\"\n value={state.afterText}\n />","<Flex flexDirection=\"column\" gap={3} minHeight=\"0\">\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.before')}\n data-testid=\"vista-delta-before-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'before',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.beforeRevision}\n >\n <option value=\"\">{t('vista.delta.revision.none-before')}</option>\n {revisionOptions}\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.before')}\n onChange={(text) => delta.setText('before', text)}\n testId=\"vista-delta-before\"\n value={state.beforeText}\n />\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.after')}\n data-testid=\"vista-delta-after-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'after',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.afterRevision}\n >\n {revisionOptions}\n <option value=\"\">{t('vista.delta.revision.none-after')}</option>\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.after')}\n onChange={(text) => delta.setText('after', text)}\n testId=\"vista-delta-after\"\n value={state.afterText}\n />\n </Flex>","<Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows=\"fit-content(40%) minmax(0, 1fr)\"\n minHeight=\"320px\"\n >\n <DeltaResult evaluation={evaluation} operation={operation} request={request} />\n <Flex flexDirection=\"column\" gap={3} minHeight=\"0\">\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.before')}\n data-testid=\"vista-delta-before-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'before',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.beforeRevision}\n >\n <option value=\"\">{t('vista.delta.revision.none-before')}</option>\n {revisionOptions}\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.before')}\n onChange={(text) => delta.setText('before', text)}\n testId=\"vista-delta-before\"\n value={state.beforeText}\n />\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.after')}\n data-testid=\"vista-delta-after-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'after',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.afterRevision}\n >\n {revisionOptions}\n <option value=\"\">{t('vista.delta.revision.none-after')}</option>\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.after')}\n onChange={(text) => delta.setText('after', text)}\n testId=\"vista-delta-after\"\n value={state.afterText}\n />\n </Flex>\n </Grid>","<Flex\n data-testid=\"vista-delta\"\n flexDirection=\"column\"\n gap={4}\n height=\"100%\"\n overflow=\"auto\"\n padding={3}\n >\n <Text muted size={1}>\n {t('vista.delta.description')}\n </Text>\n <Flex alignItems=\"flex-end\" flexShrink={0} gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.delta.document-id')}\n </Label>\n <TextInput\n data-testid=\"vista-delta-document-id\"\n fontSize={1}\n onChange={(event) => delta.setDocumentId(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && client) void delta.load(client, state.documentId)\n }}\n padding={2}\n value={state.documentId}\n />\n </Stack>\n </Box>\n <Button\n data-testid=\"vista-delta-load\"\n disabled={!client || !state.documentId.trim() || state.loading}\n fontSize={1}\n loading={state.loading}\n mode=\"ghost\"\n onClick={() => client && void delta.load(client, state.documentId)}\n padding={2}\n text={t('vista.delta.load')}\n />\n </Flex>\n {state.loadError && (\n <Text data-testid=\"vista-delta-load-error\" size={1}>\n {t('vista.delta.load-failed', {message: state.loadError})}\n </Text>\n )}\n {/* The result is as tall as it needs up to two fifths of the room, its value scrolling past\n that; the two documents share the rest */}\n <Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows=\"fit-content(40%) minmax(0, 1fr)\"\n minHeight=\"320px\"\n >\n <DeltaResult evaluation={evaluation} operation={operation} request={request} />\n <Flex flexDirection=\"column\" gap={3} minHeight=\"0\">\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.before')}\n data-testid=\"vista-delta-before-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'before',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.beforeRevision}\n >\n <option value=\"\">{t('vista.delta.revision.none-before')}</option>\n {revisionOptions}\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.before')}\n onChange={(text) => delta.setText('before', text)}\n testId=\"vista-delta-before\"\n value={state.beforeText}\n />\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.after')}\n data-testid=\"vista-delta-after-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'after',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.afterRevision}\n >\n {revisionOptions}\n <option value=\"\">{t('vista.delta.revision.none-after')}</option>\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.after')}\n onChange={(text) => delta.setText('after', text)}\n testId=\"vista-delta-after\"\n value={state.afterText}\n />\n </Flex>\n </Grid>\n </Flex>","t('vista.delta.result')","<Label muted size={0}>\n {t('vista.delta.result')}\n </Label>","operation && (\n <Badge data-testid=\"vista-delta-operation\" fontSize={0}>\n {operation}\n </Badge>\n )","<Flex alignItems=\"center\" flexShrink={0} gap={2}>\n <Label muted size={0}>\n {t('vista.delta.result')}\n </Label>\n {operation && (\n <Badge data-testid=\"vista-delta-operation\" fontSize={0}>\n {operation}\n </Badge>\n )}\n </Flex>","!request && (\n <Text muted size={1}>\n {t('vista.delta.no-request')}\n </Text>\n )","request && evaluation.status === 'idle' && (\n <Text muted size={1}>\n {t('vista.delta.empty')}\n </Text>\n )","status","evaluation.status === 'invalid' && (\n <Text size={1}>\n {evaluation.side === 'before'\n ? t('vista.delta.invalid-before', {message: evaluation.message})\n : t('vista.delta.invalid-after', {message: evaluation.message})}\n </Text>\n )","message","evaluation.status === 'failed' && (\n <Text size={1}>{t('vista.delta.failed', {message: evaluation.message})}</Text>\n )","evaluation.status === 'done' && typeof evaluation.value === 'boolean' && (\n <Card\n border\n data-testid=\"vista-delta-match\"\n padding={3}\n radius={2}\n tone={evaluation.value ? 'positive' : 'caution'}\n >\n <Text size={1}>\n {evaluation.value ? t('vista.delta.matches') : t('vista.delta.no-match')}\n </Text>\n </Card>\n )","value","evaluation.status === 'done' && typeof evaluation.value !== 'boolean' && (\n <Card border className={styles.drawerScroller} padding={3} radius={2}>\n <Code data-testid=\"vista-delta-value\" size={1}>\n {JSON.stringify(evaluation.value, null, 2) ?? 'null'}\n </Code>\n </Card>\n )","<Flex\n data-testid=\"vista-delta-result\"\n flexDirection=\"column\"\n gap={3}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n <Flex alignItems=\"center\" flexShrink={0} gap={2}>\n <Label muted size={0}>\n {t('vista.delta.result')}\n </Label>\n {operation && (\n <Badge data-testid=\"vista-delta-operation\" fontSize={0}>\n {operation}\n </Badge>\n )}\n </Flex>\n {!request && (\n <Text muted size={1}>\n {t('vista.delta.no-request')}\n </Text>\n )}\n {request && evaluation.status === 'idle' && (\n <Text muted size={1}>\n {t('vista.delta.empty')}\n </Text>\n )}\n {evaluation.status === 'invalid' && (\n <Text size={1}>\n {evaluation.side === 'before'\n ? t('vista.delta.invalid-before', {message: evaluation.message})\n : t('vista.delta.invalid-after', {message: evaluation.message})}\n </Text>\n )}\n {evaluation.status === 'failed' && (\n <Text size={1}>{t('vista.delta.failed', {message: evaluation.message})}</Text>\n )}\n {evaluation.status === 'done' && typeof evaluation.value === 'boolean' && (\n <Card\n border\n data-testid=\"vista-delta-match\"\n padding={3}\n radius={2}\n tone={evaluation.value ? 'positive' : 'caution'}\n >\n <Text size={1}>\n {evaluation.value ? t('vista.delta.matches') : t('vista.delta.no-match')}\n </Text>\n </Card>\n )}\n {evaluation.status === 'done' && typeof evaluation.value !== 'boolean' && (\n <Card border className={styles.drawerScroller} padding={3} radius={2}>\n <Code data-testid=\"vista-delta-value\" size={1}>\n {JSON.stringify(evaluation.value, null, 2) ?? 'null'}\n </Code>\n </Card>\n )}\n </Flex>","INITIAL_STATE","toText","_c","_temp","{\n getBlobUrl,\n onUnavailable,\n download,\n icon,\n label,\n tooltip,\n testId,\n}: DownloadButtonProps","() => {\n const url = getBlobUrl?.()\n if (!url) {\n onUnavailable?.()\n return\n }\n // A link created for the click, so the result is not serialized for a link nobody follows\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = download\n anchor.rel = 'noopener'\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n }","useCallback(() => {\n const url = getBlobUrl?.()\n if (!url) {\n onUnavailable?.()\n return\n }\n // A link created for the click, so the result is not serialized for a link nobody follows\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = download\n anchor.rel = 'noopener'\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n }, [download, getBlobUrl, onUnavailable])","<Text size={1}>{tooltip || label}</Text>","tooltip || label","<Button\n aria-hidden={unavailable || undefined}\n aria-label={label}\n data-testid={testId}\n disabled={unavailable}\n gap={2}\n icon={icon}\n mode=\"ghost\"\n onClick={handleClick}\n padding={2}\n text={label}\n />","unavailable || undefined","unavailable && tooltip && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>","<span\n aria-describedby={unavailable && tooltip ? hintId : undefined}\n aria-disabled={unavailable || undefined}\n aria-label={unavailable ? label : undefined}\n role={unavailable ? 'button' : undefined}\n tabIndex={unavailable ? 0 : undefined}\n >\n <Button\n aria-hidden={unavailable || undefined}\n aria-label={label}\n data-testid={testId}\n disabled={unavailable}\n gap={2}\n icon={icon}\n mode=\"ghost\"\n onClick={handleClick}\n padding={2}\n text={label}\n />\n {unavailable && tooltip && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>}\n </span>","unavailable && tooltip ? hintId : undefined","unavailable ? label : undefined","unavailable ? 'button' : undefined","unavailable ? 0 : undefined","<Tooltip animate content={<Text size={1}>{tooltip || label}</Text>} placement=\"top\" portal>\n {/*\n A disabled button gets neither pointer events nor focus, so while the download is\n unavailable the wrapper stands in for it: the tooltip listens to the wrapper, and the\n wrapper takes the button's place in the tab order as a disabled button described by the\n tooltip's explanation, so a keyboard user can reach it too\n */}\n <span\n aria-describedby={unavailable && tooltip ? hintId : undefined}\n aria-disabled={unavailable || undefined}\n aria-label={unavailable ? label : undefined}\n role={unavailable ? 'button' : undefined}\n tabIndex={unavailable ? 0 : undefined}\n >\n <Button\n aria-hidden={unavailable || undefined}\n aria-label={label}\n data-testid={testId}\n disabled={unavailable}\n gap={2}\n icon={icon}\n mode=\"ghost\"\n onClick={handleClick}\n padding={2}\n text={label}\n />\n {unavailable && tooltip && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>}\n </span>\n </Tooltip>","_c","planText ? readPlanInsights(planText) : []","useMemo(() => (planText ? readPlanInsights(planText) : []), [planText])","t('vista.explain.description')","<Text muted size={1}>\n {t('vista.explain.description')}\n </Text>","t('vista.explain.explain')","<AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-button\"\n disabled={!canExplain || explaining}\n fontSize={1}\n icon={SparklesIcon}\n loading={explaining}\n onClick={onExplain}\n padding={2}\n text={t('vista.explain.explain')}\n tone=\"primary\"\n />\n </AgentActionsTooltip>","!canExplain || explaining","t('vista.explain.plan')","<Button\n data-testid=\"vista-explain-plan-button\"\n disabled={!canExplain || plan.status === 'loading'}\n fontSize={1}\n loading={plan.status === 'loading' && !explaining}\n mode=\"ghost\"\n onClick={onShowPlan}\n padding={2}\n text={t('vista.explain.plan')}\n />","!canExplain || plan.status === 'loading'","plan.status === 'loading' && !explaining","<Flex flexWrap=\"wrap\" gap={2}>\n <AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-button\"\n disabled={!canExplain || explaining}\n fontSize={1}\n icon={SparklesIcon}\n loading={explaining}\n onClick={onExplain}\n padding={2}\n text={t('vista.explain.explain')}\n tone=\"primary\"\n />\n </AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-plan-button\"\n disabled={!canExplain || plan.status === 'loading'}\n fontSize={1}\n loading={plan.status === 'loading' && !explaining}\n mode=\"ghost\"\n onClick={onShowPlan}\n padding={2}\n text={t('vista.explain.plan')}\n />\n </Flex>","client.config()","<AiCreditsStatus apiHost={client.config().apiHost} credits={limit ?? credits} />","apiHost","limit ?? credits","!canExplain && (\n <Text muted size={1}>\n {t('vista.explain.empty')}\n </Text>\n )","explanation.status === 'done' && (\n <Card data-testid=\"vista-explanation\" padding={3} radius={2} tone=\"transparent\" border>\n <Stack gap={4}>\n {explanation.text\n .split(/\\n+/)\n .filter((paragraph) => paragraph.trim())\n .map((paragraph, index) => (\n <Text key={index} size={1}>\n {splitMessage(paragraph.trim()).map((segment, segmentIndex) =>\n segment.code ? <code key={segmentIndex}>{segment.text}</code> : segment.text,\n )}\n </Text>\n ))}\n </Stack>\n </Card>\n )","status","text","(paragraph) => paragraph.trim()","(paragraph, index) => (\n <Text key={index} size={1}>\n {splitMessage(paragraph.trim()).map((segment, segmentIndex) =>\n segment.code ? <code key={segmentIndex}>{segment.text}</code> : segment.text,\n )}\n </Text>\n )","explanation.status === 'failed' && !limit && (\n <Text data-testid=\"vista-explain-error\" size={1}>\n {t('vista.explain.failed', {message: explanation.message})}\n </Text>\n )","message","plan.status === 'failed' && (\n <Text data-testid=\"vista-explain-error\" size={1}>\n {t('vista.explain.plan-failed', {message: plan.message})}\n </Text>\n )","plan.status === 'done' && insights.length > 0 && (\n <Stack data-testid=\"vista-plan-insights\" gap={2}>\n <Label muted size={0}>\n {t('vista.explain.insights.title')}\n </Label>\n {insights.map((insight, index) => (\n <Card\n border\n data-testid=\"vista-plan-insight\"\n key={`${insight.kind}:${index}`}\n padding={3}\n radius={2}\n tone={insight.tone}\n >\n <Stack gap={3}>\n <Text size={1}>{describeInsight(insight, t)}</Text>\n {insight.kind === 'filter-in-memory' && (\n <Code size={1}>{insight.expression}</Code>\n )}\n </Stack>\n </Card>\n ))}\n {insights.some((insight) => insight.tone === 'caution') && (\n <Text muted size={1}>\n <a href={HIGH_PERFORMANCE_GROQ_URL} rel=\"noreferrer\" target=\"_blank\">\n {t('vista.explain.insights.guide')}\n </a>\n </Text>\n )}\n </Stack>\n )","insights.length","index","(insight) => insight.tone === 'caution'","plan.status === 'done' && (\n <Stack data-testid=\"vista-query-plan\" gap={2}>\n <Label muted size={0}>\n {t('vista.explain.plan-title')}\n </Label>\n <Code size={1}>{plan.text}</Code>\n </Stack>\n )","<Box data-testid=\"vista-explain\" padding={3}>\n <Stack gap={4}>\n <Text muted size={1}>\n {t('vista.explain.description')}\n </Text>\n <Flex flexWrap=\"wrap\" gap={2}>\n <AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-button\"\n disabled={!canExplain || explaining}\n fontSize={1}\n icon={SparklesIcon}\n loading={explaining}\n onClick={onExplain}\n padding={2}\n text={t('vista.explain.explain')}\n tone=\"primary\"\n />\n </AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-plan-button\"\n disabled={!canExplain || plan.status === 'loading'}\n fontSize={1}\n loading={plan.status === 'loading' && !explaining}\n mode=\"ghost\"\n onClick={onShowPlan}\n padding={2}\n text={t('vista.explain.plan')}\n />\n </Flex>\n <AiCreditsStatus apiHost={client.config().apiHost} credits={limit ?? credits} />\n {!canExplain && (\n <Text muted size={1}>\n {t('vista.explain.empty')}\n </Text>\n )}\n {explanation.status === 'done' && (\n <Card data-testid=\"vista-explanation\" padding={3} radius={2} tone=\"transparent\" border>\n <Stack gap={4}>\n {explanation.text\n .split(/\\n+/)\n .filter((paragraph) => paragraph.trim())\n .map((paragraph, index) => (\n <Text key={index} size={1}>\n {splitMessage(paragraph.trim()).map((segment, segmentIndex) =>\n segment.code ? <code key={segmentIndex}>{segment.text}</code> : segment.text,\n )}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {explanation.status === 'failed' && !limit && (\n <Text data-testid=\"vista-explain-error\" size={1}>\n {t('vista.explain.failed', {message: explanation.message})}\n </Text>\n )}\n {plan.status === 'failed' && (\n <Text data-testid=\"vista-explain-error\" size={1}>\n {t('vista.explain.plan-failed', {message: plan.message})}\n </Text>\n )}\n {plan.status === 'done' && insights.length > 0 && (\n <Stack data-testid=\"vista-plan-insights\" gap={2}>\n <Label muted size={0}>\n {t('vista.explain.insights.title')}\n </Label>\n {insights.map((insight, index) => (\n <Card\n border\n data-testid=\"vista-plan-insight\"\n key={`${insight.kind}:${index}`}\n padding={3}\n radius={2}\n tone={insight.tone}\n >\n <Stack gap={3}>\n <Text size={1}>{describeInsight(insight, t)}</Text>\n {insight.kind === 'filter-in-memory' && (\n <Code size={1}>{insight.expression}</Code>\n )}\n </Stack>\n </Card>\n ))}\n {insights.some((insight) => insight.tone === 'caution') && (\n <Text muted size={1}>\n <a href={HIGH_PERFORMANCE_GROQ_URL} rel=\"noreferrer\" target=\"_blank\">\n {t('vista.explain.insights.guide')}\n </a>\n </Text>\n )}\n </Stack>\n )}\n {plan.status === 'done' && (\n <Stack data-testid=\"vista-query-plan\" gap={2}>\n <Label muted size={0}>\n {t('vista.explain.plan-title')}\n </Label>\n <Code size={1}>{plan.text}</Code>\n </Stack>\n )}\n </Stack>\n </Box>","insight","paragraph","(segment, segmentIndex) =>\n segment.code ? <code key={segmentIndex}>{segment.text}</code> : segment.text","unhandled","_c","_temp","_temp3","_temp4","_temp2","{signature, body}: {signature: string; body: string}","<Box className={styles.previewCode}>\n <Code size={1}>{signature}</Code>\n </Box>","<Box className={styles.previewCode}>\n <Code size={0}>{body}</Code>\n </Box>","<Stack gap={2}>\n <Box className={styles.previewCode}>\n <Code size={1}>{signature}</Code>\n </Box>\n <Box className={styles.previewCode}>\n <Code size={0}>{body}</Code>\n </Box>\n </Stack>","saved !== undefined && isSameDeclaration(saved.declaration, declaration.text)","text","t('vista.functions.reveal', {name: declaration.id})","id","cx(styles.lintFindingButton, styles.shrinkable)","() => onReveal(declaration.range)","range","describeBody(declaration)","describeSignature(declaration)","<FunctionPreview\n body={describeBody(declaration)}\n signature={describeSignature(declaration)}\n />","<Card\n aria-label={t('vista.functions.reveal', {name: declaration.id})}\n as=\"button\"\n className={cx(styles.lintFindingButton, styles.shrinkable)}\n flex={1}\n onClick={() => onReveal(declaration.range)}\n paddingX={3}\n paddingY={2}\n radius={2}\n type=\"button\"\n >\n <FunctionPreview\n body={describeBody(declaration)}\n signature={describeSignature(declaration)}\n />\n </Card>","<Box flexShrink={0} paddingRight={2}>\n {upToDate ? (\n <Badge data-testid=\"vista-function-saved\" fontSize={0} tone=\"positive\">\n {t('vista.functions.saved')}\n </Badge>\n ) : (\n <Button\n data-testid=\"vista-function-save\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onSave({id: declaration.id, declaration: declaration.text})}\n padding={2}\n text={saved ? t('vista.functions.update') : t('vista.functions.save')}\n />\n )}\n </Box>","<Flex alignItems=\"center\" data-testid=\"vista-declared-function\" gap={2}>\n <Card\n aria-label={t('vista.functions.reveal', {name: declaration.id})}\n as=\"button\"\n className={cx(styles.lintFindingButton, styles.shrinkable)}\n flex={1}\n onClick={() => onReveal(declaration.range)}\n paddingX={3}\n paddingY={2}\n radius={2}\n type=\"button\"\n >\n <FunctionPreview\n body={describeBody(declaration)}\n signature={describeSignature(declaration)}\n />\n </Card>\n <Box flexShrink={0} paddingRight={2}>\n {upToDate ? (\n <Badge data-testid=\"vista-function-saved\" fontSize={0} tone=\"positive\">\n {t('vista.functions.saved')}\n </Badge>\n ) : (\n <Button\n data-testid=\"vista-function-save\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onSave({id: declaration.id, declaration: declaration.text})}\n padding={2}\n text={saved ? t('vista.functions.update') : t('vista.functions.save')}\n />\n )}\n </Box>\n </Flex>","parseDeclaration(saved.declaration)","declaration","useMemo(() => parseDeclaration(saved.declaration), [saved.declaration])","() => onEdit(declarationInsertion(query, saved.declaration))","t('vista.functions.add')","<Button\n data-testid=\"vista-function-add\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onEdit(declarationInsertion(query, saved.declaration))}\n padding={2}\n text={t('vista.functions.add')}\n />","() => onEdit({...declared.range, insert: saved.declaration})","t('vista.functions.replace')","<Button\n data-testid=\"vista-function-replace\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onEdit({...declared.range, insert: saved.declaration})}\n padding={2}\n text={t('vista.functions.replace')}\n />","t('vista.functions.declared')","<Badge data-testid=\"vista-function-declared\" fontSize={0}>\n {t('vista.functions.declared')}\n </Badge>","parsed ? describeBody(parsed) : saved.declaration","parsed ? describeSignature(parsed) : saved.id","<Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\" paddingX={3} paddingY={2}>\n <FunctionPreview\n body={parsed ? describeBody(parsed) : saved.declaration}\n signature={parsed ? describeSignature(parsed) : saved.id}\n />\n </Box>","t('vista.functions.remove')","<Text size={1}>{t('vista.functions.remove')}</Text>","() => onRemove(saved.id)","<Button\n aria-label={t('vista.functions.remove')}\n data-testid=\"vista-function-remove\"\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onRemove(saved.id)}\n padding={2}\n tone=\"critical\"\n />","<Tooltip\n animate\n content={<Text size={1}>{t('vista.functions.remove')}</Text>}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={t('vista.functions.remove')}\n data-testid=\"vista-function-remove\"\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onRemove(saved.id)}\n padding={2}\n tone=\"critical\"\n />\n </Tooltip>","<Flex alignItems=\"center\" flexShrink={0} gap={1} paddingRight={1}>\n {action}\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.functions.remove')}</Text>}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={t('vista.functions.remove')}\n data-testid=\"vista-function-remove\"\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onRemove(saved.id)}\n padding={2}\n tone=\"critical\"\n />\n </Tooltip>\n </Flex>","action","<Flex alignItems=\"center\" data-testid=\"vista-library-function\" gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\" paddingX={3} paddingY={2}>\n <FunctionPreview\n body={parsed ? describeBody(parsed) : saved.declaration}\n signature={parsed ? describeSignature(parsed) : saved.id}\n />\n </Box>\n <Flex alignItems=\"center\" flexShrink={0} gap={1} paddingRight={1}>\n {action}\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.functions.remove')}</Text>}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={t('vista.functions.remove')}\n data-testid=\"vista-function-remove\"\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onRemove(saved.id)}\n padding={2}\n tone=\"critical\"\n />\n </Tooltip>\n </Flex>\n </Flex>","new Map(library.map((saved) => [saved.id, saved]))","(saved) => [saved.id, saved]","useMemo(() => new Map(library.map((saved) => [saved.id, saved])), [library])","useMemo(() => {\n const byId = new Map<string, FunctionDeclaration>()\n for (const declaration of declarations) {\n if (!byId.has(declaration.id)) byId.set(declaration.id, declaration)\n }\n return byId\n }, [declarations])","t('vista.functions.query.title')","<Label muted size={0}>\n {t('vista.functions.query.title')}\n </Label>","declarations.length === 0 ? (\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.functions.query.empty', {\n shortcut: EXTRACT_FUNCTION_SHORTCUT.keys.join('+'),\n })}\n </Text>\n <Code size={1}>{DECLARATION_EXAMPLE}</Code>\n </Stack>\n ) : (\n declarations.map((declaration) => (\n <DeclaredFunction\n declaration={declaration}\n key={`${declaration.id}:${declaration.range.from}`}\n onReveal={onReveal}\n onSave={onSave}\n saved={savedById.get(declaration.id)}\n />\n ))\n )","declarations.length","<Stack gap={2}>\n <Label muted size={0}>\n {t('vista.functions.query.title')}\n </Label>\n {declarations.length === 0 ? (\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.functions.query.empty', {\n shortcut: EXTRACT_FUNCTION_SHORTCUT.keys.join('+'),\n })}\n </Text>\n <Code size={1}>{DECLARATION_EXAMPLE}</Code>\n </Stack>\n ) : (\n declarations.map((declaration) => (\n <DeclaredFunction\n declaration={declaration}\n key={`${declaration.id}:${declaration.range.from}`}\n onReveal={onReveal}\n onSave={onSave}\n saved={savedById.get(declaration.id)}\n />\n ))\n )}\n </Stack>","t('vista.functions.library.title')","<Label muted size={0}>\n {t('vista.functions.library.title')}\n </Label>","library.length === 0\n ? t('vista.functions.library.empty')\n : t('vista.functions.library.description')","length","<Text muted size={1}>\n {library.length === 0\n ? t('vista.functions.library.empty')\n : t('vista.functions.library.description')}\n </Text>","library.map((saved) => (\n <LibraryFunction\n declared={declaredById.get(saved.id)}\n key={saved.id}\n onEdit={onEdit}\n onRemove={onRemove}\n query={query}\n saved={saved}\n />\n ))","(saved) => (\n <LibraryFunction\n declared={declaredById.get(saved.id)}\n key={saved.id}\n onEdit={onEdit}\n onRemove={onRemove}\n query={query}\n saved={saved}\n />\n )","saved","<Stack gap={2}>\n <Label muted size={0}>\n {t('vista.functions.library.title')}\n </Label>\n <Text muted size={1}>\n {library.length === 0\n ? t('vista.functions.library.empty')\n : t('vista.functions.library.description')}\n </Text>\n {library.map((saved) => (\n <LibraryFunction\n declared={declaredById.get(saved.id)}\n key={saved.id}\n onEdit={onEdit}\n onRemove={onRemove}\n query={query}\n saved={saved}\n />\n ))}\n </Stack>","<Box data-testid=\"vista-functions\" padding={3}>\n <Stack gap={4}>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.functions.query.title')}\n </Label>\n {declarations.length === 0 ? (\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.functions.query.empty', {\n shortcut: EXTRACT_FUNCTION_SHORTCUT.keys.join('+'),\n })}\n </Text>\n <Code size={1}>{DECLARATION_EXAMPLE}</Code>\n </Stack>\n ) : (\n declarations.map((declaration) => (\n <DeclaredFunction\n declaration={declaration}\n key={`${declaration.id}:${declaration.range.from}`}\n onReveal={onReveal}\n onSave={onSave}\n saved={savedById.get(declaration.id)}\n />\n ))\n )}\n </Stack>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.functions.library.title')}\n </Label>\n <Text muted size={1}>\n {library.length === 0\n ? t('vista.functions.library.empty')\n : t('vista.functions.library.description')}\n </Text>\n {library.map((saved) => (\n <LibraryFunction\n declared={declaredById.get(saved.id)}\n key={saved.id}\n onEdit={onEdit}\n onRemove={onRemove}\n query={query}\n saved={saved}\n />\n ))}\n </Stack>\n </Stack>\n </Box>","_c","styles.previewCode","styles.lintFindingButton","styles.shrinkable","_temp","toJson","<Text size={1} weight=\"medium\">\n {label}\n </Text>","<Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text size={1} weight=\"medium\">\n {label}\n </Text>\n {actions}\n </Flex>","<Stack data-testid={testId} gap={2}>\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text size={1} weight=\"medium\">\n {label}\n </Text>\n {actions}\n </Flex>\n {children}\n </Stack>","t('vista.history.diff.query-formatting-only')","<Text data-testid=\"vista-history-query-formatting-only\" muted size={1}>\n {t('vista.history.diff.query-formatting-only')}\n </Text>","<CodeDiffLoader lang=\"text\" next={next} previous={previous} />","{timeStyle: 'medium'}","t('result.timing-not-applicable')","previous ? getRequestChanges(previous, entry) : []","useMemo(\n () => (previous ? getRequestChanges(previous, entry) : []),\n [entry, previous],\n )","useMemo(() => {\n if (!expanded || !previous || previous.query === entry.query) return undefined\n return Promise.all([formatQueryForDiff(previous.query), formatQueryForDiff(entry.query)]).then(\n ([previousText, nextText]) => ({previous: previousText, next: nextText}),\n )\n }, [entry.query, expanded, previous])","Promise.all([formatQueryForDiff(previous.query), formatQueryForDiff(entry.query)]).then(\n ([previousText, nextText]) => ({previous: previousText, next: nextText}),\n )","query","([previousText, nextText]) => ({previous: previousText, next: nextText})","useMemo(() => {\n if (!resultComparable || hiddenPaths.length === 0) return undefined\n const previousShown = omitFields(previousResult.value, hiddenPaths)\n const nextShown = omitFields(nextResult.value, hiddenPaths)\n // Results without hidden fields come back as they are, and there is nothing to hide then\n if (previousShown === previousResult.value && nextShown === nextResult.value) return undefined\n return {previous: previousShown, next: nextShown, same: dequal(previousShown, nextShown)}\n }, [hiddenPaths, nextResult, previousResult, resultComparable])","hiddenPaths.length","nextResult.value","previousResult.value","useMemo(() => {\n if (!resultComparable) return undefined\n return {\n previous: toJson(diffed ? diffed.previous : previousResult.value),\n next: toJson(diffed ? diffed.next : nextResult.value),\n }\n }, [diffed, nextResult, previousResult, resultComparable])","toJson(diffed ? diffed.previous : previousResult.value)","diffed ? diffed.previous : previousResult.value","toJson(diffed ? diffed.next : nextResult.value)","diffed ? diffed.next : nextResult.value","{\n previous: toJson(diffed ? diffed.previous : previousResult.value),\n next: toJson(diffed ? diffed.next : nextResult.value),\n }","t('vista.history.only-hidden-changed')","t('vista.history.changed')","t(requestChanges.length > 0 ? 'vista.history.same-result' : 'vista.history.unchanged')","requestChanges.length > 0 ? 'vista.history.same-result' : 'vista.history.unchanged'","t('vista.history.too-large')","formatTime.format(new Date(entry.requestedAt))","requestedAt","<Text muted size={1}>\n {formatTime.format(new Date(entry.requestedAt))}\n </Text>","describeFetchReason(entry.reason, t)","reason","<Text size={1} weight=\"medium\">\n {describeFetchReason(entry.reason, t)}\n </Text>","entry.reason.type === 'live' &&\n sortSyncTags(entry.reason.matchedTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))","matchedTags","type","(tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n )","status && (\n <Text muted size={1}>\n {status}\n </Text>\n )","comparable && (\n <Button\n aria-controls={changesId}\n aria-expanded={expanded}\n data-testid=\"vista-history-changes-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.history.changes')}\n />\n )","(value) => !value","<Box flexBasis=\"0%\" flexGrow={1} />","entry.network?.viaCdn && (\n <Badge\n data-testid=\"vista-history-cdn\"\n fontSize={0}\n tone={entry.network.cacheHit ? 'positive' : 'default'}\n >\n {entry.network.cacheHit ? t('vista.history.cdn-cache-hit') : t('vista.history.cdn')}\n </Badge>\n )","network","entry.status === 'error' ? (\n <Badge fontSize={0} tone=\"critical\">\n {t('vista.history.failed')}\n </Badge>\n ) : (\n <Text muted size={1}>\n {`${t('result.execution-time-label')} ${entry.ms === undefined ? notApplicable : `${entry.ms}ms`} · ${t('result.end-to-end-time-label')} ${entry.e2eMs === undefined ? notApplicable : `${entry.e2eMs}ms`}`}\n </Text>\n )","e2eMs","ms","status","<Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text muted size={1}>\n {formatTime.format(new Date(entry.requestedAt))}\n </Text>\n <Text size={1} weight=\"medium\">\n {describeFetchReason(entry.reason, t)}\n </Text>\n {entry.reason.type === 'live' &&\n sortSyncTags(entry.reason.matchedTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n {status && (\n <Text muted size={1}>\n {status}\n </Text>\n )}\n {comparable && (\n <Button\n aria-controls={changesId}\n aria-expanded={expanded}\n data-testid=\"vista-history-changes-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.history.changes')}\n />\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {entry.network?.viaCdn && (\n <Badge\n data-testid=\"vista-history-cdn\"\n fontSize={0}\n tone={entry.network.cacheHit ? 'positive' : 'default'}\n >\n {entry.network.cacheHit ? t('vista.history.cdn-cache-hit') : t('vista.history.cdn')}\n </Badge>\n )}\n {entry.status === 'error' ? (\n <Badge fontSize={0} tone=\"critical\">\n {t('vista.history.failed')}\n </Badge>\n ) : (\n <Text muted size={1}>\n {`${t('result.execution-time-label')} ${entry.ms === undefined ? notApplicable : `${entry.ms}ms`} · ${t('result.end-to-end-time-label')} ${entry.e2eMs === undefined ? notApplicable : `${entry.e2eMs}ms`}`}\n </Text>\n )}\n </Flex>","entry.errorMessage && (\n <Box paddingTop={2}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {entry.errorMessage}\n </Text>\n </Box>\n )","errorMessage","comparable && expanded && previous && (\n <Stack data-testid=\"vista-history-changes\" gap={3} id={changesId} paddingTop={2}>\n <Text muted size={1}>\n {t('vista.history.compared-with', {\n time: formatTime.format(new Date(previous.requestedAt)),\n })}\n </Text>\n <DiffBoundary\n renderFallback={(retry) => (\n <Flex alignItems=\"center\" gap={2}>\n <Text muted size={1}>\n {t('vista.history.changes-failed')}\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={retry}\n padding={2}\n text={t('vista.history.changes-retry')}\n />\n </Flex>\n )}\n >\n <Suspense fallback={<DelayedSpinner />}>\n <Stack gap={3}>\n {requestChanges.map((change) => (\n <DiffSection\n key={change.id}\n label={describeRequestChange(change.id, t)}\n testId={`vista-history-diff-${change.id}`}\n >\n {change.id === 'query' && queryTexts ? (\n <Suspense fallback={<DelayedSpinner />}>\n <QueryDiff texts={queryTexts} />\n </Suspense>\n ) : (\n <CodeDiffLoader\n lang={change.lang}\n next={change.next}\n previous={change.previous}\n />\n )}\n </DiffSection>\n ))}\n {resultDiff && (\n <DiffSection\n actions={\n shown &&\n !onlyHiddenChanged && (\n <>\n <Text data-testid=\"vista-history-hidden-fields\" muted size={1}>\n {t(\n showHidden ? 'vista.history.showing-hidden' : 'vista.history.hiding',\n {fields: hiddenFields.join(', ')},\n )}\n </Text>\n <Button\n data-testid=\"vista-history-hidden-toggle\"\n fontSize={1}\n mode=\"bleed\"\n onClick={() => setShowHidden((value) => !value)}\n padding={1}\n text={t(\n showHidden\n ? 'vista.history.hide-hidden'\n : 'vista.history.show-hidden',\n )}\n />\n </>\n )\n }\n label={t('vista.history.diff.result')}\n testId=\"vista-history-diff-result\"\n >\n <CodeDiffLoader\n lang=\"json\"\n next={resultDiff.next}\n previous={resultDiff.previous}\n />\n </DiffSection>\n )}\n </Stack>\n </Suspense>\n </DiffBoundary>\n </Stack>\n )","<Card\n borderBottom\n data-testid=\"vista-history-entry\"\n paddingX={3}\n paddingY={2}\n tone={entry.status === 'error' ? 'critical' : 'default'}\n >\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text muted size={1}>\n {formatTime.format(new Date(entry.requestedAt))}\n </Text>\n <Text size={1} weight=\"medium\">\n {describeFetchReason(entry.reason, t)}\n </Text>\n {entry.reason.type === 'live' &&\n sortSyncTags(entry.reason.matchedTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n {status && (\n <Text muted size={1}>\n {status}\n </Text>\n )}\n {comparable && (\n <Button\n aria-controls={changesId}\n aria-expanded={expanded}\n data-testid=\"vista-history-changes-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.history.changes')}\n />\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {entry.network?.viaCdn && (\n <Badge\n data-testid=\"vista-history-cdn\"\n fontSize={0}\n tone={entry.network.cacheHit ? 'positive' : 'default'}\n >\n {entry.network.cacheHit ? t('vista.history.cdn-cache-hit') : t('vista.history.cdn')}\n </Badge>\n )}\n {entry.status === 'error' ? (\n <Badge fontSize={0} tone=\"critical\">\n {t('vista.history.failed')}\n </Badge>\n ) : (\n <Text muted size={1}>\n {`${t('result.execution-time-label')} ${entry.ms === undefined ? notApplicable : `${entry.ms}ms`} · ${t('result.end-to-end-time-label')} ${entry.e2eMs === undefined ? notApplicable : `${entry.e2eMs}ms`}`}\n </Text>\n )}\n </Flex>\n {entry.errorMessage && (\n <Box paddingTop={2}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {entry.errorMessage}\n </Text>\n </Box>\n )}\n {comparable && expanded && previous && (\n <Stack data-testid=\"vista-history-changes\" gap={3} id={changesId} paddingTop={2}>\n <Text muted size={1}>\n {t('vista.history.compared-with', {\n time: formatTime.format(new Date(previous.requestedAt)),\n })}\n </Text>\n <DiffBoundary\n renderFallback={(retry) => (\n <Flex alignItems=\"center\" gap={2}>\n <Text muted size={1}>\n {t('vista.history.changes-failed')}\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={retry}\n padding={2}\n text={t('vista.history.changes-retry')}\n />\n </Flex>\n )}\n >\n <Suspense fallback={<DelayedSpinner />}>\n <Stack gap={3}>\n {requestChanges.map((change) => (\n <DiffSection\n key={change.id}\n label={describeRequestChange(change.id, t)}\n testId={`vista-history-diff-${change.id}`}\n >\n {change.id === 'query' && queryTexts ? (\n <Suspense fallback={<DelayedSpinner />}>\n <QueryDiff texts={queryTexts} />\n </Suspense>\n ) : (\n <CodeDiffLoader\n lang={change.lang}\n next={change.next}\n previous={change.previous}\n />\n )}\n </DiffSection>\n ))}\n {resultDiff && (\n <DiffSection\n actions={\n shown &&\n !onlyHiddenChanged && (\n <>\n <Text data-testid=\"vista-history-hidden-fields\" muted size={1}>\n {t(\n showHidden ? 'vista.history.showing-hidden' : 'vista.history.hiding',\n {fields: hiddenFields.join(', ')},\n )}\n </Text>\n <Button\n data-testid=\"vista-history-hidden-toggle\"\n fontSize={1}\n mode=\"bleed\"\n onClick={() => setShowHidden((value) => !value)}\n padding={1}\n text={t(\n showHidden\n ? 'vista.history.hide-hidden'\n : 'vista.history.show-hidden',\n )}\n />\n </>\n )\n }\n label={t('vista.history.diff.result')}\n testId=\"vista-history-diff-result\"\n >\n <CodeDiffLoader\n lang=\"json\"\n next={resultDiff.next}\n previous={resultDiff.previous}\n />\n </DiffSection>\n )}\n </Stack>\n </Suspense>\n </DiffBoundary>\n </Stack>\n )}\n </Card>","entry.status === 'error' ? 'critical' : 'default'","value","[previousText, nextText]","parseFieldPaths(hiddenFields)","useMemo(() => parseFieldPaths(hiddenFields), [hiddenFields])","history.length","useMemo(() => {\n const previous = new Map<string, FetchHistoryEntry>()\n let older: FetchHistoryEntry | undefined\n for (let index = history.length - 1; index >= 0; index--) {\n const entry = history[index]\n if (older) previous.set(entry.id, older)\n if (entry.status === 'ok') older = entry\n }\n return previous\n }, [history])","t('vista.history.empty')","<Box padding={3}>\n <Text muted size={1}>\n {t('vista.history.empty')}\n </Text>\n </Box>","history.map((entry) => (\n <HistoryEntry\n entry={entry}\n hiddenFields={hiddenFields}\n hiddenPaths={hiddenPaths}\n key={entry.id}\n previous={previousSuccess.get(entry.id)}\n />\n ))","(entry) => (\n <HistoryEntry\n entry={entry}\n hiddenFields={hiddenFields}\n hiddenPaths={hiddenPaths}\n key={entry.id}\n previous={previousSuccess.get(entry.id)}\n />\n )","entry","<Stack data-testid=\"vista-history\">\n {history.map((entry) => (\n <HistoryEntry\n entry={entry}\n hiddenFields={hiddenFields}\n hiddenPaths={hiddenPaths}\n key={entry.id}\n previous={previousSuccess.get(entry.id)}\n />\n ))}\n </Stack>","exhaustive","toJson","_c","_temp","_temp2","_temp3","_Fragment","_temp4","{findings, onReveal}: LintTabProps","t('vista.lint.empty')","<Box padding={3}>\n <Text muted size={1}>\n {t('vista.lint.empty')}\n </Text>\n </Box>","findings.map((finding) => (\n <Card\n as=\"button\"\n borderBottom\n className={styles.lintFindingButton}\n data-testid=\"vista-lint-finding\"\n key={`${finding.from}:${finding.to}:${finding.source ?? ''}:${finding.message}`}\n onClick={() => onReveal(finding)}\n paddingX={3}\n paddingY={3}\n type=\"button\"\n >\n <Flex alignItems=\"flex-start\" gap={3}>\n <Box flexShrink={0} paddingTop={1}>\n <Badge fontSize={0} tone={severityTone(finding.severity)}>\n {severityLabel(finding.severity, t)}\n </Badge>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1}>\n {splitMessage(finding.message).map((segment, index) =>\n segment.code ? (\n <code key={index}>{segment.text}</code>\n ) : (\n <span key={index}>{segment.text}</span>\n ),\n )}\n </Text>\n <Text muted size={0}>\n {t('vista.lint.position', {line: finding.line, column: finding.column})}\n {finding.source ? ` · ${finding.source}` : ''}\n </Text>\n </Stack>\n </Flex>\n </Card>\n ))","(finding) => (\n <Card\n as=\"button\"\n borderBottom\n className={styles.lintFindingButton}\n data-testid=\"vista-lint-finding\"\n key={`${finding.from}:${finding.to}:${finding.source ?? ''}:${finding.message}`}\n onClick={() => onReveal(finding)}\n paddingX={3}\n paddingY={3}\n type=\"button\"\n >\n <Flex alignItems=\"flex-start\" gap={3}>\n <Box flexShrink={0} paddingTop={1}>\n <Badge fontSize={0} tone={severityTone(finding.severity)}>\n {severityLabel(finding.severity, t)}\n </Badge>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1}>\n {splitMessage(finding.message).map((segment, index) =>\n segment.code ? (\n <code key={index}>{segment.text}</code>\n ) : (\n <span key={index}>{segment.text}</span>\n ),\n )}\n </Text>\n <Text muted size={0}>\n {t('vista.lint.position', {line: finding.line, column: finding.column})}\n {finding.source ? ` · ${finding.source}` : ''}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )","(segment, index) =>\n segment.code ? (\n <code key={index}>{segment.text}</code>\n ) : (\n <span key={index}>{segment.text}</span>\n )","<Stack data-testid=\"vista-lint\">\n {findings.map((finding) => (\n <Card\n as=\"button\"\n borderBottom\n className={styles.lintFindingButton}\n data-testid=\"vista-lint-finding\"\n key={`${finding.from}:${finding.to}:${finding.source ?? ''}:${finding.message}`}\n onClick={() => onReveal(finding)}\n paddingX={3}\n paddingY={3}\n type=\"button\"\n >\n <Flex alignItems=\"flex-start\" gap={3}>\n <Box flexShrink={0} paddingTop={1}>\n <Badge fontSize={0} tone={severityTone(finding.severity)}>\n {severityLabel(finding.severity, t)}\n </Badge>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1}>\n {splitMessage(finding.message).map((segment, index) =>\n segment.code ? (\n <code key={index}>{segment.text}</code>\n ) : (\n <span key={index}>{segment.text}</span>\n ),\n )}\n </Text>\n <Text muted size={0}>\n {t('vista.lint.position', {line: finding.line, column: finding.column})}\n {finding.source ? ` · ${finding.source}` : ''}\n </Text>\n </Stack>\n </Flex>\n </Card>\n ))}\n </Stack>","exhaustive","_c","styles.lintFindingButton","_temp","unknownTemplate","unknownInput","{type: 'idle'}","() => () => controllerRef.current?.abort()","[]","async () => {\n const description = request.trim()\n if (!description) return\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n setStatus({type: 'generating', attempt: 1})\n // The types of the result's documents, besides the ones the description names\n const types = new Set(documentsInResult(result).flatMap((document) => document.type ?? []))\n try {\n const generated = await generateMutations({\n request: description,\n result,\n schema: schema ? summarizeSchema(schema, [description, ...types].join(' ')) : '',\n client,\n mutationOptions,\n signal: controller.signal,\n onAttempt: (attempt) => setStatus({type: 'generating', attempt}),\n })\n if (controller.signal.aborted) return\n reportAiCreditsGranted(client)\n onGenerated(toText(generated.mutations), {\n key: mutationRunKey(dataset, generated.mutations, mutationOptions),\n result: generated.preview,\n })\n } catch (error) {\n if (controller.signal.aborted) return\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(client, limit)\n setStatus({\n type: 'failed',\n message: error instanceof Error ? error.message : String(error),\n lastAttempt: error instanceof GenerateMutationsError ? error.lastAttempt : undefined,\n limit,\n })\n }\n }","(document) => document.type ?? []","error","useCallback(async () => {\n const description = request.trim()\n if (!description) return\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n setStatus({type: 'generating', attempt: 1})\n // The types of the result's documents, besides the ones the description names\n const types = new Set(documentsInResult(result).flatMap((document) => document.type ?? []))\n try {\n const generated = await generateMutations({\n request: description,\n result,\n schema: schema ? summarizeSchema(schema, [description, ...types].join(' ')) : '',\n client,\n mutationOptions,\n signal: controller.signal,\n onAttempt: (attempt) => setStatus({type: 'generating', attempt}),\n })\n if (controller.signal.aborted) return\n reportAiCreditsGranted(client)\n onGenerated(toText(generated.mutations), {\n key: mutationRunKey(dataset, generated.mutations, mutationOptions),\n result: generated.preview,\n })\n } catch (error) {\n if (controller.signal.aborted) return\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(client, limit)\n setStatus({\n type: 'failed',\n message: error instanceof Error ? error.message : String(error),\n lastAttempt: error instanceof GenerateMutationsError ? error.lastAttempt : undefined,\n limit,\n })\n }\n }, [client, dataset, mutationOptions, onGenerated, request, result, schema])","t('vista.mutate.generate.label')","() => void generate()","t('vista.mutate.generate.placeholder')","<PromptRow\n label={t('vista.mutate.generate.label')}\n onChange={setRequest}\n onClose={onClose}\n onSubmit={() => void generate()}\n pending={generating}\n placeholder={t('vista.mutate.generate.placeholder')}\n testIdPrefix=\"vista-mutate-generate\"\n value={request}\n />","status.type === 'idle' && !atLimit && (\n <Text muted size={0}>\n {t('vista.mutate.generate.description')}\n </Text>\n )","type","status.type === 'generating' && (\n <Text data-testid=\"vista-mutate-generate-progress\" muted size={1}>\n {status.attempt > 1\n ? t('vista.mutate.generate.progress-retry', {\n attempt: status.attempt,\n max: MAX_GENERATE_ATTEMPTS,\n })\n : t('vista.mutate.generate.progress')}\n </Text>\n )","attempt","status.type === 'failed' && !atLimit && (\n <Card data-testid=\"vista-mutate-generate-error\" padding={3} radius={2} tone=\"critical\">\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.mutate.generate.failed')}\n </Text>\n <Text size={1}>{status.message}</Text>\n {lastAttempt && (\n <Flex>\n <Button\n data-testid=\"vista-mutate-generate-open-anyway\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onOpenAttempt(toText(lastAttempt))}\n padding={2}\n text={t('vista.generate.open-anyway')}\n />\n </Flex>\n )}\n </Stack>\n </Card>\n )","message","client.config()","<AiCreditsStatus apiHost={client.config().apiHost} credits={shownCredits} size={0} />","apiHost","<Card border data-testid=\"vista-mutate-generate-bar\" padding={2} radius={2}>\n <Stack gap={2}>\n <PromptRow\n label={t('vista.mutate.generate.label')}\n onChange={setRequest}\n onClose={onClose}\n onSubmit={() => void generate()}\n pending={generating}\n placeholder={t('vista.mutate.generate.placeholder')}\n testIdPrefix=\"vista-mutate-generate\"\n value={request}\n />\n {status.type === 'idle' && !atLimit && (\n <Text muted size={0}>\n {t('vista.mutate.generate.description')}\n </Text>\n )}\n {status.type === 'generating' && (\n <Text data-testid=\"vista-mutate-generate-progress\" muted size={1}>\n {status.attempt > 1\n ? t('vista.mutate.generate.progress-retry', {\n attempt: status.attempt,\n max: MAX_GENERATE_ATTEMPTS,\n })\n : t('vista.mutate.generate.progress')}\n </Text>\n )}\n {status.type === 'failed' && !atLimit && (\n <Card data-testid=\"vista-mutate-generate-error\" padding={3} radius={2} tone=\"critical\">\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.mutate.generate.failed')}\n </Text>\n <Text size={1}>{status.message}</Text>\n {lastAttempt && (\n <Flex>\n <Button\n data-testid=\"vista-mutate-generate-open-anyway\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onOpenAttempt(toText(lastAttempt))}\n padding={2}\n text={t('vista.generate.open-anyway')}\n />\n </Flex>\n )}\n </Stack>\n </Card>\n )}\n <AiCreditsStatus apiHost={client.config().apiHost} credits={shownCredits} size={0} />\n </Stack>\n </Card>","_c","_temp","(text: string) => {\n setState((current) => ({...current, text}))\n }","useCallback((text: string) => {\n setState((current) => ({...current, text}))\n }, [])","(text: string, generatedPreview: NonNullable<MutatePanelState['preview']>) => {\n setState((current) => ({\n ...current,\n text,\n preview: generatedPreview,\n failure: undefined,\n applied: undefined,\n }))\n }","current","useCallback(\n (text: string, generatedPreview: NonNullable<MutatePanelState['preview']>) => {\n setState((current) => ({\n ...current,\n text,\n preview: generatedPreview,\n failure: undefined,\n applied: undefined,\n }))\n },\n [],\n )","(autoGenerateArrayKeys: boolean) => {\n setState((current) => ({...current, autoGenerateArrayKeys}))\n }","useCallback((autoGenerateArrayKeys: boolean) => {\n setState((current) => ({...current, autoGenerateArrayKeys}))\n }, [])","async (client: MutateClient, run: MutationRun) => {\n setState((current) => ({\n ...current,\n pending: 'preview',\n failure: undefined,\n applied: undefined,\n }))\n try {\n const result = await previewMutations(client, run.mutations, run.options)\n setState((current) => ({...current, pending: undefined, preview: {key: run.key, result}}))\n } catch (error) {\n setState((current) => ({\n ...current,\n pending: undefined,\n preview: undefined,\n failure: {action: 'preview', failure: readMutationFailure(error)},\n }))\n }\n }","(current) => ({\n ...current,\n pending: 'preview',\n failure: undefined,\n applied: undefined,\n })","error","useCallback(async (client: MutateClient, run: MutationRun) => {\n setState((current) => ({\n ...current,\n pending: 'preview',\n failure: undefined,\n applied: undefined,\n }))\n try {\n const result = await previewMutations(client, run.mutations, run.options)\n setState((current) => ({...current, pending: undefined, preview: {key: run.key, result}}))\n } catch (error) {\n setState((current) => ({\n ...current,\n pending: undefined,\n preview: undefined,\n failure: {action: 'preview', failure: readMutationFailure(error)},\n }))\n }\n }, [])","async (client: MutateClient, run: MutationRun, dataset: string) => {\n setState((current) => ({...current, pending: 'apply', failure: undefined}))\n try {\n const applied = await applyMutations(client, run.mutations, run.options)\n setState((current) => ({\n ...current,\n pending: undefined,\n // What it showed is what the dataset holds now\n preview: undefined,\n applied: {\n transactionId: applied.transactionId,\n documentCount: applied.documentIds.length,\n dataset,\n },\n }))\n return true\n } catch (error) {\n setState((current) => ({\n ...current,\n pending: undefined,\n failure: {action: 'apply', failure: readMutationFailure(error)},\n }))\n return false\n }\n }","(current) => ({...current, pending: 'apply', failure: undefined})","client","run","useCallback(async (client: MutateClient, run: MutationRun, dataset: string) => {\n setState((current) => ({...current, pending: 'apply', failure: undefined}))\n try {\n const applied = await applyMutations(client, run.mutations, run.options)\n setState((current) => ({\n ...current,\n pending: undefined,\n // What it showed is what the dataset holds now\n preview: undefined,\n applied: {\n transactionId: applied.transactionId,\n documentCount: applied.documentIds.length,\n dataset,\n },\n }))\n return true\n } catch (error) {\n setState((current) => ({\n ...current,\n pending: undefined,\n failure: {action: 'apply', failure: readMutationFailure(error)},\n }))\n return false\n }\n }, [])","{state, setText, showGenerated, setAutoGenerateArrayKeys, preview, apply}","describeOperation(change.operation, t)","operation","<Badge\n data-testid=\"vista-mutate-operation\"\n fontSize={0}\n tone={OPERATION_TONES[change.operation]}\n >\n {describeOperation(change.operation, t)}\n </Badge>","OPERATION_TONES[change.operation]","<Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text data-testid=\"vista-mutate-document-id\" size={1} textOverflow=\"ellipsis\">\n <code>{change.id}</code>\n </Text>\n </Box>","id","changed && (\n <Button\n aria-controls={diffId}\n aria-expanded={expanded}\n data-testid=\"vista-mutate-change-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.mutate.changes')}\n />\n )","(value) => !value","<Flex alignItems=\"center\" gap={2}>\n <Badge\n data-testid=\"vista-mutate-operation\"\n fontSize={0}\n tone={OPERATION_TONES[change.operation]}\n >\n {describeOperation(change.operation, t)}\n </Badge>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text data-testid=\"vista-mutate-document-id\" size={1} textOverflow=\"ellipsis\">\n <code>{change.id}</code>\n </Text>\n </Box>\n {changed && (\n <Button\n aria-controls={diffId}\n aria-expanded={expanded}\n data-testid=\"vista-mutate-change-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.mutate.changes')}\n />\n )}\n </Flex>","changed && expanded && (\n <Box id={diffId} paddingTop={2}>\n <DiffBoundary\n renderFallback={(retry) => (\n <Flex alignItems=\"center\" gap={2}>\n <Text muted size={1}>\n {t('vista.mutate.changes-failed')}\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={retry}\n padding={2}\n text={t('vista.mutate.changes-retry')}\n />\n </Flex>\n )}\n >\n <Suspense fallback={<DelayedSpinner />}>\n <CodeDiffLoader\n lang=\"json\"\n next={toJson(change.after, hiddenPaths)}\n previous={toJson(change.before, hiddenPaths)}\n />\n </Suspense>\n </DiffBoundary>\n </Box>\n )","after","before","<Card borderBottom data-testid=\"vista-mutate-change\" paddingX={3} paddingY={2}>\n <Flex alignItems=\"center\" gap={2}>\n <Badge\n data-testid=\"vista-mutate-operation\"\n fontSize={0}\n tone={OPERATION_TONES[change.operation]}\n >\n {describeOperation(change.operation, t)}\n </Badge>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text data-testid=\"vista-mutate-document-id\" size={1} textOverflow=\"ellipsis\">\n <code>{change.id}</code>\n </Text>\n </Box>\n {changed && (\n <Button\n aria-controls={diffId}\n aria-expanded={expanded}\n data-testid=\"vista-mutate-change-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.mutate.changes')}\n />\n )}\n </Flex>\n {changed && expanded && (\n <Box id={diffId} paddingTop={2}>\n <DiffBoundary\n renderFallback={(retry) => (\n <Flex alignItems=\"center\" gap={2}>\n <Text muted size={1}>\n {t('vista.mutate.changes-failed')}\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={retry}\n padding={2}\n text={t('vista.mutate.changes-retry')}\n />\n </Flex>\n )}\n >\n <Suspense fallback={<DelayedSpinner />}>\n <CodeDiffLoader\n lang=\"json\"\n next={toJson(change.after, hiddenPaths)}\n previous={toJson(change.before, hiddenPaths)}\n />\n </Suspense>\n </DiffBoundary>\n </Box>\n )}\n </Card>","parseFieldPaths(hiddenFields)","useMemo(() => parseFieldPaths(hiddenFields), [hiddenFields])","preview.changes.filter((change) => change.operation !== 'none')","changes","(change) => change.operation !== 'none'","t('vista.mutate.preview-heading')","<Label muted size={0}>\n {t('vista.mutate.preview-heading')}\n </Label>","t('vista.mutate.summary', {changed, unchanged: preview.changes.length - changed})","preview.changes.length - changed","<Text data-testid=\"vista-mutate-summary\" muted size={1}>\n {t('vista.mutate.summary', {changed, unchanged: preview.changes.length - changed})}\n </Text>","<Flex alignItems=\"center\" flexShrink={0} flexWrap=\"wrap\" gap={2}>\n <Label muted size={0}>\n {t('vista.mutate.preview-heading')}\n </Label>\n <Text data-testid=\"vista-mutate-summary\" muted size={1}>\n {t('vista.mutate.summary', {changed, unchanged: preview.changes.length - changed})}\n </Text>\n </Flex>","stale && (\n <Text data-testid=\"vista-mutate-stale\" size={1}>\n {t('vista.mutate.stale')}\n </Text>\n )","preview.changes.length === 0 ? (\n <Text muted size={1}>\n {t('vista.mutate.no-documents')}\n </Text>\n ) : (\n <Card border className={styles.drawerScroller} radius={2}>\n {preview.changes.map((change, index) => (\n <ChangeRow\n change={change}\n expanded={index < EXPANDED_CHANGES}\n hiddenPaths={hiddenPaths}\n key={change.id}\n />\n ))}\n </Card>\n )","change","preview.notShown > 0 && (\n <Text muted size={1}>\n {t('vista.mutate.not-shown', {count: preview.notShown})}\n </Text>\n )","notShown","hiddenFields.length > 0 && changed > 0 && (\n <Text muted size={1}>\n {t('vista.mutate.hiding', {fields: hiddenFields.join(', ')})}\n </Text>\n )","hiddenFields.length","<Flex data-testid=\"vista-mutate-preview-result\" flexDirection=\"column\" gap={3} minHeight=\"0\">\n <Flex alignItems=\"center\" flexShrink={0} flexWrap=\"wrap\" gap={2}>\n <Label muted size={0}>\n {t('vista.mutate.preview-heading')}\n </Label>\n <Text data-testid=\"vista-mutate-summary\" muted size={1}>\n {t('vista.mutate.summary', {changed, unchanged: preview.changes.length - changed})}\n </Text>\n </Flex>\n {stale && (\n <Text data-testid=\"vista-mutate-stale\" size={1}>\n {t('vista.mutate.stale')}\n </Text>\n )}\n {preview.changes.length === 0 ? (\n <Text muted size={1}>\n {t('vista.mutate.no-documents')}\n </Text>\n ) : (\n <Card border className={styles.drawerScroller} radius={2}>\n {preview.changes.map((change, index) => (\n <ChangeRow\n change={change}\n expanded={index < EXPANDED_CHANGES}\n hiddenPaths={hiddenPaths}\n key={change.id}\n />\n ))}\n </Card>\n )}\n {preview.notShown > 0 && (\n <Text muted size={1}>\n {t('vista.mutate.not-shown', {count: preview.notShown})}\n </Text>\n )}\n {hiddenFields.length > 0 && changed > 0 && (\n <Text muted size={1}>\n {t('vista.mutate.hiding', {fields: hiddenFields.join(', ')})}\n </Text>\n )}\n </Flex>","readMutations(state.text)","text","useMemo(() => readMutations(state.text), [state.text])","{autoGenerateArrayKeys: state.autoGenerateArrayKeys}","autoGenerateArrayKeys","useMemo(\n (): MutationOptions => ({autoGenerateArrayKeys: state.autoGenerateArrayKeys}),\n [state.autoGenerateArrayKeys],\n )","useMemo((): MutationRun | undefined => {\n if (input.status !== 'valid') return undefined\n return {\n key: mutationRunKey(dataset, input.mutations, options),\n mutations: input.mutations,\n options,\n }\n }, [dataset, input, options])","mutationRunKey(dataset, input.mutations, options)","mutations","{\n key: mutationRunKey(dataset, input.mutations, options),\n mutations: input.mutations,\n options,\n }","documentsInResult(result)","useMemo(() => documentsInResult(result), [result])","state.preview\n ? state.preview.result.changes.some((change) => change.operation !== 'none') ||\n state.preview.result.notShown > 0\n : false","preview","(template: MutationTemplate) => {\n const next = addMutation(state.text, createMutationTemplate(template, documents))\n if (next !== undefined) mutate.setText(next)\n }","async () => {\n if (!run || !previewIsCurrent) return\n if (await mutate.apply(client, run, dataset)) onApplied()\n }","t('vista.mutate.description')","<Text muted size={1}>\n {t('vista.mutate.description')}\n </Text>","generatorOpen && (\n <GenerateMutationsBar\n client={client}\n dataset={dataset}\n mutationOptions={options}\n onClose={() => setGeneratorOpen(false)}\n onGenerated={(text, preview) => {\n mutate.showGenerated(text, preview)\n setGeneratorOpen(false)\n }}\n onOpenAttempt={(text) => {\n mutate.setText(text)\n setGeneratorOpen(false)\n }}\n result={result}\n />\n )","!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )","t('vista.mutate.add')","<Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />","!canAdd","() => addTemplate('patch')","documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')","length","<MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />","() => addTemplate('create')","t('vista.mutate.add.create')","<MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />","() => addTemplate('delete')","documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')","<MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />","<Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>","{placement: 'bottom-end', portal: true}","<MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />","<Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>","t('vista.mutate.mutations')","<JsonEditor\n actions={\n <Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>\n }\n label={t('vista.mutate.mutations')}\n onChange={mutate.setText}\n testId=\"vista-mutate-editor\"\n value={state.text}\n />","setText","input.status === 'invalid-json' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-json', {message: input.message})}\n </Text>\n )","message","status","input.status === 'not-a-list' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.not-a-list')}\n </Text>\n )","input.status === 'invalid-mutation' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-mutation', {index: input.index})}\n </Text>\n )","index","<Flex flexDirection=\"column\" gap={2} minHeight=\"0\">\n <JsonEditor\n actions={\n <Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>\n }\n label={t('vista.mutate.mutations')}\n onChange={mutate.setText}\n testId=\"vista-mutate-editor\"\n value={state.text}\n />\n {input.status === 'invalid-json' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-json', {message: input.message})}\n </Text>\n )}\n {input.status === 'not-a-list' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.not-a-list')}\n </Text>\n )}\n {input.status === 'invalid-mutation' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-mutation', {index: input.index})}\n </Text>\n )}\n </Flex>","hasOutcome && (\n <Flex\n data-testid=\"vista-mutate-outcome\"\n flexDirection=\"column\"\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n {state.failure && (\n <Card\n border\n data-testid=\"vista-mutate-failure\"\n padding={3}\n radius={2}\n tone=\"critical\"\n >\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {state.failure.action === 'preview'\n ? t('vista.mutate.preview-failed')\n : t('vista.mutate.apply-failed')}\n </Text>\n <Text size={1}>{state.failure.failure.message}</Text>\n {state.failure.failure.items.map((item) => (\n <Text key={`${item.index}:${item.message}`} size={1}>\n {t('vista.mutate.failure-item', {\n index: item.index,\n message: item.message,\n })}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {state.applied && (\n <Card\n border\n data-testid=\"vista-mutate-applied\"\n padding={3}\n radius={2}\n tone=\"positive\"\n >\n <Text size={1}>\n {t('vista.mutate.applied', {\n dataset: state.applied.dataset,\n transactionId: state.applied.transactionId,\n count: state.applied.documentCount,\n })}\n </Text>\n </Card>\n )}\n {state.preview && (\n <PreviewResult\n hiddenFields={hiddenFields}\n preview={state.preview.result}\n stale={!previewIsCurrent}\n />\n )}\n </Flex>\n )","applied","failure","<Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows={\n hasOutcome ? 'minmax(140px, 1fr) fit-content(50%)' : 'minmax(140px, 1fr)'\n }\n minHeight=\"280px\"\n >\n <Flex flexDirection=\"column\" gap={2} minHeight=\"0\">\n <JsonEditor\n actions={\n <Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>\n }\n label={t('vista.mutate.mutations')}\n onChange={mutate.setText}\n testId=\"vista-mutate-editor\"\n value={state.text}\n />\n {input.status === 'invalid-json' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-json', {message: input.message})}\n </Text>\n )}\n {input.status === 'not-a-list' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.not-a-list')}\n </Text>\n )}\n {input.status === 'invalid-mutation' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-mutation', {index: input.index})}\n </Text>\n )}\n </Flex>\n {hasOutcome && (\n <Flex\n data-testid=\"vista-mutate-outcome\"\n flexDirection=\"column\"\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n {state.failure && (\n <Card\n border\n data-testid=\"vista-mutate-failure\"\n padding={3}\n radius={2}\n tone=\"critical\"\n >\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {state.failure.action === 'preview'\n ? t('vista.mutate.preview-failed')\n : t('vista.mutate.apply-failed')}\n </Text>\n <Text size={1}>{state.failure.failure.message}</Text>\n {state.failure.failure.items.map((item) => (\n <Text key={`${item.index}:${item.message}`} size={1}>\n {t('vista.mutate.failure-item', {\n index: item.index,\n message: item.message,\n })}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {state.applied && (\n <Card\n border\n data-testid=\"vista-mutate-applied\"\n padding={3}\n radius={2}\n tone=\"positive\"\n >\n <Text size={1}>\n {t('vista.mutate.applied', {\n dataset: state.applied.dataset,\n transactionId: state.applied.transactionId,\n count: state.applied.documentCount,\n })}\n </Text>\n </Card>\n )}\n {state.preview && (\n <PreviewResult\n hiddenFields={hiddenFields}\n preview={state.preview.result}\n stale={!previewIsCurrent}\n />\n )}\n </Flex>\n )}\n </Grid>","hasOutcome ? 'minmax(140px, 1fr) fit-content(50%)' : 'minmax(140px, 1fr)'","<Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n padding={3}\n >\n <Text muted size={1}>\n {t('vista.mutate.description')}\n </Text>\n {generatorOpen && (\n <GenerateMutationsBar\n client={client}\n dataset={dataset}\n mutationOptions={options}\n onClose={() => setGeneratorOpen(false)}\n onGenerated={(text, preview) => {\n mutate.showGenerated(text, preview)\n setGeneratorOpen(false)\n }}\n onOpenAttempt={(text) => {\n mutate.setText(text)\n setGeneratorOpen(false)\n }}\n result={result}\n />\n )}\n {/* What a dry run or an apply returned is as tall as it needs up to half the room, its\n changes scrolling past that; the editor takes the rest */}\n <Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows={\n hasOutcome ? 'minmax(140px, 1fr) fit-content(50%)' : 'minmax(140px, 1fr)'\n }\n minHeight=\"280px\"\n >\n <Flex flexDirection=\"column\" gap={2} minHeight=\"0\">\n <JsonEditor\n actions={\n <Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>\n }\n label={t('vista.mutate.mutations')}\n onChange={mutate.setText}\n testId=\"vista-mutate-editor\"\n value={state.text}\n />\n {input.status === 'invalid-json' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-json', {message: input.message})}\n </Text>\n )}\n {input.status === 'not-a-list' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.not-a-list')}\n </Text>\n )}\n {input.status === 'invalid-mutation' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-mutation', {index: input.index})}\n </Text>\n )}\n </Flex>\n {hasOutcome && (\n <Flex\n data-testid=\"vista-mutate-outcome\"\n flexDirection=\"column\"\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n {state.failure && (\n <Card\n border\n data-testid=\"vista-mutate-failure\"\n padding={3}\n radius={2}\n tone=\"critical\"\n >\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {state.failure.action === 'preview'\n ? t('vista.mutate.preview-failed')\n : t('vista.mutate.apply-failed')}\n </Text>\n <Text size={1}>{state.failure.failure.message}</Text>\n {state.failure.failure.items.map((item) => (\n <Text key={`${item.index}:${item.message}`} size={1}>\n {t('vista.mutate.failure-item', {\n index: item.index,\n message: item.message,\n })}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {state.applied && (\n <Card\n border\n data-testid=\"vista-mutate-applied\"\n padding={3}\n radius={2}\n tone=\"positive\"\n >\n <Text size={1}>\n {t('vista.mutate.applied', {\n dataset: state.applied.dataset,\n transactionId: state.applied.transactionId,\n count: state.applied.documentCount,\n })}\n </Text>\n </Card>\n )}\n {state.preview && (\n <PreviewResult\n hiddenFields={hiddenFields}\n preview={state.preview.result}\n stale={!previewIsCurrent}\n />\n )}\n </Flex>\n )}\n </Grid>\n </Flex>","t('vista.mutate.auto-keys.description')","t('vista.mutate.auto-keys')","<SwitchField\n checked={state.autoGenerateArrayKeys}\n description={t('vista.mutate.auto-keys.description')}\n onChange={mutate.setAutoGenerateArrayKeys}\n testId=\"vista-mutate-auto-keys\"\n title={t('vista.mutate.auto-keys')}\n />","setAutoGenerateArrayKeys","state.autoGenerateArrayKeys","mutate.setAutoGenerateArrayKeys","() => run && void mutate.preview(client, run)","t('vista.mutate.preview')","<Button\n data-testid=\"vista-mutate-preview\"\n disabled={!run || !canRequest || state.pending !== undefined}\n fontSize={1}\n loading={state.pending === 'preview'}\n mode=\"ghost\"\n onClick={() => run && void mutate.preview(client, run)}\n padding={2}\n text={t('vista.mutate.preview')}\n />","!run || !canRequest || state.pending !== undefined","state.pending === 'preview'","() => void applyPreviewed()","t('vista.mutate.apply', {dataset})","<Button\n data-testid=\"vista-mutate-apply\"\n disabled={!canApply}\n fontSize={1}\n loading={state.pending === 'apply'}\n onClick={() => void applyPreviewed()}\n padding={2}\n text={t('vista.mutate.apply', {dataset})}\n tone=\"critical\"\n />","!canApply","state.pending === 'apply'","run && !previewIsCurrent && (\n <Text muted size={1}>\n {t('vista.mutate.apply-needs-preview')}\n </Text>\n )","<Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Button\n data-testid=\"vista-mutate-preview\"\n disabled={!run || !canRequest || state.pending !== undefined}\n fontSize={1}\n loading={state.pending === 'preview'}\n mode=\"ghost\"\n onClick={() => run && void mutate.preview(client, run)}\n padding={2}\n text={t('vista.mutate.preview')}\n />\n <Button\n data-testid=\"vista-mutate-apply\"\n disabled={!canApply}\n fontSize={1}\n loading={state.pending === 'apply'}\n onClick={() => void applyPreviewed()}\n padding={2}\n text={t('vista.mutate.apply', {dataset})}\n tone=\"critical\"\n />\n {run && !previewIsCurrent && (\n <Text muted size={1}>\n {t('vista.mutate.apply-needs-preview')}\n </Text>\n )}\n </Flex>","<Box borderTop flexShrink={0} padding={3}>\n <Stack gap={4}>\n <SwitchField\n checked={state.autoGenerateArrayKeys}\n description={t('vista.mutate.auto-keys.description')}\n onChange={mutate.setAutoGenerateArrayKeys}\n testId=\"vista-mutate-auto-keys\"\n title={t('vista.mutate.auto-keys')}\n />\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Button\n data-testid=\"vista-mutate-preview\"\n disabled={!run || !canRequest || state.pending !== undefined}\n fontSize={1}\n loading={state.pending === 'preview'}\n mode=\"ghost\"\n onClick={() => run && void mutate.preview(client, run)}\n padding={2}\n text={t('vista.mutate.preview')}\n />\n <Button\n data-testid=\"vista-mutate-apply\"\n disabled={!canApply}\n fontSize={1}\n loading={state.pending === 'apply'}\n onClick={() => void applyPreviewed()}\n padding={2}\n text={t('vista.mutate.apply', {dataset})}\n tone=\"critical\"\n />\n {run && !previewIsCurrent && (\n <Text muted size={1}>\n {t('vista.mutate.apply-needs-preview')}\n </Text>\n )}\n </Flex>\n </Stack>\n </Box>","<Flex data-testid=\"vista-mutate\" flexDirection=\"column\" height=\"100%\">\n {/* Scrolls only in a drawer too short for the least room the editor takes */}\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n padding={3}\n >\n <Text muted size={1}>\n {t('vista.mutate.description')}\n </Text>\n {generatorOpen && (\n <GenerateMutationsBar\n client={client}\n dataset={dataset}\n mutationOptions={options}\n onClose={() => setGeneratorOpen(false)}\n onGenerated={(text, preview) => {\n mutate.showGenerated(text, preview)\n setGeneratorOpen(false)\n }}\n onOpenAttempt={(text) => {\n mutate.setText(text)\n setGeneratorOpen(false)\n }}\n result={result}\n />\n )}\n {/* What a dry run or an apply returned is as tall as it needs up to half the room, its\n changes scrolling past that; the editor takes the rest */}\n <Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows={\n hasOutcome ? 'minmax(140px, 1fr) fit-content(50%)' : 'minmax(140px, 1fr)'\n }\n minHeight=\"280px\"\n >\n <Flex flexDirection=\"column\" gap={2} minHeight=\"0\">\n <JsonEditor\n actions={\n <Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>\n }\n label={t('vista.mutate.mutations')}\n onChange={mutate.setText}\n testId=\"vista-mutate-editor\"\n value={state.text}\n />\n {input.status === 'invalid-json' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-json', {message: input.message})}\n </Text>\n )}\n {input.status === 'not-a-list' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.not-a-list')}\n </Text>\n )}\n {input.status === 'invalid-mutation' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-mutation', {index: input.index})}\n </Text>\n )}\n </Flex>\n {hasOutcome && (\n <Flex\n data-testid=\"vista-mutate-outcome\"\n flexDirection=\"column\"\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n {state.failure && (\n <Card\n border\n data-testid=\"vista-mutate-failure\"\n padding={3}\n radius={2}\n tone=\"critical\"\n >\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {state.failure.action === 'preview'\n ? t('vista.mutate.preview-failed')\n : t('vista.mutate.apply-failed')}\n </Text>\n <Text size={1}>{state.failure.failure.message}</Text>\n {state.failure.failure.items.map((item) => (\n <Text key={`${item.index}:${item.message}`} size={1}>\n {t('vista.mutate.failure-item', {\n index: item.index,\n message: item.message,\n })}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {state.applied && (\n <Card\n border\n data-testid=\"vista-mutate-applied\"\n padding={3}\n radius={2}\n tone=\"positive\"\n >\n <Text size={1}>\n {t('vista.mutate.applied', {\n dataset: state.applied.dataset,\n transactionId: state.applied.transactionId,\n count: state.applied.documentCount,\n })}\n </Text>\n </Card>\n )}\n {state.preview && (\n <PreviewResult\n hiddenFields={hiddenFields}\n preview={state.preview.result}\n stale={!previewIsCurrent}\n />\n )}\n </Flex>\n )}\n </Grid>\n </Flex>\n <Box borderTop flexShrink={0} padding={3}>\n <Stack gap={4}>\n <SwitchField\n checked={state.autoGenerateArrayKeys}\n description={t('vista.mutate.auto-keys.description')}\n onChange={mutate.setAutoGenerateArrayKeys}\n testId=\"vista-mutate-auto-keys\"\n title={t('vista.mutate.auto-keys')}\n />\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Button\n data-testid=\"vista-mutate-preview\"\n disabled={!run || !canRequest || state.pending !== undefined}\n fontSize={1}\n loading={state.pending === 'preview'}\n mode=\"ghost\"\n onClick={() => run && void mutate.preview(client, run)}\n padding={2}\n text={t('vista.mutate.preview')}\n />\n <Button\n data-testid=\"vista-mutate-apply\"\n disabled={!canApply}\n fontSize={1}\n loading={state.pending === 'apply'}\n onClick={() => void applyPreviewed()}\n padding={2}\n text={t('vista.mutate.apply', {dataset})}\n tone=\"critical\"\n />\n {run && !previewIsCurrent && (\n <Text muted size={1}>\n {t('vista.mutate.apply-needs-preview')}\n </Text>\n )}\n </Flex>\n </Stack>\n </Box>\n </Flex>","_c","_temp","_temp2","unknownOperation","_temp3","_temp4","styles.drawerScroller","_temp5","previewChanges","CONTINENTS","{you, api, reachedApi}: NetworkGlobeProps","() => {\n const container = containerRef.current\n if (!container || (!you && !api)) return undefined\n const canvas = document.createElement('canvas')\n canvas.style.width = `${SIZE}px`\n canvas.style.height = `${SIZE}px`\n container.append(canvas)\n let cancelled = false\n let destroy: (() => void) | undefined\n // Drawn at twice the size at least, so the map's dots stay visible this small\n const devicePixelRatio = Math.max(window.devicePixelRatio || 1, 2)\n const focus = you && api ? midpoint(you, api) : (you ?? api)\n const markers: Marker[] = []\n if (you) markers.push({location: [you.latitude, you.longitude], size: 0.06, color: YOU_COLOR})\n if (api) markers.push({location: [api.latitude, api.longitude], size: 0.08})\n void loadCobe()\n .then(({default: createGlobe}) => {\n if (cancelled || !focus) return\n const from = facing(you ?? focus)\n const to = facing(focus)\n const options: COBEOptions = {\n // cobe sizes the canvas in device pixels from these\n width: SIZE,\n height: SIZE,\n devicePixelRatio,\n ...from,\n ...(dark ? DARK_GLOBE : LIGHT_GLOBE),\n mapSamples: MAP_SAMPLES,\n markerColor: API_COLOR,\n markers,\n arcs:\n you && api && reachedApi\n ? [{from: [you.latitude, you.longitude], to: [api.latitude, api.longitude]}]\n : [],\n arcColor: API_COLOR,\n arcWidth: 0.8,\n arcHeight: 0.3,\n }\n try {\n enlargeDots(canvas)\n const globe = createGlobe(canvas, options)\n // The globe turns from you to the way the query took, and stops: drawing for a moment\n // also picks up the map texture, which cobe loads after the first frame\n const reduceMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n const started = performance.now()\n let frame = 0\n const draw = (now: number) => {\n const progress = Math.min((now - started) / SETTLE_MS, 1)\n const eased = reduceMotion ? 1 : 1 - (1 - progress) ** 3\n globe.update({\n phi: from.phi + (to.phi - from.phi) * eased,\n theta: from.theta + (to.theta - from.theta) * eased,\n })\n if (progress < 1) frame = requestAnimationFrame(draw)\n }\n frame = requestAnimationFrame(draw)\n destroy = () => {\n cancelAnimationFrame(frame)\n globe.destroy()\n }\n } catch {\n // No WebGL: the globe stays blank\n }\n })\n .catch(() => undefined)\n return () => {\n cancelled = true\n destroy?.()\n container.replaceChildren()\n }\n }","[api, dark, reachedApi, you]","{default: createGlobe}","() => undefined","<div\n aria-hidden\n data-testid=\"vista-network-globe\"\n ref={containerRef}\n style={{width: SIZE, height: SIZE, flexShrink: 0}}\n />","_c","useThemeV2","_temp","{label, children}: {label: string; children: ReactNode}","<Text muted size={1}>\n {label}\n </Text>","<Box minWidth=\"0\">{children}</Box>","<>\n <Text muted size={1}>\n {label}\n </Text>\n <Box minWidth=\"0\">{children}</Box>\n </>","{meta, resolved, perspectiveName}: NetworkTabProps","browserLocation()","useMemo(() => browserLocation(), [])","regionOfShard(network?.shard)","network?.shard","useMemo(() => regionOfShard(network?.shard), [network?.shard])","t('vista.network.empty')","<Box padding={3}>\n <Text muted size={1}>\n {t('vista.network.empty')}\n </Text>\n </Box>","network ? network.viaCdn : isCdnUrl(meta.url)","url","t('vista.network.cache.none')","cacheHit ? t('vista.network.cache.hit') : t('vista.network.cache.miss')","!viaCdn && !resolved.useCdn && !resolved.isCdnBlockedByPerspective\n ? t('vista.network.use-cdn-hint')\n : undefined","isCdnBlockedByPerspective","useCdn","<NetworkGlobe api={region} reachedApi={!cacheHit} you={you} />","!cacheHit","t('vista.network.you')","<Badge fontSize={0} tone=\"primary\">\n {t('vista.network.you')}\n </Badge>","region && (\n <Badge fontSize={0} tone=\"caution\">\n {region.id}\n </Badge>\n )","<Flex alignItems=\"center\" gap={2} justifyContent=\"center\">\n <Badge fontSize={0} tone=\"primary\">\n {t('vista.network.you')}\n </Badge>\n {region && (\n <Badge fontSize={0} tone=\"caution\">\n {region.id}\n </Badge>\n )}\n </Flex>","<Stack gap={2}>\n <NetworkGlobe api={region} reachedApi={!cacheHit} you={you} />\n <Flex alignItems=\"center\" gap={2} justifyContent=\"center\">\n <Badge fontSize={0} tone=\"primary\">\n {t('vista.network.you')}\n </Badge>\n {region && (\n <Badge fontSize={0} tone=\"caution\">\n {region.id}\n </Badge>\n )}\n </Flex>\n </Stack>","t('vista.network.endpoint')","viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')","<Text data-testid=\"vista-network-endpoint\" size={1} weight=\"medium\">\n {viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')}\n </Text>","<Row label={t('vista.network.endpoint')}>\n <Text data-testid=\"vista-network-endpoint\" size={1} weight=\"medium\">\n {viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')}\n </Text>\n </Row>","t('vista.network.cache')","<Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>","network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )","network?.cacheControl","<Stack gap={2}>\n <Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>\n {network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )}\n </Stack>","<Row label={t('vista.network.cache')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>\n {network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )}\n </Stack>\n </Row>","t('vista.network.region')","region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))","shard","<Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>","region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )","<Stack gap={2}>\n <Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>\n {region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )}\n </Stack>","<Row label={t('vista.network.region')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>\n {region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )}\n </Stack>\n </Row>","t('vista.network.timing')","t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})","e2eMs","ms","<Text size={1}>\n {t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})}\n </Text>","<Row label={t('vista.network.timing')}>\n <Text size={1}>\n {t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})}\n </Text>\n </Row>","network?.traceId && (\n <Row label={t('vista.network.trace')}>\n <Text size={1} textOverflow=\"ellipsis\">\n <code>{network.traceId}</code>\n </Text>\n </Row>\n )","network?.traceId","<Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <Row label={t('vista.network.endpoint')}>\n <Text data-testid=\"vista-network-endpoint\" size={1} weight=\"medium\">\n {viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')}\n </Text>\n </Row>\n <Row label={t('vista.network.cache')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>\n {network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.region')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>\n {region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.timing')}>\n <Text size={1}>\n {t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})}\n </Text>\n </Row>\n {network?.traceId && (\n <Row label={t('vista.network.trace')}>\n <Text size={1} textOverflow=\"ellipsis\">\n <code>{network.traceId}</code>\n </Text>\n </Row>\n )}\n </Grid>","cacheHit && (\n <Text muted size={1}>\n {t('vista.network.cache.hit-explained')}\n </Text>\n )","hint && (\n <Text data-testid=\"vista-network-hint\" muted size={1}>\n {hint}\n </Text>\n )","resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n perspectiveName={perspectiveName}\n testId=\"vista-network-cdn-blocked\"\n />\n )","<Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Stack gap={4}>\n <Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <Row label={t('vista.network.endpoint')}>\n <Text data-testid=\"vista-network-endpoint\" size={1} weight=\"medium\">\n {viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')}\n </Text>\n </Row>\n <Row label={t('vista.network.cache')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>\n {network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.region')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>\n {region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.timing')}>\n <Text size={1}>\n {t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})}\n </Text>\n </Row>\n {network?.traceId && (\n <Row label={t('vista.network.trace')}>\n <Text size={1} textOverflow=\"ellipsis\">\n <code>{network.traceId}</code>\n </Text>\n </Row>\n )}\n </Grid>\n {cacheHit && (\n <Text muted size={1}>\n {t('vista.network.cache.hit-explained')}\n </Text>\n )}\n {hint && (\n <Text data-testid=\"vista-network-hint\" muted size={1}>\n {hint}\n </Text>\n )}\n {resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n perspectiveName={perspectiveName}\n testId=\"vista-network-cdn-blocked\"\n />\n )}\n </Stack>\n </Box>","<Box data-testid=\"vista-network\" padding={3}>\n <Flex alignItems=\"flex-start\" flexWrap=\"wrap\" gap={4}>\n <Stack gap={2}>\n <NetworkGlobe api={region} reachedApi={!cacheHit} you={you} />\n <Flex alignItems=\"center\" gap={2} justifyContent=\"center\">\n <Badge fontSize={0} tone=\"primary\">\n {t('vista.network.you')}\n </Badge>\n {region && (\n <Badge fontSize={0} tone=\"caution\">\n {region.id}\n </Badge>\n )}\n </Flex>\n </Stack>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Stack gap={4}>\n <Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <Row label={t('vista.network.endpoint')}>\n <Text data-testid=\"vista-network-endpoint\" size={1} weight=\"medium\">\n {viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')}\n </Text>\n </Row>\n <Row label={t('vista.network.cache')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>\n {network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.region')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>\n {region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.timing')}>\n <Text size={1}>\n {t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})}\n </Text>\n </Row>\n {network?.traceId && (\n <Row label={t('vista.network.trace')}>\n <Text size={1} textOverflow=\"ellipsis\">\n <code>{network.traceId}</code>\n </Text>\n </Row>\n )}\n </Grid>\n {cacheHit && (\n <Text muted size={1}>\n {t('vista.network.cache.hit-explained')}\n </Text>\n )}\n {hint && (\n <Text data-testid=\"vista-network-hint\" muted size={1}>\n {hint}\n </Text>\n )}\n {resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n perspectiveName={perspectiveName}\n testId=\"vista-network-cdn-blocked\"\n />\n )}\n </Stack>\n </Box>\n </Flex>\n </Box>","_c","_Fragment","{label, children}: {label: string; children: ReactNode}","<Text muted size={1}>\n {label}\n </Text>","<Box>{children}</Box>","<>\n <Text muted size={1}>\n {label}\n </Text>\n <Box>{children}</Box>\n </>","{meta, url}: ResponseMetaTabProps","t('result.timing-not-applicable')","t('vista.response.empty')","<Box padding={3}>\n <Text muted size={1}>\n {t('vista.response.empty')}\n </Text>\n </Box>","t('result.execution-time-label')","<Text data-testid=\"vista-meta-execution\" size={1}>\n {meta ? `${meta.ms}ms` : notApplicable}\n </Text>","meta ? `${meta.ms}ms` : notApplicable","<MetaRow label={t('result.execution-time-label')}>\n <Text data-testid=\"vista-meta-execution\" size={1}>\n {meta ? `${meta.ms}ms` : notApplicable}\n </Text>\n </MetaRow>","t('result.end-to-end-time-label')","<Text data-testid=\"vista-meta-e2e\" size={1}>\n {meta ? `${meta.e2eMs}ms` : notApplicable}\n </Text>","meta ? `${meta.e2eMs}ms` : notApplicable","<MetaRow label={t('result.end-to-end-time-label')}>\n <Text data-testid=\"vista-meta-e2e\" size={1}>\n {meta ? `${meta.e2eMs}ms` : notApplicable}\n </Text>\n </MetaRow>","t('vista.response.payload-size')","meta ? formatBytes(meta.payloadBytes) : notApplicable","<Text data-testid=\"vista-meta-payload\" size={1}>\n {meta ? formatBytes(meta.payloadBytes) : notApplicable}\n </Text>","<MetaRow label={t('vista.response.payload-size')}>\n <Text data-testid=\"vista-meta-payload\" size={1}>\n {meta ? formatBytes(meta.payloadBytes) : notApplicable}\n </Text>\n </MetaRow>","t('vista.response.sync-tags')","meta && meta.syncTags.length > 0 ? (\n <Flex data-testid=\"vista-meta-sync-tags\" flexWrap=\"wrap\" gap={1}>\n {sortSyncTags(meta.syncTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text muted size={1}>\n {meta ? t('vista.response.sync-tags.none') : notApplicable}\n </Text>\n )","(tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n )","<MetaRow label={t('vista.response.sync-tags')}>\n {meta && meta.syncTags.length > 0 ? (\n <Flex data-testid=\"vista-meta-sync-tags\" flexWrap=\"wrap\" gap={1}>\n {sortSyncTags(meta.syncTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text muted size={1}>\n {meta ? t('vista.response.sync-tags.none') : notApplicable}\n </Text>\n )}\n </MetaRow>","<Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <MetaRow label={t('result.execution-time-label')}>\n <Text data-testid=\"vista-meta-execution\" size={1}>\n {meta ? `${meta.ms}ms` : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('result.end-to-end-time-label')}>\n <Text data-testid=\"vista-meta-e2e\" size={1}>\n {meta ? `${meta.e2eMs}ms` : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('vista.response.payload-size')}>\n <Text data-testid=\"vista-meta-payload\" size={1}>\n {meta ? formatBytes(meta.payloadBytes) : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('vista.response.sync-tags')}>\n {meta && meta.syncTags.length > 0 ? (\n <Flex data-testid=\"vista-meta-sync-tags\" flexWrap=\"wrap\" gap={1}>\n {sortSyncTags(meta.syncTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text muted size={1}>\n {meta ? t('vista.response.sync-tags.none') : notApplicable}\n </Text>\n )}\n </MetaRow>\n </Grid>","url && (\n <Stack gap={2}>\n <Text muted size={1}>\n {t('query.url')}\n </Text>\n <Flex gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n aria-label={t('query.url')}\n data-testid=\"vista-query-url\"\n fontSize={1}\n padding={2}\n readOnly\n type=\"url\"\n value={url}\n />\n </Box>\n <Tooltip\n animate\n content={<Text size={1}>{t('action.copy-url-to-clipboard')}</Text>}\n portal\n >\n <Button\n aria-label={t('action.copy-url-to-clipboard')}\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(url, t('action.copy-url-to-clipboard'))}\n padding={2}\n />\n </Tooltip>\n </Flex>\n </Stack>\n )","<Box data-testid=\"vista-response-meta\" padding={3}>\n <Stack gap={4}>\n <Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <MetaRow label={t('result.execution-time-label')}>\n <Text data-testid=\"vista-meta-execution\" size={1}>\n {meta ? `${meta.ms}ms` : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('result.end-to-end-time-label')}>\n <Text data-testid=\"vista-meta-e2e\" size={1}>\n {meta ? `${meta.e2eMs}ms` : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('vista.response.payload-size')}>\n <Text data-testid=\"vista-meta-payload\" size={1}>\n {meta ? formatBytes(meta.payloadBytes) : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('vista.response.sync-tags')}>\n {meta && meta.syncTags.length > 0 ? (\n <Flex data-testid=\"vista-meta-sync-tags\" flexWrap=\"wrap\" gap={1}>\n {sortSyncTags(meta.syncTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text muted size={1}>\n {meta ? t('vista.response.sync-tags.none') : notApplicable}\n </Text>\n )}\n </MetaRow>\n </Grid>\n\n {url && (\n <Stack gap={2}>\n <Text muted size={1}>\n {t('query.url')}\n </Text>\n <Flex gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n aria-label={t('query.url')}\n data-testid=\"vista-query-url\"\n fontSize={1}\n padding={2}\n readOnly\n type=\"url\"\n value={url}\n />\n </Box>\n <Tooltip\n animate\n content={<Text size={1}>{t('action.copy-url-to-clipboard')}</Text>}\n portal\n >\n <Button\n aria-label={t('action.copy-url-to-clipboard')}\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(url, t('action.copy-url-to-clipboard'))}\n padding={2}\n />\n </Tooltip>\n </Flex>\n </Stack>\n )}\n </Stack>\n </Box>","_c","_Fragment","_temp","printObject","{\n tab,\n format,\n result,\n hasResult,\n resultIsCurrent,\n onClose,\n}: ExportTypesDialogProps","useMemo(() => {\n const params = parseParams(tab.rawParams, t)\n const evaluation = evaluateQueryType({\n query: tab.query,\n params: params.parsed || {},\n schema,\n hasResult: hasResult && resultIsCurrent,\n result,\n })\n if (evaluation.source === 'none') {\n return {source: evaluation.source, code: undefined, schemaError: evaluation.schemaError}\n }\n const typeName = toResultTypeName(tab.query)\n const code =\n format === 'typescript'\n ? printTypeScript(evaluation.node, {typeName, schema: evaluation.schema})\n : printZod(evaluation.node, {typeName, schema: evaluation.schema})\n return {\n source: evaluation.source,\n code,\n schemaError: evaluation.source === 'result' ? evaluation.schemaError : undefined,\n }\n }, [format, hasResult, result, resultIsCurrent, schema, t, tab.query, tab.rawParams])","query","rawParams","{\n source: evaluation.source,\n code,\n schemaError: evaluation.source === 'result' ? evaluation.schemaError : undefined,\n }","evaluation.source","evaluation.source === 'result' ? evaluation.schemaError : undefined","output.source === 'schema'\n ? t('vista.export-types.source.schema')\n : output.source === 'result'\n ? t('vista.export-types.source.result')\n : hasResult\n ? t('vista.export-types.stale-result')\n : t('vista.export-types.empty')","source","format === 'typescript'\n ? t('vista.export-types.title-typescript')\n : t('vista.export-types.title-zod')","<Text data-testid=\"vista-export-types-source\" muted size={1}>\n {sourceNote}\n </Text>","output.schemaError && (\n <Card border padding={3} radius={2} tone=\"caution\">\n <Text data-testid=\"vista-export-types-schema-error\" size={1}>\n {t('vista.export-types.schema-error', {message: output.schemaError.message})}\n </Text>\n </Card>\n )","schemaError","output.code && (\n <>\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code data-testid=\"vista-export-types-code\" language=\"typescript\" size={1}>\n {output.code}\n </Code>\n </Card>\n <Flex justifyContent=\"flex-end\">\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(output.code, t('vista.export-types.copied'))}\n text={t('vista.export-types.copy')}\n />\n </Flex>\n </>\n )","code","<Box padding={4}>\n <Stack gap={4}>\n <Text data-testid=\"vista-export-types-source\" muted size={1}>\n {sourceNote}\n </Text>\n {output.schemaError && (\n <Card border padding={3} radius={2} tone=\"caution\">\n <Text data-testid=\"vista-export-types-schema-error\" size={1}>\n {t('vista.export-types.schema-error', {message: output.schemaError.message})}\n </Text>\n </Card>\n )}\n {output.code && (\n <>\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code data-testid=\"vista-export-types-code\" language=\"typescript\" size={1}>\n {output.code}\n </Code>\n </Card>\n <Flex justifyContent=\"flex-end\">\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(output.code, t('vista.export-types.copied'))}\n text={t('vista.export-types.copy')}\n />\n </Flex>\n </>\n )}\n </Stack>\n </Box>","<Dialog\n animate\n data-testid=\"vista-export-types-dialog\"\n header={\n format === 'typescript'\n ? t('vista.export-types.title-typescript')\n : t('vista.export-types.title-zod')\n }\n id=\"vista-export-types-dialog\"\n onClickOutside={onClose}\n onClose={onClose}\n width={2}\n >\n <Box padding={4}>\n <Stack gap={4}>\n <Text data-testid=\"vista-export-types-source\" muted size={1}>\n {sourceNote}\n </Text>\n {output.schemaError && (\n <Card border padding={3} radius={2} tone=\"caution\">\n <Text data-testid=\"vista-export-types-schema-error\" size={1}>\n {t('vista.export-types.schema-error', {message: output.schemaError.message})}\n </Text>\n </Card>\n )}\n {output.code && (\n <>\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code data-testid=\"vista-export-types-code\" language=\"typescript\" size={1}>\n {output.code}\n </Code>\n </Card>\n <Flex justifyContent=\"flex-end\">\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(output.code, t('vista.export-types.copied'))}\n text={t('vista.export-types.copy')}\n />\n </Flex>\n </>\n )}\n </Stack>\n </Box>\n </Dialog>","_c","_Fragment","{\n tab,\n result,\n hasResult,\n resultIsCurrent,\n}: ResultActionsMenuProps","t('vista.result.actions')","<Button\n aria-label={t('vista.result.actions')}\n data-testid=\"vista-result-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />","() =>\n void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))","t('vista.result.copy')","<MenuItem\n disabled={!hasResult}\n icon={CopyIcon}\n onClick={() =>\n void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))\n }\n text={t('vista.result.copy')}\n />","!hasResult","<MenuDivider />","() => setExportFormat('typescript')","t('vista.result.export-typescript')","<MenuItem\n data-testid=\"vista-export-typescript\"\n icon={CodeIcon}\n onClick={() => setExportFormat('typescript')}\n text={t('vista.result.export-typescript')}\n />","() => setExportFormat('zod')","t('vista.result.export-zod')","<MenuItem\n data-testid=\"vista-export-zod\"\n icon={PackageIcon}\n onClick={() => setExportFormat('zod')}\n text={t('vista.result.export-zod')}\n />","<Menu>\n <MenuItem\n disabled={!hasResult}\n icon={CopyIcon}\n onClick={() =>\n void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))\n }\n text={t('vista.result.copy')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-typescript\"\n icon={CodeIcon}\n onClick={() => setExportFormat('typescript')}\n text={t('vista.result.export-typescript')}\n />\n <MenuItem\n data-testid=\"vista-export-zod\"\n icon={PackageIcon}\n onClick={() => setExportFormat('zod')}\n text={t('vista.result.export-zod')}\n />\n </Menu>","{animate: true, portal: true, placement: 'top-end'}","<MenuButton\n button={\n <Button\n aria-label={t('vista.result.actions')}\n data-testid=\"vista-result-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />\n }\n id={`vista-result-menu-${tab.id}`}\n menu={\n <Menu>\n <MenuItem\n disabled={!hasResult}\n icon={CopyIcon}\n onClick={() =>\n void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))\n }\n text={t('vista.result.copy')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-typescript\"\n icon={CodeIcon}\n onClick={() => setExportFormat('typescript')}\n text={t('vista.result.export-typescript')}\n />\n <MenuItem\n data-testid=\"vista-export-zod\"\n icon={PackageIcon}\n onClick={() => setExportFormat('zod')}\n text={t('vista.result.export-zod')}\n />\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'top-end'}}\n />","`vista-result-menu-${tab.id}`","exportFormat && (\n <ExportTypesDialog\n format={exportFormat}\n hasResult={hasResult}\n onClose={() => setExportFormat(null)}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n )","<>\n <MenuButton\n button={\n <Button\n aria-label={t('vista.result.actions')}\n data-testid=\"vista-result-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />\n }\n id={`vista-result-menu-${tab.id}`}\n menu={\n <Menu>\n <MenuItem\n disabled={!hasResult}\n icon={CopyIcon}\n onClick={() =>\n void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))\n }\n text={t('vista.result.copy')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-typescript\"\n icon={CodeIcon}\n onClick={() => setExportFormat('typescript')}\n text={t('vista.result.export-typescript')}\n />\n <MenuItem\n data-testid=\"vista-export-zod\"\n icon={PackageIcon}\n onClick={() => setExportFormat('zod')}\n text={t('vista.result.export-zod')}\n />\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'top-end'}}\n />\n {exportFormat && (\n <ExportTypesDialog\n format={exportFormat}\n hasResult={hasResult}\n onClose={() => setExportFormat(null)}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n )}\n </>","_c","_Fragment","unhandled","{row}: {row: GraphRow}","row.key && <span className={styles.graphRowKey}>{row.key}</span>","key","<span className={styles.graphRowValue} data-type={row.type}>\n {row.text}\n </span>","text","type","<>\n {row.key && <span className={styles.graphRowKey}>{row.key}</span>}\n <span className={styles.graphRowValue} data-type={row.type}>\n {row.text}\n </span>\n </>","<span className={styles.graphRowKey}>{row.key}</span>","<span className={styles.graphRowValue} data-type=\"child\">\n {row.summary}\n </span>","summary","row.child !== undefined && <span className={styles.graphRowPort} />","child","<>\n <span className={styles.graphRowKey}>{row.key}</span>\n <span className={styles.graphRowValue} data-type=\"child\">\n {row.summary}\n </span>\n {row.child !== undefined && <span className={styles.graphRowPort} />}\n </>","t('vista.result.graph.more', {count: row.count})","count","<span className={styles.graphRowValue} data-type=\"more\">\n {t('vista.result.graph.more', {count: row.count})}\n </span>","{layout, copyLabel, onToggle, onCopy}: GraphNodesProps","layout.edges.map((edge) => (\n <path d={edge.path} key={`${edge.from}>${edge.to}`} />\n ))","edges","(edge) => (\n <path d={edge.path} key={`${edge.from}>${edge.to}`} />\n )","<svg\n className={styles.graphEdges}\n data-testid=\"vista-graph-edges\"\n height={layout.height}\n width={layout.width}\n >\n {layout.edges.map((edge) => (\n <path d={edge.path} key={`${edge.from}>${edge.to}`} />\n ))}\n </svg>","height","width","layout.height","layout.width","layout.nodes.map(({node, x, y, width, height, collapsed, childCount}) => {\n const title = node.label ?? t('vista.result.graph.root')\n return (\n <div\n aria-label={`${title} ${node.summary}`}\n className={styles.graphNode}\n data-testid=\"vista-graph-node\"\n data-keypath={node.id}\n key={node.id}\n role=\"group\"\n style={{left: x, top: y, width, height}}\n >\n <div className={styles.graphNodeHeader}>\n <span className={styles.graphNodeTitle}>\n {title}\n {node.summary && <span className={styles.graphNodeSummary}>{node.summary}</span>}\n </span>\n {childCount > 0 && (\n <button\n aria-expanded={!collapsed}\n aria-label={\n collapsed\n ? t('vista.result.graph.expand', {count: childCount})\n : t('vista.result.graph.collapse')\n }\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-toggle\"\n onClick={() => onToggle(node.id)}\n type=\"button\"\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronDownIcon />}\n {collapsed && childCount}\n </button>\n )}\n <button\n aria-label={copyLabel}\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-copy\"\n onClick={() => onCopy(node.id)}\n type=\"button\"\n >\n <CopyIcon />\n </button>\n </div>\n {node.rows.map((row, index) => (\n // Rows are positional: the edges leave from their index\n // oxlint-disable-next-line react/no-array-index-key -- a row is its place in the node\n <div className={styles.graphRow} key={index}>\n <RowContent row={row} />\n </div>\n ))}\n </div>\n )\n })","nodes","({node, x, y, width, height, collapsed, childCount}) => {\n const title = node.label ?? t('vista.result.graph.root')\n return (\n <div\n aria-label={`${title} ${node.summary}`}\n className={styles.graphNode}\n data-testid=\"vista-graph-node\"\n data-keypath={node.id}\n key={node.id}\n role=\"group\"\n style={{left: x, top: y, width, height}}\n >\n <div className={styles.graphNodeHeader}>\n <span className={styles.graphNodeTitle}>\n {title}\n {node.summary && <span className={styles.graphNodeSummary}>{node.summary}</span>}\n </span>\n {childCount > 0 && (\n <button\n aria-expanded={!collapsed}\n aria-label={\n collapsed\n ? t('vista.result.graph.expand', {count: childCount})\n : t('vista.result.graph.collapse')\n }\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-toggle\"\n onClick={() => onToggle(node.id)}\n type=\"button\"\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronDownIcon />}\n {collapsed && childCount}\n </button>\n )}\n <button\n aria-label={copyLabel}\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-copy\"\n onClick={() => onCopy(node.id)}\n type=\"button\"\n >\n <CopyIcon />\n </button>\n </div>\n {node.rows.map((row, index) => (\n // Rows are positional: the edges leave from their index\n // oxlint-disable-next-line react/no-array-index-key -- a row is its place in the node\n <div className={styles.graphRow} key={index}>\n <RowContent row={row} />\n </div>\n ))}\n </div>\n )\n }","{node, x, y, width, height, collapsed, childCount}","(row, index) => (\n // Rows are positional: the edges leave from their index\n // oxlint-disable-next-line react/no-array-index-key -- a row is its place in the node\n <div className={styles.graphRow} key={index}>\n <RowContent row={row} />\n </div>\n )","<>\n <svg\n className={styles.graphEdges}\n data-testid=\"vista-graph-edges\"\n height={layout.height}\n width={layout.width}\n >\n {layout.edges.map((edge) => (\n <path d={edge.path} key={`${edge.from}>${edge.to}`} />\n ))}\n </svg>\n {layout.nodes.map(({node, x, y, width, height, collapsed, childCount}) => {\n const title = node.label ?? t('vista.result.graph.root')\n return (\n <div\n aria-label={`${title} ${node.summary}`}\n className={styles.graphNode}\n data-testid=\"vista-graph-node\"\n data-keypath={node.id}\n key={node.id}\n role=\"group\"\n style={{left: x, top: y, width, height}}\n >\n <div className={styles.graphNodeHeader}>\n <span className={styles.graphNodeTitle}>\n {title}\n {node.summary && <span className={styles.graphNodeSummary}>{node.summary}</span>}\n </span>\n {childCount > 0 && (\n <button\n aria-expanded={!collapsed}\n aria-label={\n collapsed\n ? t('vista.result.graph.expand', {count: childCount})\n : t('vista.result.graph.collapse')\n }\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-toggle\"\n onClick={() => onToggle(node.id)}\n type=\"button\"\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronDownIcon />}\n {collapsed && childCount}\n </button>\n )}\n <button\n aria-label={copyLabel}\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-copy\"\n onClick={() => onCopy(node.id)}\n type=\"button\"\n >\n <CopyIcon />\n </button>\n </div>\n {node.rows.map((row, index) => (\n // Rows are positional: the edges leave from their index\n // oxlint-disable-next-line react/no-array-index-key -- a row is its place in the node\n <div className={styles.graphRow} key={index}>\n <RowContent row={row} />\n </div>\n ))}\n </div>\n )\n })}\n </>","{id, value, copy}: ResultGraphProps","buildResultGraph(value)","useMemo(() => buildResultGraph(value), [value])","describeLeftOut(graph, t)","() => new Set()","layoutResultGraph(graph, {collapsed, charWidth})","useMemo(\n () => layoutResultGraph(graph, {collapsed, charWidth}),\n [charWidth, collapsed, graph],\n )","moved && moved.graph === graph ? moved.view : size ? firstView(layout, size) : null","(next: View) => setMoved({graph, view: next})","(factor: number) => {\n if (!view || !size) return\n setView(zoomAt(view, factor, size.width / 2, size.height / 2))\n }","() => {\n if (size) setView(fitView(layout, size))\n }","(event: WheelEvent) => {\n if (!view || !viewport) return\n event.preventDefault()\n const bounds = viewport.getBoundingClientRect()\n setView(\n zoomAt(\n view,\n Math.exp(-event.deltaY * 0.0015),\n event.clientX - bounds.left,\n event.clientY - bounds.top,\n ),\n )\n }","() => {\n if (!viewport) return undefined\n // Not passive, so scrolling over the graph zooms it instead of scrolling the page\n const listener = (event: WheelEvent) => onWheel(event)\n viewport.addEventListener('wheel', listener, {passive: false})\n return () => viewport.removeEventListener('wheel', listener)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","event","[viewport]","(event: PointerEvent<HTMLDivElement>) => {\n if (!view || event.button !== 0) return\n if (event.target instanceof Element && event.target.closest('button')) return\n event.currentTarget.setPointerCapture?.(event.pointerId)\n drag.current = {pointerId: event.pointerId, x: event.clientX, y: event.clientY, view}\n setDragging(true)\n }","(event: PointerEvent<HTMLDivElement>) => {\n const start = drag.current\n if (!start || start.pointerId !== event.pointerId) return\n setView({\n ...start.view,\n x: start.view.x + event.clientX - start.x,\n y: start.view.y + event.clientY - start.y,\n })\n }","(event: PointerEvent<HTMLDivElement>) => {\n if (drag.current?.pointerId !== event.pointerId) return\n drag.current = null\n setDragging(false)\n }","(event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget || !view) return\n const pans: Record<string, [number, number]> = {\n ArrowLeft: [PAN_STEP, 0],\n ArrowRight: [-PAN_STEP, 0],\n ArrowUp: [0, PAN_STEP],\n ArrowDown: [0, -PAN_STEP],\n }\n if (event.key in pans) {\n const [dx, dy] = pans[event.key]\n setView({...view, x: view.x + dx, y: view.y + dy})\n } else if (event.key === '+' || event.key === '=') zoomBy(ZOOM_STEP)\n else if (event.key === '-') zoomBy(1 / ZOOM_STEP)\n else if (event.key === '0') fit()\n else return\n event.preventDefault()\n }","(nodeId: string) => {\n setCollapsed((current) => {\n const next = new Set(current)\n if (!next.delete(nodeId)) next.add(nodeId)\n return next\n })\n }","next","useCallback((nodeId: string) => {\n setCollapsed((current) => {\n const next = new Set(current)\n if (!next.delete(nodeId)) next.add(nodeId)\n return next\n })\n }, [])","(nodeId: string) => {\n const found = getAtKeypath(value, nodeId)\n if (found) copy.onCopy(found.value, nodeId)\n }","nodeId","useCallback(\n (nodeId: string) => {\n const found = getAtKeypath(value, nodeId)\n if (found) copy.onCopy(found.value, nodeId)\n },\n [copy, value],\n )","t('vista.result.graph.zoom-out')","() => zoomBy(1 / ZOOM_STEP)","{\n action: 'zoom-out',\n label: t('vista.result.graph.zoom-out'),\n icon: RemoveIcon,\n onClick: () => zoomBy(1 / ZOOM_STEP),\n }","t('vista.result.graph.zoom-in')","() => zoomBy(ZOOM_STEP)","{\n action: 'zoom-in',\n label: t('vista.result.graph.zoom-in'),\n icon: AddIcon,\n onClick: () => zoomBy(ZOOM_STEP),\n }","t('vista.result.graph.fit')","{action: 'fit', label: t('vista.result.graph.fit'), icon: ExpandIcon, onClick: fit}","[\n {\n action: 'zoom-out',\n label: t('vista.result.graph.zoom-out'),\n icon: RemoveIcon,\n onClick: () => zoomBy(1 / ZOOM_STEP),\n },\n {\n action: 'zoom-in',\n label: t('vista.result.graph.zoom-in'),\n icon: AddIcon,\n onClick: () => zoomBy(ZOOM_STEP),\n },\n {action: 'fit', label: t('vista.result.graph.fit'), icon: ExpandIcon, onClick: fit},\n ]","{\n '--vision-graph-code-family': font.code.family,\n '--vision-graph-code-size': `${codeSize.fontSize}px`,\n '--vision-graph-property': color.syntax.property,\n '--vision-graph-string': color.syntax.string,\n '--vision-graph-number': color.syntax.number,\n '--vision-graph-boolean': color.syntax.boolean,\n '--vision-graph-constant': color.syntax.constant,\n '--vision-graph-header-height': `${GRAPH_METRICS.headerHeight}px`,\n '--vision-graph-row-height': `${GRAPH_METRICS.rowHeight}px`,\n '--vision-graph-padding-x': `${GRAPH_METRICS.paddingX}px`,\n }","boolean","constant","number","property","string","family","`${codeSize.fontSize}px`","t('vista.result.graph.label')","view && (\n <div\n className={styles.graphCanvas}\n data-testid=\"vista-graph-canvas\"\n style={{\n width: layout.width,\n height: layout.height,\n transform: `translate(${view.x}px, ${view.y}px) scale(${view.scale})`,\n }}\n >\n <GraphNodesMemo\n copyLabel={copy.label}\n layout={layout}\n onCopy={onCopy}\n onToggle={onToggle}\n />\n </div>\n )","copy.label","leftOut && (\n <div className={styles.graphNotice} data-testid=\"vista-graph-left-out\">\n <Text muted size={1}>\n {leftOut}\n </Text>\n </div>\n )","<div className={styles.graphControls}>\n {controls.map(({action, label, icon, onClick}) => (\n <Tooltip\n animate\n content={<Text size={1}>{label}</Text>}\n key={action}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={label}\n data-testid={`vista-graph-${action}`}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n />\n </Tooltip>\n ))}\n </div>","({action, label, icon, onClick}) => (\n <Tooltip\n animate\n content={<Text size={1}>{label}</Text>}\n key={action}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={label}\n data-testid={`vista-graph-${action}`}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n />\n </Tooltip>\n )","<div\n aria-label={t('vista.result.graph.label')}\n className={styles.graphViewport}\n data-dragging={dragging}\n data-testid=\"vista-result-graph\"\n id={id}\n onKeyDown={onKeyDown}\n onLostPointerCapture={endDrag}\n onPointerCancel={endDrag}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n ref={setViewport}\n role=\"application\"\n style={viewportStyle}\n tabIndex={0}\n >\n {view && (\n <div\n className={styles.graphCanvas}\n data-testid=\"vista-graph-canvas\"\n style={{\n width: layout.width,\n height: layout.height,\n transform: `translate(${view.x}px, ${view.y}px) scale(${view.scale})`,\n }}\n >\n <GraphNodesMemo\n copyLabel={copy.label}\n layout={layout}\n onCopy={onCopy}\n onToggle={onToggle}\n />\n </div>\n )}\n {leftOut && (\n <div className={styles.graphNotice} data-testid=\"vista-graph-left-out\">\n <Text muted size={1}>\n {leftOut}\n </Text>\n </div>\n )}\n <div className={styles.graphControls}>\n {controls.map(({action, label, icon, onClick}) => (\n <Tooltip\n animate\n content={<Text size={1}>{label}</Text>}\n key={action}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={label}\n data-testid={`vista-graph-${action}`}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n />\n </Tooltip>\n ))}\n </div>\n </div>","{action, label, icon, onClick}","_c","styles.graphRowValue","_Fragment","styles.graphRowKey","unhandled","_temp","styles.graphEdges","styles.graphNode","styles.graphNodeHeader","styles.graphNodeTitle","styles.graphNodeButton","_temp2","styles.graphRow","useThemeV2","_temp3","styles.graphControls","_temp4","styles.graphViewport","JSON.stringify(props.value, null, 2) ?? 'null'","value","useMemo(() => JSON.stringify(props.value, null, 2) ?? 'null', [props.value])","() => {\n editorRef.current?.resetEditorContent(text)\n }","[text]","<VisionCodeMirror extensions={resultJsonExtensions} initialValue={text} ref={editorRef} />","<div className={styles.resultJson} data-testid=\"vista-result-json\" id={props.id}>\n <VisionCodeMirror extensions={resultJsonExtensions} initialValue={text} ref={editorRef} />\n </div>","id","_c","styles.resultJson","{meta, dataset}: SourceMapTabProps","t('vista.source-map.empty')","<Box padding={3}>\n <Text muted size={1}>\n {t('vista.source-map.empty')}\n </Text>\n </Box>","<Box data-testid=\"vista-source-map\" padding={3}>\n <ResultView data={meta.resultSourceMap} datasetName={dataset} />\n </Box>","resultSourceMap","_c","(snapshot) => snapshot.context.result","(snapshot) => snapshot.context.settledRequest","(snapshot) => snapshot.context.error","(snapshot) =>\n snapshot.matches({request: 'failed'}) ? snapshot.context.request : undefined","failedRequest?.client.config()","client","(snapshot) => snapshot.context.meta","(snapshot) => snapshot.context.meta?.url ?? snapshot.context.url","(snapshot) => snapshot.context.history","(snapshot) => snapshot.context.historyDiff.hiddenFields","(snapshot) => snapshot.matches({live: 'on'})","hasResult &&\n settledRequest !== undefined &&\n request !== null &&\n haveSameQuery(settledRequest, request)","settledRequest?.client.config().dataset || resolved.dataset","dataset","() => getJsonBlobUrl(result)","useCallback(() => getJsonBlobUrl(result), [result])","() => getCsvBlobUrl(result)","useCallback(() => getCsvBlobUrl(result), [result])","hasResult && canEncodeCsv(result)","() =>\n toast.push({\n closable: true,\n status: 'warning',\n title: t('result.save-result-as-csv.not-csv-encodable'),\n })","useCallback(\n () =>\n toast.push({\n closable: true,\n status: 'warning',\n title: t('result.save-result-as-csv.not-csv-encodable'),\n }),\n [t, toast],\n )","(fn: VistaSavedFunction) => actorRef.send({type: 'functions.save', fn})","useCallback(\n (fn: VistaSavedFunction) => actorRef.send({type: 'functions.save', fn}),\n [actorRef],\n )","(id: string) => actorRef.send({type: 'functions.remove', id})","useCallback(\n (id: string) => actorRef.send({type: 'functions.remove', id}),\n [actorRef],\n )","readQueryFunctions(parseGroq(tab.query), tab.query).declarations.filter(\n (declaration) => declaration.namespace !== undefined,\n )","query","(declaration) => declaration.namespace !== undefined","useMemo(\n () =>\n readQueryFunctions(parseGroq(tab.query), tab.query).declarations.filter(\n (declaration) => declaration.namespace !== undefined,\n ),\n [tab.query],\n )","(view: VistaResultView) => actorRef.send({type: 'result.view', view})","useCallback(\n (view: VistaResultView) => actorRef.send({type: 'result.view', view}),\n [actorRef],\n )","() => void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))","useCallback(\n () => void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied')),\n [copyToClipboard, result, t],\n )","t('vista.result.copy-value')","(value, keypath) =>\n void copyToClipboard(\n typeof value === 'string' ? value : JSON.stringify(value, null, 2),\n keypath\n ? t('vista.result.copied-value', {path: describeKeypath(keypath)})\n : t('vista.result.copied'),\n )","{\n label: t('vista.result.copy-value'),\n onCopy: (value, keypath) =>\n void copyToClipboard(\n typeof value === 'string' ? value : JSON.stringify(value, null, 2),\n keypath\n ? t('vista.result.copied-value', {path: describeKeypath(keypath)})\n : t('vista.result.copied'),\n ),\n }","useMemo(\n (): ResultViewCopy => ({\n label: t('vista.result.copy-value'),\n onCopy: (value, keypath) =>\n void copyToClipboard(\n typeof value === 'string' ? value : JSON.stringify(value, null, 2),\n keypath\n ? t('vista.result.copied-value', {path: describeKeypath(keypath)})\n : t('vista.result.copied'),\n ),\n }),\n [copyToClipboard, t],\n )","t('vista.panel.response')","<ResponseMetaTab meta={meta} url={url} />","{\n id: 'response',\n label: t('vista.panel.response'),\n content: <ResponseMetaTab meta={meta} url={url} />,\n }","t('vista.panel.network')","<NetworkTab meta={meta} perspectiveName={perspectiveName} resolved={resolved} />","{\n id: 'network',\n label: t('vista.panel.network'),\n content: <NetworkTab meta={meta} perspectiveName={perspectiveName} resolved={resolved} />,\n }","history.length > 0 ? (\n <Flex alignItems=\"center\" as=\"span\" gap={2}>\n {t('vista.panel.history')}\n <Badge fontSize={0}>{history.length}</Badge>\n </Flex>\n ) : (\n t('vista.panel.history')\n )","length","<HistoryTab hiddenFields={hiddenDiffFields} history={history} />","{\n id: 'history',\n label:\n history.length > 0 ? (\n <Flex alignItems=\"center\" as=\"span\" gap={2}>\n {t('vista.panel.history')}\n <Badge fontSize={0}>{history.length}</Badge>\n </Flex>\n ) : (\n t('vista.panel.history')\n ),\n content: <HistoryTab hiddenFields={hiddenDiffFields} history={history} />,\n }","t('vista.panel.explain')","() => void queryExplain.explain()","<ExplainTab\n canExplain={request !== null}\n client={resolved.client}\n explanation={queryExplain.explanation}\n onExplain={() => void queryExplain.explain()}\n onShowPlan={queryExplain.showPlan}\n plan={queryExplain.plan}\n />","explanation","plan","showPlan","request !== null","{\n id: 'explain',\n label: t('vista.panel.explain'),\n content: (\n <ExplainTab\n canExplain={request !== null}\n client={resolved.client}\n explanation={queryExplain.explanation}\n onExplain={() => void queryExplain.explain()}\n onShowPlan={queryExplain.showPlan}\n plan={queryExplain.plan}\n />\n ),\n }","t('vista.panel.source-map')","<SourceMapTab dataset={resultDataset} meta={meta} />","{\n id: 'source-map',\n label: t('vista.panel.source-map'),\n content: <SourceMapTab dataset={resultDataset} meta={meta} />,\n }","[\n {\n id: 'response',\n label: t('vista.panel.response'),\n content: <ResponseMetaTab meta={meta} url={url} />,\n },\n {\n id: 'network',\n label: t('vista.panel.network'),\n content: <NetworkTab meta={meta} perspectiveName={perspectiveName} resolved={resolved} />,\n },\n {\n id: 'history',\n label:\n history.length > 0 ? (\n <Flex alignItems=\"center\" as=\"span\" gap={2}>\n {t('vista.panel.history')}\n <Badge fontSize={0}>{history.length}</Badge>\n </Flex>\n ) : (\n t('vista.panel.history')\n ),\n content: <HistoryTab hiddenFields={hiddenDiffFields} history={history} />,\n },\n {\n id: 'explain',\n label: t('vista.panel.explain'),\n content: (\n <ExplainTab\n canExplain={request !== null}\n client={resolved.client}\n explanation={queryExplain.explanation}\n onExplain={() => void queryExplain.explain()}\n onShowPlan={queryExplain.showPlan}\n plan={queryExplain.plan}\n />\n ),\n },\n {\n id: 'source-map',\n label: t('vista.panel.source-map'),\n content: <SourceMapTab dataset={resultDataset} meta={meta} />,\n },\n ]","useMemo(\n (): CollapsiblePanelTab[] => [\n {\n id: 'response',\n label: t('vista.panel.response'),\n content: <ResponseMetaTab meta={meta} url={url} />,\n },\n {\n id: 'network',\n label: t('vista.panel.network'),\n content: <NetworkTab meta={meta} perspectiveName={perspectiveName} resolved={resolved} />,\n },\n {\n id: 'history',\n label:\n history.length > 0 ? (\n <Flex alignItems=\"center\" as=\"span\" gap={2}>\n {t('vista.panel.history')}\n <Badge fontSize={0}>{history.length}</Badge>\n </Flex>\n ) : (\n t('vista.panel.history')\n ),\n content: <HistoryTab hiddenFields={hiddenDiffFields} history={history} />,\n },\n {\n id: 'explain',\n label: t('vista.panel.explain'),\n content: (\n <ExplainTab\n canExplain={request !== null}\n client={resolved.client}\n explanation={queryExplain.explanation}\n onExplain={() => void queryExplain.explain()}\n onShowPlan={queryExplain.showPlan}\n plan={queryExplain.plan}\n />\n ),\n },\n {\n id: 'source-map',\n label: t('vista.panel.source-map'),\n content: <SourceMapTab dataset={resultDataset} meta={meta} />,\n },\n ],\n [\n hiddenDiffFields,\n history,\n meta,\n perspectiveName,\n queryExplain,\n request,\n resolved,\n resultDataset,\n t,\n url,\n ],\n )","(drawer: VistaTabDrawer): ReactNode => {\n switch (drawer) {\n case 'lint':\n return <LintTab findings={lintFindings} onReveal={onRevealRange} />\n case 'functions':\n return (\n <FunctionsTab\n declarations={declaredFunctions}\n library={functionLibrary}\n onEdit={onEditQuery}\n onRemove={removeFunction}\n onReveal={onRevealRange}\n onSave={saveFunction}\n query={tab.query}\n />\n )\n case 'delta':\n return <DeltaTab delta={delta} request={request} />\n case 'mutate':\n return (\n <MutateTab\n canRequest={resolved.isValidApiVersion}\n client={resolved.client}\n dataset={resolved.dataset}\n hiddenFields={hiddenDiffFields}\n mutate={mutate}\n onApplied={onMutationsApplied}\n result={hasResult ? result : undefined}\n />\n )\n default: {\n const unknownDrawer: never = drawer\n return String(unknownDrawer)\n }\n }\n }","isValidApiVersion","(finding) => finding.severity === 'error'","() => {\n sidebarBadges.set('lint', lintCount > 0 ? {count: lintCount, tone: lintTone} : undefined)\n sidebarBadges.set(\n 'functions',\n functionCount > 0 ? {count: functionCount, tone: 'default'} : undefined,\n )\n }","[functionCount, lintCount, lintTone, sidebarBadges]","() => () => {\n sidebarBadges.set('lint', undefined)\n sidebarBadges.set('functions', undefined)\n }","[sidebarBadges]","tabDrawer && <TabDrawerPortal>{renderTabDrawer(tabDrawer)}</TabDrawerPortal>","t('vista.result.export-json')","<DownloadButton\n download=\"query-result.json\"\n getBlobUrl={hasResult ? getJsonUrl : undefined}\n icon={JsonIcon}\n label={t('vista.result.export-json')}\n testId=\"vista-export-json\"\n />","hasResult ? getJsonUrl : undefined","t('vista.result.export-csv')","hasResult && !canExportCsv\n ? t('result.save-result-as-csv.not-csv-encodable')\n : undefined","<DownloadButton\n download=\"query-result.csv\"\n getBlobUrl={canExportCsv ? getCsvUrl : undefined}\n icon={DocumentSheetIcon}\n label={t('vista.result.export-csv')}\n onUnavailable={reportCsvUnavailable}\n testId=\"vista-export-csv\"\n tooltip={\n hasResult && !canExportCsv\n ? t('result.save-result-as-csv.not-csv-encodable')\n : undefined\n }\n />","canExportCsv ? getCsvUrl : undefined","<ResultActionsMenu\n hasResult={hasResult}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />","<ActionRail testId=\"vista-result-actions\">\n <DownloadButton\n download=\"query-result.json\"\n getBlobUrl={hasResult ? getJsonUrl : undefined}\n icon={JsonIcon}\n label={t('vista.result.export-json')}\n testId=\"vista-export-json\"\n />\n <DownloadButton\n download=\"query-result.csv\"\n getBlobUrl={canExportCsv ? getCsvUrl : undefined}\n icon={DocumentSheetIcon}\n label={t('vista.result.export-csv')}\n onUnavailable={reportCsvUnavailable}\n testId=\"vista-export-csv\"\n tooltip={\n hasResult && !canExportCsv\n ? t('result.save-result-as-csv.not-csv-encodable')\n : undefined\n }\n />\n <ResultActionsMenu\n hasResult={hasResult}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n </ActionRail>","t('result.label')","<Label muted size={1}>\n {t('result.label')}\n </Label>","isLive && (\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n )","<Box flexBasis=\"0%\" flexGrow={1} />","hasResult && (\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n <TabList aria-label={t('vista.result.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-tree\"\n label={t('vista.result.view.tree')}\n onClick={() => setResultView('tree')}\n padding={2}\n selected={resultView === 'tree'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-json\"\n label={t('vista.result.view.json')}\n onClick={() => setResultView('json')}\n padding={2}\n selected={resultView === 'json'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-graph\"\n label={t('vista.result.view.graph')}\n onClick={() => setResultView('graph')}\n padding={2}\n selected={resultView === 'graph'}\n />\n </TabList>\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.result.copy')}</Text>}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={t('vista.result.copy')}\n data-testid=\"vista-copy-result\"\n fontSize={1}\n icon={CopyIcon}\n mode=\"bleed\"\n onClick={copyResult}\n padding={2}\n />\n </Tooltip>\n </Flex>\n )","<Box className={styles.resultLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('result.label')}\n </Label>\n {isLive && (\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {hasResult && (\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n <TabList aria-label={t('vista.result.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-tree\"\n label={t('vista.result.view.tree')}\n onClick={() => setResultView('tree')}\n padding={2}\n selected={resultView === 'tree'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-json\"\n label={t('vista.result.view.json')}\n onClick={() => setResultView('json')}\n padding={2}\n selected={resultView === 'json'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-graph\"\n label={t('vista.result.view.graph')}\n onClick={() => setResultView('graph')}\n padding={2}\n selected={resultView === 'graph'}\n />\n </TabList>\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.result.copy')}</Text>}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={t('vista.result.copy')}\n data-testid=\"vista-copy-result\"\n fontSize={1}\n icon={CopyIcon}\n mode=\"bleed\"\n onClick={copyResult}\n padding={2}\n />\n </Tooltip>\n </Flex>\n )}\n </Flex>\n </Box>","hasResult && resultView === 'json' ? (\n <ResultJson id=\"vista-result-content\" value={result} />\n ) : hasResult && resultView === 'graph' ? (\n <ResultGraph copy={copyValue} id=\"vista-result-content\" value={result} />\n ) : (\n <Box id=\"vista-result-content\" padding={3} paddingTop={5}>\n {status === 'fetching' && (\n <Box marginTop={3}>\n <DelayedSpinner />\n </Box>\n )}\n {status === 'failed' && error && (\n <QueryErrorDialog\n apiVersion={failedConfig?.apiVersion ?? resolved.apiVersion}\n error={error}\n perspective={failedConfig ? failedConfig.perspective : resolved.perspective}\n variant={\n failedConfig\n ? typeof failedConfig.variant === 'string'\n ? failedConfig.variant\n : undefined\n : resolved.variant\n }\n />\n )}\n {hasResult && resultView === 'tree' && (\n <ResultView copy={copyValue} data={result} datasetName={resultDataset} />\n )}\n {status === 'idle' && (\n <Text muted size={1}>\n {t('vista.result.empty')}\n </Text>\n )}\n </Box>\n )","failedConfig?.apiVersion","apiVersion","perspective","variant","<Card\n className={styles.resultContainer}\n data-testid=\"vista-result\"\n tone={status === 'failed' ? 'critical' : 'default'}\n >\n <Box className={styles.resultLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('result.label')}\n </Label>\n {isLive && (\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {hasResult && (\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n <TabList aria-label={t('vista.result.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-tree\"\n label={t('vista.result.view.tree')}\n onClick={() => setResultView('tree')}\n padding={2}\n selected={resultView === 'tree'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-json\"\n label={t('vista.result.view.json')}\n onClick={() => setResultView('json')}\n padding={2}\n selected={resultView === 'json'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-graph\"\n label={t('vista.result.view.graph')}\n onClick={() => setResultView('graph')}\n padding={2}\n selected={resultView === 'graph'}\n />\n </TabList>\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.result.copy')}</Text>}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={t('vista.result.copy')}\n data-testid=\"vista-copy-result\"\n fontSize={1}\n icon={CopyIcon}\n mode=\"bleed\"\n onClick={copyResult}\n padding={2}\n />\n </Tooltip>\n </Flex>\n )}\n </Flex>\n </Box>\n {hasResult && resultView === 'json' ? (\n <ResultJson id=\"vista-result-content\" value={result} />\n ) : hasResult && resultView === 'graph' ? (\n <ResultGraph copy={copyValue} id=\"vista-result-content\" value={result} />\n ) : (\n <Box id=\"vista-result-content\" padding={3} paddingTop={5}>\n {status === 'fetching' && (\n <Box marginTop={3}>\n <DelayedSpinner />\n </Box>\n )}\n {status === 'failed' && error && (\n <QueryErrorDialog\n apiVersion={failedConfig?.apiVersion ?? resolved.apiVersion}\n error={error}\n perspective={failedConfig ? failedConfig.perspective : resolved.perspective}\n variant={\n failedConfig\n ? typeof failedConfig.variant === 'string'\n ? failedConfig.variant\n : undefined\n : resolved.variant\n }\n />\n )}\n {hasResult && resultView === 'tree' && (\n <ResultView copy={copyValue} data={result} datasetName={resultDataset} />\n )}\n {status === 'idle' && (\n <Text muted size={1}>\n {t('vista.result.empty')}\n </Text>\n )}\n </Box>\n )}\n </Card>","status === 'failed' ? 'critical' : 'default'","<SplitWithBottomPanel\n defaultBottomSize={DEFAULT_BOTTOM_PANEL_SIZE}\n footer={\n <ActionRail testId=\"vista-result-actions\">\n <DownloadButton\n download=\"query-result.json\"\n getBlobUrl={hasResult ? getJsonUrl : undefined}\n icon={JsonIcon}\n label={t('vista.result.export-json')}\n testId=\"vista-export-json\"\n />\n <DownloadButton\n download=\"query-result.csv\"\n getBlobUrl={canExportCsv ? getCsvUrl : undefined}\n icon={DocumentSheetIcon}\n label={t('vista.result.export-csv')}\n onUnavailable={reportCsvUnavailable}\n testId=\"vista-export-csv\"\n tooltip={\n hasResult && !canExportCsv\n ? t('result.save-result-as-csv.not-csv-encodable')\n : undefined\n }\n />\n <ResultActionsMenu\n hasResult={hasResult}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n </ActionRail>\n }\n id=\"vista-response\"\n tabs={panelTabs}\n testId=\"vista-response-panel\"\n >\n <Card\n className={styles.resultContainer}\n data-testid=\"vista-result\"\n tone={status === 'failed' ? 'critical' : 'default'}\n >\n <Box className={styles.resultLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('result.label')}\n </Label>\n {isLive && (\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {hasResult && (\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n <TabList aria-label={t('vista.result.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-tree\"\n label={t('vista.result.view.tree')}\n onClick={() => setResultView('tree')}\n padding={2}\n selected={resultView === 'tree'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-json\"\n label={t('vista.result.view.json')}\n onClick={() => setResultView('json')}\n padding={2}\n selected={resultView === 'json'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-graph\"\n label={t('vista.result.view.graph')}\n onClick={() => setResultView('graph')}\n padding={2}\n selected={resultView === 'graph'}\n />\n </TabList>\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.result.copy')}</Text>}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={t('vista.result.copy')}\n data-testid=\"vista-copy-result\"\n fontSize={1}\n icon={CopyIcon}\n mode=\"bleed\"\n onClick={copyResult}\n padding={2}\n />\n </Tooltip>\n </Flex>\n )}\n </Flex>\n </Box>\n {hasResult && resultView === 'json' ? (\n <ResultJson id=\"vista-result-content\" value={result} />\n ) : hasResult && resultView === 'graph' ? (\n <ResultGraph copy={copyValue} id=\"vista-result-content\" value={result} />\n ) : (\n <Box id=\"vista-result-content\" padding={3} paddingTop={5}>\n {status === 'fetching' && (\n <Box marginTop={3}>\n <DelayedSpinner />\n </Box>\n )}\n {status === 'failed' && error && (\n <QueryErrorDialog\n apiVersion={failedConfig?.apiVersion ?? resolved.apiVersion}\n error={error}\n perspective={failedConfig ? failedConfig.perspective : resolved.perspective}\n variant={\n failedConfig\n ? typeof failedConfig.variant === 'string'\n ? failedConfig.variant\n : undefined\n : resolved.variant\n }\n />\n )}\n {hasResult && resultView === 'tree' && (\n <ResultView copy={copyValue} data={result} datasetName={resultDataset} />\n )}\n {status === 'idle' && (\n <Text muted size={1}>\n {t('vista.result.empty')}\n </Text>\n )}\n </Box>\n )}\n </Card>\n </SplitWithBottomPanel>","<>\n {tabDrawer && <TabDrawerPortal>{renderTabDrawer(tabDrawer)}</TabDrawerPortal>}\n <SplitWithBottomPanel\n defaultBottomSize={DEFAULT_BOTTOM_PANEL_SIZE}\n footer={\n <ActionRail testId=\"vista-result-actions\">\n <DownloadButton\n download=\"query-result.json\"\n getBlobUrl={hasResult ? getJsonUrl : undefined}\n icon={JsonIcon}\n label={t('vista.result.export-json')}\n testId=\"vista-export-json\"\n />\n <DownloadButton\n download=\"query-result.csv\"\n getBlobUrl={canExportCsv ? getCsvUrl : undefined}\n icon={DocumentSheetIcon}\n label={t('vista.result.export-csv')}\n onUnavailable={reportCsvUnavailable}\n testId=\"vista-export-csv\"\n tooltip={\n hasResult && !canExportCsv\n ? t('result.save-result-as-csv.not-csv-encodable')\n : undefined\n }\n />\n <ResultActionsMenu\n hasResult={hasResult}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n </ActionRail>\n }\n id=\"vista-response\"\n tabs={panelTabs}\n testId=\"vista-response-panel\"\n >\n <Card\n className={styles.resultContainer}\n data-testid=\"vista-result\"\n tone={status === 'failed' ? 'critical' : 'default'}\n >\n <Box className={styles.resultLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('result.label')}\n </Label>\n {isLive && (\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {hasResult && (\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n <TabList aria-label={t('vista.result.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-tree\"\n label={t('vista.result.view.tree')}\n onClick={() => setResultView('tree')}\n padding={2}\n selected={resultView === 'tree'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-json\"\n label={t('vista.result.view.json')}\n onClick={() => setResultView('json')}\n padding={2}\n selected={resultView === 'json'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-graph\"\n label={t('vista.result.view.graph')}\n onClick={() => setResultView('graph')}\n padding={2}\n selected={resultView === 'graph'}\n />\n </TabList>\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.result.copy')}</Text>}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={t('vista.result.copy')}\n data-testid=\"vista-copy-result\"\n fontSize={1}\n icon={CopyIcon}\n mode=\"bleed\"\n onClick={copyResult}\n padding={2}\n />\n </Tooltip>\n </Flex>\n )}\n </Flex>\n </Box>\n {hasResult && resultView === 'json' ? (\n <ResultJson id=\"vista-result-content\" value={result} />\n ) : hasResult && resultView === 'graph' ? (\n <ResultGraph copy={copyValue} id=\"vista-result-content\" value={result} />\n ) : (\n <Box id=\"vista-result-content\" padding={3} paddingTop={5}>\n {status === 'fetching' && (\n <Box marginTop={3}>\n <DelayedSpinner />\n </Box>\n )}\n {status === 'failed' && error && (\n <QueryErrorDialog\n apiVersion={failedConfig?.apiVersion ?? resolved.apiVersion}\n error={error}\n perspective={failedConfig ? failedConfig.perspective : resolved.perspective}\n variant={\n failedConfig\n ? typeof failedConfig.variant === 'string'\n ? failedConfig.variant\n : undefined\n : resolved.variant\n }\n />\n )}\n {hasResult && resultView === 'tree' && (\n <ResultView copy={copyValue} data={result} datasetName={resultDataset} />\n )}\n {status === 'idle' && (\n <Text muted size={1}>\n {t('vista.result.empty')}\n </Text>\n )}\n </Box>\n )}\n </Card>\n </SplitWithBottomPanel>\n </>","snapshot","_c","_temp","_temp2","_temp3","_temp4","_temp5","unknownDrawer","styles.resultLabel","styles.resultContainer","_Fragment","{title, onCommit, onCancel}: TabTitleInputProps","() => {\n if (settledRef.current) return\n settledRef.current = true\n onCommit(draft)\n }","() => {\n if (settledRef.current) return\n settledRef.current = true\n onCancel()\n }","(event) => setDraft(event.currentTarget.value)","(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') commit()\n if (event.key === 'Escape') cancel()\n }","event","t('vista.tabs.title-placeholder')","<Box className={styles.tabTitleInput} paddingY={1}>\n <TextInput\n autoFocus\n data-testid=\"vista-tab-title-input\"\n fontSize={1}\n onBlur={commit}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onFocus={(event) => event.currentTarget.select()}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') commit()\n if (event.key === 'Escape') cancel()\n }}\n padding={2}\n placeholder={t('vista.tabs.title-placeholder')}\n value={draft}\n />\n </Box>","(event) => event.currentTarget.select()","getTabTitle(tab, t('vista.tabs.untitled'))","(snapshot) => snapshot.context.runners[tab.id]","id","(snapshot) => snapshot.matches({live: 'on'})","(event: MouseEvent) => {\n // Middle click closes the tab, as browsers do\n if (event.button === 1) {\n event.preventDefault()\n onClose()\n }\n }","useCallback(\n (event: MouseEvent) => {\n // Middle click closes the tab, as browsers do\n if (event.button === 1) {\n event.preventDefault()\n onClose()\n }\n },\n [onClose],\n )","(event: PointerEvent<HTMLButtonElement>) => {\n // Clicks still land: motion only turns this into a drag once the pointer moves\n if (event.button === 0) dragControls.start(event)\n }","useCallback(\n (event: PointerEvent<HTMLButtonElement>) => {\n // Clicks still land: motion only turns this into a drag once the pointer moves\n if (event.button === 0) dragControls.start(event)\n },\n [dragControls],\n )","() => setDragging(false)","() => setDragging(true)","editing ? (\n <TabTitleInput onCancel={onCancelRename} onCommit={onRename} title={title} />\n ) : (\n <Button\n aria-controls={QUERY_TAB_PANEL_ID}\n aria-selected={selected}\n className={styles.tabTitleButton}\n data-testid=\"vista-tab-button\"\n fontSize={1}\n id={getQueryTabId(tab.id)}\n mode=\"bleed\"\n onAuxClick={handleAuxClick}\n onClick={onSelect}\n onDoubleClick={onStartRename}\n onKeyDown={onKeyDown}\n onPointerDown={startDrag}\n padding={2}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n text={title}\n textWeight={selected ? 'medium' : 'regular'}\n />\n )","isLive && (\n <Box flexShrink={0}>\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n </Box>\n )","t('vista.tabs.close-tab')","<Button\n aria-label={t('vista.tabs.close-tab')}\n className={styles.tabCloseButton}\n data-testid=\"vista-tab-close\"\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={1}\n tabIndex={-1}\n />","<Flex\n alignItems=\"center\"\n className={styles.tab}\n data-selected={selected ? 'true' : undefined}\n data-testid=\"vista-tab\"\n gap={1}\n paddingLeft={1}\n paddingRight={1}\n role=\"presentation\"\n >\n {editing ? (\n <TabTitleInput onCancel={onCancelRename} onCommit={onRename} title={title} />\n ) : (\n <Button\n aria-controls={QUERY_TAB_PANEL_ID}\n aria-selected={selected}\n className={styles.tabTitleButton}\n data-testid=\"vista-tab-button\"\n fontSize={1}\n id={getQueryTabId(tab.id)}\n mode=\"bleed\"\n onAuxClick={handleAuxClick}\n onClick={onSelect}\n onDoubleClick={onStartRename}\n onKeyDown={onKeyDown}\n onPointerDown={startDrag}\n padding={2}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n text={title}\n textWeight={selected ? 'medium' : 'regular'}\n />\n )}\n {isLive && (\n <Box flexShrink={0}>\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n </Box>\n )}\n <Button\n aria-label={t('vista.tabs.close-tab')}\n className={styles.tabCloseButton}\n data-testid=\"vista-tab-close\"\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={1}\n tabIndex={-1}\n />\n </Flex>","selected ? 'true' : undefined","<Reorder.Item\n as=\"div\"\n className={styles.tabItem}\n data-dragging={dragging ? 'true' : undefined}\n data-testid=\"vista-tab-item\"\n // Keep the dragged tab inside the strip, which clips whatever leaves it\n dragConstraints={listRef}\n dragControls={dragControls}\n dragElastic={0.1}\n dragListener={false}\n layout=\"position\"\n onDragEnd={() => setDragging(false)}\n onDragStart={() => setDragging(true)}\n value={tab}\n >\n <Flex\n alignItems=\"center\"\n className={styles.tab}\n data-selected={selected ? 'true' : undefined}\n data-testid=\"vista-tab\"\n gap={1}\n paddingLeft={1}\n paddingRight={1}\n role=\"presentation\"\n >\n {editing ? (\n <TabTitleInput onCancel={onCancelRename} onCommit={onRename} title={title} />\n ) : (\n <Button\n aria-controls={QUERY_TAB_PANEL_ID}\n aria-selected={selected}\n className={styles.tabTitleButton}\n data-testid=\"vista-tab-button\"\n fontSize={1}\n id={getQueryTabId(tab.id)}\n mode=\"bleed\"\n onAuxClick={handleAuxClick}\n onClick={onSelect}\n onDoubleClick={onStartRename}\n onKeyDown={onKeyDown}\n onPointerDown={startDrag}\n padding={2}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n text={title}\n textWeight={selected ? 'medium' : 'regular'}\n />\n )}\n {isLive && (\n <Box flexShrink={0}>\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n </Box>\n )}\n <Button\n aria-label={t('vista.tabs.close-tab')}\n className={styles.tabCloseButton}\n data-testid=\"vista-tab-close\"\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={1}\n tabIndex={-1}\n />\n </Flex>\n </Reorder.Item>","dragging ? 'true' : undefined","Reorder.Item","snapshot","(snapshot) => snapshot.context.tabs","(snapshot) => snapshot.context.activeTabId","(id: string) => {\n listRef.current?.querySelector<HTMLElement>(`#${getQueryTabId(id)}`)?.focus()\n }","useCallback((id: string) => {\n listRef.current?.querySelector<HTMLElement>(`#${getQueryTabId(id)}`)?.focus()\n }, [])","(id: string) => {\n const focusInStrip = listRef.current?.contains(document.activeElement) ?? false\n setEditingId(null)\n if (focusInStrip) requestAnimationFrame(() => focusTab(id))\n }","useCallback(\n (id: string) => {\n const focusInStrip = listRef.current?.contains(document.activeElement) ?? false\n setEditingId(null)\n if (focusInStrip) requestAnimationFrame(() => focusTab(id))\n },\n [focusTab],\n )","(ordered: VistaTab[]) =>\n actorRef.send({type: 'tab.reorder', ids: ordered.map((tab) => tab.id)})","(tab) => tab.id","useCallback(\n (ordered: VistaTab[]) =>\n actorRef.send({type: 'tab.reorder', ids: ordered.map((tab) => tab.id)}),\n [actorRef],\n )","(event: KeyboardEvent<HTMLButtonElement>) => {\n if (tabs.length === 0) return\n if (event.key === 'F2') {\n event.preventDefault()\n setEditingId(activeTabId)\n return\n }\n if (event.key === 'Delete') {\n event.preventDefault()\n actorRef.send({type: 'tab.close', id: activeTabId})\n // The tab that takes over may be brand new (closing the last tab), so it only exists\n // after React has rendered the new snapshot\n const nextId = actorRef.getSnapshot().context.activeTabId\n requestAnimationFrame(() => focusTab(nextId))\n return\n }\n const index = tabs.findIndex((tab) => tab.id === activeTabId)\n const direction = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0\n if (event.shiftKey && direction !== 0) {\n const target = index + direction\n if (target < 0 || target >= tabs.length) return\n event.preventDefault()\n const ordered = tabs.slice()\n ;[ordered[index], ordered[target]] = [ordered[target], ordered[index]]\n reorder(ordered)\n return\n }\n let nextIndex: number | undefined\n if (direction !== 0) nextIndex = (index + direction + tabs.length) % tabs.length\n if (event.key === 'Home') nextIndex = 0\n if (event.key === 'End') nextIndex = tabs.length - 1\n if (nextIndex === undefined) return\n event.preventDefault()\n const next = tabs[nextIndex]\n actorRef.send({type: 'tab.select', id: next.id})\n focusTab(next.id)\n }","tabs.length","tab","ordered","ordered[index]","ordered[target]","useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n if (tabs.length === 0) return\n if (event.key === 'F2') {\n event.preventDefault()\n setEditingId(activeTabId)\n return\n }\n if (event.key === 'Delete') {\n event.preventDefault()\n actorRef.send({type: 'tab.close', id: activeTabId})\n // The tab that takes over may be brand new (closing the last tab), so it only exists\n // after React has rendered the new snapshot\n const nextId = actorRef.getSnapshot().context.activeTabId\n requestAnimationFrame(() => focusTab(nextId))\n return\n }\n const index = tabs.findIndex((tab) => tab.id === activeTabId)\n const direction = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0\n if (event.shiftKey && direction !== 0) {\n const target = index + direction\n if (target < 0 || target >= tabs.length) return\n event.preventDefault()\n const ordered = tabs.slice()\n ;[ordered[index], ordered[target]] = [ordered[target], ordered[index]]\n reorder(ordered)\n return\n }\n let nextIndex: number | undefined\n if (direction !== 0) nextIndex = (index + direction + tabs.length) % tabs.length\n if (event.key === 'Home') nextIndex = 0\n if (event.key === 'End') nextIndex = tabs.length - 1\n if (nextIndex === undefined) return\n event.preventDefault()\n const next = tabs[nextIndex]\n actorRef.send({type: 'tab.select', id: next.id})\n focusTab(next.id)\n },\n [activeTabId, actorRef, focusTab, reorder, tabs],\n )","t('vista.tabs.label')","tabs.map((tab) => (\n <TabHandle\n editing={editingId === tab.id}\n key={tab.id}\n listRef={listRef}\n onKeyDown={handleTabKeyDown}\n onCancelRename={() => stopRenaming(tab.id)}\n onClose={() => actorRef.send({type: 'tab.close', id: tab.id})}\n onRename={(title) => {\n stopRenaming(tab.id)\n actorRef.send({type: 'tab.rename', id: tab.id, title})\n }}\n onSelect={() => actorRef.send({type: 'tab.select', id: tab.id})}\n onStartRename={() => setEditingId(tab.id)}\n selected={tab.id === activeTabId}\n tab={tab}\n />\n ))","<Reorder.Group\n aria-label={t('vista.tabs.label')}\n as=\"div\"\n axis=\"x\"\n className={styles.tabList}\n onReorder={reorder}\n ref={listRef}\n role=\"tablist\"\n values={tabs}\n >\n {tabs.map((tab) => (\n <TabHandle\n editing={editingId === tab.id}\n key={tab.id}\n listRef={listRef}\n onKeyDown={handleTabKeyDown}\n onCancelRename={() => stopRenaming(tab.id)}\n onClose={() => actorRef.send({type: 'tab.close', id: tab.id})}\n onRename={(title) => {\n stopRenaming(tab.id)\n actorRef.send({type: 'tab.rename', id: tab.id, title})\n }}\n onSelect={() => actorRef.send({type: 'tab.select', id: tab.id})}\n onStartRename={() => setEditingId(tab.id)}\n selected={tab.id === activeTabId}\n tab={tab}\n />\n ))}\n </Reorder.Group>","Reorder.Group","t('vista.tabs.new-tab')","() => actorRef.send({type: 'tab.add'})","<Flex alignItems=\"center\" paddingX={1}>\n <Button\n aria-label={t('vista.tabs.new-tab')}\n data-testid=\"vista-new-tab\"\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n onClick={() => actorRef.send({type: 'tab.add'})}\n padding={2}\n />\n </Flex>","<Flex\n alignItems=\"stretch\"\n className={styles.tabBar}\n data-testid=\"vista-tab-bar\"\n flexShrink={0}\n paddingX={1}\n >\n <Reorder.Group\n aria-label={t('vista.tabs.label')}\n as=\"div\"\n axis=\"x\"\n className={styles.tabList}\n onReorder={reorder}\n ref={listRef}\n role=\"tablist\"\n values={tabs}\n >\n {tabs.map((tab) => (\n <TabHandle\n editing={editingId === tab.id}\n key={tab.id}\n listRef={listRef}\n onKeyDown={handleTabKeyDown}\n onCancelRename={() => stopRenaming(tab.id)}\n onClose={() => actorRef.send({type: 'tab.close', id: tab.id})}\n onRename={(title) => {\n stopRenaming(tab.id)\n actorRef.send({type: 'tab.rename', id: tab.id, title})\n }}\n onSelect={() => actorRef.send({type: 'tab.select', id: tab.id})}\n onStartRename={() => setEditingId(tab.id)}\n selected={tab.id === activeTabId}\n tab={tab}\n />\n ))}\n </Reorder.Group>\n <Flex alignItems=\"center\" paddingX={1}>\n <Button\n aria-label={t('vista.tabs.new-tab')}\n data-testid=\"vista-new-tab\"\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n onClick={() => actorRef.send({type: 'tab.add'})}\n padding={2}\n />\n </Flex>\n </Flex>","_c","styles.tabTitleInput","_temp","_temp2","styles.tabTitleButton","styles.tabCloseButton","styles.tab","styles.tabItem","_temp3","_temp4","_temp5","styles.tabList","styles.tabBar","{tab, rootElement}: QueryTabProps","(snapshot) => snapshot.context.runners[tab.id]","id","(snapshot) => snapshot.context.loadRevisions[tab.id] || 0","snapshot","{}","[]","(query: string) => actorRef.send({type: 'tab.setQuery', id: tab.id, query})","useCallback(\n (query: string) => actorRef.send({type: 'tab.setQuery', id: tab.id, query}),\n [actorRef, tab.id],\n )","(rawParams: string) => actorRef.send({type: 'tab.setParams', id: tab.id, rawParams})","useCallback(\n (rawParams: string) => actorRef.send({type: 'tab.setParams', id: tab.id, rawParams}),\n [actorRef, tab.id],\n )","debounce(setParamsNow, PARAMS_DEBOUNCE_MS)","useMemo(() => debounce(setParamsNow, PARAMS_DEBOUNCE_MS), [setParamsNow])","() => () => setParams.flush()","[setParams]","() => pendingEdits.register(() => setParams.flush())","[pendingEdits, setParams]","(snapshot) => isPanelExpanded(snapshot, 'params')","(expanded) => {\n if (!expanded) setParams.flush()\n }","() => setParams.flush()","(rawParams: string) => {\n setParams.cancel()\n setParamsNow(rawParams)\n }","rawParams","useCallback(\n (rawParams: string) => {\n setParams.cancel()\n setParamsNow(rawParams)\n },\n [setParams, setParamsNow],\n )","async (query: string) => {\n if (!paramsEditorRef.current) return\n let referenced: GroqQueryParam[]\n try {\n referenced = await extractQueryParams(query)\n } catch {\n return // the query does not parse yet; nothing reliable to prefill from\n }\n if (referenced.length === 0) return\n // The wasm module loads lazily; re-check everything that could have changed meanwhile: the\n // query may have moved on, or the params panel may have collapsed or switched to the form.\n // An edit still waiting in the params debounce is committed first, so a key just typed in\n // is read rather than clobbered by a snapshot taken before it\n if (!paramsEditorRef.current) return\n setParams.flush()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id)\n if (!latest || latest.query !== query) return\n const missing = missingParamNames(\n referenced.map((param) => param.name),\n latest.rawParams,\n t,\n )\n if (!missing || missing.length === 0) return\n const nextRawParams = addMissingParams(latest.rawParams, missing)\n if (nextRawParams === latest.rawParams) return\n paramsEditorRef.current.resetEditorContent(nextRawParams)\n setParamsNow(nextRawParams)\n }","query","(param) => param.name","() => {\n const timeoutId = setTimeout(() => void prefillParams(tab.query), PARAMS_PREFILL_DEBOUNCE_MS)\n return () => clearTimeout(timeoutId)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","[tab.query]","() => {\n setParams.flush()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id) ?? tab\n return buildRequest(latest.query, latest.rawParams)\n }","tab.id","latest","it","useCallback(() => {\n setParams.flush()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id) ?? tab\n return buildRequest(latest.query, latest.rawParams)\n }, [actorRef, buildRequest, setParams, tab])","(reason: FetchReason): boolean => {\n const current = buildCurrentRequest()\n if (!current) return false\n runnerRef.send({type: 'fetch', request: current, reason})\n // On a phone the result lives behind the other pane; bring it forward\n if (layout === 'mobile') setMobilePane('response')\n return true\n }","useCallback(\n (reason: FetchReason): boolean => {\n const current = buildCurrentRequest()\n if (!current) return false\n runnerRef.send({type: 'fetch', request: current, reason})\n // On a phone the result lives behind the other pane; bring it forward\n if (layout === 'mobile') setMobilePane('response')\n return true\n },\n [buildCurrentRequest, layout, runnerRef],\n )","() => runnerRef.send({type: 'cancel'})","useCallback(() => runnerRef.send({type: 'cancel'}), [runnerRef])","() => {\n run({type: 'mutation'})\n }","useCallback(() => {\n run({type: 'mutation'})\n }, [run])","(options: Partial<VistaTabOptions>) =>\n actorRef.send({type: 'tab.setOptions', id: tab.id, options})","useCallback(\n (options: Partial<VistaTabOptions>) =>\n actorRef.send({type: 'tab.setOptions', id: tab.id, options}),\n [actorRef, tab.id],\n )","() => {\n if (tab.autoRefetch) {\n actorRef.send({type: 'tab.setAutoRefetch', id: tab.id, autoRefetch: false})\n } else if (run({type: 'live-start'})) {\n actorRef.send({type: 'tab.setAutoRefetch', id: tab.id, autoRefetch: true})\n }\n }","autoRefetch","useCallback(() => {\n if (tab.autoRefetch) {\n actorRef.send({type: 'tab.setAutoRefetch', id: tab.id, autoRefetch: false})\n } else if (run({type: 'live-start'})) {\n actorRef.send({type: 'tab.setAutoRefetch', id: tab.id, autoRefetch: true})\n }\n }, [actorRef, run, tab.autoRefetch, tab.id])","async (query: string) => {\n const editor = queryEditorRef.current\n let width = editor?.getVisibleColumns(countLines(query))\n let formatted = await formatGroq(query, width)\n for (let pass = 0; pass < 2 && width !== undefined; pass++) {\n const nextWidth = editor?.getVisibleColumns(countLines(formatted))\n if (nextWidth === undefined || nextWidth >= width) break\n width = nextWidth\n formatted = await formatGroq(query, width)\n }\n return formatted\n }","useCallback(async (query: string) => {\n const editor = queryEditorRef.current\n let width = editor?.getVisibleColumns(countLines(query))\n let formatted = await formatGroq(query, width)\n for (let pass = 0; pass < 2 && width !== undefined; pass++) {\n const nextWidth = editor?.getVisibleColumns(countLines(formatted))\n if (nextWidth === undefined || nextWidth >= width) break\n width = nextWidth\n formatted = await formatGroq(query, width)\n }\n return formatted\n }, [])","async () => {\n const {query} = tab\n const formatted = await formatForEditor(query)\n // The formatter loads lazily; a query edited meanwhile is not overwritten\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id)\n if (latest?.query !== query || formatted === query) return\n queryEditorRef.current?.resetEditorContent(formatted)\n setQuery(formatted)\n }","formatted","useCallback(async () => {\n const {query} = tab\n const formatted = await formatForEditor(query)\n // The formatter loads lazily; a query edited meanwhile is not overwritten\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id)\n if (latest?.query !== query || formatted === query) return\n queryEditorRef.current?.resetEditorContent(formatted)\n setQuery(formatted)\n }, [actorRef, formatForEditor, setQuery, tab])","async () => {\n try {\n await formatQuery()\n } catch (error) {\n toast.push({\n closable: true,\n description: error instanceof GroqSyntaxError ? error.message : undefined,\n status: 'warning',\n title: t('vista.query.prettify.failed'),\n })\n }\n }","error","useCallback(async () => {\n try {\n await formatQuery()\n } catch (error) {\n toast.push({\n closable: true,\n description: error instanceof GroqSyntaxError ? error.message : undefined,\n status: 'warning',\n title: t('vista.query.prettify.failed'),\n })\n }\n }, [formatQuery, t, toast])","() => void copyToClipboard(tab.query, t('vista.query.copied'))","useCallback(\n () => void copyToClipboard(tab.query, t('vista.query.copied')),\n [copyToClipboard, t, tab.query],\n )","(snapshot) => selectOpenDrawer(snapshot) !== null","(range: TextRange) => {\n if (layout === 'mobile' && (mobilePane !== 'request' || drawerOpen)) {\n pendingRevealRef.current = range\n setMobilePane('request')\n if (drawerOpen) actorRef.send({type: 'drawer.close'})\n return\n }\n queryEditorRef.current?.selectRange(range.from, range.to)\n }","useCallback(\n (range: TextRange) => {\n if (layout === 'mobile' && (mobilePane !== 'request' || drawerOpen)) {\n pendingRevealRef.current = range\n setMobilePane('request')\n if (drawerOpen) actorRef.send({type: 'drawer.close'})\n return\n }\n queryEditorRef.current?.selectRange(range.from, range.to)\n },\n [actorRef, drawerOpen, layout, mobilePane],\n )","(edit: QueryEdit) => queryEditorRef.current?.applyChanges([edit])","useCallback(\n (edit: QueryEdit) => queryEditorRef.current?.applyChanges([edit]),\n [],\n )","() => {\n const pending = pendingRevealRef.current\n if (mobilePane !== 'request' || drawerOpen || !pending) return\n pendingRevealRef.current = null\n queryEditorRef.current?.selectRange(pending.from, pending.to)\n }","[drawerOpen, mobilePane]","() => {\n setParams.cancel()\n queryEditorRef.current?.resetEditorContent(tab.query)\n paramsEditorRef.current?.resetEditorContent(tab.rawParams)\n runnerRef.send({type: 'clear'})\n }","{\n runnerRef,\n dataset: resolved.dataset,\n enabled: tab.autoRefetch && resolved.supportsSyncTags,\n tabId: tab.id,\n }","dataset","tab.autoRefetch && resolved.supportsSyncTags","() => {\n if (!tab.autoRefetch) return\n const lastRequest = runnerRef.getSnapshot().context.request\n if (!lastRequest) {\n const current = buildCurrentRequest()\n if (current) runnerRef.send({type: 'fetch', request: current, reason: {type: 'resume'}})\n return\n }\n const current = buildRequest(lastRequest.query, JSON.stringify(lastRequest.params))\n if (\n current &&\n (current.url !== lastRequest.url || current.includeSourceMap !== lastRequest.includeSourceMap)\n ) {\n runnerRef.send({type: 'fetch', request: current, reason: {type: 'resume'}})\n }\n }","current","(snapshot) => snapshot.context.fetchOnOpen[tab.id]","async () => {\n const source = actorRef.getSnapshot().context.fetchOnOpen[tab.id]\n if (!source) return\n actorRef.send({type: 'tab.fetchedOnOpen', id: tab.id})\n if (source === 'generated') {\n let previousColumns: number | undefined\n let settledFrames = 0\n for (let frame = 0; frame < MAX_LAYOUT_FRAMES; frame++) {\n const columns = queryEditorRef.current?.getVisibleColumns()\n settledFrames = columns !== undefined && columns === previousColumns ? settledFrames + 1 : 0\n if (settledFrames >= SETTLED_LAYOUT_FRAMES) break\n previousColumns = columns\n await new Promise((resolve) => requestAnimationFrame(resolve))\n }\n await formatQuery().catch(() => undefined)\n }\n run({type: source})\n }","(resolve) => requestAnimationFrame(resolve)","() => undefined","() => {\n resumeAutoRefetch()\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- once per tab mount; useEffectEvent callbacks must not be listed\n }","() => {\n if (fetchOnOpen) void fetchOpenedQuery()\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","[fetchOnOpen]","JSON.stringify([\n resolved.apiVersion,\n resolved.dataset,\n resolved.perspective,\n resolved.variant,\n resolved.useCdn,\n tab.options.includeSourceMap,\n ])","apiVersion","perspective","useCdn","variant","includeSourceMap","(key, previous) => {\n if (!tab.autoRefetch) return\n const loaded = key.split('|', 1)[0] !== previous.split('|', 1)[0]\n // A load that fetches on its own (a generated query, a pasted URL) is not fetched twice\n if (loaded && fetchOnOpen) return\n // Built like a manual run, so params typed just before an option changed come along (after\n // a load there is nothing waiting: the edit that belonged to the replaced params was cancelled)\n const current = buildCurrentRequest()\n if (current) {\n runnerRef.send({type: 'fetch', request: current, reason: {type: loaded ? 'load' : 'options'}})\n }\n }","(perspective) => setOptions({perspective})","(shortcut: VistaShortcutId) => {\n switch (shortcut) {\n case 'fetch':\n run({type: 'shortcut'})\n break\n case 'prettify':\n void prettify()\n break\n case 'copy-query':\n copyQuery()\n break\n default: {\n const unhandled: never = shortcut\n throw new Error(`Unhandled shortcut: ${String(unhandled)}`)\n }\n }\n }","(text) => {\n const parsed = parseQueryUrl(text, datasets)\n if (!parsed) {\n return false\n }\n actorRef.send({\n type: 'tab.load',\n id: tab.id,\n tab: parsedQueryToTabInit(parsed),\n fetch: 'paste',\n })\n toast.push({\n closable: true,\n id: 'vista-paste',\n status: 'info',\n title: t('vista.paste.parsed'),\n })\n if (parsed.hasUnsupportedPerspective) {\n toast.push({\n closable: true,\n id: 'vista-paste-perspective',\n status: 'warning',\n title: t('vista.paste.unsupported-perspective'),\n })\n }\n // The URL may come from another project or name a dataset the user cannot see; the query\n // then runs against the tab's own dataset, which is worth saying\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n id: 'vista-paste-dataset',\n status: 'warning',\n title: t('vista.paste.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n // A tab cannot pin a variant (its option follows the navbar or sends none), so a request\n // made with one the navbar does not have selected cannot be reproduced as pasted; where\n // the workspace has variants switched off there is no navbar selector to select it with\n if (parsed.variant !== undefined && parsed.variant !== resolved.variant) {\n toast.push({\n closable: true,\n id: 'vista-paste-variant',\n status: 'warning',\n title: t(\n isVariantsEnabled ? 'vista.paste.unavailable-variant' : 'vista.paste.variants-disabled',\n {variant: parsed.variant},\n ),\n })\n }\n return true\n }","{\n rootElement,\n onShortcut: (shortcut: VistaShortcutId) => {\n switch (shortcut) {\n case 'fetch':\n run({type: 'shortcut'})\n break\n case 'prettify':\n void prettify()\n break\n case 'copy-query':\n copyQuery()\n break\n default: {\n const unhandled: never = shortcut\n throw new Error(`Unhandled shortcut: ${String(unhandled)}`)\n }\n }\n },\n onPaste: (text) => {\n const parsed = parseQueryUrl(text, datasets)\n if (!parsed) {\n return false\n }\n actorRef.send({\n type: 'tab.load',\n id: tab.id,\n tab: parsedQueryToTabInit(parsed),\n fetch: 'paste',\n })\n toast.push({\n closable: true,\n id: 'vista-paste',\n status: 'info',\n title: t('vista.paste.parsed'),\n })\n if (parsed.hasUnsupportedPerspective) {\n toast.push({\n closable: true,\n id: 'vista-paste-perspective',\n status: 'warning',\n title: t('vista.paste.unsupported-perspective'),\n })\n }\n // The URL may come from another project or name a dataset the user cannot see; the query\n // then runs against the tab's own dataset, which is worth saying\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n id: 'vista-paste-dataset',\n status: 'warning',\n title: t('vista.paste.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n // A tab cannot pin a variant (its option follows the navbar or sends none), so a request\n // made with one the navbar does not have selected cannot be reproduced as pasted; where\n // the workspace has variants switched off there is no navbar selector to select it with\n if (parsed.variant !== undefined && parsed.variant !== resolved.variant) {\n toast.push({\n closable: true,\n id: 'vista-paste-variant',\n status: 'warning',\n title: t(\n isVariantsEnabled ? 'vista.paste.unavailable-variant' : 'vista.paste.variants-disabled',\n {variant: parsed.variant},\n ),\n })\n }\n return true\n },\n }","() => void prettify()","() => run({type: 'manual'})","<RequestPanel\n buildRequest={buildRequest}\n formatForEditor={formatForEditor}\n isFetching={isFetching}\n onCancel={cancel}\n onCopyQuery={copyQuery}\n onLintFindings={setLintFindings}\n onOptionsChange={setOptions}\n onParamsChange={setParams}\n onParamsReplace={replaceParams}\n onPrettify={() => void prettify()}\n onQueryChange={setQuery}\n onRun={() => run({type: 'manual'})}\n onToggleAutoRefetch={toggleAutoRefetch}\n params={params}\n paramsEditorRef={paramsEditorRef}\n queryEditorRef={queryEditorRef}\n request={request}\n resolved={resolved}\n tab={tab}\n />","<ResponsePanel\n lintFindings={lintFindings}\n onEditQuery={editQuery}\n onMutationsApplied={refetchAfterMutations}\n onRevealRange={revealRange}\n request={request}\n resolved={resolved}\n runnerRef={runnerRef}\n tab={tab}\n />","getQueryTabId(tab.id)","{\n 'aria-labelledby': getQueryTabId(tab.id),\n 'data-testid': 'vista-query-tab',\n 'id': QUERY_TAB_PANEL_ID,\n 'role': 'tabpanel',\n }","t('query.label')","() => setMobilePane('request')","<Tab\n aria-controls=\"vista-mobile-request-pane\"\n fontSize={1}\n id=\"vista-mobile-request-tab\"\n label={t('query.label')}\n onClick={() => setMobilePane('request')}\n padding={2}\n selected={mobilePane === 'request'}\n />","mobilePane === 'request'","t('result.label')","() => setMobilePane('response')","<Tab\n aria-controls=\"vista-mobile-response-pane\"\n fontSize={1}\n id=\"vista-mobile-response-tab\"\n label={t('result.label')}\n onClick={() => setMobilePane('response')}\n padding={2}\n selected={mobilePane === 'response'}\n />","mobilePane === 'response'","<Flex borderBottom flexShrink={0} justifyContent=\"center\" paddingY={1}>\n <TabList gap={1}>\n <Tab\n aria-controls=\"vista-mobile-request-pane\"\n fontSize={1}\n id=\"vista-mobile-request-tab\"\n label={t('query.label')}\n onClick={() => setMobilePane('request')}\n padding={2}\n selected={mobilePane === 'request'}\n />\n <Tab\n aria-controls=\"vista-mobile-response-pane\"\n fontSize={1}\n id=\"vista-mobile-response-tab\"\n label={t('result.label')}\n onClick={() => setMobilePane('response')}\n padding={2}\n selected={mobilePane === 'response'}\n />\n </TabList>\n </Flex>","cx(styles.paneFill, mobilePane !== 'request' && styles.hiddenPane)","mobilePane !== 'request' && styles.hiddenPane","<Box\n aria-labelledby=\"vista-mobile-request-tab\"\n className={cx(styles.paneFill, mobilePane !== 'request' && styles.hiddenPane)}\n flexBasis=\"0%\"\n flexGrow={1}\n id=\"vista-mobile-request-pane\"\n role=\"tabpanel\"\n >\n {requestPanel}\n </Box>","cx(styles.paneFill, mobilePane !== 'response' && styles.hiddenPane)","mobilePane !== 'response' && styles.hiddenPane","<Box\n aria-labelledby=\"vista-mobile-response-tab\"\n className={cx(styles.paneFill, mobilePane !== 'response' && styles.hiddenPane)}\n flexBasis=\"0%\"\n flexGrow={1}\n id=\"vista-mobile-response-pane\"\n role=\"tabpanel\"\n >\n {responsePanel}\n </Box>","<Flex {...panelProps} flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\">\n <Flex borderBottom flexShrink={0} justifyContent=\"center\" paddingY={1}>\n <TabList gap={1}>\n <Tab\n aria-controls=\"vista-mobile-request-pane\"\n fontSize={1}\n id=\"vista-mobile-request-tab\"\n label={t('query.label')}\n onClick={() => setMobilePane('request')}\n padding={2}\n selected={mobilePane === 'request'}\n />\n <Tab\n aria-controls=\"vista-mobile-response-pane\"\n fontSize={1}\n id=\"vista-mobile-response-tab\"\n label={t('result.label')}\n onClick={() => setMobilePane('response')}\n padding={2}\n selected={mobilePane === 'response'}\n />\n </TabList>\n </Flex>\n <Box\n aria-labelledby=\"vista-mobile-request-tab\"\n className={cx(styles.paneFill, mobilePane !== 'request' && styles.hiddenPane)}\n flexBasis=\"0%\"\n flexGrow={1}\n id=\"vista-mobile-request-pane\"\n role=\"tabpanel\"\n >\n {requestPanel}\n </Box>\n <Box\n aria-labelledby=\"vista-mobile-response-tab\"\n className={cx(styles.paneFill, mobilePane !== 'response' && styles.hiddenPane)}\n flexBasis=\"0%\"\n flexGrow={1}\n id=\"vista-mobile-response-pane\"\n role=\"tabpanel\"\n >\n {responsePanel}\n </Box>\n </Flex>","t('vista.split.request-response')","(size) => setSplitSizes((sizes) => ({...sizes, [layout]: size}))","() => setSplitSizes((sizes) => ({...sizes, [layout]: undefined}))","sizes","<Box className={styles.paneFill}>{requestPanel}</Box>","<Box className={styles.paneFill}>{responsePanel}</Box>","<ResizableSplit\n key={layout}\n label={t('vista.split.request-response')}\n minSecondarySize={minSize}\n minSize={minSize}\n onChange={(size) => setSplitSizes((sizes) => ({...sizes, [layout]: size}))}\n onReset={() => setSplitSizes((sizes) => ({...sizes, [layout]: undefined}))}\n size={splitSizes[layout] ?? defaultSplitSize}\n // oxlint-disable-next-line @sanity/i18n/no-attribute-string-literals -- layout mode, not user-facing text\n split={layout === 'stacked' ? 'horizontal' : 'vertical'}\n testId=\"vista-split\"\n >\n <Box className={styles.paneFill}>{requestPanel}</Box>\n <Box className={styles.paneFill}>{responsePanel}</Box>\n </ResizableSplit>","splitSizes[layout] ?? defaultSplitSize","layout === 'stacked' ? 'horizontal' : 'vertical'","<Box {...panelProps} className={styles.splitPaneContainer} ref={setSplitContainer}>\n <ResizableSplit\n key={layout}\n label={t('vista.split.request-response')}\n minSecondarySize={minSize}\n minSize={minSize}\n onChange={(size) => setSplitSizes((sizes) => ({...sizes, [layout]: size}))}\n onReset={() => setSplitSizes((sizes) => ({...sizes, [layout]: undefined}))}\n size={splitSizes[layout] ?? defaultSplitSize}\n // oxlint-disable-next-line @sanity/i18n/no-attribute-string-literals -- layout mode, not user-facing text\n split={layout === 'stacked' ? 'horizontal' : 'vertical'}\n testId=\"vista-split\"\n >\n <Box className={styles.paneFill}>{requestPanel}</Box>\n <Box className={styles.paneFill}>{responsePanel}</Box>\n </ResizableSplit>\n </Box>","_c","_temp","_temp2","unhandled","styles.paneFill","styles.splitPaneContainer","() => actorRef.send({type: 'dialog.close'})","t('vista.shortcuts.title')","[...VISTA_SHORTCUT_LIST, ...EDITOR_SHORTCUTS].map((shortcut) => (\n <Flex\n alignItems=\"center\"\n gap={3}\n justifyContent=\"space-between\"\n key={shortcut.labelKey}\n >\n <Text size={1}>{t(shortcut.labelKey)}</Text>\n <Hotkeys fontSize={1} keys={shortcut.keys} />\n </Flex>\n ))","t('vista.shortcuts.close')","<Text size={1}>{t('vista.shortcuts.close')}</Text>","<Hotkeys fontSize={1} keys={['Esc']} />","<Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text size={1}>{t('vista.shortcuts.close')}</Text>\n <Hotkeys fontSize={1} keys={['Esc']} />\n </Flex>","<Box padding={4}>\n <Stack gap={4}>\n {[...VISTA_SHORTCUT_LIST, ...EDITOR_SHORTCUTS].map((shortcut) => (\n <Flex\n alignItems=\"center\"\n gap={3}\n justifyContent=\"space-between\"\n key={shortcut.labelKey}\n >\n <Text size={1}>{t(shortcut.labelKey)}</Text>\n <Hotkeys fontSize={1} keys={shortcut.keys} />\n </Flex>\n ))}\n <Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text size={1}>{t('vista.shortcuts.close')}</Text>\n <Hotkeys fontSize={1} keys={['Esc']} />\n </Flex>\n </Stack>\n </Box>","<Dialog\n animate\n data-testid=\"vista-shortcuts-dialog\"\n header={t('vista.shortcuts.title')}\n id=\"vista-shortcuts-dialog\"\n onClickOutside={close}\n onClose={close}\n width={0}\n >\n <Box padding={4}>\n <Stack gap={4}>\n {[...VISTA_SHORTCUT_LIST, ...EDITOR_SHORTCUTS].map((shortcut) => (\n <Flex\n alignItems=\"center\"\n gap={3}\n justifyContent=\"space-between\"\n key={shortcut.labelKey}\n >\n <Text size={1}>{t(shortcut.labelKey)}</Text>\n <Hotkeys fontSize={1} keys={shortcut.keys} />\n </Flex>\n ))}\n <Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text size={1}>{t('vista.shortcuts.close')}</Text>\n <Hotkeys fontSize={1} keys={['Esc']} />\n </Flex>\n </Stack>\n </Box>\n </Dialog>","_c","dialog === 'shortcuts' ? <ShortcutsDialog /> : null","_c","{tab}: {tab: VistaTab}","new URLSearchParams(router.state._searchParams ?? []).get(URL_STATE_PARAM)","_searchParams","(url: string) => {\n const parsed = parseQueryUrl(url, datasets)\n if (!parsed) return\n const existing = actorRef\n .getSnapshot()\n .context.tabs.find((candidate) =>\n tabMatchesParsedQuery(\n candidate,\n parsed,\n resolveRequestOptions(candidate.options, environment),\n ),\n )\n if (existing) {\n actorRef.send({type: 'tab.select', id: existing.id})\n return\n }\n actorRef.send({type: 'tab.add', tab: parsedQueryToTabInit(parsed), fetch: 'link'})\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n status: 'warning',\n title: t('vista.saved.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n }","() => {\n if (!linkedUrl || linkedUrl === knownUrlRef.current) return\n knownUrlRef.current = linkedUrl\n openLinkedRequest(linkedUrl)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","[linkedUrl]","(url: string | null) => {\n knownUrlRef.current = url\n if (url === linkedUrl) return\n router.navigate(\n {...router.state, _searchParams: url ? [[URL_STATE_PARAM, url]] : []},\n {replace: true},\n )\n }","router.state","url","() => {\n const timer = setTimeout(() => writeUrl(activeUrl), WRITE_DELAY_MS)\n return () => clearTimeout(timer)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","[activeUrl]","_c","{tab}: {tab: VistaTab}","(snapshot) => snapshot.context.runners[tab.id]","id","async (name: ToolName, input: Record<string, unknown>) => {\n switch (name) {\n case 'vision_get_state': {\n const runner = runnerRef?.getSnapshot()\n return text({\n title: tab.title,\n query: tab.query,\n params: tab.rawParams,\n dataset: resolved.dataset,\n apiVersion: resolved.apiVersion,\n perspective: resolved.perspective ?? null,\n variant: resolved.variant ?? null,\n useCdn: resolved.useCdn,\n status: runner?.matches({request: 'fetching'})\n ? 'fetching'\n : runner?.matches({request: 'failed'})\n ? 'failed'\n : runner?.context.meta\n ? 'settled'\n : 'idle',\n error: runner?.context.error?.message ?? null,\n ms: runner?.context.meta?.ms ?? null,\n result: runner?.context.meta ? runner.context.result : null,\n })\n }\n case 'vision_run_query': {\n const {query, params} = readQuery(input)\n const response = await resolved.client.fetch(query, params, {\n filterResponse: false,\n useCdn: resolved.useCdn,\n tag: 'vista.webmcp',\n })\n return text({ms: response.ms, result: response.result})\n }\n case 'vision_open_query': {\n const {query, params} = readQuery(input)\n const title =\n typeof input.title === 'string' && input.title.trim() ? input.title : undefined\n actorRef.send({\n type: 'tab.add',\n tab: {query, rawParams: JSON.stringify(params, null, 2), title, options: tab.options},\n fetch: input.run === false ? undefined : 'generated',\n })\n return text(`Opened the query in a new tab${input.run === false ? '' : ' and ran it'}.`)\n }\n case 'vision_check_query': {\n const {query} = readQuery(input)\n const state = EditorState.create({\n doc: query,\n extensions: [\n functionLibrary.of(library),\n ...(schema ? [querySchema.of(createQuerySchema(schema))] : []),\n ],\n })\n const diagnostics = await groqLintSource({state})\n return text(\n diagnostics.map((diagnostic) => {\n const line = state.doc.lineAt(diagnostic.from)\n return {\n line: line.number,\n column: diagnostic.from - line.from + 1,\n severity: diagnostic.severity,\n rule: diagnostic.source ?? null,\n message: diagnostic.message,\n text: query.slice(diagnostic.from, diagnostic.to),\n }\n }),\n )\n }\n case 'vision_explain_query': {\n const {query, params} = readQuery(input)\n const plan = await fetchQueryPlan(resolved.client, {query, params})\n return text({\n plan,\n standsOut: readPlanInsights(plan).map((insight) => ({\n note: describeInsight(insight, t),\n tone: insight.tone,\n ...(insight.kind === 'filter-in-memory' ? {expression: insight.expression} : {}),\n })),\n })\n }\n case 'vision_describe_schema': {\n if (!schema) return text('The workspace has no schema.', true)\n const types = Array.isArray(input.types)\n ? input.types.filter((type): type is string => typeof type === 'string')\n : []\n return text(\n types.length > 0\n ? summarizeSchema(schema, types.join(' '))\n : `Document types: ${getDocumentTypeNames(schema).join(', ')}`,\n )\n }\n case 'vision_preview_mutations': {\n const mutations = toMutations(input.mutations)\n if (mutations.status === 'empty') return text('There are no mutations to run.', true)\n if (mutations.status === 'invalid-mutation') {\n return text(\n `Mutation ${mutations.index} needs exactly one of create, createOrReplace, createIfNotExists, delete or patch.`,\n true,\n )\n }\n if (mutations.status !== 'valid') return text('mutations must be a list.', true)\n const preview = await previewMutations(resolved.client, mutations.mutations, {\n autoGenerateArrayKeys: input.autoGenerateArrayKeys !== false,\n })\n return text({\n dataset: resolved.dataset,\n documents: preview.changes,\n notCompared: preview.notShown,\n })\n }\n default: {\n const unhandled: never = name\n return text(`Unknown tool ${String(unhandled)}`, true)\n }\n }\n }","resolved.perspective","runnerRef?.getSnapshot","options","query","rawParams","title","params","(type): type is string => typeof type === 'string'","(name: ToolName) => {\n switch (name) {\n case 'vision_get_state':\n return t('vista.webmcp.get-state')\n case 'vision_run_query':\n return t('vista.webmcp.run-query')\n case 'vision_open_query':\n return t('vista.webmcp.open-query')\n case 'vision_check_query':\n return t('vista.webmcp.check-query')\n case 'vision_explain_query':\n return t('vista.webmcp.explain-query')\n case 'vision_describe_schema':\n return t('vista.webmcp.describe-schema')\n case 'vision_preview_mutations':\n return t('vista.webmcp.preview-mutations')\n default: {\n const unhandled: never = name\n return String(unhandled)\n }\n }\n }","name","unhandled","() => {\n const modelContext = getModelContext()\n if (!modelContext) return undefined\n const controller = new AbortController()\n for (const tool of TOOLS) {\n void modelContext\n .registerTool(\n {\n name: tool.name,\n title: titleOf(tool.name),\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {readOnlyHint: tool.readOnly},\n execute: async (input) => {\n try {\n return await execute(tool.name, input ?? {})\n } catch (error) {\n return text(error instanceof Error ? error.message : String(error), true)\n }\n },\n },\n {signal: controller.signal},\n )\n // Another Vision instance on the page has the names already\n .catch(() => undefined)\n }\n return () => controller.abort()\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }","input","error","() => undefined","[]","_c","unhandled","unhandled_0","getVistaLayout(\n rootSize?.width || (typeof window === 'undefined' ? STACKED_BREAKPOINT : window.innerWidth),\n )","rootSize?.width || (typeof window === 'undefined' ? STACKED_BREAKPOINT : window.innerWidth)","{\n datasets,\n defaultDataset,\n defaultApiVersion: `${config.defaultApiVersion}`,\n }","`${config.defaultApiVersion}`","useMemo(\n (): VistaStorageDefaults => ({\n datasets,\n defaultDataset,\n defaultApiVersion: `${config.defaultApiVersion}`,\n }),\n [datasets, defaultDataset, config.defaultApiVersion],\n )","() => loadVistaState(projectId, defaults)","{input: {projectId, persisted, defaults}}","{layout, switchToClassic: onSwitchToClassic}","useMemo(\n (): VistaExperience => ({layout, switchToClassic: onSwitchToClassic}),\n [layout, onSwitchToClassic],\n )","{element: tabDrawerElement, setElement: setTabDrawerElement}","useMemo(\n (): TabDrawerSlot => ({element: tabDrawerElement, setElement: setTabDrawerElement}),\n [tabDrawerElement],\n )","<VistaSidebar />","<QueryTabBar />","<QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />","activeTab.id","<Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>","layout === 'mobile' && openDrawer !== null","<Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>","<VistaDialogs />","<VistaUrlState tab={activeTab} />","<VistaWebMcp tab={activeTab} />","<TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>","TabDrawerSlotContext.Provider","<SidebarBadgesContext.Provider value={sidebarBadges}>\n <TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>\n </SidebarBadgesContext.Provider>","SidebarBadgesContext.Provider","<PendingEditsContext.Provider value={pendingEdits}>\n <SidebarBadgesContext.Provider value={sidebarBadges}>\n <TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>\n </SidebarBadgesContext.Provider>\n </PendingEditsContext.Provider>","PendingEditsContext.Provider","<SavedQueriesContext.Provider value={savedQueries}>\n <PendingEditsContext.Provider value={pendingEdits}>\n <SidebarBadgesContext.Provider value={sidebarBadges}>\n <TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>\n </SidebarBadgesContext.Provider>\n </PendingEditsContext.Provider>\n </SavedQueriesContext.Provider>","SavedQueriesContext.Provider","<VistaExperienceContext.Provider value={experience}>\n <SavedQueriesContext.Provider value={savedQueries}>\n <PendingEditsContext.Provider value={pendingEdits}>\n <SidebarBadgesContext.Provider value={sidebarBadges}>\n <TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>\n </SidebarBadgesContext.Provider>\n </PendingEditsContext.Provider>\n </SavedQueriesContext.Provider>\n </VistaExperienceContext.Provider>","VistaExperienceContext.Provider","<VistaActorContext.Provider value={actorRef}>\n <VistaExperienceContext.Provider value={experience}>\n <SavedQueriesContext.Provider value={savedQueries}>\n <PendingEditsContext.Provider value={pendingEdits}>\n <SidebarBadgesContext.Provider value={sidebarBadges}>\n <TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>\n </SidebarBadgesContext.Provider>\n </PendingEditsContext.Provider>\n </SavedQueriesContext.Provider>\n </VistaExperienceContext.Provider>\n </VistaActorContext.Provider>","VistaActorContext.Provider","_c","styles.root","\"fetch\"","\"prettify\"","\"id\"","\"role\""],"sources":["../src/vista/hooks/useContentSize.ts","../src/vista/util/payloadSize.ts","../src/vista/util/queryNetwork.ts","../src/vista/util/syncTags.ts","../src/vista/store/queryRunnerMachine.ts","../src/vista/store/vistaStorage.ts","../src/vista/store/vistaMachine.ts","../src/vista/store/VistaActorContext.tsx","../src/vista/hooks/useOnValueChange.ts","../src/vista/util/cx.ts","../src/vista/components/vista.module.css","../src/vista/util/tabDataset.ts","../src/vista/util/tabPerspective.ts","../src/vista/hooks/useResolvedRequest.ts","../src/vista/hooks/useQueryRequestBuilder.ts","../src/vista/util/tabTitle.ts","../src/vista/hooks/useSaveCurrentQuery.ts","../src/vista/util/savedQueryTab.ts","../src/vista/components/sidebar/QueryListPanel.tsx","../src/vista/components/SwitchField.tsx","../src/vista/components/request/OptionFields.tsx","../src/vista/components/sidebar/SettingsPanel.tsx","../src/vista/components/sidebar/SidebarDrawer.tsx","../src/vista/components/sidebar/VistaSidebar.tsx","../src/vista/hooks/useCopyToClipboard.ts","../src/vista/hooks/useFollowNavbarPerspective.ts","../src/vista/hooks/useLiveSubscription.ts","../src/vista/util/shortcuts.ts","../src/vista/hooks/useVistaDocumentEvents.ts","../src/vista/util/groqWasm.ts","../src/vista/util/paramsPrefill.ts","../src/vista/util/groqEditorContext.ts","../src/vista/util/groqFunctionReference.ts","../src/vista/util/groqFunctions.ts","../src/vista/util/documentTypes.ts","../src/vista/util/schemaCheck.ts","../src/vista/util/groqLint.ts","../src/vista/util/groqFunctionEditor.ts","../src/vista/components/ActionRail.tsx","../src/vista/components/AgentActionsTooltip.tsx","../src/vista/components/CollapsiblePanel.tsx","../src/vista/components/CollapsibleSection.tsx","../src/vista/components/request/ApiVersionButton.tsx","../src/vista/util/generateQuery.ts","../src/vista/util/aiCredits.ts","../src/vista/hooks/useAiCredits.ts","../src/vista/util/schemaSummary.ts","../src/vista/components/AiCreditsStatus.tsx","../src/vista/components/PromptRow.tsx","../src/vista/components/request/GenerateQueryBar.tsx","../src/vista/components/request/LiveButton.tsx","../src/vista/components/CdnBlockedNotice.tsx","../src/vista/components/request/OptionsPanel.tsx","../src/vista/util/paramInference.ts","../src/vista/util/typegen/inferTypeFromValue.ts","../src/vista/util/typegen/evaluateQueryType.ts","../src/vista/hooks/useParamsInference.ts","../src/vista/components/request/ParamsForm.tsx","../src/vista/components/request/ParamsPanel.tsx","../src/vista/util/exportSnippets.ts","../src/vista/components/request/ExportQueryDialog.tsx","../src/vista/components/request/QueryActionsMenu.tsx","../src/vista/components/request/useDragResize.ts","../src/vista/components/request/RequestPanel.tsx","../src/vista/components/ResizableSplit.tsx","../src/vista/util/explainQuery.ts","../src/vista/hooks/useQueryExplain.ts","../src/vista/util/queryRequest.ts","../src/vista/components/SplitWithBottomPanel.tsx","../src/vista/components/TabDrawerPortal.tsx","../src/vista/util/deltaQuery.ts","../src/vista/components/response/JsonEditor.tsx","../src/vista/components/response/DeltaTab.tsx","../src/vista/components/response/DownloadButton.tsx","../src/vista/util/planInsights.ts","../src/vista/components/response/ExplainTab.tsx","../src/vista/components/response/FunctionsTab.tsx","../src/vista/util/omitFields.ts","../src/vista/util/requestChanges.ts","../src/vista/components/response/LazyCodeDiff.tsx","../src/vista/components/response/HistoryTab.tsx","../src/vista/components/response/LintTab.tsx","../src/vista/util/mutations.ts","../src/vista/util/generateMutations.ts","../src/vista/components/response/GenerateMutationsBar.tsx","../src/vista/components/response/MutateTab.tsx","../src/vista/util/apiRegions.ts","../src/vista/util/timeZoneLocation.ts","../src/vista/components/response/NetworkGlobe.tsx","../src/vista/components/response/NetworkTab.tsx","../src/vista/components/response/ResponseMetaTab.tsx","../src/vista/util/typegen/printUtils.ts","../src/vista/util/typegen/schemaTypes.ts","../src/vista/util/typegen/printTypeScript.ts","../src/vista/util/typegen/printZod.ts","../src/vista/components/response/ExportTypesDialog.tsx","../src/vista/components/response/ResultActionsMenu.tsx","../src/vista/util/resultGraph.ts","../src/vista/components/response/ResultGraph.module.css","../src/vista/components/response/ResultGraph.tsx","../src/vista/components/response/ResultJson.tsx","../src/vista/components/response/SourceMapTab.tsx","../src/vista/components/response/ResponsePanel.tsx","../src/vista/components/tabs/QueryTabBar.tsx","../src/vista/components/tabs/QueryTab.tsx","../src/vista/components/sidebar/ShortcutsDialog.tsx","../src/vista/components/VistaDialogs.tsx","../src/vista/components/VistaUrlState.tsx","../src/vista/components/VistaWebMcp.tsx","../src/vista/components/VistaGui.tsx"],"sourcesContent":["import {useEffect, useState} from 'react'\n\nexport interface ContentSize {\n width: number\n height: number\n}\n\n/**\n * The content box of an element, kept current by a `ResizeObserver` that is created every time\n * the effect runs. `@sanity/ui`'s `useElementSize` shares one observer per element and drops it\n * when its last subscriber leaves without forgetting the element, so a later subscription to the\n * same node is never observed again. That is what happens when a hidden `<Activity>` tears the\n * effects down and shows the tool again with its DOM intact (`beta.reactActivityMode`).\n * Returns `null` until the first measurement.\n */\nexport function useContentSize(element: HTMLElement | null): ContentSize | null {\n const [size, setSize] = useState<ContentSize | null>(null)\n\n useEffect(() => {\n if (!element) return undefined\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries.at(-1)\n if (!entry) return\n const {width, height} = entry.contentRect\n setSize((current) =>\n current && current.width === width && current.height === height ? current : {width, height},\n )\n })\n observer.observe(element)\n return () => observer.disconnect()\n }, [element])\n\n return size\n}\n","/** Approximate wire size of a JSON value, in UTF-8 bytes */\nexport function getPayloadBytes(value: unknown): number {\n const json = JSON.stringify(value)\n if (typeof json !== 'string') {\n return 0\n }\n return new TextEncoder().encode(json).byteLength\n}\n\nconst UNITS = ['B', 'kB', 'MB', 'GB']\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return '0 B'\n }\n let value = bytes\n let unit = 0\n while (value >= 1000 && unit < UNITS.length - 1) {\n value /= 1000\n unit++\n }\n const digits = unit === 0 ? 0 : value < 10 ? 2 : value < 100 ? 1 : 0\n return `${value.toFixed(digits)} ${UNITS[unit]}`\n}\n","import {\n type RawQueryResponse,\n type RequestHandler,\n type SanityClient,\n type UnfilteredResponseQueryOptions,\n} from '@sanity/client'\n\nimport {isApiCdnHost} from '../../util/parseQueryUrl'\n\n/**\n * How a query's response travelled, from the headers the API exposes to browsers\n * (`Access-Control-Expose-Headers`: `X-Sanity-Shard`, `traceparent`, plus the safelisted\n * `Cache-Control`). `X-Sanity-Age` and `Server-Timing` are not among them.\n */\nexport interface QueryNetwork {\n /** The API CDN answered rather than the API */\n viaCdn: boolean\n /**\n * The CDN answered from its cache: a cached response repeats the `traceparent` of the one it\n * was cached from, and this session got that one before. An answer the CDN cached for an\n * earlier request this session did not see reads as fresh.\n */\n cacheHit: boolean\n /** Where the query ran: `gcp-eu-w1-01-prod-1028` */\n shard: string | undefined\n /** The trace of the request that produced the response, for Sanity support */\n traceId: string | undefined\n /** `private, max-age=60, stale-while-revalidate=15` from the CDN */\n cacheControl: string | undefined\n}\n\n/** Enough to tell this session's cache hits; the oldest traces are forgotten past it */\nconst MAX_REMEMBERED_TRACES = 500\nconst rememberedTraces = new Set<string>()\n\nfunction remember(traceId: string): void {\n rememberedTraces.delete(traceId)\n rememberedTraces.add(traceId)\n if (rememberedTraces.size > MAX_REMEMBERED_TRACES) {\n const [oldest] = rememberedTraces\n rememberedTraces.delete(oldest)\n }\n}\n\nfunction urlOf(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input\n return input instanceof URL ? input.href : input.url\n}\n\nfunction readQueryNetwork(url: string, headers: Headers): QueryNetwork {\n let viaCdn = false\n try {\n viaCdn = isApiCdnHost(new URL(url).hostname)\n } catch {\n // A relative URL is the API's\n }\n const traceId = headers.get('traceparent')?.split('-')[1] || undefined\n const cacheHit = viaCdn && traceId !== undefined && rememberedTraces.has(traceId)\n if (traceId) remember(traceId)\n return {\n viaCdn,\n cacheHit,\n shard: headers.get('x-sanity-shard') ?? undefined,\n traceId,\n cacheControl: headers.get('cache-control') ?? undefined,\n }\n}\n\n/**\n * `client.fetch` that also reports how the response travelled. The client's own pipeline makes\n * the request (URL, credentials, retries, errors); a request handler only hands its transport a\n * `fetch` that reads the response headers on the way, and asks the browser to revalidate rather\n * than answer from its own cache, so a cached answer is the CDN's. `network` stays `undefined`\n * when the transport did not use it.\n */\nexport async function fetchWithNetwork(\n client: SanityClient,\n query: string,\n params: Record<string, unknown>,\n options: UnfilteredResponseQueryOptions,\n): Promise<{response: RawQueryResponse<unknown>; network: QueryNetwork | undefined}> {\n let network: QueryNetwork | undefined\n const previous = client.config().requestHandler\n const requestHandler: RequestHandler = (request, next) => {\n // `get-it` takes the request's `fetch` over the global one\n const tapped = {\n ...request,\n fetch: async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const response = await globalThis.fetch(input, {...init, cache: 'no-cache'})\n network = readQueryNetwork(urlOf(input), response.headers)\n return response\n },\n }\n return previous ? previous(tapped, next) : next(tapped)\n }\n const response = await client.withConfig({requestHandler}).fetch(query, params, options)\n return {response, network}\n}\n","import {type LiveEvent, type SyncTag} from '@sanity/client'\n\n/** The API version that introduced sync tags (and the Live Content API) */\nexport const SYNC_TAGS_API_VERSION = 'v2021-03-25'\n\n/**\n * The API version used for the live events subscription. Events are dataset-wide and tag-based,\n * so the query's own API version does not need to match.\n */\nexport const LIVE_EVENTS_API_VERSION = 'v2025-02-19'\n\nconst tagCollator = new Intl.Collator('en')\n\n/**\n * Sync tags in alphabetical order, for showing them: the API lists a response's tags in no\n * particular order, so as they come the list shifts from one fetch to the next\n */\nexport function sortSyncTags(tags: readonly SyncTag[]): SyncTag[] {\n return tags.toSorted(tagCollator.compare)\n}\n\n/** Sync tags shared by a live event and the last query response, in the order the event lists them */\nexport function getMatchingSyncTags(\n eventTags: readonly SyncTag[],\n responseTags: readonly SyncTag[] | undefined,\n): SyncTag[] {\n if (!responseTags || responseTags.length === 0 || eventTags.length === 0) {\n return []\n }\n const known = new Set(responseTags)\n return eventTags.filter((tag) => known.has(tag))\n}\n\n/**\n * Whether a live event should trigger a refetch of a query whose last response carried\n * `responseTags`. `restart` events always do (the server asks every client to resync), and so do\n * `reconnect` events: changes made while the connection was down sent no message. Presentation's\n * loader resets on both too.\n */\nexport function getLiveRefetchTags(\n event: LiveEvent | undefined,\n responseTags: readonly SyncTag[] | undefined,\n): SyncTag[] | null {\n if (!event) {\n return null\n }\n if (event.type === 'restart' || event.type === 'reconnect') {\n return []\n }\n if (event.type !== 'message') {\n return null\n }\n const matched = getMatchingSyncTags(event.tags, responseTags)\n return matched.length > 0 ? matched : null\n}\n","import {\n type LiveEvent,\n type RawQueryResponse,\n type SanityClient,\n type SyncTag,\n} from '@sanity/client'\nimport {uuid} from '@sanity/uuid'\nimport {dequal} from 'dequal/lite'\nimport {\n type ActorRefFromLogic,\n assign,\n fromObservable,\n fromPromise,\n raise,\n setup,\n type SnapshotFrom,\n} from 'xstate'\n\nimport {getPayloadBytes} from '../util/payloadSize'\nimport {fetchWithNetwork, type QueryNetwork} from '../util/queryNetwork'\nimport {getLiveRefetchTags} from '../util/syncTags'\nimport {\n type FetchHistoryEntry,\n type FetchReason,\n type HistoryResult,\n type QueryRequest,\n type ResultChange,\n type VistaResponseMeta,\n} from './types'\n\nexport const MAX_HISTORY_ENTRIES = 100\n/**\n * Results kept on history entries besides the latest one, which is on screen anyway. Automatic\n * refetching adds a result with every relevant change, so only the most recent ones stay\n */\nexport const MAX_KEPT_RESULTS = 10\n/** Results larger than this (as compact JSON) are neither compared nor kept once superseded */\nexport const MAX_COMPARED_RESULT_BYTES = 1_000_000\n\nexport interface QueryRunnerContext {\n tabId: string\n /** The request of the latest fetch; live refetches replay it */\n request: QueryRequest | undefined\n /** The request the shown `result` and `meta` belong to */\n settledRequest: QueryRequest | undefined\n /**\n * Sync tags of the last successful response, kept while later fetches of the same request\n * fail so live events keep matching and retry it\n */\n syncTags: SyncTag[] | undefined\n /** URL of the request `syncTags` were computed for */\n syncTagsUrl: string | undefined\n reason: FetchReason\n startedAt: number\n /** URL of the latest request, available as soon as a fetch starts */\n url: string | undefined\n result: unknown\n error: Error | undefined\n meta: VistaResponseMeta | undefined\n history: FetchHistoryEntry[]\n liveClient: SanityClient | undefined\n liveError: Error | undefined\n}\n\nexport type QueryRunnerEvent =\n | {type: 'fetch'; request: QueryRequest; reason: FetchReason}\n | {type: 'cancel'}\n | {type: 'clear'}\n | {type: 'live.enable'; client: SanityClient}\n | {type: 'live.disable'}\n\nexport interface QueryRunnerInput {\n tabId: string\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\nfunction appendHistory(\n history: FetchHistoryEntry[],\n entry: FetchHistoryEntry,\n): FetchHistoryEntry[] {\n let kept = 0\n return [entry, ...history].slice(0, MAX_HISTORY_ENTRIES).map((item, index) => {\n if (index === 0 || item.result === undefined) return item\n if (kept < MAX_KEPT_RESULTS && item.result.bytes <= MAX_COMPARED_RESULT_BYTES) {\n kept++\n return item\n }\n return {...item, result: undefined}\n })\n}\n\nfunction compareWithPrevious(\n history: FetchHistoryEntry[],\n next: HistoryResult,\n): ResultChange | undefined {\n const previous = history.find((entry) => entry.status === 'ok')\n if (previous === undefined) return undefined\n // The latest successful result is only dropped for its size, so a missing one is too large too\n if (\n previous.result === undefined ||\n previous.result.bytes > MAX_COMPARED_RESULT_BYTES ||\n next.bytes > MAX_COMPARED_RESULT_BYTES\n ) {\n return 'too-large'\n }\n return dequal(previous.result.value, next.value) ? 'unchanged' : 'changed'\n}\n\n/**\n * Runs the GROQ queries of one tab and keeps the response, the fetch history and the live\n * (sync tag) subscription. The `request` region owns the fetch lifecycle; a new `fetch` event\n * while one is in flight aborts it through the promise actor's signal and starts over. The `live`\n * region subscribes to the Live Content API while enabled and raises a `fetch` whenever an event\n * carries a sync tag from the last response.\n */\nexport const queryRunnerMachine = setup({\n types: {} as {\n context: QueryRunnerContext\n events: QueryRunnerEvent\n input: QueryRunnerInput\n },\n actors: {\n runQuery: fromPromise<\n {response: RawQueryResponse<unknown>; network: QueryNetwork | undefined},\n {request: QueryRequest; lastLiveEventId: string | undefined}\n >(({input, signal}) =>\n fetchWithNetwork(input.request.client, input.request.query, input.request.params, {\n filterResponse: false,\n resultSourceMap: input.request.includeSourceMap || undefined,\n // Per request: the client ignores a configured `useCdn` while it signs in with a cookie\n useCdn: input.request.useCdn,\n // The live event that triggered the refetch, so the CDN does not answer from its cache\n lastLiveEventId: input.lastLiveEventId,\n tag: 'vista',\n signal,\n }),\n ),\n liveEvents: fromObservable<LiveEvent, {client: SanityClient}>(({input}) =>\n input.client.live.events({includeDrafts: true, tag: 'vista'}),\n ),\n },\n guards: {\n hasResponse: ({context}) => context.settledRequest !== undefined,\n },\n actions: {\n storeRequest: assign({\n request: ({context, event}) => (event.type === 'fetch' ? event.request : context.request),\n reason: ({context, event}) => (event.type === 'fetch' ? event.reason : context.reason),\n }),\n markStarted: assign({\n startedAt: () => Date.now(),\n url: ({context}) => context.request?.url,\n error: undefined,\n }),\n // A cancelled fetch leaves the previous response on screen, so the request goes back to it\n restoreSettledRequest: assign({\n request: ({context}) => context.settledRequest,\n url: ({context}) => context.settledRequest?.url,\n error: undefined,\n }),\n clearResponse: assign({\n request: undefined,\n settledRequest: undefined,\n syncTags: undefined,\n syncTagsUrl: undefined,\n url: undefined,\n result: undefined,\n error: undefined,\n meta: undefined,\n }),\n storeLiveClient: assign({\n liveClient: ({context, event}) =>\n event.type === 'live.enable' ? event.client : context.liveClient,\n liveError: undefined,\n }),\n },\n}).createMachine({\n id: 'queryRunner',\n type: 'parallel',\n context: ({input}) => ({\n tabId: input.tabId,\n request: undefined,\n settledRequest: undefined,\n syncTags: undefined,\n syncTagsUrl: undefined,\n reason: {type: 'manual'},\n startedAt: 0,\n url: undefined,\n result: undefined,\n error: undefined,\n meta: undefined,\n history: [],\n liveClient: undefined,\n liveError: undefined,\n }),\n states: {\n request: {\n initial: 'idle',\n on: {\n fetch: {target: '.fetching', actions: 'storeRequest'},\n clear: {target: '.idle', actions: 'clearResponse'},\n },\n states: {\n idle: {},\n fetching: {\n entry: 'markStarted',\n invoke: {\n src: 'runQuery',\n input: ({context}) => ({\n request: context.request as QueryRequest,\n lastLiveEventId:\n context.request?.useCdn && context.reason.type === 'live'\n ? context.reason.eventId\n : undefined,\n }),\n onDone: {\n target: 'settled',\n actions: assign(({context, event}) => {\n const {response, network} = event.output\n const e2eMs = Date.now() - context.startedAt\n const meta: VistaResponseMeta = {\n url: context.request?.url || '',\n ms: response.ms,\n e2eMs,\n payloadBytes: getPayloadBytes(response.result),\n syncTags: response.syncTags || [],\n resultSourceMap: response.resultSourceMap,\n network,\n }\n const historyResult: HistoryResult = {\n value: response.result,\n bytes: meta.payloadBytes,\n }\n return {\n settledRequest: context.request,\n syncTags: meta.syncTags,\n syncTagsUrl: context.request?.url,\n result: response.result,\n error: undefined,\n meta,\n history: appendHistory(context.history, {\n id: uuid(),\n requestedAt: new Date(context.startedAt).toISOString(),\n reason: context.reason,\n url: meta.url,\n query: context.request?.query ?? '',\n params: context.request?.params ?? {},\n status: 'ok',\n ms: response.ms,\n e2eMs,\n errorMessage: undefined,\n network,\n result: historyResult,\n resultChange: compareWithPrevious(context.history, historyResult),\n }),\n }\n }),\n },\n onError: {\n target: 'failed',\n actions: assign(({context, event}) => {\n const error = toError(event.error)\n // The previous response is gone from the screen. Its sync tags live on while the\n // failed fetch was for the same request, so relevant content changes still retry\n // it; tags of another request would only retry this one on unrelated changes\n const sameRequest = context.request?.url === context.syncTagsUrl\n return {\n settledRequest: undefined,\n result: undefined,\n meta: undefined,\n syncTags: sameRequest ? context.syncTags : undefined,\n syncTagsUrl: sameRequest ? context.syncTagsUrl : undefined,\n error,\n history: appendHistory(context.history, {\n id: uuid(),\n requestedAt: new Date(context.startedAt).toISOString(),\n reason: context.reason,\n url: context.request?.url || '',\n query: context.request?.query ?? '',\n params: context.request?.params ?? {},\n status: 'error',\n ms: undefined,\n e2eMs: Date.now() - context.startedAt,\n errorMessage: error.message,\n network: undefined,\n result: undefined,\n resultChange: undefined,\n }),\n }\n }),\n },\n },\n on: {\n cancel: [\n {guard: 'hasResponse', target: 'settled', actions: 'restoreSettledRequest'},\n {target: 'idle', actions: 'clearResponse'},\n ],\n },\n },\n settled: {},\n failed: {},\n },\n },\n live: {\n initial: 'off',\n states: {\n off: {\n entry: assign({liveError: undefined}),\n on: {\n 'live.enable': {target: 'on', actions: 'storeLiveClient'},\n },\n },\n on: {\n invoke: {\n src: 'liveEvents',\n input: ({context}) => ({client: context.liveClient as SanityClient}),\n onSnapshot: {\n guard: ({context, event}) => {\n if (context.request === undefined) return false\n const matched = getLiveRefetchTags(event.snapshot.context, context.syncTags)\n if (matched === null) return false\n // The tags belong to the response shown; a message matching them says nothing\n // about a different request in flight, which would only be restarted by it. A\n // restart (no tags) replays whatever the current request is\n return matched.length === 0 || context.request.url === context.syncTagsUrl\n },\n actions: raise(({context, event}) => {\n const liveEvent = event.snapshot.context\n const eventId =\n liveEvent && 'id' in liveEvent && typeof liveEvent.id === 'string'\n ? liveEvent.id\n : undefined\n return {\n type: 'fetch' as const,\n request: context.request as QueryRequest,\n reason: {\n type: 'live' as const,\n matchedTags: getLiveRefetchTags(liveEvent, context.syncTags) || [],\n ...(eventId === undefined ? {} : {eventId}),\n },\n }\n }),\n },\n onError: {\n target: 'failed',\n actions: assign({liveError: ({event}) => toError(event.error)}),\n },\n },\n on: {\n 'live.disable': {target: 'off'},\n // A new client (for instance after switching dataset) needs a new subscription\n 'live.enable': {target: 'on', reenter: true, actions: 'storeLiveClient'},\n },\n },\n failed: {\n on: {\n 'live.disable': {target: 'off'},\n 'live.enable': {target: 'on', actions: 'storeLiveClient'},\n },\n },\n },\n },\n },\n})\n\nexport type QueryRunnerRef = ActorRefFromLogic<typeof queryRunnerMachine>\nexport type QueryRunnerSnapshot = SnapshotFrom<typeof queryRunnerMachine>\n\nexport type RequestStatus = 'idle' | 'fetching' | 'settled' | 'failed'\n\nexport function selectRequestStatus(snapshot: QueryRunnerSnapshot): RequestStatus {\n if (snapshot.matches({request: 'fetching'})) return 'fetching'\n if (snapshot.matches({request: 'failed'})) return 'failed'\n if (snapshot.matches({request: 'settled'})) return 'settled'\n return 'idle'\n}\n\nexport function selectIsFetching(snapshot: QueryRunnerSnapshot): boolean {\n return snapshot.matches({request: 'fetching'})\n}\n","import {uuid} from '@sanity/uuid'\n\nimport {DEFAULT_API_VERSION} from '../../apiVersions'\nimport {isPlainObject} from '../../util/isPlainObject'\nimport {getStorage, VISION_STORAGE_KEY_PREFIX} from '../../util/localStorage'\nimport {prefixApiVersion} from '../../util/prefixApiVersion'\nimport {validateApiVersion} from '../../util/validateApiVersion'\nimport {\n type VistaDatasetMode,\n type VistaDrawer,\n type VistaHistoryDiffSettings,\n type VistaPanelsState,\n type VistaPersistedState,\n type VistaPerspective,\n type VistaSavedFunction,\n type VistaSettings,\n type VistaSidebarState,\n type VistaTab,\n type VistaTabInit,\n type VistaTabOptions,\n} from './types'\n\nconst STATE_VERSION = 1\n\nexport const DEFAULT_PARAMS = '{\\n \\n}'\n\n/** Every panel starts out expanded */\nconst DEFAULT_PANELS: VistaPanelsState = {\n params: true,\n options: true,\n paramsView: 'json',\n resultView: 'tree',\n}\n\n/** Fields that change with every revision, so a diff of them says nothing about the content */\nexport const DEFAULT_HIDDEN_DIFF_FIELDS = ['_rev', '_updatedAt', '_system.base.rev']\n\nexport interface VistaStorageDefaults {\n datasets: string[]\n /** The workspace's dataset (or the tool's configured default); tabs follow it unless pinned */\n defaultDataset: string\n /** From the tool config, with or without the `v` prefix */\n defaultApiVersion: string\n}\n\nconst VISTA_PERSPECTIVES: readonly VistaPerspective[] = [\n 'global',\n 'raw',\n 'published',\n 'drafts',\n 'scheduledDrafts',\n]\n\n/** The dataset tabs follow: the workspace's when the tool knows it, else the first one listed */\nexport function resolveWorkspaceDataset(defaults: VistaStorageDefaults): string {\n return defaults.datasets.includes(defaults.defaultDataset)\n ? defaults.defaultDataset\n : defaults.datasets[0]\n}\n\n/** Lives under the classic tool's prefix so its error boundary's \"Clear cache\" resets both */\nexport function getVistaStorageKey(projectId: string): string {\n return `${VISION_STORAGE_KEY_PREFIX}vista:${projectId}`\n}\n\nexport function resolveDefaultSettings(defaults: VistaStorageDefaults): VistaSettings {\n const apiVersion = prefixApiVersion(defaults.defaultApiVersion)\n return {\n datasetMode: 'workspace',\n dataset: resolveWorkspaceDataset(defaults),\n apiVersion: validateApiVersion(apiVersion) ? apiVersion : DEFAULT_API_VERSION,\n perspective: 'global',\n variant: 'global',\n includeSourceMap: false,\n useCdn: false,\n }\n}\n\nexport function createTabOptions(settings: VistaSettings): VistaTabOptions {\n return {...settings}\n}\n\nexport function createTab(settings: VistaSettings, tab: VistaTabInit = {}): VistaTab {\n return {\n id: uuid(),\n title: undefined,\n query: '',\n rawParams: DEFAULT_PARAMS,\n autoRefetch: false,\n ...tab,\n options: {...createTabOptions(settings), ...tab.options},\n }\n}\n\nexport function createInitialState(defaults: VistaStorageDefaults): VistaPersistedState {\n const settings = resolveDefaultSettings(defaults)\n const tab = createTab(settings)\n return {\n version: STATE_VERSION,\n tabs: [tab],\n activeTabId: tab.id,\n settings,\n sidebar: {expanded: false, drawer: null},\n panels: {...DEFAULT_PANELS},\n historyDiff: {hiddenFields: [...DEFAULT_HIDDEN_DIFF_FIELDS]},\n functions: [],\n }\n}\n\n/**\n * The classic tool's `pinnedRelease` (and state saved before `global` existed) reads as `global`;\n * `null` is how the API default is stored (see `saveVistaState`)\n */\nfunction sanitizePerspective(value: unknown): VistaPerspective {\n if (value === 'pinnedRelease') return 'global'\n if (value === null) return undefined\n return VISTA_PERSPECTIVES.includes(value as VistaPerspective)\n ? (value as VistaPerspective)\n : undefined\n}\n\n/**\n * The options stored for a tab or as the settings, each field falling back to `fallback` when\n * missing or unusable. State saved before `datasetMode` existed always stored a dataset: the\n * workspace's was the default back then, so it keeps following the workspace, any other one\n * was chosen on purpose and stays pinned.\n */\nfunction sanitizeOptions(\n value: Record<string, unknown>,\n fallback: VistaTabOptions,\n defaults: VistaStorageDefaults,\n): VistaTabOptions {\n const dataset =\n typeof value.dataset === 'string' && defaults.datasets.includes(value.dataset)\n ? value.dataset\n : undefined\n let legacyMode: VistaDatasetMode | undefined\n if (dataset !== undefined && !('datasetMode' in value)) {\n legacyMode = dataset === resolveWorkspaceDataset(defaults) ? 'workspace' : 'pinned'\n }\n const apiVersion = typeof value.apiVersion === 'string' ? value.apiVersion : fallback.apiVersion\n return {\n datasetMode:\n value.datasetMode === 'pinned' || value.datasetMode === 'workspace'\n ? value.datasetMode\n : (legacyMode ?? fallback.datasetMode),\n dataset: dataset ?? fallback.dataset,\n apiVersion: validateApiVersion(apiVersion) ? apiVersion : fallback.apiVersion,\n perspective:\n 'perspective' in value ? sanitizePerspective(value.perspective) : fallback.perspective,\n variant:\n value.variant === 'none' || value.variant === 'global' ? value.variant : fallback.variant,\n includeSourceMap:\n typeof value.includeSourceMap === 'boolean'\n ? value.includeSourceMap\n : fallback.includeSourceMap,\n useCdn: typeof value.useCdn === 'boolean' ? value.useCdn : fallback.useCdn,\n }\n}\n\nfunction sanitizeSettings(\n value: unknown,\n fallback: VistaSettings,\n defaults: VistaStorageDefaults,\n): VistaSettings {\n return isPlainObject(value) ? sanitizeOptions(value, fallback, defaults) : fallback\n}\n\nfunction sanitizeTab(\n value: unknown,\n settings: VistaSettings,\n defaults: VistaStorageDefaults,\n): VistaTab | null {\n if (!isPlainObject(value) || typeof value.id !== 'string') {\n return null\n }\n const options = isPlainObject(value.options) ? value.options : {}\n\n return createTab(settings, {\n id: value.id,\n title: typeof value.title === 'string' ? value.title : undefined,\n query: typeof value.query === 'string' ? value.query : '',\n rawParams: typeof value.rawParams === 'string' ? value.rawParams : DEFAULT_PARAMS,\n autoRefetch: value.autoRefetch === true,\n options: sanitizeOptions(options, createTabOptions(settings), defaults),\n })\n}\n\nconst DRAWERS: readonly VistaDrawer[] = [\n 'saved',\n 'shared',\n 'lint',\n 'functions',\n 'delta',\n 'mutate',\n 'settings',\n]\n\nfunction sanitizeSidebar(value: unknown): VistaSidebarState {\n if (!isPlainObject(value)) {\n return {expanded: false, drawer: null}\n }\n return {\n expanded: value.expanded === true,\n drawer: DRAWERS.find((drawer) => drawer === value.drawer) ?? null,\n }\n}\n\n/**\n * A panel stays expanded unless it was explicitly collapsed, the params show as JSON unless the\n * form was chosen, and the result as a tree unless JSON was; state saved before any of them\n * existed reads that way\n */\nfunction sanitizePanels(value: unknown): VistaPanelsState {\n const panels = isPlainObject(value) ? value : {}\n return {\n params: panels.params !== false,\n options: panels.options !== false,\n paramsView: panels.paramsView === 'form' ? 'form' : 'json',\n resultView:\n panels.resultView === 'json' || panels.resultView === 'graph' ? panels.resultView : 'tree',\n }\n}\n\n/** Unique, trimmed paths; state saved before the setting existed hides the default fields */\nfunction sanitizeHistoryDiff(value: unknown): VistaHistoryDiffSettings {\n const fields = isPlainObject(value) ? value.hiddenFields : undefined\n if (!Array.isArray(fields)) return {hiddenFields: [...DEFAULT_HIDDEN_DIFF_FIELDS]}\n return {\n hiddenFields: [\n ...new Set(\n fields.flatMap((field) =>\n typeof field === 'string' && field.trim() ? [field.trim()] : [],\n ),\n ),\n ],\n }\n}\n\n/** Saved functions with an id and a declaration, the first of each id; state saved before had none */\nfunction sanitizeFunctions(value: unknown): VistaSavedFunction[] {\n if (!Array.isArray(value)) return []\n const functions: VistaSavedFunction[] = []\n const seenIds = new Set<string>()\n for (const candidate of value) {\n if (\n isPlainObject(candidate) &&\n typeof candidate.id === 'string' &&\n typeof candidate.declaration === 'string' &&\n !seenIds.has(candidate.id)\n ) {\n seenIds.add(candidate.id)\n functions.push({id: candidate.id, declaration: candidate.declaration})\n }\n }\n return functions\n}\n\n/**\n * Loads the persisted state for a project, dropping anything that no longer validates (unknown\n * datasets, malformed tabs, ...). Returns a fresh state when nothing usable is stored.\n */\nexport function loadVistaState(\n projectId: string,\n defaults: VistaStorageDefaults,\n): VistaPersistedState {\n const initial = createInitialState(defaults)\n const storage = getStorage()\n if (!storage) {\n return initial\n }\n\n let stored: unknown\n try {\n stored = JSON.parse(storage.getItem(getVistaStorageKey(projectId)) || 'null')\n } catch {\n return initial\n }\n\n if (!isPlainObject(stored) || stored.version !== STATE_VERSION) {\n return initial\n }\n\n const settings = sanitizeSettings(stored.settings, initial.settings, defaults)\n // Tab ids key the spawned runners and the React list, so a duplicated id keeps its first tab only\n const tabs: VistaTab[] = []\n const seenIds = new Set<string>()\n for (const candidate of Array.isArray(stored.tabs) ? stored.tabs : []) {\n const tab = sanitizeTab(candidate, settings, defaults)\n if (tab && !seenIds.has(tab.id)) {\n seenIds.add(tab.id)\n tabs.push(tab)\n }\n }\n\n const sidebar = sanitizeSidebar(stored.sidebar)\n const panels = sanitizePanels(stored.panels)\n const historyDiff = sanitizeHistoryDiff(stored.historyDiff)\n const functions = sanitizeFunctions(stored.functions)\n if (tabs.length === 0) {\n return {...initial, settings, sidebar, panels, historyDiff, functions}\n }\n\n const activeTabId =\n typeof stored.activeTabId === 'string' && tabs.some((tab) => tab.id === stored.activeTabId)\n ? stored.activeTabId\n : tabs[0].id\n\n return {\n version: STATE_VERSION,\n tabs,\n activeTabId,\n settings,\n sidebar,\n panels,\n historyDiff,\n functions,\n }\n}\n\n/**\n * The API default perspective is `undefined`, which `JSON.stringify` leaves out, and a missing\n * field reads as \"not stored\" and falls back to the settings' perspective on load; written as\n * `null` the choice survives\n */\nfunction persistPerspective(key: string, value: unknown): unknown {\n return key === 'perspective' && value === undefined ? null : value\n}\n\nexport function saveVistaState(projectId: string, state: VistaPersistedState): void {\n try {\n getStorage()?.setItem(getVistaStorageKey(projectId), JSON.stringify(state, persistPerspective))\n } catch {\n // Quota exceeded: the session keeps working, it just will not be restored\n }\n}\n\nexport function clearVistaState(projectId: string): void {\n getStorage()?.removeItem(getVistaStorageKey(projectId))\n}\n","import {\n type ActorRefFromLogic,\n assign,\n enqueueActions,\n setup,\n type SnapshotFrom,\n type Spawner,\n} from 'xstate'\n\nimport {queryRunnerMachine, type QueryRunnerRef} from './queryRunnerMachine'\nimport {\n type VistaDialog,\n type VistaDrawer,\n type VistaHistoryDiffSettings,\n type VistaPanel,\n type VistaPanelsState,\n type VistaParamsView,\n type VistaPersistedState,\n type VistaResultView,\n type VistaSavedFunction,\n type VistaSettings,\n type VistaSidebarState,\n type VistaTab,\n type VistaTabDrawer,\n type VistaTabInit,\n type VistaTabOptions,\n} from './types'\nimport {\n clearVistaState,\n createInitialState,\n createTab,\n resolveWorkspaceDataset,\n type VistaStorageDefaults,\n} from './vistaStorage'\n\n/** Where the query a tab fetches as soon as it is shown came from */\nexport type FetchOnOpenSource = 'generated' | 'paste' | 'link'\n\nexport interface VistaContext {\n projectId: string\n defaults: VistaStorageDefaults\n tabs: VistaTab[]\n activeTabId: string\n settings: VistaSettings\n historyDiff: VistaHistoryDiffSettings\n /** The functions library, most recently saved first */\n functions: VistaSavedFunction[]\n /** One query runner per open tab, keyed by tab id */\n runners: Record<string, QueryRunnerRef>\n /**\n * Bumped whenever a query is loaded into a tab from outside its editors (saved query, pasted\n * URL), so the mounted editors know to replace their content. Not persisted.\n */\n loadRevisions: Record<string, number>\n /**\n * Tabs to fetch as soon as they are shown, or right away when they already are, by tab id: a\n * generated query added in a tab or loaded into one, a query URL pasted into one, or one a\n * link to the tool opened a tab for. The source decides how the tab runs the query. Not\n * persisted.\n */\n fetchOnOpen: Record<string, FetchOnOpenSource>\n /** Sidebar state as restored from storage, consumed once by the `restoring` states */\n restoredSidebar: VistaSidebarState\n /** The drawer the `open` drawer state shows: the one last opened */\n drawer: VistaDrawer\n /** Panel state as restored from storage, consumed once by the `restoring` states */\n restoredPanels: VistaPanelsState\n}\n\nexport type VistaEvent =\n /** `fetch` has the tab fetch its query once it is shown, as a query from that source */\n | {type: 'tab.add'; tab?: VistaTabInit; fetch?: FetchOnOpenSource}\n /** The tab fetched on being shown, as `tab.add` or `tab.load` asked */\n | {type: 'tab.fetchedOnOpen'; id: string}\n | {type: 'tab.close'; id: string}\n | {type: 'tab.select'; id: string}\n /** The complete set of open tab ids in their new order */\n | {type: 'tab.reorder'; ids: string[]}\n | {type: 'tab.rename'; id: string; title: string | undefined}\n | {type: 'tab.setQuery'; id: string; query: string}\n | {type: 'tab.setParams'; id: string; rawParams: string}\n | {type: 'tab.setAutoRefetch'; id: string; autoRefetch: boolean}\n | {type: 'tab.setOptions'; id: string; options: Partial<VistaTabOptions>}\n /**\n * `fetch` has the tab fetch the loaded query (it is the active tab, so right away), as a query\n * from that source\n */\n | {type: 'tab.load'; id: string; tab: Omit<VistaTabInit, 'id'>; fetch?: FetchOnOpenSource}\n | {type: 'settings.update'; settings: Partial<VistaSettings>}\n | {type: 'historyDiff.update'; settings: Partial<VistaHistoryDiffSettings>}\n /** Saves a function to the library, replacing the one with its id */\n | {type: 'functions.save'; fn: VistaSavedFunction}\n | {type: 'functions.remove'; id: string}\n | {type: 'sidebar.toggle'}\n | {type: 'panel.toggle'; panel: VistaPanel}\n | {type: 'params.view'; view: VistaParamsView}\n | {type: 'result.view'; view: VistaResultView}\n | {type: 'drawer.toggle'; drawer: VistaDrawer}\n | {type: 'drawer.close'}\n | {type: 'dialog.open'; dialog: VistaDialog}\n | {type: 'dialog.close'}\n | {type: 'storage.clear'}\n\nexport interface VistaInput {\n projectId: string\n persisted: VistaPersistedState\n defaults: VistaStorageDefaults\n}\n\ntype RunnerSpawner = Spawner<{\n src: 'queryRunner'\n logic: typeof queryRunnerMachine\n id: string | undefined\n}>\n\nfunction spawnRunner(spawn: RunnerSpawner, tabId: string): QueryRunnerRef {\n return spawn('queryRunner', {id: `runner:${tabId}`, input: {tabId}})\n}\n\nfunction spawnRunners(spawn: RunnerSpawner, tabs: VistaTab[]): Record<string, QueryRunnerRef> {\n return Object.fromEntries(tabs.map((tab) => [tab.id, spawnRunner(spawn, tab.id)]))\n}\n\nfunction updateTab(tabs: VistaTab[], id: string, update: (tab: VistaTab) => VistaTab): VistaTab[] {\n const index = tabs.findIndex((tab) => tab.id === id)\n if (index === -1) {\n return tabs\n }\n const updated = update(tabs[index])\n if (updated === tabs[index]) {\n return tabs\n }\n const next = tabs.slice()\n next[index] = updated\n return next\n}\n\n/**\n * The root Vista actor for one project: the open tabs and their settings (persisted), one\n * spawned {@link queryRunnerMachine} per tab (runtime), and the sidebar, drawer and dialog UI\n * states. The `restoring` states pick up the persisted sidebar layout on start.\n */\nexport const vistaMachine = setup({\n types: {} as {\n context: VistaContext\n events: VistaEvent\n input: VistaInput\n },\n actors: {\n queryRunner: queryRunnerMachine,\n },\n guards: {\n // Every open tab exactly once, so a stale drag result cannot drop or duplicate tabs\n isCompleteOrder: ({context, event}) => {\n if (event.type !== 'tab.reorder') return false\n const ids = new Set(event.ids)\n return (\n ids.size === event.ids.length &&\n ids.size === context.tabs.length &&\n context.tabs.every((tab) => ids.has(tab.id))\n )\n },\n wasSidebarExpanded: ({context}) => context.restoredSidebar.expanded,\n wasPanelExpanded: ({context}, params: {panel: VistaPanel}) =>\n context.restoredPanels[params.panel],\n wasParamsForm: ({context}) => context.restoredPanels.paramsView === 'form',\n wasResultView: ({context}, params: {view: VistaResultView}) =>\n context.restoredPanels.resultView === params.view,\n isResultView: ({event}, params: {view: VistaResultView}) =>\n event.type === 'result.view' && event.view === params.view,\n isParamsView: ({event}, params: {view: VistaParamsView}) =>\n event.type === 'params.view' && event.view === params.view,\n wasDrawerOpen: ({context}) => context.restoredSidebar.drawer !== null,\n isPanel: ({event}, params: {panel: VistaPanel}) =>\n event.type === 'panel.toggle' && event.panel === params.panel,\n isOpenDrawer: ({context, event}) =>\n event.type === 'drawer.toggle' && event.drawer === context.drawer,\n },\n actions: {\n setDrawer: assign(({event}) => (event.type === 'drawer.toggle' ? {drawer: event.drawer} : {})),\n addTab: assign(({context, event, spawn}) => {\n if (event.type !== 'tab.add') {\n return {}\n }\n const tab = createTab(context.settings, event.tab)\n if (context.tabs.some((existing) => existing.id === tab.id)) {\n return {activeTabId: tab.id}\n }\n return {\n tabs: [...context.tabs, tab],\n activeTabId: tab.id,\n runners: {...context.runners, [tab.id]: spawnRunner(spawn, tab.id)},\n fetchOnOpen: event.fetch\n ? {...context.fetchOnOpen, [tab.id]: event.fetch}\n : context.fetchOnOpen,\n }\n }),\n closeTab: enqueueActions(({context, event, enqueue}) => {\n if (event.type !== 'tab.close') {\n return\n }\n const index = context.tabs.findIndex((tab) => tab.id === event.id)\n if (index === -1) {\n return\n }\n const runner = context.runners[event.id]\n if (runner) {\n enqueue.stopChild(runner)\n }\n const {[event.id]: _removed, ...runners} = context.runners\n const remaining = context.tabs.filter((tab) => tab.id !== event.id)\n if (event.id in context.fetchOnOpen) {\n const {[event.id]: _pending, ...fetchOnOpen} = context.fetchOnOpen\n enqueue.assign({fetchOnOpen})\n }\n\n if (remaining.length === 0) {\n const fallback = createTab(context.settings)\n enqueue.assign(({spawn}) => ({\n tabs: [fallback],\n activeTabId: fallback.id,\n runners: {...runners, [fallback.id]: spawnRunner(spawn, fallback.id)},\n }))\n return\n }\n\n // Prefer the tab that took the closed tab's place, otherwise the previous one\n const activeTabId =\n context.activeTabId === event.id\n ? remaining[Math.min(index, remaining.length - 1)].id\n : context.activeTabId\n enqueue.assign({tabs: remaining, activeTabId, runners})\n }),\n clearStorage: enqueueActions(({context, enqueue}) => {\n for (const runner of Object.values(context.runners)) {\n enqueue.stopChild(runner)\n }\n enqueue(() => clearVistaState(context.projectId))\n enqueue.assign(({spawn}) => {\n const fresh = createInitialState(context.defaults)\n return {\n tabs: fresh.tabs,\n activeTabId: fresh.activeTabId,\n settings: fresh.settings,\n historyDiff: fresh.historyDiff,\n functions: fresh.functions,\n runners: spawnRunners(spawn, fresh.tabs),\n fetchOnOpen: {},\n }\n })\n }),\n },\n}).createMachine({\n id: 'vista',\n type: 'parallel',\n context: ({input, spawn}) => ({\n projectId: input.projectId,\n defaults: input.defaults,\n tabs: input.persisted.tabs,\n activeTabId: input.persisted.activeTabId,\n settings: input.persisted.settings,\n historyDiff: input.persisted.historyDiff,\n functions: input.persisted.functions,\n runners: spawnRunners(spawn, input.persisted.tabs),\n loadRevisions: {},\n fetchOnOpen: {},\n restoredSidebar: input.persisted.sidebar,\n drawer: input.persisted.sidebar.drawer ?? 'saved',\n restoredPanels: input.persisted.panels,\n }),\n on: {\n 'tab.add': {actions: 'addTab'},\n 'tab.close': {actions: 'closeTab'},\n 'tab.select': {\n guard: ({context, event}) => context.tabs.some((tab) => tab.id === event.id),\n actions: assign({activeTabId: ({event}) => event.id}),\n },\n 'tab.reorder': {\n guard: 'isCompleteOrder',\n actions: assign({\n tabs: ({context, event}) => {\n const byId = new Map(context.tabs.map((tab) => [tab.id, tab]))\n return event.ids.flatMap((id) => byId.get(id) ?? [])\n },\n }),\n },\n 'tab.fetchedOnOpen': {\n actions: assign({\n fetchOnOpen: ({context, event}) => {\n const {[event.id]: _fetched, ...fetchOnOpen} = context.fetchOnOpen\n return fetchOnOpen\n },\n }),\n },\n 'tab.rename': {\n actions: assign({\n tabs: ({context, event}) =>\n updateTab(context.tabs, event.id, (tab) => ({\n ...tab,\n title: event.title?.trim() || undefined,\n })),\n }),\n },\n 'tab.setQuery': {\n actions: assign({\n tabs: ({context, event}) =>\n updateTab(context.tabs, event.id, (tab) =>\n tab.query === event.query ? tab : {...tab, query: event.query},\n ),\n }),\n },\n 'tab.setParams': {\n actions: assign({\n tabs: ({context, event}) =>\n updateTab(context.tabs, event.id, (tab) =>\n tab.rawParams === event.rawParams ? tab : {...tab, rawParams: event.rawParams},\n ),\n }),\n },\n 'tab.setAutoRefetch': {\n actions: assign({\n tabs: ({context, event}) =>\n updateTab(context.tabs, event.id, (tab) => ({...tab, autoRefetch: event.autoRefetch})),\n }),\n },\n 'tab.setOptions': {\n actions: assign({\n tabs: ({context, event}) =>\n updateTab(context.tabs, event.id, (tab) => ({\n ...tab,\n options: {...tab.options, ...event.options},\n })),\n }),\n },\n 'tab.load': {\n actions: assign({\n tabs: ({context, event}) =>\n updateTab(context.tabs, event.id, (tab) => ({\n ...tab,\n ...event.tab,\n options: {...tab.options, ...event.tab.options},\n })),\n loadRevisions: ({context, event}) => ({\n ...context.loadRevisions,\n [event.id]: (context.loadRevisions[event.id] || 0) + 1,\n }),\n fetchOnOpen: ({context, event}) =>\n event.fetch ? {...context.fetchOnOpen, [event.id]: event.fetch} : context.fetchOnOpen,\n }),\n },\n 'settings.update': {\n actions: assign({\n settings: ({context, event}) => ({...context.settings, ...event.settings}),\n }),\n },\n 'historyDiff.update': {\n actions: assign({\n historyDiff: ({context, event}) => ({...context.historyDiff, ...event.settings}),\n }),\n },\n 'functions.save': {\n actions: assign({\n functions: ({context, event}) => [\n event.fn,\n ...context.functions.filter((saved) => saved.id !== event.fn.id),\n ],\n }),\n },\n 'functions.remove': {\n actions: assign({\n functions: ({context, event}) => context.functions.filter((saved) => saved.id !== event.id),\n }),\n },\n 'storage.clear': {\n target: [\n '.sidebar.collapsed',\n '.paramsPanel.expanded',\n '.paramsView.json',\n '.resultView.tree',\n '.optionsPanel.expanded',\n '.drawer.closed',\n '.dialog.closed',\n ],\n actions: 'clearStorage',\n },\n },\n states: {\n sidebar: {\n initial: 'restoring',\n states: {\n restoring: {\n always: [{guard: 'wasSidebarExpanded', target: 'expanded'}, {target: 'collapsed'}],\n },\n collapsed: {on: {'sidebar.toggle': {target: 'expanded'}}},\n expanded: {on: {'sidebar.toggle': {target: 'collapsed'}}},\n },\n },\n paramsPanel: {\n initial: 'restoring',\n states: {\n restoring: {\n always: [\n {guard: {type: 'wasPanelExpanded', params: {panel: 'params'}}, target: 'expanded'},\n {target: 'collapsed'},\n ],\n },\n collapsed: {\n on: {\n 'panel.toggle': {\n guard: {type: 'isPanel', params: {panel: 'params'}},\n target: 'expanded',\n },\n },\n },\n expanded: {\n on: {\n 'panel.toggle': {\n guard: {type: 'isPanel', params: {panel: 'params'}},\n target: 'collapsed',\n },\n },\n },\n },\n },\n paramsView: {\n initial: 'restoring',\n states: {\n restoring: {\n always: [{guard: 'wasParamsForm', target: 'form'}, {target: 'json'}],\n },\n json: {\n on: {\n 'params.view': {guard: {type: 'isParamsView', params: {view: 'form'}}, target: 'form'},\n },\n },\n form: {\n on: {\n 'params.view': {guard: {type: 'isParamsView', params: {view: 'json'}}, target: 'json'},\n },\n },\n },\n },\n resultView: {\n initial: 'restoring',\n on: {\n 'result.view': [\n {guard: {type: 'isResultView', params: {view: 'tree'}}, target: '.tree'},\n {guard: {type: 'isResultView', params: {view: 'json'}}, target: '.json'},\n {guard: {type: 'isResultView', params: {view: 'graph'}}, target: '.graph'},\n ],\n },\n states: {\n restoring: {\n always: [\n {guard: {type: 'wasResultView', params: {view: 'json'}}, target: 'json'},\n {guard: {type: 'wasResultView', params: {view: 'graph'}}, target: 'graph'},\n {target: 'tree'},\n ],\n },\n tree: {},\n json: {},\n graph: {},\n },\n },\n optionsPanel: {\n initial: 'restoring',\n states: {\n restoring: {\n always: [\n {guard: {type: 'wasPanelExpanded', params: {panel: 'options'}}, target: 'expanded'},\n {target: 'collapsed'},\n ],\n },\n collapsed: {\n on: {\n 'panel.toggle': {\n guard: {type: 'isPanel', params: {panel: 'options'}},\n target: 'expanded',\n },\n },\n },\n expanded: {\n on: {\n 'panel.toggle': {\n guard: {type: 'isPanel', params: {panel: 'options'}},\n target: 'collapsed',\n },\n },\n },\n },\n },\n // One drawer at a time: toggling the open one closes it, toggling another shows that one\n drawer: {\n initial: 'restoring',\n states: {\n restoring: {\n always: [{guard: 'wasDrawerOpen', target: 'open'}, {target: 'closed'}],\n },\n closed: {\n on: {'drawer.toggle': {target: 'open', actions: 'setDrawer'}},\n },\n open: {\n on: {\n 'drawer.toggle': [{guard: 'isOpenDrawer', target: 'closed'}, {actions: 'setDrawer'}],\n 'drawer.close': {target: 'closed'},\n },\n },\n },\n },\n dialog: {\n initial: 'closed',\n states: {\n closed: {on: {'dialog.open': {target: 'shortcuts'}}},\n shortcuts: {on: {'dialog.close': {target: 'closed'}}},\n },\n },\n },\n})\n\nexport type VistaSnapshot = SnapshotFrom<typeof vistaMachine>\nexport type VistaActorRef = ActorRefFromLogic<typeof vistaMachine>\n\nexport function selectPersistedState(snapshot: VistaSnapshot): VistaPersistedState {\n return {\n version: 1,\n tabs: snapshot.context.tabs,\n activeTabId: snapshot.context.activeTabId,\n settings: snapshot.context.settings,\n sidebar: {\n expanded: snapshot.matches({sidebar: 'expanded'}),\n drawer: selectOpenDrawer(snapshot),\n },\n panels: {\n params: isPanelExpanded(snapshot, 'params'),\n options: isPanelExpanded(snapshot, 'options'),\n paramsView: selectParamsView(snapshot),\n resultView: selectResultView(snapshot),\n },\n historyDiff: snapshot.context.historyDiff,\n functions: snapshot.context.functions,\n }\n}\n\nexport function selectFunctionLibrary(snapshot: VistaSnapshot): VistaSavedFunction[] {\n return snapshot.context.functions\n}\n\nexport function selectParamsView(snapshot: VistaSnapshot): VistaParamsView {\n return snapshot.matches({paramsView: 'form'}) ? 'form' : 'json'\n}\n\nexport function selectResultView(snapshot: VistaSnapshot): VistaResultView {\n if (snapshot.matches({resultView: 'json'})) return 'json'\n return snapshot.matches({resultView: 'graph'}) ? 'graph' : 'tree'\n}\n\nexport function isPanelExpanded(snapshot: VistaSnapshot, panel: VistaPanel): boolean {\n return panel === 'params'\n ? snapshot.matches({paramsPanel: 'expanded'})\n : snapshot.matches({optionsPanel: 'expanded'})\n}\n\nexport function selectActiveTab(snapshot: VistaSnapshot): VistaTab {\n const {tabs, activeTabId} = snapshot.context\n return tabs.find((tab) => tab.id === activeTabId) || tabs[0]\n}\n\nexport function selectDatasets(snapshot: VistaSnapshot): string[] {\n return snapshot.context.defaults.datasets\n}\n\n/** The dataset tabs query while they follow the workspace */\nexport function selectWorkspaceDataset(snapshot: VistaSnapshot): string {\n return resolveWorkspaceDataset(snapshot.context.defaults)\n}\n\nexport function selectProjectId(snapshot: VistaSnapshot): string {\n return snapshot.context.projectId\n}\n\nexport function selectOpenDialog(snapshot: VistaSnapshot): VistaDialog | null {\n return snapshot.matches({dialog: 'shortcuts'}) ? 'shortcuts' : null\n}\n\nexport function selectOpenDrawer(snapshot: VistaSnapshot): VistaDrawer | null {\n return snapshot.matches({drawer: 'open'}) ? snapshot.context.drawer : null\n}\n\nconst TAB_DRAWERS: readonly VistaTabDrawer[] = ['lint', 'functions', 'delta', 'mutate']\n\n/** The open drawer while it shows one of the active tab's tools */\nexport function selectOpenTabDrawer(snapshot: VistaSnapshot): VistaTabDrawer | null {\n const drawer = selectOpenDrawer(snapshot)\n return TAB_DRAWERS.find((tabDrawer) => tabDrawer === drawer) ?? null\n}\n","import {useSelector} from '@xstate/react'\nimport {createContext, useContext, useLayoutEffect} from 'react'\n\nimport {type useSavedQueries} from '../../hooks/useSavedQueries'\nimport {onLocalStorageCleared} from '../../util/localStorage'\nimport {type VistaTabDrawer} from './types'\nimport {selectPersistedState, type VistaActorRef, type VistaSnapshot} from './vistaMachine'\nimport {saveVistaState} from './vistaStorage'\n\nconst PERSIST_DEBOUNCE_MS = 200\n\nexport const VistaActorContext = createContext<VistaActorRef | null>(null)\n\nexport function useVistaActor(): VistaActorRef {\n const actorRef = useContext(VistaActorContext)\n if (!actorRef) {\n throw new Error('useVistaActor must be used within a VistaActorContext provider')\n }\n return actorRef\n}\n\nexport function useVistaSelector<T>(\n selector: (snapshot: VistaSnapshot) => T,\n compare?: (a: T, b: T) => boolean,\n): T {\n return useSelector(useVistaActor(), selector, compare)\n}\n\n/**\n * How the tool lays itself out for the available width: two columns, request stacked above\n * response, or a single column with a switch between the two (phones).\n */\nexport type VistaLayout = 'columns' | 'stacked' | 'mobile'\n\nexport interface VistaExperience {\n layout: VistaLayout\n /** Leaves the redesigned experience and returns to the classic Vision tool */\n switchToClassic: () => void\n}\n\nexport const VistaExperienceContext = createContext<VistaExperience | null>(null)\n\nexport function useVistaExperience(): VistaExperience {\n const experience = useContext(VistaExperienceContext)\n if (!experience) {\n throw new Error('useVistaExperience must be used within a VistaExperienceContext provider')\n }\n return experience\n}\n\n/**\n * Edits still waiting in an editor debounce (params edits reach the machine debounced). The\n * mounted tab registers how to commit them, and an action that reads the tab from the machine\n * commits first, so it sees what the editors show: Run, Save and Export in the tab's menu, and\n * Save in the sidebar, which has no other way to reach the tab's debounce.\n */\nexport interface PendingEdits {\n /** Registers a commit for the mounted tab's pending edits; returns the unregister */\n register: (commit: () => void) => () => void\n /** Commits every pending edit registered right now */\n commit: () => void\n}\n\nexport function createPendingEdits(): PendingEdits {\n const commits = new Set<() => void>()\n return {\n register: (commit) => {\n commits.add(commit)\n return () => {\n commits.delete(commit)\n }\n },\n commit: () => {\n for (const commit of commits) commit()\n },\n }\n}\n\nexport const PendingEditsContext = createContext<PendingEdits | null>(null)\n\nexport function usePendingEdits(): PendingEdits {\n const pendingEdits = useContext(PendingEditsContext)\n if (!pendingEdits) {\n throw new Error('usePendingEdits must be used within a PendingEditsContext provider')\n }\n return pendingEdits\n}\n\nexport type SavedQueriesApi = ReturnType<typeof useSavedQueries>\n\n/** One saved queries subscription for the whole tool, shared by the menu and the drawer */\nexport const SavedQueriesContext = createContext<SavedQueriesApi | null>(null)\n\nexport function useSavedQueriesApi(): SavedQueriesApi {\n const api = useContext(SavedQueriesContext)\n if (!api) {\n throw new Error('useSavedQueriesApi must be used within a SavedQueriesContext provider')\n }\n return api\n}\n\n/**\n * Where the open drawer shows one of the active tab's tools (`VistaTabDrawer`): the drawer renders\n * the element, and the tab renders the tool into it, from where it has everything the tool needs\n */\nexport interface TabDrawerSlot {\n element: HTMLElement | null\n setElement: (element: HTMLElement | null) => void\n}\n\nexport const TabDrawerSlotContext = createContext<TabDrawerSlot | null>(null)\n\nexport function useTabDrawerSlot(): TabDrawerSlot {\n const slot = useContext(TabDrawerSlotContext)\n if (!slot) {\n throw new Error('useTabDrawerSlot must be used within a TabDrawerSlotContext provider')\n }\n return slot\n}\n\n/** A count on a sidebar item: the active tab's lint findings or declared functions */\nexport interface SidebarBadge {\n count: number\n tone: 'default' | 'caution' | 'critical'\n}\n\nexport type SidebarBadgeMap = Partial<Record<VistaTabDrawer, SidebarBadge>>\n\n/**\n * The counts on the sidebar's items, which the active tab sets. A store of its own rather than\n * state, so a new count renders the sidebar again and nothing else\n */\nexport interface SidebarBadges {\n get: () => SidebarBadgeMap\n set: (drawer: VistaTabDrawer, badge: SidebarBadge | undefined) => void\n subscribe: (listener: () => void) => () => void\n}\n\nexport function createSidebarBadges(): SidebarBadges {\n let badges: SidebarBadgeMap = {}\n const listeners = new Set<() => void>()\n return {\n get: () => badges,\n set: (drawer, badge) => {\n const current = badges[drawer]\n if (current?.count === badge?.count && current?.tone === badge?.tone) return\n badges = badge\n ? {...badges, [drawer]: badge}\n : Object.fromEntries(Object.entries(badges).filter(([key]) => key !== drawer))\n for (const listener of listeners) listener()\n },\n subscribe: (listener) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\nexport const SidebarBadgesContext = createContext<SidebarBadges | null>(null)\n\nexport function useSidebarBadges(): SidebarBadges {\n const badges = useContext(SidebarBadgesContext)\n if (!badges) {\n throw new Error('useSidebarBadges must be used within a SidebarBadgesContext provider')\n }\n return badges\n}\n\n/**\n * Writes the persisted slice of the root actor to `localStorage`, debounced, flushing on unmount.\n * A write still pending when the storage is cleared is dropped instead, since flushing it would\n * put the state that was just cleared straight back.\n */\nexport function usePersistVistaState(actorRef: VistaActorRef, projectId: string): void {\n // A layout effect, so the subscription exists before the passive effects of the first commit\n // run: those of the tool's children run before this component's own, and a change one of them\n // makes as the tool mounts (opening a request linked from the URL) would otherwise not be saved\n useLayoutEffect(() => {\n let timer: ReturnType<typeof setTimeout> | undefined\n const dropPendingWrite = () => {\n clearTimeout(timer)\n timer = undefined\n }\n const subscription = actorRef.subscribe((snapshot) => {\n dropPendingWrite()\n timer = setTimeout(() => {\n timer = undefined\n saveVistaState(projectId, selectPersistedState(snapshot))\n }, PERSIST_DEBOUNCE_MS)\n })\n const unsubscribeClear = onLocalStorageCleared(dropPendingWrite)\n return () => {\n subscription.unsubscribe()\n unsubscribeClear()\n if (timer !== undefined) {\n // Leaving the tool within the debounce window must not lose the last edit\n clearTimeout(timer)\n saveVistaState(projectId, selectPersistedState(actorRef.getSnapshot()))\n }\n }\n }, [actorRef, projectId])\n}\n","import {useEffect, useRef} from 'react'\nimport {useEffectEvent} from 'use-effect-event'\n\n/**\n * Calls `onChange` after a render in which `value` differs from the previous render, but not on\n * mount. Compares with `Object.is`, so pass a primitive (or a string key) for compound values.\n */\nexport function useOnValueChange<T>(value: T, onChange: (value: T, previous: T) => void): void {\n const handleChange = useEffectEvent(onChange)\n const previous = useRef(value)\n\n useEffect(() => {\n if (Object.is(previous.current, value)) return\n const before = previous.current\n previous.current = value\n handleChange(value, before)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [value])\n}\n","/** Joins class names, skipping falsy entries */\nexport function cx(...classNames: Array<string | false | null | undefined>): string {\n return classNames.filter(Boolean).join(' ')\n}\n",".root {\n position: relative;\n}\n\n/* `ResizableSplit`: two panes and the divider between them */\n.splitRoot {\n display: flex;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.splitRootRow {\n flex-direction: row;\n}\n\n.splitRootColumn {\n flex-direction: column;\n}\n\n/* A pane of the split; the primary one gets its size inline, the other takes what is left */\n.splitPane {\n position: relative;\n flex: 1 1 0%;\n min-width: 0;\n min-height: 0;\n}\n\n/*\n * The divider: the visible border line, with a hit area straddling it (the same 11px as the\n * params handle) that shows while hovered, focused or dragged. Above the panes so the whole hit\n * area can be grabbed, below the sidebar (20).\n */\n.splitHandle {\n position: relative;\n flex: 0 0 1px;\n background: var(--card-border-color);\n z-index: 11;\n touch-action: none;\n outline: none;\n}\n\n.splitHandle::after {\n content: '';\n position: absolute;\n inset: -5px;\n}\n\n.splitHandle:hover::after,\n.splitHandle[data-dragging='true']::after {\n background: var(--card-shadow-ambient-color);\n}\n\n.splitHandle:focus-visible::after {\n background: var(--card-shadow-ambient-color);\n outline: 2px solid var(--card-focus-ring-color);\n outline-offset: -2px;\n}\n\n.splitHandleVertical {\n cursor: col-resize;\n}\n\n.splitHandleVertical::after {\n top: 0;\n bottom: 0;\n}\n\n.splitHandleHorizontal {\n cursor: row-resize;\n}\n\n.splitHandleHorizontal::after {\n left: 0;\n right: 0;\n}\n\n.splitHandleDisabled {\n cursor: default;\n}\n\n.splitHandleDisabled:hover::after {\n background: transparent;\n}\n\n/* Fills the pane it is rendered into */\n.paneFill {\n position: relative;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.splitPaneContainer {\n position: relative;\n min-height: 0;\n min-width: 0;\n flex: 1 1 0%;\n}\n\n/* Editor label floating above CodeMirror's gutter, aligned with its line numbers */\n.editorLabel {\n position: absolute;\n top: 1rem;\n left: 33px;\n right: 0;\n z-index: 10;\n pointer-events: none;\n user-select: none;\n}\n\n/* Result label at the same height as the editor label, aligned with the result's own padding */\n.resultLabel {\n composes: editorLabel;\n left: 12px;\n}\n\n/* Controls in an editor or result label's row: unlike the label they take the pointer */\n.labelActions {\n pointer-events: auto;\n margin-right: 12px;\n margin-top: -0.5rem;\n}\n\n/* The result's JSON view fills the result pane, its editor scrolling on its own */\n.resultJson {\n height: 100%;\n}\n\n/*\n * The box of a JSON editor (a document in Delta, the mutations in Mutate): it takes the height\n * the drawer leaves over to it, and its document scrolls inside\n */\n.jsonEditorBox {\n flex: 1 1 0%;\n min-height: 0;\n overflow: hidden;\n}\n\n/*\n * The part of a drawer section that gives up height first and scrolls (the changes of a dry run,\n * the value delta mode returned), so the section's heading and notes stay in view\n */\n.drawerScroller {\n flex: 0 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n/* Tab headers of the bottom panels scroll sideways rather than wrap when space is tight */\n.panelTabs {\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n/*\n * TabList is an Inline (inline-block children), so it wraps like text unless told otherwise; the\n * panel scrolls horizontally instead\n */\n.panelTabs [data-ui='TabList'] {\n white-space: nowrap;\n}\n\n/* The query editor takes whatever height the panels below leave over, and never less than this */\n.querySection {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 0%;\n min-height: 120px;\n}\n\n/*\n * A collapsible panel below the query editor: a header row and, while expanded, a body that\n * scrolls once the panel hits its cap. The panel is as tall as its content wants, so the\n * stacking distributes the column's height by need.\n */\n.collapsibleSection {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 0 1 auto;\n min-height: 0;\n border-top: 1px solid var(--card-border-color);\n}\n\n/* Params grow with their JSON until they would claim too much of the column */\n.paramsSection {\n max-height: 40%;\n}\n\n/* A dragged params height replaces the automatic one; the cap is enforced while dragging */\n.paramsSectionResized {\n max-height: none;\n}\n\n/* The options are finite and rarely reach this; when they do, they scroll */\n.optionsSection {\n max-height: 45%;\n}\n\n.sectionBody {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n/*\n * Drag handle straddling the params panel's top border, laid out like the split pane resizers:\n * an 11px hit area whose visible part is the border itself.\n */\n.sectionResizer {\n position: absolute;\n top: -6px;\n left: 0;\n right: 0;\n height: 11px;\n cursor: row-resize;\n /* Above the editor label (10) so the whole width can be grabbed, below the sidebar (20) */\n z-index: 11;\n touch-action: none;\n}\n\n.sectionResizer:hover,\n.sectionResizer[data-dragging='true'] {\n background: var(--card-shadow-ambient-color);\n}\n\n.sectionResizer:focus-visible {\n background: var(--card-shadow-ambient-color);\n outline: 2px solid var(--card-focus-ring-color);\n outline-offset: -2px;\n}\n\n/* Option fields flow into as many columns as fit the request column */\n.optionsGrid {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n}\n\n/* Hides the request or response pane in the single-column phone layout */\n.hiddenPane.hiddenPane {\n display: none;\n}\n\n.editorContainer {\n position: relative;\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.scrollArea {\n min-height: 0;\n overflow: auto;\n}\n\n.sidebarRail {\n flex-shrink: 0;\n transition: width 120ms ease-out;\n}\n\n/* The collapsed rail's width, which `.sidebarSlot` reserves too */\n.sidebarRailCollapsed {\n width: 49px;\n}\n\n.sidebarRailExpanded {\n width: 224px;\n}\n\n/* On phones the expanded rail floats over the content instead of squeezing it */\n.sidebarRailOverlay {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n /* Above the floating editor labels (10) and the split pane resizers */\n z-index: 21;\n background: var(--card-bg-color);\n box-shadow: 0 0 0 1px var(--card-border-color);\n}\n\n/* A sidebar item, which a count can sit on */\n.sidebarItem {\n position: relative;\n}\n\n/* A count on a sidebar item: on the icon's corner in the collapsed rail */\n.sidebarItemBadge {\n position: absolute;\n top: -2px;\n right: -2px;\n pointer-events: none;\n}\n\n/* At the end of the item's row in the expanded rail */\n.sidebarItemBadgeExpanded {\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n}\n\n/* Keeps the collapsed rail's room reserved while the expanded rail floats over the content */\n.sidebarSlot {\n position: relative;\n flex-shrink: 0;\n width: 49px;\n}\n\n.sidebarDrawer {\n width: 300px;\n flex-shrink: 0;\n min-height: 0;\n background: var(--card-bg-color);\n}\n\n/* The tab's tools and the settings take more room than a list of queries */\n.sidebarDrawerWide {\n width: min(480px, 45vw);\n}\n\n/*\n * On phones the drawer covers the whole width, rail included, instead of leaving the tabs area a\n * sliver: it closes from its own header, and an expanded rail floating over it would otherwise\n * hide most of its list.\n */\n.sidebarDrawerOverlay {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n width: auto;\n /* Above the expanded rail (21) */\n z-index: 22;\n}\n\n/*\n * The tab strip: a tinted band whose bottom rule is an inset shadow, so the selected tab's\n * background can cover it and merge with the panel below (a border would be clipped away by the\n * strip's overflow instead).\n */\n.tabBar {\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n flex-shrink: 0;\n background: var(--card-bg2-color);\n box-shadow: inset 0 -1px 0 var(--card-border-color);\n}\n\n/* Bleed buttons paint the card background, which reads as white boxes on the tinted strip */\n.tabBar [data-ui='Button']:not(:hover) {\n background-color: transparent;\n}\n\n/* The reorderable list of tabs (a motion Reorder.Group rendered as a div) */\n.tabList {\n display: flex;\n align-items: stretch;\n gap: 2px;\n}\n\n/* The draggable wrapper around each tab; motion positions it while dragging and reordering */\n.tabItem {\n position: relative;\n display: flex;\n flex-shrink: 0;\n}\n\n.tabItem[data-dragging='true'] {\n z-index: 1;\n}\n\n.tab {\n position: relative;\n flex-shrink: 0;\n max-width: 240px;\n margin-top: 4px;\n border: 1px solid transparent;\n border-bottom: none;\n border-radius: 3px 3px 0 0;\n transition: background-color 100ms;\n}\n\n.tab:hover {\n background: var(--card-muted-bg-color);\n}\n\n.tab[data-selected='true'] {\n background: var(--card-bg-color);\n border-color: var(--card-border-color);\n}\n\n.tabItem[data-dragging='true'] .tab {\n box-shadow: 0 2px 6px var(--card-shadow-umbra-color);\n}\n\n.tabTitleButton {\n min-width: 0;\n flex-shrink: 1;\n overflow: hidden;\n}\n\n.tabCloseButton {\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 100ms;\n}\n\n.tab:hover .tabCloseButton,\n.tab:focus-within .tabCloseButton,\n.tab[data-selected='true'] .tabCloseButton {\n opacity: 1;\n}\n\n.tabTitleInput {\n min-width: 120px;\n}\n\n.resultContainer {\n position: relative;\n flex: 1 1 0%;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n}\n\n.codeBlock {\n max-height: 50vh;\n overflow: auto;\n}\n\n/*\n * Single-line, ellipsized query preview. @sanity/ui's Code trims its line box with\n * pseudo-elements, so the ellipsis is applied to a wrapper with the code rendered inline.\n */\n.previewCode {\n display: block;\n min-width: 0;\n max-width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.previewCode pre,\n.previewCode code {\n display: inline;\n white-space: inherit;\n}\n\n.previewCode pre::before,\n.previewCode pre::after {\n content: none;\n}\n\n/* A lint finding is a full-width button that reads as a list row */\n.lintFindingButton {\n display: block;\n width: 100%;\n text-align: left;\n cursor: pointer;\n}\n\n.lintFindingButton:hover {\n background: var(--card-muted-bg-color);\n}\n\n/* A flex item whose content truncates instead of widening it past the row */\n.shrinkable {\n min-width: 0;\n}\n\n/* A bleed button holding a stack of texts that must truncate rather than overflow the list */\n.listItemButton {\n min-width: 0;\n}\n\n.listItemButton [data-ui='Box'],\n.listItemButton [data-ui='Flex'] {\n min-width: 0;\n max-width: 100%;\n}\n\n.listItemButton > [data-ui='Box'] {\n width: 100%;\n}\n","import {type VistaTabOptions} from '../store/types'\n\n/** The dataset a tab queries: the workspace's while following it, otherwise the pinned one */\nexport function getTabDataset(options: VistaTabOptions, workspaceDataset: string): string {\n return options.datasetMode === 'workspace' ? workspaceDataset : options.dataset\n}\n","import {type VistaPerspective} from '../store/types'\n\n/**\n * The perspective a tab's option stands for in the current workspace. A project's tabs and\n * settings are stored once for all of its workspaces, and `scheduledDrafts` only exists where\n * the workspace has scheduled drafts enabled: elsewhere it counts as `global`, in the options\n * and for the request alike, while the stored choice keeps its meaning for the workspaces that\n * have the feature.\n */\nexport function getEffectivePerspective(\n perspective: VistaPerspective,\n isScheduledDraftsEnabled: boolean,\n): VistaPerspective {\n return perspective === 'scheduledDrafts' && !isScheduledDraftsEnabled ? 'global' : perspective\n}\n","import {type ClientPerspective, type ReleaseDocument, type SanityClient} from '@sanity/client'\nimport {useMemo} from 'react'\nimport {\n getDefaultVariant,\n getReleaseIdFromReleaseDocumentId,\n isCardinalityOneRelease,\n type PerspectiveContextValue,\n type PerspectiveStack,\n sortReleases,\n useActiveReleases,\n useClient,\n usePerspective,\n useScheduledDraftsEnabled,\n useWorkspace,\n} from 'sanity'\n\nimport {DEFAULT_API_VERSION, VARIANTS_API_VERSION} from '../../apiVersions'\nimport {useVariantsEnabled} from '../../hooks/useVariantsEnabled'\nimport {getActivePerspective} from '../../perspectives'\nimport {isApiVersionBelow} from '../../util/compareApiVersion'\nimport {prefixApiVersion} from '../../util/prefixApiVersion'\nimport {validateApiVersion} from '../../util/validateApiVersion'\nimport {type VistaPerspective, type VistaTabOptions} from '../store/types'\nimport {useVistaSelector} from '../store/VistaActorContext'\nimport {selectWorkspaceDataset} from '../store/vistaMachine'\nimport {SYNC_TAGS_API_VERSION} from '../util/syncTags'\nimport {getTabDataset} from '../util/tabDataset'\nimport {getEffectivePerspective} from '../util/tabPerspective'\n\nexport interface ResolvedRequest {\n /** The dataset requests go to: the workspace's while the tab follows it, else the pinned one */\n dataset: string\n /**\n * The tab's perspective option as it applies in this workspace: `scheduledDrafts` counts as\n * `global` where the workspace does not offer scheduled drafts\n */\n tabPerspective: VistaPerspective\n /** The API version requests are sent with, `vX` while a variant is selected */\n apiVersion: string\n /** Whether the tab's API version is usable (the \"Other\" input may hold an unfinished one) */\n isValidApiVersion: boolean\n /** The API version is forced to `vX` because the navbar has a variant selected */\n isApiVersionLocked: boolean\n perspective: ClientPerspective | undefined\n variant: string | undefined\n /** Queries go through the API CDN: the tab asks for it, and the perspective is one it serves */\n useCdn: boolean\n /** The tab asks for the API CDN, but it serves neither the drafts perspective nor a stack */\n isCdnBlockedByPerspective: boolean\n /**\n * The studio signs in with a cookie, which the API CDN never receives, so it answers queries\n * as it would an anonymous visitor's\n */\n isCdnAnonymous: boolean\n /** Sync tags (and therefore automatic refetching) need a modern API version */\n supportsSyncTags: boolean\n /** Client configured for the tab: API version, dataset, perspective and variant */\n client: SanityClient\n}\n\n/** The studio state a tab's options are resolved against; the same for every tab */\nexport interface RequestEnvironment {\n workspaceDataset: string\n perspectiveStack: PerspectiveContextValue['perspectiveStack']\n selectedVariantNames: PerspectiveContextValue['selectedVariantNames']\n /**\n * The workspace has variants switched on, so the navbar offers a variant selector; where it is\n * off, a variant its URL still carries is not one the studio shows, and queries send none\n */\n isVariantsEnabled: boolean\n /** The stack the `scheduledDrafts` perspective stands for, where the workspace offers it */\n scheduledDraftsStack: PerspectiveStack | undefined\n isScheduledDraftsEnabled: boolean\n}\n\n/** The part of a resolved request that follows from the options alone, without a client */\nexport type ResolvedRequestOptions = Omit<\n ResolvedRequest,\n 'supportsSyncTags' | 'client' | 'isCdnAnonymous'\n>\n\n/**\n * Whether the API CDN serves a perspective. It rejects `drafts` and stacks, so `@sanity/client`\n * sends those to the API even with `useCdn`; Vision does the same, and shows it\n */\nfunction isServedByCdn(perspective: ClientPerspective | undefined): boolean {\n if (Array.isArray(perspective)) return perspective.length === 0\n return perspective !== 'drafts' && perspective !== 'previewDrafts'\n}\n\n/**\n * The navbar's stack for its published perspective is `['published']`, which asks for the same\n * documents as `published` but counts as a stack, so it would never go to the API CDN\n */\nfunction withoutPublishedStack(\n perspective: ClientPerspective | undefined,\n): ClientPerspective | undefined {\n return Array.isArray(perspective) && perspective.length === 1 && perspective[0] === 'published'\n ? 'published'\n : perspective\n}\n\n/** Reads the studio state every tab's options are resolved against */\nexport function useRequestEnvironment(): RequestEnvironment {\n const {perspectiveStack, selectedVariantNames} = usePerspective()\n const workspaceDataset = useVistaSelector(selectWorkspaceDataset)\n const isScheduledDraftsEnabled = useScheduledDraftsEnabled()\n const {data: releases = []} = useActiveReleases()\n const workspace = useWorkspace()\n const isDraftModelEnabled = workspace.document.drafts.enabled\n const isVariantsEnabled = useVariantsEnabled()\n\n const scheduledDraftsStack = useMemo((): PerspectiveStack | undefined => {\n if (!isScheduledDraftsEnabled) return undefined\n\n const scheduledDraftReleases = releases.filter(\n (release: ReleaseDocument) =>\n isCardinalityOneRelease(release) && release.state === 'scheduled',\n )\n const releaseIds = sortReleases(scheduledDraftReleases).map((release: ReleaseDocument) =>\n getReleaseIdFromReleaseDocumentId(release._id),\n )\n const defaultPerspective = isDraftModelEnabled ? ['drafts'] : ['published']\n return [...releaseIds, ...defaultPerspective] as PerspectiveStack\n }, [releases, isDraftModelEnabled, isScheduledDraftsEnabled])\n\n return useMemo(\n () => ({\n workspaceDataset,\n perspectiveStack,\n selectedVariantNames,\n isVariantsEnabled,\n scheduledDraftsStack,\n isScheduledDraftsEnabled,\n }),\n [\n isScheduledDraftsEnabled,\n isVariantsEnabled,\n perspectiveStack,\n scheduledDraftsStack,\n selectedVariantNames,\n workspaceDataset,\n ],\n )\n}\n\n/**\n * Resolves a tab's options against the studio state: a followed workspace dataset, the `global`\n * and `scheduledDrafts` perspectives becoming real perspective stacks, and the navbar variant,\n * which locks the API version to the experimental one (where the workspace has variants at all).\n */\nexport function resolveRequestOptions(\n options: VistaTabOptions,\n environment: RequestEnvironment,\n): ResolvedRequestOptions {\n const {\n workspaceDataset,\n perspectiveStack,\n selectedVariantNames,\n isVariantsEnabled,\n scheduledDraftsStack,\n } = environment\n const dataset = getTabDataset(options, workspaceDataset)\n\n // Queries take one variant until the studio supports editing several at once\n const variant =\n isVariantsEnabled && options.variant === 'global'\n ? getDefaultVariant(selectedVariantNames)\n : undefined\n const isValidApiVersion = validateApiVersion(options.apiVersion)\n // An unfinished \"Other\" version still needs a client to exist; requests are refused meanwhile\n const userApiVersion = isValidApiVersion\n ? prefixApiVersion(options.apiVersion)\n : DEFAULT_API_VERSION\n const apiVersion = variant ? VARIANTS_API_VERSION : userApiVersion\n\n // `global` is what the classic tool calls the pinned release: the navbar's perspective stack\n const tabPerspective = getEffectivePerspective(\n options.perspective,\n environment.isScheduledDraftsEnabled,\n )\n const perspective = withoutPublishedStack(\n getActivePerspective({\n visionPerspective: tabPerspective === 'global' ? 'pinnedRelease' : tabPerspective,\n perspectiveStack,\n scheduledDraftsStack,\n }),\n )\n\n const servedByCdn = isServedByCdn(perspective)\n\n return {\n dataset,\n tabPerspective,\n apiVersion,\n isValidApiVersion: Boolean(variant) || isValidApiVersion,\n isApiVersionLocked: Boolean(variant),\n perspective,\n variant,\n useCdn: options.useCdn && servedByCdn,\n isCdnBlockedByPerspective: options.useCdn && !servedByCdn,\n }\n}\n\n/**\n * Resolves the effective request configuration for a tab's options against studio state (see\n * `resolveRequestOptions`), with a client configured for it.\n */\nexport function useResolvedRequest(options: VistaTabOptions): ResolvedRequest {\n const environment = useRequestEnvironment()\n const resolved = useMemo(\n () => resolveRequestOptions(options, environment),\n [environment, options],\n )\n const {apiVersion, dataset, perspective, variant} = resolved\n\n const baseClient = useClient({apiVersion})\n const client = useMemo(\n () =>\n baseClient.withConfig({\n apiVersion,\n dataset,\n perspective,\n variant,\n allowReconfigure: true,\n }),\n [baseClient, apiVersion, dataset, perspective, variant],\n )\n\n return useMemo(() => {\n const {token, withCredentials} = client.config()\n return {\n ...resolved,\n isCdnAnonymous: resolved.useCdn && !token && Boolean(withCredentials),\n supportsSyncTags: !isApiVersionBelow(apiVersion, SYNC_TAGS_API_VERSION),\n client,\n }\n }, [apiVersion, client, resolved])\n}\n","import {useCallback, useMemo} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport {parseParams} from '../../components/ParamsEditor'\nimport {type Params} from '../../components/VisionGui'\nimport {visionLocaleNamespace} from '../../i18n'\nimport {encodeQueryString} from '../../util/encodeQueryString'\nimport {type QueryRequest, type VistaTab} from '../store/types'\nimport {type ResolvedRequest, useResolvedRequest} from './useResolvedRequest'\n\nexport interface QueryRequestBuilder {\n resolved: ResolvedRequest\n params: Params\n /** `null` while the query is empty, the params are invalid or the API version is unusable */\n request: QueryRequest | null\n /**\n * The request for other query text or params under the tab's current options, for callers\n * that hold values newer than the rendered tab (a debounced params edit being flushed)\n */\n buildRequest: (query: string, rawParams: string) => QueryRequest | null\n}\n\n/** Turns a tab's query, params and options into the request the query runner executes */\nexport function useQueryRequestBuilder(tab: VistaTab): QueryRequestBuilder {\n const {t} = useTranslation(visionLocaleNamespace)\n const resolved = useResolvedRequest(tab.options)\n const {includeSourceMap} = tab.options\n const {client, perspective, variant, isValidApiVersion, useCdn} = resolved\n\n const buildRequest = useCallback(\n (query: string, rawParams: string): QueryRequest | null => {\n const params = parseParams(rawParams, t)\n if (!params.valid || !isValidApiVersion || !query.trim()) {\n return null\n }\n const urlOptions: Record<string, string | string[]> = {\n ...(perspective !== undefined ? {perspective} : {}),\n ...(variant ? {variant} : {}),\n ...(includeSourceMap ? {resultSourceMap: 'true'} : {}),\n }\n const url = client.getUrl(\n client.getDataUrl('query', encodeQueryString(query, params.parsed, urlOptions)),\n useCdn,\n )\n return {client, query, params: params.parsed || {}, includeSourceMap, useCdn, url}\n },\n [client, includeSourceMap, isValidApiVersion, perspective, t, useCdn, variant],\n )\n\n const params = useMemo(() => parseParams(tab.rawParams, t), [tab.rawParams, t])\n const request = useMemo(\n () => buildRequest(tab.query, tab.rawParams),\n [buildRequest, tab.query, tab.rawParams],\n )\n\n return {resolved, params, request, buildRequest}\n}\n","const MAX_TITLE_LENGTH = 32\nconst TYPE_FILTER = /_type\\s*==\\s*([\"'])([^\"']+)\\1/\nconst TYPE_IN_FILTER = /_type\\s+in\\s+\\[([^\\]]+)\\]/\nconst ID_FILTER = /_id\\s*==\\s*([\"'])([^\"']+)\\1/\n\n/**\n * Derives a short tab title from a GROQ query: the filtered document type or id when there is one\n * (`*[_type == \"author\"]` becomes `author`), otherwise the first non-empty line, truncated.\n */\nexport function deriveTabTitle(query: string): string | undefined {\n const trimmed = query.trim()\n if (!trimmed) {\n return undefined\n }\n\n const typeMatch = trimmed.match(TYPE_FILTER)\n if (typeMatch) {\n return truncate(typeMatch[2])\n }\n\n const idMatch = trimmed.match(ID_FILTER)\n if (idMatch) {\n return truncate(idMatch[2])\n }\n\n const typeInMatch = trimmed.match(TYPE_IN_FILTER)\n if (typeInMatch) {\n const types = typeInMatch[1]\n .split(',')\n .map((type) => type.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter(Boolean)\n if (types.length > 0) {\n return truncate(types.join(', '))\n }\n }\n\n const firstLine = trimmed\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.length > 0 && !line.startsWith('//'))\n\n return truncate(firstLine || trimmed)\n}\n\nfunction truncate(value: string): string {\n const collapsed = value.replace(/\\s+/g, ' ')\n return collapsed.length > MAX_TITLE_LENGTH\n ? `${collapsed.slice(0, MAX_TITLE_LENGTH - 1)}…`\n : collapsed\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useCallback} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport {type VistaTab} from '../store/types'\nimport {usePendingEdits, useSavedQueriesApi, useVistaActor} from '../store/VistaActorContext'\nimport {deriveTabTitle} from '../util/tabTitle'\nimport {type QueryRequestBuilder} from './useQueryRequestBuilder'\n\n/**\n * Saves a tab as a personal saved query (stored by its query URL, like the classic tool does),\n * refusing an exact duplicate of that URL, so the same GROQ against another dataset or\n * perspective is a different saved query. Uses the tool-wide saved queries subscription.\n *\n * Params typed within the debounce window belong to what is saved: pending edits are committed\n * first and the URL is built from what the machine holds then, not from the last render.\n */\nexport function useSaveCurrentQuery(\n tab: VistaTab,\n {request, buildRequest}: Pick<QueryRequestBuilder, 'request' | 'buildRequest'>,\n): {saveCurrent: () => Promise<void>; canSave: boolean} {\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n const actorRef = useVistaActor()\n const pendingEdits = usePendingEdits()\n const {queries, saveQuery, saving} = useSavedQueriesApi()\n\n const saveCurrent = useCallback(async () => {\n pendingEdits.commit()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id) ?? tab\n const current = buildRequest(latest.query, latest.rawParams)\n if (!current) return\n const duplicate = queries.find((query) => !query.shared && query.url === current.url)\n if (duplicate) {\n toast.push({\n closable: true,\n status: 'warning',\n title: t('save-query.already-saved'),\n description: duplicate.title,\n })\n return\n }\n try {\n await saveQuery({\n shared: false,\n url: current.url,\n savedAt: new Date().toISOString(),\n title: latest.title || deriveTabTitle(latest.query) || t('label.untitled-query'),\n })\n toast.push({closable: true, status: 'success', title: t('save-query.success')})\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: t('save-query.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n }\n }, [actorRef, buildRequest, pendingEdits, queries, saveQuery, t, tab, toast])\n\n return {saveCurrent, canSave: Boolean(request) && !saving}\n}\n","import {type ClientPerspective} from '@sanity/client'\nimport {dequal} from 'dequal/lite'\nimport JSON5 from 'json5'\n\nimport {type QueryConfig} from '../../hooks/useSavedQueries'\nimport {isPlainObject} from '../../util/isPlainObject'\nimport {type ParsedQueryUrl} from '../../util/parseQueryUrl'\nimport {type VistaTab, type VistaTabInit, type VistaTabOptions} from '../store/types'\n\n/**\n * The fields of a tab for a parsed query URL (a saved query or a paste). A URL is the request\n * that was sent, so the tab gets the perspective it states, including none: a URL without one\n * ran on the API default, which is not what a tab on `global` would send. What the tab cannot\n * represent is left to it: a dataset the tool does not know and a perspective it cannot pick (a\n * release stack). A tab cannot pin a variant, so one in the URL makes it follow the navbar's (the\n * caller warns when that is another), and none sends none: on `global` with a navbar variant\n * selected the tab would otherwise add one the request never had. The content source map and\n * the API CDN follow the URL, since a request either asked for one or did not, and went to the\n * CDN's host or the API's.\n */\nexport function parsedQueryToTabInit(parsed: ParsedQueryUrl): VistaTabInit {\n const options: Partial<VistaTabOptions> = {\n includeSourceMap: parsed.includeSourceMap,\n useCdn: parsed.useCdn,\n }\n if (parsed.isKnownDataset) {\n // A URL names its dataset, so the tab stops following the workspace's\n options.datasetMode = 'pinned'\n options.dataset = parsed.dataset\n }\n if (parsed.apiVersion) {\n options.apiVersion = parsed.apiVersion\n }\n if (parsed.urlPerspective === undefined) {\n // No perspective in the URL means the request ran on the API default\n options.perspective = undefined\n } else if (parsed.perspective) {\n options.perspective = parsed.perspective === 'pinnedRelease' ? 'global' : parsed.perspective\n }\n options.variant = parsed.variant === undefined ? 'none' : 'global'\n\n return {query: parsed.query, rawParams: parsed.rawParams, options}\n}\n\n/** Like `parsedQueryToTabInit`, also applying the saved query's title (clearing a stale one) */\nexport function savedQueryToTabInit(saved: QueryConfig, parsed: ParsedQueryUrl): VistaTabInit {\n return {...parsedQueryToTabInit(parsed), title: saved.title}\n}\n\n/** The request a tab would send right now, as far as a saved URL states it (`resolveRequestOptions`) */\nexport interface EffectiveRequestOptions {\n dataset: string\n apiVersion: string\n perspective: ClientPerspective | undefined\n variant: string | undefined\n useCdn: boolean\n}\n\n/**\n * Whether a tab already shows the given saved query: the same query text and params, sent to the\n * dataset, API version, perspective and variant the saved URL states, with or without a content\n * source map as it did, through the API CDN or not as it was. A saved URL is the request the tab\n * sent, so the tab is compared through the request it would send now, not through its options: a\n * tab on the `global` perspective saved `perspective=drafts` while the navbar was on drafts, and\n * a tab with a navbar variant selected saved `vX` and `variant=…` whatever its own API version.\n */\nexport function tabMatchesParsedQuery(\n tab: VistaTab,\n parsed: ParsedQueryUrl,\n effective: EffectiveRequestOptions,\n): boolean {\n return (\n tab.query === parsed.query &&\n haveSameParams(tab.rawParams, parsed.rawParams) &&\n parsed.dataset === effective.dataset &&\n (parsed.apiVersion === undefined || parsed.apiVersion === effective.apiVersion) &&\n parsed.urlPerspective === toUrlPerspective(effective.perspective) &&\n parsed.variant === effective.variant &&\n parsed.includeSourceMap === tab.options.includeSourceMap &&\n parsed.useCdn === effective.useCdn\n )\n}\n\n/** A perspective as `encodeQueryString` writes it into a URL: a stack becomes comma separated */\nfunction toUrlPerspective(perspective: ClientPerspective | undefined): string | undefined {\n return perspective === undefined ? undefined : String(perspective) || undefined\n}\n\n/** Parsed params are compared structurally, so key order and formatting do not matter */\nfunction haveSameParams(a: string, b: string): boolean {\n const parsedA = parseParamsOrNull(a)\n const parsedB = parseParamsOrNull(b)\n if (parsedA === null || parsedB === null) {\n return a.trim() === b.trim()\n }\n return dequal(parsedA, parsedB)\n}\n\n/** The params a request is sent with (`tryParseParams`): empty and non-object params are `{}` */\nfunction parseParamsOrNull(raw: string): unknown {\n try {\n const parsed: unknown = raw ? JSON5.parse(raw) : {}\n return isPlainObject(parsed) ? parsed : {}\n } catch {\n return null\n }\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {LaunchIcon} from '@sanity/icons/Launch'\nimport {RetrieveIcon} from '@sanity/icons/Retrieve'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {UnpublishIcon} from '@sanity/icons/Unpublish'\nimport {UsersIcon} from '@sanity/icons/Users'\nimport {Button, Card, Dialog, Text, TextInput} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type KeyboardEvent, useCallback, useMemo, useRef, useState} from 'react'\nimport {ContextMenuButton, UserAvatar, useDateTimeFormat, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {type QueryConfig} from '../../../hooks/useSavedQueries'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type ParsedQueryUrl, parseQueryUrl} from '../../../util/parseQueryUrl'\nimport {useOnValueChange} from '../../hooks/useOnValueChange'\nimport {useQueryRequestBuilder} from '../../hooks/useQueryRequestBuilder'\nimport {resolveRequestOptions, useRequestEnvironment} from '../../hooks/useResolvedRequest'\nimport {useSaveCurrentQuery} from '../../hooks/useSaveCurrentQuery'\nimport {type VistaDrawer, type VistaTab} from '../../store/types'\nimport {useSavedQueriesApi, useVistaActor, useVistaSelector} from '../../store/VistaActorContext'\nimport {selectActiveTab, selectDatasets} from '../../store/vistaMachine'\nimport {savedQueryToTabInit, tabMatchesParsedQuery} from '../../util/savedQueryTab'\nimport * as styles from '../vista.module.css'\n\ninterface QueryListPanelProps {\n mode: VistaDrawer\n}\n\n/** A saved query with its URL parsed once, so rendering and matching do not parse it again */\ninterface QueryListItem {\n query: QueryConfig\n parsed: ParsedQueryUrl | null\n /** First line of the GROQ, up to the projection */\n preview: string\n}\n\nexport function QueryListPanel({mode}: QueryListPanelProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n const actorRef = useVistaActor()\n const activeTab = useVistaSelector(selectActiveTab)\n const tabs = useVistaSelector((snapshot) => snapshot.context.tabs)\n const datasets = useVistaSelector(selectDatasets)\n const environment = useRequestEnvironment()\n const requestBuilder = useQueryRequestBuilder(activeTab)\n const {queries, updateQuery, deleteQuery, deleteQueryError, moving, shareQuery, unshareQuery} =\n useSavedQueriesApi()\n const {saveCurrent, canSave} = useSaveCurrentQuery(activeTab, requestBuilder)\n const formatDate = useDateTimeFormat({dateStyle: 'medium', timeStyle: 'short'})\n\n const [search, setSearch] = useState('')\n const [editingKey, setEditingKey] = useState<string | null>(null)\n const [editingTitle, setEditingTitle] = useState('')\n const [shareCandidate, setShareCandidate] = useState<QueryConfig | null>(null)\n\n const items = useMemo((): QueryListItem[] => {\n return queries\n .filter((query) => (mode === 'shared' ? query.shared : !query.shared))\n .map((query) => {\n const parsed = parseQueryUrl(query.url, datasets)\n const preview = (parsed?.query || '').split('\\n')[0].split('{')[0].trim()\n return {query, parsed, preview}\n })\n }, [datasets, mode, queries])\n\n const visibleItems = useMemo(() => {\n const term = search.trim().toLowerCase()\n if (!term) return items\n return items.filter(\n ({query, parsed}) =>\n (query.title || '').toLowerCase().includes(term) ||\n (parsed?.query || '').toLowerCase().includes(term),\n )\n }, [items, search])\n\n // A saved URL is the request its tab sent, so tabs are matched through the request they would\n // send now (the navbar's perspective for `global`, `vX` while a variant is selected)\n const findTabShowing = useCallback(\n (parsed: ParsedQueryUrl) =>\n tabs.find((tab: VistaTab) =>\n tabMatchesParsedQuery(tab, parsed, resolveRequestOptions(tab.options, environment)),\n ),\n [environment, tabs],\n )\n const isOpenInTab = useCallback(\n (parsed: ParsedQueryUrl | null) => parsed !== null && findTabShowing(parsed) !== undefined,\n [findTabShowing],\n )\n\n const reportError = useCallback(\n (err: unknown) => {\n toast.push({\n closable: true,\n status: 'error',\n title: t('save-query.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n },\n [t, toast],\n )\n\n // `deleteQuery` resolves either way and reports failures through this state instead\n useOnValueChange(deleteQueryError, (error) => {\n if (error) reportError(error)\n })\n\n // What the tab a saved query was loaded into cannot reproduce is worth saying: a dataset the\n // tool does not know (another project's URL, or a dataset the user cannot see) leaves the tab\n // on its own dataset, and a variant the navbar does not have selected is not sent, since a tab\n // cannot pin one (its option follows the navbar or sends none); where the workspace has\n // variants switched off there is no navbar selector to select it with\n const warnAboutUnrepresentable = useCallback(\n (parsed: ParsedQueryUrl) => {\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n id: 'vista-saved-query-dataset',\n status: 'warning',\n title: t('vista.saved.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n const {tabs: currentTabs, activeTabId} = actorRef.getSnapshot().context\n const target = currentTabs.find((tab) => tab.id === activeTabId)\n const sent = target && resolveRequestOptions(target.options, environment).variant\n if (parsed.variant !== undefined && parsed.variant !== sent) {\n toast.push({\n closable: true,\n id: 'vista-saved-query-variant',\n status: 'warning',\n title: t(\n environment.isVariantsEnabled\n ? 'vista.saved.unavailable-variant'\n : 'vista.saved.variants-disabled',\n {variant: parsed.variant},\n ),\n })\n }\n },\n [actorRef, environment, t, toast],\n )\n\n const openInNewTab = useCallback(\n ({query, parsed}: QueryListItem) => {\n if (!parsed) return\n const existing = findTabShowing(parsed)\n if (existing) {\n actorRef.send({type: 'tab.select', id: existing.id})\n } else {\n actorRef.send({type: 'tab.add', tab: savedQueryToTabInit(query, parsed)})\n warnAboutUnrepresentable(parsed)\n }\n },\n [actorRef, findTabShowing, warnAboutUnrepresentable],\n )\n\n const loadIntoCurrentTab = useCallback(\n ({query, parsed}: QueryListItem) => {\n if (!parsed) return\n actorRef.send({type: 'tab.load', id: activeTab.id, tab: savedQueryToTabInit(query, parsed)})\n warnAboutUnrepresentable(parsed)\n },\n [actorRef, activeTab.id, warnAboutUnrepresentable],\n )\n\n // Enter and Escape unmount the rename field while it has focus; a blur delivered on the way\n // out must not commit a draft that was just committed or discarded (same shape as the tab\n // rename field)\n const renameSettledRef = useRef(false)\n const startRename = useCallback((query: QueryConfig) => {\n renameSettledRef.current = false\n setEditingKey(query._key)\n setEditingTitle(query.title || '')\n }, [])\n\n const cancelRename = useCallback(() => {\n if (renameSettledRef.current) return\n renameSettledRef.current = true\n setEditingKey(null)\n }, [])\n\n const commitRename = useCallback(\n async (query: QueryConfig) => {\n if (renameSettledRef.current) return\n renameSettledRef.current = true\n setEditingKey(null)\n const title = editingTitle.trim()\n if (!title || title === query.title) return\n try {\n await updateQuery({...query, title})\n } catch (err) {\n reportError(err)\n }\n },\n [editingTitle, reportError, updateQuery],\n )\n\n const handleConfirmShare = useCallback(async () => {\n if (!shareCandidate) return\n const candidate = shareCandidate\n setShareCandidate(null)\n try {\n await shareQuery(candidate._key)\n toast.push({closable: true, status: 'success', title: t('save-query.shared-success')})\n } catch (err) {\n reportError(err)\n }\n }, [reportError, shareCandidate, shareQuery, t, toast])\n\n const handleUnshare = useCallback(\n async (query: QueryConfig) => {\n try {\n await unshareQuery(query._key)\n toast.push({closable: true, status: 'success', title: t('save-query.unshared-success')})\n } catch (err) {\n reportError(err)\n }\n },\n [reportError, t, toast, unshareQuery],\n )\n\n const emptyText = search.trim()\n ? t('vista.saved.empty-search')\n : mode === 'saved'\n ? t('vista.saved.empty')\n : t('vista.shared.empty')\n\n return (\n <Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\">\n <Flex alignItems=\"center\" borderBottom flexShrink={0} gap={2} padding={2}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n fontSize={1}\n icon={SearchIcon}\n onChange={(event) => setSearch(event.currentTarget.value)}\n padding={2}\n placeholder={t('label.search-queries')}\n value={search}\n />\n </Box>\n {mode === 'saved' && (\n <Tooltip animate content={<Text size={1}>{t('vista.saved.save-current')}</Text>} portal>\n <Button\n aria-label={t('vista.saved.save-current')}\n data-testid=\"vista-save-current-query\"\n disabled={!canSave}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => void saveCurrent()}\n padding={2}\n />\n </Tooltip>\n )}\n </Flex>\n\n <Box className={styles.scrollArea} flexBasis=\"0%\" flexGrow={1}>\n {visibleItems.length === 0 ? (\n <Box padding={4}>\n <Text muted size={1}>\n {emptyText}\n </Text>\n </Box>\n ) : (\n <Flex flexDirection=\"column\" minWidth=\"0\">\n {visibleItems.map((item) => {\n const {query, parsed, preview} = item\n const canMutate = !query.shared || query.isOwnedByCurrentUser\n // A query on its way to the other list is left alone until it has arrived there\n const isMoving = moving.includes(query._key)\n const isEditing = editingKey === query._key\n const isOpen = isOpenInTab(parsed)\n\n return (\n <Card\n borderBottom\n data-testid=\"vista-saved-query\"\n key={query._key}\n padding={1}\n tone={isOpen ? 'transparent' : 'default'}\n >\n <Flex alignItems=\"flex-start\" gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n {isEditing ? (\n <Box padding={2}>\n <TextInput\n autoFocus\n fontSize={1}\n onBlur={() => void commitRename(query)}\n onChange={(event) => setEditingTitle(event.currentTarget.value)}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') void commitRename(query)\n if (event.key === 'Escape') cancelRename()\n }}\n padding={1}\n value={editingTitle}\n />\n </Box>\n ) : (\n <Button\n className={styles.listItemButton}\n data-testid=\"vista-saved-query-open\"\n justify=\"flex-start\"\n mode=\"bleed\"\n onClick={() => openInNewTab(item)}\n padding={2}\n selected={isOpen}\n width=\"fill\"\n >\n <Flex flexDirection=\"column\" gap={2} minWidth=\"0\">\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {query.title || t('label.untitled-query')}\n </Text>\n {preview && (\n <Box className={styles.previewCode}>\n <Code size={0}>{preview}</Code>\n </Box>\n )}\n <Flex alignItems=\"center\" gap={2}>\n {query.shared && query.authorId && (\n <UserAvatar size={0} user={query.authorId} withTooltip />\n )}\n <Text muted size={0}>\n {query.savedAt ? formatDate.format(new Date(query.savedAt)) : ''}\n </Text>\n </Flex>\n </Flex>\n </Button>\n )}\n </Box>\n <Box paddingTop={1}>\n <MenuButton\n button={<ContextMenuButton />}\n id={`vista-saved-query-menu-${query._key}`}\n menu={\n <Menu>\n <MenuItem\n icon={LaunchIcon}\n onClick={() => openInNewTab(item)}\n text={t('vista.saved.open-in-new-tab')}\n />\n <MenuItem\n icon={RetrieveIcon}\n onClick={() => loadIntoCurrentTab(item)}\n text={t('vista.saved.load-in-current-tab')}\n />\n {canMutate && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={isMoving}\n icon={EditIcon}\n onClick={() => startRename(query)}\n text={t('vista.saved.rename')}\n />\n {query.shared ? (\n <MenuItem\n data-testid=\"vista-saved-query-unshare\"\n disabled={isMoving}\n icon={UnpublishIcon}\n onClick={() => void handleUnshare(query)}\n text={t('action.unshare')}\n />\n ) : (\n <MenuItem\n data-testid=\"vista-saved-query-share\"\n disabled={isMoving}\n icon={UsersIcon}\n onClick={() => setShareCandidate(query)}\n text={t('label.share')}\n />\n )}\n <MenuItem\n disabled={isMoving}\n icon={TrashIcon}\n onClick={() => void deleteQuery(query._key)}\n text={t('action.delete')}\n tone=\"critical\"\n />\n </>\n )}\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'bottom-end'}}\n />\n </Box>\n </Flex>\n </Card>\n )\n })}\n </Flex>\n )}\n </Box>\n\n {shareCandidate && (\n <Dialog\n animate\n footer={\n <Flex gap={2} justifyContent=\"flex-end\" padding={3}>\n <Button\n mode=\"bleed\"\n onClick={() => setShareCandidate(null)}\n text={t('action.query-cancel')}\n />\n <Button\n onClick={() => void handleConfirmShare()}\n text={t('action.save-shared-query')}\n tone=\"primary\"\n />\n </Flex>\n }\n header={t('label.share')}\n id=\"vista-share-query-dialog\"\n onClose={() => setShareCandidate(null)}\n width={0}\n >\n <Box padding={4}>\n <Text size={1}>{t('save-query.share-warning')}</Text>\n </Box>\n </Dialog>\n )}\n </Flex>\n )\n}\n","import {Stack, Switch, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {Box, Flex} from 'ui5'\n\nexport interface SwitchFieldProps {\n checked: boolean\n onChange: (checked: boolean) => void\n title: ReactNode\n description: ReactNode\n testId?: string\n /** More lines under the description */\n children?: ReactNode\n}\n\n/** A switch with its title and description beside it, the switch level with the title */\nexport function SwitchField(props: SwitchFieldProps) {\n const {checked, onChange, title, description, testId, children} = props\n return (\n <Flex alignItems=\"flex-start\" as=\"label\" gap={3}>\n {/* A ui5 box has no minimum width, so a long description would squeeze it and run over the\n switch */}\n <Box flexShrink={0} paddingTop={1}>\n <Switch\n checked={checked}\n data-testid={testId}\n onChange={(event) => onChange(event.currentTarget.checked)}\n />\n </Box>\n <Stack gap={2}>\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Text muted size={1}>\n {description}\n </Text>\n {children}\n </Stack>\n </Flex>\n )\n}\n","import {PinIcon} from '@sanity/icons/Pin'\nimport {PinRemovedIcon} from '@sanity/icons/PinRemoved'\nimport {Button, Select, Stack, Text, TextInput} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ChangeEvent, useCallback, useId} from 'react'\nimport {\n getDefaultVariant,\n getVariantTitle,\n usePerspective,\n useScheduledDraftsEnabled,\n useTranslation,\n useWorkspace,\n} from 'sanity'\nimport {Box, Flex, VisuallyHidden} from 'ui5'\n\nimport {API_VERSIONS} from '../../../apiVersions'\nimport {useVariantsEnabled} from '../../../hooks/useVariantsEnabled'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {validateApiVersion} from '../../../util/validateApiVersion'\nimport {\n type VistaDatasetMode,\n type VistaPerspective,\n type VistaVariantMode,\n} from '../../store/types'\nimport {getEffectivePerspective} from '../../util/tabPerspective'\nimport {SwitchField} from '../SwitchField'\n\nfunction FieldLabel({children, htmlFor}: {children: string; htmlFor: string}) {\n return (\n <Text as=\"label\" htmlFor={htmlFor} muted size={1} weight=\"medium\">\n {children}\n </Text>\n )\n}\n\n/** The perspectives a tab can pick by hand, in menu order; `global` and the API default come first */\nconst OWN_PERSPECTIVES = ['raw', 'published', 'drafts'] as const\n\ninterface DatasetFieldProps {\n id: string\n mode: VistaDatasetMode\n /** The pinned dataset, shown (and pinned from) while following the workspace */\n dataset: string\n workspaceDataset: string\n datasets: readonly string[]\n onChange: (options: {datasetMode: VistaDatasetMode; dataset: string}) => void\n}\n\n/**\n * The dataset follows the workspace until one is pinned: pinning starts from the workspace's\n * dataset and enables the select, unpinning follows the workspace again.\n */\nexport function DatasetField({\n id,\n mode,\n dataset,\n workspaceDataset,\n datasets,\n onChange,\n}: DatasetFieldProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const following = mode === 'workspace'\n const toggleLabel = following\n ? t('vista.options.dataset.pin')\n : t('vista.options.dataset.use-workspace')\n\n return (\n <Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('settings.dataset-label')}</FieldLabel>\n <Flex gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Select\n data-testid={`${id}-select`}\n disabled={following}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange({datasetMode: 'pinned', dataset: event.currentTarget.value})\n }\n padding={2}\n value={following ? workspaceDataset : dataset}\n >\n {datasets.map((name) => (\n <option key={name} value={name}>\n {name}\n </option>\n ))}\n </Select>\n </Box>\n <Tooltip animate content={<Text size={1}>{toggleLabel}</Text>} placement=\"bottom\" portal>\n <Button\n aria-label={toggleLabel}\n aria-pressed={!following}\n data-testid={`${id}-${following ? 'pin' : 'follow'}`}\n fontSize={1}\n icon={following ? PinIcon : PinRemovedIcon}\n mode=\"ghost\"\n onClick={() =>\n onChange(\n following\n ? {datasetMode: 'pinned', dataset: workspaceDataset}\n : {datasetMode: 'workspace', dataset},\n )\n }\n padding={2}\n />\n </Tooltip>\n </Flex>\n <Text muted size={0}>\n {following\n ? t('vista.options.dataset.follows-workspace')\n : t('vista.options.dataset.pinned')}\n </Text>\n </Stack>\n )\n}\n\ninterface ApiVersionFieldProps {\n id: string\n /** Any version; one not in `API_VERSIONS` shows up in the \"Other\" input */\n value: string\n /** Locked to `vX` while a variant is selected in the navbar */\n locked: boolean\n onChange: (apiVersion: string) => void\n}\n\nexport function ApiVersionField({id, value, locked, onChange}: ApiVersionFieldProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const isCustom = !API_VERSIONS.includes(value)\n const isValid = validateApiVersion(value)\n const lockedHintId = useId()\n\n const handleSelect = useCallback(\n (event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n // Start the \"Other\" input with the prefix, so the API version is typed the way it is sent\n onChange(next === 'other' ? 'v' : next)\n },\n [onChange],\n )\n\n return (\n <Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('settings.api-version-label')}</FieldLabel>\n <Tooltip\n animate\n content={<Text size={1}>{t('settings.api-version-locked-for-variant')}</Text>}\n disabled={!locked}\n placement=\"bottom\"\n portal\n >\n {/*\n A disabled select gets neither pointer events nor focus, so while the field is locked\n the wrapper stands in for it: the tooltip listens to the wrapper, and the wrapper takes\n the select's place in the tab order as a group described by the reason for the lock,\n so a keyboard user can reach it too\n */}\n <Box\n aria-describedby={locked ? lockedHintId : undefined}\n aria-label={locked ? t('settings.api-version-label') : undefined}\n data-testid={`${id}-wrap`}\n role={locked ? 'group' : undefined}\n tabIndex={locked ? 0 : undefined}\n >\n {locked && (\n <VisuallyHidden id={lockedHintId}>\n {t('settings.api-version-locked-for-variant')}\n </VisuallyHidden>\n )}\n <Select\n data-testid={`${id}-select`}\n disabled={locked}\n fontSize={1}\n id={id}\n onChange={handleSelect}\n padding={2}\n value={locked ? 'vX' : isCustom ? 'other' : value}\n >\n {API_VERSIONS.map((version) => (\n <option key={version} value={version}>\n {version}\n </option>\n ))}\n <option value=\"other\">{t('settings.other-api-version-label')}</option>\n </Select>\n </Box>\n </Tooltip>\n {!locked && isCustom && (\n <TextInput\n aria-label={t('settings.custom-api-version-label')}\n customValidity={isValid ? undefined : t('settings.error.invalid-api-version')}\n data-testid={`${id}-custom`}\n fontSize={1}\n maxLength={11}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.currentTarget.value || 'v')\n }\n padding={2}\n placeholder=\"v2025-02-19\"\n value={value}\n />\n )}\n </Stack>\n )\n}\n\n/** What the navbar's perspective is called right now: a release title, published, or drafts */\nfunction useGlobalPerspectiveName(): string {\n const {selectedPerspective, selectedPerspectiveName} = usePerspective()\n const isDraftModelEnabled = useWorkspace().document.drafts.enabled\n const releaseTitle =\n typeof selectedPerspective === 'object' ? selectedPerspective.metadata.title : undefined\n return releaseTitle ?? selectedPerspectiveName ?? (isDraftModelEnabled ? 'drafts' : 'published')\n}\n\n/** A tab's perspective as the perspective select names it, \"Global (drafts)\" for instance */\nexport function usePerspectiveOptionName(perspective: VistaPerspective): string {\n const {t} = useTranslation(visionLocaleNamespace)\n const globalName = useGlobalPerspectiveName()\n switch (perspective) {\n case 'global':\n return t('vista.options.perspective.global', {name: globalName})\n case 'scheduledDrafts':\n return t('settings.perspectives.scheduled-drafts')\n case undefined:\n return t('settings.perspectives.default')\n case 'raw':\n case 'published':\n case 'drafts':\n return perspective\n default: {\n const unknownPerspective: never = perspective\n return String(unknownPerspective)\n }\n }\n}\n\ninterface PerspectiveSelectProps {\n id: string\n value: VistaPerspective\n onChange: (perspective: VistaPerspective) => void\n}\n\nexport function PerspectiveSelect({id, value, onChange}: PerspectiveSelectProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const globalName = useGlobalPerspectiveName()\n const isScheduledDraftsEnabled = useScheduledDraftsEnabled()\n // Shows what the request runs with: a stored scheduled drafts choice reads as Global where\n // this workspace has no scheduled drafts, and the option is not listed\n const shownValue = getEffectivePerspective(value, isScheduledDraftsEnabled)\n\n return (\n <Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('settings.perspective-label')}</FieldLabel>\n <Select\n data-testid={`${id}-select`}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) => {\n const next = event.currentTarget.value\n onChange(next === 'default' ? undefined : (next as Exclude<VistaPerspective, undefined>))\n }}\n padding={2}\n value={shownValue ?? 'default'}\n >\n <option value=\"global\">{t('vista.options.perspective.global', {name: globalName})}</option>\n <option value=\"default\">{t('settings.perspectives.default')}</option>\n <hr />\n {OWN_PERSPECTIVES.map((perspective) => (\n <option key={perspective} value={perspective}>\n {perspective}\n </option>\n ))}\n {isScheduledDraftsEnabled && (\n <option value=\"scheduledDrafts\">{t('settings.perspectives.scheduled-drafts')}</option>\n )}\n </Select>\n </Stack>\n )\n}\n\ninterface UseCdnFieldProps {\n testId: string\n checked: boolean\n onChange: (useCdn: boolean) => void\n /** How the CDN answers the query */\n notes?: string[]\n}\n\n/** The `useCdn` switch: queries go to the cached API CDN instead of the live API */\nexport function UseCdnField({testId, checked, onChange, notes = []}: UseCdnFieldProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n return (\n <SwitchField\n checked={checked}\n description={t('vista.options.use-cdn.description')}\n onChange={onChange}\n testId={testId}\n title={t('vista.options.use-cdn')}\n >\n {notes.map((note) => (\n <Text data-testid={`${testId}-note`} key={note} size={1}>\n {note}\n </Text>\n ))}\n </SwitchField>\n )\n}\n\ninterface VariantSelectProps {\n id: string\n value: VistaVariantMode\n onChange: (variant: VistaVariantMode) => void\n}\n\n/**\n * Sends the navbar's variant with the query, or none; picking another variant is not offered\n * here. Shown only where the navbar has a variant selector of its own: a workspace with variants\n * switched off has no variant to send, so there is nothing to choose.\n */\nexport function VariantSelect({id, value, onChange}: VariantSelectProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const isVariantsEnabled = useVariantsEnabled()\n const {selectedVariants, selectedVariantNames} = usePerspective()\n const selectedVariant = getDefaultVariant(selectedVariants)\n const globalVariantName = selectedVariant\n ? getVariantTitle(selectedVariant)\n : getDefaultVariant(selectedVariantNames)\n\n if (!isVariantsEnabled) return null\n\n return (\n <Stack gap={2}>\n <FieldLabel htmlFor={id}>{t('vista.options.variant-label')}</FieldLabel>\n <Select\n data-testid={`${id}-select`}\n fontSize={1}\n id={id}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange(event.currentTarget.value === 'none' ? 'none' : 'global')\n }\n padding={2}\n value={value}\n >\n <option value=\"global\">\n {globalVariantName\n ? t('vista.options.variant.global', {name: globalVariantName})\n : t('vista.options.variant.global-none')}\n </option>\n <option value=\"none\">{t('vista.options.variant.none')}</option>\n </Select>\n </Stack>\n )\n}\n","import {RestoreIcon} from '@sanity/icons/Restore'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Button, Card, Stack, Text, TextArea} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {dequal} from 'dequal/lite'\nimport {useCallback, useState} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {validateApiVersion} from '../../../util/validateApiVersion'\nimport {\n useSavedQueriesApi,\n useVistaActor,\n useVistaExperience,\n useVistaSelector,\n} from '../../store/VistaActorContext'\nimport {selectDatasets, selectWorkspaceDataset} from '../../store/vistaMachine'\nimport {DEFAULT_HIDDEN_DIFF_FIELDS} from '../../store/vistaStorage'\nimport {\n ApiVersionField,\n DatasetField,\n PerspectiveSelect,\n UseCdnField,\n VariantSelect,\n} from '../request/OptionFields'\nimport {SwitchField} from '../SwitchField'\n\n/** One field path per line (commas work too), each once */\nfunction parseFieldList(text: string): string[] {\n return [\n ...new Set(\n text\n .split(/[\\n,]/)\n .map((field) => field.trim())\n .filter(Boolean),\n ),\n ]\n}\n\nfunction HiddenDiffFieldsSetting() {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const hiddenFields = useVistaSelector((snapshot) => snapshot.context.historyDiff.hiddenFields)\n // The text as typed, for as long as it lists the stored fields: a new line being started or a\n // path being typed would otherwise be tidied away under the caret\n const [draft, setDraft] = useState<{text: string; fields: string[]}>()\n const text = draft && dequal(draft.fields, hiddenFields) ? draft.text : hiddenFields.join('\\n')\n const update = (fields: string[]) =>\n actorRef.send({type: 'historyDiff.update', settings: {hiddenFields: fields}})\n\n return (\n <Stack gap={3}>\n <Stack gap={2}>\n <Text as=\"label\" htmlFor=\"vista-settings-hidden-diff-fields\" size={1} weight=\"medium\">\n {t('vista.settings.history-diff.title')}\n </Text>\n <Text muted size={1}>\n {t('vista.settings.history-diff.description')}\n </Text>\n </Stack>\n <TextArea\n data-testid=\"vista-settings-hidden-diff-fields\"\n fontSize={1}\n id=\"vista-settings-hidden-diff-fields\"\n onChange={(event) => {\n const next = event.currentTarget.value\n const fields = parseFieldList(next)\n setDraft({text: next, fields})\n update(fields)\n }}\n rows={4}\n value={text}\n />\n <Flex>\n <Button\n data-testid=\"vista-settings-hidden-diff-fields-reset\"\n disabled={dequal(hiddenFields, DEFAULT_HIDDEN_DIFF_FIELDS)}\n fontSize={1}\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={() => update([...DEFAULT_HIDDEN_DIFF_FIELDS])}\n padding={2}\n text={t('vista.settings.history-diff.reset')}\n />\n </Flex>\n </Stack>\n )\n}\n\n/** The settings, in the sidebar's drawer */\nexport function SettingsPanel() {\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n const actorRef = useVistaActor()\n const {switchToClassic} = useVistaExperience()\n const {clearQueries} = useSavedQueriesApi()\n const datasets = useVistaSelector(selectDatasets)\n const workspaceDataset = useVistaSelector(selectWorkspaceDataset)\n const settings = useVistaSelector((snapshot) => snapshot.context.settings)\n const [confirmClear, setConfirmClear] = useState(false)\n // The \"Other\" input may hold an unfinished version; only usable ones become the default\n const [apiVersionDraft, setApiVersionDraft] = useState(settings.apiVersion)\n\n const handleApiVersionChange = useCallback(\n (apiVersion: string) => {\n setApiVersionDraft(apiVersion)\n if (validateApiVersion(apiVersion)) {\n actorRef.send({type: 'settings.update', settings: {apiVersion}})\n }\n },\n [actorRef],\n )\n\n const handleClearStorage = useCallback(async () => {\n setConfirmClear(false)\n // The saved queries live on the server; nothing local is dropped until they are gone\n try {\n await clearQueries()\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: t('vista.settings.clear-storage.error'),\n description: err instanceof Error ? err.message : String(err),\n })\n return\n }\n actorRef.send({type: 'storage.clear'})\n toast.push({\n closable: true,\n status: 'success',\n title: t('vista.settings.clear-storage.success'),\n })\n // Clearing storage also ends the redesigned experience, which unmounts this panel\n switchToClassic()\n }, [actorRef, clearQueries, switchToClassic, t, toast])\n\n return (\n <Box data-testid=\"vista-settings\" padding={4}>\n <Stack gap={5}>\n <Text muted size={1}>\n {t('vista.settings.description')}\n </Text>\n\n <DatasetField\n dataset={settings.dataset}\n datasets={datasets}\n id=\"vista-settings-dataset\"\n mode={settings.datasetMode}\n onChange={(dataset) => actorRef.send({type: 'settings.update', settings: dataset})}\n workspaceDataset={workspaceDataset}\n />\n\n <ApiVersionField\n id=\"vista-settings-api-version\"\n locked={false}\n onChange={handleApiVersionChange}\n value={apiVersionDraft}\n />\n\n <PerspectiveSelect\n id=\"vista-settings-perspective\"\n onChange={(perspective) =>\n actorRef.send({type: 'settings.update', settings: {perspective}})\n }\n value={settings.perspective}\n />\n\n <VariantSelect\n id=\"vista-settings-variant\"\n onChange={(variant) => actorRef.send({type: 'settings.update', settings: {variant}})}\n value={settings.variant}\n />\n\n <SwitchField\n checked={settings.includeSourceMap}\n description={t('vista.options.include-source-map.description')}\n onChange={(includeSourceMap) =>\n actorRef.send({type: 'settings.update', settings: {includeSourceMap}})\n }\n title={t('vista.options.include-source-map')}\n />\n\n <UseCdnField\n checked={settings.useCdn}\n onChange={(useCdn) => actorRef.send({type: 'settings.update', settings: {useCdn}})}\n testId=\"vista-settings-use-cdn\"\n />\n\n <Card border padding={3} radius={2}>\n <HiddenDiffFieldsSetting />\n </Card>\n\n <Card border padding={3} radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.redesign.settings.title')}\n </Text>\n <Text muted size={1}>\n {t('vista.redesign.settings.description')}\n </Text>\n <Flex>\n <Button\n data-testid=\"vista-settings-classic\"\n icon={RestoreIcon}\n mode=\"ghost\"\n onClick={switchToClassic}\n text={t('vista.redesign.switch-to-classic')}\n />\n </Flex>\n </Stack>\n </Card>\n\n <Card border padding={3} radius={2} tone={confirmClear ? 'critical' : 'default'}>\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.settings.clear-storage.description')}\n </Text>\n <Flex gap={2}>\n {confirmClear ? (\n <>\n <Button\n data-testid=\"vista-clear-storage-confirm\"\n icon={TrashIcon}\n onClick={() => void handleClearStorage()}\n text={t('vista.settings.clear-storage.confirm')}\n tone=\"critical\"\n />\n <Button\n mode=\"bleed\"\n onClick={() => setConfirmClear(false)}\n text={t('action.query-cancel')}\n />\n </>\n ) : (\n <Button\n data-testid=\"vista-clear-storage\"\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={() => setConfirmClear(true)}\n text={t('vista.settings.clear-storage')}\n tone=\"critical\"\n />\n )}\n </Flex>\n </Stack>\n </Card>\n </Stack>\n </Box>\n )\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Button, Text} from '@sanity/ui'\nimport {type KeyboardEvent, type ReactNode, useCallback} from 'react'\nimport TrapFocus from 'react-focus-lock'\nimport {type TFunction, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type VistaDrawer} from '../../store/types'\nimport {useTabDrawerSlot, useVistaActor} from '../../store/VistaActorContext'\nimport {cx} from '../../util/cx'\nimport * as styles from '../vista.module.css'\nimport {QueryListPanel} from './QueryListPanel'\nimport {SettingsPanel} from './SettingsPanel'\n\n/** The lock's own element takes no part in the layout; the drawer is positioned by its class */\nconst TRAP_FOCUS_PROPS = {style: {display: 'contents'}}\n\nfunction drawerTitle(drawer: VistaDrawer, t: TFunction<'vision'>): string {\n switch (drawer) {\n case 'saved':\n return t('vista.sidebar.saved-queries')\n case 'shared':\n return t('vista.sidebar.shared-queries')\n case 'lint':\n return t('vista.panel.lint')\n case 'functions':\n return t('vista.panel.functions')\n case 'delta':\n return t('vista.panel.delta')\n case 'mutate':\n return t('vista.panel.mutate')\n case 'settings':\n return t('vista.settings.title')\n default: {\n const unknownDrawer: never = drawer\n return String(unknownDrawer)\n }\n }\n}\n\n/** The active tab renders its tool into this element (see `TabDrawerSlot`) */\nfunction TabDrawerSlotElement({drawer}: {drawer: VistaDrawer}) {\n const {setElement} = useTabDrawerSlot()\n return (\n <Box\n data-testid={`vista-drawer-${drawer}-content`}\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n overflow=\"auto\"\n ref={setElement}\n />\n )\n}\n\nfunction DrawerContent({drawer}: {drawer: VistaDrawer}): ReactNode {\n switch (drawer) {\n case 'saved':\n case 'shared':\n return <QueryListPanel key={drawer} mode={drawer} />\n case 'settings':\n return (\n <Box flexBasis=\"0%\" flexGrow={1} minHeight=\"0\" overflow=\"auto\">\n <SettingsPanel />\n </Box>\n )\n case 'lint':\n case 'functions':\n case 'delta':\n case 'mutate':\n return <TabDrawerSlotElement drawer={drawer} />\n default: {\n const unknownDrawer: never = drawer\n return String(unknownDrawer)\n }\n }\n}\n\nexport interface SidebarDrawerProps {\n drawer: VistaDrawer\n /** Float over the whole tool instead of taking a column, for phones */\n overlay: boolean\n}\n\nexport function SidebarDrawer({drawer, overlay}: SidebarDrawerProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const close = useCallback(() => actorRef.send({type: 'drawer.close'}), [actorRef])\n const title = drawerTitle(drawer, t)\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (overlay && event.key === 'Escape') {\n event.preventDefault()\n close()\n }\n },\n [close, overlay],\n )\n\n // Floating over the tool, the drawer is a modal dialog: the rest of the tool is inert (see\n // VistaGui and VistaSidebar), focus moves to its close button on open, Tab stays inside it (the\n // studio chrome above is not inert), and focus returns to the opener on close (VistaSidebar)\n return (\n <TrapFocus autoFocus disabled={!overlay} lockProps={TRAP_FOCUS_PROPS}>\n <Flex\n aria-label={overlay ? title : undefined}\n aria-modal={overlay || undefined}\n borderRight\n className={cx(\n styles.sidebarDrawer,\n drawer !== 'saved' && drawer !== 'shared' && styles.sidebarDrawerWide,\n overlay && styles.sidebarDrawerOverlay,\n )}\n data-testid={`vista-drawer-${drawer}`}\n flexDirection=\"column\"\n height=\"100%\"\n onKeyDown={handleKeyDown}\n role={overlay ? 'dialog' : undefined}\n >\n <Flex\n alignItems=\"center\"\n borderBottom\n flexShrink={0}\n gap={2}\n justifyContent=\"space-between\"\n paddingLeft={3}\n paddingRight={2}\n paddingY={2}\n >\n <Text size={1} weight=\"medium\">\n {title}\n </Text>\n <Button\n aria-label={t('vista.drawer.close')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={close}\n padding={2}\n />\n </Flex>\n <DrawerContent drawer={drawer} />\n </Flex>\n </TrapFocus>\n )\n}\n","import {BoltIcon} from '@sanity/icons/Bolt'\nimport {BookmarkIcon} from '@sanity/icons/Bookmark'\nimport {CodeIcon} from '@sanity/icons/Code'\nimport {CogIcon} from '@sanity/icons/Cog'\nimport {DoubleChevronLeftIcon} from '@sanity/icons/DoubleChevronLeft'\nimport {DoubleChevronRightIcon} from '@sanity/icons/DoubleChevronRight'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {RestoreIcon} from '@sanity/icons/Restore'\nimport {TransferIcon} from '@sanity/icons/Transfer'\nimport {UsersIcon} from '@sanity/icons/Users'\nimport {Badge, Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ComponentType, type MouseEvent, useCallback, useRef, useSyncExternalStore} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useOnValueChange} from '../../hooks/useOnValueChange'\nimport {type VistaDrawer} from '../../store/types'\nimport {\n type SidebarBadge,\n useSidebarBadges,\n useVistaActor,\n useVistaExperience,\n useVistaSelector,\n} from '../../store/VistaActorContext'\nimport {selectOpenDrawer} from '../../store/vistaMachine'\nimport {cx} from '../../util/cx'\nimport * as styles from '../vista.module.css'\nimport {SidebarDrawer} from './SidebarDrawer'\n\ninterface SidebarItemProps {\n icon: ComponentType\n label: string\n expanded: boolean\n selected?: boolean\n /** A count, such as the active tab's lint findings */\n badge?: SidebarBadge\n testId: string\n onClick: (event: MouseEvent<HTMLElement>) => void\n}\n\nfunction SidebarItem({icon, label, expanded, selected, badge, testId, onClick}: SidebarItemProps) {\n const name = badge ? `${label} (${badge.count})` : label\n const count = badge && (\n <Badge\n aria-hidden\n className={cx(styles.sidebarItemBadge, expanded && styles.sidebarItemBadgeExpanded)}\n data-testid={`${testId}-badge`}\n fontSize={0}\n tone={badge.tone}\n >\n {badge.count}\n </Badge>\n )\n if (expanded) {\n return (\n <div className={styles.sidebarItem}>\n <Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n justify=\"flex-start\"\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n text={label}\n width=\"fill\"\n />\n {count}\n </div>\n )\n }\n\n return (\n <div className={styles.sidebarItem}>\n <Tooltip animate content={<Text size={1}>{name}</Text>} placement=\"right\" portal>\n <Button\n aria-label={name}\n data-testid={testId}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n selected={selected}\n />\n </Tooltip>\n {count}\n </div>\n )\n}\n\nexport function VistaSidebar() {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const {layout, switchToClassic} = useVistaExperience()\n const expanded = useVistaSelector((snapshot) => snapshot.matches({sidebar: 'expanded'}))\n const drawer = useVistaSelector(selectOpenDrawer)\n const sidebarBadges = useSidebarBadges()\n const badges = useSyncExternalStore(sidebarBadges.subscribe, sidebarBadges.get)\n const isMobile = layout === 'mobile'\n\n // The rail button that opened the drawer, remembered from its click: the drawer is a modal\n // dialog on phones, and focus goes back there once it has closed. Not read when the drawer's\n // focus lock activates, which happens again when a hidden `<Activity>` shows the tool with the\n // drawer still open (focus is elsewhere by then), and not restored from an effect cleanup, which\n // also runs when the tool is hidden. The lock's own `returnFocus` is no use either: it resolves\n // its target while the drawer unmounts, when the rail still carries `inert` from the same\n // commit and focus-lock sees nothing focusable there\n const openerRef = useRef<HTMLElement | null>(null)\n const toggleDrawer = useCallback(\n (target: VistaDrawer, event: MouseEvent<HTMLElement>) => {\n if (drawer === null) openerRef.current = event.currentTarget\n actorRef.send({type: 'drawer.toggle', drawer: target})\n },\n [actorRef, drawer],\n )\n useOnValueChange(drawer, (next, previous) => {\n if (previous === null || next !== null) return\n openerRef.current?.focus()\n openerRef.current = null\n })\n\n const rail = (\n <Flex\n aria-label={t('vista.sidebar.label')}\n as=\"nav\"\n borderRight\n className={cx(\n styles.sidebarRail,\n expanded ? styles.sidebarRailExpanded : styles.sidebarRailCollapsed,\n isMobile && expanded && styles.sidebarRailOverlay,\n )}\n data-testid=\"vista-sidebar\"\n flexDirection=\"column\"\n gap={1}\n height=\"100%\"\n // Under a phone's full-width drawer the rail is covered and must not take focus\n inert={isMobile && drawer !== null}\n justifyContent=\"space-between\"\n padding={2}\n >\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n expanded={expanded}\n icon={UsersIcon}\n label={t('vista.sidebar.shared-queries')}\n onClick={(event) => toggleDrawer('shared', event)}\n selected={drawer === 'shared'}\n testId=\"vista-sidebar-shared\"\n />\n <SidebarItem\n expanded={expanded}\n icon={BookmarkIcon}\n label={t('vista.sidebar.saved-queries')}\n onClick={(event) => toggleDrawer('saved', event)}\n selected={drawer === 'saved'}\n testId=\"vista-sidebar-saved\"\n />\n <Box borderTop marginTop={1} paddingTop={1}>\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n badge={badges.lint}\n expanded={expanded}\n icon={ErrorOutlineIcon}\n label={t('vista.panel.lint')}\n onClick={(event) => toggleDrawer('lint', event)}\n selected={drawer === 'lint'}\n testId=\"vista-sidebar-lint\"\n />\n <SidebarItem\n badge={badges.functions}\n expanded={expanded}\n icon={CodeIcon}\n label={t('vista.panel.functions')}\n onClick={(event) => toggleDrawer('functions', event)}\n selected={drawer === 'functions'}\n testId=\"vista-sidebar-functions\"\n />\n <SidebarItem\n expanded={expanded}\n icon={TransferIcon}\n label={t('vista.panel.delta')}\n onClick={(event) => toggleDrawer('delta', event)}\n selected={drawer === 'delta'}\n testId=\"vista-sidebar-delta\"\n />\n <SidebarItem\n expanded={expanded}\n icon={EditIcon}\n label={t('vista.panel.mutate')}\n onClick={(event) => toggleDrawer('mutate', event)}\n selected={drawer === 'mutate'}\n testId=\"vista-sidebar-mutate\"\n />\n </Flex>\n </Box>\n </Flex>\n <Flex flexDirection=\"column\" gap={1}>\n <SidebarItem\n expanded={expanded}\n icon={BoltIcon}\n label={t('vista.sidebar.shortcuts')}\n onClick={() => actorRef.send({type: 'dialog.open', dialog: 'shortcuts'})}\n testId=\"vista-sidebar-shortcuts\"\n />\n <SidebarItem\n expanded={expanded}\n icon={CogIcon}\n label={t('vista.sidebar.settings')}\n onClick={(event) => toggleDrawer('settings', event)}\n selected={drawer === 'settings'}\n testId=\"vista-sidebar-settings\"\n />\n <SidebarItem\n expanded={expanded}\n icon={RestoreIcon}\n label={t('vista.redesign.switch-to-classic')}\n onClick={switchToClassic}\n testId=\"vista-sidebar-classic\"\n />\n <Box borderTop paddingTop={1}>\n <SidebarItem\n expanded={expanded}\n icon={expanded ? DoubleChevronLeftIcon : DoubleChevronRightIcon}\n label={expanded ? t('vista.sidebar.collapse') : t('vista.sidebar.expand')}\n onClick={() => actorRef.send({type: 'sidebar.toggle'})}\n testId=\"vista-sidebar-toggle\"\n />\n </Box>\n </Flex>\n </Flex>\n )\n\n return (\n <Flex flexShrink={0} height=\"100%\" minHeight=\"0\">\n {isMobile ? <div className={styles.sidebarSlot}>{rail}</div> : rail}\n {drawer && <SidebarDrawer drawer={drawer} overlay={isMobile} />}\n </Flex>\n )\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useCallback} from 'react'\n\n/**\n * Copies text to the clipboard and confirms with a toast. Falls back to a hidden textarea and\n * `execCommand` where the async clipboard API is unavailable (insecure contexts, some webviews).\n */\nexport function useCopyToClipboard(): (text: string, successTitle: string) => Promise<void> {\n const toast = useToast()\n\n return useCallback(\n async (text: string, successTitle: string) => {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n } else {\n copyWithTextarea(text)\n }\n toast.push({closable: true, status: 'success', title: successTitle})\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: err instanceof Error ? err.message : String(err),\n })\n }\n },\n [toast],\n )\n}\n\nfunction copyWithTextarea(text: string): void {\n // `select()` focuses the textarea, and removing the focused element drops focus on the\n // document, so the control that triggered the copy gets it back afterwards\n const previouslyFocused = document.activeElement\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('readonly', '')\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n let copied = false\n try {\n // oxlint-disable-next-line no-deprecated -- fallback for environments without navigator.clipboard\n copied = document.execCommand('copy')\n } finally {\n textarea.remove()\n if (\n previouslyFocused instanceof HTMLElement &&\n previouslyFocused !== document.body &&\n previouslyFocused.isConnected\n ) {\n previouslyFocused.focus({preventScroll: true})\n }\n }\n if (!copied) {\n throw new Error('Copying to the clipboard is not allowed here')\n }\n}\n","import {usePerspective} from 'sanity'\n\nimport {type VistaPerspective} from '../store/types'\nimport {useOnValueChange} from './useOnValueChange'\n\n/**\n * Follows the studio navbar, as the classic tool does: pinning another release or perspective\n * there switches a tab on one of Vision's own perspectives back to the global one, so what the\n * user sees in the studio is what the query runs against. Tabs already on `global` follow by\n * themselves.\n */\nexport function useFollowNavbarPerspective(\n perspective: VistaPerspective,\n setPerspective: (perspective: VistaPerspective) => void,\n): void {\n const {perspectiveStack} = usePerspective()\n\n useOnValueChange(perspectiveStack.join(','), () => {\n if (perspectiveStack.length > 0 && perspective !== 'global') {\n setPerspective('global')\n }\n })\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useSelector} from '@xstate/react'\nimport {useEffect, useMemo} from 'react'\nimport {useClient, useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport {type QueryRunnerRef} from '../store/queryRunnerMachine'\nimport {LIVE_EVENTS_API_VERSION} from '../util/syncTags'\n\ninterface LiveSubscriptionOptions {\n runnerRef: QueryRunnerRef\n /** Live events are per dataset, so the subscription follows the tab's dataset */\n dataset: string\n /** Whether the tab wants live refetching and its API version supports sync tags */\n enabled: boolean\n /** Scopes the error toast to the tab */\n tabId: string\n}\n\n/**\n * Keeps the runner's live-events subscription in sync with the tab: on while the tab refetches\n * automatically (and its API version returns sync tags), off otherwise and while the tab is not\n * the active one, so a background tab never refetches out of sight. Reports subscription\n * failures through a toast.\n */\nexport function useLiveSubscription({\n runnerRef,\n dataset,\n enabled,\n tabId,\n}: LiveSubscriptionOptions): void {\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n const liveError = useSelector(runnerRef, (snapshot) => snapshot.context.liveError)\n\n const baseClient = useClient({apiVersion: LIVE_EVENTS_API_VERSION})\n const liveClient = useMemo(() => baseClient.withConfig({dataset}), [baseClient, dataset])\n\n useEffect(() => {\n if (!enabled) {\n runnerRef.send({type: 'live.disable'})\n return undefined\n }\n runnerRef.send({type: 'live.enable', client: liveClient})\n return () => runnerRef.send({type: 'live.disable'})\n }, [enabled, liveClient, runnerRef])\n\n useEffect(() => {\n if (liveError) {\n toast.push({\n closable: true,\n id: `vista-live-error-${tabId}`,\n status: 'warning',\n title: t('vista.live.error', {message: liveError.message}),\n })\n }\n }, [liveError, t, tabId, toast])\n}\n","import {isHotkey} from 'is-hotkey-esm'\n\nexport type VistaShortcutId = 'fetch' | 'prettify' | 'copy-query'\n\nexport interface VistaShortcut {\n id: VistaShortcutId\n /** `is-hotkey` patterns, any of which triggers the shortcut */\n hotkeys: string[]\n /** Keys as shown in the shortcuts dialog and menus, with the platform's modifier key */\n keys: string[]\n /** Locale key of the shortcut's description */\n labelKey: 'vista.shortcuts.fetch' | 'vista.shortcuts.prettify' | 'vista.shortcuts.copy-query'\n}\n\nconst MOD_KEY =\n typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.platform) ? '⌘' : 'Ctrl'\n\nexport const VISTA_SHORTCUTS: Record<VistaShortcutId, VistaShortcut> = {\n 'fetch': {\n id: 'fetch',\n hotkeys: ['mod+enter', 'ctrl+enter'],\n keys: [MOD_KEY, 'Enter'],\n labelKey: 'vista.shortcuts.fetch',\n },\n 'prettify': {\n id: 'prettify',\n hotkeys: ['mod+shift+p'],\n keys: [MOD_KEY, 'Shift', 'P'],\n labelKey: 'vista.shortcuts.prettify',\n },\n 'copy-query': {\n id: 'copy-query',\n hotkeys: ['mod+shift+c'],\n keys: [MOD_KEY, 'Shift', 'C'],\n labelKey: 'vista.shortcuts.copy-query',\n },\n}\n\n/** The shortcuts in the order the shortcuts dialog lists them */\nexport const VISTA_SHORTCUT_LIST: VistaShortcut[] = Object.values(VISTA_SHORTCUTS)\n\nexport interface EditorShortcut {\n keys: string[]\n labelKey:\n | 'vista.shortcuts.next-finding'\n | 'vista.shortcuts.complete'\n | 'vista.shortcuts.extract-function'\n}\n\nconst ALT_KEY = MOD_KEY === '⌘' ? '⌥' : 'Alt'\n\n/** The query editor's `EXTRACT_FUNCTION_KEY`, as the shortcuts dialog and hints show it */\nexport const EXTRACT_FUNCTION_SHORTCUT: EditorShortcut = {\n keys: [ALT_KEY, 'Enter'],\n labelKey: 'vista.shortcuts.extract-function',\n}\n\n/** Shortcuts CodeMirror handles inside the query editor, listed in the dialog so they can be found */\nexport const EDITOR_SHORTCUTS: EditorShortcut[] = [\n {keys: ['F8'], labelKey: 'vista.shortcuts.next-finding'},\n {keys: ['Ctrl', 'Space'], labelKey: 'vista.shortcuts.complete'},\n EXTRACT_FUNCTION_SHORTCUT,\n]\n\nexport function matchVistaShortcut(event: KeyboardEvent): VistaShortcutId | null {\n const shortcut = VISTA_SHORTCUT_LIST.find(({hotkeys}) =>\n hotkeys.some((hotkey) => isHotkey(hotkey, event)),\n )\n return shortcut ? shortcut.id : null\n}\n","import {useEffect} from 'react'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {isVisionPasteTarget} from '../../util/isVisionPasteTarget'\nimport {matchVistaShortcut, type VistaShortcutId} from '../util/shortcuts'\n\ninterface VistaDocumentEventsOptions {\n /** Events outside this element (other studio UI, dialogs) are ignored */\n rootElement: HTMLElement | null\n onShortcut: (shortcut: VistaShortcutId) => void\n /**\n * Receives pasted text; returning `true` claims the paste (it is not inserted), so anything\n * that is not a query URL still pastes natively.\n */\n onPaste: (text: string) => boolean\n}\n\n/**\n * The tool-wide keyboard shortcuts and the paste-a-query-URL handler, listening on the document\n * so they work wherever the focus is inside the tool.\n */\nexport function useVistaDocumentEvents({\n rootElement,\n onShortcut,\n onPaste,\n}: VistaDocumentEventsOptions): void {\n const handleKeyDown = useEffectEvent((event: KeyboardEvent) => {\n if (!rootElement || !(event.target instanceof Node) || !rootElement.contains(event.target)) {\n return\n }\n const shortcut = matchVistaShortcut(event)\n if (!shortcut) return\n event.preventDefault()\n event.stopPropagation()\n onShortcut(shortcut)\n })\n\n const handlePaste = useEffectEvent((event: ClipboardEvent) => {\n if (!event.clipboardData || !isVisionPasteTarget(rootElement, event)) return\n if (onPaste(event.clipboardData.getData('text/plain'))) {\n event.preventDefault()\n }\n })\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => handleKeyDown(event)\n const onPasteEvent = (event: ClipboardEvent) => handlePaste(event)\n document.addEventListener('keydown', onKeyDown)\n document.addEventListener('paste', onPasteEvent)\n return () => {\n document.removeEventListener('keydown', onKeyDown)\n document.removeEventListener('paste', onPasteEvent)\n }\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [])\n}\n","import type * as GroqWasm from '@sanity-labs/groq-wasm'\n\n/**\n * Lazy wrapper around `@sanity-labs/groq-wasm`: the WebAssembly build of the `groq-format`\n * formatter and the `groq-lint` rules from sanity-labs/sanity-lint. Evaluating that module fetches\n * and instantiates some 340 KB of WebAssembly, so it is only loaded when a query is first\n * formatted or linted, not with the tool. Parse errors carry UTF-8 byte offsets from Rust;\n * everything returned from here is an index into the query string, as the editor understands it.\n */\n\ntype GroqWasmModule = typeof GroqWasm\n\nexport type GroqFindingSeverity = 'error' | 'warning' | 'info'\n\nexport interface GroqFinding {\n /** The rule that fired, kebab-cased (`join-in-filter`) */\n ruleId: string\n message: string\n severity: GroqFindingSeverity\n from: number\n to: number\n}\n\n/** The runtime shape of a `@sanity-labs/groq-wasm` finding; its declared type is not shipped */\nexport interface WasmFinding {\n ruleId: string\n message: string\n severity: GroqFindingSeverity\n /** Indices into the query string; absent for findings about the query as a whole */\n span?: {start: {offset: number}; end: {offset: number}}\n}\n\n/** The query does not parse; `from` and `to` delimit the offending token */\nexport class GroqSyntaxError extends Error {\n override name = 'GroqSyntaxError'\n readonly from: number\n readonly to: number\n\n constructor(message: string, from: number, to: number) {\n super(message)\n this.from = from\n this.to = to\n }\n}\n\n/** A `$name` reference extracted from a query, with its locations */\nexport interface GroqQueryParam {\n name: string\n /** Where `$name` occurs in the query; already indices into the query string */\n references: Array<{from: number; to: number}>\n}\n\nlet groqWasm: Promise<GroqWasmModule> | undefined\n\nfunction loadGroqWasm(): Promise<GroqWasmModule> {\n groqWasm ??= import('@sanity-labs/groq-wasm').catch((error: unknown) => {\n // Offline or blocked WebAssembly: forget the failed attempt so the next call retries\n groqWasm = undefined\n throw error\n })\n return groqWasm\n}\n\nfunction isAscii(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) > 0x7f) return false\n }\n return true\n}\n\n/**\n * Maps UTF-8 byte offsets to indices into `text`. Rust counts bytes, JavaScript strings count\n * UTF-16 code units; the two only agree while the text is ASCII.\n */\nexport function createByteOffsetConverter(text: string): (byteOffset: number) => number {\n if (isAscii(text)) {\n return (byteOffset) => Math.max(0, Math.min(byteOffset, text.length))\n }\n return (byteOffset) => {\n let bytes = 0\n let index = 0\n for (const char of text) {\n if (bytes >= byteOffset) break\n const codePoint = char.codePointAt(0) || 0\n bytes += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : codePoint < 0x10000 ? 3 : 4\n index += char.length\n }\n return index\n }\n}\n\n// `Format error: Parse(\"expected ']' at Position { start: 1, end: 14 }\")`,\n// `Lint error: expected ']' at Position { start: 1, end: 14 }` and\n// `Failed to parse query: Parse error: expected ']' at Position { start: 1, end: 14 }` (from\n// `extractParams`) are the shapes the wasm wrapper produces; the message inside `Parse(\"…\")` is\n// Rust debug-escaped\nconst PARSE_WRAPPER_RE = /Parse\\(\"((?:[^\"\\\\]|\\\\.)*)\"\\)/\nconst PREFIX_RE =\n /^(?:(?:Failed to parse query|Format failed|Lint failed|Format error|Lint error|Parse error): )+/\nconst POSITION_RE = /\\s*at Position \\{ start: (\\d+), end: (\\d+) \\}\\s*$/\n\n/** Turns the wasm wrapper's parse failures into a {@link GroqSyntaxError}; anything else is rethrown */\nfunction toSyntaxError(error: unknown, query: string): GroqSyntaxError {\n if (!(error instanceof Error)) {\n throw error\n }\n const wrapped = PARSE_WRAPPER_RE.exec(error.message)\n const message = (wrapped ? wrapped[1].replace(/\\\\(.)/g, '$1') : error.message).replace(\n PREFIX_RE,\n '',\n )\n const position = POSITION_RE.exec(message)\n if (!position) {\n throw error\n }\n const toIndex = createByteOffsetConverter(query)\n const from = toIndex(Number(position[1]))\n const to = Math.max(from, toIndex(Number(position[2])))\n return new GroqSyntaxError(message.slice(0, position.index).trim(), from, to)\n}\n\n/**\n * Formats a query with `groq-format`, wrapping at `width` columns. Comments and parameter\n * references are preserved. Rejects with a {@link GroqSyntaxError} when the query does not parse.\n */\nexport async function formatGroq(query: string, width?: number): Promise<string> {\n const wasm = await loadGroqWasm()\n try {\n return wasm.format(query, {width: width ?? wasm.DEFAULT_WIDTH})\n } catch (error) {\n throw toSyntaxError(error, query)\n }\n}\n\n/**\n * Runs the `groq-lint` rules (joins in filters, unindexable comparisons, deep pagination, ...)\n * over a query. Rejects with a {@link GroqSyntaxError} when the query does not parse.\n */\nexport async function lintGroq(query: string): Promise<GroqFinding[]> {\n const wasm = await loadGroqWasm()\n let findings: WasmFinding[]\n try {\n findings = wasm.lint(query)\n } catch (error) {\n throw toSyntaxError(error, query)\n }\n return toGroqFindings(findings, query)\n}\n\n/** Converts the wasm findings' spans into ranges of `query`; a finding without a span covers all of it */\nexport function toGroqFindings(findings: WasmFinding[], query: string): GroqFinding[] {\n const clamp = (index: number) => Math.max(0, Math.min(index, query.length))\n return findings.map(({ruleId, message, severity, span}) => {\n const from = span ? clamp(span.start.offset) : 0\n const to = span ? Math.max(from, clamp(span.end.offset)) : query.length\n return {ruleId, message: message.trim(), severity, from, to}\n })\n}\n\n/**\n * Extracts every `$name` parameter a query references, with their locations. `extractParams`\n * already returns indices into the query string, so no conversion happens here. Rejects with a\n * {@link GroqSyntaxError} when the query does not parse.\n */\nexport async function extractQueryParams(query: string): Promise<GroqQueryParam[]> {\n const wasm = await loadGroqWasm()\n try {\n return wasm.extractParams(query).map(({name, references}) => ({\n name,\n references: references.map(({start, end}) => ({from: start, to: end})),\n }))\n } catch (error) {\n throw toSyntaxError(error, query)\n }\n}\n","import {type TFunction} from 'sanity'\n\nimport {parseParams} from '../../components/ParamsEditor'\nimport {type visionLocaleNamespace} from '../../i18n'\n\nfunction buildParamsInsertion(names: readonly string[]): string {\n return names.map((name) => ` ${JSON.stringify(name)}: \"\",\\n`).join('')\n}\n\n/**\n * Appends `\"name\": \"\"` for every `name` not already a key `rawParams` has, without touching any\n * of its existing text (so comments, formatting and values survive untouched). `rawParams` is\n * returned unchanged when its root is not a `{...}` object, since there is then nowhere\n * unambiguous to insert into; an empty or whitespace-only `rawParams` is treated as `{}`.\n */\nexport function addMissingParams(rawParams: string, missingNames: readonly string[]): string {\n if (missingNames.length === 0) return rawParams\n const trimmed = rawParams.trim()\n if (trimmed === '') return `{\\n${buildParamsInsertion(missingNames)}}`\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) return rawParams\n\n // Insert right before the object's closing brace. Nothing before it is rewritten, only\n // appended to, so a value that happens to end in a line comment cannot have the new separator\n // land inside that comment.\n const closeIndex = rawParams.lastIndexOf('}')\n const before = rawParams.slice(0, closeIndex)\n const after = rawParams.slice(closeIndex)\n const isEmptyObject = before.trimEnd().endsWith('{')\n const hasTrailingComma = /,\\s*$/.test(before)\n const needsComma = !isEmptyObject && !hasTrailingComma\n const separator = needsComma ? ',\\n' : before.endsWith('\\n') ? '' : '\\n'\n return `${before}${separator}${buildParamsInsertion(missingNames)}${after}`\n}\n\n/**\n * Which of `referencedNames` `rawParams` has no key for yet. `undefined` when `rawParams` is not\n * valid JSON5 (common while it is mid-edit, and not worth reporting as an error here).\n */\nexport function missingParamNames(\n referencedNames: readonly string[],\n rawParams: string,\n t: TFunction<typeof visionLocaleNamespace>,\n): string[] | undefined {\n const current = parseParams(rawParams, t)\n if (!current.valid) return undefined\n const existing = current.parsed ?? {}\n return referencedNames.filter((name) => !Object.hasOwn(existing, name))\n}\n","import {Facet} from '@codemirror/state'\n\nimport {type VistaSavedFunction} from '../store/types'\nimport {type QuerySchema} from './schemaCheck'\n\n/**\n * What the query editor's extensions know besides the query: the functions library (for lint,\n * completions and hover documentation of the functions it holds), the workspace schema the\n * query is checked against, and the translated labels of the UI those extensions render inside\n * the editor\n */\n\nexport interface GroqEditorLabels {\n /** Link to the GROQ functions reference */\n reference: string\n /** \"Needs API version v2021-03-25 or later\" */\n apiVersion: (version: string) => string\n deltaOnly: string\n /** A custom function, and the line its declaration starts on */\n declaredOn: (line: number) => string\n /** A library function the query does not declare */\n inLibrary: string\n /** Completions of the functions the query declares */\n completionDeclared: string\n /** Completions of the library's functions, which add their declaration */\n completionLibrary: string\n /** The button over a selection that can become a function */\n extract: string\n /** The lint action that declares a library function the query calls */\n addFromLibrary: string\n /** The lint action that writes the name a schema finding suggests */\n useSuggestion: (suggestion: string) => string\n}\n\nconst NO_FUNCTIONS: readonly VistaSavedFunction[] = []\n\nexport const functionLibrary = Facet.define<\n readonly VistaSavedFunction[],\n readonly VistaSavedFunction[]\n>({\n combine: (values) => values[0] ?? NO_FUNCTIONS,\n})\n\nexport const groqEditorLabels = Facet.define<GroqEditorLabels, GroqEditorLabels | undefined>({\n combine: (values) => values[0],\n})\n\n/** The workspace schema the query is checked against; none when the studio has no schema */\nexport const querySchema = Facet.define<QuerySchema, QuerySchema | undefined>({\n combine: (values) => values[0],\n})\n","/**\n * The built-in GROQ functions, as the GROQ functions reference documents them, for the query\n * editor's hover documentation, completions and function lint. Descriptions quote GROQ in\n * backticks, like the lint messages.\n */\n\nexport const GROQ_FUNCTIONS_REFERENCE_URL =\n 'https://www.sanity.io/docs/specifications/groq-functions'\n\nexport interface GroqFunctionDoc {\n /** `global` for the functions called without a namespace */\n namespace: string\n name: string\n /** As the reference writes it: `count(<array>) <integer>` */\n signature: string\n description: string\n /** How many arguments it takes, when the API checks that; `max` is `Infinity` for no limit */\n args?: {min: number; max: number}\n /** The oldest API version it works with, when that is newer than `v1` */\n apiVersion?: string\n /** Called after `|`: `* | order(_createdAt desc)` */\n pipe?: boolean\n /** Only inside a `score()` */\n scoreOnly?: boolean\n /** Only in delta mode, where webhooks and Sanity Functions run their filters */\n deltaOnly?: boolean\n}\n\nconst V2021 = 'v2021-03-25'\n\nfunction exactly(count: number): {min: number; max: number} {\n return {min: count, max: count}\n}\n\nexport const GROQ_FUNCTIONS: readonly GroqFunctionDoc[] = [\n {\n namespace: 'global',\n name: 'after',\n signature: 'after() <object>',\n description: 'Returns the document as it is after the change; `null` when it was deleted.',\n args: exactly(0),\n deltaOnly: true,\n },\n {\n namespace: 'global',\n name: 'before',\n signature: 'before() <object>',\n description: 'Returns the document as it was before the change; `null` when it was created.',\n args: exactly(0),\n deltaOnly: true,\n },\n {\n namespace: 'global',\n name: 'boost',\n signature: 'boost(<expression>, <number>)',\n description:\n 'Weighs a condition in `score()`: a match adds the boost value times what it would add otherwise. Boosts are constant positive numbers.',\n args: exactly(2),\n scoreOnly: true,\n },\n {\n namespace: 'global',\n name: 'coalesce',\n signature: 'coalesce(<any>...) <any>',\n description:\n 'Returns the first argument that is not `null`, or `null` when they all are: `coalesce(title.es, title.en)`.',\n },\n {\n namespace: 'global',\n name: 'count',\n signature: 'count(<array>) <integer>',\n description: 'Returns the number of elements in an array: `count(*[_type == \"movie\"])`.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'dateTime',\n signature: 'dateTime(<string>) <datetime>',\n description:\n 'Reads an RFC 3339 string, like `_createdAt`, as a datetime to compare and calculate with: subtracting two gives the seconds between them.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'defined',\n signature: 'defined(<any>) <boolean>',\n description:\n 'Returns `true` when the argument is not `null`. Strings longer than 1024 characters do not give the expected result; `match` works on any length.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'geo',\n signature: 'geo(<object>) <geo>',\n description:\n 'Reads a GeoJSON object, or one with `lat` and `lng`, as a geo value; `null` when it cannot.',\n args: exactly(1),\n apiVersion: V2021,\n },\n {\n namespace: 'global',\n name: 'identity',\n signature: 'identity() <string>',\n description:\n 'Returns the project user ID of whoever runs the query, `<anonymous>` without a login and `<system>` for system actions.',\n args: exactly(0),\n },\n {\n namespace: 'global',\n name: 'length',\n signature: 'length(<array|string>) <integer>',\n description:\n 'Returns the number of elements in an array or of characters in a string. For arrays, `count()` is faster.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'lower',\n signature: 'lower(<string>) <string>',\n description: 'Returns the string in lowercase.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'now',\n signature: 'now() <string>',\n description:\n 'Returns the time the query runs at, in RFC 3339 format (UTC), the same for every call in a query. The API CDN caches queries that use it for 120 seconds.',\n args: exactly(0),\n },\n {\n namespace: 'global',\n name: 'order',\n signature: 'order(<expression> [asc|desc], ...)',\n description:\n 'Sorts an array by the expressions, each ascending unless followed by `desc`: `* | order(_createdAt desc)`.',\n args: {min: 1, max: Infinity},\n pipe: true,\n },\n {\n namespace: 'global',\n name: 'path',\n signature: 'path(<string>) <path>',\n description:\n 'Reads a string as a path to match IDs against: `*` matches one segment and `**` any number, so `_id in path(\"drafts.**\")` matches every draft.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'references',\n signature: 'references(<path|string|array>) <boolean>',\n description:\n 'Returns `true` when the document at the root of the current scope references the given document ID, or any of the IDs in an array.',\n args: {min: 1, max: Infinity},\n },\n {\n namespace: 'global',\n name: 'round',\n signature: 'round(<integer|float>[, <integer>]) <integer|float>',\n description:\n 'Rounds a number to the nearest integer, or to the given number of decimals: `round(3.14, 1)` is `3.1`.',\n args: {min: 1, max: 2},\n },\n {\n namespace: 'global',\n name: 'score',\n signature: 'score(<expression>...)',\n description:\n 'Gives every document a `_score` for the conditions it matches, to sort by with `| order(_score desc)`. Takes conditions and `boost()`, not other functions, references or subqueries.',\n args: {min: 1, max: Infinity},\n pipe: true,\n },\n {\n namespace: 'global',\n name: 'select',\n signature: 'select(<condition> => <value>..., <fallback>) <any>',\n description:\n 'Returns the value of the first `condition => value` pair whose condition is `true`, or else the first argument that is not a pair; `null` when nothing applies.',\n },\n {\n namespace: 'global',\n name: 'string',\n signature: 'string(<integer|float|boolean|datetime|string>) <string>',\n description:\n 'Returns the string representation of a number, boolean, datetime or string, `null` for anything else.',\n args: exactly(1),\n },\n {\n namespace: 'global',\n name: 'upper',\n signature: 'upper(<string>) <string>',\n description: 'Returns the string in uppercase.',\n args: exactly(1),\n },\n {\n namespace: 'array',\n name: 'compact',\n signature: 'array::compact(<array>) <array>',\n description: 'Returns the array without its `null` elements.',\n args: exactly(1),\n },\n {\n namespace: 'array',\n name: 'intersects',\n signature: 'array::intersects(<array>, <array>) <boolean>',\n description: 'Returns `true` when the two arrays have an element in common.',\n args: exactly(2),\n },\n {\n namespace: 'array',\n name: 'join',\n signature: 'array::join(<array[string|number|boolean]>, <string>) <string>',\n description:\n 'Joins the elements into one string with the separator between them; an element without a string representation becomes `<INVALID>`.',\n args: exactly(2),\n },\n {\n namespace: 'array',\n name: 'unique',\n signature: 'array::unique(<array>) <array>',\n description:\n 'Returns the array without duplicate strings, numbers, booleans and `null`s, in no guaranteed order.',\n args: exactly(1),\n },\n {\n namespace: 'dateTime',\n name: 'now',\n signature: 'dateTime::now() <datetime>',\n description: 'Returns the time the query runs at, like `now()` but as a datetime.',\n args: exactly(0),\n },\n {\n namespace: 'delta',\n name: 'changedAny',\n signature: 'delta::changedAny(<selector>) <boolean>',\n description:\n 'Returns `true` when any of the selected fields changed: `delta::changedAny((title, slug.current))`.',\n args: exactly(1),\n deltaOnly: true,\n },\n {\n namespace: 'delta',\n name: 'changedOnly',\n signature: 'delta::changedOnly(<selector>) <boolean>',\n description:\n 'Returns `true` when nothing but the selected fields changed; `_rev` and `_updatedAt` are ignored.',\n args: exactly(1),\n deltaOnly: true,\n },\n {\n namespace: 'delta',\n name: 'operation',\n signature: 'delta::operation() <string>',\n description: 'Returns `create`, `update` or `delete`, for the operation that made the change.',\n args: exactly(0),\n deltaOnly: true,\n },\n {\n namespace: 'diff',\n name: 'changedAny',\n signature: 'diff::changedAny(<object>, <object>, <selector>) <boolean>',\n description: 'Returns `true` when any of the selected fields differ between the two objects.',\n args: exactly(3),\n },\n {\n namespace: 'diff',\n name: 'changedOnly',\n signature: 'diff::changedOnly(<object>, <object>, <selector>) <boolean>',\n description: 'Returns `true` when the two objects differ in nothing but the selected fields.',\n args: exactly(3),\n },\n {\n namespace: 'documents',\n name: 'get',\n signature: 'documents::get(<global document reference>) <document>',\n description: 'Resolves a global document reference, like `->` resolves a reference.',\n args: exactly(1),\n },\n {\n namespace: 'documents',\n name: 'incomingGlobalDocumentReferenceCount',\n signature: 'documents::incomingGlobalDocumentReferenceCount() <number>',\n description:\n 'Returns how many global document references point to the document in the current scope.',\n args: exactly(0),\n },\n {\n namespace: 'geo',\n name: 'contains',\n signature: 'geo::contains(<geo polygon>, <geo>) <boolean>',\n description: 'Returns `true` when the first geo value fully contains the second.',\n args: exactly(2),\n apiVersion: V2021,\n },\n {\n namespace: 'geo',\n name: 'distance',\n signature: 'geo::distance(<geo point>, <geo point>) <number>',\n description:\n 'Returns the distance between two points in meters; `null` for lines and polygons.',\n args: exactly(2),\n apiVersion: V2021,\n },\n {\n namespace: 'geo',\n name: 'intersects',\n signature: 'geo::intersects(<geo>, <geo>) <boolean>',\n description: 'Returns `true` when the two geo values overlap or intersect.',\n args: exactly(2),\n apiVersion: V2021,\n },\n {\n namespace: 'geo',\n name: 'latLng',\n signature: 'geo::latLng(<latitude>, <longitude>) <geo>',\n description: 'Returns the geo point at a latitude and a longitude.',\n args: exactly(2),\n apiVersion: V2021,\n },\n {\n namespace: 'math',\n name: 'avg',\n signature: 'math::avg(<array[number]>) <number|null>',\n description:\n 'Returns the average of the numbers in an array, ignoring `null`s; `null` when an element is not a number.',\n args: exactly(1),\n },\n {\n namespace: 'math',\n name: 'max',\n signature: 'math::max(<array[number]>) <number|null>',\n description:\n 'Returns the largest number in an array, ignoring `null`s; `null` when an element is not a number.',\n args: exactly(1),\n },\n {\n namespace: 'math',\n name: 'min',\n signature: 'math::min(<array[number]>) <number|null>',\n description:\n 'Returns the smallest number in an array, ignoring `null`s; `null` when an element is not a number.',\n args: exactly(1),\n },\n {\n namespace: 'math',\n name: 'sum',\n signature: 'math::sum(<array[number]>) <number|null>',\n description:\n 'Returns the sum of the numbers in an array, `0` for an empty one, ignoring `null`s; `null` when an element is not a number.',\n args: exactly(1),\n },\n {\n namespace: 'media',\n name: 'aspect',\n signature: 'media::aspect(<media library asset reference>, <string>) <any>',\n description: 'Returns the value of a public aspect of a Media Library asset.',\n args: exactly(2),\n },\n {\n namespace: 'pt',\n name: 'text',\n signature: 'pt::text(<Portable Text array|object>) <string>',\n description:\n 'Returns the plain text of a Portable Text block or array of blocks, with a blank line between blocks. Only the spans directly in the blocks count.',\n args: exactly(1),\n apiVersion: V2021,\n },\n {\n namespace: 'releases',\n name: 'all',\n signature: 'releases::all() <array>',\n description: 'Returns every release, like `*[_type == \"system.release\"]`.',\n args: exactly(0),\n },\n {\n namespace: 'sanity',\n name: 'dataset',\n signature: 'sanity::dataset() <string>',\n description: 'Returns the name of the dataset the query runs in.',\n args: exactly(0),\n apiVersion: V2021,\n },\n {\n namespace: 'sanity',\n name: 'partOfRelease',\n signature: 'sanity::partOfRelease(<string>) <boolean>',\n description:\n 'Returns `true` when the document at the root of the current scope is in the release with the given name, the last part of its ID.',\n args: exactly(1),\n apiVersion: 'v2025-02-19',\n },\n {\n namespace: 'sanity',\n name: 'projectId',\n signature: 'sanity::projectId() <string>',\n description: 'Returns the ID of the project the query runs in.',\n args: exactly(0),\n apiVersion: V2021,\n },\n {\n namespace: 'sanity',\n name: 'versionOf',\n signature: 'sanity::versionOf(<string>) <boolean>',\n description:\n 'Returns `true` when the document at the root of the current scope is a version (draft, published or in a release) of the given document ID.',\n args: exactly(1),\n apiVersion: 'v2025-02-19',\n },\n {\n namespace: 'string',\n name: 'split',\n signature: 'string::split(<string>, <string>) <array[string]>',\n description:\n 'Splits a string at every separator; an empty separator splits it into its characters.',\n args: exactly(2),\n },\n {\n namespace: 'string',\n name: 'startsWith',\n signature: 'string::startsWith(<string>, <string>) <boolean>',\n description: 'Returns `true` when the first string starts with the second.',\n args: exactly(2),\n },\n {\n namespace: 'text',\n name: 'highlight',\n signature: 'text::highlight(<document>, <text query>) <object>',\n description:\n 'Returns which parts of a document matched a `text::query()`, for snippets in search results. Experimental.',\n args: exactly(2),\n apiVersion: 'vX',\n },\n {\n namespace: 'text',\n name: 'query',\n signature: 'text::query(<string>) <text query>',\n description:\n 'Reads a search string (words, `\"phrases\"`, `prefix*`, `-negation`) for `match`: `title match text::query(\"dracula\")`.',\n args: exactly(1),\n },\n {\n namespace: 'text',\n name: 'semanticSimilarity',\n signature: 'text::semanticSimilarity(<string>) <number>',\n description:\n 'Ranks documents by how close their meaning is to the search term, in `score()`, on datasets with embeddings enabled.',\n args: exactly(1),\n scoreOnly: true,\n },\n {\n namespace: 'user',\n name: 'attributes',\n signature: 'user::attributes() <object>',\n description:\n 'Returns the user attributes of the logged-in user: `user::attributes().branch`. An Enterprise feature.',\n args: exactly(0),\n },\n]\n\n/**\n * Functions the API knows that the reference does not document: calling them is no mistake,\n * but there is nothing to show for them\n */\nconst UNDOCUMENTED_FUNCTIONS = new Set([\n 'global::anywhere',\n 'documents::incomingRefCount',\n 'string::lower',\n 'string::upper',\n])\n\nconst FUNCTIONS_BY_ID = new Map(GROQ_FUNCTIONS.map((doc) => [functionId(doc), doc]))\n\n/** `pt::text`, and for the global namespace just the name: `count` */\nexport function functionId({namespace, name}: {namespace: string; name: string}): string {\n return namespace === 'global' ? name : `${namespace}::${name}`\n}\n\n/** A call written without a namespace calls the global function of that name */\nexport function findGroqFunction(\n namespace: string | undefined,\n name: string,\n): GroqFunctionDoc | undefined {\n return FUNCTIONS_BY_ID.get(functionId({namespace: namespace ?? 'global', name}))\n}\n\nexport function isKnownGroqFunction(namespace: string | undefined, name: string): boolean {\n const id = functionId({namespace: namespace ?? 'global', name})\n return FUNCTIONS_BY_ID.has(id) || UNDOCUMENTED_FUNCTIONS.has(`${namespace ?? 'global'}::${name}`)\n}\n","import {parser} from '@sanity/lezer-groq'\n\nimport {type VistaSavedFunction} from '../store/types'\nimport {\n findGroqFunction,\n functionId,\n GROQ_FUNCTIONS,\n isKnownGroqFunction,\n} from './groqFunctionReference'\n\n/**\n * Custom GROQ functions (`fn ns::name($param) = $param{…};` at the start of a query) and the\n * calls a query makes, read from the lezer syntax tree the query editor highlights with: it has\n * positions, which groq-js errors do not, and it accepts what the API does (`releases::all()`,\n * `text::query()`) without knowing every function.\n */\n\nexport type GroqTree = ReturnType<typeof parser.parse>\nexport type GroqNode = GroqTree['topNode']\n\nexport interface TextRange {\n from: number\n to: number\n}\n\nexport interface FunctionDeclaration {\n /** `ex::author`; just the name when the namespace is missing */\n id: string\n namespace: string | undefined\n name: string\n /** The namespace and the name */\n nameRange: TextRange\n parameters: (TextRange & {name: string})[]\n /** From `fn` to the end of the body; the `;` is not part of it */\n range: TextRange\n /** The body's nodes, after `=` */\n body: GroqNode[]\n text: string\n}\n\nexport interface FunctionCall {\n /** `undefined` for a call written without one, which calls a global function */\n namespace: string | undefined\n name: string\n /** The namespace (when written) and the name */\n nameRange: TextRange\n range: TextRange\n argCount: number\n /** Made after `|` */\n piped: boolean\n node: GroqNode\n}\n\nexport interface QueryFunctions {\n declarations: FunctionDeclaration[]\n calls: FunctionCall[]\n}\n\nexport type FunctionFindingRule =\n | 'namespace'\n | 'parameters'\n | 'body-shape'\n | 'body-parameter'\n | 'parameter-reuse'\n | 'parent-scope'\n | 'recursion'\n | 'duplicate'\n | 'shadows-builtin'\n | 'unknown-function'\n | 'arity'\n | 'delta-only'\n | 'pipe'\n | 'score-only'\n\nexport interface FunctionFinding {\n rule: FunctionFindingRule\n severity: 'error' | 'warning'\n /** GROQ in backticks, like the `groq-lint` messages */\n message: string\n from: number\n to: number\n /** A library function the call could be declared from */\n libraryFunction?: VistaSavedFunction\n}\n\nconst DEFAULT_NAMESPACE = 'my'\n/** Reading the whole query on every selection change is cheap for queries, not for any text */\nconst MAX_EXTRACT_QUERY_LENGTH = 20_000\nconst PARAMETER_PLACEHOLDER = '$param'\n\n/** Nodes that continue the expression before them: `.title`, `->`, `[0]`, `{…}` */\nconst POSTFIX_NODES = new Set([\n 'ArrayTraversal',\n 'Filter',\n 'Projection',\n 'DotAccess',\n 'ParentAccess',\n 'SelectorAccess',\n 'Dereference',\n 'DerefAccess',\n])\n\n/** Nodes that start an expression a postfix chain can continue */\nconst PRIMARY_NODES = new Set([\n 'Everything',\n 'This',\n 'Parent',\n 'Parameter',\n 'String',\n 'Number',\n 'True',\n 'False',\n 'Null',\n 'NamespacedCall',\n 'FunctionCall',\n 'Identifier',\n 'ArrayLiteral',\n 'ObjectLiteral',\n 'ParenExpression',\n])\n\nexport function parseGroq(query: string): GroqTree {\n return parser.parse(query)\n}\n\nexport function hasSyntaxErrors(tree: GroqTree): boolean {\n let found = false\n tree.iterate({\n enter: (node) => {\n if (node.type.isError) found = true\n return !found\n },\n })\n return found\n}\n\nfunction isTrivia(node: GroqNode): boolean {\n return node.name === 'LineComment'\n}\n\nfunction children(node: GroqNode): GroqNode[] {\n const nodes: GroqNode[] = []\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (!isTrivia(child)) nodes.push(child)\n }\n return nodes\n}\n\nfunction previousSibling(node: GroqNode): GroqNode | null {\n let sibling = node.prevSibling\n while (sibling && isTrivia(sibling)) sibling = sibling.prevSibling\n return sibling\n}\n\nfunction nextSibling(node: GroqNode): GroqNode | null {\n let sibling = node.nextSibling\n while (sibling && isTrivia(sibling)) sibling = sibling.nextSibling\n return sibling\n}\n\nexport function textOf(query: string, node: {from: number; to: number}): string {\n return query.slice(node.from, node.to)\n}\n\n/** Every node below `node`, depth first, with the number of scopes (projections, filters) above it */\nfunction walk(node: GroqNode, visit: (node: GroqNode, level: number) => void, level = 0): void {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n visit(child, level)\n walk(child, visit, child.name === 'Projection' || child.name === 'Filter' ? level + 1 : level)\n }\n}\n\nfunction readDeclaration(node: GroqNode, query: string): FunctionDeclaration | null {\n const nameNode = node.getChild('FunctionName')\n if (!nameNode) return null\n const namespaceNode = node.getChild('Namespace')\n const namespace = namespaceNode ? textOf(query, namespaceNode) : undefined\n const name = textOf(query, nameNode)\n const parameters: FunctionDeclaration['parameters'] = []\n const body: GroqNode[] = []\n let inBody = false\n for (const child of children(node)) {\n if (inBody) {\n body.push(child)\n } else if (child.name === '=') {\n inBody = true\n } else if (child.name === 'Parameter') {\n parameters.push({name: textOf(query, child), from: child.from, to: child.to})\n }\n }\n return {\n id: namespace === undefined ? name : `${namespace}::${name}`,\n namespace,\n name,\n nameRange: {from: namespaceNode?.from ?? nameNode.from, to: nameNode.to},\n parameters,\n range: {from: node.from, to: node.to},\n body,\n text: textOf(query, node),\n }\n}\n\nfunction readCall(node: GroqNode, query: string): FunctionCall | null {\n const nameNode = node.getChild('FunctionName')\n if (!nameNode) return null\n const namespaceNode = node.getChild('Namespace')\n let argCount = 0\n let inArgs = false\n let argumentStarted = false\n for (const child of children(node)) {\n if (!inArgs) {\n inArgs = child.name === '('\n continue\n }\n if (child.name === ')') break\n if (child.name === ',') {\n if (argumentStarted) argCount++\n argumentStarted = false\n } else {\n argumentStarted = true\n }\n }\n if (argumentStarted) argCount++\n return {\n namespace: namespaceNode ? textOf(query, namespaceNode) : undefined,\n name: textOf(query, nameNode),\n nameRange: {from: namespaceNode?.from ?? nameNode.from, to: nameNode.to},\n range: {from: node.from, to: node.to},\n argCount,\n piped: previousSibling(node)?.name === 'Pipe',\n node,\n }\n}\n\n/** The custom functions a query declares and every function call it makes, in order */\nexport function readQueryFunctions(tree: GroqTree, query: string): QueryFunctions {\n const declarations: FunctionDeclaration[] = []\n const calls: FunctionCall[] = []\n tree.iterate({\n enter: (ref) => {\n if (ref.name === 'FunctionDef') {\n const declaration = readDeclaration(ref.node, query)\n if (declaration) declarations.push(declaration)\n } else if (ref.name === 'FunctionCall' || ref.name === 'NamespacedCall') {\n const call = readCall(ref.node, query)\n if (call) calls.push(call)\n }\n },\n })\n return {declarations, calls}\n}\n\n/** `ex::author`, and for a global function its name */\nexport function callId(call: Pick<FunctionCall, 'namespace' | 'name'>): string {\n return call.namespace === undefined ? call.name : `${call.namespace}::${call.name}`\n}\n\n/** The declaration of a saved function, or `null` when it is not one */\nexport function parseDeclaration(declaration: string): FunctionDeclaration | null {\n const tree = parseGroq(`${declaration};\\nnull`)\n if (hasSyntaxErrors(tree)) return null\n const [first] = readQueryFunctions(tree, `${declaration};\\nnull`).declarations\n return first && first.range.from === 0 && first.range.to === declaration.length ? first : null\n}\n\n/** The text without whitespace, except inside strings */\nfunction withoutLayout(text: string): string {\n let result = ''\n let quote: string | null = null\n for (let index = 0; index < text.length; index++) {\n const char = text[index]\n if (quote) {\n result += char\n if (char === '\\\\') {\n result += text[index + 1] ?? ''\n index++\n } else if (char === quote) {\n quote = null\n }\n } else if (char === '\"' || char === \"'\") {\n quote = char\n result += char\n } else if (!/\\s/.test(char)) {\n result += char\n }\n }\n return result\n}\n\n/** Whether two declarations say the same, however they are laid out (Prettify reflows them) */\nexport function isSameDeclaration(a: string, b: string): boolean {\n return withoutLayout(a) === withoutLayout(b)\n}\n\n/** `ex::author($ref)`, for lists of functions */\nexport function describeSignature(declaration: FunctionDeclaration): string {\n return `${declaration.id}(${declaration.parameters.map((parameter) => parameter.name).join(', ')})`\n}\n\n/** The body as written, after `=` */\nexport function describeBody(declaration: FunctionDeclaration): string {\n const {body} = declaration\n if (body.length === 0) return ''\n const start = body[0].from - declaration.range.from\n return declaration.text.slice(start)\n}\n\nfunction countArguments(count: number): string {\n return count === 1 ? 'one argument' : `${count} arguments`\n}\n\nfunction describeArity({min, max}: {min: number; max: number}): string {\n if (min === max) return min === 0 ? 'takes no arguments' : `takes ${countArguments(min)}`\n if (max === Infinity) return `takes at least ${countArguments(min)}`\n return `takes ${min} ${max === min + 1 ? 'or' : 'to'} ${max} arguments`\n}\n\nfunction isInsideScore(node: GroqNode, query: string): boolean {\n for (let parent = node.parent; parent; parent = parent.parent) {\n if (parent.name !== 'FunctionCall') continue\n const name = parent.getChild('FunctionName')\n if (name && textOf(query, name) === 'score') return true\n }\n return false\n}\n\n/** How many scopes `^` climbs: `^` one, `^.^` two */\nfunction parentDepth(node: GroqNode): number {\n let depth = node.to - node.from\n for (let next = nextSibling(node); next?.name === 'ParentAccess'; next = nextSibling(next)) {\n const parent = next.getChild('Parent')\n depth += parent ? parent.to - parent.from : 0\n }\n return depth\n}\n\n/**\n * The checks groq-js runs on a function body (`mapCustomFunction`, `walkValidateCustomFunction`):\n * it projects its parameter in one of four forms, uses the parameter nowhere else, and every `^`\n * stays inside the body, where each projection and filter opens a scope\n */\nfunction checkBody(declaration: FunctionDeclaration, query: string): FunctionFinding[] {\n const findings: FunctionFinding[] = []\n const [parameter] = declaration.parameters\n const parameterName = parameter?.name ?? PARAMETER_PLACEHOLDER\n const {body} = declaration\n if (body.length === 0) return findings\n const bodyRange = {from: body[0].from, to: body[body.length - 1].to}\n\n const base = body[0]\n if (base.name === 'Parameter' && parameter && textOf(query, base) !== parameter.name) {\n findings.push({\n rule: 'body-parameter',\n severity: 'error',\n message: `\\`${textOf(query, base)}\\` is not the parameter of this function, \\`${parameter.name}\\``,\n from: base.from,\n to: base.to,\n })\n return findings\n }\n let index = 1\n if (body[index]?.name === 'ArrayTraversal') index++\n if (body[index]?.name === 'Dereference') index++\n const projection = body[index]\n if (base.name !== 'Parameter' || projection?.name !== 'Projection' || index !== body.length - 1) {\n findings.push({\n rule: 'body-shape',\n severity: 'error',\n message: `A function body projects its parameter: \\`${parameterName}{…}\\`, \\`${parameterName}->{…}\\`, \\`${parameterName}[]{…}\\` or \\`${parameterName}[]->{…}\\``,\n ...bodyRange,\n })\n return findings\n }\n\n const parameterNames = new Set(declaration.parameters.map((it) => it.name))\n walk(projection, (node, level) => {\n if (node.name === 'Parameter' && parameterNames.has(textOf(query, node))) {\n findings.push({\n rule: 'parameter-reuse',\n severity: 'error',\n message: `A function can use its parameter only once, at the start of the body: \\`${textOf(query, node)}\\` cannot be used here`,\n from: node.from,\n to: node.to,\n })\n }\n // `^.^` is one parent chain; its second `^` belongs to the `.^` after the first\n if (\n node.name === 'Parent' &&\n node.parent?.name !== 'ParentAccess' &&\n parentDepth(node) > level\n ) {\n findings.push({\n rule: 'parent-scope',\n severity: 'error',\n message:\n 'Custom functions cannot reach outside their body: `^` here refers to the scope the function is called from',\n from: node.from,\n to: node.to,\n })\n }\n })\n return findings\n}\n\nfunction enclosingDeclaration(\n range: TextRange,\n declarations: FunctionDeclaration[],\n): FunctionDeclaration | undefined {\n return declarations.find(\n (declaration) => range.from >= declaration.range.from && range.to <= declaration.range.to,\n )\n}\n\nfunction checkRecursion(\n declarations: FunctionDeclaration[],\n calls: FunctionCall[],\n declared: Map<string, FunctionDeclaration>,\n): FunctionFinding[] {\n const callsByCaller = new Map<string, FunctionCall[]>()\n for (const call of calls) {\n const caller = enclosingDeclaration(call.range, declarations)\n if (!caller || !declared.has(callId(call))) continue\n callsByCaller.set(caller.id, [...(callsByCaller.get(caller.id) ?? []), call])\n }\n const reaches = (from: string, target: string, seen: Set<string>): boolean => {\n if (from === target) return true\n if (seen.has(from)) return false\n seen.add(from)\n return (callsByCaller.get(from) ?? []).some((call) => reaches(callId(call), target, seen))\n }\n\n const findings: FunctionFinding[] = []\n for (const [caller, callerCalls] of callsByCaller) {\n for (const call of callerCalls) {\n const callee = callId(call)\n if (callee === caller) {\n findings.push({\n rule: 'recursion',\n severity: 'error',\n message: 'Custom functions cannot call themselves',\n ...call.nameRange,\n })\n } else if (reaches(callee, caller, new Set())) {\n findings.push({\n rule: 'recursion',\n severity: 'error',\n message: `Calling \\`${callee}()\\` here leads back to \\`${caller}()\\`; custom functions cannot be recursive`,\n ...call.nameRange,\n })\n }\n }\n }\n return findings\n}\n\nfunction checkCall(\n call: FunctionCall,\n declared: Map<string, FunctionDeclaration>,\n library: readonly VistaSavedFunction[],\n query: string,\n): FunctionFinding[] {\n const id = callId(call)\n const at = call.nameRange\n const custom = call.namespace === undefined ? undefined : declared.get(id)\n const doc = custom ? undefined : findGroqFunction(call.namespace, call.name)\n\n if (call.piped && !doc?.pipe) {\n return [\n {\n rule: 'pipe',\n severity: 'warning',\n message: `Only \\`order()\\` and \\`score()\\` can follow \\`|\\`, not \\`${id}()\\``,\n ...at,\n },\n ]\n }\n if (custom) {\n return call.argCount === 1\n ? []\n : [\n {\n rule: 'arity',\n severity: 'error',\n message: `\\`${id}()\\` takes one argument, not ${call.argCount}`,\n ...at,\n },\n ]\n }\n if (!doc) {\n if (isKnownGroqFunction(call.namespace, call.name)) return []\n const libraryFunction = library.find((saved) => saved.id === id)\n return [\n {\n rule: 'unknown-function',\n severity: 'warning',\n message: libraryFunction\n ? `\\`${id}()\\` is not declared in this query; your functions library has it`\n : `Unknown function \\`${id}()\\``,\n ...at,\n libraryFunction,\n },\n ]\n }\n\n const findings: FunctionFinding[] = []\n if (doc.args && (call.argCount < doc.args.min || call.argCount > doc.args.max)) {\n findings.push({\n rule: 'arity',\n severity: 'error',\n message: `\\`${id}()\\` ${describeArity(doc.args)}, not ${call.argCount}`,\n ...at,\n })\n }\n if (doc.deltaOnly) {\n findings.push({\n rule: 'delta-only',\n severity: 'warning',\n message: `\\`${id}()\\` only works in delta mode, where webhooks and Sanity Functions run their filters`,\n ...at,\n })\n }\n if (doc.pipe && !call.piped) {\n findings.push({\n rule: 'pipe',\n severity: 'warning',\n message: `\\`${id}()\\` is a pipe function: call it after \\`|\\`, like \\`* | ${id}(…)\\``,\n ...at,\n })\n }\n if (doc.scoreOnly && !isInsideScore(call.node, query)) {\n findings.push({\n rule: 'score-only',\n severity: 'warning',\n message: `\\`${id}()\\` only works inside \\`score()\\``,\n ...at,\n })\n }\n return findings\n}\n\n/**\n * The documented limits of custom functions, which the API's parser checks but `groq-lint`\n * does not (one parameter, the four body forms, the parameter used once, no `^` out of the body,\n * no recursion), and mistakes in calls: unknown functions, argument counts, delta-only and pipe\n * functions out of place. Unknown functions are warnings, since the API may know newer ones.\n */\nexport function checkFunctions(\n tree: GroqTree,\n query: string,\n library: readonly VistaSavedFunction[] = [],\n): FunctionFinding[] {\n const {declarations, calls} = readQueryFunctions(tree, query)\n const findings: FunctionFinding[] = []\n const declared = new Map<string, FunctionDeclaration>()\n for (const declaration of declarations) {\n if (declaration.namespace === undefined) {\n findings.push({\n rule: 'namespace',\n severity: 'error',\n message: `Custom functions need a namespace of their own: \\`fn my::${declaration.name}(…)\\``,\n ...declaration.nameRange,\n })\n }\n const earlier = declared.get(declaration.id)\n if (earlier) {\n findings.push({\n rule: 'duplicate',\n severity: 'warning',\n message: `\\`${declaration.id}\\` is declared more than once; only one of the declarations takes effect`,\n ...declaration.nameRange,\n })\n } else {\n declared.set(declaration.id, declaration)\n }\n if (\n declaration.namespace !== undefined &&\n findGroqFunction(declaration.namespace, declaration.name)\n ) {\n findings.push({\n rule: 'shadows-builtin',\n severity: 'warning',\n message: `This declaration hides the built-in \\`${declaration.id}()\\``,\n ...declaration.nameRange,\n })\n }\n if (declaration.parameters.length !== 1) {\n findings.push({\n rule: 'parameters',\n severity: 'error',\n message: 'A custom function takes exactly one parameter: `fn ns::name($param) = …`',\n ...declaration.nameRange,\n })\n }\n findings.push(...checkBody(declaration, query))\n }\n findings.push(...checkRecursion(declarations, calls, declared))\n for (const call of calls) {\n findings.push(...checkCall(call, declared, library, query))\n }\n return findings.toSorted((a, b) => a.from - b.from || a.to - b.to)\n}\n\n/**\n * A clearer message for a parse failure in a declaration than the parser's (\"expected '::'\n * followed by a function name\", \"expected ')' following function arguments\"), when the\n * declaration lacks a namespace or has other than one parameter\n */\nexport function explainDeclarationSyntaxError(\n tree: GroqTree,\n query: string,\n position: number,\n): string | undefined {\n for (let node: GroqNode | null = tree.resolveInner(position, -1); node; node = node.parent) {\n if (node.name !== 'FunctionDef') continue\n const declaration = readDeclaration(node, query)\n if (!declaration) return undefined\n if (declaration.namespace === undefined) {\n return `Custom functions need a namespace of their own: \\`fn my::${declaration.name}(…)\\``\n }\n if (declaration.parameters.length !== 1) {\n return 'A custom function takes exactly one parameter: `fn ns::name($param) = …`'\n }\n return undefined\n }\n return undefined\n}\n\n/**\n * Where a declaration goes: after the last one, or at the start of the query with a blank line\n * before the query, the way `groq-format` lays declarations out\n */\nexport function declarationInsertion(\n query: string,\n declaration: string,\n): {from: number; to: number; insert: string} {\n const top = parseGroq(query).topNode\n let end = -1\n for (const child of children(top)) {\n if (child.name === 'FunctionDef') {\n const after = nextSibling(child)\n end = after?.name === ';' ? after.to : child.to\n }\n }\n return end === -1\n ? {from: 0, to: 0, insert: `${declaration};\\n\\n`}\n : {from: end, to: end, insert: `\\n${declaration};`}\n}\n\nexport interface FunctionExtraction {\n id: string\n declaration: string\n /** The expression that becomes the function, as written */\n expression: string\n /** In positions of the query before any of them is made */\n changes: {from: number; to: number; insert: string}[]\n /** Where the call is once the changes are made */\n call: TextRange\n}\n\n/** The selection without the whitespace and a separating comma at either end */\nfunction trimSelection(query: string, selection: TextRange): TextRange | null {\n let {from, to} = selection\n const trimWhitespace = () => {\n while (from < to && /\\s/.test(query[from])) from++\n while (to > from && /\\s/.test(query[to - 1])) to--\n }\n trimWhitespace()\n if (query[to - 1] === ',') to--\n if (query[from] === ',') from++\n trimWhitespace()\n return from < to ? {from, to} : null\n}\n\n/** The postfix chain `node` is part of (`author`, `->`, `{name}`), when it is in one */\nfunction chainOf(node: GroqNode): {first: GroqNode; last: GroqNode} | null {\n if (!PRIMARY_NODES.has(node.name) && !POSTFIX_NODES.has(node.name)) return null\n let first = node\n while (POSTFIX_NODES.has(first.name)) {\n const previous = previousSibling(first)\n if (!previous || (!PRIMARY_NODES.has(previous.name) && !POSTFIX_NODES.has(previous.name))) {\n return null\n }\n first = previous\n }\n let last = node\n for (\n let next = nextSibling(last);\n next && POSTFIX_NODES.has(next.name);\n next = nextSibling(last)\n ) {\n last = next\n }\n return {first, last}\n}\n\n/**\n * The expressions around a position that end in a projection, innermost first: `author->{name}`\n * for a cursor anywhere in it, a whole `\"key\": value` pair. The query's top-level expression is\n * left out, since turning all of it into a function is a choice to make with a selection.\n */\nfunction projectionsAround(tree: GroqTree, pos: number): TextRange[] {\n const ranges = new Map<string, TextRange>()\n for (const side of [-1, 1] as const) {\n for (\n let node: GroqNode | null = tree.resolveInner(pos, side);\n node?.parent;\n node = node.parent\n ) {\n if (node.parent.name === 'Query') break\n const chain = node.name === 'PropertyPair' ? null : chainOf(node)\n const range =\n node.name === 'PropertyPair'\n ? {from: node.from, to: node.to}\n : chain?.last.name === 'Projection'\n ? {from: chain.first.from, to: chain.last.to}\n : null\n if (range) ranges.set(`${range.from}:${range.to}`, range)\n }\n }\n return [...ranges.values()].toSorted((a, b) => a.to - a.from - (b.to - b.from))\n}\n\n/** The sibling nodes that make up exactly `from`–`to`, with their parent */\nfunction selectedNodes(\n tree: GroqTree,\n from: number,\n to: number,\n): {parent: GroqNode; nodes: GroqNode[]} | null {\n let parent: GroqNode | null = tree.resolveInner(from, 1)\n while (parent && (parent.from > from || parent.to < to)) parent = parent.parent\n // The innermost node that covers the selection holds the run, unless the run is that node\n while (parent && parent.from === from && parent.to === to && parent.parent) {\n parent = parent.parent\n }\n if (!parent) return null\n const nodes: GroqNode[] = []\n for (const child of children(parent)) {\n if (child.to <= from || child.from >= to) continue\n if (child.from < from || child.to > to) return null\n nodes.push(child)\n }\n if (nodes.length === 0 || nodes[0].from !== from || nodes[nodes.length - 1].to !== to) return null\n return {parent, nodes}\n}\n\nfunction isIdentifier(text: string): boolean {\n return /^[A-Za-z_]\\w*$/.test(text)\n}\n\nfunction dedent(text: string): string {\n const lines = text.split('\\n')\n const indents = lines\n .slice(1)\n .filter((line) => line.trim())\n .map((line) => /^\\s*/.exec(line)?.[0].length ?? 0)\n const indent = indents.length > 0 ? Math.min(...indents) : 0\n return [\n lines[0],\n ...lines.slice(1).map((line) => line.slice(Math.min(indent, line.length))),\n ].join('\\n')\n}\n\nfunction uniqueName(base: string, taken: (candidate: string) => boolean): string {\n if (!taken(base)) return base\n for (let suffix = 2; ; suffix++) {\n if (!taken(`${base}${suffix}`)) return `${base}${suffix}`\n }\n}\n\n/** The namespace most of the query's declarations use, else the library's, else `my` */\nfunction pickNamespace(\n declarations: FunctionDeclaration[],\n library: readonly VistaSavedFunction[],\n): string {\n const counts = new Map<string, number>()\n for (const declaration of declarations) {\n if (declaration.namespace) {\n counts.set(declaration.namespace, (counts.get(declaration.namespace) ?? 0) + 1)\n }\n }\n let best: string | undefined\n for (const [namespace, count] of counts) {\n if (best === undefined || count > (counts.get(best) ?? 0)) best = namespace\n }\n return best ?? library[0]?.id.split('::')[0] ?? DEFAULT_NAMESPACE\n}\n\n/**\n * Turns an expression into a custom function: a projection of something, `author->{name}`,\n * `authors[]->{name}` or `items[]{title}`, becomes a declaration at the top\n * (`fn my::author($author) = $author->{name};`) and a call where it was (`my::author(author)`,\n * keyed like the attribute was when it is a bare entry of a projection). The expression is the\n * selection, or with nothing selected the innermost projection around the cursor. `null` when\n * there is no such expression, or its projection reaches outside itself with `^`.\n */\nexport function extractFunction(\n query: string,\n selection: TextRange,\n library: readonly VistaSavedFunction[] = [],\n): FunctionExtraction | null {\n if (query.length > MAX_EXTRACT_QUERY_LENGTH) return null\n const tree = parseGroq(query)\n if (hasSyntaxErrors(tree)) return null\n if (selection.from === selection.to) {\n for (const range of projectionsAround(tree, selection.from)) {\n const extraction = extractRange(tree, query, range, library)\n if (extraction) return extraction\n }\n return null\n }\n const range = trimSelection(query, selection)\n return range ? extractRange(tree, query, range, library) : null\n}\n\nfunction extractRange(\n tree: GroqTree,\n query: string,\n range: TextRange,\n library: readonly VistaSavedFunction[],\n): FunctionExtraction | null {\n let {from} = range\n const {to} = range\n const selected = selectedNodes(tree, from, to)\n if (!selected) return null\n let {parent, nodes} = selected\n for (let node: GroqNode | null = parent; node; node = node.parent) {\n if (node.name === 'FunctionDef') return null\n }\n // A whole `\"author\": author->{name}` keeps its key; its value is what becomes the function\n if (nodes.length === 1 && nodes[0].name === 'PropertyPair') {\n const pair = nodes[0]\n const pairChildren = children(pair)\n const colon = pairChildren.findIndex((child) => child.name === ':')\n nodes = pairChildren.slice(colon + 1)\n parent = pair\n if (colon === -1 || nodes.length === 0) return null\n from = nodes[0].from\n }\n\n const last = nodes.length - 1\n if (nodes[last].name !== 'Projection') return null\n let suffixStart = last\n if (nodes[suffixStart - 1]?.name === 'Dereference') suffixStart--\n if (nodes[suffixStart - 1]?.name === 'ArrayTraversal') suffixStart--\n if (suffixStart === 0) return null\n // The argument is one postfix chain (`a + author->{…}` projects `author` alone), and the\n // chain ends with the selection: `authors[]->{name}[0]` indexes every projected author\n const argumentNodes = nodes.slice(0, suffixStart)\n if (\n !PRIMARY_NODES.has(argumentNodes[0].name) ||\n argumentNodes.slice(1).some((node) => !POSTFIX_NODES.has(node.name))\n ) {\n return null\n }\n const following = nextSibling(nodes[last])\n if (following && POSTFIX_NODES.has(following.name)) return null\n\n const argument = query.slice(from, argumentNodes[argumentNodes.length - 1].to)\n const lastArgumentNode = argumentNodes[argumentNodes.length - 1]\n const attributeNode =\n lastArgumentNode.name === 'DotAccess' || lastArgumentNode.name === 'DerefAccess'\n ? lastArgumentNode.getChild('Identifier')\n : argumentNodes.length === 1 && lastArgumentNode.name === 'Identifier'\n ? lastArgumentNode\n : null\n const attribute = attributeNode ? textOf(query, attributeNode) : undefined\n const before = previousSibling(nodes[0])\n const isBareEntry =\n (parent.name === 'Projection' || parent.name === 'ObjectLiteral') &&\n (before?.name === '{' || before?.name === ',') &&\n (following === null || following.name === ',' || following.name === '}')\n\n const {declarations} = readQueryFunctions(tree, query)\n const namespace = pickNamespace(declarations, library)\n const takenIds = new Set([\n ...declarations.map((declaration) => declaration.id),\n ...library.map((saved) => saved.id),\n ...GROQ_FUNCTIONS.map((doc) => functionId(doc)),\n ])\n const baseName = attribute && isIdentifier(attribute) ? attribute : 'projection'\n const name = uniqueName(baseName, (candidate) => takenIds.has(`${namespace}::${candidate}`))\n const id = `${namespace}::${name}`\n const suffix = dedent(query.slice(nodes[suffixStart].from, to))\n const parameter = `$${uniqueName(\n attribute && isIdentifier(attribute) ? attribute : 'value',\n (candidate) => new RegExp(`\\\\$${candidate}(?!\\\\w)`).test(suffix),\n )}`\n const declaration = `fn ${id}(${parameter}) = ${parameter}${suffix}`\n const key = isBareEntry ? `\"${attribute ?? name}\": ` : ''\n const callText = `${key}${id}(${argument})`\n\n const insertion = declarationInsertion(query, declaration)\n // Selecting from the very start of a query without declarations: the declaration goes first\n const changes =\n insertion.from === from\n ? [{from, to, insert: insertion.insert + callText}]\n : [insertion, {from, to, insert: callText}]\n const callFrom = from + insertion.insert.length\n const candidate =\n query.slice(0, insertion.from) +\n insertion.insert +\n query.slice(insertion.to, from) +\n callText +\n query.slice(to)\n\n // The projection must work as a function body: no `^` out of it, no parameter clash\n const candidateTree = parseGroq(candidate)\n if (hasSyntaxErrors(candidateTree)) return null\n const declarationFrom = insertion.from + (insertion.insert.startsWith('\\n') ? 1 : 0)\n const declarationTo = declarationFrom + declaration.length\n const broken = checkFunctions(candidateTree, candidate, library).some(\n (finding) =>\n finding.severity === 'error' &&\n finding.from >= declarationFrom &&\n finding.to <= declarationTo,\n )\n if (broken) return null\n\n return {\n id,\n declaration,\n expression: query.slice(from, to),\n changes,\n call: {from: callFrom, to: callFrom + callText.length},\n }\n}\n","import {type Schema, type SchemaType} from 'sanity'\n\nfunction isDocumentType(type: SchemaType | undefined): boolean {\n for (let current = type; current; current = current.type) {\n if (current.name === 'document') return true\n }\n return false\n}\n\n/** The workspace's document types, its own first and the `sanity.`/`system.` ones after */\nexport function getDocumentTypeNames(schema: Schema): string[] {\n return schema\n .getTypeNames()\n .filter((name) => name !== 'document' && isDocumentType(schema.get(name)))\n .toSorted((a, b) => Number(a.includes('.')) - Number(b.includes('.')) || a.localeCompare(b))\n}\n","import {type Schema, type SchemaType} from 'sanity'\n\nimport {getDocumentTypeNames} from './documentTypes'\nimport {type GroqNode, type GroqTree, hasSyntaxErrors, textOf} from './groqFunctions'\n\n/**\n * Checks a query against the workspace schema: the document types its `_type` filters name, and\n * the fields it reads from them, through references (`->`), arrays (`[]`) and nested objects,\n * in filters, projections and `order()`. Only what is certain is flagged: a scope whose types\n * the query does not pin down (`*` without a `_type` filter, a parameter, a function's result)\n * is not checked, since documents can hold fields their schema does not declare.\n */\n\n/** What a query's schema checks need: the workspace's document types */\nexport interface QuerySchema {\n documents: ReadonlyMap<string, SchemaType>\n}\n\nexport function createQuerySchema(schema: Schema): QuerySchema {\n const documents = new Map<string, SchemaType>()\n for (const name of getDocumentTypeNames(schema)) {\n const type = schema.get(name)\n if (type) documents.set(name, type)\n }\n return {documents}\n}\n\nexport type SchemaFindingRule = 'unknown-type' | 'unknown-field' | 'not-a-reference'\n\nexport interface SchemaFinding {\n rule: SchemaFindingRule\n from: number\n to: number\n message: string\n /** The name that was probably meant, written in place of the range */\n suggestion?: {text: string; from: number; to: number}\n}\n\n/** The shape of a value as the schema knows it */\ntype Shape =\n | {kind: 'unknown'}\n /** A string, number or boolean of this schema type */\n | {kind: 'value'; type: string}\n /**\n * An object of one of these types; documents are objects too. `label` names an inline object\n * type, which the compiled schema just calls `object`, by the field that holds it.\n */\n | {kind: 'object'; types: readonly SchemaType[]; label?: string}\n /** A document whose type the query has not pinned down */\n | {kind: 'documents'}\n /** A reference to a document of one of these types */\n | {kind: 'reference'; types: readonly SchemaType[]}\n | {kind: 'array'; of: Shape}\n\nconst UNKNOWN: Shape = {kind: 'unknown'}\n\n/** Every document and object has these, whatever its schema declares */\nconst SYSTEM_FIELDS = new Set([\n '_id',\n '_type',\n '_rev',\n '_createdAt',\n '_updatedAt',\n '_originalId',\n '_system',\n '_key',\n '_score',\n])\nconst REFERENCE_FIELDS = new Set([\n '_ref',\n '_type',\n '_key',\n '_weak',\n '_strengthenOnPublish',\n '_dataset',\n '_projectId',\n])\n\nconst POSTFIX = new Set([\n 'ArrayTraversal',\n 'Filter',\n 'Projection',\n 'DotAccess',\n 'ParentAccess',\n 'SelectorAccess',\n 'Dereference',\n 'DerefAccess',\n])\nconst PRIMARY = new Set([\n 'Everything',\n 'This',\n 'Parent',\n 'Parameter',\n 'String',\n 'Number',\n 'True',\n 'False',\n 'Null',\n 'NamespacedCall',\n 'FunctionCall',\n 'Identifier',\n 'ArrayLiteral',\n 'ObjectLiteral',\n 'ParenExpression',\n])\nconst BRACKETS = new Set(['[', ']', '{', '}', '(', ')'])\n\nfunction childrenOf(node: GroqNode): GroqNode[] {\n const nodes: GroqNode[] = []\n for (let child = node.firstChild; child; child = child.nextSibling) nodes.push(child)\n return nodes\n}\n\n/** The children between a node's brackets */\nfunction innerOf(node: GroqNode): GroqNode[] {\n return childrenOf(node).filter((child) => !BRACKETS.has(child.name))\n}\n\nfunction splitBy(nodes: GroqNode[], name: string): GroqNode[][] {\n const parts: GroqNode[][] = [[]]\n for (const node of nodes) {\n if (node.name === name) parts.push([])\n else parts[parts.length - 1].push(node)\n }\n return parts\n}\n\nfunction chainName(type: SchemaType): string[] {\n const names: string[] = []\n for (let current: SchemaType | undefined = type; current; current = current.type) {\n names.push(current.name)\n }\n return names\n}\n\nfunction fieldsOf(type: SchemaType): {name: string; type: SchemaType}[] {\n try {\n return 'fields' in type && Array.isArray(type.fields) ? type.fields : []\n } catch {\n return []\n }\n}\n\n/**\n * The compiled schema resolves member and field types when they are first read, and throws for\n * a type it does not know; such a value is not checked, rather than failing the whole lint\n */\nfunction shapeOf(read: () => SchemaType): Shape {\n try {\n const type = read()\n const names = chainName(type)\n if (names.includes('crossDatasetReference') || names.includes('globalDocumentReference')) {\n return UNKNOWN\n }\n if (names.includes('reference') && 'to' in type && Array.isArray(type.to)) {\n return {kind: 'reference', types: type.to}\n }\n if (type.jsonType === 'array') {\n const members = 'of' in type && Array.isArray(type.of) ? type.of : []\n return {kind: 'array', of: union(members.map((member) => shapeOf(() => member)))}\n }\n if (type.jsonType === 'object') {\n return fieldsOf(type).length > 0 ? {kind: 'object', types: [type]} : UNKNOWN\n }\n return {kind: 'value', type: type.name}\n } catch {\n return UNKNOWN\n }\n}\n\nfunction unique(types: readonly SchemaType[]): SchemaType[] {\n return [...new Set(types)]\n}\n\n/** One shape for values that have any of these; `unknown` when they do not agree */\nfunction union(shapes: Shape[]): Shape {\n const [first] = shapes\n if (!first) return UNKNOWN\n if (shapes.every((shape) => shape.kind === 'object')) {\n return {kind: 'object', types: unique(shapes.flatMap((shape) => shape.types))}\n }\n if (shapes.every((shape) => shape.kind === 'reference')) {\n return {kind: 'reference', types: unique(shapes.flatMap((shape) => shape.types))}\n }\n if (shapes.every((shape) => shape.kind === 'array')) {\n return {kind: 'array', of: union(shapes.map((shape) => shape.of))}\n }\n if (shapes.every((shape) => shape.kind === 'value')) return first\n return UNKNOWN\n}\n\n/**\n * Edit distance with two swapped letters counting as one edit (`nmae` is one from `name`), to\n * suggest the name that was probably meant\n */\nfunction distance(a: string, b: string): number {\n const rows = Array.from({length: a.length + 1}, (_, i) =>\n Array.from({length: b.length + 1}, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n )\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n rows[i][j] = Math.min(rows[i - 1][j] + 1, rows[i][j - 1] + 1, rows[i - 1][j - 1] + cost)\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n rows[i][j] = Math.min(rows[i][j], rows[i - 2][j - 2] + 1)\n }\n }\n }\n return rows[a.length][b.length]\n}\n\nfunction closest(name: string, candidates: Iterable<string>): string | undefined {\n let best: string | undefined\n let bestDistance = Math.max(1, Math.floor(name.length / 3)) + 1\n const lower = name.toLowerCase()\n for (const candidate of candidates) {\n const score = candidate.toLowerCase() === lower ? 0 : distance(name, candidate)\n if (score < bestDistance) {\n best = candidate\n bestDistance = score\n }\n }\n return best\n}\n\nfunction quoteList(names: string[]): string {\n const quoted = names.map((name) => `\\`${name}\\``)\n return quoted.length > 1\n ? `${quoted.slice(0, -1).join(', ')} or ${quoted[quoted.length - 1]}`\n : (quoted[0] ?? '')\n}\n\nfunction stringValue(node: GroqNode, query: string): string | undefined {\n if (node.name !== 'String') return undefined\n const text = textOf(query, node)\n if (text.startsWith('\"')) {\n try {\n const value: unknown = JSON.parse(text)\n return typeof value === 'string' ? value : undefined\n } catch {\n return undefined\n }\n }\n return text.slice(1, -1)\n}\n\ninterface Context {\n query: string\n schema: QuerySchema\n findings: SchemaFinding[]\n /** The scopes `^` reaches, innermost last */\n parents: Shape[]\n}\n\n/**\n * The document types a filter's condition pins `_type` to (`_type == \"post\"`,\n * `_type in [\"post\", \"page\"]`, joined with `&&` and `||`, in parentheses), with the string node\n * of each name; `null` when it does not pin them\n */\nfunction typeConstraint(nodes: GroqNode[], query: string): {name: string; node: GroqNode}[] | null {\n const disjuncts = splitBy(nodes, 'Or').map((disjunct) => {\n let constraint: {name: string; node: GroqNode}[] | null = null\n for (const conjunct of splitBy(disjunct, 'And')) {\n const names = conjunctConstraint(conjunct, query)\n if (names === null) continue\n constraint =\n constraint === null\n ? names\n : constraint.filter((entry) => names.some((name) => name.name === entry.name))\n }\n return constraint\n })\n if (disjuncts.some((disjunct) => disjunct === null)) return null\n return disjuncts.flatMap((disjunct) => disjunct ?? [])\n}\n\nfunction conjunctConstraint(\n nodes: GroqNode[],\n query: string,\n): {name: string; node: GroqNode}[] | null {\n if (nodes.length === 1 && nodes[0].name === 'ParenExpression') {\n return typeConstraint(innerOf(nodes[0]), query)\n }\n if (nodes.length !== 3) return null\n const [left, operator, right] = nodes\n const isType = (node: GroqNode) => node.name === 'Identifier' && textOf(query, node) === '_type'\n if (operator.name === 'EqualityOp' && textOf(query, operator) === '==') {\n const string = isType(left) ? right : isType(right) ? left : undefined\n const name = string ? stringValue(string, query) : undefined\n return string && name !== undefined ? [{name, node: string}] : null\n }\n if (operator.name === 'In' && isType(left) && right.name === 'ArrayLiteral') {\n const items = innerOf(right).filter((item) => item.name !== ',')\n const names = items.map((item) => ({name: stringValue(item, query), node: item}))\n return names.every((entry) => entry.name !== undefined)\n ? names.map((entry) => ({name: entry.name ?? '', node: entry.node}))\n : null\n }\n return null\n}\n\n/** The scope narrowed by a condition on `_type`, reporting type names nothing in it has */\nfunction narrow(scope: Shape, condition: GroqNode[], context: Context): Shape {\n const constraint = typeConstraint(condition, context.query)\n if (!constraint) return scope\n const {documents} = context.schema\n if (scope.kind === 'documents') {\n const types: SchemaType[] = []\n for (const {name, node} of constraint) {\n const type = documents.get(name)\n if (type) {\n types.push(type)\n continue\n }\n const suggestion = closest(name, documents.keys())\n context.findings.push({\n rule: 'unknown-type',\n from: node.from,\n to: node.to,\n message: `The schema has no document type named \\`${name}\\`.${suggestion ? ` Did you mean \\`${suggestion}\\`?` : ''}`,\n ...(suggestion\n ? {suggestion: {text: JSON.stringify(suggestion), from: node.from, to: node.to}}\n : {}),\n })\n }\n return types.length > 0 ? {kind: 'object', types: unique(types)} : UNKNOWN\n }\n if (scope.kind === 'object') {\n const names = new Set(constraint.map((entry) => entry.name))\n const types = scope.types.filter((type) => names.has(type.name))\n for (const {name, node} of constraint) {\n if (scope.types.some((type) => type.name === name) || documents.has(name)) continue\n const suggestion = closest(\n name,\n scope.types.map((type) => type.name),\n )\n context.findings.push({\n rule: 'unknown-type',\n from: node.from,\n to: node.to,\n message: `Nothing here is of type \\`${name}\\`: it is ${quoteList(typeNames(scope))}.${suggestion ? ` Did you mean \\`${suggestion}\\`?` : ''}`,\n ...(suggestion\n ? {suggestion: {text: JSON.stringify(suggestion), from: node.from, to: node.to}}\n : {}),\n })\n }\n return types.length > 0 ? {kind: 'object', types} : scope\n }\n return scope\n}\n\nfunction describeValue(shape: Shape): string {\n return shape.kind === 'value' ? `a ${shape.type}` : 'not an object'\n}\n\n/** The names of an object's possible types, an inline one by the field that holds it */\nfunction typeNames(shape: Extract<Shape, {kind: 'object'}>): string[] {\n return [\n ...new Set(\n shape.types.map((type) => (type.name === 'object' ? (shape.label ?? type.name) : type.name)),\n ),\n ]\n}\n\n/** The shape with inline objects in it named by `label` */\nfunction labelled(shape: Shape, label: string): Shape {\n if (shape.kind === 'object') return {...shape, label}\n if (shape.kind === 'array') return {kind: 'array', of: labelled(shape.of, label)}\n return shape\n}\n\n/** What a postfix step applies to: the chain's text so far, and the `.` of a dot access */\ninterface Holder {\n text: string\n dot?: GroqNode\n}\n\n/** The shape of field `name` of a value, reporting a field the value cannot have */\nfunction field(shape: Shape, nameNode: GroqNode, context: Context, holder?: Holder): Shape {\n const name = textOf(context.query, nameNode)\n switch (shape.kind) {\n case 'unknown':\n case 'documents':\n return UNKNOWN\n case 'array':\n return {kind: 'array', of: field(shape.of, nameNode, context, holder)}\n case 'object': {\n if (SYSTEM_FIELDS.has(name)) return {kind: 'value', type: 'string'}\n const matches = shape.types.flatMap((type) =>\n fieldsOf(type)\n .filter((candidate) => candidate.name === name)\n .map((candidate) => shapeOf(() => candidate.type)),\n )\n if (matches.length > 0) return labelled(union(matches), name)\n const fieldNames = new Set(shape.types.flatMap((type) => fieldsOf(type).map((f) => f.name)))\n const suggestion = closest(name, fieldNames)\n context.findings.push({\n rule: 'unknown-field',\n from: nameNode.from,\n to: nameNode.to,\n message: `\\`${name}\\` is not a field of ${quoteList(typeNames(shape))}.${suggestion ? ` Did you mean \\`${suggestion}\\`?` : ''}`,\n ...(suggestion\n ? {suggestion: {text: suggestion, from: nameNode.from, to: nameNode.to}}\n : {}),\n })\n return UNKNOWN\n }\n case 'reference': {\n if (REFERENCE_FIELDS.has(name)) return {kind: 'value', type: 'string'}\n const holderText = holder?.text ?? 'the reference'\n const {dot} = holder ?? {}\n context.findings.push({\n rule: 'not-a-reference',\n from: nameNode.from,\n to: nameNode.to,\n message: `\\`${holderText}\\` is a reference, which holds no \\`${name}\\`: follow it with \\`${holderText}->${name}\\`.`,\n ...(dot ? {suggestion: {text: '->', from: dot.from, to: dot.to}} : {}),\n })\n return UNKNOWN\n }\n case 'value':\n context.findings.push({\n rule: 'unknown-field',\n from: nameNode.from,\n to: nameNode.to,\n message: `\\`${holder?.text ?? 'This'}\\` is ${describeValue(shape)}, which has no \\`${name}\\`.`,\n })\n return UNKNOWN\n default: {\n const unhandled: never = shape\n return unhandled\n }\n }\n}\n\nfunction dereference(shape: Shape, node: GroqNode, context: Context, holder?: Holder): Shape {\n switch (shape.kind) {\n case 'reference':\n return shape.types.length > 0 ? {kind: 'object', types: shape.types} : {kind: 'documents'}\n case 'array':\n return {kind: 'array', of: dereference(shape.of, node, context, holder)}\n case 'object':\n case 'value': {\n // The `->` itself, which a dereference with an attribute (`->name`) starts with\n const arrow = node.getChild('Deref') ?? node\n context.findings.push({\n rule: 'not-a-reference',\n from: arrow.from,\n to: arrow.to,\n message: `\\`${holder?.text ?? 'This'}\\` is not a reference, so \\`->\\` gives null.`,\n })\n return UNKNOWN\n }\n default:\n return UNKNOWN\n }\n}\n\nfunction itemOf(shape: Shape): Shape {\n return shape.kind === 'array' ? shape.of : shape\n}\n\n/** `[0]`, `[2...5]` or `[$start..$end]`: picks items rather than filtering them */\nfunction isSlice(inner: GroqNode[]): boolean {\n return inner.every((node) =>\n ['Number', 'Parameter', 'Ellipsis', '..', 'Range', '-', 'Minus'].includes(node.name),\n )\n}\n\n/**\n * A filter reads each item of `shape`; `outer` is the scope the filter is written in, which is\n * what `^` reaches inside it\n */\nfunction applyFilter(shape: Shape, filter: GroqNode, outer: Shape, context: Context): Shape {\n const inner = innerOf(filter)\n if (isSlice(inner)) {\n const isIndex = inner.length === 1 || (inner.length === 2 && inner[0].name !== 'Number')\n return isIndex ? itemOf(shape) : shape\n }\n const scope = narrow(itemOf(shape), inner, context)\n evaluate(inner, scope, {...context, parents: [...context.parents, outer]})\n return shape.kind === 'array' ? {kind: 'array', of: scope} : scope\n}\n\nfunction applyProjection(\n shape: Shape,\n projection: GroqNode,\n outer: Shape,\n context: Context,\n): Shape {\n evaluateEntries(innerOf(projection), itemOf(shape), {\n ...context,\n parents: [...context.parents, outer],\n })\n return shape.kind === 'array' ? {kind: 'array', of: UNKNOWN} : UNKNOWN\n}\n\n/** The entries of a projection or object literal, each in the scope it reads from */\nfunction evaluateEntries(nodes: GroqNode[], scope: Shape, context: Context): void {\n for (const entry of splitBy(nodes, ',')) {\n if (entry.length === 0) continue\n const arrow = entry.findIndex((node) => node.name === 'Arrow')\n if (arrow !== -1) {\n const condition = entry.slice(0, arrow)\n evaluate(condition, scope, context)\n const narrowed = narrow(scope, condition, context)\n const value = entry.slice(arrow + 1)\n if (value.length === 1 && value[0].name === 'ObjectLiteral') {\n evaluateEntries(innerOf(value[0]), narrowed, context)\n } else {\n evaluate(value, narrowed, context)\n }\n continue\n }\n if (entry[0].name === 'PropertyPair') {\n const pair = childrenOf(entry[0])\n const colon = pair.findIndex((node) => node.name === ':')\n evaluate(pair.slice(colon + 1), scope, context)\n continue\n }\n if (entry[0].name === 'Spread') {\n evaluate(entry.slice(1), scope, context)\n continue\n }\n evaluate(entry, scope, context)\n }\n}\n\n/** A function's arguments, each read in the scope of the call */\nfunction evaluateArguments(call: GroqNode, scope: Shape, context: Context): void {\n const args = innerOf(call).filter((node) => node.name !== 'FunctionName')\n for (const arg of splitBy(args, ',')) evaluate(arg, scope, context)\n}\n\n/** A primary node followed by its postfix chain: `author->{name}`, `*[_type == \"post\"]` */\nfunction evaluateChain(nodes: GroqNode[], scope: Shape, context: Context): Shape {\n const [head, ...rest] = nodes\n let shape: Shape\n switch (head.name) {\n case 'Everything':\n shape = {kind: 'array', of: {kind: 'documents'}}\n break\n case 'Identifier':\n shape = field(scope, head, context)\n break\n case 'This':\n shape = scope\n break\n case 'Parent':\n shape = context.parents.at(-1) ?? UNKNOWN\n break\n case 'String':\n shape = {kind: 'value', type: 'string'}\n break\n case 'Number':\n shape = {kind: 'value', type: 'number'}\n break\n case 'True':\n case 'False':\n shape = {kind: 'value', type: 'boolean'}\n break\n case 'FunctionCall':\n case 'NamespacedCall':\n evaluateArguments(head, scope, context)\n shape = UNKNOWN\n break\n case 'ArrayLiteral':\n for (const item of splitBy(innerOf(head), ',')) evaluate(item, scope, context)\n shape = UNKNOWN\n break\n case 'ObjectLiteral':\n evaluateEntries(innerOf(head), scope, context)\n shape = UNKNOWN\n break\n case 'ParenExpression':\n shape = evaluate(innerOf(head), scope, context)\n break\n default:\n shape = UNKNOWN\n }\n\n let previous: GroqNode = head\n // The chain so far, which the next step applies to\n const holder = (dot?: GroqNode): Holder => ({\n text: context.query.slice(head.from, previous.to),\n dot,\n })\n for (const node of rest) {\n switch (node.name) {\n case 'DotAccess': {\n const name = node.getChild('Identifier')\n shape = name ? field(shape, name, context, holder(node.firstChild ?? undefined)) : UNKNOWN\n break\n }\n case 'Dereference':\n shape = dereference(shape, node, context, holder())\n break\n case 'DerefAccess': {\n shape = dereference(shape, node, context, holder())\n const name = node.getChild('Identifier')\n shape = name ? field(shape, name, context) : UNKNOWN\n break\n }\n case 'ArrayTraversal':\n if (shape.kind !== 'array') shape = UNKNOWN\n break\n case 'Filter':\n shape = applyFilter(shape, node, scope, context)\n break\n case 'Projection':\n shape = applyProjection(shape, node, scope, context)\n break\n default:\n shape = UNKNOWN\n }\n previous = node\n }\n return shape\n}\n\n/**\n * An expression as the editor's grammar gives it, a flat run of chains and operators: checks\n * every chain, and returns the shape of one that stands alone. A pipe hands the shape before it\n * to `order()` and `score()`, whose arguments read its items.\n */\nfunction evaluate(nodes: GroqNode[], scope: Shape, context: Context): Shape {\n const shapes: Shape[] = []\n let chain: GroqNode[] = []\n let piped: Shape | undefined\n const close = () => {\n if (chain.length === 0) return\n const [head, ...rest] = chain\n if (piped && (head.name === 'FunctionCall' || head.name === 'NamespacedCall')) {\n // `| order(…)` and `| score(…)` read each item and leave the items as they were\n evaluateArguments(head, itemOf(piped), {...context, parents: [...context.parents, scope]})\n let shape: Shape = piped\n for (const node of rest) {\n if (node.name === 'Filter') shape = applyFilter(shape, node, scope, context)\n else if (node.name === 'Projection') shape = applyProjection(shape, node, scope, context)\n else shape = UNKNOWN\n }\n shapes.push(shape)\n } else {\n shapes.push(evaluateChain(chain, scope, context))\n }\n piped = undefined\n chain = []\n }\n for (const node of nodes) {\n if (chain.length > 0 && POSTFIX.has(node.name)) {\n chain.push(node)\n continue\n }\n if (PRIMARY.has(node.name)) {\n close()\n chain = [node]\n continue\n }\n if (node.name === 'Pipe') {\n const before = chain.length > 0 ? evaluateChain(chain, scope, context) : shapes.pop()\n chain = []\n piped = before ?? UNKNOWN\n continue\n }\n close()\n }\n close()\n // A lone chain, piped or not, has a shape; a comparison, arithmetic and the like do not\n const alone = nodes.every(\n (node) => PRIMARY.has(node.name) || POSTFIX.has(node.name) || node.name === 'Pipe',\n )\n return alone && shapes.length === 1 ? shapes[0] : UNKNOWN\n}\n\nexport function checkQuerySchema(\n tree: GroqTree,\n query: string,\n schema: QuerySchema,\n): SchemaFinding[] {\n if (hasSyntaxErrors(tree)) return []\n const context: Context = {query, schema, findings: [], parents: []}\n // Function bodies read their parameter, whose shape the query does not say\n const nodes = childrenOf(tree.topNode).filter(\n (node) => node.name !== 'FunctionDef' && node.name !== ';',\n )\n evaluate(nodes, UNKNOWN, context)\n return context.findings\n}\n","import {\n type Diagnostic,\n forEachDiagnostic,\n linter,\n lintKeymap,\n setDiagnosticsEffect,\n} from '@codemirror/lint'\nimport {type EditorState, type Extension} from '@codemirror/state'\nimport {EditorView, keymap} from '@codemirror/view'\n\nimport {\n functionLibrary,\n type GroqEditorLabels,\n groqEditorLabels,\n querySchema,\n} from './groqEditorContext'\nimport {\n checkFunctions,\n declarationInsertion,\n explainDeclarationSyntaxError,\n type FunctionFinding,\n type GroqTree,\n hasSyntaxErrors,\n parseGroq,\n} from './groqFunctions'\nimport {type GroqFinding, GroqSyntaxError, lintGroq} from './groqWasm'\nimport {checkQuerySchema, type SchemaFinding} from './schemaCheck'\n\n/** Idle time after an edit before the query is linted again */\nconst LINT_DELAY_MS = 500\n\nexport type LintSeverity = Diagnostic['severity']\n\n/** A diagnostic of the query editor, positioned for a list outside the editor */\nexport interface QueryLintFinding {\n from: number\n to: number\n /** 1-based, like the editor's gutter */\n line: number\n /** 1-based column of `from` */\n column: number\n severity: LintSeverity\n message: string\n /** `groq-lint/<rule>`, or `groq` for a query that does not parse */\n source: string | undefined\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\n/**\n * Rule messages quote GROQ in backticks, markdown style: the segments of a message, in order,\n * with the quoted ones marked as code.\n */\nexport function splitMessage(message: string): {text: string; code: boolean}[] {\n return message\n .split('`')\n .map((text, index) => ({text, code: index % 2 === 1}))\n .filter((segment) => segment.text !== '')\n}\n\n/** Renders {@link splitMessage} for the editor's tooltips and lint panel */\nexport function renderMessage(message: string): DocumentFragment {\n const fragment = document.createDocumentFragment()\n for (const segment of splitMessage(message)) {\n if (segment.code) {\n const code = document.createElement('code')\n code.textContent = segment.text\n fragment.append(code)\n } else {\n fragment.append(segment.text)\n }\n }\n return fragment\n}\n\n/** Maps `groq-lint` findings onto the document, dropping any range the wasm reported past its end */\nexport function toDiagnostics(findings: GroqFinding[], docLength: number): Diagnostic[] {\n return findings.map((finding) => {\n const from = clamp(finding.from, 0, docLength)\n return {\n from,\n to: clamp(finding.to, from, docLength),\n severity: finding.severity,\n message: finding.message,\n renderMessage: () => renderMessage(finding.message),\n source: `groq-lint/${finding.ruleId}`,\n }\n })\n}\n\n/** `explanation` replaces the parser's message where it says more about the mistake */\nexport function syntaxErrorDiagnostic(\n error: GroqSyntaxError,\n docLength: number,\n explanation?: string,\n): Diagnostic {\n const from = clamp(error.from, 0, docLength)\n return {\n from,\n to: clamp(error.to, from, docLength),\n severity: 'error',\n message: explanation ?? error.message,\n ...(explanation ? {renderMessage: () => renderMessage(explanation)} : {}),\n source: 'groq',\n }\n}\n\n/**\n * The checks of custom functions and function calls; an unknown function that the library has\n * comes with an action declaring it\n */\nfunction functionDiagnostics(\n findings: FunctionFinding[],\n labels: GroqEditorLabels | undefined,\n): Diagnostic[] {\n return findings.map((finding) => {\n const saved = finding.libraryFunction\n return {\n from: finding.from,\n to: finding.to,\n severity: finding.severity,\n message: finding.message,\n renderMessage: () => renderMessage(finding.message),\n source: `vision/${finding.rule}`,\n ...(saved && labels\n ? {\n actions: [\n {\n name: labels.addFromLibrary,\n apply: (view: EditorView) =>\n view.dispatch({\n changes: declarationInsertion(view.state.doc.toString(), saved.declaration),\n }),\n },\n ],\n }\n : {}),\n }\n })\n}\n\n/**\n * What the schema says about the query's types and fields; a suggested name comes with an action\n * writing it. The suggestion is placed relative to the diagnostic, which edits may have moved.\n */\nfunction schemaDiagnostics(\n findings: SchemaFinding[],\n labels: GroqEditorLabels | undefined,\n): Diagnostic[] {\n return findings.map((finding) => {\n const {suggestion} = finding\n return {\n from: finding.from,\n to: finding.to,\n severity: 'warning',\n message: finding.message,\n renderMessage: () => renderMessage(finding.message),\n source: `vision/${finding.rule}`,\n ...(suggestion && labels\n ? {\n actions: [\n {\n name: labels.useSuggestion(suggestion.text),\n apply: (view: EditorView, from: number) =>\n view.dispatch({\n changes: {\n from: from + suggestion.from - finding.from,\n to: from + suggestion.to - finding.from,\n insert: suggestion.text,\n },\n }),\n },\n ],\n }\n : {}),\n }\n })\n}\n\n/** The checks the editor runs on its own parse: custom functions, and the schema when it has one */\nfunction editorDiagnostics(tree: GroqTree, query: string, state: EditorState): Diagnostic[] {\n const labels = state.facet(groqEditorLabels)\n const schema = state.facet(querySchema)\n return [\n ...functionDiagnostics(checkFunctions(tree, query, state.facet(functionLibrary)), labels),\n ...(schema ? schemaDiagnostics(checkQuerySchema(tree, query, schema), labels) : []),\n ]\n}\n\n/**\n * The lint source for the query editor: a parse failure becomes one error diagnostic on the\n * offending token, otherwise every `groq-lint` finding gets a diagnostic, and so does every\n * problem with the query's custom functions and function calls, and every type or field the\n * workspace schema does not have. When the wasm cannot be loaded, only the editor's own checks\n * run, as long as the query parses for the editor's own grammar.\n */\nexport async function groqLintSource(view: {state: EditorState}): Promise<Diagnostic[]> {\n const {state} = view\n const query = state.doc.toString()\n // CodeMirror lints the initial document too; a blank tab must not load the wasm\n if (!query.trim()) {\n return []\n }\n const tree = parseGroq(query)\n try {\n const findings = await lintGroq(query)\n return [\n ...toDiagnostics(findings, query.length),\n ...editorDiagnostics(tree, query, state),\n ].toSorted((a, b) => a.from - b.from || a.to - b.to)\n } catch (error) {\n if (error instanceof GroqSyntaxError) {\n const explanation = explainDeclarationSyntaxError(tree, query, error.from)\n return [syntaxErrorDiagnostic(error, query.length, explanation)]\n }\n return hasSyntaxErrors(tree) ? [] : editorDiagnostics(tree, query, state)\n }\n}\n\n/** The editor's current diagnostics, at their positions in the current document */\nexport function collectFindings(state: EditorState): QueryLintFinding[] {\n const findings: QueryLintFinding[] = []\n forEachDiagnostic(state, (diagnostic, from, to) => {\n const line = state.doc.lineAt(from)\n findings.push({\n from,\n to,\n line: line.number,\n column: from - line.from + 1,\n severity: diagnostic.severity,\n message: diagnostic.message,\n source: diagnostic.source,\n })\n })\n return findings\n}\n\n/**\n * Underlines problems while typing; F8 jumps between them and Mod-Shift-m lists them inside the\n * editor. `onFindings` receives the diagnostics whenever they are recomputed or move with an\n * edit, for the Lint panel outside the editor.\n */\nexport function createGroqLintExtensions(\n onFindings: (findings: QueryLintFinding[]) => void,\n): Extension[] {\n return [\n linter(groqLintSource, {\n delay: LINT_DELAY_MS,\n // A function saved to the library or removed from it changes what the query's calls know,\n // and another schema what its types and fields are checked against\n needsRefresh: (update) =>\n update.startState.facet(functionLibrary) !== update.state.facet(functionLibrary) ||\n update.startState.facet(querySchema) !== update.state.facet(querySchema),\n }),\n keymap.of(lintKeymap),\n EditorView.updateListener.of((update) => {\n const recomputed = update.transactions.some((transaction) =>\n transaction.effects.some((effect) => effect.is(setDiagnosticsEffect)),\n )\n if (recomputed || update.docChanged) {\n onFindings(collectFindings(update.state))\n }\n }),\n ]\n}\n","import {\n autocompletion,\n type Completion,\n type CompletionContext,\n type CompletionResult,\n pickedCompletion,\n snippetCompletion,\n} from '@codemirror/autocomplete'\nimport {syntaxTree} from '@codemirror/language'\nimport {EditorSelection, type EditorState, type Extension, StateField} from '@codemirror/state'\nimport {\n type Command,\n EditorView,\n hoverTooltip,\n keymap,\n showTooltip,\n type Tooltip,\n} from '@codemirror/view'\n\nimport {type VistaSavedFunction} from '../store/types'\nimport {functionLibrary, type GroqEditorLabels, groqEditorLabels} from './groqEditorContext'\nimport {\n GROQ_FUNCTIONS,\n GROQ_FUNCTIONS_REFERENCE_URL,\n findGroqFunction,\n functionId,\n type GroqFunctionDoc,\n} from './groqFunctionReference'\nimport {\n callId,\n declarationInsertion,\n extractFunction,\n type FunctionDeclaration,\n type GroqNode,\n parseDeclaration,\n readQueryFunctions,\n} from './groqFunctions'\nimport {renderMessage} from './groqLint'\n\n/** Completions open on their own once this much of a name is typed; Ctrl-Space opens them anytime */\nconst MIN_TYPED_LENGTH = 2\n/** A name before the cursor, with or without its namespace: `co`, `pt::`, `pt::te` */\nconst NAME_BEFORE_CURSOR = /[A-Za-z_]\\w*(?:::\\w*)?$/\n/** `|` that pipes into a function, not the `||` of a condition */\nconst PIPE_BEFORE = /(?:^|[^|])\\|\\s*$/\n\n/**\n * IntelliJ's \"show context actions\". Free in browsers on every platform, unlike IntelliJ's\n * Extract Method (`Mod-Alt-m`), which minimizes the browser's windows on macOS. The shortcuts\n * dialog lists it as `EXTRACT_FUNCTION_SHORTCUT`.\n */\nconst EXTRACT_FUNCTION_KEY = 'Alt-Enter'\n\nfunction element<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n content?: string | Node,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag)\n node.className = className\n if (content !== undefined) node.append(content)\n return node\n}\n\n/** A function's documentation: its signature or declaration, then what it does and how to use it */\nfunction renderDoc(parts: {\n code: string\n description?: string\n notes?: string[]\n link?: {href: string; text: string}\n}): HTMLElement {\n const dom = element('div', 'cm-vista-function-doc')\n dom.append(element('pre', 'cm-vista-function-code', parts.code))\n if (parts.description) {\n dom.append(element('p', 'cm-vista-function-description', renderMessage(parts.description)))\n }\n for (const note of parts.notes ?? []) {\n dom.append(element('p', 'cm-vista-function-note', renderMessage(note)))\n }\n if (parts.link) {\n const link = element('a', 'cm-vista-function-link', parts.link.text)\n link.href = parts.link.href\n link.target = '_blank'\n link.rel = 'noreferrer'\n dom.append(link)\n }\n return dom\n}\n\nfunction renderBuiltinDoc(doc: GroqFunctionDoc, labels: GroqEditorLabels): HTMLElement {\n const notes: string[] = []\n if (doc.apiVersion) notes.push(labels.apiVersion(doc.apiVersion))\n if (doc.deltaOnly) notes.push(labels.deltaOnly)\n return renderDoc({\n code: doc.signature,\n description: doc.description,\n notes,\n link: {href: GROQ_FUNCTIONS_REFERENCE_URL, text: labels.reference},\n })\n}\n\n/** The call whose name (or namespace) `node` is part of; not its arguments, nor a declaration */\nfunction callOfName(node: GroqNode): GroqNode | null {\n const part = node.name === 'Identifier' ? node.parent : node\n if (!part || !['FunctionName', 'Namespace', 'NamespaceSep'].includes(part.name)) return null\n const call = part.parent\n return call && (call.name === 'FunctionCall' || call.name === 'NamespacedCall') ? call : null\n}\n\nfunction lineOf(state: EditorState, position: number): number {\n return state.doc.lineAt(position).number\n}\n\n/** Documentation for the function called where the pointer is */\nexport function functionHoverAt(state: EditorState, pos: number, side: -1 | 1): Tooltip | null {\n const labels = state.facet(groqEditorLabels)\n const call = labels ? callOfName(syntaxTree(state).resolveInner(pos, side)) : null\n if (!labels || !call) return null\n const query = state.doc.toString()\n const nameNode = call.getChild('FunctionName')\n if (!nameNode) return null\n const namespaceNode = call.getChild('Namespace')\n const namespace = namespaceNode ? query.slice(namespaceNode.from, namespaceNode.to) : undefined\n const id = callId({namespace, name: query.slice(nameNode.from, nameNode.to)})\n const range = {pos: namespaceNode?.from ?? nameNode.from, end: nameNode.to, above: true}\n\n const declaration = namespace\n ? readQueryFunctions(syntaxTree(state), query).declarations.find((it) => it.id === id)\n : undefined\n if (declaration) {\n return {\n ...range,\n create: () => ({\n dom: renderDoc({\n code: declaration.text,\n notes: [labels.declaredOn(lineOf(state, declaration.range.from))],\n }),\n }),\n }\n }\n const doc = findGroqFunction(namespace, query.slice(nameNode.from, nameNode.to))\n if (doc) {\n return {...range, create: () => ({dom: renderBuiltinDoc(doc, labels)})}\n }\n const saved = state.facet(functionLibrary).find((it) => it.id === id)\n if (saved) {\n return {\n ...range,\n create: () => ({dom: renderDoc({code: saved.declaration, notes: [labels.inLibrary]})}),\n }\n }\n return null\n}\n\nfunction callSnippet(id: string, takesArguments: boolean): string {\n return takesArguments ? `${id}(\\${})` : `${id}()\\${}`\n}\n\nfunction builtinCompletion(doc: GroqFunctionDoc, labels: GroqEditorLabels): Completion {\n const id = functionId(doc)\n return snippetCompletion(callSnippet(id, doc.args?.max !== 0), {\n label: id,\n type: 'function',\n info: () => renderBuiltinDoc(doc, labels),\n })\n}\n\nfunction declaredCompletion(\n declaration: FunctionDeclaration,\n labels: GroqEditorLabels,\n): Completion {\n return snippetCompletion(callSnippet(declaration.id, true), {\n label: declaration.id,\n type: 'function',\n detail: labels.completionDeclared,\n info: () => renderDoc({code: declaration.text}),\n })\n}\n\n/** A library function the query does not declare: picking it declares it at the top too */\nfunction libraryCompletion(saved: VistaSavedFunction, labels: GroqEditorLabels): Completion {\n return {\n label: saved.id,\n type: 'function',\n detail: labels.completionLibrary,\n info: () => renderDoc({code: saved.declaration, notes: [labels.inLibrary]}),\n apply: (view, completion, from, to) => {\n const call = `${saved.id}()`\n const insertion = declarationInsertion(view.state.doc.toString(), saved.declaration)\n // Typed in a declaration's body, the call comes before the new declaration\n const callFrom = insertion.from <= from ? from + insertion.insert.length : from\n view.dispatch({\n changes:\n insertion.from === from\n ? {from, to, insert: insertion.insert + call}\n : [insertion, {from, to, insert: call}],\n selection: EditorSelection.cursor(callFrom + call.length - 1),\n annotations: pickedCompletion.of(completion),\n scrollIntoView: true,\n })\n },\n }\n}\n\nfunction startsWithIgnoringCase(text: string, prefix: string): boolean {\n return text.toLowerCase().startsWith(prefix.toLowerCase())\n}\n\n/**\n * Function names, in this order: the query's custom functions, the library's (which come with\n * their declaration) and the built-in ones. Only names that start with what is typed are\n * offered, and after `|` only the pipe functions, so field names do not keep opening the list.\n */\nexport function functionCompletions(context: CompletionContext): CompletionResult | null {\n const {state, pos, explicit} = context\n const labels = state.facet(groqEditorLabels)\n if (!labels) return null\n const word = context.matchBefore(NAME_BEFORE_CURSOR)\n if (!explicit && (!word || word.to - word.from < MIN_TYPED_LENGTH)) return null\n const from = word?.from ?? pos\n const typed = word?.text ?? ''\n const charBefore = state.sliceDoc(from - 1, from)\n if (charBefore === '.' || charBefore === '$' || charBefore === '>') return null\n for (\n let node: GroqNode | null = syntaxTree(state).resolveInner(pos, -1);\n node;\n node = node.parent\n ) {\n if (node.name === 'String' || node.name === 'LineComment') return null\n // Naming a function or its parameter in its own declaration\n if (node.name === 'FunctionDef') {\n const equals = node.getChild('=')\n if (!equals || pos <= equals.from) return null\n }\n }\n\n const query = state.doc.toString()\n const piped = PIPE_BEFORE.test(state.sliceDoc(Math.max(0, from - 20), from))\n const matches = (id: string) =>\n startsWithIgnoringCase(id, typed) || startsWithIgnoringCase(id.split('::').pop() ?? id, typed)\n const options: Completion[] = []\n if (!piped) {\n const {declarations} = readQueryFunctions(syntaxTree(state), query)\n const declaredIds = new Set(declarations.map((declaration) => declaration.id))\n for (const declaration of declarations) {\n if (declaration.namespace && matches(declaration.id)) {\n options.push(declaredCompletion(declaration, labels))\n }\n }\n for (const saved of state.facet(functionLibrary)) {\n if (!declaredIds.has(saved.id) && matches(saved.id) && parseDeclaration(saved.declaration)) {\n options.push(libraryCompletion(saved, labels))\n }\n }\n }\n for (const doc of GROQ_FUNCTIONS) {\n if (Boolean(doc.pipe) === piped && matches(functionId(doc))) {\n options.push(builtinCompletion(doc, labels))\n }\n }\n if (options.length === 0) return null\n return {from, options, filter: false}\n}\n\n/**\n * Makes the selection a custom function when it is a projection that can be one, or with nothing\n * selected the projection around the cursor\n */\nexport const extractSelectionToFunction: Command = (view) => {\n const extraction = extractFunction(\n view.state.doc.toString(),\n view.state.selection.main,\n view.state.facet(functionLibrary),\n )\n if (!extraction) return false\n const changes = view.state.changes(extraction.changes)\n view.dispatch({\n changes,\n selection: EditorSelection.cursor(extraction.call.to),\n scrollIntoView: true,\n userEvent: 'input.extract',\n })\n view.focus()\n return true\n}\n\nfunction extractTooltips(state: EditorState): readonly Tooltip[] {\n const selection = state.selection.main\n const labels = state.facet(groqEditorLabels)\n if (selection.empty || !labels) return []\n const extraction = extractFunction(state.doc.toString(), selection, state.facet(functionLibrary))\n if (!extraction) return []\n return [\n {\n pos: selection.from,\n above: true,\n strictSide: false,\n arrow: false,\n create: (view) => {\n const button = element('button', 'cm-vista-extract-button', labels.extract)\n button.type = 'button'\n button.dataset.testid = 'vista-extract-function'\n // Keeps the editor focused and the selection in place until the click lands\n button.addEventListener('mousedown', (event) => event.preventDefault())\n button.addEventListener('click', () => extractSelectionToFunction(view))\n const dom = element('div', 'cm-vista-extract', button)\n return {dom}\n },\n },\n ]\n}\n\nconst extractTooltip = StateField.define<readonly Tooltip[]>({\n create: extractTooltips,\n update: (tooltips, transaction) =>\n transaction.docChanged || transaction.selection ? extractTooltips(transaction.state) : tooltips,\n provide: (field) => showTooltip.computeN([field], (state) => state.field(field)),\n})\n\n/** Layout only; fonts and colors come with the studio theme (`useCodemirrorTheme`) */\nconst functionEditorTheme = EditorView.baseTheme({\n '.cm-vista-function-doc': {maxWidth: '420px', padding: '8px 10px', lineHeight: '1.45'},\n '.cm-completionInfo .cm-vista-function-doc': {padding: 0},\n '.cm-vista-function-code': {margin: 0, whiteSpace: 'pre-wrap'},\n '.cm-vista-function-description, .cm-vista-function-note': {margin: '6px 0 0'},\n '.cm-vista-function-link': {display: 'inline-block', marginTop: '6px'},\n '.cm-vista-extract': {padding: '2px'},\n '.cm-vista-extract-button': {\n border: 'none',\n borderRadius: '2px',\n padding: '4px 8px',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n },\n})\n\n/**\n * Custom functions in the query editor: hover documentation for every function called,\n * completions of function names (the library's declare themselves), and extracting a projection\n * to a function: with a button over a selected one, and with `Alt-Enter` for the selection or\n * the projection around the cursor\n */\nexport function createGroqFunctionExtensions(labels: GroqEditorLabels): Extension[] {\n return [\n groqEditorLabels.of(labels),\n hoverTooltip((view, pos, side) => functionHoverAt(view.state, pos, side)),\n autocompletion({override: [functionCompletions], selectOnOpen: false, icons: false}),\n extractTooltip,\n keymap.of([{key: EXTRACT_FUNCTION_KEY, run: extractSelectionToFunction}]),\n functionEditorTheme,\n ]\n}\n","import {type ReactNode} from 'react'\nimport {Flex} from 'ui5'\n\n/**\n * The bottom action bar of the request and response panels, following the structure tool's\n * document status bar: a primary CTA (with text and icon) and a show-more menu button.\n */\nexport function ActionRail({children, testId}: {children: ReactNode; testId: string}) {\n return (\n <Flex\n alignItems=\"center\"\n borderTop\n data-testid={testId}\n flexShrink={0}\n gap={2}\n justifyContent=\"flex-end\"\n padding={2}\n >\n {children}\n </Flex>\n )\n}\n","import {type Placement, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactElement} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../../i18n'\n\ninterface AgentActionsTooltipProps {\n /** What the control does; left out for a control whose own text says so */\n title?: string\n placement?: Placement\n children: ReactElement\n}\n\n/**\n * Tooltip of a control that calls Sanity Agent Actions: what it does, and that it spends the\n * organization's AI credits, which nothing else in the tool would say before the request is made\n */\nexport function AgentActionsTooltip(props: AgentActionsTooltipProps) {\n const {title, placement = 'bottom', children} = props\n const {t} = useTranslation(visionLocaleNamespace)\n return (\n <Tooltip\n animate\n content={\n <Stack gap={2}>\n {title && <Text size={1}>{title}</Text>}\n <Text muted size={1}>\n {t('vista.agent-actions.credits')}\n </Text>\n </Stack>\n }\n placement={placement}\n portal\n >\n {children}\n </Tooltip>\n )\n}\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {Button, Tab, TabList, TabPanel} from '@sanity/ui'\nimport {type ReactNode, useEffect, useRef} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport * as styles from './vista.module.css'\n\n/** Height of the tab header, which is all that remains of a collapsed panel */\nexport const PANEL_HEADER_HEIGHT = 35\n\nexport interface CollapsiblePanelTab {\n id: string\n label: ReactNode\n /** Rendered after the label, for instance a count or a warning icon */\n icon?: ReactNode\n content: ReactNode\n}\n\nexport interface CollapsiblePanelProps {\n /** Prefix for the tab and panel element ids */\n id: string\n tabs: CollapsiblePanelTab[]\n activeTabId: string\n collapsed: boolean\n onTabChange: (id: string) => void\n onToggle: () => void\n}\n\n/**\n * The tabbed bottom panel of the request and response columns. When collapsed only the tab\n * header remains, and picking a tab expands it again.\n */\nexport function CollapsiblePanel(props: CollapsiblePanelProps) {\n const {id: idPrefix, tabs, activeTabId, collapsed, onTabChange, onToggle} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const activeTab = tabs.find((tab) => tab.id === activeTabId) || tabs[0]\n const stripRef = useRef<HTMLDivElement>(null)\n // Changes when the tabs do, rather than with every new array of them\n const tabIds = tabs.map((tab) => tab.id).join(' ')\n\n // The tab strip scrolls sideways when the tabs do not fit, and keeps the selected tab in it\n // whole: the last tabs are otherwise cut at the edge when picked, or pushed out of it when a\n // tab before them grows a count\n useEffect(() => {\n const strip = stripRef.current\n if (!strip) return undefined\n const tabElement = (tabId: string) => document.getElementById(`${idPrefix}-${tabId}-tab`)\n const reveal = () => {\n const tab = tabElement(activeTab.id)\n if (!tab) return\n const stripBox = strip.getBoundingClientRect()\n const tabBox = tab.getBoundingClientRect()\n if (tabBox.left < stripBox.left) strip.scrollLeft -= stripBox.left - tabBox.left\n else if (tabBox.right > stripBox.right) strip.scrollLeft += tabBox.right - stripBox.right\n }\n reveal()\n const observer = new ResizeObserver(reveal)\n for (const tabId of tabIds.split(' ')) {\n const tab = tabElement(tabId)\n if (tab) observer.observe(tab)\n }\n return () => observer.disconnect()\n }, [activeTab.id, idPrefix, tabIds])\n\n return (\n <Flex data-testid={`${idPrefix}-panel`} flexDirection=\"column\" height=\"100%\" minHeight=\"0\">\n <Flex\n alignItems=\"center\"\n borderBottom={!collapsed}\n flexShrink={0}\n gap={2}\n height={`${PANEL_HEADER_HEIGHT}px`}\n justifyContent=\"space-between\"\n paddingX={2}\n >\n <Box className={styles.panelTabs} ref={stripRef}>\n <TabList gap={1}>\n {tabs.map((tab) => (\n <Tab\n aria-controls={`${idPrefix}-${tab.id}-panel`}\n fontSize={1}\n icon={tab.icon}\n id={`${idPrefix}-${tab.id}-tab`}\n key={tab.id}\n label={tab.label}\n onClick={() => {\n onTabChange(tab.id)\n if (collapsed) onToggle()\n }}\n padding={2}\n // A tablist always has a selected tab; collapsing hides its panel, no more\n selected={tab.id === activeTab.id}\n />\n ))}\n </TabList>\n </Box>\n <Button\n aria-label={collapsed ? t('vista.panel.expand') : t('vista.panel.collapse')}\n data-testid={`${idPrefix}-panel-toggle`}\n fontSize={1}\n icon={collapsed ? ChevronUpIcon : ChevronDownIcon}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n />\n </Flex>\n {!collapsed && (\n <TabPanel\n aria-labelledby={`${idPrefix}-${activeTab.id}-tab`}\n flex={1}\n id={`${idPrefix}-${activeTab.id}-panel`}\n overflow=\"auto\"\n >\n {activeTab.content}\n </TabPanel>\n )}\n </Flex>\n )\n}\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {Button} from '@sanity/ui'\nimport {type CSSProperties, type ReactNode, type RefObject} from 'react'\nimport {Box, Flex} from 'ui5'\n\nimport {cx} from '../util/cx'\nimport {PANEL_HEADER_HEIGHT} from './CollapsiblePanel'\nimport * as styles from './vista.module.css'\n\nexport interface CollapsibleSectionProps {\n /** Prefix for the element ids and test ids */\n id: string\n title: string\n /** Rendered after the title, for instance a warning icon */\n icon?: ReactNode\n /** Rendered at the end of the header while expanded, for instance a view switch */\n actions?: ReactNode\n expanded: boolean\n onToggle: () => void\n /** Sizing of the expanded section */\n className?: string\n style?: CSSProperties\n ref?: RefObject<HTMLElement | null>\n /** Rendered before the header, positioned by the caller (a resize handle) */\n handle?: ReactNode\n children: ReactNode\n}\n\n/**\n * A titled, collapsible panel stacked under the query editor. Collapsed, only the header row\n * remains; its height is {@link PANEL_HEADER_HEIGHT} like the response column's tabbed panel.\n */\nexport function CollapsibleSection(props: CollapsibleSectionProps) {\n const {id, title, icon, actions, expanded, onToggle, className, style, ref, handle, children} =\n props\n\n return (\n <Flex\n as=\"section\"\n className={cx(styles.collapsibleSection, expanded && className)}\n data-expanded={expanded}\n data-testid={`${id}-panel`}\n ref={ref}\n style={expanded ? style : undefined}\n >\n {handle}\n <Flex\n alignItems=\"center\"\n borderBottom={expanded}\n flexShrink={0}\n gap={1}\n height={`${PANEL_HEADER_HEIGHT}px`}\n paddingX={2}\n >\n <Button\n aria-controls={`${id}-content`}\n aria-expanded={expanded}\n data-testid={`${id}-toggle`}\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n id={`${id}-toggle`}\n mode=\"bleed\"\n onClick={onToggle}\n padding={2}\n text={title}\n />\n {icon}\n {expanded && actions && (\n <>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </>\n )}\n </Flex>\n {expanded && (\n <Box\n aria-labelledby={`${id}-toggle`}\n className={styles.sectionBody}\n id={`${id}-content`}\n role=\"region\"\n >\n {children}\n </Box>\n )}\n </Flex>\n )\n}\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {usePerspectiveOptionName} from './OptionFields'\n\n/** The fields of the Options panel the button can show */\nexport type RevealedOption = 'apiVersion' | 'perspective'\n\nexport interface ApiVersionButtonProps {\n resolved: Pick<\n ResolvedRequest,\n | 'apiVersion'\n | 'isValidApiVersion'\n | 'isApiVersionLocked'\n | 'useCdn'\n | 'isCdnBlockedByPerspective'\n | 'tabPerspective'\n >\n /** Shows a field in the Options panel */\n onReveal: (option: RevealedOption) => void\n}\n\n/**\n * The API version the tab's requests go out with, and whether they go to the API CDN, next to\n * Fetch, so it is in view while the Options panel is collapsed or scrolled away. Pressing it\n * shows the field that changes it: the perspective while it keeps the queries off the CDN.\n */\nexport function ApiVersionButton({resolved, onReveal}: ApiVersionButtonProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const {apiVersion, isValidApiVersion, isApiVersionLocked, useCdn, isCdnBlockedByPerspective} =\n resolved\n const perspectiveName = usePerspectiveOptionName(resolved.tabPerspective)\n const cdnBlocked = isValidApiVersion && isCdnBlockedByPerspective\n let tooltip = useCdn\n ? t('vista.api-version.tooltip-cdn', {version: apiVersion})\n : t('vista.api-version.tooltip', {version: apiVersion})\n if (!isValidApiVersion) tooltip = t('vista.api-version.tooltip-invalid')\n else if (cdnBlocked) {\n tooltip = t('vista.api-version.tooltip-cdn-blocked', {\n version: apiVersion,\n perspective: perspectiveName,\n })\n } else if (isApiVersionLocked) {\n tooltip = t('vista.api-version.tooltip-locked', {version: apiVersion})\n }\n\n return (\n <Tooltip animate content={<Text size={1}>{tooltip}</Text>} placement=\"top\" portal>\n <Button\n data-cdn-blocked={cdnBlocked || undefined}\n data-testid=\"vista-api-version-button\"\n fontSize={1}\n icon={cdnBlocked ? WarningOutlineIcon : undefined}\n mode=\"bleed\"\n onClick={() => onReveal(cdnBlocked ? 'perspective' : 'apiVersion')}\n padding={2}\n text={\n isValidApiVersion\n ? t(useCdn ? 'vista.api-version.button-cdn' : 'vista.api-version.button', {\n version: apiVersion,\n })\n : t('vista.api-version.button-invalid')\n }\n tone={isValidApiVersion && !cdnBlocked ? 'default' : 'caution'}\n />\n </Tooltip>\n )\n}\n","import {type PromptRequest} from '@sanity/client'\n\nimport {isPlainObject} from '../../util/isPlainObject'\n\n/** What `generateQuery` needs of a client; a `SanityClient` has it */\nexport interface GenerateQueryClient {\n fetch: (\n query: string,\n params: Record<string, unknown>,\n options: {signal?: AbortSignal; tag: string},\n ) => Promise<unknown>\n withConfig: (config: {apiVersion: string}) => {\n agent: {action: {prompt: (request: PromptRequest) => Promise<unknown>}}\n }\n}\n\n/** Agent Actions only exist on the experimental API */\nexport const AGENT_API_VERSION = 'vX'\nexport const MAX_GENERATE_ATTEMPTS = 3\nconst MAX_TITLE_LENGTH = 60\n\n/**\n * How GROQ works, for the model: the patterns a query needs, and the jq, SQL and JavaScript\n * habits models fall back on (the API rejects those, and a retry quotes its error)\n */\nconst GROQ_REFERENCE = `GROQ is the query language of the Sanity Content Lake. It is not jq, SQL or JavaScript.\n- A query usually starts with * (every document), filtered in brackets: *[_type == \"movie\" && releaseYear >= 1979]\n- A projection picks and computes attributes: {_id, title, \"director\": director->name, \"castCount\": count(cast)}\n- Order with the order() pipe function, then slice: *[_type == \"movie\"] | order(releaseDate desc, title asc)[0...10]\n- [0...10] is the first ten (the end is excluded), [0] is the first match alone\n- To pick some documents by one order and show them in another, slice first and order again: *[_type == \"movie\"] | order(_createdAt desc)[0...10] | order(title asc)\n- Follow references with ->: author->name, categories[]->title; find documents that reference another with references($id)\n- Text search: title match \"word*\"; membership: \"news\" in tags; logic: &&, ||, !; existence: defined(field)\n- Functions include count(), defined(), coalesce(), select(), round(), lower(), upper(), now(), dateTime(), string::split(), array::unique(), math::sum(), pt::text()\n- Parameters are names that start with $ (like $type); their values are given separately\n- Every document has _id, _type, _createdAt, _updatedAt and _rev; \"recent\" or \"newest\" usually means _createdAt desc\n- Use the field names of the schema; when the request names something the schema lacks, use the closest field\n- Never use jq or SQL syntax: no .[] or .field after a pipe, no sort_by(), map() or select(.x), no LIMIT, ORDER BY or SELECT`\n\nconst INSTRUCTION = `You write GROQ queries for the Sanity Content Lake.\n\nThe request:\n$request\n\nThe document types in the dataset:\n$schema\n\nHow to write GROQ:\n$reference\n\nReply with JSON: an object with \"query\" (the GROQ query, without comments or code fences), \"params\" (an object with a value for every parameter the query uses, or an empty object) and \"title\" (a name for the query of at most five words).`\n\nconst RETRY_INSTRUCTION = `${INSTRUCTION}\n\nYour previous attempt was rejected by the Content Lake:\n$previous\n\nFix that problem in your reply.`\n\nexport interface GeneratedQuery {\n query: string\n params: Record<string, unknown>\n /** A short name for the tab; undefined when the model gave none */\n title: string | undefined\n}\n\n/** Every attempt was rejected; the last one is kept so it can still be opened and fixed by hand */\nexport class GenerateQueryError extends Error {\n readonly lastAttempt: GeneratedQuery | undefined\n constructor(message: string, lastAttempt: GeneratedQuery | undefined) {\n super(message)\n this.name = 'GenerateQueryError'\n this.lastAttempt = lastAttempt\n }\n}\n\nexport interface GenerateQueryOptions {\n /** What the query should do, in the user's words */\n request: string\n /** The workspace's document types, from `summarizeSchema` */\n schema: string\n /** The client the query will run with (dataset, API version, perspective); it checks each attempt */\n client: GenerateQueryClient\n /** Called as each attempt starts, from 1 */\n onAttempt?: (attempt: number) => void\n signal?: AbortSignal\n}\n\nfunction toGeneratedQuery(response: unknown): GeneratedQuery {\n const record = isPlainObject(response) ? response : {}\n const query = typeof record.query === 'string' ? record.query.trim() : ''\n const title = typeof record.title === 'string' ? record.title.trim() : ''\n return {\n query,\n params: isPlainObject(record.params) ? record.params : {},\n title: title && title.length <= MAX_TITLE_LENGTH ? title : undefined,\n }\n}\n\n/** The Content Lake's explanation of a rejected query, from the response body when it has one */\nfunction describeRejection(error: unknown): string {\n const details =\n typeof error === 'object' && error !== null && 'details' in error ? error.details : undefined\n if (isPlainObject(details) && typeof details.description === 'string') {\n return details.description\n }\n return error instanceof Error ? error.message : String(error)\n}\n\n/**\n * Compiles the query on the Content Lake without running it: `select(false => …)` never\n * evaluates its value, yet the whole query is parsed, its functions resolved and its parameters\n * checked, by the API the query will run on. The line breaks keep a trailing comment from\n * swallowing the closing parentheses.\n */\nasync function checkQuery(\n client: GenerateQueryClient,\n attempt: GeneratedQuery,\n signal?: AbortSignal,\n) {\n await client.fetch(`select(false => (\\n${attempt.query}\\n))`, attempt.params, {\n signal,\n tag: 'vista.generate',\n })\n}\n\n/**\n * Writes a GROQ query for a request with Agent Actions (`client.agent.action.prompt`): the\n * request, the workspace's document types and a GROQ primer go in, and every attempt is compiled\n * on the Content Lake before it is accepted. A rejected attempt is retried with the API's error,\n * up to {@link MAX_GENERATE_ATTEMPTS} times. A failing prompt request (no access to Agent\n * Actions, quota) rejects right away.\n */\nexport async function generateQuery(options: GenerateQueryOptions): Promise<GeneratedQuery> {\n const {request, schema, client, onAttempt, signal} = options\n const agent = client.withConfig({apiVersion: AGENT_API_VERSION}).agent.action\n let previous: {attempt: GeneratedQuery; problem: string} | undefined\n\n for (let attempt = 1; attempt <= MAX_GENERATE_ATTEMPTS; attempt++) {\n signal?.throwIfAborted()\n onAttempt?.(attempt)\n // oxlint-disable-next-line no-await-in-loop -- each attempt is asked with the previous one's error\n const response: unknown = await agent.prompt({\n instruction: previous ? RETRY_INSTRUCTION : INSTRUCTION,\n instructionParams: {\n request,\n schema,\n reference: GROQ_REFERENCE,\n ...(previous\n ? {previous: `${JSON.stringify(previous.attempt)}\\nError: ${previous.problem}`}\n : {}),\n },\n format: 'json',\n temperature: 0.2,\n })\n signal?.throwIfAborted()\n const generated = toGeneratedQuery(response)\n if (!generated.query) {\n previous = {attempt: generated, problem: 'The reply had no query'}\n continue\n }\n try {\n // oxlint-disable-next-line no-await-in-loop -- the check decides whether to ask again\n await checkQuery(client, generated, signal)\n return generated\n } catch (error) {\n signal?.throwIfAborted()\n previous = {attempt: generated, problem: describeRejection(error)}\n }\n }\n throw new GenerateQueryError(previous?.problem ?? 'No query was generated', previous?.attempt)\n}\n","import {isHttpError} from '@sanity/client'\n\nimport {isPlainObject} from '../../util/isPlainObject'\nimport {AGENT_API_VERSION} from './generateQuery'\n\n/** What reading the AI credits needs of a client; a `SanityClient` has it */\nexport interface AiCreditsClient {\n config: () => {projectId?: string; apiHost?: string}\n withConfig: (config: {apiVersion: string}) => {\n request: (options: {url: string; tag: string; signal?: AbortSignal}) => Promise<unknown>\n }\n}\n\n/**\n * The AI credits of the organization that owns the project, for the current month. Every\n * Agent Actions request is one credit, so these are what the Generate and Explain controls\n * spend.\n */\nexport interface AiCredits {\n /** Whether Agent Actions requests go through; false once the spending limit is reached */\n granted: boolean\n /** Why they do not, as the API names it (`plan_limit_reached`, `default_budget_limit_reached`) */\n reasonCode: string | undefined\n /** Credits used this month, as far as the API has metered them (it lags behind by hours) */\n used: number | undefined\n /** Credits the plan includes per month */\n quota: number | undefined\n}\n\nexport const AI_CREDITS_DOCS_URL =\n 'https://www.sanity.io/docs/platform-management/how-ai-credits-work'\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value ? value : undefined\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\n/**\n * The credits as the `ai-usage` resource of the project's subscription reports them; `undefined`\n * for a response of another shape, which is what a Studio talking to an API without it gets\n */\nexport function readAiCredits(response: unknown): AiCredits | undefined {\n if (!isPlainObject(response) || typeof response.granted !== 'boolean') return undefined\n const subscription = isPlainObject(response.subscription) ? response.subscription : {}\n const usage = isPlainObject(response.usage) ? response.usage : {}\n return {\n granted: response.granted,\n reasonCode: optionalString(response.reasonCode),\n used: optionalNumber(usage.value),\n quota: optionalNumber(subscription.quota),\n }\n}\n\n/**\n * Reads the organization's AI credits through the project. The resource only exists on the\n * experimental API, and a Studio talking to an API without it resolves with `undefined`, so\n * nothing depends on the answer.\n */\nexport async function fetchAiCredits(\n client: AiCreditsClient,\n signal?: AbortSignal,\n): Promise<AiCredits | undefined> {\n const {projectId} = client.config()\n if (!projectId) return undefined\n const response = await client.withConfig({apiVersion: AGENT_API_VERSION}).request({\n url: `/subscriptions/project/${projectId}/resources/ai-usage`,\n tag: 'vista.ai-credits',\n signal,\n })\n return readAiCredits(response)\n}\n\n/**\n * The credits a request was turned down for, from the 429 response Agent Actions give once the\n * organization's spending limit is reached: its body names the limit and carries the usage and\n * the quota, which a plain rate limit response does not. `undefined` for any other error.\n */\nexport function readAiCreditsLimit(error: unknown): AiCredits | undefined {\n if (!isHttpError(error) || error.statusCode !== 429) return undefined\n const body = error.response.body\n if (!isPlainObject(body)) return undefined\n const reasonCode = optionalString(body.reasonCode)\n const quota = optionalNumber(body.quota)\n if (reasonCode === undefined && quota === undefined) return undefined\n return {granted: false, reasonCode, used: optionalNumber(body.usageValue), quota}\n}\n\n/** The Sanity website the project's API host belongs to, for links into Manage */\nfunction websiteUrl(apiHost: string | undefined): string {\n return apiHost?.endsWith('.work') ? 'https://www.sanity.work' : 'https://www.sanity.io'\n}\n\n/**\n * The organization's AI usage in Manage; without the organization ID, Manage's own redirect to\n * the organization of the signed-in user\n */\nexport function aiUsageUrl(apiHost: string | undefined, organizationId: string | null): string {\n const site = websiteUrl(apiHost)\n return organizationId\n ? `${site}/organizations/${organizationId}/usage/ai`\n : `${site}/manage/org/usage/ai`\n}\n\n/** The organization's spending limits in Manage, where the AI credits limit is raised */\nexport function aiSpendingLimitUrl(\n apiHost: string | undefined,\n organizationId: string | null,\n): string {\n const site = websiteUrl(apiHost)\n return organizationId\n ? `${site}/organizations/${organizationId}/settings#caps`\n : `${site}/manage/org/settings`\n}\n","import {useEffect, useSyncExternalStore} from 'react'\n\nimport {type AiCredits, type AiCreditsClient, fetchAiCredits} from '../util/aiCredits'\n\ninterface AiCreditsEntry {\n credits: AiCredits | undefined\n /** When `credits` was read, so an old answer is read again */\n readAt: number\n reading: boolean\n /**\n * Stepped by every reading and every limit reported, so a reading that comes back after a\n * limit was reported is dropped: its answer is from before the request was turned down\n */\n version: number\n}\n\n/** How long a reading stands before a control that mounts reads again */\nconst MAX_AGE = 60_000\n\n// The credits are the organization's, read through the project, so every control of a project\n// shares one reading, across tabs and across the time the tool is left and come back to\nconst entries = new Map<string, AiCreditsEntry>()\nconst listeners = new Set<() => void>()\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nfunction update(projectId: string, entry: AiCreditsEntry) {\n entries.set(projectId, entry)\n listeners.forEach((listener) => listener())\n}\n\nasync function read(projectId: string, client: AiCreditsClient) {\n const previous = entries.get(projectId)\n const version = (previous?.version ?? 0) + 1\n update(projectId, {\n credits: previous?.credits,\n readAt: previous?.readAt ?? 0,\n reading: true,\n version,\n })\n let credits: AiCredits | undefined\n try {\n credits = await fetchAiCredits(client)\n } catch {\n // A failed reading says nothing about the credits; the controls work as if there were none\n credits = undefined\n }\n // A limit reported while this was on its way stands: the answer is from before the request\n // that hit it\n if (entries.get(projectId)?.version !== version) return\n update(projectId, {credits, readAt: Date.now(), reading: false, version})\n}\n\n/**\n * The organization's AI credits, read through the project when a control that spends them\n * mounts and the last reading is more than a minute old; `undefined` until read, and when the\n * API has nothing to say about them\n */\nexport function useAiCredits(client: AiCreditsClient): AiCredits | undefined {\n const {projectId} = client.config()\n const credits = useSyncExternalStore(subscribe, () =>\n projectId ? entries.get(projectId)?.credits : undefined,\n )\n\n useEffect(() => {\n if (!projectId) return\n const entry = entries.get(projectId)\n if (entry && (entry.reading || Date.now() - entry.readAt < MAX_AGE)) return\n void read(projectId, client)\n }, [client, projectId])\n\n return credits\n}\n\n/**\n * A request was turned down for the credits: every control shows the limit right away, with the\n * usage the response carried, rather than the reading from before\n */\nexport function reportAiCreditsLimit(client: AiCreditsClient, limit: AiCredits): void {\n const {projectId} = client.config()\n if (!projectId) return\n const version = (entries.get(projectId)?.version ?? 0) + 1\n update(projectId, {credits: limit, readAt: Date.now(), reading: false, version})\n}\n\n/**\n * A request went through: a limit reported before no longer holds (the spending limit was\n * raised, or the month turned), so the credits are read again\n */\nexport function reportAiCreditsGranted(client: AiCreditsClient): void {\n const {projectId} = client.config()\n if (!projectId) return\n const entry = entries.get(projectId)\n if (entry?.credits?.granted === false && !entry.reading) void read(projectId, client)\n}\n\n/** Forgets every reading; for tests */\nexport function resetAiCredits(): void {\n entries.clear()\n}\n","import {\n type ArraySchemaType,\n type ObjectField,\n type ReferenceSchemaType,\n type Schema,\n type SchemaType,\n} from 'sanity'\n\nimport {getDocumentTypeNames} from './documentTypes'\n\n/** Document types described field by field; the rest are only named, to keep the prompt small */\nconst MAX_DETAILED_TYPES = 6\nconst MAX_FIELDS = 40\nconst MAX_LIST_VALUES = 12\n/** Nested objects are described this deep, enough for `slug.current` or `image.asset` */\nconst MAX_DEPTH = 2\n\nfunction isReferenceType(type: SchemaType): type is ReferenceSchemaType {\n for (let current: SchemaType | undefined = type; current; current = current.type) {\n if (current.name === 'reference') return 'to' in type\n }\n return false\n}\n\nfunction isArrayType(type: SchemaType): type is ArraySchemaType {\n return type.jsonType === 'array'\n}\n\nfunction isBlockType(type: SchemaType): boolean {\n for (let current: SchemaType | undefined = type; current; current = current.type) {\n if (current.name === 'block') return true\n }\n return false\n}\n\nfunction listValues(type: SchemaType): string | undefined {\n if (type.jsonType !== 'string' && type.jsonType !== 'number') return undefined\n const list = type.options?.list\n if (!Array.isArray(list) || list.length === 0) return undefined\n const values = list\n .slice(0, MAX_LIST_VALUES)\n .map((item: unknown) =>\n JSON.stringify(\n typeof item === 'object' && item !== null && 'value' in item ? item.value : item,\n ),\n )\n return `one of ${values.join(', ')}${list.length > MAX_LIST_VALUES ? ', …' : ''}`\n}\n\nfunction describeFields(fields: ObjectField[], depth: number): string {\n const shown = fields\n .slice(0, MAX_FIELDS)\n .map((field) => `${field.name}: ${describeType(field.type, depth)}`)\n return shown.join(', ') + (fields.length > MAX_FIELDS ? ', …' : '')\n}\n\nfunction describeType(type: SchemaType, depth: number): string {\n if (isReferenceType(type)) {\n return `reference to ${type.to.map((target) => target.name).join(' | ')}`\n }\n if (isArrayType(type)) {\n if (type.of.some(isBlockType)) return 'Portable Text (array of blocks)'\n return `array of ${type.of.map((member) => describeType(member, depth + 1)).join(' | ')}`\n }\n if (type.jsonType === 'object') {\n // Named object types such as `slug` or `image` are described by their fields too, since\n // queries reach into them (`slug.current`, `image.asset->url`)\n const fields = 'fields' in type ? type.fields : []\n if (depth >= MAX_DEPTH || fields.length === 0) return type.name\n return `${type.name} {${describeFields(fields, depth + 1)}}`\n }\n const values = listValues(type)\n return values ? `${type.name} (${values})` : type.name\n}\n\nfunction words(text: string): string[] {\n return text\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n}\n\nfunction singular(word: string): string {\n if (word.length > 3 && word.endsWith('ies')) return `${word.slice(0, -3)}y`\n if (/(?:ses|xes|zes|ches|shes)$/.test(word)) return word.slice(0, -2)\n if (word.endsWith('s') && !word.endsWith('ss')) return word.slice(0, -1)\n return word\n}\n\n/**\n * The workspace's document types for a prompt that writes GROQ: the types `request` seems to be\n * about (every word of the type's name or title appears in it, plurals included) with their\n * fields, the others by name\n */\nexport function summarizeSchema(schema: Schema, request: string): string {\n const requested = new Set(words(request).flatMap((word) => [word, singular(word)]))\n const mentions = (text: string | undefined) => {\n const textWords = text ? words(text) : []\n return textWords.length > 0 && textWords.every((word) => requested.has(word))\n }\n const names = getDocumentTypeNames(schema).filter((name) => !name.includes('.'))\n const detailed: string[] = []\n const others: string[] = []\n for (const name of names) {\n const type = schema.get(name)\n if (!type) continue\n if (detailed.length < MAX_DETAILED_TYPES && (mentions(name) || mentions(type.title))) {\n const fields = 'fields' in type ? type.fields : []\n const title = type.title && type.title !== name ? ` (${type.title})` : ''\n detailed.push(`- ${name}${title}: ${describeFields(fields, 1)}`)\n } else {\n others.push(name)\n }\n }\n const lines = [...detailed]\n if (others.length > 0) {\n lines.push(\n `${detailed.length > 0 ? 'Other document types' : 'Document types'}: ${others.join(', ')}`,\n )\n }\n return lines.join('\\n')\n}\n","import {LaunchIcon} from '@sanity/icons/Launch'\nimport {Button, Card, Stack, Text} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport {useNumberFormat, useProjectStore, useTranslation} from 'sanity'\nimport {Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport {\n AI_CREDITS_DOCS_URL,\n type AiCredits,\n aiSpendingLimitUrl,\n aiUsageUrl,\n} from '../util/aiCredits'\n\nexport interface AiCreditsStatusProps {\n /** The credits as last read, or as the response that turned a request down reported them */\n credits: AiCredits | undefined\n /** The project's API host, which says which Sanity website Manage is on */\n apiHost: string | undefined\n /** Text size of the note; the card has its own */\n size?: 0 | 1\n}\n\n/** The ID of the organization the project belongs to, for links to its pages in Manage */\nfunction useOrganizationId(): string | null {\n const projectStore = useProjectStore()\n const organizationId$ = useMemo(() => projectStore.getOrganizationId(), [projectStore])\n return useObservable(organizationId$, null)\n}\n\ninterface AiCreditsNoteProps {\n used: number\n quota: number | undefined\n apiHost: string | undefined\n size: 0 | 1\n}\n\n/** How many credits are left this month, with a link to the organization's AI usage in Manage */\nfunction AiCreditsNote({used, quota, apiHost, size}: AiCreditsNoteProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const numberFormat = useNumberFormat()\n const organizationId = useOrganizationId()\n const format = (value: number) => numberFormat.format(value)\n\n let note: string\n if (quota === undefined) {\n note = t('vista.ai-credits.used', {used: format(used)})\n } else if (used > quota) {\n note = t('vista.ai-credits.deficit', {\n used: format(used),\n deficit: format(used - quota),\n quota: format(quota),\n })\n } else {\n note = t('vista.ai-credits.balance', {balance: format(quota - used), quota: format(quota)})\n }\n\n return (\n <Text data-testid=\"vista-ai-credits\" muted size={size}>\n {note}{' '}\n <a href={aiUsageUrl(apiHost, organizationId)} rel=\"noreferrer\" target=\"_blank\">\n {t('vista.ai-credits.usage')}\n </a>\n </Text>\n )\n}\n\ninterface AiCreditsLimitCardProps {\n credits: AiCredits\n apiHost: string | undefined\n}\n\n/**\n * The organization is out of AI credits: what that means, and where the limit is raised. Agent\n * Actions turn every request down until then, so this stands where their result would.\n */\nfunction AiCreditsLimitCard({credits, apiHost}: AiCreditsLimitCardProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const numberFormat = useNumberFormat()\n const organizationId = useOrganizationId()\n const {used, quota} = credits\n\n return (\n <Card border data-testid=\"vista-ai-credits-limit\" padding={3} radius={2}>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.ai-credits.limit.title')}\n </Text>\n <Text muted size={1}>\n {used === undefined || quota === undefined\n ? t('vista.ai-credits.limit.description-unknown')\n : t('vista.ai-credits.limit.description', {\n used: numberFormat.format(used),\n quota: numberFormat.format(quota),\n })}\n </Text>\n <Flex gap={2} justifyContent=\"flex-end\">\n <Button\n as=\"a\"\n fontSize={1}\n href={AI_CREDITS_DOCS_URL}\n iconRight={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.learn-more')}\n />\n <Button\n as=\"a\"\n data-testid=\"vista-ai-credits-manage\"\n fontSize={1}\n href={aiSpendingLimitUrl(apiHost, organizationId)}\n padding={2}\n rel=\"noreferrer\"\n target=\"_blank\"\n text={t('vista.ai-credits.limit.manage')}\n tone=\"primary\"\n />\n </Flex>\n </Stack>\n </Card>\n )\n}\n\n/**\n * What the organization's AI credits mean for the Agent Actions control this stands under:\n * nothing while they are unknown, how many are left while requests go through, and the way to\n * more of them once the spending limit is reached\n */\nexport function AiCreditsStatus({credits, apiHost, size = 1}: AiCreditsStatusProps) {\n if (!credits) return null\n if (!credits.granted) return <AiCreditsLimitCard apiHost={apiHost} credits={credits} />\n if (credits.used === undefined) return null\n return <AiCreditsNote apiHost={apiHost} quota={credits.quota} size={size} used={credits.used} />\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Button, TextInput} from '@sanity/ui'\nimport {type KeyboardEvent} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../i18n'\n\nexport interface PromptRowProps {\n label: string\n placeholder: string\n value: string\n onChange: (value: string) => void\n onSubmit: () => void\n onClose: () => void\n /** While generating, the field and the button wait */\n pending: boolean\n /** `-request` and `-submit` are added for the field and the button */\n testIdPrefix: string\n}\n\n/** A description to generate from, with the button that generates: Enter submits, Escape closes */\nexport function PromptRow(props: PromptRowProps) {\n const {label, placeholder, value, onChange, onSubmit, onClose, pending, testIdPrefix} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onClose()\n } else if (event.key === 'Enter' && !pending) {\n event.preventDefault()\n onSubmit()\n }\n }\n return (\n <Flex alignItems=\"center\" gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <TextInput\n aria-label={label}\n // Password managers ignore `autoComplete`, so each of them also gets its own opt-out\n autoComplete=\"off\"\n autoFocus\n data-1p-ignore\n data-bwignore\n data-form-type=\"other\"\n data-lpignore=\"true\"\n data-testid={`${testIdPrefix}-request`}\n disabled={pending}\n fontSize={1}\n icon={SparklesIcon}\n onChange={(event) => onChange(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n padding={2}\n placeholder={placeholder}\n value={value}\n />\n </Box>\n <Button\n data-testid={`${testIdPrefix}-submit`}\n disabled={!value.trim() || pending}\n fontSize={1}\n loading={pending}\n onClick={onSubmit}\n padding={2}\n text={t('vista.generate.submit')}\n tone=\"primary\"\n />\n <Button\n aria-label={t('vista.generate.close')}\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={2}\n />\n </Flex>\n )\n}\n","import {type SanityClient} from '@sanity/client'\nimport {Button, Card, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useCallback, useEffect, useRef, useState} from 'react'\nimport {type Schema, useSchema, useTranslation} from 'sanity'\nimport {Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {reportAiCreditsGranted, reportAiCreditsLimit, useAiCredits} from '../../hooks/useAiCredits'\nimport {type VistaTab} from '../../store/types'\nimport {useVistaActor} from '../../store/VistaActorContext'\nimport {type AiCredits, readAiCreditsLimit} from '../../util/aiCredits'\nimport {\n type GeneratedQuery,\n generateQuery,\n GenerateQueryError,\n MAX_GENERATE_ATTEMPTS,\n} from '../../util/generateQuery'\nimport {summarizeSchema} from '../../util/schemaSummary'\nimport {AiCreditsStatus} from '../AiCreditsStatus'\nimport {PromptRow} from '../PromptRow'\n\ntype GenerateStatus =\n | {type: 'idle'}\n | {type: 'generating'; attempt: number}\n | {\n type: 'failed'\n message: string\n lastAttempt: GeneratedQuery | undefined\n /** The credits the request was turned down for, when that is what failed */\n limit: AiCredits | undefined\n }\n\nexport interface GenerateQueryBarProps {\n tab: VistaTab\n /** The tab's client: attempts are checked with its dataset, API version and perspective */\n client: SanityClient\n /** Formats the generated query for the query editor, as Prettify does */\n formatForEditor: (query: string) => Promise<string>\n onClose: () => void\n}\n\n/**\n * Writes a query from a description with Agent Actions, above the query editor. The query\n * replaces the tab's query and params, and runs.\n */\nexport function GenerateQueryBar({tab, client, formatForEditor, onClose}: GenerateQueryBarProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const schema = useSchema() as Schema | undefined\n const [request, setRequest] = useState('')\n const [status, setStatus] = useState<GenerateStatus>({type: 'idle'})\n const controllerRef = useRef<AbortController | null>(null)\n const credits = useAiCredits(client)\n\n useEffect(() => () => controllerRef.current?.abort(), [])\n\n // The editors replace their content in one undoable step, so undo brings back what the tab had;\n // the query is formatted first so that step is the only one. Undo does not bring back a title,\n // so only an empty tab without one is named after the description: a title the tab was given\n // stays, and one derived from its query goes on following the query.\n const open = useCallback(\n async (generated: GeneratedQuery, fetch: boolean, signal?: AbortSignal) => {\n const query = await formatForEditor(generated.query).catch(() => generated.query)\n if (signal?.aborted) return\n const named = tab.title === undefined && !tab.query.trim()\n actorRef.send({\n type: 'tab.load',\n id: tab.id,\n tab: {\n query,\n rawParams: JSON.stringify(generated.params, null, 2),\n ...(named ? {title: generated.title} : {}),\n },\n fetch: fetch ? 'generated' : undefined,\n })\n onClose()\n },\n [actorRef, formatForEditor, onClose, tab.id, tab.query, tab.title],\n )\n\n const generate = useCallback(async () => {\n const description = request.trim()\n if (!description) return\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n setStatus({type: 'generating', attempt: 1})\n try {\n const generated = await generateQuery({\n request: description,\n schema: schema ? summarizeSchema(schema, description) : '',\n client,\n signal: controller.signal,\n onAttempt: (attempt) => setStatus({type: 'generating', attempt}),\n })\n reportAiCreditsGranted(client)\n await open(generated, true, controller.signal)\n } catch (error) {\n if (controller.signal.aborted) return\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(client, limit)\n setStatus({\n type: 'failed',\n message: error instanceof Error ? error.message : String(error),\n lastAttempt: error instanceof GenerateQueryError ? error.lastAttempt : undefined,\n limit,\n })\n }\n }, [client, open, request, schema])\n\n const generating = status.type === 'generating'\n const lastAttempt = status.type === 'failed' ? status.lastAttempt : undefined\n // The credits as the failed request reported them, or as last read while nothing is going on\n const shownCredits =\n status.type === 'failed' ? status.limit : status.type === 'idle' ? credits : undefined\n const atLimit = shownCredits?.granted === false\n\n return (\n <Card borderBottom data-testid=\"vista-generate-bar\" padding={2}>\n <Stack gap={2}>\n <PromptRow\n label={t('vista.generate.label')}\n onChange={setRequest}\n onClose={onClose}\n onSubmit={() => void generate()}\n pending={generating}\n placeholder={t('vista.generate.placeholder')}\n testIdPrefix=\"vista-generate\"\n value={request}\n />\n {status.type === 'idle' && !atLimit && (\n <Text muted size={0}>\n {t('vista.generate.description')}\n </Text>\n )}\n {status.type === 'generating' && (\n <Text data-testid=\"vista-generate-progress\" muted size={1}>\n {status.attempt > 1\n ? t('vista.generate.progress-retry', {\n attempt: status.attempt,\n max: MAX_GENERATE_ATTEMPTS,\n })\n : t('vista.generate.progress')}\n </Text>\n )}\n {status.type === 'failed' && !atLimit && (\n <Card data-testid=\"vista-generate-error\" padding={3} radius={2} tone=\"critical\">\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.generate.failed')}\n </Text>\n <Text size={1}>{status.message}</Text>\n {lastAttempt && (\n <>\n <Code size={1}>{lastAttempt.query}</Code>\n <Flex>\n <Button\n data-testid=\"vista-generate-open-anyway\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => void open(lastAttempt, false)}\n padding={2}\n text={t('vista.generate.open-anyway')}\n />\n </Flex>\n </>\n )}\n </Stack>\n </Card>\n )}\n <AiCreditsStatus apiHost={client.config().apiHost} credits={shownCredits} size={0} />\n </Stack>\n </Card>\n )\n}\n","import {StopIcon} from '@sanity/icons/Stop'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useId} from 'react'\nimport {useTranslation} from 'sanity'\nimport {VisuallyHidden} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\n\nexport interface LiveButtonProps {\n /** The tab refetches automatically */\n active: boolean\n /** The tab's API version has sync tags, which automatic refetching follows */\n supported: boolean\n /** There is a request to fetch, as for the Fetch button */\n canFetch: boolean\n onToggle: () => void\n}\n\n/**\n * Live fetch, an alternative to Fetch: fetches the query, then fetches again whenever the\n * documents in the result change (through the Live Content API's sync tags), until Stop live\n */\nexport function LiveButton({active, supported, canFetch, onToggle}: LiveButtonProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const hintId = useId()\n const live = active && supported\n const label = live ? t('vista.live.stop') : t('vista.live.button')\n let tooltip = t('vista.query.auto-refetch.unsupported')\n if (supported) tooltip = live ? t('vista.live.button.stop') : t('vista.live.button.start')\n const unavailable = !supported\n\n return (\n <Tooltip animate content={<Text size={1}>{tooltip}</Text>} placement=\"top\" portal>\n {/*\n A disabled button gets neither pointer events nor focus, so while the API version has no\n sync tags the wrapper stands in for it, as a disabled button described by the reason\n */}\n <span\n aria-describedby={unavailable ? hintId : undefined}\n aria-disabled={unavailable || undefined}\n aria-label={unavailable ? label : undefined}\n role={unavailable ? 'button' : undefined}\n tabIndex={unavailable ? 0 : undefined}\n >\n <Button\n aria-hidden={unavailable || undefined}\n data-testid=\"vista-auto-refetch\"\n // Like Fetch it needs something to fetch, but a running session can always be stopped\n disabled={unavailable || (!live && !canFetch)}\n gap={2}\n icon={live ? StopIcon : SyncIcon}\n mode={live ? 'default' : 'ghost'}\n onClick={onToggle}\n padding={2}\n text={label}\n tone={live ? 'critical' : 'default'}\n />\n {unavailable && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>}\n </span>\n </Tooltip>\n )\n}\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Button, Card, Stack, Text} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\nimport {Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../i18n'\n\nexport interface CdnBlockedNoticeProps {\n testId: string\n /** The tab's perspective as the perspective select names it */\n perspectiveName: string\n /** Switches the tab to the published perspective, which the API CDN serves */\n onUsePublished?: () => void\n}\n\n/** Says that the API CDN is asked for but not used, because of the tab's perspective */\nexport function CdnBlockedNotice({testId, perspectiveName, onUsePublished}: CdnBlockedNoticeProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n return (\n <Card border data-testid={testId} padding={3} radius={2} tone=\"caution\">\n <Flex gap={3}>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n <Stack flex={1} gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.options.use-cdn.blocked.title')}\n </Text>\n <Text size={1}>{t('vista.options.use-cdn.blocked', {perspective: perspectiveName})}</Text>\n {onUsePublished && (\n <Flex>\n <Button\n data-testid={`${testId}-use-published`}\n fontSize={1}\n mode=\"ghost\"\n onClick={onUsePublished}\n padding={2}\n text={t('vista.options.use-cdn.use-published')}\n />\n </Flex>\n )}\n </Stack>\n </Flex>\n </Card>\n )\n}\n","import {Stack} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\nimport {Box} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {type VistaTabOptions} from '../../store/types'\nimport {useVistaSelector} from '../../store/VistaActorContext'\nimport {selectDatasets, selectWorkspaceDataset} from '../../store/vistaMachine'\nimport {CdnBlockedNotice} from '../CdnBlockedNotice'\nimport {SwitchField} from '../SwitchField'\nimport * as styles from '../vista.module.css'\nimport {\n ApiVersionField,\n DatasetField,\n PerspectiveSelect,\n UseCdnField,\n usePerspectiveOptionName,\n VariantSelect,\n} from './OptionFields'\n\nexport interface OptionsPanelProps {\n options: VistaTabOptions\n resolved: ResolvedRequest\n onChange: (options: Partial<VistaTabOptions>) => void\n}\n\nexport function OptionsPanel({options, resolved, onChange}: OptionsPanelProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const datasets = useVistaSelector(selectDatasets)\n const workspaceDataset = useVistaSelector(selectWorkspaceDataset)\n const perspectiveName = usePerspectiveOptionName(resolved.tabPerspective)\n\n return (\n <Box data-testid=\"vista-options\" padding={3}>\n <Stack gap={4}>\n <div className={styles.optionsGrid}>\n <DatasetField\n dataset={options.dataset}\n datasets={datasets}\n id=\"vista-option-dataset\"\n mode={options.datasetMode}\n onChange={onChange}\n workspaceDataset={workspaceDataset}\n />\n <ApiVersionField\n id=\"vista-option-api-version\"\n locked={resolved.isApiVersionLocked}\n onChange={(apiVersion) => onChange({apiVersion})}\n value={options.apiVersion}\n />\n <PerspectiveSelect\n id=\"vista-option-perspective\"\n onChange={(perspective) => onChange({perspective})}\n value={options.perspective}\n />\n <VariantSelect\n id=\"vista-option-variant\"\n onChange={(variant) => onChange({variant})}\n value={options.variant}\n />\n </div>\n <SwitchField\n checked={options.includeSourceMap}\n description={t('vista.options.include-source-map.description')}\n onChange={(includeSourceMap) => onChange({includeSourceMap})}\n testId=\"vista-option-source-map\"\n title={t('vista.options.include-source-map')}\n />\n <UseCdnField\n checked={options.useCdn}\n notes={resolved.isCdnAnonymous ? [t('vista.options.use-cdn.anonymous')] : []}\n onChange={(useCdn) => onChange({useCdn})}\n testId=\"vista-option-use-cdn\"\n />\n {resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n onUsePublished={() => onChange({perspective: 'published'})}\n perspectiveName={perspectiveName}\n testId=\"vista-option-use-cdn-blocked\"\n />\n )}\n </Stack>\n </Box>\n )\n}\n","import {type ExprNode, parse, type SchemaType, typeEvaluate, type TypeNode, unparse} from 'groq-js'\n\nimport {parseGroq, readQueryFunctions} from './groqFunctions'\n\n/** What a param's value is, as far as the query (and the schema) tell */\nexport type ParamKind = 'string' | 'number' | 'integer' | 'boolean' | 'any'\n\n/** What the strings of a `string` param stand for, for the hint and the input helpers */\nexport type ParamFormat = 'document-type' | 'document-id' | 'datetime'\n\nexport interface ParamType {\n kind: ParamKind\n /** The param holds a list of `kind` values (`_type in $types`) */\n array: boolean\n /** The values the schema allows, offered as suggestions; others can still be entered */\n options?: string[]\n format?: ParamFormat\n}\n\nexport interface InferredParam {\n name: string\n type: ParamType\n /** The expressions that use the param, as GROQ */\n usages: string[]\n}\n\nexport interface ParamInference {\n /** In the order the query first mentions them */\n params: InferredParam[]\n /** The query does not parse: its params are found in its text, without types */\n syntaxError: boolean\n}\n\nexport interface InferParamsOptions {\n /** The workspace schema in groq-js form; without it the types come from the query alone */\n schema?: SchemaType\n /** The workspace's document type names, suggested for `_type == $param` without a schema */\n documentTypes?: string[]\n}\n\nconst ANY: ParamType = {kind: 'any', array: false}\nconst INTEGER: ParamType = {kind: 'integer', array: false}\nconst IDENTIFIER_START = /[A-Za-z_]/\nconst IDENTIFIER_PART = /[A-Za-z0-9_]/\n\n/**\n * The `$name`s in a query's text, outside string literals and comments, in order. Within a custom\n * function's declaration its own parameter is not one: the function's caller passes it.\n */\nexport function findParamNames(query: string): string[] {\n const {declarations} = readQueryFunctions(parseGroq(query), query)\n const isFunctionParameter = (name: string, at: number) =>\n declarations.some(\n ({range, parameters}) =>\n at >= range.from &&\n at < range.to &&\n parameters.some((parameter) => parameter.name === `$${name}`),\n )\n const names = new Set<string>()\n let index = 0\n while (index < query.length) {\n const char = query[index]\n if (char === '\"' || char === \"'\") {\n index++\n while (index < query.length && query[index] !== char) {\n index += query[index] === '\\\\' ? 2 : 1\n }\n index++\n } else if (char === '/' && query[index + 1] === '/') {\n const lineEnd = query.indexOf('\\n', index)\n index = lineEnd === -1 ? query.length : lineEnd\n } else if (char === '$' && IDENTIFIER_START.test(query[index + 1] ?? '')) {\n let end = index + 2\n while (end < query.length && IDENTIFIER_PART.test(query[end])) end++\n const name = query.slice(index + 1, end)\n if (!isFunctionParameter(name, index)) names.add(name)\n index = end\n } else {\n index++\n }\n }\n return [...names]\n}\n\n// groq-js evaluates slice bounds while parsing, so a query with `[0...$limit]` only parses with\n// params; given ones replace their `Parameter` nodes with these numbers, which the slices keep\nconst SENTINEL_BASE = 2 ** 42\n\nfunction sentinelParams(names: Iterable<string>): Record<string, number> {\n const params: Record<string, number> = {}\n let index = 0\n for (const name of names) params[name] = SENTINEL_BASE + index++\n return params\n}\n\nfunction isNode(value: unknown): value is ExprNode {\n return (\n typeof value === 'object' && value !== null && typeof Reflect.get(value, 'type') === 'string'\n )\n}\n\nfunction forEachChild(node: ExprNode, visit: (child: ExprNode) => void) {\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const item of value) if (isNode(item)) visit(item)\n } else if (isNode(value)) {\n visit(value)\n }\n }\n}\n\nfunction forEachNode(node: ExprNode, visit: (node: ExprNode) => void) {\n visit(node)\n forEachChild(node, (child) => forEachNode(child, visit))\n}\n\nfunction boundText(bound: number, sentinels: Map<number, string>): string {\n const name = sentinels.get(bound)\n return name === undefined ? String(bound) : `$${name}`\n}\n\n/** Params used as slice bounds, with the slice written out (the params are numbers in the AST) */\nfunction findSliceParams(query: string, names: string[]): Map<string, string> {\n const slices = new Map<string, string>()\n const params = sentinelParams(names)\n const sentinels = new Map(Object.entries(params).map(([name, value]) => [value, name]))\n let ast: ExprNode\n try {\n ast = parse(query, {params})\n } catch {\n return slices\n }\n forEachNode(ast, (node) => {\n if (node.type !== 'Slice') return\n const text = `[${boundText(node.left, sentinels)}${node.isInclusive ? '..' : '...'}${boundText(node.right, sentinels)}]`\n for (const bound of [node.left, node.right]) {\n const name = sentinels.get(bound)\n if (name !== undefined && !slices.has(name)) slices.set(name, text)\n }\n })\n return slices\n}\n\n/** Where `@` points while an expression is evaluated */\ninterface Scope {\n /** An expression for the array whose elements `@` stands for; none at the top level */\n elements: ExprNode | undefined\n /** Those elements are documents (`*`, filtered, ordered or sliced) */\n documents: boolean\n}\n\nconst ROOT_SCOPE: Scope = {elements: undefined, documents: false}\n\nfunction isDocuments(node: ExprNode): boolean {\n switch (node.type) {\n case 'Everything':\n return true\n case 'Filter':\n case 'Slice':\n case 'PipeFuncCall':\n case 'Group':\n return isDocuments(node.base)\n default:\n return false\n }\n}\n\n/** How the param relates to the expression next to it */\ntype Relation =\n /** `operand == $param`, `operand > $param`, `operand + $param` */\n | 'value'\n /** `$param in operand` */\n | 'element'\n /** `operand in $param` */\n | 'list'\n\ninterface Usage {\n name: string\n text: string\n type: ParamType | undefined\n}\n\nconst COMPARISONS = new Set(['==', '!=', '<', '<=', '>', '>=', '+', '-', '*', '/', '%', '**'])\n\nconst FUNCTION_ARGUMENTS: Record<string, ParamType> = {\n 'global::references': {kind: 'string', array: false, format: 'document-id'},\n 'global::dateTime': {kind: 'string', array: false, format: 'datetime'},\n 'global::lower': {kind: 'string', array: false},\n 'global::upper': {kind: 'string', array: false},\n 'global::path': {kind: 'string', array: false},\n 'global::round': {kind: 'number', array: false},\n 'string::startsWith': {kind: 'string', array: false},\n 'string::split': {kind: 'string', array: false},\n}\n\nfunction describe(node: ExprNode, fallback: string): string {\n try {\n return unparse(node).replaceAll('global::', '')\n } catch {\n return fallback\n }\n}\n\nfunction withoutNull(node: TypeNode): TypeNode[] {\n if (node.type === 'union') return node.of.flatMap(withoutNull)\n return node.type === 'null' ? [] : [node]\n}\n\n/** The type of the elements of an array type (or of a union of array types) */\nfunction elementType(node: TypeNode): TypeNode {\n const members = withoutNull(node).map((member) =>\n member.type === 'array' ? member.of : {type: 'unknown' as const},\n )\n if (members.length === 1) return members[0]\n return members.length === 0 ? {type: 'unknown'} : {type: 'union', of: members}\n}\n\n/** The param type for a value of `node`'s type, when it is one a form can offer */\nfunction fromTypeNode(node: TypeNode): ParamType | undefined {\n const members = withoutNull(node)\n if (members.length === 0) return undefined\n if (members.every((member) => member.type === 'string')) {\n const values = members.map((member) => (member.type === 'string' ? member.value : undefined))\n const options = values.every((value) => value !== undefined)\n ? [...new Set(values)].toSorted()\n : undefined\n return {kind: 'string', array: false, options}\n }\n if (members.every((member) => member.type === 'number')) return {kind: 'number', array: false}\n if (members.every((member) => member.type === 'boolean')) return {kind: 'boolean', array: false}\n if (members.length === 1 && members[0].type === 'array') {\n const element = fromTypeNode(members[0].of)\n return element && !element.array ? {...element, array: true} : undefined\n }\n return undefined\n}\n\nfunction fromSchema(\n relation: Relation,\n operand: ExprNode,\n scope: Scope,\n schema: SchemaType,\n): ParamType | undefined {\n let node: TypeNode\n try {\n node = scope.elements\n ? elementType(typeEvaluate({type: 'Map', base: scope.elements, expr: operand}, schema))\n : typeEvaluate(operand, schema)\n } catch {\n return undefined\n }\n if (relation === 'element') return fromTypeNode(elementType(node))\n const type = fromTypeNode(node)\n if (relation === 'list') return type && !type.array ? {...type, array: true} : undefined\n return type\n}\n\n/** What the expression next to a param says about it, without a schema */\nfunction fromQuery(\n operand: ExprNode,\n scope: Scope,\n documentTypes: string[],\n): ParamType | undefined {\n switch (operand.type) {\n case 'AccessAttribute': {\n const own = !operand.base || operand.base.type === 'This'\n if (operand.name === '_type' && own) {\n return scope.documents && documentTypes.length > 0\n ? {kind: 'string', array: false, options: documentTypes, format: 'document-type'}\n : {kind: 'string', array: false}\n }\n if (operand.name === '_ref' || (operand.name === '_id' && own)) {\n return {kind: 'string', array: false, format: 'document-id'}\n }\n if ((operand.name === '_createdAt' || operand.name === '_updatedAt') && own) {\n return {kind: 'string', array: false, format: 'datetime'}\n }\n if ((operand.name === '_rev' || operand.name === '_key') && own) {\n return {kind: 'string', array: false}\n }\n return undefined\n }\n case 'FuncCall': {\n const name = `${operand.namespace}::${operand.name}`\n if (name === 'global::count' || name === 'global::length')\n return {kind: 'number', array: false}\n if (name === 'global::dateTime' || name === 'global::now') {\n return {kind: 'string', array: false, format: 'datetime'}\n }\n if (name === 'global::lower' || name === 'global::upper')\n return {kind: 'string', array: false}\n return undefined\n }\n case 'Value':\n if (typeof operand.value === 'string') return {kind: 'string', array: false}\n if (typeof operand.value === 'number') return {kind: 'number', array: false}\n if (typeof operand.value === 'boolean') return {kind: 'boolean', array: false}\n return undefined\n default:\n return undefined\n }\n}\n\nfunction resolve(\n relation: Relation,\n operand: ExprNode,\n scope: Scope,\n options: InferParamsOptions,\n): ParamType | undefined {\n const queried = fromQuery(operand, scope, options.documentTypes ?? [])\n let heuristic: ParamType | undefined\n if (relation === 'value') {\n heuristic = queried\n } else if (relation === 'list' && queried && !queried.array) {\n heuristic = {...queried, array: true}\n }\n const schematic = options.schema\n ? fromSchema(relation, operand, scope, options.schema)\n : undefined\n if (!schematic) return heuristic\n // The schema knows the values; the query still tells what they are (a date, a document type)\n return heuristic && heuristic.kind === schematic.kind\n ? {...schematic, format: heuristic.format}\n : schematic\n}\n\nfunction collectUsages(ast: ExprNode, options: InferParamsOptions): Usage[] {\n const usages: Usage[] = []\n const handled = new Set<ExprNode>()\n\n const report = (param: ExprNode, context: ExprNode, type: ParamType | undefined) => {\n if (param.type !== 'Parameter') return\n handled.add(param)\n usages.push({name: param.name, text: describe(context, `$${param.name}`), type})\n }\n\n const inspect = (node: ExprNode, scope: Scope) => {\n switch (node.type) {\n case 'OpCall': {\n const {left, right, op} = node\n if (op === 'in') {\n if (left.type === 'Parameter' && right.type !== 'Parameter') {\n report(left, node, resolve('element', right, scope, options))\n } else if (right.type === 'Parameter' && left.type !== 'Parameter') {\n report(right, node, resolve('list', left, scope, options))\n }\n } else if (op === 'match') {\n const type: ParamType = {kind: 'string', array: false}\n report(left, node, type)\n report(right, node, type)\n } else if (COMPARISONS.has(op)) {\n if (right.type === 'Parameter' && left.type !== 'Parameter') {\n report(right, node, resolve('value', left, scope, options))\n } else if (left.type === 'Parameter' && right.type !== 'Parameter') {\n report(left, node, resolve('value', right, scope, options))\n }\n }\n break\n }\n case 'InRange':\n report(node.left, node, resolve('value', node.base, scope, options))\n report(node.right, node, resolve('value', node.base, scope, options))\n break\n case 'FuncCall': {\n const type = FUNCTION_ARGUMENTS[`${node.namespace}::${node.name}`]\n if (type) for (const arg of node.args) report(arg, node, type)\n break\n }\n case 'And':\n case 'Or':\n report(node.left, node, {kind: 'boolean', array: false})\n report(node.right, node, {kind: 'boolean', array: false})\n break\n case 'Not':\n report(node.base, node, {kind: 'boolean', array: false})\n break\n case 'Select':\n for (const alternative of node.alternatives) {\n report(alternative.condition, node, {kind: 'boolean', array: false})\n }\n break\n default:\n break\n }\n }\n\n const visit = (node: ExprNode, scope: Scope, parent: ExprNode | undefined) => {\n inspect(node, scope)\n if (node.type === 'Parameter') {\n if (!handled.has(node)) report(node, parent ?? node, undefined)\n return\n }\n switch (node.type) {\n case 'Filter':\n visit(node.base, scope, node)\n visit(node.expr, {elements: node, documents: isDocuments(node.base)}, node)\n return\n case 'Map':\n case 'FlatMap':\n visit(node.base, scope, node)\n visit(node.expr, {elements: node.base, documents: isDocuments(node.base)}, node)\n return\n case 'PipeFuncCall':\n visit(node.base, scope, node)\n for (const arg of node.args) {\n visit(arg, {elements: node.base, documents: isDocuments(node.base)}, node)\n }\n return\n case 'Projection': {\n visit(node.base, scope, node)\n // Inside, `@` is the projected value: per element of the current scope, or on its own\n const projected: Scope =\n node.base.type === 'This'\n ? scope\n : {\n elements: scope.elements\n ? {type: 'Map', base: scope.elements, expr: node.base}\n : {\n type: 'Array',\n elements: [{type: 'ArrayElement', value: node.base, isSplat: false}],\n },\n documents: false,\n }\n visit(node.expr, projected, node)\n return\n }\n default:\n forEachChild(node, (child) => visit(child, scope, node))\n }\n }\n\n visit(ast, ROOT_SCOPE, undefined)\n return usages\n}\n\n/** One type for a param from all its usages: the first known kind, with the others' suggestions */\nfunction mergeTypes(types: ParamType[]): ParamType {\n const known = types.filter((type) => type.kind !== 'any')\n if (known.length === 0) return ANY\n const [first] = known\n const same = known.filter((type) => type.kind === first.kind && type.array === first.array)\n const optionLists = same.flatMap((type) => (type.options ? [type.options] : []))\n const options = optionLists.length > 0 ? [...new Set(optionLists.flat())].toSorted() : undefined\n const format = same.find((type) => type.format)?.format\n return {kind: first.kind, array: first.array, ...(options && {options}), ...(format && {format})}\n}\n\n/**\n * Finds the params a GROQ query uses and what each one is expected to hold, from how the query\n * uses it (`_type == $type`, `[0...$limit]`, `references($id)`, `$tag in tags[]`) and, given the\n * workspace schema, from the type of the expression it is compared with (typegen's evaluation).\n */\nexport function inferQueryParams(query: string, options: InferParamsOptions = {}): ParamInference {\n const names = findParamNames(query)\n if (names.length === 0) return {params: [], syntaxError: false}\n\n const slices = findSliceParams(query, names)\n let ast: ExprNode\n try {\n ast = parse(query, {params: sentinelParams(slices.keys())})\n } catch {\n return {\n params: names.map((name) => {\n const slice = slices.get(name)\n return {name, type: slice ? INTEGER : ANY, usages: slice ? [slice] : []}\n }),\n syntaxError: true,\n }\n }\n\n const usages = collectUsages(ast, options)\n return {\n params: names.map((name) => {\n const own = usages.filter((usage) => usage.name === name)\n const slice = slices.get(name)\n const types = own.flatMap((usage) => (usage.type ? [usage.type] : []))\n return {\n name,\n type: slice ? INTEGER : mergeTypes(types),\n usages: [...new Set([...(slice ? [slice] : []), ...own.map((usage) => usage.text)])],\n }\n }),\n syntaxError: false,\n }\n}\n","import {type ObjectAttribute, type ObjectTypeNode, type TypeNode} from 'groq-js'\n\n/**\n * Infers a groq-js type node from a fetched value. Used when the query cannot be evaluated\n * against the schema. Arrays of objects are merged into one object type per `_type` literal,\n * with attributes that only some items carry marked optional.\n */\nexport function inferTypeFromValue(value: unknown): TypeNode {\n if (value === null) {\n return {type: 'null'}\n }\n switch (typeof value) {\n case 'string':\n return {type: 'string'}\n case 'number':\n return {type: 'number'}\n case 'boolean':\n return {type: 'boolean'}\n case 'object':\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return {type: 'array', of: {type: 'unknown'}}\n }\n return {type: 'array', of: mergeTypeNodes(value.map(inferTypeFromValue))}\n }\n return inferObject(value as Record<string, unknown>)\n default:\n return {type: 'unknown'}\n }\n}\n\n// Null-prototype maps: a projection may legitimately be keyed \"__proto__\"\nfunction createAttributeMap(): Record<string, ObjectAttribute> {\n return Object.create(null) as Record<string, ObjectAttribute>\n}\n\nfunction inferObject(value: Record<string, unknown>): ObjectTypeNode {\n const attributes = createAttributeMap()\n for (const [key, attributeValue] of Object.entries(value)) {\n const inferred = inferTypeFromValue(attributeValue)\n attributes[key] = {\n type: 'objectAttribute',\n // `_type` discriminates unions of documents and blocks, so its literal is worth keeping\n value:\n key === '_type' && typeof attributeValue === 'string'\n ? {type: 'string', value: attributeValue}\n : inferred,\n }\n }\n return {type: 'object', attributes}\n}\n\nfunction objectDiscriminator(node: ObjectTypeNode): string {\n const typeAttribute = node.attributes._type?.value\n return typeAttribute?.type === 'string' && typeAttribute.value !== undefined\n ? `_type:${typeAttribute.value}`\n : ''\n}\n\n/** Combines the types of sibling values (array items, or the same attribute across items) */\nexport function mergeTypeNodes(nodes: TypeNode[]): TypeNode {\n const flattened = nodes.flatMap((node) => (node.type === 'union' ? node.of : [node]))\n const members: TypeNode[] = []\n const objects = new Map<string, ObjectTypeNode[]>()\n const arrays: TypeNode[] = []\n const seenPrimitives = new Set<string>()\n\n for (const node of flattened) {\n if (node.type === 'object') {\n const key = objectDiscriminator(node)\n const group = objects.get(key)\n if (group) group.push(node)\n else objects.set(key, [node])\n continue\n }\n if (node.type === 'array') {\n arrays.push(node.of)\n continue\n }\n const key = node.type === 'inline' ? `inline:${node.name}` : node.type\n if (!seenPrimitives.has(key)) {\n seenPrimitives.add(key)\n members.push(node)\n }\n }\n\n for (const group of objects.values()) {\n members.push(mergeObjectNodes(group))\n }\n if (arrays.length > 0) {\n const itemTypes = arrays.filter((node) => node.type !== 'unknown')\n members.push({\n type: 'array',\n of: itemTypes.length > 0 ? mergeTypeNodes(itemTypes) : {type: 'unknown'},\n })\n }\n\n if (members.length === 0) {\n return {type: 'unknown'}\n }\n if (members.length === 1) {\n return members[0]\n }\n // `null` reads best at the end of a union\n members.sort((a, b) => Number(a.type === 'null') - Number(b.type === 'null'))\n return {type: 'union', of: members}\n}\n\nfunction mergeObjectNodes(nodes: ObjectTypeNode[]): ObjectTypeNode {\n if (nodes.length === 1) {\n return nodes[0]\n }\n // One pass over every attribute of every item, so items that mostly carry distinct keys\n // (keyed maps, per-locale dictionaries) cost their size and not size × keys; the keys keep the\n // order of their first appearance\n const collected = new Map<string, {values: TypeNode[]; optional: boolean}>()\n for (const node of nodes) {\n for (const key of Object.keys(node.attributes)) {\n const attribute = node.attributes[key]\n const entry = collected.get(key)\n if (entry) {\n entry.values.push(attribute.value)\n if (attribute.optional) entry.optional = true\n } else {\n collected.set(key, {values: [attribute.value], optional: attribute.optional === true})\n }\n }\n }\n const attributes = createAttributeMap()\n for (const [key, {values, optional}] of collected) {\n const value = mergeTypeNodes(values)\n attributes[key] =\n optional || values.length < nodes.length\n ? {type: 'objectAttribute', value, optional: true}\n : {type: 'objectAttribute', value}\n }\n return {type: 'object', attributes}\n}\n","import {extractSchema} from '@sanity/schema/_internal'\nimport {parse, type SchemaType, typeEvaluate, type TypeNode} from 'groq-js'\nimport {type Schema} from 'sanity'\n\nimport {inferTypeFromValue} from './inferTypeFromValue'\n\nconst groqSchemaCache = new WeakMap<Schema, SchemaType | Error>()\n\n/**\n * The workspace schema in groq-js form, extracted once per schema instance; a schema that cannot\n * be extracted throws the same error every time instead of being extracted again\n */\nexport function getGroqSchema(schema: Schema): SchemaType {\n let extracted = groqSchemaCache.get(schema)\n if (!extracted) {\n try {\n extracted = extractSchema(schema)\n } catch (err) {\n extracted = toError(err)\n }\n groqSchemaCache.set(schema, extracted)\n }\n if (extracted instanceof Error) throw extracted\n return extracted\n}\n\nexport type QueryTypeEvaluation =\n | {source: 'schema'; node: TypeNode; schema: SchemaType}\n | {source: 'result'; node: TypeNode; schema: undefined; schemaError: Error | undefined}\n | {source: 'none'; schemaError: Error | undefined}\n\nexport interface EvaluateQueryTypeOptions {\n query: string\n params: Record<string, unknown>\n schema: Schema | undefined\n /** Whether a result is available to fall back to (`null` is a valid result) */\n hasResult: boolean\n result: unknown\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Evaluates the type of a query the way `sanity typegen` does, against the workspace schema.\n * Falls back to inferring a type from the fetched result when the schema evaluation fails or\n * yields nothing useful.\n */\nexport function evaluateQueryType(options: EvaluateQueryTypeOptions): QueryTypeEvaluation {\n let schemaError: Error | undefined\n\n if (options.schema && options.query.trim()) {\n try {\n const schema = getGroqSchema(options.schema)\n const node = typeEvaluate(parse(options.query, {params: options.params}), schema)\n if (node.type !== 'unknown') {\n return {source: 'schema', node, schema}\n }\n schemaError = new Error('The query evaluates to an unknown type against the schema')\n } catch (err) {\n schemaError = toError(err)\n }\n }\n\n if (options.hasResult) {\n return {\n source: 'result',\n node: inferTypeFromValue(options.result),\n schema: undefined,\n schemaError,\n }\n }\n\n return {source: 'none', schemaError}\n}\n","import {type SchemaType} from 'groq-js'\nimport {useMemo} from 'react'\nimport {type Schema, useSchema} from 'sanity'\n\nimport {getDocumentTypeNames} from '../util/documentTypes'\nimport {inferQueryParams, type ParamInference} from '../util/paramInference'\nimport {getGroqSchema} from '../util/typegen/evaluateQueryType'\n\nexport interface ParamsInference extends ParamInference {\n /** The workspace schema could not be read, so the types come from the query alone */\n schemaUnavailable: boolean\n}\n\n/** The params a query uses and their expected types, against the workspace schema when it can */\nexport function useParamsInference(query: string): ParamsInference {\n const schema = useSchema() as Schema | undefined\n const groqSchema = useMemo((): SchemaType | undefined => {\n if (!schema) return undefined\n try {\n return getGroqSchema(schema)\n } catch {\n return undefined\n }\n }, [schema])\n const documentTypes = useMemo(() => (schema ? getDocumentTypeNames(schema) : []), [schema])\n return useMemo(\n () => ({\n ...inferQueryParams(query, {schema: groqSchema, documentTypes}),\n schemaUnavailable: !groqSchema,\n }),\n [documentTypes, groqSchema, query],\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Button, Card, Select, Stack, Text, TextInput} from '@sanity/ui'\nimport {dequal} from 'dequal/lite'\nimport JSON5 from 'json5'\nimport {useId, useState} from 'react'\nimport {type TFunction, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {type Params} from '../../../components/VisionGui'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useParamsInference} from '../../hooks/useParamsInference'\nimport {type InferredParam, type ParamKind, type ParamType} from '../../util/paramInference'\n\ntype Translate = TFunction<typeof visionLocaleNamespace>\n\nexport interface ParamsFormProps {\n query: string\n params: Params\n /** Called with the params' new JSON */\n onChange: (rawParams: string) => void\n}\n\nfunction preview(value: unknown): string {\n const json = JSON.stringify(value) ?? String(value)\n return json.length > 40 ? `${json.slice(0, 39)}…` : json\n}\n\nfunction describeType(type: ParamType, t: Translate): string {\n let base: string\n switch (type.format ?? type.kind) {\n case 'document-type':\n base = t('vista.params-form.type.document-type')\n break\n case 'document-id':\n base = t('vista.params-form.type.document-id')\n break\n case 'datetime':\n base = t('vista.params-form.type.datetime')\n break\n case 'string':\n base = t('vista.params-form.type.string')\n break\n case 'number':\n base = t('vista.params-form.type.number')\n break\n case 'integer':\n base = t('vista.params-form.type.integer')\n break\n case 'boolean':\n base = t('vista.params-form.type.boolean')\n break\n default:\n base = t('vista.params-form.type.any')\n }\n if (type.options && type.format !== 'document-type') {\n base = t('vista.params-form.type.options', {type: base, count: type.options.length})\n }\n return type.array ? t('vista.params-form.type.list', {type: base}) : base\n}\n\n/** Why a value does not fit what the query expects; the form sends it anyway, for testing */\nfunction describeProblem(type: ParamType, value: unknown, t: Translate): string | undefined {\n if (type.array) {\n if (!Array.isArray(value)) return t('vista.params-form.invalid.list', {value: preview(value)})\n for (const item of value) {\n const problem = describeProblem({...type, array: false}, item, t)\n if (problem) return problem\n }\n return undefined\n }\n switch (type.kind) {\n case 'string':\n if (typeof value !== 'string') {\n return t('vista.params-form.invalid.string', {value: preview(value)})\n }\n if (type.options && !type.options.includes(value)) {\n return type.format === 'document-type'\n ? t('vista.params-form.invalid.document-type')\n : t('vista.params-form.invalid.option')\n }\n return undefined\n case 'integer':\n if (typeof value === 'number' && !Number.isInteger(value)) {\n return t('vista.params-form.invalid.integer')\n }\n return typeof value === 'number' ? undefined : t('vista.params-form.invalid.number')\n case 'number':\n return typeof value === 'number' ? undefined : t('vista.params-form.invalid.number')\n case 'boolean':\n return typeof value === 'boolean'\n ? undefined\n : t('vista.params-form.invalid.boolean', {value: preview(value)})\n default:\n return undefined\n }\n}\n\nfunction toText(value: unknown, kind: ParamKind): string {\n if (value === undefined) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' && kind !== 'any') return String(value)\n return JSON.stringify(value) ?? ''\n}\n\n/** What text typed into a field sends: a number where one is expected and given, else the text */\nfunction fromText(text: string, kind: ParamKind, empty: unknown): unknown {\n if (text === '') return empty\n if (kind === 'number' || kind === 'integer') {\n const number = Number(text)\n return text.trim() !== '' && Number.isFinite(number) ? number : text\n }\n // The items of a boolean list are typed in; a single boolean has its select\n if (kind === 'boolean' && (text === 'true' || text === 'false')) return text === 'true'\n if (kind === 'any') {\n try {\n return JSON5.parse(text)\n } catch {\n return text\n }\n }\n return text\n}\n\ninterface ValueInputProps {\n id?: string\n /** For inputs no label points at (list items) */\n label?: string\n kind: ParamKind\n listId: string | undefined\n value: unknown\n /** What an emptied input sends: nothing for a param, an empty string for a list item */\n empty: unknown\n disabled: boolean\n placeholder: string\n onChange: (value: unknown) => void\n}\n\nfunction ValueInput(props: ValueInputProps) {\n const {id, label, kind, listId, value, empty, disabled, placeholder, onChange} = props\n // The text as typed, for as long as it is what the param holds: \"1.\" or \"02\" read as numbers,\n // and showing the number instead would rewrite the text under the caret\n const [draft, setDraft] = useState<{text: string; value: unknown}>()\n const text = draft && dequal(draft.value, value) ? draft.text : toText(value, kind)\n\n return (\n <TextInput\n aria-label={label}\n disabled={disabled}\n fontSize={1}\n id={id}\n inputMode={kind === 'number' || kind === 'integer' ? 'decimal' : undefined}\n list={listId}\n onChange={(event) => {\n const next = event.currentTarget.value\n const nextValue = fromText(next, kind, empty)\n setDraft({text: next, value: nextValue})\n onChange(nextValue)\n }}\n placeholder={placeholder}\n value={text}\n />\n )\n}\n\nfunction BooleanInput(props: {\n id: string\n value: unknown\n isSet: boolean\n disabled: boolean\n onChange: (value: unknown) => void\n}) {\n const {id, value, isSet, disabled, onChange} = props\n const {t} = useTranslation(visionLocaleNamespace)\n let selected = ''\n if (typeof value === 'boolean') selected = String(value)\n else if (isSet) selected = 'other'\n return (\n <Select\n disabled={disabled}\n fontSize={1}\n id={id}\n onChange={(event) => {\n const next = event.currentTarget.value\n if (next === 'other') return\n onChange(next === '' ? undefined : next === 'true')\n }}\n value={selected}\n >\n <option value=\"\">{t('vista.params-form.not-set')}</option>\n <option value=\"true\">{String(true)}</option>\n <option value=\"false\">{String(false)}</option>\n {selected === 'other' && <option value=\"other\">{preview(value)}</option>}\n </Select>\n )\n}\n\nfunction ListInput(props: {\n param: InferredParam\n items: unknown[]\n listId: string | undefined\n disabled: boolean\n onChange: (value: unknown) => void\n}) {\n const {param, items, listId, disabled, onChange} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const {kind} = param.type\n return (\n <Stack gap={2}>\n {items.map((item, index) => (\n // Items have no identity of their own; an index keyed input shows the value it is given\n // oxlint-disable-next-line react/no-array-index-key\n <Flex alignItems=\"center\" gap={1} key={index}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <ValueInput\n disabled={disabled}\n empty=\"\"\n kind={kind}\n label={t('vista.params-form.item-label', {name: param.name, index: index + 1})}\n listId={listId}\n onChange={(value) => onChange(items.map((it, i) => (i === index ? value : it)))}\n placeholder={t('vista.params-form.item-placeholder')}\n value={item}\n />\n </Box>\n <Button\n aria-label={t('vista.params-form.remove-item')}\n disabled={disabled}\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onChange(items.filter((_, i) => i !== index))}\n padding={2}\n />\n </Flex>\n ))}\n <Flex>\n <Button\n data-testid={`vista-params-form-${param.name}-add`}\n disabled={disabled}\n fontSize={1}\n icon={AddIcon}\n mode=\"ghost\"\n onClick={() => onChange([...items, kind === 'number' || kind === 'integer' ? 0 : ''])}\n padding={2}\n text={t('vista.params-form.add-item')}\n />\n </Flex>\n </Stack>\n )\n}\n\nfunction ParamField(props: {\n param: InferredParam\n value: unknown\n isSet: boolean\n disabled: boolean\n onChange: (value: unknown) => void\n}) {\n const {param, value, isSet, disabled, onChange} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const inputId = useId()\n const listId = useId()\n const {type} = param\n const options = type.options && type.options.length > 0 ? type.options : undefined\n const problem = isSet ? describeProblem(type, value, t) : undefined\n\n let input\n if (type.kind === 'boolean' && !type.array) {\n input = (\n <BooleanInput\n disabled={disabled}\n id={inputId}\n isSet={isSet}\n onChange={onChange}\n value={value}\n />\n )\n } else if (type.array && (!isSet || Array.isArray(value))) {\n input = (\n <ListInput\n disabled={disabled}\n items={Array.isArray(value) ? value : []}\n listId={options && listId}\n onChange={onChange}\n param={param}\n />\n )\n } else {\n input = (\n <Flex alignItems=\"center\" gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <ValueInput\n disabled={disabled}\n empty={undefined}\n id={inputId}\n kind={type.array ? 'any' : type.kind}\n listId={options && listId}\n onChange={onChange}\n placeholder={\n type.kind === 'any' || type.array\n ? t('vista.params-form.any-placeholder')\n : t('vista.params-form.not-set')\n }\n value={value}\n />\n </Box>\n {type.format === 'datetime' && (\n <Button\n disabled={disabled}\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onChange(new Date().toISOString())}\n padding={2}\n text={t('vista.params-form.now')}\n />\n )}\n </Flex>\n )\n }\n\n return (\n <Stack data-testid={`vista-params-form-${param.name}`} gap={2}>\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text as=\"label\" htmlFor={inputId} size={1} weight=\"medium\">\n <code>{`$${param.name}`}</code>\n </Text>\n <Text data-testid={`vista-params-form-${param.name}-type`} muted size={1}>\n {describeType(type, t)}\n </Text>\n </Flex>\n {input}\n {options && (\n <datalist id={listId}>\n {options.map((option) => (\n <option key={option} value={option} />\n ))}\n </datalist>\n )}\n {problem && (\n <Card\n data-testid={`vista-params-form-${param.name}-problem`}\n padding={2}\n radius={2}\n tone=\"caution\"\n >\n <Text size={1}>{problem}</Text>\n </Card>\n )}\n {!isSet && (\n <Text muted size={1}>\n {t('vista.params-form.missing')}\n </Text>\n )}\n {param.usages.length > 0 && (\n <Text muted size={0}>\n {t('vista.params-form.used-in')}{' '}\n {param.usages.map((usage, index) => (\n <span key={usage}>\n {index > 0 && ', '}\n <code>{usage}</code>\n </span>\n ))}\n </Text>\n )}\n </Stack>\n )\n}\n\n/**\n * A form for the params a query uses, inferred from the query (and the workspace\n * schema, like typegen). Values that fit are easy to enter (document types and option lists are\n * suggested, numbers become numbers), and values that do not are still sent, for testing.\n */\nexport function ParamsForm({query, params, onChange}: ParamsFormProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const inference = useParamsInference(query)\n const values = params.parsed ?? {}\n const disabled = !params.valid\n const known = new Set(inference.params.map((param) => param.name))\n const unused = params.valid ? Object.keys(values).filter((name) => !known.has(name)) : []\n\n const setValue = (name: string, value: unknown) => {\n const next =\n value === undefined\n ? Object.fromEntries(Object.entries(values).filter(([key]) => key !== name))\n : {...values, [name]: value}\n onChange(JSON.stringify(next, null, 2))\n }\n\n return (\n <Stack data-testid=\"vista-params-form\" gap={4} padding={3}>\n {disabled && (\n <Card padding={3} radius={2} tone=\"caution\">\n <Text size={1}>{t('vista.params-form.invalid-json')}</Text>\n </Card>\n )}\n {inference.syntaxError && (\n <Text muted size={1}>\n {t('vista.params-form.syntax-error')}\n </Text>\n )}\n {inference.params.length === 0 && unused.length === 0 && (\n <Text muted size={1}>\n {t('vista.params-form.empty')}\n </Text>\n )}\n {inference.params.map((param) => (\n <ParamField\n disabled={disabled}\n isSet={Object.hasOwn(values, param.name)}\n key={param.name}\n onChange={(value) => setValue(param.name, value)}\n param={param}\n value={values[param.name]}\n />\n ))}\n {unused.length > 0 && (\n <Stack data-testid=\"vista-params-form-unused\" gap={2}>\n <Text muted size={1} weight=\"medium\">\n {t('vista.params-form.unused')}\n </Text>\n {unused.map((name) => (\n <Flex alignItems=\"center\" gap={2} key={name}>\n <Text size={1}>\n <code>{`$${name}`}</code>\n </Text>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text muted size={1} textOverflow=\"ellipsis\">\n {preview(values[name])}\n </Text>\n </Box>\n <Button\n fontSize={1}\n mode=\"bleed\"\n onClick={() => setValue(name, undefined)}\n padding={2}\n text={t('vista.params-form.remove')}\n />\n </Flex>\n ))}\n </Stack>\n )}\n {inference.params.length > 0 && inference.schemaUnavailable && (\n <Text muted size={0}>\n {t('vista.params-form.no-schema')}\n </Text>\n )}\n </Stack>\n )\n}\n","import {Card, Text} from '@sanity/ui'\nimport {type RefObject} from 'react'\n\nimport {paramsExtensions} from '../../../codemirror/extensions'\nimport {VisionCodeMirror, type VisionCodeMirrorHandle} from '../../../codemirror/VisionCodeMirror'\nimport {type Params} from '../../../components/VisionGui'\n\nexport interface ParamsPanelProps {\n value: string\n params: Params\n editorRef: RefObject<VisionCodeMirrorHandle | null>\n onChange: (rawParams: string) => void\n}\n\n/** The params editor, as tall as its JSON; the panel around it caps and scrolls it */\nexport function ParamsPanel({value, params, editorRef, onChange}: ParamsPanelProps) {\n return (\n <div data-testid=\"vista-params-editor\">\n {params.error && (\n <Card borderBottom padding={3} tone=\"critical\">\n <Text size={1}>{params.error}</Text>\n </Card>\n )}\n <VisionCodeMirror\n autoHeight\n extensions={paramsExtensions}\n initialValue={value}\n onChange={onChange}\n ref={editorRef}\n />\n </div>\n )\n}\n","import {type ClientPerspective} from '@sanity/client'\n\nimport {deriveTabTitle} from './tabTitle'\n\nexport type ExportSnippetId = 'curl' | 'client' | 'next-sanity'\n\nexport interface ExportSnippet {\n id: ExportSnippetId\n title: string\n language: 'bash' | 'typescript'\n code: string\n}\n\nexport interface ExportSnippetInput {\n query: string\n params: Record<string, unknown>\n url: string\n projectId: string\n dataset: string\n /** With or without the `v` prefix */\n apiVersion: string\n perspective: ClientPerspective | undefined\n variant: string | undefined\n includeSourceMap: boolean\n /** The query went through the API CDN */\n useCdn: boolean\n}\n\nfunction toTemplateLiteral(value: string): string {\n return `\\`${value.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$\\{/g, '\\\\${')}\\``\n}\n\nfunction toSingleQuoted(value: string): string {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * JSON is a valid object literal, except that a `__proto__` key in a literal sets the object's\n * prototype instead of a property; such params are parsed from a string so the snippet sends\n * what Vision sent.\n */\nfunction toJsObject(value: Record<string, unknown>, indent = ''): string {\n const json = JSON.stringify(value, null, 2)\n if (/\"__proto__\"\\s*:/.test(json)) {\n return `JSON.parse(${toSingleQuoted(JSON.stringify(value))})`\n }\n return json.replace(/\\n/g, `\\n${indent}`)\n}\n\nfunction toPerspectiveLiteral(perspective: ClientPerspective): string {\n if (Array.isArray(perspective)) {\n return `[${perspective.map((entry) => toSingleQuoted(entry)).join(', ')}]`\n }\n return toSingleQuoted(perspective)\n}\n\n/** `AUTHOR_QUERY` for `*[_type == \"author\"]`, `QUERY` when nothing better can be derived */\nexport function toQueryConstantName(query: string): string {\n const title = deriveTabTitle(query) || ''\n const words = title\n .replace(/[^a-zA-Z0-9]+/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 3)\n if (words.length === 0 || /^\\d/.test(words[0])) {\n return 'QUERY'\n }\n return `${words.join('_').toUpperCase()}_QUERY`\n}\n\nexport function buildExportSnippets(input: ExportSnippetInput): ExportSnippet[] {\n const hasParams = Object.keys(input.params).length > 0\n const apiVersion = input.apiVersion.replace(/^v/, '')\n const constantName = toQueryConstantName(input.query)\n\n const curl = [\n `curl ${toSingleQuoted(input.url)} \\\\`,\n ` -H \"Authorization: Bearer $SANITY_API_TOKEN\"`,\n ]\n\n const clientConfig = [\n ` projectId: ${toSingleQuoted(input.projectId)},`,\n ` dataset: ${toSingleQuoted(input.dataset)},`,\n ` apiVersion: ${toSingleQuoted(apiVersion)},`,\n ` useCdn: ${input.useCdn ? 'true' : 'false'},`,\n ]\n if (input.perspective !== undefined) {\n clientConfig.push(` perspective: ${toPerspectiveLiteral(input.perspective)},`)\n }\n if (input.variant) {\n clientConfig.push(` variant: ${toSingleQuoted(input.variant)},`)\n }\n\n const fetchArgs = ['query', hasParams ? 'params' : '{}']\n if (input.includeSourceMap) {\n fetchArgs.push('{filterResponse: false, resultSourceMap: true}')\n }\n\n const client = [\n `import {createClient} from '@sanity/client'`,\n '',\n 'const client = createClient({',\n ...clientConfig,\n '})',\n '',\n `const query = ${toTemplateLiteral(input.query)}`,\n ...(hasParams ? [`const params = ${toJsObject(input.params)}`] : []),\n '',\n `const result = await client.fetch(${fetchArgs.join(', ')})`,\n ]\n\n // Sanity Live takes every perspective but the legacy `raw`, which it leaves to its own default\n const livePerspective =\n input.perspective === undefined || input.perspective === 'raw' ? undefined : input.perspective\n const nextSanity = [\n `import {defineQuery} from 'next-sanity'`,\n `import {sanityFetch} from '@/sanity/lib/live'`,\n '',\n `const ${constantName} = defineQuery(${toTemplateLiteral(input.query)})`,\n '',\n ...(input.perspective === 'raw'\n ? [\n \"// sanityFetch does not support the 'raw' perspective this query was run with; it\",\n \"// uses its own default ('published', or 'drafts' in draft mode)\",\n ]\n : []),\n 'const {data} = await sanityFetch({',\n ` query: ${constantName},`,\n ...(hasParams ? [` params: ${toJsObject(input.params, ' ')},`] : []),\n ...(livePerspective === undefined\n ? []\n : [` perspective: ${toPerspectiveLiteral(livePerspective)},`]),\n ...(input.variant ? [` variant: ${toSingleQuoted(input.variant)},`] : []),\n '})',\n ]\n\n return [\n {id: 'curl', title: 'curl', language: 'bash', code: curl.join('\\n')},\n {id: 'client', title: '@sanity/client', language: 'typescript', code: client.join('\\n')},\n {id: 'next-sanity', title: 'next-sanity', language: 'typescript', code: nextSanity.join('\\n')},\n ]\n}\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {Button, Card, Dialog, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useMemo, useState} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useCopyToClipboard} from '../../hooks/useCopyToClipboard'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {type QueryRequest, type VistaTab} from '../../store/types'\nimport {useVistaSelector} from '../../store/VistaActorContext'\nimport {selectProjectId} from '../../store/vistaMachine'\nimport {buildExportSnippets, type ExportSnippetId} from '../../util/exportSnippets'\nimport * as styles from '../vista.module.css'\n\nexport interface ExportQueryDialogProps {\n tab: VistaTab\n request: QueryRequest\n resolved: ResolvedRequest\n onClose: () => void\n}\n\nexport function ExportQueryDialog({tab, request, resolved, onClose}: ExportQueryDialogProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const copyToClipboard = useCopyToClipboard()\n const projectId = useVistaSelector(selectProjectId)\n const [activeId, setActiveId] = useState<ExportSnippetId>('client')\n\n const snippets = useMemo(\n () =>\n buildExportSnippets({\n query: request.query,\n params: request.params,\n url: request.url,\n projectId,\n dataset: resolved.dataset,\n apiVersion: resolved.apiVersion,\n perspective: resolved.perspective,\n variant: resolved.variant,\n includeSourceMap: tab.options.includeSourceMap,\n useCdn: request.useCdn,\n }),\n [projectId, request, resolved, tab.options.includeSourceMap],\n )\n const active = snippets.find((snippet) => snippet.id === activeId) || snippets[0]\n\n return (\n <Dialog\n animate\n data-testid=\"vista-export-query-dialog\"\n header={t('vista.export-query.title')}\n id=\"vista-export-query-dialog\"\n onClickOutside={onClose}\n onClose={onClose}\n width={2}\n >\n <Box padding={4}>\n <Stack gap={4}>\n <Text muted size={1}>\n {t('vista.export-query.description')}\n </Text>\n <TabList gap={1}>\n {snippets.map((snippet) => (\n <Tab\n aria-controls={`vista-export-${snippet.id}-panel`}\n fontSize={1}\n id={`vista-export-${snippet.id}-tab`}\n key={snippet.id}\n label={snippet.title}\n onClick={() => setActiveId(snippet.id)}\n selected={snippet.id === active.id}\n />\n ))}\n </TabList>\n <TabPanel\n aria-labelledby={`vista-export-${active.id}-tab`}\n id={`vista-export-${active.id}-panel`}\n >\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code language={active.language} size={1}>\n {active.code}\n </Code>\n </Card>\n </TabPanel>\n <Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text muted size={1}>\n {active.id === 'curl' ? t('vista.export-query.token-note') : ''}\n </Text>\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(active.code, t('vista.export-query.copied'))}\n text={t('vista.export-query.copy')}\n />\n </Flex>\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","import {BookmarkIcon} from '@sanity/icons/Bookmark'\nimport {CodeIcon} from '@sanity/icons/Code'\nimport {CodeBlockIcon} from '@sanity/icons/CodeBlock'\nimport {CopyIcon} from '@sanity/icons/Copy'\nimport {EllipsisHorizontalIcon} from '@sanity/icons/EllipsisHorizontal'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useCallback, useState} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type QueryRequestBuilder} from '../../hooks/useQueryRequestBuilder'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {useSaveCurrentQuery} from '../../hooks/useSaveCurrentQuery'\nimport {type QueryRequest, type VistaTab} from '../../store/types'\nimport {usePendingEdits} from '../../store/VistaActorContext'\nimport {VISTA_SHORTCUTS} from '../../util/shortcuts'\nimport {ExportQueryDialog} from './ExportQueryDialog'\n\nexport interface QueryActionsMenuProps {\n tab: VistaTab\n request: QueryRequest | null\n buildRequest: QueryRequestBuilder['buildRequest']\n resolved: ResolvedRequest\n onCopyQuery: () => void\n onPrettify: () => void\n}\n\nexport function QueryActionsMenu(props: QueryActionsMenuProps) {\n const {tab, request, buildRequest, resolved, onCopyQuery, onPrettify} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const pendingEdits = usePendingEdits()\n const [exportOpen, setExportOpen] = useState(false)\n const {saveCurrent, canSave} = useSaveCurrentQuery(tab, {request, buildRequest})\n\n const openExport = useCallback(() => {\n // Params typed within the debounce window belong to the exported request; committing them\n // re-renders the dialog with the request built from them\n pendingEdits.commit()\n setExportOpen(true)\n }, [pendingEdits])\n\n return (\n <>\n <MenuButton\n button={\n <Button\n aria-label={t('vista.query.actions')}\n data-testid=\"vista-query-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />\n }\n id={`vista-query-menu-${tab.id}`}\n menu={\n <Menu>\n <MenuItem\n hotkeys={VISTA_SHORTCUTS['copy-query'].keys}\n icon={CopyIcon}\n onClick={onCopyQuery}\n text={t('vista.query.copy')}\n />\n <MenuItem\n data-testid=\"vista-prettify\"\n hotkeys={VISTA_SHORTCUTS.prettify.keys}\n icon={CodeBlockIcon}\n onClick={onPrettify}\n text={t('vista.query.prettify')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-query\"\n disabled={!request}\n icon={CodeIcon}\n onClick={openExport}\n text={t('vista.query.export')}\n />\n <MenuItem\n data-testid=\"vista-save-query\"\n disabled={!canSave}\n icon={BookmarkIcon}\n onClick={() => void saveCurrent()}\n text={t('vista.query.save')}\n />\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'top-end'}}\n />\n {exportOpen && request && (\n <ExportQueryDialog\n onClose={() => setExportOpen(false)}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n )}\n </>\n )\n}\n","import {\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n useCallback,\n useState,\n} from 'react'\n\nimport {PANEL_HEADER_HEIGHT} from '../CollapsiblePanel'\n\n/** Matches the `min-height` of the query section: the editor keeps at least this much */\nconst QUERY_MIN_HEIGHT = 120\n/** One editor line, the step of a keyboard resize */\nconst LINE_HEIGHT = 21\n/** The header plus a few lines of JSON */\nexport const SECTION_MIN_HEIGHT = PANEL_HEADER_HEIGHT + LINE_HEIGHT * 3\n\nexport interface DragResizeOptions {\n /** The column the sections are stacked in */\n containerRef: RefObject<HTMLElement | null>\n /** The section whose top edge is dragged */\n sectionRef: RefObject<HTMLElement | null>\n /** The other collapsible section; its height is reserved when computing the cap */\n siblingRef: RefObject<HTMLElement | null>\n}\n\nexport interface DragResize {\n /** The dragged height, or `null` while the section sizes itself to its content */\n height: number | null\n dragging: boolean\n /**\n * The section's height and the largest one the drag allows, measured when the handle is\n * focused and after each resize, for the separator's `aria-valuenow` and `aria-valuemax`\n */\n measured: {current: number; max: number} | null\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void\n /** Arrow keys resize by a line (five with Shift), Home and End go to the bounds, Enter resets */\n onKeyDown: (event: ReactKeyboardEvent<HTMLElement>) => void\n onFocus: () => void\n /** Back to the automatic height */\n reset: () => void\n}\n\ninterface Bounds {\n current: number\n min: number\n max: number\n}\n\nfunction clamp(value: number, {min, max}: Bounds): number {\n return Math.round(Math.min(Math.max(value, min), max))\n}\n\n/**\n * Resizing for a section that normally sizes itself to its content: dragging its top edge up\n * makes it taller, bounded so the query editor keeps its minimum height and the sibling section\n * keeps its own. The handle captures the pointer, so the drag continues while the pointer is\n * outside it, and the same bounds apply to the keyboard.\n */\nexport function useDragResize({\n containerRef,\n sectionRef,\n siblingRef,\n}: DragResizeOptions): DragResize {\n const [height, setHeight] = useState<number | null>(null)\n const [dragging, setDragging] = useState(false)\n const [measured, setMeasured] = useState<Bounds | null>(null)\n\n const measure = useCallback((): Bounds | null => {\n const section = sectionRef.current\n const container = containerRef.current\n if (!section || !container) return null\n const siblingHeight = siblingRef.current?.getBoundingClientRect().height ?? 0\n return {\n current: Math.round(section.getBoundingClientRect().height),\n min: SECTION_MIN_HEIGHT,\n max: Math.round(\n Math.max(\n SECTION_MIN_HEIGHT,\n container.getBoundingClientRect().height - siblingHeight - QUERY_MIN_HEIGHT,\n ),\n ),\n }\n }, [containerRef, sectionRef, siblingRef])\n\n const onFocus = useCallback(() => setMeasured(measure()), [measure])\n // A resize changes the layout only once React has rendered it\n const measureAfterRender = useCallback(() => {\n requestAnimationFrame(() => setMeasured(measure()))\n }, [measure])\n\n const onPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const bounds = measure()\n if (event.button !== 0 || !bounds) return\n event.preventDefault()\n\n const handle = event.currentTarget\n const startY = event.clientY\n const onMove = (move: PointerEvent) => {\n setHeight(clamp(bounds.current - (move.clientY - startY), bounds))\n }\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onEnd)\n handle.removeEventListener('pointercancel', onEnd)\n setDragging(false)\n measureAfterRender()\n }\n handle.setPointerCapture(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onEnd)\n handle.addEventListener('pointercancel', onEnd)\n setDragging(true)\n },\n [measure, measureAfterRender],\n )\n\n const onKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLElement>) => {\n const step = event.shiftKey ? LINE_HEIGHT * 5 : LINE_HEIGHT\n const next = (bounds: Bounds): number | null => {\n switch (event.key) {\n case 'ArrowUp':\n return bounds.current + step\n case 'ArrowDown':\n return bounds.current - step\n case 'Home':\n return bounds.min\n case 'End':\n return bounds.max\n case 'Enter':\n return null\n default:\n return bounds.current\n }\n }\n const bounds = measure()\n if (!bounds) return\n const target = next(bounds)\n if (target === bounds.current) return\n event.preventDefault()\n setHeight(target === null ? null : clamp(target, bounds))\n measureAfterRender()\n },\n [measure, measureAfterRender],\n )\n\n const reset = useCallback(() => {\n setHeight(null)\n measureAfterRender()\n }, [measureAfterRender])\n\n return {height, dragging, measured, onPointerDown, onKeyDown, onFocus, reset}\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {PlayIcon} from '@sanity/icons/Play'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {StopIcon} from '@sanity/icons/Stop'\nimport {Button, Hotkeys, Label, Tab, TabList, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type RefObject, useCallback, useMemo, useRef, useState} from 'react'\nimport {type Schema, useSchema, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {groqExtensions} from '../../../codemirror/extensions'\nimport {VisionCodeMirror, type VisionCodeMirrorHandle} from '../../../codemirror/VisionCodeMirror'\nimport {type Params} from '../../../components/VisionGui'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type QueryRequestBuilder} from '../../hooks/useQueryRequestBuilder'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {\n type QueryRequest,\n type VistaPanel,\n type VistaParamsView,\n type VistaTab,\n type VistaTabOptions,\n} from '../../store/types'\nimport {useVistaActor, useVistaSelector} from '../../store/VistaActorContext'\nimport {isPanelExpanded, selectFunctionLibrary, selectParamsView} from '../../store/vistaMachine'\nimport {cx} from '../../util/cx'\nimport {functionLibrary, querySchema} from '../../util/groqEditorContext'\nimport {createGroqFunctionExtensions} from '../../util/groqFunctionEditor'\nimport {createGroqLintExtensions, type QueryLintFinding} from '../../util/groqLint'\nimport {createQuerySchema} from '../../util/schemaCheck'\nimport {VISTA_SHORTCUTS} from '../../util/shortcuts'\nimport {ActionRail} from '../ActionRail'\nimport {AgentActionsTooltip} from '../AgentActionsTooltip'\nimport {CollapsibleSection} from '../CollapsibleSection'\nimport * as styles from '../vista.module.css'\nimport {ApiVersionButton, type RevealedOption} from './ApiVersionButton'\nimport {GenerateQueryBar} from './GenerateQueryBar'\nimport {LiveButton} from './LiveButton'\nimport {OptionsPanel} from './OptionsPanel'\nimport {ParamsForm} from './ParamsForm'\nimport {ParamsPanel} from './ParamsPanel'\nimport {QueryActionsMenu} from './QueryActionsMenu'\nimport {SECTION_MIN_HEIGHT, useDragResize} from './useDragResize'\n\nexport interface RequestPanelProps {\n tab: VistaTab\n params: Params\n request: QueryRequest | null\n buildRequest: QueryRequestBuilder['buildRequest']\n resolved: ResolvedRequest\n isFetching: boolean\n queryEditorRef: RefObject<VisionCodeMirrorHandle | null>\n paramsEditorRef: RefObject<VisionCodeMirrorHandle | null>\n onQueryChange: (query: string) => void\n /** An edit in the params editor; committed after a debounce */\n onParamsChange: (rawParams: string) => void\n /** Params set by the params form, committed right away since the form shows the tab's params */\n onParamsReplace: (rawParams: string) => void\n onOptionsChange: (options: Partial<VistaTabOptions>) => void\n onRun: () => void\n onCancel: () => void\n onPrettify: () => void\n /**\n * Formats a query for the width of the query editor, as Prettify does; rejects when it does not\n * parse\n */\n formatForEditor: (query: string) => Promise<string>\n onCopyQuery: () => void\n onToggleAutoRefetch: () => void\n /** The query editor's lint diagnostics, whenever they change */\n onLintFindings: (findings: QueryLintFinding[]) => void\n}\n\n/**\n * The request column: the query editor over the params and options panels. The editor takes\n * whatever the panels leave over; params grow with their JSON (drag their top edge to override,\n * double-click it to fit again) and the options are as tall as the fields.\n */\nexport function RequestPanel(props: RequestPanelProps) {\n const {\n tab,\n params,\n request,\n buildRequest,\n resolved,\n isFetching,\n queryEditorRef,\n paramsEditorRef,\n onQueryChange,\n onParamsChange,\n onParamsReplace,\n onOptionsChange,\n onRun,\n onCancel,\n onPrettify,\n formatForEditor,\n onCopyQuery,\n onToggleAutoRefetch,\n onLintFindings,\n } = props\n const {t} = useTranslation(visionLocaleNamespace)\n // The GROQ editor setup, the diagnostics reporting to the Lint panel, and the documentation,\n // completions and extraction of functions, which know the library. Only the library's facet\n // changes when a function is saved; the rest of the setup stays as it is\n const lintExtensions = useMemo(() => createGroqLintExtensions(onLintFindings), [onLintFindings])\n const functionExtensions = useMemo(\n () =>\n createGroqFunctionExtensions({\n reference: t('vista.functions.editor.reference'),\n apiVersion: (version) => t('vista.functions.editor.api-version', {version}),\n deltaOnly: t('vista.functions.editor.delta-only'),\n declaredOn: (line) => t('vista.functions.editor.declared-on', {line}),\n inLibrary: t('vista.functions.editor.in-library'),\n completionDeclared: t('vista.functions.editor.completion-declared'),\n completionLibrary: t('vista.functions.editor.completion-library'),\n extract: t('vista.functions.editor.extract'),\n addFromLibrary: t('vista.functions.editor.add-from-library'),\n useSuggestion: (suggestion) => t('vista.lint.use-suggestion', {suggestion}),\n }),\n [t],\n )\n const library = useVistaSelector(selectFunctionLibrary)\n const schema = useSchema() as Schema | undefined\n const workspaceSchema = useMemo(() => (schema ? createQuerySchema(schema) : undefined), [schema])\n const queryExtensions = useMemo(\n () => [\n ...groqExtensions,\n ...lintExtensions,\n ...functionExtensions,\n functionLibrary.of(library),\n ...(workspaceSchema ? [querySchema.of(workspaceSchema)] : []),\n ],\n [functionExtensions, library, lintExtensions, workspaceSchema],\n )\n const actorRef = useVistaActor()\n const paramsExpanded = useVistaSelector((snapshot) => isPanelExpanded(snapshot, 'params'))\n const optionsExpanded = useVistaSelector((snapshot) => isPanelExpanded(snapshot, 'options'))\n const togglePanel = useCallback(\n (panel: VistaPanel) => actorRef.send({type: 'panel.toggle', panel}),\n [actorRef],\n )\n const paramsView = useVistaSelector(selectParamsView)\n const setParamsView = useCallback(\n (view: VistaParamsView) => actorRef.send({type: 'params.view', view}),\n [actorRef],\n )\n\n const containerRef = useRef<HTMLDivElement>(null)\n const paramsRef = useRef<HTMLElement>(null)\n const optionsRef = useRef<HTMLElement>(null)\n const paramsResize = useDragResize({containerRef, sectionRef: paramsRef, siblingRef: optionsRef})\n const paramsHeightNow = paramsResize.height ?? paramsResize.measured?.current\n\n const [generatorOpen, setGeneratorOpen] = useState(false)\n // Closing hands the keyboard back to the query editor, where the bar was opened from\n const closeGenerator = useCallback(() => {\n setGeneratorOpen(false)\n requestAnimationFrame(() =>\n containerRef.current\n ?.querySelector<HTMLElement>('[data-testid=\"vista-query-editor\"] .cm-content')\n ?.focus(),\n )\n }, [])\n\n // The API version button shows the field that changes what it says: the Options panel opens if\n // it was collapsed, and once its fields have mounted the API version field (or, while a variant\n // locks it, the wrapper that stands in for it) takes focus, or the perspective while that keeps\n // the queries off the API CDN\n const revealOption = useCallback(\n (option: RevealedOption) => {\n if (!optionsExpanded) togglePanel('options')\n requestAnimationFrame(() => {\n const options = optionsRef.current\n const field =\n option === 'perspective'\n ? options?.querySelector<HTMLElement>('#vista-option-perspective')\n : (options?.querySelector<HTMLElement>(\n 'input[data-testid=\"vista-option-api-version-custom\"], [data-testid=\"vista-option-api-version-custom\"] input',\n ) ??\n options?.querySelector<HTMLElement>(\n '[data-testid=\"vista-option-api-version-wrap\"][tabindex]',\n ) ??\n options?.querySelector<HTMLElement>('#vista-option-api-version'))\n field?.focus()\n })\n },\n [optionsExpanded, togglePanel],\n )\n\n const runLabel = isFetching ? t('vista.query.stop') : t('action.query-execute')\n // Next to Stop live, the tooltip and accessible name say what Stop stops\n const runDescription = isFetching ? t('vista.query.stop.description') : runLabel\n\n return (\n <Flex data-testid=\"vista-request-panel\" flexDirection=\"column\" height=\"100%\">\n <Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\" ref={containerRef}>\n <Flex className={styles.querySection}>\n {generatorOpen && (\n <GenerateQueryBar\n client={resolved.client}\n formatForEditor={formatForEditor}\n onClose={closeGenerator}\n tab={tab}\n />\n )}\n <Box\n className={styles.editorContainer}\n data-testid=\"vista-query-editor\"\n flexBasis=\"0%\"\n flexGrow={1}\n minHeight=\"0\"\n minWidth=\"0\"\n >\n <Box className={styles.editorLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('query.label')}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.generate.button')}>\n <Button\n aria-label={t('vista.generate.button')}\n data-testid=\"vista-generate-query\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <VisionCodeMirror\n extensions={queryExtensions}\n initialValue={tab.query}\n onChange={onQueryChange}\n ref={queryEditorRef}\n />\n </Box>\n </Flex>\n <CollapsibleSection\n className={cx(\n styles.paramsSection,\n paramsResize.height !== null && styles.paramsSectionResized,\n )}\n expanded={paramsExpanded}\n handle={\n paramsExpanded && (\n // The focusable separator widget: drag or arrow keys resize, Enter resets\n <div\n aria-label={t('vista.params.resize')}\n aria-orientation=\"horizontal\"\n aria-valuemax={paramsResize.measured?.max}\n aria-valuemin={SECTION_MIN_HEIGHT}\n aria-valuenow={paramsHeightNow}\n aria-valuetext={\n paramsResize.height === null && paramsHeightNow !== undefined\n ? t('vista.params.fit-height', {height: paramsHeightNow})\n : undefined\n }\n className={styles.sectionResizer}\n data-dragging={paramsResize.dragging}\n data-testid=\"vista-request-params-resizer\"\n onDoubleClick={paramsResize.reset}\n onFocus={paramsResize.onFocus}\n onKeyDown={paramsResize.onKeyDown}\n onPointerDown={paramsResize.onPointerDown}\n role=\"separator\"\n tabIndex={0}\n title={t('vista.params.resize')}\n />\n )\n }\n icon={\n params.valid ? undefined : (\n <Text size={1}>\n <ErrorOutlineIcon />\n </Text>\n )\n }\n actions={\n <TabList aria-label={t('vista.params.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-json\"\n label={t('vista.params.view.json')}\n onClick={() => setParamsView('json')}\n padding={2}\n selected={paramsView === 'json'}\n />\n <Tab\n aria-controls=\"vista-request-params-content\"\n fontSize={1}\n id=\"vista-params-view-form\"\n label={t('vista.params.view.form')}\n onClick={() => setParamsView('form')}\n padding={2}\n selected={paramsView === 'form'}\n />\n </TabList>\n }\n id=\"vista-request-params\"\n onToggle={() => togglePanel('params')}\n ref={paramsRef}\n style={paramsResize.height === null ? undefined : {height: paramsResize.height}}\n title={t('params.label')}\n >\n {paramsView === 'form' ? (\n <ParamsForm onChange={onParamsReplace} params={params} query={tab.query} />\n ) : (\n <ParamsPanel\n editorRef={paramsEditorRef}\n onChange={onParamsChange}\n params={params}\n value={tab.rawParams}\n />\n )}\n </CollapsibleSection>\n <CollapsibleSection\n className={styles.optionsSection}\n expanded={optionsExpanded}\n id=\"vista-request-options\"\n onToggle={() => togglePanel('options')}\n ref={optionsRef}\n title={t('vista.panel.options')}\n >\n <OptionsPanel onChange={onOptionsChange} options={tab.options} resolved={resolved} />\n </CollapsibleSection>\n </Flex>\n <ActionRail testId=\"vista-query-actions\">\n <ApiVersionButton onReveal={revealOption} resolved={resolved} />\n <Box flexBasis=\"0%\" flexGrow={1} />\n <LiveButton\n active={tab.autoRefetch}\n canFetch={request !== null}\n onToggle={onToggleAutoRefetch}\n supported={resolved.supportsSyncTags}\n />\n <Tooltip\n animate\n content={\n <Flex alignItems=\"center\" gap={2} padding={1}>\n <Text size={1}>{runDescription}</Text>\n {!isFetching && <Hotkeys fontSize={0} keys={VISTA_SHORTCUTS.fetch.keys} />}\n </Flex>\n }\n placement=\"top\"\n portal\n >\n <Button\n aria-label={runDescription}\n data-testid=\"vista-fetch-button\"\n disabled={!isFetching && !request}\n gap={2}\n icon={isFetching ? StopIcon : PlayIcon}\n mode=\"default\"\n onClick={isFetching ? onCancel : onRun}\n padding={2}\n text={runLabel}\n tone={isFetching ? 'critical' : 'primary'}\n />\n </Tooltip>\n <QueryActionsMenu\n buildRequest={buildRequest}\n onCopyQuery={onCopyQuery}\n onPrettify={onPrettify}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n </ActionRail>\n </Flex>\n )\n}\n","import {\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react'\n\nimport {useContentSize} from '../hooks/useContentSize'\nimport {cx} from '../util/cx'\nimport * as styles from './vista.module.css'\n\n/** The divider's own extent along the axis; the rest of its hit area overlaps the panes */\nconst SPLIT_HANDLE_SIZE = 1\n/** A keyboard step, five with Shift */\nconst KEYBOARD_STEP = 16\n\nexport interface ResizableSplitProps {\n /** A `vertical` divider puts the panes side by side, a `horizontal` one stacks them */\n split: 'vertical' | 'horizontal'\n /** The pane `size` applies to; the other takes what is left */\n primary?: 'first' | 'second'\n /** The primary pane's size in pixels */\n size: number\n /** The least the primary pane may get */\n minSize: number\n /** The least the other pane keeps */\n minSecondarySize: number\n onChange: (size: number) => void\n /** Enter on the divider: back to the default size */\n onReset?: () => void\n allowResize?: boolean\n /** Accessible name of the divider */\n label: string\n children: [ReactNode, ReactNode]\n testId?: string\n}\n\ninterface Bounds {\n min: number\n max: number\n}\n\nfunction clamp(value: number, {min, max}: Bounds): number {\n return Math.round(Math.min(Math.max(value, min), max))\n}\n\n/**\n * Two panes with a draggable divider that is also a keyboard-operable `separator`: arrow keys\n * along the axis move it by a step (five with Shift), Home and End go to the bounds, Enter resets,\n * and its ARIA values follow the measured container. Both panes keep their minimum: the divider\n * stops short of either, and a size that no longer fits (a window narrowed after a drag) is\n * clamped for as long as the container is that small, the primary pane winning when it cannot\n * fit both.\n */\nexport function ResizableSplit(props: ResizableSplitProps) {\n const {\n split,\n primary = 'first',\n size,\n minSize,\n minSecondarySize,\n onChange,\n onReset,\n allowResize = true,\n label,\n children,\n testId,\n } = props\n const [root, setRoot] = useState<HTMLDivElement | null>(null)\n const contentSize = useContentSize(root)\n const [dragging, setDragging] = useState(false)\n\n // The bounds follow the observed container size (whole pixels, as the ARIA values are read\n // out). Until it is measured, and while it is not laid out at all (a pane kept mounted under\n // `display: none`, the tool hidden in an `<Activity>`), the size is shown as given and the\n // divider waits: a 0×0 container would otherwise clamp the pane to its minimum and paint that\n // for a frame when the container shows again\n const extent = split === 'vertical' ? contentSize?.width : contentSize?.height\n const bounds = useMemo(\n (): Bounds | null =>\n extent === undefined || extent <= 0\n ? null\n : {\n min: minSize,\n max: Math.max(minSize, Math.floor(extent - minSecondarySize - SPLIT_HANDLE_SIZE)),\n },\n [extent, minSecondarySize, minSize],\n )\n const shownSize = bounds ? clamp(size, bounds) : size\n\n const onPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!allowResize || event.button !== 0 || !bounds) return\n event.preventDefault()\n\n const handle = event.currentTarget\n const start = split === 'vertical' ? event.clientX : event.clientY\n const onMove = (move: PointerEvent) => {\n const position = split === 'vertical' ? move.clientX : move.clientY\n const delta = position - start\n onChange(clamp(shownSize + (primary === 'first' ? delta : -delta), bounds))\n }\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onEnd)\n handle.removeEventListener('pointercancel', onEnd)\n setDragging(false)\n }\n handle.setPointerCapture?.(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onEnd)\n handle.addEventListener('pointercancel', onEnd)\n setDragging(true)\n },\n [allowResize, bounds, onChange, primary, shownSize, split],\n )\n\n const onKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!allowResize || !bounds) return\n const step = event.shiftKey ? KEYBOARD_STEP * 5 : KEYBOARD_STEP\n // The arrows move the divider along the axis; what that does to the size depends on the\n // side the primary pane is on\n const towardsEnd = primary === 'first' ? step : -step\n const [forwardKey, backKey] =\n split === 'vertical' ? ['ArrowRight', 'ArrowLeft'] : ['ArrowDown', 'ArrowUp']\n let target: number\n if (event.key === forwardKey) {\n target = shownSize + towardsEnd\n } else if (event.key === backKey) {\n target = shownSize - towardsEnd\n } else if (event.key === 'Home') {\n target = bounds.min\n } else if (event.key === 'End') {\n target = bounds.max\n } else if (event.key === 'Enter') {\n event.preventDefault()\n onReset?.()\n return\n } else {\n return\n }\n event.preventDefault()\n const next = clamp(target, bounds)\n if (next !== shownSize) onChange(next)\n },\n [allowResize, bounds, onChange, onReset, primary, shownSize, split],\n )\n\n const primaryStyle = {flex: `0 0 ${shownSize}px`}\n return (\n <div\n className={cx(\n styles.splitRoot,\n split === 'vertical' ? styles.splitRootRow : styles.splitRootColumn,\n )}\n data-testid={testId}\n ref={setRoot}\n >\n <div className={styles.splitPane} style={primary === 'first' ? primaryStyle : undefined}>\n {children[0]}\n </div>\n <div\n aria-disabled={allowResize ? undefined : true}\n aria-label={label}\n aria-orientation={split}\n aria-valuemax={bounds?.max}\n aria-valuemin={minSize}\n aria-valuenow={shownSize}\n className={cx(\n styles.splitHandle,\n split === 'vertical' ? styles.splitHandleVertical : styles.splitHandleHorizontal,\n !allowResize && styles.splitHandleDisabled,\n )}\n data-dragging={dragging}\n data-testid={testId && `${testId}-handle`}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n role=\"separator\"\n tabIndex={allowResize ? 0 : -1}\n title={label}\n />\n <div className={styles.splitPane} style={primary === 'second' ? primaryStyle : undefined}>\n {children[1]}\n </div>\n </div>\n )\n}\n","import {type PromptRequest} from '@sanity/client'\n\nimport {encodeQueryString} from '../../util/encodeQueryString'\nimport {isPlainObject} from '../../util/isPlainObject'\n\n/** What explaining a query needs of a client; a `SanityClient` has it */\nexport interface ExplainQueryClient {\n getDataUrl: (operation: string, path?: string) => string\n request: (options: {url: string; tag: string; signal?: AbortSignal}) => Promise<unknown>\n withConfig: (config: {apiVersion: string}) => {\n agent: {action: {prompt: (request: PromptRequest) => Promise<unknown>}}\n }\n}\n\nexport interface ExplainedQuery {\n query: string\n params: Record<string, unknown>\n}\n\n/**\n * The Content Lake's plan for a query: how it fetches, filters, sorts and projects. `explain`\n * is a query endpoint option `@sanity/client`'s `fetch` has no way to send, so the query URL is\n * requested directly; the client still adds its perspective and variant. The query runs, as any\n * fetch of it would.\n */\nexport async function fetchQueryPlan(\n client: ExplainQueryClient,\n {query, params}: ExplainedQuery,\n signal?: AbortSignal,\n): Promise<string> {\n const response = await client.request({\n url: client.getDataUrl('query', encodeQueryString(query, params, {explain: 'true'})),\n tag: 'vista.explain',\n signal,\n })\n const plan = isPlainObject(response) ? response.explain : undefined\n if (typeof plan !== 'string') throw new Error('The response had no query plan')\n return plan.trim()\n}\n\n/**\n * What the plan's nodes mean, for the model, which otherwise guesses (and guesses wrong, as the\n * Content Lake team found); drawn from plans the API returns\n */\nconst PLAN_GLOSSARY = `How to read the plan:\n- Pipeline: the steps that compute the result, r1, r2 and so on in order. Each step reads the rows of an earlier one (Source: r1) and adds a column ($0, $1, ...). Result names the column the query returns. OneShot only says the step runs once.\n- StreamStep with a Fetch from DataSource: reads documents from the dataset's index. Its Filter, Sort, Limit and Score are applied by the index while reading, which is fast; Selection lists the attributes it reads. A Fetch without a Limit reads every document its Filter matches.\n- Fetch from an ArraySource: goes through an array an earlier step computed, without reading the dataset.\n- Aggregate: computes count() and similar functions in the index, without reading the documents.\n- MapStep: computes a value for every row, such as a projection.\n- ExtendStep: brings a value from the enclosing scope (^) into a nested pipeline.\n- ResolveRefStep: follows a reference (->) for every row, in batches.\n- HashBatchStep: runs a subquery once for all rows, in a single batched Fetch, rather than once per row.\n- FilterStep: filters rows in memory, after they were read. Everything the Fetch let through was read first, so a FilterStep means part of the filter could not use the index, typically a join with -> or a function in the filter, and it gets slow on large datasets.\n- SortStep and SliceStep: sort or slice in memory after reading, rather than in the index.\nDescribe steps only by these meanings. For a step not listed here, say what its name suggests and that it is not described here.`\n\nconst EXPLAIN_INSTRUCTION = `Explain a GROQ query of the Sanity Content Lake to a developer who wrote it.\n\nThe query:\n$query\n\nIts parameters:\n$params\n\nThe plan the Content Lake made for it:\n$plan\n\n$glossary\n\nFirst say in a sentence or two what the query fetches and returns. Then walk through how the plan runs it: what the Fetch step reads, which filters, sorting and limits it applies while reading, and what is left for later steps such as projections and joins. End with anything that could make it slow on a large dataset, or say that nothing stands out. Write plain text in short paragraphs, without markdown headings or code fences.`\n\n/** Agent Actions only exist on the experimental API */\nconst AGENT_API_VERSION = 'vX'\n\n/** A plain-language explanation of a query and its plan, written by Agent Actions */\nexport async function explainQuery(\n client: ExplainQueryClient,\n {query, params}: ExplainedQuery,\n plan: string,\n): Promise<string> {\n const response = await client.withConfig({apiVersion: AGENT_API_VERSION}).agent.action.prompt({\n instruction: EXPLAIN_INSTRUCTION,\n instructionParams: {query, params: JSON.stringify(params), plan, glossary: PLAN_GLOSSARY},\n temperature: 0.2,\n })\n if (typeof response !== 'string' || !response.trim()) {\n throw new Error('The explanation came back empty')\n }\n return response.trim()\n}\n","import {useCallback, useState} from 'react'\n\nimport {type QueryRequest} from '../store/types'\nimport {type AiCredits, readAiCreditsLimit} from '../util/aiCredits'\nimport {explainQuery, fetchQueryPlan} from '../util/explainQuery'\nimport {reportAiCreditsGranted, reportAiCreditsLimit} from './useAiCredits'\n\nexport type ExplainStep =\n | {status: 'idle'}\n | {status: 'loading'; url: string}\n | {status: 'done'; url: string; text: string}\n | {\n status: 'failed'\n url: string\n message: string\n /** The AI credits the request was turned down for, when that is what failed */\n limit: AiCredits | undefined\n }\n\nconst IDLE: ExplainStep = {status: 'idle'}\n\nfunction toMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/**\n * The Explain panel's query plan and plain-language explanation of the tab's current request.\n * Each belongs to the request it was made for: once the query, params or options change, the\n * panel starts over rather than describing a query that is no longer there.\n */\nexport function useQueryExplain(request: QueryRequest | null) {\n const [plan, setPlan] = useState<ExplainStep>(IDLE)\n const [explanation, setExplanation] = useState<ExplainStep>(IDLE)\n const url = request?.url\n const currentPlan = plan.status !== 'idle' && plan.url === url ? plan : IDLE\n const currentExplanation =\n explanation.status !== 'idle' && explanation.url === url ? explanation : IDLE\n\n const loadPlan = useCallback(async (current: QueryRequest): Promise<string | undefined> => {\n setPlan({status: 'loading', url: current.url})\n try {\n const text = await fetchQueryPlan(current.client, current)\n setPlan({status: 'done', url: current.url, text})\n return text\n } catch (error) {\n setPlan({status: 'failed', url: current.url, message: toMessage(error), limit: undefined})\n return undefined\n }\n }, [])\n\n const showPlan = useCallback(() => {\n if (request) void loadPlan(request)\n }, [loadPlan, request])\n\n const explain = useCallback(async () => {\n if (!request) return\n setExplanation({status: 'loading', url: request.url})\n const planText = currentPlan.status === 'done' ? currentPlan.text : await loadPlan(request)\n if (planText === undefined) {\n setExplanation(IDLE)\n return\n }\n try {\n const text = await explainQuery(request.client, request, planText)\n reportAiCreditsGranted(request.client)\n setExplanation({status: 'done', url: request.url, text})\n } catch (error) {\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(request.client, limit)\n setExplanation({status: 'failed', url: request.url, message: toMessage(error), limit})\n }\n }, [currentPlan, loadPlan, request])\n\n return {plan: currentPlan, explanation: currentExplanation, showPlan, explain}\n}\n","import {dequal} from 'dequal/lite'\n\nimport {type QueryRequest} from '../store/types'\n\n/**\n * Whether two requests run the same GROQ with the same params, whatever their other options.\n * Params are compared structurally, so the order they were typed in does not matter.\n */\nexport function haveSameQuery(a: QueryRequest, b: QueryRequest): boolean {\n return a.query === b.query && dequal(a.params, b.params)\n}\n","import {type ReactNode, useState} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport {useVistaExperience, type VistaLayout} from '../store/VistaActorContext'\nimport {CollapsiblePanel, type CollapsiblePanelTab, PANEL_HEADER_HEIGHT} from './CollapsiblePanel'\nimport {ResizableSplit} from './ResizableSplit'\nimport * as styles from './vista.module.css'\n\n/** The main area may never be dragged smaller than this */\nconst MIN_MAIN_HEIGHT = 120\n\nexport interface SplitWithBottomPanelProps {\n /** Prefix for the bottom panel's element ids and test ids */\n id: string\n testId: string\n /** The main area above the bottom panel */\n children: ReactNode\n /** The bottom panel's tabs; the first one starts out selected */\n tabs: CollapsiblePanelTab[]\n /** Initial height of the bottom panel, per layout */\n defaultBottomSize: Record<VistaLayout, number>\n /** Rendered below the split pane, such as the bottom action bar */\n footer?: ReactNode\n}\n\n/**\n * A column of the query tab: the main area (editor or result) above a resizable, collapsible\n * tabbed panel. Owns the panel's active tab, collapsed flag and dragged height; the height is\n * remembered per layout, since one dragged for two columns rarely suits a stacked pane.\n */\nexport function SplitWithBottomPanel(props: SplitWithBottomPanelProps) {\n const {id, testId, children, tabs, defaultBottomSize, footer} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const {layout} = useVistaExperience()\n const [activeTabId, setActiveTabId] = useState(() => tabs[0].id)\n const [collapsed, setCollapsed] = useState(false)\n const [bottomSizes, setBottomSizes] = useState<Partial<Record<VistaLayout, number>>>({})\n const bottomSize = bottomSizes[layout] ?? defaultBottomSize[layout]\n\n return (\n <Flex data-testid={testId} flexDirection=\"column\" height=\"100%\">\n <Box className={styles.splitPaneContainer}>\n <ResizableSplit\n allowResize={!collapsed}\n label={t('vista.split.bottom-panel')}\n minSecondarySize={MIN_MAIN_HEIGHT}\n minSize={PANEL_HEADER_HEIGHT}\n onChange={(size) => setBottomSizes((sizes) => ({...sizes, [layout]: size}))}\n onReset={() => setBottomSizes((sizes) => ({...sizes, [layout]: undefined}))}\n primary=\"second\"\n size={collapsed ? PANEL_HEADER_HEIGHT : bottomSize}\n split=\"horizontal\"\n testId={`${testId}-split`}\n >\n <Flex className={styles.paneFill}>{children}</Flex>\n <Box className={styles.paneFill}>\n <CollapsiblePanel\n activeTabId={activeTabId}\n collapsed={collapsed}\n id={id}\n onTabChange={setActiveTabId}\n onToggle={() => setCollapsed((current) => !current)}\n tabs={tabs}\n />\n </Box>\n </ResizableSplit>\n </Box>\n {footer}\n </Flex>\n )\n}\n","import {Portal, PortalProvider, usePortal} from '@sanity/ui'\nimport {type ReactNode} from 'react'\n\nimport {useTabDrawerSlot} from '../store/VistaActorContext'\n\n/**\n * Renders one of the active tab's tools into the sidebar's drawer (see `TabDrawerSlot`). Inside\n * it, tooltips and menus keep portalling where they did rather than into the drawer, whose\n * scrolling would clip them.\n */\nexport function TabDrawerPortal({children}: {children: ReactNode}) {\n const {element} = useTabDrawerSlot()\n const portal = usePortal()\n if (!element) return null\n return (\n <PortalProvider element={element}>\n <Portal>\n <PortalProvider __unstable_elements={portal.elements} element={portal.element}>\n {children}\n </PortalProvider>\n </Portal>\n </PortalProvider>\n )\n}\n","import {evaluate, parse} from 'groq-js'\n\nimport {isPlainObject} from '../../util/isPlainObject'\n\n/**\n * Delta GROQ, the mode GROQ-powered webhooks, listeners and Sanity Functions filter and project\n * changes with: `before()` and `after()` are a document before and after a change, `@` is the\n * document as it is after it (as it was, for a delete), and `delta::changedAny()`,\n * `delta::changedOnly()` and `delta::operation()` compare the two. The Content Lake's query\n * endpoint has no delta mode, so it runs in the browser with groq-js.\n */\n\nexport type DeltaOperation = 'create' | 'update' | 'delete'\n\n/** What `delta::operation()` says about a change: `null` with neither document */\nexport function deltaOperation(before: unknown, after: unknown): DeltaOperation | null {\n if (before === null) return after === null ? null : 'create'\n return after === null ? 'delete' : 'update'\n}\n\nexport interface DeltaInput {\n query: string\n params: Record<string, unknown>\n /** The document before the change, `null` when the change creates it */\n before: unknown\n /** The document after the change, `null` when the change deletes it */\n after: unknown\n}\n\nexport async function evaluateDelta({query, params, before, after}: DeltaInput): Promise<unknown> {\n const tree = parse(query, {mode: 'delta', params})\n const value = await evaluate(tree, {\n params,\n before: before ?? undefined,\n after: after ?? undefined,\n root: after ?? before ?? undefined,\n })\n return value.get()\n}\n\nexport interface DocumentRevision {\n /** The transaction's id, which is the document's `_rev` after it */\n id: string\n timestamp: string\n author: string | undefined\n}\n\n/** What loading a document's history needs of a client; a `SanityClient` has it */\nexport interface HistoryClient {\n getDataUrl: (operation: string, path?: string) => string\n request: (options: {url: string; tag: string; signal?: AbortSignal}) => Promise<unknown>\n}\n\n/** The history endpoints answer NDJSON, which the client hands over as text */\nfunction readLines(body: unknown): unknown[] {\n if (typeof body === 'string') {\n return body\n .split('\\n')\n .filter((line) => line.trim())\n .map((line): unknown => JSON.parse(line))\n }\n if (Array.isArray(body)) return body\n return isPlainObject(body) ? [body] : []\n}\n\n/** The document's latest revisions, newest first, from the History API's transactions */\nexport async function loadRevisions(\n client: HistoryClient,\n documentId: string,\n limit = 20,\n): Promise<DocumentRevision[]> {\n const body = await client.request({\n url: client.getDataUrl(\n 'history',\n `transactions/${encodeURIComponent(documentId)}?excludeContent=true&reverse=true&limit=${limit}`,\n ),\n tag: 'vista.delta',\n })\n return readLines(body).flatMap((line) =>\n isPlainObject(line) && typeof line.id === 'string'\n ? [\n {\n id: line.id,\n timestamp: typeof line.timestamp === 'string' ? line.timestamp : '',\n author: typeof line.author === 'string' ? line.author : undefined,\n },\n ]\n : [],\n )\n}\n\n/** The document as it was at a revision, `null` when it did not exist then */\nexport async function loadRevision(\n client: HistoryClient,\n documentId: string,\n revision: string,\n): Promise<unknown> {\n const body = await client.request({\n url: client.getDataUrl(\n 'history',\n `documents/${encodeURIComponent(documentId)}?revision=${encodeURIComponent(revision)}`,\n ),\n tag: 'vista.delta',\n })\n const documents = isPlainObject(body) && Array.isArray(body.documents) ? body.documents : []\n return documents[0] ?? null\n}\n","import {Card, Label} from '@sanity/ui'\nimport {type ReactNode, useEffect, useRef} from 'react'\nimport {Box, Flex} from 'ui5'\n\nimport {paramsExtensions} from '../../../codemirror/extensions'\nimport {VisionCodeMirror, type VisionCodeMirrorHandle} from '../../../codemirror/VisionCodeMirror'\nimport * as styles from '../vista.module.css'\n\n/**\n * A JSON editor whose text can also be replaced from outside, by a loaded document or a template.\n * It grows into the height its flex container leaves over.\n */\nexport function JsonEditor(props: {\n label: string\n testId: string\n value: string\n onChange: (text: string) => void\n /** Shown at the end of the label's row */\n actions?: ReactNode\n}) {\n const {label, testId, value, onChange, actions} = props\n const editorRef = useRef<VisionCodeMirrorHandle>(null)\n const shown = useRef(value)\n // A new value from outside replaces the text; an edit made here is already in the editor\n useEffect(() => {\n if (value === shown.current) return\n shown.current = value\n editorRef.current?.resetEditorContent(value)\n }, [value])\n return (\n <Flex flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} gap={2} minHeight=\"0\">\n <Flex alignItems=\"center\" flexShrink={0} gap={2}>\n <Label muted size={0}>\n {label}\n </Label>\n <Box flexBasis=\"0%\" flexGrow={1} />\n {actions}\n </Flex>\n <Card border className={styles.jsonEditorBox} data-testid={testId} radius={2}>\n <VisionCodeMirror\n extensions={paramsExtensions}\n initialValue={value}\n onChange={(text) => {\n shown.current = text\n onChange(text)\n }}\n ref={editorRef}\n underHeader\n />\n </Card>\n </Flex>\n )\n}\n","import {Badge, Button, Card, Label, Select, Stack, Text, TextInput} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useCallback, useEffect, useState} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex, Grid} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type QueryRequest} from '../../store/types'\nimport {\n deltaOperation,\n type DocumentRevision,\n evaluateDelta,\n type HistoryClient,\n loadRevision,\n loadRevisions,\n} from '../../util/deltaQuery'\nimport * as styles from '../vista.module.css'\nimport {JsonEditor} from './JsonEditor'\n\n/** Edits settle this long before the query is evaluated again */\nconst EVALUATE_DELAY_MS = 300\n\n/** The documents to compare, kept by the response panel so they survive switching panels */\nexport interface DeltaPanelState {\n documentId: string\n revisions: DocumentRevision[] | undefined\n loading: boolean\n loadError: string | undefined\n /** A revision id, or `''` for no document on that side */\n beforeRevision: string\n afterRevision: string\n /** JSON; empty for no document on that side */\n beforeText: string\n afterText: string\n}\n\nconst INITIAL_STATE: DeltaPanelState = {\n documentId: '',\n revisions: undefined,\n loading: false,\n loadError: undefined,\n beforeRevision: '',\n afterRevision: '',\n beforeText: '',\n afterText: '',\n}\n\nfunction toText(document: unknown): string {\n return document === null ? '' : JSON.stringify(document, null, 2)\n}\n\nexport interface DeltaPanel {\n state: DeltaPanelState\n setDocumentId: (documentId: string) => void\n /** Loads the document's revisions, the latest as After and the one before it as Before */\n load: (client: HistoryClient, documentId: string) => Promise<void>\n select: (\n client: HistoryClient,\n documentId: string,\n side: 'before' | 'after',\n revision: string,\n ) => Promise<void>\n setText: (side: 'before' | 'after', text: string) => void\n}\n\nexport function useDeltaPanel(): DeltaPanel {\n const [state, setState] = useState<DeltaPanelState>(INITIAL_STATE)\n\n const setDocumentId = useCallback((documentId: string) => {\n setState((current) => ({...current, documentId}))\n }, [])\n\n const load = useCallback(async (client: HistoryClient, id: string) => {\n const documentId = id.trim()\n if (!documentId) return\n setState((current) => ({...current, loading: true, loadError: undefined}))\n try {\n const revisions = await loadRevisions(client, documentId)\n const [latest, previous] = revisions\n const [after, before] = await Promise.all([\n latest ? loadRevision(client, documentId, latest.id) : null,\n previous ? loadRevision(client, documentId, previous.id) : null,\n ])\n setState((current) => ({\n ...current,\n loading: false,\n revisions,\n afterRevision: latest?.id ?? '',\n beforeRevision: previous?.id ?? '',\n afterText: toText(after),\n beforeText: toText(before),\n }))\n } catch (error) {\n setState((current) => ({\n ...current,\n loading: false,\n loadError: error instanceof Error ? error.message : String(error),\n }))\n }\n }, [])\n\n const select = useCallback(\n async (client: HistoryClient, id: string, side: 'before' | 'after', revision: string) => {\n const documentId = id.trim()\n const key = side === 'before' ? 'beforeRevision' : 'afterRevision'\n const textKey = side === 'before' ? 'beforeText' : 'afterText'\n setState((current) => ({...current, [key]: revision}))\n if (!revision) {\n setState((current) => ({...current, [textKey]: ''}))\n return\n }\n try {\n const document = await loadRevision(client, documentId, revision)\n setState((current) =>\n current[key] === revision ? {...current, [textKey]: toText(document)} : current,\n )\n } catch (error) {\n setState((current) => ({\n ...current,\n loadError: error instanceof Error ? error.message : String(error),\n }))\n }\n },\n [],\n )\n\n const setText = useCallback((side: 'before' | 'after', text: string) => {\n setState((current) => ({...current, [side === 'before' ? 'beforeText' : 'afterText']: text}))\n }, [])\n\n return {state, setDocumentId, load, select, setText}\n}\n\ntype Evaluation =\n | {status: 'idle'}\n | {status: 'invalid'; side: 'before' | 'after'; message: string}\n | {status: 'failed'; message: string}\n | {status: 'done'; value: unknown}\n\nfunction readDocument(text: string): {value: unknown} | {error: string} {\n if (!text.trim()) return {value: null}\n try {\n return {value: JSON.parse(text)}\n } catch (error) {\n return {error: error instanceof Error ? error.message : String(error)}\n }\n}\n\nexport interface DeltaTabProps {\n delta: DeltaPanel\n /** What the tab would fetch now: the query and params to evaluate, and the client for history */\n request: QueryRequest | null\n}\n\n/**\n * The query in delta mode, the way GROQ-powered webhooks, listeners and Sanity Functions run it,\n * against a document before and after a change: two revisions from the History API, or JSON\n * typed or pasted in, an empty side being no document (a create or a delete)\n */\nexport function DeltaTab({delta, request}: DeltaTabProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const {state} = delta\n const query = request?.query.trim() ? request.query : ''\n // The params by value, so a new object with the same params does not evaluate again\n const paramsKey = JSON.stringify(request?.params ?? {})\n const before = readDocument(state.beforeText)\n const after = readDocument(state.afterText)\n const ready =\n query !== '' &&\n 'value' in before &&\n 'value' in after &&\n (before.value !== null || after.value !== null)\n const evaluationKey = ready\n ? JSON.stringify([query, paramsKey, state.beforeText, state.afterText])\n : ''\n const [evaluated, setEvaluated] = useState<{key: string; outcome: Evaluation} | null>(null)\n\n useEffect(() => {\n if (!evaluationKey) return undefined\n const beforeValue = readDocumentValue(state.beforeText)\n const afterValue = readDocumentValue(state.afterText)\n const parsedParams: unknown = JSON.parse(paramsKey)\n const params =\n typeof parsedParams === 'object' && parsedParams !== null\n ? Object.fromEntries(Object.entries(parsedParams))\n : {}\n let cancelled = false\n const timer = setTimeout(() => {\n evaluateDelta({query, params, before: beforeValue, after: afterValue}).then(\n (value) => {\n if (!cancelled) setEvaluated({key: evaluationKey, outcome: {status: 'done', value}})\n },\n (error: unknown) => {\n if (cancelled) return\n setEvaluated({\n key: evaluationKey,\n outcome: {\n status: 'failed',\n message: error instanceof Error ? error.message : String(error),\n },\n })\n },\n )\n }, EVALUATE_DELAY_MS)\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n }, [evaluationKey, paramsKey, query, state.afterText, state.beforeText])\n\n let evaluation: Evaluation = {status: 'idle'}\n if ('error' in before) evaluation = {status: 'invalid', side: 'before', message: before.error}\n else if ('error' in after) evaluation = {status: 'invalid', side: 'after', message: after.error}\n else if (evaluated && evaluated.key === evaluationKey) evaluation = evaluated.outcome\n\n const operation = deltaOperation(\n readDocumentValue(state.beforeText),\n readDocumentValue(state.afterText),\n )\n const client = request?.client\n const formatTime = new Intl.DateTimeFormat(undefined, {dateStyle: 'medium', timeStyle: 'medium'})\n const revisionOptions = (state.revisions ?? []).map((revision) => (\n <option key={revision.id} value={revision.id}>\n {t('vista.delta.revision.option', {\n time: revision.timestamp ? formatTime.format(new Date(revision.timestamp)) : '',\n revision: revision.id,\n })}\n </option>\n ))\n\n return (\n // Scrolls only in a drawer too short for the least room the documents take\n <Flex\n data-testid=\"vista-delta\"\n flexDirection=\"column\"\n gap={4}\n height=\"100%\"\n overflow=\"auto\"\n padding={3}\n >\n <Text muted size={1}>\n {t('vista.delta.description')}\n </Text>\n <Flex alignItems=\"flex-end\" flexShrink={0} gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.delta.document-id')}\n </Label>\n <TextInput\n data-testid=\"vista-delta-document-id\"\n fontSize={1}\n onChange={(event) => delta.setDocumentId(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && client) void delta.load(client, state.documentId)\n }}\n padding={2}\n value={state.documentId}\n />\n </Stack>\n </Box>\n <Button\n data-testid=\"vista-delta-load\"\n disabled={!client || !state.documentId.trim() || state.loading}\n fontSize={1}\n loading={state.loading}\n mode=\"ghost\"\n onClick={() => client && void delta.load(client, state.documentId)}\n padding={2}\n text={t('vista.delta.load')}\n />\n </Flex>\n {state.loadError && (\n <Text data-testid=\"vista-delta-load-error\" size={1}>\n {t('vista.delta.load-failed', {message: state.loadError})}\n </Text>\n )}\n {/* The result is as tall as it needs up to two fifths of the room, its value scrolling past\n that; the two documents share the rest */}\n <Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows=\"fit-content(40%) minmax(0, 1fr)\"\n minHeight=\"320px\"\n >\n <DeltaResult evaluation={evaluation} operation={operation} request={request} />\n <Flex flexDirection=\"column\" gap={3} minHeight=\"0\">\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.before')}\n data-testid=\"vista-delta-before-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'before',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.beforeRevision}\n >\n <option value=\"\">{t('vista.delta.revision.none-before')}</option>\n {revisionOptions}\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.before')}\n onChange={(text) => delta.setText('before', text)}\n testId=\"vista-delta-before\"\n value={state.beforeText}\n />\n <JsonEditor\n actions={\n state.revisions && (\n <Box flexShrink={1} minWidth=\"0\">\n <Select\n aria-label={t('vista.delta.after')}\n data-testid=\"vista-delta-after-revision\"\n fontSize={1}\n onChange={(event) =>\n client &&\n void delta.select(\n client,\n state.documentId,\n 'after',\n event.currentTarget.value,\n )\n }\n padding={2}\n value={state.afterRevision}\n >\n {revisionOptions}\n <option value=\"\">{t('vista.delta.revision.none-after')}</option>\n </Select>\n </Box>\n )\n }\n label={t('vista.delta.after')}\n onChange={(text) => delta.setText('after', text)}\n testId=\"vista-delta-after\"\n value={state.afterText}\n />\n </Flex>\n </Grid>\n </Flex>\n )\n}\n\nfunction DeltaResult(props: {\n operation: string | null\n request: QueryRequest | null\n evaluation: Evaluation\n}) {\n const {operation, request, evaluation} = props\n const {t} = useTranslation(visionLocaleNamespace)\n return (\n <Flex\n data-testid=\"vista-delta-result\"\n flexDirection=\"column\"\n gap={3}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n <Flex alignItems=\"center\" flexShrink={0} gap={2}>\n <Label muted size={0}>\n {t('vista.delta.result')}\n </Label>\n {operation && (\n <Badge data-testid=\"vista-delta-operation\" fontSize={0}>\n {operation}\n </Badge>\n )}\n </Flex>\n {!request && (\n <Text muted size={1}>\n {t('vista.delta.no-request')}\n </Text>\n )}\n {request && evaluation.status === 'idle' && (\n <Text muted size={1}>\n {t('vista.delta.empty')}\n </Text>\n )}\n {evaluation.status === 'invalid' && (\n <Text size={1}>\n {evaluation.side === 'before'\n ? t('vista.delta.invalid-before', {message: evaluation.message})\n : t('vista.delta.invalid-after', {message: evaluation.message})}\n </Text>\n )}\n {evaluation.status === 'failed' && (\n <Text size={1}>{t('vista.delta.failed', {message: evaluation.message})}</Text>\n )}\n {evaluation.status === 'done' && typeof evaluation.value === 'boolean' && (\n <Card\n border\n data-testid=\"vista-delta-match\"\n padding={3}\n radius={2}\n tone={evaluation.value ? 'positive' : 'caution'}\n >\n <Text size={1}>\n {evaluation.value ? t('vista.delta.matches') : t('vista.delta.no-match')}\n </Text>\n </Card>\n )}\n {evaluation.status === 'done' && typeof evaluation.value !== 'boolean' && (\n <Card border className={styles.drawerScroller} padding={3} radius={2}>\n <Code data-testid=\"vista-delta-value\" size={1}>\n {JSON.stringify(evaluation.value, null, 2) ?? 'null'}\n </Code>\n </Card>\n )}\n </Flex>\n )\n}\n\nfunction readDocumentValue(text: string): unknown {\n const read = readDocument(text)\n return 'value' in read ? read.value : undefined\n}\n","import {Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ComponentType, useCallback, useId} from 'react'\nimport {VisuallyHidden} from 'ui5'\n\nexport interface DownloadButtonProps {\n /**\n * Builds the blob URL to download when the button is activated, so a result is only serialized\n * once someone asks for the file; the button is disabled while there is nothing to download\n */\n getBlobUrl: (() => string | undefined) | undefined\n /** Called when the file could not be built after all */\n onUnavailable?: () => void\n /** Suggested file name */\n download: string\n icon: ComponentType\n label: string\n /** Shown in the tooltip; defaults to the label */\n tooltip?: string\n testId: string\n}\n\n/** A button in the response panel's bottom action bar that downloads the result as a file */\nexport function DownloadButton({\n getBlobUrl,\n onUnavailable,\n download,\n icon,\n label,\n tooltip,\n testId,\n}: DownloadButtonProps) {\n const handleClick = useCallback(() => {\n const url = getBlobUrl?.()\n if (!url) {\n onUnavailable?.()\n return\n }\n // A link created for the click, so the result is not serialized for a link nobody follows\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = download\n anchor.rel = 'noopener'\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n }, [download, getBlobUrl, onUnavailable])\n\n const unavailable = getBlobUrl === undefined\n const hintId = useId()\n\n return (\n <Tooltip animate content={<Text size={1}>{tooltip || label}</Text>} placement=\"top\" portal>\n {/*\n A disabled button gets neither pointer events nor focus, so while the download is\n unavailable the wrapper stands in for it: the tooltip listens to the wrapper, and the\n wrapper takes the button's place in the tab order as a disabled button described by the\n tooltip's explanation, so a keyboard user can reach it too\n */}\n <span\n aria-describedby={unavailable && tooltip ? hintId : undefined}\n aria-disabled={unavailable || undefined}\n aria-label={unavailable ? label : undefined}\n role={unavailable ? 'button' : undefined}\n tabIndex={unavailable ? 0 : undefined}\n >\n <Button\n aria-hidden={unavailable || undefined}\n aria-label={label}\n data-testid={testId}\n disabled={unavailable}\n gap={2}\n icon={icon}\n mode=\"ghost\"\n onClick={handleClick}\n padding={2}\n text={label}\n />\n {unavailable && tooltip && <VisuallyHidden id={hintId}>{tooltip}</VisuallyHidden>}\n </span>\n </Tooltip>\n )\n}\n","/**\n * What stands out in a Content Lake query plan (the query endpoint's `explain` text), read from\n * the steps it names. A `FilterStep` filters rows in memory after they were read (a join with\n * `->` or a function in the filter), a `SortStep` or `SliceStep` sorts or slices in memory;\n * a `Fetch` with `Sort`/`Limit` lines does that in the index, a `HashBatchStep` runs a subquery\n * once for every row, and an `Aggregate` counts in the index.\n */\n\nexport const HIGH_PERFORMANCE_GROQ_URL =\n 'https://www.sanity.io/docs/developer-guides/high-performance-groq'\n\nexport type PlanInsight =\n /** `expression` is what the `FilterStep` evaluates */\n | {kind: 'filter-in-memory'; tone: 'caution'; expression: string}\n | {kind: 'sort-in-memory'; tone: 'caution'}\n | {kind: 'slice-in-memory'; tone: 'caution'}\n | {kind: 'index-sort-limit'; tone: 'positive'}\n | {kind: 'batched-subquery'; tone: 'positive'}\n | {kind: 'aggregate'; tone: 'positive'}\n\nconst FILTER_STEP = /\\bFilterStep\\s*\\{[^}]*?Expr:\\s*([^\\n}]+)/g\n\nfunction hasLine(plan: string, pattern: RegExp): boolean {\n return pattern.test(plan)\n}\n\nexport function readPlanInsights(plan: string): PlanInsight[] {\n const insights: PlanInsight[] = []\n for (const match of plan.matchAll(FILTER_STEP)) {\n insights.push({kind: 'filter-in-memory', tone: 'caution', expression: match[1].trim()})\n }\n if (hasLine(plan, /\\bSortStep\\b/)) insights.push({kind: 'sort-in-memory', tone: 'caution'})\n if (hasLine(plan, /\\bSliceStep\\b/)) insights.push({kind: 'slice-in-memory', tone: 'caution'})\n if (hasLine(plan, /^\\s*Sort:/m) && hasLine(plan, /^\\s*Limit:/m)) {\n insights.push({kind: 'index-sort-limit', tone: 'positive'})\n }\n if (hasLine(plan, /\\bHashBatchStep\\b/))\n insights.push({kind: 'batched-subquery', tone: 'positive'})\n if (hasLine(plan, /^\\s*Aggregate\\s*\\{/m)) insights.push({kind: 'aggregate', tone: 'positive'})\n return insights\n}\n","import {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Button, Card, Label, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useMemo} from 'react'\nimport {type TFunction, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useAiCredits} from '../../hooks/useAiCredits'\nimport {type ExplainStep} from '../../hooks/useQueryExplain'\nimport {type AiCreditsClient} from '../../util/aiCredits'\nimport {splitMessage} from '../../util/groqLint'\nimport {\n HIGH_PERFORMANCE_GROQ_URL,\n type PlanInsight,\n readPlanInsights,\n} from '../../util/planInsights'\nimport {AgentActionsTooltip} from '../AgentActionsTooltip'\nimport {AiCreditsStatus} from '../AiCreditsStatus'\n\n/** What a plan insight means, as the Explain panel and the WebMCP explain tool say it */\nexport function describeInsight(insight: PlanInsight, t: TFunction<'vision'>): string {\n switch (insight.kind) {\n case 'filter-in-memory':\n return t('vista.explain.insight.filter-in-memory')\n case 'sort-in-memory':\n return t('vista.explain.insight.sort-in-memory')\n case 'slice-in-memory':\n return t('vista.explain.insight.slice-in-memory')\n case 'index-sort-limit':\n return t('vista.explain.insight.index-sort-limit')\n case 'batched-subquery':\n return t('vista.explain.insight.batched-subquery')\n case 'aggregate':\n return t('vista.explain.insight.aggregate')\n default: {\n const unhandled: never = insight\n return String(unhandled)\n }\n }\n}\n\nexport interface ExplainTabProps {\n /** The tab's client, whose project the AI credits are read through */\n client: AiCreditsClient\n plan: ExplainStep\n explanation: ExplainStep\n /** There is a valid request to explain */\n canExplain: boolean\n onShowPlan: () => void\n onExplain: () => void\n}\n\n/**\n * How the Content Lake runs the tab's query: its query plan (the query endpoint's `explain`),\n * and on request an explanation of the query and the plan written by Agent Actions\n */\nexport function ExplainTab(props: ExplainTabProps) {\n const {client, plan, explanation, canExplain, onShowPlan, onExplain} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const credits = useAiCredits(client)\n const explaining = explanation.status === 'loading'\n const planText = plan.status === 'done' ? plan.text : undefined\n const insights = useMemo(() => (planText ? readPlanInsights(planText) : []), [planText])\n // The credits as the failed request reported them, or as last read\n const limit = explanation.status === 'failed' ? explanation.limit : undefined\n\n return (\n <Box data-testid=\"vista-explain\" padding={3}>\n <Stack gap={4}>\n <Text muted size={1}>\n {t('vista.explain.description')}\n </Text>\n <Flex flexWrap=\"wrap\" gap={2}>\n <AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-button\"\n disabled={!canExplain || explaining}\n fontSize={1}\n icon={SparklesIcon}\n loading={explaining}\n onClick={onExplain}\n padding={2}\n text={t('vista.explain.explain')}\n tone=\"primary\"\n />\n </AgentActionsTooltip>\n <Button\n data-testid=\"vista-explain-plan-button\"\n disabled={!canExplain || plan.status === 'loading'}\n fontSize={1}\n loading={plan.status === 'loading' && !explaining}\n mode=\"ghost\"\n onClick={onShowPlan}\n padding={2}\n text={t('vista.explain.plan')}\n />\n </Flex>\n <AiCreditsStatus apiHost={client.config().apiHost} credits={limit ?? credits} />\n {!canExplain && (\n <Text muted size={1}>\n {t('vista.explain.empty')}\n </Text>\n )}\n {explanation.status === 'done' && (\n <Card data-testid=\"vista-explanation\" padding={3} radius={2} tone=\"transparent\" border>\n <Stack gap={4}>\n {explanation.text\n .split(/\\n+/)\n .filter((paragraph) => paragraph.trim())\n .map((paragraph, index) => (\n <Text key={index} size={1}>\n {splitMessage(paragraph.trim()).map((segment, segmentIndex) =>\n segment.code ? <code key={segmentIndex}>{segment.text}</code> : segment.text,\n )}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {explanation.status === 'failed' && !limit && (\n <Text data-testid=\"vista-explain-error\" size={1}>\n {t('vista.explain.failed', {message: explanation.message})}\n </Text>\n )}\n {plan.status === 'failed' && (\n <Text data-testid=\"vista-explain-error\" size={1}>\n {t('vista.explain.plan-failed', {message: plan.message})}\n </Text>\n )}\n {plan.status === 'done' && insights.length > 0 && (\n <Stack data-testid=\"vista-plan-insights\" gap={2}>\n <Label muted size={0}>\n {t('vista.explain.insights.title')}\n </Label>\n {insights.map((insight, index) => (\n <Card\n border\n data-testid=\"vista-plan-insight\"\n key={`${insight.kind}:${index}`}\n padding={3}\n radius={2}\n tone={insight.tone}\n >\n <Stack gap={3}>\n <Text size={1}>{describeInsight(insight, t)}</Text>\n {insight.kind === 'filter-in-memory' && (\n <Code size={1}>{insight.expression}</Code>\n )}\n </Stack>\n </Card>\n ))}\n {insights.some((insight) => insight.tone === 'caution') && (\n <Text muted size={1}>\n <a href={HIGH_PERFORMANCE_GROQ_URL} rel=\"noreferrer\" target=\"_blank\">\n {t('vista.explain.insights.guide')}\n </a>\n </Text>\n )}\n </Stack>\n )}\n {plan.status === 'done' && (\n <Stack data-testid=\"vista-query-plan\" gap={2}>\n <Label muted size={0}>\n {t('vista.explain.plan-title')}\n </Label>\n <Code size={1}>{plan.text}</Code>\n </Stack>\n )}\n </Stack>\n </Box>\n )\n}\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {Badge, Button, Card, Label, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useMemo} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type VistaSavedFunction} from '../../store/types'\nimport {cx} from '../../util/cx'\nimport {\n declarationInsertion,\n describeBody,\n describeSignature,\n type FunctionDeclaration,\n isSameDeclaration,\n parseDeclaration,\n type TextRange,\n} from '../../util/groqFunctions'\nimport {EXTRACT_FUNCTION_SHORTCUT} from '../../util/shortcuts'\nimport * as styles from '../vista.module.css'\n\nconst DECLARATION_EXAMPLE = 'fn my::author($ref) = $ref->{name, \"slug\": slug.current};'\n\n/** A change to the query, in positions of the query as it is */\nexport interface QueryEdit {\n from: number\n to: number\n insert: string\n}\n\nexport interface FunctionsTabProps {\n query: string\n /** The query's declarations of custom functions */\n declarations: FunctionDeclaration[]\n library: readonly VistaSavedFunction[]\n onSave: (fn: VistaSavedFunction) => void\n onRemove: (id: string) => void\n /** Changes the query in the editor */\n onEdit: (edit: QueryEdit) => void\n /** Selects part of the query in the editor */\n onReveal: (range: TextRange) => void\n}\n\nfunction FunctionPreview({signature, body}: {signature: string; body: string}) {\n return (\n <Stack gap={2}>\n <Box className={styles.previewCode}>\n <Code size={1}>{signature}</Code>\n </Box>\n <Box className={styles.previewCode}>\n <Code size={0}>{body}</Code>\n </Box>\n </Stack>\n )\n}\n\nfunction DeclaredFunction(props: {\n declaration: FunctionDeclaration\n saved: VistaSavedFunction | undefined\n onSave: FunctionsTabProps['onSave']\n onReveal: FunctionsTabProps['onReveal']\n}) {\n const {declaration, saved, onSave, onReveal} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const upToDate = saved !== undefined && isSameDeclaration(saved.declaration, declaration.text)\n\n return (\n <Flex alignItems=\"center\" data-testid=\"vista-declared-function\" gap={2}>\n <Card\n aria-label={t('vista.functions.reveal', {name: declaration.id})}\n as=\"button\"\n className={cx(styles.lintFindingButton, styles.shrinkable)}\n flex={1}\n onClick={() => onReveal(declaration.range)}\n paddingX={3}\n paddingY={2}\n radius={2}\n type=\"button\"\n >\n <FunctionPreview\n body={describeBody(declaration)}\n signature={describeSignature(declaration)}\n />\n </Card>\n <Box flexShrink={0} paddingRight={2}>\n {upToDate ? (\n <Badge data-testid=\"vista-function-saved\" fontSize={0} tone=\"positive\">\n {t('vista.functions.saved')}\n </Badge>\n ) : (\n <Button\n data-testid=\"vista-function-save\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onSave({id: declaration.id, declaration: declaration.text})}\n padding={2}\n text={saved ? t('vista.functions.update') : t('vista.functions.save')}\n />\n )}\n </Box>\n </Flex>\n )\n}\n\nfunction LibraryFunction(props: {\n saved: VistaSavedFunction\n query: string\n declared: FunctionDeclaration | undefined\n onEdit: FunctionsTabProps['onEdit']\n onRemove: FunctionsTabProps['onRemove']\n}) {\n const {saved, query, declared, onEdit, onRemove} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const parsed = useMemo(() => parseDeclaration(saved.declaration), [saved.declaration])\n\n let action = null\n if (parsed && !declared) {\n action = (\n <Button\n data-testid=\"vista-function-add\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onEdit(declarationInsertion(query, saved.declaration))}\n padding={2}\n text={t('vista.functions.add')}\n />\n )\n } else if (parsed && declared && !isSameDeclaration(declared.text, saved.declaration)) {\n action = (\n <Button\n data-testid=\"vista-function-replace\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onEdit({...declared.range, insert: saved.declaration})}\n padding={2}\n text={t('vista.functions.replace')}\n />\n )\n } else if (declared) {\n action = (\n <Badge data-testid=\"vista-function-declared\" fontSize={0}>\n {t('vista.functions.declared')}\n </Badge>\n )\n }\n\n return (\n <Flex alignItems=\"center\" data-testid=\"vista-library-function\" gap={2}>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\" paddingX={3} paddingY={2}>\n <FunctionPreview\n body={parsed ? describeBody(parsed) : saved.declaration}\n signature={parsed ? describeSignature(parsed) : saved.id}\n />\n </Box>\n <Flex alignItems=\"center\" flexShrink={0} gap={1} paddingRight={1}>\n {action}\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.functions.remove')}</Text>}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={t('vista.functions.remove')}\n data-testid=\"vista-function-remove\"\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => onRemove(saved.id)}\n padding={2}\n tone=\"critical\"\n />\n </Tooltip>\n </Flex>\n </Flex>\n )\n}\n\n/**\n * The custom functions the query declares, each of which can go to the library, and the library,\n * whose functions can be declared in the query (or put back over a declaration that differs)\n */\nexport function FunctionsTab(props: FunctionsTabProps) {\n const {query, declarations, library, onSave, onRemove, onEdit, onReveal} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const savedById = useMemo(() => new Map(library.map((saved) => [saved.id, saved])), [library])\n const declaredById = useMemo(() => {\n const byId = new Map<string, FunctionDeclaration>()\n for (const declaration of declarations) {\n if (!byId.has(declaration.id)) byId.set(declaration.id, declaration)\n }\n return byId\n }, [declarations])\n\n return (\n <Box data-testid=\"vista-functions\" padding={3}>\n <Stack gap={4}>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.functions.query.title')}\n </Label>\n {declarations.length === 0 ? (\n <Stack gap={3}>\n <Text muted size={1}>\n {t('vista.functions.query.empty', {\n shortcut: EXTRACT_FUNCTION_SHORTCUT.keys.join('+'),\n })}\n </Text>\n <Code size={1}>{DECLARATION_EXAMPLE}</Code>\n </Stack>\n ) : (\n declarations.map((declaration) => (\n <DeclaredFunction\n declaration={declaration}\n key={`${declaration.id}:${declaration.range.from}`}\n onReveal={onReveal}\n onSave={onSave}\n saved={savedById.get(declaration.id)}\n />\n ))\n )}\n </Stack>\n <Stack gap={2}>\n <Label muted size={0}>\n {t('vista.functions.library.title')}\n </Label>\n <Text muted size={1}>\n {library.length === 0\n ? t('vista.functions.library.empty')\n : t('vista.functions.library.description')}\n </Text>\n {library.map((saved) => (\n <LibraryFunction\n declared={declaredById.get(saved.id)}\n key={saved.id}\n onEdit={onEdit}\n onRemove={onRemove}\n query={query}\n saved={saved}\n />\n ))}\n </Stack>\n </Stack>\n </Box>\n )\n}\n","import {isPlainObject} from '../../util/isPlainObject'\n\n/** Dotted field paths split into their segments; empty paths and segments are dropped */\nexport function parseFieldPaths(fields: readonly string[]): string[][] {\n return fields\n .map((field) =>\n field\n .split('.')\n .map((segment) => segment.trim())\n .filter(Boolean),\n )\n .filter((segments) => segments.length > 0)\n}\n\nfunction omit(value: unknown, paths: string[][], continuing: string[][]): unknown {\n // Arrays are transparent: `tags.label` reaches the `label` of every item in `tags`\n if (Array.isArray(value)) {\n let changed = false\n const items = value.map((item) => {\n const next = omit(item, paths, continuing)\n if (next !== item) changed = true\n return next\n })\n return changed ? items : value\n }\n if (!isPlainObject(value)) return value\n\n // A path matches from any object, as well as further down the paths entered above\n const active = continuing.length > 0 ? [...paths, ...continuing] : paths\n let changed = false\n const entries: [string, unknown][] = []\n for (const [key, child] of Object.entries(value)) {\n const matching = active.filter((segments) => segments[0] === key)\n if (matching.some((segments) => segments.length === 1)) {\n changed = true\n continue\n }\n const next = omit(\n child,\n paths,\n matching.map((segments) => segments.slice(1)),\n )\n if (next !== child) changed = true\n entries.push([key, next])\n }\n // `fromEntries` defines properties, so a `__proto__` key stays a key\n return changed ? Object.fromEntries(entries) : value\n}\n\n/**\n * The value without the fields at `paths`, matched at any depth: `[['_rev']]` drops every\n * `_rev`, `[['_system', 'base', 'rev']]` that nested field wherever the path fits. Parts that\n * keep all their fields are returned as they are.\n */\nexport function omitFields(value: unknown, paths: readonly string[][]): unknown {\n return paths.length === 0 ? value : omit(value, [...paths], [])\n}\n","import {dequal} from 'dequal/lite'\n\nimport {type FetchHistoryEntry} from '../store/types'\nimport {formatGroq} from './groqWasm'\n\n/**\n * Narrower than anything, so the formatter breaks every group it can: one projection attribute,\n * condition, array item or argument per line, like the indented JSON the other diffs show\n */\nconst QUERY_DIFF_WIDTH = 1\n\nexport type RequestChangeId = 'query' | 'params' | 'url'\n\nexport interface RequestChange {\n id: RequestChangeId\n /** Text diffed line by line */\n previous: string\n next: string\n lang: 'json' | 'text'\n}\n\ntype FetchedRequest = Pick<FetchHistoryEntry, 'query' | 'params' | 'url'>\n\n/**\n * The parts of a query URL that can change the result besides the query and params, one per\n * line: the API host, version and dataset in the path, then the options. The query and params\n * have diffs of their own, and a Content Source Map does not change the result.\n */\nexport function describeRequestUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n return `${url}\\n`\n }\n const lines = [`${parsed.origin}${parsed.pathname}`]\n for (const [key, value] of parsed.searchParams) {\n if (key === 'query' || key === 'resultSourceMap' || key.startsWith('$')) continue\n lines.push(`${key}=${value}`)\n }\n return `${lines.join('\\n')}\\n`\n}\n\nfunction withTrailingNewline(text: string): string {\n return text.endsWith('\\n') ? text : `${text}\\n`\n}\n\n/**\n * A query laid out for a line diff with `groq-format`. One that does not parse (or a formatter\n * that failed to load) is diffed as it was typed, so this never rejects.\n */\nexport async function formatQueryForDiff(query: string): Promise<string> {\n try {\n return withTrailingNewline(await formatGroq(query, QUERY_DIFF_WIDTH))\n } catch {\n return withTrailingNewline(query)\n }\n}\n\nfunction toJson(params: Record<string, unknown>): string {\n return `${JSON.stringify(params, null, 2)}\\n`\n}\n\n/** What differs between the requests of two fetches, in the order the diffs are shown */\nexport function getRequestChanges(previous: FetchedRequest, next: FetchedRequest): RequestChange[] {\n const changes: RequestChange[] = []\n if (previous.query !== next.query) {\n changes.push({\n id: 'query',\n previous: withTrailingNewline(previous.query),\n next: withTrailingNewline(next.query),\n lang: 'text',\n })\n }\n if (!dequal(previous.params, next.params)) {\n changes.push({\n id: 'params',\n previous: toJson(previous.params),\n next: toJson(next.params),\n lang: 'json',\n })\n }\n const previousUrl = describeRequestUrl(previous.url)\n const nextUrl = describeRequestUrl(next.url)\n if (previousUrl !== nextUrl) {\n changes.push({id: 'url', previous: previousUrl, next: nextUrl, lang: 'text'})\n }\n return changes\n}\n","import {Component, type ReactNode} from 'react'\n\nimport {createRetryableLazy} from '../../../util/createRetryableLazy'\n\n// The diff (`@pierre/diffs` and Shiki) only loads once a diff is shown, and a failed load can be\n// retried from the boundary\nconst codeDiff = createRetryableLazy(() => import('./CodeDiff'))\n\nexport const CodeDiffLoader = codeDiff.Component\n\ninterface DiffBoundaryProps {\n children: ReactNode\n renderFallback: (retry: () => void) => ReactNode\n}\n\n/** Catches a diff that failed to load or render, and offers to load it again */\nexport class DiffBoundary extends Component<DiffBoundaryProps, {failed: boolean}> {\n state = {failed: false}\n\n static getDerivedStateFromError() {\n return {failed: true}\n }\n\n retry = () => {\n codeDiff.retry()\n this.setState({failed: false})\n }\n\n render() {\n return this.state.failed ? this.props.renderFallback(this.retry) : this.props.children\n }\n}\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {Badge, Button, Card, Stack, Text} from '@sanity/ui'\nimport {dequal} from 'dequal/lite'\nimport {type ReactNode, Suspense, use, useId, useMemo, useState} from 'react'\nimport {type TFunction, useDateTimeFormat, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {DelayedSpinner} from '../../../components/DelayedSpinner'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type FetchHistoryEntry, type FetchReason} from '../../store/types'\nimport {omitFields, parseFieldPaths} from '../../util/omitFields'\nimport {\n formatQueryForDiff,\n getRequestChanges,\n type RequestChangeId,\n} from '../../util/requestChanges'\nimport {sortSyncTags} from '../../util/syncTags'\nimport {CodeDiffLoader, DiffBoundary} from './LazyCodeDiff'\n\nfunction describeFetchReason(reason: FetchReason, t: TFunction<'vision'>): string {\n switch (reason.type) {\n case 'manual':\n return t('vista.history.reason.manual')\n case 'shortcut':\n return t('vista.history.reason.shortcut')\n case 'options':\n return t('vista.history.reason.options')\n case 'load':\n return t('vista.history.reason.load')\n case 'resume':\n return t('vista.history.reason.resume')\n case 'live-start':\n return t('vista.history.reason.live-start')\n case 'generated':\n return t('vista.history.reason.generated')\n case 'paste':\n return t('vista.history.reason.paste')\n case 'link':\n return t('vista.history.reason.link')\n case 'mutation':\n return t('vista.history.reason.mutation')\n case 'live':\n return reason.matchedTags.length > 0\n ? t('vista.history.reason.live')\n : t('vista.history.reason.live-restart')\n default: {\n const exhaustive: never = reason\n return String(exhaustive)\n }\n }\n}\n\nfunction describeRequestChange(id: RequestChangeId, t: TFunction<'vision'>): string {\n switch (id) {\n case 'query':\n return t('vista.history.diff.query')\n case 'params':\n return t('vista.history.diff.params')\n case 'url':\n return t('vista.history.diff.url')\n default: {\n const exhaustive: never = id\n return String(exhaustive)\n }\n }\n}\n\nfunction toJson(value: unknown): string {\n // Indented like the copied and exported JSON, so a changed value is a changed line\n return `${JSON.stringify(value, null, 2)}\\n`\n}\n\nfunction DiffSection(props: {\n label: string\n testId: string\n actions?: ReactNode\n children: ReactNode\n}) {\n const {label, testId, actions, children} = props\n return (\n <Stack data-testid={testId} gap={2}>\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text size={1} weight=\"medium\">\n {label}\n </Text>\n {actions}\n </Flex>\n {children}\n </Stack>\n )\n}\n\ninterface QueryDiffTexts {\n previous: string\n next: string\n}\n\nfunction QueryDiff(props: {texts: Promise<QueryDiffTexts>}) {\n const {t} = useTranslation(visionLocaleNamespace)\n const {previous, next} = use(props.texts)\n if (previous === next) {\n return (\n <Text data-testid=\"vista-history-query-formatting-only\" muted size={1}>\n {t('vista.history.diff.query-formatting-only')}\n </Text>\n )\n }\n return <CodeDiffLoader lang=\"text\" next={next} previous={previous} />\n}\n\nfunction HistoryEntry(props: {\n entry: FetchHistoryEntry\n /** The successful fetch before this one, which the request and result are compared with */\n previous: FetchHistoryEntry | undefined\n /** Fields left out of the diff, as set in the settings, and split into path segments */\n hiddenFields: string[]\n hiddenPaths: string[][]\n}) {\n const {entry, previous, hiddenFields, hiddenPaths} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const formatTime = useDateTimeFormat({timeStyle: 'medium'})\n const notApplicable = t('result.timing-not-applicable')\n const [expanded, setExpanded] = useState(false)\n const [showHidden, setShowHidden] = useState(false)\n const changesId = useId()\n const requestChanges = useMemo(\n () => (previous ? getRequestChanges(previous, entry) : []),\n [entry, previous],\n )\n // Formatted once the changes are shown. The promise is made here rather than in `QueryDiff`,\n // which suspends on it, since a component that suspends while mounting keeps no state or memo\n const queryTexts = useMemo(() => {\n if (!expanded || !previous || previous.query === entry.query) return undefined\n return Promise.all([formatQueryForDiff(previous.query), formatQueryForDiff(entry.query)]).then(\n ([previousText, nextText]) => ({previous: previousText, next: nextText}),\n )\n }, [entry.query, expanded, previous])\n const nextResult = entry.result\n const previousResult = previous?.result\n const resultComparable =\n entry.resultChange === 'changed' && nextResult !== undefined && previousResult !== undefined\n const comparable = resultComparable || requestChanges.length > 0\n // The results without the hidden fields, which change with every revision\n const shown = useMemo(() => {\n if (!resultComparable || hiddenPaths.length === 0) return undefined\n const previousShown = omitFields(previousResult.value, hiddenPaths)\n const nextShown = omitFields(nextResult.value, hiddenPaths)\n // Results without hidden fields come back as they are, and there is nothing to hide then\n if (previousShown === previousResult.value && nextShown === nextResult.value) return undefined\n return {previous: previousShown, next: nextShown, same: dequal(previousShown, nextShown)}\n }, [hiddenPaths, nextResult, previousResult, resultComparable])\n const onlyHiddenChanged = shown?.same === true\n // When only hidden fields changed, the diff without them would be empty\n const diffed = shown && !showHidden && !onlyHiddenChanged ? shown : undefined\n const resultDiff = useMemo(() => {\n if (!resultComparable) return undefined\n return {\n previous: toJson(diffed ? diffed.previous : previousResult.value),\n next: toJson(diffed ? diffed.next : nextResult.value),\n }\n }, [diffed, nextResult, previousResult, resultComparable])\n\n let status: string | undefined\n if (onlyHiddenChanged) {\n status = t('vista.history.only-hidden-changed')\n } else if (entry.resultChange === 'changed' && !resultComparable) {\n status = t('vista.history.changed')\n } else if (entry.resultChange === 'unchanged') {\n status = t(requestChanges.length > 0 ? 'vista.history.same-result' : 'vista.history.unchanged')\n } else if (entry.resultChange === 'too-large') {\n status = t('vista.history.too-large')\n }\n\n return (\n <Card\n borderBottom\n data-testid=\"vista-history-entry\"\n paddingX={3}\n paddingY={2}\n tone={entry.status === 'error' ? 'critical' : 'default'}\n >\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Text muted size={1}>\n {formatTime.format(new Date(entry.requestedAt))}\n </Text>\n <Text size={1} weight=\"medium\">\n {describeFetchReason(entry.reason, t)}\n </Text>\n {entry.reason.type === 'live' &&\n sortSyncTags(entry.reason.matchedTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n {status && (\n <Text muted size={1}>\n {status}\n </Text>\n )}\n {comparable && (\n <Button\n aria-controls={changesId}\n aria-expanded={expanded}\n data-testid=\"vista-history-changes-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.history.changes')}\n />\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {entry.network?.viaCdn && (\n <Badge\n data-testid=\"vista-history-cdn\"\n fontSize={0}\n tone={entry.network.cacheHit ? 'positive' : 'default'}\n >\n {entry.network.cacheHit ? t('vista.history.cdn-cache-hit') : t('vista.history.cdn')}\n </Badge>\n )}\n {entry.status === 'error' ? (\n <Badge fontSize={0} tone=\"critical\">\n {t('vista.history.failed')}\n </Badge>\n ) : (\n <Text muted size={1}>\n {`${t('result.execution-time-label')} ${entry.ms === undefined ? notApplicable : `${entry.ms}ms`} · ${t('result.end-to-end-time-label')} ${entry.e2eMs === undefined ? notApplicable : `${entry.e2eMs}ms`}`}\n </Text>\n )}\n </Flex>\n {entry.errorMessage && (\n <Box paddingTop={2}>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {entry.errorMessage}\n </Text>\n </Box>\n )}\n {comparable && expanded && previous && (\n <Stack data-testid=\"vista-history-changes\" gap={3} id={changesId} paddingTop={2}>\n <Text muted size={1}>\n {t('vista.history.compared-with', {\n time: formatTime.format(new Date(previous.requestedAt)),\n })}\n </Text>\n <DiffBoundary\n renderFallback={(retry) => (\n <Flex alignItems=\"center\" gap={2}>\n <Text muted size={1}>\n {t('vista.history.changes-failed')}\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={retry}\n padding={2}\n text={t('vista.history.changes-retry')}\n />\n </Flex>\n )}\n >\n <Suspense fallback={<DelayedSpinner />}>\n <Stack gap={3}>\n {requestChanges.map((change) => (\n <DiffSection\n key={change.id}\n label={describeRequestChange(change.id, t)}\n testId={`vista-history-diff-${change.id}`}\n >\n {change.id === 'query' && queryTexts ? (\n <Suspense fallback={<DelayedSpinner />}>\n <QueryDiff texts={queryTexts} />\n </Suspense>\n ) : (\n <CodeDiffLoader\n lang={change.lang}\n next={change.next}\n previous={change.previous}\n />\n )}\n </DiffSection>\n ))}\n {resultDiff && (\n <DiffSection\n actions={\n shown &&\n !onlyHiddenChanged && (\n <>\n <Text data-testid=\"vista-history-hidden-fields\" muted size={1}>\n {t(\n showHidden ? 'vista.history.showing-hidden' : 'vista.history.hiding',\n {fields: hiddenFields.join(', ')},\n )}\n </Text>\n <Button\n data-testid=\"vista-history-hidden-toggle\"\n fontSize={1}\n mode=\"bleed\"\n onClick={() => setShowHidden((value) => !value)}\n padding={1}\n text={t(\n showHidden\n ? 'vista.history.hide-hidden'\n : 'vista.history.show-hidden',\n )}\n />\n </>\n )\n }\n label={t('vista.history.diff.result')}\n testId=\"vista-history-diff-result\"\n >\n <CodeDiffLoader\n lang=\"json\"\n next={resultDiff.next}\n previous={resultDiff.previous}\n />\n </DiffSection>\n )}\n </Stack>\n </Suspense>\n </DiffBoundary>\n </Stack>\n )}\n </Card>\n )\n}\n\nexport function HistoryTab(props: {\n history: FetchHistoryEntry[]\n /** Fields left out of the diffs (see `VistaHistoryDiffSettings`) */\n hiddenFields: string[]\n}) {\n const {history, hiddenFields} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const hiddenPaths = useMemo(() => parseFieldPaths(hiddenFields), [hiddenFields])\n // Newest first: the entry an entry is compared with is the next successful one in the list\n const previousSuccess = useMemo(() => {\n const previous = new Map<string, FetchHistoryEntry>()\n let older: FetchHistoryEntry | undefined\n for (let index = history.length - 1; index >= 0; index--) {\n const entry = history[index]\n if (older) previous.set(entry.id, older)\n if (entry.status === 'ok') older = entry\n }\n return previous\n }, [history])\n\n if (history.length === 0) {\n return (\n <Box padding={3}>\n <Text muted size={1}>\n {t('vista.history.empty')}\n </Text>\n </Box>\n )\n }\n\n return (\n <Stack data-testid=\"vista-history\">\n {history.map((entry) => (\n <HistoryEntry\n entry={entry}\n hiddenFields={hiddenFields}\n hiddenPaths={hiddenPaths}\n key={entry.id}\n previous={previousSuccess.get(entry.id)}\n />\n ))}\n </Stack>\n )\n}\n","import {Badge, Card, Stack, Text} from '@sanity/ui'\nimport {type TFunction, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type LintSeverity, type QueryLintFinding, splitMessage} from '../../util/groqLint'\nimport * as styles from '../vista.module.css'\n\nfunction severityLabel(severity: LintSeverity, t: TFunction<'vision'>): string {\n switch (severity) {\n case 'error':\n return t('vista.lint.severity.error')\n case 'warning':\n return t('vista.lint.severity.warning')\n case 'info':\n return t('vista.lint.severity.info')\n case 'hint':\n return t('vista.lint.severity.hint')\n default: {\n const exhaustive: never = severity\n return String(exhaustive)\n }\n }\n}\n\nfunction severityTone(severity: LintSeverity): 'critical' | 'caution' | 'primary' | 'default' {\n switch (severity) {\n case 'error':\n return 'critical'\n case 'warning':\n return 'caution'\n case 'info':\n return 'primary'\n case 'hint':\n return 'default'\n default: {\n const exhaustive: never = severity\n return exhaustive\n }\n }\n}\n\nexport interface LintTabProps {\n findings: QueryLintFinding[]\n /** Called with the finding to show in the editor */\n onReveal: (finding: QueryLintFinding) => void\n}\n\n/** The query editor's lint diagnostics as a list; each one selects its range in the editor */\nexport function LintTab({findings, onReveal}: LintTabProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n\n if (findings.length === 0) {\n return (\n <Box padding={3}>\n <Text muted size={1}>\n {t('vista.lint.empty')}\n </Text>\n </Box>\n )\n }\n\n return (\n <Stack data-testid=\"vista-lint\">\n {findings.map((finding) => (\n <Card\n as=\"button\"\n borderBottom\n className={styles.lintFindingButton}\n data-testid=\"vista-lint-finding\"\n key={`${finding.from}:${finding.to}:${finding.source ?? ''}:${finding.message}`}\n onClick={() => onReveal(finding)}\n paddingX={3}\n paddingY={3}\n type=\"button\"\n >\n <Flex alignItems=\"flex-start\" gap={3}>\n <Box flexShrink={0} paddingTop={1}>\n <Badge fontSize={0} tone={severityTone(finding.severity)}>\n {severityLabel(finding.severity, t)}\n </Badge>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1}>\n {splitMessage(finding.message).map((segment, index) =>\n segment.code ? (\n <code key={index}>{segment.text}</code>\n ) : (\n <span key={index}>{segment.text}</span>\n ),\n )}\n </Text>\n <Text muted size={0}>\n {t('vista.lint.position', {line: finding.line, column: finding.column})}\n {finding.source ? ` · ${finding.source}` : ''}\n </Text>\n </Stack>\n </Flex>\n </Card>\n ))}\n </Stack>\n )\n}\n","import {dequal} from 'dequal/lite'\n\nimport {isPlainObject} from '../../util/isPlainObject'\nimport {deltaOperation} from './deltaQuery'\n\n/** What a mutation does, one per mutation, as the Mutations API takes them */\nexport const MUTATION_KINDS = [\n 'create',\n 'createOrReplace',\n 'createIfNotExists',\n 'delete',\n 'patch',\n] as const\n\nexport type MutationKind = (typeof MUTATION_KINDS)[number]\n\nexport type MutationBody = Record<string, unknown>\n\nexport type MutationsInput =\n | {status: 'empty'}\n | {status: 'invalid-json'; message: string}\n | {status: 'not-a-list'}\n /** A mutation without exactly one of the kinds; `index` counts from 1 */\n | {status: 'invalid-mutation'; index: number}\n | {status: 'valid'; mutations: MutationBody[]}\n\nfunction isMutationKind(key: string): key is MutationKind {\n return MUTATION_KINDS.some((kind) => kind === key)\n}\n\n/** Mutations written as JSON (see `toMutations`) */\nexport function readMutations(text: string): MutationsInput {\n if (!text.trim()) return {status: 'empty'}\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch (error) {\n return {status: 'invalid-json', message: error instanceof Error ? error.message : String(error)}\n }\n return toMutations(value)\n}\n\n/**\n * Mutations as the Mutations API takes them: a list, a request body (`{\"mutations\": [...]}`) or a\n * single mutation. The API checks what each one holds.\n */\nexport function toMutations(value: unknown): MutationsInput {\n let list: unknown[] | undefined\n if (Array.isArray(value)) list = value\n else if (isPlainObject(value)) list = Array.isArray(value.mutations) ? value.mutations : [value]\n if (!list) return {status: 'not-a-list'}\n if (list.length === 0) return {status: 'empty'}\n\n const mutations: MutationBody[] = []\n for (const [index, item] of list.entries()) {\n const keys = isPlainObject(item) ? Object.keys(item) : []\n if (!isPlainObject(item) || keys.length !== 1 || !isMutationKind(keys[0])) {\n return {status: 'invalid-mutation', index: index + 1}\n }\n mutations.push(item)\n }\n return {status: 'valid', mutations}\n}\n\nexport interface ResultDocument {\n id: string\n type: string | undefined\n}\n\n/**\n * The documents a query result holds, by the IDs they are stored under: under a perspective a\n * draft or a version answers with the published `_id`, and its own in `_originalId`\n */\nexport function documentsInResult(result: unknown): ResultDocument[] {\n const seen = new Set<string>()\n const documents: ResultDocument[] = []\n for (const item of Array.isArray(result) ? result : [result]) {\n if (!isPlainObject(item)) continue\n const id =\n typeof item._originalId === 'string'\n ? item._originalId\n : typeof item._id === 'string'\n ? item._id\n : undefined\n if (!id || seen.has(id)) continue\n seen.add(id)\n documents.push({id, type: typeof item._type === 'string' ? item._type : undefined})\n }\n return documents\n}\n\nexport type MutationTemplate = 'patch' | 'create' | 'delete'\n\n/**\n * A mutation to start from, aimed at the documents of the shown result where it has any. The API\n * takes one ID per patch or delete, so several documents are aimed at by query.\n */\nexport function createMutationTemplate(\n template: MutationTemplate,\n documents: ResultDocument[],\n): MutationBody {\n const ids = documents.map((document) => document.id)\n const target = ids.length > 1 ? {query: '*[_id in $ids]', params: {ids}} : {id: ids[0] ?? ''}\n switch (template) {\n case 'patch':\n return {patch: {...target, set: {}}}\n case 'create':\n return {create: {_type: documents[0]?.type ?? ''}}\n case 'delete':\n return {delete: target}\n default: {\n const unknownTemplate: never = template\n throw new Error(`Unknown mutation template: ${String(unknownTemplate)}`)\n }\n }\n}\n\n/** The mutations with one more, or a list of just it; `undefined` when the text is no list */\nexport function addMutation(text: string, mutation: MutationBody): string | undefined {\n const input = readMutations(text)\n if (input.status === 'empty') return JSON.stringify([mutation], null, 2)\n if (input.status !== 'valid') return undefined\n return JSON.stringify([...input.mutations, mutation], null, 2)\n}\n\n/** What previewing and applying mutations needs of a client; a `SanityClient` has it */\nexport interface MutateClient {\n getDataUrl: (operation: string, path?: string) => string\n request: (options: {\n url: string\n method: 'POST'\n body: {mutations: MutationBody[]}\n query: Record<string, string>\n tag: string\n }) => Promise<unknown>\n getDocuments: (ids: string[], options: {tag: string}) => Promise<unknown[]>\n}\n\nexport interface MutationOptions {\n /** Gives array items without a `_key` one, which the studio needs to edit them */\n autoGenerateArrayKeys: boolean\n}\n\n/**\n * What a dry run ran, as a key: Apply only sends mutations whose dry run has this key, so editing\n * them, switching the dataset or changing an option asks for another dry run\n */\nexport function mutationRunKey(\n dataset: string,\n mutations: MutationBody[],\n options: MutationOptions,\n): string {\n return JSON.stringify([dataset, mutations, options])\n}\n\nexport type ChangeOperation = 'create' | 'update' | 'delete' | 'none'\n\nexport interface DocumentChange {\n id: string\n operation: ChangeOperation\n /** The document as it is now; `null` when the mutations create it */\n before: Record<string, unknown> | null\n /** The document as the mutations leave it; `null` when they delete it */\n after: Record<string, unknown> | null\n}\n\nexport interface MutationPreview {\n /** The documents the mutations touch, in the order the API lists them */\n changes: DocumentChange[]\n /** Documents touched beyond the first `PREVIEW_LIMIT`, which are counted but not compared */\n notShown: number\n}\n\nexport interface AppliedMutations {\n transactionId: string\n documentIds: string[]\n}\n\n/** Documents compared in a preview; each one is fetched as it is now to compare with */\nexport const PREVIEW_LIMIT = 50\n\ninterface MutationResult {\n id: string\n operation: string\n document: Record<string, unknown> | undefined\n}\n\n/**\n * The API answers with one result per document, whatever number of mutations touched it: the\n * operation they amount to and, asked for, the document as they leave it (as it was, for a delete)\n */\nfunction readResults(body: unknown): MutationResult[] {\n const results = isPlainObject(body) && Array.isArray(body.results) ? body.results : []\n return results.flatMap((result): MutationResult[] =>\n isPlainObject(result) && typeof result.id === 'string'\n ? [\n {\n id: result.id,\n operation: typeof result.operation === 'string' ? result.operation : 'update',\n document: isPlainObject(result.document) ? result.document : undefined,\n },\n ]\n : [],\n )\n}\n\nfunction mutationQuery(options: MutationOptions, dryRun: boolean): Record<string, string> {\n return {\n returnIds: 'true',\n visibility: 'sync',\n ...(dryRun ? {dryRun: 'true', returnDocuments: 'true'} : {}),\n ...(options.autoGenerateArrayKeys ? {autoGenerateArrayKeys: 'true'} : {}),\n }\n}\n\nfunction withoutRevision(document: Record<string, unknown>): Record<string, unknown> {\n const {_rev, _updatedAt, ...content} = document\n return content\n}\n\n/**\n * What the change does to the content. The API reports a patch that sets what is already there,\n * or a `createIfNotExists` of a document that exists, as an update with a new `_rev`\n */\nfunction changeOperation(\n before: Record<string, unknown> | null,\n after: Record<string, unknown> | null,\n): ChangeOperation {\n const operation = deltaOperation(before, after)\n if (operation === null) return 'none'\n if (before && after && dequal(withoutRevision(before), withoutRevision(after))) return 'none'\n return operation\n}\n\n/** Runs the mutations as a dry run, which changes nothing, and compares what they would change */\nexport async function previewMutations(\n client: MutateClient,\n mutations: MutationBody[],\n options: MutationOptions,\n): Promise<MutationPreview> {\n const body = await client.request({\n url: client.getDataUrl('mutate'),\n method: 'POST',\n body: {mutations},\n query: mutationQuery(options, true),\n tag: 'vista.mutate',\n })\n const results = readResults(body)\n const shown = results.slice(0, PREVIEW_LIMIT)\n // By ID, which is how the documents are stored: no perspective applies\n const current =\n shown.length > 0\n ? await client.getDocuments(\n shown.map((result) => result.id),\n {tag: 'vista.mutate'},\n )\n : []\n return {\n changes: shown.map((result, index): DocumentChange => {\n const existing = current[index]\n const before = isPlainObject(existing) ? existing : null\n const after = result.operation === 'delete' ? null : (result.document ?? before)\n return {id: result.id, operation: changeOperation(before, after), before, after}\n }),\n notShown: results.length - shown.length,\n }\n}\n\n/** Commits the mutations in one transaction */\nexport async function applyMutations(\n client: MutateClient,\n mutations: MutationBody[],\n options: MutationOptions,\n): Promise<AppliedMutations> {\n const body = await client.request({\n url: client.getDataUrl('mutate'),\n method: 'POST',\n body: {mutations},\n query: mutationQuery(options, false),\n tag: 'vista.mutate',\n })\n return {\n transactionId:\n isPlainObject(body) && typeof body.transactionId === 'string' ? body.transactionId : '',\n documentIds: readResults(body).map((result) => result.id),\n }\n}\n\nexport interface MutationFailure {\n message: string\n /** What the API says went wrong with each mutation it names; `index` counts from 1 */\n items: {index: number; message: string}[]\n}\n\n/** A failed mutation request as the API explains it, mutation by mutation where it does */\nexport function readMutationFailure(error: unknown): MutationFailure {\n const details: unknown = error instanceof Error ? Reflect.get(error, 'details') : undefined\n if (isPlainObject(details) && typeof details.description === 'string') {\n const items = Array.isArray(details.items) ? details.items : []\n return {\n message: details.description,\n items: items.flatMap((item) =>\n isPlainObject(item) &&\n typeof item.index === 'number' &&\n isPlainObject(item.error) &&\n typeof item.error.description === 'string'\n ? [{index: item.index + 1, message: item.error.description}]\n : [],\n ),\n }\n }\n return {message: error instanceof Error ? error.message : String(error), items: []}\n}\n","import {AGENT_API_VERSION, type GenerateQueryClient, MAX_GENERATE_ATTEMPTS} from './generateQuery'\nimport {\n documentsInResult,\n type MutateClient,\n type MutationBody,\n type MutationOptions,\n type MutationPreview,\n type MutationsInput,\n previewMutations,\n readMutationFailure,\n toMutations,\n} from './mutations'\n\n/** What `generateMutations` needs of a client; a `SanityClient` has it */\nexport interface GenerateMutationsClient\n extends MutateClient, Pick<GenerateQueryClient, 'withConfig'> {}\n\n/** As much of the shown result as goes into the prompt, as JSON */\nconst MAX_RESULT_LENGTH = 12_000\n\n/**\n * How mutations are written, for the model, including what the API turns down (a list of IDs in\n * `id`)\n */\nconst MUTATIONS_REFERENCE = `The Mutations API takes a list of mutations and applies them in order, in one transaction. Each mutation is an object with exactly one of these keys:\n- {\"create\": {\"_type\": \"post\", \"title\": \"…\"}}: a new document; give it an \"_id\" only to choose its ID\n- {\"createOrReplace\": {\"_id\": \"…\", \"_type\": \"…\", …}}: the whole document, replacing the one with that ID\n- {\"createIfNotExists\": {\"_id\": \"…\", \"_type\": \"…\", …}}\n- {\"delete\": {\"id\": \"…\"}}, or {\"delete\": {\"query\": \"*[_id in $ids]\", \"params\": {\"ids\": [\"…\"]}}}\n- {\"patch\": {\"id\": \"…\", …operations}}, or {\"patch\": {\"query\": \"…\", \"params\": {…}, …operations}} for every document the GROQ query matches\n\"id\" is always one document ID. For several documents, write a mutation for each ID or match them with a query such as *[_id in $ids].\nPatch operations, applied in this order: \"set\": {\"title\": \"New title\", \"seo.description\": \"…\"}, \"setIfMissing\": {\"tags\": []}, \"unset\": [\"subtitle\"], \"inc\": {\"views\": 1}, \"dec\": {\"stock\": 1}, \"insert\": {\"after\": \"tags[-1]\", \"items\": [\"news\"]} (or \"before\" and \"replace\").\nPaths: dots for nested fields, [0] for an array position ([-1] is the last), [_key==\"abc123\"] for an item by its key: \"tags[0]\", \"body[_key==\\\\\"abc123\\\\\"].children\".\nReferences are {\"_type\": \"reference\", \"_ref\": \"<the published document ID>\"}. Objects in arrays need a \"_key\" of 12 random letters and digits.\nNever set _rev, _createdAt or _updatedAt, and use the fields the schema has for the document's type.`\n\nconst INSTRUCTION = `You write mutations for the Sanity Content Lake.\n\nThe request:\n$request\n\nThe documents of the result the user is looking at, by the IDs to mutate them under (a draft or a version is listed under its own ID). Words such as \"these documents\", \"the documents\" or \"the ones I am looking at\" mean these:\n$documents\n\nThe result itself, as JSON:\n$result\n\nThe document types in the dataset:\n$schema\n\nHow mutations are written:\n$reference\n\nReply with JSON: an object with \"mutations\", the list of mutations that do what the request asks.`\n\nconst RETRY_INSTRUCTION = `${INSTRUCTION}\n\nYour previous attempt was rejected by the Content Lake:\n$previous\n\nFix that problem in your reply.`\n\nexport interface GeneratedMutations {\n mutations: MutationBody[]\n /** The dry run that checked them */\n preview: MutationPreview\n}\n\n/** Every attempt was rejected; the last one is kept so it can still be opened and fixed by hand */\nexport class GenerateMutationsError extends Error {\n readonly lastAttempt: MutationBody[] | undefined\n constructor(message: string, lastAttempt: MutationBody[] | undefined) {\n super(message)\n this.name = 'GenerateMutationsError'\n this.lastAttempt = lastAttempt\n }\n}\n\nexport interface GenerateMutationsOptions {\n /** What the mutations should do, in the user's words */\n request: string\n /** The result the user is looking at, which \"these documents\" refers to */\n result: unknown\n /** The workspace's document types, from `summarizeSchema` */\n schema: string\n /** The client of the dataset the mutations go to; it dry-runs each attempt */\n client: GenerateMutationsClient\n /** What the dry runs send along, as Apply would */\n mutationOptions: MutationOptions\n /** Called as each attempt starts, from 1 */\n onAttempt?: (attempt: number) => void\n signal?: AbortSignal\n}\n\nfunction describeInput(input: Exclude<MutationsInput, {status: 'valid'}>): string {\n switch (input.status) {\n case 'empty':\n return 'The reply had no mutations'\n case 'invalid-json':\n return `The reply was not JSON: ${input.message}`\n case 'not-a-list':\n return 'The reply had no list of mutations'\n case 'invalid-mutation':\n return `Mutation ${input.index} needs exactly one of create, createOrReplace, createIfNotExists, delete or patch`\n default: {\n const unknownInput: never = input\n return String(unknownInput)\n }\n }\n}\n\n/** The documents by ID and type, one per line */\nfunction describeDocuments(result: unknown): string {\n const documents = documentsInResult(result)\n if (documents.length === 0) return '(none: the result holds no documents)'\n return documents\n .map((document) => (document.type ? `- ${document.id} (${document.type})` : `- ${document.id}`))\n .join('\\n')\n}\n\nfunction describeResult(result: unknown): string {\n const json = JSON.stringify(result) ?? 'null'\n return json.length > MAX_RESULT_LENGTH ? `${json.slice(0, MAX_RESULT_LENGTH)}… (cut short)` : json\n}\n\n/**\n * Writes mutations for a request with Agent Actions (`client.agent.action.prompt`): the request,\n * the documents of the result the user is looking at, the workspace's document types and a\n * primer on mutations go in, and every attempt is dry-run on the Content Lake, which writes\n * nothing, before it is accepted. A rejected attempt is retried with the API's error, up to\n * {@link MAX_GENERATE_ATTEMPTS} times. A failing prompt request (no access to Agent Actions,\n * quota) rejects right away.\n */\nexport async function generateMutations(\n options: GenerateMutationsOptions,\n): Promise<GeneratedMutations> {\n const {request, result, schema, client, mutationOptions, onAttempt, signal} = options\n const agent = client.withConfig({apiVersion: AGENT_API_VERSION}).agent.action\n const documents = describeDocuments(result)\n const resultJson = describeResult(result)\n let previous: {attempt: unknown; problem: string} | undefined\n // The last attempt the dry run turned down, for opening by hand: a later reply may not even parse\n let lastRejected: MutationBody[] | undefined\n\n for (let attempt = 1; attempt <= MAX_GENERATE_ATTEMPTS; attempt++) {\n signal?.throwIfAborted()\n onAttempt?.(attempt)\n // oxlint-disable-next-line no-await-in-loop -- each attempt is asked with the previous one's error\n const response: unknown = await agent.prompt({\n instruction: previous ? RETRY_INSTRUCTION : INSTRUCTION,\n instructionParams: {\n request,\n documents,\n result: resultJson,\n schema,\n reference: MUTATIONS_REFERENCE,\n ...(previous\n ? {previous: `${JSON.stringify(previous.attempt)}\\nError: ${previous.problem}`}\n : {}),\n },\n format: 'json',\n temperature: 0.2,\n })\n signal?.throwIfAborted()\n const input = toMutations(response)\n if (input.status !== 'valid') {\n previous = {attempt: response, problem: describeInput(input)}\n continue\n }\n try {\n // oxlint-disable-next-line no-await-in-loop -- the dry run decides whether to ask again\n const preview = await previewMutations(client, input.mutations, mutationOptions)\n return {mutations: input.mutations, preview}\n } catch (error) {\n signal?.throwIfAborted()\n const failure = readMutationFailure(error)\n lastRejected = input.mutations\n previous = {\n attempt: input.mutations,\n problem: [\n failure.message,\n ...failure.items.map((item) => `Mutation ${item.index}: ${item.message}`),\n ].join('\\n'),\n }\n }\n }\n throw new GenerateMutationsError(previous?.problem ?? 'No mutations were generated', lastRejected)\n}\n","import {Button, Card, Stack, Text} from '@sanity/ui'\nimport {useCallback, useEffect, useRef, useState} from 'react'\nimport {type Schema, useSchema, useTranslation} from 'sanity'\nimport {Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {reportAiCreditsGranted, reportAiCreditsLimit, useAiCredits} from '../../hooks/useAiCredits'\nimport {type AiCredits, type AiCreditsClient, readAiCreditsLimit} from '../../util/aiCredits'\nimport {\n type GenerateMutationsClient,\n generateMutations,\n GenerateMutationsError,\n} from '../../util/generateMutations'\nimport {MAX_GENERATE_ATTEMPTS} from '../../util/generateQuery'\nimport {\n documentsInResult,\n type MutationBody,\n type MutationOptions,\n type MutationPreview,\n mutationRunKey,\n} from '../../util/mutations'\nimport {summarizeSchema} from '../../util/schemaSummary'\nimport {AiCreditsStatus} from '../AiCreditsStatus'\nimport {PromptRow} from '../PromptRow'\n\ntype GenerateStatus =\n | {type: 'idle'}\n | {type: 'generating'; attempt: number}\n | {\n type: 'failed'\n message: string\n lastAttempt: MutationBody[] | undefined\n /** The credits the request was turned down for, when that is what failed */\n limit: AiCredits | undefined\n }\n\nexport interface GenerateMutationsBarProps {\n /** The client of the dataset the mutations go to; it dry-runs each attempt */\n client: GenerateMutationsClient & AiCreditsClient\n dataset: string\n /** The result shown, whose documents the description can call \"these documents\" */\n result: unknown\n /** What the dry runs send along, as Apply would */\n mutationOptions: MutationOptions\n /** The mutations and the dry run that checked them, keyed by what it ran */\n onGenerated: (text: string, preview: {key: string; result: MutationPreview}) => void\n /** Puts mutations the dry run turned down in the editor, to fix by hand */\n onOpenAttempt: (text: string) => void\n onClose: () => void\n}\n\nfunction toText(mutations: MutationBody[]): string {\n return JSON.stringify(mutations, null, 2)\n}\n\n/**\n * Writes mutations from a description with Agent Actions, above the mutations editor. The\n * documents of the shown result are the ones the description can refer to, and every attempt is\n * dry-run, which writes nothing, so what it would change shows straight away.\n */\nexport function GenerateMutationsBar(props: GenerateMutationsBarProps) {\n const {client, dataset, result, mutationOptions, onGenerated, onOpenAttempt, onClose} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const schema = useSchema() as Schema | undefined\n const [request, setRequest] = useState('')\n const [status, setStatus] = useState<GenerateStatus>({type: 'idle'})\n const controllerRef = useRef<AbortController | null>(null)\n const credits = useAiCredits(client)\n\n useEffect(() => () => controllerRef.current?.abort(), [])\n\n const generate = useCallback(async () => {\n const description = request.trim()\n if (!description) return\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n setStatus({type: 'generating', attempt: 1})\n // The types of the result's documents, besides the ones the description names\n const types = new Set(documentsInResult(result).flatMap((document) => document.type ?? []))\n try {\n const generated = await generateMutations({\n request: description,\n result,\n schema: schema ? summarizeSchema(schema, [description, ...types].join(' ')) : '',\n client,\n mutationOptions,\n signal: controller.signal,\n onAttempt: (attempt) => setStatus({type: 'generating', attempt}),\n })\n if (controller.signal.aborted) return\n reportAiCreditsGranted(client)\n onGenerated(toText(generated.mutations), {\n key: mutationRunKey(dataset, generated.mutations, mutationOptions),\n result: generated.preview,\n })\n } catch (error) {\n if (controller.signal.aborted) return\n const limit = readAiCreditsLimit(error)\n if (limit) reportAiCreditsLimit(client, limit)\n setStatus({\n type: 'failed',\n message: error instanceof Error ? error.message : String(error),\n lastAttempt: error instanceof GenerateMutationsError ? error.lastAttempt : undefined,\n limit,\n })\n }\n }, [client, dataset, mutationOptions, onGenerated, request, result, schema])\n\n const generating = status.type === 'generating'\n const lastAttempt = status.type === 'failed' ? status.lastAttempt : undefined\n // The credits as the failed request reported them, or as last read while nothing is going on\n const shownCredits =\n status.type === 'failed' ? status.limit : status.type === 'idle' ? credits : undefined\n const atLimit = shownCredits?.granted === false\n\n return (\n <Card border data-testid=\"vista-mutate-generate-bar\" padding={2} radius={2}>\n <Stack gap={2}>\n <PromptRow\n label={t('vista.mutate.generate.label')}\n onChange={setRequest}\n onClose={onClose}\n onSubmit={() => void generate()}\n pending={generating}\n placeholder={t('vista.mutate.generate.placeholder')}\n testIdPrefix=\"vista-mutate-generate\"\n value={request}\n />\n {status.type === 'idle' && !atLimit && (\n <Text muted size={0}>\n {t('vista.mutate.generate.description')}\n </Text>\n )}\n {status.type === 'generating' && (\n <Text data-testid=\"vista-mutate-generate-progress\" muted size={1}>\n {status.attempt > 1\n ? t('vista.mutate.generate.progress-retry', {\n attempt: status.attempt,\n max: MAX_GENERATE_ATTEMPTS,\n })\n : t('vista.mutate.generate.progress')}\n </Text>\n )}\n {status.type === 'failed' && !atLimit && (\n <Card data-testid=\"vista-mutate-generate-error\" padding={3} radius={2} tone=\"critical\">\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {t('vista.mutate.generate.failed')}\n </Text>\n <Text size={1}>{status.message}</Text>\n {lastAttempt && (\n <Flex>\n <Button\n data-testid=\"vista-mutate-generate-open-anyway\"\n fontSize={1}\n mode=\"ghost\"\n onClick={() => onOpenAttempt(toText(lastAttempt))}\n padding={2}\n text={t('vista.generate.open-anyway')}\n />\n </Flex>\n )}\n </Stack>\n </Card>\n )}\n <AiCreditsStatus apiHost={client.config().apiHost} credits={shownCredits} size={0} />\n </Stack>\n </Card>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Badge, type BadgeTone, Button, Card, Label, Stack, Text} from '@sanity/ui'\nimport {Menu, MenuButton, MenuItem} from '@sanity/ui/menu'\nimport {Suspense, useCallback, useId, useMemo, useState} from 'react'\nimport {type TFunction, useTranslation} from 'sanity'\nimport {Box, Flex, Grid} from 'ui5'\n\nimport {DelayedSpinner} from '../../../components/DelayedSpinner'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type AiCreditsClient} from '../../util/aiCredits'\nimport {type GenerateMutationsClient} from '../../util/generateMutations'\nimport {\n addMutation,\n applyMutations,\n type ChangeOperation,\n createMutationTemplate,\n type DocumentChange,\n documentsInResult,\n type MutateClient,\n type MutationBody,\n type MutationFailure,\n type MutationOptions,\n type MutationPreview,\n type MutationTemplate,\n mutationRunKey,\n previewMutations,\n readMutationFailure,\n readMutations,\n} from '../../util/mutations'\nimport {omitFields, parseFieldPaths} from '../../util/omitFields'\nimport {AgentActionsTooltip} from '../AgentActionsTooltip'\nimport {SwitchField} from '../SwitchField'\nimport * as styles from '../vista.module.css'\nimport {GenerateMutationsBar} from './GenerateMutationsBar'\nimport {JsonEditor} from './JsonEditor'\nimport {CodeDiffLoader, DiffBoundary} from './LazyCodeDiff'\n\n/** Changes shown with their diff open; the rest open on request */\nconst EXPANDED_CHANGES = 3\n\n/** What a dry run or an apply sends, and the key a dry run must match for Apply to send it */\nexport interface MutationRun {\n /** The dataset, the mutations and the options */\n key: string\n mutations: MutationBody[]\n options: MutationOptions\n}\n\n/** The panel's state, kept by the response panel so it survives switching panels */\nexport interface MutatePanelState {\n text: string\n autoGenerateArrayKeys: boolean\n /** The latest dry run, with the key of what it ran */\n preview: {key: string; result: MutationPreview} | undefined\n pending: 'preview' | 'apply' | undefined\n failure: {action: 'preview' | 'apply'; failure: MutationFailure} | undefined\n applied: {transactionId: string; documentCount: number; dataset: string} | undefined\n}\n\nconst INITIAL_STATE: MutatePanelState = {\n text: '',\n autoGenerateArrayKeys: true,\n preview: undefined,\n pending: undefined,\n failure: undefined,\n applied: undefined,\n}\n\nexport interface MutatePanel {\n state: MutatePanelState\n setText: (text: string) => void\n /** Replaces the mutations with generated ones, and shows the dry run that checked them */\n showGenerated: (text: string, preview: NonNullable<MutatePanelState['preview']>) => void\n setAutoGenerateArrayKeys: (autoGenerateArrayKeys: boolean) => void\n preview: (client: MutateClient, run: MutationRun) => Promise<void>\n /** Resolves with whether the mutations were applied */\n apply: (client: MutateClient, run: MutationRun, dataset: string) => Promise<boolean>\n}\n\nexport function useMutatePanel(): MutatePanel {\n const [state, setState] = useState<MutatePanelState>(INITIAL_STATE)\n\n const setText = useCallback((text: string) => {\n setState((current) => ({...current, text}))\n }, [])\n\n const showGenerated = useCallback(\n (text: string, generatedPreview: NonNullable<MutatePanelState['preview']>) => {\n setState((current) => ({\n ...current,\n text,\n preview: generatedPreview,\n failure: undefined,\n applied: undefined,\n }))\n },\n [],\n )\n\n const setAutoGenerateArrayKeys = useCallback((autoGenerateArrayKeys: boolean) => {\n setState((current) => ({...current, autoGenerateArrayKeys}))\n }, [])\n\n const preview = useCallback(async (client: MutateClient, run: MutationRun) => {\n setState((current) => ({\n ...current,\n pending: 'preview',\n failure: undefined,\n applied: undefined,\n }))\n try {\n const result = await previewMutations(client, run.mutations, run.options)\n setState((current) => ({...current, pending: undefined, preview: {key: run.key, result}}))\n } catch (error) {\n setState((current) => ({\n ...current,\n pending: undefined,\n preview: undefined,\n failure: {action: 'preview', failure: readMutationFailure(error)},\n }))\n }\n }, [])\n\n const apply = useCallback(async (client: MutateClient, run: MutationRun, dataset: string) => {\n setState((current) => ({...current, pending: 'apply', failure: undefined}))\n try {\n const applied = await applyMutations(client, run.mutations, run.options)\n setState((current) => ({\n ...current,\n pending: undefined,\n // What it showed is what the dataset holds now\n preview: undefined,\n applied: {\n transactionId: applied.transactionId,\n documentCount: applied.documentIds.length,\n dataset,\n },\n }))\n return true\n } catch (error) {\n setState((current) => ({\n ...current,\n pending: undefined,\n failure: {action: 'apply', failure: readMutationFailure(error)},\n }))\n return false\n }\n }, [])\n\n return {state, setText, showGenerated, setAutoGenerateArrayKeys, preview, apply}\n}\n\nfunction describeOperation(operation: ChangeOperation, t: TFunction<'vision'>): string {\n switch (operation) {\n case 'create':\n return t('vista.mutate.operation.create')\n case 'update':\n return t('vista.mutate.operation.update')\n case 'delete':\n return t('vista.mutate.operation.delete')\n case 'none':\n return t('vista.mutate.operation.none')\n default: {\n const unknownOperation: never = operation\n return String(unknownOperation)\n }\n }\n}\n\nconst OPERATION_TONES: Record<ChangeOperation, BadgeTone> = {\n create: 'positive',\n update: 'primary',\n delete: 'critical',\n none: 'default',\n}\n\nfunction toJson(document: Record<string, unknown> | null, hiddenPaths: string[][]): string {\n return document === null ? '' : `${JSON.stringify(omitFields(document, hiddenPaths), null, 2)}\\n`\n}\n\nfunction ChangeRow(props: {change: DocumentChange; hiddenPaths: string[][]; expanded: boolean}) {\n const {change, hiddenPaths} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const [expanded, setExpanded] = useState(props.expanded)\n const diffId = useId()\n const changed = change.operation !== 'none'\n return (\n <Card borderBottom data-testid=\"vista-mutate-change\" paddingX={3} paddingY={2}>\n <Flex alignItems=\"center\" gap={2}>\n <Badge\n data-testid=\"vista-mutate-operation\"\n fontSize={0}\n tone={OPERATION_TONES[change.operation]}\n >\n {describeOperation(change.operation, t)}\n </Badge>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Text data-testid=\"vista-mutate-document-id\" size={1} textOverflow=\"ellipsis\">\n <code>{change.id}</code>\n </Text>\n </Box>\n {changed && (\n <Button\n aria-controls={diffId}\n aria-expanded={expanded}\n data-testid=\"vista-mutate-change-toggle\"\n fontSize={1}\n icon={expanded ? ChevronDownIcon : ChevronRightIcon}\n mode=\"bleed\"\n onClick={() => setExpanded((value) => !value)}\n padding={1}\n text={t('vista.mutate.changes')}\n />\n )}\n </Flex>\n {changed && expanded && (\n <Box id={diffId} paddingTop={2}>\n <DiffBoundary\n renderFallback={(retry) => (\n <Flex alignItems=\"center\" gap={2}>\n <Text muted size={1}>\n {t('vista.mutate.changes-failed')}\n </Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={retry}\n padding={2}\n text={t('vista.mutate.changes-retry')}\n />\n </Flex>\n )}\n >\n <Suspense fallback={<DelayedSpinner />}>\n <CodeDiffLoader\n lang=\"json\"\n next={toJson(change.after, hiddenPaths)}\n previous={toJson(change.before, hiddenPaths)}\n />\n </Suspense>\n </DiffBoundary>\n </Box>\n )}\n </Card>\n )\n}\n\nfunction PreviewResult(props: {\n preview: MutationPreview\n /** The dry run ran other mutations, or against another dataset or with other options */\n stale: boolean\n hiddenFields: string[]\n}) {\n const {preview, stale, hiddenFields} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const hiddenPaths = useMemo(() => parseFieldPaths(hiddenFields), [hiddenFields])\n const changed = preview.changes.filter((change) => change.operation !== 'none').length\n return (\n <Flex data-testid=\"vista-mutate-preview-result\" flexDirection=\"column\" gap={3} minHeight=\"0\">\n <Flex alignItems=\"center\" flexShrink={0} flexWrap=\"wrap\" gap={2}>\n <Label muted size={0}>\n {t('vista.mutate.preview-heading')}\n </Label>\n <Text data-testid=\"vista-mutate-summary\" muted size={1}>\n {t('vista.mutate.summary', {changed, unchanged: preview.changes.length - changed})}\n </Text>\n </Flex>\n {stale && (\n <Text data-testid=\"vista-mutate-stale\" size={1}>\n {t('vista.mutate.stale')}\n </Text>\n )}\n {preview.changes.length === 0 ? (\n <Text muted size={1}>\n {t('vista.mutate.no-documents')}\n </Text>\n ) : (\n <Card border className={styles.drawerScroller} radius={2}>\n {preview.changes.map((change, index) => (\n <ChangeRow\n change={change}\n expanded={index < EXPANDED_CHANGES}\n hiddenPaths={hiddenPaths}\n key={change.id}\n />\n ))}\n </Card>\n )}\n {preview.notShown > 0 && (\n <Text muted size={1}>\n {t('vista.mutate.not-shown', {count: preview.notShown})}\n </Text>\n )}\n {hiddenFields.length > 0 && changed > 0 && (\n <Text muted size={1}>\n {t('vista.mutate.hiding', {fields: hiddenFields.join(', ')})}\n </Text>\n )}\n </Flex>\n )\n}\n\nexport interface MutateTabProps {\n mutate: MutatePanel\n /** The tab's client: its dataset is where the mutations go */\n client: GenerateMutationsClient & AiCreditsClient\n dataset: string\n /** Requests are refused while the tab's API version is unfinished */\n canRequest: boolean\n /** The shown result, whose documents the templates aim at */\n result: unknown\n /** Fields the diffs leave out, as History's do */\n hiddenFields: string[]\n /** Called once mutations are applied, to fetch the query again */\n onApplied: () => void\n}\n\n/**\n * Authoring and testing mutations: written as the Mutations API takes them, run as a dry run\n * that compares each document they touch as it is with what they would make it, and applied in\n * one transaction once the dry run of exactly those mutations has been seen\n */\nexport function MutateTab(props: MutateTabProps) {\n const {mutate, client, dataset, canRequest, result, hiddenFields, onApplied} = props\n const {t} = useTranslation(visionLocaleNamespace)\n const {state} = mutate\n const [generatorOpen, setGeneratorOpen] = useState(false)\n\n const input = useMemo(() => readMutations(state.text), [state.text])\n const options = useMemo(\n (): MutationOptions => ({autoGenerateArrayKeys: state.autoGenerateArrayKeys}),\n [state.autoGenerateArrayKeys],\n )\n const run = useMemo((): MutationRun | undefined => {\n if (input.status !== 'valid') return undefined\n return {\n key: mutationRunKey(dataset, input.mutations, options),\n mutations: input.mutations,\n options,\n }\n }, [dataset, input, options])\n const documents = useMemo(() => documentsInResult(result), [result])\n\n const previewIsCurrent = run !== undefined && state.preview?.key === run.key\n const previewChanges = state.preview\n ? state.preview.result.changes.some((change) => change.operation !== 'none') ||\n state.preview.result.notShown > 0\n : false\n const canApply = canRequest && previewIsCurrent && previewChanges && !state.pending\n const canAdd = input.status === 'empty' || input.status === 'valid'\n\n const addTemplate = (template: MutationTemplate) => {\n const next = addMutation(state.text, createMutationTemplate(template, documents))\n if (next !== undefined) mutate.setText(next)\n }\n const applyPreviewed = async () => {\n if (!run || !previewIsCurrent) return\n if (await mutate.apply(client, run, dataset)) onApplied()\n }\n const hasOutcome =\n state.failure !== undefined || state.applied !== undefined || state.preview !== undefined\n\n return (\n <Flex data-testid=\"vista-mutate\" flexDirection=\"column\" height=\"100%\">\n {/* Scrolls only in a drawer too short for the least room the editor takes */}\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n padding={3}\n >\n <Text muted size={1}>\n {t('vista.mutate.description')}\n </Text>\n {generatorOpen && (\n <GenerateMutationsBar\n client={client}\n dataset={dataset}\n mutationOptions={options}\n onClose={() => setGeneratorOpen(false)}\n onGenerated={(text, preview) => {\n mutate.showGenerated(text, preview)\n setGeneratorOpen(false)\n }}\n onOpenAttempt={(text) => {\n mutate.setText(text)\n setGeneratorOpen(false)\n }}\n result={result}\n />\n )}\n {/* What a dry run or an apply returned is as tall as it needs up to half the room, its\n changes scrolling past that; the editor takes the rest */}\n <Grid\n flexBasis=\"0%\"\n flexGrow={1}\n gap={4}\n gridTemplateRows={\n hasOutcome ? 'minmax(140px, 1fr) fit-content(50%)' : 'minmax(140px, 1fr)'\n }\n minHeight=\"280px\"\n >\n <Flex flexDirection=\"column\" gap={2} minHeight=\"0\">\n <JsonEditor\n actions={\n <Flex alignItems=\"center\" gap={1}>\n {!generatorOpen && (\n <AgentActionsTooltip title={t('vista.mutate.generate.button')}>\n <Button\n aria-label={t('vista.mutate.generate.button')}\n data-testid=\"vista-mutate-generate\"\n fontSize={1}\n icon={SparklesIcon}\n mode=\"bleed\"\n onClick={() => setGeneratorOpen(true)}\n padding={2}\n />\n </AgentActionsTooltip>\n )}\n <MenuButton\n button={\n <Button\n data-testid=\"vista-mutate-add\"\n disabled={!canAdd}\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n padding={2}\n text={t('vista.mutate.add')}\n />\n }\n id=\"vista-mutate-add\"\n menu={\n <Menu>\n <MenuItem\n data-testid=\"vista-mutate-add-patch\"\n fontSize={1}\n onClick={() => addTemplate('patch')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.patch-result')\n : t('vista.mutate.add.patch')\n }\n />\n <MenuItem\n data-testid=\"vista-mutate-add-create\"\n fontSize={1}\n onClick={() => addTemplate('create')}\n text={t('vista.mutate.add.create')}\n />\n <MenuItem\n data-testid=\"vista-mutate-add-delete\"\n fontSize={1}\n onClick={() => addTemplate('delete')}\n text={\n documents.length > 0\n ? t('vista.mutate.add.delete-result')\n : t('vista.mutate.add.delete')\n }\n />\n </Menu>\n }\n popover={{placement: 'bottom-end', portal: true}}\n />\n </Flex>\n }\n label={t('vista.mutate.mutations')}\n onChange={mutate.setText}\n testId=\"vista-mutate-editor\"\n value={state.text}\n />\n {input.status === 'invalid-json' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-json', {message: input.message})}\n </Text>\n )}\n {input.status === 'not-a-list' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.not-a-list')}\n </Text>\n )}\n {input.status === 'invalid-mutation' && (\n <Text data-testid=\"vista-mutate-invalid\" size={1}>\n {t('vista.mutate.invalid-mutation', {index: input.index})}\n </Text>\n )}\n </Flex>\n {hasOutcome && (\n <Flex\n data-testid=\"vista-mutate-outcome\"\n flexDirection=\"column\"\n gap={4}\n minHeight=\"0\"\n overflow=\"auto\"\n // Room for the last line of text, which Text draws a few pixels below its box\n paddingBottom={2}\n >\n {state.failure && (\n <Card\n border\n data-testid=\"vista-mutate-failure\"\n padding={3}\n radius={2}\n tone=\"critical\"\n >\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n {state.failure.action === 'preview'\n ? t('vista.mutate.preview-failed')\n : t('vista.mutate.apply-failed')}\n </Text>\n <Text size={1}>{state.failure.failure.message}</Text>\n {state.failure.failure.items.map((item) => (\n <Text key={`${item.index}:${item.message}`} size={1}>\n {t('vista.mutate.failure-item', {\n index: item.index,\n message: item.message,\n })}\n </Text>\n ))}\n </Stack>\n </Card>\n )}\n {state.applied && (\n <Card\n border\n data-testid=\"vista-mutate-applied\"\n padding={3}\n radius={2}\n tone=\"positive\"\n >\n <Text size={1}>\n {t('vista.mutate.applied', {\n dataset: state.applied.dataset,\n transactionId: state.applied.transactionId,\n count: state.applied.documentCount,\n })}\n </Text>\n </Card>\n )}\n {state.preview && (\n <PreviewResult\n hiddenFields={hiddenFields}\n preview={state.preview.result}\n stale={!previewIsCurrent}\n />\n )}\n </Flex>\n )}\n </Grid>\n </Flex>\n <Box borderTop flexShrink={0} padding={3}>\n <Stack gap={4}>\n <SwitchField\n checked={state.autoGenerateArrayKeys}\n description={t('vista.mutate.auto-keys.description')}\n onChange={mutate.setAutoGenerateArrayKeys}\n testId=\"vista-mutate-auto-keys\"\n title={t('vista.mutate.auto-keys')}\n />\n <Flex alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Button\n data-testid=\"vista-mutate-preview\"\n disabled={!run || !canRequest || state.pending !== undefined}\n fontSize={1}\n loading={state.pending === 'preview'}\n mode=\"ghost\"\n onClick={() => run && void mutate.preview(client, run)}\n padding={2}\n text={t('vista.mutate.preview')}\n />\n <Button\n data-testid=\"vista-mutate-apply\"\n disabled={!canApply}\n fontSize={1}\n loading={state.pending === 'apply'}\n onClick={() => void applyPreviewed()}\n padding={2}\n text={t('vista.mutate.apply', {dataset})}\n tone=\"critical\"\n />\n {run && !previewIsCurrent && (\n <Text muted size={1}>\n {t('vista.mutate.apply-needs-preview')}\n </Text>\n )}\n </Flex>\n </Stack>\n </Box>\n </Flex>\n )\n}\n","/**\n * Where a query ran, from the `x-sanity-shard` header: `gcp-eu-w1-01-prod-1028` is a shard in\n * Google Cloud's `europe-west1` region. Coordinates are the regions' data center locations.\n */\n\nexport interface ApiRegion {\n /** `europe-west1` */\n id: string\n /** `St. Ghislain, Belgium` */\n location: string\n latitude: number\n longitude: number\n}\n\nconst GCP_REGIONS: Record<string, Omit<ApiRegion, 'id'>> = {\n 'asia-east1': {location: 'Changhua County, Taiwan', latitude: 24.07, longitude: 120.54},\n 'asia-east2': {location: 'Hong Kong', latitude: 22.32, longitude: 114.17},\n 'asia-northeast1': {location: 'Tokyo, Japan', latitude: 35.69, longitude: 139.69},\n 'asia-south1': {location: 'Mumbai, India', latitude: 19.08, longitude: 72.88},\n 'asia-southeast1': {location: 'Jurong West, Singapore', latitude: 1.35, longitude: 103.7},\n 'australia-southeast1': {location: 'Sydney, Australia', latitude: -33.87, longitude: 151.21},\n 'europe-north1': {location: 'Hamina, Finland', latitude: 60.57, longitude: 27.2},\n 'europe-west1': {location: 'St. Ghislain, Belgium', latitude: 50.47, longitude: 3.82},\n 'europe-west2': {location: 'London, United Kingdom', latitude: 51.51, longitude: -0.13},\n 'europe-west3': {location: 'Frankfurt, Germany', latitude: 50.11, longitude: 8.68},\n 'europe-west4': {location: 'Eemshaven, Netherlands', latitude: 53.44, longitude: 6.83},\n 'northamerica-northeast1': {location: 'Montréal, Canada', latitude: 45.5, longitude: -73.57},\n 'southamerica-east1': {location: 'São Paulo, Brazil', latitude: -23.55, longitude: -46.63},\n 'us-central1': {location: 'Council Bluffs, Iowa, USA', latitude: 41.26, longitude: -95.86},\n 'us-east1': {location: 'Moncks Corner, South Carolina, USA', latitude: 33.2, longitude: -80.01},\n 'us-east4': {location: 'Ashburn, Virginia, USA', latitude: 39.04, longitude: -77.49},\n 'us-west1': {location: 'The Dalles, Oregon, USA', latitude: 45.6, longitude: -121.18},\n 'us-west2': {location: 'Los Angeles, California, USA', latitude: 34.05, longitude: -118.24},\n}\n\nconst CONTINENTS: Record<string, string> = {\n as: 'asia',\n au: 'australia',\n eu: 'europe',\n na: 'northamerica',\n sa: 'southamerica',\n us: 'us',\n}\n\nconst DIRECTIONS: Record<string, string> = {\n c: 'central',\n e: 'east',\n n: 'north',\n ne: 'northeast',\n nw: 'northwest',\n s: 'south',\n se: 'southeast',\n sw: 'southwest',\n w: 'west',\n}\n\nconst SHARD = /^gcp-([a-z]+)-([a-z]+?)(\\d+)-/\n\n/** The Google Cloud region of a shard, `europe-west1` for `gcp-eu-w1-01-prod-1028` */\nexport function regionOfShard(shard: string | undefined): ApiRegion | undefined {\n const match = shard ? SHARD.exec(shard) : null\n if (!match) return undefined\n const [, continent, direction, number] = match\n if (!CONTINENTS[continent] || !DIRECTIONS[direction]) return undefined\n const id = `${CONTINENTS[continent]}-${DIRECTIONS[direction]}${number}`\n const region = GCP_REGIONS[id]\n return region ? {id, ...region} : undefined\n}\n","/**\n * Roughly where the browser is, from its time zone: the zone's city for the common ones, the\n * middle of its continent otherwise. Good enough to draw the query's way on a globe without\n * asking for the user's location.\n */\n\nexport interface ApproximateLocation {\n latitude: number\n longitude: number\n}\n\nconst ZONES: Record<string, [number, number]> = {\n 'Africa/Cairo': [30.04, 31.24],\n 'Africa/Johannesburg': [-26.2, 28.05],\n 'Africa/Lagos': [6.52, 3.38],\n 'Africa/Nairobi': [-1.29, 36.82],\n 'America/Argentina/Buenos_Aires': [-34.6, -58.38],\n 'America/Bogota': [4.71, -74.07],\n 'America/Chicago': [41.88, -87.63],\n 'America/Denver': [39.74, -104.99],\n 'America/Halifax': [44.65, -63.58],\n 'America/Los_Angeles': [34.05, -118.24],\n 'America/Mexico_City': [19.43, -99.13],\n 'America/New_York': [40.71, -74.01],\n 'America/Phoenix': [33.45, -112.07],\n 'America/Santiago': [-33.45, -70.67],\n 'America/Sao_Paulo': [-23.55, -46.63],\n 'America/Toronto': [43.65, -79.38],\n 'America/Vancouver': [49.28, -123.12],\n 'Asia/Bangkok': [13.76, 100.5],\n 'Asia/Dubai': [25.2, 55.27],\n 'Asia/Hong_Kong': [22.32, 114.17],\n 'Asia/Jakarta': [-6.21, 106.85],\n 'Asia/Jerusalem': [31.77, 35.21],\n 'Asia/Kolkata': [22.57, 88.36],\n 'Asia/Manila': [14.6, 120.98],\n 'Asia/Seoul': [37.57, 126.98],\n 'Asia/Shanghai': [31.23, 121.47],\n 'Asia/Singapore': [1.35, 103.82],\n 'Asia/Taipei': [25.03, 121.57],\n 'Asia/Tokyo': [35.69, 139.69],\n 'Atlantic/Reykjavik': [64.15, -21.94],\n 'Australia/Brisbane': [-27.47, 153.03],\n 'Australia/Melbourne': [-37.81, 144.96],\n 'Australia/Perth': [-31.95, 115.86],\n 'Australia/Sydney': [-33.87, 151.21],\n 'Europe/Amsterdam': [52.37, 4.9],\n 'Europe/Athens': [37.98, 23.73],\n 'Europe/Berlin': [52.52, 13.41],\n 'Europe/Brussels': [50.85, 4.35],\n 'Europe/Copenhagen': [55.68, 12.57],\n 'Europe/Dublin': [53.35, -6.26],\n 'Europe/Helsinki': [60.17, 24.94],\n 'Europe/Istanbul': [41.01, 28.98],\n 'Europe/Lisbon': [38.72, -9.14],\n 'Europe/London': [51.51, -0.13],\n 'Europe/Madrid': [40.42, -3.7],\n 'Europe/Oslo': [59.91, 10.75],\n 'Europe/Paris': [48.86, 2.35],\n 'Europe/Prague': [50.08, 14.44],\n 'Europe/Rome': [41.9, 12.5],\n 'Europe/Stockholm': [59.33, 18.07],\n 'Europe/Vienna': [48.21, 16.37],\n 'Europe/Warsaw': [52.23, 21.01],\n 'Europe/Zurich': [47.38, 8.54],\n 'Pacific/Auckland': [-36.85, 174.76],\n 'Pacific/Honolulu': [21.31, -157.86],\n}\n\nconst CONTINENTS: Record<string, [number, number]> = {\n Africa: [2, 20],\n America: [39, -98],\n Antarctica: [-75, 0],\n Asia: [30, 100],\n Atlantic: [40, -30],\n Australia: [-25, 134],\n Europe: [50, 10],\n Indian: [-20, 75],\n Pacific: [-15, -150],\n}\n\nexport function locationOfTimeZone(timeZone: string | undefined): ApproximateLocation | undefined {\n if (!timeZone) return undefined\n const [latitude, longitude] = ZONES[timeZone] ?? CONTINENTS[timeZone.split('/')[0]] ?? []\n return latitude === undefined ? undefined : {latitude, longitude}\n}\n\nexport function browserLocation(): ApproximateLocation | undefined {\n try {\n return locationOfTimeZone(Intl.DateTimeFormat().resolvedOptions().timeZone)\n } catch {\n return undefined\n }\n}\n","import {useTheme_v2 as useThemeV2} from '@sanity/ui'\nimport {type COBEOptions, type Marker} from 'cobe'\nimport {useEffect, useRef} from 'react'\n\nimport {type ApproximateLocation} from '../../util/timeZoneLocation'\n\nconst SIZE = 168\nconst SETTLE_MS = 1200\n/** Fewer than cobe's demo uses: at this size more read as a screen door on a 1x screen */\nconst MAP_SAMPLES = 12_000\n\n/** cobe draws the globe; it is only fetched once the Network panel shows a response */\nconst loadCobe = () => import('cobe')\nconst YOU_COLOR: [number, number, number] = [0.25, 0.55, 1]\nconst API_COLOR: [number, number, number] = [1, 0.45, 0.2]\n\ntype GlobeLook = Pick<COBEOptions, 'dark' | 'diffuse' | 'mapBrightness' | 'baseColor' | 'glowColor'>\n\n/** Light dots on a dark sphere in the dark scheme, dark dots on a light one in the light scheme */\nconst DARK_GLOBE: GlobeLook = {\n dark: 1,\n diffuse: 1.2,\n mapBrightness: 6,\n baseColor: [0.3, 0.3, 0.34],\n glowColor: [0.2, 0.2, 0.24],\n}\nconst LIGHT_GLOBE: GlobeLook = {\n dark: 0,\n diffuse: 1.6,\n mapBrightness: 8,\n baseColor: [0.96, 0.96, 0.98],\n glowColor: [0.8, 0.82, 0.88],\n}\n\n/** The attributes cobe asks for, so the context made for it first is the one it gets */\nconst CONTEXT_ATTRIBUTES: WebGLContextAttributes = {\n alpha: true,\n stencil: false,\n antialias: true,\n depth: false,\n preserveDrawingBuffer: false,\n}\nconst DOT_RADIUS = 'smoothstep(8e-3,0.,g)'\nconst LARGER_DOT_RADIUS = 'smoothstep(8.8e-3,0.,g)'\n\n/**\n * cobe draws every land dot with one radius in its fragment shader, with no option for it, and\n * at this size a dot is about a pixel wide. The canvas gets the WebGL context cobe will ask for\n * ahead of it, which hands cobe's shader on with that radius a tenth larger; a cobe whose shader\n * reads otherwise keeps its own dots.\n */\nfunction enlargeDots(canvas: HTMLCanvasElement): void {\n const context =\n canvas.getContext('webgl2', CONTEXT_ATTRIBUTES) ??\n canvas.getContext('webgl', CONTEXT_ATTRIBUTES)\n if (!context) return\n const shaderSource = context.shaderSource.bind(context)\n context.shaderSource = (shader, source) =>\n shaderSource(shader, source.replace(DOT_RADIUS, LARGER_DOT_RADIUS))\n}\n\nfunction toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180\n}\n\n/** The point halfway between two places on the sphere, so both are in view */\nfunction midpoint(a: ApproximateLocation, b: ApproximateLocation): ApproximateLocation {\n const vector = [a, b].map(({latitude, longitude}) => [\n Math.cos(toRadians(latitude)) * Math.cos(toRadians(longitude)),\n Math.cos(toRadians(latitude)) * Math.sin(toRadians(longitude)),\n Math.sin(toRadians(latitude)),\n ])\n const [x, y, z] = [0, 1, 2].map((axis) => vector[0][axis] + vector[1][axis])\n return {\n latitude: (Math.atan2(z, Math.hypot(x, y)) * 180) / Math.PI,\n longitude: (Math.atan2(y, x) * 180) / Math.PI,\n }\n}\n\n/** cobe's rotation that faces a place (its README's `locationToAngles`) */\nfunction facing({latitude, longitude}: ApproximateLocation): {phi: number; theta: number} {\n return {phi: Math.PI - (toRadians(longitude) - Math.PI / 2), theta: toRadians(latitude)}\n}\n\nexport interface NetworkGlobeProps {\n /** Roughly where the browser is */\n you: ApproximateLocation | undefined\n /** Where the query ran */\n api: ApproximateLocation | undefined\n /** The query went all the way to the API, rather than being answered by the CDN near you */\n reachedApi: boolean\n}\n\n/**\n * A globe with you and the region the query ran in, and an arc between them when the request\n * travelled there. cobe draws with WebGL on each `update`, so it is drawn once per change and\n * not animated; without WebGL it stays blank and the text next to it says the same. cobe moves\n * its canvas around in the DOM and a destroyed globe leaves it unusable, so each picture gets a\n * canvas of its own that React does not manage.\n */\nexport function NetworkGlobe({you, api, reachedApi}: NetworkGlobeProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const dark = useThemeV2().color._dark\n\n useEffect(() => {\n const container = containerRef.current\n if (!container || (!you && !api)) return undefined\n const canvas = document.createElement('canvas')\n canvas.style.width = `${SIZE}px`\n canvas.style.height = `${SIZE}px`\n container.append(canvas)\n let cancelled = false\n let destroy: (() => void) | undefined\n // Drawn at twice the size at least, so the map's dots stay visible this small\n const devicePixelRatio = Math.max(window.devicePixelRatio || 1, 2)\n const focus = you && api ? midpoint(you, api) : (you ?? api)\n const markers: Marker[] = []\n if (you) markers.push({location: [you.latitude, you.longitude], size: 0.06, color: YOU_COLOR})\n if (api) markers.push({location: [api.latitude, api.longitude], size: 0.08})\n void loadCobe()\n .then(({default: createGlobe}) => {\n if (cancelled || !focus) return\n const from = facing(you ?? focus)\n const to = facing(focus)\n const options: COBEOptions = {\n // cobe sizes the canvas in device pixels from these\n width: SIZE,\n height: SIZE,\n devicePixelRatio,\n ...from,\n ...(dark ? DARK_GLOBE : LIGHT_GLOBE),\n mapSamples: MAP_SAMPLES,\n markerColor: API_COLOR,\n markers,\n arcs:\n you && api && reachedApi\n ? [{from: [you.latitude, you.longitude], to: [api.latitude, api.longitude]}]\n : [],\n arcColor: API_COLOR,\n arcWidth: 0.8,\n arcHeight: 0.3,\n }\n try {\n enlargeDots(canvas)\n const globe = createGlobe(canvas, options)\n // The globe turns from you to the way the query took, and stops: drawing for a moment\n // also picks up the map texture, which cobe loads after the first frame\n const reduceMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n const started = performance.now()\n let frame = 0\n const draw = (now: number) => {\n const progress = Math.min((now - started) / SETTLE_MS, 1)\n const eased = reduceMotion ? 1 : 1 - (1 - progress) ** 3\n globe.update({\n phi: from.phi + (to.phi - from.phi) * eased,\n theta: from.theta + (to.theta - from.theta) * eased,\n })\n if (progress < 1) frame = requestAnimationFrame(draw)\n }\n frame = requestAnimationFrame(draw)\n destroy = () => {\n cancelAnimationFrame(frame)\n globe.destroy()\n }\n } catch {\n // No WebGL: the globe stays blank\n }\n })\n .catch(() => undefined)\n return () => {\n cancelled = true\n destroy?.()\n container.replaceChildren()\n }\n }, [api, dark, reachedApi, you])\n\n return (\n <div\n aria-hidden\n data-testid=\"vista-network-globe\"\n ref={containerRef}\n style={{width: SIZE, height: SIZE, flexShrink: 0}}\n />\n )\n}\n","import {Badge, Stack, Text} from '@sanity/ui'\nimport {type ReactNode, useMemo} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex, Grid} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {isApiCdnHost} from '../../../util/parseQueryUrl'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {type VistaResponseMeta} from '../../store/types'\nimport {regionOfShard} from '../../util/apiRegions'\nimport {browserLocation} from '../../util/timeZoneLocation'\nimport {CdnBlockedNotice} from '../CdnBlockedNotice'\nimport {NetworkGlobe} from './NetworkGlobe'\n\nfunction Row({label, children}: {label: string; children: ReactNode}) {\n return (\n <>\n <Text muted size={1}>\n {label}\n </Text>\n <Box minWidth=\"0\">{children}</Box>\n </>\n )\n}\n\nfunction isCdnUrl(url: string): boolean {\n try {\n return isApiCdnHost(new URL(url).hostname)\n } catch {\n return false\n }\n}\n\nexport interface NetworkTabProps {\n meta: VistaResponseMeta | undefined\n resolved: Pick<ResolvedRequest, 'useCdn' | 'isCdnBlockedByPerspective'>\n /** The tab's perspective as the perspective select names it, for why the CDN is not used */\n perspectiveName: string\n}\n\n/**\n * How the shown response travelled: which endpoint answered it, whether from the CDN's cache,\n * and where the query ran, on a globe from roughly where you are\n */\nexport function NetworkTab({meta, resolved, perspectiveName}: NetworkTabProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const you = useMemo(() => browserLocation(), [])\n const network = meta?.network\n const region = useMemo(() => regionOfShard(network?.shard), [network?.shard])\n\n if (!meta) {\n return (\n <Box padding={3}>\n <Text muted size={1}>\n {t('vista.network.empty')}\n </Text>\n </Box>\n )\n }\n\n const viaCdn = network ? network.viaCdn : isCdnUrl(meta.url)\n const cacheHit = Boolean(network?.cacheHit)\n let cache = t('vista.network.cache.none')\n if (viaCdn) cache = cacheHit ? t('vista.network.cache.hit') : t('vista.network.cache.miss')\n const hint =\n !viaCdn && !resolved.useCdn && !resolved.isCdnBlockedByPerspective\n ? t('vista.network.use-cdn-hint')\n : undefined\n\n return (\n <Box data-testid=\"vista-network\" padding={3}>\n <Flex alignItems=\"flex-start\" flexWrap=\"wrap\" gap={4}>\n <Stack gap={2}>\n <NetworkGlobe api={region} reachedApi={!cacheHit} you={you} />\n <Flex alignItems=\"center\" gap={2} justifyContent=\"center\">\n <Badge fontSize={0} tone=\"primary\">\n {t('vista.network.you')}\n </Badge>\n {region && (\n <Badge fontSize={0} tone=\"caution\">\n {region.id}\n </Badge>\n )}\n </Flex>\n </Stack>\n <Box flexBasis=\"0%\" flexGrow={1} minWidth=\"0\">\n <Stack gap={4}>\n <Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <Row label={t('vista.network.endpoint')}>\n <Text data-testid=\"vista-network-endpoint\" size={1} weight=\"medium\">\n {viaCdn ? t('vista.network.endpoint.cdn') : t('vista.network.endpoint.api')}\n </Text>\n </Row>\n <Row label={t('vista.network.cache')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-cache\" size={1}>\n {cache}\n </Text>\n {network?.cacheControl && (\n <Text muted size={0}>\n {`Cache-Control: ${network.cacheControl}`}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.region')}>\n <Stack gap={2}>\n <Text data-testid=\"vista-network-region\" size={1}>\n {region\n ? `${region.id} (${region.location})`\n : (network?.shard ?? t('vista.network.region.unknown'))}\n </Text>\n {region && network?.shard && (\n <Text muted size={0}>\n {network.shard}\n </Text>\n )}\n </Stack>\n </Row>\n <Row label={t('vista.network.timing')}>\n <Text size={1}>\n {t('vista.network.timing.value', {e2e: meta.e2eMs, server: meta.ms})}\n </Text>\n </Row>\n {network?.traceId && (\n <Row label={t('vista.network.trace')}>\n <Text size={1} textOverflow=\"ellipsis\">\n <code>{network.traceId}</code>\n </Text>\n </Row>\n )}\n </Grid>\n {cacheHit && (\n <Text muted size={1}>\n {t('vista.network.cache.hit-explained')}\n </Text>\n )}\n {hint && (\n <Text data-testid=\"vista-network-hint\" muted size={1}>\n {hint}\n </Text>\n )}\n {resolved.isCdnBlockedByPerspective && (\n <CdnBlockedNotice\n perspectiveName={perspectiveName}\n testId=\"vista-network-cdn-blocked\"\n />\n )}\n </Stack>\n </Box>\n </Flex>\n </Box>\n )\n}\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {Badge, Button, Stack, Text, TextInput} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex, Grid} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useCopyToClipboard} from '../../hooks/useCopyToClipboard'\nimport {type VistaResponseMeta} from '../../store/types'\nimport {formatBytes} from '../../util/payloadSize'\nimport {sortSyncTags} from '../../util/syncTags'\n\nfunction MetaRow({label, children}: {label: string; children: ReactNode}) {\n return (\n <>\n <Text muted size={1}>\n {label}\n </Text>\n <Box>{children}</Box>\n </>\n )\n}\n\nexport interface ResponseMetaTabProps {\n meta: VistaResponseMeta | undefined\n url: string | undefined\n}\n\nexport function ResponseMetaTab({meta, url}: ResponseMetaTabProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const copyToClipboard = useCopyToClipboard()\n const notApplicable = t('result.timing-not-applicable')\n\n if (!meta && !url) {\n return (\n <Box padding={3}>\n <Text muted size={1}>\n {t('vista.response.empty')}\n </Text>\n </Box>\n )\n }\n\n return (\n <Box data-testid=\"vista-response-meta\" padding={3}>\n <Stack gap={4}>\n <Grid gap={3} gridTemplateColumns=\"max-content minmax(0, 1fr)\">\n <MetaRow label={t('result.execution-time-label')}>\n <Text data-testid=\"vista-meta-execution\" size={1}>\n {meta ? `${meta.ms}ms` : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('result.end-to-end-time-label')}>\n <Text data-testid=\"vista-meta-e2e\" size={1}>\n {meta ? `${meta.e2eMs}ms` : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('vista.response.payload-size')}>\n <Text data-testid=\"vista-meta-payload\" size={1}>\n {meta ? formatBytes(meta.payloadBytes) : notApplicable}\n </Text>\n </MetaRow>\n <MetaRow label={t('vista.response.sync-tags')}>\n {meta && meta.syncTags.length > 0 ? (\n <Flex data-testid=\"vista-meta-sync-tags\" flexWrap=\"wrap\" gap={1}>\n {sortSyncTags(meta.syncTags).map((tag) => (\n <Badge fontSize={0} key={tag}>\n {tag}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text muted size={1}>\n {meta ? t('vista.response.sync-tags.none') : notApplicable}\n </Text>\n )}\n </MetaRow>\n </Grid>\n\n {url && (\n <Stack gap={2}>\n <Text muted size={1}>\n {t('query.url')}\n </Text>\n <Flex gap={1}>\n <Box flexBasis=\"0%\" flexGrow={1}>\n <TextInput\n aria-label={t('query.url')}\n data-testid=\"vista-query-url\"\n fontSize={1}\n padding={2}\n readOnly\n type=\"url\"\n value={url}\n />\n </Box>\n <Tooltip\n animate\n content={<Text size={1}>{t('action.copy-url-to-clipboard')}</Text>}\n portal\n >\n <Button\n aria-label={t('action.copy-url-to-clipboard')}\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(url, t('action.copy-url-to-clipboard'))}\n padding={2}\n />\n </Tooltip>\n </Flex>\n </Stack>\n )}\n </Stack>\n </Box>\n )\n}\n","import {type ObjectAttribute, type ObjectTypeNode} from 'groq-js'\n\nconst INDENT = ' '\nconst IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/\n\nexport function indent(depth: number): string {\n return INDENT.repeat(depth)\n}\n\n/** Member keys of a TypeScript type literal: bare when valid identifiers, quoted otherwise */\nexport function printTypeKey(key: string): string {\n return IDENTIFIER.test(key) ? key : JSON.stringify(key)\n}\n\n/**\n * Property keys of a JavaScript object literal. `__proto__` (bare or quoted) would set the\n * prototype instead of defining a property, so it is written as a computed key.\n */\nexport function printLiteralKey(key: string): string {\n return key === '__proto__' ? `[${JSON.stringify(key)}]` : printTypeKey(key)\n}\n\nexport interface FlatObject {\n attributes: Record<string, ObjectAttribute>\n /** What remains once nested object rests are folded in: nothing, \"anything else\" or a reference */\n rest: Exclude<ObjectTypeNode['rest'], ObjectTypeNode>\n}\n\n/** Folds a chain of object rests (`{...a, ...b}`) into one attribute map */\nexport function flattenObject(node: ObjectTypeNode): FlatObject {\n // Null prototype: assigning a \"__proto__\" attribute must define it, not set the prototype\n const attributes: Record<string, ObjectAttribute> = Object.assign(\n Object.create(null),\n node.attributes,\n )\n let rest = node.rest\n while (rest && rest.type === 'object') {\n Object.assign(attributes, rest.attributes)\n rest = rest.rest\n }\n return {attributes, rest}\n}\n\n/** The distinct printed members of a union, in order of first appearance */\nexport function uniqueMembers(printed: string[]): string[] {\n return [...new Set(printed)]\n}\n","import {type SchemaType, type TypeNode} from 'groq-js'\n\n/** `blockContent` becomes `BlockContent`, `my-type` becomes `MyType`, `2fast` becomes `_2fast` */\nexport function toTypeName(name: string): string {\n const pascal = name\n .split(/[^a-zA-Z0-9_$]+/)\n .filter(Boolean)\n .map((part) => part[0].toUpperCase() + part.slice(1))\n .join('')\n if (!pascal) {\n return 'Unknown'\n }\n return /^[0-9]/.test(pascal) ? `_${pascal}` : pascal\n}\n\n/**\n * Identifiers the printed declarations take from the global scope. A schema type named `array`\n * must not become `export type Array = …`: inside that module the alias would shadow the\n * built-in for every `Array<T>` the printers emit, and being non-generic, fail them all.\n */\nconst GLOBAL_IDENTIFIERS = ['Array']\n\n/**\n * One identifier per schema type name. Different names can normalise to the same identifier\n * (`foo-bar` and `foo.bar` both want `FooBar`), so later ones get a numeric suffix; `reserved`\n * identifiers (the result type's own name) and the globals the output refers to are never\n * handed out.\n */\nexport function createTypeNames(\n names: readonly string[],\n reserved: readonly string[] = [],\n): Map<string, string> {\n const taken = new Set([...GLOBAL_IDENTIFIERS, ...reserved])\n const identifiers = new Map<string, string>()\n for (const name of names) {\n const base = toTypeName(name)\n let candidate = base\n for (let suffix = 2; taken.has(candidate); suffix++) {\n candidate = `${base}${suffix}`\n }\n taken.add(candidate)\n identifiers.set(name, candidate)\n }\n return identifiers\n}\n\n/** The type node a schema entry stands for, documents being objects of their attributes */\nexport function resolveSchemaType(\n schema: SchemaType | undefined,\n name: string,\n): TypeNode | undefined {\n const entry = schema?.find((candidate) => candidate.name === name)\n if (!entry) {\n return undefined\n }\n if (entry.type === 'document') {\n return {type: 'object', attributes: entry.attributes}\n }\n return entry.value\n}\n\n/**\n * Names of the schema types referenced (transitively) by `node`, in dependency order: a type is\n * listed after every type it references, except within cycles. Every type that takes part in a\n * cycle is reported in `cyclic`, since any of them may be emitted before a type it references.\n */\nexport function collectReferencedTypes(\n node: TypeNode,\n schema: SchemaType | undefined,\n): {order: string[]; cyclic: Set<string>} {\n const order: string[] = []\n const visiting: string[] = []\n const done = new Set<string>()\n const cyclic = new Set<string>()\n\n const visitNode = (current: TypeNode): void => {\n switch (current.type) {\n case 'inline':\n visitName(current.name)\n return\n case 'array':\n visitNode(current.of)\n return\n case 'union':\n current.of.forEach(visitNode)\n return\n case 'object':\n Object.values(current.attributes).forEach((attribute) => visitNode(attribute.value))\n if (current.rest) visitNode(current.rest)\n return\n default:\n }\n }\n\n const visitName = (name: string): void => {\n if (done.has(name)) return\n const cycleStart = visiting.indexOf(name)\n if (cycleStart !== -1) {\n // A back-edge: everything from the revisited type up to the current one forms the cycle\n visiting.slice(cycleStart).forEach((member) => cyclic.add(member))\n return\n }\n visiting.push(name)\n const resolved = resolveSchemaType(schema, name)\n if (resolved) {\n visitNode(resolved)\n }\n visiting.pop()\n done.add(name)\n order.push(name)\n }\n\n visitNode(node)\n return {order, cyclic}\n}\n","import {type ObjectTypeNode, type SchemaType, type TypeNode} from 'groq-js'\n\nimport {flattenObject, indent, printTypeKey, uniqueMembers} from './printUtils'\nimport {collectReferencedTypes, createTypeNames, resolveSchemaType, toTypeName} from './schemaTypes'\n\nexport interface PrintTypeScriptOptions {\n /** Name of the exported type for the query result */\n typeName: string\n /** Schema the `inline` references point into; their types are emitted as well */\n schema?: SchemaType\n}\n\ninterface PrintContext {\n /** Identifier of each referenced schema type, unique across the output */\n typeNames: Map<string, string>\n}\n\nfunction referenceName(name: string, context: PrintContext): string {\n return context.typeNames.get(name) ?? toTypeName(name)\n}\n\nfunction printObject(node: ObjectTypeNode, depth: number, context: PrintContext): string {\n const {attributes, rest} = flattenObject(node)\n const inner = indent(depth + 1)\n\n const lines = Object.entries(attributes).map(\n ([key, attribute]) =>\n `${inner}${printTypeKey(key)}${attribute.optional ? '?' : ''}: ${printNode(attribute.value, depth + 1, context)};`,\n )\n if (rest?.type === 'unknown') {\n lines.push(`${inner}[key: string]: unknown;`)\n }\n\n const body = lines.length === 0 ? '{}' : `{\\n${lines.join('\\n')}\\n${indent(depth)}}`\n return rest?.type === 'inline' ? `${body} & ${referenceName(rest.name, context)}` : body\n}\n\nfunction printNode(node: TypeNode, depth: number, context: PrintContext): string {\n switch (node.type) {\n case 'string':\n return node.value === undefined ? 'string' : JSON.stringify(node.value)\n case 'number':\n return node.value === undefined ? 'number' : String(node.value)\n case 'boolean':\n return node.value === undefined ? 'boolean' : String(node.value)\n case 'null':\n return 'null'\n case 'unknown':\n return 'unknown'\n case 'inline':\n return referenceName(node.name, context)\n case 'array':\n return `Array<${printNode(node.of, depth, context)}>`\n case 'union': {\n const members = uniqueMembers(node.of.map((member) => printNode(member, depth, context)))\n // Extracted schemas have empty unions (a Portable Text list item without styles)\n if (members.length === 0) return 'never'\n return members.length === 1 ? members[0] : members.join(' | ')\n }\n case 'object':\n return printObject(node, depth, context)\n default:\n return 'unknown'\n }\n}\n\n/** Prints one node as a TypeScript type, naming the schema types it references through `typeNames` */\nexport function printTypeScriptNode(node: TypeNode, typeNames: Map<string, string>): string {\n return printNode(node, 0, {typeNames})\n}\n\n/**\n * Prints a query result type as TypeScript, followed by the schema types it references, in the\n * style of `sanity typegen`.\n */\nexport function printTypeScript(node: TypeNode, options: PrintTypeScriptOptions): string {\n const {order} = collectReferencedTypes(node, options.schema)\n const context: PrintContext = {typeNames: createTypeNames(order, [options.typeName])}\n const declarations = [`export type ${options.typeName} = ${printNode(node, 0, context)};`]\n\n for (const name of order) {\n const resolved = resolveSchemaType(options.schema, name)\n declarations.push(\n `export type ${referenceName(name, context)} = ${resolved ? printNode(resolved, 0, context) : 'unknown'};`,\n )\n }\n\n return declarations.join('\\n\\n')\n}\n","import {type ObjectTypeNode, type SchemaType, type TypeNode} from 'groq-js'\n\nimport {printTypeScriptNode} from './printTypeScript'\nimport {flattenObject, indent, printLiteralKey, uniqueMembers} from './printUtils'\nimport {collectReferencedTypes, createTypeNames, resolveSchemaType, toTypeName} from './schemaTypes'\n\nexport interface PrintZodOptions {\n /** Name of the query result type; the schema constant gets a `Schema` suffix */\n typeName: string\n schema?: SchemaType\n}\n\ninterface PrintContext {\n /** Identifier of each referenced schema type, unique across the output */\n typeNames: Map<string, string>\n /** Referenced schema types that close a cycle and therefore need `z.lazy` */\n cyclic: Set<string>\n /** Whether schema type declarations are being printed; the result schema comes after them all */\n inDeclarations: boolean\n}\n\nfunction typeAliasName(typeName: string, context: PrintContext): string {\n return context.typeNames.get(typeName) ?? toTypeName(typeName)\n}\n\nfunction schemaName(typeName: string, context: PrintContext): string {\n return `${typeAliasName(typeName, context)}Schema`\n}\n\nfunction printObject(node: ObjectTypeNode, depth: number, context: PrintContext): string {\n const {attributes, rest} = flattenObject(node)\n const inner = indent(depth + 1)\n\n const lines = Object.entries(attributes).map(([key, attribute]) => {\n const value = printZodNode(attribute.value, depth + 1, context)\n return `${inner}${printLiteralKey(key)}: ${attribute.optional ? `${value}.optional()` : value},`\n })\n\n let output =\n lines.length === 0 ? 'z.object({})' : `z.object({\\n${lines.join('\\n')}\\n${indent(depth)}})`\n if (rest?.type === 'unknown') {\n output += '.passthrough()'\n } else if (rest?.type === 'inline') {\n output += `.and(${printReference(rest.name, context)})`\n }\n return output\n}\n\nfunction printReference(name: string, context: PrintContext): string {\n const reference = schemaName(name, context)\n return context.inDeclarations && context.cyclic.has(name)\n ? `z.lazy(() => ${reference})`\n : reference\n}\n\nfunction printZodNode(node: TypeNode, depth: number, context: PrintContext): string {\n switch (node.type) {\n case 'string':\n return node.value === undefined ? 'z.string()' : `z.literal(${JSON.stringify(node.value)})`\n case 'number':\n return node.value === undefined ? 'z.number()' : `z.literal(${String(node.value)})`\n case 'boolean':\n return node.value === undefined ? 'z.boolean()' : `z.literal(${String(node.value)})`\n case 'null':\n return 'z.null()'\n case 'unknown':\n return 'z.unknown()'\n case 'inline':\n return printReference(node.name, context)\n case 'array':\n return `z.array(${printZodNode(node.of, depth, context)})`\n case 'union': {\n const nullable = node.of.some((member) => member.type === 'null')\n const members = uniqueMembers(\n node.of\n .filter((member) => member.type !== 'null')\n .map((member) => printZodNode(member, depth, context)),\n )\n if (members.length === 0) {\n // Only null, or nothing at all (extracted schemas have empty unions)\n return nullable ? 'z.null()' : 'z.never()'\n }\n const union =\n members.length === 1\n ? members[0]\n : `z.union([\\n${members.map((member) => `${indent(depth + 1)}${member},`).join('\\n')}\\n${indent(depth)}])`\n return nullable ? `${union}.nullable()` : union\n }\n case 'object':\n return printObject(node, depth, context)\n default:\n return 'z.unknown()'\n }\n}\n\n/**\n * Prints a Zod schema for a query result, preceded by schemas for the referenced schema types\n * (dependencies first, cycles broken with `z.lazy`).\n */\nexport function printZod(node: TypeNode, options: PrintZodOptions): string {\n const {order, cyclic} = collectReferencedTypes(node, options.schema)\n const context: PrintContext = {\n typeNames: createTypeNames(order, [options.typeName]),\n cyclic,\n inDeclarations: true,\n }\n const declarations = [`import {z} from 'zod'`]\n\n // TypeScript cannot infer a type through `z.lazy`, so recursive schemas are annotated with an\n // explicit type: the referenced schema types are declared as TypeScript types first (all of\n // them, since a recursive type may mention the others), and `z.infer` keeps working downstream\n if (cyclic.size > 0) {\n for (const name of order) {\n const resolved = resolveSchemaType(options.schema, name)\n const type = resolved ? printTypeScriptNode(resolved, context.typeNames) : 'unknown'\n declarations.push(`export type ${typeAliasName(name, context)} = ${type};`)\n }\n }\n\n for (const name of order) {\n const resolved = resolveSchemaType(options.schema, name)\n const value = resolved ? printZodNode(resolved, 0, context) : 'z.unknown()'\n const typeAnnotation = cyclic.has(name) ? `: z.ZodType<${typeAliasName(name, context)}>` : ''\n declarations.push(`export const ${schemaName(name, context)}${typeAnnotation} = ${value}`)\n }\n\n const resultSchema = `${options.typeName}Schema`\n declarations.push(\n `export const ${resultSchema} = ${printZodNode(node, 0, {...context, inDeclarations: false})}`,\n `export type ${options.typeName} = z.infer<typeof ${resultSchema}>`,\n )\n\n return declarations.join('\\n\\n')\n}\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {Button, Card, Dialog, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport {useMemo} from 'react'\nimport {useSchema, useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {parseParams} from '../../../components/ParamsEditor'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useCopyToClipboard} from '../../hooks/useCopyToClipboard'\nimport {type VistaTab} from '../../store/types'\nimport {toQueryConstantName} from '../../util/exportSnippets'\nimport {evaluateQueryType} from '../../util/typegen/evaluateQueryType'\nimport {printTypeScript} from '../../util/typegen/printTypeScript'\nimport {printZod} from '../../util/typegen/printZod'\nimport {toTypeName} from '../../util/typegen/schemaTypes'\nimport * as styles from '../vista.module.css'\n\nexport type TypesExportFormat = 'typescript' | 'zod'\n\nexport interface ExportTypesDialogProps {\n tab: VistaTab\n format: TypesExportFormat\n result: unknown\n hasResult: boolean\n /** Only a result fetched for the current query and params may stand in for the schema */\n resultIsCurrent: boolean\n onClose: () => void\n}\n\n/** `AUTHOR_QUERY` becomes `AuthorQueryResult` */\nfunction toResultTypeName(query: string): string {\n const constant = toQueryConstantName(query)\n return `${toTypeName(constant.toLowerCase().replace(/_/g, ' '))}Result`\n}\n\nexport function ExportTypesDialog({\n tab,\n format,\n result,\n hasResult,\n resultIsCurrent,\n onClose,\n}: ExportTypesDialogProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const copyToClipboard = useCopyToClipboard()\n const schema = useSchema()\n\n const output = useMemo(() => {\n const params = parseParams(tab.rawParams, t)\n const evaluation = evaluateQueryType({\n query: tab.query,\n params: params.parsed || {},\n schema,\n hasResult: hasResult && resultIsCurrent,\n result,\n })\n if (evaluation.source === 'none') {\n return {source: evaluation.source, code: undefined, schemaError: evaluation.schemaError}\n }\n const typeName = toResultTypeName(tab.query)\n const code =\n format === 'typescript'\n ? printTypeScript(evaluation.node, {typeName, schema: evaluation.schema})\n : printZod(evaluation.node, {typeName, schema: evaluation.schema})\n return {\n source: evaluation.source,\n code,\n schemaError: evaluation.source === 'result' ? evaluation.schemaError : undefined,\n }\n }, [format, hasResult, result, resultIsCurrent, schema, t, tab.query, tab.rawParams])\n\n const sourceNote =\n output.source === 'schema'\n ? t('vista.export-types.source.schema')\n : output.source === 'result'\n ? t('vista.export-types.source.result')\n : hasResult\n ? t('vista.export-types.stale-result')\n : t('vista.export-types.empty')\n\n return (\n <Dialog\n animate\n data-testid=\"vista-export-types-dialog\"\n header={\n format === 'typescript'\n ? t('vista.export-types.title-typescript')\n : t('vista.export-types.title-zod')\n }\n id=\"vista-export-types-dialog\"\n onClickOutside={onClose}\n onClose={onClose}\n width={2}\n >\n <Box padding={4}>\n <Stack gap={4}>\n <Text data-testid=\"vista-export-types-source\" muted size={1}>\n {sourceNote}\n </Text>\n {output.schemaError && (\n <Card border padding={3} radius={2} tone=\"caution\">\n <Text data-testid=\"vista-export-types-schema-error\" size={1}>\n {t('vista.export-types.schema-error', {message: output.schemaError.message})}\n </Text>\n </Card>\n )}\n {output.code && (\n <>\n <Card\n border\n className={styles.codeBlock}\n overflow=\"auto\"\n padding={3}\n radius={2}\n tone=\"transparent\"\n >\n <Code data-testid=\"vista-export-types-code\" language=\"typescript\" size={1}>\n {output.code}\n </Code>\n </Card>\n <Flex justifyContent=\"flex-end\">\n <Button\n icon={CopyIcon}\n mode=\"ghost\"\n onClick={() => void copyToClipboard(output.code, t('vista.export-types.copied'))}\n text={t('vista.export-types.copy')}\n />\n </Flex>\n </>\n )}\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","import {CodeIcon} from '@sanity/icons/Code'\nimport {CopyIcon} from '@sanity/icons/Copy'\nimport {EllipsisHorizontalIcon} from '@sanity/icons/EllipsisHorizontal'\nimport {PackageIcon} from '@sanity/icons/Package'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useState} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useCopyToClipboard} from '../../hooks/useCopyToClipboard'\nimport {type VistaTab} from '../../store/types'\nimport {ExportTypesDialog, type TypesExportFormat} from './ExportTypesDialog'\n\nexport interface ResultActionsMenuProps {\n tab: VistaTab\n result: unknown\n hasResult: boolean\n /** Whether the shown result was fetched for the tab's current query and params */\n resultIsCurrent: boolean\n}\n\nexport function ResultActionsMenu({\n tab,\n result,\n hasResult,\n resultIsCurrent,\n}: ResultActionsMenuProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const copyToClipboard = useCopyToClipboard()\n const [exportFormat, setExportFormat] = useState<TypesExportFormat | null>(null)\n\n return (\n <>\n <MenuButton\n button={\n <Button\n aria-label={t('vista.result.actions')}\n data-testid=\"vista-result-menu-button\"\n icon={EllipsisHorizontalIcon}\n mode=\"bleed\"\n padding={2}\n />\n }\n id={`vista-result-menu-${tab.id}`}\n menu={\n <Menu>\n <MenuItem\n disabled={!hasResult}\n icon={CopyIcon}\n onClick={() =>\n void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied'))\n }\n text={t('vista.result.copy')}\n />\n <MenuDivider />\n <MenuItem\n data-testid=\"vista-export-typescript\"\n icon={CodeIcon}\n onClick={() => setExportFormat('typescript')}\n text={t('vista.result.export-typescript')}\n />\n <MenuItem\n data-testid=\"vista-export-zod\"\n icon={PackageIcon}\n onClick={() => setExportFormat('zod')}\n text={t('vista.result.export-zod')}\n />\n </Menu>\n }\n popover={{animate: true, portal: true, placement: 'top-end'}}\n />\n {exportFormat && (\n <ExportTypesDialog\n format={exportFormat}\n hasResult={hasResult}\n onClose={() => setExportFormat(null)}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n )}\n </>\n )\n}\n","/**\n * A query result as a graph, the way jsoncrack draws JSON: every object and array is a node that\n * lists its plain values, and its nested objects and arrays are nodes of their own, linked from\n * the row of the property that holds them. Laid out left to right, a column per level.\n */\n\n/** Objects and arrays drawn; a result with more is cut off breadth first, so its top shows */\nexport const MAX_GRAPH_NODES = 300\n/** Rows a node lists before the rest is summed up in one */\nexport const MAX_GRAPH_ROWS = 30\nconst MAX_TEXT_LENGTH = 40\n\nexport type GraphValueType = 'string' | 'number' | 'boolean' | 'null'\n\nexport type GraphRow =\n /** A plain value, shown as it is (strings quoted and cut short) */\n | {kind: 'value'; key: string; text: string; type: GraphValueType}\n /** A nested object or array; `child` is its node, unless the graph was cut off before it */\n | {kind: 'child'; key: string; child: string | undefined; summary: string}\n /** The entries past `MAX_GRAPH_ROWS` */\n | {kind: 'more'; count: number}\n\nexport interface GraphNode {\n /** The dotted key path from the result (`0.author`), empty for the result itself */\n id: string\n /** The property or index that holds it, `undefined` for the result itself */\n label: string | undefined\n kind: 'object' | 'array' | 'value'\n /** `{3}` for an object with three properties, `[5]` for an array of five */\n summary: string\n rows: GraphRow[]\n depth: number\n}\n\nexport interface ResultGraph {\n /** Breadth first, the result first */\n nodes: GraphNode[]\n /** The objects and arrays that list only their first `MAX_GRAPH_ROWS` entries, breadth first */\n partialNodes: {id: string; entries: number}[]\n /** The result holds more objects and arrays than `MAX_GRAPH_NODES`; those past it are left out */\n nodeLimitReached: boolean\n}\n\nfunction isComposite(value: unknown): value is Record<string, unknown> | unknown[] {\n return typeof value === 'object' && value !== null\n}\n\nfunction summarize(value: Record<string, unknown> | unknown[]): string {\n return Array.isArray(value) ? `[${value.length}]` : `{${Object.keys(value).length}}`\n}\n\nfunction shorten(text: string): string {\n return text.length > MAX_TEXT_LENGTH ? `${text.slice(0, MAX_TEXT_LENGTH - 1)}…` : text\n}\n\nfunction describeValue(value: unknown): {text: string; type: GraphValueType} {\n if (typeof value === 'string') return {text: JSON.stringify(shorten(value)), type: 'string'}\n if (typeof value === 'number') return {text: String(value), type: 'number'}\n if (typeof value === 'boolean') return {text: String(value), type: 'boolean'}\n return {text: 'null', type: 'null'}\n}\n\nfunction entriesOf(value: Record<string, unknown> | unknown[]): [string, unknown][] {\n return Array.isArray(value)\n ? value.map((item, index) => [String(index), item])\n : Object.entries(value)\n}\n\nexport function buildResultGraph(value: unknown, maxNodes = MAX_GRAPH_NODES): ResultGraph {\n if (!isComposite(value)) {\n return {\n nodes: [\n {\n id: '',\n label: undefined,\n kind: 'value',\n summary: '',\n rows: [{kind: 'value', key: '', ...describeValue(value)}],\n depth: 0,\n },\n ],\n partialNodes: [],\n nodeLimitReached: false,\n }\n }\n\n const nodes: GraphNode[] = []\n const partialNodes: ResultGraph['partialNodes'] = []\n let nodeLimitReached = false\n let reserved = 1\n const queue: {\n value: Record<string, unknown> | unknown[]\n id: string\n label?: string\n depth: number\n }[] = [{value, id: '', depth: 0}]\n for (let head = 0; head < queue.length; head++) {\n const item = queue[head]\n const entries = entriesOf(item.value)\n const rows: GraphRow[] = []\n for (const [index, [key, entry]] of entries.entries()) {\n if (index === MAX_GRAPH_ROWS) {\n rows.push({kind: 'more', count: entries.length - index})\n partialNodes.push({id: item.id, entries: entries.length})\n break\n }\n if (!isComposite(entry)) {\n rows.push({kind: 'value', key, ...describeValue(entry)})\n continue\n }\n let child: string | undefined\n if (reserved < maxNodes) {\n reserved++\n child = item.id === '' ? key : `${item.id}.${key}`\n queue.push({value: entry, id: child, label: key, depth: item.depth + 1})\n } else {\n nodeLimitReached = true\n }\n rows.push({kind: 'child', key, child, summary: summarize(entry)})\n }\n nodes.push({\n id: item.id,\n label: item.label,\n kind: Array.isArray(item.value) ? 'array' : 'object',\n summary: summarize(item.value),\n rows,\n depth: item.depth,\n })\n }\n return {nodes, partialNodes, nodeLimitReached}\n}\n\n/** Sizes of a node's parts at a zoom of 1, in pixels */\nexport const GRAPH_METRICS = {\n headerHeight: 28,\n rowHeight: 20,\n paddingX: 10,\n paddingBottom: 6,\n /** The header's collapse and copy buttons */\n headerButtons: 48,\n minWidth: 120,\n maxWidth: 360,\n columnGap: 72,\n rowGap: 16,\n}\n\nexport interface PlacedNode {\n node: GraphNode\n x: number\n y: number\n width: number\n height: number\n /** Its children are hidden */\n collapsed: boolean\n /** Child nodes it links to, drawn or not */\n childCount: number\n}\n\nexport interface PlacedEdge {\n from: string\n to: string\n /** An SVG path from the row that holds the child to the child's header */\n path: string\n}\n\nexport interface GraphLayout {\n nodes: PlacedNode[]\n edges: PlacedEdge[]\n width: number\n height: number\n}\n\nfunction rowText(row: GraphRow): number {\n switch (row.kind) {\n case 'value':\n return row.key.length + (row.key ? 2 : 0) + row.text.length\n case 'child':\n return row.key.length + 2 + row.summary.length\n case 'more':\n return 12 + String(row.count).length\n default: {\n const unhandled: never = row\n return unhandled\n }\n }\n}\n\nfunction sizeOf(node: GraphNode, charWidth: number): {width: number; height: number} {\n const {headerHeight, rowHeight, paddingX, paddingBottom, headerButtons, minWidth, maxWidth} =\n GRAPH_METRICS\n const header = ((node.label ?? '').length + node.summary.length + 1) * charWidth + headerButtons\n const rows = Math.max(0, ...node.rows.map((row) => rowText(row))) * charWidth\n const width = Math.min(\n maxWidth,\n Math.max(minWidth, Math.ceil(Math.max(header, rows) + 2 * paddingX)),\n )\n return {width, height: headerHeight + node.rows.length * rowHeight + paddingBottom}\n}\n\n/**\n * Places the nodes a column per level, each subtree in a band of its own with its root centred\n * on it, so no two nodes overlap. The children of collapsed nodes are left out.\n */\nexport function layoutResultGraph(\n graph: ResultGraph,\n {collapsed, charWidth}: {collapsed: ReadonlySet<string>; charWidth: number},\n): GraphLayout {\n const {headerHeight, rowHeight, columnGap, rowGap} = GRAPH_METRICS\n const byId = new Map(graph.nodes.map((node) => [node.id, node]))\n const childrenOf = (node: GraphNode): GraphNode[] =>\n collapsed.has(node.id)\n ? []\n : node.rows.flatMap((row) => {\n const child =\n row.kind === 'child' && row.child !== undefined ? byId.get(row.child) : undefined\n return child ? [child] : []\n })\n\n const sizes = new Map<string, {width: number; height: number}>()\n const columnWidths: number[] = []\n const bands = new Map<string, number>()\n const measure = (node: GraphNode): number => {\n const size = sizeOf(node, charWidth)\n sizes.set(node.id, size)\n columnWidths[node.depth] = Math.max(columnWidths[node.depth] ?? 0, size.width)\n const children = childrenOf(node)\n const childBands = children.reduce((sum, child) => sum + measure(child), 0)\n const band = Math.max(size.height, childBands + rowGap * Math.max(0, children.length - 1))\n bands.set(node.id, band)\n return band\n }\n const root = graph.nodes[0]\n const height = measure(root)\n\n const columnX: number[] = []\n for (let depth = 0, x = 0; depth < columnWidths.length; depth++) {\n columnX[depth] = x\n x += columnWidths[depth] + columnGap\n }\n\n const placed: PlacedNode[] = []\n const positions = new Map<string, PlacedNode>()\n const place = (node: GraphNode, top: number) => {\n const size = sizes.get(node.id) ?? {width: 0, height: 0}\n const band = bands.get(node.id) ?? size.height\n const childCount = node.rows.filter((row) => row.kind === 'child' && row.child).length\n const entry: PlacedNode = {\n node,\n x: columnX[node.depth],\n y: top + (band - size.height) / 2,\n width: size.width,\n height: size.height,\n collapsed: collapsed.has(node.id) && childCount > 0,\n childCount,\n }\n placed.push(entry)\n positions.set(node.id, entry)\n const children = childrenOf(node)\n const childBands =\n children.reduce((sum, child) => sum + (bands.get(child.id) ?? 0), 0) +\n rowGap * Math.max(0, children.length - 1)\n let childTop = top + (band - childBands) / 2\n for (const child of children) {\n place(child, childTop)\n childTop += (bands.get(child.id) ?? 0) + rowGap\n }\n }\n place(root, 0)\n\n const edges: PlacedEdge[] = []\n for (const parent of placed) {\n parent.node.rows.forEach((row, index) => {\n const child =\n row.kind === 'child' && row.child !== undefined ? positions.get(row.child) : undefined\n if (!child) return\n const x1 = parent.x + parent.width\n const y1 = parent.y + headerHeight + index * rowHeight + rowHeight / 2\n const x2 = child.x\n const y2 = child.y + headerHeight / 2\n const middle = (x1 + x2) / 2\n edges.push({\n from: parent.node.id,\n to: child.node.id,\n path: `M ${x1} ${y1} C ${middle} ${y1}, ${middle} ${y2}, ${x2} ${y2}`,\n })\n })\n }\n\n const lastColumn = columnWidths.length - 1\n return {\n nodes: placed,\n edges,\n width: columnX[lastColumn] + columnWidths[lastColumn],\n height,\n }\n}\n","/*\n * `ResultGraph` sets the custom properties on the viewport: the theme's code font and syntax\n * colors, and the `GRAPH_METRICS` the layout positions the nodes and edges with\n * (`--vision-graph-header-height`, `--vision-graph-row-height`, `--vision-graph-padding-x`), so\n * the boxes are the sizes the layout expects.\n */\n\n/* The area the graph is moved and zoomed in; dragging its background pans */\n.graphViewport {\n position: relative;\n height: 100%;\n overflow: hidden;\n cursor: grab;\n touch-action: none;\n user-select: none;\n outline: none;\n}\n\n.graphViewport[data-dragging='true'] {\n cursor: grabbing;\n}\n\n.graphViewport:focus-visible {\n box-shadow: inset 0 0 0 2px var(--card-focus-ring-color);\n}\n\n/* Positioned and scaled as one, so the nodes and the edges move together */\n.graphCanvas {\n position: absolute;\n top: 0;\n left: 0;\n transform-origin: 0 0;\n}\n\n.graphEdges {\n position: absolute;\n top: 0;\n left: 0;\n overflow: visible;\n pointer-events: none;\n}\n\n.graphEdges path {\n fill: none;\n stroke: var(--card-muted-fg-color);\n stroke-opacity: 0.55;\n stroke-width: 1.5;\n}\n\n.graphNode {\n position: absolute;\n box-sizing: border-box;\n background: var(--card-bg-color);\n border: 1px solid var(--card-border-color);\n border-radius: 6px;\n box-shadow: 0 1px 2px var(--card-shadow-umbra-color);\n overflow: hidden;\n font-family: var(--vision-graph-code-family);\n font-size: var(--vision-graph-code-size);\n cursor: default;\n}\n\n.graphNodeHeader {\n display: flex;\n align-items: center;\n gap: 2px;\n height: var(--vision-graph-header-height);\n box-sizing: border-box;\n padding-left: var(--vision-graph-padding-x);\n padding-right: 4px;\n border-bottom: 1px solid var(--card-border-color);\n background: var(--card-muted-bg-color);\n}\n\n.graphNodeTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--vision-graph-property);\n font-weight: 600;\n}\n\n.graphNodeSummary {\n color: var(--card-muted-fg-color);\n font-weight: 400;\n margin-left: 0.5ch;\n}\n\n.graphNodeButton {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n padding: 2px;\n border: 0;\n border-radius: 3px;\n background: none;\n color: var(--card-muted-fg-color);\n cursor: pointer;\n font: inherit;\n font-size: 1.15em;\n line-height: 1;\n}\n\n.graphNodeButton:hover {\n color: var(--card-fg-color);\n background: var(--card-code-bg-color);\n}\n\n.graphNodeButton:focus-visible {\n outline: 1px solid var(--card-focus-ring-color);\n}\n\n.graphRow {\n display: flex;\n align-items: center;\n height: var(--vision-graph-row-height);\n padding-left: var(--vision-graph-padding-x);\n padding-right: var(--vision-graph-padding-x);\n white-space: nowrap;\n overflow: hidden;\n position: relative;\n}\n\n.graphRowKey {\n color: var(--vision-graph-property);\n flex-shrink: 0;\n}\n\n.graphRowValue {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-left: 1ch;\n}\n\n.graphRowValue[data-type='string'] {\n color: var(--vision-graph-string);\n}\n\n.graphRowValue[data-type='number'] {\n color: var(--vision-graph-number);\n}\n\n.graphRowValue[data-type='boolean'] {\n color: var(--vision-graph-boolean);\n}\n\n.graphRowValue[data-type='null'] {\n color: var(--vision-graph-constant);\n}\n\n.graphRowValue[data-type='child'],\n.graphRowValue[data-type='more'] {\n color: var(--card-muted-fg-color);\n}\n\n/* Where the edge to a nested object or array leaves its row */\n.graphRowPort {\n position: absolute;\n right: -3px;\n top: 50%;\n width: 6px;\n height: 6px;\n margin-top: -3px;\n border-radius: 50%;\n background: var(--card-muted-fg-color);\n}\n\n.graphControls {\n position: absolute;\n right: 8px;\n bottom: 8px;\n display: flex;\n gap: 2px;\n padding: 2px;\n border-radius: 4px;\n background: var(--card-bg-color);\n box-shadow: 0 0 0 1px var(--card-border-color);\n z-index: 1;\n}\n\n.graphNotice {\n position: absolute;\n left: 8px;\n bottom: 8px;\n max-width: calc(100% - 140px);\n padding: 4px 8px;\n border-radius: 4px;\n background: var(--card-bg-color);\n box-shadow: 0 0 0 1px var(--card-border-color);\n z-index: 1;\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {CopyIcon} from '@sanity/icons/Copy'\nimport {ExpandIcon} from '@sanity/icons/Expand'\nimport {RemoveIcon} from '@sanity/icons/Remove'\nimport {Button, Text, useTheme_v2 as useThemeV2} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {\n type CSSProperties,\n type KeyboardEvent,\n memo,\n type PointerEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {type TFunction, useTranslation} from 'sanity'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {type ResultViewCopy} from '../../../components/ResultView'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {describeKeypath, getAtKeypath} from '../../../util/getAtKeypath'\nimport {useContentSize} from '../../hooks/useContentSize'\nimport {\n buildResultGraph,\n GRAPH_METRICS,\n type GraphLayout,\n type GraphRow,\n layoutResultGraph,\n MAX_GRAPH_NODES,\n MAX_GRAPH_ROWS,\n type ResultGraph as ResultGraphModel,\n} from '../../util/resultGraph'\nimport * as styles from './ResultGraph.module.css'\n\n/** The theme values and `GRAPH_METRICS` that ResultGraph.module.css reads */\ninterface GraphViewportStyle extends CSSProperties {\n '--vision-graph-code-family': string\n '--vision-graph-code-size': string\n '--vision-graph-property': string\n '--vision-graph-string': string\n '--vision-graph-number': string\n '--vision-graph-boolean': string\n '--vision-graph-constant': string\n '--vision-graph-header-height': string\n '--vision-graph-row-height': string\n '--vision-graph-padding-x': string\n}\n\ninterface View {\n x: number\n y: number\n scale: number\n}\n\nconst MIN_SCALE = 0.1\nconst MAX_SCALE = 2\n/** Below this, a first view shows the result's node at a readable size rather than all of it */\nconst MIN_FIRST_VIEW_SCALE = 0.5\nconst FIRST_VIEW_SCALE = 0.8\nconst PADDING = 24\nconst ZOOM_STEP = 1.25\nconst PAN_STEP = 48\n/** A monospace character is about this wide for its size */\nconst CHAR_WIDTH_RATIO = 0.62\n/** Partly listed objects and arrays the note names; any more are counted */\nconst NAMED_PARTIAL_NODES = 3\n\n/** What the graph leaves out of this result, or `undefined` when it shows all of it */\nfunction describeLeftOut(graph: ResultGraphModel, t: TFunction<'vision'>): string | undefined {\n const {partialNodes, nodeLimitReached} = graph\n if (partialNodes.length === 0 && !nodeLimitReached) return undefined\n const sentences: string[] = []\n if (partialNodes.length > 0) {\n const named = partialNodes.slice(0, NAMED_PARTIAL_NODES).map(({id, entries}) =>\n t('vista.result.graph.partial.node', {\n name: id === '' ? t('vista.result.graph.root') : describeKeypath(id),\n entries,\n }),\n )\n const others = partialNodes.length - named.length\n const nodes = named.join(', ')\n sentences.push(\n t('vista.result.graph.partial', {\n rows: MAX_GRAPH_ROWS,\n nodes:\n others > 0 ? `${nodes} ${t('vista.result.graph.partial.more', {count: others})}` : nodes,\n }),\n )\n }\n if (nodeLimitReached) {\n sentences.push(t('vista.result.graph.node-limit', {nodes: MAX_GRAPH_NODES}))\n }\n sentences.push(t('vista.result.graph.left-out-hint'))\n return sentences.join(' ')\n}\n\nfunction clampScale(scale: number): number {\n return Math.min(MAX_SCALE, Math.max(MIN_SCALE, scale))\n}\n\nfunction fitView(layout: GraphLayout, size: {width: number; height: number}): View {\n const scale = clampScale(\n Math.min(\n (size.width - 2 * PADDING) / layout.width,\n (size.height - 2 * PADDING) / layout.height,\n 1,\n ),\n )\n return {\n scale,\n x: (size.width - layout.width * scale) / 2,\n y: (size.height - layout.height * scale) / 2,\n }\n}\n\n/** All of the graph when it fits at a readable size, else the result's node at the left */\nfunction firstView(layout: GraphLayout, size: {width: number; height: number}): View {\n const fit = fitView(layout, size)\n if (fit.scale >= MIN_FIRST_VIEW_SCALE) return fit\n const [root] = layout.nodes\n return {\n scale: FIRST_VIEW_SCALE,\n x: PADDING,\n y: size.height / 2 - (root.y + root.height / 2) * FIRST_VIEW_SCALE,\n }\n}\n\n/** Zooms by `factor` keeping the point `x`, `y` of the viewport where it is */\nfunction zoomAt(view: View, factor: number, x: number, y: number): View {\n const scale = clampScale(view.scale * factor)\n const ratio = scale / view.scale\n return {scale, x: x - (x - view.x) * ratio, y: y - (y - view.y) * ratio}\n}\n\nfunction RowContent({row}: {row: GraphRow}) {\n const {t} = useTranslation(visionLocaleNamespace)\n switch (row.kind) {\n case 'value':\n return (\n <>\n {row.key && <span className={styles.graphRowKey}>{row.key}</span>}\n <span className={styles.graphRowValue} data-type={row.type}>\n {row.text}\n </span>\n </>\n )\n case 'child':\n return (\n <>\n <span className={styles.graphRowKey}>{row.key}</span>\n <span className={styles.graphRowValue} data-type=\"child\">\n {row.summary}\n </span>\n {row.child !== undefined && <span className={styles.graphRowPort} />}\n </>\n )\n case 'more':\n return (\n <span className={styles.graphRowValue} data-type=\"more\">\n {t('vista.result.graph.more', {count: row.count})}\n </span>\n )\n default: {\n const unhandled: never = row\n return unhandled\n }\n }\n}\n\ninterface GraphNodesProps {\n layout: GraphLayout\n copyLabel: string\n onToggle: (id: string) => void\n onCopy: (id: string) => void\n}\n\nfunction GraphNodes({layout, copyLabel, onToggle, onCopy}: GraphNodesProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n return (\n <>\n <svg\n className={styles.graphEdges}\n data-testid=\"vista-graph-edges\"\n height={layout.height}\n width={layout.width}\n >\n {layout.edges.map((edge) => (\n <path d={edge.path} key={`${edge.from}>${edge.to}`} />\n ))}\n </svg>\n {layout.nodes.map(({node, x, y, width, height, collapsed, childCount}) => {\n const title = node.label ?? t('vista.result.graph.root')\n return (\n <div\n aria-label={`${title} ${node.summary}`}\n className={styles.graphNode}\n data-testid=\"vista-graph-node\"\n data-keypath={node.id}\n key={node.id}\n role=\"group\"\n style={{left: x, top: y, width, height}}\n >\n <div className={styles.graphNodeHeader}>\n <span className={styles.graphNodeTitle}>\n {title}\n {node.summary && <span className={styles.graphNodeSummary}>{node.summary}</span>}\n </span>\n {childCount > 0 && (\n <button\n aria-expanded={!collapsed}\n aria-label={\n collapsed\n ? t('vista.result.graph.expand', {count: childCount})\n : t('vista.result.graph.collapse')\n }\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-toggle\"\n onClick={() => onToggle(node.id)}\n type=\"button\"\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronDownIcon />}\n {collapsed && childCount}\n </button>\n )}\n <button\n aria-label={copyLabel}\n className={styles.graphNodeButton}\n data-testid=\"vista-graph-copy\"\n onClick={() => onCopy(node.id)}\n type=\"button\"\n >\n <CopyIcon />\n </button>\n </div>\n {node.rows.map((row, index) => (\n // Rows are positional: the edges leave from their index\n // oxlint-disable-next-line react/no-array-index-key -- a row is its place in the node\n <div className={styles.graphRow} key={index}>\n <RowContent row={row} />\n </div>\n ))}\n </div>\n )\n })}\n </>\n )\n}\n\nconst GraphNodesMemo = memo(GraphNodes)\n\nexport interface ResultGraphProps {\n id: string\n value: unknown\n copy: ResultViewCopy\n}\n\n/**\n * The result as a graph to move around in: drag to pan, scroll or the buttons to zoom, and\n * collapse what a node holds. The tree and JSON views remain the way to read all of a large\n * result; the graph stops at `MAX_GRAPH_NODES` objects and arrays.\n */\nexport function ResultGraph({id, value, copy}: ResultGraphProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const {color, font} = useThemeV2()\n const codeSize = font.code.sizes[1]\n const charWidth = codeSize.fontSize * CHAR_WIDTH_RATIO\n\n const graph = useMemo(() => buildResultGraph(value), [value])\n const leftOut = describeLeftOut(graph, t)\n const [collapsed, setCollapsed] = useState<ReadonlySet<string>>(() => new Set())\n const layout = useMemo(\n () => layoutResultGraph(graph, {collapsed, charWidth}),\n [charWidth, collapsed, graph],\n )\n\n const [viewport, setViewport] = useState<HTMLDivElement | null>(null)\n const size = useContentSize(viewport)\n // A view the user moved to, for the graph it was moved on; a new result starts over\n const [moved, setMoved] = useState<{graph: ResultGraphModel; view: View} | null>(null)\n const view: View | null =\n moved && moved.graph === graph ? moved.view : size ? firstView(layout, size) : null\n const setView = (next: View) => setMoved({graph, view: next})\n\n const drag = useRef<{pointerId: number; x: number; y: number; view: View} | null>(null)\n const [dragging, setDragging] = useState(false)\n\n const zoomBy = (factor: number) => {\n if (!view || !size) return\n setView(zoomAt(view, factor, size.width / 2, size.height / 2))\n }\n const fit = () => {\n if (size) setView(fitView(layout, size))\n }\n\n const onWheel = useEffectEvent((event: WheelEvent) => {\n if (!view || !viewport) return\n event.preventDefault()\n const bounds = viewport.getBoundingClientRect()\n setView(\n zoomAt(\n view,\n Math.exp(-event.deltaY * 0.0015),\n event.clientX - bounds.left,\n event.clientY - bounds.top,\n ),\n )\n })\n useEffect(() => {\n if (!viewport) return undefined\n // Not passive, so scrolling over the graph zooms it instead of scrolling the page\n const listener = (event: WheelEvent) => onWheel(event)\n viewport.addEventListener('wheel', listener, {passive: false})\n return () => viewport.removeEventListener('wheel', listener)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [viewport])\n\n const onPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n if (!view || event.button !== 0) return\n if (event.target instanceof Element && event.target.closest('button')) return\n event.currentTarget.setPointerCapture?.(event.pointerId)\n drag.current = {pointerId: event.pointerId, x: event.clientX, y: event.clientY, view}\n setDragging(true)\n }\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n const start = drag.current\n if (!start || start.pointerId !== event.pointerId) return\n setView({\n ...start.view,\n x: start.view.x + event.clientX - start.x,\n y: start.view.y + event.clientY - start.y,\n })\n }\n const endDrag = (event: PointerEvent<HTMLDivElement>) => {\n if (drag.current?.pointerId !== event.pointerId) return\n drag.current = null\n setDragging(false)\n }\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget || !view) return\n const pans: Record<string, [number, number]> = {\n ArrowLeft: [PAN_STEP, 0],\n ArrowRight: [-PAN_STEP, 0],\n ArrowUp: [0, PAN_STEP],\n ArrowDown: [0, -PAN_STEP],\n }\n if (event.key in pans) {\n const [dx, dy] = pans[event.key]\n setView({...view, x: view.x + dx, y: view.y + dy})\n } else if (event.key === '+' || event.key === '=') zoomBy(ZOOM_STEP)\n else if (event.key === '-') zoomBy(1 / ZOOM_STEP)\n else if (event.key === '0') fit()\n else return\n event.preventDefault()\n }\n\n // Stable while the view moves, so panning and zooming do not draw the nodes again\n const onToggle = useCallback((nodeId: string) => {\n setCollapsed((current) => {\n const next = new Set(current)\n if (!next.delete(nodeId)) next.add(nodeId)\n return next\n })\n }, [])\n const onCopy = useCallback(\n (nodeId: string) => {\n const found = getAtKeypath(value, nodeId)\n if (found) copy.onCopy(found.value, nodeId)\n },\n [copy, value],\n )\n const controls = [\n {\n action: 'zoom-out',\n label: t('vista.result.graph.zoom-out'),\n icon: RemoveIcon,\n onClick: () => zoomBy(1 / ZOOM_STEP),\n },\n {\n action: 'zoom-in',\n label: t('vista.result.graph.zoom-in'),\n icon: AddIcon,\n onClick: () => zoomBy(ZOOM_STEP),\n },\n {action: 'fit', label: t('vista.result.graph.fit'), icon: ExpandIcon, onClick: fit},\n ]\n\n const viewportStyle: GraphViewportStyle = {\n '--vision-graph-code-family': font.code.family,\n '--vision-graph-code-size': `${codeSize.fontSize}px`,\n '--vision-graph-property': color.syntax.property,\n '--vision-graph-string': color.syntax.string,\n '--vision-graph-number': color.syntax.number,\n '--vision-graph-boolean': color.syntax.boolean,\n '--vision-graph-constant': color.syntax.constant,\n '--vision-graph-header-height': `${GRAPH_METRICS.headerHeight}px`,\n '--vision-graph-row-height': `${GRAPH_METRICS.rowHeight}px`,\n '--vision-graph-padding-x': `${GRAPH_METRICS.paddingX}px`,\n }\n\n return (\n // oxlint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- role=\"application\" is for a widget that handles its own pointer and keys (pan, zoom, fit)\n <div\n aria-label={t('vista.result.graph.label')}\n className={styles.graphViewport}\n data-dragging={dragging}\n data-testid=\"vista-result-graph\"\n id={id}\n onKeyDown={onKeyDown}\n onLostPointerCapture={endDrag}\n onPointerCancel={endDrag}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n ref={setViewport}\n role=\"application\"\n style={viewportStyle}\n tabIndex={0}\n >\n {view && (\n <div\n className={styles.graphCanvas}\n data-testid=\"vista-graph-canvas\"\n style={{\n width: layout.width,\n height: layout.height,\n transform: `translate(${view.x}px, ${view.y}px) scale(${view.scale})`,\n }}\n >\n <GraphNodesMemo\n copyLabel={copy.label}\n layout={layout}\n onCopy={onCopy}\n onToggle={onToggle}\n />\n </div>\n )}\n {leftOut && (\n <div className={styles.graphNotice} data-testid=\"vista-graph-left-out\">\n <Text muted size={1}>\n {leftOut}\n </Text>\n </div>\n )}\n <div className={styles.graphControls}>\n {controls.map(({action, label, icon, onClick}) => (\n <Tooltip\n animate\n content={<Text size={1}>{label}</Text>}\n key={action}\n placement=\"top\"\n portal\n >\n <Button\n aria-label={label}\n data-testid={`vista-graph-${action}`}\n fontSize={1}\n icon={icon}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n />\n </Tooltip>\n ))}\n </div>\n </div>\n )\n}\n","import {useEffect, useMemo, useRef} from 'react'\n\nimport {resultJsonExtensions} from '../../../codemirror/extensions'\nimport {VisionCodeMirror, type VisionCodeMirrorHandle} from '../../../codemirror/VisionCodeMirror'\nimport * as styles from '../vista.module.css'\n\n/**\n * The result as indented JSON in a read-only editor, so any part of it can be selected and\n * copied as text; objects and arrays fold from the gutter\n */\nexport function ResultJson(props: {id: string; value: unknown}) {\n const editorRef = useRef<VisionCodeMirrorHandle>(null)\n const text = useMemo(() => JSON.stringify(props.value, null, 2) ?? 'null', [props.value])\n // The editor only takes its first document from props; a newer result replaces it\n useEffect(() => {\n editorRef.current?.resetEditorContent(text)\n }, [text])\n\n return (\n <div className={styles.resultJson} data-testid=\"vista-result-json\" id={props.id}>\n <VisionCodeMirror extensions={resultJsonExtensions} initialValue={text} ref={editorRef} />\n </div>\n )\n}\n","import {Text} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\nimport {Box} from 'ui5'\n\nimport {ResultView} from '../../../components/ResultView'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type VistaResponseMeta} from '../../store/types'\n\nexport interface SourceMapTabProps {\n meta: VistaResponseMeta | undefined\n dataset: string\n}\n\nexport function SourceMapTab({meta, dataset}: SourceMapTabProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n\n if (!meta?.resultSourceMap) {\n return (\n <Box padding={3}>\n <Text muted size={1}>\n {t('vista.source-map.empty')}\n </Text>\n </Box>\n )\n }\n\n return (\n <Box data-testid=\"vista-source-map\" padding={3}>\n <ResultView data={meta.resultSourceMap} datasetName={dataset} />\n </Box>\n )\n}\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {DocumentSheetIcon} from '@sanity/icons/DocumentSheet'\nimport {JsonIcon} from '@sanity/icons/Json'\nimport {Badge, Button, Card, Label, Tab, TabList, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useSelector} from '@xstate/react'\nimport {type ReactNode, useCallback, useEffect, useMemo} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {DelayedSpinner} from '../../../components/DelayedSpinner'\nimport {QueryErrorDialog} from '../../../components/QueryErrorDialog'\nimport {ResultView, type ResultViewCopy} from '../../../components/ResultView'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {describeKeypath} from '../../../util/getAtKeypath'\nimport {canEncodeCsv, getCsvBlobUrl, getJsonBlobUrl} from '../../../util/getBlobUrl'\nimport {useCopyToClipboard} from '../../hooks/useCopyToClipboard'\nimport {useQueryExplain} from '../../hooks/useQueryExplain'\nimport {type ResolvedRequest} from '../../hooks/useResolvedRequest'\nimport {type QueryRunnerRef, selectRequestStatus} from '../../store/queryRunnerMachine'\nimport {\n type QueryRequest,\n type VistaResultView,\n type VistaSavedFunction,\n type VistaTab,\n type VistaTabDrawer,\n} from '../../store/types'\nimport {useSidebarBadges, useVistaActor, useVistaSelector} from '../../store/VistaActorContext'\nimport {\n selectFunctionLibrary,\n selectOpenTabDrawer,\n selectResultView,\n} from '../../store/vistaMachine'\nimport {parseGroq, readQueryFunctions, type TextRange} from '../../util/groqFunctions'\nimport {type QueryLintFinding} from '../../util/groqLint'\nimport {haveSameQuery} from '../../util/queryRequest'\nimport {ActionRail} from '../ActionRail'\nimport {type CollapsiblePanelTab} from '../CollapsiblePanel'\nimport {usePerspectiveOptionName} from '../request/OptionFields'\nimport {SplitWithBottomPanel} from '../SplitWithBottomPanel'\nimport {TabDrawerPortal} from '../TabDrawerPortal'\nimport * as styles from '../vista.module.css'\nimport {DeltaTab, useDeltaPanel} from './DeltaTab'\nimport {DownloadButton} from './DownloadButton'\nimport {ExplainTab} from './ExplainTab'\nimport {FunctionsTab, type QueryEdit} from './FunctionsTab'\nimport {HistoryTab} from './HistoryTab'\nimport {LintTab} from './LintTab'\nimport {MutateTab, useMutatePanel} from './MutateTab'\nimport {NetworkTab} from './NetworkTab'\nimport {ResponseMetaTab} from './ResponseMetaTab'\nimport {ResultActionsMenu} from './ResultActionsMenu'\nimport {ResultGraph} from './ResultGraph'\nimport {ResultJson} from './ResultJson'\nimport {SourceMapTab} from './SourceMapTab'\n\nconst DEFAULT_BOTTOM_PANEL_SIZE = {columns: 220, stacked: 180, mobile: 160}\n\nexport interface ResponsePanelProps {\n tab: VistaTab\n runnerRef: QueryRunnerRef\n resolved: ResolvedRequest\n /** What the tab would fetch right now; tells whether the shown result is for the current query */\n request: QueryRequest | null\n /** The query editor's lint diagnostics, listed in the Lint panel */\n lintFindings: QueryLintFinding[]\n /** Shows part of the query (a lint finding, a function declaration) in the query editor */\n onRevealRange: (range: TextRange) => void\n /** Changes the query through its editor */\n onEditQuery: (edit: QueryEdit) => void\n /** Mutations were applied from the Mutate panel, and the result may have changed */\n onMutationsApplied: () => void\n}\n\nexport function ResponsePanel(props: ResponsePanelProps) {\n const {\n tab,\n runnerRef,\n resolved,\n request,\n lintFindings,\n onRevealRange,\n onEditQuery,\n onMutationsApplied,\n } = props\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n\n const status = useSelector(runnerRef, selectRequestStatus)\n const result = useSelector(runnerRef, (snapshot) => snapshot.context.result)\n const settledRequest = useSelector(runnerRef, (snapshot) => snapshot.context.settledRequest)\n const error = useSelector(runnerRef, (snapshot) => snapshot.context.error)\n // The request whose failure is shown: the runner keeps it, while the tab's options (and with\n // them `resolved`) may have moved on while it was in flight, so its error is explained with\n // the API version, perspective and variant it went out with\n const failedRequest = useSelector(runnerRef, (snapshot) =>\n snapshot.matches({request: 'failed'}) ? snapshot.context.request : undefined,\n )\n const failedConfig = failedRequest?.client.config()\n const meta = useSelector(runnerRef, (snapshot) => snapshot.context.meta)\n // While a newer fetch is in flight the shown response keeps its own URL, not the pending one\n const url = useSelector(\n runnerRef,\n (snapshot) => snapshot.context.meta?.url ?? snapshot.context.url,\n )\n const history = useSelector(runnerRef, (snapshot) => snapshot.context.history)\n const hiddenDiffFields = useVistaSelector((snapshot) => snapshot.context.historyDiff.hiddenFields)\n const isLive = useSelector(runnerRef, (snapshot) => snapshot.matches({live: 'on'}))\n\n // A response stays on screen while a newer fetch is in flight, and its actions stay with it;\n // a failed fetch or a cleared tab drops `meta` together with the result\n const hasResult = meta !== undefined\n const resultIsCurrent =\n hasResult &&\n settledRequest !== undefined &&\n request !== null &&\n haveSameQuery(settledRequest, request)\n // Document links in the result must point at the dataset it was fetched from, which the tab's\n // options may already have moved away from\n const resultDataset = settledRequest?.client.config().dataset || resolved.dataset\n // Serializing a large result is not free, and automatic refetching brings a new one with every\n // live event, so the files are built when a download is asked for rather than for every\n // response; the CSV button reads the result's shape to know whether there is a file to build\n const getJsonUrl = useCallback(() => getJsonBlobUrl(result), [result])\n const getCsvUrl = useCallback(() => getCsvBlobUrl(result), [result])\n const canExportCsv = hasResult && canEncodeCsv(result)\n const reportCsvUnavailable = useCallback(\n () =>\n toast.push({\n closable: true,\n status: 'warning',\n title: t('result.save-result-as-csv.not-csv-encodable'),\n }),\n [t, toast],\n )\n\n const queryExplain = useQueryExplain(request)\n const perspectiveName = usePerspectiveOptionName(resolved.tabPerspective)\n const delta = useDeltaPanel()\n const mutate = useMutatePanel()\n const actorRef = useVistaActor()\n const resultView = useVistaSelector(selectResultView)\n const functionLibrary = useVistaSelector(selectFunctionLibrary)\n const saveFunction = useCallback(\n (fn: VistaSavedFunction) => actorRef.send({type: 'functions.save', fn}),\n [actorRef],\n )\n const removeFunction = useCallback(\n (id: string) => actorRef.send({type: 'functions.remove', id}),\n [actorRef],\n )\n // A declaration without a namespace does not parse for the API; lint says so\n const declaredFunctions = useMemo(\n () =>\n readQueryFunctions(parseGroq(tab.query), tab.query).declarations.filter(\n (declaration) => declaration.namespace !== undefined,\n ),\n [tab.query],\n )\n const setResultView = useCallback(\n (view: VistaResultView) => actorRef.send({type: 'result.view', view}),\n [actorRef],\n )\n const copyToClipboard = useCopyToClipboard()\n const copyResult = useCallback(\n () => void copyToClipboard(JSON.stringify(result, null, 2), t('vista.result.copied')),\n [copyToClipboard, result, t],\n )\n // Text is copied as it is (an ID, a slug) and everything else as indented JSON\n const copyValue = useMemo(\n (): ResultViewCopy => ({\n label: t('vista.result.copy-value'),\n onCopy: (value, keypath) =>\n void copyToClipboard(\n typeof value === 'string' ? value : JSON.stringify(value, null, 2),\n keypath\n ? t('vista.result.copied-value', {path: describeKeypath(keypath)})\n : t('vista.result.copied'),\n ),\n }),\n [copyToClipboard, t],\n )\n\n const panelTabs = useMemo(\n (): CollapsiblePanelTab[] => [\n {\n id: 'response',\n label: t('vista.panel.response'),\n content: <ResponseMetaTab meta={meta} url={url} />,\n },\n {\n id: 'network',\n label: t('vista.panel.network'),\n content: <NetworkTab meta={meta} perspectiveName={perspectiveName} resolved={resolved} />,\n },\n {\n id: 'history',\n label:\n history.length > 0 ? (\n <Flex alignItems=\"center\" as=\"span\" gap={2}>\n {t('vista.panel.history')}\n <Badge fontSize={0}>{history.length}</Badge>\n </Flex>\n ) : (\n t('vista.panel.history')\n ),\n content: <HistoryTab hiddenFields={hiddenDiffFields} history={history} />,\n },\n {\n id: 'explain',\n label: t('vista.panel.explain'),\n content: (\n <ExplainTab\n canExplain={request !== null}\n client={resolved.client}\n explanation={queryExplain.explanation}\n onExplain={() => void queryExplain.explain()}\n onShowPlan={queryExplain.showPlan}\n plan={queryExplain.plan}\n />\n ),\n },\n {\n id: 'source-map',\n label: t('vista.panel.source-map'),\n content: <SourceMapTab dataset={resultDataset} meta={meta} />,\n },\n ],\n [\n hiddenDiffFields,\n history,\n meta,\n perspectiveName,\n queryExplain,\n request,\n resolved,\n resultDataset,\n t,\n url,\n ],\n )\n\n // The tab's tools open in the sidebar's drawer\n const tabDrawer = useVistaSelector(selectOpenTabDrawer)\n const renderTabDrawer = (drawer: VistaTabDrawer): ReactNode => {\n switch (drawer) {\n case 'lint':\n return <LintTab findings={lintFindings} onReveal={onRevealRange} />\n case 'functions':\n return (\n <FunctionsTab\n declarations={declaredFunctions}\n library={functionLibrary}\n onEdit={onEditQuery}\n onRemove={removeFunction}\n onReveal={onRevealRange}\n onSave={saveFunction}\n query={tab.query}\n />\n )\n case 'delta':\n return <DeltaTab delta={delta} request={request} />\n case 'mutate':\n return (\n <MutateTab\n canRequest={resolved.isValidApiVersion}\n client={resolved.client}\n dataset={resolved.dataset}\n hiddenFields={hiddenDiffFields}\n mutate={mutate}\n onApplied={onMutationsApplied}\n result={hasResult ? result : undefined}\n />\n )\n default: {\n const unknownDrawer: never = drawer\n return String(unknownDrawer)\n }\n }\n }\n\n // The sidebar shows how many lint findings and declared functions the tab has\n const sidebarBadges = useSidebarBadges()\n const lintCount = lintFindings.length\n const lintTone = lintFindings.some((finding) => finding.severity === 'error')\n ? 'critical'\n : 'caution'\n const functionCount = declaredFunctions.length\n useEffect(() => {\n sidebarBadges.set('lint', lintCount > 0 ? {count: lintCount, tone: lintTone} : undefined)\n sidebarBadges.set(\n 'functions',\n functionCount > 0 ? {count: functionCount, tone: 'default'} : undefined,\n )\n }, [functionCount, lintCount, lintTone, sidebarBadges])\n useEffect(\n () => () => {\n sidebarBadges.set('lint', undefined)\n sidebarBadges.set('functions', undefined)\n },\n [sidebarBadges],\n )\n\n return (\n <>\n {tabDrawer && <TabDrawerPortal>{renderTabDrawer(tabDrawer)}</TabDrawerPortal>}\n <SplitWithBottomPanel\n defaultBottomSize={DEFAULT_BOTTOM_PANEL_SIZE}\n footer={\n <ActionRail testId=\"vista-result-actions\">\n <DownloadButton\n download=\"query-result.json\"\n getBlobUrl={hasResult ? getJsonUrl : undefined}\n icon={JsonIcon}\n label={t('vista.result.export-json')}\n testId=\"vista-export-json\"\n />\n <DownloadButton\n download=\"query-result.csv\"\n getBlobUrl={canExportCsv ? getCsvUrl : undefined}\n icon={DocumentSheetIcon}\n label={t('vista.result.export-csv')}\n onUnavailable={reportCsvUnavailable}\n testId=\"vista-export-csv\"\n tooltip={\n hasResult && !canExportCsv\n ? t('result.save-result-as-csv.not-csv-encodable')\n : undefined\n }\n />\n <ResultActionsMenu\n hasResult={hasResult}\n result={result}\n resultIsCurrent={resultIsCurrent}\n tab={tab}\n />\n </ActionRail>\n }\n id=\"vista-response\"\n tabs={panelTabs}\n testId=\"vista-response-panel\"\n >\n <Card\n className={styles.resultContainer}\n data-testid=\"vista-result\"\n tone={status === 'failed' ? 'critical' : 'default'}\n >\n <Box className={styles.resultLabel}>\n <Flex alignItems=\"center\" gap={2}>\n <Label muted size={1}>\n {t('result.label')}\n </Label>\n {isLive && (\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n )}\n <Box flexBasis=\"0%\" flexGrow={1} />\n {hasResult && (\n <Flex alignItems=\"center\" className={styles.labelActions} gap={1}>\n <TabList aria-label={t('vista.result.view.label')} gap={1}>\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-tree\"\n label={t('vista.result.view.tree')}\n onClick={() => setResultView('tree')}\n padding={2}\n selected={resultView === 'tree'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-json\"\n label={t('vista.result.view.json')}\n onClick={() => setResultView('json')}\n padding={2}\n selected={resultView === 'json'}\n />\n <Tab\n aria-controls=\"vista-result-content\"\n fontSize={1}\n id=\"vista-result-view-graph\"\n label={t('vista.result.view.graph')}\n onClick={() => setResultView('graph')}\n padding={2}\n selected={resultView === 'graph'}\n />\n </TabList>\n <Tooltip\n animate\n content={<Text size={1}>{t('vista.result.copy')}</Text>}\n placement=\"bottom\"\n portal\n >\n <Button\n aria-label={t('vista.result.copy')}\n data-testid=\"vista-copy-result\"\n fontSize={1}\n icon={CopyIcon}\n mode=\"bleed\"\n onClick={copyResult}\n padding={2}\n />\n </Tooltip>\n </Flex>\n )}\n </Flex>\n </Box>\n {hasResult && resultView === 'json' ? (\n <ResultJson id=\"vista-result-content\" value={result} />\n ) : hasResult && resultView === 'graph' ? (\n <ResultGraph copy={copyValue} id=\"vista-result-content\" value={result} />\n ) : (\n <Box id=\"vista-result-content\" padding={3} paddingTop={5}>\n {status === 'fetching' && (\n <Box marginTop={3}>\n <DelayedSpinner />\n </Box>\n )}\n {status === 'failed' && error && (\n <QueryErrorDialog\n apiVersion={failedConfig?.apiVersion ?? resolved.apiVersion}\n error={error}\n perspective={failedConfig ? failedConfig.perspective : resolved.perspective}\n variant={\n failedConfig\n ? typeof failedConfig.variant === 'string'\n ? failedConfig.variant\n : undefined\n : resolved.variant\n }\n />\n )}\n {hasResult && resultView === 'tree' && (\n <ResultView copy={copyValue} data={result} datasetName={resultDataset} />\n )}\n {status === 'idle' && (\n <Text muted size={1}>\n {t('vista.result.empty')}\n </Text>\n )}\n </Box>\n )}\n </Card>\n </SplitWithBottomPanel>\n </>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Badge, Button, TextInput} from '@sanity/ui'\nimport {useSelector} from '@xstate/react'\nimport {Reorder, useDragControls} from 'motion/react'\nimport {\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type RefObject,\n useCallback,\n useRef,\n useState,\n} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {type VistaTab} from '../../store/types'\nimport {useVistaActor, useVistaSelector} from '../../store/VistaActorContext'\nimport {deriveTabTitle} from '../../util/tabTitle'\nimport * as styles from '../vista.module.css'\n\n/** The element id of the active tab's content, referenced by every tab's `aria-controls` */\nexport const QUERY_TAB_PANEL_ID = 'vista-query-tabpanel'\n\nexport function getQueryTabId(tabId: string): string {\n return `vista-query-tab-${tabId}`\n}\n\nfunction getTabTitle(tab: VistaTab, fallback: string): string {\n return tab.title || deriveTabTitle(tab.query) || fallback\n}\n\ninterface TabTitleInputProps {\n title: string\n onCommit: (title: string) => void\n onCancel: () => void\n}\n\n/** Mounted only while renaming, so the draft always starts from the current title */\nfunction TabTitleInput({title, onCommit, onCancel}: TabTitleInputProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const [draft, setDraft] = useState(title)\n // Enter and Escape unmount the field while it has focus, and Chromium then fires `blur` on\n // it; that blur must not commit a draft that was just committed or, worse, just discarded\n const settledRef = useRef(false)\n\n const commit = () => {\n if (settledRef.current) return\n settledRef.current = true\n onCommit(draft)\n }\n const cancel = () => {\n if (settledRef.current) return\n settledRef.current = true\n onCancel()\n }\n\n return (\n <Box className={styles.tabTitleInput} paddingY={1}>\n <TextInput\n autoFocus\n data-testid=\"vista-tab-title-input\"\n fontSize={1}\n onBlur={commit}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onFocus={(event) => event.currentTarget.select()}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') commit()\n if (event.key === 'Escape') cancel()\n }}\n padding={2}\n placeholder={t('vista.tabs.title-placeholder')}\n value={draft}\n />\n </Box>\n )\n}\n\ninterface TabHandleProps {\n tab: VistaTab\n selected: boolean\n editing: boolean\n /** The list the tab may be dragged within */\n listRef: RefObject<HTMLDivElement | null>\n onSelect: () => void\n onClose: () => void\n onStartRename: () => void\n onRename: (title: string) => void\n onCancelRename: () => void\n onKeyDown: (event: KeyboardEvent<HTMLButtonElement>) => void\n}\n\n/**\n * One reorderable tab. Only the title starts a drag, so the close button and the rename field\n * keep their own pointer behaviour.\n */\nfunction TabHandle(props: TabHandleProps) {\n const {\n tab,\n selected,\n editing,\n listRef,\n onSelect,\n onClose,\n onStartRename,\n onRename,\n onCancelRename,\n onKeyDown,\n } = props\n const {t} = useTranslation(visionLocaleNamespace)\n const title = getTabTitle(tab, t('vista.tabs.untitled'))\n const dragControls = useDragControls()\n const [dragging, setDragging] = useState(false)\n // The badge reports the runner's actual subscription, which only the active tab holds, rather\n // than the stored auto-refetch preference\n const runnerRef = useVistaSelector((snapshot) => snapshot.context.runners[tab.id])\n const isLive = useSelector(runnerRef, (snapshot) => snapshot.matches({live: 'on'}))\n\n const handleAuxClick = useCallback(\n (event: MouseEvent) => {\n // Middle click closes the tab, as browsers do\n if (event.button === 1) {\n event.preventDefault()\n onClose()\n }\n },\n [onClose],\n )\n\n const startDrag = useCallback(\n (event: PointerEvent<HTMLButtonElement>) => {\n // Clicks still land: motion only turns this into a drag once the pointer moves\n if (event.button === 0) dragControls.start(event)\n },\n [dragControls],\n )\n\n return (\n <Reorder.Item\n as=\"div\"\n className={styles.tabItem}\n data-dragging={dragging ? 'true' : undefined}\n data-testid=\"vista-tab-item\"\n // Keep the dragged tab inside the strip, which clips whatever leaves it\n dragConstraints={listRef}\n dragControls={dragControls}\n dragElastic={0.1}\n dragListener={false}\n layout=\"position\"\n onDragEnd={() => setDragging(false)}\n onDragStart={() => setDragging(true)}\n value={tab}\n >\n <Flex\n alignItems=\"center\"\n className={styles.tab}\n data-selected={selected ? 'true' : undefined}\n data-testid=\"vista-tab\"\n gap={1}\n paddingLeft={1}\n paddingRight={1}\n role=\"presentation\"\n >\n {editing ? (\n <TabTitleInput onCancel={onCancelRename} onCommit={onRename} title={title} />\n ) : (\n <Button\n aria-controls={QUERY_TAB_PANEL_ID}\n aria-selected={selected}\n className={styles.tabTitleButton}\n data-testid=\"vista-tab-button\"\n fontSize={1}\n id={getQueryTabId(tab.id)}\n mode=\"bleed\"\n onAuxClick={handleAuxClick}\n onClick={onSelect}\n onDoubleClick={onStartRename}\n onKeyDown={onKeyDown}\n onPointerDown={startDrag}\n padding={2}\n role=\"tab\"\n tabIndex={selected ? 0 : -1}\n text={title}\n textWeight={selected ? 'medium' : 'regular'}\n />\n )}\n {isLive && (\n <Box flexShrink={0}>\n <Badge fontSize={0} tone=\"positive\">\n {t('vista.live.active')}\n </Badge>\n </Box>\n )}\n <Button\n aria-label={t('vista.tabs.close-tab')}\n className={styles.tabCloseButton}\n data-testid=\"vista-tab-close\"\n fontSize={1}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n padding={1}\n tabIndex={-1}\n />\n </Flex>\n </Reorder.Item>\n )\n}\n\nexport function QueryTabBar() {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const tabs = useVistaSelector((snapshot) => snapshot.context.tabs)\n const activeTabId = useVistaSelector((snapshot) => snapshot.context.activeTabId)\n const [editingId, setEditingId] = useState<string | null>(null)\n const listRef = useRef<HTMLDivElement | null>(null)\n\n const focusTab = useCallback((id: string) => {\n listRef.current?.querySelector<HTMLElement>(`#${getQueryTabId(id)}`)?.focus()\n }, [])\n\n // Renaming swaps the tab button for an input. When Enter or Escape ends it, focus is still\n // in the strip and returns to the button once React has rendered it again, so Tab does not\n // leave the strip; a click elsewhere (blur) keeps the focus where the user put it.\n const stopRenaming = useCallback(\n (id: string) => {\n const focusInStrip = listRef.current?.contains(document.activeElement) ?? false\n setEditingId(null)\n if (focusInStrip) requestAnimationFrame(() => focusTab(id))\n },\n [focusTab],\n )\n\n const reorder = useCallback(\n (ordered: VistaTab[]) =>\n actorRef.send({type: 'tab.reorder', ids: ordered.map((tab) => tab.id)}),\n [actorRef],\n )\n\n // The ARIA tabs keyboard pattern: arrows, Home and End move between tabs and activate them,\n // Delete closes the focused tab (the close button itself stays out of the tab order) and F2\n // renames it. Shift with an arrow moves the tab instead, the keyboard counterpart of dragging it.\n const handleTabKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n if (tabs.length === 0) return\n if (event.key === 'F2') {\n event.preventDefault()\n setEditingId(activeTabId)\n return\n }\n if (event.key === 'Delete') {\n event.preventDefault()\n actorRef.send({type: 'tab.close', id: activeTabId})\n // The tab that takes over may be brand new (closing the last tab), so it only exists\n // after React has rendered the new snapshot\n const nextId = actorRef.getSnapshot().context.activeTabId\n requestAnimationFrame(() => focusTab(nextId))\n return\n }\n const index = tabs.findIndex((tab) => tab.id === activeTabId)\n const direction = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0\n if (event.shiftKey && direction !== 0) {\n const target = index + direction\n if (target < 0 || target >= tabs.length) return\n event.preventDefault()\n const ordered = tabs.slice()\n ;[ordered[index], ordered[target]] = [ordered[target], ordered[index]]\n reorder(ordered)\n return\n }\n let nextIndex: number | undefined\n if (direction !== 0) nextIndex = (index + direction + tabs.length) % tabs.length\n if (event.key === 'Home') nextIndex = 0\n if (event.key === 'End') nextIndex = tabs.length - 1\n if (nextIndex === undefined) return\n event.preventDefault()\n const next = tabs[nextIndex]\n actorRef.send({type: 'tab.select', id: next.id})\n focusTab(next.id)\n },\n [activeTabId, actorRef, focusTab, reorder, tabs],\n )\n\n return (\n <Flex\n alignItems=\"stretch\"\n className={styles.tabBar}\n data-testid=\"vista-tab-bar\"\n flexShrink={0}\n paddingX={1}\n >\n <Reorder.Group\n aria-label={t('vista.tabs.label')}\n as=\"div\"\n axis=\"x\"\n className={styles.tabList}\n onReorder={reorder}\n ref={listRef}\n role=\"tablist\"\n values={tabs}\n >\n {tabs.map((tab) => (\n <TabHandle\n editing={editingId === tab.id}\n key={tab.id}\n listRef={listRef}\n onKeyDown={handleTabKeyDown}\n onCancelRename={() => stopRenaming(tab.id)}\n onClose={() => actorRef.send({type: 'tab.close', id: tab.id})}\n onRename={(title) => {\n stopRenaming(tab.id)\n actorRef.send({type: 'tab.rename', id: tab.id, title})\n }}\n onSelect={() => actorRef.send({type: 'tab.select', id: tab.id})}\n onStartRename={() => setEditingId(tab.id)}\n selected={tab.id === activeTabId}\n tab={tab}\n />\n ))}\n </Reorder.Group>\n <Flex alignItems=\"center\" paddingX={1}>\n <Button\n aria-label={t('vista.tabs.new-tab')}\n data-testid=\"vista-new-tab\"\n fontSize={1}\n icon={AddIcon}\n mode=\"bleed\"\n onClick={() => actorRef.send({type: 'tab.add'})}\n padding={2}\n />\n </Flex>\n </Flex>\n )\n}\n","import {Tab, TabList} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useSelector} from '@xstate/react'\nimport debounce from 'lodash-es/debounce.js'\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {type VisionCodeMirrorHandle} from '../../../codemirror/VisionCodeMirror'\nimport {useVariantsEnabled} from '../../../hooks/useVariantsEnabled'\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {parseQueryUrl} from '../../../util/parseQueryUrl'\nimport {useContentSize} from '../../hooks/useContentSize'\nimport {useCopyToClipboard} from '../../hooks/useCopyToClipboard'\nimport {useFollowNavbarPerspective} from '../../hooks/useFollowNavbarPerspective'\nimport {useLiveSubscription} from '../../hooks/useLiveSubscription'\nimport {useOnValueChange} from '../../hooks/useOnValueChange'\nimport {useQueryRequestBuilder} from '../../hooks/useQueryRequestBuilder'\nimport {useVistaDocumentEvents} from '../../hooks/useVistaDocumentEvents'\nimport {selectIsFetching} from '../../store/queryRunnerMachine'\nimport {type FetchReason, type VistaTab, type VistaTabOptions} from '../../store/types'\nimport {\n usePendingEdits,\n useVistaActor,\n useVistaExperience,\n useVistaSelector,\n type VistaLayout,\n} from '../../store/VistaActorContext'\nimport {\n isPanelExpanded,\n selectDatasets,\n selectOpenDrawer,\n selectParamsView,\n} from '../../store/vistaMachine'\nimport {cx} from '../../util/cx'\nimport {type TextRange} from '../../util/groqFunctions'\nimport {type QueryLintFinding} from '../../util/groqLint'\nimport {\n extractQueryParams,\n formatGroq,\n type GroqQueryParam,\n GroqSyntaxError,\n} from '../../util/groqWasm'\nimport {addMissingParams, missingParamNames} from '../../util/paramsPrefill'\nimport {parsedQueryToTabInit} from '../../util/savedQueryTab'\nimport {type VistaShortcutId} from '../../util/shortcuts'\nimport {RequestPanel} from '../request/RequestPanel'\nimport {ResizableSplit} from '../ResizableSplit'\nimport {type QueryEdit} from '../response/FunctionsTab'\nimport {ResponsePanel} from '../response/ResponsePanel'\nimport * as styles from '../vista.module.css'\nimport {getQueryTabId, QUERY_TAB_PANEL_ID} from './QueryTabBar'\n\nconst MIN_PANE_SIZE = {columns: 280, stacked: 160}\n\nfunction countLines(text: string): number {\n let lines = 1\n for (let index = text.indexOf('\\n'); index !== -1; index = text.indexOf('\\n', index + 1)) {\n lines++\n }\n return lines\n}\n/**\n * The request pane's initial share of the split. Stacked, it holds the query editor and the\n * params and options panels, so it starts out taller than the result.\n */\nconst DEFAULT_REQUEST_SHARE = {columns: 0.5, stacked: 0.6}\n/** Params are parsed on every change, so typing is debounced like in the classic tool */\nconst PARAMS_DEBOUNCE_MS = 333\n/** How long a query goes unedited before its referenced params are prefilled into the JSON editor */\nconst PARAMS_PREFILL_DEBOUNCE_MS = 333\n/**\n * A tab opened for a generated query lays out over its first frames (the split measures its\n * container), so the editor's width counts once it has stayed the same this many frames\n */\nconst SETTLED_LAYOUT_FRAMES = 3\nconst MAX_LAYOUT_FRAMES = 30\n\ntype MobilePane = 'request' | 'response'\n\ninterface QueryTabProps {\n tab: VistaTab\n /** The tool's root element; keyboard shortcuts and pastes outside it are ignored */\n rootElement: HTMLDivElement | null\n}\n\n/**\n * One open tab: the request and response columns, wired to the tab's query runner actor. Only\n * the active tab is mounted, so this component also owns the keyboard shortcuts and the\n * paste-a-query-URL handler.\n */\nexport function QueryTab({tab, rootElement}: QueryTabProps) {\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n const copyToClipboard = useCopyToClipboard()\n const actorRef = useVistaActor()\n const {layout} = useVistaExperience()\n const datasets = useVistaSelector(selectDatasets)\n const runnerRef = useVistaSelector((snapshot) => snapshot.context.runners[tab.id])\n const loadRevision = useVistaSelector((snapshot) => snapshot.context.loadRevisions[tab.id] || 0)\n\n const [splitContainer, setSplitContainer] = useState<HTMLDivElement | null>(null)\n const splitContainerSize = useContentSize(splitContainer)\n // Dragged sizes are remembered per layout: a column width makes no sense as a stacked height\n const [splitSizes, setSplitSizes] = useState<Partial<Record<VistaLayout, number>>>({})\n const [mobilePane, setMobilePane] = useState<MobilePane>('request')\n\n const queryEditorRef = useRef<VisionCodeMirrorHandle>(null)\n const paramsEditorRef = useRef<VisionCodeMirrorHandle>(null)\n // The query editor's diagnostics, listed in the response column's Lint panel\n const [lintFindings, setLintFindings] = useState<QueryLintFinding[]>([])\n\n const {resolved, params, request, buildRequest} = useQueryRequestBuilder(tab)\n const isVariantsEnabled = useVariantsEnabled()\n const isFetching = useSelector(runnerRef, selectIsFetching)\n\n const setQuery = useCallback(\n (query: string) => actorRef.send({type: 'tab.setQuery', id: tab.id, query}),\n [actorRef, tab.id],\n )\n const setParamsNow = useCallback(\n (rawParams: string) => actorRef.send({type: 'tab.setParams', id: tab.id, rawParams}),\n [actorRef, tab.id],\n )\n const setParams = useMemo(() => debounce(setParamsNow, PARAMS_DEBOUNCE_MS), [setParamsNow])\n useEffect(() => () => setParams.flush(), [setParams])\n // Save and Export (in the menu and in the sidebar) commit a params edit still waiting in the\n // debounce before they read the tab, as Run does\n const pendingEdits = usePendingEdits()\n useEffect(() => pendingEdits.register(() => setParams.flush()), [pendingEdits, setParams])\n // Collapsing the Params panel unmounts its editor, and expanding it seeds a new one from the\n // tab; an edit still waiting in the debounce is committed first so the new editor shows it\n const paramsExpanded = useVistaSelector((snapshot) => isPanelExpanded(snapshot, 'params'))\n useOnValueChange(paramsExpanded, (expanded) => {\n if (!expanded) setParams.flush()\n })\n // Switching between the editor and the form unmounts one and mounts the other from the tab\n const paramsView = useVistaSelector(selectParamsView)\n useOnValueChange(paramsView, () => setParams.flush())\n // The form shows the tab's params, so its edits are committed right away; an editor edit still\n // waiting in the debounce would write older params over them\n const replaceParams = useCallback(\n (rawParams: string) => {\n setParams.cancel()\n setParamsNow(rawParams)\n },\n [setParams, setParamsNow],\n )\n\n // A query that stops changing for a moment has the params it references ($foo, $bar)\n // prefilled into the JSON params editor, as empty placeholders, without touching any key\n // already there. The form view has its own, richer inference (groq-js based, with types) and\n // is unaffected: paramsEditorRef is only set while the JSON view is mounted\n const prefillParams = useEffectEvent(async (query: string) => {\n if (!paramsEditorRef.current) return\n let referenced: GroqQueryParam[]\n try {\n referenced = await extractQueryParams(query)\n } catch {\n return // the query does not parse yet; nothing reliable to prefill from\n }\n if (referenced.length === 0) return\n // The wasm module loads lazily; re-check everything that could have changed meanwhile: the\n // query may have moved on, or the params panel may have collapsed or switched to the form.\n // An edit still waiting in the params debounce is committed first, so a key just typed in\n // is read rather than clobbered by a snapshot taken before it\n if (!paramsEditorRef.current) return\n setParams.flush()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id)\n if (!latest || latest.query !== query) return\n const missing = missingParamNames(\n referenced.map((param) => param.name),\n latest.rawParams,\n t,\n )\n if (!missing || missing.length === 0) return\n const nextRawParams = addMissingParams(latest.rawParams, missing)\n if (nextRawParams === latest.rawParams) return\n paramsEditorRef.current.resetEditorContent(nextRawParams)\n setParamsNow(nextRawParams)\n })\n useEffect(() => {\n const timeoutId = setTimeout(() => void prefillParams(tab.query), PARAMS_PREFILL_DEBOUNCE_MS)\n return () => clearTimeout(timeoutId)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [tab.query])\n\n // The request a fetch of the tab's own query should carry right now: params typed within the\n // debounce window belong to it, so they are committed first and the request is built from what\n // the machine holds now rather than from the last render. Every such fetch (a run, an options\n // change, a load, resuming after a reload) goes through this; live refetches replay the\n // runner's last request instead\n const buildCurrentRequest = useCallback(() => {\n setParams.flush()\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id) ?? tab\n return buildRequest(latest.query, latest.rawParams)\n }, [actorRef, buildRequest, setParams, tab])\n\n const run = useCallback(\n (reason: FetchReason): boolean => {\n const current = buildCurrentRequest()\n if (!current) return false\n runnerRef.send({type: 'fetch', request: current, reason})\n // On a phone the result lives behind the other pane; bring it forward\n if (layout === 'mobile') setMobilePane('response')\n return true\n },\n [buildCurrentRequest, layout, runnerRef],\n )\n const cancel = useCallback(() => runnerRef.send({type: 'cancel'}), [runnerRef])\n const refetchAfterMutations = useCallback(() => {\n run({type: 'mutation'})\n }, [run])\n const setOptions = useCallback(\n (options: Partial<VistaTabOptions>) =>\n actorRef.send({type: 'tab.setOptions', id: tab.id, options}),\n [actorRef, tab.id],\n )\n // Live is an alternative to Fetch: it fetches the current request (live refetches replay the\n // runner's last one, which may date from before the options or the query changed), and then\n // refetches automatically until stopped\n const toggleAutoRefetch = useCallback(() => {\n if (tab.autoRefetch) {\n actorRef.send({type: 'tab.setAutoRefetch', id: tab.id, autoRefetch: false})\n } else if (run({type: 'live-start'})) {\n actorRef.send({type: 'tab.setAutoRefetch', id: tab.id, autoRefetch: true})\n }\n }, [actorRef, run, tab.autoRefetch, tab.id])\n\n // Formats a query to wrap at the width the editor has, so it needs no sideways scrolling.\n // Formatting changes the line count, and with it the line-number gutter's width and whether a\n // vertical scrollbar takes space, so the result is measured again and formatted once more while\n // that leaves fewer columns. Rejects when the query does not parse.\n const formatForEditor = useCallback(async (query: string) => {\n const editor = queryEditorRef.current\n let width = editor?.getVisibleColumns(countLines(query))\n let formatted = await formatGroq(query, width)\n for (let pass = 0; pass < 2 && width !== undefined; pass++) {\n const nextWidth = editor?.getVisibleColumns(countLines(formatted))\n if (nextWidth === undefined || nextWidth >= width) break\n width = nextWidth\n formatted = await formatGroq(query, width)\n }\n return formatted\n }, [])\n\n // Formats the query in place\n const formatQuery = useCallback(async () => {\n const {query} = tab\n const formatted = await formatForEditor(query)\n // The formatter loads lazily; a query edited meanwhile is not overwritten\n const latest = actorRef.getSnapshot().context.tabs.find((it) => it.id === tab.id)\n if (latest?.query !== query || formatted === query) return\n queryEditorRef.current?.resetEditorContent(formatted)\n setQuery(formatted)\n }, [actorRef, formatForEditor, setQuery, tab])\n\n const prettify = useCallback(async () => {\n try {\n await formatQuery()\n } catch (error) {\n toast.push({\n closable: true,\n description: error instanceof GroqSyntaxError ? error.message : undefined,\n status: 'warning',\n title: t('vista.query.prettify.failed'),\n })\n }\n }, [formatQuery, t, toast])\n\n const copyQuery = useCallback(\n () => void copyToClipboard(tab.query, t('vista.query.copied')),\n [copyToClipboard, t, tab.query],\n )\n\n // A lint finding or a function declaration picked on a phone, from the response pane or from the\n // sidebar's drawer: the editor is `display: none` behind the one, and inert under the other,\n // which covers the tool, so it cannot take focus until the request pane shows and the drawer\n // has closed\n const pendingRevealRef = useRef<TextRange | null>(null)\n const drawerOpen = useVistaSelector((snapshot) => selectOpenDrawer(snapshot) !== null)\n const revealRange = useCallback(\n (range: TextRange) => {\n if (layout === 'mobile' && (mobilePane !== 'request' || drawerOpen)) {\n pendingRevealRef.current = range\n setMobilePane('request')\n if (drawerOpen) actorRef.send({type: 'drawer.close'})\n return\n }\n queryEditorRef.current?.selectRange(range.from, range.to)\n },\n [actorRef, drawerOpen, layout, mobilePane],\n )\n // The Functions panel declares and replaces functions through the editor, so they can be undone\n const editQuery = useCallback(\n (edit: QueryEdit) => queryEditorRef.current?.applyChanges([edit]),\n [],\n )\n useEffect(() => {\n const pending = pendingRevealRef.current\n if (mobilePane !== 'request' || drawerOpen || !pending) return\n pendingRevealRef.current = null\n queryEditorRef.current?.selectRange(pending.from, pending.to)\n }, [drawerOpen, mobilePane])\n\n // A query loaded from outside the editors (saved query, pasted URL) replaces their content\n // and drops the previous response; an edit still waiting in the debounce belongs to the\n // replaced params and must not write them back\n useOnValueChange(loadRevision, () => {\n setParams.cancel()\n queryEditorRef.current?.resetEditorContent(tab.query)\n paramsEditorRef.current?.resetEditorContent(tab.rawParams)\n runnerRef.send({type: 'clear'})\n })\n\n useLiveSubscription({\n runnerRef,\n dataset: resolved.dataset,\n enabled: tab.autoRefetch && resolved.supportsSyncTags,\n tabId: tab.id,\n })\n\n // A tab that refetches automatically resumes with a current result when it mounts. After a\n // reload its runner has nothing to replay, so the tab's query runs. Otherwise only what\n // automatic refetching applies anyway is caught up on: the options may have changed while the\n // tab was in the background (a navbar perspective change reaches every tab), so the last\n // request is fetched again under the current ones. Query and params typed in the editors but\n // never run stay unsent, as they do while the tab is shown\n const resumeAutoRefetch = useEffectEvent(() => {\n if (!tab.autoRefetch) return\n const lastRequest = runnerRef.getSnapshot().context.request\n if (!lastRequest) {\n const current = buildCurrentRequest()\n if (current) runnerRef.send({type: 'fetch', request: current, reason: {type: 'resume'}})\n return\n }\n const current = buildRequest(lastRequest.query, JSON.stringify(lastRequest.params))\n if (\n current &&\n (current.url !== lastRequest.url || current.includeSourceMap !== lastRequest.includeSourceMap)\n ) {\n runnerRef.send({type: 'fetch', request: current, reason: {type: 'resume'}})\n }\n })\n // A query the tab fetches as soon as it is shown, or right away when it already is. A generated\n // query, in a tab opened for it or loaded into this one, is laid out for the editor, as Prettify\n // does, and its result shown straight away; a query the formatter cannot read runs as it was\n // written. The editor creates its view a render after it mounts and the tab's panes settle over\n // the frames after that, so the query is formatted once the editor's width has stopped changing\n // (half a second at most; without a width it is formatted at the default one). A pasted query\n // URL runs as it was pasted, as the classic tool does, and so does one a link to the tool named\n const fetchOnOpen = useVistaSelector((snapshot) => snapshot.context.fetchOnOpen[tab.id])\n const fetchOpenedQuery = useEffectEvent(async () => {\n const source = actorRef.getSnapshot().context.fetchOnOpen[tab.id]\n if (!source) return\n actorRef.send({type: 'tab.fetchedOnOpen', id: tab.id})\n if (source === 'generated') {\n let previousColumns: number | undefined\n let settledFrames = 0\n for (let frame = 0; frame < MAX_LAYOUT_FRAMES; frame++) {\n const columns = queryEditorRef.current?.getVisibleColumns()\n settledFrames = columns !== undefined && columns === previousColumns ? settledFrames + 1 : 0\n if (settledFrames >= SETTLED_LAYOUT_FRAMES) break\n previousColumns = columns\n await new Promise((resolve) => requestAnimationFrame(resolve))\n }\n await formatQuery().catch(() => undefined)\n }\n run({type: source})\n })\n useEffect(() => {\n resumeAutoRefetch()\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- once per tab mount; useEffectEvent callbacks must not be listed\n }, [])\n useEffect(() => {\n if (fetchOnOpen) void fetchOpenedQuery()\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [fetchOnOpen])\n\n // While refetching automatically, a request that changed outside the editors is fetched right\n // away: changed options, or a loaded query (live refetches replay the runner's last request,\n // which the load has just cleared)\n const refetchKey = `${loadRevision}|${JSON.stringify([\n resolved.apiVersion,\n resolved.dataset,\n resolved.perspective,\n resolved.variant,\n resolved.useCdn,\n tab.options.includeSourceMap,\n ])}`\n useOnValueChange(refetchKey, (key, previous) => {\n if (!tab.autoRefetch) return\n const loaded = key.split('|', 1)[0] !== previous.split('|', 1)[0]\n // A load that fetches on its own (a generated query, a pasted URL) is not fetched twice\n if (loaded && fetchOnOpen) return\n // Built like a manual run, so params typed just before an option changed come along (after\n // a load there is nothing waiting: the edit that belonged to the replaced params was cancelled)\n const current = buildCurrentRequest()\n if (current) {\n runnerRef.send({type: 'fetch', request: current, reason: {type: loaded ? 'load' : 'options'}})\n }\n })\n\n // A stored scheduled drafts choice already reads as global where this workspace has no\n // scheduled drafts, so a navbar change leaves it stored for the workspaces that do\n useFollowNavbarPerspective(resolved.tabPerspective, (perspective) => setOptions({perspective}))\n\n useVistaDocumentEvents({\n rootElement,\n onShortcut: (shortcut: VistaShortcutId) => {\n switch (shortcut) {\n case 'fetch':\n run({type: 'shortcut'})\n break\n case 'prettify':\n void prettify()\n break\n case 'copy-query':\n copyQuery()\n break\n default: {\n const unhandled: never = shortcut\n throw new Error(`Unhandled shortcut: ${String(unhandled)}`)\n }\n }\n },\n onPaste: (text) => {\n const parsed = parseQueryUrl(text, datasets)\n if (!parsed) {\n return false\n }\n actorRef.send({\n type: 'tab.load',\n id: tab.id,\n tab: parsedQueryToTabInit(parsed),\n fetch: 'paste',\n })\n toast.push({\n closable: true,\n id: 'vista-paste',\n status: 'info',\n title: t('vista.paste.parsed'),\n })\n if (parsed.hasUnsupportedPerspective) {\n toast.push({\n closable: true,\n id: 'vista-paste-perspective',\n status: 'warning',\n title: t('vista.paste.unsupported-perspective'),\n })\n }\n // The URL may come from another project or name a dataset the user cannot see; the query\n // then runs against the tab's own dataset, which is worth saying\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n id: 'vista-paste-dataset',\n status: 'warning',\n title: t('vista.paste.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n // A tab cannot pin a variant (its option follows the navbar or sends none), so a request\n // made with one the navbar does not have selected cannot be reproduced as pasted; where\n // the workspace has variants switched off there is no navbar selector to select it with\n if (parsed.variant !== undefined && parsed.variant !== resolved.variant) {\n toast.push({\n closable: true,\n id: 'vista-paste-variant',\n status: 'warning',\n title: t(\n isVariantsEnabled ? 'vista.paste.unavailable-variant' : 'vista.paste.variants-disabled',\n {variant: parsed.variant},\n ),\n })\n }\n return true\n },\n })\n\n const requestPanel = (\n <RequestPanel\n buildRequest={buildRequest}\n formatForEditor={formatForEditor}\n isFetching={isFetching}\n onCancel={cancel}\n onCopyQuery={copyQuery}\n onLintFindings={setLintFindings}\n onOptionsChange={setOptions}\n onParamsChange={setParams}\n onParamsReplace={replaceParams}\n onPrettify={() => void prettify()}\n onQueryChange={setQuery}\n onRun={() => run({type: 'manual'})}\n onToggleAutoRefetch={toggleAutoRefetch}\n params={params}\n paramsEditorRef={paramsEditorRef}\n queryEditorRef={queryEditorRef}\n request={request}\n resolved={resolved}\n tab={tab}\n />\n )\n const responsePanel = (\n <ResponsePanel\n lintFindings={lintFindings}\n onEditQuery={editQuery}\n onMutationsApplied={refetchAfterMutations}\n onRevealRange={revealRange}\n request={request}\n resolved={resolved}\n runnerRef={runnerRef}\n tab={tab}\n />\n )\n\n const panelProps = {\n 'aria-labelledby': getQueryTabId(tab.id),\n 'data-testid': 'vista-query-tab',\n 'id': QUERY_TAB_PANEL_ID,\n 'role': 'tabpanel',\n } as const\n\n if (layout === 'mobile') {\n // Both panes stay mounted so the editors keep their state while hidden\n return (\n <Flex {...panelProps} flexBasis=\"0%\" flexDirection=\"column\" flexGrow={1} minHeight=\"0\">\n <Flex borderBottom flexShrink={0} justifyContent=\"center\" paddingY={1}>\n <TabList gap={1}>\n <Tab\n aria-controls=\"vista-mobile-request-pane\"\n fontSize={1}\n id=\"vista-mobile-request-tab\"\n label={t('query.label')}\n onClick={() => setMobilePane('request')}\n padding={2}\n selected={mobilePane === 'request'}\n />\n <Tab\n aria-controls=\"vista-mobile-response-pane\"\n fontSize={1}\n id=\"vista-mobile-response-tab\"\n label={t('result.label')}\n onClick={() => setMobilePane('response')}\n padding={2}\n selected={mobilePane === 'response'}\n />\n </TabList>\n </Flex>\n <Box\n aria-labelledby=\"vista-mobile-request-tab\"\n className={cx(styles.paneFill, mobilePane !== 'request' && styles.hiddenPane)}\n flexBasis=\"0%\"\n flexGrow={1}\n id=\"vista-mobile-request-pane\"\n role=\"tabpanel\"\n >\n {requestPanel}\n </Box>\n <Box\n aria-labelledby=\"vista-mobile-response-tab\"\n className={cx(styles.paneFill, mobilePane !== 'response' && styles.hiddenPane)}\n flexBasis=\"0%\"\n flexGrow={1}\n id=\"vista-mobile-response-pane\"\n role=\"tabpanel\"\n >\n {responsePanel}\n </Box>\n </Flex>\n )\n }\n\n const minSize = MIN_PANE_SIZE[layout]\n const containerExtent =\n layout === 'stacked' ? splitContainerSize?.height : splitContainerSize?.width\n const defaultSplitSize = Math.max(\n minSize,\n Math.floor((containerExtent || 0) * DEFAULT_REQUEST_SHARE[layout]),\n )\n\n // Both panes keep the minimum: the divider stops short of either, and a size dragged in a\n // wider window is clamped by the split for as long as the window is narrower (the request\n // pane, with its three panels, wins when there is no room for both)\n return (\n <Box {...panelProps} className={styles.splitPaneContainer} ref={setSplitContainer}>\n <ResizableSplit\n key={layout}\n label={t('vista.split.request-response')}\n minSecondarySize={minSize}\n minSize={minSize}\n onChange={(size) => setSplitSizes((sizes) => ({...sizes, [layout]: size}))}\n onReset={() => setSplitSizes((sizes) => ({...sizes, [layout]: undefined}))}\n size={splitSizes[layout] ?? defaultSplitSize}\n // oxlint-disable-next-line @sanity/i18n/no-attribute-string-literals -- layout mode, not user-facing text\n split={layout === 'stacked' ? 'horizontal' : 'vertical'}\n testId=\"vista-split\"\n >\n <Box className={styles.paneFill}>{requestPanel}</Box>\n <Box className={styles.paneFill}>{responsePanel}</Box>\n </ResizableSplit>\n </Box>\n )\n}\n","import {Dialog, Hotkeys, Stack, Text} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\nimport {Box, Flex} from 'ui5'\n\nimport {visionLocaleNamespace} from '../../../i18n'\nimport {useVistaActor} from '../../store/VistaActorContext'\nimport {EDITOR_SHORTCUTS, VISTA_SHORTCUT_LIST} from '../../util/shortcuts'\n\nexport function ShortcutsDialog() {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const close = () => actorRef.send({type: 'dialog.close'})\n\n return (\n <Dialog\n animate\n data-testid=\"vista-shortcuts-dialog\"\n header={t('vista.shortcuts.title')}\n id=\"vista-shortcuts-dialog\"\n onClickOutside={close}\n onClose={close}\n width={0}\n >\n <Box padding={4}>\n <Stack gap={4}>\n {[...VISTA_SHORTCUT_LIST, ...EDITOR_SHORTCUTS].map((shortcut) => (\n <Flex\n alignItems=\"center\"\n gap={3}\n justifyContent=\"space-between\"\n key={shortcut.labelKey}\n >\n <Text size={1}>{t(shortcut.labelKey)}</Text>\n <Hotkeys fontSize={1} keys={shortcut.keys} />\n </Flex>\n ))}\n <Flex alignItems=\"center\" gap={3} justifyContent=\"space-between\">\n <Text size={1}>{t('vista.shortcuts.close')}</Text>\n <Hotkeys fontSize={1} keys={['Esc']} />\n </Flex>\n </Stack>\n </Box>\n </Dialog>\n )\n}\n","import {useVistaSelector} from '../store/VistaActorContext'\nimport {selectOpenDialog} from '../store/vistaMachine'\nimport {ShortcutsDialog} from './sidebar/ShortcutsDialog'\n\nexport function VistaDialogs() {\n const dialog = useVistaSelector(selectOpenDialog)\n return dialog === 'shortcuts' ? <ShortcutsDialog /> : null\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect, useRef} from 'react'\nimport {useTranslation} from 'sanity'\nimport {useRouter} from 'sanity/router'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport {parseQueryUrl} from '../../util/parseQueryUrl'\nimport {useQueryRequestBuilder} from '../hooks/useQueryRequestBuilder'\nimport {resolveRequestOptions, useRequestEnvironment} from '../hooks/useResolvedRequest'\nimport {type VistaTab} from '../store/types'\nimport {useVistaActor, useVistaSelector} from '../store/VistaActorContext'\nimport {selectDatasets} from '../store/vistaMachine'\nimport {parsedQueryToTabInit, tabMatchesParsedQuery} from '../util/savedQueryTab'\n\n/** The tool's search param holding the active tab's request, as `vision[url]=…` in the address */\nconst URL_STATE_PARAM = 'url'\n/** Typing changes the request with every key; the address follows once it settles */\nconst WRITE_DELAY_MS = 500\n\n/**\n * Keeps the active tab's request in the tool's URL, so the address bar can be bookmarked or\n * shared, and opens the request a URL names when it is not what the tool wrote there itself (a\n * link opened from elsewhere, a bookmark). The value is the query URL the Response panel shows,\n * read the way a pasted one is: a tab already showing the request is selected, otherwise one\n * opens for it and runs the query right away, as a pasted URL does. A tab that already shows the\n * request is only selected (after a reload, the address names the active tab's own request), so\n * its last result stays as it was.\n */\nexport function VistaUrlState({tab}: {tab: VistaTab}) {\n const {t} = useTranslation(visionLocaleNamespace)\n const toast = useToast()\n const router = useRouter()\n const actorRef = useVistaActor()\n const datasets = useVistaSelector(selectDatasets)\n const environment = useRequestEnvironment()\n const {request} = useQueryRequestBuilder(tab)\n const activeUrl = request?.url ?? null\n const linkedUrl = new URLSearchParams(router.state._searchParams ?? []).get(URL_STATE_PARAM)\n // What this component last wrote or read, so its own writes are not read back as a link\n const knownUrlRef = useRef<string | null | undefined>(undefined)\n\n const openLinkedRequest = useEffectEvent((url: string) => {\n const parsed = parseQueryUrl(url, datasets)\n if (!parsed) return\n const existing = actorRef\n .getSnapshot()\n .context.tabs.find((candidate) =>\n tabMatchesParsedQuery(\n candidate,\n parsed,\n resolveRequestOptions(candidate.options, environment),\n ),\n )\n if (existing) {\n actorRef.send({type: 'tab.select', id: existing.id})\n return\n }\n actorRef.send({type: 'tab.add', tab: parsedQueryToTabInit(parsed), fetch: 'link'})\n if (!parsed.isKnownDataset) {\n toast.push({\n closable: true,\n status: 'warning',\n title: t('vista.saved.unknown-dataset', {dataset: parsed.dataset}),\n })\n }\n })\n\n useEffect(() => {\n if (!linkedUrl || linkedUrl === knownUrlRef.current) return\n knownUrlRef.current = linkedUrl\n openLinkedRequest(linkedUrl)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [linkedUrl])\n\n const writeUrl = useEffectEvent((url: string | null) => {\n knownUrlRef.current = url\n if (url === linkedUrl) return\n router.navigate(\n {...router.state, _searchParams: url ? [[URL_STATE_PARAM, url]] : []},\n {replace: true},\n )\n })\n\n useEffect(() => {\n const timer = setTimeout(() => writeUrl(activeUrl), WRITE_DELAY_MS)\n return () => clearTimeout(timer)\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [activeUrl])\n\n return null\n}\n","import {EditorState} from '@codemirror/state'\nimport {useEffect} from 'react'\nimport {type Schema, useSchema, useTranslation} from 'sanity'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {visionLocaleNamespace} from '../../i18n'\nimport {useResolvedRequest} from '../hooks/useResolvedRequest'\nimport {type VistaTab} from '../store/types'\nimport {useVistaActor, useVistaSelector} from '../store/VistaActorContext'\nimport {selectFunctionLibrary} from '../store/vistaMachine'\nimport {getDocumentTypeNames} from '../util/documentTypes'\nimport {fetchQueryPlan} from '../util/explainQuery'\nimport {functionLibrary, querySchema} from '../util/groqEditorContext'\nimport {groqLintSource} from '../util/groqLint'\nimport {previewMutations, toMutations} from '../util/mutations'\nimport {readPlanInsights} from '../util/planInsights'\nimport {createQuerySchema} from '../util/schemaCheck'\nimport {summarizeSchema} from '../util/schemaSummary'\nimport {describeInsight} from './response/ExplainTab'\n\n/**\n * WebMCP (`document.modelContext`, https://webmachinelearning.github.io/webmcp/): tools an agent\n * in the browser can call while Vision is open, acting through the user's own session the way\n * the tool does. They read: the active tab, query results, plans, lint findings and the schema;\n * the one that changes anything only opens a query in a tab of its own. Nothing writes data:\n * mutations only run as dry runs, and applying them is left to the user, in the Mutate panel.\n */\n\n/** The parts of WebMCP Vision uses; the API is not in the DOM typings yet */\ninterface ModelContextTool {\n name: string\n title?: string\n description: string\n inputSchema?: object\n execute: (input: Record<string, unknown> | undefined) => Promise<ToolResult>\n annotations?: {readOnlyHint?: boolean}\n}\n\ninterface ModelContext {\n registerTool: (tool: ModelContextTool, options?: {signal?: AbortSignal}) => Promise<unknown>\n}\n\ninterface ToolResult {\n content: {type: 'text'; text: string}[]\n isError?: boolean\n}\n\n/** Results this long are cut, so a big result does not flood the agent's context */\nconst MAX_TOOL_TEXT_LENGTH = 50_000\n\nfunction getModelContext(): ModelContext | undefined {\n const candidate: unknown = Reflect.get(document, 'modelContext')\n if (typeof candidate !== 'object' || candidate === null) return undefined\n const registerTool: unknown = Reflect.get(candidate, 'registerTool')\n if (typeof registerTool !== 'function') return undefined\n return {\n registerTool: (tool, options) => Promise.resolve(registerTool.call(candidate, tool, options)),\n }\n}\n\nfunction text(value: unknown, isError = false): ToolResult {\n const json = typeof value === 'string' ? value : (JSON.stringify(value, null, 2) ?? 'null')\n const cut =\n json.length > MAX_TOOL_TEXT_LENGTH\n ? `${json.slice(0, MAX_TOOL_TEXT_LENGTH)}\\n… (cut at ${MAX_TOOL_TEXT_LENGTH} characters of ${json.length})`\n : json\n return {content: [{type: 'text', text: cut}], ...(isError ? {isError} : {})}\n}\n\nfunction readQuery(input: Record<string, unknown>): {\n query: string\n params: Record<string, unknown>\n} {\n const {query, params} = input\n if (typeof query !== 'string' || !query.trim()) throw new Error('A GROQ query is required')\n const isParams = typeof params === 'object' && params !== null && !Array.isArray(params)\n return {query, params: isParams ? Object.fromEntries(Object.entries(params)) : {}}\n}\n\nconst QUERY_INPUT = {\n type: 'object',\n properties: {\n query: {type: 'string', description: 'A GROQ query'},\n params: {\n type: 'object',\n description: 'Values of the $parameters the query uses, by name without the $',\n },\n },\n required: ['query'],\n}\n\ntype ToolName =\n | 'vision_get_state'\n | 'vision_run_query'\n | 'vision_open_query'\n | 'vision_check_query'\n | 'vision_explain_query'\n | 'vision_describe_schema'\n | 'vision_preview_mutations'\n\nconst TOOLS: {name: ToolName; description: string; inputSchema: object; readOnly: boolean}[] = [\n {\n name: 'vision_get_state',\n description:\n 'The GROQ query in the Vision tab the user is looking at, its params and request options (dataset, API version, perspective, API CDN), and its latest result or error.',\n inputSchema: {type: 'object', properties: {}},\n readOnly: true,\n },\n {\n name: 'vision_run_query',\n description:\n \"Runs a GROQ query with the request options of the user's active Vision tab and returns the result, without changing what the tab shows.\",\n inputSchema: QUERY_INPUT,\n readOnly: true,\n },\n {\n name: 'vision_open_query',\n description:\n 'Opens a GROQ query in a new Vision tab for the user to see, with the options of the active tab, and runs it unless run is false.',\n inputSchema: {\n ...QUERY_INPUT,\n properties: {\n ...QUERY_INPUT.properties,\n title: {type: 'string', description: 'A title for the tab'},\n run: {type: 'boolean', description: 'Fetch the query once the tab opens (default true)'},\n },\n },\n readOnly: false,\n },\n {\n name: 'vision_check_query',\n description:\n 'Lints a GROQ query: syntax errors, groq-lint performance rules, custom function checks, and the document types and fields the workspace schema does not have. Returns each finding with its line, column and rule.',\n inputSchema: {\n type: 'object',\n properties: {query: {type: 'string', description: 'A GROQ query'}},\n required: ['query'],\n },\n readOnly: true,\n },\n {\n name: 'vision_explain_query',\n description:\n \"The Content Lake's query plan for a GROQ query, run with the active tab's options, with notes on what stands out (filters run in memory, sorting in the index, batched subqueries).\",\n inputSchema: QUERY_INPUT,\n readOnly: true,\n },\n {\n name: 'vision_describe_schema',\n description:\n \"The workspace's document types; with types, their fields, references and option lists.\",\n inputSchema: {\n type: 'object',\n properties: {\n types: {\n type: 'array',\n items: {type: 'string'},\n description: 'Document type names to describe field by field',\n },\n },\n },\n readOnly: true,\n },\n {\n name: 'vision_preview_mutations',\n description:\n \"Runs mutations as a dry run against the active Vision tab's dataset, which changes nothing, and returns each document they touch as it is now (before) and as they would leave it (after). No tool applies mutations: the user can, from Vision's Mutate panel.\",\n inputSchema: {\n type: 'object',\n properties: {\n mutations: {\n type: 'array',\n items: {type: 'object'},\n description:\n 'Mutations as the Mutations API takes them, each with one of create, createOrReplace, createIfNotExists, delete or patch (by id, or by a GROQ query)',\n },\n autoGenerateArrayKeys: {\n type: 'boolean',\n description: 'Give array items without a _key one, as the studio needs (default true)',\n },\n },\n required: ['mutations'],\n },\n readOnly: true,\n },\n]\n\n/** Registers Vision's WebMCP tools while it is open, in browsers that have WebMCP */\nexport function VistaWebMcp({tab}: {tab: VistaTab}) {\n const {t} = useTranslation(visionLocaleNamespace)\n const actorRef = useVistaActor()\n const resolved = useResolvedRequest(tab.options)\n const runnerRef = useVistaSelector((snapshot) => snapshot.context.runners[tab.id])\n const library = useVistaSelector(selectFunctionLibrary)\n const schema = useSchema() as Schema | undefined\n\n const execute = useEffectEvent(async (name: ToolName, input: Record<string, unknown>) => {\n switch (name) {\n case 'vision_get_state': {\n const runner = runnerRef?.getSnapshot()\n return text({\n title: tab.title,\n query: tab.query,\n params: tab.rawParams,\n dataset: resolved.dataset,\n apiVersion: resolved.apiVersion,\n perspective: resolved.perspective ?? null,\n variant: resolved.variant ?? null,\n useCdn: resolved.useCdn,\n status: runner?.matches({request: 'fetching'})\n ? 'fetching'\n : runner?.matches({request: 'failed'})\n ? 'failed'\n : runner?.context.meta\n ? 'settled'\n : 'idle',\n error: runner?.context.error?.message ?? null,\n ms: runner?.context.meta?.ms ?? null,\n result: runner?.context.meta ? runner.context.result : null,\n })\n }\n case 'vision_run_query': {\n const {query, params} = readQuery(input)\n const response = await resolved.client.fetch(query, params, {\n filterResponse: false,\n useCdn: resolved.useCdn,\n tag: 'vista.webmcp',\n })\n return text({ms: response.ms, result: response.result})\n }\n case 'vision_open_query': {\n const {query, params} = readQuery(input)\n const title =\n typeof input.title === 'string' && input.title.trim() ? input.title : undefined\n actorRef.send({\n type: 'tab.add',\n tab: {query, rawParams: JSON.stringify(params, null, 2), title, options: tab.options},\n fetch: input.run === false ? undefined : 'generated',\n })\n return text(`Opened the query in a new tab${input.run === false ? '' : ' and ran it'}.`)\n }\n case 'vision_check_query': {\n const {query} = readQuery(input)\n const state = EditorState.create({\n doc: query,\n extensions: [\n functionLibrary.of(library),\n ...(schema ? [querySchema.of(createQuerySchema(schema))] : []),\n ],\n })\n const diagnostics = await groqLintSource({state})\n return text(\n diagnostics.map((diagnostic) => {\n const line = state.doc.lineAt(diagnostic.from)\n return {\n line: line.number,\n column: diagnostic.from - line.from + 1,\n severity: diagnostic.severity,\n rule: diagnostic.source ?? null,\n message: diagnostic.message,\n text: query.slice(diagnostic.from, diagnostic.to),\n }\n }),\n )\n }\n case 'vision_explain_query': {\n const {query, params} = readQuery(input)\n const plan = await fetchQueryPlan(resolved.client, {query, params})\n return text({\n plan,\n standsOut: readPlanInsights(plan).map((insight) => ({\n note: describeInsight(insight, t),\n tone: insight.tone,\n ...(insight.kind === 'filter-in-memory' ? {expression: insight.expression} : {}),\n })),\n })\n }\n case 'vision_describe_schema': {\n if (!schema) return text('The workspace has no schema.', true)\n const types = Array.isArray(input.types)\n ? input.types.filter((type): type is string => typeof type === 'string')\n : []\n return text(\n types.length > 0\n ? summarizeSchema(schema, types.join(' '))\n : `Document types: ${getDocumentTypeNames(schema).join(', ')}`,\n )\n }\n case 'vision_preview_mutations': {\n const mutations = toMutations(input.mutations)\n if (mutations.status === 'empty') return text('There are no mutations to run.', true)\n if (mutations.status === 'invalid-mutation') {\n return text(\n `Mutation ${mutations.index} needs exactly one of create, createOrReplace, createIfNotExists, delete or patch.`,\n true,\n )\n }\n if (mutations.status !== 'valid') return text('mutations must be a list.', true)\n const preview = await previewMutations(resolved.client, mutations.mutations, {\n autoGenerateArrayKeys: input.autoGenerateArrayKeys !== false,\n })\n return text({\n dataset: resolved.dataset,\n documents: preview.changes,\n notCompared: preview.notShown,\n })\n }\n default: {\n const unhandled: never = name\n return text(`Unknown tool ${String(unhandled)}`, true)\n }\n }\n })\n\n // What the browser shows the user for each tool\n const titleOf = useEffectEvent((name: ToolName) => {\n switch (name) {\n case 'vision_get_state':\n return t('vista.webmcp.get-state')\n case 'vision_run_query':\n return t('vista.webmcp.run-query')\n case 'vision_open_query':\n return t('vista.webmcp.open-query')\n case 'vision_check_query':\n return t('vista.webmcp.check-query')\n case 'vision_explain_query':\n return t('vista.webmcp.explain-query')\n case 'vision_describe_schema':\n return t('vista.webmcp.describe-schema')\n case 'vision_preview_mutations':\n return t('vista.webmcp.preview-mutations')\n default: {\n const unhandled: never = name\n return String(unhandled)\n }\n }\n })\n\n useEffect(() => {\n const modelContext = getModelContext()\n if (!modelContext) return undefined\n const controller = new AbortController()\n for (const tool of TOOLS) {\n void modelContext\n .registerTool(\n {\n name: tool.name,\n title: titleOf(tool.name),\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {readOnlyHint: tool.readOnly},\n execute: async (input) => {\n try {\n return await execute(tool.name, input ?? {})\n } catch (error) {\n return text(error instanceof Error ? error.message : String(error), true)\n }\n },\n },\n {signal: controller.signal},\n )\n // Another Vision instance on the page has the names already\n .catch(() => undefined)\n }\n return () => controller.abort()\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- useEffectEvent callbacks must not be listed\n }, [])\n\n return null\n}\n","import {useActorRef, useSelector} from '@xstate/react'\nimport {useMemo, useState} from 'react'\nimport {Flex} from 'ui5'\n\nimport {useSavedQueries} from '../../hooks/useSavedQueries'\nimport {type VisionConfig} from '../../types'\nimport {useContentSize} from '../hooks/useContentSize'\nimport {\n createPendingEdits,\n createSidebarBadges,\n PendingEditsContext,\n SavedQueriesContext,\n SidebarBadgesContext,\n type TabDrawerSlot,\n TabDrawerSlotContext,\n usePersistVistaState,\n VistaActorContext,\n type VistaExperience,\n VistaExperienceContext,\n type VistaLayout,\n} from '../store/VistaActorContext'\nimport {selectActiveTab, selectOpenDrawer, vistaMachine} from '../store/vistaMachine'\nimport {loadVistaState, type VistaStorageDefaults} from '../store/vistaStorage'\nimport {VistaSidebar} from './sidebar/VistaSidebar'\nimport {QueryTab} from './tabs/QueryTab'\nimport {QueryTabBar} from './tabs/QueryTabBar'\nimport * as styles from './vista.module.css'\nimport {VistaDialogs} from './VistaDialogs'\nimport {VistaUrlState} from './VistaUrlState'\nimport {VistaWebMcp} from './VistaWebMcp'\n\n/** Below this width the request and response columns stack */\nconst STACKED_BREAKPOINT = 900\n/** Below this width one column shows at a time and the sidebar floats over the content */\nconst MOBILE_BREAKPOINT = 600\n\nexport function getVistaLayout(width: number): VistaLayout {\n if (width < MOBILE_BREAKPOINT) return 'mobile'\n if (width < STACKED_BREAKPOINT) return 'stacked'\n return 'columns'\n}\n\nexport interface VistaGuiProps {\n config: VisionConfig\n datasets: string[]\n projectId: string\n defaultDataset: string\n onSwitchToClassic: () => void\n}\n\nexport function VistaGui(props: VistaGuiProps) {\n const {config, datasets, projectId, defaultDataset, onSwitchToClassic} = props\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n const rootSize = useContentSize(rootElement)\n // Until measured, fall back to the viewport so the first paint is close to the final layout\n const layout = getVistaLayout(\n rootSize?.width || (typeof window === 'undefined' ? STACKED_BREAKPOINT : window.innerWidth),\n )\n\n const defaults = useMemo(\n (): VistaStorageDefaults => ({\n datasets,\n defaultDataset,\n defaultApiVersion: `${config.defaultApiVersion}`,\n }),\n [datasets, defaultDataset, config.defaultApiVersion],\n )\n\n // `useActorRef` reads the input once, on mount, so the persisted state is loaded right then\n const [persisted] = useState(() => loadVistaState(projectId, defaults))\n const actorRef = useActorRef(vistaMachine, {input: {projectId, persisted, defaults}})\n usePersistVistaState(actorRef, projectId)\n\n const activeTab = useSelector(actorRef, selectActiveTab)\n const openDrawer = useSelector(actorRef, selectOpenDrawer)\n const experience = useMemo(\n (): VistaExperience => ({layout, switchToClassic: onSwitchToClassic}),\n [layout, onSwitchToClassic],\n )\n const savedQueries = useSavedQueries()\n const [pendingEdits] = useState(createPendingEdits)\n const [sidebarBadges] = useState(createSidebarBadges)\n const [tabDrawerElement, setTabDrawerElement] = useState<HTMLElement | null>(null)\n const tabDrawerSlot = useMemo(\n (): TabDrawerSlot => ({element: tabDrawerElement, setElement: setTabDrawerElement}),\n [tabDrawerElement],\n )\n\n return (\n <VistaActorContext.Provider value={actorRef}>\n <VistaExperienceContext.Provider value={experience}>\n <SavedQueriesContext.Provider value={savedQueries}>\n <PendingEditsContext.Provider value={pendingEdits}>\n <SidebarBadgesContext.Provider value={sidebarBadges}>\n <TabDrawerSlotContext.Provider value={tabDrawerSlot}>\n <Flex\n className={styles.root}\n data-testid=\"vista-root\"\n data-vista-layout={layout}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setRootElement}\n >\n <VistaSidebar />\n <Flex\n flexBasis=\"0%\"\n flexDirection=\"column\"\n flexGrow={1}\n // Under a phone's full-width drawer the tabs area is covered and must not take focus\n inert={layout === 'mobile' && openDrawer !== null}\n minWidth=\"0\"\n overflow=\"hidden\"\n >\n <QueryTabBar />\n <QueryTab key={activeTab.id} tab={activeTab} rootElement={rootElement} />\n </Flex>\n </Flex>\n <VistaDialogs />\n <VistaUrlState tab={activeTab} />\n <VistaWebMcp tab={activeTab} />\n </TabDrawerSlotContext.Provider>\n </SidebarBadgesContext.Provider>\n </PendingEditsContext.Provider>\n </SavedQueriesContext.Provider>\n </VistaExperienceContext.Provider>\n </VistaActorContext.Provider>\n )\n}\n"],"mappings":"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E;EACF,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;EACf,WAAW;CACb;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;EACf,WAAW;CACb;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;EACf,WAAW;CACb;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;EACf,YAAY;CACd;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;EACf,YAAY;CACd;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;EACf,YAAY;CACd;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aAAa;EACb,MAAM,QAAQ,CAAC;EACf,YAAY;CACd;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE;EACF,MAAM,QAAQ,CAAC;CACjB;CACA;EACE,WAAW;EACX,MAAM;EACN,WAAW;EACX,aACE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"}