{"version":3,"sources":["../src/index.ts","../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":["export { APIPlayground } from './Container';\n\nexport { Template } from './constants/template';\nexport { Language } from './constants/language';\nexport { FormFieldType } from './constants/formFieldTypes';\n\nexport type {\n  APIPlaygroundProps,\n  TemplateConfig,\n  StaticDataConfig,\n  CacheViewerConfig,\n  QueryExecutorConfig,\n  MutationExecutorConfig,\n  NestedTemplateConfig,\n  CustomQueryConfig,\n  CustomMutationConfig,\n  FetchAndMutateConfig,\n  CustomTemplateConfig,\n  SchemaViewerConfig,\n  RestApiConfig,\n  SseConfig,\n  RestWebsocketConfig,\n  GqlSubscriptionConfig,\n} from './types';\n\nexport { FieldConfigMapBuilder } from './utils/FieldConfigMapBuilder';\n","'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":["index_exports","__export","Container","FieldConfigMapBuilder","FormFieldType","Language","Template","__toCommonJS","import_react","import_react","import_react","import_jsx_runtime","Typography","variant","className","rest","import_vsc","import_bs","import_vsc","handleKeyDown","action","import_jsx_runtime","ChildMenuItem","id","title","selected","onClick","onAddTab","e","handleKeyDown","Typography","Template","import_jsx_runtime","MenuItem","config","activeNavItem","activeSubNavItem","onNavItemClick","onAddTab","open","setOpen","isSelected","isNestedTemplate","onMenuItemClick","_a","onChildItemClick","child","onChildAddTab","e","handleKeyDown","Typography","a","ChildMenuItem","import_jsx_runtime","SideNav","config","activeNavItem","activeSubNavItem","onNavItemClick","onAddTab","item","MenuItem","MemoizedSideNav","import_react","import_react","import_react","import_react","import_jsx_runtime","TIMEOUT","Tooltip","content","children","coords","setCoords","timerRef","onMouseEnter","ev","domRect","onMouseLeave","import_jsx_runtime","VARIANT_VS_CLASSNAME","SIZE_VS_CLASSNAME","Button","className","loading","variant","size","tooltipContent","icon","selected","disabled","rest","mergedClassName","Tooltip","onMouseEnter","onMouseLeave","import_jsx_runtime","RightActions","actions","onActionClick","className","loading","handleActionClick","ev","Icon","label","id","type","disabled","Button","MemoizedRightActions","import_react","import_jsx_runtime","ButtonGroup","style","className","config","selectedIdx","size","onClick","button","idx","Button","import_jsx_runtime","Tabs","tabs","selectedTabIdx","onTabClick","className","onTabSwitch","idx","ButtonGroup","import_jsx_runtime","Loader","import_jsx_runtime","FullSizeLoader","Loader","import_react","import_react_use","import_vsc","Language","LANGAUGE_VS_MIME_TYPE","LANGAUGE_VS_EXTENSION","downloadFile","data","filename","language","blob","url","anchor","import_graphql","prettifyGQL","q","ACTION_TYPE","ACTIONS","useMonacoActions","title","onParentActionClick","onParentMount","language","editorRef","onMount","mEditor","_monaco","_","copyToClipboard","onActionClick","action","_a","_b","_c","_d","_e","_f","_g","content","downloadFile","prettifyGQL","e","DEFAULT_CONFIG","getMonacoConfig","readOnly","darkMode","import_jsx_runtime","import_react","Snippet","title","className","tabs","selectedTabIdx","onTabClick","_actions","onActionClick","errors","editorProps","loading","_a","_b","monacoConfig","getMonacoConfig","onMount","handleActionClick","actions","useMonacoActions","rightActions","a1","a2","Typography","Tabs","MemoizedRightActions","MonacoEditor","FullSizeLoader","MemoizedSnippet","prettifyJSON","obj","import_jsx_runtime","StaticDataViewer","config","data","title","language","readOnly","stringifiedData","prettifyJSON","editorProps","MemoizedSnippet","MemoizedStaticDataViewer","import_react","import_react","import_vsc","import_react","import_react_dom","import_vsc","import_ai","import_jsx_runtime","SuccessIcon","ErrorIcon","INTENT_VS_ERROR","Snackbar","message","intent","Icon","import_jsx_runtime","SnackbarContext","SnackbarProvider","children","state","setState","timerRef","clearStateAfterInterval","contextValue","message","Snackbar","useSnackbar","import_react","useMonacoMount","editorRef","onMount","mEditor","recursivelyExpandData","data","cache","level","acc","key","obj","getExpandedData","client","TABS","REFRESH_ACTION","UPDATE_CACHE_ACTION","useCacheViewer","config","client","readOnly","tabIdx","setTabIdx","count","setCount","onError","onSuccess","useSnackbar","editorRef","onMount","useMonacoMount","stringifiedData","prettifyJSON","expandedData","getExpandedData","expandedStringifiedData","tabData","onActionClick","action","_a","_b","c","parsedCache","e","actions","TABS","import_jsx_runtime","CacheViewer","config","title","readOnly","data","onTabClick","selectedTabIdx","tabs","onActionClick","actions","onMount","useCacheViewer","editorProps","MemoizedSnippet","MemoizedCacheViewer","import_react","import_react_use","import_react","import_react","import_graphql","useInputEditor","parentOnMount","onSubmit","errors","setErrors","editorRef","onChange","content","parsedGQLNode","e","onMount","mEditor","_monaco","_a","ev","latestErrors","import_jsx_runtime","InputEditor","title","onSubmit","parentOnMount","className","onMount","onChange","errors","useInputEditor","editorProps","MemoizedSnippet","import_react","import_react","import_react","useValidateJSON","onChange","errors","setErrors","handleChange","content","ev","parsedVariables","e","useVariableEditor","parentOnMount","onSubmit","errors","handleChange","useValidateJSON","editorRef","onMount","mEditor","_monaco","ev","latestErrors","import_jsx_runtime","VariableEditor","title","onSubmit","className","parentOnMount","onChange","onMount","errors","useVariableEditor","editorProps","MemoizedSnippet","MemoizedVariableEditor","import_react","import_jsx_runtime","OutputEditor","title","readOnly","onMount","className","loading","editorProps","MemoizedSnippet","MemoizedOutputEditor","import_react","import_react","import_react","import_jsx_runtime","SIZE_VS_CLASSNAME","Input","className","error","type","size","isActive","rest","ref","onWheel","ev","import_react","import_react_use","import_jsx_runtime","Popover","content","children","_a","coords","setCoords","popoverContainerRef","childRef","latestCoordsRef","onClick","ev","domRect","onClose","childDomRect","import_react","import_jsx_runtime","Menu","options","onClose","onChange","selected","elementsMap","_a","option","el","Typography","import_vsc","import_jsx_runtime","Select","options","onChange","placeholder","size","value","className","touched","setTouched","search","setSearch","filteredOptions","option","Popover","close","Menu","onClick","isOpen","ref","Input","e","import_react","import_graphql","useQuerySelector","config","onChange","client","selectedOption","setSelectedOption","options","queriesMap","query","_a","_b","_c","_d","_e","name","def","variables","node","onOptionSelect","option","output","prettifyJSON","e","import_jsx_runtime","QuerySelector","config","onChange","className","options","selectedOption","onOptionSelect","useQuerySelector","Select","MemoizedQuerySelector","import_react","import_jsx_runtime","ExecutionStats","stats","MemoizedExecutionStats","import_react","import_vsc","import_jsx_runtime","formatTime","ts","truncate","text","maxLen","HistoryListItem","entry","onSelect","onClose","Typography","HistoryList","entries","onClear","Button","QueryHistory","open","setOpen","containerRef","o","MemoizedQueryHistory","import_vsc","import_react","import_react","import_graphql","import_react","useGraphQLExecution","executeFn","outputEditorRef","loading","setLoading","stats","setStats","execute","variables","_a","_b","_c","_d","startTime","data","errorMessage","result","prettifyJSON","elapsed","e","import_react","import_jsx_runtime","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","variables","_a","_b","_c","_d","_e","document","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","query","variables","output","import_react","import_react","MAX_ENTRIES","getStorageKey","instanceId","readEntries","raw","e","writeEntries","entries","useQueryHistory","setEntries","addEntry","entry","newEntry","prev","updated","clearHistory","clearHistoryForType","templateType","import_jsx_runtime","HistoryContext","HistoryProvider","instanceId","children","history","useQueryHistory","useHistory","templateType","ctx","filteredEntries","e","clearHistory","escapeShellArg","str","generateCurl","url","method","headers","body","parts","key","value","generateGraphQLCurl","endpoint","query","variables","bodyObj","e","getApolloUri","client","_a","_b","_c","import_jsx_runtime","QUERY_CONTAINER_CLASSNAME","VARIABLE_CONTAINER_CLASSNAME","QueryExecutor","config","tabId","_a","_b","_c","_d","_e","_f","_g","_h","entries","addEntry","clearHistory","useHistory","onExecutionComplete","data","onInputMount","onOutputMount","onVariableMount","onSubmit","loading","onQuerySelect","stats","inputEditorRef","variableEditorRef","useQueryExecutor","copyToClipboard","handleCopyCurl","query","variables","endpoint","getApolloUri","curl","generateGraphQLCurl","onHistorySelect","entry","MemoizedQuerySelector","MemoizedQueryHistory","Button","InputEditor","MemoizedVariableEditor","MemoizedOutputEditor","MemoizedExecutionStats","import_react","import_react_use","import_react","import_react","import_graphql","useMutationSelector","onChange","selectedOption","setSelectedOption","onOptionSelect","option","node","variables","prettifyJSON","import_jsx_runtime","MutationSelector","config","onChange","className","_a","selectedOption","onOptionSelect","useMutationSelector","Select","MemoizedMutationSelector","import_vsc","import_react","useMutationExecutor","config","tabId","onExecutionComplete","onSelect","onInputMount","onVariableMount","onOutputMount","onSubmit","loading","stats","inputEditorRef","variableEditorRef","useGraphQLExecutor","onMutationSelect","mutation","variables","output","import_jsx_runtime","QUERY_CONTAINER_CLASSNAME","VARIABLE_CONTAINER_CLASSNAME","MutationExecutor","config","tabId","_a","_b","_c","_d","_e","_f","_g","_h","_i","entries","addEntry","clearHistory","useHistory","onExecutionComplete","data","onInputMount","onOutputMount","onVariableMount","onSubmit","loading","onMutationSelect","stats","inputEditorRef","variableEditorRef","useMutationExecutor","copyToClipboard","handleCopyCurl","query","variables","endpoint","getApolloUri","curl","generateGraphQLCurl","onHistorySelect","entry","MemoizedMutationSelector","MemoizedQueryHistory","Button","InputEditor","MemoizedVariableEditor","MemoizedOutputEditor","MemoizedExecutionStats","import_react","import_jsx_runtime","OutputEditor","title","readOnly","onMount","className","loading","editorProps","MemoizedSnippet","MemoizedOutputEditor","import_react","FormFieldType","import_react","import_jsx_runtime","FormControl","onBlur","error","label","children","required","Typography","import_react","useFormField","fieldId","onAction","onBlur","onChange","value","import_jsx_runtime","TextInput","id","label","onAction","error","readOnly","required","value","placeholder","onBlur","onChange","useFormField","handleChange","ev","FormControl","Input","MemoizedTextInput","import_react","import_jsx_runtime","NumberInput","id","label","onAction","error","readOnly","required","value","placeholder","onBlur","onChange","useFormField","handleChange","ev","FormControl","Input","MemoizedNumberInput","import_react","import_jsx_runtime","JSONInput","id","label","onAction","error","readOnly","required","value","onBlur","onChange","useFormField","monacoConfig","getMonacoConfig","valueRef","validationErrors","handleChange","useValidateJSON","FormControl","MonacoEditor","FullSizeLoader","MemoizedJSONInput","import_jsx_runtime","FIELD_TYPE_VS_COMPONENT","MemoizedTextInput","MemoizedNumberInput","MemoizedJSONInput","Arranger","layout","fieldConfigMap","errors","values","onAction","fields","horizontal","field","config","Component","MemoizedArranger","Form","loading","onSubmit","onKeyDown","e","Button","MemoizedForm","import_react","useForm","fieldConfigMap","validator","initialValues","onSubmit","values","setValues","errors","setErrors","submitCountRef","defaultValidator","vals","acc","key","_a","latestValuesRef","onAction","action","newVals","validationErrors","import_react","useCustomQuery","config","outputEditorRef","onOutputEditorMount","useMonacoMount","getVariables","query","client","executeFn","variables","data","error","loading","stats","execute","useGraphQLExecution","onSubmit","vals","import_jsx_runtime","CustomQuery","config","_a","fieldConfigMap","formLayout","validator","initialValues","outputConfig","loading","stats","onSubmit","onOutputEditorMount","useCustomQuery","onAction","values","errors","useForm","MemoizedForm","MemoizedOutputEditor","MemoizedExecutionStats","import_react","useCustomMutation","config","outputEditorRef","onOutputEditorMount","useMonacoMount","getVariables","mutation","client","executeFn","variables","_a","data","errors","loading","stats","execute","useGraphQLExecution","onSubmit","vals","import_jsx_runtime","CustomMutation","config","_a","fieldConfigMap","formLayout","validator","initialValues","outputConfig","loading","stats","onSubmit","onOutputEditorMount","useCustomMutation","onAction","values","errors","useForm","MemoizedForm","MemoizedOutputEditor","MemoizedExecutionStats","import_react","import_react","import_vsc","EXECUTE_MUTATION","useFetchAndMutate","config","mutationOutputEditorRef","queryOutputEditorRef","isQueryExecuted","setIsQueryExecuted","queryResponseErrors","handleQueryResponseChange","useValidateJSON","fieldConfigMap","initialValues","validator","getQueryVariables","query","cta","getMutationVariables","mutation","client","fetchExecuteFn","variables","data","error","mutateExecuteFn","_a","errors","fetching","fetchStats","executeFetch","useGraphQLExecution","mutating","mutateStats","executeMutate","onFetchSubmit","vals","onAction","formValues","formErrors","useForm","latestFormValuesRef","onQueryActionClick","action","mutationVariables","queryActions","import_jsx_runtime","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","mutationOutputEditorProps","MemoizedForm","MemoizedSnippet","MemoizedExecutionStats","import_react","import_client","INTROSPECTION_QUERY","import_jsx_runtime","SchemaViewer","config","loading","setLoading","editorRef","onMount","useMonacoMount","fetchSchema","_a","_b","result","INTROSPECTION_QUERY","formatted","prettifyJSON","err","errMsg","editorProps","MemoizedSnippet","import_react","import_react_use","import_vsc","import_jsx_runtime","HTTP_METHODS","HTTP_METHOD_OPTIONS","m","RequestBar","method","setMethod","url","setUrl","execute","Select","o","Input","e","Button","import_vsc","import_jsx_runtime","HeadersEditor","headers","addHeader","removeHeader","updateHeader","Typography","Button","header","index","Input","e","import_react","import_jsx_runtime","ResponsePanel","response","loading","stats","responseEditorRef","onResponseMount","actions","onActionClick","_a","MemoizedSnippet","import_vsc","import_react","toHeaderArray","headers","entries","key","value","useRestApi","defaultUrl","defaultMethod","defaultHeaders","defaultBody","url","setUrl","method","setMethod","setHeaders","body","setBody","response","setResponse","loading","setLoading","stats","setStats","addHeader","prev","removeHeader","index","_","i","updateHeader","field","val","h","execute","headerObj","fetchOptions","start","res","duration","responseText","json","prettifyJSON","e","import_jsx_runtime","RestApi","config","url","setUrl","method","setMethod","headers","addHeader","removeHeader","updateHeader","body","setBody","response","loading","stats","execute","useRestApi","responseEditorRef","onResponseMount","useMonacoMount","copyToClipboard","curlAction","handleCurlAction","action","headerObj","h","curl","generateCurl","onBodyChange","value","RequestBar","HeadersEditor","MemoizedSnippet","ResponsePanel","import_react","import_vsc","import_jsx_runtime","ConnectionBar","url","setUrl","connectionStatus","onConnect","onDisconnect","placeholder","isConnected","isConnecting","Input","e","Button","import_react","STATUS_COLORS","formatDuration","ms","seconds","minutes","remainingSeconds","import_jsx_runtime","formatBytes","bytes","SseOutputPanel","events","connectionStatus","stats","editorRef","onMount","model","MemoizedSnippet","STATUS_COLORS","formatDuration","import_react","toHeaderArray","headers","entries","key","value","useSse","tabId","defaultUrl","defaultHeaders","_a","_b","_c","_d","getState","setState","useTabState","saved","url","setUrl","setHeaders","events","setEvents","connectionStatus","setConnectionStatus","stats","setStats","persist","patch","current","setUrlPersist","next","prev","persistHeaders","updater","abortControllerRef","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","import_jsx_runtime","Sse","config","tabId","url","setUrl","headers","addHeader","removeHeader","updateHeader","events","connectionStatus","stats","connect","disconnect","useSse","editorRef","onMountBase","useMonacoMount","onMount","editor","monaco","ConnectionBar","HeadersEditor","SseOutputPanel","import_react","import_vsc","import_jsx_runtime","MessageInput","connectionStatus","onSend","draft","setDraft","editorRef","rawMount","useMonacoMount","isConnected","onMount","editor","monaco","handleSend","_a","value","MemoizedSnippet","action","import_react","import_vsc","import_jsx_runtime","formatTime","ts","MessageLog","messages","connectionStatus","stats","scrollRef","Typography","msg","STATUS_COLORS","formatDuration","import_react","useRestWebsocket","tabId","defaultUrl","_a","_b","_c","_d","getState","setState","useTabState","saved","url","setUrl","messageDraft","setMessageDraft","messages","setMessages","connectionStatus","setConnectionStatus","stats","setStats","persist","patch","current","setUrlPersist","next","prev","value","setMessageDraftPersist","wsRef","durationIntervalRef","startTimeRef","statsRef","messageIdRef","nextMessageId","cleanup","appendMessage","msg","connect","ws","event","e","disconnect","sendMessage","data","import_jsx_runtime","RestWebsocket","config","tabId","url","setUrl","messageDraft","setMessageDraft","messages","connectionStatus","stats","connect","disconnect","sendMessage","useRestWebsocket","ConnectionBar","MessageInput","MessageLog","import_react","import_react","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","events","setEvents","connectionStatus","setConnectionStatus","stats","setStats","initialQuery","initialVariables","persist","patch","current","saveQuery","query","saveVariables","variables","setWsUrlPersist","next","prev","value","clientRef","durationIntervalRef","startTimeRef","eventsRef","statsRef","cleanup","appendEvent","text","separator","connect","parsedVariables","e","client","createGraphqlWsClient","data","formatted","prettifyJSON","error","msg","disconnect","import_jsx_runtime","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","editor","monaco","onQueryMount","onVariableMount","handleConnect","_a","_b","_c","_d","query","variables","model","ConnectionBar","MemoizedSnippet","import_react","import_vsc","import_jsx_runtime","TabBar","tabs","activeTabId","onTabClick","onTabClose","tab","isActive","Typography","e","MemoizedTabBar","import_react","import_jsx_runtime","ErrorBoundary","error","info","_a","_b","Typography","import_jsx_runtime","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","activeTabId","setActiveTabId","activeNavItem","setActiveNavItem","activeSubNavItem","setActiveSubNavItem","onNavItemClick","existing","newTab","prev","onAddTab","onTabClick","tabId","tab","onTabClose","updated","defaultTab","last","activeTab","activeTemplateConfig","el","Component","TemplateComponent","TabStateProvider","HistoryProvider","SnackbarProvider","MemoizedSideNav","MemoizedTabBar","ErrorBoundary","APIPlayground","Typography","import_react","useIsClientSide","isMounted","setMounted","import_jsx_runtime","Container","props","useIsClientSide","APIPlayground","FieldConfigMapBuilder","field"]}