{"version":3,"sources":["../src/APIPlayground.tsx","../src/components/sideNav/SideNav.tsx","../src/components/sideNav/components/MenuItem.tsx","../src/shared/typography/Typography.tsx","../src/components/sideNav/components/ChildMenuItem.tsx","../src/components/sideNav/utils.ts","../src/constants/template.ts","../src/components/StaticDataViewer.tsx","../src/components/snippet/Snippet.tsx","../src/components/snippet/components/RightActions.tsx","../src/shared/tooltip/Tooltip.tsx","../src/shared/button/Button.tsx","../src/components/snippet/components/Tabs.tsx","../src/shared/button-group/ButtonGroup.tsx","../src/shared/loader/Loader.tsx","../src/components/snippet/components/FullSizeLoader.tsx","../src/components/snippet/useMonacoActions.ts","../src/constants/language.ts","../src/utils/downloadFile.ts","../src/utils/prettifyGQL.ts","../src/components/snippet/utils.ts","../src/utils/prettifyJSON.ts","../src/components/cacheViewer/CacheViewer.tsx","../src/components/cacheViewer/hooks/useCacheViewer/useCacheViewer.ts","../src/context/SnackbarContext.tsx","../src/shared/snackbar/Snackbar.tsx","../src/hooks/useMonacoMount.ts","../src/components/cacheViewer/hooks/useCacheViewer/utils.ts","../src/components/queryExecutor/QueryExecutor.tsx","../src/components/queryExecutor/components/inputEditor/InputEditor.tsx","../src/components/queryExecutor/components/inputEditor/hooks/useInputEditor.ts","../src/components/queryExecutor/components/variableEditor/VariableEditor.tsx","../src/components/queryExecutor/components/variableEditor/hooks/useVariableEditor.ts","../src/hooks/useValidateJSON.ts","../src/components/queryExecutor/components/outputEditor/OutputEditor.tsx","../src/components/queryExecutor/components/querySelector/QuerySelector.tsx","../src/shared/select/Select.tsx","../src/shared/input/Input.tsx","../src/shared/select/components/Popover.tsx","../src/shared/select/components/Menu.tsx","../src/components/queryExecutor/components/querySelector/hooks/useQuerySelector.ts","../src/components/executionStats/ExecutionStats.tsx","../src/components/queryHistory/QueryHistory.tsx","../src/components/queryExecutor/hooks/useQueryExecutor.ts","../src/hooks/useGraphQLExecutor.ts","../src/hooks/useGraphQLExecution.ts","../src/context/TabStateContext.tsx","../src/context/HistoryContext.tsx","../src/hooks/useQueryHistory.ts","../src/utils/generateCurl.ts","../src/components/mutationExecutor/MutationExecutor.tsx","../src/components/mutationExecutor/components/mutationSelector/MutationSelector.tsx","../src/components/mutationExecutor/components/mutationSelector/hooks/useMutationSelector.ts","../src/components/mutationExecutor/hooks/useMutationExecutor.ts","../src/components/customQuery/components/OutputEditor.tsx","../src/components/form/Form.tsx","../src/constants/formFieldTypes.ts","../src/components/form/components/TextInput.tsx","../src/components/form/components/FormControl.tsx","../src/components/form/hooks/useFormField.ts","../src/components/form/components/NumberInput.tsx","../src/components/form/components/JSONInput.tsx","../src/components/form/hooks/useForm.ts","../src/components/customQuery/hooks/useCustomQuery.ts","../src/components/customQuery/CustomQuery.tsx","../src/components/customMutation/hooks/useCustomMutation.ts","../src/components/customMutation/CustomMutation.tsx","../src/components/fetchAndMutate/FetchAndMutate.tsx","../src/components/fetchAndMutate/hooks/useFetchAndMutate.ts","../src/components/schemaViewer/SchemaViewer.tsx","../src/components/schemaViewer/query.ts","../src/components/restApi/RestApi.tsx","../src/components/restApi/components/RequestBar.tsx","../src/components/restApi/components/HeadersEditor.tsx","../src/components/restApi/components/ResponsePanel.tsx","../src/components/restApi/hooks/useRestApi.ts","../src/components/sse/Sse.tsx","../src/shared/connectionBar/ConnectionBar.tsx","../src/components/sse/components/SseOutputPanel.tsx","../src/utils/connectionUtils.ts","../src/components/sse/hooks/useSse.ts","../src/components/restWebsocket/components/MessageInput.tsx","../src/components/restWebsocket/components/MessageLog.tsx","../src/components/restWebsocket/hooks/useRestWebsocket.ts","../src/components/restWebsocket/RestWebsocket.tsx","../src/components/gqlSubscription/GqlSubscription.tsx","../src/components/gqlSubscription/hooks/useGqlSubscription.ts","../src/utils/graphqlWsProtocol.ts","../src/components/tabBar/TabBar.tsx","../src/components/ErrorBoundary.tsx","../src/hooks/useIsClientSide.ts","../src/Container.tsx","../src/utils/FieldConfigMapBuilder.ts"],"sourcesContent":["'use client';\n\n// lib\nimport { ComponentType, useCallback, useMemo, useState } from 'react';\n\n// components\nimport { SideNav } from './components/sideNav';\nimport { StaticDataViewer } from './components/StaticDataViewer';\nimport { CacheViewer } from './components/cacheViewer';\nimport { QueryExecutor } from './components/queryExecutor';\nimport { MutationExecutor } from './components/mutationExecutor';\nimport { CustomQuery } from './components/customQuery';\nimport { CustomMutation } from './components/customMutation';\nimport { FetchAndMutate } from './components/fetchAndMutate';\nimport { SchemaViewer } from './components/schemaViewer';\nimport { RestApi } from './components/restApi';\nimport { Sse } from './components/sse';\nimport { RestWebsocket } from './components/restWebsocket';\nimport { GqlSubscription } from './components/gqlSubscription';\nimport { TabBar, TabInstance } from './components/tabBar/TabBar';\nimport { SnackbarProvider } from './context/SnackbarContext';\nimport { HistoryProvider } from './context/HistoryContext';\nimport { TabStateProvider, useTabState } from './context/TabStateContext';\nimport { ErrorBoundary } from './components/ErrorBoundary';\nimport { Typography } from './shared/typography';\n\n//constants\nimport { Template } from './constants/template';\n\n//types\nimport { APIPlaygroundProps, NestedTemplateConfig, TemplateConfig } from './types';\n\n// Resolve a template config by navItem + optional subNavItem\nconst resolveTemplateConfig = (config: TemplateConfig[], navItem: string, subNavItem?: string): TemplateConfig => {\n  const primary = config.find(c => c.id === navItem);\n  if (!primary) return config[0];\n  if (subNavItem) {\n    const secondary = (primary as NestedTemplateConfig).templates?.find(t => t.id === subNavItem);\n    return secondary ?? primary;\n  }\n  return primary;\n};\n\n// Generate a unique tab ID\nlet tabCounter = 0;\nconst nextTabId = () => `tab-${++tabCounter}`;\n\nconst createTab = (\n  config: TemplateConfig[],\n  navItem: string,\n  subNavItem?: string,\n  existingTabs: TabInstance[] = []\n): TabInstance => {\n  const templateConfig = resolveTemplateConfig(config, navItem, subNavItem);\n  const sameTypeTabs = existingTabs.filter(t => t.templateId === navItem && t.subTemplateId === subNavItem);\n  return {\n    id: nextTabId(),\n    templateId: navItem,\n    subTemplateId: subNavItem,\n    title: templateConfig.title,\n    instanceIndex: sameTypeTabs.length + 1,\n  };\n};\n\nconst TEMPLATE_COMPONENT_MAP: Partial<Record<Template, ComponentType<{ config: any; tabId: string }>>> = {\n  [Template.STATIC_DATA]: StaticDataViewer,\n  [Template.CACHE_VIEWER]: CacheViewer,\n  [Template.QUERY_EXECUTOR]: QueryExecutor,\n  [Template.MUTATION_EXECUTOR]: MutationExecutor,\n  [Template.CUSTOM_QUERY]: CustomQuery,\n  [Template.CUSTOM_MUTATION]: CustomMutation,\n  [Template.FETCH_AND_MUTATE]: FetchAndMutate,\n  [Template.SCHEMA_VIEWER]: SchemaViewer,\n  [Template.REST_API]: RestApi,\n  [Template.SSE]: Sse,\n  [Template.REST_WEBSOCKET]: RestWebsocket,\n  [Template.GQL_SUBSCRIPTION]: GqlSubscription,\n};\n\nconst APIPlaygroundView = ({ config }: { config: TemplateConfig[] }): JSX.Element => {\n  const { removeState } = useTabState();\n  const firstNavItem = config[0].id;\n  const firstSubNavItem = (config[0] as NestedTemplateConfig).templates?.[0]?.id;\n\n  const [tabs, setTabs] = useState<TabInstance[]>(() => [createTab(config, firstNavItem, firstSubNavItem)]);\n  const [activeTabId, setActiveTabId] = useState<string>(tabs[0].id);\n  const [activeNavItem, setActiveNavItem] = useState<string>(firstNavItem);\n  const [activeSubNavItem, setActiveSubNavItem] = useState<string | undefined>(firstSubNavItem);\n\n  const onNavItemClick = useCallback(\n    (navItem: string, subNavItem?: string) => {\n      setActiveNavItem(navItem);\n      setActiveSubNavItem(subNavItem);\n\n      // Find existing tab for this template, or create one\n      const existing = tabs.find(t => t.templateId === navItem && t.subTemplateId === subNavItem);\n      if (existing) {\n        setActiveTabId(existing.id);\n      } else {\n        const newTab = createTab(config, navItem, subNavItem, tabs);\n        setTabs(prev => [...prev, newTab]);\n        setActiveTabId(newTab.id);\n      }\n    },\n    [config, tabs]\n  );\n\n  const onAddTab = useCallback(\n    (navItem: string, subNavItem?: string) => {\n      const newTab = createTab(config, navItem, subNavItem, tabs);\n      setTabs(prev => [...prev, newTab]);\n      setActiveTabId(newTab.id);\n      setActiveNavItem(navItem);\n      setActiveSubNavItem(subNavItem);\n    },\n    [config, tabs]\n  );\n\n  const onTabClick = useCallback(\n    (tabId: string) => {\n      setActiveTabId(tabId);\n      const tab = tabs.find(t => t.id === tabId);\n      if (tab) {\n        setActiveNavItem(tab.templateId);\n        setActiveSubNavItem(tab.subTemplateId);\n      }\n    },\n    [tabs]\n  );\n\n  const onTabClose = useCallback(\n    (tabId: string) => {\n      removeState(tabId);\n      setTabs(prev => {\n        const updated = prev.filter(t => t.id !== tabId);\n        if (updated.length === 0) {\n          // Re-create a default tab if all are closed\n          const defaultTab = createTab(config, firstNavItem, firstSubNavItem);\n          setActiveTabId(defaultTab.id);\n          setActiveNavItem(firstNavItem);\n          setActiveSubNavItem(firstSubNavItem);\n          return [defaultTab];\n        }\n        // If we closed the active tab, switch to the last remaining tab\n        if (tabId === activeTabId) {\n          const last = updated[updated.length - 1];\n          setActiveTabId(last.id);\n          setActiveNavItem(last.templateId);\n          setActiveSubNavItem(last.subTemplateId);\n        }\n        return updated;\n      });\n    },\n    [activeTabId, config, firstNavItem, firstSubNavItem, removeState]\n  );\n\n  // Render the active tab's template\n  const activeTab = tabs.find(t => t.id === activeTabId);\n  const activeTemplateConfig = useMemo(() => {\n    if (!activeTab) return config[0];\n    return resolveTemplateConfig(config, activeTab.templateId, activeTab.subTemplateId);\n  }, [activeTab, config]);\n\n  let el;\n  if (activeTemplateConfig.type === Template.CUSTOM) {\n    const { Component } = activeTemplateConfig;\n    el = <Component key={activeTabId} />;\n  } else {\n    const TemplateComponent = TEMPLATE_COMPONENT_MAP[activeTemplateConfig.type];\n    el = TemplateComponent ? (\n      <TemplateComponent config={activeTemplateConfig} tabId={activeTabId} key={activeTabId} />\n    ) : null;\n  }\n\n  return (\n    <div className=\"expr-container hyperspace-light\" style={{ height: '100%' }}>\n      <TabStateProvider>\n        <HistoryProvider instanceId={config[0]?.id ?? 'default'}>\n          <SnackbarProvider>\n            <div className=\"w-full flex gap-8 h-full\">\n              <div className=\"flex-none\" style={{ maxWidth: '350px', minWidth: '200px' }}>\n                <SideNav\n                  config={config}\n                  activeNavItem={activeNavItem}\n                  activeSubNavItem={activeSubNavItem}\n                  onNavItemClick={onNavItemClick}\n                  onAddTab={onAddTab}\n                />\n              </div>\n              <div className=\"flex-1 flex flex-col h-full\">\n                <TabBar tabs={tabs} activeTabId={activeTabId} onTabClick={onTabClick} onTabClose={onTabClose} />\n                <div className=\"flex-1 min-h-0\">\n                  <ErrorBoundary>{el}</ErrorBoundary>\n                </div>\n              </div>\n            </div>\n          </SnackbarProvider>\n        </HistoryProvider>\n      </TabStateProvider>\n    </div>\n  );\n};\n\nexport const APIPlayground = ({ config }: APIPlaygroundProps): JSX.Element => {\n  if (!config || config.length === 0) {\n    return (\n      <div className=\"expr-container hyperspace-light flex items-center justify-center\" style={{ height: '100%' }}>\n        <Typography variant=\"body-16\" className=\"expr-text-03\">\n          No templates configured\n        </Typography>\n      </div>\n    );\n  }\n\n  return <APIPlaygroundView config={config} />;\n};\n","//lib\nimport { memo } from 'react';\n\n// components\nimport { MenuItem } from './components/MenuItem';\n\n//types\nimport { TemplateConfig } from '~/types';\n\ntype Props = {\n  config: TemplateConfig[];\n  activeNavItem: string;\n  activeSubNavItem: string | undefined;\n  onNavItemClick: (id: string, subId?: string) => void;\n  onAddTab?: (id: string, subId?: string) => void;\n};\n\nconst SideNav = ({ config, activeNavItem, activeSubNavItem, onNavItemClick, onAddTab }: Props): JSX.Element => {\n  return (\n    <nav aria-label=\"API Playground navigation\">\n      <ul\n        role=\"menu\"\n        className=\"flex flex-col border-1 border-b-0 border-solid expr-border-03 rounded-8 overflow-hidden w-48 expr-ui-01 list-none p-0 m-0\"\n      >\n        {config.map(item => {\n          return (\n            <MenuItem\n              key={item.id}\n              activeNavItem={activeNavItem}\n              activeSubNavItem={activeSubNavItem}\n              config={item}\n              onNavItemClick={onNavItemClick}\n              onAddTab={onAddTab}\n            />\n          );\n        })}\n      </ul>\n    </nav>\n  );\n};\n\nconst MemoizedSideNav = memo(SideNav);\n\nexport { MemoizedSideNav as SideNav };\n","//lib\nimport { useCallback, useState } from 'react';\n\n// components\nimport { Typography } from '~/shared/typography';\nimport { VscChevronDown, VscAdd } from 'react-icons/vsc';\nimport { ChildMenuItem } from './ChildMenuItem';\n\n//constants\nimport { Template } from '~/constants/template';\n\n// utils\nimport { handleKeyDown } from '../utils';\n\n//types\nimport { TemplateConfig } from '~/types';\n\ntype Props = {\n  config: TemplateConfig;\n  activeNavItem: string;\n  activeSubNavItem: string | undefined;\n  onNavItemClick: (id: string, subId?: string) => void;\n  onAddTab?: (id: string, subId?: string) => void;\n};\n\nexport const MenuItem = ({ config, activeNavItem, activeSubNavItem, onNavItemClick, onAddTab }: Props) => {\n  const [open, setOpen] = useState(true);\n\n  const isSelected = config.id === activeNavItem;\n  const isNestedTemplate = config.type === Template.NESTED_TEMPLATE;\n\n  const onMenuItemClick = useCallback(() => {\n    if (isSelected) {\n      return;\n    }\n    if (config.type === Template.NESTED_TEMPLATE) {\n      onNavItemClick(config.id, config.templates[0]?.id);\n    } else {\n      onNavItemClick(config.id);\n    }\n  }, [isSelected, config, onNavItemClick]);\n\n  const onChildItemClick = useCallback(\n    (child: string) => {\n      onNavItemClick(config.id, child);\n    },\n    [config.id, onNavItemClick]\n  );\n\n  const onChildAddTab = useCallback(\n    (child: string) => {\n      onAddTab?.(config.id, child);\n    },\n    [config.id, onAddTab]\n  );\n\n  return (\n    <li className=\"border-0 border-solid expr-border-03 border-b-1\" role=\"none\">\n      <div\n        role=\"menuitem\"\n        tabIndex={0}\n        aria-current={isSelected ? 'true' : undefined}\n        aria-expanded={isNestedTemplate ? open : undefined}\n        className={`px-4 py-3 cursor-pointer flex gap-2 items-center ${isSelected ? 'expr-ui-04' : 'hover-expr-ui-02'} `}\n        onClick={onMenuItemClick}\n        onKeyDown={e => handleKeyDown(e, onMenuItemClick)}\n      >\n        <Typography variant=\"body-14\" className={`flex-1 ${isSelected ? 'expr-text-05' : ''}`}>\n          {config.title}\n        </Typography>\n        {onAddTab && !isNestedTemplate ? (\n          <VscAdd\n            size={14}\n            className={`${isSelected ? 'expr-text-05' : 'expr-text-03'} cursor-pointer`}\n            onClick={(e: React.MouseEvent) => {\n              e.stopPropagation();\n              onAddTab(config.id);\n            }}\n          />\n        ) : null}\n        {isNestedTemplate ? (\n          <VscChevronDown\n            size={16}\n            strokeWidth={0.5}\n            fill={isSelected ? 'var(--expr-icon-05)' : 'var(--expr-icon-01)'}\n            stroke={isSelected ? 'var(--expr-icon-05)' : 'var(--expr-icon-01)'}\n            onClick={(e: React.MouseEvent) => {\n              e.stopPropagation();\n              setOpen(a => !a);\n            }}\n            style={{\n              rotate: open ? '-180deg' : '0deg',\n              transitionDuration: '300ms',\n            }}\n          />\n        ) : null}\n      </div>\n      {isNestedTemplate && open ? (\n        <ul role=\"menu\" className=\"list-none p-0 m-0\">\n          {config.templates.map(child => (\n            <ChildMenuItem\n              key={child.id}\n              onClick={onChildItemClick}\n              config={child}\n              selected={activeSubNavItem === child.id}\n              onAddTab={onAddTab ? onChildAddTab : undefined}\n            />\n          ))}\n        </ul>\n      ) : null}\n    </li>\n  );\n};\n","import { ButtonHTMLAttributes, DetailedHTMLProps } from 'react';\n\ntype Variant =\n  | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'h7'\n  | 'b1' | 'b2'\n  | 'bl1' | 'bl2' | 'bl3'\n  | 'bs1' | 'bs2' | 'bs3'\n  | 'l1' | 'l2' | 'l3' | 'l4'\n  | 'body-16' | 'body-14';\n\ntype Props = DetailedHTMLProps<ButtonHTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement> & {\n  variant?: Variant;\n};\n\nexport const Typography = ({ variant = 'l1', className, ...rest }: Props) => {\n  return (\n    <div {...rest} className={`expr-typography-${variant} expr-text-01 ${className ?? ''}`} />\n  );\n};\n","// components\nimport { Typography } from '~/shared/typography';\nimport { BsArrowReturnRight } from 'react-icons/bs';\nimport { VscAdd } from 'react-icons/vsc';\n\n// utils\nimport { handleKeyDown } from '../utils';\n\n//types\nimport { TemplateConfig } from '~/types';\n\ntype Props = {\n  config: TemplateConfig;\n  selected?: boolean;\n  onClick: (id: string) => void;\n  onAddTab?: (id: string) => void;\n};\n\nexport const ChildMenuItem = ({ config: { id, title }, selected, onClick, onAddTab }: Props) => {\n  return (\n    <li\n      role=\"menuitem\"\n      tabIndex={0}\n      aria-current={selected ? 'true' : undefined}\n      className={`pl-4 pr-4 py-3 cursor-pointer flex items-center gap-2 expr-border-03 ${\n        selected ? 'expr-ui-03' : 'hover-expr-ui-02'\n      }`}\n      onClick={() => onClick(id)}\n      onKeyDown={e => handleKeyDown(e, () => onClick(id))}\n      data-child={id}\n    >\n      <BsArrowReturnRight size={12} />\n      <Typography variant=\"body-14\" className=\"flex-1 truncate\">\n        {title}\n      </Typography>\n      {onAddTab ? (\n        <VscAdd\n          size={14}\n          className={`${selected ? 'expr-text-05' : 'expr-text-03'} cursor-pointer`}\n          onClick={(e: React.MouseEvent) => {\n            e.stopPropagation();\n            onAddTab(id);\n          }}\n        />\n      ) : null}\n    </li>\n  );\n};\n","import { KeyboardEvent } from 'react';\n\nexport const handleKeyDown = (e: KeyboardEvent, action: () => void) => {\n  if (e.key === 'Enter' || e.key === ' ') {\n    e.preventDefault();\n    action();\n  }\n};\n","export enum Template {\n  CACHE_VIEWER = 'CACHE_VIEWER',\n  STATIC_DATA = 'STATIC_DATA',\n  QUERY_EXECUTOR = 'QUERY_EXECUTOR',\n  MUTATION_EXECUTOR = 'MUTATION_EXECUTOR',\n  NESTED_TEMPLATE = 'NESTED_TEMPLATE',\n  CUSTOM_QUERY = 'CUSTOM_QUERY',\n  CUSTOM_MUTATION = 'CUSTOM_MUTATION',\n  FETCH_AND_MUTATE = 'FETCH_AND_MUTATE',\n  SCHEMA_VIEWER = 'SCHEMA_VIEWER',\n  REST_API = 'REST_API',\n  SSE = 'SSE',\n  REST_WEBSOCKET = 'REST_WEBSOCKET',\n  GQL_SUBSCRIPTION = 'GQL_SUBSCRIPTION',\n  CUSTOM = 'CUSTOM',\n}\n","//lib\nimport { memo, useMemo } from 'react';\n\n//components\nimport { Snippet } from './snippet';\n\n//utils\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\n//types\nimport { StaticDataConfig } from '../types';\n\ntype Props = {\n  config: StaticDataConfig;\n};\n\nconst StaticDataViewer = ({ config }: Props) => {\n  const { data, title, language, readOnly } = config;\n\n  const stringifiedData = useMemo(() => (typeof data === 'string' ? data : prettifyJSON(data)), [data]);\n\n  const editorProps = useMemo(\n    () => ({ value: stringifiedData, readOnly, language }),\n    [language, readOnly, stringifiedData]\n  );\n\n  return <Snippet editorProps={editorProps} title={title} />;\n};\n\nconst MemoizedStaticDataViewer = memo(StaticDataViewer);\n\nexport { MemoizedStaticDataViewer as StaticDataViewer };\n","//lib\nimport { memo, useMemo } from 'react';\n\n//components\nimport MonacoEditor, { EditorProps as MonacoEditorProps } from '@monaco-editor/react';\nimport { Typography } from '~/shared/typography';\nimport { RightActions } from './components/RightActions';\nimport { Tabs } from './components/Tabs';\nimport { FullSizeLoader } from './components/FullSizeLoader';\n\n//hooks\nimport { useMonacoActions } from './useMonacoActions';\n\n//utils\nimport { getMonacoConfig } from './utils';\n\n//constants\nimport { Language } from '~/constants/language';\n\n//types\nimport { Action, Tab } from './types';\n\ntype EditorProps = Pick<MonacoEditorProps, 'onMount' | 'onChange'> & {\n  readOnly?: boolean;\n  language?: Language;\n};\n\ntype Props = {\n  title: string;\n  className?: string;\n\n  tabs?: Tab[];\n  selectedTabIdx?: number;\n  onTabClick?: (idx: number) => void;\n\n  actions?: Action[];\n  onActionClick?: (action: string) => void;\n\n  errors?: boolean;\n\n  editorProps?: EditorProps;\n\n  loading?: boolean;\n};\n\nconst Snippet = ({\n  title,\n  className,\n\n  tabs,\n  selectedTabIdx,\n  onTabClick,\n\n  actions: _actions,\n  onActionClick,\n\n  errors,\n\n  editorProps,\n\n  loading,\n}: Props): JSX.Element => {\n  const monacoConfig = useMemo(() => getMonacoConfig({ readOnly: editorProps?.readOnly }), [editorProps?.readOnly]);\n\n  const {\n    onMount,\n    onActionClick: handleActionClick,\n    actions,\n  } = useMonacoActions({\n    title,\n    onActionClick,\n    onParentMount: editorProps?.onMount,\n    language: editorProps?.language ?? Language.JSON,\n  });\n\n  const rightActions = useMemo(\n    () => [...(_actions ?? []), ...actions].sort((a1, a2) => (a1.type === 'cta' ? 1 : -1)),\n    [_actions, actions]\n  );\n\n  return (\n    <div\n      className={`h-full w-full flex flex-col border-solid border-1 rounded-8 expr-ui-01 ${\n        errors ? 'border-error' : 'expr-border-03'\n      } ${className ?? ''}`}\n    >\n      <div className=\"flex-none flex px-3 py-2 gap-2 items-center border-0 border-b-1 border-solid expr-border-03 \">\n        <Typography variant=\"h5\" className=\"flex-1 ml-1\">\n          {title}\n        </Typography>\n\n        {tabs && onTabClick ? (\n          <div className=\"flex-1 flex justify-center\">\n            <Tabs tabs={tabs} selectedTabIdx={selectedTabIdx} onTabClick={onTabClick} />\n          </div>\n        ) : null}\n\n        <RightActions className=\"flex-1\" onActionClick={handleActionClick} actions={rightActions} loading={loading} />\n      </div>\n      <div className=\"flex-1 relative px-3 pb-3\">\n        <MonacoEditor\n          {...editorProps}\n          language={editorProps?.language ?? Language.JSON}\n          options={monacoConfig}\n          onMount={onMount}\n          key={selectedTabIdx}\n          loading={<FullSizeLoader />}\n        />\n        {loading ? <FullSizeLoader /> : null}\n      </div>\n    </div>\n  );\n};\n\nconst MemoizedSnippet = memo(Snippet);\n\nexport { MemoizedSnippet as Snippet };\n","//lib\nimport { MouseEvent, memo, useCallback, useMemo } from 'react';\n\n//components\nimport { Button } from '~/shared/button';\n\n//types\nimport { Action } from '../types';\n\ntype Props = {\n  actions: Action[];\n  onActionClick: (action: string) => void;\n  className?: string;\n  loading?: boolean;\n};\n\nconst RightActions = ({ actions, onActionClick, className, loading }: Props): JSX.Element => {\n  const handleActionClick = useCallback(\n    (ev: MouseEvent<HTMLElement>) => {\n      if (ev.currentTarget.dataset.id) {\n        onActionClick(ev.currentTarget.dataset.id);\n      }\n    },\n    [onActionClick]\n  );\n\n  return (\n    <div className={`flex gap-2 justify-end ${className}`}>\n      {actions.map(({ Icon, label, id, type, disabled }) => {\n        if (type === 'cta') {\n          return (\n            <Button key={id} size=\"xs\" onClick={handleActionClick} data-id={id} loading={loading} disabled={disabled}>\n              {label}\n              {Icon ? <Icon className=\"ml-2\" /> : null}\n            </Button>\n          );\n        }\n        return (\n          <Button\n            key={id}\n            tooltipContent={label}\n            size=\"xs\"\n            onClick={handleActionClick}\n            data-id={id}\n            loading={loading}\n            disabled={disabled}\n            variant=\"secondary\"\n            icon\n          >\n            {Icon ? <Icon size={16} strokeWidth={0.3} /> : null}\n          </Button>\n        );\n      })}\n    </div>\n  );\n};\n\nconst MemoizedRightActions = memo(RightActions);\n\nexport { MemoizedRightActions as RightActions };\n","import { MouseEvent, ReactNode, Ref, useCallback, useRef, useState } from 'react';\n\ntype Props = {\n  children: (p: { onMouseEnter: (ev: MouseEvent) => void; onMouseLeave: (ev: MouseEvent) => void }) => ReactNode;\n  content?: ReactNode;\n};\n\nconst TIMEOUT = 300;\n\nexport const Tooltip = ({ content, children }: Props): JSX.Element => {\n  const [coords, setCoords] = useState<DOMRect>();\n\n  const timerRef = useRef<ReturnType<typeof setTimeout>>();\n\n  const onMouseEnter = useCallback((ev: MouseEvent) => {\n    const domRect = ev.currentTarget.getBoundingClientRect();\n    timerRef.current = setTimeout(() => {\n      setCoords(domRect);\n    }, TIMEOUT);\n  }, []);\n\n  const onMouseLeave = useCallback((ev: MouseEvent) => {\n    clearTimeout(timerRef.current);\n    setTimeout(() => {\n      setCoords(undefined);\n    }, TIMEOUT);\n  }, []);\n\n  return (\n    <>\n      {children({ onMouseEnter, onMouseLeave })}\n      {coords ? (\n        <div\n          className=\"expr-tooltip-container\"\n          style={{ top: `${coords.top + coords.height}px`, left: `${coords.left + coords.width / 2}px` }}\n        >\n          <div className=\"arrow-up\" />\n          <div className=\"tooltip-content\">{content}</div>\n        </div>\n      ) : undefined}\n    </>\n  );\n};\n","import { ButtonHTMLAttributes, DetailedHTMLProps } from 'react';\n\nimport { Tooltip } from '~/shared/tooltip';\n\ntype Props = DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> & {\n  loading?: boolean;\n  variant?: 'primary' | 'secondary';\n  size?: 'xs' | 'sm' | 'md';\n  tooltipContent?: string;\n  icon?: boolean;\n  selected?: boolean;\n};\n\nconst VARIANT_VS_CLASSNAME = {\n  primary: 'variant-primary',\n  secondary: 'variant-secondary',\n};\n\nconst SIZE_VS_CLASSNAME = {\n  xs: 'size-xs',\n  sm: 'size-sm',\n  md: '',\n};\n\nexport const Button = ({\n  className,\n  loading,\n  variant = 'primary',\n  size = 'md',\n  tooltipContent,\n  icon,\n  selected,\n  disabled,\n  ...rest\n}: Props) => {\n  const mergedClassName = `expr-button ${VARIANT_VS_CLASSNAME[variant]} ${SIZE_VS_CLASSNAME[size]} ${\n    icon ? 'icon' : ''\n  } ${selected ? 'selected' : ''} ${disabled ? 'disabled' : ''} ${className ?? ''} `;\n\n  if (tooltipContent) {\n    return (\n      <Tooltip content={tooltipContent}>\n        {({ onMouseEnter, onMouseLeave }) => (\n          <button {...rest} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} className={mergedClassName} />\n        )}\n      </Tooltip>\n    );\n  }\n  return <button {...rest} className={mergedClassName} disabled={disabled} />;\n};\n","//lib\nimport { useCallback } from 'react';\n\n//components\nimport { ButtonGroup } from '~/shared/button-group';\n\n//types\nimport { Tab } from '../types';\n\ntype Props = {\n  tabs: Tab[];\n  selectedTabIdx?: number;\n  onTabClick: (idx: number) => void;\n  className?: string;\n};\n\nexport const Tabs = ({ tabs, selectedTabIdx = 0, onTabClick, className }: Props): JSX.Element => {\n  const onTabSwitch = useCallback(\n    (idx: number) => {\n      onTabClick(idx);\n    },\n    [onTabClick]\n  );\n\n  return (\n    <ButtonGroup className={className} config={tabs} selectedIdx={selectedTabIdx} size=\"xs\" onClick={onTabSwitch} />\n  );\n};\n","import { CSSProperties } from 'react';\nimport { Button } from '../button';\n\ntype ButtonConfig = {\n  id: string;\n  label: string;\n};\n\ntype Props = {\n  style?: CSSProperties;\n  className?: string;\n\n  config: ButtonConfig[];\n  selectedIdx: number;\n\n  onClick: (idx: number) => void;\n\n  size?: 'xs' | 'sm' | 'md';\n};\n\nexport const ButtonGroup = ({ style, className = '', config, selectedIdx, size, onClick }: Props) => {\n  return (\n    <div>\n      <div\n        className={`border-1 border-solid expr-border-03 flex rounded-8 ${className}`}\n        style={{ padding: '3px', gap: '3px', width: 'fit-content', ...style }}\n      >\n        {config.map((button, idx) => (\n          <Button\n            key={button.id}\n            variant=\"secondary\"\n            className={`${idx === selectedIdx ? 'font-600' : 'font-400'}`}\n            size={size}\n            selected={idx === selectedIdx}\n            style={{ minWidth: '100px', border: 'none' }}\n            onClick={() => {\n              onClick(idx);\n            }}\n          >\n            {button.label}\n          </Button>\n        ))}\n      </div>\n    </div>\n  );\n};\n","export const Loader = () => (\n  <div className=\"expr-loader\">\n    <div></div>\n    <div></div>\n    <div></div>\n    <div></div>\n  </div>\n);\n","import { Loader } from '~/shared/loader';\n\nexport const FullSizeLoader = () => (\n  <div className=\"absolute inset-0 flex items-center justify-center expr-ui-02 rounded-8\">\n    <Loader />\n  </div>\n);\n","//lib\nimport { useCallback, useRef } from 'react';\nimport { useCopyToClipboard } from 'react-use';\nimport { OnMount } from '@monaco-editor/react';\n\n//components\nimport { VscCopy } from 'react-icons/vsc';\nimport { VscBracketDot } from 'react-icons/vsc';\nimport { VscSave } from 'react-icons/vsc';\n\n//utils\nimport { downloadFile } from '~/utils/downloadFile';\nimport { prettifyGQL } from '~/utils/prettifyGQL';\n\n//constants\nimport { Language } from '~/constants/language';\n\n//types\nimport { Action } from './types';\nimport { MonacoEditorType } from '~/monaco';\n\nconst ACTION_TYPE = {\n  FORMAT: 'FORMAT',\n  COPY: 'COPY',\n  DOWNLOAD: 'DOWNLOAD',\n};\n\nconst ACTIONS = [\n  { id: ACTION_TYPE.FORMAT, label: 'Format', Icon: VscBracketDot },\n  { id: ACTION_TYPE.COPY, label: 'Copy', Icon: VscCopy },\n  { id: ACTION_TYPE.DOWNLOAD, label: 'Download', Icon: VscSave },\n];\n\ntype Params = {\n  title: string;\n  onActionClick?: (action: string) => void;\n  onParentMount?: OnMount;\n  language: Language;\n};\n\ntype ReturnType = {\n  onMount: OnMount;\n  actions: Action[];\n  onActionClick: (action: string) => void;\n};\n\nexport const useMonacoActions = ({\n  title,\n  onActionClick: onParentActionClick,\n  onParentMount,\n  language,\n}: Params): ReturnType => {\n  const editorRef = useRef<MonacoEditorType>();\n\n  const onMount = useCallback<OnMount>(\n    (mEditor, _monaco) => {\n      editorRef.current = mEditor;\n      onParentMount?.(mEditor, _monaco);\n    },\n    [onParentMount]\n  );\n\n  const [_, copyToClipboard] = useCopyToClipboard();\n\n  const onActionClick = useCallback(\n    (action: string) => {\n      switch (action) {\n        case ACTION_TYPE.COPY: {\n          const content = editorRef.current?.getValue();\n          copyToClipboard(content ?? '');\n          break;\n        }\n\n        case ACTION_TYPE.DOWNLOAD: {\n          const content = editorRef.current?.getValue();\n          downloadFile(content ?? '', title, language);\n          break;\n        }\n\n        case ACTION_TYPE.FORMAT:\n          {\n            switch (language) {\n              case Language.GRAPHQL: {\n                try {\n                  editorRef.current?.setValue(prettifyGQL(editorRef.current.getValue() ?? ''));\n                } catch (e: unknown) {\n                  console.warn('[APIPlayground] Failed to format GraphQL:', e instanceof Error ? e.message : e);\n                }\n                break;\n              }\n\n              default: {\n                editorRef.current?.getAction('editor.action.formatDocument')?.run();\n                editorRef.current?.focus();\n                break;\n              }\n            }\n          }\n          break;\n\n        default:\n          onParentActionClick?.(action);\n      }\n    },\n    [copyToClipboard, language, onParentActionClick, title]\n  );\n\n  return { actions: ACTIONS, onMount, onActionClick };\n};\n","export enum Language {\n  GRAPHQL = 'graphql',\n  JSON = 'json',\n  JAVASCRIPT = 'javascript',\n  TYPESCRIPT = 'typescript',\n}\n","import { Language } from '~/constants/language';\n\nconst LANGAUGE_VS_MIME_TYPE = {\n  [Language.GRAPHQL]: 'application/octet-stream',\n  [Language.JSON]: 'application/json',\n  [Language.JAVASCRIPT]: 'text/javascript',\n  [Language.TYPESCRIPT]: 'application/typescript',\n};\n\nconst LANGAUGE_VS_EXTENSION = {\n  [Language.GRAPHQL]: 'gql',\n  [Language.JSON]: 'json',\n  [Language.JAVASCRIPT]: 'js',\n  [Language.TYPESCRIPT]: 'ts',\n};\n\nexport const downloadFile = (data: string, filename: string, language: Language) => {\n  // Create a Blob from the JSON string\n  const blob = new Blob([data], { type: LANGAUGE_VS_MIME_TYPE[language] });\n\n  // Create a temporary URL for the Blob\n  const url = URL.createObjectURL(blob);\n\n  // Create an anchor element (link)\n  const anchor = document.createElement('a');\n\n  // Set the anchor's href attribute to the temporary URL\n  anchor.href = url;\n\n  // Set the download attribute to specify the filename\n  anchor.download = `${filename}.${LANGAUGE_VS_EXTENSION[language]}`;\n\n  // Simulate a click event to trigger the download\n  anchor.click();\n\n  // Clean up the temporary URL and anchor element after the download starts\n  setTimeout(() => {\n    URL.revokeObjectURL(url);\n    anchor.remove();\n  }, 0);\n};\n","import { parse, print } from 'graphql';\n\nexport const prettifyGQL = (q: string): string => print(parse(q));\n","import { MonacoEditorOptions } from '~/monaco';\n\nconst DEFAULT_CONFIG: MonacoEditorOptions = {\n  scrollbar: {\n    verticalScrollbarSize: 8,\n    useShadows: false,\n  },\n  glyphMargin: false,\n  folding: true,\n  lineDecorationsWidth: 8,\n  lineNumbersMinChars: 3,\n  automaticLayout: true,\n  renderLineHighlight: 'line',\n  wrappingStrategy: 'advanced',\n  fontSize: 14,\n  formatOnType: true,\n  formatOnPaste: true,\n  padding: {\n    top: 4,\n    bottom: 4,\n  },\n  showFoldingControls: 'always',\n  foldingHighlight: true,\n  contextmenu: true,\n  autoIndent: 'full',\n  minimap: { enabled: false },\n};\n\nexport const getMonacoConfig = ({\n  readOnly,\n  darkMode,\n}: {\n  readOnly?: boolean;\n  darkMode?: boolean;\n}): MonacoEditorOptions => {\n  return {\n    ...DEFAULT_CONFIG,\n    ...(readOnly ? { domReadOnly: true, readOnly: true } : undefined),\n    ...(darkMode ? { theme: 'vs-dark' } : undefined),\n  };\n};\n","export const prettifyJSON = (obj: unknown): string => JSON.stringify(obj, null, 4);\n","//components\nimport { memo, useMemo } from 'react';\nimport { Snippet } from '../snippet';\n\n//hooks\nimport { useCacheViewer } from './hooks/useCacheViewer';\n\n//types\nimport { CacheViewerConfig } from '~/types';\n\ntype Props = {\n  config: CacheViewerConfig;\n};\n\nconst CacheViewer = ({ config }: Props) => {\n  const { title, readOnly } = config;\n\n  const { data, onTabClick, selectedTabIdx, tabs, onActionClick, actions, onMount } = useCacheViewer({\n    config,\n  });\n\n  const editorProps = useMemo(() => ({ value: data, readOnly, onMount }), [data, onMount, readOnly]);\n\n  return (\n    <Snippet\n      editorProps={editorProps}\n      title={title}\n      // ----- //\n      tabs={tabs}\n      selectedTabIdx={selectedTabIdx}\n      onTabClick={onTabClick}\n      // ----- //\n      actions={actions}\n      onActionClick={onActionClick}\n    />\n  );\n};\n\nconst MemoizedCacheViewer = memo(CacheViewer);\n\nexport { MemoizedCacheViewer as CacheViewer };\n","//lib\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { VscSync } from 'react-icons/vsc';\nimport { OnMount } from '@monaco-editor/react';\n\n//hooks\nimport { useSnackbar } from '~/context/SnackbarContext';\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\n//utils\nimport { getExpandedData } from './utils';\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\n//types\nimport { Tab, Action } from '~/components/snippet/types';\nimport { CacheViewerConfig } from '~/types';\n\nconst TABS = [\n  { id: 'graph', label: 'Graph' },\n  { id: 'expanded', label: 'Expanded' },\n];\n\nenum ActionType {\n  REFRESH = 'REFRESH',\n  UPDATE = 'UPDATE',\n}\n\nconst REFRESH_ACTION: Action = {\n  id: ActionType.REFRESH,\n  label: 'Refresh',\n  Icon: VscSync,\n  type: 'icon',\n};\n\nconst UPDATE_CACHE_ACTION: Action = {\n  id: ActionType.UPDATE,\n  label: 'Update',\n  type: 'cta',\n};\n\ntype Params = {\n  config: CacheViewerConfig;\n};\ntype ReturnType = {\n  data: string;\n\n  tabs: Tab[];\n  selectedTabIdx: number;\n  onTabClick: (idx: number) => void;\n\n  actions: Action[];\n\n  onActionClick: (action: string) => void;\n  onMount: OnMount;\n};\n\nexport const useCacheViewer = ({ config }: Params): ReturnType => {\n  const { client, readOnly } = config;\n\n  const [tabIdx, setTabIdx] = useState(0);\n  const [count, setCount] = useState(0);\n\n  const { onError, onSuccess } = useSnackbar();\n\n  const { editorRef, onMount } = useMonacoMount();\n\n  const stringifiedData = useMemo(() => prettifyJSON(client.cache.extract()), [client.cache, count]);\n\n  const expandedData = useMemo(() => getExpandedData(client), [client, count]);\n  const expandedStringifiedData = useMemo(() => prettifyJSON(expandedData), [expandedData]);\n\n  const tabData = [stringifiedData, expandedStringifiedData];\n\n  const onActionClick = useCallback(\n    (action: string) => {\n      if (action === ActionType.REFRESH) {\n        setCount(c => c + 1);\n      } else if (action === ActionType.UPDATE) {\n        try {\n          const parsedCache = JSON.parse(editorRef.current?.getValue() ?? '');\n          client.cache.restore(parsedCache);\n          onSuccess('Cache updated successfully...');\n        } catch (e: unknown) {\n          console.error(e);\n          onError(e instanceof Error ? e.message : 'Something went wrong...');\n        }\n      }\n    },\n    [client.cache, editorRef, onError, onSuccess]\n  );\n\n  const actions = useMemo(\n    () => (readOnly || tabIdx ? [REFRESH_ACTION] : [REFRESH_ACTION, UPDATE_CACHE_ACTION]),\n    [readOnly, tabIdx]\n  );\n\n  return {\n    data: tabData[tabIdx],\n\n    selectedTabIdx: tabIdx,\n    onTabClick: setTabIdx,\n    tabs: TABS,\n\n    actions,\n    onActionClick,\n\n    onMount,\n  };\n};\n","//lib\nimport { ReactNode, createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\n\n//components\nimport { Snackbar, Intent } from '~/shared/snackbar';\n\ntype SnackbarContextType = {\n  onSuccess: (message: string) => void;\n  onError: (message: string) => void;\n};\n\nconst SnackbarContext = createContext<SnackbarContextType>({\n  onSuccess: () => {},\n  onError: () => {},\n});\n\nexport const SnackbarProvider = ({ children }: { children: ReactNode }) => {\n  const [state, setState] = useState<{ message: string; intent: Intent }>();\n\n  const timerRef = useRef<ReturnType<typeof setTimeout>>();\n\n  const clearStateAfterInterval = useCallback(() => {\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n    }\n\n    timerRef.current = setTimeout(() => {\n      setState(undefined);\n      timerRef.current = undefined;\n    }, 5000);\n  }, []);\n\n  const contextValue = useMemo<SnackbarContextType>(\n    () => ({\n      onError: message => {\n        setState({ message, intent: 'error' });\n        clearStateAfterInterval();\n      },\n      onSuccess: message => {\n        setState({ message, intent: 'success' });\n        clearStateAfterInterval();\n      },\n    }),\n    [clearStateAfterInterval]\n  );\n\n  return (\n    <SnackbarContext.Provider value={contextValue}>\n      {children}\n      <Snackbar message={state?.message} intent={state?.intent} />\n    </SnackbarContext.Provider>\n  );\n};\n\nexport const useSnackbar = (): SnackbarContextType => useContext(SnackbarContext);\n","//lib\nimport { createPortal } from 'react-dom';\n\n//components\nimport { VscCheck } from 'react-icons/vsc';\nimport { AiFillWarning } from 'react-icons/ai';\n\n//types\nimport { Intent } from './types';\n\ntype Props = {\n  message?: string;\n  intent?: Intent;\n};\n\nconst SuccessIcon = () => (\n  <div className=\"expr-snackbar__icon expr-snackbar__icon--success\">\n    <VscCheck size={10} strokeWidth={0.7} />\n  </div>\n);\n\nconst ErrorIcon = () => (\n  <div className=\"expr-snackbar__icon expr-snackbar__icon--error\">\n    <AiFillWarning size={12} strokeWidth={0.7} />\n  </div>\n);\n\nconst INTENT_VS_ERROR = {\n  success: SuccessIcon,\n  error: ErrorIcon,\n};\n\nexport const Snackbar = ({ message, intent }: Props) => {\n  const Icon = INTENT_VS_ERROR[intent ?? 'success'];\n\n  return createPortal(\n    message && intent ? (\n      <div className=\"expr-snackbar\">\n        <Icon />\n        <div className=\"expr-snackbar__message\">{message}</div>\n      </div>\n    ) : null,\n    document.body\n  );\n};\n","import { useCallback, useRef } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\nimport { MonacoEditorType } from '~/monaco';\n\nexport const useMonacoMount = () => {\n  const editorRef = useRef<MonacoEditorType>();\n\n  const onMount = useCallback<OnMount>(mEditor => {\n    editorRef.current = mEditor;\n  }, []);\n\n  return { editorRef, onMount };\n};\n","import { ApolloClient, NormalizedCacheObject } from '@apollo/client';\n\nconst recursivelyExpandData = (\n  data: Record<string, any>,\n  cache: NormalizedCacheObject,\n  level = 5\n): Record<string, any> => {\n  if (typeof data !== 'object' || !data || level <= 0) {\n    return data;\n  }\n\n  if (data.__ref) {\n    return recursivelyExpandData(cache[data.__ref]!, cache, level - 1);\n  }\n\n  return Object.keys(data).reduce((acc, key) => {\n    if (typeof data[key] === 'object') {\n      if (Array.isArray(data[key])) {\n        acc[key] = data[key].map((obj: Record<string, any>) => recursivelyExpandData(obj, cache, level - 1));\n      } else {\n        acc[key] = recursivelyExpandData(data[key], cache, level - 1);\n      }\n    } else {\n      acc[key] = data[key];\n    }\n\n    return acc;\n  }, {} as Record<string, any>);\n};\n\nexport const getExpandedData = (client: ApolloClient<NormalizedCacheObject>): object => {\n  const cache = client.cache.extract();\n\n  if (cache.ROOT_QUERY) {\n    return Object.keys(cache.ROOT_QUERY).reduce((acc, key) => {\n      acc[key] = recursivelyExpandData(cache.ROOT_QUERY![key] as Record<string, any>, cache);\n      return acc;\n    }, {} as Record<string, any>);\n  }\n\n  return {};\n};\n","//lib\nimport { useCallback } from 'react';\nimport { useCopyToClipboard } from 'react-use';\n\n//components\nimport { InputEditor } from './components/inputEditor';\nimport { VariableEditor } from './components/variableEditor';\nimport { OutputEditor } from './components/outputEditor';\nimport { QuerySelector } from './components/querySelector';\nimport { ExecutionStats } from '../executionStats';\nimport { QueryHistory } from '../queryHistory';\nimport { VscSend, VscSync, VscTerminal } from 'react-icons/vsc';\nimport { Button } from '~/shared/button';\n\n//hooks\nimport { useQueryExecutor } from './hooks/useQueryExecutor';\nimport { useHistory } from '~/context/HistoryContext';\n\n//utils\nimport { generateGraphQLCurl, getApolloUri } from '~/utils/generateCurl';\n\n//constants\nimport { Template } from '~/constants/template';\n\n//types\nimport { QueryExecutorConfig } from '~/types';\nimport { HistoryEntry } from '../queryHistory/types';\n\nconst QUERY_CONTAINER_CLASSNAME = 'flex-1 flex-grow-2';\nconst VARIABLE_CONTAINER_CLASSNAME = 'flex-1';\n\nexport const QueryExecutor = ({ config, tabId }: { config: QueryExecutorConfig; tabId: string }) => {\n  const { entries, addEntry, clearHistory } = useHistory(Template.QUERY_EXECUTOR);\n\n  const onExecutionComplete = useCallback(\n    (data: { queryText: string; variables: string; result: string; responseTimeMs: number }) => {\n      addEntry({ ...data, templateId: config.id, templateType: Template.QUERY_EXECUTOR });\n    },\n    [addEntry, config.id]\n  );\n\n  const { onInputMount, onOutputMount, onVariableMount, onSubmit, loading, onQuerySelect, stats, inputEditorRef, variableEditorRef } = useQueryExecutor({\n    config,\n    tabId,\n    onExecutionComplete,\n  });\n\n  const [, copyToClipboard] = useCopyToClipboard();\n\n  const handleCopyCurl = useCallback(() => {\n    const query = inputEditorRef.current?.getValue() ?? '';\n    const variables = variableEditorRef.current?.getValue() ?? '';\n    const endpoint = getApolloUri(config.client);\n    const curl = generateGraphQLCurl({ endpoint, query, variables: variables || undefined });\n    copyToClipboard(curl);\n  }, [inputEditorRef, variableEditorRef, config.client, copyToClipboard]);\n\n  const onHistorySelect = useCallback(\n    (entry: HistoryEntry) => {\n      onQuerySelect({ query: entry.queryText, variables: entry.variables, output: entry.result });\n    },\n    [onQuerySelect]\n  );\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <div className=\"flex-none flex gap-3\">\n          <QuerySelector config={config} onChange={onQuerySelect} className=\"flex-1\" />\n          <QueryHistory entries={entries} onSelect={onHistorySelect} onClear={clearHistory} />\n          <Button tooltipContent=\"Refresh Queries\" className=\"flex-none\" size=\"xs\" variant=\"secondary\" icon>\n            <VscSync size={16} strokeWidth={0.4} />\n          </Button>\n          <Button className=\"flex-none\" size=\"xs\" tooltipContent=\"Copy as cURL\" onClick={handleCopyCurl} icon>\n            <VscTerminal size={16} />\n          </Button>\n          <Button className=\"flex-none\" size=\"xs\" tooltipContent=\"Execute\" onClick={onSubmit} icon>\n            <VscSend />\n          </Button>\n        </div>\n        <InputEditor\n          title={config.config?.input?.title}\n          onSubmit={onSubmit}\n          className={QUERY_CONTAINER_CLASSNAME}\n          onMount={onInputMount}\n        />\n        <VariableEditor\n          title={config.config?.variable?.title}\n          onSubmit={onSubmit}\n          className={VARIABLE_CONTAINER_CLASSNAME}\n          onMount={onVariableMount}\n        />\n      </div>\n      <div className=\"flex-1 relative\">\n        <OutputEditor\n          title={config.config?.output?.title}\n          readOnly={config.config?.output?.readOnly}\n          className=\"h-full\"\n          onMount={onOutputMount}\n          loading={loading}\n        />\n        {stats && <ExecutionStats stats={stats} />}\n      </div>\n    </div>\n  );\n};\n","//lib\nimport { useMemo } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//components\nimport { Snippet } from '~/components/snippet';\n\n//hooks\nimport { useInputEditor } from './hooks/useInputEditor';\n\n//constants\nimport { Language } from '~/constants/language';\n\n//types\n\ntype Props = {\n  title?: string;\n  onSubmit: () => void;\n  onMount?: OnMount;\n  className?: string;\n};\n\nexport const InputEditor = ({ title, onSubmit, onMount: parentOnMount, className }: Props) => {\n  const { onMount, onChange, errors } = useInputEditor({ onSubmit, parentOnMount });\n\n  const editorProps = useMemo(() => ({ onChange, onMount, language: Language.GRAPHQL }), [onChange, onMount]);\n\n  return <Snippet editorProps={editorProps} title={title ?? 'Query'} className={className} errors={errors} />;\n};\n","//lib\nimport { useCallback, useRef, useState } from 'react';\nimport { parse } from 'graphql';\nimport { OnChange, OnMount } from '@monaco-editor/react';\n\n//types\nimport { MonacoEditorType } from '~/monaco';\n\ntype Params = {\n  parentOnMount?: OnMount;\n  onSubmit: () => void;\n};\n\ntype ReturnType = {\n  errors: boolean;\n  onMount: OnMount;\n  onChange: OnChange;\n};\n\nexport const useInputEditor = ({ parentOnMount, onSubmit }: Params): ReturnType => {\n  const [errors, setErrors] = useState(true);\n  const editorRef = useRef<MonacoEditorType>();\n\n  const onChange = useCallback<OnChange>(content => {\n    try {\n      const parsedGQLNode = parse(content ?? '');\n      setErrors(false);\n    } catch {\n      setErrors(true);\n    }\n  }, []);\n\n  const onMount = useCallback<OnMount>(\n    (mEditor, _monaco) => {\n      editorRef.current = mEditor;\n      parentOnMount?.(mEditor, _monaco);\n      editorRef.current?.onKeyDown(ev => {\n        if (ev.metaKey && ev.keyCode === 3) {\n          if (!latestErrors.current) {\n            onSubmit();\n          }\n          ev.stopPropagation();\n        }\n      });\n    },\n    [onSubmit, parentOnMount]\n  );\n\n  const latestErrors = useRef(errors);\n  latestErrors.current = errors;\n\n  return {\n    errors,\n    onChange,\n    onMount,\n  };\n};\n","//lib\nimport { memo, useMemo } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//components\nimport { Snippet } from '~/components/snippet';\n\n//hooks\nimport { useVariableEditor } from './hooks/useVariableEditor';\n\ntype Props = {\n  title?: string;\n  onSubmit: () => void;\n  onMount?: OnMount;\n  className?: string;\n};\n\nconst VariableEditor = ({ title, onSubmit, className, onMount: parentOnMount }: Props) => {\n  const { onChange, onMount, errors } = useVariableEditor({ onSubmit, parentOnMount });\n\n  const editorProps = useMemo(() => ({ onMount, onChange }), [onChange, onMount]);\n\n  return <Snippet editorProps={editorProps} errors={errors} title={title ?? 'Variables'} className={className} />;\n};\n\nconst MemoizedVariableEditor = memo(VariableEditor);\n\nexport { MemoizedVariableEditor as VariableEditor };\n","//lib\nimport { useCallback, useRef } from 'react';\nimport { OnChange, OnMount } from '@monaco-editor/react';\n\n//hooks\nimport { useValidateJSON } from '~/hooks/useValidateJSON';\n\n//types\nimport { MonacoEditorType } from '~/monaco';\n\ntype Params = {\n  parentOnMount?: OnMount;\n  onSubmit: () => void;\n};\n\ntype ReturnType = {\n  errors: boolean;\n  onMount: OnMount;\n  onChange: OnChange;\n};\n\nexport const useVariableEditor = ({ parentOnMount, onSubmit }: Params): ReturnType => {\n  const { errors, handleChange } = useValidateJSON();\n\n  const editorRef = useRef<MonacoEditorType>();\n\n  const onMount = useCallback<OnMount>(\n    (mEditor, _monaco) => {\n      editorRef.current = mEditor;\n      parentOnMount?.(mEditor, _monaco);\n      editorRef.current!.onKeyDown(ev => {\n        if (ev.metaKey && ev.keyCode === 3) {\n          if (!latestErrors.current) {\n            onSubmit();\n          }\n          ev.stopPropagation();\n        }\n      });\n    },\n    [onSubmit, parentOnMount]\n  );\n\n  const latestErrors = useRef(errors);\n  latestErrors.current = errors;\n\n  return {\n    errors,\n    onChange: handleChange,\n    onMount,\n  };\n};\n","//lib\nimport { useCallback, useState } from 'react';\nimport { OnChange } from '@monaco-editor/react';\n\ntype Params = {\n  onChange?: OnChange;\n};\n\ntype ReturnType = {\n  errors: boolean;\n  handleChange: OnChange;\n};\n\nexport const useValidateJSON = ({ onChange }: Params = {}): ReturnType => {\n  const [errors, setErrors] = useState(false);\n\n  const handleChange = useCallback<OnChange>(\n    (content, ev) => {\n      onChange?.(content, ev);\n      try {\n        const parsedVariables = JSON.parse(content ?? '');\n        setErrors(false);\n      } catch {\n        setErrors(true);\n      }\n    },\n    [onChange]\n  );\n\n  return {\n    errors,\n    handleChange,\n  };\n};\n","//lib\nimport { memo, useMemo } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//components\nimport { Snippet } from '~/components/snippet';\n\ntype Props = {\n  title?: string;\n  readOnly?: boolean;\n  onMount: OnMount;\n  className?: string;\n  loading?: boolean;\n};\n\nconst OutputEditor = ({ title, readOnly, onMount, className, loading }: Props) => {\n  const editorProps = useMemo(() => ({ onMount, readOnly }), [onMount, readOnly]);\n\n  return <Snippet editorProps={editorProps} title={title ?? 'Output'} className={className} loading={loading} />;\n};\n\nconst MemoizedOutputEditor = memo(OutputEditor);\n\nexport { MemoizedOutputEditor as OutputEditor };\n","//lib\nimport { memo } from 'react';\n\n//components\nimport { Select } from '~/shared/select';\n\n//hooks\nimport { useQuerySelector } from './hooks/useQuerySelector';\n\n//types\nimport { QueryExecutorConfig } from '~/types';\nimport { OnQuerySelect } from '../../types';\n\ntype Props = {\n  config: QueryExecutorConfig;\n  onChange: OnQuerySelect;\n  className?: string;\n};\n\nconst QuerySelector = ({ config, onChange, className }: Props) => {\n  const { options, selectedOption, onOptionSelect } = useQuerySelector({ config, onChange });\n\n  return (\n    <Select\n      options={options}\n      value={selectedOption}\n      placeholder=\"Select Query...\"\n      className={className}\n      size=\"xs\"\n      onChange={onOptionSelect}\n    />\n  );\n};\n\nconst MemoizedQuerySelector = memo(QuerySelector);\n\nexport { MemoizedQuerySelector as QuerySelector };\n","//lib\nimport { LegacyRef, useMemo, useState } from 'react';\n\n//components\nimport { Input } from '../input';\nimport { Popover } from './components/Popover';\nimport { Menu } from './components/Menu';\nimport { VscChevronDown } from 'react-icons/vsc';\n\n//types\nimport { Option } from './types';\n\ntype Props = {\n  size?: 'xs' | 'md';\n  placeholder?: string;\n  onChange: (option: Option) => void;\n  options: Option[];\n  value?: Option;\n  className?: string;\n};\n\nexport const Select = ({ options, onChange, placeholder = 'Select...', size = 'md', value, className = '' }: Props) => {\n  const [touched, setTouched] = useState(false);\n  const [search, setSearch] = useState('');\n\n  const filteredOptions = useMemo(() => {\n    if (touched) {\n      return options.filter(option => option.label.toLowerCase().includes(search.toLowerCase()));\n    }\n    return options;\n  }, [options, search, touched]);\n\n  return (\n    <div className={`expr-select relative ${className}`}>\n      <Popover\n        content={({ close }) => (\n          <Menu\n            options={filteredOptions}\n            onClose={() => {\n              setTouched(false);\n              close();\n            }}\n            onChange={option => {\n              onChange(option);\n              setSearch(option.label);\n            }}\n            selected={value}\n          />\n        )}\n      >\n        {({ onClick, isOpen, ref }) => (\n          <div className=\"relative\" onClick={onClick} ref={ref as LegacyRef<HTMLDivElement>}>\n            <Input\n              size={size}\n              placeholder={placeholder}\n              isActive={isOpen}\n              value={search}\n              onChange={e => {\n                setSearch(e.target.value);\n                setTouched(true);\n              }}\n            />\n            <div\n              className=\"absolute flex items-center cursor-pointer expr-ui-01\"\n              style={{ right: '8px', top: '4px', bottom: '4px' }}\n            >\n              <VscChevronDown\n                style={{\n                  rotate: isOpen ? '-180deg' : '0deg',\n                  transitionDuration: '300ms',\n                }}\n              />\n            </div>\n          </div>\n        )}\n      </Popover>\n    </div>\n  );\n};\n","import { DetailedHTMLProps, InputHTMLAttributes, WheelEventHandler, forwardRef, useCallback } from 'react';\n\ntype Props = Omit<DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, 'size'> & {\n  error?: boolean;\n  size?: 'xs' | 'md';\n  isActive?: boolean;\n};\n\nconst SIZE_VS_CLASSNAME = {\n  xs: 'size-xs',\n  md: '',\n};\n\n// eslint-disable-next-line react/display-name\nexport const Input = forwardRef<HTMLInputElement, Props>(\n  ({ className, error, type, size = 'md', isActive, ...rest }, ref) => {\n    const onWheel = useCallback<WheelEventHandler<HTMLInputElement>>(\n      ev => {\n        if (type === 'number') {\n          ev.currentTarget.blur();\n        }\n      },\n      [type]\n    );\n\n    return (\n      <input\n        {...rest}\n        className={`expr-input ${error ? 'error' : ''} ${SIZE_VS_CLASSNAME[size]} ${isActive ? 'active' : ''} ${\n          className ? className : ''\n        }`}\n        onWheel={onWheel}\n        type={type}\n        ref={ref}\n      />\n    );\n  }\n);\n","import { MouseEvent, ReactNode, Ref, useCallback, useRef, useState } from 'react';\nimport { useClickAway } from 'react-use';\n\ntype Children = (p: { onClick: (ev: MouseEvent) => void; isOpen: boolean; ref: Ref<HTMLElement> }) => ReactNode;\n\ntype Props = {\n  children: Children;\n  content?: ReactNode | ((p: { close: () => void }) => ReactNode);\n};\n\nexport const Popover = ({ content, children }: Props): JSX.Element => {\n  const [coords, setCoords] = useState<DOMRect>();\n  const popoverContainerRef = useRef<HTMLDivElement>(null);\n\n  const childRef = useRef<HTMLElement>(null);\n\n  const latestCoordsRef = useRef(coords);\n  latestCoordsRef.current = coords;\n\n  const onClick = useCallback((ev: MouseEvent) => {\n    const domRect = ev.currentTarget.getBoundingClientRect();\n\n    if (latestCoordsRef.current) {\n      setCoords(undefined);\n    } else {\n      setCoords(domRect);\n    }\n  }, []);\n\n  const onClose = useCallback(() => {\n    setCoords(undefined);\n  }, []);\n\n  useClickAway(popoverContainerRef, ev => {\n    if (childRef.current?.contains(ev.target as HTMLElement)) {\n    } else {\n      onClose();\n    }\n  });\n\n  const childDomRect = childRef.current?.getBoundingClientRect();\n\n  return (\n    <>\n      {children({ onClick, isOpen: !!coords, ref: childRef })}\n      {coords && childDomRect ? (\n        <div\n          className=\"absolute border-1 border-solid expr-border-03 rounded-8 overflow-hidden p-1 expr-ui-01 expr-shadow-02 left-0 right-0\"\n          style={{\n            zIndex: 1000,\n            top: `${childDomRect.height + 10}px`,\n            width: `${childDomRect.width}px`,\n          }}\n          ref={popoverContainerRef}\n        >\n          <div className=\"expr-text-01\">{typeof content === 'function' ? content({ close: onClose }) : content}</div>\n        </div>\n      ) : undefined}\n    </>\n  );\n};\n","import { useEffect, useRef } from 'react';\n\nimport { Typography } from '~/shared/typography';\n\nimport { Option } from '../types';\n\ntype Props = {\n  options: Option[];\n  onClose: () => void;\n  onChange: (option: Option) => void;\n  selected?: Option;\n};\n\nexport const Menu = ({ options, onClose, onChange, selected }: Props) => {\n  const elementsMap = useRef<Record<string, HTMLElement | null>>({});\n\n  useEffect(() => {\n    if (selected) {\n      elementsMap.current[selected.id]?.scrollIntoView();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- run on mount\n  }, []);\n\n  if (!options.length) {\n    return (\n      <div className=\"py-1-5 px-2 rounded-8 hover-expr-ui-05\">\n        <Typography>No Results</Typography>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"overflow-y-auto select-menu\" style={{ maxHeight: '300px' }}>\n      {options.map(option => (\n        <div\n          key={option.id}\n          className={`py-1-5 px-2 rounded-8 cursor-pointer break-all ${\n            selected?.id === option.id ? 'expr-ui-05' : 'hover-expr-ui-05'\n          }`}\n          ref={el => {\n            elementsMap.current[option.id] = el;\n          }}\n          onClick={() => {\n            onChange(option);\n            onClose();\n          }}\n        >\n          <Typography>{option.label}</Typography>\n        </div>\n      ))}\n    </div>\n  );\n};\n","//lib\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { QueryInfo } from '@apollo/client/core/QueryInfo';\nimport { DocumentNode, Kind, OperationDefinitionNode, parse, print } from 'graphql';\n\n//utils\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\n//types\nimport { QueryExecutorConfig } from '~/types';\nimport { Option } from '~/shared/select';\nimport { OnQuerySelect } from '~/components/queryExecutor/types';\n\ntype Params = {\n  config: QueryExecutorConfig;\n  onChange: OnQuerySelect;\n};\n\ntype ReturnType = {\n  options: Option[];\n  selectedOption: Option | undefined;\n  onOptionSelect: (option: Option) => void;\n};\n\nexport const useQuerySelector = ({ config, onChange }: Params): ReturnType => {\n  const { client } = config;\n\n  const [selectedOption, setSelectedOption] = useState<Option>();\n\n  const options = useMemo<Option[]>(() => {\n    const queriesMap = (client as any).queryManager.queries as Map<string, QueryInfo>;\n\n    const queriesArray = Array.from(queriesMap.values());\n\n    return queriesArray.map<Option>(query => {\n      const name =\n        (\n          query.document?.definitions.find(def => def.kind === Kind.OPERATION_DEFINITION) as\n            | OperationDefinitionNode\n            | undefined\n        )?.name?.value ?? '';\n      const variables = query.variables ?? {};\n      const node = query.document;\n\n      return { id: query.queryId, label: `${name}(${JSON.stringify(variables)})`, node, variables: query.variables };\n    });\n  }, [client]);\n\n  const onOptionSelect = useCallback(\n    async (option: Option) => {\n      setSelectedOption(option);\n      const { node, variables = {} } = option as Option & { node: DocumentNode; variables?: Record<string, any> };\n\n      if (node) {\n        try {\n          const output = await client.query({ query: node, variables, fetchPolicy: 'cache-only' });\n          onChange({\n            query: print(node),\n            variables: prettifyJSON(variables),\n            output: prettifyJSON(output.data) || output.error?.message,\n          });\n        } catch (e: unknown) {\n          onChange({\n            query: print(node),\n            variables: prettifyJSON(variables),\n            output: e instanceof Error ? e.message : 'Unknown error',\n          });\n        }\n      }\n    },\n    [client, onChange]\n  );\n\n  return {\n    selectedOption,\n    options,\n    onOptionSelect,\n  };\n};\n","import { memo } from 'react';\nimport { ExecutionStatsData } from './types';\n\ntype Props = {\n  stats: ExecutionStatsData;\n};\n\nconst ExecutionStats = ({ stats }: Props) => (\n  <div\n    className=\"absolute bottom-0 left-0 right-0 px-3 py-1 expr-ui-02 border-0 border-t-1 border-solid expr-border-03 flex gap-3 expr-text-03\"\n    style={{ fontSize: '12px', zIndex: 1 }}\n  >\n    <span>{stats.responseTimeMs}ms</span>\n    <span>|</span>\n    <span>{(stats.payloadSizeBytes / 1024).toFixed(1)}KB</span>\n  </div>\n);\n\nconst MemoizedExecutionStats = memo(ExecutionStats);\nexport { MemoizedExecutionStats as ExecutionStats };\n","import { memo, useState, useRef } from 'react';\nimport { VscHistory, VscTrash } from 'react-icons/vsc';\n\nimport { Typography } from '~/shared/typography';\nimport { Button } from '~/shared/button/Button';\nimport { HistoryEntry } from './types';\n\ntype Props = {\n  entries: HistoryEntry[];\n  onSelect: (entry: HistoryEntry) => void;\n  onClear: () => void;\n};\n\nconst formatTime = (ts: number) => {\n  const d = new Date(ts);\n  return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n};\n\nconst truncate = (text: string, maxLen: number) => (text.length > maxLen ? text.slice(0, maxLen) + '...' : text);\n\nconst HistoryListItem = ({\n  entry,\n  onSelect,\n  onClose,\n}: {\n  entry: HistoryEntry;\n  onSelect: (entry: HistoryEntry) => void;\n  onClose: () => void;\n}) => (\n  <div\n    className=\"px-3 py-2 cursor-pointer hover-expr-ui-02 border-0 border-b-1 border-solid expr-border-03\"\n    onClick={() => {\n      onSelect(entry);\n      onClose();\n    }}\n  >\n    <div className=\"flex justify-between items-center\">\n      <Typography variant=\"body-14\" className=\"truncate\" style={{ maxWidth: '220px' }}>\n        {truncate(entry.queryText, 50)}\n      </Typography>\n      <Typography variant=\"l3\" className=\"expr-text-03 flex-none\">\n        {entry.responseTimeMs}ms\n      </Typography>\n    </div>\n    <Typography variant=\"l4\" className=\"expr-text-03 mt-1\">\n      {formatTime(entry.timestamp)}\n    </Typography>\n  </div>\n);\n\nconst HistoryList = ({\n  entries,\n  onSelect,\n  onClear,\n  onClose,\n}: {\n  entries: HistoryEntry[];\n  onSelect: (entry: HistoryEntry) => void;\n  onClear: () => void;\n  onClose: () => void;\n}) => (\n  <div\n    className=\"absolute top-full right-0 mt-1 border-1 border-solid expr-border-03 rounded-8 expr-ui-01 overflow-hidden\"\n    style={{ width: '320px', maxHeight: '300px', overflowY: 'auto', zIndex: 10 }}\n  >\n    <div className=\"flex items-center justify-between px-3 py-2 border-0 border-b-1 border-solid expr-border-03\">\n      <Typography variant=\"h6\">History</Typography>\n      <Button size=\"xs\" variant=\"secondary\" icon tooltipContent=\"Clear History\" onClick={onClear}>\n        <VscTrash size={16} />\n      </Button>\n    </div>\n    {entries.map(entry => (\n      <HistoryListItem key={entry.id} entry={entry} onSelect={onSelect} onClose={onClose} />\n    ))}\n  </div>\n);\n\nconst QueryHistory = ({ entries, onSelect, onClear }: Props) => {\n  const [open, setOpen] = useState(false);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  if (entries.length === 0) return null;\n\n  return (\n    <div className=\"relative\" ref={containerRef}>\n      <Button size=\"xs\" variant=\"secondary\" icon tooltipContent=\"Query History\" onClick={() => setOpen(o => !o)}>\n        <VscHistory size={14} />\n      </Button>\n      {open && <HistoryList entries={entries} onSelect={onSelect} onClear={onClear} onClose={() => setOpen(false)} />}\n    </div>\n  );\n};\n\nconst MemoizedQueryHistory = memo(QueryHistory);\nexport { MemoizedQueryHistory as QueryHistory };\n","//lib\nimport { useCallback } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//hooks\nimport { useGraphQLExecutor } from '~/hooks/useGraphQLExecutor';\n\n//constants\nimport { Template } from '~/constants/template';\n\n//types\nimport { QueryExecutorConfig } from '~/types';\nimport { OnQuerySelect } from '../types';\nimport { ExecutionStatsData } from '~/components/executionStats/types';\nimport { MonacoEditorType } from '~/monaco';\n\ntype ExecutionResult = {\n  queryText: string;\n  variables: string;\n  result: string;\n  responseTimeMs: number;\n};\n\ntype Params = {\n  config: QueryExecutorConfig;\n  tabId: string;\n  onExecutionComplete?: (data: ExecutionResult) => void;\n};\n\ntype ReturnType = {\n  onQuerySelect: OnQuerySelect;\n  onInputMount: OnMount;\n  onVariableMount: OnMount;\n  onOutputMount: OnMount;\n  onSubmit: () => void;\n  loading: boolean;\n  stats: ExecutionStatsData | null;\n  inputEditorRef: React.MutableRefObject<MonacoEditorType | undefined>;\n  variableEditorRef: React.MutableRefObject<MonacoEditorType | undefined>;\n};\n\nexport const useQueryExecutor = ({ config, tabId, onExecutionComplete }: Params): ReturnType => {\n  const {\n    onSelect,\n    onInputMount,\n    onVariableMount,\n    onOutputMount,\n    onSubmit,\n    loading,\n    stats,\n    inputEditorRef,\n    variableEditorRef,\n  } = useGraphQLExecutor({\n    tabStateType: Template.QUERY_EXECUTOR,\n    client: config.client,\n    tabId,\n    onExecutionComplete,\n  });\n\n  const onQuerySelect = useCallback<OnQuerySelect>(\n    ({ query, variables, output }) => onSelect({ input: query, variables, output }),\n    [onSelect]\n  );\n\n  return {\n    onInputMount,\n    onVariableMount,\n    onOutputMount,\n    onSubmit,\n    loading,\n    stats,\n    onQuerySelect,\n    inputEditorRef,\n    variableEditorRef,\n  };\n};\n","//lib\nimport { useCallback } from 'react';\nimport { OnMount } from '@monaco-editor/react';\nimport { parse } from 'graphql';\nimport { ApolloClient } from '@apollo/client';\nimport { MonacoEditorType } from '~/monaco';\n\n//hooks\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\nimport { useGraphQLExecution } from '~/hooks/useGraphQLExecution';\n\n//context\nimport { useTabState, QueryExecutorTabState, MutationExecutorTabState } from '~/context/TabStateContext';\n\n//constants\nimport { Template } from '~/constants/template';\n\n//types\nimport { ExecutionStatsData } from '~/components/executionStats/types';\n\ntype EditorTabState = QueryExecutorTabState | MutationExecutorTabState;\n\ntype ExecutionResult = {\n  queryText: string;\n  variables: string;\n  result: string;\n  responseTimeMs: number;\n};\n\ntype Params = {\n  tabStateType: Template.QUERY_EXECUTOR | Template.MUTATION_EXECUTOR;\n  client: ApolloClient<unknown>;\n  tabId: string;\n  onExecutionComplete?: (data: ExecutionResult) => void;\n};\n\ntype ReturnType = {\n  onInputMount: OnMount;\n  onVariableMount: OnMount;\n  onOutputMount: OnMount;\n\n  onSubmit: () => void;\n  onSelect: (params: { input: string; variables?: string; output?: string }) => void;\n\n  loading: boolean;\n  stats: ExecutionStatsData | null;\n\n  inputEditorRef: React.MutableRefObject<MonacoEditorType | undefined>;\n  variableEditorRef: React.MutableRefObject<MonacoEditorType | undefined>;\n};\n\nexport const useGraphQLExecutor = ({ tabStateType, client, tabId, onExecutionComplete }: Params): ReturnType => {\n  const { getState, setState } = useTabState();\n\n  const { editorRef: inputEditorRef, onMount: rawInputMount } = useMonacoMount();\n  const { editorRef: variableEditorRef, onMount: rawVariableMount } = useMonacoMount();\n  const { editorRef: outputEditorRef, onMount: rawOutputMount } = useMonacoMount();\n\n  const executeFn = useCallback(\n    async (variables: any) => {\n      const document = parse(inputEditorRef.current?.getValue() ?? '');\n      if (tabStateType === Template.MUTATION_EXECUTOR) {\n        const response = await client.mutate({ mutation: document, variables });\n        return { data: response.data, errorMessage: response.errors?.[0]?.message };\n      }\n      const response = await client.query({ query: document, variables, fetchPolicy: 'network-only' });\n      return { data: response.data, errorMessage: response.error?.message };\n    },\n    [client, inputEditorRef, tabStateType]\n  );\n\n  const { loading, stats, execute, setStats } = useGraphQLExecution({ executeFn, outputEditorRef });\n\n  const saveField = useCallback(\n    (field: keyof Pick<EditorTabState, 'input' | 'variables' | 'output'>, value: string) => {\n      const current = getState<EditorTabState>(tabId);\n      setState<EditorTabState>(tabId, {\n        type: tabStateType,\n        input: '',\n        variables: '',\n        output: '',\n        stats: null,\n        ...current,\n        [field]: value,\n      });\n    },\n    [tabId, tabStateType, getState, setState]\n  );\n\n  const onInputMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      rawInputMount(editor, monaco);\n      const saved = getState<EditorTabState>(tabId);\n      if (saved?.input) editor.setValue(saved.input);\n      editor.onDidChangeModelContent(() => saveField('input', editor.getValue()));\n    },\n    [rawInputMount, getState, tabId, saveField]\n  );\n\n  const onVariableMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      rawVariableMount(editor, monaco);\n      const saved = getState<EditorTabState>(tabId);\n      if (saved?.variables) editor.setValue(saved.variables);\n      editor.onDidChangeModelContent(() => saveField('variables', editor.getValue()));\n    },\n    [rawVariableMount, getState, tabId, saveField]\n  );\n\n  const onOutputMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      rawOutputMount(editor, monaco);\n      const saved = getState<EditorTabState>(tabId);\n      if (saved) {\n        if (saved.output) editor.setValue(saved.output);\n        if (saved.stats) setStats(saved.stats);\n      }\n      editor.onDidChangeModelContent(() => saveField('output', editor.getValue()));\n    },\n    [rawOutputMount, getState, tabId, saveField, setStats]\n  );\n\n  const onSubmit = useCallback(async () => {\n    const queryText = inputEditorRef.current?.getValue() ?? '';\n    const variablesText = variableEditorRef.current?.getValue() ?? '';\n    const variables = JSON.parse(variablesText);\n\n    const result = await execute(variables);\n    if (result) {\n      const current = getState<EditorTabState>(tabId);\n      setState<EditorTabState>(tabId, {\n        ...current!,\n        stats: { responseTimeMs: result.elapsed, payloadSizeBytes: new Blob([result.result]).size },\n      });\n      onExecutionComplete?.({\n        queryText,\n        variables: variablesText,\n        result: result.result,\n        responseTimeMs: result.elapsed,\n      });\n    }\n  }, [inputEditorRef, variableEditorRef, execute, getState, setState, tabId, onExecutionComplete]);\n\n  const onSelect = useCallback(\n    ({ input, variables, output }: { input: string; variables?: string; output?: string }) => {\n      inputEditorRef.current?.setValue(input);\n      variableEditorRef.current?.setValue(variables ?? '');\n      outputEditorRef.current?.setValue(output ?? '');\n    },\n    [inputEditorRef, outputEditorRef, variableEditorRef]\n  );\n\n  return {\n    onInputMount,\n    onVariableMount,\n    onOutputMount,\n    onSubmit,\n    onSelect,\n    loading,\n    stats,\n    inputEditorRef,\n    variableEditorRef,\n  };\n};\n","//lib\nimport { MutableRefObject, useCallback, useState } from 'react';\n\n//utils\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\n//types\nimport { MonacoEditorType } from '~/monaco';\nimport { ExecutionStatsData } from '~/components/executionStats/types';\n\ntype ExecuteFn = (variables: any) => Promise<{ data: any; errorMessage?: string }>;\n\ntype Params = {\n  executeFn: ExecuteFn;\n  outputEditorRef: MutableRefObject<MonacoEditorType | undefined>;\n};\n\ntype ReturnType = {\n  loading: boolean;\n  stats: ExecutionStatsData | null;\n  execute: (variables: any) => Promise<{ result: string; elapsed: number } | void>;\n  setStats: (stats: ExecutionStatsData | null) => void;\n};\n\nexport const useGraphQLExecution = ({ executeFn, outputEditorRef }: Params): ReturnType => {\n  const [loading, setLoading] = useState(false);\n  const [stats, setStats] = useState<ExecutionStatsData | null>(null);\n\n  const execute = useCallback(\n    async (variables: any) => {\n      setLoading(true);\n      setStats(null);\n      const startTime = performance.now();\n      try {\n        const { data, errorMessage } = await executeFn(variables);\n        const result = prettifyJSON(data) ?? errorMessage ?? '';\n        const elapsed = Math.round(performance.now() - startTime);\n        outputEditorRef.current?.setValue(result);\n        setStats({ responseTimeMs: elapsed, payloadSizeBytes: new Blob([result]).size });\n        return { result, elapsed };\n      } catch (e: unknown) {\n        outputEditorRef.current?.setValue(e instanceof Error ? e.message : 'Unknown error');\n      } finally {\n        setLoading(false);\n      }\n    },\n    [executeFn, outputEditorRef]\n  );\n\n  return { loading, stats, execute, setStats };\n};\n","import { createContext, ReactNode, useCallback, useContext, useRef } from 'react';\n\nimport { ExecutionStatsData } from '~/components/executionStats/types';\nimport { Header, RestApiStats } from '~/components/restApi/types';\nimport { ConnectionStatus } from '~/types';\n\nexport type QueryExecutorTabState = {\n  type: 'QUERY_EXECUTOR';\n  input: string;\n  variables: string;\n  output: string;\n  stats: ExecutionStatsData | null;\n};\n\nexport type MutationExecutorTabState = {\n  type: 'MUTATION_EXECUTOR';\n  input: string;\n  variables: string;\n  output: string;\n  stats: ExecutionStatsData | null;\n};\n\nexport type RestApiTabState = {\n  type: 'REST_API';\n  url: string;\n  method: string;\n  headers: Header[];\n  body: string;\n  response: string;\n  stats: RestApiStats | null;\n};\n\nexport type SseTabState = {\n  type: 'SSE';\n  url: string;\n  headers: Header[];\n  events: string;\n  connectionStatus: ConnectionStatus;\n};\n\nexport type RestWebsocketTabState = {\n  type: 'REST_WEBSOCKET';\n  url: string;\n  messageDraft: string;\n  messages: { id: string; direction: 'sent' | 'received'; data: string; timestamp: number }[];\n  connectionStatus: ConnectionStatus;\n};\n\nexport type GqlSubscriptionTabState = {\n  type: 'GQL_SUBSCRIPTION';\n  wsUrl: string;\n  query: string;\n  variables: string;\n  events: string;\n  connectionStatus: ConnectionStatus;\n};\n\nexport type TabState =\n  | QueryExecutorTabState\n  | MutationExecutorTabState\n  | RestApiTabState\n  | SseTabState\n  | RestWebsocketTabState\n  | GqlSubscriptionTabState;\n\ntype TabStateContextType = {\n  getState: <T extends TabState>(tabId: string) => T | undefined;\n  setState: <T extends TabState>(tabId: string, state: T) => void;\n  removeState: (tabId: string) => void;\n};\n\nconst TabStateContext = createContext<TabStateContextType>({\n  getState: () => undefined,\n  setState: () => {},\n  removeState: () => {},\n});\n\nexport const TabStateProvider = ({ children }: { children: ReactNode }) => {\n  const storeRef = useRef<Map<string, TabState>>(new Map());\n\n  const getState = useCallback(<T extends TabState>(tabId: string): T | undefined => {\n    return storeRef.current.get(tabId) as T | undefined;\n  }, []);\n\n  const setState = useCallback(<T extends TabState>(tabId: string, state: T) => {\n    storeRef.current.set(tabId, state);\n  }, []);\n\n  const removeState = useCallback((tabId: string) => {\n    storeRef.current.delete(tabId);\n  }, []);\n\n  return <TabStateContext.Provider value={{ getState, setState, removeState }}>{children}</TabStateContext.Provider>;\n};\n\nexport const useTabState = () => useContext(TabStateContext);\n","import { createContext, ReactNode, useCallback, useContext, useMemo } from 'react';\nimport { useQueryHistory } from '~/hooks/useQueryHistory';\nimport { HistoryEntry } from '~/components/queryHistory/types';\n\ntype HistoryContextType = {\n  entries: HistoryEntry[];\n  addEntry: (entry: Omit<HistoryEntry, 'id' | 'timestamp'>) => void;\n  clearHistory: () => void;\n  clearHistoryForType: (templateType: string) => void;\n};\n\nconst HistoryContext = createContext<HistoryContextType>({\n  entries: [],\n  addEntry: () => {},\n  clearHistory: () => {},\n  clearHistoryForType: () => {},\n});\n\nexport const HistoryProvider = ({ instanceId, children }: { instanceId: string; children: ReactNode }) => {\n  const history = useQueryHistory(instanceId);\n  return <HistoryContext.Provider value={history}>{children}</HistoryContext.Provider>;\n};\n\nexport const useHistory = (templateType?: string) => {\n  const ctx = useContext(HistoryContext);\n\n  const filteredEntries = useMemo(\n    () => (templateType ? ctx.entries.filter(e => e.templateType === templateType) : ctx.entries),\n    [ctx.entries, templateType]\n  );\n\n  const clearHistory = useCallback(() => {\n    if (templateType) {\n      ctx.clearHistoryForType(templateType);\n    } else {\n      ctx.clearHistory();\n    }\n  }, [templateType, ctx]);\n\n  return { entries: filteredEntries, addEntry: ctx.addEntry, clearHistory };\n};\n","import { useCallback, useState } from 'react';\nimport { HistoryEntry } from '~/components/queryHistory/types';\n\nconst MAX_ENTRIES = 50;\n\nconst getStorageKey = (instanceId: string) => `api-playground:${instanceId}:history`;\n\nconst readEntries = (instanceId: string): HistoryEntry[] => {\n  try {\n    const raw = localStorage.getItem(getStorageKey(instanceId));\n    return raw ? JSON.parse(raw) : [];\n  } catch {\n    return [];\n  }\n};\n\nconst writeEntries = (instanceId: string, entries: HistoryEntry[]) => {\n  try {\n    localStorage.setItem(getStorageKey(instanceId), JSON.stringify(entries));\n  } catch {\n    // localStorage full or unavailable\n  }\n};\n\ntype ReturnType = {\n  entries: HistoryEntry[];\n  addEntry: (entry: Omit<HistoryEntry, 'id' | 'timestamp'>) => void;\n  clearHistory: () => void;\n  clearHistoryForType: (templateType: string) => void;\n};\n\nexport const useQueryHistory = (instanceId: string): ReturnType => {\n  const [entries, setEntries] = useState<HistoryEntry[]>(() => readEntries(instanceId));\n\n  const addEntry = useCallback(\n    (entry: Omit<HistoryEntry, 'id' | 'timestamp'>) => {\n      const newEntry: HistoryEntry = {\n        ...entry,\n        id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n        timestamp: Date.now(),\n      };\n      setEntries(prev => {\n        const updated = [newEntry, ...prev].slice(0, MAX_ENTRIES);\n        writeEntries(instanceId, updated);\n        return updated;\n      });\n    },\n    [instanceId]\n  );\n\n  const clearHistory = useCallback(() => {\n    setEntries([]);\n    writeEntries(instanceId, []);\n  }, [instanceId]);\n\n  const clearHistoryForType = useCallback(\n    (templateType: string) => {\n      setEntries(prev => {\n        const updated = prev.filter(e => e.templateType !== templateType);\n        writeEntries(instanceId, updated);\n        return updated;\n      });\n    },\n    [instanceId]\n  );\n\n  return { entries, addEntry, clearHistory, clearHistoryForType };\n};\n","import type { ApolloClient } from '@apollo/client';\n\nfunction escapeShellArg(str: string): string {\n  return str.replace(/'/g, \"'\\\\''\");\n}\n\ntype GenerateCurlParams = {\n  url: string;\n  method: string;\n  headers?: Record<string, string>;\n  body?: string;\n};\n\nexport function generateCurl({ url, method, headers, body }: GenerateCurlParams): string {\n  const parts: string[] = [`curl -X ${method} '${escapeShellArg(url)}'`];\n\n  if (headers) {\n    for (const [key, value] of Object.entries(headers)) {\n      if (key.trim()) {\n        parts.push(`-H '${escapeShellArg(`${key}: ${value}`)}'`);\n      }\n    }\n  }\n\n  if (body && method !== 'GET') {\n    parts.push(`-d '${escapeShellArg(body)}'`);\n  }\n\n  return parts.join(' \\\\\\n  ');\n}\n\ntype GenerateGraphQLCurlParams = {\n  endpoint: string;\n  query: string;\n  variables?: string;\n};\n\nexport function generateGraphQLCurl({ endpoint, query, variables }: GenerateGraphQLCurlParams): string {\n  const bodyObj: Record<string, unknown> = { query };\n\n  if (variables) {\n    try {\n      bodyObj.variables = JSON.parse(variables);\n    } catch {\n      // If variables aren't valid JSON, include as-is\n      bodyObj.variables = variables;\n    }\n  }\n\n  return generateCurl({\n    url: endpoint,\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(bodyObj),\n  });\n}\n\nexport function getApolloUri(client: ApolloClient<unknown>): string {\n  try {\n    return (client as any).link?.options?.uri ?? '';\n  } catch {\n    return '';\n  }\n}\n","//lib\nimport { useCallback } from 'react';\nimport { useCopyToClipboard } from 'react-use';\n\n//components\nimport { InputEditor } from '../queryExecutor/components/inputEditor';\nimport { VariableEditor } from '../queryExecutor/components/variableEditor';\nimport { OutputEditor } from '../queryExecutor/components/outputEditor';\nimport { MutationSelector } from './components/mutationSelector';\nimport { ExecutionStats } from '../executionStats';\nimport { QueryHistory } from '../queryHistory';\nimport { VscSend, VscTerminal } from 'react-icons/vsc';\nimport { Button } from '~/shared/button';\n\n//hooks\nimport { useMutationExecutor } from './hooks/useMutationExecutor';\nimport { useHistory } from '~/context/HistoryContext';\n\n//utils\nimport { generateGraphQLCurl, getApolloUri } from '~/utils/generateCurl';\n\n//constants\nimport { Template } from '~/constants/template';\n\n//types\nimport { MutationExecutorConfig } from '~/types';\nimport { HistoryEntry } from '../queryHistory/types';\n\nconst QUERY_CONTAINER_CLASSNAME = 'flex-1 flex-grow-2';\nconst VARIABLE_CONTAINER_CLASSNAME = 'flex-1';\n\nexport const MutationExecutor = ({ config, tabId }: { config: MutationExecutorConfig; tabId: string }) => {\n  const { entries, addEntry, clearHistory } = useHistory(Template.MUTATION_EXECUTOR);\n\n  const onExecutionComplete = useCallback(\n    (data: { queryText: string; variables: string; result: string; responseTimeMs: number }) => {\n      addEntry({ ...data, templateId: config.id, templateType: Template.MUTATION_EXECUTOR });\n    },\n    [addEntry, config.id]\n  );\n\n  const { onInputMount, onOutputMount, onVariableMount, onSubmit, loading, onMutationSelect, stats, inputEditorRef, variableEditorRef } =\n    useMutationExecutor({ config, tabId, onExecutionComplete });\n\n  const [, copyToClipboard] = useCopyToClipboard();\n\n  const handleCopyCurl = useCallback(() => {\n    const query = inputEditorRef.current?.getValue() ?? '';\n    const variables = variableEditorRef.current?.getValue() ?? '';\n    const endpoint = getApolloUri(config.client);\n    const curl = generateGraphQLCurl({ endpoint, query, variables: variables || undefined });\n    copyToClipboard(curl);\n  }, [inputEditorRef, variableEditorRef, config.client, copyToClipboard]);\n\n  const onHistorySelect = useCallback(\n    (entry: HistoryEntry) => {\n      onMutationSelect({ mutation: entry.queryText, variables: entry.variables, output: entry.result });\n    },\n    [onMutationSelect]\n  );\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <div className=\"flex-none flex gap-3\">\n          <MutationSelector config={config} onChange={onMutationSelect} className=\"flex-1\" />\n          <QueryHistory entries={entries} onSelect={onHistorySelect} onClear={clearHistory} />\n          <Button className=\"flex-none\" size=\"xs\" tooltipContent=\"Copy as cURL\" onClick={handleCopyCurl} icon>\n            <VscTerminal size={16} />\n          </Button>\n          <Button className=\"flex-none\" size=\"xs\" tooltipContent=\"Execute\" onClick={onSubmit} icon>\n            <VscSend />\n          </Button>\n        </div>\n        <InputEditor\n          title={config.config?.input?.title ?? 'Mutation'}\n          onSubmit={onSubmit}\n          className={QUERY_CONTAINER_CLASSNAME}\n          onMount={onInputMount}\n        />\n        <VariableEditor\n          title={config.config?.variable?.title}\n          onSubmit={onSubmit}\n          className={VARIABLE_CONTAINER_CLASSNAME}\n          onMount={onVariableMount}\n        />\n      </div>\n      <div className=\"flex-1 relative\">\n        <OutputEditor\n          title={config.config?.output?.title}\n          readOnly={config.config?.output?.readOnly}\n          className=\"h-full\"\n          onMount={onOutputMount}\n          loading={loading}\n        />\n        {stats && <ExecutionStats stats={stats} />}\n      </div>\n    </div>\n  );\n};\n","//lib\nimport { memo } from 'react';\n\n//components\nimport { Select } from '~/shared/select';\n\n//hooks\nimport { useMutationSelector } from './hooks/useMutationSelector';\n\n//types\nimport { MutationExecutorConfig } from '~/types';\nimport { OnMutationSelect } from '../../types';\n\ntype Props = {\n  config: MutationExecutorConfig;\n  onChange: OnMutationSelect;\n  className?: string;\n};\n\nconst MutationSelector = ({ config, onChange, className }: Props) => {\n  const { selectedOption, onOptionSelect } = useMutationSelector({ onChange });\n\n  return (\n    <Select\n      options={config.mutations ?? []}\n      value={selectedOption}\n      placeholder=\"Select Mutation...\"\n      className={className}\n      size=\"xs\"\n      onChange={onOptionSelect}\n    />\n  );\n};\n\nconst MemoizedMutationSelector = memo(MutationSelector);\n\nexport { MemoizedMutationSelector as MutationSelector };\n","//lib\nimport { useCallback, useState } from 'react';\nimport { DocumentNode, print } from 'graphql';\n\n//utils\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\n//types\nimport { Option } from '~/shared/select';\nimport { OnMutationSelect } from '~/components/mutationExecutor/types';\n\ntype Params = {\n  onChange: OnMutationSelect;\n};\n\ntype ReturnType = {\n  selectedOption: Option | undefined;\n  onOptionSelect: (option: Option) => void;\n};\n\nexport const useMutationSelector = ({ onChange }: Params): ReturnType => {\n  const [selectedOption, setSelectedOption] = useState<Option>();\n\n  const onOptionSelect = useCallback(\n    async (option: Option) => {\n      setSelectedOption(option);\n      const { node, variables = {} } = option as Option & { node: DocumentNode; variables?: object };\n      onChange({\n        mutation: print(node),\n        variables: prettifyJSON(variables),\n      });\n    },\n    [onChange]\n  );\n\n  return {\n    selectedOption,\n    onOptionSelect,\n  };\n};\n","//lib\nimport { useCallback } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//hooks\nimport { useGraphQLExecutor } from '~/hooks/useGraphQLExecutor';\n\n//constants\nimport { Template } from '~/constants/template';\n\n//types\nimport { MutationExecutorConfig } from '~/types';\nimport { OnMutationSelect } from '../types';\nimport { ExecutionStatsData } from '~/components/executionStats/types';\nimport { MonacoEditorType } from '~/monaco';\n\ntype ExecutionResult = {\n  queryText: string;\n  variables: string;\n  result: string;\n  responseTimeMs: number;\n};\n\ntype Params = {\n  config: MutationExecutorConfig;\n  tabId: string;\n  onExecutionComplete?: (data: ExecutionResult) => void;\n};\n\ntype ReturnType = {\n  onInputMount: OnMount;\n  onVariableMount: OnMount;\n  onOutputMount: OnMount;\n  onSubmit: () => void;\n  loading: boolean;\n  stats: ExecutionStatsData | null;\n  onMutationSelect: OnMutationSelect;\n  inputEditorRef: React.MutableRefObject<MonacoEditorType | undefined>;\n  variableEditorRef: React.MutableRefObject<MonacoEditorType | undefined>;\n};\n\nexport const useMutationExecutor = ({ config, tabId, onExecutionComplete }: Params): ReturnType => {\n  const {\n    onSelect,\n    onInputMount,\n    onVariableMount,\n    onOutputMount,\n    onSubmit,\n    loading,\n    stats,\n    inputEditorRef,\n    variableEditorRef,\n  } = useGraphQLExecutor({\n    tabStateType: Template.MUTATION_EXECUTOR,\n    client: config.client,\n    tabId,\n    onExecutionComplete,\n  });\n\n  const onMutationSelect = useCallback<OnMutationSelect>(\n    ({ mutation, variables, output }) => onSelect({ input: mutation, variables, output }),\n    [onSelect]\n  );\n\n  return {\n    onInputMount,\n    onVariableMount,\n    onOutputMount,\n    onSubmit,\n    loading,\n    stats,\n    onMutationSelect,\n    inputEditorRef,\n    variableEditorRef,\n  };\n};\n","//lib\nimport { memo, useMemo } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//components\nimport { Snippet } from '~/components/snippet';\n\ntype Props = {\n  title?: string;\n  readOnly?: boolean;\n  onMount: OnMount;\n  className?: string;\n  loading?: boolean;\n};\n\nconst OutputEditor = ({ title, readOnly, onMount, className, loading }: Props) => {\n  const editorProps = useMemo(() => ({ onMount, readOnly }), [onMount, readOnly]);\n\n  return <Snippet editorProps={editorProps} title={title ?? 'Output'} className={className} loading={loading} />;\n};\n\nconst MemoizedOutputEditor = memo(OutputEditor);\n\nexport { MemoizedOutputEditor as OutputEditor };\n","// lib\nimport { ComponentType, KeyboardEvent, memo, useCallback } from 'react';\n\n// components\nimport { FormFieldType } from '~/constants/formFieldTypes';\nimport { TextInput } from './components/TextInput';\nimport { NumberInput } from './components/NumberInput';\nimport { JSONInput } from './components/JSONInput';\nimport { Button } from '~/shared/button/Button';\n\n//types\nimport { FieldConfigMap, FormLayout } from '~/types';\nimport { ActionType, OnFormAction } from './actionType';\nimport { FormErrors, FormFieldComponentProps, FormValues } from './types';\n\nconst FIELD_TYPE_VS_COMPONENT: Record<FormFieldType, ComponentType<FormFieldComponentProps>> = {\n  [FormFieldType.TEXT]: TextInput,\n  [FormFieldType.NUMBER]: NumberInput,\n  [FormFieldType.JSON]: JSONInput,\n};\n\ntype FormProps = {\n  layout: FormLayout;\n  fieldConfigMap: FieldConfigMap;\n  values: FormValues;\n  errors: FormErrors;\n  onAction: OnFormAction;\n  loading?: boolean;\n};\n\nconst Arranger = ({ layout, fieldConfigMap, errors, values, onAction }: FormProps) => {\n  const { fields, horizontal } = layout;\n\n  return (\n    <div className={`flex ${horizontal ? '' : 'flex-col'} gap-4`}>\n      {fields?.map(field => {\n        if (typeof field === 'string') {\n          const config = fieldConfigMap[field];\n          const Component = FIELD_TYPE_VS_COMPONENT[config.type];\n\n          return (\n            <div key={config.id} className={horizontal ? 'flex-1' : ''}>\n              <Component {...config} onAction={onAction} error={errors[config.id]} value={values[config.id]} />\n            </div>\n          );\n        }\n        return (\n          // eslint-disable-next-line react/jsx-key -- let it be default\n          <Arranger\n            layout={field}\n            fieldConfigMap={fieldConfigMap}\n            values={values}\n            errors={errors}\n            onAction={onAction}\n          />\n        );\n      })}\n    </div>\n  );\n};\n\nconst MemoizedArranger = memo(Arranger);\n\nconst Form = ({ layout, fieldConfigMap, values, errors, onAction, loading }: FormProps): JSX.Element => {\n  const onSubmit = useCallback(() => {\n    onAction({ type: ActionType.ON_SUBMIT });\n  }, [onAction]);\n\n  const onKeyDown = useCallback(\n    (e: KeyboardEvent) => {\n      if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n        e.preventDefault();\n        onSubmit();\n      }\n    },\n    [onSubmit]\n  );\n\n  return (\n    <div className=\"h-full\" onKeyDown={onKeyDown}>\n      <MemoizedArranger\n        layout={layout}\n        fieldConfigMap={fieldConfigMap}\n        values={values}\n        errors={errors}\n        onAction={onAction}\n      />\n      <div className=\"flex justify-center mt-8\">\n        <Button onClick={onSubmit} loading={loading}>\n          Submit\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nconst MemoizedForm = memo(Form);\n\nexport { MemoizedForm as Form };\n","export enum FormFieldType {\n  TEXT = 'TEXT',\n  NUMBER = 'NUMBER',\n  JSON = 'JSON',\n}\n","//lib\nimport { ChangeEvent, memo, useCallback } from 'react';\n\n//components\nimport { Input } from '~/shared/input';\nimport { FormControl } from './FormControl';\n\n//hooks\nimport { useFormField } from '../hooks/useFormField';\n\n//types\nimport { FormFieldComponentProps } from '../types';\n\nconst TextInput = ({ id, label, onAction, error, readOnly, required, value, placeholder }: FormFieldComponentProps) => {\n  const { onBlur, onChange } = useFormField(id, onAction);\n\n  const handleChange = useCallback(\n    (ev: ChangeEvent<HTMLInputElement>) => {\n      onChange(ev.target.value);\n    },\n    [onChange]\n  );\n\n  return (\n    <FormControl onBlur={onBlur} label={label} required={required} error={error}>\n      <Input\n        onChange={handleChange}\n        error={!!error}\n        value={value}\n        placeholder={placeholder ?? label}\n        disabled={readOnly}\n      />\n    </FormControl>\n  );\n};\n\nconst MemoizedTextInput = memo(TextInput);\n\nexport { MemoizedTextInput as TextInput };\n","import { Typography } from '~/shared/typography';\nimport { ReactNode } from 'react';\n\ntype Props = {\n  onBlur?: () => void;\n  label?: string;\n  error?: string;\n  children: ReactNode;\n  required?: boolean;\n};\n\nexport const FormControl = ({ onBlur, error, label, children, required }: Props): JSX.Element => {\n  return (\n    <div onBlur={onBlur}>\n      {label ? (\n        <div className=\"flex items-center gap-1 mb-1\">\n          <Typography>{label} </Typography>\n          {required ? <div className=\"h-1 w-1 expr-support-error rounded-full\" /> : null}\n        </div>\n      ) : null}\n      {children}\n      {error ? <Typography className=\"expr-support-error-text\">{error}</Typography> : null}\n    </div>\n  );\n};\n","//lib\nimport { useCallback } from 'react';\n\n//constants\nimport { ActionType, OnFormAction } from '../actionType';\n\ntype ReturnType = {\n  onBlur: () => void;\n  onChange: (value: any) => void;\n};\n\nexport const useFormField = (fieldId: string, onAction: OnFormAction): ReturnType => {\n  const onBlur = useCallback(() => {\n    onAction({ type: ActionType.ON_FIELD_BLUR, payload: { fieldId } });\n  }, [fieldId, onAction]);\n\n  const onChange = useCallback(\n    (value: any) => {\n      onAction({ type: ActionType.ON_CHANGE, payload: { fieldId, value } });\n    },\n    [fieldId, onAction]\n  );\n\n  return { onBlur, onChange };\n};\n","//lib\nimport { ChangeEvent, memo, useCallback } from 'react';\n\n//components\nimport { Input } from '~/shared/input';\nimport { FormControl } from './FormControl';\n\n//hooks\nimport { useFormField } from '../hooks/useFormField';\nimport { FormFieldComponentProps } from '../types';\n\nconst NumberInput = ({\n  id,\n  label,\n  onAction,\n  error,\n  readOnly,\n  required,\n  value,\n  placeholder,\n}: FormFieldComponentProps) => {\n  const { onBlur, onChange } = useFormField(id, onAction);\n\n  const handleChange = useCallback(\n    (ev: ChangeEvent<HTMLInputElement>) => {\n      if (ev.target.value) {\n        onChange(Number(ev.target.value));\n      } else {\n        onChange(undefined);\n      }\n    },\n    [onChange]\n  );\n\n  return (\n    <FormControl onBlur={onBlur} label={label} required={required} error={error}>\n      <Input\n        type=\"number\"\n        onChange={handleChange}\n        error={!!error}\n        value={value}\n        placeholder={placeholder ?? label}\n        disabled={readOnly}\n      />\n    </FormControl>\n  );\n};\n\nconst MemoizedNumberInput = memo(NumberInput);\n\nexport { MemoizedNumberInput as NumberInput };\n","//lib\nimport { memo, useMemo, useRef } from 'react';\nimport MonacoEditor from '@monaco-editor/react';\n\n//components\nimport { FormControl } from './FormControl';\nimport { FullSizeLoader } from '~/components/snippet/components/FullSizeLoader';\n\n//hooks\nimport { useFormField } from '../hooks/useFormField';\nimport { useValidateJSON } from '~/hooks/useValidateJSON';\n\n//utils\nimport { getMonacoConfig } from '~/components/snippet/utils';\n\n//constants\nimport { Language } from '~/constants/language';\n\n//types\nimport { FormFieldComponentProps } from '../types';\n\nconst JSONInput = ({ id, label, onAction, error, readOnly, required, value }: FormFieldComponentProps) => {\n  const { onBlur, onChange } = useFormField(id, onAction);\n\n  const monacoConfig = useMemo(() => getMonacoConfig({ readOnly }), [readOnly]);\n\n  const valueRef = useRef(value?.toString());\n\n  const { errors: validationErrors, handleChange } = useValidateJSON({ onChange });\n\n  return (\n    <FormControl error={error} onBlur={onBlur} required={required} label={label}>\n      <div\n        className=\"py-2 rounded-8 expr-ui-01 border-1 border-solid\"\n        style={{ borderColor: validationErrors ? 'var(--expr-support-error)' : 'var(--expr-border-03)' }}\n      >\n        <MonacoEditor\n          language={Language.JSON}\n          options={monacoConfig}\n          height={300}\n          loading={<FullSizeLoader />}\n          onChange={handleChange}\n          value={valueRef.current}\n        />\n      </div>\n    </FormControl>\n  );\n};\n\nconst MemoizedJSONInput = memo(JSONInput);\n\nexport { MemoizedJSONInput as JSONInput };\n","//lib\nimport { useCallback, useRef, useState } from 'react';\n\n//constants\nimport { ActionType, OnFormAction } from '../actionType';\n\n//types\nimport { FieldConfigMap } from '~/types';\nimport { FormErrors, FormValues } from '../types';\n\ntype Params = {\n  fieldConfigMap: FieldConfigMap;\n  validator?: (o: FormValues) => FormErrors;\n  initialValues?: FormValues;\n  onSubmit: (vals: FormValues) => void;\n};\n\ntype ReturnType = {\n  values: Record<string, string | number>;\n  onAction: OnFormAction;\n  errors: Record<string, string>;\n};\n\nexport const useForm = ({ fieldConfigMap, validator, initialValues, onSubmit }: Params): ReturnType => {\n  const [values, setValues] = useState<FormValues>(initialValues ?? {});\n  const [errors, setErrors] = useState<Record<string, string>>({});\n\n  const submitCountRef = useRef<number>(0);\n\n  const defaultValidator = useCallback(\n    (vals: FormValues) => {\n      return Object.keys(fieldConfigMap).reduce((acc, key) => {\n        const fieldConfig = fieldConfigMap[key];\n        if (fieldConfig.required && !vals[key]?.toString().trim()) {\n          return { ...acc, [key]: 'This field cannot be empty!!' };\n        }\n        return acc;\n      }, {} as FormErrors);\n    },\n    [fieldConfigMap]\n  );\n\n  const latestValuesRef = useRef(values);\n  latestValuesRef.current = values;\n\n  const onAction = useCallback<OnFormAction>(\n    action => {\n      switch (action.type) {\n        case ActionType.ON_FIELD_BLUR: {\n          break;\n        }\n        case ActionType.ON_CHANGE: {\n          const newVals = { ...latestValuesRef.current, [action.payload.fieldId]: action.payload.value };\n          setValues(newVals);\n          if (submitCountRef.current) {\n            const validationErrors = (validator ?? defaultValidator)(newVals);\n            setErrors(validationErrors);\n          }\n\n          break;\n        }\n        case ActionType.ON_SUBMIT: {\n          submitCountRef.current++;\n          const validationErrors = (validator ?? defaultValidator)(latestValuesRef.current);\n          if (Object.keys(validationErrors).length) {\n            setErrors(validationErrors);\n          } else {\n            onSubmit(latestValuesRef.current);\n          }\n          break;\n        }\n      }\n    },\n    [defaultValidator, onSubmit, validator]\n  );\n\n  return { values, errors, onAction };\n};\n","//lib\nimport { useCallback } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//hooks\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\nimport { useGraphQLExecution } from '~/hooks/useGraphQLExecution';\n\n//types\nimport { CustomQueryConfig } from '~/types';\nimport { FormValues } from '~/components/form/types';\nimport { ExecutionStatsData } from '~/components/executionStats/types';\n\ntype Params = {\n  config: CustomQueryConfig;\n};\n\ntype ReturnType = {\n  loading: boolean;\n  stats: ExecutionStatsData | null;\n  onSubmit: (vals: FormValues) => void;\n  onOutputEditorMount: OnMount;\n};\n\nexport const useCustomQuery = ({ config }: Params): ReturnType => {\n  const { editorRef: outputEditorRef, onMount: onOutputEditorMount } = useMonacoMount();\n\n  const { getVariables, query, client } = config;\n\n  const executeFn = useCallback(\n    async (variables: any) => {\n      const { data, error } = await client.query({ query, variables, fetchPolicy: 'network-only' });\n      return { data, errorMessage: error?.message };\n    },\n    [client, query]\n  );\n\n  const { loading, stats, execute } = useGraphQLExecution({ executeFn, outputEditorRef });\n\n  const onSubmit = useCallback(\n    (vals: FormValues) => {\n      execute(getVariables(vals));\n    },\n    [execute, getVariables]\n  );\n\n  return { loading, stats, onSubmit, onOutputEditorMount };\n};\n","//components\nimport { OutputEditor } from './components/OutputEditor';\nimport { ExecutionStats } from '../executionStats';\nimport { Form, useForm } from '../form';\n\n//hooks\nimport { useCustomQuery } from './hooks/useCustomQuery';\n\n//types\nimport { CustomQueryConfig } from '~/types';\n\nexport const CustomQuery = ({ config }: { config: CustomQueryConfig }) => {\n  const { fieldConfigMap, formLayout, validator, initialValues, outputConfig } = config;\n\n  const { loading, stats, onSubmit, onOutputEditorMount } = useCustomQuery({ config });\n\n  const { onAction, values, errors } = useForm({ fieldConfigMap, validator, initialValues, onSubmit });\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <Form\n          fieldConfigMap={fieldConfigMap}\n          layout={formLayout}\n          values={values}\n          errors={errors}\n          onAction={onAction}\n          loading={loading}\n        />\n      </div>\n      <div className=\"flex-1 relative\">\n        <OutputEditor\n          title=\"Output\"\n          readOnly={outputConfig?.readOnly ?? true}\n          className=\"h-full\"\n          onMount={onOutputEditorMount}\n          loading={loading}\n        />\n        {stats && <ExecutionStats stats={stats} />}\n      </div>\n    </div>\n  );\n};\n","//lib\nimport { useCallback } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\n//hooks\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\nimport { useGraphQLExecution } from '~/hooks/useGraphQLExecution';\n\n//types\nimport { CustomMutationConfig } from '~/types';\nimport { FormValues } from '~/components/form/types';\nimport { ExecutionStatsData } from '~/components/executionStats/types';\n\ntype Params = {\n  config: CustomMutationConfig;\n};\n\ntype ReturnType = {\n  loading: boolean;\n  stats: ExecutionStatsData | null;\n  onSubmit: (vals: FormValues) => void;\n  onOutputEditorMount: OnMount;\n};\n\nexport const useCustomMutation = ({ config }: Params): ReturnType => {\n  const { editorRef: outputEditorRef, onMount: onOutputEditorMount } = useMonacoMount();\n\n  const { getVariables, mutation, client } = config;\n\n  const executeFn = useCallback(\n    async (variables: any) => {\n      const { data, errors } = await client.mutate({ mutation, variables });\n      return { data, errorMessage: errors?.[0]?.message };\n    },\n    [client, mutation]\n  );\n\n  const { loading, stats, execute } = useGraphQLExecution({ executeFn, outputEditorRef });\n\n  const onSubmit = useCallback(\n    (vals: FormValues) => {\n      execute(getVariables(vals));\n    },\n    [execute, getVariables]\n  );\n\n  return { loading, stats, onSubmit, onOutputEditorMount };\n};\n","//components\nimport { OutputEditor } from '../customQuery/components/OutputEditor';\nimport { ExecutionStats } from '../executionStats';\nimport { Form, useForm } from '../form';\n\n//hooks\nimport { useCustomMutation } from './hooks/useCustomMutation';\n\n//types\nimport { CustomMutationConfig } from '~/types';\n\nexport const CustomMutation = ({ config }: { config: CustomMutationConfig }) => {\n  const { fieldConfigMap, formLayout, validator, initialValues, outputConfig } = config;\n\n  const { loading, stats, onSubmit, onOutputEditorMount } = useCustomMutation({ config });\n\n  const { onAction, values, errors } = useForm({ fieldConfigMap, validator, initialValues, onSubmit });\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <Form\n          fieldConfigMap={fieldConfigMap}\n          layout={formLayout}\n          values={values}\n          errors={errors}\n          onAction={onAction}\n          loading={loading}\n        />\n      </div>\n      <div className=\"flex-1 relative\">\n        <OutputEditor\n          title=\"Output\"\n          readOnly={outputConfig?.readOnly ?? true}\n          className=\"h-full\"\n          onMount={onOutputEditorMount}\n          loading={loading}\n        />\n        {stats && <ExecutionStats stats={stats} />}\n      </div>\n    </div>\n  );\n};\n","//lib\nimport { useMemo } from 'react';\n\n//components\nimport { Form } from '../form';\nimport { Snippet } from '../snippet';\nimport { ExecutionStats } from '../executionStats';\n\n//hooks\nimport { useFetchAndMutate } from './hooks/useFetchAndMutate';\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\n//types\nimport { FetchAndMutateConfig } from '~/types';\n\nconst SNIPPET_CLASSNAME = 'flex-1 flex-grow-2';\n\nexport const FetchAndMutate = ({ config }: { config: FetchAndMutateConfig }) => {\n  const {\n    fetchConfig: { fieldConfigMap, formLayout, initialValues, validator, output: queryOutput },\n    mutateConfig: { output: mutationOutput },\n  } = config;\n\n  const { editorRef: queryOutputEditorRef, onMount: onQueryOutputEditorMount } = useMonacoMount();\n  const { editorRef: mutationOutputEditorRef, onMount: onMutationOutputEditorMount } = useMonacoMount();\n\n  const {\n    fetching,\n    mutating,\n\n    fetchStats,\n    mutateStats,\n\n    queryActions,\n    onQueryActionClick,\n\n    queryResponseErrors,\n    handleQueryResponseChange,\n\n    onAction,\n    formErrors,\n    formValues,\n  } = useFetchAndMutate({ config, queryOutputEditorRef, mutationOutputEditorRef });\n\n  const queryOutputEditorProps = useMemo(\n    () => ({ onMount: onQueryOutputEditorMount, onChange: handleQueryResponseChange }),\n    [handleQueryResponseChange, onQueryOutputEditorMount]\n  );\n\n  const mutationOutputEditorProps = useMemo(\n    () => ({ onMount: onMutationOutputEditorMount }),\n    [onMutationOutputEditorMount]\n  );\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <Form\n          fieldConfigMap={fieldConfigMap}\n          layout={formLayout}\n          values={formValues}\n          errors={formErrors}\n          onAction={onAction}\n          loading={fetching}\n        />\n      </div>\n      <div className={`${SNIPPET_CLASSNAME} relative`}>\n        <Snippet\n          title={queryOutput?.title ?? 'Output'}\n          className=\"h-full\"\n          editorProps={queryOutputEditorProps}\n          loading={fetching}\n          actions={queryActions}\n          errors={queryResponseErrors}\n          onActionClick={onQueryActionClick}\n        />\n        {fetchStats && <ExecutionStats stats={fetchStats} />}\n      </div>\n      <div className={`${SNIPPET_CLASSNAME} relative`}>\n        <Snippet\n          editorProps={mutationOutputEditorProps}\n          title={mutationOutput?.title ?? 'Response'}\n          className=\"h-full\"\n          loading={mutating}\n        />\n        {mutateStats && <ExecutionStats stats={mutateStats} />}\n      </div>\n    </div>\n  );\n};\n","//lib\nimport { MutableRefObject, useCallback, useMemo, useRef, useState } from 'react';\nimport { OnChange } from '@monaco-editor/react';\n\n//components\nimport { VscSend } from 'react-icons/vsc';\n\n//hooks\nimport { useValidateJSON } from '~/hooks/useValidateJSON';\nimport { useForm } from '~/components/form';\nimport { useGraphQLExecution } from '~/hooks/useGraphQLExecution';\n\n//types\nimport { FetchAndMutateConfig } from '~/types';\nimport { FormValues } from '~/components/form/types';\nimport { Action } from '~/components/snippet/types';\nimport { MonacoEditorType } from '~/monaco';\nimport { OnFormAction } from '~/components/form/actionType';\nimport { ExecutionStatsData } from '~/components/executionStats/types';\n\ntype Params = {\n  config: FetchAndMutateConfig;\n\n  queryOutputEditorRef: MutableRefObject<MonacoEditorType | undefined>;\n  mutationOutputEditorRef: MutableRefObject<MonacoEditorType | undefined>;\n};\n\ntype ReturnType = {\n  fetching: boolean;\n  mutating: boolean;\n\n  fetchStats: ExecutionStatsData | null;\n  mutateStats: ExecutionStatsData | null;\n\n  queryActions: Action[];\n  onQueryActionClick: (action: string) => void;\n\n  queryResponseErrors: boolean;\n  handleQueryResponseChange: OnChange;\n\n  onAction: OnFormAction;\n  formValues: Record<string, string | number>;\n  formErrors: Record<string, string>;\n};\n\nconst EXECUTE_MUTATION = 'EXECUTE_MUTATION';\n\nexport const useFetchAndMutate = ({ config, mutationOutputEditorRef, queryOutputEditorRef }: Params): ReturnType => {\n  const [isQueryExecuted, setIsQueryExecuted] = useState(false);\n\n  const { errors: queryResponseErrors, handleChange: handleQueryResponseChange } = useValidateJSON();\n\n  const {\n    fetchConfig: { fieldConfigMap, initialValues, validator, getVariables: getQueryVariables, query, cta },\n    mutateConfig: { getVariables: getMutationVariables, mutation },\n    client,\n  } = config;\n\n  const fetchExecuteFn = useCallback(\n    async (variables: any) => {\n      const { data, error } = await client.query({ query, variables, fetchPolicy: 'network-only' });\n      return { data, errorMessage: error?.message };\n    },\n    [client, query]\n  );\n\n  const mutateExecuteFn = useCallback(\n    async (variables: any) => {\n      const { data, errors } = await client.mutate({ mutation, variables });\n      return { data, errorMessage: errors?.[0]?.message };\n    },\n    [client, mutation]\n  );\n\n  const {\n    loading: fetching,\n    stats: fetchStats,\n    execute: executeFetch,\n  } = useGraphQLExecution({ executeFn: fetchExecuteFn, outputEditorRef: queryOutputEditorRef });\n\n  const {\n    loading: mutating,\n    stats: mutateStats,\n    execute: executeMutate,\n  } = useGraphQLExecution({ executeFn: mutateExecuteFn, outputEditorRef: mutationOutputEditorRef });\n\n  const onFetchSubmit = useCallback(\n    async (vals: FormValues) => {\n      const variables = getQueryVariables(vals);\n      const result = await executeFetch(variables);\n      if (result) {\n        setIsQueryExecuted(true);\n      }\n    },\n    [getQueryVariables, executeFetch]\n  );\n\n  const {\n    onAction,\n    values: formValues,\n    errors: formErrors,\n  } = useForm({ fieldConfigMap, validator, initialValues, onSubmit: onFetchSubmit });\n\n  const latestFormValuesRef = useRef(formValues);\n  latestFormValuesRef.current = formValues;\n\n  const onQueryActionClick = useCallback(\n    async (action: string) => {\n      switch (action) {\n        case EXECUTE_MUTATION: {\n          const mutationVariables = getMutationVariables(\n            JSON.parse(queryOutputEditorRef.current!.getValue() ?? ''),\n            latestFormValuesRef.current\n          );\n          await executeMutate(mutationVariables);\n          break;\n        }\n        default:\n          break;\n      }\n    },\n    [getMutationVariables, queryOutputEditorRef, executeMutate]\n  );\n\n  const queryActions = useMemo<Action[]>(\n    () => [\n      {\n        id: EXECUTE_MUTATION,\n        label: cta?.label ?? 'Execute',\n        Icon: VscSend,\n        type: 'cta',\n        disabled: !isQueryExecuted || queryResponseErrors,\n      },\n    ],\n    [cta?.label, isQueryExecuted, queryResponseErrors]\n  );\n\n  return {\n    fetching,\n    mutating,\n\n    fetchStats,\n    mutateStats,\n\n    queryActions,\n    onQueryActionClick,\n\n    queryResponseErrors,\n    handleQueryResponseChange,\n\n    onAction,\n    formValues,\n    formErrors,\n  };\n};\n","// lib\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\n// components\nimport { Snippet } from '~/components/snippet';\n\n// hooks\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\n// utils\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\n// constants\nimport { INTROSPECTION_QUERY } from './query';\n\n// types\nimport { SchemaViewerConfig } from '~/types';\n\nexport const SchemaViewer = ({ config }: { config: SchemaViewerConfig }): JSX.Element => {\n  const [loading, setLoading] = useState(true);\n\n  const { editorRef, onMount } = useMonacoMount();\n\n  const fetchSchema = useCallback(async () => {\n    setLoading(true);\n    try {\n      const result = await config.client.query({ query: INTROSPECTION_QUERY });\n      const formatted = prettifyJSON(result.data);\n      editorRef.current?.setValue(formatted);\n    } catch (err: unknown) {\n      const errMsg = err instanceof Error ? err.message : 'Failed to fetch schema';\n      editorRef.current?.setValue(errMsg);\n    } finally {\n      setLoading(false);\n    }\n  }, [config.client, editorRef]);\n\n  useEffect(() => {\n    fetchSchema();\n  }, [fetchSchema]);\n\n  const editorProps = useMemo(() => ({ onMount, readOnly: true }), [onMount]);\n\n  return <Snippet title=\"Schema\" editorProps={editorProps} loading={loading} />;\n};\n","import { gql } from '@apollo/client';\n\nexport const INTROSPECTION_QUERY = gql`\n  query IntrospectionQuery {\n    __schema {\n      queryType {\n        name\n      }\n      mutationType {\n        name\n      }\n      subscriptionType {\n        name\n      }\n      types {\n        name\n        kind\n        description\n        fields {\n          name\n          description\n          type {\n            name\n            kind\n            ofType {\n              name\n              kind\n              ofType {\n                name\n                kind\n                ofType {\n                  name\n                  kind\n                  ofType {\n                    name\n                    kind\n                    ofType {\n                      name\n                      kind\n                      ofType {\n                        name\n                        kind\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n          args {\n            name\n            description\n            defaultValue\n            type {\n              name\n              kind\n              ofType {\n                name\n                kind\n                ofType {\n                  name\n                  kind\n                  ofType {\n                    name\n                    kind\n                    ofType {\n                      name\n                      kind\n                      ofType {\n                        name\n                        kind\n                        ofType {\n                          name\n                          kind\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        inputFields {\n          name\n          description\n          defaultValue\n          type {\n            name\n            kind\n            ofType {\n              name\n              kind\n              ofType {\n                name\n                kind\n                ofType {\n                  name\n                  kind\n                  ofType {\n                    name\n                    kind\n                    ofType {\n                      name\n                      kind\n                      ofType {\n                        name\n                        kind\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        interfaces {\n          name\n          kind\n          ofType {\n            name\n            kind\n            ofType {\n              name\n              kind\n              ofType {\n                name\n                kind\n                ofType {\n                  name\n                  kind\n                  ofType {\n                    name\n                    kind\n                    ofType {\n                      name\n                      kind\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        enumValues {\n          name\n          description\n        }\n        possibleTypes {\n          name\n          kind\n        }\n      }\n      directives {\n        name\n        description\n        locations\n        args {\n          name\n          description\n          defaultValue\n          type {\n            name\n            kind\n            ofType {\n              name\n              kind\n              ofType {\n                name\n                kind\n                ofType {\n                  name\n                  kind\n                  ofType {\n                    name\n                    kind\n                    ofType {\n                      name\n                      kind\n                      ofType {\n                        name\n                        kind\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n`;\n","//lib\nimport { useCallback } from 'react';\nimport { useCopyToClipboard } from 'react-use';\n\n//components\nimport { Snippet } from '~/components/snippet';\nimport { RequestBar } from './components/RequestBar';\nimport { HeadersEditor } from './components/HeadersEditor';\nimport { ResponsePanel } from './components/ResponsePanel';\nimport { VscTerminal } from 'react-icons/vsc';\n\n//hooks\nimport { useRestApi } from './hooks/useRestApi';\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\n//utils\nimport { generateCurl } from '~/utils/generateCurl';\n\n//constants\nimport { Language } from '~/constants/language';\n\n//types\nimport { RestApiConfig } from '~/types';\nimport type { Action } from '~/components/snippet/types';\n\nexport const RestApi = ({ config }: { config: RestApiConfig }) => {\n  const {\n    url,\n    setUrl,\n    method,\n    setMethod,\n    headers,\n    addHeader,\n    removeHeader,\n    updateHeader,\n    body,\n    setBody,\n    response,\n    loading,\n    stats,\n    execute,\n  } = useRestApi({\n    defaultUrl: config.defaultUrl,\n    defaultMethod: config.defaultMethod,\n    defaultHeaders: config.defaultHeaders,\n    defaultBody: config.defaultBody,\n  });\n\n  const { editorRef: responseEditorRef, onMount: onResponseMount } = useMonacoMount();\n\n  const [, copyToClipboard] = useCopyToClipboard();\n\n  const curlAction: Action = { id: 'CURL', label: 'Copy as cURL', Icon: VscTerminal };\n\n  const handleCurlAction = useCallback(\n    (action: string) => {\n      if (action !== 'CURL') return;\n      const headerObj: Record<string, string> = {};\n      headers.forEach((h) => {\n        if (h.key.trim()) headerObj[h.key.trim()] = h.value;\n      });\n      const curl = generateCurl({ url, method, headers: headerObj, body: method !== 'GET' ? body : undefined });\n      copyToClipboard(curl);\n    },\n    [url, method, headers, body, copyToClipboard]\n  );\n\n  const onBodyChange = useCallback(\n    (value?: string) => {\n      setBody(value ?? '');\n    },\n    [setBody]\n  );\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <RequestBar method={method} setMethod={setMethod} url={url} setUrl={setUrl} execute={execute} />\n        <HeadersEditor\n          headers={headers}\n          addHeader={addHeader}\n          removeHeader={removeHeader}\n          updateHeader={updateHeader}\n        />\n        <Snippet\n          title=\"Body\"\n          className=\"flex-1\"\n          editorProps={{\n            onChange: onBodyChange,\n            language: Language.JSON,\n          }}\n        />\n      </div>\n      <ResponsePanel\n        response={response}\n        loading={loading}\n        stats={stats}\n        responseEditorRef={responseEditorRef}\n        onResponseMount={onResponseMount}\n        actions={[curlAction]}\n        onActionClick={handleCurlAction}\n      />\n    </div>\n  );\n};\n","//lib\nimport { VscSend } from 'react-icons/vsc';\n\n//components\nimport { Button } from '~/shared/button/Button';\nimport { Input } from '~/shared/input';\nimport { Select } from '~/shared/select/Select';\n\n//types\nimport { HttpMethod } from '../types';\n\nconst HTTP_METHODS: HttpMethod[] = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'];\nconst HTTP_METHOD_OPTIONS = HTTP_METHODS.map(m => ({ id: m, label: m }));\n\ntype Props = {\n  method: HttpMethod;\n  setMethod: (method: HttpMethod) => void;\n  url: string;\n  setUrl: (url: string) => void;\n  execute: () => void;\n};\n\nexport const RequestBar = ({ method, setMethod, url, setUrl, execute }: Props) => (\n  <div className=\"flex-none flex gap-3 items-center\">\n    <div style={{ width: '120px' }}>\n      <Select\n        size=\"xs\"\n        options={HTTP_METHOD_OPTIONS}\n        value={HTTP_METHOD_OPTIONS.find(o => o.id === method)}\n        onChange={o => setMethod(o.id as HttpMethod)}\n      />\n    </div>\n    <Input className=\"flex-1\" placeholder=\"Enter URL\" value={url} onChange={e => setUrl(e.target.value)} />\n    <Button className=\"flex-none\" size=\"xs\" tooltipContent=\"Execute\" onClick={execute} icon>\n      <VscSend />\n    </Button>\n  </div>\n);\n","//lib\nimport { VscAdd, VscClose } from 'react-icons/vsc';\n\n//components\nimport { Button } from '~/shared/button/Button';\nimport { Input } from '~/shared/input';\nimport { Typography } from '~/shared/typography';\n\n//types\nimport { Header } from '../types';\n\ntype Props = {\n  headers: Header[];\n  addHeader: () => void;\n  removeHeader: (index: number) => void;\n  updateHeader: (index: number, field: 'key' | 'value', value: string) => void;\n};\n\nexport const HeadersEditor = ({ headers, addHeader, removeHeader, updateHeader }: Props) => (\n  <div className=\"flex-none flex flex-col gap-2\">\n    <div className=\"flex items-center gap-2\">\n      <Typography variant=\"h6\">Headers</Typography>\n      <Button size=\"xs\" variant=\"secondary\" onClick={addHeader} icon tooltipContent=\"Add Header\">\n        <VscAdd size={14} />\n      </Button>\n    </div>\n    {headers.map((header, index) => (\n      <div key={index} className=\"flex gap-2 items-center\">\n        <Input\n          size=\"xs\"\n          placeholder=\"Key\"\n          value={header.key}\n          onChange={e => updateHeader(index, 'key', e.target.value)}\n          className=\"flex-1\"\n        />\n        <Input\n          size=\"xs\"\n          placeholder=\"Value\"\n          value={header.value}\n          onChange={e => updateHeader(index, 'value', e.target.value)}\n          className=\"flex-1\"\n        />\n        <Button size=\"xs\" variant=\"secondary\" onClick={() => removeHeader(index)} icon tooltipContent=\"Remove\">\n          <VscClose size={14} />\n        </Button>\n      </div>\n    ))}\n  </div>\n);\n","//lib\nimport { useMemo } from 'react';\n\n//components\nimport { Snippet } from '~/components/snippet';\n\n//hooks\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\n//constants\nimport { Language } from '~/constants/language';\n\n//types\nimport type { RestApiStats } from '../types';\nimport type { OnMount } from '@monaco-editor/react';\nimport type { MutableRefObject } from 'react';\nimport type { MonacoEditorType } from '~/monaco';\nimport type { Action } from '~/components/snippet/types';\n\ntype Props = {\n  response: string;\n  loading: boolean;\n  stats: RestApiStats | null;\n  responseEditorRef: MutableRefObject<MonacoEditorType | undefined>;\n  onResponseMount: OnMount;\n  actions?: Action[];\n  onActionClick?: (action: string) => void;\n};\n\nexport const ResponsePanel = ({ response, loading, stats, responseEditorRef, onResponseMount, actions, onActionClick }: Props) => {\n  useMemo(() => {\n    responseEditorRef.current?.setValue(response);\n  }, [response, responseEditorRef]);\n\n  return (\n    <div className=\"flex-1 relative\">\n      <Snippet\n        title=\"Response\"\n        className=\"h-full\"\n        editorProps={{\n          onMount: onResponseMount,\n          readOnly: true,\n          language: Language.JSON,\n        }}\n        loading={loading}\n        actions={actions}\n        onActionClick={onActionClick}\n      />\n      {stats ? (\n        <div\n          className=\"absolute bottom-0 left-0 right-0 px-3 py-1 expr-ui-02 border-0 border-t-1 border-solid expr-border-03 flex gap-3 expr-text-03\"\n          style={{ fontSize: '12px', zIndex: 1 }}\n        >\n          <span>\n            {stats.status} {stats.statusText}\n          </span>\n          <span>|</span>\n          <span>{stats.duration}ms</span>\n        </div>\n      ) : null}\n    </div>\n  );\n};\n","import { useCallback, useState } from 'react';\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\nimport { HttpMethod, Header, RestApiStats } from '../types';\n\ntype Params = {\n  defaultUrl?: string;\n  defaultMethod?: HttpMethod;\n  defaultHeaders?: Record<string, string>;\n  defaultBody?: string;\n};\n\nconst toHeaderArray = (headers?: Record<string, string>): Header[] => {\n  if (!headers) return [{ key: '', value: '' }];\n  const entries = Object.entries(headers).map(([key, value]) => ({ key, value }));\n  return entries.length > 0 ? entries : [{ key: '', value: '' }];\n};\n\nexport const useRestApi = ({ defaultUrl, defaultMethod, defaultHeaders, defaultBody }: Params) => {\n  const [url, setUrl] = useState(defaultUrl ?? '');\n  const [method, setMethod] = useState<HttpMethod>(defaultMethod ?? 'GET');\n  const [headers, setHeaders] = useState<Header[]>(toHeaderArray(defaultHeaders));\n  const [body, setBody] = useState(defaultBody ?? '');\n  const [response, setResponse] = useState('');\n  const [loading, setLoading] = useState(false);\n  const [stats, setStats] = useState<RestApiStats | null>(null);\n\n  const addHeader = useCallback(() => {\n    setHeaders(prev => [...prev, { key: '', value: '' }]);\n  }, []);\n\n  const removeHeader = useCallback((index: number) => {\n    setHeaders(prev => prev.filter((_, i) => i !== index));\n  }, []);\n\n  const updateHeader = useCallback((index: number, field: 'key' | 'value', val: string) => {\n    setHeaders(prev => prev.map((h, i) => (i === index ? { ...h, [field]: val } : h)));\n  }, []);\n\n  const execute = useCallback(async () => {\n    setLoading(true);\n    setResponse('');\n    setStats(null);\n\n    const headerObj: Record<string, string> = {};\n    headers.forEach(h => {\n      if (h.key.trim()) {\n        headerObj[h.key.trim()] = h.value;\n      }\n    });\n\n    const fetchOptions: RequestInit = {\n      method,\n      headers: headerObj,\n    };\n\n    if (method !== 'GET' && body.trim()) {\n      fetchOptions.body = body;\n    }\n\n    const start = performance.now();\n\n    try {\n      const res = await fetch(url, fetchOptions);\n      const duration = performance.now() - start;\n\n      setStats({\n        duration: Math.round(duration),\n        status: res.status,\n        statusText: res.statusText,\n      });\n\n      let responseText: string;\n      try {\n        const json = await res.json();\n        responseText = prettifyJSON(json);\n      } catch {\n        responseText = await res.text();\n      }\n\n      setResponse(responseText);\n    } catch (e: unknown) {\n      const duration = performance.now() - start;\n      setStats({\n        duration: Math.round(duration),\n        status: 0,\n        statusText: 'Network Error',\n      });\n      setResponse(e instanceof Error ? e.message : 'An error occurred');\n    }\n\n    setLoading(false);\n  }, [url, method, headers, body]);\n\n  return {\n    url,\n    setUrl,\n    method,\n    setMethod,\n    headers,\n    addHeader,\n    removeHeader,\n    updateHeader,\n    body,\n    setBody,\n    response,\n    loading,\n    stats,\n    execute,\n  };\n};\n","import { useCallback } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\nimport { HeadersEditor } from '~/components/restApi/components/HeadersEditor';\nimport { ConnectionBar } from '~/shared/connectionBar/ConnectionBar';\nimport { SseOutputPanel } from './components/SseOutputPanel';\n\nimport { useSse } from './hooks/useSse';\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\nimport { SseConfig } from '~/types';\n\nexport const Sse = ({ config, tabId }: { config: SseConfig; tabId: string }) => {\n  const {\n    url,\n    setUrl,\n    headers,\n    addHeader,\n    removeHeader,\n    updateHeader,\n    events,\n    connectionStatus,\n    stats,\n    connect,\n    disconnect,\n  } = useSse({\n    tabId,\n    defaultUrl: config.url,\n    defaultHeaders: config.headers,\n  });\n\n  const { editorRef, onMount: onMountBase } = useMonacoMount();\n\n  const onMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      onMountBase(editor, monaco);\n      if (events) editor.setValue(events);\n    },\n    [onMountBase, events]\n  );\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <ConnectionBar\n          url={url}\n          setUrl={setUrl}\n          connectionStatus={connectionStatus}\n          onConnect={connect}\n          onDisconnect={disconnect}\n          placeholder=\"Enter SSE URL\"\n        />\n        <HeadersEditor\n          headers={headers}\n          addHeader={addHeader}\n          removeHeader={removeHeader}\n          updateHeader={updateHeader}\n        />\n      </div>\n      <SseOutputPanel\n        events={events}\n        connectionStatus={connectionStatus}\n        stats={stats}\n        editorRef={editorRef}\n        onMount={onMount}\n      />\n    </div>\n  );\n};\n","import { VscDebugStart, VscDebugStop } from 'react-icons/vsc';\n\nimport { Button } from '~/shared/button/Button';\nimport { Input } from '~/shared/input';\n\nimport { ConnectionStatus } from '~/types';\n\ntype Props = {\n  url: string;\n  setUrl: (url: string) => void;\n  connectionStatus: ConnectionStatus;\n  onConnect: () => void;\n  onDisconnect: () => void;\n  placeholder?: string;\n};\n\nexport const ConnectionBar = ({\n  url,\n  setUrl,\n  connectionStatus,\n  onConnect,\n  onDisconnect,\n  placeholder = 'Enter URL',\n}: Props) => {\n  const isConnected = connectionStatus === 'connected';\n  const isConnecting = connectionStatus === 'connecting';\n\n  return (\n    <div className=\"flex-none flex gap-3 items-center\">\n      <Input\n        className=\"flex-1\"\n        placeholder={placeholder}\n        value={url}\n        onChange={e => setUrl(e.target.value)}\n        readOnly={isConnected || isConnecting}\n      />\n      {isConnected ? (\n        <Button className=\"flex-none\" size=\"xs\" tooltipContent=\"Disconnect\" onClick={onDisconnect} icon>\n          <VscDebugStop />\n        </Button>\n      ) : (\n        <Button\n          className=\"flex-none\"\n          size=\"xs\"\n          tooltipContent=\"Connect\"\n          onClick={onConnect}\n          icon\n          disabled={isConnecting || !url.trim()}\n        >\n          <VscDebugStart />\n        </Button>\n      )}\n    </div>\n  );\n};\n","import { useEffect } from 'react';\n\nimport { Snippet } from '~/components/snippet';\nimport { Language } from '~/constants/language';\n\nimport type { MutableRefObject } from 'react';\nimport type { OnMount } from '@monaco-editor/react';\nimport type { MonacoEditorType } from '~/monaco';\nimport type { ConnectionStatus, SseStats } from '../types';\nimport { STATUS_COLORS, formatDuration } from '~/utils/connectionUtils';\n\ntype Props = {\n  events: string;\n  connectionStatus: ConnectionStatus;\n  stats: SseStats | null;\n  editorRef: MutableRefObject<MonacoEditorType | undefined>;\n  onMount: OnMount;\n};\n\nconst formatBytes = (bytes: number): string => {\n  if (bytes < 1024) return `${bytes} B`;\n  return `${(bytes / 1024).toFixed(1)} KB`;\n};\n\nexport const SseOutputPanel = ({ events, connectionStatus, stats, editorRef, onMount }: Props) => {\n  useEffect(() => {\n    if (editorRef.current) {\n      editorRef.current.setValue(events);\n      const model = editorRef.current.getModel();\n      if (model) {\n        editorRef.current.revealLine(model.getLineCount());\n      }\n    }\n  }, [events, editorRef]);\n\n  return (\n    <div className=\"flex-1 relative\">\n      <Snippet\n        title=\"Events\"\n        className=\"h-full\"\n        editorProps={{\n          onMount,\n          readOnly: true,\n          language: Language.JSON,\n        }}\n      />\n      {stats || connectionStatus !== 'disconnected' ? (\n        <div\n          role=\"status\"\n          aria-live=\"polite\"\n          className=\"absolute bottom-0 left-0 right-0 px-3 py-1 expr-ui-02 border-0 border-t border-solid expr-border-03 flex gap-3 items-center expr-text-03\"\n          style={{ fontSize: '12px', zIndex: 1 }}\n        >\n          <span style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n            <span\n              style={{\n                width: '8px',\n                height: '8px',\n                borderRadius: '50%',\n                backgroundColor: STATUS_COLORS[connectionStatus],\n                display: 'inline-block',\n              }}\n            />\n            {connectionStatus}\n          </span>\n          {stats ? (\n            <>\n              <span>|</span>\n              <span>{stats.eventsReceived} events</span>\n              <span>|</span>\n              <span>{formatBytes(stats.totalBytes)}</span>\n              <span>|</span>\n              <span>{formatDuration(stats.connectionDuration)}</span>\n            </>\n          ) : null}\n        </div>\n      ) : null}\n    </div>\n  );\n};\n","import { ConnectionStatus } from '~/types';\n\nexport const STATUS_COLORS: Record<ConnectionStatus, string> = {\n  disconnected: '#888',\n  connecting: '#f59e0b',\n  connected: '#22c55e',\n  error: '#ef4444',\n};\n\nexport const formatDuration = (ms: number): string => {\n  const seconds = Math.floor(ms / 1000);\n  if (seconds < 60) return `${seconds}s`;\n  const minutes = Math.floor(seconds / 60);\n  const remainingSeconds = seconds % 60;\n  return `${minutes}m ${remainingSeconds}s`;\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { SseTabState, useTabState } from '~/context/TabStateContext';\nimport { Header } from '~/components/restApi/types';\n\nimport { SseStats } from '../types';\nimport { ConnectionStatus } from '~/types';\n\ntype Params = {\n  tabId: string;\n  defaultUrl?: string;\n  defaultHeaders?: Record<string, string>;\n};\n\nconst toHeaderArray = (headers?: Record<string, string>): Header[] => {\n  if (!headers) return [{ key: '', value: '' }];\n  const entries = Object.entries(headers).map(([key, value]) => ({ key, value }));\n  return entries.length > 0 ? entries : [{ key: '', value: '' }];\n};\n\nexport const useSse = ({ tabId, defaultUrl, defaultHeaders }: Params) => {\n  const { getState, setState } = useTabState();\n  const saved = getState<SseTabState>(tabId);\n\n  const [url, setUrl] = useState(saved?.url ?? defaultUrl ?? '');\n  const [headers, setHeaders] = useState<Header[]>(saved?.headers ?? toHeaderArray(defaultHeaders));\n  const [events, setEvents] = useState(saved?.events ?? '');\n  const [connectionStatus, setConnectionStatus] = useState<ConnectionStatus>('disconnected');\n  const [stats, setStats] = useState<SseStats | null>(null);\n\n  const persist = useCallback(\n    (patch: Partial<Omit<SseTabState, 'type'>>) => {\n      const current = getState<SseTabState>(tabId);\n      setState<SseTabState>(tabId, {\n        type: 'SSE',\n        url: '',\n        headers: [{ key: '', value: '' }],\n        events: '',\n        connectionStatus: 'disconnected',\n        ...current,\n        ...patch,\n      });\n    },\n    [tabId, getState, setState]\n  );\n\n  const setUrlPersist = useCallback(\n    (next: string | ((prev: string) => string)) => {\n      setUrl(prev => {\n        const value = typeof next === 'function' ? next(prev) : next;\n        persist({ url: value });\n        return value;\n      });\n    },\n    [persist]\n  );\n\n  const persistHeaders = useCallback(\n    (updater: (prev: Header[]) => Header[]) => {\n      setHeaders(prev => {\n        const next = updater(prev);\n        persist({ headers: next });\n        return next;\n      });\n    },\n    [persist]\n  );\n\n  const abortControllerRef = useRef<AbortController | null>(null);\n  const durationIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n  const startTimeRef = useRef<number>(0);\n  const eventsRef = useRef('');\n  const statsRef = useRef<SseStats>({ connectionDuration: 0, eventsReceived: 0, totalBytes: 0 });\n\n  const addHeader = useCallback(() => {\n    persistHeaders(prev => [...prev, { key: '', value: '' }]);\n  }, [persistHeaders]);\n\n  const removeHeader = useCallback(\n    (index: number) => {\n      persistHeaders(prev => prev.filter((_, i) => i !== index));\n    },\n    [persistHeaders]\n  );\n\n  const updateHeader = useCallback(\n    (index: number, field: 'key' | 'value', val: string) => {\n      persistHeaders(prev => prev.map((h, i) => (i === index ? { ...h, [field]: val } : h)));\n    },\n    [persistHeaders]\n  );\n\n  const cleanup = useCallback(() => {\n    if (durationIntervalRef.current) {\n      clearInterval(durationIntervalRef.current);\n      durationIntervalRef.current = null;\n    }\n    if (abortControllerRef.current) {\n      abortControllerRef.current.abort();\n      abortControllerRef.current = null;\n    }\n  }, []);\n\n  const writeEvents = useCallback(\n    (next: string) => {\n      eventsRef.current = next;\n      setEvents(next);\n      persist({ events: next });\n    },\n    [persist]\n  );\n\n  const connect = useCallback(async () => {\n    if (!url.trim()) return;\n\n    cleanup();\n    setConnectionStatus('connecting');\n    writeEvents('');\n    statsRef.current = { connectionDuration: 0, eventsReceived: 0, totalBytes: 0 };\n    setStats(null);\n    persist({ connectionStatus: 'connecting' });\n\n    const headerObj: Record<string, string> = {};\n    headers.forEach(h => {\n      if (h.key.trim()) headerObj[h.key.trim()] = h.value;\n    });\n\n    const controller = new AbortController();\n    abortControllerRef.current = controller;\n    startTimeRef.current = performance.now();\n\n    // Start duration timer\n    durationIntervalRef.current = setInterval(() => {\n      statsRef.current = {\n        ...statsRef.current,\n        connectionDuration: Math.round(performance.now() - startTimeRef.current),\n      };\n      setStats({ ...statsRef.current });\n    }, 1000);\n\n    try {\n      const res = await fetch(url, {\n        headers: headerObj,\n        signal: controller.signal,\n      });\n\n      if (!res.ok) {\n        setConnectionStatus('error');\n        writeEvents(`Error: ${res.status} ${res.statusText}`);\n        persist({ connectionStatus: 'error' });\n        cleanup();\n        return;\n      }\n\n      if (!res.body) {\n        setConnectionStatus('error');\n        writeEvents('Error: No response body (streaming not supported)');\n        persist({ connectionStatus: 'error' });\n        cleanup();\n        return;\n      }\n\n      setConnectionStatus('connected');\n      persist({ connectionStatus: 'connected' });\n\n      const reader = res.body.getReader();\n      const decoder = new TextDecoder();\n      let buffer = '';\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value, { stream: true });\n        buffer += chunk;\n\n        // Parse SSE lines\n        const lines = buffer.split('\\n');\n        buffer = lines.pop() ?? '';\n\n        for (const line of lines) {\n          if (line.startsWith('data:')) {\n            const data = line.slice(5).trim();\n            if (!data) continue;\n\n            const separator = eventsRef.current ? '\\n---\\n' : '';\n            const nextEvents = eventsRef.current + separator + data;\n            statsRef.current = {\n              ...statsRef.current,\n              eventsReceived: statsRef.current.eventsReceived + 1,\n              totalBytes: statsRef.current.totalBytes + new Blob([data]).size,\n            };\n\n            writeEvents(nextEvents);\n            setStats({ ...statsRef.current });\n          }\n        }\n      }\n\n      // Stream ended naturally\n      setConnectionStatus('disconnected');\n      persist({ connectionStatus: 'disconnected' });\n      cleanup();\n    } catch (e: unknown) {\n      if (e instanceof DOMException && e.name === 'AbortError') {\n        setConnectionStatus('disconnected');\n        persist({ connectionStatus: 'disconnected' });\n      } else {\n        setConnectionStatus('error');\n        const msg = e instanceof Error ? e.message : 'Connection failed';\n        const separator = eventsRef.current ? '\\n---\\n' : '';\n        writeEvents(eventsRef.current + separator + `Error: ${msg}`);\n        persist({ connectionStatus: 'error' });\n      }\n      cleanup();\n    }\n  }, [url, headers, cleanup, writeEvents, persist]);\n\n  const disconnect = useCallback(() => {\n    cleanup();\n    setConnectionStatus('disconnected');\n    persist({ connectionStatus: 'disconnected' });\n  }, [cleanup, persist]);\n\n  useEffect(() => {\n    return () => cleanup();\n  }, [cleanup]);\n\n  return {\n    url,\n    setUrl: setUrlPersist,\n    headers,\n    addHeader,\n    removeHeader,\n    updateHeader,\n    events,\n    connectionStatus,\n    stats,\n    connect,\n    disconnect,\n  };\n};\n","import { useCallback } from 'react';\nimport { VscSend } from 'react-icons/vsc';\nimport { OnMount } from '@monaco-editor/react';\n\nimport { Snippet } from '~/components/snippet';\nimport { Language } from '~/constants/language';\n\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\nimport { ConnectionStatus } from '../types';\n\ntype Props = {\n  connectionStatus: ConnectionStatus;\n  onSend: (data: string) => void;\n  draft: string;\n  setDraft: (value: string) => void;\n};\n\nexport const MessageInput = ({ connectionStatus, onSend, draft, setDraft }: Props) => {\n  const { editorRef, onMount: rawMount } = useMonacoMount();\n  const isConnected = connectionStatus === 'connected';\n\n  const onMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      rawMount(editor, monaco);\n      if (draft) editor.setValue(draft);\n      editor.onDidChangeModelContent(() => setDraft(editor.getValue()));\n    },\n    [rawMount, draft, setDraft]\n  );\n\n  const handleSend = useCallback(() => {\n    const value = editorRef.current?.getValue();\n    if (value?.trim()) {\n      onSend(value);\n    }\n  }, [editorRef, onSend]);\n\n  return (\n    <div className=\"flex-1 flex flex-col gap-2\">\n      <Snippet\n        title=\"Message\"\n        className=\"flex-1\"\n        editorProps={{\n          onMount,\n          language: Language.JSON,\n        }}\n        actions={[\n          {\n            id: 'SEND',\n            label: 'Send',\n            Icon: VscSend,\n            type: 'cta',\n            disabled: !isConnected,\n          },\n        ]}\n        onActionClick={action => {\n          if (action === 'SEND') handleSend();\n        }}\n      />\n    </div>\n  );\n};\n","import { useEffect, useRef } from 'react';\nimport { VscArrowUp, VscArrowDown } from 'react-icons/vsc';\n\nimport { Typography } from '~/shared/typography';\n\nimport { STATUS_COLORS, formatDuration } from '~/utils/connectionUtils';\nimport { ConnectionStatus, WsMessage, WsStats } from '../types';\n\ntype Props = {\n  messages: WsMessage[];\n  connectionStatus: ConnectionStatus;\n  stats: WsStats | null;\n};\n\nconst formatTime = (ts: number): string => {\n  return new Date(ts).toLocaleTimeString();\n};\n\nexport const MessageLog = ({ messages, connectionStatus, stats }: Props) => {\n  const scrollRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (scrollRef.current) {\n      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n    }\n  }, [messages]);\n\n  return (\n    <div className=\"flex-1 flex flex-col border-solid border rounded-8 expr-ui-01 expr-border-03 relative\">\n      <div className=\"flex-none flex px-3 py-2 items-center border-0 border-b border-solid expr-border-03\">\n        <Typography variant=\"h5\" className=\"ml-1\">\n          Messages\n        </Typography>\n      </div>\n      <div ref={scrollRef} className=\"flex-1 overflow-y-auto px-3 py-2 flex flex-col gap-2\" style={{ minHeight: 0 }}>\n        {messages.length === 0 ? (\n          <div className=\"flex-1 flex items-center justify-center\">\n            <Typography variant=\"body-16\" className=\"expr-text-03\">\n              {connectionStatus === 'connected' ? 'Waiting for messages...' : 'Connect to start'}\n            </Typography>\n          </div>\n        ) : (\n          messages.map(msg => (\n            <div\n              key={msg.id}\n              className=\"rounded-8 px-3 py-2 border-solid border expr-border-03\"\n              style={{\n                backgroundColor: msg.direction === 'sent' ? 'rgba(59, 130, 246, 0.06)' : 'rgba(34, 197, 94, 0.06)',\n              }}\n            >\n              <div className=\"flex items-center gap-2 mb-1\" style={{ fontSize: '11px' }}>\n                <span\n                  aria-label={msg.direction === 'sent' ? 'Sent message' : 'Received message'}\n                  className=\"flex items-center gap-1 font-semibold\"\n                  style={{ color: msg.direction === 'sent' ? '#3b82f6' : '#22c55e' }}\n                >\n                  {msg.direction === 'sent' ? <VscArrowUp size={12} /> : <VscArrowDown size={12} />}\n                  {msg.direction === 'sent' ? 'SENT' : 'RECEIVED'}\n                </span>\n                <span className=\"expr-text-03\">{formatTime(msg.timestamp)}</span>\n              </div>\n              <pre\n                className=\"m-0\"\n                style={{\n                  fontSize: '12px',\n                  fontFamily: 'monospace',\n                  whiteSpace: 'pre-wrap',\n                  wordBreak: 'break-all',\n                }}\n              >\n                {msg.data}\n              </pre>\n            </div>\n          ))\n        )}\n      </div>\n      {stats || connectionStatus !== 'disconnected' ? (\n        <div\n          role=\"status\"\n          aria-live=\"polite\"\n          className=\"flex-none px-3 py-1 expr-ui-02 border-0 border-t border-solid expr-border-03 flex gap-3 items-center expr-text-03\"\n          style={{ fontSize: '12px' }}\n        >\n          <span style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n            <span\n              style={{\n                width: '8px',\n                height: '8px',\n                borderRadius: '50%',\n                backgroundColor: STATUS_COLORS[connectionStatus],\n                display: 'inline-block',\n              }}\n            />\n            {connectionStatus}\n          </span>\n          {stats ? (\n            <>\n              <span>|</span>\n              <span>\n                ▲{stats.messagesSent} ▼{stats.messagesReceived}\n              </span>\n              <span>|</span>\n              <span>{formatDuration(stats.connectionDuration)}</span>\n            </>\n          ) : null}\n        </div>\n      ) : null}\n    </div>\n  );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { RestWebsocketTabState, useTabState } from '~/context/TabStateContext';\n\nimport { WsMessage, WsStats } from '../types';\nimport { ConnectionStatus } from '~/types';\n\ntype Params = {\n  tabId: string;\n  defaultUrl?: string;\n};\n\nexport const useRestWebsocket = ({ tabId, defaultUrl }: Params) => {\n  const { getState, setState } = useTabState();\n  const saved = getState<RestWebsocketTabState>(tabId);\n\n  const [url, setUrl] = useState(saved?.url ?? defaultUrl ?? '');\n  const [messageDraft, setMessageDraft] = useState(saved?.messageDraft ?? '');\n  const [messages, setMessages] = useState<WsMessage[]>(saved?.messages ?? []);\n  const [connectionStatus, setConnectionStatus] = useState<ConnectionStatus>('disconnected');\n  const [stats, setStats] = useState<WsStats | null>(null);\n\n  const persist = useCallback(\n    (patch: Partial<Omit<RestWebsocketTabState, 'type'>>) => {\n      const current = getState<RestWebsocketTabState>(tabId);\n      setState<RestWebsocketTabState>(tabId, {\n        type: 'REST_WEBSOCKET',\n        url: '',\n        messageDraft: '',\n        messages: [],\n        connectionStatus: 'disconnected',\n        ...current,\n        ...patch,\n      });\n    },\n    [tabId, getState, setState]\n  );\n\n  const setUrlPersist = useCallback(\n    (next: string | ((prev: string) => string)) => {\n      setUrl(prev => {\n        const value = typeof next === 'function' ? next(prev) : next;\n        persist({ url: value });\n        return value;\n      });\n    },\n    [persist]\n  );\n\n  const setMessageDraftPersist = useCallback(\n    (next: string | ((prev: string) => string)) => {\n      setMessageDraft(prev => {\n        const value = typeof next === 'function' ? next(prev) : next;\n        persist({ messageDraft: value });\n        return value;\n      });\n    },\n    [persist]\n  );\n\n  const wsRef = useRef<WebSocket | null>(null);\n  const durationIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n  const startTimeRef = useRef<number>(0);\n  const statsRef = useRef<WsStats>({ connectionDuration: 0, messagesSent: 0, messagesReceived: 0 });\n  const messageIdRef = useRef(0);\n  const nextMessageId = () => `msg-${++messageIdRef.current}`;\n\n  const cleanup = useCallback(() => {\n    if (durationIntervalRef.current) {\n      clearInterval(durationIntervalRef.current);\n      durationIntervalRef.current = null;\n    }\n    if (wsRef.current) {\n      wsRef.current.onopen = null;\n      wsRef.current.onclose = null;\n      wsRef.current.onerror = null;\n      wsRef.current.onmessage = null;\n      if (wsRef.current.readyState === WebSocket.OPEN || wsRef.current.readyState === WebSocket.CONNECTING) {\n        wsRef.current.close();\n      }\n      wsRef.current = null;\n    }\n  }, []);\n\n  const appendMessage = useCallback(\n    (msg: WsMessage) => {\n      setMessages(prev => {\n        const next = [...prev, msg];\n        persist({ messages: next });\n        return next;\n      });\n    },\n    [persist]\n  );\n\n  const connect = useCallback(() => {\n    if (!url.trim()) return;\n\n    cleanup();\n    setConnectionStatus('connecting');\n    setMessages([]);\n    statsRef.current = { connectionDuration: 0, messagesSent: 0, messagesReceived: 0 };\n    setStats(null);\n    persist({ connectionStatus: 'connecting', messages: [] });\n\n    try {\n      const ws = new WebSocket(url);\n      wsRef.current = ws;\n      startTimeRef.current = performance.now();\n\n      ws.onopen = () => {\n        setConnectionStatus('connected');\n        persist({ connectionStatus: 'connected' });\n        durationIntervalRef.current = setInterval(() => {\n          statsRef.current = {\n            ...statsRef.current,\n            connectionDuration: Math.round(performance.now() - startTimeRef.current),\n          };\n          setStats({ ...statsRef.current });\n        }, 1000);\n      };\n\n      ws.onmessage = (event) => {\n        const msg: WsMessage = {\n          id: nextMessageId(),\n          direction: 'received',\n          data: typeof event.data === 'string' ? event.data : String(event.data),\n          timestamp: Date.now(),\n        };\n        appendMessage(msg);\n        statsRef.current = {\n          ...statsRef.current,\n          messagesReceived: statsRef.current.messagesReceived + 1,\n        };\n        setStats({ ...statsRef.current });\n      };\n\n      ws.onclose = () => {\n        setConnectionStatus('disconnected');\n        persist({ connectionStatus: 'disconnected' });\n        cleanup();\n      };\n\n      ws.onerror = () => {\n        setConnectionStatus('error');\n        persist({ connectionStatus: 'error' });\n        cleanup();\n      };\n    } catch {\n      setConnectionStatus('error');\n      persist({ connectionStatus: 'error' });\n      cleanup();\n    }\n  }, [url, cleanup, appendMessage, persist]);\n\n  const disconnect = useCallback(() => {\n    cleanup();\n    setConnectionStatus('disconnected');\n    persist({ connectionStatus: 'disconnected' });\n  }, [cleanup, persist]);\n\n  useEffect(() => {\n    return () => cleanup();\n  }, [cleanup]);\n\n  const sendMessage = useCallback(\n    (data: string) => {\n      if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN || !data.trim()) return;\n\n      wsRef.current.send(data);\n      const msg: WsMessage = {\n        id: nextMessageId(),\n        direction: 'sent',\n        data,\n        timestamp: Date.now(),\n      };\n      appendMessage(msg);\n      statsRef.current = {\n        ...statsRef.current,\n        messagesSent: statsRef.current.messagesSent + 1,\n      };\n      setStats({ ...statsRef.current });\n    },\n    [appendMessage]\n  );\n\n  return {\n    url,\n    setUrl: setUrlPersist,\n    messageDraft,\n    setMessageDraft: setMessageDraftPersist,\n    messages,\n    connectionStatus,\n    stats,\n    connect,\n    disconnect,\n    sendMessage,\n  };\n};\n","import { ConnectionBar } from '~/shared/connectionBar/ConnectionBar';\nimport { MessageInput } from './components/MessageInput';\nimport { MessageLog } from './components/MessageLog';\n\nimport { useRestWebsocket } from './hooks/useRestWebsocket';\n\nimport { RestWebsocketConfig } from '~/types';\n\nexport const RestWebsocket = ({ config, tabId }: { config: RestWebsocketConfig; tabId: string }) => {\n  const {\n    url,\n    setUrl,\n    messageDraft,\n    setMessageDraft,\n    messages,\n    connectionStatus,\n    stats,\n    connect,\n    disconnect,\n    sendMessage,\n  } = useRestWebsocket({\n    tabId,\n    defaultUrl: config.url,\n  });\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <ConnectionBar\n          url={url}\n          setUrl={setUrl}\n          connectionStatus={connectionStatus}\n          onConnect={connect}\n          onDisconnect={disconnect}\n          placeholder=\"Enter WebSocket URL (ws:// or wss://)\"\n        />\n        <MessageInput\n          connectionStatus={connectionStatus}\n          onSend={sendMessage}\n          draft={messageDraft}\n          setDraft={setMessageDraft}\n        />\n      </div>\n      <MessageLog messages={messages} connectionStatus={connectionStatus} stats={stats} />\n    </div>\n  );\n};\n","import { useCallback, useEffect } from 'react';\nimport { OnMount } from '@monaco-editor/react';\n\nimport { Snippet } from '~/components/snippet';\nimport { ConnectionBar } from '~/shared/connectionBar/ConnectionBar';\n\nimport { useGqlSubscription } from './hooks/useGqlSubscription';\nimport { useMonacoMount } from '~/hooks/useMonacoMount';\n\nimport { Language } from '~/constants/language';\n\nimport { GqlSubscriptionConfig } from '~/types';\nimport { STATUS_COLORS, formatDuration } from '~/utils/connectionUtils';\nimport { ConnectionStatus, SubscriptionStats } from './types';\n\nconst StatsBar = ({\n  connectionStatus,\n  stats,\n}: {\n  connectionStatus: ConnectionStatus;\n  stats: SubscriptionStats | null;\n}) => {\n  if (!stats && connectionStatus === 'disconnected') return null;\n\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      className=\"absolute bottom-0 left-0 right-0 px-3 py-1 expr-ui-02 border-0 border-t border-solid expr-border-03 flex gap-3 items-center expr-text-03\"\n      style={{ fontSize: '12px', zIndex: 1 }}\n    >\n      <span style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n        <span\n          style={{\n            width: '8px',\n            height: '8px',\n            borderRadius: '50%',\n            backgroundColor: STATUS_COLORS[connectionStatus],\n            display: 'inline-block',\n          }}\n        />\n        {connectionStatus}\n      </span>\n      {stats ? (\n        <>\n          <span>|</span>\n          <span>{stats.messagesReceived} messages</span>\n          <span>|</span>\n          <span>{formatDuration(stats.connectionDuration)}</span>\n        </>\n      ) : null}\n    </div>\n  );\n};\n\nexport const GqlSubscription = ({ config, tabId }: { config: GqlSubscriptionConfig; tabId: string }) => {\n  const {\n    wsUrl,\n    setWsUrl,\n    initialQuery,\n    initialVariables,\n    saveQuery,\n    saveVariables,\n    events,\n    connectionStatus,\n    stats,\n    connect,\n    disconnect,\n  } = useGqlSubscription({\n    tabId,\n    defaultWsUrl: config.wsUrl,\n    defaultQuery: config.query,\n    defaultVariables: config.variables,\n  });\n\n  const { editorRef: queryEditorRef, onMount: onQueryMountBase } = useMonacoMount();\n  const { editorRef: variableEditorRef, onMount: onVariableMountBase } = useMonacoMount();\n  const { editorRef: outputEditorRef, onMount: onOutputMountBase } = useMonacoMount();\n\n  const onOutputMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      onOutputMountBase(editor, monaco);\n      if (events) editor.setValue(events);\n    },\n    [onOutputMountBase, events]\n  );\n\n  const onQueryMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      onQueryMountBase(editor, monaco);\n      if (initialQuery) editor.setValue(initialQuery);\n      editor.onDidChangeModelContent(() => saveQuery(editor.getValue()));\n    },\n    [onQueryMountBase, initialQuery, saveQuery]\n  );\n\n  const onVariableMount = useCallback<OnMount>(\n    (editor, monaco) => {\n      onVariableMountBase(editor, monaco);\n      if (initialVariables) editor.setValue(initialVariables);\n      editor.onDidChangeModelContent(() => saveVariables(editor.getValue()));\n    },\n    [onVariableMountBase, initialVariables, saveVariables]\n  );\n\n  const handleConnect = useCallback(() => {\n    const query = queryEditorRef.current?.getValue() ?? '';\n    const variables = variableEditorRef.current?.getValue() ?? '';\n    connect(query, variables);\n  }, [queryEditorRef, variableEditorRef, connect]);\n\n  // Auto-scroll output on new events\n  useEffect(() => {\n    if (outputEditorRef.current) {\n      outputEditorRef.current.setValue(events);\n      const model = outputEditorRef.current.getModel();\n      if (model) {\n        outputEditorRef.current.revealLine(model.getLineCount());\n      }\n    }\n  }, [events, outputEditorRef]);\n\n  return (\n    <div className=\"h-full flex gap-4\">\n      <div className=\"h-full flex flex-col gap-4 flex-1\">\n        <ConnectionBar\n          url={wsUrl}\n          setUrl={setWsUrl}\n          connectionStatus={connectionStatus}\n          onConnect={handleConnect}\n          onDisconnect={disconnect}\n          placeholder=\"Enter WebSocket URL (wss://...)\"\n        />\n        <Snippet\n          title=\"Subscription\"\n          className=\"flex-1 flex-grow-2\"\n          editorProps={{\n            onMount: onQueryMount,\n            language: Language.GRAPHQL,\n          }}\n        />\n        <Snippet\n          title=\"Variables\"\n          className=\"flex-1\"\n          editorProps={{\n            onMount: onVariableMount,\n            language: Language.JSON,\n          }}\n        />\n      </div>\n      <div className=\"flex-1 relative\">\n        <Snippet\n          title=\"Events\"\n          className=\"h-full\"\n          editorProps={{\n            onMount: onOutputMount,\n            readOnly: true,\n            language: Language.JSON,\n          }}\n        />\n        <StatsBar connectionStatus={connectionStatus} stats={stats} />\n      </div>\n    </div>\n  );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { GqlSubscriptionTabState, useTabState } from '~/context/TabStateContext';\nimport { createGraphqlWsClient } from '~/utils/graphqlWsProtocol';\nimport { prettifyJSON } from '~/utils/prettifyJSON';\n\nimport { SubscriptionStats } from '../types';\nimport { ConnectionStatus } from '~/types';\n\ntype Params = {\n  tabId: string;\n  defaultWsUrl?: string;\n  defaultQuery?: string;\n  defaultVariables?: string;\n};\n\nexport const useGqlSubscription = ({ tabId, defaultWsUrl, defaultQuery, defaultVariables }: Params) => {\n  const { getState, setState } = useTabState();\n  const saved = getState<GqlSubscriptionTabState>(tabId);\n\n  const [wsUrl, setWsUrl] = useState(saved?.wsUrl ?? defaultWsUrl ?? '');\n  const [events, setEvents] = useState(saved?.events ?? '');\n  const [connectionStatus, setConnectionStatus] = useState<ConnectionStatus>('disconnected');\n  const [stats, setStats] = useState<SubscriptionStats | null>(null);\n\n  const initialQuery = saved?.query ?? defaultQuery;\n  const initialVariables = saved?.variables ?? defaultVariables;\n\n  const persist = useCallback(\n    (patch: Partial<Omit<GqlSubscriptionTabState, 'type'>>) => {\n      const current = getState<GqlSubscriptionTabState>(tabId);\n      setState<GqlSubscriptionTabState>(tabId, {\n        type: 'GQL_SUBSCRIPTION',\n        wsUrl: '',\n        query: '',\n        variables: '',\n        events: '',\n        connectionStatus: 'disconnected',\n        ...current,\n        ...patch,\n      });\n    },\n    [tabId, getState, setState]\n  );\n\n  const saveQuery = useCallback((query: string) => persist({ query }), [persist]);\n  const saveVariables = useCallback((variables: string) => persist({ variables }), [persist]);\n\n  const setWsUrlPersist = useCallback(\n    (next: string | ((prev: string) => string)) => {\n      setWsUrl(prev => {\n        const value = typeof next === 'function' ? next(prev) : next;\n        persist({ wsUrl: value });\n        return value;\n      });\n    },\n    [persist]\n  );\n\n  const clientRef = useRef<{ close: () => void } | null>(null);\n  const durationIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n  const startTimeRef = useRef<number>(0);\n  const eventsRef = useRef('');\n  const statsRef = useRef<SubscriptionStats>({ connectionDuration: 0, messagesReceived: 0 });\n\n  const cleanup = useCallback(() => {\n    if (durationIntervalRef.current) {\n      clearInterval(durationIntervalRef.current);\n      durationIntervalRef.current = null;\n    }\n    if (clientRef.current) {\n      clientRef.current.close();\n      clientRef.current = null;\n    }\n  }, []);\n\n  const appendEvent = useCallback((text: string) => {\n    const separator = eventsRef.current ? '\\n---\\n' : '';\n    eventsRef.current += separator + text;\n    setEvents(eventsRef.current);\n    persist({ events: eventsRef.current });\n  }, [persist]);\n\n  const connect = useCallback(\n    (query: string, variables: string) => {\n      if (!wsUrl.trim() || !query.trim()) return;\n\n      cleanup();\n      setEvents('');\n      eventsRef.current = '';\n      statsRef.current = { connectionDuration: 0, messagesReceived: 0 };\n      setStats(null);\n\n      let parsedVariables: Record<string, unknown> | undefined;\n      if (variables.trim()) {\n        try {\n          parsedVariables = JSON.parse(variables);\n        } catch {\n          setConnectionStatus('error');\n          persist({ connectionStatus: 'error' });\n          appendEvent('Error: invalid variables JSON');\n          return;\n        }\n      }\n\n      setConnectionStatus('connecting');\n      persist({ connectionStatus: 'connecting', events: '' });\n      startTimeRef.current = performance.now();\n\n      const client = createGraphqlWsClient(wsUrl, query, parsedVariables, {\n        onConnected: () => {\n          setConnectionStatus('connected');\n          persist({ connectionStatus: 'connected' });\n          durationIntervalRef.current = setInterval(() => {\n            statsRef.current = {\n              ...statsRef.current,\n              connectionDuration: Math.round(performance.now() - startTimeRef.current),\n            };\n            setStats({ ...statsRef.current });\n          }, 1000);\n        },\n\n        onData: (data) => {\n          const formatted = prettifyJSON(data);\n          const separator = eventsRef.current ? '\\n---\\n' : '';\n          eventsRef.current += separator + formatted;\n          statsRef.current = {\n            ...statsRef.current,\n            messagesReceived: statsRef.current.messagesReceived + 1,\n          };\n          setEvents(eventsRef.current);\n          setStats({ ...statsRef.current });\n          persist({ events: eventsRef.current });\n        },\n\n        onError: (error) => {\n          const msg = typeof error === 'string' ? error : JSON.stringify(error);\n          appendEvent(`Error: ${msg}`);\n          setConnectionStatus('error');\n          persist({ connectionStatus: 'error' });\n          cleanup();\n        },\n\n        onComplete: () => {\n          setConnectionStatus('disconnected');\n          persist({ connectionStatus: 'disconnected' });\n          cleanup();\n        },\n      });\n\n      clientRef.current = client;\n    },\n    [wsUrl, cleanup, appendEvent, persist]\n  );\n\n  const disconnect = useCallback(() => {\n    cleanup();\n    setConnectionStatus('disconnected');\n    persist({ connectionStatus: 'disconnected' });\n  }, [cleanup, persist]);\n\n  useEffect(() => {\n    return () => cleanup();\n  }, [cleanup]);\n\n  return {\n    wsUrl,\n    setWsUrl: setWsUrlPersist,\n    initialQuery,\n    initialVariables,\n    saveQuery,\n    saveVariables,\n    events,\n    connectionStatus,\n    stats,\n    connect,\n    disconnect,\n  };\n};\n","/**\n * Lightweight graphql-ws protocol (graphql-transport-ws) client.\n * Implements the minimal subset needed for subscriptions.\n *\n * Protocol spec: https://github.com/enisdenjo/graphql-ws/blob/master/PROTOCOL.md\n */\n\ntype MessageHandler = {\n  onData: (data: unknown) => void;\n  onError: (error: unknown) => void;\n  onComplete: () => void;\n  onConnected: () => void;\n};\n\nexport const createGraphqlWsClient = (\n  wsUrl: string,\n  query: string,\n  variables: Record<string, unknown> | undefined,\n  handlers: MessageHandler\n): { close: () => void } => {\n  const ws = new WebSocket(wsUrl, 'graphql-transport-ws');\n  const subscriptionId = '1';\n\n  let ackReceived = false;\n\n  const sendSubscribe = () => {\n    ws.send(\n      JSON.stringify({\n        id: subscriptionId,\n        type: 'subscribe',\n        payload: {\n          query,\n          variables: variables ?? {},\n        },\n      })\n    );\n  };\n\n  ws.onopen = () => {\n    ws.send(JSON.stringify({ type: 'connection_init' }));\n  };\n\n  ws.onmessage = event => {\n    try {\n      const msg = JSON.parse(event.data as string);\n\n      switch (msg.type) {\n        case 'connection_ack':\n          ackReceived = true;\n          handlers.onConnected();\n          sendSubscribe();\n          break;\n\n        case 'next':\n          if (msg.id === subscriptionId && msg.payload) {\n            handlers.onData(msg.payload);\n          }\n          break;\n\n        case 'error':\n          if (msg.id === subscriptionId && msg.payload) {\n            handlers.onError(msg.payload);\n          }\n          break;\n\n        case 'complete':\n          if (msg.id === subscriptionId) {\n            handlers.onComplete();\n          }\n          break;\n\n        case 'ping':\n          // Respond to server ping, then check if we missed ack\n          ws.send(JSON.stringify({ type: 'pong' }));\n          break;\n\n        case 'pong':\n          // Server responded to our ping — no action needed\n          break;\n\n        case 'ka':\n          // Legacy subscriptions-transport-ws keepalive — treat as ack if not yet received\n          if (!ackReceived) {\n            ackReceived = true;\n            handlers.onConnected();\n            sendSubscribe();\n          }\n          break;\n      }\n    } catch {\n      // Ignore malformed messages\n    }\n  };\n\n  ws.onerror = () => {\n    handlers.onError('WebSocket connection error');\n  };\n\n  ws.onclose = () => {\n    handlers.onComplete();\n  };\n\n  return {\n    close: () => {\n      if (ws.readyState === WebSocket.OPEN) {\n        // Send complete to unsubscribe gracefully\n        ws.send(JSON.stringify({ id: subscriptionId, type: 'complete' }));\n        ws.close();\n      } else if (ws.readyState === WebSocket.CONNECTING) {\n        ws.close();\n      }\n    },\n  };\n};\n","import { memo } from 'react';\nimport { VscClose } from 'react-icons/vsc';\nimport { Typography } from '~/shared/typography';\n\nexport type TabInstance = {\n  id: string;\n  templateId: string;\n  subTemplateId?: string;\n  title: string;\n  instanceIndex: number;\n};\n\ntype Props = {\n  tabs: TabInstance[];\n  activeTabId: string;\n  onTabClick: (tabId: string) => void;\n  onTabClose: (tabId: string) => void;\n};\n\nconst TabBar = ({ tabs, activeTabId, onTabClick, onTabClose }: Props) => {\n  if (tabs.length <= 1) return null;\n\n  return (\n    <div className=\"flex-none flex items-center border-0 border-b-1 border-solid expr-border-03 gap-0 overflow-x-auto mb-2 flex-wrap\">\n      {tabs.map(tab => {\n        const isActive = tab.id === activeTabId;\n        return (\n          <div\n            key={tab.id}\n            className={`flex items-center gap-2 px-3 py-2 cursor-pointer border-0 border-b-2 border-solid ${\n              isActive ? 'expr-ui-01 border-b-interactive' : 'expr-ui-02 border-b-transparent hover-expr-ui-02'\n            }`}\n            style={{ borderBottomColor: isActive ? 'var(--expr-interactive-01)' : 'transparent' }}\n            onClick={() => onTabClick(tab.id)}\n          >\n            <Typography variant=\"body-14\" className={isActive ? 'expr-text-01' : 'expr-text-03'}>\n              {tab.title}\n              {tab.instanceIndex > 1 ? ` (${tab.instanceIndex})` : ''}\n            </Typography>\n            <VscClose\n              size={14}\n              className=\"expr-text-03 cursor-pointer\"\n              onClick={(e: React.MouseEvent) => {\n                e.stopPropagation();\n                onTabClose(tab.id);\n              }}\n            />\n          </div>\n        );\n      })}\n    </div>\n  );\n};\n\nconst MemoizedTabBar = memo(TabBar);\nexport { MemoizedTabBar as TabBar };\n","import { Component, ReactNode } from 'react';\nimport { Typography } from '~/shared/typography';\n\ntype Props = {\n  children: ReactNode;\n};\n\ntype State = {\n  hasError: boolean;\n  error: Error | null;\n};\n\nexport class ErrorBoundary extends Component<Props, State> {\n  state: State = { hasError: false, error: null };\n\n  static getDerivedStateFromError(error: Error): State {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, info: React.ErrorInfo): void {\n    console.error('[APIPlayground] Component error:', error, info.componentStack);\n  }\n\n  render() {\n    if (this.state.hasError) {\n      return (\n        <div className=\"h-full w-full flex flex-col items-center justify-center gap-4 p-8 expr-ui-01\">\n          <Typography variant=\"h4\">Something went wrong</Typography>\n          <Typography variant=\"body-14\" className=\"expr-text-03\">\n            {this.state.error?.message ?? 'An unexpected error occurred'}\n          </Typography>\n        </div>\n      );\n    }\n    return this.props.children;\n  }\n}\n","import { useLayoutEffect, useState } from 'react';\n\nexport const useIsClientSide = () => {\n  const [isMounted, setMounted] = useState(false);\n\n  useLayoutEffect(() => {\n    setMounted(true);\n  }, []);\n\n  return isMounted || typeof window !== 'undefined';\n};\n","import { APIPlayground } from './APIPlayground';\n\nimport { useIsClientSide } from '~/hooks/useIsClientSide';\n\nimport { APIPlaygroundProps } from '~/types';\n\nconst Container = (props: APIPlaygroundProps) => {\n  const isClientSide = useIsClientSide();\n  return isClientSide ? <APIPlayground {...props} /> : null;\n};\n\nexport { Container as APIPlayground };\n","import { FieldConfig, FieldConfigMap } from '~/types';\n\nexport class FieldConfigMapBuilder {\n  private fieldConfigMap: FieldConfigMap;\n  constructor() {\n    this.fieldConfigMap = {};\n  }\n  addField(field: FieldConfig) {\n    this.fieldConfigMap[field.id] = field;\n    return this;\n  }\n  build(): FieldConfigMap {\n    return this.fieldConfigMap;\n  }\n}\n"],"mappings":"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","names":["useCallback","useMemo","useState","memo","useCallback","useState","jsx","Typography","variant","className","rest","VscChevronDown","VscAdd","BsArrowReturnRight","VscAdd","handleKeyDown","action","jsx","jsxs","ChildMenuItem","id","title","selected","onClick","onAddTab","e","handleKeyDown","BsArrowReturnRight","Typography","VscAdd","Template","jsx","jsxs","MenuItem","config","activeNavItem","activeSubNavItem","onNavItemClick","onAddTab","open","setOpen","useState","isSelected","isNestedTemplate","onMenuItemClick","useCallback","_a","onChildItemClick","child","onChildAddTab","e","handleKeyDown","Typography","VscAdd","VscChevronDown","a","ChildMenuItem","jsx","SideNav","config","activeNavItem","activeSubNavItem","onNavItemClick","onAddTab","item","MenuItem","MemoizedSideNav","memo","memo","useMemo","memo","useMemo","MonacoEditor","memo","useCallback","useCallback","useRef","useState","Fragment","jsx","jsxs","TIMEOUT","Tooltip","content","children","coords","setCoords","timerRef","onMouseEnter","ev","domRect","onMouseLeave","jsx","VARIANT_VS_CLASSNAME","SIZE_VS_CLASSNAME","Button","className","loading","variant","size","tooltipContent","icon","selected","disabled","rest","mergedClassName","Tooltip","onMouseEnter","onMouseLeave","jsx","jsxs","RightActions","actions","onActionClick","className","loading","handleActionClick","useCallback","ev","Icon","label","id","type","disabled","Button","MemoizedRightActions","memo","useCallback","jsx","ButtonGroup","style","className","config","selectedIdx","size","onClick","button","idx","Button","jsx","Tabs","tabs","selectedTabIdx","onTabClick","className","onTabSwitch","useCallback","idx","ButtonGroup","jsx","jsxs","Loader","jsx","FullSizeLoader","Loader","useCallback","useRef","useCopyToClipboard","VscCopy","VscBracketDot","VscSave","Language","LANGAUGE_VS_MIME_TYPE","LANGAUGE_VS_EXTENSION","downloadFile","data","filename","language","blob","url","anchor","parse","print","prettifyGQL","q","ACTION_TYPE","ACTIONS","VscBracketDot","VscCopy","VscSave","useMonacoActions","title","onParentActionClick","onParentMount","language","editorRef","useRef","onMount","useCallback","mEditor","_monaco","_","copyToClipboard","useCopyToClipboard","onActionClick","action","_a","_b","_c","_d","_e","_f","_g","content","downloadFile","prettifyGQL","e","DEFAULT_CONFIG","getMonacoConfig","readOnly","darkMode","jsx","jsxs","createElement","Snippet","title","className","tabs","selectedTabIdx","onTabClick","_actions","onActionClick","errors","editorProps","loading","_a","_b","monacoConfig","useMemo","getMonacoConfig","onMount","handleActionClick","actions","useMonacoActions","rightActions","a1","a2","Typography","Tabs","MemoizedRightActions","MonacoEditor","FullSizeLoader","MemoizedSnippet","memo","prettifyJSON","obj","jsx","StaticDataViewer","config","data","title","language","readOnly","stringifiedData","useMemo","prettifyJSON","editorProps","MemoizedSnippet","MemoizedStaticDataViewer","memo","memo","useMemo","useCallback","useMemo","useState","VscSync","createContext","useCallback","useContext","useMemo","useRef","useState","createPortal","VscCheck","AiFillWarning","jsx","jsxs","SuccessIcon","ErrorIcon","INTENT_VS_ERROR","Snackbar","message","intent","Icon","jsx","jsxs","SnackbarContext","createContext","SnackbarProvider","children","state","setState","useState","timerRef","useRef","clearStateAfterInterval","useCallback","contextValue","useMemo","message","Snackbar","useSnackbar","useContext","useCallback","useRef","useMonacoMount","editorRef","onMount","mEditor","recursivelyExpandData","data","cache","level","acc","key","obj","getExpandedData","client","TABS","REFRESH_ACTION","VscSync","UPDATE_CACHE_ACTION","useCacheViewer","config","client","readOnly","tabIdx","setTabIdx","useState","count","setCount","onError","onSuccess","useSnackbar","editorRef","onMount","useMonacoMount","stringifiedData","useMemo","prettifyJSON","expandedData","getExpandedData","expandedStringifiedData","tabData","onActionClick","useCallback","action","_a","_b","c","parsedCache","e","actions","TABS","jsx","CacheViewer","config","title","readOnly","data","onTabClick","selectedTabIdx","tabs","onActionClick","actions","onMount","useCacheViewer","editorProps","useMemo","MemoizedSnippet","MemoizedCacheViewer","memo","useCallback","useCopyToClipboard","useMemo","useCallback","useRef","useState","parse","useInputEditor","parentOnMount","onSubmit","errors","setErrors","editorRef","onChange","content","parsedGQLNode","e","onMount","mEditor","_monaco","_a","ev","latestErrors","jsx","InputEditor","title","onSubmit","parentOnMount","className","onMount","onChange","errors","useInputEditor","editorProps","useMemo","MemoizedSnippet","memo","useMemo","useCallback","useRef","useCallback","useState","useValidateJSON","onChange","errors","setErrors","handleChange","content","ev","parsedVariables","e","useVariableEditor","parentOnMount","onSubmit","errors","handleChange","useValidateJSON","editorRef","useRef","onMount","useCallback","mEditor","_monaco","ev","latestErrors","jsx","VariableEditor","title","onSubmit","className","parentOnMount","onChange","onMount","errors","useVariableEditor","editorProps","useMemo","MemoizedSnippet","MemoizedVariableEditor","memo","memo","useMemo","jsx","OutputEditor","title","readOnly","onMount","className","loading","editorProps","useMemo","MemoizedSnippet","MemoizedOutputEditor","memo","memo","useMemo","useState","forwardRef","useCallback","jsx","SIZE_VS_CLASSNAME","Input","className","error","type","size","isActive","rest","ref","onWheel","ev","useCallback","useRef","useState","useClickAway","Fragment","jsx","jsxs","Popover","content","children","_a","coords","setCoords","popoverContainerRef","childRef","latestCoordsRef","onClick","ev","domRect","onClose","childDomRect","useEffect","useRef","jsx","Menu","options","onClose","onChange","selected","elementsMap","useRef","useEffect","_a","option","el","Typography","VscChevronDown","jsx","jsxs","Select","options","onChange","placeholder","size","value","className","touched","setTouched","useState","search","setSearch","filteredOptions","useMemo","option","Popover","close","Menu","onClick","isOpen","ref","Input","e","useCallback","useMemo","useState","Kind","print","useQuerySelector","config","onChange","client","selectedOption","setSelectedOption","useState","options","useMemo","queriesMap","query","_a","_b","_c","_d","_e","name","def","Kind","variables","node","onOptionSelect","useCallback","option","output","print","prettifyJSON","e","jsx","QuerySelector","config","onChange","className","options","selectedOption","onOptionSelect","useQuerySelector","Select","MemoizedQuerySelector","memo","memo","jsx","jsxs","ExecutionStats","stats","MemoizedExecutionStats","memo","useState","useRef","VscHistory","VscTrash","jsx","jsxs","formatTime","ts","truncate","text","maxLen","HistoryListItem","entry","onSelect","onClose","Typography","HistoryList","entries","onClear","Button","VscTrash","QueryHistory","open","setOpen","useState","containerRef","useRef","o","VscHistory","MemoizedQueryHistory","memo","VscSend","VscSync","VscTerminal","useCallback","useCallback","parse","useCallback","useState","useGraphQLExecution","executeFn","outputEditorRef","loading","setLoading","useState","stats","setStats","execute","useCallback","variables","_a","_b","_c","_d","startTime","data","errorMessage","result","prettifyJSON","elapsed","e","createContext","useCallback","useContext","useRef","jsx","TabStateContext","TabStateProvider","children","storeRef","getState","tabId","setState","state","removeState","useTabState","useGraphQLExecutor","tabStateType","client","tabId","onExecutionComplete","getState","setState","useTabState","inputEditorRef","rawInputMount","useMonacoMount","variableEditorRef","rawVariableMount","outputEditorRef","rawOutputMount","executeFn","useCallback","variables","_a","_b","_c","_d","_e","document","parse","response","loading","stats","execute","setStats","useGraphQLExecution","saveField","field","value","current","onInputMount","editor","monaco","saved","onVariableMount","onOutputMount","onSubmit","queryText","variablesText","result","onSelect","input","output","useQueryExecutor","config","tabId","onExecutionComplete","onSelect","onInputMount","onVariableMount","onOutputMount","onSubmit","loading","stats","inputEditorRef","variableEditorRef","useGraphQLExecutor","onQuerySelect","useCallback","query","variables","output","createContext","useCallback","useContext","useMemo","useCallback","useState","MAX_ENTRIES","getStorageKey","instanceId","readEntries","raw","e","writeEntries","entries","useQueryHistory","setEntries","addEntry","entry","newEntry","prev","updated","clearHistory","clearHistoryForType","templateType","jsx","HistoryContext","createContext","HistoryProvider","instanceId","children","history","useQueryHistory","useHistory","templateType","ctx","useContext","filteredEntries","useMemo","e","clearHistory","useCallback","escapeShellArg","str","generateCurl","url","method","headers","body","parts","key","value","generateGraphQLCurl","endpoint","query","variables","bodyObj","e","getApolloUri","client","_a","_b","_c","jsx","jsxs","QUERY_CONTAINER_CLASSNAME","VARIABLE_CONTAINER_CLASSNAME","QueryExecutor","config","tabId","_a","_b","_c","_d","_e","_f","_g","_h","entries","addEntry","clearHistory","useHistory","onExecutionComplete","useCallback","data","onInputMount","onOutputMount","onVariableMount","onSubmit","loading","onQuerySelect","stats","inputEditorRef","variableEditorRef","useQueryExecutor","copyToClipboard","useCopyToClipboard","handleCopyCurl","query","variables","endpoint","getApolloUri","curl","generateGraphQLCurl","onHistorySelect","entry","MemoizedQuerySelector","MemoizedQueryHistory","Button","VscSync","VscTerminal","VscSend","InputEditor","MemoizedVariableEditor","MemoizedOutputEditor","MemoizedExecutionStats","useCallback","useCopyToClipboard","memo","useCallback","useState","print","useMutationSelector","onChange","selectedOption","setSelectedOption","useState","onOptionSelect","useCallback","option","node","variables","print","prettifyJSON","jsx","MutationSelector","config","onChange","className","_a","selectedOption","onOptionSelect","useMutationSelector","Select","MemoizedMutationSelector","memo","VscSend","VscTerminal","useCallback","useMutationExecutor","config","tabId","onExecutionComplete","onSelect","onInputMount","onVariableMount","onOutputMount","onSubmit","loading","stats","inputEditorRef","variableEditorRef","useGraphQLExecutor","onMutationSelect","useCallback","mutation","variables","output","jsx","jsxs","QUERY_CONTAINER_CLASSNAME","VARIABLE_CONTAINER_CLASSNAME","MutationExecutor","config","tabId","_a","_b","_c","_d","_e","_f","_g","_h","_i","entries","addEntry","clearHistory","useHistory","onExecutionComplete","useCallback","data","onInputMount","onOutputMount","onVariableMount","onSubmit","loading","onMutationSelect","stats","inputEditorRef","variableEditorRef","useMutationExecutor","copyToClipboard","useCopyToClipboard","handleCopyCurl","query","variables","endpoint","getApolloUri","curl","generateGraphQLCurl","onHistorySelect","entry","MemoizedMutationSelector","MemoizedQueryHistory","Button","VscTerminal","VscSend","InputEditor","MemoizedVariableEditor","MemoizedOutputEditor","MemoizedExecutionStats","memo","useMemo","jsx","OutputEditor","title","readOnly","onMount","className","loading","editorProps","useMemo","MemoizedSnippet","MemoizedOutputEditor","memo","memo","useCallback","FormFieldType","memo","useCallback","jsx","jsxs","FormControl","onBlur","error","label","children","required","Typography","useCallback","useFormField","fieldId","onAction","onBlur","useCallback","onChange","value","jsx","TextInput","id","label","onAction","error","readOnly","required","value","placeholder","onBlur","onChange","useFormField","handleChange","useCallback","ev","FormControl","Input","MemoizedTextInput","memo","memo","useCallback","jsx","NumberInput","id","label","onAction","error","readOnly","required","value","placeholder","onBlur","onChange","useFormField","handleChange","useCallback","ev","FormControl","Input","MemoizedNumberInput","memo","memo","useMemo","useRef","MonacoEditor","jsx","JSONInput","id","label","onAction","error","readOnly","required","value","onBlur","onChange","useFormField","monacoConfig","useMemo","getMonacoConfig","valueRef","useRef","validationErrors","handleChange","useValidateJSON","FormControl","MonacoEditor","FullSizeLoader","MemoizedJSONInput","memo","jsx","jsxs","FIELD_TYPE_VS_COMPONENT","MemoizedTextInput","MemoizedNumberInput","MemoizedJSONInput","Arranger","layout","fieldConfigMap","errors","values","onAction","fields","horizontal","field","config","Component","MemoizedArranger","memo","Form","loading","onSubmit","useCallback","onKeyDown","e","Button","MemoizedForm","useCallback","useRef","useState","useForm","fieldConfigMap","validator","initialValues","onSubmit","values","setValues","useState","errors","setErrors","submitCountRef","useRef","defaultValidator","useCallback","vals","acc","key","_a","latestValuesRef","onAction","action","newVals","validationErrors","useCallback","useCustomQuery","config","outputEditorRef","onOutputEditorMount","useMonacoMount","getVariables","query","client","executeFn","useCallback","variables","data","error","loading","stats","execute","useGraphQLExecution","onSubmit","vals","jsx","jsxs","CustomQuery","config","_a","fieldConfigMap","formLayout","validator","initialValues","outputConfig","loading","stats","onSubmit","onOutputEditorMount","useCustomQuery","onAction","values","errors","useForm","MemoizedForm","MemoizedOutputEditor","MemoizedExecutionStats","useCallback","useCustomMutation","config","outputEditorRef","onOutputEditorMount","useMonacoMount","getVariables","mutation","client","executeFn","useCallback","variables","_a","data","errors","loading","stats","execute","useGraphQLExecution","onSubmit","vals","jsx","jsxs","CustomMutation","config","_a","fieldConfigMap","formLayout","validator","initialValues","outputConfig","loading","stats","onSubmit","onOutputEditorMount","useCustomMutation","onAction","values","errors","useForm","MemoizedForm","MemoizedOutputEditor","MemoizedExecutionStats","useMemo","useCallback","useMemo","useRef","useState","VscSend","EXECUTE_MUTATION","useFetchAndMutate","config","mutationOutputEditorRef","queryOutputEditorRef","isQueryExecuted","setIsQueryExecuted","useState","queryResponseErrors","handleQueryResponseChange","useValidateJSON","fieldConfigMap","initialValues","validator","getQueryVariables","query","cta","getMutationVariables","mutation","client","fetchExecuteFn","useCallback","variables","data","error","mutateExecuteFn","_a","errors","fetching","fetchStats","executeFetch","useGraphQLExecution","mutating","mutateStats","executeMutate","onFetchSubmit","vals","onAction","formValues","formErrors","useForm","latestFormValuesRef","useRef","onQueryActionClick","action","mutationVariables","queryActions","useMemo","VscSend","jsx","jsxs","SNIPPET_CLASSNAME","FetchAndMutate","config","_a","_b","fieldConfigMap","formLayout","initialValues","validator","queryOutput","mutationOutput","queryOutputEditorRef","onQueryOutputEditorMount","useMonacoMount","mutationOutputEditorRef","onMutationOutputEditorMount","fetching","mutating","fetchStats","mutateStats","queryActions","onQueryActionClick","queryResponseErrors","handleQueryResponseChange","onAction","formErrors","formValues","useFetchAndMutate","queryOutputEditorProps","useMemo","mutationOutputEditorProps","MemoizedForm","MemoizedSnippet","MemoizedExecutionStats","useCallback","useEffect","useMemo","useState","gql","INTROSPECTION_QUERY","jsx","SchemaViewer","config","loading","setLoading","useState","editorRef","onMount","useMonacoMount","fetchSchema","useCallback","_a","_b","result","INTROSPECTION_QUERY","formatted","prettifyJSON","err","errMsg","useEffect","editorProps","useMemo","MemoizedSnippet","useCallback","useCopyToClipboard","VscSend","jsx","jsxs","HTTP_METHODS","HTTP_METHOD_OPTIONS","m","RequestBar","method","setMethod","url","setUrl","execute","Select","o","Input","e","Button","VscSend","VscAdd","VscClose","jsx","jsxs","HeadersEditor","headers","addHeader","removeHeader","updateHeader","Typography","Button","VscAdd","header","index","Input","e","VscClose","useMemo","jsx","jsxs","ResponsePanel","response","loading","stats","responseEditorRef","onResponseMount","actions","onActionClick","useMemo","_a","MemoizedSnippet","VscTerminal","useCallback","useState","toHeaderArray","headers","entries","key","value","useRestApi","defaultUrl","defaultMethod","defaultHeaders","defaultBody","url","setUrl","useState","method","setMethod","setHeaders","body","setBody","response","setResponse","loading","setLoading","stats","setStats","addHeader","useCallback","prev","removeHeader","index","_","i","updateHeader","field","val","h","execute","headerObj","fetchOptions","start","res","duration","responseText","json","prettifyJSON","e","jsx","jsxs","RestApi","config","url","setUrl","method","setMethod","headers","addHeader","removeHeader","updateHeader","body","setBody","response","loading","stats","execute","useRestApi","responseEditorRef","onResponseMount","useMonacoMount","copyToClipboard","useCopyToClipboard","curlAction","VscTerminal","handleCurlAction","useCallback","action","headerObj","h","curl","generateCurl","onBodyChange","value","RequestBar","HeadersEditor","MemoizedSnippet","ResponsePanel","useCallback","VscDebugStart","VscDebugStop","jsx","jsxs","ConnectionBar","url","setUrl","connectionStatus","onConnect","onDisconnect","placeholder","isConnected","isConnecting","Input","e","Button","VscDebugStop","VscDebugStart","useEffect","STATUS_COLORS","formatDuration","ms","seconds","minutes","remainingSeconds","Fragment","jsx","jsxs","formatBytes","bytes","SseOutputPanel","events","connectionStatus","stats","editorRef","onMount","useEffect","model","MemoizedSnippet","STATUS_COLORS","formatDuration","useCallback","useEffect","useRef","useState","toHeaderArray","headers","entries","key","value","useSse","tabId","defaultUrl","defaultHeaders","_a","_b","_c","_d","getState","setState","useTabState","saved","url","setUrl","useState","setHeaders","events","setEvents","connectionStatus","setConnectionStatus","stats","setStats","persist","useCallback","patch","current","setUrlPersist","next","prev","persistHeaders","updater","abortControllerRef","useRef","durationIntervalRef","startTimeRef","eventsRef","statsRef","addHeader","removeHeader","index","_","i","updateHeader","field","val","h","cleanup","writeEvents","connect","headerObj","controller","res","reader","decoder","buffer","done","chunk","lines","line","data","separator","nextEvents","e","msg","disconnect","useEffect","jsx","jsxs","Sse","config","tabId","url","setUrl","headers","addHeader","removeHeader","updateHeader","events","connectionStatus","stats","connect","disconnect","useSse","editorRef","onMountBase","useMonacoMount","onMount","useCallback","editor","monaco","ConnectionBar","HeadersEditor","SseOutputPanel","useCallback","VscSend","jsx","MessageInput","connectionStatus","onSend","draft","setDraft","editorRef","rawMount","useMonacoMount","isConnected","onMount","useCallback","editor","monaco","handleSend","_a","value","MemoizedSnippet","VscSend","action","useEffect","useRef","VscArrowUp","VscArrowDown","Fragment","jsx","jsxs","formatTime","ts","MessageLog","messages","connectionStatus","stats","scrollRef","useRef","useEffect","Typography","msg","VscArrowUp","VscArrowDown","STATUS_COLORS","formatDuration","useCallback","useEffect","useRef","useState","useRestWebsocket","tabId","defaultUrl","_a","_b","_c","_d","getState","setState","useTabState","saved","url","setUrl","useState","messageDraft","setMessageDraft","messages","setMessages","connectionStatus","setConnectionStatus","stats","setStats","persist","useCallback","patch","current","setUrlPersist","next","prev","value","setMessageDraftPersist","wsRef","useRef","durationIntervalRef","startTimeRef","statsRef","messageIdRef","nextMessageId","cleanup","appendMessage","msg","connect","ws","event","e","disconnect","useEffect","sendMessage","data","jsx","jsxs","RestWebsocket","config","tabId","url","setUrl","messageDraft","setMessageDraft","messages","connectionStatus","stats","connect","disconnect","sendMessage","useRestWebsocket","ConnectionBar","MessageInput","MessageLog","useCallback","useEffect","useCallback","useEffect","useRef","useState","createGraphqlWsClient","wsUrl","query","variables","handlers","ws","subscriptionId","ackReceived","sendSubscribe","event","msg","e","useGqlSubscription","tabId","defaultWsUrl","defaultQuery","defaultVariables","_a","_b","_c","_d","_e","getState","setState","useTabState","saved","wsUrl","setWsUrl","useState","events","setEvents","connectionStatus","setConnectionStatus","stats","setStats","initialQuery","initialVariables","persist","useCallback","patch","current","saveQuery","query","saveVariables","variables","setWsUrlPersist","next","prev","value","clientRef","useRef","durationIntervalRef","startTimeRef","eventsRef","statsRef","cleanup","appendEvent","text","separator","connect","parsedVariables","e","client","createGraphqlWsClient","data","formatted","prettifyJSON","error","msg","disconnect","useEffect","Fragment","jsx","jsxs","StatsBar","connectionStatus","stats","STATUS_COLORS","formatDuration","GqlSubscription","config","tabId","wsUrl","setWsUrl","initialQuery","initialVariables","saveQuery","saveVariables","events","connect","disconnect","useGqlSubscription","queryEditorRef","onQueryMountBase","useMonacoMount","variableEditorRef","onVariableMountBase","outputEditorRef","onOutputMountBase","onOutputMount","useCallback","editor","monaco","onQueryMount","onVariableMount","handleConnect","_a","_b","_c","_d","query","variables","useEffect","model","ConnectionBar","MemoizedSnippet","memo","VscClose","jsx","jsxs","TabBar","tabs","activeTabId","onTabClick","onTabClose","tab","isActive","Typography","VscClose","e","MemoizedTabBar","memo","Component","jsx","jsxs","ErrorBoundary","Component","error","info","_a","_b","Typography","jsx","jsxs","resolveTemplateConfig","config","navItem","subNavItem","_a","primary","c","secondary","t","tabCounter","nextTabId","createTab","existingTabs","templateConfig","sameTypeTabs","TEMPLATE_COMPONENT_MAP","MemoizedStaticDataViewer","MemoizedCacheViewer","QueryExecutor","MutationExecutor","CustomQuery","CustomMutation","FetchAndMutate","SchemaViewer","RestApi","Sse","RestWebsocket","GqlSubscription","APIPlaygroundView","_b","_c","_d","removeState","useTabState","firstNavItem","firstSubNavItem","tabs","setTabs","useState","activeTabId","setActiveTabId","activeNavItem","setActiveNavItem","activeSubNavItem","setActiveSubNavItem","onNavItemClick","useCallback","existing","newTab","prev","onAddTab","onTabClick","tabId","tab","onTabClose","updated","defaultTab","last","activeTab","activeTemplateConfig","useMemo","el","Component","TemplateComponent","TabStateProvider","HistoryProvider","SnackbarProvider","MemoizedSideNav","MemoizedTabBar","ErrorBoundary","APIPlayground","Typography","useLayoutEffect","useState","useIsClientSide","isMounted","setMounted","jsx","Container","props","useIsClientSide","APIPlayground","FieldConfigMapBuilder","field"]}