db-studio 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/index.js +29 -27
  2. package/dist/index.js.map +1 -1
  3. package/dist/web-dist/assets/_pathlessLayout-C6coCMpi.js +1 -0
  4. package/dist/web-dist/assets/{_pathlessLayout-ciCuJ1PR.js.map → _pathlessLayout-C6coCMpi.js.map} +1 -1
  5. package/dist/web-dist/assets/_pathlessLayout-DoBLI2ja.js +132 -0
  6. package/dist/web-dist/assets/_pathlessLayout-DoBLI2ja.js.map +1 -0
  7. package/dist/web-dist/assets/_queryId-Chj34V6b.js +1 -0
  8. package/dist/web-dist/assets/{_queryId-6swfGplM.js.map → _queryId-Chj34V6b.js.map} +1 -1
  9. package/dist/web-dist/assets/{_table-DHk3bHnN.js → _table-Bg4NvAi4.js} +1 -1
  10. package/dist/web-dist/assets/{_table-DHk3bHnN.js.map → _table-Bg4NvAi4.js.map} +1 -1
  11. package/dist/web-dist/assets/_table-CHFe8v3q.js +1 -0
  12. package/dist/web-dist/assets/{_table-dUsH_2LP.js.map → _table-CHFe8v3q.js.map} +1 -1
  13. package/dist/web-dist/assets/ai-assistant-D2oc4TtC.js +1 -0
  14. package/dist/web-dist/assets/ai-assistant-D2oc4TtC.js.map +1 -0
  15. package/dist/web-dist/assets/browser-B3ZulIJb.js +1 -0
  16. package/dist/web-dist/assets/{browser-CKmBpcoz.js.map → browser-B3ZulIJb.js.map} +1 -1
  17. package/dist/web-dist/assets/code-editor-q3FlZk-L.js +9 -0
  18. package/dist/web-dist/assets/code-editor-q3FlZk-L.js.map +1 -0
  19. package/dist/web-dist/assets/{database.store-BvoUSH8Y.js → database.store-O79u8Fhj.js} +1 -1
  20. package/dist/web-dist/assets/{database.store-BvoUSH8Y.js.map → database.store-O79u8Fhj.js.map} +1 -1
  21. package/dist/web-dist/assets/{dist-C-7rnx4R.js → dist-DBHqGKiG.js} +1 -1
  22. package/dist/web-dist/assets/{dist-C-7rnx4R.js.map → dist-DBHqGKiG.js.map} +1 -1
  23. package/dist/web-dist/assets/highlighted-body-OFNGDK62-CFFJC4SW.js +1 -0
  24. package/dist/web-dist/assets/{highlighted-body-OFNGDK62-qZDgwznf.js.map → highlighted-body-OFNGDK62-CFFJC4SW.js.map} +1 -1
  25. package/dist/web-dist/assets/{icons-0UA1AvNu.js → icons-CtpwLWUI.js} +1 -1
  26. package/dist/web-dist/assets/icons-CtpwLWUI.js.map +1 -0
  27. package/dist/web-dist/assets/index-Cyl_0l9I.css +2 -0
  28. package/dist/web-dist/assets/index-XoXxezo4.js +35 -0
  29. package/dist/web-dist/assets/index-XoXxezo4.js.map +1 -0
  30. package/dist/web-dist/assets/{indexes-D-oUHra7.js → indexes-C9QqJKhp.js} +1 -1
  31. package/dist/web-dist/assets/{indexes-D-oUHra7.js.map → indexes-C9QqJKhp.js.map} +1 -1
  32. package/dist/web-dist/assets/{logs-wkipM6zd.js → logs-B8ah8F7D.js} +1 -1
  33. package/dist/web-dist/assets/{logs-wkipM6zd.js.map → logs-B8ah8F7D.js.map} +1 -1
  34. package/dist/web-dist/assets/mermaid-GHXKKRXX-TpVEoP0K.js +1 -0
  35. package/dist/web-dist/assets/popover-wbdw6Hmx.js +1 -0
  36. package/dist/web-dist/assets/popover-wbdw6Hmx.js.map +1 -0
  37. package/dist/web-dist/assets/queries.store-CoJVGJKk.js +1 -0
  38. package/dist/web-dist/assets/queries.store-CoJVGJKk.js.map +1 -0
  39. package/dist/web-dist/assets/query-runner-Bgs0j50a.js +17 -0
  40. package/dist/web-dist/assets/query-runner-Bgs0j50a.js.map +1 -0
  41. package/dist/web-dist/assets/radix-ui-CgJOuzDv.js +51 -0
  42. package/dist/web-dist/assets/radix-ui-CgJOuzDv.js.map +1 -0
  43. package/dist/web-dist/assets/react-Cxb6eTZp.js +1 -0
  44. package/dist/web-dist/assets/{react-B_x-GW6a.js.map → react-Cxb6eTZp.js.map} +1 -1
  45. package/dist/web-dist/assets/{react-dom-CsRkF-uK.js → react-dom-yg5bT29P.js} +1 -1
  46. package/dist/web-dist/assets/{react-dom-CsRkF-uK.js.map → react-dom-yg5bT29P.js.map} +1 -1
  47. package/dist/web-dist/assets/redis-value-COa6YzFD.js +1 -0
  48. package/dist/web-dist/assets/{redis-value-Dq29EMpv.js.map → redis-value-COa6YzFD.js.map} +1 -1
  49. package/dist/web-dist/assets/runner-DW5iXMmq.js +1 -0
  50. package/dist/web-dist/assets/{runner-CL63BPMX.js.map → runner-DW5iXMmq.js.map} +1 -1
  51. package/dist/web-dist/assets/schema-CtOicTEt.js +64 -0
  52. package/dist/web-dist/assets/schema-CtOicTEt.js.map +1 -0
  53. package/dist/web-dist/assets/{schema-CIr5j9z3.js → schema-oy5o_4bt.js} +1 -1
  54. package/dist/web-dist/assets/{schema-CIr5j9z3.js.map → schema-oy5o_4bt.js.map} +1 -1
  55. package/dist/web-dist/assets/{table-BoQghHv7.js → table-CN9ZTCOi.js} +1 -1
  56. package/dist/web-dist/assets/{table-BoQghHv7.js.map → table-CN9ZTCOi.js.map} +1 -1
  57. package/dist/web-dist/assets/{tanstack-C-qfmRNM.js → tanstack-g1w0v_rJ.js} +6 -6
  58. package/dist/web-dist/assets/tanstack-g1w0v_rJ.js.map +1 -0
  59. package/dist/web-dist/assets/tooltip-B7gM8xl3.js +9 -0
  60. package/dist/web-dist/assets/tooltip-B7gM8xl3.js.map +1 -0
  61. package/dist/web-dist/assets/{visualizer-qFaRAy7F.js → visualizer-DcEwqmuY.js} +1 -1
  62. package/dist/web-dist/assets/{visualizer-qFaRAy7F.js.map → visualizer-DcEwqmuY.js.map} +1 -1
  63. package/dist/web-dist/index.html +12 -12
  64. package/package.json +1 -1
  65. package/dist/web-dist/assets/_pathlessLayout-CJRtdlfu.js +0 -132
  66. package/dist/web-dist/assets/_pathlessLayout-CJRtdlfu.js.map +0 -1
  67. package/dist/web-dist/assets/_pathlessLayout-ciCuJ1PR.js +0 -1
  68. package/dist/web-dist/assets/_queryId-6swfGplM.js +0 -1
  69. package/dist/web-dist/assets/_table-dUsH_2LP.js +0 -1
  70. package/dist/web-dist/assets/browser-CKmBpcoz.js +0 -1
  71. package/dist/web-dist/assets/code-editor-C9H5SO98.js +0 -9
  72. package/dist/web-dist/assets/code-editor-C9H5SO98.js.map +0 -1
  73. package/dist/web-dist/assets/highlighted-body-OFNGDK62-qZDgwznf.js +0 -1
  74. package/dist/web-dist/assets/icons-0UA1AvNu.js.map +0 -1
  75. package/dist/web-dist/assets/index-BSNZ1oRs.js +0 -35
  76. package/dist/web-dist/assets/index-BSNZ1oRs.js.map +0 -1
  77. package/dist/web-dist/assets/index-BWKgNfEb.css +0 -2
  78. package/dist/web-dist/assets/mermaid-GHXKKRXX-BZ1Tdv8E.js +0 -1
  79. package/dist/web-dist/assets/popover-WwEzK7ho.js +0 -1
  80. package/dist/web-dist/assets/popover-WwEzK7ho.js.map +0 -1
  81. package/dist/web-dist/assets/query-runner-B-lngX3P.js +0 -9
  82. package/dist/web-dist/assets/query-runner-B-lngX3P.js.map +0 -1
  83. package/dist/web-dist/assets/radix-ui-6dcJ5m4U.js +0 -51
  84. package/dist/web-dist/assets/radix-ui-6dcJ5m4U.js.map +0 -1
  85. package/dist/web-dist/assets/react-B_x-GW6a.js +0 -1
  86. package/dist/web-dist/assets/redis-value-Dq29EMpv.js +0 -1
  87. package/dist/web-dist/assets/runner-CL63BPMX.js +0 -1
  88. package/dist/web-dist/assets/schema-BNzZaUjg.js +0 -64
  89. package/dist/web-dist/assets/schema-BNzZaUjg.js.map +0 -1
  90. package/dist/web-dist/assets/tanstack-C-qfmRNM.js.map +0 -1
  91. package/dist/web-dist/assets/toggle-group-CxRlYNqR.js +0 -1
  92. package/dist/web-dist/assets/toggle-group-CxRlYNqR.js.map +0 -1
  93. package/dist/web-dist/assets/tooltip-1-bWFncb.js +0 -9
  94. package/dist/web-dist/assets/tooltip-1-bWFncb.js.map +0 -1
@@ -1 +1 @@
1
- import{kt as e}from"./radix-ui-6dcJ5m4U.js";var n=e();function r(){return(0,n.jsx)("main",{className:"flex-1 flex items-center justify-center",children:"Indexes will be available soon!"})}export{r as component};
1
+ import{kt as e}from"./radix-ui-CgJOuzDv.js";var n=e();function r(){return(0,n.jsx)("main",{className:"flex-1 flex items-center justify-center",children:"Indexes will be available soon!"})}export{r as component};
@@ -1 +1 @@
1
- {"version":3,"file":"indexes-D-oUHra7.js","names":["RouteComponent","component"],"sources":["../../src/routes/_pathlessLayout/indexes.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/_pathlessLayout/indexes\")({\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\treturn (\n\t\t<main className=\"flex-1 flex items-center justify-center\">\n\t\t\tIndexes will be available soon!\n\t\t</main>\n\t);\n}\n"],"mappings":"sDAMA,SAASA,GAAiB,CACzB,SACC,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAyC,SAAA,iCAEnD,CAAA,CAER"}
1
+ {"version":3,"file":"indexes-C9QqJKhp.js","names":["RouteComponent","component"],"sources":["../../src/routes/_pathlessLayout/indexes.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/_pathlessLayout/indexes\")({\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\treturn (\n\t\t<main className=\"flex-1 flex items-center justify-center\">\n\t\t\tIndexes will be available soon!\n\t\t</main>\n\t);\n}\n"],"mappings":"sDAMA,SAASA,GAAiB,CACzB,SACC,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAyC,SAAA,iCAEnD,CAAA,CAER"}
@@ -1 +1 @@
1
- import{kt as e}from"./radix-ui-6dcJ5m4U.js";var t=e();function r(){return(0,t.jsx)("main",{className:"flex-1 flex items-center justify-center",children:"Logs will be available soon!"})}export{r as component};
1
+ import{kt as e}from"./radix-ui-CgJOuzDv.js";var t=e();function r(){return(0,t.jsx)("main",{className:"flex-1 flex items-center justify-center",children:"Logs will be available soon!"})}export{r as component};
@@ -1 +1 @@
1
- {"version":3,"file":"logs-wkipM6zd.js","names":["RouteComponent","component"],"sources":["../../src/routes/_pathlessLayout/logs.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/_pathlessLayout/logs\")({\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\treturn (\n\t\t<main className=\"flex-1 flex items-center justify-center\">\n\t\t\tLogs will be available soon!\n\t\t</main>\n\t);\n}\n"],"mappings":"sDAMA,SAASA,GAAiB,CACzB,SACC,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAyC,SAAA,8BAEnD,CAAA,CAER"}
1
+ {"version":3,"file":"logs-B8ah8F7D.js","names":["RouteComponent","component"],"sources":["../../src/routes/_pathlessLayout/logs.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\";\n\nexport const Route = createFileRoute(\"/_pathlessLayout/logs\")({\n\tcomponent: RouteComponent,\n});\n\nfunction RouteComponent() {\n\treturn (\n\t\t<main className=\"flex-1 flex items-center justify-center\">\n\t\t\tLogs will be available soon!\n\t\t</main>\n\t);\n}\n"],"mappings":"sDAMA,SAASA,GAAiB,CACzB,SACC,EAAA,KAAC,OAAD,CAAM,UAAU,0CAAyC,SAAA,8BAEnD,CAAA,CAER"}
@@ -0,0 +1 @@
1
+ import{a as o}from"./_pathlessLayout-DoBLI2ja.js";export{o as Mermaid};
@@ -0,0 +1 @@
1
+ import{r as p}from"./rolldown-runtime-CXHxssQy.js";import{ut as g}from"./icons-CtpwLWUI.js";import{A as f,D as v,Et as m,O as b,j as x,k as A,kt as E,pt as C}from"./radix-ui-CgJOuzDv.js";import{U as n,V as h,a as i}from"./tooltip-B7gM8xl3.js";var o=E(),s=p(g(),1),_=s.createContext(!1),S=()=>s.useContext(_);function L({className:e,type:t,variant:r="default",...a}){return(0,o.jsx)("input",{type:t,"data-slot":"input","data-variant":r,className:n("border-input focus-visible:border-ring focus-visible:ring-ring/30 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-7 rounded-sm border px-2 py-0.5 text-sm transition-colors file:h-6 file:text-xs/relaxed file:font-medium focus-visible:ring-[2px] aria-invalid:ring-[2px] md:text-xs/relaxed file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",r==="default"&&"bg-input/20 dark:bg-input/30",r==="outline"&&"bg-transparent",e),...a})}function N({className:e,...t}){return(0,o.jsx)(C,{"data-slot":"label",className:n("gap-2 text-xs/relaxed leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed",e),...t})}var j={all:[i.CACHE_KEYS.DATABASES_LIST],list:()=>[i.CACHE_KEYS.DATABASES_LIST],current:()=>[i.CACHE_KEYS.CURRENT_DATABASE],connectionInfo:()=>[i.CACHE_KEYS.DATABASE_CONNECTION_INFO]},w={all:["tables"],lists:()=>[i.CACHE_KEYS.TABLES_LIST],list:e=>[i.CACHE_KEYS.TABLES_LIST,e],columnsByTable:e=>[i.CACHE_KEYS.TABLE_COLUMNS,e],columns:(e,t)=>[i.CACHE_KEYS.TABLE_COLUMNS,e,t],dataByTable:e=>[i.CACHE_KEYS.TABLE_DATA,e],data:({tableName:e,cursor:t,limit:r,direction:a,sort:d,order:l,filters:u,db:c})=>[i.CACHE_KEYS.TABLE_DATA,e,t,r,a,d,l,u,c],schema:(e,t)=>["table-schema",e,t]},D={all:["redis-keys"],list:(e,t,r,a)=>["redis-keys","list",e,t,r,a],detail:(e,t,r,a)=>["redis-keys","detail",e,t,r,a]},H={rateLimit:()=>["rate-limit"]},y=h("h-5 gap-1 rounded-full border border-transparent px-2 py-0.5 text-[0.625rem] font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-2.5! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-colors overflow-hidden group/badge",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground bg-input/20 dark:bg-input/30",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function Y({className:e,variant:t="default",asChild:r=!1,...a}){return(0,o.jsx)(r?m:"span",{"data-slot":"badge","data-variant":t,className:n(y({variant:t}),e),...a})}function I({modal:e,...t}){const r=S();return(0,o.jsx)(f,{"data-slot":"popover",modal:e??(r?!0:void 0),...t})}function O({...e}){return(0,o.jsx)(x,{"data-slot":"popover-trigger",...e})}function P({className:e,align:t="center",sideOffset:r=4,...a}){return(0,o.jsx)(A,{children:(0,o.jsx)(b,{"data-slot":"popover-content",align:t,sideOffset:r,className:n("bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-4 rounded-lg p-2.5 text-xs shadow-md ring-1 duration-100 z-50 w-72 origin-(--radix-popover-content-transform-origin) outline-hidden",e),...a})})}function z({...e}){return(0,o.jsx)(v,{"data-slot":"popover-anchor",...e})}export{Y as a,D as c,L as d,_ as f,O as i,w as l,z as n,H as o,P as r,j as s,I as t,N as u};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover-wbdw6Hmx.js","names":[],"sources":["../../../ui/src/dialog-context.ts","../../../ui/src/primitives/input.tsx","../../../ui/src/primitives/label.tsx","../../src/shared/query/keys.ts","../../../ui/src/primitives/badge.tsx","../../../ui/src/primitives/popover.tsx"],"sourcesContent":["import * as React from \"react\";\n\nexport const DialogContext = React.createContext<boolean>(false);\nexport const useDialogContext = () => React.useContext(DialogContext);\n","import type * as React from \"react\";\n\nimport { cn } from \"../utils\";\n\ntype InputVariant = \"default\" | \"outline\";\n\nfunction Input({\n\tclassName,\n\ttype,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"input\"> & {\n\tvariant?: InputVariant;\n}) {\n\treturn (\n\t\t<input\n\t\t\ttype={type}\n\t\t\tdata-slot=\"input\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"border-input focus-visible:border-ring focus-visible:ring-ring/30 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-7 rounded-sm border px-2 py-0.5 text-sm transition-colors file:h-6 file:text-xs/relaxed file:font-medium focus-visible:ring-[2px] aria-invalid:ring-[2px] md:text-xs/relaxed file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tvariant === \"default\" && \"bg-input/20 dark:bg-input/30\",\n\t\t\t\tvariant === \"outline\" && \"bg-transparent\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input };\n","\"use client\";\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../utils\";\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n\treturn (\n\t\t<LabelPrimitive.Root\n\t\t\tdata-slot=\"label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-2 text-xs/relaxed leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Label };\n","import { CONSTANTS } from \"@/utils/constants\";\n\nexport const databaseKeys = {\n\tall: [CONSTANTS.CACHE_KEYS.DATABASES_LIST] as const,\n\tlist: () => [CONSTANTS.CACHE_KEYS.DATABASES_LIST] as const,\n\tcurrent: () => [CONSTANTS.CACHE_KEYS.CURRENT_DATABASE] as const,\n\tconnectionInfo: () => [CONSTANTS.CACHE_KEYS.DATABASE_CONNECTION_INFO] as const,\n};\n\nexport const tableKeys = {\n\tall: [\"tables\"] as const,\n\tlists: () => [CONSTANTS.CACHE_KEYS.TABLES_LIST] as const,\n\tlist: (db?: string | null) => [CONSTANTS.CACHE_KEYS.TABLES_LIST, db] as const,\n\tcolumnsByTable: (tableName: string) =>\n\t\t[CONSTANTS.CACHE_KEYS.TABLE_COLUMNS, tableName] as const,\n\tcolumns: (tableName?: string, db?: string | null) =>\n\t\t[CONSTANTS.CACHE_KEYS.TABLE_COLUMNS, tableName, db] as const,\n\tdataByTable: (tableName: string) => [CONSTANTS.CACHE_KEYS.TABLE_DATA, tableName] as const,\n\tdata: ({\n\t\ttableName,\n\t\tcursor,\n\t\tlimit,\n\t\tdirection,\n\t\tsort,\n\t\torder,\n\t\tfilters,\n\t\tdb,\n\t}: {\n\t\ttableName: string;\n\t\tcursor?: string | null;\n\t\tlimit?: string | null;\n\t\tdirection?: string | null;\n\t\tsort?: string | null;\n\t\torder?: string | null;\n\t\tfilters?: string | null;\n\t\tdb?: string | null;\n\t}) =>\n\t\t[\n\t\t\tCONSTANTS.CACHE_KEYS.TABLE_DATA,\n\t\t\ttableName,\n\t\t\tcursor,\n\t\t\tlimit,\n\t\t\tdirection,\n\t\t\tsort,\n\t\t\torder,\n\t\t\tfilters,\n\t\t\tdb,\n\t\t] as const,\n\tschema: (tableName: string, db?: string | null) => [\"table-schema\", tableName, db] as const,\n};\n\nexport const schemaKeys = {\n\tall: [\"schema\"] as const,\n\ttable: (tableName: string, db?: string | null) => tableKeys.schema(tableName, db),\n};\n\nexport const recordKeys = {\n\tall: [\"records\"] as const,\n\tbyTable: (tableName: string, db?: string | null) => [\"records\", tableName, db] as const,\n};\n\nexport const queryRunnerKeys = {\n\tall: [\"query-runner\"] as const,\n\texecution: (db?: string | null) => [\"query-runner\", \"execution\", db] as const,\n};\n\nexport const redisKeyBrowserKeys = {\n\tall: [\"redis-keys\"] as const,\n\tlist: (db: string | null, search: string, exactPattern: boolean, type: string) =>\n\t\t[\"redis-keys\", \"list\", db, search, exactPattern, type] as const,\n\tdetail: (\n\t\tdb: string | null,\n\t\tkey: string | null,\n\t\tfull: boolean,\n\t\tdirection: \"forward\" | \"backward\",\n\t) => [\"redis-keys\", \"detail\", db, key, full, direction] as const,\n};\n\nexport const chatKeys = {\n\trateLimit: () => [\"rate-limit\"] as const,\n};\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../utils\";\n\nconst badgeVariants = cva(\n\t\"h-5 gap-1 rounded-full border border-transparent px-2 py-0.5 text-[0.625rem] font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-2.5! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-colors overflow-hidden group/badge\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n\t\t\t\tsecondary: \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground bg-input/20 dark:bg-input/30\",\n\t\t\t\tghost: \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n\t\t\t\tlink: \"text-primary underline-offset-4 hover:underline\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t},\n);\n\nfunction Badge({\n\tclassName,\n\tvariant = \"default\",\n\tasChild = false,\n\t...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n\tconst Comp = asChild ? Slot : \"span\";\n\n\treturn (\n\t\t<Comp\n\t\t\tdata-slot=\"badge\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(badgeVariants({ variant }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Badge };\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport type * as React from \"react\";\n\nimport { useDialogContext } from \"../dialog-context\";\nimport { cn } from \"../utils\";\n\nfunction Popover({ modal, ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n\tconst inDialog = useDialogContext();\n\treturn (\n\t\t<PopoverPrimitive.Root\n\t\t\tdata-slot=\"popover\"\n\t\t\tmodal={modal ?? (inDialog ? true : undefined)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n\treturn (\n\t\t<PopoverPrimitive.Trigger\n\t\t\tdata-slot=\"popover-trigger\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverContent({\n\tclassName,\n\talign = \"center\",\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Content\n\t\t\t\tdata-slot=\"popover-content\"\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-4 rounded-lg p-2.5 text-xs shadow-md ring-1 duration-100 z-50 w-72 origin-(--radix-popover-content-transform-origin) outline-hidden\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</PopoverPrimitive.Portal>\n\t);\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n\treturn (\n\t\t<PopoverPrimitive.Anchor\n\t\t\tdata-slot=\"popover-anchor\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction _PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-1 text-xs\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction _PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-title\"\n\t\t\tclassName={cn(\"text-sm font-medium\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction _PopoverDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"popover-description\"\n\t\t\tclassName={cn(\"text-muted-foreground\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\t_PopoverDescription as PopoverDescription,\n\t_PopoverHeader as PopoverHeader,\n\t_PopoverTitle as PopoverTitle,\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n\tPopoverTrigger,\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import{t as l}from"./react-Cxb6eTZp.js";import{t as u}from"./middleware-CCyr6cvp.js";var m=l()(u((o,s)=>({folders:[],queries:[],addFolder:r=>o(i=>({folders:[...i.folders,r]})),updateFolder:(r,i)=>o(e=>({folders:e.folders.map(d=>d.id===r?{...d,...i}:d)})),deleteFolder:r=>o(i=>({folders:i.folders.filter(e=>e.id!==r),queries:i.queries.filter(e=>e.folderId!==r)})),toggleFolder:r=>o(i=>({folders:i.folders.map(e=>e.id===r?{...e,isExpanded:!e.isExpanded}:e)})),toggleFavoriteFolder:r=>o(i=>({folders:i.folders.map(e=>e.id===r?{...e,isFavorite:!e.isFavorite}:e)})),addQuery:(r,i)=>{const e=Math.random().toString(36).substring(2,15),d={id:e,name:r??"Untitled Query",query:"",isFavorite:!1,isSelected:!1,folderId:i??void 0};return o(t=>({queries:[...t.queries,d]})),e},updateQuery:(r,i)=>o(e=>({queries:e.queries.map(d=>d.id===r?{...d,...i}:d)})),deleteQuery:r=>o(i=>({queries:i.queries.filter(e=>e.id!==r)})),moveQuery:(r,i)=>o(e=>({queries:e.queries.map(d=>d.id===r?{...d,folderId:i}:d)})),toggleFavorite:r=>o(i=>({queries:i.queries.map(e=>e.id===r?{...e,isFavorite:!e.isFavorite}:e)})),getQueriesByFolder:r=>s().queries.filter(i=>i.folderId===r&&!i.isFavorite).sort((i,e)=>i.name.localeCompare(e.name)),getFavoriteQueries:()=>s().queries.filter(r=>r.isFavorite).sort((r,i)=>r.name.localeCompare(i.name)),getFavoriteFolders:()=>s().folders.filter(r=>r.isFavorite),getQuery:r=>s().queries.find(i=>i.id===r),setSelectedQuery:r=>o(i=>({queries:i.queries.map(e=>e.id===r?{...e,isSelected:!0}:{...e,isSelected:!1})})),getSelectedQuery:()=>s().queries.find(r=>r.isSelected)}),{name:"dbstudio-queries"}));export{m as t};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.store-CoJVGJKk.js","names":[],"sources":["../../src/stores/queries.store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\n\ntype Query = {\n\tid: string;\n\tname: string;\n\tdescription?: string;\n\tquery: string;\n\tisFavorite: boolean;\n\tfolderId?: string;\n\tisSelected: boolean;\n};\n\ntype QueryFolder = {\n\tid: string;\n\tname: string;\n\tisExpanded: boolean;\n\tisFavorite: boolean;\n};\n\ntype QueriesStore = {\n\tfolders: QueryFolder[];\n\tqueries: Query[];\n\n\t// folder ops\n\taddFolder: (folder: QueryFolder) => void;\n\tupdateFolder: (id: string, updates: Partial<QueryFolder>) => void;\n\tdeleteFolder: (id: string) => void;\n\ttoggleFolder: (id: string) => void;\n\ttoggleFavoriteFolder: (id: string) => void;\n\n\t// query ops\n\taddQuery: (name?: string, folderId?: string) => string;\n\tupdateQuery: (id: string, updates: Partial<Query>) => void;\n\tdeleteQuery: (id: string) => void;\n\tmoveQuery: (queryId: string, folderId?: string) => void;\n\ttoggleFavorite: (id: string) => void;\n\n\t// helpers\n\tgetQueriesByFolder: (folderId?: string) => Query[];\n\tgetFavoriteQueries: () => Query[];\n\tgetFavoriteFolders: () => QueryFolder[];\n\tgetQuery: (id: string) => Query | undefined;\n\tsetSelectedQuery: (id: string) => void;\n\tgetSelectedQuery: () => Query | undefined;\n};\n\nexport const useQueriesStore = create<QueriesStore>()(\n\tpersist(\n\t\t(set, get) => ({\n\t\t\tfolders: [],\n\t\t\tqueries: [],\n\n\t\t\taddFolder: (folder) => set((state) => ({ folders: [...state.folders, folder] })),\n\n\t\t\tupdateFolder: (id, updates) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tfolders: state.folders.map((f) => (f.id === id ? { ...f, ...updates } : f)),\n\t\t\t\t})),\n\n\t\t\tdeleteFolder: (id) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tfolders: state.folders.filter((f) => f.id !== id),\n\t\t\t\t\tqueries: state.queries.filter((q) => q.folderId !== id),\n\t\t\t\t})),\n\n\t\t\ttoggleFolder: (id) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tfolders: state.folders.map((f) =>\n\t\t\t\t\t\tf.id === id ? { ...f, isExpanded: !f.isExpanded } : f,\n\t\t\t\t\t),\n\t\t\t\t})),\n\n\t\t\ttoggleFavoriteFolder: (id) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tfolders: state.folders.map((f) =>\n\t\t\t\t\t\tf.id === id ? { ...f, isFavorite: !f.isFavorite } : f,\n\t\t\t\t\t),\n\t\t\t\t})),\n\n\t\t\taddQuery: (name?: string, folderId?: string) => {\n\t\t\t\tconst newId = Math.random().toString(36).substring(2, 15);\n\t\t\t\tconst newQuery: Query = {\n\t\t\t\t\tid: newId,\n\t\t\t\t\tname: name ?? \"Untitled Query\",\n\t\t\t\t\tquery: \"\",\n\t\t\t\t\tisFavorite: false,\n\t\t\t\t\tisSelected: false,\n\t\t\t\t\tfolderId: folderId ?? undefined,\n\t\t\t\t};\n\t\t\t\tset((state) => ({\n\t\t\t\t\tqueries: [...state.queries, newQuery],\n\t\t\t\t}));\n\t\t\t\treturn newId;\n\t\t\t},\n\n\t\t\tupdateQuery: (id, updates) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tqueries: state.queries.map((q) => (q.id === id ? { ...q, ...updates } : q)),\n\t\t\t\t})),\n\n\t\t\tdeleteQuery: (id) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tqueries: state.queries.filter((q) => q.id !== id),\n\t\t\t\t})),\n\n\t\t\tmoveQuery: (queryId, folderId) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tqueries: state.queries.map((q) => (q.id === queryId ? { ...q, folderId } : q)),\n\t\t\t\t})),\n\n\t\t\ttoggleFavorite: (id) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tqueries: state.queries.map((q) =>\n\t\t\t\t\t\tq.id === id ? { ...q, isFavorite: !q.isFavorite } : q,\n\t\t\t\t\t),\n\t\t\t\t})),\n\n\t\t\tgetQueriesByFolder: (folderId) => {\n\t\t\t\tconst state = get();\n\t\t\t\treturn state.queries\n\t\t\t\t\t.filter((q) => q.folderId === folderId && !q.isFavorite)\n\t\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\t\t\t},\n\n\t\t\tgetFavoriteQueries: () => {\n\t\t\t\tconst state = get();\n\t\t\t\treturn state.queries\n\t\t\t\t\t.filter((q) => q.isFavorite)\n\t\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\t\t\t},\n\n\t\t\tgetFavoriteFolders: () => {\n\t\t\t\tconst state = get();\n\t\t\t\treturn state.folders.filter((f) => f.isFavorite);\n\t\t\t},\n\n\t\t\tgetQuery: (id) => {\n\t\t\t\tconst state = get();\n\t\t\t\treturn state.queries.find((q) => q.id === id);\n\t\t\t},\n\n\t\t\tsetSelectedQuery: (id) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\tqueries: state.queries.map((q) =>\n\t\t\t\t\t\tq.id === id ? { ...q, isSelected: true } : { ...q, isSelected: false },\n\t\t\t\t\t),\n\t\t\t\t})),\n\n\t\t\tgetSelectedQuery: () => {\n\t\t\t\tconst state = get();\n\t\t\t\treturn state.queries.find((q) => q.isSelected);\n\t\t\t},\n\t\t}),\n\t\t{\n\t\t\tname: \"dbstudio-queries\",\n\t\t},\n\t),\n);\n"],"mappings":"qFA+CA,IAAa,EAAkB,EAAqB,EACnD,EAAA,CACE,EAAK,KAAS,CACd,QAAS,CAAC,EACV,QAAS,CAAC,EAEV,UAAY,GAAW,EAAK,IAAW,CAAE,QAAS,CAAC,GAAG,EAAM,QAAS,CAAM,CAAE,EAAE,EAE/E,aAAA,CAAe,EAAI,IAClB,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAAO,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,GAAG,CAAQ,EAAI,CAAE,CAC3E,EAAE,EAEH,aAAe,GACd,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,OAAQ,GAAM,EAAE,KAAO,CAAE,EAChD,QAAS,EAAM,QAAQ,OAAQ,GAAM,EAAE,WAAa,CAAE,CACvD,EAAE,EAEH,aAAe,GACd,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAC3B,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,WAAY,CAAC,EAAE,UAAW,EAAI,CACrD,CACD,EAAE,EAEH,qBAAuB,GACtB,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAC3B,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,WAAY,CAAC,EAAE,UAAW,EAAI,CACrD,CACD,EAAE,EAEH,SAAA,CAAW,EAAe,IAAsB,CAC/C,MAAM,EAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EAClD,EAAkB,CACvB,GAAI,EACJ,KAAM,GAAQ,iBACd,MAAO,GACP,WAAY,GACZ,WAAY,GACZ,SAAU,GAAY,MACvB,EACA,OAAA,EAAK,IAAW,CACf,QAAS,CAAC,GAAG,EAAM,QAAS,CAAQ,CACrC,EAAE,EACK,CACR,EAEA,YAAA,CAAc,EAAI,IACjB,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAAO,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,GAAG,CAAQ,EAAI,CAAE,CAC3E,EAAE,EAEH,YAAc,GACb,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,OAAQ,GAAM,EAAE,KAAO,CAAE,CACjD,EAAE,EAEH,UAAA,CAAY,EAAS,IACpB,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAAO,EAAE,KAAO,EAAU,CAAE,GAAG,EAAG,SAAA,CAAS,EAAI,CAAE,CAC9E,EAAE,EAEH,eAAiB,GAChB,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAC3B,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,WAAY,CAAC,EAAE,UAAW,EAAI,CACrD,CACD,EAAE,EAEH,mBAAqB,GACN,EACP,EAAM,QACX,OAAQ,GAAM,EAAE,WAAa,GAAY,CAAC,EAAE,UAAU,EACtD,KAAA,CAAM,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAG9C,mBAAA,IACe,EACP,EAAM,QACX,OAAQ,GAAM,EAAE,UAAU,EAC1B,KAAA,CAAM,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAG9C,mBAAA,IACe,EACP,EAAM,QAAQ,OAAQ,GAAM,EAAE,UAAU,EAGhD,SAAW,GACI,EACP,EAAM,QAAQ,KAAM,GAAM,EAAE,KAAO,CAAE,EAG7C,iBAAmB,GAClB,EAAK,IAAW,CACf,QAAS,EAAM,QAAQ,IAAK,GAC3B,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,WAAY,EAAK,EAAI,CAAE,GAAG,EAAG,WAAY,EAAM,CACtE,CACD,EAAE,EAEH,iBAAA,IACe,EACP,EAAM,QAAQ,KAAM,GAAM,EAAE,UAAU,CAE/C,GACA,CACC,KAAM,kBACP,CACD,CACD"}
@@ -0,0 +1,17 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/code-editor-q3FlZk-L.js","assets/rolldown-runtime-CXHxssQy.js","assets/icons-CtpwLWUI.js","assets/radix-ui-CgJOuzDv.js","assets/dist-DBHqGKiG.js","assets/monaco-editor-CaQyRcyX.js","assets/monaco-editor-DcHpHuJd.css","assets/index-XoXxezo4.js","assets/tanstack-g1w0v_rJ.js","assets/react-dom-yg5bT29P.js","assets/monitoring-B_X9D1H-.js","assets/tooltip-B7gM8xl3.js","assets/bundle-mjs-BC_8HrWA.js","assets/react-Cxb6eTZp.js","assets/popover-wbdw6Hmx.js","assets/schema-CtOicTEt.js","assets/database.store-O79u8Fhj.js","assets/format-cell-value-rgvKTEOk.js","assets/middleware-CCyr6cvp.js","assets/index-Cyl_0l9I.css"])))=>i.map(i=>d[i]);
2
+ import{r as G}from"./rolldown-runtime-CXHxssQy.js";import{C as W,b as Y,i as I,n as k,r as B,t as K}from"./tanstack-g1w0v_rJ.js";import{U as J,V as Z,c as X,f as ee,h as re,it as se,j as _,o as te,t as ae,ut as oe}from"./icons-CtpwLWUI.js";import{kt as ne}from"./radix-ui-CgJOuzDv.js";import{r as le}from"./monitoring-B_X9D1H-.js";import{n as N}from"./dist-DBHqGKiG.js";import{H as ie,R as A,a as O,i as S,k as de,n as C,t as w,z as g}from"./tooltip-B7gM8xl3.js";import{t as q}from"./database.store-O79u8Fhj.js";import{t as ce}from"./format-cell-value-rgvKTEOk.js";import{a as ue}from"./monaco-editor-CaQyRcyX.js";import{F as T,O as L,P as he,S as me,x as xe}from"./index-XoXxezo4.js";import{t as F}from"./ai-assistant-D2oc4TtC.js";import{t as be}from"./queries.store-CoJVGJKk.js";var o=G(oe(),1),fe=`-- Your query here...
3
+ `,ge=`{
4
+ "collection": "your_collection",
5
+ "operation": "find",
6
+ "filter": {},
7
+ "sort": { "_id": 1 },
8
+ "limit": 50
9
+ }`,pe="PING",e=ne(),ve=({results:r})=>{const i=(0,o.useMemo)(()=>r?.columns?r.columns.map(t=>({id:t,accessorKey:t,header:t,cell:({row:s})=>(0,e.jsx)("div",{className:"font-medium truncate text-foreground",children:ce(s.getValue(t))})})):[],[r?.columns]),a=B({columns:i,data:r?.rows??[],getCoreRowModel:I(),columnResizeMode:"onChange",enableColumnResizing:!0}),{rows:n}=a.getRowModel(),d=(0,o.useRef)(null),c=K({count:n.length,getScrollElement:()=>d.current,estimateSize:()=>35,overscan:10}),m=c.getVirtualItems(),u=a.getAllColumns().reduce((t,s)=>t+s.getSize(),0);return(0,e.jsxs)("div",{ref:d,className:"relative h-full overflow-auto w-full bg-background text-foreground",children:[(0,e.jsx)("div",{className:"sticky top-0 z-20 bg-muted/40 border-b border-border",style:{width:`${u}px`,minWidth:"100%"},children:a.getHeaderGroups().map(t=>(0,e.jsx)("div",{className:"flex text-xs",children:t.headers.map(s=>(0,e.jsxs)("div",{className:"shrink-0 p-2 font-semibold text-muted-foreground border-r border-border relative",style:{width:`${s.getSize()}px`},children:[s.isPlaceholder?null:k(s.column.columnDef.header,s.getContext()),(0,e.jsx)("div",{role:"presentation",onMouseDown:s.getResizeHandler(),onTouchStart:s.getResizeHandler(),className:`absolute top-0 right-0 h-full w-1 cursor-col-resize select-none touch-none hover:bg-blue-500 ${s.column.getIsResizing()?"bg-blue-500":""}`})]},s.id))},t.id))}),(0,e.jsx)("div",{style:{height:`${c.getTotalSize()}px`,width:`${u}px`,minWidth:"100%",position:"relative"},children:m.map(t=>{const s=n[t.index];return(0,e.jsx)("div",{style:{position:"absolute",top:0,left:0,width:`${u}px`,minWidth:"100%",height:`${t.size}px`,transform:`translateY(${t.start}px)`},className:"flex text-xs border-b border-border hover:bg-accent/20",children:s.getVisibleCells().map(l=>(0,e.jsx)("div",{className:"shrink-0 p-2 border-r border-border",style:{width:`${l.column.getSize()}px`},children:k(l.column.columnDef.cell,l.getContext())},l.id))},s.id)})}),n.length===0&&(0,e.jsx)("div",{className:"flex items-center justify-center h-24 text-muted-foreground",children:"No results."})]})},ye=({results:r,isLoading:i,error:a,lastExecutedQuery:n})=>{const[d]=L(O.RUNNER_STATE_KEYS.SHOW_AS),{requestAssistant:c}=F(),{openOverlay:m}=A(),u=s=>{c(s),m("chat.assistant")},t=(0,o.useMemo)(()=>a?(0,e.jsx)("div",{className:"flex h-full p-2",children:(0,e.jsxs)("div",{className:"space-y-2 text-sm",children:[(0,e.jsxs)("div",{children:["Error: ",a.message]}),(0,e.jsx)(g,{type:"button",variant:"outline",size:"sm",disabled:!n.trim(),onClick:()=>u(`Fix this failing query. Explain the cause and return the complete corrected query in a fenced code block.
10
+
11
+ Query:
12
+ ${n}
13
+
14
+ Error:
15
+ ${a.message}`),children:"Suggest fix"})]})}):r?.message?(0,e.jsx)("div",{className:"flex h-full p-2",children:(0,e.jsx)("p",{children:r.message})}):!r||r.rows.length===0?(0,e.jsx)("div",{className:"flex h-full p-2",children:(0,e.jsx)("p",{children:"Run the query to see the results"})}):d==="json"?(0,e.jsx)("div",{className:"p-2",children:(0,e.jsx)(me,{value:r?.rows??[],objectSortKeys:!0,displayObjectSize:!1,displayDataTypes:!1,indentWidth:14,collapsed:2,shortenTextAfterLength:100,highlightUpdates:!1,style:xe,enableClipboard:!1,className:"size-full"})}):(0,e.jsx)(ve,{results:r}),[d,r,a,n]);return(0,e.jsx)("div",{className:"absolute bottom-0 left-0 right-0 border-t border-border flex flex-col bg-background text-foreground w-full",style:{height:"calc(100vh - 400px)"},children:(0,e.jsx)("div",{className:"flex-1 overflow-auto w-full",children:i?(0,e.jsx)("div",{className:"flex items-center justify-center h-full overflow-auto",children:(0,e.jsx)(ie,{size:"size-8",color:"bg-[#d4d4d4]"})}):t})})},je=({isExecutingQuery:r,handleButtonClick:i,handleFormatQuery:a,handleSaveQuery:n,handleFavorite:d,isFavorite:c,queryId:m,hasUnsavedChanges:u,queryResult:t,currentQuery:s})=>{const[l,p]=L(O.RUNNER_STATE_KEYS.SHOW_AS),{requestAssistant:v}=F(),{openOverlay:z}=A(),y=b=>{v(b),z("chat.assistant")};return(0,e.jsxs)("header",{className:"max-h-8 overflow-hidden border-b border-border w-full flex items-center justify-between bg-background text-foreground sticky top-0 left-0 right-0 z-0",children:[(0,e.jsxs)("div",{className:"flex items-center",children:[(0,e.jsxs)(g,{type:"button",variant:"default",className:"h-8! border-l-0 border-y-0 border-r border-border rounded-none bg-green-700 text-white hover:bg-green-800 gap-1 disabled:opacity-50",onClick:i,disabled:r,"aria-label":"Run the query",children:["Run",(0,e.jsx)(J,{className:"size-3"}),(0,e.jsx)(Z,{className:"size-3"})]}),(0,e.jsxs)(w,{children:[(0,e.jsx)(S,{asChild:!0,children:(0,e.jsx)(g,{type:"button",variant:"ghost",className:"h-8! border-l-0 border-y-0 border-r border-zinc-800 rounded-none","aria-label":"Generate a query with AI",onClick:()=>y("Generate a query for this database. Ask me for the goal if it is unclear."),children:(0,e.jsx)(ee,{className:"size-3"})})}),(0,e.jsx)(C,{children:"Generate with AI"})]}),(0,e.jsxs)(w,{children:[(0,e.jsx)(S,{asChild:!0,children:(0,e.jsx)(g,{type:"button",variant:"ghost",className:"h-8! border-l-0 border-y-0 border-r border-zinc-800 rounded-none","aria-label":"Optimize the query with AI",disabled:!s.trim()||r,onClick:()=>y(`Suggest a faster, clearer version of this query. Explain the tradeoffs and return the complete query in a fenced code block.
16
+
17
+ ${s}`),children:(0,e.jsx)(ae,{className:"size-3"})})}),(0,e.jsx)(C,{children:"Optimize with AI"})]}),(0,e.jsxs)(g,{type:"button",variant:"ghost",className:"h-8! border-l-0 border-y-0 border-r border-border rounded-none text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors","aria-label":"Format the query",onClick:a,children:["Format ",(0,e.jsx)(te,{className:"size-3"})]}),(0,e.jsxs)(g,{type:"button",variant:"ghost",className:"h-8! border-l-0 border-y-0 border-r border-border rounded-none text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors","aria-label":"Save the query",onClick:n,children:["Save ",(0,e.jsx)(re,{className:"size-3"})]}),(0,e.jsx)(g,{type:"button",variant:"ghost",className:"h-8! border-l-0 border-y-0 border-r border-border rounded-none text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors","aria-label":"Favorite the query",onClick:d,children:c?(0,e.jsx)(_,{className:"size-3 fill-current"}):(0,e.jsx)(_,{className:"size-3"})}),m&&u&&(0,e.jsx)("span",{className:"text-xs px-2 text-muted-foreground",children:"Unsaved changes"})]}),(0,e.jsxs)("div",{className:"flex items-center",children:[t&&(0,e.jsxs)("div",{className:"flex items-center gap-1 px-2",children:[(0,e.jsxs)("span",{className:"text-xs text-muted-foreground",children:[t.data?.duration?.toFixed(2),"ms"]}),(0,e.jsx)("span",{className:"text-xs text-muted-foreground",children:"•"}),(0,e.jsxs)("span",{className:"text-xs text-muted-foreground",children:[t.data?.rowCount??0," rows"]})]}),(0,e.jsxs)(he,{type:"single",variant:"ghost",onValueChange:b=>{b!==l&&p(b)},value:l??void 0,className:"h-8! rounded-none! border-l! border-border!",children:[(0,e.jsxs)(w,{children:[(0,e.jsx)(S,{asChild:!0,children:(0,e.jsx)(T,{value:"table","aria-label":"Toggle table",className:"rounded-none! h-8! aspect-square!","data-selected":l==="table",children:(0,e.jsx)(X,{})})}),(0,e.jsx)(C,{children:(0,e.jsx)("p",{children:"View as a table"})})]}),(0,e.jsxs)(w,{children:[(0,e.jsx)(S,{asChild:!0,children:(0,e.jsx)(T,{value:"json","aria-label":"Toggle JSON",className:"rounded-none! h-8! aspect-square!","data-selected":l==="json",children:(0,e.jsx)(se,{})})}),(0,e.jsx)(C,{children:(0,e.jsx)("p",{children:"View as a JSON"})})]})]})]})]})},Ne=()=>{const{selectedDatabase:r,dbType:i}=q(),{mutateAsync:a,isPending:n,error:d}=W({mutationFn:async({query:c})=>(await de({query:c,db:r})).data.data,onSuccess:()=>{i&&le.capture("query_executed",{db_type:i})}});return{executeQuery:a,isExecutingQuery:n,executeQueryError:d}},Se=(0,o.lazy)(()=>ue(()=>import("./code-editor-q3FlZk-L.js").then(r=>({default:r.CodeEditor})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]))),Fe=({queryId:r,initialQuery:i})=>{const a=Y(),[n,d]=(0,o.useState)(void 0),{getQuery:c,updateQuery:m,toggleFavorite:u,addQuery:t}=be(),s=r?c(r):null,l=s?.isFavorite??!1,{executeQuery:p,isExecutingQuery:v,executeQueryError:z}=Ne(),[y,b]=(0,o.useState)(!1),[x,$]=(0,o.useState)(""),[H,U]=(0,o.useState)(""),{dbType:f}=q(),D=(0,o.useCallback)(()=>{if(i)return i;const h=f==="mongodb"?ge:f==="redis"?pe:fe;return s?s?.query??h:h},[s,f,i]),Q=(0,o.useCallback)(async h=>{if(!h.trim()){N.error("Query is empty!");return}const j=h.trim().match(/^\S+/)?.[0]?.toUpperCase();f==="redis"&&(j==="FLUSHDB"||j==="FLUSHALL")&&window.prompt(`This permanently deletes Redis data. Type ${j} to continue.`)!==j||(U(h),p({query:h}).then(P=>{d({data:P,queryId:r??""})}))},[f,p,r]),V=(0,o.useCallback)(()=>{if(!x.trim()){N.error("Query is empty!");return}Q(x)},[Q,x]),M=(0,o.useCallback)(()=>{r&&(u(r),N.success(l?"Query unfavorited":"Query favorited"))},[u,r,l]),R=(0,o.useCallback)(()=>{},[]),E=(0,o.useCallback)(()=>{if(x){if(r)m(r,{query:x});else{const h=t();m(h,{query:x}),a({to:"/runner/$queryId",params:{queryId:h}})}b(!1),N.success("Query saved")}},[x,r,m,t,a]);return(0,e.jsxs)("div",{className:"flex-1 relative w-full flex flex-col",children:[(0,e.jsx)(je,{isExecutingQuery:v,handleButtonClick:V,handleFormatQuery:R,handleSaveQuery:E,handleFavorite:M,isFavorite:l,queryId:r??"",hasUnsavedChanges:y,queryResult:n??null,currentQuery:x}),(0,e.jsx)(o.Suspense,{fallback:(0,e.jsx)("div",{className:"flex-1 bg-background size-full"}),children:(0,e.jsx)(Se,{initialQuery:D(),queryId:r,savedQuery:s?.query??"",language:f==="mongodb"?"json":f==="redis"?"plaintext":"pgsql",onQueryChange:$,onUnsavedChanges:b,onExecuteQuery:Q,onFormatQuery:R,onSaveQuery:E})}),(0,e.jsx)(ye,{results:n?.data??null,isLoading:v,error:z,lastExecutedQuery:H})]})};export{Fe as t};
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/utils/constants/placeholders.ts","../../src/features/query-runner/components/table-view.tsx","../../src/features/query-runner/components/query-result-container.tsx","../../src/features/query-runner/components/runner-header.tsx","../../src/features/query-runner/hooks/use-execute-query.ts","../../src/features/query-runner/screens/runner-screen.tsx"],"sourcesContent":["export const PGSQL_PLACEHOLDER_QUERY = `-- Your query here...\n`;\n\nexport const MONGO_PLACEHOLDER_QUERY = `{\n \"collection\": \"your_collection\",\n \"operation\": \"find\",\n \"filter\": {},\n \"sort\": { \"_id\": 1 },\n \"limit\": 50\n}`;\n\nexport const REDIS_PLACEHOLDER_QUERY = \"PING\";\n","import type { ExecuteQueryResult } from \"@db-studio/shared/types\";\nimport { flexRender, getCoreRowModel, type Row, useReactTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { useMemo, useRef } from \"react\";\nimport { formatCellValue } from \"@/utils/format-cell-value\";\n\nexport const TableView = ({ results }: { results: ExecuteQueryResult | null }) => {\n\tconst columns = useMemo(() => {\n\t\tif (!results?.columns) return [];\n\n\t\treturn results.columns.map((item: string) => ({\n\t\t\tid: item,\n\t\t\taccessorKey: item,\n\t\t\theader: item,\n\t\t\tcell: ({ row }: { row: Row<Record<string, unknown>> }) => (\n\t\t\t\t<div className=\"font-medium truncate text-foreground\">\n\t\t\t\t\t{formatCellValue(row.getValue(item))}\n\t\t\t\t</div>\n\t\t\t),\n\t\t}));\n\t}, [results?.columns]);\n\n\tconst table = useReactTable({\n\t\tcolumns: columns,\n\t\tdata: results?.rows ?? [],\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tcolumnResizeMode: \"onChange\",\n\t\tenableColumnResizing: true,\n\t});\n\n\tconst { rows } = table.getRowModel();\n\n\tconst parentRef = useRef<HTMLDivElement>(null);\n\n\tconst virtualizer = useVirtualizer({\n\t\tcount: rows.length,\n\t\tgetScrollElement: () => parentRef.current,\n\t\testimateSize: () => 35,\n\t\toverscan: 10,\n\t});\n\n\tconst items = virtualizer.getVirtualItems();\n\n\tconst totalTableWidth = table.getAllColumns().reduce((sum, col) => sum + col.getSize(), 0);\n\n\treturn (\n\t\t<div\n\t\t\tref={parentRef}\n\t\t\tclassName=\"relative h-full overflow-auto w-full bg-background text-foreground\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"sticky top-0 z-20 bg-muted/40 border-b border-border\"\n\t\t\t\tstyle={{ width: `${totalTableWidth}px`, minWidth: \"100%\" }}\n\t\t\t>\n\t\t\t\t{table.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={headerGroup.id}\n\t\t\t\t\t\tclassName=\"flex text-xs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\tclassName=\"shrink-0 p-2 font-semibold text-muted-foreground border-r border-border relative\"\n\t\t\t\t\t\t\t\tstyle={{ width: `${header.getSize()}px` }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{header.isPlaceholder\n\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t: flexRender(header.column.columnDef.header, header.getContext())}\n\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t\t\t\tonMouseDown={header.getResizeHandler()}\n\t\t\t\t\t\t\t\t\tonTouchStart={header.getResizeHandler()}\n\t\t\t\t\t\t\t\t\tclassName={`absolute top-0 right-0 h-full w-1 cursor-col-resize select-none touch-none hover:bg-blue-500 ${\n\t\t\t\t\t\t\t\t\t\theader.column.getIsResizing() ? \"bg-blue-500\" : \"\"\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\theight: `${virtualizer.getTotalSize()}px`,\n\t\t\t\t\twidth: `${totalTableWidth}px`,\n\t\t\t\t\tminWidth: \"100%\",\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{items.map((virtualRow) => {\n\t\t\t\t\tconst row = rows[virtualRow.index];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\twidth: `${totalTableWidth}px`,\n\t\t\t\t\t\t\t\tminWidth: \"100%\",\n\t\t\t\t\t\t\t\theight: `${virtualRow.size}px`,\n\t\t\t\t\t\t\t\ttransform: `translateY(${virtualRow.start}px)`,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"flex text-xs border-b border-border hover:bg-accent/20\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\tclassName=\"shrink-0 p-2 border-r border-border\"\n\t\t\t\t\t\t\t\t\tstyle={{ width: `${cell.column.getSize()}px` }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{flexRender(cell.column.columnDef.cell, cell.getContext())}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\n\t\t\t{rows.length === 0 && (\n\t\t\t\t<div className=\"flex items-center justify-center h-24 text-muted-foreground\">\n\t\t\t\t\tNo results.\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import type { ExecuteQueryResult } from \"@db-studio/shared/types\";\nimport { Button } from \"@db-studio/ui/button\";\nimport { Spinner } from \"@db-studio/ui/spinner\";\nimport JsonView from \"@uiw/react-json-view\";\nimport { vscodeTheme } from \"@uiw/react-json-view/vscode\";\nimport { useQueryState } from \"nuqs\";\nimport { useMemo } from \"react\";\nimport { useAssistantRequestStore } from \"@/features/ai-assistant\";\nimport { useOverlayStore } from \"@/stores/overlay.store\";\nimport { CONSTANTS } from \"@/utils/constants\";\nimport { TableView } from \"./table-view\";\n\nexport const QueryResultContainer = ({\n\tresults,\n\tisLoading,\n\terror,\n\tlastExecutedQuery,\n}: {\n\tresults: ExecuteQueryResult | null;\n\tisLoading: boolean;\n\terror: Error | null;\n\tlastExecutedQuery: string;\n}) => {\n\tconst [showAs] = useQueryState(CONSTANTS.RUNNER_STATE_KEYS.SHOW_AS);\n\tconst { requestAssistant } = useAssistantRequestStore();\n\tconst { openOverlay } = useOverlayStore();\n\tconst askAssistant = (prompt: string) => {\n\t\trequestAssistant(prompt);\n\t\topenOverlay(\"chat.assistant\");\n\t};\n\n\tconst renderResults = useMemo(() => {\n\t\tif (error) {\n\t\t\treturn (\n\t\t\t\t<div className=\"flex h-full p-2\">\n\t\t\t\t\t<div className=\"space-y-2 text-sm\">\n\t\t\t\t\t\t<div>Error: {error.message}</div>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tdisabled={!lastExecutedQuery.trim()}\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\taskAssistant(\n\t\t\t\t\t\t\t\t\t`Fix this failing query. Explain the cause and return the complete corrected query in a fenced code block.\\n\\nQuery:\\n${lastExecutedQuery}\\n\\nError:\\n${error.message}`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSuggest fix\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (results?.message) {\n\t\t\treturn (\n\t\t\t\t<div className=\"flex h-full p-2\">\n\t\t\t\t\t<p>{results.message}</p>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (!results || results.rows.length === 0) {\n\t\t\treturn (\n\t\t\t\t<div className=\"flex h-full p-2\">\n\t\t\t\t\t<p>Run the query to see the results</p>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (showAs === \"json\") {\n\t\t\treturn (\n\t\t\t\t<div className=\"p-2\">\n\t\t\t\t\t<JsonView\n\t\t\t\t\t\tvalue={results?.rows ?? []}\n\t\t\t\t\t\tobjectSortKeys={true}\n\t\t\t\t\t\tdisplayObjectSize={false}\n\t\t\t\t\t\tdisplayDataTypes={false}\n\t\t\t\t\t\tindentWidth={14}\n\t\t\t\t\t\tcollapsed={2}\n\t\t\t\t\t\tshortenTextAfterLength={100}\n\t\t\t\t\t\thighlightUpdates={false}\n\t\t\t\t\t\tstyle={vscodeTheme}\n\t\t\t\t\t\tenableClipboard={false}\n\t\t\t\t\t\tclassName=\"size-full\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn <TableView results={results} />;\n\t}, [showAs, results, error, lastExecutedQuery]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"absolute bottom-0 left-0 right-0 border-t border-border flex flex-col bg-background text-foreground w-full\"\n\t\t\tstyle={{ height: \"calc(100vh - 400px)\" }}\n\t\t>\n\t\t\t<div className=\"flex-1 overflow-auto w-full\">\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center h-full overflow-auto\">\n\t\t\t\t\t\t<Spinner\n\t\t\t\t\t\t\tsize=\"size-8\"\n\t\t\t\t\t\t\tcolor=\"bg-[#d4d4d4]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\trenderResults\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { Button } from \"@db-studio/ui/button\";\nimport { ToggleGroup, ToggleGroupItem } from \"@db-studio/ui/toggle-group\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@db-studio/ui/tooltip\";\nimport {\n\tAlignLeft,\n\tBraces,\n\tCommand,\n\tCornerDownLeft,\n\tHeart,\n\tSave,\n\tSparkles,\n\tTable,\n\tZap,\n} from \"lucide-react\";\nimport { useQueryState } from \"nuqs\";\nimport { useAssistantRequestStore } from \"@/features/ai-assistant\";\nimport { useOverlayStore } from \"@/stores/overlay.store\";\nimport { CONSTANTS } from \"@/utils/constants\";\nimport type { QueryResult } from \"../screens/runner-screen\";\n\nexport const RunnerHeader = ({\n\tisExecutingQuery,\n\thandleButtonClick,\n\thandleFormatQuery,\n\thandleSaveQuery,\n\thandleFavorite,\n\tisFavorite,\n\tqueryId,\n\thasUnsavedChanges,\n\tqueryResult,\n\tcurrentQuery,\n}: {\n\tisExecutingQuery: boolean;\n\thandleButtonClick: () => void;\n\thandleFormatQuery: () => void;\n\thandleSaveQuery: () => void;\n\thandleFavorite: () => void;\n\tisFavorite: boolean;\n\tqueryId: string;\n\thasUnsavedChanges: boolean;\n\tqueryResult: QueryResult | null;\n\tcurrentQuery: string;\n}) => {\n\tconst [showAs, setShowAs] = useQueryState(CONSTANTS.RUNNER_STATE_KEYS.SHOW_AS);\n\tconst { requestAssistant } = useAssistantRequestStore();\n\tconst { openOverlay } = useOverlayStore();\n\n\tconst askAssistant = (prompt: string) => {\n\t\trequestAssistant(prompt);\n\t\topenOverlay(\"chat.assistant\");\n\t};\n\n\treturn (\n\t\t<header className=\"max-h-8 overflow-hidden border-b border-border w-full flex items-center justify-between bg-background text-foreground sticky top-0 left-0 right-0 z-0\">\n\t\t\t<div className=\"flex items-center\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\tclassName=\"h-8! border-l-0 border-y-0 border-r border-border rounded-none bg-green-700 text-white hover:bg-green-800 gap-1 disabled:opacity-50\"\n\t\t\t\t\tonClick={handleButtonClick}\n\t\t\t\t\tdisabled={isExecutingQuery}\n\t\t\t\t\taria-label=\"Run the query\"\n\t\t\t\t>\n\t\t\t\t\tRun\n\t\t\t\t\t<Command className=\"size-3\" />\n\t\t\t\t\t<CornerDownLeft className=\"size-3\" />\n\t\t\t\t</Button>\n\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclassName=\"h-8! border-l-0 border-y-0 border-r border-zinc-800 rounded-none\"\n\t\t\t\t\t\t\taria-label=\"Generate a query with AI\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\taskAssistant(\n\t\t\t\t\t\t\t\t\t\"Generate a query for this database. Ask me for the goal if it is unclear.\",\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Sparkles className=\"size-3\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t<TooltipContent>Generate with AI</TooltipContent>\n\t\t\t\t</Tooltip>\n\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclassName=\"h-8! border-l-0 border-y-0 border-r border-zinc-800 rounded-none\"\n\t\t\t\t\t\t\taria-label=\"Optimize the query with AI\"\n\t\t\t\t\t\t\tdisabled={!currentQuery.trim() || isExecutingQuery}\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\taskAssistant(\n\t\t\t\t\t\t\t\t\t`Suggest a faster, clearer version of this query. Explain the tradeoffs and return the complete query in a fenced code block.\\n\\n${currentQuery}`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Zap className=\"size-3\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t<TooltipContent>Optimize with AI</TooltipContent>\n\t\t\t\t</Tooltip>\n\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tclassName=\"h-8! border-l-0 border-y-0 border-r border-border rounded-none text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors\"\n\t\t\t\t\taria-label=\"Format the query\"\n\t\t\t\t\tonClick={handleFormatQuery}\n\t\t\t\t>\n\t\t\t\t\tFormat <AlignLeft className=\"size-3\" />\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tclassName=\"h-8! border-l-0 border-y-0 border-r border-border rounded-none text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors\"\n\t\t\t\t\taria-label=\"Save the query\"\n\t\t\t\t\tonClick={handleSaveQuery}\n\t\t\t\t>\n\t\t\t\t\tSave <Save className=\"size-3\" />\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tclassName=\"h-8! border-l-0 border-y-0 border-r border-border rounded-none text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors\"\n\t\t\t\t\taria-label=\"Favorite the query\"\n\t\t\t\t\tonClick={handleFavorite}\n\t\t\t\t>\n\t\t\t\t\t{isFavorite ? (\n\t\t\t\t\t\t<Heart className=\"size-3 fill-current\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Heart className=\"size-3\" />\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\n\t\t\t\t{queryId && hasUnsavedChanges && (\n\t\t\t\t\t<span className=\"text-xs px-2 text-muted-foreground\">Unsaved changes</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className=\"flex items-center\">\n\t\t\t\t{queryResult && (\n\t\t\t\t\t<div className=\"flex items-center gap-1 px-2\">\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t{queryResult.data?.duration?.toFixed(2)}ms\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">•</span>\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t{queryResult.data?.rowCount ?? 0} rows\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\tif (value === showAs) return;\n\t\t\t\t\t\tsetShowAs(value);\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={showAs ?? undefined}\n\t\t\t\t\tclassName=\"h-8! rounded-none! border-l! border-border!\"\n\t\t\t\t>\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<ToggleGroupItem\n\t\t\t\t\t\t\t\tvalue=\"table\"\n\t\t\t\t\t\t\t\taria-label=\"Toggle table\"\n\t\t\t\t\t\t\t\tclassName=\"rounded-none! h-8! aspect-square!\"\n\t\t\t\t\t\t\t\tdata-selected={showAs === \"table\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Table />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>View as a table</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<ToggleGroupItem\n\t\t\t\t\t\t\t\tvalue=\"json\"\n\t\t\t\t\t\t\t\taria-label=\"Toggle JSON\"\n\t\t\t\t\t\t\t\tclassName=\"rounded-none! h-8! aspect-square!\"\n\t\t\t\t\t\t\t\tdata-selected={showAs === \"json\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Braces />\n\t\t\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>View as a JSON</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t</header>\n\t);\n};\n","import type { ExecuteQueryResult } from \"@db-studio/shared/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { posthogAnalytics } from \"@/lib/posthog\";\nimport { executeQuery as executeQueryRequest } from \"@/shared/api\";\nimport { useDatabaseStore } from \"@/stores/database.store\";\n\nexport const useExecuteQuery = () => {\n\tconst { selectedDatabase, dbType } = useDatabaseStore();\n\n\tconst {\n\t\tmutateAsync: executeQuery,\n\t\tisPending: isExecutingQuery,\n\t\terror: executeQueryError,\n\t} = useMutation<ExecuteQueryResult, Error, { query: string }>({\n\t\tmutationFn: async ({ query }) => {\n\t\t\tconst res = await executeQueryRequest({ query, db: selectedDatabase });\n\t\t\treturn res.data.data;\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tif (dbType) posthogAnalytics.capture(\"query_executed\", { db_type: dbType });\n\t\t},\n\t});\n\n\treturn {\n\t\texecuteQuery,\n\t\tisExecutingQuery,\n\t\texecuteQueryError,\n\t};\n};\n","import type { ExecuteQueryResult } from \"@db-studio/shared/types\";\nimport { useNavigate } from \"@tanstack/react-router\";\nimport { lazy, Suspense, useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { useDatabaseStore } from \"@/stores/database.store\";\nimport { useQueriesStore } from \"@/stores/queries.store\";\nimport {\n\tMONGO_PLACEHOLDER_QUERY,\n\tPGSQL_PLACEHOLDER_QUERY,\n\tREDIS_PLACEHOLDER_QUERY,\n} from \"@/utils/constants/placeholders\";\nimport { QueryResultContainer } from \"../components/query-result-container\";\nimport { RunnerHeader } from \"../components/runner-header\";\nimport { useExecuteQuery } from \"../hooks/use-execute-query\";\n\nconst CodeEditor = lazy(() =>\n\timport(\"../components/code-editor\").then((module) => ({\n\t\tdefault: module.CodeEditor,\n\t})),\n);\n\nexport type QueryResult = {\n\tdata: ExecuteQueryResult;\n\tqueryId: string;\n};\n\nexport const RunnerScreen = ({\n\tqueryId,\n\tinitialQuery,\n}: {\n\tqueryId?: string;\n\tinitialQuery?: string;\n}) => {\n\tconst navigate = useNavigate();\n\tconst [queryResult, setQueryResult] = useState<QueryResult | undefined>(undefined);\n\tconst { getQuery, updateQuery, toggleFavorite, addQuery } = useQueriesStore();\n\tconst query = queryId ? getQuery(queryId) : null;\n\tconst isFavorite = query?.isFavorite ?? false;\n\tconst { executeQuery, isExecutingQuery, executeQueryError } = useExecuteQuery();\n\tconst [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\tconst [currentQuery, setCurrentQuery] = useState<string>(\"\");\n\tconst [lastExecutedQuery, setLastExecutedQuery] = useState(\"\");\n\tconst { dbType } = useDatabaseStore();\n\n\tconst getInitialQuery = useCallback(() => {\n\t\tif (initialQuery) return initialQuery;\n\t\tconst placeholder =\n\t\t\tdbType === \"mongodb\"\n\t\t\t\t? MONGO_PLACEHOLDER_QUERY\n\t\t\t\t: dbType === \"redis\"\n\t\t\t\t\t? REDIS_PLACEHOLDER_QUERY\n\t\t\t\t\t: PGSQL_PLACEHOLDER_QUERY;\n\t\tif (!query) return placeholder;\n\t\treturn query?.query ?? placeholder;\n\t}, [query, dbType, initialQuery]);\n\n\tconst handleExecuteQuery = useCallback(\n\t\tasync (query: string) => {\n\t\t\tif (!query.trim()) {\n\t\t\t\ttoast.error(\"Query is empty!\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst command = query.trim().match(/^\\S+/)?.[0]?.toUpperCase();\n\t\t\tif (dbType === \"redis\" && (command === \"FLUSHDB\" || command === \"FLUSHALL\")) {\n\t\t\t\tconst confirmation = window.prompt(\n\t\t\t\t\t`This permanently deletes Redis data. Type ${command} to continue.`,\n\t\t\t\t);\n\t\t\t\tif (confirmation !== command) return;\n\t\t\t}\n\t\t\tsetLastExecutedQuery(query);\n\n\t\t\texecuteQuery({ query }).then((result) => {\n\t\t\t\tsetQueryResult({ data: result, queryId: queryId ?? \"\" });\n\t\t\t});\n\t\t},\n\t\t[dbType, executeQuery, queryId],\n\t);\n\n\tconst handleButtonClick = useCallback(() => {\n\t\tif (!currentQuery.trim()) {\n\t\t\ttoast.error(\"Query is empty!\");\n\t\t\treturn;\n\t\t}\n\n\t\thandleExecuteQuery(currentQuery);\n\t}, [handleExecuteQuery, currentQuery]);\n\n\tconst handleFavorite = useCallback(() => {\n\t\tif (!queryId) return;\n\t\ttoggleFavorite(queryId);\n\t\ttoast.success(isFavorite ? \"Query unfavorited\" : \"Query favorited\");\n\t}, [toggleFavorite, queryId, isFavorite]);\n\n\tconst handleFormatQuery = useCallback(() => {\n\t\t// passed to Monaco component\n\t}, []);\n\n\tconst handleSaveQuery = useCallback(() => {\n\t\tif (!currentQuery) return;\n\n\t\tif (!queryId) {\n\t\t\tconst newQueryId = addQuery();\n\t\t\tupdateQuery(newQueryId, { query: currentQuery });\n\t\t\tnavigate({\n\t\t\t\tto: \"/runner/$queryId\",\n\t\t\t\tparams: { queryId: newQueryId },\n\t\t\t});\n\t\t} else {\n\t\t\tupdateQuery(queryId, { query: currentQuery });\n\t\t}\n\t\tsetHasUnsavedChanges(false);\n\t\ttoast.success(\"Query saved\");\n\t}, [currentQuery, queryId, updateQuery, addQuery, navigate]);\n\n\treturn (\n\t\t<div className=\"flex-1 relative w-full flex flex-col\">\n\t\t\t<RunnerHeader\n\t\t\t\tisExecutingQuery={isExecutingQuery}\n\t\t\t\thandleButtonClick={handleButtonClick}\n\t\t\t\thandleFormatQuery={handleFormatQuery}\n\t\t\t\thandleSaveQuery={handleSaveQuery}\n\t\t\t\thandleFavorite={handleFavorite}\n\t\t\t\tisFavorite={isFavorite}\n\t\t\t\tqueryId={queryId ?? \"\"}\n\t\t\t\thasUnsavedChanges={hasUnsavedChanges}\n\t\t\t\tqueryResult={queryResult ?? null}\n\t\t\t\tcurrentQuery={currentQuery}\n\t\t\t/>\n\n\t\t\t<Suspense fallback={<div className=\"flex-1 bg-background size-full\" />}>\n\t\t\t\t<CodeEditor\n\t\t\t\t\tinitialQuery={getInitialQuery()}\n\t\t\t\t\tqueryId={queryId}\n\t\t\t\t\tsavedQuery={query?.query ?? \"\"}\n\t\t\t\t\tlanguage={dbType === \"mongodb\" ? \"json\" : dbType === \"redis\" ? \"plaintext\" : \"pgsql\"}\n\t\t\t\t\tonQueryChange={setCurrentQuery}\n\t\t\t\t\tonUnsavedChanges={setHasUnsavedChanges}\n\t\t\t\t\tonExecuteQuery={handleExecuteQuery}\n\t\t\t\t\tonFormatQuery={handleFormatQuery}\n\t\t\t\t\tonSaveQuery={handleSaveQuery}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<QueryResultContainer\n\t\t\t\tresults={queryResult?.data ?? null}\n\t\t\t\tisLoading={isExecutingQuery}\n\t\t\t\terror={executeQueryError}\n\t\t\t\tlastExecutedQuery={lastExecutedQuery}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n"],"file":"query-runner-Bgs0j50a.js"}