groqd-playground
Version:
Groqd Playground is a plugin for Sanity Studio for testing [groqd](https://formidable.com/open-source/groqd/) queries, featuring:
1 lines • 48.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/PlaygroundWrapper.tsx","../src/components/Playground.tsx","../src/util/useDatasets.ts","../src/consts.ts","../src/components/ShareUrlField.tsx","../src/util/copyDataToClipboard.ts","../src/util/messaging.ts","../src/components/JSONExplorer.tsx","../src/components/JSONExplorer.styled.tsx","../../../shared/util/jsonExplorerUtils.ts","../src/components/Playground.styled.tsx","../../../shared/util/formatErrorPath.ts"],"sourcesContent":["import * as React from \"react\";\nimport { GroqdPlaygroundProps } from \"./types\";\nimport { ToastProvider } from \"@sanity/ui\";\nimport GroqdPlayground from \"./components/Playground\";\n\nexport default function GroqdPlaygroundWrapper(props: GroqdPlaygroundProps) {\n return (\n <ToastProvider>\n <GroqdPlayground {...props} />\n </ToastProvider>\n );\n}\n","import * as React from \"react\";\nimport { useClient } from \"sanity\";\nimport {\n Box,\n Button,\n Card,\n Code,\n Flex,\n Grid,\n Label,\n Select,\n Spinner,\n Stack,\n Text,\n Tooltip,\n} from \"@sanity/ui\";\nimport { z } from \"zod\";\nimport * as q from \"groqd\";\nimport has from \"lodash.has\";\nimport { BaseQuery } from \"groqd/src/baseQuery\";\nimport Split from \"@uiw/react-split\";\nimport { PlayIcon, ResetIcon } from \"@sanity/icons\";\nimport { GroqdPlaygroundProps } from \"../types\";\nimport { useDatasets } from \"../util/useDatasets\";\nimport { API_VERSIONS, DEFAULT_API_VERSION, STORAGE_KEYS } from \"../consts\";\nimport { ShareUrlField } from \"./ShareUrlField\";\nimport { useCopyDataAndNotify } from \"../util/copyDataToClipboard\";\nimport { emitInit, emitReset } from \"../util/messaging\";\nimport { JSONExplorer } from \"./JSONExplorer\";\nimport { CopyQueryButton, ErrorLineItem } from \"./Playground.styled\";\nimport { formatErrorPath } from \"../../../../shared/util/formatErrorPath\";\n\nexport default function GroqdPlayground({ tool }: GroqdPlaygroundProps) {\n const [\n {\n query,\n params,\n parsedResponse,\n fetchParseError,\n rawResponse,\n activeDataset,\n activeAPIVersion,\n queryUrl,\n isFetching,\n rawExecutionTime,\n errorPaths,\n },\n dispatch,\n ] = React.useReducer(reducer, null, () => {\n const activeDataset =\n localStorage.getItem(STORAGE_KEYS.DATASET) ||\n tool.options?.defaultDataset ||\n \"production\";\n const activeAPIVersion =\n localStorage.getItem(STORAGE_KEYS.API_VERSION) ||\n tool.options?.defaultApiVersion ||\n DEFAULT_API_VERSION;\n\n return {\n query: q.q(\"\"),\n activeDataset,\n activeAPIVersion,\n isFetching: false,\n };\n });\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const editorContainer = React.useRef<HTMLDivElement>(null);\n const editorInitialWidth = React.useMemo(\n () =>\n +(localStorage.getItem(STORAGE_KEYS.EDITOR_WIDTH) || 0) ||\n EDITOR_INITIAL_WIDTH,\n []\n );\n const copyShareUrl = useCopyDataAndNotify(\"Copied share URL to clipboard!\");\n const copyQueryUrl = useCopyDataAndNotify(\"Copied Query to clipboard!\");\n const windowHref = window.location.href;\n\n // Configure client\n const _client = useClient({\n apiVersion: tool.options?.defaultApiVersion || \"v2021-10-21\",\n });\n const client = React.useMemo(\n () =>\n _client.withConfig({\n dataset: activeDataset,\n apiVersion: activeAPIVersion,\n }),\n [_client, activeDataset, activeAPIVersion]\n );\n const datasets = useDatasets(_client);\n\n const generateQueryUrl = (query: q.BaseQuery<any>, params?: Params) => {\n const searchParams = new URLSearchParams();\n searchParams.append(\"query\", query.query);\n if (params) {\n for (const [key, value] of Object.entries(params))\n searchParams.append(key, String(value));\n }\n\n return client.getUrl(\n client.getDataUrl(\"query\", \"?\" + searchParams.toString())\n );\n };\n\n // Make sure activeDataset isn't outside of available datasets.\n React.useEffect(() => {\n if (datasets[0] && !datasets.includes(activeDataset))\n handleDatasetChange(datasets[0]);\n }, [datasets]);\n\n const runQuery = React.useMemo(\n () =>\n q.makeSafeQueryRunner(\n (query, params?: Record<string, string | number>) =>\n new Promise((resolve, reject) => {\n client.observable\n .fetch(query, params, { filterResponse: false })\n .subscribe({\n next: (res) => {\n dispatch({\n type: \"RAW_RESPONSE_RECEIVED\",\n payload: { rawResponse: res.result, execTime: res.ms },\n });\n resolve(res.result);\n },\n error: (err) => {\n reject(err);\n },\n });\n })\n ),\n [client]\n );\n\n const handleRun = async (query: q.BaseQuery<any>, params?: Params) => {\n dispatch({\n type: \"MAKE_FETCH_REQUEST\",\n payload: { queryUrl: generateQueryUrl(query, params) },\n });\n try {\n const data = await runQuery(query, params);\n dispatch({\n type: \"FETCH_RESPONSE_PARSED\",\n payload: { parsedResponse: data },\n });\n } catch (err) {\n /**\n * Generate error paths\n */\n let errorPaths: Map<string, string> | undefined;\n if (err instanceof q.GroqdParseError) {\n errorPaths = new Map();\n for (const e of err.zodError.errors) {\n // If \"Required\" message and missing path, we're going to want to\n if (e.message === \"Required\" && !has(err.rawResponse, e.path)) {\n errorPaths.set(\n e.path\n .slice(0, -1)\n .map((v) => String(v))\n .join(\".\"),\n `Field \"${e.path.at(-1)}\" is Required`\n );\n } else {\n errorPaths.set(e.path.map((v) => String(v)).join(\".\"), e.message);\n }\n }\n }\n\n dispatch({\n type: \"FETCH_PARSE_FAILURE\",\n payload: { fetchParseError: err, errorPaths },\n });\n }\n };\n\n React.useEffect(() => {\n const handleMessage = (message: MessageEvent) => {\n if (message.origin !== EDITOR_ORIGIN) return;\n\n try {\n const payload = messageSchema.parse(JSON.parse(message.data));\n\n if (payload.event === \"READY\") {\n const storedCode =\n new URL(window.location.href).searchParams.get(\"code\") ||\n localStorage.getItem(STORAGE_KEYS.CODE);\n\n message.source &&\n emitInit(message.source, EDITOR_ORIGIN, {\n code: storedCode || undefined,\n origin: window.location.origin,\n });\n } else if (payload.event === \"INPUT\") {\n localStorage.setItem(STORAGE_KEYS.CODE, payload.compressedRawCode);\n setQP(\"code\", payload.compressedRawCode);\n\n if (payload.requestShareCopy) {\n copyShareUrl(window.location.href);\n }\n\n let playgroundRunQueryCount = 0;\n const libs = {\n groqd: q,\n playground: {\n runQuery: (\n query: BaseQuery<any>,\n params?: Record<string, string | number>\n ) => {\n playgroundRunQueryCount++;\n if (playgroundRunQueryCount > 1) return;\n\n try {\n if (query instanceof q.BaseQuery) {\n dispatch({\n type: \"INPUT_EVAL_SUCCESS\",\n payload: { query, params },\n });\n if (payload.requestImmediateFetch) {\n handleRun(query, params);\n }\n }\n } catch {}\n },\n },\n };\n const scope = {\n exports: {},\n require: (name: keyof typeof libs) => libs[name],\n };\n const keys = Object.keys(scope);\n new Function(...keys, payload.code)(\n ...keys.map((key) => scope[key as keyof typeof scope])\n );\n } else if (payload.event === \"ERROR\") {\n console.error(payload.message);\n }\n } catch {}\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n };\n }, []);\n\n const handleDatasetChange = (datasetName: string) => {\n dispatch({ type: \"SET_ACTIVE_DATASET\", payload: { dataset: datasetName } });\n };\n const handleAPIVersionChange = (apiVersion: string) => {\n dispatch({ type: \"SET_ACTIVE_API_VERSION\", payload: { apiVersion } });\n };\n\n const handleReset = () => {\n iframeRef.current && emitReset(iframeRef.current, EDITOR_ORIGIN);\n };\n\n const handleCopyQuery = () => query.query && copyQueryUrl(query.query);\n\n const handleEditorResize = () => {\n const container = editorContainer.current;\n if (!container) return;\n\n localStorage.setItem(\n STORAGE_KEYS.EDITOR_WIDTH,\n String(container.clientWidth)\n );\n };\n\n const responseView = (() => {\n if (isFetching) {\n return (\n <Flex justify=\"center\" flex={1} align=\"center\">\n <Spinner muted />\n </Flex>\n );\n }\n\n const execTimeDisplay = rawExecutionTime && (\n <Tooltip\n placement=\"right-end\"\n content={\n <Box padding={2}>\n <Text>Raw execution time of query</Text>\n </Box>\n }\n >\n <span> ({rawExecutionTime}ms)</span>\n </Tooltip>\n );\n\n if (fetchParseError || errorPaths?.size) {\n let errorView = null;\n const scrollToError = (path: string) => {\n const lineEl = document.getElementById(`json-item-${path}`);\n if (lineEl instanceof HTMLElement)\n lineEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n };\n\n if (errorPaths) {\n errorView = (\n <Stack space={2} flex={1} paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text weight=\"semibold\" size={1}>\n Error parsing:\n </Text>\n </Box>\n {[...errorPaths.entries()].map(([path, message]) => (\n <ErrorLineItem\n key={path}\n onClick={() => scrollToError(path)}\n padding={1}\n >\n <Text size={2}>\n `result{formatErrorPath(path)}`: {message}\n </Text>\n </ErrorLineItem>\n ))}\n </Stack>\n );\n } else if (fetchParseError instanceof Error) {\n errorView = <pre>{fetchParseError.message}</pre>;\n } else {\n errorView = <span>Something went wrong...</span>;\n }\n\n return (\n <Flex flex={1} direction=\"column\">\n <Split mode=\"vertical\">\n <Flex direction=\"column\" style={{ maxHeight: 400 }}>\n <Box marginY={3} paddingX={3}>\n <Label muted>❗Error</Label>\n </Box>\n <Box flex={1} overflow=\"auto\">\n {errorView}\n </Box>\n </Flex>\n <Flex flex={1} direction=\"column\">\n <Box paddingX={3} marginY={3}>\n <Label muted>Raw Response {execTimeDisplay}</Label>\n </Box>\n <Box flex={1} style={{ height: \"100%\" }}>\n <JSONExplorer\n data={rawResponse}\n highlightedPaths={errorPaths}\n />\n </Box>\n </Flex>\n </Split>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} direction=\"column\" style={{ maxHeight: \"100%\" }}>\n <Box padding={3}>\n <Label muted>Query Response {execTimeDisplay}</Label>\n </Box>\n {parsedResponse ? <JSONExplorer data={parsedResponse} /> : null}\n </Flex>\n );\n })();\n\n return (\n <Flex style={{ height: \"100%\" }} direction=\"column\">\n <Card paddingX={3} paddingY={2} borderBottom>\n <Grid columns={[6, 6, 12]}>\n {/* Dataset selector */}\n <Box padding={1} column={2}>\n <Stack>\n <Card paddingY={2}>\n <Label muted>Dataset</Label>\n </Card>\n <Select\n value={activeDataset}\n onChange={(e) => handleDatasetChange(e.currentTarget.value)}\n >\n {datasets.map((ds) => (\n <option key={ds}>{ds}</option>\n ))}\n </Select>\n </Stack>\n </Box>\n\n {/* API version selector */}\n <Box padding={1} column={2}>\n <Stack>\n <Card paddingY={2}>\n <Label muted>API Version</Label>\n </Card>\n <Select\n value={activeAPIVersion}\n onChange={(e) => handleAPIVersionChange(e.currentTarget.value)}\n >\n {API_VERSIONS.map((v) => (\n <option key={v}>{v}</option>\n ))}\n </Select>\n </Stack>\n </Box>\n\n {/* Share URL*/}\n <ShareUrlField\n url={windowHref}\n title=\"Share URL\"\n column={queryUrl ? 4 : 8}\n notificationMessage=\"Copied share URL to clipboard!\"\n />\n {/* Query URL */}\n {queryUrl && (\n <ShareUrlField\n url={queryUrl}\n title=\"Raw Query URL\"\n notificationMessage=\"Copied raw query URL to clipboard!\"\n />\n )}\n </Grid>\n </Card>\n\n <Box flex={1}>\n <Split\n style={{ width: \"100%\", height: \"100%\", overflow: \"hidden\" }}\n onDragEnd={handleEditorResize}\n >\n <div\n style={{\n width: editorInitialWidth,\n minWidth: 200,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n ref={editorContainer}\n >\n <div style={{ flex: 1, position: \"relative\" }}>\n <iframe\n src={EDITOR_URL}\n width=\"100%\"\n height=\"100%\"\n style={{ border: \"none\" }}\n ref={iframeRef}\n />\n <div style={{ position: \"absolute\", bottom: 12, left: 12 }}>\n <Button\n icon={ResetIcon}\n text=\"Reset\"\n mode=\"ghost\"\n onClick={handleReset}\n />\n </div>\n </div>\n <Card paddingTop={3} paddingBottom={3} borderTop>\n <Stack space={3}>\n <Box>\n <Box paddingX={3} marginBottom={1}>\n <Label muted>\n Query{\" \"}\n {query.query && (\n <CopyQueryButton onClick={handleCopyQuery} tabIndex={0}>\n (Copy to clipboard)\n </CopyQueryButton>\n )}\n </Label>\n </Box>\n <Flex padding={3} paddingBottom={4} overflow=\"auto\">\n <Code language=\"text\">{query.query}</Code>\n <Box width={3} />\n </Flex>\n </Box>\n\n {params && Object.keys(params).length > 0 ? (\n <Box paddingX={3}>\n <Box marginBottom={3}>\n <Label muted>Params</Label>\n </Box>\n <Stack space={3} marginLeft={3}>\n {Object.entries(params).map(([key, value]) => (\n <Text key={key} size={2} muted>\n ${key}: {value}\n </Text>\n ))}\n </Stack>\n </Box>\n ) : null}\n </Stack>\n </Card>\n <Card padding={3} borderTop>\n <Button\n tone=\"primary\"\n icon={PlayIcon}\n text=\"Fetch\"\n fontSize={[2]}\n padding={[3]}\n style={{ width: \"100%\" }}\n onClick={() => handleRun(query, params)}\n disabled={!query.query}\n />\n </Card>\n </div>\n <Box\n style={{\n width: `calc(100% - ${editorInitialWidth}px)`,\n minWidth: 100,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Flex flex={1} direction=\"column\" overflow=\"hidden\">\n {responseView}\n </Flex>\n </Box>\n </Split>\n </Box>\n </Flex>\n );\n}\n\nconst EDITOR_URL =\n typeof process !== \"undefined\" &&\n process?.env?.SANITY_STUDIO_GROQD_PLAYGROUND_ENV === \"development\"\n ? \"http://localhost:3069\"\n : \"https://unpkg.com/groqd-playground-editor@0.0.6/build/index.html\";\nconst EDITOR_ORIGIN = new URL(EDITOR_URL).origin;\n\ntype Params = Record<string, string | number>;\ntype State = {\n query: BaseQuery<any>;\n params?: Params;\n queryUrl?: string;\n isFetching: boolean;\n rawExecutionTime?: number;\n rawResponse?: unknown;\n parsedResponse?: unknown;\n inputParseError?: Error;\n fetchParseError?: unknown;\n activeAPIVersion: string;\n activeDataset: string;\n errorPaths?: Map<string, string>;\n};\n\ntype Action =\n | {\n type: \"INPUT_EVAL_SUCCESS\";\n payload: { query: BaseQuery<any>; params?: Params };\n }\n | { type: \"INPUT_PARSE_FAILURE\"; payload: { inputParseError: Error } }\n | { type: \"MAKE_FETCH_REQUEST\"; payload: { queryUrl: string } }\n | {\n type: \"RAW_RESPONSE_RECEIVED\";\n payload: { rawResponse: unknown; execTime: number };\n }\n | { type: \"FETCH_RESPONSE_PARSED\"; payload: { parsedResponse: unknown } }\n | {\n type: \"FETCH_PARSE_FAILURE\";\n payload: {\n fetchParseError: unknown;\n rawResponse?: unknown;\n errorPaths?: Map<string, string>;\n };\n }\n | { type: \"SET_ACTIVE_DATASET\"; payload: { dataset: string } }\n | { type: \"SET_ACTIVE_API_VERSION\"; payload: { apiVersion: string } };\n\nconst reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"INPUT_EVAL_SUCCESS\":\n return {\n ...state,\n query: action.payload.query,\n params: action.payload.params,\n inputParseError: undefined,\n };\n case \"INPUT_PARSE_FAILURE\":\n return {\n ...state,\n inputParseError: action.payload.inputParseError,\n };\n case \"MAKE_FETCH_REQUEST\":\n return {\n ...state,\n isFetching: true,\n queryUrl: action.payload.queryUrl,\n };\n case \"RAW_RESPONSE_RECEIVED\":\n return {\n ...state,\n isFetching: false,\n rawResponse: action.payload.rawResponse,\n rawExecutionTime: action.payload.execTime,\n };\n case \"FETCH_RESPONSE_PARSED\":\n return {\n ...state,\n parsedResponse: action.payload.parsedResponse,\n fetchParseError: undefined,\n errorPaths: undefined,\n };\n case \"FETCH_PARSE_FAILURE\":\n return {\n ...state,\n isFetching: false,\n fetchParseError: action.payload.fetchParseError,\n errorPaths: action.payload.errorPaths,\n };\n case \"SET_ACTIVE_API_VERSION\":\n localStorage.setItem(STORAGE_KEYS.API_VERSION, action.payload.apiVersion);\n return { ...state, activeAPIVersion: action.payload.apiVersion };\n case \"SET_ACTIVE_DATASET\":\n localStorage.setItem(STORAGE_KEYS.DATASET, action.payload.dataset);\n return { ...state, activeDataset: action.payload.dataset };\n default:\n return state;\n }\n};\n\nconst EDITOR_INITIAL_WIDTH = 500;\n\nconst readySchema = z.object({\n event: z.literal(\"READY\"),\n});\n\nconst inputSchema = z.object({\n event: z.literal(\"INPUT\"),\n compressedRawCode: z.string(),\n code: z.string(),\n requestImmediateFetch: z.boolean().optional().default(false),\n requestShareCopy: z.boolean().optional().default(false),\n});\n\nconst errorSchema = z.object({\n event: z.literal(\"ERROR\"),\n message: z.string(),\n});\n\nconst messageSchema = z.union([inputSchema, errorSchema, readySchema]);\n\nconst url = new URL(window.location.href);\nconst setQP = (key: string, value: string) => {\n url.searchParams.set(key, value);\n window.history.replaceState(null, \"\", url);\n};\n","import * as React from \"react\";\nimport type { SanityClient } from \"sanity\";\n\nexport const useDatasets = (client: SanityClient) => {\n const [datasets, setDatasets] = React.useState<string[]>([]);\n\n React.useEffect(() => {\n const datasets$ = client.observable.datasets.list().subscribe({\n next: (result) => setDatasets(result.map((ds) => ds.name)),\n });\n\n return () => datasets$.unsubscribe();\n }, []);\n\n return datasets;\n};\n","export const STORAGE_KEYS = {\n DATASET: \"__groqd_playground_dataset\",\n API_VERSION: \"__groqd_playground_api_version\",\n CODE: \"__groqd_playground_code\",\n EDITOR_WIDTH: \"__groqd_playground_editor_width\",\n};\n\nexport const API_VERSIONS = [\"v1\", \"vX\", \"v2021-03-25\", \"v2021-10-21\"];\nexport const DEFAULT_API_VERSION = API_VERSIONS.at(-1) as string;\n","import * as React from \"react\";\nimport {\n Box,\n Button,\n Card,\n Flex,\n Label,\n Stack,\n Text,\n TextInput,\n Tooltip,\n} from \"@sanity/ui\";\nimport { CopyIcon } from \"@sanity/icons\";\nimport { useCopyDataAndNotify } from \"../util/copyDataToClipboard\";\n\ntype ShareUrlFieldProps = {\n url: string;\n title: string;\n column?: number;\n notificationMessage?: string;\n};\n\nexport const ShareUrlField = ({\n title,\n url,\n column = 4,\n notificationMessage = \"Copied URL to clipboard!\",\n}: ShareUrlFieldProps) => {\n const copyUrl = useCopyDataAndNotify(notificationMessage);\n const handleCopyUrl = () => copyUrl(url);\n\n return (\n <Box padding={1} flex={1} column={column}>\n <Stack>\n <Card paddingY={2}>\n <Label muted>{title}</Label>\n </Card>\n <Flex flex={1} gap={1}>\n <Box flex={1}>\n <TextInput readOnly type=\"url\" value={url} />\n </Box>\n <Tooltip\n content={\n <Box padding={2}>\n <Text>Copy to clipboard</Text>\n </Box>\n }\n >\n <Button\n aria-label=\"Copy to clipboard\"\n type=\"button\"\n mode=\"ghost\"\n icon={CopyIcon}\n onClick={handleCopyUrl}\n />\n </Tooltip>\n </Flex>\n </Stack>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { useToast } from \"@sanity/ui\";\n\nexport const useCopyDataAndNotify = (message: string) => {\n const toast = useToast();\n\n return React.useCallback(\n (url: string) => {\n navigator.clipboard.writeText(url).then(() => {\n toast.push({ title: message });\n });\n },\n [message]\n );\n};\n","export const emitReset = (iframe: HTMLIFrameElement, target: string) => {\n iframe.contentWindow?.postMessage(\n JSON.stringify({ event: \"RESET_CODE\" }),\n target\n );\n};\n\nexport const emitInit = (\n source: MessageEventSource,\n target: string,\n payload: { code?: string; origin: string }\n) => {\n source.postMessage(JSON.stringify({ event: \"INIT\", ...payload }), {\n targetOrigin: target,\n });\n};\n","import * as React from \"react\";\nimport { Box, Button, Stack } from \"@sanity/ui\";\nimport {\n CollapsibleContainer,\n ErrorMessageText,\n Key,\n Label,\n LineItem,\n Root,\n Value,\n} from \"./JSONExplorer.styled\";\nimport { CopyIcon } from \"@sanity/icons\";\nimport { useCopyDataAndNotify } from \"../util/copyDataToClipboard\";\nimport {\n addToPath,\n formatPrimitiveData,\n isObject,\n} from \"../../../../shared/util/jsonExplorerUtils\";\n\ntype JSONExplorerDisplayProps = {\n data: unknown;\n prefix?: string;\n highlightedPaths?: Map<string, string>;\n currentPath?: string;\n};\n\nexport const JSONExplorer = (props: JSONExplorerDisplayProps) => {\n const copyUrl = useCopyDataAndNotify(\"Copied JSON to clipboard!\");\n const handleCopy = () => {\n try {\n copyUrl(JSON.stringify(props.data, null, 2));\n } catch {}\n };\n\n return (\n <Root flex={1}>\n <Box\n padding={3}\n style={{ position: \"absolute\", inset: 0 }}\n overflow=\"auto\"\n >\n <JSONExplorerDisplay {...props} />\n </Box>\n <Box style={{ position: \"absolute\", bottom: 0, right: 0 }} padding={3}>\n <Button\n aria-label=\"Copy to clipboard\"\n type=\"button\"\n mode=\"ghost\"\n icon={CopyIcon}\n text=\"Copy to clipboard\"\n onClick={handleCopy}\n />\n </Box>\n </Root>\n );\n};\n\nconst JSONExplorerDisplay = ({\n data,\n prefix,\n highlightedPaths,\n currentPath = \"\",\n}: JSONExplorerDisplayProps) => {\n const prefixDisplay = prefix !== undefined ? <Key>{prefix}: </Key> : null;\n const errorMessage = highlightedPaths && highlightedPaths.get(currentPath);\n const depth = currentPath === \"\" ? 0 : currentPath?.split(\".\").length || 0;\n\n // Arrays\n if (Array.isArray(data)) {\n return (\n <Collapsible\n depth={depth}\n title={\n <React.Fragment>\n {prefixDisplay}\n <Label>[...] {data.length} items</Label>\n </React.Fragment>\n }\n errorMessage={errorMessage}\n id={`json-item-${currentPath}`}\n >\n <Stack space={2}>\n {data.map((dat, i) => (\n <JSONExplorerDisplay\n data={dat}\n key={i}\n prefix={String(i)}\n currentPath={addToPath(currentPath, String(i))}\n highlightedPaths={highlightedPaths}\n />\n ))}\n </Stack>\n </Collapsible>\n );\n }\n\n // Objects\n if (isObject(data)) {\n return (\n <Collapsible\n depth={depth}\n title={\n <React.Fragment>\n {prefixDisplay}\n <Label>\n {`{...}`} {Object.keys(data).length} properties\n </Label>\n </React.Fragment>\n }\n errorMessage={errorMessage}\n id={`json-item-${currentPath}`}\n >\n <Stack space={2}>\n {Object.entries(data).map(([key, dat]) => (\n <JSONExplorerDisplay\n data={dat}\n key={key}\n prefix={key}\n currentPath={addToPath(currentPath, key)}\n highlightedPaths={highlightedPaths}\n />\n ))}\n </Stack>\n </Collapsible>\n );\n }\n\n // Primitive leafs\n return (\n <LineItem\n paddingY={1}\n depth={depth}\n hasError={!!errorMessage}\n id={`json-item-${currentPath}`}\n >\n <Stack space={1}>\n {errorMessage && <ErrorMessageText>{errorMessage}</ErrorMessageText>}\n <div>\n {prefixDisplay}\n <Value>{formatPrimitiveData(data)}</Value>{\" \"}\n </div>\n </Stack>\n </LineItem>\n );\n};\n\nconst Collapsible = ({\n title,\n depth,\n children,\n errorMessage,\n id,\n}: React.PropsWithChildren<{\n title: JSX.Element;\n depth: number;\n errorMessage?: string;\n id?: string;\n}>) => {\n const [isExpanded, setIsExpanded] = React.useState(true);\n\n return (\n <CollapsibleContainer space={2} id={id} hasError={!!errorMessage}>\n <LineItem\n paddingY={1}\n depth={depth}\n onClick={() => setIsExpanded((v) => !v)}\n pointer\n >\n <Stack space={1}>\n {errorMessage && <ErrorMessageText>{errorMessage}</ErrorMessageText>}\n <Box>{title}</Box>\n </Stack>\n </LineItem>\n <div style={{ height: isExpanded ? \"auto\" : 0, overflow: \"hidden\" }}>\n {children}\n </div>\n </CollapsibleContainer>\n );\n};\n","import styled from \"styled-components\";\nimport { Box, Stack } from \"@sanity/ui\";\n\nexport const Root = styled(Box)`\n font-family: Menlo, monospace;\n font-size: 0.9em;\n position: relative;\n height: 100%;\n\n --border-radius: 4px;\n --error-bg-color: #ffe5ea;\n --item-hover-color: #e7e7e7;\n\n @media (prefers-color-scheme: dark) {\n --error-bg-color: #470417;\n --item-hover-color: #505050;\n }\n`;\n\nexport const Label = styled.span`\n color: #9d1fcd;\n @media (prefers-color-scheme: dark) {\n color: #d05afc;\n }\n`;\n\nexport const Key = styled.span`\n color: #1e61cd;\n @media (prefers-color-scheme: dark) {\n color: #5998fc;\n }\n`;\nexport const Value = styled.span`\n color: #967e1c;\n @media (prefers-color-scheme: dark) {\n color: #dbb931;\n }\n`;\n\nexport const LineItem = styled(Box)<{\n depth: number;\n pointer?: boolean;\n hasError?: boolean;\n}>`\n padding-left: ${({ depth }) => depth * DEPTH_SC}px;\n border-radius: var(--border-radius);\n cursor: ${({ pointer }) => (pointer ? \"pointer\" : \"initial\")};\n\n background-color: ${({ hasError }) =>\n hasError ? \"var(--error-bg-color)\" : \"initial\"};\n\n &:hover {\n background-color: ${({ hasError }) =>\n hasError ? undefined : \"var(--item-hover-color)\"};\n }\n`;\n\nexport const CollapsibleContainer = styled(Stack)<{ hasError?: boolean }>`\n border-radius: var(--border-radius);\n\n background-color: ${({ hasError }) =>\n hasError ? \"var(--error-bg-color)\" : \"initial\"};\n`;\n\nexport const ErrorMessageText = styled.div`\n font-weight: 400;\n`;\n\nconst DEPTH_SC = 15;\n","export const formatPrimitiveData = (data: unknown) => {\n if (typeof data === \"string\") return `\\\"${data}\\\"`;\n if (data instanceof Date) return `(Date) ${data}`;\n return String(data);\n};\nexport const isObject = (data: unknown): data is Record<string, unknown> =>\n typeof data === \"object\" &&\n data !== null &&\n !Array.isArray(data) &&\n !(data instanceof Date);\nexport const addToPath = (existingPath: string, newSegment: string) =>\n existingPath ? `${existingPath}.${newSegment}` : newSegment;\n","import styled from \"styled-components\";\nimport { Box } from \"@sanity/ui\";\n\nexport const ErrorLineItem = styled(Box)`\n border-radius: 4px;\n cursor: pointer;\n\n &:hover {\n background-color: #e7e7e7;\n }\n\n @media (prefers-color-scheme: dark) {\n &:hover {\n background-color: #505050;\n }\n }\n`;\n\nexport const CopyQueryButton = styled.button`\n all: unset;\n cursor: pointer;\n &:focus {\n box-shadow: inset 0 0 0 1px var(--card-border-color), 0 0 0 1px #fff,\n 0 0 0 3px var(--card-focus-ring-color);\n border-radius: 0.1875rem;\n }\n`;\n","export const formatErrorPath = (path: string) =>\n path.split(\".\").reduce((acc, el) => {\n if (!NumReg.test(el)) {\n return `${acc}.${el}`;\n }\n return `${acc}[${el}]`;\n }, \"\");\n\nconst NumReg = /\\d+/;\n"],"mappings":"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","names":["React","React","Box","Button","Card","Flex","Label","Stack","Text","Tooltip","React","React","url","url","_a","React","Box","Button","Stack","Box","Stack","Label","CopyIcon","Box","Button","CopyIcon","Label","Stack","styled","Box","_a","activeDataset","activeAPIVersion","query","params","errorPaths","Flex","Tooltip","Box","Text","Stack","Label","Card","Button"]}