planche 0.7.12 → 0.7.14

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 (58) hide show
  1. package/app/assets/{AboutDialog-BgXjXtZM.js → AboutDialog-C2slR8bc.js} +1 -1
  2. package/app/assets/ConnectDialog-C8dt0P44.js +1 -0
  3. package/app/assets/{CopyDatabaseDialog-BDhBi8q_.js → CopyDatabaseDialog-koQ5voA2.js} +1 -1
  4. package/app/assets/{CopyTableDialog-yVaE4uZc.js → CopyTableDialog-xXGEdqR9.js} +1 -1
  5. package/app/assets/{CreateDatabaseDialog-CRl_uxJn.js → CreateDatabaseDialog-DbPAPaHA.js} +1 -1
  6. package/app/assets/{DataDiffDialog-DeWk86vx.js → DataDiffDialog-BdmXW-yR.js} +1 -1
  7. package/app/assets/{DownloadToCSVDialog-CKR8db_j.js → DownloadToCSVDialog-DUbNM9Aj.js} +1 -1
  8. package/app/assets/{EditSchemaDialog-DlNhqzPf.js → EditSchemaDialog-B5iWTTUl.js} +1 -1
  9. package/app/assets/{FindReplaceDialog--7xgdbg2.js → FindReplaceDialog-C-w-ut2O.js} +1 -1
  10. package/app/assets/{FlushDialog-D16P2NwU.js → FlushDialog-EHw9oFc3.js} +1 -1
  11. package/app/assets/{LinkColumnDialog-RMXrjpQw.js → LinkColumnDialog-CNRoaG10.js} +1 -1
  12. package/app/assets/{LocalHistoryDialog-CFWlMqmC.js → LocalHistoryDialog-C0tH4J4m.js} +1 -1
  13. package/app/assets/{ProcessListDialog-yeLScIOg.js → ProcessListDialog-CI60dW_R.js} +1 -1
  14. package/app/assets/{QuickCommandPalette-Bnx9pn3q.js → QuickCommandPalette-gFz_jGQW.js} +1 -1
  15. package/app/assets/{RowFormDialog-BxKCVqqy.js → RowFormDialog-JCW7a_UW.js} +1 -1
  16. package/app/assets/{SafetySettingsDialog-COkaLd2E.js → SafetySettingsDialog-DGiLgyln.js} +1 -1
  17. package/app/assets/{SchemaDiffDialog-D9M93PUV.js → SchemaDiffDialog-M9KKdtQR.js} +1 -1
  18. package/app/assets/{SchemaToHTMLDialog-DVrwIeO4.js → SchemaToHTMLDialog-BysAUGf0.js} +1 -1
  19. package/app/assets/{StatusDialog-Cd9Dcile.js → StatusDialog-CsIIrMcJ.js} +1 -1
  20. package/app/assets/{TermsDialog-B8Ehf7Ck.js → TermsDialog-BzlyiBiw.js} +1 -1
  21. package/app/assets/{UserAddDialog-B5m0NAuK.js → UserAddDialog-R6QSi55s.js} +1 -1
  22. package/app/assets/{UserManagerDialog-BsmJC6nO.js → UserManagerDialog-PgTmxk8V.js} +1 -1
  23. package/app/assets/{VariablesDialog-Dth7P3eJ.js → VariablesDialog-DSdBh3UG.js} +1 -1
  24. package/app/assets/app-storage-C_1RLCyI.js +1 -0
  25. package/app/assets/{connection-store-CAPTzFtT.js → connection-store-DjSajhjh.js} +1 -1
  26. package/app/assets/database-Dvj2X-0B.js +1 -0
  27. package/app/assets/{dbms-Bsjvyvsp.js → dbms-CSyCOszD.js} +1 -1
  28. package/app/assets/de-p3F2-Dhp.js +2 -0
  29. package/app/assets/{engine-DWYEiSZM.js → engine-CzHq4UCB.js} +1 -1
  30. package/app/assets/fr-BghB2Ohx.js +2 -0
  31. package/app/assets/i18n-gQOmt8le.js +2 -0
  32. package/app/assets/ja-O-EyR07G.js +2 -0
  33. package/app/assets/ko-5jmwV68n.js +2 -0
  34. package/app/assets/{main-CvsCEaFQ.js → main-ot9WNZX1.js} +36 -36
  35. package/app/assets/pro-usage-BnI7zYsZ.js +1 -0
  36. package/app/assets/{query-execution-ODxyrvnD.js → query-execution-C2muZJbT.js} +3 -3
  37. package/app/assets/{query-store-CRp9AQS5.js → query-store-yK1eqNW-.js} +1 -1
  38. package/app/assets/{schema-nodes-D3-cz2Xk.js → schema-nodes-2owuMIuw.js} +1 -1
  39. package/app/assets/{select-BUFSgZ7u.js → select-DlF-eYgr.js} +1 -1
  40. package/app/assets/{settings-store-CYHWBgNo.js → settings-store-CSRx4hwh.js} +1 -1
  41. package/app/assets/{table-copy-_VnDBCJc.js → table-copy-B1tGampL.js} +1 -1
  42. package/app/assets/use-engine-CwOU9o8-.js +1 -0
  43. package/app/assets/zh-BIU7z3hl.js +2 -0
  44. package/app/index.html +20 -17
  45. package/app/landing.css +13 -6
  46. package/dist/index.js +525 -22
  47. package/package.json +9 -4
  48. package/app/assets/ConnectDialog-C4hFXJNz.js +0 -1
  49. package/app/assets/app-storage-B6v72zLH.js +0 -1
  50. package/app/assets/database-4FcrMRGA.js +0 -1
  51. package/app/assets/de-BHXb0E0M.js +0 -2
  52. package/app/assets/fr-vqo4FVRK.js +0 -2
  53. package/app/assets/i18n-C-w8Q5E_.js +0 -2
  54. package/app/assets/ja-BosgFbQC.js +0 -2
  55. package/app/assets/ko-CvSx-uAq.js +0 -2
  56. package/app/assets/pro-usage-Dp3liEjn.js +0 -1
  57. package/app/assets/use-engine-DSWrApw6.js +0 -1
  58. package/app/assets/zh-B0EkNPpR.js +0 -2
@@ -1,2 +1,2 @@
1
- import{h as e,n as t,t as n,v as r}from"./ui-store-DfspmPOn.js";import{_t as i,ct as a,f as o,ft as s,h as c,m as l,ot as u,p as d,pt as f}from"./main-CvsCEaFQ.js";import{a as p,l as m,m as h,t as g}from"./button--s6nUzD8.js";import{t as _}from"./connection-store-CAPTzFtT.js";import{n as v}from"./settings-store-CYHWBgNo.js";import{r as y}from"./database-4FcrMRGA.js";import{c as b,t as x}from"./query-execution-ODxyrvnD.js";import{n as S}from"./use-engine-DSWrApw6.js";import{a as C,i as w,n as T,o as E,r as D,t as ee}from"./dialog-CJoWJzRo.js";var O=p(`wand-sparkles`,[[`path`,{d:`m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72`,key:`ul74o6`}],[`path`,{d:`m14 7 3 3`,key:`1r5n42`}],[`path`,{d:`M5 6v4`,key:`ilb8ba`}],[`path`,{d:`M19 14v4`,key:`blhpug`}],[`path`,{d:`M10 2v2`,key:`7u0qdc`}],[`path`,{d:`M7 8H3`,key:`zfb6yr`}],[`path`,{d:`M21 16h-4`,key:`1cnmox`}],[`path`,{d:`M11 3H9`,key:`1obp7u`}]]),k=r(e(),1);function A(e){let t=e.slice(e.indexOf(`(`)+1,e.lastIndexOf(`)`)),n=[],r=/'((?:[^']|'')*)'/g,i;for(;i=r.exec(t);)n.push(i[1].replaceAll(`''`,`'`));return n}function j(e,t={}){let{oracleDate:n=!1}=t,r=e.type.trim(),i=r.toLowerCase(),a=/\bunsigned\b/.test(i);if(/^enum\(/.test(i))return{kind:`enum`,options:A(r)};if(/^set\(/.test(i))return{kind:`set`,options:A(r)};if(/^(tinyint\(1\)|bool|boolean|bit\(1\)|bit)(?![\w(])/.test(i))return{kind:`boolean`};let o=/^number(?:\((\d+|\*)(?:,\s*(-?\d+))?\))?$/.exec(i);if(o)return o[2]&&Number(o[2])>0?{kind:`decimal`}:o[1]?{kind:`integer`}:{kind:`decimal`};if(/^(tinyint|smallint|mediumint|int|integer|bigint|int2|int4|int8|serial|bigserial|smallserial)\b/.test(i))return{kind:`integer`,unsigned:a};if(/^(decimal|numeric|float|double|real|money|float4|float8|double precision)\b/.test(i))return{kind:`decimal`,unsigned:a};if(/^(datetime2|datetime|timestamp|smalldatetime|datetimeoffset)\b/.test(i))return{kind:`datetime`};if(/^date\b/.test(i))return{kind:n?`datetime`:`date`};if(/^(time|timetz)\b/.test(i))return{kind:`time`};if(/^(json|jsonb)\b/.test(i))return{kind:`json`};if(/^(uuid|uniqueidentifier)\b/.test(i))return{kind:`uuid`};if(/^(blob|tinyblob|mediumblob|longblob|binary|varbinary|bytea|raw|image|bfile)\b/.test(i))return{kind:`binary`};if(/^(text|ntext|tinytext|mediumtext|longtext|clob|nclob|long)\b/.test(i)||/^n?(?:var)?char2?\(max\)/.test(i))return{kind:`text`};let s=/^n?(?:var)?char2?(?:acter)?(?:\s+varying)?\((\d+)(?:\s+(?:char|byte))?\)/.exec(i);return s?{kind:`string`,maxLength:Number(s[1])}:{kind:`string`}}var M=/auto_increment|identity|generated/i;function N(e){return M.test(e.extra)||/^(serial|bigserial|smallserial)\b/i.test(e.type)?{mode:`auto`,text:``}:e.defaultValue===null?e.nullable?{mode:`null`,text:``}:{mode:`value`,text:``}:{mode:`default`,text:``}}function P(e){return e==null?{mode:`keep`,text:``}:{mode:`keep`,text:F(e)}}function F(e){if(e==null)return``;if(typeof e==`object`){if(ArrayBuffer.isView(e))return``;if(e instanceof Date)return e.toISOString();try{return JSON.stringify(e,null,2)}catch{return String(e)}}return String(e)}function I(e,t){let n=t.trim();switch(e.kind){case`integer`:{if(!/^[+-]?\d+$/.test(n))return{error:`integer`};if(e.unsigned&&n.startsWith(`-`))return{error:`unsigned`};let t=Number(n);return{value:Number.isSafeInteger(t)?t:BigInt(n)}}case`decimal`:return n===``||Number.isNaN(Number(n))?{error:`number`}:{value:Number(n)};case`boolean`:return{value:n===`true`||n===`1`};case`json`:try{return{value:JSON.parse(n===``?`null`:n)}}catch{return{error:`json`}}case`set`:return{value:n};case`date`:return n&&!/^\d{4}-\d{2}-\d{2}$/.test(n)?{error:`date`}:{value:n};case`datetime`:return n&&!/^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2}(\.\d+)?)?)?([+-]\d{2}:?\d{2}|Z)?$/.test(n)?{error:`datetime`}:{value:n};case`time`:return n&&!/^-?\d{1,3}:\d{2}(:\d{2}(\.\d+)?)?$/.test(n)?{error:`time`}:{value:n};default:return{value:t}}}var L=m(),R={integer:`result.rowForm.invalid.integer`,unsigned:`result.rowForm.invalid.unsigned`,number:`result.rowForm.invalid.number`,json:`result.rowForm.invalid.json`,date:`result.rowForm.invalid.date`,datetime:`result.rowForm.invalid.datetime`,time:`result.rowForm.invalid.time`};function z(e){return String(e).padStart(2,`0`)}function B(e){let t=new Date,n=`${t.getFullYear()}-${z(t.getMonth()+1)}-${z(t.getDate())}`,r=`${z(t.getHours())}:${z(t.getMinutes())}:${z(t.getSeconds())}`;return e===`date`?n:e===`time`?r:`${n} ${r}`}function V(e){let t=/^(\d{4})-(\d{2})-(\d{2})/.exec(e.trim());if(!t)return;let n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?void 0:n}function H({spec:e,state:t,disabled:n,onText:r}){let{t:a}=h(),u=`w-full rounded border bg-background px-2 py-1 text-sm font-mono outline-none focus:ring-1 focus:ring-primary disabled:opacity-50`;switch(e.kind){case`boolean`:return(0,L.jsxs)(`select`,{className:u,value:t.text===`true`||t.text===`1`?`true`:`false`,onChange:e=>r(e.target.value),disabled:n,children:[(0,L.jsx)(`option`,{value:`true`,children:`TRUE`}),(0,L.jsx)(`option`,{value:`false`,children:`FALSE`})]});case`enum`:return(0,L.jsxs)(`select`,{className:u,value:t.text,onChange:e=>r(e.target.value),disabled:n,children:[!e.options?.includes(t.text)&&(0,L.jsx)(`option`,{value:t.text,children:t.text||`—`}),e.options?.map(e=>(0,L.jsx)(`option`,{value:e,children:e},e))]});case`set`:{let i=new Set(t.text.split(`,`).map(e=>e.trim()).filter(Boolean));return(0,L.jsx)(`div`,{className:`flex flex-wrap gap-x-3 gap-y-1 rounded border bg-background px-2 py-1.5`,children:e.options?.map(t=>(0,L.jsxs)(`label`,{className:`flex items-center gap-1 text-xs font-mono`,children:[(0,L.jsx)(`input`,{type:`checkbox`,className:`accent-primary`,checked:i.has(t),disabled:n,onChange:n=>{let a=new Set(i);n.target.checked?a.add(t):a.delete(t),r(e.options.filter(e=>a.has(e)).join(`,`))}}),t]},t))})}case`integer`:case`decimal`:return(0,L.jsx)(`input`,{className:`${u} tabular-nums`,inputMode:`decimal`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:e.kind===`integer`?`0`:`0.00`});case`date`:case`datetime`:{let[f,p]=t.text.trim().split(/[ T]/);return(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`input`,{className:`${u} flex-1`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:e.kind===`date`?`YYYY-MM-DD`:`YYYY-MM-DD HH:MM:SS`}),(0,L.jsxs)(d,{children:[(0,L.jsx)(c,{asChild:!0,children:(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background p-1.5 text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,title:a(`result.rowForm.pickDate`),children:(0,L.jsx)(i,{className:`size-3.5`})})}),(0,L.jsx)(l,{className:`w-auto p-0`,align:`end`,children:(0,L.jsx)(o,{mode:`single`,selected:V(f??``),defaultMonth:V(f??``),onSelect:t=>{if(!t)return;let n=`${t.getFullYear()}-${z(t.getMonth()+1)}-${z(t.getDate())}`;r(e.kind===`date`?n:`${n} ${p||`00:00:00`}`)}})})]}),(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background px-1.5 py-1 text-[10px] text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,onClick:()=>r(B(e.kind)),title:a(`result.rowForm.now`),children:(0,L.jsx)(s,{className:`size-3.5`})})]})}case`time`:return(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`input`,{className:`${u} flex-1`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:`HH:MM:SS`}),(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background px-1.5 py-1 text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,onClick:()=>r(B(`time`)),title:a(`result.rowForm.now`),children:(0,L.jsx)(s,{className:`size-3.5`})})]});case`json`:{let e=!0;try{t.text.trim()&&JSON.parse(t.text)}catch{e=!1}return(0,L.jsxs)(`div`,{className:`space-y-1`,children:[(0,L.jsx)(`textarea`,{className:`${u} min-h-[96px] resize-y text-xs ${e?``:`border-destructive`}`,value:t.text,onChange:e=>r(e.target.value),disabled:n,spellCheck:!1,placeholder:`{}`}),(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,L.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 rounded border bg-background px-1.5 py-0.5 text-[10px] text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n||!e||!t.text.trim(),onClick:()=>{try{r(JSON.stringify(JSON.parse(t.text),null,2))}catch{}},children:[(0,L.jsx)(O,{className:`size-3`}),a(`result.rowForm.formatJson`)]}),!e&&(0,L.jsx)(`span`,{className:`text-[10px] text-destructive`,children:a(`result.rowForm.invalid.json`)})]})]})}case`text`:return(0,L.jsx)(`textarea`,{className:`${u} min-h-[72px] resize-y`,value:t.text,onChange:e=>r(e.target.value),disabled:n,spellCheck:!1});case`binary`:return(0,L.jsx)(`div`,{className:`rounded border bg-muted/40 px-2 py-1 text-xs italic text-muted-foreground`,children:a(`result.rowForm.binaryUnsupported`)});case`uuid`:return(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`input`,{className:`${u} flex-1`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:`00000000-0000-0000-0000-000000000000`}),(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background px-1.5 py-1 text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,onClick:()=>r(crypto.randomUUID()),title:a(`result.rowForm.generateUuid`),children:(0,L.jsx)(O,{className:`size-3.5`})})]});default:{let i=t.text.length>80||t.text.includes(`
1
+ import{h as e,n as t,t as n,v as r}from"./ui-store-DfspmPOn.js";import{_t as i,ct as a,f as o,ft as s,h as c,m as l,ot as u,p as d,pt as f}from"./main-ot9WNZX1.js";import{a as p,l as m,m as h,t as g}from"./button--s6nUzD8.js";import{t as _}from"./connection-store-DjSajhjh.js";import{n as v}from"./settings-store-CSRx4hwh.js";import{r as y}from"./database-Dvj2X-0B.js";import{c as b,t as x}from"./query-execution-C2muZJbT.js";import{n as S}from"./use-engine-CwOU9o8-.js";import{a as C,i as w,n as T,o as E,r as D,t as ee}from"./dialog-CJoWJzRo.js";var O=p(`wand-sparkles`,[[`path`,{d:`m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72`,key:`ul74o6`}],[`path`,{d:`m14 7 3 3`,key:`1r5n42`}],[`path`,{d:`M5 6v4`,key:`ilb8ba`}],[`path`,{d:`M19 14v4`,key:`blhpug`}],[`path`,{d:`M10 2v2`,key:`7u0qdc`}],[`path`,{d:`M7 8H3`,key:`zfb6yr`}],[`path`,{d:`M21 16h-4`,key:`1cnmox`}],[`path`,{d:`M11 3H9`,key:`1obp7u`}]]),k=r(e(),1);function A(e){let t=e.slice(e.indexOf(`(`)+1,e.lastIndexOf(`)`)),n=[],r=/'((?:[^']|'')*)'/g,i;for(;i=r.exec(t);)n.push(i[1].replaceAll(`''`,`'`));return n}function j(e,t={}){let{oracleDate:n=!1}=t,r=e.type.trim(),i=r.toLowerCase(),a=/\bunsigned\b/.test(i);if(/^enum\(/.test(i))return{kind:`enum`,options:A(r)};if(/^set\(/.test(i))return{kind:`set`,options:A(r)};if(/^(tinyint\(1\)|bool|boolean|bit\(1\)|bit)(?![\w(])/.test(i))return{kind:`boolean`};let o=/^number(?:\((\d+|\*)(?:,\s*(-?\d+))?\))?$/.exec(i);if(o)return o[2]&&Number(o[2])>0?{kind:`decimal`}:o[1]?{kind:`integer`}:{kind:`decimal`};if(/^(tinyint|smallint|mediumint|int|integer|bigint|int2|int4|int8|serial|bigserial|smallserial)\b/.test(i))return{kind:`integer`,unsigned:a};if(/^(decimal|numeric|float|double|real|money|float4|float8|double precision)\b/.test(i))return{kind:`decimal`,unsigned:a};if(/^(datetime2|datetime|timestamp|smalldatetime|datetimeoffset)\b/.test(i))return{kind:`datetime`};if(/^date\b/.test(i))return{kind:n?`datetime`:`date`};if(/^(time|timetz)\b/.test(i))return{kind:`time`};if(/^(json|jsonb)\b/.test(i))return{kind:`json`};if(/^(uuid|uniqueidentifier)\b/.test(i))return{kind:`uuid`};if(/^(blob|tinyblob|mediumblob|longblob|binary|varbinary|bytea|raw|image|bfile)\b/.test(i))return{kind:`binary`};if(/^(text|ntext|tinytext|mediumtext|longtext|clob|nclob|long)\b/.test(i)||/^n?(?:var)?char2?\(max\)/.test(i))return{kind:`text`};let s=/^n?(?:var)?char2?(?:acter)?(?:\s+varying)?\((\d+)(?:\s+(?:char|byte))?\)/.exec(i);return s?{kind:`string`,maxLength:Number(s[1])}:{kind:`string`}}var M=/auto_increment|identity|generated/i;function N(e){return M.test(e.extra)||/^(serial|bigserial|smallserial)\b/i.test(e.type)?{mode:`auto`,text:``}:e.defaultValue===null?e.nullable?{mode:`null`,text:``}:{mode:`value`,text:``}:{mode:`default`,text:``}}function P(e){return e==null?{mode:`keep`,text:``}:{mode:`keep`,text:F(e)}}function F(e){if(e==null)return``;if(typeof e==`object`){if(ArrayBuffer.isView(e))return``;if(e instanceof Date)return e.toISOString();try{return JSON.stringify(e,null,2)}catch{return String(e)}}return String(e)}function I(e,t){let n=t.trim();switch(e.kind){case`integer`:{if(!/^[+-]?\d+$/.test(n))return{error:`integer`};if(e.unsigned&&n.startsWith(`-`))return{error:`unsigned`};let t=Number(n);return{value:Number.isSafeInteger(t)?t:BigInt(n)}}case`decimal`:return n===``||Number.isNaN(Number(n))?{error:`number`}:{value:Number(n)};case`boolean`:return{value:n===`true`||n===`1`};case`json`:try{return{value:JSON.parse(n===``?`null`:n)}}catch{return{error:`json`}}case`set`:return{value:n};case`date`:return n&&!/^\d{4}-\d{2}-\d{2}$/.test(n)?{error:`date`}:{value:n};case`datetime`:return n&&!/^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2}(\.\d+)?)?)?([+-]\d{2}:?\d{2}|Z)?$/.test(n)?{error:`datetime`}:{value:n};case`time`:return n&&!/^-?\d{1,3}:\d{2}(:\d{2}(\.\d+)?)?$/.test(n)?{error:`time`}:{value:n};default:return{value:t}}}var L=m(),R={integer:`result.rowForm.invalid.integer`,unsigned:`result.rowForm.invalid.unsigned`,number:`result.rowForm.invalid.number`,json:`result.rowForm.invalid.json`,date:`result.rowForm.invalid.date`,datetime:`result.rowForm.invalid.datetime`,time:`result.rowForm.invalid.time`};function z(e){return String(e).padStart(2,`0`)}function B(e){let t=new Date,n=`${t.getFullYear()}-${z(t.getMonth()+1)}-${z(t.getDate())}`,r=`${z(t.getHours())}:${z(t.getMinutes())}:${z(t.getSeconds())}`;return e===`date`?n:e===`time`?r:`${n} ${r}`}function V(e){let t=/^(\d{4})-(\d{2})-(\d{2})/.exec(e.trim());if(!t)return;let n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?void 0:n}function H({spec:e,state:t,disabled:n,onText:r}){let{t:a}=h(),u=`w-full rounded border bg-background px-2 py-1 text-sm font-mono outline-none focus:ring-1 focus:ring-primary disabled:opacity-50`;switch(e.kind){case`boolean`:return(0,L.jsxs)(`select`,{className:u,value:t.text===`true`||t.text===`1`?`true`:`false`,onChange:e=>r(e.target.value),disabled:n,children:[(0,L.jsx)(`option`,{value:`true`,children:`TRUE`}),(0,L.jsx)(`option`,{value:`false`,children:`FALSE`})]});case`enum`:return(0,L.jsxs)(`select`,{className:u,value:t.text,onChange:e=>r(e.target.value),disabled:n,children:[!e.options?.includes(t.text)&&(0,L.jsx)(`option`,{value:t.text,children:t.text||`—`}),e.options?.map(e=>(0,L.jsx)(`option`,{value:e,children:e},e))]});case`set`:{let i=new Set(t.text.split(`,`).map(e=>e.trim()).filter(Boolean));return(0,L.jsx)(`div`,{className:`flex flex-wrap gap-x-3 gap-y-1 rounded border bg-background px-2 py-1.5`,children:e.options?.map(t=>(0,L.jsxs)(`label`,{className:`flex items-center gap-1 text-xs font-mono`,children:[(0,L.jsx)(`input`,{type:`checkbox`,className:`accent-primary`,checked:i.has(t),disabled:n,onChange:n=>{let a=new Set(i);n.target.checked?a.add(t):a.delete(t),r(e.options.filter(e=>a.has(e)).join(`,`))}}),t]},t))})}case`integer`:case`decimal`:return(0,L.jsx)(`input`,{className:`${u} tabular-nums`,inputMode:`decimal`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:e.kind===`integer`?`0`:`0.00`});case`date`:case`datetime`:{let[f,p]=t.text.trim().split(/[ T]/);return(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`input`,{className:`${u} flex-1`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:e.kind===`date`?`YYYY-MM-DD`:`YYYY-MM-DD HH:MM:SS`}),(0,L.jsxs)(d,{children:[(0,L.jsx)(c,{asChild:!0,children:(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background p-1.5 text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,title:a(`result.rowForm.pickDate`),children:(0,L.jsx)(i,{className:`size-3.5`})})}),(0,L.jsx)(l,{className:`w-auto p-0`,align:`end`,children:(0,L.jsx)(o,{mode:`single`,selected:V(f??``),defaultMonth:V(f??``),onSelect:t=>{if(!t)return;let n=`${t.getFullYear()}-${z(t.getMonth()+1)}-${z(t.getDate())}`;r(e.kind===`date`?n:`${n} ${p||`00:00:00`}`)}})})]}),(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background px-1.5 py-1 text-[10px] text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,onClick:()=>r(B(e.kind)),title:a(`result.rowForm.now`),children:(0,L.jsx)(s,{className:`size-3.5`})})]})}case`time`:return(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`input`,{className:`${u} flex-1`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:`HH:MM:SS`}),(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background px-1.5 py-1 text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,onClick:()=>r(B(`time`)),title:a(`result.rowForm.now`),children:(0,L.jsx)(s,{className:`size-3.5`})})]});case`json`:{let e=!0;try{t.text.trim()&&JSON.parse(t.text)}catch{e=!1}return(0,L.jsxs)(`div`,{className:`space-y-1`,children:[(0,L.jsx)(`textarea`,{className:`${u} min-h-[96px] resize-y text-xs ${e?``:`border-destructive`}`,value:t.text,onChange:e=>r(e.target.value),disabled:n,spellCheck:!1,placeholder:`{}`}),(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,L.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 rounded border bg-background px-1.5 py-0.5 text-[10px] text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n||!e||!t.text.trim(),onClick:()=>{try{r(JSON.stringify(JSON.parse(t.text),null,2))}catch{}},children:[(0,L.jsx)(O,{className:`size-3`}),a(`result.rowForm.formatJson`)]}),!e&&(0,L.jsx)(`span`,{className:`text-[10px] text-destructive`,children:a(`result.rowForm.invalid.json`)})]})]})}case`text`:return(0,L.jsx)(`textarea`,{className:`${u} min-h-[72px] resize-y`,value:t.text,onChange:e=>r(e.target.value),disabled:n,spellCheck:!1});case`binary`:return(0,L.jsx)(`div`,{className:`rounded border bg-muted/40 px-2 py-1 text-xs italic text-muted-foreground`,children:a(`result.rowForm.binaryUnsupported`)});case`uuid`:return(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`input`,{className:`${u} flex-1`,value:t.text,onChange:e=>r(e.target.value),disabled:n,placeholder:`00000000-0000-0000-0000-000000000000`}),(0,L.jsx)(`button`,{type:`button`,className:`rounded border bg-background px-1.5 py-1 text-muted-foreground hover:text-foreground disabled:opacity-50`,disabled:n,onClick:()=>r(crypto.randomUUID()),title:a(`result.rowForm.generateUuid`),children:(0,L.jsx)(O,{className:`size-3.5`})})]});default:{let i=t.text.length>80||t.text.includes(`
2
2
  `);return(0,L.jsxs)(`div`,{className:`space-y-0.5`,children:[i?(0,L.jsx)(`textarea`,{className:`${u} min-h-[56px] resize-y`,value:t.text,onChange:e=>r(e.target.value),disabled:n,spellCheck:!1}):(0,L.jsx)(`input`,{className:u,value:t.text,onChange:e=>r(e.target.value),disabled:n,maxLength:e.maxLength}),e.maxLength&&(0,L.jsxs)(`div`,{className:`text-right text-[10px] tabular-nums ${t.text.length>e.maxLength?`text-destructive`:`text-muted-foreground`}`,children:[t.text.length,`/`,e.maxLength]})]})}}}function U(){let{t:e}=h(),r=n(`row-form`),i=t(e=>e.closeDialog),o=t(e=>e.setFooterMessage),s=S(r?.connectionId??``),c=_(e=>r?e.transactionOpen[r.connectionId]:!1),[l,d]=(0,k.useState)(null),[p,m]=(0,k.useState)(null),[O,A]=(0,k.useState)({}),[M,F]=(0,k.useState)({}),[z,B]=(0,k.useState)(null),[V,U]=(0,k.useState)(!1),W=r?.mode===`edit`;(0,k.useEffect)(()=>{if(!r)return;let e=!1,t=y(r.serverConnectionId);return s.introspect.listColumns(t,r.database,r.table).then(t=>{if(e)return;d(t);let n={};for(let e of t)if(r.mode===`edit`){let t=r.fields.find(t=>t.orgName===e.name);n[e.name]=P(t?r.row?.[t.name]:void 0)}else n[e.name]=N(e);A(n)}).catch(t=>{e||m(t instanceof Error?t.message:String(t))}),()=>{e=!0}},[r?.serverConnectionId,r?.database,r?.table,r?.mode]);let G=(0,k.useMemo)(()=>new Map((l??[]).map(e=>[e.name,j(e,{oracleDate:s.id===`oracle`})])),[l,s.id]),K=(0,k.useCallback)((e,t)=>{A(n=>({...n,[e]:{...n[e],mode:t}})),F(t=>{let n={...t};return delete n[e],n})},[]),q=(0,k.useCallback)((e,t)=>{A(n=>({...n,[e]:{mode:`value`,text:t}})),F(t=>{let n={...t};return delete n[e],n})},[]),J=(0,k.useMemo)(()=>({__default:!0}),[]),Y=(0,k.useCallback)(()=>{if(!l)return null;let t=new Map,n={};for(let r of l){let i=O[r.name],a=G.get(r.name);if(!i||i.mode===`auto`||i.mode===`keep`)continue;if(i.mode===`null`){t.set(r.name,null);continue}if(i.mode==="default"){t.set(r.name,J);continue}let o=I(a,i.text);if(`error`in o){n[r.name]=e(R[o.error]??`result.rowForm.invalid.number`);continue}if(a.maxLength&&typeof o.value==`string`&&o.value.length>a.maxLength){n[r.name]=e(`result.rowForm.invalid.length`,{max:a.maxLength});continue}t.set(r.name,o.value)}return F(n),Object.keys(n).length>0?null:{values:t}},[l,O,G,e,J]),X=(0,k.useCallback)(e=>{if(!r)return null;let t=e=>e===J?`DEFAULT`:s.quoteLiteral(e);if(r.mode===`insert`){let n=[...e];return n.length===0?s.getQuery(`INSERT_DEFAULT_VALUES`,r.database,r.table):s.getQuery(`INSERT_TABLE`,r.database,r.table,n.map(([e])=>s.quoteIdentifier(e)).join(`, `),n.map(([,e])=>t(e)).join(`, `))}return!r.where||e.size===0?null:s.getQuery(`UPDATE_TABLE`,r.database,r.table,[...e].map(([e,n])=>`${s.quoteIdentifier(e)} = ${t(n)}`).join(`, `),r.where)},[r,s,J]),Z=(0,k.useMemo)(()=>{if(!l)return``;let e=new Map;for(let t of l){let n=O[t.name];if(!(!n||n.mode===`auto`||n.mode===`keep`)){if(n.mode===`null`)e.set(t.name,null);else if(n.mode==="default")e.set(t.name,J);else{let r=I(G.get(t.name),n.text);e.set(t.name,`error`in r?n.text:r.value)}}}return X(e)??``},[l,O,G,X,J]),Q=e=>{let t={};for(let[n,i]of e){if(i===J)continue;let e=r?.fields.find(e=>e.orgName===n);t[e?.name??n]=typeof i==`bigint`?i.toString():i}return t},te=()=>{let e=Y();!e||!r||(r.onStage?.(r.mode,Q(e.values)),i())},ne=async()=>{let n=Y();if(!n||!r)return;let a=X(n.values);if(!a){B(e(`result.rowForm.nothingToWrite`));return}U(!0),B(null);try{if(v.getState().previewGridCommit&&!await t.getState().requestDestructiveConfirm({title:e(W?`result.rowForm.confirmUpdateTitle`:`result.rowForm.confirmInsertTitle`,{table:`${r.database}.${r.table}`}),statements:[a],confirmLabel:e(W?`result.rowForm.update`:`result.rowForm.insert`)}))return;await b(r.connectionId,a,{database:r.database,skipDestructiveConfirm:!0}),o(e(W?`result.rowForm.updated`:`result.rowForm.inserted`,{table:`${r.database}.${r.table}`})),r.onCommitted?.(r.mode,Q(n.values)),i()}catch(e){if(e instanceof x)return;B(e instanceof Error?e.message:String(e))}finally{U(!1)}};if(!r)return null;let $=(e,t,n,r)=>(0,L.jsx)(`button`,{type:`button`,className:`rounded px-1.5 py-0.5 text-[10px] font-medium ${r===t?`bg-primary text-primary-foreground`:`text-muted-foreground hover:bg-muted hover:text-foreground`}`,onClick:()=>K(e,t),children:n});return(0,L.jsx)(ee,{open:!0,onOpenChange:e=>{e||i()},children:(0,L.jsxs)(T,{className:`flex max-h-[90vh] flex-col sm:max-w-[860px]`,children:[(0,L.jsxs)(C,{children:[(0,L.jsx)(E,{children:e(W?`result.rowForm.editTitle`:`result.rowForm.insertTitle`)}),(0,L.jsxs)(D,{className:`font-mono text-xs`,children:[r.database,`.`,r.table]})]}),(0,L.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto rounded-md border`,children:[p&&(0,L.jsx)(`div`,{className:`rounded border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive`,children:p}),!l&&!p&&(0,L.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-10 text-sm text-muted-foreground`,children:[(0,L.jsx)(u,{className:`size-4 animate-spin`}),e(`result.rowForm.loading`)]}),l&&(0,L.jsxs)(`table`,{className:`w-full border-separate border-spacing-0 text-sm`,children:[(0,L.jsx)(`thead`,{className:`sticky top-0 z-10 bg-background`,children:(0,L.jsxs)(`tr`,{className:`text-left text-[10px] uppercase tracking-wide text-muted-foreground`,children:[(0,L.jsx)(`th`,{className:`w-[38%] border-b px-2 py-1.5 font-medium`,children:e(`result.rowForm.colColumn`)}),(0,L.jsx)(`th`,{className:`border-b px-2 py-1.5 font-medium`,children:e(`result.rowForm.colValue`)})]})}),(0,L.jsx)(`tbody`,{children:l.map(t=>{let n=O[t.name]??{mode:`value`,text:``},i=G.get(t.name),o=n.mode===`auto`,s=M[t.name],c=t.key===`PRI`,l=r.fields.find(e=>e.orgName===t.name),u=!!l&&!!r.row&&r.row[l.name]===null;return(0,L.jsxs)(`tr`,{className:`align-top ${s?`bg-destructive/5`:`hover:bg-muted/30`}`,children:[(0,L.jsxs)(`td`,{className:`border-b border-border/60 px-2 py-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(`span`,{className:`truncate font-mono text-sm font-medium`,title:t.name,children:t.name}),c&&(0,L.jsxs)(`span`,{className:`flex shrink-0 items-center gap-0.5 rounded border border-catppuccin-yellow/50 px-1 text-[9px] font-semibold text-catppuccin-yellow`,children:[(0,L.jsx)(a,{className:`size-2.5`}),`PK`]})]}),(0,L.jsxs)(`div`,{className:`mt-0.5 flex flex-wrap items-center gap-x-1.5 gap-y-0.5 text-[10px] text-muted-foreground`,children:[(0,L.jsx)(`span`,{className:`rounded bg-muted px-1 py-px font-mono`,children:t.type}),!t.nullable&&(0,L.jsx)(`span`,{children:`NOT NULL`}),t.defaultValue!==null&&(0,L.jsxs)(`span`,{className:`font-mono`,title:e(`result.rowForm.defaultValue`),children:[`= `,t.defaultValue]}),t.extra&&(0,L.jsx)(`span`,{children:t.extra})]}),t.comment&&(0,L.jsx)(`div`,{className:`mt-0.5 text-[10px] text-muted-foreground/80`,children:t.comment})]}),(0,L.jsx)(`td`,{className:`border-b border-border/60 px-2 py-2`,children:(0,L.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,L.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[n.mode===`keep`?(0,L.jsx)(`div`,{className:`cursor-text truncate rounded border border-dashed bg-muted/30 px-2 py-1 font-mono text-xs text-muted-foreground`,onClick:()=>K(t.name,`value`),title:e(`result.rowForm.clickToChange`),children:u?(0,L.jsx)(`span`,{className:`italic`,children:`NULL`}):n.text||(0,L.jsx)(`span`,{className:`italic`,children:e(`result.rowForm.empty`)})}):n.mode===`value`?(0,L.jsx)(H,{spec:i,state:n,disabled:!1,onText:e=>q(t.name,e)}):(0,L.jsx)(`div`,{className:`rounded border border-dashed bg-muted/30 px-2 py-1 font-mono text-xs italic text-muted-foreground`,children:n.mode===`null`?`NULL`:n.mode==="default"?`DEFAULT (${t.defaultValue??``})`:e(`result.rowForm.autoHint`)}),s&&(0,L.jsxs)(`div`,{className:`mt-1 flex items-center gap-1 text-[11px] text-destructive`,children:[(0,L.jsx)(f,{className:`size-3`}),s]})]}),(0,L.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5 rounded border bg-background p-0.5`,children:[W&&$(t.name,`keep`,e(`result.rowForm.mode.keep`),n.mode),(o||!W&&/auto_increment|identity/i.test(t.extra))&&$(t.name,`auto`,e(`result.rowForm.mode.auto`),n.mode),$(t.name,`value`,e(`result.rowForm.mode.value`),n.mode),t.nullable&&$(t.name,`null`,`NULL`,n.mode),t.defaultValue!==null&&$(t.name,`default`,`DEFAULT`,n.mode)]})]})})]},t.name)})})]})]}),l&&(0,L.jsxs)(`div`,{className:`shrink-0 rounded-md border bg-muted/30`,children:[(0,L.jsx)(`div`,{className:`border-b px-3 py-1 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground`,children:e(`result.rowForm.preview`)}),(0,L.jsx)(`pre`,{className:`max-h-24 overflow-auto whitespace-pre-wrap break-words px-3 py-2 font-mono text-xs`,children:Z||(0,L.jsx)(`span`,{className:`italic text-muted-foreground`,children:e(`result.rowForm.nothingToWrite`)})})]}),z&&(0,L.jsx)(`div`,{className:`shrink-0 rounded border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive`,children:z}),(0,L.jsxs)(w,{className:`items-center`,children:[c&&(0,L.jsx)(`span`,{className:`mr-auto text-[11px] text-catppuccin-yellow`,children:e(`result.rowForm.inTransaction`)}),(0,L.jsx)(g,{variant:`outline`,onClick:()=>i(),disabled:V,children:e(`command.close`)}),r.onStage&&(0,L.jsx)(g,{variant:`outline`,onClick:te,disabled:V||!l,title:e(`result.rowForm.stageHint`),children:e(W?`result.rowForm.stageEdit`:`result.rowForm.stageInsert`)}),(0,L.jsxs)(g,{onClick:()=>void ne(),disabled:V||!l,children:[V&&(0,L.jsx)(u,{className:`mr-1 size-3.5 animate-spin`}),e(W?`result.rowForm.update`:`result.rowForm.insert`)]})]})]})})}export{U as RowFormDialog};
@@ -1 +1 @@
1
- import{a as e,n as t}from"./ui-store-DfspmPOn.js";import{l as n,u as r}from"./main-CvsCEaFQ.js";import{l as i,m as a,t as o}from"./button--s6nUzD8.js";import{r as s,t as c}from"./i18n-C-w8Q5E_.js";import{a as l,i as u,n as d,r as f,t as p}from"./select-BUFSgZ7u.js";import{n as m,t as h}from"./settings-store-CYHWBgNo.js";import{a as g,i as _,n as v,o as y,r as b,t as x}from"./dialog-CJoWJzRo.js";var S=i();function C({id:e,checked:t,onChange:n,label:r,hint:i}){return(0,S.jsxs)(`label`,{htmlFor:e,className:`flex cursor-pointer items-start gap-3 rounded-md border p-3 hover:bg-accent/40`,children:[(0,S.jsx)(`input`,{id:e,type:`checkbox`,checked:t,onChange:e=>n(e.target.checked),className:`mt-0.5 size-4 accent-primary`}),(0,S.jsxs)(`span`,{className:`grid gap-0.5`,children:[(0,S.jsx)(`span`,{className:`text-sm font-medium`,children:r}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:i})]})]})}function w(){let i=t(e=>e.activeDialog),w=t(e=>e.closeDialog),T=m(),E=T.update,{t:D}=a();return(0,S.jsx)(x,{open:i===`safety-settings`,onOpenChange:e=>{e||w()},children:(0,S.jsxs)(v,{className:`sm:max-w-[560px]`,children:[(0,S.jsxs)(g,{children:[(0,S.jsx)(y,{children:D(`settings.title`)}),(0,S.jsx)(b,{children:D(`settings.description`)})]}),(0,S.jsxs)(`div`,{className:`grid gap-2`,children:[(0,S.jsx)(C,{id:`s-history`,checked:T.persistQueryHistory,onChange:e=>T.setPersistQueryHistory(e),label:D(`settings.persistHistory`),hint:D(`settings.persistHistoryHint`)}),(0,S.jsx)(C,{id:`s-confirm`,checked:T.confirmDestructive,onChange:e=>E({confirmDestructive:e}),label:`Confirm destructive statements`,hint:`Ask before DROP TABLE/DATABASE, TRUNCATE, DELETE or UPDATE without WHERE, and ALTER … DROP COLUMN.`}),(0,S.jsx)(C,{id:`s-dryrun`,checked:T.previewAffectedRows,onChange:e=>E({previewAffectedRows:e}),label:`Preview affected rows before UPDATE / DELETE`,hint:`Runs the statement's WHERE (joins included) as a SELECT first and shows the count and a sample of the rows; you confirm before anything is written.`}),(0,S.jsx)(C,{id:`s-warn`,checked:T.warnInEditor,onChange:e=>E({warnInEditor:e}),label:`Warn in the editor`,hint:`Underline destructive statements and statements a read-only connection would refuse.`}),(0,S.jsx)(C,{id:`s-override`,checked:T.allowReadOnlyOverride,onChange:e=>E({allowReadOnlyOverride:e}),label:`Allow "Run anyway" on read-only connections`,hint:`When off, writes on a read-only connection are refused with no override.`}),(0,S.jsx)(C,{id:`s-preview`,checked:T.previewGridCommit,onChange:e=>E({previewGridCommit:e}),label:`Preview SQL before committing grid edits`,hint:`Show the generated UPDATE statements and ask for confirmation.`}),(0,S.jsxs)(`div`,{className:`grid grid-cols-[1fr_140px] items-center gap-3 rounded-md border p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,S.jsx)(n,{htmlFor:`s-limit`,className:`text-sm font-medium`,children:`Result row limit`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`LIMIT appended to SELECTs that have none. 0 disables.`})]}),(0,S.jsx)(r,{id:`s-limit`,type:`number`,min:0,step:100,value:T.resultRowLimit,onChange:e=>E({resultRowLimit:Math.max(0,Number(e.target.value)||0)})})]}),(0,S.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,S.jsx)(`span`,{className:`text-sm font-medium`,children:`F9 / Run button executes`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Ctrl+Enter always runs the statement at the cursor; Ctrl+Shift+Enter the whole script.`})]}),(0,S.jsxs)(p,{value:T.executeScope,onValueChange:e=>E({executeScope:e}),children:[(0,S.jsx)(u,{children:(0,S.jsx)(l,{})}),(0,S.jsxs)(d,{children:[(0,S.jsx)(f,{value:`script`,children:`Whole script`}),(0,S.jsx)(f,{value:`statement`,children:`Statement at cursor`})]})]})]}),(0,S.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,S.jsx)(`span`,{className:`text-sm font-medium`,children:D(`settings.language`)}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:D(`settings.languageHint`)})]}),(0,S.jsxs)(p,{value:T.locale,onValueChange:e=>T.setLocale(e),children:[(0,S.jsx)(u,{children:(0,S.jsx)(l,{})}),(0,S.jsxs)(d,{children:[(0,S.jsx)(f,{value:`auto`,children:D(`language.auto`,{name:D(`language.${s()}`)})}),c.map(e=>(0,S.jsx)(f,{value:e,children:D(`language.${e}`)},e))]})]})]}),(0,S.jsx)(C,{id:`s-analytics`,checked:T.analyticsEnabled,onChange:T.setAnalyticsEnabled,label:D(`settings.analytics`),hint:e()?D(`settings.analyticsHint`):D(`settings.analyticsUnavailableHint`)})]}),(0,S.jsxs)(_,{children:[(0,S.jsx)(o,{variant:`ghost`,onClick:()=>E(h),children:D(`settings.resetDefaults`)}),(0,S.jsx)(o,{onClick:w,children:D(`settings.done`)})]})]})})}export{w as SafetySettingsDialog};
1
+ import{a as e,n as t}from"./ui-store-DfspmPOn.js";import{l as n,u as r}from"./main-ot9WNZX1.js";import{l as i,m as a,t as o}from"./button--s6nUzD8.js";import{r as s,t as c}from"./i18n-gQOmt8le.js";import{a as l,i as u,n as d,r as f,t as p}from"./select-DlF-eYgr.js";import{n as m,t as h}from"./settings-store-CSRx4hwh.js";import{a as g,i as _,n as v,o as y,r as b,t as x}from"./dialog-CJoWJzRo.js";var S=i();function C({id:e,checked:t,onChange:n,label:r,hint:i}){return(0,S.jsxs)(`label`,{htmlFor:e,className:`flex cursor-pointer items-start gap-3 rounded-md border p-3 hover:bg-accent/40`,children:[(0,S.jsx)(`input`,{id:e,type:`checkbox`,checked:t,onChange:e=>n(e.target.checked),className:`mt-0.5 size-4 accent-primary`}),(0,S.jsxs)(`span`,{className:`grid gap-0.5`,children:[(0,S.jsx)(`span`,{className:`text-sm font-medium`,children:r}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:i})]})]})}function w(){let i=t(e=>e.activeDialog),w=t(e=>e.closeDialog),T=m(),E=T.update,{t:D}=a();return(0,S.jsx)(x,{open:i===`safety-settings`,onOpenChange:e=>{e||w()},children:(0,S.jsxs)(v,{className:`sm:max-w-[560px]`,children:[(0,S.jsxs)(g,{children:[(0,S.jsx)(y,{children:D(`settings.title`)}),(0,S.jsx)(b,{children:D(`settings.description`)})]}),(0,S.jsxs)(`div`,{className:`grid gap-2`,children:[(0,S.jsx)(C,{id:`s-history`,checked:T.persistQueryHistory,onChange:e=>T.setPersistQueryHistory(e),label:D(`settings.persistHistory`),hint:D(`settings.persistHistoryHint`)}),(0,S.jsx)(C,{id:`s-confirm`,checked:T.confirmDestructive,onChange:e=>E({confirmDestructive:e}),label:`Confirm destructive statements`,hint:`Ask before DROP TABLE/DATABASE, TRUNCATE, DELETE or UPDATE without WHERE, and ALTER … DROP COLUMN.`}),(0,S.jsx)(C,{id:`s-dryrun`,checked:T.previewAffectedRows,onChange:e=>E({previewAffectedRows:e}),label:`Preview affected rows before UPDATE / DELETE`,hint:`Runs the statement's WHERE (joins included) as a SELECT first and shows the count and a sample of the rows; you confirm before anything is written.`}),(0,S.jsx)(C,{id:`s-warn`,checked:T.warnInEditor,onChange:e=>E({warnInEditor:e}),label:`Warn in the editor`,hint:`Underline destructive statements and statements a read-only connection would refuse.`}),(0,S.jsx)(C,{id:`s-override`,checked:T.allowReadOnlyOverride,onChange:e=>E({allowReadOnlyOverride:e}),label:`Allow "Run anyway" on read-only connections`,hint:`When off, writes on a read-only connection are refused with no override.`}),(0,S.jsx)(C,{id:`s-preview`,checked:T.previewGridCommit,onChange:e=>E({previewGridCommit:e}),label:`Preview SQL before committing grid edits`,hint:`Show the generated UPDATE statements and ask for confirmation.`}),(0,S.jsxs)(`div`,{className:`grid grid-cols-[1fr_140px] items-center gap-3 rounded-md border p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,S.jsx)(n,{htmlFor:`s-limit`,className:`text-sm font-medium`,children:`Result row limit`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`LIMIT appended to SELECTs that have none. 0 disables.`})]}),(0,S.jsx)(r,{id:`s-limit`,type:`number`,min:0,step:100,value:T.resultRowLimit,onChange:e=>E({resultRowLimit:Math.max(0,Number(e.target.value)||0)})})]}),(0,S.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,S.jsx)(`span`,{className:`text-sm font-medium`,children:`F9 / Run button executes`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Ctrl+Enter always runs the statement at the cursor; Ctrl+Shift+Enter the whole script.`})]}),(0,S.jsxs)(p,{value:T.executeScope,onValueChange:e=>E({executeScope:e}),children:[(0,S.jsx)(u,{children:(0,S.jsx)(l,{})}),(0,S.jsxs)(d,{children:[(0,S.jsx)(f,{value:`script`,children:`Whole script`}),(0,S.jsx)(f,{value:`statement`,children:`Statement at cursor`})]})]})]}),(0,S.jsxs)(`div`,{className:`grid grid-cols-[1fr_200px] items-center gap-3 rounded-md border p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,S.jsx)(`span`,{className:`text-sm font-medium`,children:D(`settings.language`)}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:D(`settings.languageHint`)})]}),(0,S.jsxs)(p,{value:T.locale,onValueChange:e=>T.setLocale(e),children:[(0,S.jsx)(u,{children:(0,S.jsx)(l,{})}),(0,S.jsxs)(d,{children:[(0,S.jsx)(f,{value:`auto`,children:D(`language.auto`,{name:D(`language.${s()}`)})}),c.map(e=>(0,S.jsx)(f,{value:e,children:D(`language.${e}`)},e))]})]})]}),(0,S.jsx)(C,{id:`s-analytics`,checked:T.analyticsEnabled,onChange:T.setAnalyticsEnabled,label:D(`settings.analytics`),hint:e()?D(`settings.analyticsHint`):D(`settings.analyticsUnavailableHint`)})]}),(0,S.jsxs)(_,{children:[(0,S.jsx)(o,{variant:`ghost`,onClick:()=>E(h),children:D(`settings.resetDefaults`)}),(0,S.jsx)(o,{onClick:w,children:D(`settings.done`)})]})]})})}export{w as SafetySettingsDialog};
@@ -1,4 +1,4 @@
1
- import{c as e,h as t,n,t as r,v as i}from"./ui-store-DfspmPOn.js";import{A as a,k as o,l as s}from"./main-CvsCEaFQ.js";import{l as c,m as l,t as u}from"./button--s6nUzD8.js";import{a as d,i as f,n as p,r as m,t as h}from"./select-BUFSgZ7u.js";import{t as g}from"./connection-store-CAPTzFtT.js";import{r as _}from"./database-4FcrMRGA.js";import{n as v}from"./engine-DWYEiSZM.js";import{t as ee}from"./pro-usage-Dp3liEjn.js";import{t as y}from"./table-definition-Bs5VSn0X.js";import{a as b,i as te,n as ne,o as re,t as ie}from"./dialog-CJoWJzRo.js";var x=i(t(),1),S=[`VIEW`,`PROCEDURE`,`FUNCTION`,`TRIGGER`,`EVENT`];function C(e,t){return e.replace(/\bDEFINER\s*=\s*(?:`[^`]*`|'[^']*'|"[^"]*"|\w+)@(?:`[^`]*`|'[^']*'|"[^"]*"|[\w.%-]+)/gi,``).replace(/\bSQL SECURITY (?:DEFINER|INVOKER)\b/gi,``).replace(/\bALGORITHM\s*=\s*\w+/gi,``).replace(RegExp(`[\`"\\[]?${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}[\`"\\]]?\\.`,`gi`),``).replace(/\s+/g,` `).replace(/;\s*$/,``).trim()}function w(e,t){let n=[];for(let r of S){let i=e.objects?.get(r),a=t.objects?.get(r);if(!i&&!a)continue;let o=[...new Set([...i?.keys()??[],...a?.keys()??[]])].sort();for(let s of o){let o=i?.get(s)??null,c=a?.get(s)??null,l;l=o?c?o.sql!==null&&c.sql!==null&&C(o.sql,e.database)===C(c.sql,t.database)?`identical`:`changed`:`missingInTarget`:`missingInSource`,n.push({type:r,name:s,status:l,source:o,target:c})}}return n}var T=e=>e.toLowerCase().replace(/\s+/g,` `).trim(),E=e=>e===null?null:e.trim().replace(/^'(.*)'(?:::\w+)?$/s,`$1`),D=e=>e.addedColumns.length+e.removedColumns.length+e.changedColumns.length+e.addedIndexes.length+e.removedIndexes.length+e.changedIndexes.length>0;function O(e,t){let n=[];return T(e.type)!==T(t.type)&&n.push(`type`),e.nullable!==t.nullable&&n.push(`nullable`),E(e.defaultValue)!==E(t.defaultValue)&&n.push(`default`),e.extra.toLowerCase()!==t.extra.toLowerCase()&&n.push(`extra`),n}var k=(e,t)=>e.type===t.type&&e.columns.length===t.columns.length&&e.columns.every((e,n)=>e===t.columns[n]);function A(e,t,n){let r=t.columns.get(e)??[],i=n.columns.get(e)??[],a=new Map(i.map(e=>[e.name,e])),o=new Map(r.map(e=>[e.name,e])),s={table:e,addedColumns:r.filter(e=>!a.has(e.name)),removedColumns:i.filter(e=>!o.has(e.name)),changedColumns:[],addedIndexes:[],removedIndexes:[],changedIndexes:[]};for(let e of r){let t=a.get(e.name);if(!t)continue;let n=O(e,t);n.length>0&&s.changedColumns.push({name:e.name,source:e,target:t,attributes:n})}let c=t.indexes.get(e)??[],l=n.indexes.get(e)??[],u=new Map(l.map(e=>[e.name,e])),d=new Map(c.map(e=>[e.name,e]));s.addedIndexes=c.filter(e=>!u.has(e.name)),s.removedIndexes=l.filter(e=>!d.has(e.name));for(let e of c){let t=u.get(e.name);t&&!k(e,t)&&s.changedIndexes.push({name:e.name,source:e,target:t})}return s}function j(e,t){let n=new Set(t.tables),r=new Set(e.tables),i={missingInTarget:[],missingInSource:[],changed:[],identical:[],objects:w(e,t)};for(let r of e.tables){if(!n.has(r)){i.missingInTarget.push(r);continue}let a=A(r,e,t);D(a)?i.changed.push(a):i.identical.push(r)}return i.missingInSource=t.tables.filter(e=>!r.has(e)),i}var M=e=>e.split(`
1
+ import{c as e,h as t,n,t as r,v as i}from"./ui-store-DfspmPOn.js";import{A as a,k as o,l as s}from"./main-ot9WNZX1.js";import{l as c,m as l,t as u}from"./button--s6nUzD8.js";import{a as d,i as f,n as p,r as m,t as h}from"./select-DlF-eYgr.js";import{t as g}from"./connection-store-DjSajhjh.js";import{r as _}from"./database-Dvj2X-0B.js";import{n as v}from"./engine-CzHq4UCB.js";import{t as ee}from"./pro-usage-BnI7zYsZ.js";import{t as y}from"./table-definition-Bs5VSn0X.js";import{a as b,i as te,n as ne,o as re,t as ie}from"./dialog-CJoWJzRo.js";var x=i(t(),1),S=[`VIEW`,`PROCEDURE`,`FUNCTION`,`TRIGGER`,`EVENT`];function C(e,t){return e.replace(/\bDEFINER\s*=\s*(?:`[^`]*`|'[^']*'|"[^"]*"|\w+)@(?:`[^`]*`|'[^']*'|"[^"]*"|[\w.%-]+)/gi,``).replace(/\bSQL SECURITY (?:DEFINER|INVOKER)\b/gi,``).replace(/\bALGORITHM\s*=\s*\w+/gi,``).replace(RegExp(`[\`"\\[]?${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}[\`"\\]]?\\.`,`gi`),``).replace(/\s+/g,` `).replace(/;\s*$/,``).trim()}function w(e,t){let n=[];for(let r of S){let i=e.objects?.get(r),a=t.objects?.get(r);if(!i&&!a)continue;let o=[...new Set([...i?.keys()??[],...a?.keys()??[]])].sort();for(let s of o){let o=i?.get(s)??null,c=a?.get(s)??null,l;l=o?c?o.sql!==null&&c.sql!==null&&C(o.sql,e.database)===C(c.sql,t.database)?`identical`:`changed`:`missingInTarget`:`missingInSource`,n.push({type:r,name:s,status:l,source:o,target:c})}}return n}var T=e=>e.toLowerCase().replace(/\s+/g,` `).trim(),E=e=>e===null?null:e.trim().replace(/^'(.*)'(?:::\w+)?$/s,`$1`),D=e=>e.addedColumns.length+e.removedColumns.length+e.changedColumns.length+e.addedIndexes.length+e.removedIndexes.length+e.changedIndexes.length>0;function O(e,t){let n=[];return T(e.type)!==T(t.type)&&n.push(`type`),e.nullable!==t.nullable&&n.push(`nullable`),E(e.defaultValue)!==E(t.defaultValue)&&n.push(`default`),e.extra.toLowerCase()!==t.extra.toLowerCase()&&n.push(`extra`),n}var k=(e,t)=>e.type===t.type&&e.columns.length===t.columns.length&&e.columns.every((e,n)=>e===t.columns[n]);function A(e,t,n){let r=t.columns.get(e)??[],i=n.columns.get(e)??[],a=new Map(i.map(e=>[e.name,e])),o=new Map(r.map(e=>[e.name,e])),s={table:e,addedColumns:r.filter(e=>!a.has(e.name)),removedColumns:i.filter(e=>!o.has(e.name)),changedColumns:[],addedIndexes:[],removedIndexes:[],changedIndexes:[]};for(let e of r){let t=a.get(e.name);if(!t)continue;let n=O(e,t);n.length>0&&s.changedColumns.push({name:e.name,source:e,target:t,attributes:n})}let c=t.indexes.get(e)??[],l=n.indexes.get(e)??[],u=new Map(l.map(e=>[e.name,e])),d=new Map(c.map(e=>[e.name,e]));s.addedIndexes=c.filter(e=>!u.has(e.name)),s.removedIndexes=l.filter(e=>!d.has(e.name));for(let e of c){let t=u.get(e.name);t&&!k(e,t)&&s.changedIndexes.push({name:e.name,source:e,target:t})}return s}function j(e,t){let n=new Set(t.tables),r=new Set(e.tables),i={missingInTarget:[],missingInSource:[],changed:[],identical:[],objects:w(e,t)};for(let r of e.tables){if(!n.has(r)){i.missingInTarget.push(r);continue}let a=A(r,e,t);D(a)?i.changed.push(a):i.identical.push(r)}return i.missingInSource=t.tables.filter(e=>!r.has(e)),i}var M=e=>e.split(`
2
2
  `).map(e=>`-- ${e}`).join(`
3
3
  `);function ae(e,t,n,r,i={}){let a=n.ddl,o=r.database,s=e=>i.includeDrops?e:M(e),c=[`-- Schema sync: ${t.database} -> ${o} (${n.label})`,`-- Review before running. Statements that drop data are commented out unless "Include DROP statements" was checked.`,``];for(let r of e.missingInTarget)c.push(`-- Table ${r} is missing in the target`),c.push(N(r,t,n,o)),c.push(``);for(let t of e.changed){c.push(`-- Table ${t.table}`);for(let e of t.removedIndexes)c.push(s(a.dropIndex(o,t.table,e.name)));for(let e of t.changedIndexes)c.push(s(a.dropIndex(o,t.table,e.name)));for(let e of t.addedColumns)c.push(a.addColumn(o,t.table,e));for(let e of t.changedColumns){let r=a.alterColumn(o,t.table,e.source);c.push(r??M(`${n.label} cannot alter column ${e.name} in place (${e.attributes.join(`, `)}): recreate the table`))}for(let e of t.removedColumns)c.push(s(a.dropColumn(o,t.table,e.name)));for(let e of t.addedIndexes)c.push(a.createIndex(o,t.table,e));for(let e of t.changedIndexes)c.push(a.createIndex(o,t.table,e.source));c.push(``)}for(let t of e.missingInSource)c.push(`-- Table ${t} exists only in the target`),c.push(s(`DROP TABLE ${n.qualify(o,t)};`)),c.push(``);for(let t of e.objects){if(t.status===`identical`)continue;let e=`${t.type.charAt(0)}${t.type.slice(1).toLowerCase()} ${t.name}`,r=F(n,o,t);t.status===`missingInSource`?(c.push(`-- ${e} exists only in the target`),c.push(s(r))):(c.push(t.status===`changed`?`-- ${e} differs; recreated from the source`:`-- ${e} is missing in the target`),t.status===`changed`&&c.push(s(r)),c.push(t.source?.sql?I(t.source.sql):M(`the source engine did not return a CREATE statement for ${e}`))),c.push(``)}return c.join(`
4
4
  `).replace(/\n{3,}/g,`
@@ -1,4 +1,4 @@
1
- import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{j as r,l as i}from"./main-CvsCEaFQ.js";import{l as a,m as o,t as s}from"./button--s6nUzD8.js";import{a as c,i as l,n as u,r as d,t as f}from"./select-BUFSgZ7u.js";import{t as p}from"./connection-store-CAPTzFtT.js";import{n as m}from"./query-store-CRp9AQS5.js";import{b as h,r as g}from"./database-4FcrMRGA.js";import{n as _}from"./engine-DWYEiSZM.js";import{o as v,r as y}from"./schema-nodes-D3-cz2Xk.js";import{a as b,i as x,n as S,o as C,t as w}from"./dialog-CJoWJzRo.js";import{t as T}from"./file-name-CnYBZPf9.js";var E=n(e(),1),D=a();function O(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function k(){let{t:e}=o(),{activeDialog:n,closeDialog:a}=t(),{activeConnectionId:k,activeConnections:A}=p(),{trees:j}=h(),M=m(),N=n===`export-html`,P=(0,E.useMemo)(()=>k?y(j[k]??[]):[],[k,j]),F=(0,E.useMemo)(()=>{if(!k)return``;let e=M.activeTabId[k];return(M.tabs[k]??[]).find(t=>t.id===e)?.database||``},[k,M.activeTabId,M.tabs]),[I,L]=(0,E.useState)(``),R=(0,E.useMemo)(()=>!k||!I?[]:v(j[k]??[],I),[k,I,j]),[z,B]=(0,E.useState)([]),[V,H]=(0,E.useState)(!0),[U,W]=(0,E.useState)(!0),[G,K]=(0,E.useState)(!0),[q,J]=(0,E.useState)(!1);(0,E.useEffect)(()=>{N&&F&&L(F)},[N,F]);function Y(e){e||(a(),L(``),B([]),H(!0),W(!0),K(!0))}function X(e){B(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])}function Z(){B(R.length===z.length?[]:[...R])}async function Q(){if(z.length===0||!k)return;let t=A.find(e=>e.id===k);if(!t?.serverConnectionId)return;J(!0);let{introspect:n}=_(k),r=g(t.serverConnectionId),i=(e,t,n)=>{let r=`<h3>${O(e)}</h3>\n<table border="1" cellpadding="4" cellspacing="0">\n`;r+=`<tr>${t.map(e=>`<th>${O(e)}</th>`).join(``)}</tr>\n`;for(let e of n)r+=`<tr>${e.map(e=>`<td>${O(e==null?`NULL`:String(e))}</td>`).join(``)}</tr>\n`;return r+`</table>
1
+ import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{j as r,l as i}from"./main-ot9WNZX1.js";import{l as a,m as o,t as s}from"./button--s6nUzD8.js";import{a as c,i as l,n as u,r as d,t as f}from"./select-DlF-eYgr.js";import{t as p}from"./connection-store-DjSajhjh.js";import{n as m}from"./query-store-yK1eqNW-.js";import{b as h,r as g}from"./database-Dvj2X-0B.js";import{n as _}from"./engine-CzHq4UCB.js";import{o as v,r as y}from"./schema-nodes-2owuMIuw.js";import{a as b,i as x,n as S,o as C,t as w}from"./dialog-CJoWJzRo.js";import{t as T}from"./file-name-CnYBZPf9.js";var E=n(e(),1),D=a();function O(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function k(){let{t:e}=o(),{activeDialog:n,closeDialog:a}=t(),{activeConnectionId:k,activeConnections:A}=p(),{trees:j}=h(),M=m(),N=n===`export-html`,P=(0,E.useMemo)(()=>k?y(j[k]??[]):[],[k,j]),F=(0,E.useMemo)(()=>{if(!k)return``;let e=M.activeTabId[k];return(M.tabs[k]??[]).find(t=>t.id===e)?.database||``},[k,M.activeTabId,M.tabs]),[I,L]=(0,E.useState)(``),R=(0,E.useMemo)(()=>!k||!I?[]:v(j[k]??[],I),[k,I,j]),[z,B]=(0,E.useState)([]),[V,H]=(0,E.useState)(!0),[U,W]=(0,E.useState)(!0),[G,K]=(0,E.useState)(!0),[q,J]=(0,E.useState)(!1);(0,E.useEffect)(()=>{N&&F&&L(F)},[N,F]);function Y(e){e||(a(),L(``),B([]),H(!0),W(!0),K(!0))}function X(e){B(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])}function Z(){B(R.length===z.length?[]:[...R])}async function Q(){if(z.length===0||!k)return;let t=A.find(e=>e.id===k);if(!t?.serverConnectionId)return;J(!0);let{introspect:n}=_(k),r=g(t.serverConnectionId),i=(e,t,n)=>{let r=`<h3>${O(e)}</h3>\n<table border="1" cellpadding="4" cellspacing="0">\n`;r+=`<tr>${t.map(e=>`<th>${O(e)}</th>`).join(``)}</tr>\n`;for(let e of n)r+=`<tr>${e.map(e=>`<td>${O(e==null?`NULL`:String(e))}</td>`).join(``)}</tr>\n`;return r+`</table>
2
2
  `};try{let t=[];for(let a of z){let o=`<h2>${O(a)}</h2>\n`;if(V){let t=await n.listColumns(r,I,a);t.length>0&&(o+=i(e(`database.html.sectionColumns`),[`Field`,`Type`,`Null`,`Key`,`Default`,`Extra`,`Comment`],t.map(e=>[e.name,e.type,e.nullable?`YES`:`NO`,e.key,e.defaultValue,e.extra,e.comment])))}if(U){let t=await n.listIndexes(r,I,a);t.length>0&&(o+=i(e(`database.html.sectionIndexes`),[`Key_name`,`Type`,`Columns`],t.map(e=>[e.name,e.type,e.columns.join(`, `)])))}if(G){let t=await n.getTableInfo(r,I,a);t&&(o+=i(e(`database.html.sectionProperties`),[`Name`,`Engine`,`Collation`,`Rows`,`Data_length`,`Create_time`,`Update_time`,`Comment`],[[t.name,t.engine,t.collation,t.rows,t.dataLength,t.createTime,t.updateTime,t.comment]]))}t.push(o)}let a=`<!DOCTYPE html>
3
3
  <html lang="en">
4
4
  <head>
@@ -1 +1 @@
1
- import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{C as r,S as i,b as a,j as o,u as s,w as c,x as l,y as u}from"./main-CvsCEaFQ.js";import{l as d,m as f,t as p}from"./button--s6nUzD8.js";import{a as m}from"./i18n-C-w8Q5E_.js";import{t as h}from"./connection-store-CAPTzFtT.js";import{o as g}from"./database-4FcrMRGA.js";import{t as _}from"./engine-DWYEiSZM.js";import{a as v,i as y,n as b,o as x,t as S}from"./dialog-CJoWJzRo.js";var C=n(e(),1),w=d();function T(){let e=h.getState();return e.activeConnections.find(t=>t.id===e.activeConnectionId)?.serverConnectionId??null}async function E(e){let t=T();if(!t)throw Error(m.t(`command.noActiveConnection`));let n=_().getQuery(e===`global`?`SHOW_GLOBAL_STATUS`:`SHOW_SESSION_STATUS`);return(await g(t,n)).records.map(e=>({Variable_name:e[0],Value:e[1]}))}function D(){let{t:e}=f(),{activeDialog:n,closeDialog:d,setFooterMessage:m}=t(),[h,g]=(0,C.useState)([]),[_,T]=(0,C.useState)(``),[D,O]=(0,C.useState)(`session`),k=n===`status`,A=(0,C.useCallback)(t=>E(t).then(g).catch(t=>m(e(`command.status.loadError`,{message:t instanceof Error?t.message:String(t)}))),[m,e]);(0,C.useEffect)(()=>{k&&A(D)},[k,D,A]);let j=(0,C.useMemo)(()=>{if(!_.trim())return h;let e=_.toLowerCase();return h.filter(t=>t.Variable_name.toLowerCase().includes(e)||t.Value.toLowerCase().includes(e))},[h,_]);function M(e){e||(T(``),d())}function N(e){O(e)}return(0,w.jsx)(S,{open:k,onOpenChange:M,children:(0,w.jsxs)(b,{className:`sm:max-w-[900px] max-h-[80vh] flex flex-col`,children:[(0,w.jsx)(v,{children:(0,w.jsx)(x,{children:e(`command.status.title`)})}),(0,w.jsxs)(`div`,{className:`flex items-center gap-3 pb-2`,children:[(0,w.jsxs)(`div`,{className:`flex gap-1`,children:[(0,w.jsx)(p,{variant:D===`session`?`default`:`outline`,size:`sm`,onClick:()=>N(`session`),children:e(`command.scope.session`)}),(0,w.jsx)(p,{variant:D===`global`?`default`:`outline`,size:`sm`,onClick:()=>N(`global`),children:e(`command.scope.global`)})]}),(0,w.jsx)(s,{placeholder:e(`command.status.filterPlaceholder`),value:_,onChange:e=>T(e.target.value),className:`max-w-xs`})]}),(0,w.jsx)(`div`,{className:`flex-1 border rounded-md overflow-hidden min-h-0`,children:(0,w.jsx)(o,{className:`h-[400px]`,children:(0,w.jsxs)(u,{children:[(0,w.jsx)(r,{children:(0,w.jsxs)(c,{children:[(0,w.jsx)(i,{className:`w-[300px]`,children:e(`command.variableName`)}),(0,w.jsx)(i,{children:e(`command.value`)})]})}),(0,w.jsx)(a,{children:j.length===0?(0,w.jsx)(c,{children:(0,w.jsx)(l,{colSpan:2,className:`text-center text-muted-foreground`,children:e(`command.status.empty`)})}):j.map(e=>(0,w.jsxs)(c,{children:[(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Variable_name}),(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Value})]},e.Variable_name))})]})})}),(0,w.jsx)(y,{children:(0,w.jsx)(p,{variant:`outline`,onClick:()=>M(!1),children:e(`command.close`)})})]})})}export{D as StatusDialog};
1
+ import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{C as r,S as i,b as a,j as o,u as s,w as c,x as l,y as u}from"./main-ot9WNZX1.js";import{l as d,m as f,t as p}from"./button--s6nUzD8.js";import{a as m}from"./i18n-gQOmt8le.js";import{t as h}from"./connection-store-DjSajhjh.js";import{o as g}from"./database-Dvj2X-0B.js";import{t as _}from"./engine-CzHq4UCB.js";import{a as v,i as y,n as b,o as x,t as S}from"./dialog-CJoWJzRo.js";var C=n(e(),1),w=d();function T(){let e=h.getState();return e.activeConnections.find(t=>t.id===e.activeConnectionId)?.serverConnectionId??null}async function E(e){let t=T();if(!t)throw Error(m.t(`command.noActiveConnection`));let n=_().getQuery(e===`global`?`SHOW_GLOBAL_STATUS`:`SHOW_SESSION_STATUS`);return(await g(t,n)).records.map(e=>({Variable_name:e[0],Value:e[1]}))}function D(){let{t:e}=f(),{activeDialog:n,closeDialog:d,setFooterMessage:m}=t(),[h,g]=(0,C.useState)([]),[_,T]=(0,C.useState)(``),[D,O]=(0,C.useState)(`session`),k=n===`status`,A=(0,C.useCallback)(t=>E(t).then(g).catch(t=>m(e(`command.status.loadError`,{message:t instanceof Error?t.message:String(t)}))),[m,e]);(0,C.useEffect)(()=>{k&&A(D)},[k,D,A]);let j=(0,C.useMemo)(()=>{if(!_.trim())return h;let e=_.toLowerCase();return h.filter(t=>t.Variable_name.toLowerCase().includes(e)||t.Value.toLowerCase().includes(e))},[h,_]);function M(e){e||(T(``),d())}function N(e){O(e)}return(0,w.jsx)(S,{open:k,onOpenChange:M,children:(0,w.jsxs)(b,{className:`sm:max-w-[900px] max-h-[80vh] flex flex-col`,children:[(0,w.jsx)(v,{children:(0,w.jsx)(x,{children:e(`command.status.title`)})}),(0,w.jsxs)(`div`,{className:`flex items-center gap-3 pb-2`,children:[(0,w.jsxs)(`div`,{className:`flex gap-1`,children:[(0,w.jsx)(p,{variant:D===`session`?`default`:`outline`,size:`sm`,onClick:()=>N(`session`),children:e(`command.scope.session`)}),(0,w.jsx)(p,{variant:D===`global`?`default`:`outline`,size:`sm`,onClick:()=>N(`global`),children:e(`command.scope.global`)})]}),(0,w.jsx)(s,{placeholder:e(`command.status.filterPlaceholder`),value:_,onChange:e=>T(e.target.value),className:`max-w-xs`})]}),(0,w.jsx)(`div`,{className:`flex-1 border rounded-md overflow-hidden min-h-0`,children:(0,w.jsx)(o,{className:`h-[400px]`,children:(0,w.jsxs)(u,{children:[(0,w.jsx)(r,{children:(0,w.jsxs)(c,{children:[(0,w.jsx)(i,{className:`w-[300px]`,children:e(`command.variableName`)}),(0,w.jsx)(i,{children:e(`command.value`)})]})}),(0,w.jsx)(a,{children:j.length===0?(0,w.jsx)(c,{children:(0,w.jsx)(l,{colSpan:2,className:`text-center text-muted-foreground`,children:e(`command.status.empty`)})}):j.map(e=>(0,w.jsxs)(c,{children:[(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Variable_name}),(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Value})]},e.Variable_name))})]})})}),(0,w.jsx)(y,{children:(0,w.jsx)(p,{variant:`outline`,onClick:()=>M(!1),children:e(`command.close`)})})]})})}export{D as StatusDialog};
@@ -1 +1 @@
1
- import{n as e}from"./ui-store-DfspmPOn.js";import{l as t,m as n,t as r}from"./button--s6nUzD8.js";import"./settings-store-CYHWBgNo.js";import{a as i,i as a,n as o,o as s,r as c,t as l}from"./dialog-CJoWJzRo.js";var u=t(),d=[{title:`1. Acceptance`,body:`By using Planche (the "Software"), whether at planche.dev or through the local agent published as the "planche" npm package, you agree to these Terms of Use. If you do not agree, do not use the Software.`},{title:`2. What the Software does`,body:`Planche is a database client. It sends the SQL statements you write, and the statements generated from your actions (editing rows in the grid, dropping or truncating objects from the schema tree, and similar), to the databases you connect to. Statements are executed as-is with the privileges of the credentials you provide. You are solely responsible for every statement executed through the Software and for its effects on your data.`},{title:`3. Safeguards`,body:`The Software includes safeguards such as confirmation prompts for destructive statements, read-only connections, environment colors, manual transaction mode, and previews of generated UPDATE statements. These are conveniences, not guarantees. They can be disabled, bypassed, or fail to recognize a statement as destructive. Keep independent backups of any data you care about before running statements against it.`},{title:`4. Local processing and privacy`,body:`Database credentials, queries, and results are handled by the local agent on your machine and by your browser. They are not transmitted to the authors of the Software. Profiles, history, and settings are stored in your browser's local storage; you may remove them at any time by clearing site data.`},{title:`5. No warranty`,body:`THE SOFTWARE IS PROVIDED "AS IS" AND "AS AVAILABLE", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, AND NON-INFRINGEMENT. The authors do not warrant that the Software will be error-free, that it will correctly parse or classify every statement, or that it will be available without interruption.`},{title:`6. Limitation of liability`,body:`TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE AUTHORS SHALL NOT BE LIABLE FOR ANY LOSS OF DATA, LOSS OF PROFITS, BUSINESS INTERRUPTION, OR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES ARISING OUT OF OR RELATED TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Where liability cannot be excluded, it is limited to the amount you paid for the Software in the twelve months preceding the claim. Nothing in these terms limits liability that cannot be limited under applicable law, including for wilful misconduct or gross negligence.`},{title:`7. Your responsibilities`,body:`You are responsible for having the right to access each database you connect to, for the safekeeping of your credentials, and for complying with the laws and policies that apply to the data you work with.`},{title:`8. Changes`,body:`These terms may be updated. When they change materially, you will be asked to accept the new version before continuing to use the Software. Continued use after acceptance constitutes agreement to the updated terms.`}];function f(){let t=e(e=>e.activeDialog),f=e(e=>e.closeDialog),{t:p}=n();return(0,u.jsx)(l,{open:t===`terms`,onOpenChange:e=>{e||f()},children:(0,u.jsxs)(o,{className:`flex max-h-[85vh] flex-col sm:max-w-[640px]`,children:[(0,u.jsxs)(i,{children:[(0,u.jsx)(s,{children:p(`terms.title`)}),(0,u.jsx)(c,{children:p(`terms.version`,{version:1})})]}),(0,u.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-auto rounded-md border bg-muted/40 p-4 text-sm`,children:[(0,u.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:p(`terms.englishOnly`)}),d.map(e=>(0,u.jsxs)(`section`,{className:`mb-4 last:mb-0`,children:[(0,u.jsx)(`h3`,{className:`mb-1 font-semibold`,children:e.title}),(0,u.jsx)(`p`,{className:`leading-relaxed text-muted-foreground`,children:e.body})]},e.title))]}),(0,u.jsx)(a,{children:(0,u.jsx)(r,{onClick:f,children:p(`settings.done`)})})]})})}export{f as TermsDialog};
1
+ import{n as e}from"./ui-store-DfspmPOn.js";import{l as t,m as n,t as r}from"./button--s6nUzD8.js";import"./settings-store-CSRx4hwh.js";import{a as i,i as a,n as o,o as s,r as c,t as l}from"./dialog-CJoWJzRo.js";var u=t(),d=[{title:`1. Acceptance`,body:`By using Planche (the "Software"), whether at planche.dev or through the local agent published as the "planche" npm package, you agree to these Terms of Use. If you do not agree, do not use the Software.`},{title:`2. What the Software does`,body:`Planche is a database client. It sends the SQL statements you write, and the statements generated from your actions (editing rows in the grid, dropping or truncating objects from the schema tree, and similar), to the databases you connect to. Statements are executed as-is with the privileges of the credentials you provide. You are solely responsible for every statement executed through the Software and for its effects on your data.`},{title:`3. Safeguards`,body:`The Software includes safeguards such as confirmation prompts for destructive statements, read-only connections, environment colors, manual transaction mode, and previews of generated UPDATE statements. These are conveniences, not guarantees. They can be disabled, bypassed, or fail to recognize a statement as destructive. Keep independent backups of any data you care about before running statements against it.`},{title:`4. Local processing and privacy`,body:`Database credentials, queries, and results are handled by the local agent on your machine and by your browser. They are not transmitted to the authors of the Software. Profiles, history, and settings are stored in your browser's local storage; you may remove them at any time by clearing site data.`},{title:`5. No warranty`,body:`THE SOFTWARE IS PROVIDED "AS IS" AND "AS AVAILABLE", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, AND NON-INFRINGEMENT. The authors do not warrant that the Software will be error-free, that it will correctly parse or classify every statement, or that it will be available without interruption.`},{title:`6. Limitation of liability`,body:`TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE AUTHORS SHALL NOT BE LIABLE FOR ANY LOSS OF DATA, LOSS OF PROFITS, BUSINESS INTERRUPTION, OR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES ARISING OUT OF OR RELATED TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Where liability cannot be excluded, it is limited to the amount you paid for the Software in the twelve months preceding the claim. Nothing in these terms limits liability that cannot be limited under applicable law, including for wilful misconduct or gross negligence.`},{title:`7. Your responsibilities`,body:`You are responsible for having the right to access each database you connect to, for the safekeeping of your credentials, and for complying with the laws and policies that apply to the data you work with.`},{title:`8. Changes`,body:`These terms may be updated. When they change materially, you will be asked to accept the new version before continuing to use the Software. Continued use after acceptance constitutes agreement to the updated terms.`}];function f(){let t=e(e=>e.activeDialog),f=e(e=>e.closeDialog),{t:p}=n();return(0,u.jsx)(l,{open:t===`terms`,onOpenChange:e=>{e||f()},children:(0,u.jsxs)(o,{className:`flex max-h-[85vh] flex-col sm:max-w-[640px]`,children:[(0,u.jsxs)(i,{children:[(0,u.jsx)(s,{children:p(`terms.title`)}),(0,u.jsx)(c,{children:p(`terms.version`,{version:1})})]}),(0,u.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-auto rounded-md border bg-muted/40 p-4 text-sm`,children:[(0,u.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:p(`terms.englishOnly`)}),d.map(e=>(0,u.jsxs)(`section`,{className:`mb-4 last:mb-0`,children:[(0,u.jsx)(`h3`,{className:`mb-1 font-semibold`,children:e.title}),(0,u.jsx)(`p`,{className:`leading-relaxed text-muted-foreground`,children:e.body})]},e.title))]}),(0,u.jsx)(a,{children:(0,u.jsx)(r,{onClick:f,children:p(`settings.done`)})})]})})}export{f as TermsDialog};
@@ -1 +1 @@
1
- import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{l as r,u as i}from"./main-CvsCEaFQ.js";import{l as a,m as o,t as s}from"./button--s6nUzD8.js";import{a as c,i as l,n as u,r as d,t as f}from"./select-BUFSgZ7u.js";import{t as p}from"./connection-store-CAPTzFtT.js";import{a as m,i as h,n as g,o as _,t as v}from"./dialog-CJoWJzRo.js";import{n as y}from"./user-store-l9ZslFwK.js";var b=n(e(),1),x=a();function S(){let{t:e}=o(),{activeDialog:n,closeDialog:a,setFooterMessage:S}=t(),C=p(e=>e.activeConnectionId)??``,w=y(e=>e.addUser),[T,E]=(0,b.useState)(``),[D,O]=(0,b.useState)(`%`),[k,A]=(0,b.useState)(``),[j,M]=(0,b.useState)(``),[N,P]=(0,b.useState)(`caching_sha2_password`),F=n===`user-add`;function I(e){e||(L(),a())}function L(){E(``),O(`%`),A(``),M(``),P(`caching_sha2_password`)}function R(){if(!T.trim()){S(e(`user.add.usernameRequired`));return}if(k!==j){S(e(`user.add.passwordMismatch`));return}w(C,{user:T.trim(),host:D.trim()||`%`,privileges:[],maxQuestions:0,maxUpdates:0,maxConnections:0,maxUserConnections:0,plugin:N,authenticationString:``,passwordExpired:!1,accountLocked:!1}),S(e(`user.add.added`,{user:T,host:D})),L(),a()}return(0,x.jsx)(v,{open:F,onOpenChange:I,children:(0,x.jsxs)(g,{className:`sm:max-w-[450px]`,children:[(0,x.jsx)(m,{children:(0,x.jsx)(_,{children:e(`user.add.title`)})}),(0,x.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-username`,children:e(`user.add.username`)}),(0,x.jsx)(i,{id:`user-add-username`,value:T,onChange:e=>E(e.target.value),placeholder:e(`user.add.usernamePlaceholder`)})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-host`,children:e(`user.add.host`)}),(0,x.jsx)(i,{id:`user-add-host`,value:D,onChange:e=>O(e.target.value),placeholder:`%`})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-password`,children:e(`user.add.password`)}),(0,x.jsx)(i,{id:`user-add-password`,type:`password`,value:k,onChange:e=>A(e.target.value),placeholder:e(`user.add.passwordPlaceholder`)})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-confirm-password`,children:e(`user.add.confirmPassword`)}),(0,x.jsx)(i,{id:`user-add-confirm-password`,type:`password`,value:j,onChange:e=>M(e.target.value),placeholder:e(`user.add.confirmPasswordPlaceholder`)})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{children:e(`user.add.plugin`)}),(0,x.jsxs)(f,{value:N,onValueChange:P,children:[(0,x.jsx)(l,{className:`w-full`,children:(0,x.jsx)(c,{})}),(0,x.jsxs)(u,{children:[(0,x.jsx)(d,{value:`mysql_native_password`,children:`mysql_native_password`}),(0,x.jsx)(d,{value:`caching_sha2_password`,children:`caching_sha2_password`})]})]})]})]}),(0,x.jsxs)(h,{children:[(0,x.jsx)(s,{variant:`outline`,onClick:()=>I(!1),children:e(`user.add.cancel`)}),(0,x.jsx)(s,{onClick:R,children:e(`user.add.add`)})]})]})})}export{S as UserAddDialog};
1
+ import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{l as r,u as i}from"./main-ot9WNZX1.js";import{l as a,m as o,t as s}from"./button--s6nUzD8.js";import{a as c,i as l,n as u,r as d,t as f}from"./select-DlF-eYgr.js";import{t as p}from"./connection-store-DjSajhjh.js";import{a as m,i as h,n as g,o as _,t as v}from"./dialog-CJoWJzRo.js";import{n as y}from"./user-store-l9ZslFwK.js";var b=n(e(),1),x=a();function S(){let{t:e}=o(),{activeDialog:n,closeDialog:a,setFooterMessage:S}=t(),C=p(e=>e.activeConnectionId)??``,w=y(e=>e.addUser),[T,E]=(0,b.useState)(``),[D,O]=(0,b.useState)(`%`),[k,A]=(0,b.useState)(``),[j,M]=(0,b.useState)(``),[N,P]=(0,b.useState)(`caching_sha2_password`),F=n===`user-add`;function I(e){e||(L(),a())}function L(){E(``),O(`%`),A(``),M(``),P(`caching_sha2_password`)}function R(){if(!T.trim()){S(e(`user.add.usernameRequired`));return}if(k!==j){S(e(`user.add.passwordMismatch`));return}w(C,{user:T.trim(),host:D.trim()||`%`,privileges:[],maxQuestions:0,maxUpdates:0,maxConnections:0,maxUserConnections:0,plugin:N,authenticationString:``,passwordExpired:!1,accountLocked:!1}),S(e(`user.add.added`,{user:T,host:D})),L(),a()}return(0,x.jsx)(v,{open:F,onOpenChange:I,children:(0,x.jsxs)(g,{className:`sm:max-w-[450px]`,children:[(0,x.jsx)(m,{children:(0,x.jsx)(_,{children:e(`user.add.title`)})}),(0,x.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-username`,children:e(`user.add.username`)}),(0,x.jsx)(i,{id:`user-add-username`,value:T,onChange:e=>E(e.target.value),placeholder:e(`user.add.usernamePlaceholder`)})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-host`,children:e(`user.add.host`)}),(0,x.jsx)(i,{id:`user-add-host`,value:D,onChange:e=>O(e.target.value),placeholder:`%`})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-password`,children:e(`user.add.password`)}),(0,x.jsx)(i,{id:`user-add-password`,type:`password`,value:k,onChange:e=>A(e.target.value),placeholder:e(`user.add.passwordPlaceholder`)})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{htmlFor:`user-add-confirm-password`,children:e(`user.add.confirmPassword`)}),(0,x.jsx)(i,{id:`user-add-confirm-password`,type:`password`,value:j,onChange:e=>M(e.target.value),placeholder:e(`user.add.confirmPasswordPlaceholder`)})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(r,{children:e(`user.add.plugin`)}),(0,x.jsxs)(f,{value:N,onValueChange:P,children:[(0,x.jsx)(l,{className:`w-full`,children:(0,x.jsx)(c,{})}),(0,x.jsxs)(u,{children:[(0,x.jsx)(d,{value:`mysql_native_password`,children:`mysql_native_password`}),(0,x.jsx)(d,{value:`caching_sha2_password`,children:`caching_sha2_password`})]})]})]})]}),(0,x.jsxs)(h,{children:[(0,x.jsx)(s,{variant:`outline`,onClick:()=>I(!1),children:e(`user.add.cancel`)}),(0,x.jsx)(s,{onClick:R,children:e(`user.add.add`)})]})]})})}export{S as UserAddDialog};
@@ -1 +1 @@
1
- import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{Q as r,X as i,j as a,l as o,mt as s,ut as c}from"./main-CvsCEaFQ.js";import{a as l,l as u,m as d,o as f,t as p}from"./button--s6nUzD8.js";import{t as m}from"./connection-store-CAPTzFtT.js";import{a as h,i as g,n as _,o as v,t as y}from"./dialog-CJoWJzRo.js";import{n as b,t as x}from"./user-store-l9ZslFwK.js";var S=l(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),C=l(`user-plus`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}],[`line`,{x1:`19`,x2:`19`,y1:`8`,y2:`14`,key:`1bvyxn`}],[`line`,{x1:`22`,x2:`16`,y1:`11`,y2:`11`,key:`1shjgl`}]]),w=n(e(),1),T=u();function E({databases:e,tables:t,onSelectScope:n}){let{t:i}=d(),[o,l]=(0,w.useState)(new Set),[u,p]=(0,w.useState)(`global`),m=(0,w.useCallback)(e=>{l(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),h=[{id:`global`,text:i(`user.grantTree.globalPrivileges`),type:`global`,children:e.map(e=>({id:`db:${e}`,text:e,type:`database`,database:e,children:(t[e]??[]).map(t=>({id:`tbl:${e}.${t}`,text:t,type:`table`,database:e,table:t}))}))}];function g(e){p(e.id),n({level:e.type,database:e.database,table:e.table})}function _(e,t){let n=e.children&&e.children.length>0,i=o.has(e.id),a=u===e.id,l=S;return e.type===`database`&&(l=c),e.type===`table`&&(l=r),(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:f(`flex items-center gap-1 px-2 py-0.5 cursor-pointer text-sm hover:bg-accent rounded-sm`,a&&`bg-accent text-accent-foreground`),style:{paddingLeft:`${t*16+4}px`},onClick:()=>{g(e),n&&m(e.id)},children:[n?(0,T.jsx)(s,{className:f(`h-3 w-3 transition-transform shrink-0`,i&&`rotate-90`)}):(0,T.jsx)(`span`,{className:`w-3 shrink-0`}),(0,T.jsx)(l,{className:`h-4 w-4 text-muted-foreground shrink-0`}),(0,T.jsx)(`span`,{className:`truncate`,children:e.text})]}),i&&e.children?.map(e=>_(e,t+1))]},e.id)}return(0,T.jsx)(a,{className:`h-full`,children:(0,T.jsx)(`div`,{className:`py-1`,children:h.map(e=>_(e,0))})})}var D={Data:[`SELECT`,`INSERT`,`UPDATE`,`DELETE`],Structure:[`CREATE`,`ALTER`,`DROP`,`INDEX`,`REFERENCES`],Administration:[`GRANT OPTION`,`SUPER`,`PROCESS`,`RELOAD`,`SHUTDOWN`,`SHOW DATABASES`,`LOCK TABLES`,`EXECUTE`,`REPLICATION SLAVE`,`REPLICATION CLIENT`,`CREATE VIEW`,`SHOW VIEW`,`CREATE ROUTINE`,`ALTER ROUTINE`,`CREATE USER`,`EVENT`,`TRIGGER`,`CREATE TABLESPACE`]},O={Data:[`SELECT`,`INSERT`,`UPDATE`,`DELETE`],Structure:[`CREATE`,`ALTER`,`DROP`,`INDEX`,`REFERENCES`],Administration:[`GRANT OPTION`,`LOCK TABLES`,`EXECUTE`,`CREATE VIEW`,`SHOW VIEW`,`CREATE ROUTINE`,`ALTER ROUTINE`,`EVENT`,`TRIGGER`]},k={Data:[`SELECT`,`INSERT`,`UPDATE`,`DELETE`],Structure:[`CREATE`,`ALTER`,`DROP`,`INDEX`,`REFERENCES`],Administration:[`GRANT OPTION`,`TRIGGER`]},A={global:`user.privileges.globalTitle`,database:`user.privileges.databaseTitle`,table:`user.privileges.tableTitle`},j={Data:`user.privileges.categoryData`,Structure:`user.privileges.categoryStructure`,Administration:`user.privileges.categoryAdministration`};function M({scope:e,privileges:t,onChange:n}){let{t:r}=d(),i=(0,w.useMemo)(()=>e===`global`?D:e===`database`?O:k,[e]),s=(0,w.useMemo)(()=>Object.values(i).flat(),[i]);function c(e){n({...t,[e]:!t[e]})}function l(){let e={...t};for(let t of s)e[t]=!0;n(e)}function u(){let e={...t};for(let t of s)e[t]=!1;n(e)}return(0,T.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 p-2 border-b`,children:[(0,T.jsx)(`span`,{className:`text-sm font-medium`,children:r(A[e])}),(0,T.jsxs)(`div`,{className:`ml-auto flex gap-1`,children:[(0,T.jsx)(p,{variant:`outline`,size:`sm`,onClick:l,children:r(`user.privileges.checkAll`)}),(0,T.jsx)(p,{variant:`outline`,size:`sm`,onClick:u,children:r(`user.privileges.uncheckAll`)})]})]}),(0,T.jsx)(a,{className:`flex-1`,children:(0,T.jsx)(`div`,{className:`p-3 space-y-4`,children:Object.entries(i).map(([e,n])=>(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h4`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2`,children:j[e]?r(j[e]):e}),(0,T.jsx)(`div`,{className:`grid grid-cols-2 gap-1`,children:n.map(e=>(0,T.jsxs)(o,{className:`flex items-center gap-2 text-sm font-normal cursor-pointer py-1`,children:[(0,T.jsx)(`input`,{type:`checkbox`,checked:t[e]??!1,onChange:()=>c(e),className:`rounded border-input`}),e]},e))})]},e))})})]})}function N(){let{t:e}=d(),{activeDialog:n,closeDialog:r,openDialog:o,setFooterMessage:s}=t(),c=m(e=>e.activeConnectionId)??``,l=b(e=>e.users[c]??x),u=b(e=>e.selectedUser[c]??null),S=b(e=>e.setSelectedUser),D=b(e=>e.removeUser),O=e=>S(c,e),k=(e,t)=>D(c,e,t),[A,j]=(0,w.useState)({level:`global`}),[N,P]=(0,w.useState)({}),[F]=(0,w.useState)([]),[I]=(0,w.useState)({}),L=n===`user-manager`;function R(e){e||(r(),O(null),j({level:`global`}),P({}))}let z=(0,w.useCallback)(e=>{j(e),P({})},[]);function B(){o(`user-add`)}function V(){u&&(k(u.host,u.user),s(e(`user.manager.removed`,{user:u.user,host:u.host})))}function H(){if(!u){s(e(`user.manager.selectUserFirst`));return}s(e(`user.manager.applied`))}return(0,T.jsx)(y,{open:L,onOpenChange:R,children:(0,T.jsxs)(_,{className:`sm:max-w-[80vw] max-h-[70vh] flex flex-col`,children:[(0,T.jsx)(h,{children:(0,T.jsx)(v,{children:e(`user.manager.title`)})}),(0,T.jsxs)(`div`,{className:`flex flex-1 gap-0 overflow-hidden min-h-0 border rounded-md`,children:[(0,T.jsxs)(`div`,{className:`w-[200px] shrink-0 border-r flex flex-col`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-1 p-2 border-b`,children:[(0,T.jsx)(p,{variant:`ghost`,size:`sm`,onClick:B,title:e(`user.manager.addUser`),children:(0,T.jsx)(C,{className:`h-4 w-4`})}),(0,T.jsx)(p,{variant:`ghost`,size:`sm`,onClick:V,disabled:!u,title:e(`user.manager.removeUser`),children:(0,T.jsx)(i,{className:`h-4 w-4`})})]}),(0,T.jsx)(a,{className:`flex-1`,children:(0,T.jsx)(`div`,{className:`py-1`,children:l.length===0?(0,T.jsx)(`div`,{className:`px-3 py-4 text-sm text-muted-foreground text-center`,children:e(`user.manager.noUsers`)}):l.map(e=>{let t=u?.user===e.user&&u?.host===e.host;return(0,T.jsx)(`div`,{className:f(`flex items-center gap-2 px-3 py-1.5 cursor-pointer text-sm hover:bg-accent`,t&&`bg-accent text-accent-foreground`),onClick:()=>O(e),children:(0,T.jsxs)(`span`,{className:`truncate`,children:[e.user,`@`,e.host]})},`${e.user}@${e.host}`)})})})]}),(0,T.jsxs)(`div`,{className:`w-[250px] shrink-0 border-r`,children:[(0,T.jsx)(`div`,{className:`p-2 border-b text-sm font-medium`,children:e(`user.manager.grantScope`)}),(0,T.jsx)(E,{connectionId:``,databases:F,tables:I,onSelectScope:z})]}),(0,T.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,T.jsx)(M,{scope:A.level,privileges:N,onChange:P})})]}),(0,T.jsxs)(g,{children:[(0,T.jsx)(p,{onClick:H,children:e(`user.manager.apply`)}),(0,T.jsx)(p,{variant:`outline`,onClick:()=>R(!1),children:e(`user.manager.close`)})]})]})})}export{N as UserManagerDialog};
1
+ import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{Q as r,X as i,j as a,l as o,mt as s,ut as c}from"./main-ot9WNZX1.js";import{a as l,l as u,m as d,o as f,t as p}from"./button--s6nUzD8.js";import{t as m}from"./connection-store-DjSajhjh.js";import{a as h,i as g,n as _,o as v,t as y}from"./dialog-CJoWJzRo.js";import{n as b,t as x}from"./user-store-l9ZslFwK.js";var S=l(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),C=l(`user-plus`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}],[`line`,{x1:`19`,x2:`19`,y1:`8`,y2:`14`,key:`1bvyxn`}],[`line`,{x1:`22`,x2:`16`,y1:`11`,y2:`11`,key:`1shjgl`}]]),w=n(e(),1),T=u();function E({databases:e,tables:t,onSelectScope:n}){let{t:i}=d(),[o,l]=(0,w.useState)(new Set),[u,p]=(0,w.useState)(`global`),m=(0,w.useCallback)(e=>{l(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),h=[{id:`global`,text:i(`user.grantTree.globalPrivileges`),type:`global`,children:e.map(e=>({id:`db:${e}`,text:e,type:`database`,database:e,children:(t[e]??[]).map(t=>({id:`tbl:${e}.${t}`,text:t,type:`table`,database:e,table:t}))}))}];function g(e){p(e.id),n({level:e.type,database:e.database,table:e.table})}function _(e,t){let n=e.children&&e.children.length>0,i=o.has(e.id),a=u===e.id,l=S;return e.type===`database`&&(l=c),e.type===`table`&&(l=r),(0,T.jsxs)(`div`,{children:[(0,T.jsxs)(`div`,{className:f(`flex items-center gap-1 px-2 py-0.5 cursor-pointer text-sm hover:bg-accent rounded-sm`,a&&`bg-accent text-accent-foreground`),style:{paddingLeft:`${t*16+4}px`},onClick:()=>{g(e),n&&m(e.id)},children:[n?(0,T.jsx)(s,{className:f(`h-3 w-3 transition-transform shrink-0`,i&&`rotate-90`)}):(0,T.jsx)(`span`,{className:`w-3 shrink-0`}),(0,T.jsx)(l,{className:`h-4 w-4 text-muted-foreground shrink-0`}),(0,T.jsx)(`span`,{className:`truncate`,children:e.text})]}),i&&e.children?.map(e=>_(e,t+1))]},e.id)}return(0,T.jsx)(a,{className:`h-full`,children:(0,T.jsx)(`div`,{className:`py-1`,children:h.map(e=>_(e,0))})})}var D={Data:[`SELECT`,`INSERT`,`UPDATE`,`DELETE`],Structure:[`CREATE`,`ALTER`,`DROP`,`INDEX`,`REFERENCES`],Administration:[`GRANT OPTION`,`SUPER`,`PROCESS`,`RELOAD`,`SHUTDOWN`,`SHOW DATABASES`,`LOCK TABLES`,`EXECUTE`,`REPLICATION SLAVE`,`REPLICATION CLIENT`,`CREATE VIEW`,`SHOW VIEW`,`CREATE ROUTINE`,`ALTER ROUTINE`,`CREATE USER`,`EVENT`,`TRIGGER`,`CREATE TABLESPACE`]},O={Data:[`SELECT`,`INSERT`,`UPDATE`,`DELETE`],Structure:[`CREATE`,`ALTER`,`DROP`,`INDEX`,`REFERENCES`],Administration:[`GRANT OPTION`,`LOCK TABLES`,`EXECUTE`,`CREATE VIEW`,`SHOW VIEW`,`CREATE ROUTINE`,`ALTER ROUTINE`,`EVENT`,`TRIGGER`]},k={Data:[`SELECT`,`INSERT`,`UPDATE`,`DELETE`],Structure:[`CREATE`,`ALTER`,`DROP`,`INDEX`,`REFERENCES`],Administration:[`GRANT OPTION`,`TRIGGER`]},A={global:`user.privileges.globalTitle`,database:`user.privileges.databaseTitle`,table:`user.privileges.tableTitle`},j={Data:`user.privileges.categoryData`,Structure:`user.privileges.categoryStructure`,Administration:`user.privileges.categoryAdministration`};function M({scope:e,privileges:t,onChange:n}){let{t:r}=d(),i=(0,w.useMemo)(()=>e===`global`?D:e===`database`?O:k,[e]),s=(0,w.useMemo)(()=>Object.values(i).flat(),[i]);function c(e){n({...t,[e]:!t[e]})}function l(){let e={...t};for(let t of s)e[t]=!0;n(e)}function u(){let e={...t};for(let t of s)e[t]=!1;n(e)}return(0,T.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 p-2 border-b`,children:[(0,T.jsx)(`span`,{className:`text-sm font-medium`,children:r(A[e])}),(0,T.jsxs)(`div`,{className:`ml-auto flex gap-1`,children:[(0,T.jsx)(p,{variant:`outline`,size:`sm`,onClick:l,children:r(`user.privileges.checkAll`)}),(0,T.jsx)(p,{variant:`outline`,size:`sm`,onClick:u,children:r(`user.privileges.uncheckAll`)})]})]}),(0,T.jsx)(a,{className:`flex-1`,children:(0,T.jsx)(`div`,{className:`p-3 space-y-4`,children:Object.entries(i).map(([e,n])=>(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h4`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2`,children:j[e]?r(j[e]):e}),(0,T.jsx)(`div`,{className:`grid grid-cols-2 gap-1`,children:n.map(e=>(0,T.jsxs)(o,{className:`flex items-center gap-2 text-sm font-normal cursor-pointer py-1`,children:[(0,T.jsx)(`input`,{type:`checkbox`,checked:t[e]??!1,onChange:()=>c(e),className:`rounded border-input`}),e]},e))})]},e))})})]})}function N(){let{t:e}=d(),{activeDialog:n,closeDialog:r,openDialog:o,setFooterMessage:s}=t(),c=m(e=>e.activeConnectionId)??``,l=b(e=>e.users[c]??x),u=b(e=>e.selectedUser[c]??null),S=b(e=>e.setSelectedUser),D=b(e=>e.removeUser),O=e=>S(c,e),k=(e,t)=>D(c,e,t),[A,j]=(0,w.useState)({level:`global`}),[N,P]=(0,w.useState)({}),[F]=(0,w.useState)([]),[I]=(0,w.useState)({}),L=n===`user-manager`;function R(e){e||(r(),O(null),j({level:`global`}),P({}))}let z=(0,w.useCallback)(e=>{j(e),P({})},[]);function B(){o(`user-add`)}function V(){u&&(k(u.host,u.user),s(e(`user.manager.removed`,{user:u.user,host:u.host})))}function H(){if(!u){s(e(`user.manager.selectUserFirst`));return}s(e(`user.manager.applied`))}return(0,T.jsx)(y,{open:L,onOpenChange:R,children:(0,T.jsxs)(_,{className:`sm:max-w-[80vw] max-h-[70vh] flex flex-col`,children:[(0,T.jsx)(h,{children:(0,T.jsx)(v,{children:e(`user.manager.title`)})}),(0,T.jsxs)(`div`,{className:`flex flex-1 gap-0 overflow-hidden min-h-0 border rounded-md`,children:[(0,T.jsxs)(`div`,{className:`w-[200px] shrink-0 border-r flex flex-col`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-1 p-2 border-b`,children:[(0,T.jsx)(p,{variant:`ghost`,size:`sm`,onClick:B,title:e(`user.manager.addUser`),children:(0,T.jsx)(C,{className:`h-4 w-4`})}),(0,T.jsx)(p,{variant:`ghost`,size:`sm`,onClick:V,disabled:!u,title:e(`user.manager.removeUser`),children:(0,T.jsx)(i,{className:`h-4 w-4`})})]}),(0,T.jsx)(a,{className:`flex-1`,children:(0,T.jsx)(`div`,{className:`py-1`,children:l.length===0?(0,T.jsx)(`div`,{className:`px-3 py-4 text-sm text-muted-foreground text-center`,children:e(`user.manager.noUsers`)}):l.map(e=>{let t=u?.user===e.user&&u?.host===e.host;return(0,T.jsx)(`div`,{className:f(`flex items-center gap-2 px-3 py-1.5 cursor-pointer text-sm hover:bg-accent`,t&&`bg-accent text-accent-foreground`),onClick:()=>O(e),children:(0,T.jsxs)(`span`,{className:`truncate`,children:[e.user,`@`,e.host]})},`${e.user}@${e.host}`)})})})]}),(0,T.jsxs)(`div`,{className:`w-[250px] shrink-0 border-r`,children:[(0,T.jsx)(`div`,{className:`p-2 border-b text-sm font-medium`,children:e(`user.manager.grantScope`)}),(0,T.jsx)(E,{connectionId:``,databases:F,tables:I,onSelectScope:z})]}),(0,T.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,T.jsx)(M,{scope:A.level,privileges:N,onChange:P})})]}),(0,T.jsxs)(g,{children:[(0,T.jsx)(p,{onClick:H,children:e(`user.manager.apply`)}),(0,T.jsx)(p,{variant:`outline`,onClick:()=>R(!1),children:e(`user.manager.close`)})]})]})})}export{N as UserManagerDialog};
@@ -1 +1 @@
1
- import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{C as r,S as i,b as a,j as o,u as s,w as c,x as l,y as u}from"./main-CvsCEaFQ.js";import{l as d,m as f,t as p}from"./button--s6nUzD8.js";import{a as m}from"./i18n-C-w8Q5E_.js";import{t as h}from"./connection-store-CAPTzFtT.js";import{o as g}from"./database-4FcrMRGA.js";import{t as _}from"./engine-DWYEiSZM.js";import{a as v,i as y,n as b,o as x,t as S}from"./dialog-CJoWJzRo.js";var C=n(e(),1),w=d();function T(){let e=h.getState();return e.activeConnections.find(t=>t.id===e.activeConnectionId)?.serverConnectionId??null}async function E(e){let t=T();if(!t)throw Error(m.t(`command.noActiveConnection`));let n=_().getQuery(e===`global`?`SHOW_GLOBAL_VARIABLES`:`SHOW_SESSION_VARIABLES`);return(await g(t,n)).records.map(e=>({Variable_name:e[0],Value:e[1]}))}function D(){let{t:e}=f(),{activeDialog:n,closeDialog:d,setFooterMessage:m}=t(),[h,g]=(0,C.useState)([]),[_,T]=(0,C.useState)(``),[D,O]=(0,C.useState)(`session`),k=n===`variables`,A=(0,C.useCallback)(t=>E(t).then(g).catch(t=>m(e(`command.variables.loadError`,{message:t instanceof Error?t.message:String(t)}))),[m,e]);(0,C.useEffect)(()=>{k&&A(D)},[k,D,A]);let j=(0,C.useMemo)(()=>{if(!_.trim())return h;let e=_.toLowerCase();return h.filter(t=>t.Variable_name.toLowerCase().includes(e)||t.Value.toLowerCase().includes(e))},[h,_]);function M(e){e||(T(``),d())}function N(e){O(e)}return(0,w.jsx)(S,{open:k,onOpenChange:M,children:(0,w.jsxs)(b,{className:`sm:max-w-[900px] max-h-[80vh] flex flex-col`,children:[(0,w.jsx)(v,{children:(0,w.jsx)(x,{children:e(`command.variables.title`)})}),(0,w.jsxs)(`div`,{className:`flex items-center gap-3 pb-2`,children:[(0,w.jsxs)(`div`,{className:`flex gap-1`,children:[(0,w.jsx)(p,{variant:D===`session`?`default`:`outline`,size:`sm`,onClick:()=>N(`session`),children:e(`command.scope.session`)}),(0,w.jsx)(p,{variant:D===`global`?`default`:`outline`,size:`sm`,onClick:()=>N(`global`),children:e(`command.scope.global`)})]}),(0,w.jsx)(s,{placeholder:e(`command.variables.filterPlaceholder`),value:_,onChange:e=>T(e.target.value),className:`max-w-xs`})]}),(0,w.jsx)(`div`,{className:`flex-1 border rounded-md overflow-hidden min-h-0`,children:(0,w.jsx)(o,{className:`h-[400px]`,children:(0,w.jsxs)(u,{children:[(0,w.jsx)(r,{children:(0,w.jsxs)(c,{children:[(0,w.jsx)(i,{className:`w-[300px]`,children:e(`command.variableName`)}),(0,w.jsx)(i,{children:e(`command.value`)})]})}),(0,w.jsx)(a,{children:j.length===0?(0,w.jsx)(c,{children:(0,w.jsx)(l,{colSpan:2,className:`text-center text-muted-foreground`,children:e(`command.variables.empty`)})}):j.map(e=>(0,w.jsxs)(c,{children:[(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Variable_name}),(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Value})]},e.Variable_name))})]})})}),(0,w.jsx)(y,{children:(0,w.jsx)(p,{variant:`outline`,onClick:()=>M(!1),children:e(`command.close`)})})]})})}export{D as VariablesDialog};
1
+ import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{C as r,S as i,b as a,j as o,u as s,w as c,x as l,y as u}from"./main-ot9WNZX1.js";import{l as d,m as f,t as p}from"./button--s6nUzD8.js";import{a as m}from"./i18n-gQOmt8le.js";import{t as h}from"./connection-store-DjSajhjh.js";import{o as g}from"./database-Dvj2X-0B.js";import{t as _}from"./engine-CzHq4UCB.js";import{a as v,i as y,n as b,o as x,t as S}from"./dialog-CJoWJzRo.js";var C=n(e(),1),w=d();function T(){let e=h.getState();return e.activeConnections.find(t=>t.id===e.activeConnectionId)?.serverConnectionId??null}async function E(e){let t=T();if(!t)throw Error(m.t(`command.noActiveConnection`));let n=_().getQuery(e===`global`?`SHOW_GLOBAL_VARIABLES`:`SHOW_SESSION_VARIABLES`);return(await g(t,n)).records.map(e=>({Variable_name:e[0],Value:e[1]}))}function D(){let{t:e}=f(),{activeDialog:n,closeDialog:d,setFooterMessage:m}=t(),[h,g]=(0,C.useState)([]),[_,T]=(0,C.useState)(``),[D,O]=(0,C.useState)(`session`),k=n===`variables`,A=(0,C.useCallback)(t=>E(t).then(g).catch(t=>m(e(`command.variables.loadError`,{message:t instanceof Error?t.message:String(t)}))),[m,e]);(0,C.useEffect)(()=>{k&&A(D)},[k,D,A]);let j=(0,C.useMemo)(()=>{if(!_.trim())return h;let e=_.toLowerCase();return h.filter(t=>t.Variable_name.toLowerCase().includes(e)||t.Value.toLowerCase().includes(e))},[h,_]);function M(e){e||(T(``),d())}function N(e){O(e)}return(0,w.jsx)(S,{open:k,onOpenChange:M,children:(0,w.jsxs)(b,{className:`sm:max-w-[900px] max-h-[80vh] flex flex-col`,children:[(0,w.jsx)(v,{children:(0,w.jsx)(x,{children:e(`command.variables.title`)})}),(0,w.jsxs)(`div`,{className:`flex items-center gap-3 pb-2`,children:[(0,w.jsxs)(`div`,{className:`flex gap-1`,children:[(0,w.jsx)(p,{variant:D===`session`?`default`:`outline`,size:`sm`,onClick:()=>N(`session`),children:e(`command.scope.session`)}),(0,w.jsx)(p,{variant:D===`global`?`default`:`outline`,size:`sm`,onClick:()=>N(`global`),children:e(`command.scope.global`)})]}),(0,w.jsx)(s,{placeholder:e(`command.variables.filterPlaceholder`),value:_,onChange:e=>T(e.target.value),className:`max-w-xs`})]}),(0,w.jsx)(`div`,{className:`flex-1 border rounded-md overflow-hidden min-h-0`,children:(0,w.jsx)(o,{className:`h-[400px]`,children:(0,w.jsxs)(u,{children:[(0,w.jsx)(r,{children:(0,w.jsxs)(c,{children:[(0,w.jsx)(i,{className:`w-[300px]`,children:e(`command.variableName`)}),(0,w.jsx)(i,{children:e(`command.value`)})]})}),(0,w.jsx)(a,{children:j.length===0?(0,w.jsx)(c,{children:(0,w.jsx)(l,{colSpan:2,className:`text-center text-muted-foreground`,children:e(`command.variables.empty`)})}):j.map(e=>(0,w.jsxs)(c,{children:[(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Variable_name}),(0,w.jsx)(l,{className:`font-mono text-xs`,children:e.Value})]},e.Variable_name))})]})})}),(0,w.jsx)(y,{children:(0,w.jsx)(p,{variant:`outline`,onClick:()=>M(!1),children:e(`command.close`)})})]})})}export{D as VariablesDialog};
@@ -0,0 +1 @@
1
+ function e(e,t){let n;try{n=e()}catch{return}return{getItem:e=>{let r=e=>e===null?null:JSON.parse(e,t?.reviver),i=n.getItem(e)??null;return i instanceof Promise?i.then(r):r(i)},setItem:(e,r)=>n.setItem(e,JSON.stringify(r,t?.replacer)),removeItem:e=>n.removeItem(e)}}var t=e=>n=>{try{let r=e(n);return r instanceof Promise?r:{then(e){return t(e)(r)},catch(e){return this}}}catch(e){return{then(e){return this},catch(n){return t(n)(e)}}}},n=(n,r)=>(i,a,o)=>{let s={storage:e(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...r},c=!1,l=0,u=new Set,d=new Set,f=s.storage;if(!f)return n((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),i(...e)},a,o);let p=()=>{let e=s.partialize({...a()});return f.setItem(s.name,{state:e,version:s.version})},m=o.setState;o.setState=(e,t)=>(m(e,t),p());let h=n((...e)=>(i(...e),p()),a,o);o.getInitialState=()=>h;let g,_=()=>{if(!f)return;let e=++l;c=!1,u.forEach(e=>e(a()??h));let n=s.onRehydrateStorage?.call(s,a()??h)||void 0;return t(f.getItem.bind(f))(s.name).then(e=>{if(e){if(typeof e.version==`number`&&e.version!==s.version){if(s.migrate){let t=s.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`)}else return[!1,e.state]}return[!1,void 0]}).then(t=>{if(e!==l)return;let[n,r]=t;if(g=s.merge(r,a()??h),i(g,!0),n)return p()}).then(()=>{e===l&&(n?.(a(),void 0),g=a(),c=!0,d.forEach(e=>e(g)))}).catch(t=>{e===l&&n?.(void 0,t)})};return o.persist={setOptions:e=>{s={...s,...e},e.storage&&(f=e.storage)},clearStorage:()=>{++l,f?.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>_(),hasHydrated:()=>c,onHydrate:e=>(u.add(e),()=>{u.delete(e)}),onFinishHydration:e=>(d.add(e),()=>{d.delete(e)})},s.skipHydration||_(),g||h},r=[`planche-connections`,`planche-query`,`planche-schema`,`planche-settings`,`planche-theme`,`planche-erd`,`planche-layout`],i=5e3,a=class{worker=null;nextId=1;pending=new Map;ready;constructor(){this.ready=this.start()}start(){return typeof Worker>`u`||typeof navigator>`u`||!(`storage`in navigator)?Promise.resolve(!1):new Promise(e=>{let t;try{t=new Worker(new URL(`/assets/storage-worker-DEIYmjYK.js`,``+import.meta.url),{type:`module`})}catch(t){console.warn(`[app-storage] worker unavailable, using localStorage:`,t),e(!1);return}let n,r=r=>{clearTimeout(n),console.warn(`[app-storage] OPFS storage unavailable, using localStorage: ${r}`),t.terminate(),e(!1)};n=setTimeout(()=>r(`no reply in ${i} ms`),i),t.onerror=e=>r(e.message),t.onmessage=i=>{let a=i.data;if(`type`in a){a.type===`ready`?(clearTimeout(n),this.worker=t,t.onmessage=e=>this.handle(e.data),t.onerror=e=>console.error(`[app-storage]`,e.message),e(!0)):r(a.error);return}this.handle(a)}})}handle(e){if(`type`in e)return;let t=this.pending.get(e.id);t&&(this.pending.delete(e.id),e.ok?t.resolve({value:e.value,bytes:e.bytes}):t.reject(Error(e.error)))}send(e,t=[]){let n=this.worker;return n?new Promise((r,i)=>{this.pending.set(e.id,{resolve:r,reject:i}),n.postMessage(e,t)}):Promise.reject(Error(`storage worker not ready`))}get(e){return this.send({id:this.nextId++,op:`get`,name:e}).then(e=>e.value??null)}set(e,t){return this.send({id:this.nextId++,op:`set`,name:e,value:t}).then(()=>void 0)}remove(e){return this.send({id:this.nextId++,op:`remove`,name:e}).then(()=>void 0)}blobGet(e){return this.send({id:this.nextId++,op:`blob-get`,name:e}).then(e=>e.bytes??null)}blobSet(e,t){return this.send({id:this.nextId++,op:`blob-set`,name:e,bytes:t},[t]).then(()=>void 0)}blobRemove(e){return this.send({id:this.nextId++,op:`blob-remove`,name:e}).then(()=>void 0)}},o={getItem:e=>{try{return localStorage.getItem(e)}catch{return null}},setItem:(e,t)=>{try{localStorage.setItem(e,t)}catch(n){console.warn(`[app-storage] could not persist "${e}" (${Math.round(t.length/1024)} KB): ${n instanceof Error?n.message:String(n)}`)}},removeItem:e=>{try{localStorage.removeItem(e)}catch{}}},s=new a,c=s.ready.then(async e=>{if(!e)return!1;for(let e of r){let t=await o.getItem(e);if(t!=null)try{await s.get(e)===null&&await s.set(e,t),o.removeItem(e)}catch(t){console.warn(`[app-storage] could not migrate "${e}":`,t)}}return!0}),l={getItem:async e=>await c?s.get(e):o.getItem(e),setItem:async(e,t)=>{if(await c)try{await s.set(e,t);return}catch(t){console.error(`[app-storage] write failed for "${e}":`,t)}o.setItem(e,t)},removeItem:async e=>await c?s.remove(e):o.removeItem(e)};c.then(e=>e?`sqlite-opfs`:`localStorage`);var u={available:()=>c,get:async e=>await c?s.blobGet(e):null,set:async(e,t)=>await c?(await s.blobSet(e,t),!0):!1,remove:async e=>{await c&&await s.blobRemove(e)}},d=()=>e(()=>l);export{n as i,u as n,l as r,d as t};
@@ -1 +1 @@
1
- import{c as e,h as t,i as n,l as r,r as i,s as a,v as o}from"./ui-store-DfspmPOn.js";import{i as s,t as c}from"./app-storage-B6v72zLH.js";var l=()=>new Date().toISOString().slice(0,7);function u(e,t){let n=e?.month===t;return{total:(e?.total??0)+1,month:t,monthTotal:n?e.monthTotal+1:1}}var d=i()(s((e,t)=>({features:{},countFeatureUse:n=>{let r=u(t().features[n],l());return e(e=>({features:{...e.features,[n]:r}})),r}}),{name:`planche-usage`,storage:c()}));function f(t){let i=d.getState().countFeatureUse(t);e(`pro_feature_use`,{feature:t,uses:r(i.total),uses_this_month:r(i.monthTotal),first_use:i.total===1}),i.total===1&&a({pro_features:n(Object.keys(d.getState().features).length)})}var p=`planche-session-credentials`;function m(){try{let e=sessionStorage.getItem(p);return e?JSON.parse(e):{}}catch{return{}}}function h(e){try{sessionStorage.setItem(p,JSON.stringify(e))}catch{}}function g(e){return{pass:e.pass||void 0,sshPassword:e.ssh?.password||void 0,sshPassphrase:e.ssh?.passphrase||void 0,sshPrivateKey:e.ssh?.privateKey||void 0,authToken:e.authToken||void 0}}function _(e){let t={...e,pass:``,authToken:``};return e.ssh&&(t.ssh={...e.ssh,password:void 0,passphrase:void 0,privateKey:void 0}),t}function v(e,t){let n={...e,pass:e.pass||t.pass||``,authToken:e.authToken||t.authToken||``};return e.ssh&&(n.ssh={...e.ssh,password:e.ssh.password||t.sshPassword,passphrase:e.ssh.passphrase||t.sshPassphrase,privateKey:e.ssh.privateKey||t.sshPrivateKey}),n}function y(e,t){let n=m(),r=Object.fromEntries(Object.entries(t).filter(([,e])=>e));Object.keys(r).length?n[e]=r:delete n[e],h(n)}function b(e){let t=m()[e];if(t!==void 0)return typeof t==`string`?{pass:t}:t}function x(e){let t=m();delete t[e],h(t)}var S=o(t(),1);function C(e,t){let n=(0,S.useRef)(null),[r,i]=(0,S.useState)(null),a=(0,S.useCallback)(()=>{n.current=null,i(null)},[]),o=e=>{let t=e.currentTarget.getBoundingClientRect();return{before:e.clientX<t.left+t.width/2}};return{dragProps:(0,S.useCallback)(r=>({draggable:!0,onDragStart:e=>{n.current=r,e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,r)},onDragOver:t=>{if(!n.current||n.current===r)return;t.preventDefault(),t.dataTransfer.dropEffect=`move`;let{before:a}=o(t),s=e.indexOf(r),c=a?r:e[s+1]??`end`;i(e=>e===c?e:c)},onDrop:i=>{let s=n.current;if(!s||s===r)return a();i.preventDefault();let{before:c}=o(i),l=e.filter(e=>e!==s).indexOf(r);c||(l+=1),t(s,l),a()},onDragEnd:a}),[e,t,a]),dropIndicator:r,isDragging:()=>n.current!==null}}function w(e,t,n){let r=e.find(e=>e.id===t);if(!r)return e;let i=e.filter(e=>e.id!==t),a=Math.max(0,Math.min(n,i.length));return[...i.slice(0,a),r,...i.slice(a)]}function T(e){return e.savePassword===!1?_(e):e}function E(e){return _(e)}var D=i()(s((t,n)=>({savedConnections:[],activeConnections:[],activeConnectionId:null,transactionOpen:{},pendingReopen:{},fileDetached:{},addSavedConnection:e=>{e.savePassword===!1&&y(e.id,g(e)),t(t=>({savedConnections:[...t.savedConnections,e]}))},updateSavedConnection:(e,r)=>{let i={...n().savedConnections.find(t=>t.id===e),...r};i.savePassword===!1&&y(e,g(i)),t(t=>({savedConnections:t.savedConnections.map(t=>t.id===e?{...t,...r}:t)}))},deleteSavedConnection:e=>{x(e),t(t=>({savedConnections:t.savedConnections.filter(t=>t.id!==e)}))},openConnection:n=>t(t=>{let r=t.activeConnections.some(e=>e.id===n.id),i={...t.pendingReopen};return delete i[n.id],r?{activeConnections:t.activeConnections.map(e=>e.id===n.id?{...e,...n}:e),activeConnectionId:n.id,pendingReopen:i}:(e(`connection_open`,{dbms:n.dbms,transport:n.transport??`tunnel`,sample:!!n.sample,ssh:!!n.ssh?.enabled}),n.ssh?.enabled&&f(`ssh_tunnel`),{activeConnections:[...t.activeConnections,n],activeConnectionId:n.id,pendingReopen:i})}),closeConnection:e=>t(t=>{let n=t.activeConnections.filter(t=>t.id!==e),r=t.activeConnectionId===e?n.length>0?n[n.length-1].id:null:t.activeConnectionId,i={...t.transactionOpen},a={...t.pendingReopen},o={...t.fileDetached};return delete i[e],delete a[e],delete o[e],{activeConnections:n,activeConnectionId:r,transactionOpen:i,pendingReopen:a,fileDetached:o}}),reorderActiveConnection:(e,n)=>t(t=>({activeConnections:w(t.activeConnections,e,n)})),setActiveConnection:e=>t({activeConnectionId:e}),updateServerConnectionId:(e,n)=>t(t=>({activeConnections:t.activeConnections.map(t=>t.id===e?{...t,serverConnectionId:n}:t)})),updateProfile:(e,n)=>t(t=>({savedConnections:t.savedConnections.map(t=>t.id===e?{...t,...n}:t),activeConnections:t.activeConnections.map(t=>t.id===e?{...t,...n}:t)})),setTransactionOpen:(e,n)=>t(t=>({transactionOpen:{...t.transactionOpen,[e]:n}})),setPendingReopen:(e,n)=>t(t=>({pendingReopen:{...t.pendingReopen,[e]:n}})),setFileDetached:(e,n)=>t(t=>({fileDetached:{...t.fileDetached,[e]:n}})),resolveCredentials:e=>{let t=n().savedConnections.find(t=>t.id===e.id);return v(t?v(e,g(t)):e,b(e.id)??{})}}),{name:`planche-connections`,storage:c(),version:1,migrate:e=>{let t=e;return Array.isArray(t.savedConnections)&&(t.savedConnections=t.savedConnections.map(e=>({...e,savePassword:e.savePassword??!0}))),t},partialize:e=>({savedConnections:e.savedConnections.map(T),activeConnections:e.activeConnections.map(E),activeConnectionId:e.activeConnectionId})}));export{d as a,f as i,w as n,C as r,D as t};
1
+ import{c as e,h as t,i as n,l as r,r as i,s as a,v as o}from"./ui-store-DfspmPOn.js";import{i as s,t as c}from"./app-storage-C_1RLCyI.js";var l=()=>new Date().toISOString().slice(0,7);function u(e,t){let n=e?.month===t;return{total:(e?.total??0)+1,month:t,monthTotal:n?e.monthTotal+1:1}}var d=i()(s((e,t)=>({features:{},countFeatureUse:n=>{let r=u(t().features[n],l());return e(e=>({features:{...e.features,[n]:r}})),r}}),{name:`planche-usage`,storage:c()}));function f(t){let i=d.getState().countFeatureUse(t);e(`pro_feature_use`,{feature:t,uses:r(i.total),uses_this_month:r(i.monthTotal),first_use:i.total===1}),i.total===1&&a({pro_features:n(Object.keys(d.getState().features).length)})}var p=`planche-session-credentials`;function m(){try{let e=sessionStorage.getItem(p);return e?JSON.parse(e):{}}catch{return{}}}function h(e){try{sessionStorage.setItem(p,JSON.stringify(e))}catch{}}function g(e){return{pass:e.pass||void 0,sshPassword:e.ssh?.password||void 0,sshPassphrase:e.ssh?.passphrase||void 0,sshPrivateKey:e.ssh?.privateKey||void 0,authToken:e.authToken||void 0}}function _(e){let t={...e,pass:``,authToken:``};return e.ssh&&(t.ssh={...e.ssh,password:void 0,passphrase:void 0,privateKey:void 0}),t}function v(e,t){let n={...e,pass:e.pass||t.pass||``,authToken:e.authToken||t.authToken||``};return e.ssh&&(n.ssh={...e.ssh,password:e.ssh.password||t.sshPassword,passphrase:e.ssh.passphrase||t.sshPassphrase,privateKey:e.ssh.privateKey||t.sshPrivateKey}),n}function y(e,t){let n=m(),r=Object.fromEntries(Object.entries(t).filter(([,e])=>e));Object.keys(r).length?n[e]=r:delete n[e],h(n)}function b(e){let t=m()[e];if(t!==void 0)return typeof t==`string`?{pass:t}:t}function x(e){let t=m();delete t[e],h(t)}var S=o(t(),1);function C(e,t){let n=(0,S.useRef)(null),[r,i]=(0,S.useState)(null),a=(0,S.useCallback)(()=>{n.current=null,i(null)},[]),o=e=>{let t=e.currentTarget.getBoundingClientRect();return{before:e.clientX<t.left+t.width/2}};return{dragProps:(0,S.useCallback)(r=>({draggable:!0,onDragStart:e=>{n.current=r,e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,r)},onDragOver:t=>{if(!n.current||n.current===r)return;t.preventDefault(),t.dataTransfer.dropEffect=`move`;let{before:a}=o(t),s=e.indexOf(r),c=a?r:e[s+1]??`end`;i(e=>e===c?e:c)},onDrop:i=>{let s=n.current;if(!s||s===r)return a();i.preventDefault();let{before:c}=o(i),l=e.filter(e=>e!==s).indexOf(r);c||(l+=1),t(s,l),a()},onDragEnd:a}),[e,t,a]),dropIndicator:r,isDragging:()=>n.current!==null}}function w(e,t,n){let r=e.find(e=>e.id===t);if(!r)return e;let i=e.filter(e=>e.id!==t),a=Math.max(0,Math.min(n,i.length));return[...i.slice(0,a),r,...i.slice(a)]}function T(e){return e.savePassword===!1?_(e):e}function E(e){return _(e)}var D=i()(s((t,n)=>({savedConnections:[],activeConnections:[],activeConnectionId:null,transactionOpen:{},pendingReopen:{},fileDetached:{},addSavedConnection:e=>{e.savePassword===!1&&y(e.id,g(e)),t(t=>({savedConnections:[...t.savedConnections,e]}))},updateSavedConnection:(e,r)=>{let i={...n().savedConnections.find(t=>t.id===e),...r};i.savePassword===!1&&y(e,g(i)),t(t=>({savedConnections:t.savedConnections.map(t=>t.id===e?{...t,...r}:t)}))},deleteSavedConnection:e=>{x(e),t(t=>({savedConnections:t.savedConnections.filter(t=>t.id!==e)}))},openConnection:n=>t(t=>{let r=t.activeConnections.some(e=>e.id===n.id),i={...t.pendingReopen};return delete i[n.id],r?{activeConnections:t.activeConnections.map(e=>e.id===n.id?{...e,...n}:e),activeConnectionId:n.id,pendingReopen:i}:(e(`connection_open`,{dbms:n.dbms,transport:n.transport??`tunnel`,sample:!!n.sample,ssh:!!n.ssh?.enabled}),n.ssh?.enabled&&f(`ssh_tunnel`),{activeConnections:[...t.activeConnections,n],activeConnectionId:n.id,pendingReopen:i})}),closeConnection:e=>t(t=>{let n=t.activeConnections.filter(t=>t.id!==e),r=t.activeConnectionId===e?n.length>0?n[n.length-1].id:null:t.activeConnectionId,i={...t.transactionOpen},a={...t.pendingReopen},o={...t.fileDetached};return delete i[e],delete a[e],delete o[e],{activeConnections:n,activeConnectionId:r,transactionOpen:i,pendingReopen:a,fileDetached:o}}),reorderActiveConnection:(e,n)=>t(t=>({activeConnections:w(t.activeConnections,e,n)})),setActiveConnection:e=>t({activeConnectionId:e}),updateServerConnectionId:(e,n)=>t(t=>({activeConnections:t.activeConnections.map(t=>t.id===e?{...t,serverConnectionId:n}:t)})),updateProfile:(e,n)=>t(t=>({savedConnections:t.savedConnections.map(t=>t.id===e?{...t,...n}:t),activeConnections:t.activeConnections.map(t=>t.id===e?{...t,...n}:t)})),setTransactionOpen:(e,n)=>t(t=>({transactionOpen:{...t.transactionOpen,[e]:n}})),setPendingReopen:(e,n)=>t(t=>({pendingReopen:{...t.pendingReopen,[e]:n}})),setFileDetached:(e,n)=>t(t=>({fileDetached:{...t.fileDetached,[e]:n}})),resolveCredentials:e=>{let t=n().savedConnections.find(t=>t.id===e.id);return v(t?v(e,g(t)):e,b(e.id)??{})}}),{name:`planche-connections`,storage:c(),version:1,migrate:e=>{let t=e;return Array.isArray(t.savedConnections)&&(t.savedConnections=t.savedConnections.map(e=>({...e,savePassword:e.savePassword??!0}))),t},partialize:e=>({savedConnections:e.savedConnections.map(T),activeConnections:e.activeConnections.map(E),activeConnectionId:e.activeConnectionId})}));export{d as a,f as i,w as n,C as r,D as t};
@@ -0,0 +1 @@
1
+ import{c as e,n as t,r as n}from"./ui-store-DfspmPOn.js";import{a as r,i}from"./i18n-gQOmt8le.js";import{i as a,n as o,r as s,t as c}from"./app-storage-C_1RLCyI.js";import{t as l}from"./connection-store-DjSajhjh.js";import{n as u}from"./query-store-yK1eqNW-.js";function d(e,t){let n=globalThis,r=`__planche_${e}`;return r in n||(n[r]=t()),n[r]}var f=new Set([`neon`,`supabase`]);function p(e){return e===`postgres`||f.has(e)}var ee=`_rowid_`,te=`http://127.0.0.1:8888`,m=d(`tunnelAgent`,()=>({url:null,token:null}));function ne(e){m.url=e.url?.replace(/\/+$/,``)||null,m.token=e.token?.trim()||null}var re=new Set([`127.0.0.1`,`localhost`,`[::1]`,`::1`]);function ie(e){try{let t=new URL(e);return(t.protocol===`http:`||t.protocol===`https:`)&&re.has(t.hostname)}catch{return!1}}function ae(e){try{return typeof window<`u`&&new URL(e).origin===window.location.origin}catch{return!1}}function oe(e){return ie(e)||ae(e)}function se(){return m.url!==null&&m.url!==`/api`&&!oe(m.url)}function h(){return m.url??te}function ce(){let e=h();return e===`/api`?r.t(`services.agent.devProxyUrl`,{url:`http://localhost:8888`}):e}async function le(){let e=ce(),t;try{let e={};m.token&&(e.Authorization=`Bearer ${m.token}`),t=await(await fetch(`${h()}/health`,{cache:`no-store`,headers:e})).json()}catch(t){return{state:`offline`,url:e,message:t instanceof Error?t.message:String(t)}}return t.name!==`planche`||typeof t.version!=`string`||!/^[\w.+-]{1,32}$/.test(t.version)?{state:`offline`,url:e,message:r.t(`services.agent.notPlanche`)}:t.protocolVersion===2?t.authorized===!1||m.token===null&&t.authorized===void 0?{state:`unauthorized`,url:e,version:t.version}:{state:`online`,url:e,version:t.version,activeConnections:t.activeConnections??0,...t.gateway?{gateway:t.gateway}:{}}:{state:`outdated`,url:e,version:t.version,protocolVersion:t.protocolVersion??0,install:t.install===`standalone`?`standalone`:`npx`}}async function ue(){let e=await fetch(`${h()}/profiles`,{cache:`no-store`,headers:b()}),t=await e.json().catch(()=>null);if(!e.ok||!t||t.success!==!0)throw new x(t?.message??r.t(`services.agent.httpError`,{status:e.status,statusText:e.statusText}),e.status);return t}function g(e){let t=e.ssh;if(t?.enabled)return{host:t.host,port:t.port,user:t.user,auth:t.auth,password:t.auth===`password`?t.password??``:void 0,privateKey:t.auth===`key`?t.privateKey:void 0,passphrase:t.auth===`key`&&t.passphrase||void 0}}function _(e){return e.gatewayProfile?{profile:e.gatewayProfile}:e.dbms===`sqlite`?{driver:`sqlite`,file:e.file??``,createIfMissing:e.createIfMissing??!1,readonly:e.readOnly??!1}:e.dbms===`do`?{driver:`do`,devUrl:e.devUrl??``}:e.dbms===`d1`?{driver:`d1`,accountId:e.accountId??``,databaseId:e.databaseId??``,apiToken:e.pass}:e.dbms===`postgres`?{driver:`postgres`,host:e.host,port:e.port,user:e.user,password:e.pass,database:e.database||`postgres`,ssl:e.ssl??!1,sslVerify:e.sslVerify??!1,ssh:g(e)}:f.has(e.dbms)?{driver:`postgres`,host:e.host,port:e.port,user:e.user,password:e.pass,database:e.database||`postgres`,ssl:!0,sslVerify:e.dbms===`neon`}:e.dbms===`mssql`?{driver:`mssql`,host:e.host,port:e.port,user:e.user,password:e.pass,database:e.database||`master`,ssl:e.ssl??!1,sslVerify:e.sslVerify??!1,ssh:g(e)}:e.dbms===`oracle`?{driver:`oracle`,host:e.host,port:e.port,user:e.user,password:e.pass,serviceName:e.database||`FREEPDB1`,ssh:g(e)}:{driver:`mysql`,host:e.host,port:e.port,user:e.user,password:e.pass,charset:e.charset===`utf8`?`utf8mb4`:e.charset,ssl:e.ssl??!1,sslVerify:e.sslVerify??!1,ssh:g(e)}}var v=d(`tunnelAuthTokens`,()=>new Map);function de(e,t){let n=t?.trim();n?v.set(e,n):v.delete(e)}function y(e){return e?.trim()||m.token||void 0}function b(e){let t={"Content-Type":`application/json`},n=y(e);return n&&(t.Authorization=`Bearer ${n}`),t}var x=class extends Error{status;body;constructor(e,t,n=null){super(e),this.status=t,this.body=n}};function fe(e){if(!(e instanceof x)||e.status!==409)return null;let t=e.body,n=t?.hostKey;if(t?.code!==`host-key-unknown`||!n)return null;let r=typeof n.host==`string`&&/^[A-Za-z0-9._:[\]-]{1,253}$/.test(n.host)?n.host:null,i=typeof n.type==`string`&&/^[\w.@-]{1,64}$/.test(n.type)?n.type:null,a=typeof n.fingerprint==`string`&&/^SHA256:[A-Za-z0-9+/]{43}$/.test(n.fingerprint)?n.fingerprint:null,o=Number.isInteger(n.port)&&n.port>0&&n.port<65536?n.port:null;return r&&i&&a&&o?{host:r,port:o,type:i,fingerprint:a}:null}async function pe(e,t){let n=await fetch(`${e.replace(/\/+$/,``)}/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:t})}),i=await n.json().catch(()=>null);if(!n.ok||!i?.success||typeof i.token!=`string`)throw Error(i?.message??r.t(`services.agent.httpError`,{status:n.status,statusText:n.statusText}));return i.token}async function S(e,t,n){let i;try{i=await fetch(`${h()}${e}`,{method:`POST`,headers:b(n),body:JSON.stringify(t)})}catch(e){throw Error(r.t(`services.agent.unreachable`,{url:ce(),message:e instanceof Error?e.message:String(e)}))}let a=null;try{a=await i.json()}catch{a=null}if(!i.ok)throw new x(a?.message??r.t(`services.agent.httpError`,{status:i.status,statusText:i.statusText}),i.status,a);if(!a)throw Error(r.t(`services.agent.emptyResponse`));return a}async function me(e,t){let n=await S(`/connect`,e,t);return n.success&&n.connectionId&&(de(n.connectionId,y(t)),ge()),n}async function he(e,t,n){let r=performance.now(),i=await S(`/query`,{connectionId:e,sql:t,database:n},v.get(e));return i.execTime||=Math.round(performance.now()-r),i}function ge(){if(typeof window>`u`)return;let e=d(`tunnelPageHide`,()=>({done:!1}));e.done||(e.done=!0,window.addEventListener(`pagehide`,()=>{for(let[e,t]of v)fetch(`${h()}/disconnect`,{method:`POST`,headers:b(t),body:JSON.stringify({connectionId:e}),keepalive:!0}).catch(()=>void 0)}))}async function _e(e){try{await S(`/disconnect`,{connectionId:e},v.get(e))}finally{v.delete(e)}}async function ve(e,t){return S(`/test-connection`,e,t)}var C=0;function ye(e){C>=3||(async()=>{try{(await fetch(`${h()}/usage`,{method:`POST`,headers:b(),body:JSON.stringify({feature:e})})).ok?C=0:C+=1}catch{C+=1}})()}function w(e,t,n){return e.map(e=>e.id===t?n(e):e.children.length>0?{...e,children:w(e.children,t,n)}:e)}function be(e,t){for(let n of e){if(n.id===t)return n;let e=be(n.children,t);if(e)return e}return null}function T(e,t,n){let r=new Set(e??[]);if(n)r.add(t);else for(let e of r)(e===t||e.startsWith(`${t}/`))&&r.delete(e);return[...r]}var xe=n()(a(e=>({trees:{},selectedNodeId:{},expandedIds:{},setTree:(t,n)=>e(e=>({trees:{...e.trees,[t]:n}})),setChildren:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{expandedIds:{...e.expandedIds,[t]:T(e.expandedIds[t],n,!0)},trees:{...e.trees,[t]:w(i,n,e=>({...e,children:r,isLoading:!1,isExpanded:!0,metadata:{...e.metadata,count:r.length}}))}}:e}),setNodeMetadata:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{trees:{...e.trees,[t]:w(i,n,e=>({...e,metadata:{...e.metadata,...r}}))}}:e}),toggleExpanded:(t,n)=>e(e=>{let r=e.trees[t];if(!r)return e;let i=!be(r,n)?.isExpanded;return{expandedIds:{...e.expandedIds,[t]:T(e.expandedIds[t],n,i)},trees:{...e.trees,[t]:w(r,n,e=>({...e,isExpanded:i}))}}}),setExpanded:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{expandedIds:{...e.expandedIds,[t]:T(e.expandedIds[t],n,r)},trees:{...e.trees,[t]:w(i,n,e=>({...e,isExpanded:r}))}}:e}),setSelected:(t,n)=>e(e=>({selectedNodeId:{...e.selectedNodeId,[t]:n}})),setLoading:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{trees:{...e.trees,[t]:w(i,n,e=>({...e,isLoading:r}))}}:e}),removeTree:t=>e(e=>{let n={...e.trees},r={...e.selectedNodeId};return delete n[t],delete r[t],{trees:n,selectedNodeId:r}})}),{name:`planche-schema`,storage:c(),partialize:e=>({selectedNodeId:e.selectedNodeId,expandedIds:e.expandedIds})})),Se=32,E=24,Ce=931071618,D=931071619,O=(e,t)=>(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0,we=(e,t)=>(e[t+3]<<24|e[t+2]<<16|e[t+1]<<8|e[t])>>>0;function k(e,t,n,r,i=0,a=0){let o=r?O:we;for(let r=t;r<t+n;r+=8)i=i+o(e,r)+a>>>0,a=a+o(e,r+4)+i>>>0;return[i,a]}function Te(e){if(e.byteLength<Se)return null;let t=O(e,0);if(t!==Ce&&t!==D)return null;let n=t===D,r=O(e,8);if(r<512||r>65536||r&r-1)return null;let i=O(e,16),a=O(e,20),[o,s]=k(e,0,24,n);if(o!==O(e,24)||s!==O(e,28))return null;let c=E+r,l=new Map,u=new Map,d=0,f=0,p=0;for(let t=Se;t+c<=e.byteLength&&!(O(e,t+8)!==i||O(e,t+12)!==a||([o,s]=k(e,t,8,n,o,s),[o,s]=k(e,t+E,r,n,o,s),o!==O(e,t+16)||s!==O(e,t+20)));t+=c){let n=O(e,t),r=O(e,t+4);if(n===0)break;if(u.set(n,e.subarray(t+E,t+c)),p++,r>0){for(let[e,t]of u)l.set(e,t);u.clear(),d=r,f+=p,p=0}}return{pageSize:r,dbSizePages:d,pages:l,committedFrames:f}}function A(e,t){let n=Te(t);if(!n||n.committedFrames===0)return{bytes:e,appliedFrames:0};let{pageSize:r,dbSizePages:i,pages:a}=n,o=Math.max(i*r,e.byteLength-e.byteLength%r),s=new Uint8Array(o);s.set(e.subarray(0,Math.min(e.byteLength,o)));for(let[e,t]of a){let n=(e-1)*r;n+r<=o&&s.set(t,n)}return{bytes:i>0?s.subarray(0,i*r):s,appliedFrames:n.committedFrames}}var Ee=`planche-file-handles`,j=`handles`;function De(){return new Promise((e,t)=>{if(typeof indexedDB>`u`){t(Error(`IndexedDB unavailable`));return}let n=indexedDB.open(Ee,1);n.onupgradeneeded=()=>n.result.createObjectStore(j),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function M(e,t){return De().then(n=>new Promise((r,i)=>{let a=t(n.transaction(j,e).objectStore(j));a.onsuccess=()=>r(a.result),a.onerror=()=>i(a.error)}))}var N=e=>`${e}:wal`;async function P(e,t){try{await M(`readwrite`,n=>n.put(t,e))}catch{}}async function F(e){try{return await M(`readonly`,t=>t.get(e))??null}catch{return null}}async function I(e){try{await M(`readwrite`,t=>t.delete(e))}catch{}}async function L(e,t){let n=e,r={mode:`readwrite`};try{if(n.queryPermission&&await n.queryPermission(r)===`granted`)return!0;if(t&&n.requestPermission)return await n.requestPermission(r)===`granted`}catch{}return!1}var R=e=>`dbcache-meta:${e}`,z=e=>`${e}.sqlite3`;async function Oe(e){try{let t=await s.getItem(R(e));if(!t)return null;let n=JSON.parse(t),r=await o.get(z(e));return r?{bytes:new Uint8Array(r),meta:n}:null}catch{return null}}async function ke(e,t,n){try{let r=t.slice().buffer;return await o.set(z(e),r)?(await s.setItem(R(e),JSON.stringify(n)),!0):!1}catch(e){return console.warn(`[db-cache] write failed:`,e),!1}}async function Ae(e,t){try{let n=await s.getItem(R(e));if(!n)return;await s.setItem(R(e),JSON.stringify({...JSON.parse(n),...t}))}catch{}}async function je(e){try{await o.remove(z(e)),await s.removeItem(R(e))}catch{}}var Me=`browser:`;function B(e){return typeof e==`string`&&e.startsWith(`browser:`)}var Ne=750;function Pe(e){let t=W.get(e);t?.profileId&&(t.flushTimer&&clearTimeout(t.flushTimer),t.flushTimer=setTimeout(()=>{t.flushTimer=null,V(e)},Ne))}async function V(e){let t=W.get(e);if(t?.profileId)try{let n=await $e(e);await ke(t.profileId,n,Fe(t))}catch(e){console.warn(`[browser-sqlite] cache flush failed:`,e)}}function Fe(e){return{name:e.source.name,lastModified:e.fileMeta.lastModified,size:e.fileMeta.size,dirty:e.dirty,cachedAt:Date.now()}}var H=d(`browserSqliteVisibilityListener`,()=>({installed:!1}));typeof document<`u`&&!H.installed&&(H.installed=!0,document.addEventListener(`visibilitychange`,()=>{if(document.visibilityState===`hidden`)for(let[e,t]of W)t.flushTimer&&(clearTimeout(t.flushTimer),t.flushTimer=null,V(e))}));function U(e){return e.toLowerCase().endsWith(`-wal`)}var W=d(`browserSqliteDatabases`,()=>new Map),Ie=d(`browserSqliteModule`,()=>({promise:null}));async function G(){return Ie.promise||=i(()=>import(`./dist-Roudme38.js`).then(e=>e.default()),[]),Ie.promise}function K(e){let t=W.get(e);if(!t)throw Error(`Browser connection not found: ${e}`);return t}function Le(e){if(!(e.byteLength>=100&&e[0]===83&&e[15]===0)||e[18]!==2&&e[19]!==2)return{bytes:e,wal:!1};let t=new Uint8Array(e);return t[18]=1,t[19]=1,{bytes:t,wal:!0}}var Re=`SQLite format 3\0`;function ze(e){if(e.byteLength===0)return null;if(e.byteLength<100)return r.t(`services.sqliteFile.tooSmall`);if(String.fromCharCode(...e.subarray(0,16))!==Re)return r.t(`services.sqliteFile.notSqlite`);let t=e[16]<<8|e[17],n=t===1?65536:t;return n<512||n&n-1?r.t(`services.sqliteFile.badPageSize`,{size:n}):null}async function Be(e){let t=ze(e);if(t)throw Error(t);let n=await G(),i=new n.oo1.DB;if(e.byteLength===0)return i;let a=n.wasm.allocFromTypedArray(e),o=n.capi,s=o.SQLITE_DESERIALIZE_FREEONCLOSE??1,c=o.SQLITE_DESERIALIZE_RESIZEABLE??2,l=n.capi.sqlite3_deserialize(i.pointer,`main`,a,e.byteLength,e.byteLength,s|c);i.checkRc(l);try{i.exec(`SELECT count(*) FROM sqlite_master`)}catch(e){throw i.close(),Error(r.t(`services.sqliteFile.unreadable`,{message:e instanceof Error?e.message:String(e)}))}return i}async function Ve(e){let t=window.showOpenFilePicker;if(t)try{let n=await t({multiple:e.multiple,types:e.sqliteOnly?[{description:r.t(`services.sqliteFile.pickerDescription`),accept:{"application/vnd.sqlite3":[`.sqlite`,`.sqlite3`,`.db`,`.db3`]}}]:void 0,excludeAcceptAllOption:!1});return Promise.all(n.map(async e=>({file:await e.getFile(),handle:e})))}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return[];throw e}return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.multiple=e.multiple,e.sqliteOnly&&(n.accept=`.sqlite,.sqlite3,.db,.db3,application/vnd.sqlite3`),n.onchange=()=>t(Array.from(n.files??[]).map(e=>({file:e}))),n.oncancel=()=>t([]),n.click()})}async function He(){let e=await Ve({multiple:!0,sqliteOnly:!1}),t=e.find(e=>!U(e.file.name));return t?{main:t,wal:e.find(e=>U(e.file.name)&&e.file.name.toLowerCase()===`${t.file.name.toLowerCase()}-wal`)??e.find(e=>U(e.file.name))}:null}async function Ue(){let[e]=await Ve({multiple:!1,sqliteOnly:!1});return e??null}async function q(e,t,n={}){let{bytes:r,wal:i}=Le(e),a=await Be(r),o=`${Me}${crypto.randomUUID()}`,s={...t,wal:i};return W.set(o,{db:a,source:s,rawBytes:e,profileId:n.profileId,fileMeta:n.fileMeta??{lastModified:0,size:e.byteLength},dirty:n.dirty??!1,flushTimer:null}),{connectionId:o,source:s}}async function J(e,t,n,r={}){let i=e?new Uint8Array(await e.arrayBuffer()):new Uint8Array,a=i,o=!1;n&&(a=A(i,new Uint8Array(await n.file.arrayBuffer())).bytes,o=!0);let s=await q(a,{name:e?.name??`:memory:`,handle:t,walApplied:o,walHandle:n?.handle},{profileId:r.profileId,fileMeta:{lastModified:Math.max(e?.lastModified??0,n?.file.lastModified??0),size:i.byteLength}});return W.get(s.connectionId).rawBytes=i,r.profileId&&V(s.connectionId),s}async function We(e,t,n,r){return await q(t,{name:n.name,handle:r,walApplied:!0},{profileId:e,fileMeta:{lastModified:n.lastModified,size:n.size},dirty:n.dirty})}function Ge(e,t){let n=K(e);n.source={...n.source,handle:t}}function Ke(e){return W.get(e)?.dirty??!1}async function qe(e,t){let n=K(e),r=A(n.rawBytes,new Uint8Array(await t.file.arrayBuffer())),i=await q(r.bytes,{...n.source,walApplied:!0,walHandle:t.handle},{profileId:n.profileId,fileMeta:n.fileMeta});return W.get(i.connectionId).rawBytes=n.rawBytes,X(e),n.profileId&&V(i.connectionId),{...i,appliedFrames:r.appliedFrames}}function Y(e){return W.get(e)?.source??null}function Je(e){return e&&e.trim().toLowerCase().replace(/\(.*$/,``).trim()||null}function Ye(e){return e==null?`null`:typeof e==`number`?Number.isInteger(e)?`integer`:`real`:typeof e==`bigint`?`bigint`:e instanceof Uint8Array?`blob`:`text`}function Xe(e){return typeof e==`bigint`?Number(e):e instanceof Uint8Array?{type:`Buffer`,data:Array.from(e)}:e}async function Ze(e,t){let{db:n}=K(e),r=await G(),i=performance.now(),a=K(e),o=Number(r.capi.sqlite3_total_changes(n.pointer)),s=n.prepare(t);try{if(s.columnCount===0){s.step();let c=Number(n.changes()),l=Number(r.capi.sqlite3_last_insert_rowid(n.pointer)),u=/^\s*(BEGIN|COMMIT|END|ROLLBACK|SAVEPOINT|RELEASE)\b/i.test(t);return(c>0||Number(r.capi.sqlite3_total_changes(n.pointer))!==o||!u)&&(a.dirty=!0,Pe(e)),{success:!0,fields:[],records:[],affectedRows:c,insertId:l,isResultQuery:!1,execTime:Math.round(performance.now()-i)}}let c=[];for(;s.step();)c.push(s.get([]).map(Xe));let l=s.getColumnNames(),u=r.capi,d=s.pointer;return{success:!0,fields:l.map((e,t)=>{let n=Je(u.sqlite3_column_decltype(d,t)),r=u.sqlite3_column_table_name(d,t)??``;return{name:e,orgName:u.sqlite3_column_origin_name(d,t)??e,type:n??Ye(Qe(c,t)),table:r,orgTable:r,db:u.sqlite3_column_database_name(d,t)??``,maxLength:0}}),records:c,affectedRows:0,insertId:0,isResultQuery:!0,execTime:Math.round(performance.now()-i)}}finally{s.finalize()}}function Qe(e,t){for(let n of e){let e=n[t];if(e!=null)return e}return null}async function $e(e){let{db:t}=K(e);return(await G()).capi.sqlite3_js_db_export(t.pointer)}function et(e){let t=W.get(e);if(!t?.source.handle)return null;let{source:n}=t;return n.wal&&!n.walApplied&&!n.walAcknowledged?r.t(`services.sqliteFile.walNotLoaded`):null}function tt(e){let t=K(e);t.source={...t.source,walAcknowledged:!0}}async function nt(e){let{source:t,fileMeta:n}=e;if(!t.handle)return;let i=await t.handle.getFile();if(n.lastModified&&(i.lastModified!==n.lastModified||i.size!==n.size))throw Error(r.t(`services.sqliteFile.changedOnDisk`,{name:t.name}));if(t.walHandle)try{let e=await t.walHandle.getFile();if(e.size>0&&!t.walApplied)throw Error(r.t(`services.sqliteFile.walHasChanges`,{name:t.name}));if(e.size>0&&t.walApplied&&e.lastModified>n.lastModified)throw Error(r.t(`services.sqliteFile.walChangedOnDisk`,{name:t.name}))}catch(e){if(e instanceof Error&&!(e instanceof DOMException))throw e}}async function rt(e){let t=K(e),{source:n}=t,i=et(e);if(i)throw Error(i);n.handle&&await nt(t);let a=await $e(e);if(n.handle){if(!await L(n.handle,!0))throw Error(r.t(`services.sqliteFile.writeDenied`,{name:n.name}));let t=await n.handle.createWritable();await t.write(a),await t.close(),n.walHandle&&await(await n.walHandle.createWritable()).close();let i=K(e);i.dirty=!1;try{let e=await n.handle.getFile();i.fileMeta={lastModified:e.lastModified,size:e.size}}catch{i.fileMeta={lastModified:Date.now(),size:a.byteLength}}return i.profileId&&Ae(i.profileId,{...Fe(i)}),`in-place`}let o=new Blob([a],{type:`application/vnd.sqlite3`}),s=URL.createObjectURL(o),c=document.createElement(`a`);return c.href=s,c.download=n.name===`:memory:`?`database.sqlite`:n.name,c.click(),URL.revokeObjectURL(s),`download`}function X(e){let t=W.get(e);t&&(t.flushTimer&&clearTimeout(t.flushTimer),t.db.close(),W.delete(e))}function Z(e){return W.get(e)?.profileId}async function it(e){await I(e),await I(N(e)),await je(e)}async function at(e,t){let n=await F(e);if(!n)return null;if(!await L(n,t))return`denied`;try{return{handle:n,file:await n.getFile()}}catch(t){if(t instanceof DOMException&&(t.name===`NotFoundError`||t.name===`NotAllowedError`))return await I(e),null;throw t}}async function ot(e,t){let n=await F(N(e));if(!(!n||!await L(n,t)))try{return{file:await n.getFile(),handle:n}}catch{await I(N(e));return}}async function st(e,t){let n={remembered:!0,fromCache:!1,restoredUnsaved:!1,fileDetached:!1,diskChanged:!1},r=await Oe(e),i=await at(e,t.interactive),a=i&&i!==`denied`?i.handle:void 0,o=i&&i!==`denied`?i.file:null;if(r?.meta.dirty){let{connectionId:t,source:i}=await We(e,r.bytes,r.meta,a),s=o?o.lastModified!==r.meta.lastModified||o.size!==r.meta.size:!1;return{...n,connectionId:t,fileName:i.name,wal:i.wal,walApplied:i.walApplied,fromCache:!0,restoredUnsaved:!0,fileDetached:!a,diskChanged:s}}if(o&&a){let{connectionId:r,source:i}=await J(o,a,await ot(e,t.interactive),{profileId:e});return{...n,connectionId:r,fileName:i.name,wal:i.wal,walApplied:i.walApplied}}if(r){let{connectionId:t,source:i}=await We(e,r.bytes,r.meta);return{...n,connectionId:t,fileName:i.name,wal:i.wal,walApplied:i.walApplied,fromCache:!0,fileDetached:!0}}if(!t.interactive)return null;let s=await He();if(!s)return null;let{connectionId:c,source:l}=await J(s.main.file,s.main.handle,s.wal,{profileId:e});return s.main.handle?await P(e,s.main.handle):await I(e),s.wal?.handle?await P(N(e),s.wal.handle):await I(N(e)),{...n,connectionId:c,fileName:l.name,wal:l.wal,walApplied:l.walApplied,remembered:!1}}var ct=`SQLite format 3\0`;async function lt(e){if(e.size===0)return!0;if(e.size<100)return!1;let t=new Uint8Array(await e.slice(0,16).arrayBuffer());return String.fromCharCode(...t)===ct}async function ut(e,t){try{let n=await F(e);return n?await n.isSameEntry(t):!1}catch{return!1}}async function dt(n){let i=n.find(e=>!U(e.file.name));if(!i)return;if(!await lt(i.file))throw Error(r.t(`app.dropNotSqlite`,{name:i.file.name}));let a=n.find(e=>U(e.file.name)&&e.file.name.toLowerCase()===`${i.file.name.toLowerCase()}-wal`),o=l.getState(),s;for(let e of o.savedConnections)if(!(e.dbms!==`sqlite`||(e.transport??`browser`)!==`browser`||e.sample||e.file!==i.file.name)&&i.handle&&await ut(e.id,i.handle)){s=e;break}let c=s??{id:crypto.randomUUID(),hostName:i.file.name.replace(/\.(db|sqlite|sqlite3|db3)$/i,``),host:``,user:``,pass:``,charset:`utf8`,port:0,dbms:`sqlite`,transport:`browser`,file:i.file.name,autoConnection:!1,savePassword:!0,authToken:``};e(`sqlite_file_drop`,{reused:!!s,wal:!!a,handle:!!i.handle});let d=o.activeConnections.some(e=>e.id===c.id),f=o.activeConnections.find(e=>e.id===c.id)?.serverConnectionId,{connectionId:p}=await J(i.file,i.handle,a,{profileId:c.id});f&&f!==p&&B(f)&&X(f),i.handle?await P(c.id,i.handle):await I(c.id),a?.handle?await P(N(c.id),a.handle):await I(N(c.id)),s||o.addSavedConnection(c),o.openConnection({...c,serverConnectionId:p}),o.setPendingReopen(c.id,!1),o.setFileDetached(c.id,!1),d?xe.getState().removeTree(c.id):u.getState().addQueryTab(c.id,{id:`tab-${Date.now()}`,title:r.t(`connection.dialog.firstQueryTab`),query:``,database:``,isExecuting:!1,results:[],error:null,executionTime:null}),t.getState().setWelcomeVisible(!1)}async function ft(e,t){let n=await at(e,!0);return!n||n===`denied`?!1:(Ge(t,n.handle),!0)}async function pt(e){let t=Z(e),n=Y(e);return n&&!n.handle&&t&&await ft(t,e),rt(e)}function mt(e){let t=Y(e);return t?t.name===`:memory:`?r.t(`services.save.inMemory`):typeof window<`u`&&!(`showOpenFilePicker`in window)?r.t(`services.save.noFileSystemAccess`):!t.handle&&!Z(e)?r.t(`services.save.noWritableHandle`):null:r.t(`services.save.notBrowserSqlite`)}async function ht(e,t){let n=await Ue();if(!n)return null;let r=await qe(t,n);return n.handle&&await P(N(e),n.handle),{connectionId:r.connectionId,appliedFrames:r.appliedFrames}}function gt(e){if(!B(e))return null;let t=Y(e);return t?{wal:t.wal,walApplied:t.walApplied,walAcknowledged:t.walAcknowledged??!1}:null}function _t(e){return e.dbms===`sqlite`&&e.transport===`browser`?`browser`:`tunnel`}async function vt(e,t){return me(e,t)}async function yt(e,t){return ve(e,t)}async function bt(e,t,n){let r=e=>({success:!1,fields:[],records:[],affectedRows:0,insertId:0,isResultQuery:!1,execTime:0,message:e instanceof Error?e.message:String(e)});if(B(e))try{return await Ze(e,t)}catch(e){return r(e)}let i=Q.get(e)??e;try{return await he(i,t,n)}catch(e){if(!(e instanceof x)||e.status!==404)return r(e);let a=await xt(i);if(!a)return r(e);try{return await he(a,t,n)}catch(e){return r(e)}}}var Q=new Map,$=new Map;function xt(e){let n=$.get(e);if(n)return n;let i=(async()=>{let n=l.getState(),i=n.activeConnections.find(t=>t.serverConnectionId===e||Q.get(t.serverConnectionId??``)===e);if(!i||_t(i)===`browser`||se())return null;if(i.serverConnectionId&&i.serverConnectionId!==e&&!Q.has(i.serverConnectionId))return Q.set(e,i.serverConnectionId),i.serverConnectionId;let a=n.resolveCredentials(i),o=a.ssh?.enabled&&a.ssh.auth===`password`&&!a.ssh.password;if(!a.pass&&i.pass===``&&i.dbms!==`sqlite`||o)return null;try{let n=await me(_(a),a.authToken||void 0);if(!n.success||!n.connectionId)return null;for(let[t,r]of Q)r===e&&Q.set(t,n.connectionId);return Q.set(e,n.connectionId),l.getState().updateServerConnectionId(i.id,n.connectionId),l.getState().setTransactionOpen(i.id,!1),t.getState().setFooterMessage(r.t(`services.agent.reconnected`,{name:i.hostName||i.host||i.databaseId||i.file||i.id})),n.connectionId}catch{return null}})();return $.set(e,i),i.finally(()=>$.delete(e)),i}async function St(e){if(B(e)){let t=Z(e);X(e),t&&await je(t);return}return _e(e)}function Ct(e){return async(t,n)=>{let i=await bt(e,t,n);if(!i.success)throw Error(i.message??r.t(`services.query.failed`));return i}}export{f as A,ne as C,pe as D,oe as E,p as M,d as N,ye as O,le as S,fe as T,B as _,St as a,xe as b,gt as c,dt as d,ft as f,et as g,tt as h,mt as i,ee as j,_ as k,_t as l,yt as m,vt as n,bt as o,pt as p,Ct as r,it as s,st as t,ht as u,Ke as v,ue as w,se as x,J as y};
@@ -350,4 +350,4 @@ END;
350
350
  /`,CREATE_VIEW:`CREATE OR REPLACE VIEW "{0}"."{1}" AS
351
351
  /* SQL SELECT Statement */`,CREATE_TABLE:`CREATE TABLE "{0}"."{1}" {2}`,ALTER_TABLE:`ALTER TABLE "{0}"."{1}" {2}`,ALTER_VIEW:`{2}`,ALTER_PROCEDURE:`{2}`,ALTER_FUNCTION:`{2}`,ALTER_TRIGGER:`{2}`,SHOW_PROCESS_LIST:`SELECT s.sid || ',' || s.serial# AS "Id", s.username AS "User", s.machine AS "Host", s.schemaname AS "db", s.status AS "Command", COALESCE(s.last_call_et, 0) AS "Time", s.event AS "State", s.sql_id AS "Info" FROM v$session s WHERE s.type = 'USER' ORDER BY s.sid`,KILL_QUERY:`ALTER SYSTEM KILL SESSION '{0}' IMMEDIATE`,SHOW_VARIABLES:`SELECT name AS "Variable_name", value AS "Value" FROM v$parameter ORDER BY name`,SHOW_GLOBAL_VARIABLES:`SELECT name AS "Variable_name", value AS "Value" FROM v$parameter ORDER BY name`,SHOW_SESSION_VARIABLES:`SELECT parameter AS "Variable_name", value AS "Value" FROM nls_session_parameters ORDER BY parameter`,COPY_TABLE_STRUCTURE:`CREATE TABLE "{2}"."{3}" AS SELECT * FROM "{0}"."{1}" WHERE 1 = 0`,COPY_TABLE_DATA:`INSERT INTO "{2}"."{3}" SELECT * FROM "{0}"."{1}"`},Ft=`ASCII,CHR,CONCAT,INITCAP,INSTR,LENGTH,LOWER,LPAD,LTRIM,NLSSORT,REGEXP_INSTR,REGEXP_REPLACE,REGEXP_SUBSTR,REPLACE,RPAD,RTRIM,SOUNDEX,SUBSTR,TRANSLATE,TRIM,UPPER,LISTAGG,ABS,CEIL,EXP,FLOOR,LN,LOG,MOD,POWER,REMAINDER,ROUND,SIGN,SQRT,TRUNC,ADD_MONTHS,CURRENT_DATE,CURRENT_TIMESTAMP,EXTRACT,LAST_DAY,LOCALTIMESTAMP,MONTHS_BETWEEN,NEXT_DAY,SYSDATE,SYSTIMESTAMP,TO_CHAR,TO_DATE,TO_TIMESTAMP,TO_TIMESTAMP_TZ,FROM_TZ,NUMTODSINTERVAL,NUMTOYMINTERVAL,CAST,TO_NUMBER,TO_CLOB,COALESCE,NULLIF,NVL,NVL2,DECODE,GREATEST,LEAST,AVG,COUNT,MAX,MEDIAN,MIN,STDDEV,SUM,VARIANCE,ROW_NUMBER,RANK,DENSE_RANK,NTILE,LAG,LEAD,FIRST_VALUE,LAST_VALUE,SYS_GUID,SYS_CONTEXT,USER,UID,ROWNUM,ROWID,DBMS_METADATA.GET_DDL,JSON_VALUE,JSON_QUERY,JSON_OBJECT,JSON_ARRAY,JSON_TABLE,JSON_EXISTS`.split(`,`),It=`ACCESS.ADD.ALL.ALTER.AND.ANY.AS.ASC.AUDIT.BETWEEN.BY.CHAR.CHECK.CLUSTER.COLUMN.COMMENT.COMPRESS.CONNECT.CREATE.CURRENT.DATE.DECIMAL.DEFAULT.DELETE.DESC.DISTINCT.DROP.ELSE.EXCLUSIVE.EXISTS.FILE.FLOAT.FOR.FROM.GRANT.GROUP.GROUP BY.HAVING.IDENTIFIED.IMMEDIATE.IN.INCREMENT.INDEX.INITIAL.INSERT.INSERT INTO.INTEGER.INTERSECT.INTO.IS.LEVEL.LIKE.LOCK.LONG.MAXEXTENTS.MINUS.MLSLABEL.MODE.MODIFY.NOAUDIT.NOCOMPRESS.NOT.NOWAIT.NULL.NUMBER.OF.OFFLINE.ON.ONLINE.OPTION.OR.ORDER.ORDER BY.PCTFREE.PRIOR.PUBLIC.RAW.RENAME.RESOURCE.REVOKE.ROW.ROWID.ROWNUM.ROWS.SELECT.SESSION.SET.SHARE.SIZE.SMALLINT.START.SUCCESSFUL.SYNONYM.SYSDATE.TABLE.THEN.TO.TRIGGER.UID.UNION.UNIQUE.UPDATE.USER.VALIDATE.VALUES.VARCHAR.VARCHAR2.VIEW.WHENEVER.WHERE.WITH.BEGIN.DECLARE.END.EXCEPTION.IF.ELSIF.LOOP.WHILE.RETURN.PROCEDURE.FUNCTION.PACKAGE.BODY.CURSOR.FETCH.FIRST.NEXT.ONLY.OFFSET.COMMIT.ROLLBACK.SAVEPOINT.TRUNCATE.REPLACE.MERGE.USING.MATCHED.JOIN.INNER.LEFT.RIGHT.FULL.OUTER.CROSS.CASE.WHEN.OVER.PARTITION.DUAL.SEQUENCE.NEXTVAL.CURRVAL`.split(`.`),Lt=[`BFILE`,`BINARY_DOUBLE`,`BINARY_FLOAT`,`BLOB`,`BOOLEAN`,`CHAR`,`CLOB`,`DATE`,`FLOAT`,`INTERVAL DAY TO SECOND`,`INTERVAL YEAR TO MONTH`,`JSON`,`LONG`,`NCHAR`,`NCLOB`,`NUMBER`,`NVARCHAR2`,`RAW`,`ROWID`,`TIMESTAMP`,`TIMESTAMP WITH LOCAL TIME ZONE`,`TIMESTAMP WITH TIME ZONE`,`VARCHAR2`,`XMLTYPE`],Rt={hashComments:!1,dashCommentNeedsSpace:!1,backslashEscapes:!1,doubleQuoteIsIdentifier:!0,bracketIdentifiers:!1,delimiterCommand:!1,dollarQuotes:!1,goBatchSeparator:!1,limitStyle:`fetch`,plsqlBlocks:!0};function zt(e){let{quoteIdentifier:t,quoteLiteral:n,qualify:i}=e;return{...r(e,{addColumn:`ADD (`,modify:`oracle`,qualifiedIndexNames:!0,dropIndexOnTable:!1,unqualifiedIndexTarget:!1,multiRowInsert:!1,mysqlAttributes:!1,fulltext:!1,upperCaseTypes:!1}),createTable(e){if(!e.name&&e.columns.length===0)return`-- Define a table name and columns to generate SQL.`;let r=_(e.name,`untitled`),a=i(e.database,r),o=e.columns.filter(e=>e.primaryKey),s=e.columns.map(e=>{let n=` ${t(_(e.name,`column`))} ${e.type}`;return e.length&&(n+=`(${e.length})`),e.autoIncrement&&(n+=` GENERATED BY DEFAULT AS IDENTITY`),e.defaultValue&&(n+=` DEFAULT ${e.defaultValue}`),e.notNull&&(n+=` NOT NULL`),n});o.length>0&&s.push(` PRIMARY KEY (${o.map(e=>t(e.name)).join(`, `)})`);let c=[`CREATE TABLE ${a} (\n${s.join(`,
352
352
  `)}\n);`];for(let n of e.indexes){if(n.type===`PRIMARY`||n.columns.length===0)continue;let o=n.type===`UNIQUE`?`UNIQUE `:``,s=n.type===`FULLTEXT`?` -- FULLTEXT is MySQL-only; consider an Oracle Text index`:``,l=i(e.database,_(n.name,`${r}_${n.columns.join(`_`)}_idx`));c.push(`CREATE ${o}INDEX ${l} ON ${a} (${n.columns.map(t).join(`, `)});${s}`)}e.options.comment&&c.push(`COMMENT ON TABLE ${a} IS ${n(e.options.comment)};`);for(let r of e.columns)r.comment&&c.push(`COMMENT ON COLUMN ${a}.${t(_(r.name,`column`))} IS ${n(r.comment)};`);return c.join(`
353
- `)}}}var $=v({id:`oracle`,label:`Oracle`,capabilities:{multipleDatabases:!1,users:!1,procedures:!0,functions:!0,triggers:!0,events:!1,processList:!0,variables:!0,status:!1,flush:!1,tableProperties:!1,implicitCommitDdl:!0,transactions:!0},ddl:zt,introspect:Nt,defaultPort:1521,binaryLiteral:e=>`HEXTORAW('${e}')`,booleanKeywords:!1,identifierQuote:`"`,queries:Pt,syntax:Rt,dataTypes:Lt,functions:Ft,reservedWords:It}),Bt=v({...N,id:`neon`,label:`Neon`}),Vt=v({...N,id:`supabase`,label:`Supabase`}),Ht=v({...V,id:`d1`,label:`Cloudflare D1`,capabilities:{...V.capabilities,transactions:!1}}),Ut={mysql:C,maria:E,postgres:Xe,sqlite:ct,mssql:Tt,oracle:$,neon:Bt,supabase:Vt,d1:Ht},Wt=[C,E,Xe,ct,Tt,$,Bt,Vt,Ht];function Gt(e){return e&&Ut[e]||C}function Kt(e){return Gt(e?.dbms)}export{o as a,p as i,Gt as n,i as o,Kt as r,Wt as t};
353
+ `)}}}var $=v({id:`oracle`,label:`Oracle`,capabilities:{multipleDatabases:!1,users:!1,procedures:!0,functions:!0,triggers:!0,events:!1,processList:!0,variables:!0,status:!1,flush:!1,tableProperties:!1,implicitCommitDdl:!0,transactions:!0},ddl:zt,introspect:Nt,defaultPort:1521,binaryLiteral:e=>`HEXTORAW('${e}')`,booleanKeywords:!1,identifierQuote:`"`,queries:Pt,syntax:Rt,dataTypes:Lt,functions:Ft,reservedWords:It}),Bt=v({...N,id:`neon`,label:`Neon`}),Vt=v({...N,id:`supabase`,label:`Supabase`}),Ht=v({...V,id:`d1`,label:`Cloudflare D1`,capabilities:{...V.capabilities,transactions:!1}}),Ut=`__miniflare_do_name`,Wt={...V.introspect,async listTables(e,t){return(await V.introspect.listTables(e,t)).filter(e=>e.name!==Ut)}},Gt=v({...V,id:`do`,label:`Cloudflare DO (wrangler dev)`,capabilities:{...V.capabilities,transactions:!1},introspect:Wt}),Kt={mysql:C,maria:E,postgres:Xe,sqlite:ct,mssql:Tt,oracle:$,neon:Bt,supabase:Vt,d1:Ht,do:Gt},qt=[C,E,Xe,ct,Tt,$,Bt,Vt,Ht,Gt];function Jt(e){return e&&Kt[e]||C}function Yt(e){return Jt(e?.dbms)}export{o as a,p as i,Jt as n,i as o,Yt as r,qt as t};
@@ -0,0 +1,2 @@
1
+ var e={reconnecting:`Verbindung wird wiederhergestellt…`,dropSqlite:`Loslassen, um die SQLite-Datei zu öffnen`,dropSqliteHint:`Wird per WebAssembly im Browser geöffnet — die Datei bleibt auf Ihrem Rechner. Eine vorhandene -wal-Datei bitte mit ablegen.`,dropFailedTitle:`Abgelegte Datei konnte nicht geöffnet werden`,dropNotSqlite:`{{name}} ist keine SQLite-Datenbankdatei.`,crashTitle:`Etwas ist schiefgelaufen`,crashBody:`Die App ist auf einen unerwarteten Fehler gestoßen. Neu laden stellt Verbindungen und Tabs wieder her; ungespeicherte Änderungen im Raster gehen verloren.`,crashReload:`Neu laden`},t={auto:`Systemsprache ({{name}})`,en:`English`,ko:`한국어`,zh:`中文(简体)`,ja:`日本語`,de:`Deutsch`,fr:`Français`},n={title:`Sicherheit`,description:`Schutzmaßnahmen gegen versehentlichen Datenverlust. Schreibschutz, Umgebungsfarbe und Transaktionsmodus werden pro Verbindung festgelegt.`,language:`Sprache`,languageHint:`Wird sofort übernommen. „Systemsprache“ folgt der Einstellung Ihres Browsers.`,resetDefaults:`Auf Standardwerte zurücksetzen`,done:`Fertig`,analytics:`Anonyme Nutzungsstatistiken teilen`,analyticsHint:`Sendet anonyme Nutzungsereignisse (Engine, Funktion, Anweisungstyp) an Google Analytics. Niemals SQL-Text, Hostnamen, Tabellen- oder Benutzernamen.`,analyticsUnavailableHint:`In diesem Build nicht aktiv (keine Mess-ID konfiguriert).`,persistHistory:`Abfrageverlauf über Neuladen hinweg behalten`,persistHistoryHint:`Der Anweisungstext wird in diesem Browser gespeichert (Passwort-Literale werden maskiert; die offenen Editor-Tabs selbst bleiben immer erhalten). Aus: Verlauf und Snapshots leben nur bis zum Schließen des Tabs.`},r={settings:{safety:`Sicherheit…`,language:`Sprache`,title:`Einstellungen`,theme:`Design`},help:{gettingStarted:`Erste Schritte`,about:`Über Planche`,title:`Hilfe`,documentation:`Dokumentation`,learn:`SQL lernen`,terms:`Nutzungsbedingungen`},connection:{title:`Verbindung`,connect:`Verbinden`,disconnect:`Verbindung trennen`,readOnly:`Schreibgeschützt`,manualTransactions:`Manuelle Transaktionen`,saveDatabaseFile:`Datenbankdatei speichern`,saveDatabaseFileBlocked:`Datenbankdatei speichern (zuerst -wal laden)`,exit:`Beenden`},query:{title:`Abfrage`,execute:`Ausführen`,executeStatementAtCursor:`Anweisung am Cursor ausführen`,executeWholeScript:`Gesamtes Skript ausführen`,newQueryTab:`Neuer Abfrage-Tab`,findReplace:`Suchen und Ersetzen`,localHistory:`Lokaler Verlauf…`},edit:{title:`Bearbeiten`,undo:`Rückgängig`,redo:`Wiederholen`,cut:`Ausschneiden`,copy:`Kopieren`,paste:`Einfügen`,selectAll:`Alles auswählen`},database:{title:`Datenbank`,create:`Datenbank erstellen`,alter:`Datenbank ändern`,drop:`Datenbank löschen`,copy:`Datenbank kopieren`,compare:`Schemas vergleichen…`,truncate:`Datenbank leeren`,compareData:`Daten vergleichen…`},table:{title:`Tabelle`,create:`Tabelle erstellen`,alter:`Tabelle ändern`,drop:`Tabelle löschen`,rename:`Tabelle umbenennen`,truncate:`Tabelle leeren`,duplicateStructure:`Tabellenstruktur duplizieren`},export:{title:`Export`,csv:`Als CSV herunterladen`,schemaHtml:`Schema als HTML`,links:`Spaltenverknüpfungen exportieren…`,importLinks:`Spaltenverknüpfungen importieren…`},tools:{title:`Werkzeuge`,userManager:`Benutzerverwaltung`,processList:`Prozessliste`,variables:`Variablen`,status:`Status`,flush:`Flush`,quickCommand:`Schnellbefehl`,viewErd:`ERD anzeigen`,scratchpad:`Scratchpad (SQLite im Browser)`,federated:`Verbundabfrage (Join über Verbindungen)…`,federatedTab:`Verbund {{n}}`},messages:{databaseFileSaved:`Datenbankdatei gespeichert`,databaseExported:`Datenbank als Download exportiert`,databaseExportedWithReason:`Datenbank als Download exportiert — {{reason}}`,errorSavingDatabase:`Fehler beim Speichern der Datenbank: {{message}}`,noDatabaseSelected:`Keine Datenbank ausgewählt`,noTableSelected:`Keine Tabelle ausgewählt`,noActiveConnection:`Keine aktive Verbindung`,databaseDropped:`Datenbank „{{database}}“ wurde gelöscht`,errorDroppingDatabase:`Fehler beim Löschen der Datenbank: {{message}}`,noTablesInDatabase:`Keine Tabellen in der Datenbank „{{database}}“ gefunden`,databaseTruncated_one:`{{count}} Tabelle in „{{database}}“ wurde geleert`,databaseTruncated_other:`Alle {{count}} Tabellen in „{{database}}“ wurden geleert`,errorTruncatingDatabase:`Fehler beim Leeren der Datenbank: {{message}}`,tableDropped:`Tabelle „{{table}}“ wurde gelöscht`,errorDroppingTable:`Fehler beim Löschen der Tabelle: {{message}}`,tableTruncated:`Tabelle „{{table}}“ wurde geleert`,errorTruncatingTable:`Fehler beim Leeren der Tabelle: {{message}}`,renameTablePrompt:`Tabelle „{{table}}“ umbenennen in:`,tableRenamed:`Tabelle „{{table}}“ wurde in „{{newName}}“ umbenannt`,errorRenamingTable:`Fehler beim Umbenennen der Tabelle: {{message}}`,truncateDatabaseTitle:`Alle Tabellen in "{{name}}" leeren?`,truncateDatabaseDescription:`Alle Zeilen in {{count}} Tabelle(n) von "{{name}}" werden gelöscht. Die Tabellenstrukturen bleiben erhalten. Dies kann nicht rückgängig gemacht werden.`,truncateDatabaseConfirm:`Alle Tabellen leeren`,renameTableTitle:`Tabelle umbenennen`,renameTableConfirm:`Umbenennen`,noLinksToExport:`Keine Spaltenverknüpfungen zum Exportieren.`,linksExported:`{{count}} Spaltenverknüpfungen exportiert.`,linksImported:`{{count}} Spaltenverknüpfungen importiert.`,linksImportedPartial:`{{count}} Spaltenverknüpfungen importiert; kein passendes Profil für: {{profiles}}`,linksImportFailed:`Spaltenverknüpfungen konnten nicht importiert werden: {{reason}}`}},i={title:`Über Planche`,tagline:`Ein Datenbank-Client für MySQL, MariaDB, PostgreSQL und SQLite.`,version:`Version`,website:`Website`,licenses:`Lizenzen`,licensesLink:`Hinweise zu Drittanbietern`,disclaimer:`Planche wird „wie besehen“ und ohne jegliche Gewährleistung bereitgestellt. Die Autoren haften nicht für Schäden oder Datenverluste, die aus der Nutzung entstehen. Sichern Sie Ihre Daten, bevor Sie destruktive Anweisungen ausführen.`,rights:`Alle Rechte vorbehalten.`},a=JSON.parse('{"dialog":{"title":"Mit Datenbank verbinden","firstQueryTab":"Abfrage 1","colHostName":"Name","colTarget":"Ziel","colDbms":"DBMS","noSaved":"Keine gespeicherten Verbindungen","unnamed":"(unbenannt)","pickOnConnect":"(beim Verbinden auswählen)","noFile":"(keine Datei)","selectPrompt":"Wählen Sie eine Verbindung aus oder legen Sie eine neue an","addNew":"Neu hinzufügen","delete":"Löschen","testConnection":"Verbindung testen","connect":"Verbinden","close":"Schließen","unknownError":"Unbekannter Fehler","browserTestHint":"SQLite-Verbindungen im Browser öffnen beim Klick auf „Verbinden“ eine lokale Datei.","testSuccess":"Verbindung erfolgreich","restoredUnsaved":"{{file}}: ungespeicherte Änderungen aus der zwischengespeicherten Kopie wiederhergestellt","restoredUnsavedDiskChanged":"{{file}}: ungespeicherte Änderungen aus der zwischengespeicherten Kopie wiederhergestellt — Hinweis: Die Datei auf dem Datenträger hat sich seitdem geändert","walPending":"{{file}} ist im WAL-Modus: Aktuelle Änderungen befinden sich möglicherweise noch in der -wal-Datei. Verwenden Sie oben „-wal-Datei laden“, um sie einzubeziehen.","walApplied":"{{file}} wurde mit den Änderungen aus der -wal-Datei geöffnet","connectFailedTitle":"Verbindung fehlgeschlagen","testSuccessDescription":"Der Server hat die Zugangsdaten akzeptiert.","testFailedTitle":"Verbindungstest fehlgeschlagen","privacy":"Nichts, was Sie hier eingeben, wird an planche.dev-Server gesendet oder dort gespeichert. Verbindungsprofile liegen ausschließlich im lokalen Speicher dieses Browsers; Abfragen gehen direkt vom lokalen Agenten an Ihre Datenbank.","hostKeyTitle":"Unbekannter SSH-Hostschlüssel","hostKeyDescription":"{{host}}:{{port}} hat einen {{type}}-Schlüssel mit dem Fingerabdruck {{fingerprint}} vorgelegt. Vergleichen Sie ihn mit dem Fingerabdruck Ihres Serveradministrators; ein falscher Schlüssel lässt einen Angreifer Ihren Verkehr mitlesen.","hostKeyAccept":"Diesem Host vertrauen","gatewayTitle":"Gateway-Profile","gatewayAdd":"Hinzufügen","gatewayAdded":"Gateway-Profil {{name}} hinzugefügt.","gatewayReadOnly":"schreibgeschützt","gatewayWritable":"beschreibbar","gatewayProfileHint":"Diese Verbindung nutzt das vom Gateway gehaltene Profil „{{name}}“; hier gibt es nichts einzustellen.","gatewayLoadFailed":"Gateway-Profile konnten nicht geladen werden: {{error}}"},"form":{"hostName":"Name","hostNamePlaceholder":"Meine Verbindung","dataSource":"Datenquelle","openVia":"Öffnen über","viaBrowser":"Browser (lokale Datei)","viaAgent":"Lokaler Agent","viaBrowserHint":"Keine Installation nötig. Am besten für Dateien, die kein anderes Programm verwendet: Der Browser arbeitet auf einer Kopie im Arbeitsspeicher und kann die Datei nicht sperren. Änderungen, die währenddessen anderswo vorgenommen werden, bleiben unsichtbar und werden beim Speichern überschrieben.","viaAgentHint":"Öffnet die Datei mit SQLite selbst über npx planche — mit korrektem Locking und WAL, sicher neben anderen Programmen, die dieselbe Datenbank verwenden.","databaseFile":"Datenbankdatei","changeFile":"Datei ändern","filePickerHint":"Beim Klick auf „Verbinden“ öffnet sich eine Dateiauswahl (Tipp: ⌘⇧. zeigt versteckte Dateien, mit ⌘⇧G können Sie einen Pfad eingeben).","fileRememberedHint":"Die gewählte Datei wird gemerkt (Chromium), sodass beim erneuten Verbinden nur die Berechtigung abgefragt wird. Verwenden Sie Verbindung > Datenbankdatei speichern, um Änderungen zurückzuschreiben.","authToken":"Auth-Token","authTokenPlaceholder":"Leer lassen, um das Token des gekoppelten Agents zu verwenden","filePathPlaceholder":"/pfad/zur/datenbank.sqlite oder :memory:","createIfMissing":"Erstellen, falls nicht vorhanden","createIfMissingHint":"Der Pfad wird auf dem Host des Tunneling-Servers aufgelöst","host":"Host","port":"Port","database":"Datenbank","serviceName":"Dienstname","user":"Benutzer","password":"Passwort","savePassword":"Passwort speichern","savePasswordHint":"Aus: Das Passwort wird nur für diese Browsersitzung behalten und nie auf den Datenträger geschrieben.","charset":"Zeichensatz","autoConnection":"Automatisch verbinden","safety":"Sicherheit","environment":"Umgebung","environmentHint":"färbt Tab und Arbeitsbereich ein","readOnly":"Schreibgeschützt","readOnlyHint":"Anweisungen ablehnen, die Daten oder Schema ändern","transactions":"Transaktionen","txAuto":"Auto-Commit","txManual":"Manuell — Commit / Rollback über die Symbolleiste","ssh":"SSH","sshTunnel":"SSH-Tunnel","sshTunnelHint":"Datenbank über einen SSH-Sprunghost erreichen (der lokale Agent öffnet den Tunnel)","sshHost":"SSH-Host","sshPort":"SSH-Port","sshUser":"SSH-Benutzer","sshAuth":"SSH-Auth","sshAuthKey":"Privater Schlüssel","sshAuthPassword":"Passwort","sshAuthAgent":"ssh-agent","sshAuthAgentHint":"Verwendet die im ssh-agent des Rechners geladenen Schlüssel, auf dem npx planche läuft (SSH_AUTH_SOCK).","sshPassword":"SSH-Passwort","sshKey":"Privater Schlüssel","sshKeyPick":"Schlüsseldatei wählen…","sshKeyLoaded":"Schlüssel geladen","sshKeyHint":"Leer lassen, um das IdentityFile aus ~/.ssh/config (oder ~/.ssh/id_*) auf dem Rechner des Agents zu verwenden; ein gewählter Schlüssel wird mit diesem Profil gespeichert","sshPassphrase":"Passphrase","sshPassphrasePlaceholder":"Leer lassen, wenn der Schlüssel keine hat","sshSecretsHint":"SSH-Passwort, privater Schlüssel und Passphrase folgen der Einstellung „Passwort speichern“ oben. Unbekannte Hostschlüssel werden vor der ersten Verbindung zur Prüfung angezeigt und in ~/.planche/known_hosts auf dem Rechner des Agenten gespeichert.","sshHostPlaceholder":"bastion.example.com oder ein Host-Alias aus ~/.ssh/config","sshUserPlaceholder":"Leer lassen, um ~/.ssh/config zu verwenden","sshTargetHint":"Datenbank-Host und -Port werden auf dem Sprunghost aufgelöst — die echte Adresse der Datenbank (z. B. den RDS-Endpunkt) angeben, nicht localhost oder eine lokale Portweiterleitung.","connectionString":"Verbindungs-URI","connectionStringApplied":"In die Felder unten übernommen. Die URI selbst wird nicht gespeichert, nur die Felder.","connectionStringInvalid":"Keine PostgreSQL-URI (erwartet postgresql://user:password@host/database).","neonHint":"URI aus der Neon-Konsole (Connect > Connection string) einfügen; die Felder unten werden daraus befüllt.","supabaseHint":"URI aus Supabase (Connect > Session pooler oder Direct connection) einfügen; die Felder unten werden daraus befüllt.","supabasePoolerWarning":"Port 6543 ist der Pooler im Transaktionsmodus: Jede Anweisung kann auf einem anderen Backend laufen, daher funktionieren Schemawechsel, temporäre Tabellen, Prepared Statements und manuelle Transaktionen nicht. Verwenden Sie den Session-Pooler (Port 5432) oder die Direktverbindung.","managedTlsHint":"Dieser Dienst wird immer über TLS erreicht; die Verbindung geht direkt vom lokalen Agenten zum Dienst (kein SSH-Tunnel).","d1AccountId":"Account ID","d1DatabaseId":"Database ID","d1ApiToken":"API-Token","d1Hint":"Account ID: Cloudflare-Dashboard, rechts auf der Kontostartseite. Database ID: Storage & Databases > D1 > Ihre Datenbank. Token: My Profile > API Tokens > Create Token mit der Berechtigung \\"D1 Edit\\" (oder \\"D1 Read\\" für Nur-Lesen). Der lokale Agent ruft damit die Cloudflare-API auf.","d1LimitsHint":"D1 führt jede Anfrage einzeln aus und committet automatisch, daher gibt es keine manuellen Transaktionen; die Datenbank erscheint als einziges Schema \\"main\\".","doDevUrl":"wrangler-dev-URL","doHint":"Starten Sie `wrangler dev` in Ihrem Worker-Projekt und fügen Sie die ausgegebene URL ein (Port 8787, sofern nicht geändert). Der lokale Agent liest die Durable Objects dieser Sitzung — einschließlich weiterer gleichzeitig laufender `wrangler dev`-Sitzungen.","doLimitsHint":"Nur für die lokale Entwicklung: Bereitgestellte Durable Objects sind ausschließlich aus einem Worker erreichbar, Cloudflare bietet keine Abfrage-API dafür. Jedes Objekt erscheint als Datenbank \\"<Namespace>/<Objekt>\\"; jede Anfrage committet automatisch, manuelle Transaktionen sind daher nicht verfügbar.","tls":"TLS","tlsEnable":"Verbindung verschlüsseln","tlsVerify":"Serverzertifikat prüfen","tlsVerifyHint":"Aus: selbstsignierte Zertifikate werden akzeptiert (verschlüsselt, aber der Server ist nicht authentifiziert). Über einen SSH-Tunnel nicht verfügbar."},"agent":{"copy":"Kopieren","looking":"Suche nach dem Planche-Agent…","online":"Agent <b>v{{version}}</b> läuft unter <mono>{{url}}</mono>","outdated":"Agent v{{version}} spricht Protokoll {{protocol}}, diese App benötigt jedoch ein neueres. Starten Sie ihn neu mit <cmd/>","unauthorized":"Agent <b>v{{version}}</b> läuft unter <mono>{{url}}</mono>, ist aber nicht mit dieser App gekoppelt (das Token ändert sich bei jedem Start). Öffnen Sie den im Terminal des Agents ausgegebenen Link oder fügen Sie das Token unter „Konfigurieren“ ein.","offline":"Kein Agent unter <mono>{{url}}</mono>. Starten Sie ihn im Terminal – er öffnet diese App bereits gekoppelt.","close":"Schließen","configure":"Konfigurieren","checkAgain":"Erneut prüfen","urlLabel":"Agent-URL","urlPlaceholder":"http://127.0.0.1:8888 (Standard)","tokenLabel":"Token","tokenPlaceholder":"Wird vom Agent ausgegeben","reset":"Zurücksetzen","save":"Speichern","remoteWarning":"Dieser Agent läuft nicht auf Ihrem Rechner ({{host}}): Jede Verbindung schickt ihre Passwörter und SSH-Schlüssel dorthin.","remoteRefusedTitle":"Entfernter Agent nicht erlaubt","remoteRefused":"Der Agent muss auf diesem Rechner laufen (127.0.0.1 oder localhost). Für einen Agenten auf einer anderen Maschine leiten Sie den Port mit `ssh -L 8888:127.0.0.1:8888 user@host` weiter und lassen die URL auf http://127.0.0.1:8888.","gateway":"Gateway „{{name}}“: {{count}} serverseitige Profile. Zugangsdaten bleiben auf dem Gateway; wählen Sie unten ein Profil."},"tab":{"noConnections":"Keine Verbindungen geöffnet. Klicken Sie auf „Verbinden“, um zu beginnen.","theSqliteFile":"die SQLite-Datei","reopened":"{{file}} erneut geöffnet","reopenFailed":"Datei konnte nicht erneut geöffnet werden: {{message}}","reopenPrompt":"Der Browser benötigt erneut Ihre Berechtigung, um <b>{{file}}</b> zu lesen.","reopenFile":"Datei erneut öffnen","closeConnection":"Verbindung schließen","reconnected":"{{file}} erneut verbunden","accessNotGranted":"Dateizugriff wurde nicht gewährt; beim Speichern wird stattdessen ein Download exportiert.","detachedPrompt":"Sie arbeiten auf einer zwischengespeicherten Kopie von <b>{{file}}</b>. Verbinden Sie die Datei erneut, um Änderungen direkt zu speichern.","reconnectFile":"Datei erneut verbinden","detachedHide":"Ausblenden (beim Speichern wird bei Bedarf nach der Datei gefragt)","walFramesApplied_one":"{{count}} WAL-Frame aus {{file}}-wal übernommen","walFramesApplied_other":"{{count}} WAL-Frames aus {{file}}-wal übernommen","walNoChanges":"Die -wal-Datei enthielt keine bestätigten Änderungen","walLoadFailed":"-wal-Datei konnte nicht geladen werden: {{message}}","walPrompt":"<b>{{file}}</b> ist im WAL-Modus: Möglicherweise werden die neuesten Daten erst angezeigt, wenn die Datei <mono>{{file}}-wal</mono> geladen wurde; bis dahin ist das Speichern deaktiviert. Falls keine solche Datei daneben existiert (die Datenbank wurde sauber geschlossen), bestätigen Sie das stattdessen. Falls ein anderes Programm diese Datenbank noch verwendet, öffnen Sie sie stattdessen über den lokalen Agent (<mono>npx planche</mono>): Der Browser kann die Datei nicht sicher gemeinsam nutzen.","loadWal":"-wal-Datei laden","noWalHint":"Ich habe nachgesehen: Es gibt keine -wal-Datei neben der Datenbank","noWal":"Keine -wal-Datei","dismiss":"Schließen","walHide":"Ausblenden (Speichern bleibt deaktiviert)","readOnlyBadge":"schreibgeschützt"}}'),o={connect:`Verbinden (Alt+N)`,disconnect:`Verbindung trennen`,newQueryTab:`Neuer Abfrage-Tab (Alt+T)`,execute:`Ausführen (F9)`,executeStatement:`Anweisung am Cursor / Auswahl ausführen (Ctrl+Enter)`,commit:`Commit`,commitHint:`Offene Transaktion bestätigen (Commit)`,noOpenTransaction:`Keine offene Transaktion`,rollback:`Rollback`,rollbackHint:`Offene Transaktion verwerfen (Rollback)`,readOnlyBadge:`schreibgeschützt`,readOnlyHint:`Diese Verbindung lehnt Anweisungen ab, die Daten oder Schema ändern`,userManager:`Benutzerverwaltung (Alt+U)`,quickCommand:`Schnellbefehl`,processList:`Prozessliste`,variables:`Variablen`,status:`Status`,flush:`Flush`,fullscreen:`Vollbild`},s={readOnly:`schreibgeschützt`,txOpen:`Transaktion offen`,manualTx:`manuelle Transaktionen`},c={title:`Schnellbefehl`,description:`Suchen Sie einen auszuführenden Befehl...`,inputPlaceholder:`Befehl eingeben oder suchen...`,empty:`Keine Befehle gefunden.`,groups:{connection:`Verbindung`,query:`Abfrage`,database:`Datenbank`,table:`Tabelle`,tools:`Werkzeuge`},commands:{connect:`Verbinden`,disconnect:`Verbindung trennen`,executeQuery:`Abfrage ausführen`,newQueryTab:`Neuer Abfrage-Tab`,createDatabase:`Datenbank erstellen`,dropDatabase:`Datenbank löschen`,createTable:`Tabelle erstellen`,alterTable:`Tabelle ändern`,dropTable:`Tabelle löschen`,processList:`Prozessliste`,serverVariables:`Servervariablen`,serverStatus:`Serverstatus`,flush:`Flush`,userManager:`Benutzerverwaltung`}},l={title:`Willkommen bei Planche`,intro:`Ein SQL-Client, der in Ihrem Browser läuft. Ihre Datenbanken werden über einen kleinen Agent auf Ihrem Rechner erreicht, sodass Zugangsdaten und Daten Ihren Computer nie verlassen.`,skip:`Überspringen`,skipTitle:`Diesen Bildschirm ausblenden (Hilfe > Erste Schritte bringt ihn zurück)`,copy:`Kopieren`,copied:`Kopiert`,sampleOpenFailed:`Die Beispieldatenbank konnte nicht geöffnet werden: {{message}}`,steps:{agent:{title:`Lokalen Agent starten`,body:`Führen Sie einen dieser Befehle im Terminal aus. Er startet den Agenten und koppelt ihn mit dieser Seite.`},connection:{title:`Verbindung hinzufügen`,body:`Wählen Sie Ihre Datenbank, um das Verbindungsformular mit passenden Voreinstellungen zu öffnen.`},sample:{title:`Keine Datenbank zur Hand? Probieren Sie das Beispiel`,body:`Laden Sie eine Beispieldatenbank eines Webshops (24 Tabellen, ca. 50.000 Zeilen, Views und Trigger) in den Browser, um Editor, Tabellenansicht und Schemabaum auszuprobieren.`,loading:`Beispiel wird geladen…`,button:`Beispieldatenbank ausprobieren`}},terms:{title:`Bevor Sie beginnen`,local:`Alles läuft lokal: Zugangsdaten, Abfragen und Ergebnisse bleiben auf Ihrem Rechner und werden nie an uns gesendet.`,asIs:`Planche wird ohne Gewährleistung bereitgestellt. Die Schutzmechanismen (Bestätigung destruktiver Befehle, Nur-Lese-Modus) sind Hilfen, keine Garantien.`,dataLoss:`Sie sind für jede über Planche ausgeführte Anweisung verantwortlich. Sichern Sie Ihre Daten, bevor Sie etwas Destruktives ausführen.`,agree:`Ich habe die Nutzungsbedingungen gelesen und stimme ihnen zu.`,accepted:`Sie haben die Nutzungsbedingungen akzeptiert.`,readFull:`Vollständige Bedingungen lesen`}},u={treeLabel:`Schema`,unreachableHint:`Nicht die Datenbank, an die diese Verbindung gebunden ist; legen Sie ein Profil dafür an, um sie zu durchsuchen`,objectType:{table:`Tabelle`,view:`View`,procedure:`Prozedur`,function:`Funktion`,trigger:`Trigger`,event:`Event`},menu:{showCreate:`CREATE-Anweisung anzeigen ({{type}})`,alter:`{{type}} ändern`,drop:`{{type}} löschen`,create:`{{type}} erstellen`,refresh:`Aktualisieren`,unreachable:`Verbinden Sie sich mit einem an diese Datenbank gebundenen Profil, um sie zu durchsuchen`,openDatabase:`Datenbank öffnen`,createSchema:`Schema erstellen`,createTable:`Tabelle erstellen`,dropDatabase:`Datenbank löschen`,openSchema:`Schema öffnen`,dropSchema:`Schema löschen`,newQueryTab:`Neuer Abfrage-Tab`,generateSql:`SQL erzeugen`,openTable:`Tabelle öffnen`,alterTable:`Tabelle ändern`,showCreateTable:`CREATE TABLE anzeigen`,duplicateStructure:`Struktur duplizieren`,copyTable:`Tabelle kopieren nach…`,compare:`{{type}} vergleichen…`,truncateTable:`Tabelle leeren`,dropTable:`Tabelle löschen`,exportCsv:`Als CSV exportieren`,openView:`View öffnen`,alterView:`View ändern`,showCreateView:`CREATE VIEW anzeigen`,dropView:`View löschen`,compareData:`Daten vergleichen…`},actions:{createStatementUnavailable:`-- CREATE-Anweisung für {{type}} {{name}} konnte nicht abgerufen werden`,getCreateFailed:`CREATE {{type}} konnte nicht abgerufen werden: {{message}}`,createTabTitle:`{{type}} erstellen`,createSchemaTabTitle:`Schema erstellen`,generateSqlFailed:`SQL konnte nicht erzeugt werden: {{message}}`,dropTableTitle:`Tabelle „{{name}}“ löschen?`,dropTableDescription:`Dies löscht die Tabelle und alle darin enthaltenen Zeilen dauerhaft{{from}}. Dies kann nicht rückgängig gemacht werden.`,dropTableConfirm:`Tabelle löschen`,dropObjectTitle:`{{type}} „{{name}}“ löschen?`,dropObjectDescription:`Die Definition von {{type}} wird entfernt{{from}}. Dies kann nicht rückgängig gemacht werden.`,dropObjectConfirm:`{{type}} löschen`,fromDatabase:` aus der Datenbank „{{database}}“`,dropped:`{{type}} {{name}} gelöscht`,dropFailed:`{{type}} konnte nicht gelöscht werden`,dropDatabaseTitle:`Datenbank „{{name}}“ löschen?`,dropDatabaseDescription:`Dies löscht die Datenbank mit allen Tabellen und Daten dauerhaft. Dies kann nicht rückgängig gemacht werden.`,dropDatabaseConfirm:`Datenbank löschen`,droppedDatabase:`Datenbank {{name}} gelöscht`,dropDatabaseFailed:`Datenbank konnte nicht gelöscht werden`,dropSchemaTitle:`Schema „{{name}}“ löschen?`,dropSchemaDescription:`Dies löscht das Schema mit allen Tabellen und Daten dauerhaft. Dies kann nicht rückgängig gemacht werden.`,dropSchemaConfirm:`Schema löschen`,droppedSchema:`Schema {{name}} gelöscht`,dropSchemaFailed:`Schema konnte nicht gelöscht werden`,truncateTitle:`Tabelle „{{name}}“ leeren?`,truncateDescription:`Alle Zeilen in „{{name}}“ werden gelöscht. Die Tabellenstruktur bleibt erhalten. Dies kann nicht rückgängig gemacht werden.`,truncateConfirm:`Tabelle leeren`,truncated:`{{name}} geleert`,truncateFailed:`Leeren fehlgeschlagen`},tree:{loadDatabasesFailed:`Datenbanken konnten nicht geladen werden: {{message}}`}},d={editor:{destructiveMarker:`Destruktiv: {{action}} {{names}}`,readOnlyMarker:`Die Verbindung ist schreibgeschützt; diese Anweisung ändert Daten oder Schema`,actionExecute:`Ausführen (gemäß Einstellungen)`,actionExecuteStatement:`Anweisung am Cursor / Auswahl ausführen`,actionExecuteScript:`Gesamtes Skript ausführen`},tabs:{newQuery:`Neue Abfrage`,queryTitle:`Abfrage {{n}}`,erdViewer:`ERD-Viewer`,close:`Schließen`,closeOthers:`Andere schließen`,closeLeft:`Tabs links schließen`,closeRight:`Tabs rechts schließen`,closeAll:`Alle schließen`},executor:{noActiveConnection:`Keine aktive Verbindung`,uncommittedTitle:`Nicht bestätigte Transaktion`,uncommittedDescription:`Diese Verbindung hat eine offene Transaktion. Beim Trennen werden ihre Änderungen zurückgerollt.`,uncommittedConfirm:`Rollback und trennen`,unsavedTitle:`Ungespeicherte Änderungen`,unsavedDescription:`{{file}} enthält Änderungen, die nicht in die Datei gespeichert wurden. Beim Trennen gehen sie verloren (verwenden Sie zuerst Verbindung > Datenbankdatei speichern, um sie zu behalten).`,theSqliteDatabase:`Die SQLite-Datenbank`,unsavedConfirm:`Verwerfen und trennen`}},f={tabs:{message:`Meldung`,info:`Info`,history:`Verlauf`,result:`Ergebnis`,resultN:`Ergebnis {{n}}`},message:{executing:`Abfrage wird ausgeführt...`,error:`Fehler: {{message}}`,total:` (Gesamt: {{ms}} ms)`,ready:`Bereit.`,log:`Ausführungsprotokoll`,statementN:`Anweisung {{n}}`,limitedBadge:`Limit erreicht`,insertId:`Insert-ID {{id}}`,failed:`Fehlgeschlagen`,failedStatement:`Fehlgeschlagene Anweisung`,summary:`{{ok}} erfolgreich · {{failed}} fehlgeschlagen · {{ms}} gesamt`,copy:`Kopieren`,copied:`Kopiert`,showSql:`SQL anzeigen`,hideSql:`SQL ausblenden`},info:{empty:`Keine Abfrageinformationen verfügbar.`,resultN:`Ergebnis {{n}}`,metadata:`Abfrage-Metadaten`,executionTime:`Ausführungszeit`,notAvailable:`k. A.`,affectedRows:`Betroffene Zeilen`,fields:`Felder`,fieldDetails:`Felddetails`,colName:`Name`,colType:`Typ`,colTable:`Tabelle`,resultSets:`Ergebnismengen`,rowsReturned:`Zurückgegebene Zeilen`,insertId:`Letzte Insert-ID`,lastQuery:`Zuletzt ausgeführte Anweisung`,copy:`Kopieren`,copied:`Kopiert`,colOrigin:`Ursprung`,primaryKey:`Primärschlüssel`,rowsAndFields:`{{rows}} Zeilen × {{fields}} Felder`,noFields:`Diese Anweisung hat keine Spalten zurückgegeben.`},rowForm:{colColumn:`Spalte`,colValue:`Wert`,insertTitle:`Zeile einfügen`,editTitle:`Zeile bearbeiten`,loading:`Spalten werden geladen...`,preview:`Anweisung`,nothingToWrite:`Nichts zu schreiben`,insert:`Einfügen`,update:`Aktualisieren`,stageInsert:`Als ausstehende Zeile hinzufügen`,stageEdit:`In Raster übernehmen`,stageHint:`Werte nur ins Raster stellen, ohne etwas auszuführen; später mit den anderen Änderungen committen.`,inserted:`Zeile in {{table}} eingefügt`,updated:`Zeile in {{table}} aktualisiert`,confirmInsertTitle:`Zeile in {{table}} einfügen?`,confirmUpdateTitle:`Zeile in {{table}} aktualisieren?`,inTransaction:`Läuft in der offenen Transaktion`,pickDate:`Datum wählen`,now:`Jetzt`,formatJson:`Formatieren`,binaryUnsupported:`Binärspalten können hier nicht bearbeitet werden; NULL/DEFAULT lassen oder per SQL setzen.`,generateUuid:`UUID erzeugen`,defaultValue:`Standardwert`,clickToChange:`Zum Ändern klicken`,empty:`(leer)`,autoHint:`Vom Server erzeugt`,mode:{keep:`Behalten`,auto:`Auto`,value:`Wert`},invalid:{integer:`Ganze Zahl eingeben`,unsigned:`Diese Spalte akzeptiert keine negativen Zahlen`,number:`Zahl eingeben`,json:`Ungültiges JSON`,date:`Format YYYY-MM-DD verwenden`,datetime:`Format YYYY-MM-DD HH:MM:SS verwenden`,time:`Format HH:MM:SS verwenden`,length:`Höchstens {{max}} Zeichen`}},history:{copied:`In die Zwischenablage kopiert`,searchPlaceholder:`Verlauf durchsuchen...`,all:`Alle`,success:`Erfolgreich`,failed:`Fehlgeschlagen`,thisTab:`Nur dieser Tab`,noMatch:`Keine passenden Einträge.`,count:`{{count}} Einträge`,clear:`Leeren`,clearTitle:`Abfrageverlauf leeren?`,clearDescription:`Alle {{count}} Einträge dieser Verbindung werden entfernt. Dies kann nicht rückgängig gemacht werden.`,clearConfirm:`Verlauf leeren`,insert:`In Editor einfügen`,inserted:`In den Editor eingefügt`,copy:`Kopieren`,rows:`{{count}} Zeilen`,affected:`{{count}} betroffen`,today:`Heute`,yesterday:`Gestern`,empty:`Kein Abfrageverlauf.`},json:{arrayLength:`Array[{{count}}]`,keys_one:`{{count}} Schlüssel`,keys_other:`{{count}} Schlüssel`,invalid:`Ungültiges JSON`,clickToView:`Klicken, um JSON anzuzeigen`,expandAll:`Alle aufklappen`,collapseAll:`Alle einklappen`,edit:`Bearbeiten`,view:`Anzeigen`,copied:`Kopiert`,copy:`Kopieren`,shortcutHint:`{{mod}}+Enter zum Speichern · Esc zum Abbrechen`,cancel:`Abbrechen`,save:`Speichern`},grid:{readOnlyConnection:`Schreibgeschützte Verbindung`,readOnlyWal:`Schreibgeschützt: -wal-Datei nicht geladen`,readOnlyNoPk:`Schreibgeschützt: Tabelle hat keinen Primärschlüssel`,commitTitle:`{{count}} Änderung(en) an {{table}} übernehmen?`,commitDescription:`Die folgenden Anweisungen werden ausgeführt.`,commitConfirm:`Übernehmen`,rowPrefix:`Zeile {{row}}:`,cancelled:`abgebrochen`,commitFailed:`Übernehmen fehlgeschlagen: {{message}}`,executedInTransaction:`{{count}} Änderung(en) innerhalb der offenen Transaktion ausgeführt — klicken Sie in der Symbolleiste auf „Commit“, um sie dauerhaft zu machen (Neuladen rollt sie zurück)`,committed:`{{count}} Änderung(en) an {{table}} übernommen`,noData:`Keine Daten zum Anzeigen.`,commit:`Übernehmen`,discard:`Verwerfen`,addRow:`Zeile hinzufügen`,removeNewRow:`Diese neue Zeile verwerfen`,addRowForm:`Per Formular hinzufügen`,addRowFormHint:`Formular mit einem Feld je Spalte öffnen (als INSERT committet)`,editRowForm:`Diese Zeile im Formular bearbeiten`,addRowHint:`Neue Zeile hinzufügen (wird als INSERT übernommen)`,delete:`Löschen`,deleteCount:`Löschen ({{count}})`,deleteHint:`Ausgewählte Zeilen löschen (wird als DELETE übernommen). Wählen Sie Zeilen über die Zeilennummern-Spalte aus.`,field:`Feld`,searchPlaceholder:`Suchen...`,orderBy:`Sortieren nach`,none:`Keine`,refresh:`Aktualisieren`,dismiss:`Schließen`,clearSelection:`Auswahl aufheben`,columns:`Spalten`,showAllColumns:`Alle anzeigen`,hideAllColumns:`Alle ausblenden`,resetWidths:`Breiten zurücksetzen`,selectAll:`Alle Zeilen auswählen`,emptyTable:`Diese Tabelle enthält keine Zeilen.`,noRows:`Keine Zeilen zurückgegeben.`,addARow:`Zeile hinzufügen`,markedForDeletion:`Zum Löschen markiert — klicken, um wiederherzustellen`,newRow:`Neue Zeile`,clickToSelect:`Klicken zum Auswählen; Shift/Ctrl für Mehrfachauswahl`,rows:`Zeilen: {{count}}`,rowsWithNew:`Zeilen: {{count}} (+{{added}})`,sortedBy:`Sortiert nach: {{column}} {{direction}}`,pageRange:`Zeilen {{from}}–{{to}}`,prevPage:`Vorherige Seite`,nextPage:`Nächste Seite`,pagingBlocked:`Änderungen vor dem Seitenwechsel übernehmen oder verwerfen`,selected:`{{count}} ausgewählt`,cellsModified:`{{count}} Zelle(n) geändert`,newCount:`{{count}} neu`,toDelete:`{{count}} zu löschen`,searchMode:`Vergleichsart`,contains:`enthält`,equals:`gleich`,followLink:`{{table}} öffnen, wo {{column}} = Wert`,linkColumn:`„{{column}}“ mit anderer Tabelle verknüpfen…`,editLink:`Verknüpfung von „{{column}}“ bearbeiten…`,removeLink:`Verknüpfung entfernen`,copyValue:`Wert kopieren`,filterByValue:`Filter: {{column}} = dieser Wert`,clearFilter:`Filter aufheben`,copyColumnName:`Spaltennamen kopieren`,editCell:`Zelle bearbeiten`,setNull:`Auf NULL setzen`,setEmpty:`Auf leeren String setzen`,restoreRow:`Zeile wiederherstellen`,hideColumn:`Spalte „{{column}}“ ausblenden`,copyRowsTsv_one:`Zeile als TSV kopieren (mit Kopfzeile)`,copyRowsTsv_other:`{{count}} Zeilen als TSV kopieren (mit Kopfzeile)`,copyRowsCsv_one:`Zeile als CSV kopieren`,copyRowsCsv_other:`{{count}} Zeilen als CSV kopieren`,copyRowsJson_one:`Zeile als JSON kopieren`,copyRowsJson_other:`{{count}} Zeilen als JSON kopieren`,copyRowsInsert_one:`Zeile als INSERT kopieren`,copyRowsInsert_other:`{{count}} Zeilen als INSERT kopieren`,deleteRowsPending_one:`Zeile löschen (bis Commit ausstehend)`,deleteRowsPending_other:`{{count}} Zeilen löschen (bis Commit ausstehend)`,sendRowsToScratchpad_one:`Zeile ins Scratchpad senden`,sendRowsToScratchpad_other:`{{count}} Zeilen ins Scratchpad senden`,sendAllToScratchpad:`Alle {{count}} geladenen Zeilen ins Scratchpad senden`,sentToScratchpad:`{{count}} Zeilen in die Scratchpad-Tabelle {{table}} kopiert.`,changesSince:`Seit letztem Laden: {{changed}} geändert · {{added}} neu · {{gone}} weg`,changesToggle:`Hervorhebung der Änderungen seit dem letzten Laden umschalten`,changesDismiss:`Diese Änderungen verwerfen`,previousValue:`Vorheriger Wert: {{value}}`},link:{title:`Spalte mit anderer Tabelle verknüpfen`,source:`Spalte`,hint:`Die Werte dieser Spalte werden zu Links: Ein Klick öffnet die Zieltabelle gefiltert auf die passenden Zeilen. Echte Fremdschlüssel werden automatisch verknüpft.`,targetDatabase:`Zieldatenbank`,targetTable:`Zieltabelle`,targetColumn:`Zielspalte`,pickTable:`Tabelle wählen`,pickColumn:`Spalte wählen`,remove:`Verknüpfung entfernen`,cancel:`Abbrechen`,save:`Verknüpfung speichern`,targetConnection:`Zielverbindung`,targetNotConnected:`Die verknüpfte Verbindung ist nicht geöffnet. Bitte zuerst verbinden.`}},p={defaultDescription:`Diese Aktion kann nicht rückgängig gemacht werden.`,typeToConfirm:`Geben Sie <name/> zur Bestätigung ein`,cancel:`Abbrechen`,confirm:`Bestätigen`,ok:`OK`},m={dialog:{createTitle:`Tabelle erstellen`,alterTitle:`Tabelle ändern`,duplicateTitle:`Tabellenstruktur duplizieren`,create:`Erstellen`,alter:`Ändern`,cancel:`Abbrechen`,tableName:`Tabellenname`,tableNamePlaceholder:`Tabellennamen eingeben...`,loading:`Tabellenschema wird geladen...`,tabSchema:`Schema`,tabIndexes:`Indizes`,tabProperties:`Eigenschaften`},schema:{colField:`Feldname`,colType:`Datentyp`,colLength:`Länge`,colDefault:`Standard`,colPk:`PK`,colNotNull:`Not Null`,colUnsigned:`Unsigned`,colAutoIncrement:`Auto Incr`,colZerofill:`Zerofill`,colComment:`Kommentar`,empty:`Keine Spalten definiert. Klicken Sie auf „Spalte hinzufügen“, um eine anzulegen.`,add:`Spalte hinzufügen`,remove:`Spalte entfernen`},indexes:{colName:`Indexname`,colType:`Indextyp`,colColumns:`Spalten`,empty:`Keine Indizes definiert. Klicken Sie auf „Index hinzufügen“, um einen anzulegen.`,add:`Index hinzufügen`,remove:`Index entfernen`},index:{addTitle:`Index hinzufügen`,editTitle:`Index bearbeiten`,name:`Indexname`,namePlaceholder:`Indexnamen eingeben`,type:`Indextyp`,columns:`Spalten`,noColumns:`Keine Spalten verfügbar. Definieren Sie zuerst Spalten im Tab „Schema“.`,unnamed:`(unbenannt)`,cancel:`Abbrechen`,ok:`OK`},properties:{engine:`Engine`,charset:`Zeichensatz`,collation:`Kollation`,autoIncrement:`Auto Increment`,autoIncrementPlaceholder:`Standard`,comment:`Kommentar`},info:{engine:`Engine`,version:`Version`,rowFormat:`Zeilenformat`,rows:`Zeilen`,avgRowLength:`Ø Zeilenlänge`,dataLength:`Datengröße`,createTime:`Erstellt am`,updateTime:`Aktualisiert am`,collation:`Kollation`,comment:`Kommentar`},copy:{title:`Tabelle kopieren`,source:`Quelle`,targetConnection:`Zielverbindung`,targetDatabase:`Zieldatenbank`,targetTable:`Name der Zieltabelle`,what:`Kopieren`,structureAndData:`Struktur & Daten`,structureOnly:`Nur Struktur`,ifExists:`Wenn die Zieltabelle existiert`,abort:`Abbrechen (Standard)`,dropAndRecreate:`Löschen und neu anlegen (Name muss erneut eingegeben werden)`,preview:`CREATE TABLE auf dem Ziel (bearbeitbar)`,crossEngineHint:`Das Ziel ist {{engine}}: Typen unten prüfen, MySQL-spezifische Attribute wurden entfernt.`,readOnly:`schreibgeschützt`,loading:`Lädt…`,progressCreate:`Tabelle wird angelegt…`,progressCount:`Zeilen werden gezählt…`,progressRows:`{{copied}} von {{total}} Zeilen kopiert`,progressDone:`Fertig`,doneTitle:`Tabelle kopiert`,doneRows:`{{count}} Zeilen nach {{table}} kopiert.`,doneStructure:`Struktur von {{table}} angelegt.`,noColumns:`Die Quelltabelle hat keine Spalten.`,exists:`Die Tabelle {{table}} existiert im Ziel bereits. Anderen Namen wählen oder „Löschen und neu anlegen“.`,dropTitle:`Vorhandene Tabelle {{table}} löschen?`,dropDescription:`Die Zieltabelle und alle ihre Zeilen werden vor dem Kopieren gelöscht. Das lässt sich nicht rückgängig machen.`,dropConfirm:`Löschen und kopieren`,cancelled:`Kopieren abgebrochen.`,stop:`Stopp`,cancel:`Abbrechen`,copy:`Kopieren`}},h={copy:{title:`Datenbank kopieren`,source:`Quelldatenbank`,target:`Name der Zieldatenbank`,targetPlaceholder:`Namen der Zieldatenbank eingeben`,options:`Optionen`,structureAndData:`Struktur und Daten`,structureOnly:`Nur Struktur`,cancel:`Abbrechen`,copy:`Kopieren`},diff:{title:`Schemas vergleichen`,source:`Quelle`,target:`Ziel`,pickConnection:`Verbindung`,pickDatabase:`Datenbank`,crossEngineHint:`Unterschiedliche Engines: Typnamen unterscheiden sich je Dialekt, daher zeigen die meisten Spalten eine Typänderung.`,sameSide:`Quelle und Ziel sind dieselbe Datenbank.`,summary:`{{changed}} geändert, {{missingTarget}} fehlen im Ziel, {{missingSource}} nur im Ziel, {{identical}} identisch`,showIdentical:`Identische Tabellen anzeigen`,identicalAll:`Die Tabellen sind identisch.`,column:`Spalte`,index:`Index`,object:`Objekt`,selectTable:`Tabelle auswählen, um Unterschiede zu sehen.`,missingInTarget:`{{table}} existiert im Ziel nicht; das Skript legt sie an.`,missingInSource:`{{table}} existiert nur im Ziel; das Skript löscht sie (auskommentiert, sofern DROPs nicht eingeschlossen sind).`,includeDrops:`DROP-Anweisungen als ausführbares SQL einschließen (Standard: auskommentiert)`,tabTitle:`Sync {{database}}`,close:`Schließen`,compare:`Vergleichen`,comparing:`Vergleicht…`,openScript:`Skript im Editor öffnen`,noDefinition:`Keine CREATE-Anweisung verfügbar`},create:{title:`Datenbank erstellen`,name:`Datenbankname`,namePlaceholder:`Datenbanknamen eingeben`,charset:`Zeichensatz`,collation:`Kollation`,cancel:`Abbrechen`,create:`Erstellen`},csv:{title:`Als CSV herunterladen`,target:`Ziel`,targetQueryResult:`Aktuelles Abfrageergebnis`,targetTableData:`Tabellendaten`,tableName:`Tabellenname`,tableNamePlaceholder:`Tabellennamen eingeben`,delimiter:`Trennzeichen`,delimiterComma:`Komma (,)`,delimiterTab:`Tabulator (\\t)`,delimiterSemicolon:`Semikolon (;)`,delimiterPipe:`Pipe (|)`,includeHeaders:`Kopfzeile einschließen`,cancel:`Abbrechen`,download:`Herunterladen`,downloading:`Wird heruntergeladen...`,progress:`{{loaded}} von {{total}} Zeilen geschrieben`,progressUnknown:`{{loaded}} Zeilen geschrieben`,stop:`Stopp`,done:`{{count}} Zeilen von {{table}} als CSV exportiert.`,database:`Datenbank`,databasePlaceholder:`Datenbank wählen`},html:{title:`Schema als HTML`,database:`Datenbank`,selectDatabase:`Datenbank auswählen`,tables:`Einzuschließende Tabellen`,selectAll:`Alle auswählen`,deselectAll:`Auswahl aufheben`,noTables:`Keine Tabellen verfügbar.`,include:`Einschließen`,includeColumns:`Spalten`,includeIndexes:`Indizes`,includeProperties:`Eigenschaften`,cancel:`Abbrechen`,generate:`Generieren`,generating:`Wird generiert...`,sectionColumns:`Spalten`,sectionIndexes:`Indizes`,sectionProperties:`Eigenschaften`,docTitle:`Schema: {{database}}`,heading:`Datenbank: {{database}}`,summary:`Tabellen: {{count}} | Generiert: {{date}}`,footer:`Generiert von Planche 2026`},dataDiff:{title:`Daten vergleichen`,pickTable:`Tabelle`,hint:`Zeilen werden über den Primärschlüssel der Quelltabelle zugeordnet und als Text verglichen. Pro Seite werden bis zu {{cap}} Zeilen geladen; große Tabellen vorher per Filter eingrenzen.`,sameSide:`Quelle und Ziel sind dieselbe Tabelle.`,noPrimaryKey:`{{table}} hat keinen Primärschlüssel; ohne ihn lassen sich Zeilen nicht zuordnen.`,keyMissingInTarget:`Der Zieltabelle fehlen die Schlüsselspalten: {{columns}}`,summary:`Schlüssel: {{key}} – {{added}} fehlen im Ziel, {{changed}} unterschiedlich, {{removed}} nur im Ziel, {{identical}} identisch`,capped:`Nur die ersten {{cap}} Zeilen jeder Seite wurden verglichen.`,ignoredColumns:`Ignorierte Spalten (nur auf einer Seite): {{columns}}`,added_one:`{{count}} fehlt im Ziel`,added_other:`{{count}} fehlen im Ziel`,changed_one:`{{count}} unterschiedlich`,changed_other:`{{count}} unterschiedlich`,removed_one:`{{count}} nur im Ziel`,removed_other:`{{count}} nur im Ziel`,none:`Nichts in dieser Gruppe.`,more:`… {{count}} weitere nicht aufgeführt`,includeDeletes:`DELETE-Anweisungen als ausführbares SQL einschließen (Standard: auskommentiert)`,tabTitle:`Daten-Sync {{table}}`,loading:`Zeilen werden geladen – Quelle: {{source}}, Ziel: {{target}}`}},g={manager:{title:`Benutzerverwaltung`,addUser:`Benutzer hinzufügen`,removeUser:`Benutzer entfernen`,noUsers:`Keine Benutzer geladen`,grantScope:`Berechtigungsbereich`,apply:`Anwenden`,close:`Schließen`,removed:`Benutzer '{{user}}'@'{{host}}' entfernt`,selectUserFirst:`Bitte wählen Sie zuerst einen Benutzer aus`,applied:`Änderungen erfolgreich angewendet`},add:{title:`Benutzer hinzufügen`,username:`Benutzername`,usernamePlaceholder:`Benutzernamen eingeben`,host:`Host`,password:`Passwort`,passwordPlaceholder:`Passwort eingeben`,confirmPassword:`Passwort bestätigen`,confirmPasswordPlaceholder:`Passwort bestätigen`,plugin:`Plugin`,cancel:`Abbrechen`,add:`Hinzufügen`,usernameRequired:`Benutzername ist erforderlich`,passwordMismatch:`Die Passwörter stimmen nicht überein`,added:`Benutzer '{{user}}'@'{{host}}' hinzugefügt`},privileges:{globalTitle:`Globale Berechtigungen`,databaseTitle:`Datenbankberechtigungen`,tableTitle:`Tabellenberechtigungen`,checkAll:`Alle auswählen`,uncheckAll:`Alle abwählen`,categoryData:`Daten`,categoryStructure:`Struktur`,categoryAdministration:`Administration`},grantTree:{globalPrivileges:`Globale Berechtigungen`}},_={close:`Schließen`,noActiveConnection:`Keine aktive Verbindung`,variableName:`Variablenname`,value:`Wert`,scope:{session:`Session`,global:`Global`},findReplace:{findPlaceholder:`Suchen`,replacePlaceholder:`Ersetzen`,found:`{{count}} gefunden`,noResults:`Keine Treffer`,previous:`Zurück`,next:`Weiter`,close:`Schließen`,replace:`Ersetzen`,all:`Alle`,caseSensitive:`Groß-/Kleinschreibung`,regex:`Regex`,wholeWord:`Ganzes Wort`},flush:{title:`Flush`,executed:`Ausgeführt: {{command}}`,executeError:`Fehler beim Ausführen von {{command}}: {{message}}`},localHistory:{title:`Lokaler Verlauf`,description:`Versionen dieses Tabs, die vor jeder Ausführung und vor dem Überschreiben durch eine Vorlage erfasst wurden.`,empty:`Noch kein Verlauf für diesen Tab.`,restored:`Editorinhalt aus dem lokalen Verlauf wiederhergestellt`,restore:`Diese Version wiederherstellen`,chars:`{{count}} Zeichen`,reason:{execute:`vor Ausführung`,replaced:`vor Überschreiben`,restore:`vor Wiederherstellung`}},processList:{title:`Prozessliste`,refresh:`Aktualisieren`,autoRefresh:`Automatisch aktualisieren`,empty:`Keine Prozesse vorhanden`,kill:`Beenden`,killProcess:`Prozess beenden`,selectToKill:`Bitte wählen Sie einen zu beendenden Prozess aus`,killed:`Prozess {{id}} wurde beendet`,killError:`Fehler beim Beenden des Prozesses: {{message}}`,loadError:`Fehler beim Laden der Prozessliste: {{message}}`,updatedAt:`aktualisiert {{time}}`,filterPlaceholder:`Nach Benutzer, Host, DB, SQL filtern...`,hideIdle:`Inaktive ausblenden`,noMatch:`Keine Prozesse entsprechen dem Filter`,self:`ich`,selfHint:`Dies ist die eigene Sitzung von Planche`,statementOf:`Anweisung von #{{id}}`,noStatement:`Keine Anweisung`,copy:`Kopieren`,copied:`Kopiert`,killConfirmTitle:`Prozess {{id}} beenden?`,killConfirmDescription:`Die Sitzung von {{user}}@{{host}} wird beendet und die laufende Anweisung abgebrochen. Eine offene Transaktion wird zurückgerollt.`,stats:{total:`Gesamt`,active:`Aktiv`,idle:`Inaktiv`,longest:`Längste Laufzeit`},columns:{id:`Id`,user:`Benutzer`,host:`Host`,db:`db`,command:`Befehl`,time:`Zeit`,state:`Zustand`,info:`Info`,action:`Aktion`}},status:{title:`Serverstatus`,filterPlaceholder:`Statusvariablen filtern...`,empty:`Keine Statusvariablen vorhanden`,loadError:`Fehler beim Laden des Status: {{message}}`},variables:{title:`Servervariablen`,filterPlaceholder:`Variablen filtern...`,empty:`Keine Variablen vorhanden`,loadError:`Fehler beim Laden der Variablen: {{message}}`}},v={empty:{title:`Öffnen Sie eine Prisma-Schemadatei (.prisma), um das ERD anzuzeigen`,description:`Modelle, Enums und Relationen werden automatisch analysiert`,openFile:`.prisma-Datei öffnen`,dropHint:`oder ziehen Sie eine Datei in diesen Bereich`},entity:{enumBadge:`ENUM`,modelBadge:`MODEL`,columns:{value:`Wert`,comment:`Kommentar`,type:`Typ`,column:`Spalte`},linkBadge:`LINK`,externalTitle:`Verknüpfte Tabelle auf {{location}} (Spaltenverknüpfung, kein echter Fremdschlüssel)`,nullable:`Spalte erlaubt NULL`},toolbar:{refresh:`Aktualisieren`,zoomIn:`Vergrößern`,zoomOut:`Verkleinern`,resetView:`Ansicht zurücksetzen`,center:`Zentrieren`,fitAll:`Alles einpassen`,spreadAll:`Überlappungen lösen`,resetLayout:`Layout zurücksetzen`,legendOneToMany:`1:N (FK)`,tables:`Tabellen:`,relations:`Relationen:`,columns:`Spalten:`},viewer:{noServerConnection:`Keine aktive Serververbindung`,loading:`Schema wird aus {{database}} geladen...`,loadFailed:`ERD konnte nicht geladen werden`,noDatabase:`Keine Datenbank ausgewählt.`,selectDatabaseHint:`Wählen Sie im Schemabaum eine Datenbank aus und öffnen Sie dann „ERD anzeigen“.`}},y={runAnyway:`Trotzdem ausführen`,query:{rowsReturned:`{{count}} Zeile(n) zurückgegeben`,rowsAffected:`{{count}} Zeile(n) betroffen`,rowsReturnedLimited:`{{count}} Zeile(n) zurückgegeben (begrenzt auf {{limit}}; fügen Sie LIMIT hinzu, um mehr abzurufen)`,notConnected:`Nicht verbunden`,fileNotOpen:`Die SQLite-Datei ist noch nicht geöffnet — klicken Sie oben auf „Datei erneut öffnen“, um den Zugriff erneut zu gewähren.`,failed:`Abfrage fehlgeschlagen`,nothingToExecute:`Nichts auszuführen`},destructive:{title_one:`Destruktive Anweisung ausführen?`,title_other:`{{count}} destruktive Anweisungen ausführen?`,description:`Folgendes wird Daten dauerhaft ändern oder löschen. Dies kann nicht rückgängig gemacht werden.`,unknownTarget:`(unbekannt)`,deleteAll:`DELETE aller Zeilen aus {{target}}`,updateAll:`UPDATE aller Zeilen in {{target}}`,alterDrop:`DROP COLUMN/PARTITION auf {{target}}`},readOnly:{refused:`Die Verbindung „{{label}}“ ist schreibgeschützt. {{count}} Anweisung(en) würde(n) Daten oder Schema ändern.`,title:`„{{label}}“ ist schreibgeschützt`,description:`Diese Anweisungen ändern Daten oder Schema. Trotzdem auf dieser Verbindung ausführen?`},transaction:{startFailed:`Transaktion konnte nicht gestartet werden`,started:`Transaktion gestartet — Commit oder Rollback, wenn Sie fertig sind`,implicitCommit:`{{kind}} hat ein implizites COMMIT der offenen Transaktion ausgelöst`,committed:`Transaktion bestätigt (Commit)`,rolledBack:`Transaktion zurückgerollt (Rollback)`,commandFailed:`{{name}} fehlgeschlagen`,commandFailedWith:`{{name}} fehlgeschlagen: {{message}}`},save:{notBrowserSqlite:`Keine SQLite-Verbindung im Browser.`,inMemory:`In-Memory-Datenbank: Sie kann nur als Download exportiert werden.`,noFileSystemAccess:`Dieser Browser hat keine File System Access API (nur Chrome/Edge): Die Datenbank wird als Download exportiert, statt direkt geschrieben zu werden.`,noWritableHandle:`Die Datei wurde ohne beschreibbares Handle geöffnet: Sie wird als Download exportiert.`},agent:{devProxyUrl:`{{url}} (über Dev-Proxy)`,notPlanche:`Es hat etwas geantwortet, aber es ist kein Planche-Agent`,unreachable:"Planche-Agent unter {{url}} nicht erreichbar — führen Sie `npx planche` aus ({{message}})",httpError:`HTTP-Fehler: {{status}} {{statusText}}`,emptyResponse:`Der Tunneling-Server hat eine leere Antwort zurückgegeben`,reconnected:`Verbindung zu {{name}} wiederhergestellt — der Agent hatte sie verworfen (Neustart oder Leerlauf-Timeout).`},sample:{profileName:`Beispiel-Shop (im Browser)`,downloadFailed:`Die Beispieldatenbank konnte nicht heruntergeladen werden ({{status}})`,tabTitle:`Abfrage 1`},sqliteFile:{tooSmall:`Die Datei ist zu klein, um eine SQLite-Datenbank zu sein.`,notSqlite:`Keine SQLite-Datenbank (oder eine verschlüsselte, z. B. SQLCipher). Der 16-Byte-Header lautet nicht „SQLite format 3“.`,badPageSize:`Beschädigter SQLite-Header: ungültige Seitengröße {{size}}.`,unreadable:`SQLite konnte die Datei nicht lesen: {{message}}`,pickerDescription:`SQLite-Datenbank`,walNotLoaded:`Diese Datenbank ist im WAL-Modus und ihre -wal-Datei wurde nicht geladen. Laden Sie sie oder bestätigen Sie im Banner, dass keine -wal-Datei existiert, bevor Sie speichern.`,changedOnDisk:`{{name}} wurde nach dem Laden auf dem Datenträger geändert (ein anderes Programm hat hineingeschrieben). Speichern würde diese Änderungen überschreiben — öffnen Sie die Datei erneut und wiederholen Sie Ihre Änderungen, oder verwenden Sie den Tunneling-Server.`,walHasChanges:`{{name}}-wal enthält neue Änderungen; laden Sie sie vor dem Speichern.`,walChangedOnDisk:`{{name}}-wal wurde nach dem Laden von einem anderen Programm geschrieben; öffnen Sie die Datei vor dem Speichern erneut.`,writeDenied:`Schreibzugriff auf {{name}} wurde nicht gewährt. Erlauben Sie ihn in der Browserabfrage oder exportieren Sie stattdessen als Download.`},environment:{none:`Keine`,green:`Grün (Entwicklung)`,blue:`Blau`,yellow:`Gelb (Staging)`,orange:`Orange`,red:`Rot (Produktion)`,purple:`Lila`},scratchpad:{profileName:`Scratchpad`,namePromptTitle:`Name der Scratchpad-Tabelle`,namePromptDescription:`Im Scratchpad gibt es bereits eine Tabelle {{table}}. Wählen Sie einen anderen Namen.`,nameTaken:`Tabelle {{table}} existiert bereits.`},federated:{pulling:`Hole {{table}} von {{connection}}…`,capped:`{{table}}: nur die ersten {{limit}} Zeilen wurden geholt.`,templateLine1:`Eine Tabelle einer offenen Verbindung als "Verbindungsname".database.table referenzieren; sie wird vor der Ausführung in dieses Scratchpad kopiert.`,templateLine2:`Tabellen sind auf {{limit}} Zeilen begrenzt. Die Abfrage selbst läuft in SQLite (in Ihrem Browser).`,templateConnections:`Offene Verbindungen: {{names}}`,templateNone:`Noch keine andere Verbindung offen. Verbinden Sie eine und referenzieren Sie sie hier.`,done:`{{rows}} Zeilen aus {{tables}} entfernten Tabellen ins Scratchpad geholt.`,pullingProgress:`Hole {{table}} von {{connection}}: {{loaded}} / {{total}} Zeilen…`},paged:{noColumns:`{{table}} hat keine Spalten.`,cancelled:`Abgebrochen.`}},b={title:`Nutzungsbedingungen`,version:`Version {{version}}`,englishOnly:`Die Bedingungen liegen auf Englisch vor. Die Zusammenfassung auf dem Startbildschirm ist in Ihrer Sprache verfügbar.`},x={title:`{{kind}} würde {{count}} Zeilen betreffen`,titleUnknown:`{{kind}} – betroffene Zeilen unbekannt`,description:`Das sind die Zeilen, die die Anweisung jetzt berühren würde, per SELECT gelesen. Noch wurde nichts geschrieben.`,previewFailed:`Die Vorschau-Abfrage ist fehlgeschlagen: {{error}}
2
+ Sie können die Anweisung trotzdem ausführen.`,noRows:`Keine Zeile passt – die Anweisung würde nichts ändern.`,truncated:`Die ersten {{shown}} von {{count}} Zeilen werden angezeigt.`,previewQuery:`Vorschau-Abfrage`,run:`{{kind}} ausführen ({{count}} Zeilen)`,runAnyway:`Trotzdem ausführen`},S={badge:`PRO`,tooltip:`Ab Planche 1.0 ist dafür eine Pro-Lizenz nötig. In 0.x kostenlos — und jede 0.x-Version bleibt dauerhaft kostenlos.`,noticeTitle:`Pro-Funktionen`,notice:`Mit PRO markierte Funktionen erfordern ab Planche 1.0 eine Pro-Lizenz. Heute sind sie uneingeschränkt nutzbar, und Ihre vorhandenen 0.x-Versionen bleiben dauerhaft kostenlos.`},C={npxNote:`Benötigt Node.js 22 oder neuer. Es wird nichts dauerhaft installiert – npx führt den Agenten direkt aus der npm-Registry aus.`,installNote:`Kein Node.js nötig. Die Installation liegt ohne Administratorrechte in Ihrem Home-Verzeichnis; danach startet der Befehl planche ihn jederzeit.`},w={app:e,language:t,settings:n,menu:r,about:i,connection:a,toolbar:o,footer:s,palette:c,welcome:l,schema:u,query:d,result:f,confirm:p,table:m,database:h,user:g,command:_,erd:v,services:y,terms:b,dryRun:x,pro:S,install:C};export{i as about,e as app,_ as command,p as confirm,a as connection,h as database,w as default,x as dryRun,v as erd,s as footer,C as install,t as language,r as menu,c as palette,S as pro,d as query,f as result,u as schema,y as services,n as settings,m as table,b as terms,o as toolbar,g as user,l as welcome};
@@ -1 +1 @@
1
- import{t as e}from"./connection-store-CAPTzFtT.js";import{r as t}from"./dbms-Bsjvyvsp.js";function n(n){let r=e.getState().activeConnections.find(e=>e.id===n);return t(r)}function r(n){let r=e.getState().activeConnections.find(e=>e.serverConnectionId===n);return t(r)}function i(){return n(e.getState().activeConnectionId)}export{n,r,i as t};
1
+ import{t as e}from"./connection-store-DjSajhjh.js";import{r as t}from"./dbms-CSyCOszD.js";function n(n){let r=e.getState().activeConnections.find(e=>e.id===n);return t(r)}function r(n){let r=e.getState().activeConnections.find(e=>e.serverConnectionId===n);return t(r)}function i(){return n(e.getState().activeConnectionId)}export{n,r,i as t};