db-studio 1.10.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 (98) 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-CEv6uosT.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-Bq64AuuI.js.map → _queryId-Chj34V6b.js.map} +1 -1
  9. package/dist/web-dist/assets/{_table-Bt9of1on.js → _table-Bg4NvAi4.js} +1 -1
  10. package/dist/web-dist/assets/{_table-Bt9of1on.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-CQhKMAcZ.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-CFsrLhq1.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-O79u8Fhj.js +1 -0
  20. package/dist/web-dist/assets/database.store-O79u8Fhj.js.map +1 -0
  21. package/dist/web-dist/assets/{dist-B90HBock.js → dist-DBHqGKiG.js} +1 -1
  22. package/dist/web-dist/assets/{dist-B90HBock.js.map → dist-DBHqGKiG.js.map} +1 -1
  23. package/dist/web-dist/assets/{highlighted-body-OFNGDK62-BGFI1Y6G.js → highlighted-body-OFNGDK62-CFFJC4SW.js} +1 -1
  24. package/dist/web-dist/assets/{highlighted-body-OFNGDK62-BGFI1Y6G.js.map → highlighted-body-OFNGDK62-CFFJC4SW.js.map} +1 -1
  25. package/dist/web-dist/assets/icons-CtpwLWUI.js +1 -0
  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-BKOZUa9Z.js → indexes-C9QqJKhp.js} +1 -1
  31. package/dist/web-dist/assets/{indexes-BKOZUa9Z.js.map → indexes-C9QqJKhp.js.map} +1 -1
  32. package/dist/web-dist/assets/{logs-DHha3vDy.js → logs-B8ah8F7D.js} +1 -1
  33. package/dist/web-dist/assets/{logs-DHha3vDy.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/middleware-CCyr6cvp.js +1 -0
  36. package/dist/web-dist/assets/middleware-CCyr6cvp.js.map +1 -0
  37. package/dist/web-dist/assets/popover-wbdw6Hmx.js +1 -0
  38. package/dist/web-dist/assets/popover-wbdw6Hmx.js.map +1 -0
  39. package/dist/web-dist/assets/queries.store-CoJVGJKk.js +1 -0
  40. package/dist/web-dist/assets/queries.store-CoJVGJKk.js.map +1 -0
  41. package/dist/web-dist/assets/query-runner-Bgs0j50a.js +17 -0
  42. package/dist/web-dist/assets/query-runner-Bgs0j50a.js.map +1 -0
  43. package/dist/web-dist/assets/radix-ui-CgJOuzDv.js +51 -0
  44. package/dist/web-dist/assets/radix-ui-CgJOuzDv.js.map +1 -0
  45. package/dist/web-dist/assets/react-Cxb6eTZp.js +1 -0
  46. package/dist/web-dist/assets/react-Cxb6eTZp.js.map +1 -0
  47. package/dist/web-dist/assets/{react-dom-0lXVP1OR.js → react-dom-yg5bT29P.js} +1 -1
  48. package/dist/web-dist/assets/{react-dom-0lXVP1OR.js.map → react-dom-yg5bT29P.js.map} +1 -1
  49. package/dist/web-dist/assets/redis-value-COa6YzFD.js +1 -0
  50. package/dist/web-dist/assets/{redis-value-CJoRCZun.js.map → redis-value-COa6YzFD.js.map} +1 -1
  51. package/dist/web-dist/assets/runner-DW5iXMmq.js +1 -0
  52. package/dist/web-dist/assets/{runner-CZKDzRoU.js.map → runner-DW5iXMmq.js.map} +1 -1
  53. package/dist/web-dist/assets/schema-CtOicTEt.js +64 -0
  54. package/dist/web-dist/assets/schema-CtOicTEt.js.map +1 -0
  55. package/dist/web-dist/assets/{schema-0sozVL-z.js → schema-oy5o_4bt.js} +1 -1
  56. package/dist/web-dist/assets/{schema-0sozVL-z.js.map → schema-oy5o_4bt.js.map} +1 -1
  57. package/dist/web-dist/assets/{table-CPQhgD-a.js → table-CN9ZTCOi.js} +1 -1
  58. package/dist/web-dist/assets/{table-CPQhgD-a.js.map → table-CN9ZTCOi.js.map} +1 -1
  59. package/dist/web-dist/assets/tanstack-g1w0v_rJ.js +10 -0
  60. package/dist/web-dist/assets/tanstack-g1w0v_rJ.js.map +1 -0
  61. package/dist/web-dist/assets/tooltip-B7gM8xl3.js +9 -0
  62. package/dist/web-dist/assets/tooltip-B7gM8xl3.js.map +1 -0
  63. package/dist/web-dist/assets/{visualizer-DTPn0ywW.js → visualizer-DcEwqmuY.js} +1 -1
  64. package/dist/web-dist/assets/{visualizer-DTPn0ywW.js.map → visualizer-DcEwqmuY.js.map} +1 -1
  65. package/dist/web-dist/index.html +13 -11
  66. package/package.json +1 -1
  67. package/dist/web-dist/assets/_pathlessLayout-CEv6uosT.js +0 -1
  68. package/dist/web-dist/assets/_pathlessLayout-eo6iLvBo.js +0 -132
  69. package/dist/web-dist/assets/_pathlessLayout-eo6iLvBo.js.map +0 -1
  70. package/dist/web-dist/assets/_queryId-Bq64AuuI.js +0 -1
  71. package/dist/web-dist/assets/_table-CQhKMAcZ.js +0 -1
  72. package/dist/web-dist/assets/browser-CFsrLhq1.js +0 -1
  73. package/dist/web-dist/assets/code-editor-DQ86aZkm.js +0 -9
  74. package/dist/web-dist/assets/code-editor-DQ86aZkm.js.map +0 -1
  75. package/dist/web-dist/assets/database.store-KDHkiedw.js +0 -1
  76. package/dist/web-dist/assets/database.store-KDHkiedw.js.map +0 -1
  77. package/dist/web-dist/assets/icons-Bm7rSZLJ.js +0 -1
  78. package/dist/web-dist/assets/icons-Bm7rSZLJ.js.map +0 -1
  79. package/dist/web-dist/assets/index-BtqHnOp0.js +0 -23
  80. package/dist/web-dist/assets/index-BtqHnOp0.js.map +0 -1
  81. package/dist/web-dist/assets/index-ktDWx_UP.css +0 -2
  82. package/dist/web-dist/assets/mermaid-GHXKKRXX-DjR37lQN.js +0 -1
  83. package/dist/web-dist/assets/popover-Cm3PsrMh.js +0 -1
  84. package/dist/web-dist/assets/popover-Cm3PsrMh.js.map +0 -1
  85. package/dist/web-dist/assets/query-runner-6BhVPaC9.js +0 -9
  86. package/dist/web-dist/assets/query-runner-6BhVPaC9.js.map +0 -1
  87. package/dist/web-dist/assets/radix-ui-BUv2Nuc1.js +0 -51
  88. package/dist/web-dist/assets/radix-ui-BUv2Nuc1.js.map +0 -1
  89. package/dist/web-dist/assets/redis-value-CJoRCZun.js +0 -1
  90. package/dist/web-dist/assets/runner-CZKDzRoU.js +0 -1
  91. package/dist/web-dist/assets/schema-cZHeTHA0.js +0 -64
  92. package/dist/web-dist/assets/schema-cZHeTHA0.js.map +0 -1
  93. package/dist/web-dist/assets/tanstack-D6l4LIt3.js +0 -10
  94. package/dist/web-dist/assets/tanstack-D6l4LIt3.js.map +0 -1
  95. package/dist/web-dist/assets/toggle-group-BRWnLosM.js +0 -1
  96. package/dist/web-dist/assets/toggle-group-BRWnLosM.js.map +0 -1
  97. package/dist/web-dist/assets/tooltip-DinwklI8.js +0 -9
  98. package/dist/web-dist/assets/tooltip-DinwklI8.js.map +0 -1
@@ -1 +1 @@
1
- import{kt as e}from"./radix-ui-BUv2Nuc1.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-BKOZUa9Z.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-BUv2Nuc1.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-DHha3vDy.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
+ function R(m,i){let n;try{n=m()}catch{return}return{getItem:t=>{var o;const r=l=>l===null?null:JSON.parse(l,i?.reviver),u=(o=n.getItem(t))!=null?o:null;return u instanceof Promise?u.then(r):r(u)},setItem:(t,o)=>n.setItem(t,JSON.stringify(o,i?.replacer)),removeItem:t=>n.removeItem(t)}}var p=m=>i=>{try{const n=m(i);return n instanceof Promise?n:{then(t){return p(t)(n)},catch(t){return this}}}catch(n){return{then(t){return this},catch(t){return p(t)(n)}}}},F=(m,i)=>(n,t,o)=>{let r={storage:R(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,d)=>({...d,...e}),...i},u=!1,l=0;const h=new Set,g=new Set;let c=r.storage;if(!c)return m((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${r.name}', the given storage is currently unavailable.`),n(...e)},t,o);const y=()=>{const e=r.partialize({...t()});return c.setItem(r.name,{state:e,version:r.version})},H=o.setState;o.setState=(e,d)=>(H(e,d),y());const f=m((...e)=>(n(...e),y()),t,o);o.getInitialState=()=>f;let v;const _=()=>{var e,d;if(!c)return;const I=++l;u=!1,h.forEach(a=>{var s;return a((s=t())!=null?s:f)});const b=((d=r.onRehydrateStorage)==null?void 0:d.call(r,(e=t())!=null?e:f))||void 0;return p(c.getItem.bind(c))(r.name).then(a=>{if(a)if(typeof a.version=="number"&&a.version!==r.version){if(r.migrate){const s=r.migrate(a.state,a.version);return s instanceof Promise?s.then(S=>[!0,S]):[!0,s]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,a.state];return[!1,void 0]}).then(a=>{var s;if(I!==l)return;const[S,w]=a;if(v=r.merge(w,(s=t())!=null?s:f),n(v,!0),S)return y()}).then(()=>{I===l&&(b?.(t(),void 0),v=t(),u=!0,g.forEach(a=>a(v)))}).catch(a=>{I===l&&b?.(void 0,a)})};return o.persist={setOptions:e=>{r={...r,...e},e.storage&&(c=e.storage)},clearStorage:()=>{c?.removeItem(r.name)},getOptions:()=>r,rehydrate:()=>_(),hasHydrated:()=>u,onHydrate:e=>(h.add(e),()=>{h.delete(e)}),onFinishHydration:e=>(g.add(e),()=>{g.delete(e)})},r.skipHydration||_(),v||f},J=F;export{J as t};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-CCyr6cvp.js","names":[],"sources":["../../../../node_modules/.bun/zustand@5.0.12+5e3d5174673d7dcb/node_modules/zustand/esm/middleware.mjs"],"sourcesContent":["const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...args) => api.dispatch(...args), ...initial };\n};\nconst redux = reduxImpl;\n\nconst shouldDispatchFromDevtools = (api) => !!api.dispatchFromDevtools && typeof api.dispatch === \"function\";\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api) return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst removeStoreFromTrackedConnections = (name, store) => {\n if (store === void 0) return;\n const connectionInfo = trackedConnections.get(name);\n if (!connectionInfo) return;\n delete connectionInfo.stores[store];\n if (Object.keys(connectionInfo.stores).length === 0) {\n trackedConnections.delete(name);\n }\n};\nconst findCallerName = (stack) => {\n var _a, _b;\n if (!stack) return void 0;\n const traceLines = stack.split(\"\\n\");\n const apiSetStateLineIndex = traceLines.findIndex(\n (traceLine) => traceLine.includes(\"api.setState\")\n );\n if (apiSetStateLineIndex < 0) return void 0;\n const callerLine = ((_a = traceLines[apiSetStateLineIndex + 1]) == null ? void 0 : _a.trim()) || \"\";\n return (_b = /.+ (.+) .+/.exec(callerLine)) == null ? void 0 : _b[1];\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = ((state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording) return r;\n const action = nameOrAction === void 0 ? {\n type: anonymousActionType || findCallerName(new Error().stack) || \"anonymous\"\n } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n });\n api.devtools = {\n cleanup: () => {\n if (connection && typeof connection.unsubscribe === \"function\") {\n connection.unsubscribe();\n }\n removeStoreFromTrackedConnections(options.name, store);\n }\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (shouldDispatchFromDevtools(api)) {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...args) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && args[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...args);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format.\n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (shouldDispatchFromDevtools(api)) {\n api.dispatch(action);\n }\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState) return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, fn) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0) fn(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = ((selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n });\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nfunction combine(initialState, create) {\n return (...args) => Object.assign({}, initialState, create(...args));\n}\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, options == null ? void 0 : options.replacer)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => window.localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n let hydrationVersion = 0;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n return setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n return setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n const currentVersion = ++hydrationVersion;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n if (currentVersion !== hydrationVersion) {\n return;\n }\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(get(), void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\n\nfunction ssrSafe(config, isSSR = typeof window === \"undefined\") {\n return (set, get, api) => {\n if (!isSSR) {\n return config(set, get, api);\n }\n const ssrSet = () => {\n throw new Error(\"Cannot set state of Zustand store in SSR\");\n };\n api.setState = ssrSet;\n return config(ssrSet, get, api);\n };\n}\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector, ssrSafe as unstable_ssrSafe };\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -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"}