planche 0.7.16 → 0.7.18
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.
- package/app/assets/{AboutDialog-CnvspLjT.js → AboutDialog-BaQAZjtT.js} +1 -1
- package/app/assets/ConnectDialog-BmJvDi1P.js +1 -0
- package/app/assets/{CopyDatabaseDialog-DoyT3Cud.js → CopyDatabaseDialog-BEM-56Og.js} +1 -1
- package/app/assets/{CopyTableDialog-CE32sy8Y.js → CopyTableDialog-C2r7l2Ck.js} +1 -1
- package/app/assets/{CreateDatabaseDialog-g7Ex6Ira.js → CreateDatabaseDialog-CZhIpgiO.js} +1 -1
- package/app/assets/{CreateSchemaDialog-CS_3p1YF.js → CreateSchemaDialog-CNq4nZum.js} +1 -1
- package/app/assets/{DataDiffDialog-eK_rqQqW.js → DataDiffDialog-mUg2rIWn.js} +1 -1
- package/app/assets/{DownloadToCSVDialog-BZMBDq9a.js → DownloadToCSVDialog-BC6Sq8Ce.js} +1 -1
- package/app/assets/{EditSchemaDialog-TPU9HsbU.js → EditSchemaDialog-B0dCI4Lb.js} +1 -1
- package/app/assets/FindReplaceDialog-DXJp2TN6.js +1 -0
- package/app/assets/{FlushDialog-SyF5aOC9.js → FlushDialog-BX0F3dJQ.js} +1 -1
- package/app/assets/GroupByDialog-BQPTetJF.js +1 -0
- package/app/assets/{LinkColumnDialog-CroawG1F.js → LinkColumnDialog-BEuhj8o8.js} +1 -1
- package/app/assets/LocalHistoryDialog-BGF91HKS.js +1 -0
- package/app/assets/ProcessListDialog-VezdyrHo.js +1 -0
- package/app/assets/QuickCommandPalette-BseiwcpU.js +1 -0
- package/app/assets/{RowFormDialog-DICM-X2S.js → RowFormDialog-XRuG3rMt.js} +2 -2
- package/app/assets/{SafetySettingsDialog-dM0fuFsY.js → SafetySettingsDialog-Zh_a4nml.js} +1 -1
- package/app/assets/{SchemaDiffDialog-CKV8hg4W.js → SchemaDiffDialog-BrnruiVP.js} +1 -1
- package/app/assets/{SchemaToHTMLDialog-2rZVoLkj.js → SchemaToHTMLDialog-DjZQwEbM.js} +1 -1
- package/app/assets/{StatusDialog-DDSLt40C.js → StatusDialog-a7NhoFvt.js} +1 -1
- package/app/assets/TermsDialog-B53To0oi.js +1 -0
- package/app/assets/{UserAddDialog-1faiXqe2.js → UserAddDialog-BBYoKeBv.js} +1 -1
- package/app/assets/{UserManagerDialog-BFTsCX59.js → UserManagerDialog-BPC_IoO6.js} +1 -1
- package/app/assets/{VariablesDialog-DjvvwrfV.js → VariablesDialog-CzHDGRpy.js} +1 -1
- package/app/assets/connection-store-N-ZwIkVg.js +1 -0
- package/app/assets/database-CpQt6YGv.js +1 -0
- package/app/assets/{dbms-B9Zk7nEm.js → dbms-BwnatOMe.js} +68 -65
- package/app/assets/de-Ci_btQN-.js +2 -0
- package/app/assets/dist-BAFbxkKh.js +1 -0
- package/app/assets/{editor-registry-C_yarsyY.js → editor-registry-DhF4Rf_I.js} +1 -1
- package/app/assets/{engine-C2ZJalx5.js → engine-CpwlM_Ww.js} +1 -1
- package/app/assets/fr-rLx93rAO.js +2 -0
- package/app/assets/hmr-singleton-DWC1xbJ4.js +1 -0
- package/app/assets/i18n-57fo5jb0.js +2 -0
- package/app/assets/ja-DkiQpTGb.js +2 -0
- package/app/assets/ko-DHI7mstP.js +2 -0
- package/app/assets/{main-DLYTmffu.js → main-BLydvBDF.js} +154 -154
- package/app/assets/main-DX7Tr5cg.css +2 -0
- package/app/assets/pro-usage-VxPxjJqt.js +1 -0
- package/app/assets/{query-execution-DMUlIoF2.js → query-execution-4-JHu9gp.js} +3 -3
- package/app/assets/{schema-nodes-XgnUaB2x.js → schema-nodes-MgIiKfpG.js} +1 -1
- package/app/assets/select-ibmUj7AE.js +1 -0
- package/app/assets/settings-store-WUA0-UcP.js +1 -0
- package/app/assets/{table-copy-6G1mhU8O.js → table-copy-C1ivtmj8.js} +1 -1
- package/app/assets/use-engine-B9GBHTL_.js +1 -0
- package/app/assets/zh-mgKu2Zwj.js +2 -0
- package/app/index.html +17 -17
- package/dist/index.js +68 -9
- package/package.json +1 -1
- package/app/assets/ConnectDialog-dYIs3EdM.js +0 -1
- package/app/assets/FindReplaceDialog-DQwlbxSb.js +0 -1
- package/app/assets/LocalHistoryDialog-D0hZ8QS5.js +0 -1
- package/app/assets/ProcessListDialog-BRAf5TE2.js +0 -1
- package/app/assets/QuickCommandPalette-Dh1fsO1J.js +0 -1
- package/app/assets/TermsDialog-BzlyiBiw.js +0 -1
- package/app/assets/app-storage-C_1RLCyI.js +0 -1
- package/app/assets/connection-store-DjSajhjh.js +0 -1
- package/app/assets/database-_lr1w6xK.js +0 -1
- package/app/assets/de-DNOmZt4L.js +0 -2
- package/app/assets/fr-Bs9HybVR.js +0 -2
- package/app/assets/hmr-singleton-Bit0Kfog.js +0 -1
- package/app/assets/i18n-XcmivDWI.js +0 -2
- package/app/assets/ja-DLbyFRJv.js +0 -2
- package/app/assets/ko-BOX3JDDY.js +0 -2
- package/app/assets/main-CKq8IRiX.css +0 -2
- package/app/assets/pro-usage-Die_FxwH.js +0 -1
- package/app/assets/query-store-Bz1pmp4E.js +0 -1
- package/app/assets/select-BMtc6vRo.js +0 -1
- package/app/assets/settings-store-CSRx4hwh.js +0 -1
- package/app/assets/use-engine-C_C2qpfD.js +0 -1
- package/app/assets/zh-Bc_dasqF.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as e,n as t,t as n,v as r}from"./ui-store-DfspmPOn.js";import{C as i,F as a,M as o,N as s,S as c,a as l,b as u,c as d,d as f,et as p,i as m,j as h,l as g,n as _,o as v,r as y,s as b,u as x,w as S,x as C,y as w}from"./main-DLYTmffu.js";import{l as T,m as E,t as D}from"./button--s6nUzD8.js";import{a as O,i as k,n as A,r as j,t as M}from"./select-BMtc6vRo.js";import{t as N}from"./connection-store-DjSajhjh.js";import{n as ee}from"./query-store-Bz1pmp4E.js";import{D as te,E as ne,M as P,P as F,S as re,d as I,g as ie,i as ae,j as L,l as R,r as oe,w as se}from"./database-_lr1w6xK.js";import{n as z,t as B}from"./dbms-B9Zk7nEm.js";import{a as ce,i as le,n as ue,o as de,t as fe}from"./dialog-CJoWJzRo.js";var V=r(e(),1),H=new Set([`postgres:`,`postgresql:`]);function U(e){let t=e.trim().replace(/^psql\s+(['"])?/,``).replace(/['"]$/,``);if(!/^postgres(ql)?:\/\//i.test(t))return null;let n;try{n=new URL(t)}catch{return null}if(!H.has(n.protocol.toLowerCase())||!n.hostname)return null;let r=e=>{try{return decodeURIComponent(e)}catch{return e}},i={host:n.hostname};n.port&&(i.port=Number(n.port)),n.username&&(i.user=r(n.username)),n.password&&(i.pass=r(n.password));let a=r(n.pathname.replace(/^\//,``));return a&&(i.database=a),i}var W=T(),G=[`utf8`,`utf8mb4`,`latin1`,`ascii`,`euckr`,`sjis`,`big5`],K={enabled:!1,host:``,port:22,user:``,auth:`key`};function q({label:e,htmlFor:t,children:n}){return(0,W.jsxs)(`div`,{className:`grid grid-cols-[120px_minmax(0,1fr)] items-center gap-2`,children:[(0,W.jsx)(g,{htmlFor:t,children:e}),n]})}function pe({value:e,onChange:t}){let{t:n}=E();function r(n,r){t({...e,[n]:r})}let i=e.dbms===`sqlite`,c=e.transport??`browser`,l=i&&c===`browser`,u=P.has(e.dbms),d=e.dbms===`d1`,p=e.dbms===`do`,m=B.find(t=>t.id===e.dbms)?.capabilities,h=e.ssh??K,[g,_]=(0,V.useState)(``),y=g.trim()===``?`empty`:U(g)?`applied`:`invalid`,S=e.dbms===`supabase`&&e.port===6543;function C(n){_(n);let r=U(n);r&&t({...e,host:r.host??e.host,port:r.port??B.find(t=>t.id===e.dbms)?.defaultPort??e.port,user:r.user??e.user,pass:r.pass??e.pass,database:r.database??e.database})}function w(n){t({...e,ssh:{...h,...n}})}async function T(e){e&&w({privateKey:await e.text(),privateKeyName:e.name})}return(0,W.jsxs)(`div`,{className:`flex flex-col gap-3 p-4`,children:[(0,W.jsx)(q,{label:n(`connection.form.hostName`),htmlFor:`conn-hostName`,children:(0,W.jsx)(x,{id:`conn-hostName`,placeholder:n(`connection.form.hostNamePlaceholder`),value:e.hostName,onChange:e=>r(`hostName`,e.target.value)})}),(0,W.jsx)(q,{label:n(`connection.form.dataSource`),children:(0,W.jsxs)(M,{value:e.dbms,onValueChange:n=>{let r=B.find(e=>e.id===n);if(!r)return;let i=r.id,a=P.has(i)||i===`d1`||i===`do`;_(``),t({...e,dbms:i,transactionMode:r.capabilities.transactions?e.transactionMode:`auto`,port:r.defaultPort??e.port,host:a&&e.host===`localhost`?``:!a&&e.host===``?`localhost`:e.host,user:a||u||d||p?b(i):e.user,devUrl:i===`do`?e.devUrl||`http://localhost:8787`:e.devUrl,database:e.database&&!a&&!u&&!d&&!p?e.database:v(i)??e.database})},children:[(0,W.jsx)(k,{id:`conn-dbms`,className:`w-full`,children:(0,W.jsx)(O,{})}),(0,W.jsx)(A,{children:B.map(e=>(0,W.jsx)(j,{value:e.id,children:(0,W.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(f,{dbms:e.id}),e.label]})},e.id))})]})}),u&&(0,W.jsx)(q,{label:n(`connection.form.connectionString`),htmlFor:`conn-uri`,children:(0,W.jsxs)(`div`,{className:`min-w-0`,children:[(0,W.jsx)(x,{id:`conn-uri`,type:`password`,autoComplete:`off`,spellCheck:!1,className:`font-mono text-xs`,placeholder:e.dbms===`neon`?`postgresql://neondb_owner:npg_…@ep-….neon.tech/neondb?sslmode=require`:`postgresql://postgres.[ref]:[password]@aws-0-….pooler.supabase.com:5432/postgres`,value:g,onChange:e=>C(e.target.value)}),(0,W.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed ${y===`invalid`?`text-destructive`:`text-muted-foreground`}`,children:n(y===`invalid`?`connection.form.connectionStringInvalid`:y===`applied`?`connection.form.connectionStringApplied`:e.dbms===`neon`?`connection.form.neonHint`:`connection.form.supabaseHint`)})]})}),i&&(0,W.jsxs)(q,{label:n(`connection.form.openVia`),children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,W.jsxs)(`label`,{className:`flex items-center gap-1.5 text-sm cursor-pointer`,children:[(0,W.jsx)(`input`,{type:`radio`,name:`transport`,value:`browser`,checked:c===`browser`,onChange:()=>r(`transport`,`browser`),className:`accent-primary`}),n(`connection.form.viaBrowser`)]}),(0,W.jsxs)(`label`,{className:`flex items-center gap-1.5 text-sm cursor-pointer`,children:[(0,W.jsx)(`input`,{type:`radio`,name:`transport`,value:`tunnel`,checked:c===`tunnel`,onChange:()=>r(`transport`,`tunnel`),className:`accent-primary`}),n(`connection.form.viaAgent`)]})]}),(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(c===`browser`?`connection.form.viaBrowserHint`:`connection.form.viaAgentHint`)})]}),l?(0,W.jsx)(q,{label:n(`connection.form.databaseFile`),children:(0,W.jsxs)(`div`,{className:`min-w-0 text-xs text-muted-foreground leading-relaxed`,children:[e.file?(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,W.jsx)(`span`,{className:`min-w-0 break-all text-foreground`,title:e.file,children:e.file}),(0,W.jsx)(D,{type:`button`,variant:`outline`,size:`sm`,className:`h-6 shrink-0 px-2 text-xs`,onClick:()=>{R(e.id),r(`file`,``)},children:n(`connection.form.changeFile`)})]}):(0,W.jsx)(`p`,{children:n(`connection.form.filePickerHint`)}),(0,W.jsx)(`p`,{className:`mt-1`,children:n(`connection.form.fileRememberedHint`)})]})}):null,!l&&(0,W.jsx)(q,{label:n(`connection.form.authToken`),htmlFor:`conn-authToken`,children:(0,W.jsx)(x,{id:`conn-authToken`,type:`password`,placeholder:n(`connection.form.authTokenPlaceholder`),value:e.authToken,onChange:e=>r(`authToken`,e.target.value.trim())})}),l?null:p?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(q,{label:n(`connection.form.doDevUrl`),htmlFor:`conn-do-url`,children:(0,W.jsx)(x,{id:`conn-do-url`,className:`font-mono text-xs`,spellCheck:!1,placeholder:`http://localhost:8787`,value:e.devUrl??``,onChange:e=>r(`devUrl`,e.target.value.trim())})}),(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.doHint`)}),(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.doLimitsHint`)})]}):d?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(q,{label:n(`connection.form.d1AccountId`),htmlFor:`conn-d1-account`,children:(0,W.jsx)(x,{id:`conn-d1-account`,className:`font-mono text-xs`,spellCheck:!1,placeholder:`023e105f4ecef8ad9ca31a8372d0c353`,value:e.accountId??``,onChange:e=>r(`accountId`,e.target.value.trim())})}),(0,W.jsx)(q,{label:n(`connection.form.d1DatabaseId`),htmlFor:`conn-d1-database`,children:(0,W.jsx)(x,{id:`conn-d1-database`,className:`font-mono text-xs`,spellCheck:!1,placeholder:`xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,value:e.databaseId??``,onChange:e=>r(`databaseId`,e.target.value.trim())})}),(0,W.jsx)(q,{label:n(`connection.form.d1ApiToken`),htmlFor:`conn-pass`,children:(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsx)(x,{id:`conn-pass`,type:`password`,value:e.pass,onChange:e=>r(`pass`,e.target.value.trim())}),(0,W.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs whitespace-nowrap cursor-pointer`,title:n(`connection.form.savePasswordHint`),children:[(0,W.jsx)(`input`,{type:`checkbox`,checked:e.savePassword??!0,onChange:e=>r(`savePassword`,e.target.checked)}),n(`connection.form.savePassword`)]})]})}),(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.d1Hint`)}),(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.d1LimitsHint`)})]}):i?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(q,{label:n(`connection.form.databaseFile`),htmlFor:`conn-file`,children:(0,W.jsx)(x,{id:`conn-file`,placeholder:n(`connection.form.filePathPlaceholder`),value:e.file??``,onChange:e=>r(`file`,e.target.value)})}),(0,W.jsx)(q,{label:n(`connection.form.createIfMissing`),htmlFor:`conn-create`,children:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`input`,{id:`conn-create`,type:`checkbox`,checked:e.createIfMissing??!1,onChange:e=>r(`createIfMissing`,e.target.checked),className:`size-4 accent-primary cursor-pointer`}),(0,W.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:n(`connection.form.createIfMissingHint`)})]})})]}):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(q,{label:n(`connection.form.host`),htmlFor:`conn-host`,children:(0,W.jsx)(x,{id:`conn-host`,placeholder:e.dbms===`neon`?`ep-….aws.neon.tech`:e.dbms===`supabase`?`aws-0-….pooler.supabase.com`:`localhost`,value:e.host,onChange:e=>r(`host`,e.target.value)})}),(0,W.jsx)(q,{label:n(`connection.form.port`),htmlFor:`conn-port`,children:(0,W.jsx)(x,{id:`conn-port`,type:`number`,value:e.port,onChange:t=>r(`port`,Number(t.target.value)||B.find(t=>t.id===e.dbms)?.defaultPort||3306)})}),S&&(0,W.jsx)(`p`,{className:`col-start-2 rounded-md border border-yellow-500/40 bg-yellow-500/10 px-2 py-1.5 text-xs leading-relaxed text-foreground`,children:n(`connection.form.supabasePoolerWarning`)}),(F(e.dbms)||e.dbms===`mssql`||e.dbms===`oracle`)&&(0,W.jsx)(q,{label:e.dbms===`oracle`?n(`connection.form.serviceName`):n(`connection.form.database`),htmlFor:`conn-database`,children:(0,W.jsx)(x,{id:`conn-database`,placeholder:v(e.dbms),value:e.database??``,onChange:e=>r(`database`,e.target.value.trim())})}),(0,W.jsx)(q,{label:n(`connection.form.user`),htmlFor:`conn-user`,children:(0,W.jsx)(x,{id:`conn-user`,placeholder:b(e.dbms),value:e.user,onChange:e=>r(`user`,e.target.value)})}),(0,W.jsx)(q,{label:n(`connection.form.password`),htmlFor:`conn-pass`,children:(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsx)(x,{id:`conn-pass`,type:`password`,value:e.pass,onChange:e=>r(`pass`,e.target.value)}),(0,W.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs whitespace-nowrap cursor-pointer`,title:n(`connection.form.savePasswordHint`),children:[(0,W.jsx)(`input`,{type:`checkbox`,checked:e.savePassword??!0,onChange:e=>r(`savePassword`,e.target.checked)}),n(`connection.form.savePassword`)]})]})}),u&&(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.managedTlsHint`)}),!u&&e.dbms!==`oracle`&&(0,W.jsx)(q,{label:n(`connection.form.tls`),children:(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4`,children:[(0,W.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs cursor-pointer`,children:[(0,W.jsx)(`input`,{type:`checkbox`,checked:e.ssl??!1,onChange:e=>r(`ssl`,e.target.checked),className:`size-4 accent-primary`}),n(`connection.form.tlsEnable`)]}),(0,W.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs cursor-pointer ${e.ssl?``:`opacity-50`}`,title:n(`connection.form.tlsVerifyHint`),children:[(0,W.jsx)(`input`,{type:`checkbox`,disabled:!e.ssl,checked:e.sslVerify??!1,onChange:e=>r(`sslVerify`,e.target.checked),className:`size-4 accent-primary`}),n(`connection.form.tlsVerify`)]})]})}),!u&&(0,W.jsx)(q,{label:n(`connection.form.charset`),children:(0,W.jsxs)(M,{value:e.charset,onValueChange:e=>r(`charset`,e),children:[(0,W.jsx)(k,{className:`w-full`,children:(0,W.jsx)(O,{})}),(0,W.jsx)(A,{children:G.map(e=>(0,W.jsx)(j,{value:e,children:e},e))})]})})]}),!i&&!u&&!d&&!p&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`div`,{className:`mt-1 flex items-center border-t pt-3 text-xs font-medium text-muted-foreground`,children:[n(`connection.form.ssh`),(0,W.jsx)(a,{className:`ml-2`})]}),(0,W.jsx)(q,{label:n(`connection.form.sshTunnel`),htmlFor:`conn-ssh`,children:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`input`,{id:`conn-ssh`,type:`checkbox`,checked:h.enabled,onChange:e=>w({enabled:e.target.checked}),className:`size-4 accent-primary cursor-pointer`}),(0,W.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:n(`connection.form.sshTunnelHint`)})]})}),h.enabled&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(q,{label:n(`connection.form.sshHost`),htmlFor:`conn-ssh-host`,children:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(x,{id:`conn-ssh-host`,placeholder:n(`connection.form.sshHostPlaceholder`),value:h.host,onChange:e=>w({host:e.target.value.trim()})}),(0,W.jsx)(x,{"aria-label":n(`connection.form.sshPort`),type:`number`,className:`w-24 shrink-0`,value:h.port,onChange:e=>w({port:Number(e.target.value)||22})})]})}),(0,W.jsx)(q,{label:n(`connection.form.sshUser`),htmlFor:`conn-ssh-user`,children:(0,W.jsx)(x,{id:`conn-ssh-user`,placeholder:n(`connection.form.sshUserPlaceholder`),value:h.user,onChange:e=>w({user:e.target.value.trim()})})}),(0,W.jsx)(q,{label:n(`connection.form.sshAuth`),children:(0,W.jsxs)(M,{value:h.auth,onValueChange:e=>w({auth:e}),children:[(0,W.jsx)(k,{className:`w-full`,children:(0,W.jsx)(O,{})}),(0,W.jsxs)(A,{children:[(0,W.jsx)(j,{value:`key`,children:n(`connection.form.sshAuthKey`)}),(0,W.jsx)(j,{value:`password`,children:n(`connection.form.sshAuthPassword`)}),(0,W.jsx)(j,{value:`agent`,children:n(`connection.form.sshAuthAgent`)})]})]})}),h.auth===`password`&&(0,W.jsx)(q,{label:n(`connection.form.sshPassword`),htmlFor:`conn-ssh-pass`,children:(0,W.jsx)(x,{id:`conn-ssh-pass`,type:`password`,value:h.password??``,onChange:e=>w({password:e.target.value})})}),h.auth===`key`&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(q,{label:n(`connection.form.sshKey`),htmlFor:`conn-ssh-key`,children:(0,W.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,W.jsx)(`input`,{id:`conn-ssh-key`,type:`file`,className:`hidden`,onChange:e=>{T(e.target.files?.[0]),e.target.value=``}}),(0,W.jsx)(D,{type:`button`,variant:`outline`,size:`sm`,className:`h-7 shrink-0 px-2 text-xs`,onClick:()=>document.getElementById(`conn-ssh-key`)?.click(),children:h.privateKey?n(`connection.form.changeFile`):n(`connection.form.sshKeyPick`)}),(0,W.jsx)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,title:h.privateKeyName,children:h.privateKey?h.privateKeyName||n(`connection.form.sshKeyLoaded`):n(`connection.form.sshKeyHint`)})]})}),(0,W.jsx)(q,{label:n(`connection.form.sshPassphrase`),htmlFor:`conn-ssh-passphrase`,children:(0,W.jsx)(x,{id:`conn-ssh-passphrase`,type:`password`,placeholder:n(`connection.form.sshPassphrasePlaceholder`),value:h.passphrase??``,onChange:e=>w({passphrase:e.target.value})})})]}),h.auth===`agent`&&(0,W.jsx)(`p`,{className:`col-start-2 text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.sshAuthAgentHint`)}),(0,W.jsx)(`p`,{className:`text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.sshTargetHint`)}),(0,W.jsx)(`p`,{className:`text-xs text-muted-foreground leading-relaxed`,children:n(`connection.form.sshSecretsHint`)})]})]}),(0,W.jsx)(q,{label:n(`connection.form.autoConnection`),htmlFor:`conn-auto`,children:(0,W.jsx)(`div`,{className:`flex items-center`,children:(0,W.jsx)(`input`,{id:`conn-auto`,type:`checkbox`,checked:e.autoConnection,onChange:e=>r(`autoConnection`,e.target.checked),className:`size-4 accent-primary cursor-pointer`})})}),(0,W.jsx)(`div`,{className:`mt-1 border-t pt-3 text-xs font-medium text-muted-foreground`,children:n(`connection.form.safety`)}),(0,W.jsx)(q,{label:n(`connection.form.environment`),children:(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[o.map(t=>{let n=(e.environmentColor??`none`)===t.id;return(0,W.jsx)(`button`,{type:`button`,title:s(t.id),"aria-label":s(t.id),"aria-pressed":n,onClick:()=>r(`environmentColor`,t.id),className:`size-6 rounded-full border-2 transition-transform ${n?`scale-110 border-foreground`:`border-transparent hover:scale-105`}`,style:{background:t.id===`none`?`repeating-linear-gradient(45deg, transparent, transparent 3px, var(--muted-foreground) 3px, var(--muted-foreground) 4px)`:t.hex}},t.id)}),(0,W.jsx)(`span`,{className:`ml-1 text-xs text-muted-foreground`,children:n(`connection.form.environmentHint`)})]})}),(0,W.jsx)(q,{label:n(`connection.form.readOnly`),htmlFor:`conn-readonly`,children:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`input`,{id:`conn-readonly`,type:`checkbox`,checked:e.readOnly??!1,onChange:e=>r(`readOnly`,e.target.checked),className:`size-4 accent-primary cursor-pointer`}),(0,W.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:n(`connection.form.readOnlyHint`)})]})}),m?.transactions!==!1&&(0,W.jsx)(q,{label:n(`connection.form.transactions`),children:(0,W.jsxs)(M,{value:e.transactionMode??`auto`,onValueChange:e=>r(`transactionMode`,e),children:[(0,W.jsx)(k,{className:`w-full`,children:(0,W.jsx)(O,{})}),(0,W.jsxs)(A,{children:[(0,W.jsx)(j,{value:`auto`,children:n(`connection.form.txAuto`)}),(0,W.jsx)(j,{value:`manual`,children:n(`connection.form.txManual`)})]})]})})]})}function J(){let{t:e}=E(),{activeDialog:r,closeDialog:a,showMessage:o}=t(),[s,g]=(0,V.useState)(!1),{savedConnections:v,addSavedConnection:b,updateSavedConnection:x,deleteSavedConnection:T,openConnection:O}=N(),k=n(`connect`)?.profileId,[A,j]=(0,V.useState)(()=>k??null),[M,P]=(0,V.useState)(()=>{let e=k?v.find(e=>e.id===k):void 0;return e?{...e}:null}),F=r===`connect`,[R,B]=(0,V.useState)(null),[H,U]=(0,V.useState)(null),G=d(e=>e.url),K=d(e=>e.token);(0,V.useEffect)(()=>{if(!F)return;let e=!1;return(async()=>{try{let t=await se();if(e||t.state!==`online`||!t.gateway){e||B(null);return}let n=await ne();e||(B({name:n.gateway,profiles:n.profiles}),U(null))}catch(t){e||U(t instanceof Error?t.message:String(t))}})(),()=>{e=!0}},[F,G,K]);function q(n){let r=v.find(e=>e.gatewayProfile===n.name);if(r){Y(r);return}let i=y(n);b(i),Y(i),t.getState().setFooterMessage(e(`connection.dialog.gatewayAdded`,{name:n.name}))}function J(e){e||(a(),j(null),P(null))}function Y(e){j(e.id),P({...e})}function me(e){P(e),x(e.id,e)}function he(){let e=l();b(e),j(e.id),P(e)}function ge(){A&&(T(A),j(null),P(null))}let[_e,X]=(0,V.useState)(!1),ve=ee(e=>e.addQueryTab);function Z(t){let n=N.getState().activeConnections.some(e=>e.id===t.id);if(O(t),n){re.getState().removeTree(t.id),a(),j(null),P(null);return}ve(t.id,{id:`tab-${Date.now()}`,title:e(`connection.dialog.firstQueryTab`),query:``,database:``,isExecuting:!1,results:[],error:null,executionTime:null}),a(),j(null),P(null)}async function ye(n){let r=await oe(n.id,{interactive:!0});if(!r)return;let i={...n,file:r.fileName,serverConnectionId:r.connectionId};x(n.id,{file:r.fileName}),Z(i),N.getState().setFileDetached(n.id,r.fileDetached),r.restoredUnsaved?t.getState().setFooterMessage(e(r.diskChanged?`connection.dialog.restoredUnsavedDiskChanged`:`connection.dialog.restoredUnsaved`,{file:r.fileName})):r.wal&&!r.walApplied?t.getState().setFooterMessage(e(`connection.dialog.walPending`,{file:r.fileName})):r.walApplied&&t.getState().setFooterMessage(e(`connection.dialog.walApplied`,{file:r.fileName}))}async function Q(n,r){try{return await r(n)}catch(i){let a=te(i);if(!a||!(`ssh`in n)||!n.ssh||!await t.getState().requestDestructiveConfirm({title:e(`connection.dialog.hostKeyTitle`),description:e(`connection.dialog.hostKeyDescription`,a),confirmLabel:e(`connection.dialog.hostKeyAccept`)}))throw i;return r({...n,ssh:{...n.ssh,acceptHostKey:a.fingerprint}})}}async function $(){if(M){X(!0);try{if(I(M)===`browser`){await ye(M);return}let t=await Q(L(M),e=>ae(e,M.authToken||void 0));t.success?Z({...M,serverConnectionId:t.connectionId}):o({tone:`error`,title:e(`connection.dialog.connectFailedTitle`),description:t.message??e(`connection.dialog.unknownError`)})}catch(t){o({tone:`error`,title:e(`connection.dialog.connectFailedTitle`),description:t instanceof Error?t.message:String(t)})}finally{X(!1)}}}async function be(){if(M){if(I(M)===`browser`){o({tone:`info`,title:e(`connection.dialog.testConnection`),description:e(`connection.dialog.browserTestHint`)});return}g(!0);try{let t=await Q(L(M),e=>ie(e,M.authToken||void 0));t.success?o({tone:`success`,title:e(`connection.dialog.testSuccess`),description:e(`connection.dialog.testSuccessDescription`)}):o({tone:`error`,title:e(`connection.dialog.testFailedTitle`),description:t.message??e(`connection.dialog.unknownError`)})}catch(t){o({tone:`error`,title:e(`connection.dialog.testFailedTitle`),description:t instanceof Error?t.message:String(t)})}finally{g(!1)}}}return(0,W.jsx)(fe,{open:F,onOpenChange:J,children:(0,W.jsxs)(ue,{className:`sm:max-w-[1100px] h-[85vh] max-h-[85vh] flex flex-col`,children:[(0,W.jsx)(ce,{children:(0,W.jsx)(de,{children:e(`connection.dialog.title`)})}),(0,W.jsxs)(`p`,{className:`flex items-start gap-2 rounded-md border border-catppuccin-green/40 bg-catppuccin-green/10 px-3 py-2 text-xs leading-relaxed text-foreground`,children:[(0,W.jsx)(p,{className:`mt-0.5 size-4 shrink-0 text-catppuccin-green`,"aria-hidden":!0}),(0,W.jsx)(`span`,{children:e(`connection.dialog.privacy`)})]}),(0,W.jsxs)(`div`,{className:`flex flex-1 gap-4 overflow-hidden min-h-0`,children:[(0,W.jsxs)(`div`,{className:`w-[460px] shrink-0 border rounded-md overflow-hidden flex flex-col`,children:[(R||H)&&(0,W.jsxs)(`div`,{className:`border-b p-2 text-xs space-y-1 max-h-40 overflow-auto`,children:[(0,W.jsxs)(`p`,{className:`font-medium`,children:[e(`connection.dialog.gatewayTitle`),R?` — ${R.name}`:``]}),H&&(0,W.jsx)(`p`,{className:`text-destructive`,children:e(`connection.dialog.gatewayLoadFailed`,{error:H})}),R?.profiles.map(t=>(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,W.jsxs)(`span`,{className:`flex items-center gap-1.5 truncate`,children:[(0,W.jsx)(f,{dbms:_[t.driver],className:`size-3.5`}),(0,W.jsx)(`span`,{className:`truncate`,children:t.name}),(0,W.jsxs)(`span`,{className:`text-muted-foreground`,children:[`(`,t.readOnly?e(`connection.dialog.gatewayReadOnly`):e(`connection.dialog.gatewayWritable`),`)`]})]}),(0,W.jsx)(D,{size:`sm`,variant:`outline`,className:`h-6 px-2 text-xs`,onClick:()=>q(t),children:e(`connection.dialog.gatewayAdd`)})]},t.name))]}),(0,W.jsx)(h,{className:`h-full`,children:(0,W.jsxs)(w,{className:`table-fixed`,children:[(0,W.jsx)(i,{children:(0,W.jsxs)(S,{children:[(0,W.jsx)(c,{className:`w-[32%]`,children:e(`connection.dialog.colHostName`)}),(0,W.jsx)(c,{className:`w-[40%]`,children:e(`connection.dialog.colTarget`)}),(0,W.jsx)(c,{className:`w-[28%]`,children:e(`connection.dialog.colDbms`)})]})}),(0,W.jsx)(u,{children:v.length===0?(0,W.jsx)(S,{children:(0,W.jsx)(C,{colSpan:3,className:`text-center text-muted-foreground`,children:e(`connection.dialog.noSaved`)})}):v.map(t=>(0,W.jsxs)(S,{"data-state":A===t.id?`selected`:void 0,className:`cursor-pointer`,onClick:()=>Y(t),onDoubleClick:()=>{Y(t),$()},children:[(0,W.jsx)(C,{className:`truncate font-medium`,title:t.hostName,children:t.hostName||e(`connection.dialog.unnamed`)}),(0,W.jsx)(C,{className:`truncate`,title:t.dbms===`sqlite`?t.file:t.dbms===`d1`?t.databaseId:t.dbms===`do`?t.devUrl:`${t.user}@${t.host}:${t.port}`,children:t.dbms===`sqlite`?t.file||(I(t)===`browser`?e(`connection.dialog.pickOnConnect`):e(`connection.dialog.noFile`)):t.dbms===`d1`?t.databaseId||`—`:t.dbms===`do`?t.devUrl||`—`:`${t.user}@${t.host}:${t.port}`}),(0,W.jsx)(C,{className:`truncate`,title:z(t.dbms).label,children:(0,W.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,W.jsx)(f,{dbms:t.dbms,className:`size-3.5`}),(0,W.jsx)(`span`,{className:`truncate`,children:z(t.dbms).label})]})})]},t.id))})]})})]}),(0,W.jsx)(`div`,{className:`flex-1 border rounded-md overflow-auto`,children:M?(0,W.jsxs)(W.Fragment,{children:[I(M)!==`browser`&&(0,W.jsx)(`div`,{className:`p-4 pb-0`,children:(0,W.jsx)(m,{})}),M.gatewayProfile?(0,W.jsxs)(`div`,{className:`p-4 space-y-2 text-sm`,children:[(0,W.jsxs)(`p`,{className:`font-medium flex items-center gap-2`,children:[(0,W.jsx)(f,{dbms:M.dbms,className:`size-4`}),M.hostName]}),(0,W.jsx)(`p`,{className:`text-muted-foreground`,children:e(`connection.dialog.gatewayProfileHint`,{name:M.gatewayProfile})}),(0,W.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[M.readOnly?e(`connection.dialog.gatewayReadOnly`):e(`connection.dialog.gatewayWritable`),M.database?` · ${M.database}`:``]})]}):(0,W.jsx)(pe,{value:M,onChange:me})]}):(0,W.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:e(`connection.dialog.selectPrompt`)})})]}),(0,W.jsxs)(le,{className:`sm:justify-between`,children:[(0,W.jsxs)(`div`,{className:`flex gap-2`,children:[(0,W.jsx)(D,{variant:`outline`,onClick:he,children:e(`connection.dialog.addNew`)}),(0,W.jsx)(D,{variant:`destructive`,onClick:ge,disabled:!A,children:e(`connection.dialog.delete`)})]}),(0,W.jsxs)(`div`,{className:`flex gap-2`,children:[(0,W.jsx)(D,{variant:`outline`,onClick:be,disabled:!M||s,children:e(`connection.dialog.testConnection`)}),(0,W.jsx)(D,{onClick:$,disabled:!M||_e,children:e(`connection.dialog.connect`)}),(0,W.jsx)(D,{variant:`outline`,onClick:()=>J(!1),children:e(`connection.dialog.close`)})]})]})]})})}export{J as ConnectDialog};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{gt as r,l as i,u as a}from"./main-DLYTmffu.js";import{i as o,l as s,m as c,t as l}from"./button--s6nUzD8.js";import{t as u}from"./chevron-up-QmvRX9Fw.js";import{t as d}from"./connection-store-DjSajhjh.js";import{n as f}from"./query-store-Bz1pmp4E.js";import{n as p,o as m,s as h,t as g}from"./editor-registry-C_yarsyY.js";var _=n(e(),1),v=s();function y(){let{t:e}=c(),{activeDialog:n,closeDialog:s}=t(),[y,b]=(0,_.useState)(``),[x,S]=(0,_.useState)(``),[C,w]=(0,_.useState)(!1),[T,E]=(0,_.useState)(!1),[D,O]=(0,_.useState)(!1),[k,A]=(0,_.useState)(0),j=d(e=>e.activeConnectionId)??``,M=f(e=>j?e.activeTabId[j]:void 0)??``;if(n!==`find-replace`)return null;let N={query:y,caseSensitive:C,regex:T,wholeWord:D},P=j!==``&&M!==``&&y!==``;function F(){s()}function I(){A(P?p(j,M,N,`next`):0)}function L(){A(P?p(j,M,N,`prev`):0)}function R(){P&&A(h(j,M,N,x))}function z(){P&&(m(j,M,N,x),A(g(j,M,N)))}return(0,v.jsxs)(`div`,{className:`fixed top-12 right-4 z-50 bg-background border rounded-md shadow-lg p-3 w-[400px] space-y-2`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,v.jsx)(a,{placeholder:e(`command.findReplace.findPlaceholder`),value:y,onChange:e=>b(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.shiftKey?L():I()),e.key===`Escape`&&F()},className:`flex-1 h-7 text-sm`,autoFocus:!0}),(0,v.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap min-w-[60px] text-center`,children:k>0?e(`command.findReplace.found`,{count:k}):e(`command.findReplace.noResults`)}),(0,v.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0`,onClick:L,title:e(`command.findReplace.previous`),children:(0,v.jsx)(u,{className:`h-4 w-4`})}),(0,v.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0`,onClick:I,title:e(`command.findReplace.next`),children:(0,v.jsx)(r,{className:`h-4 w-4`})}),(0,v.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0`,onClick:F,title:e(`command.findReplace.close`),children:(0,v.jsx)(o,{className:`h-4 w-4`})})]}),(0,v.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,v.jsx)(a,{placeholder:e(`command.findReplace.replacePlaceholder`),value:x,onChange:e=>S(e.target.value),onKeyDown:e=>{e.key===`Escape`&&F()},className:`flex-1 h-7 text-sm`}),(0,v.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 text-xs`,onClick:R,children:e(`command.findReplace.replace`)}),(0,v.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 text-xs`,onClick:z,children:e(`command.findReplace.all`)})]}),(0,v.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,v.jsxs)(i,{className:`flex items-center gap-1.5 text-xs font-normal cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`checkbox`,checked:C,onChange:e=>w(e.target.checked),className:`rounded border-input`}),e(`command.findReplace.caseSensitive`)]}),(0,v.jsxs)(i,{className:`flex items-center gap-1.5 text-xs font-normal cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`checkbox`,checked:T,onChange:e=>E(e.target.checked),className:`rounded border-input`}),e(`command.findReplace.regex`)]}),(0,v.jsxs)(i,{className:`flex items-center gap-1.5 text-xs font-normal cursor-pointer`,children:[(0,v.jsx)(`input`,{type:`checkbox`,checked:D,onChange:e=>O(e.target.checked),className:`rounded border-input`}),e(`command.findReplace.wholeWord`)]})]})]})}export{y as FindReplaceDialog};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{j as r}from"./main-DLYTmffu.js";import{l as i,m as a,t as o}from"./button--s6nUzD8.js";import{t as s}from"./connection-store-DjSajhjh.js";import{n as c}from"./query-store-Bz1pmp4E.js";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./dialog-CJoWJzRo.js";var h=n(e(),1),g=i(),_={execute:`command.localHistory.reason.execute`,replaced:`command.localHistory.reason.replaced`,restore:`command.localHistory.reason.restore`};function v(){let{t:e}=a(),n=t(e=>e.activeDialog),i=t(e=>e.closeDialog),v=t(e=>e.setFooterMessage),y=s(e=>e.activeConnectionId),b=c(e=>y?e.activeTabId[y]:null),x=c(e=>y&&b?e.snapshots[y]?.[b]:void 0)??[],[S,C]=(0,h.useState)(0),w=x[S];function T(){if(!y||!b||!w)return;let t=c.getState();t.captureSnapshot(y,b,`restore`),t.setEditorContent(y,b,w.text),v(e(`command.localHistory.restored`)),i()}return(0,g.jsx)(m,{open:n===`local-history`,onOpenChange:e=>{e||i()},children:(0,g.jsxs)(d,{className:`flex max-h-[80vh] flex-col sm:max-w-[860px]`,children:[(0,g.jsxs)(l,{children:[(0,g.jsx)(f,{children:e(`command.localHistory.title`)}),(0,g.jsx)(p,{children:e(`command.localHistory.description`)})]}),x.length===0?(0,g.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:e(`command.localHistory.empty`)}):(0,g.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-[240px_1fr] gap-3`,children:[(0,g.jsx)(r,{className:`h-[420px] rounded-md border`,children:(0,g.jsx)(`ul`,{className:`divide-y`,children:x.map((t,n)=>(0,g.jsx)(`li`,{children:(0,g.jsxs)(`button`,{type:`button`,onClick:()=>C(n),className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-xs hover:bg-accent ${n===S?`bg-accent`:``}`,children:[(0,g.jsx)(`span`,{className:`font-medium`,children:new Date(t.timestamp).toLocaleString()}),(0,g.jsxs)(`span`,{className:`text-muted-foreground`,children:[e(_[t.reason]),` · `,e(`command.localHistory.chars`,{count:t.text.length})]})]})},t.timestamp+`:`+n))})}),(0,g.jsx)(`pre`,{className:`h-[420px] overflow-auto rounded-md border bg-muted p-3 font-mono text-xs whitespace-pre-wrap`,children:w?.text})]}),(0,g.jsxs)(u,{children:[(0,g.jsx)(o,{variant:`outline`,onClick:i,children:e(`command.close`)}),(0,g.jsx)(o,{onClick:T,disabled:!w,children:e(`command.localHistory.restore`)})]})]})})}export{v as LocalHistoryDialog};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as e,n as t,v as n}from"./ui-store-DfspmPOn.js";import{C as r,S as i,_t as a,b as o,bt as s,ft as ee,nt as te,tt as ne,w as c,x as l,xt as re,y as u,yt as ie}from"./main-DLYTmffu.js";import{a as d,i as ae,l as f,m as oe,t as p}from"./button--s6nUzD8.js";import{a as m}from"./i18n-XcmivDWI.js";import{t as h}from"./connection-store-DjSajhjh.js";import{c as g}from"./database-_lr1w6xK.js";import{t as _}from"./engine-C2ZJalx5.js";import{a as se,i as v,n as y,o as b,t as ce}from"./dialog-CJoWJzRo.js";var le=d(`list-ordered`,[[`path`,{d:`M11 5h10`,key:`1cz7ny`}],[`path`,{d:`M11 12h10`,key:`1438ji`}],[`path`,{d:`M11 19h10`,key:`11t30w`}],[`path`,{d:`M4 4h1v5`,key:`10yrso`}],[`path`,{d:`M4 9h2`,key:`r1h2o0`}],[`path`,{d:`M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02`,key:`xtkcd5`}]]),ue=d(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),x=d(`skull`,[[`path`,{d:`m12.5 17-.5-1-.5 1h1z`,key:`3me087`}],[`path`,{d:`M15 22a1 1 0 0 0 1-1v-1a2 2 0 0 0 1.56-3.25 8 8 0 1 0-11.12 0A2 2 0 0 0 8 20v1a1 1 0 0 0 1 1z`,key:`1o5pge`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}]]),de=d(`timer`,[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`,key:`14vaq8`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`,key:`17fdiu`}],[`circle`,{cx:`12`,cy:`14`,r:`8`,key:`1e1u0o`}]]),S=n(e(),1),C=f(),w=10,fe=[2,5,10,30];function T(){let e=h.getState();return e.activeConnections.find(t=>t.id===e.activeConnectionId)?.serverConnectionId??null}async function pe(){let e=T();if(!e)throw Error(m.t(`command.noActiveConnection`));let t=await g(e,_().getQuery(`SHOW_PROCESS_LIST`));return t.records.map(e=>{let n={};return t.fields.forEach((t,r)=>{n[t.name]=e[r]}),{...n,Id:String(n.Id)}})}function E(e){return/^(sleep|idle)/i.test(e.Command??``)}function me(e){return/lock/i.test(e.State??``)}function he(e){return/PROCESSLIST|pg_stat_activity/i.test(e.Info??``)}function D(e){let t=Number(e.Time);return Number.isFinite(t)?t:0}function O(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m ${e%60}s`:`${Math.floor(e/3600)}h ${Math.floor(e%3600/60)}m`}function k({icon:e,label:t,value:n,tone:r}){return(0,C.jsxs)(`div`,{className:`flex min-w-[120px] flex-1 items-center gap-2.5 rounded-md border bg-muted/30 px-3 py-1.5`,children:[(0,C.jsx)(`div`,{className:`flex size-7 shrink-0 items-center justify-center rounded-md [&_svg]:size-3.5 ${r===`warn`?`bg-catppuccin-yellow/15 text-catppuccin-yellow`:`bg-primary/10 text-primary`}`,children:e}),(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`div`,{className:`text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:t}),(0,C.jsx)(`div`,{className:`truncate text-sm font-semibold tabular-nums`,children:n})]})]})}function A(){let{t:e}=oe(),{activeDialog:n,closeDialog:d,setFooterMessage:f,requestDestructiveConfirm:m}=t(),[h,A]=(0,S.useState)([]),[j,M]=(0,S.useState)(!1),[N,P]=(0,S.useState)(5),[F,I]=(0,S.useState)(null),[L,R]=(0,S.useState)(``),[z,ge]=(0,S.useState)(!1),[B,_e]=(0,S.useState)(!0),[V,H]=(0,S.useState)(!1),[U,ve]=(0,S.useState)(null),[W,G]=(0,S.useState)(!1),K=(0,S.useRef)(null),q=n===`process-list`,J=(0,S.useCallback)(()=>Promise.resolve().then(()=>(H(!0),pe())).then(e=>{A(e),ve(new Date)}).catch(t=>f(e(`command.processList.loadError`,{message:t instanceof Error?t.message:String(t)}))).finally(()=>H(!1)),[f,e]);(0,S.useEffect)(()=>{q&&J()},[q,J]),(0,S.useEffect)(()=>(K.current&&=(clearInterval(K.current),null),j&&q&&(K.current=setInterval(()=>{J()},N*1e3)),()=>{K.current&&=(clearInterval(K.current),null)}),[j,N,q,J]);function Y(e){e||(M(!1),I(null),R(``),d())}let X=(0,S.useMemo)(()=>{let e=h.filter(E).length,t=h.filter(e=>!E(e)).reduce((e,t)=>Math.max(e,D(t)),0);return{total:h.length,active:h.length-e,idle:e,longest:t}},[h]),Z=(0,S.useMemo)(()=>{let e=L.trim().toLowerCase();return h.filter(t=>z&&E(t)?!1:!e||[t.Id,t.User,t.Host,t.db,t.Command,t.State,t.Info].some(t=>(t??``).toString().toLowerCase().includes(e))).sort((e,t)=>B?D(t)-D(e):D(e)-D(t))},[h,L,z,B]),Q=h.find(e=>e.Id===F)??null,ye=(0,S.useCallback)(()=>{Q?.Info&&navigator.clipboard.writeText(Q.Info).then(()=>{G(!0),setTimeout(()=>G(!1),1500)})},[Q]);async function $(t){let n=t??F;if(!n){f(e(`command.processList.selectToKill`));return}let r=T();if(!r)return;let i=h.find(e=>e.Id===n),a=_().getQuery(`KILL_QUERY`,String(n));if(await m({title:e(`command.processList.killConfirmTitle`,{id:n}),description:e(`command.processList.killConfirmDescription`,{user:i?.User??`?`,host:i?.Host??`?`}),confirmLabel:e(`command.processList.killProcess`),statements:[a]}))try{await g(r,a),f(e(`command.processList.killed`,{id:n})),F===n&&I(null),J()}catch(t){f(e(`command.processList.killError`,{message:t instanceof Error?t.message:String(t)}))}}return(0,C.jsx)(ce,{open:q,onOpenChange:Y,children:(0,C.jsxs)(y,{className:`flex max-h-[85vh] flex-col sm:max-w-[1000px]`,children:[(0,C.jsx)(se,{children:(0,C.jsxs)(b,{className:`flex items-center gap-2`,children:[e(`command.processList.title`),U&&(0,C.jsx)(`span`,{className:`text-xs font-normal text-muted-foreground`,children:e(`command.processList.updatedAt`,{time:U.toLocaleTimeString(void 0,{hour12:!1})})})]})}),(0,C.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,C.jsx)(k,{icon:(0,C.jsx)(le,{}),label:e(`command.processList.stats.total`),value:X.total}),(0,C.jsx)(k,{icon:(0,C.jsx)(re,{}),label:e(`command.processList.stats.active`),value:X.active}),(0,C.jsx)(k,{icon:(0,C.jsx)(ue,{}),label:e(`command.processList.stats.idle`),value:X.idle}),(0,C.jsx)(k,{icon:(0,C.jsx)(de,{}),label:e(`command.processList.stats.longest`),value:O(X.longest),tone:X.longest>=w?`warn`:void 0})]}),(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,C.jsxs)(`div`,{className:`relative`,children:[(0,C.jsx)(ne,{className:`pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground`}),(0,C.jsx)(`input`,{className:`h-7 w-56 rounded border bg-background pl-7 pr-6 text-xs placeholder:text-muted-foreground`,placeholder:e(`command.processList.filterPlaceholder`),value:L,onChange:e=>R(e.target.value)}),L&&(0,C.jsx)(`button`,{type:`button`,className:`absolute right-1.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground`,onClick:()=>R(``),children:(0,C.jsx)(ae,{className:`size-3`})})]}),(0,C.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-1.5 text-xs`,children:[(0,C.jsx)(`input`,{type:`checkbox`,className:`accent-primary`,checked:z,onChange:e=>ge(e.target.checked)}),e(`command.processList.hideIdle`)]}),(0,C.jsx)(`div`,{className:`flex-1`}),(0,C.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-1.5 text-xs`,children:[(0,C.jsx)(`input`,{type:`checkbox`,className:`accent-primary`,checked:j,onChange:e=>M(e.target.checked)}),e(`command.processList.autoRefresh`)]}),(0,C.jsx)(`select`,{className:`h-7 rounded border bg-background px-1.5 text-xs disabled:opacity-50`,value:N,onChange:e=>P(Number(e.target.value)),disabled:!j,children:fe.map(e=>(0,C.jsxs)(`option`,{value:e,children:[e,`s`]},e))}),(0,C.jsxs)(p,{variant:`outline`,size:`sm`,className:`h-7`,onClick:()=>{J()},disabled:V,children:[(0,C.jsx)(te,{className:`mr-1 size-3.5 ${V?`animate-spin`:``}`}),e(`command.processList.refresh`)]})]}),(0,C.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto rounded-md border`,children:(0,C.jsxs)(u,{className:`text-xs`,children:[(0,C.jsx)(r,{className:`sticky top-0 z-10 bg-background`,children:(0,C.jsxs)(c,{children:[(0,C.jsx)(i,{className:`w-[70px]`,children:e(`command.processList.columns.id`)}),(0,C.jsx)(i,{className:`w-[100px]`,children:e(`command.processList.columns.user`)}),(0,C.jsx)(i,{className:`w-[130px]`,children:e(`command.processList.columns.host`)}),(0,C.jsx)(i,{className:`w-[100px]`,children:e(`command.processList.columns.db`)}),(0,C.jsx)(i,{className:`w-[90px]`,children:e(`command.processList.columns.command`)}),(0,C.jsx)(i,{className:`w-[80px] cursor-pointer select-none`,onClick:()=>_e(e=>!e),children:(0,C.jsxs)(`span`,{className:`flex items-center gap-1`,children:[e(`command.processList.columns.time`),B?(0,C.jsx)(s,{className:`size-3 text-primary`}):(0,C.jsx)(ie,{className:`size-3 text-primary`})]})}),(0,C.jsx)(i,{className:`w-[130px]`,children:e(`command.processList.columns.state`)}),(0,C.jsx)(i,{children:e(`command.processList.columns.info`)}),(0,C.jsx)(i,{className:`w-[50px]`})]})}),(0,C.jsx)(o,{children:Z.length===0?(0,C.jsx)(c,{children:(0,C.jsx)(l,{colSpan:9,className:`py-8 text-center text-muted-foreground`,children:h.length===0?e(`command.processList.empty`):e(`command.processList.noMatch`)})}):Z.map(t=>{let n=E(t),r=D(t),i=!n&&r>=w,a=me(t),o=he(t);return(0,C.jsxs)(c,{"data-state":F===t.Id?`selected`:void 0,className:`cursor-pointer ${n?`text-muted-foreground`:``} ${a?`bg-destructive/5`:i?`bg-catppuccin-yellow/5`:``}`,onClick:()=>I(t.Id),children:[(0,C.jsx)(l,{className:`font-mono tabular-nums`,children:(0,C.jsxs)(`span`,{className:`flex items-center gap-1`,children:[t.Id,o&&(0,C.jsx)(`span`,{className:`rounded bg-primary/10 px-1 text-[9px] font-semibold text-primary`,title:e(`command.processList.selfHint`),children:e(`command.processList.self`)})]})}),(0,C.jsx)(l,{children:t.User}),(0,C.jsx)(l,{className:`font-mono`,children:t.Host}),(0,C.jsx)(l,{className:`font-mono`,children:t.db??``}),(0,C.jsx)(l,{children:(0,C.jsx)(`span`,{className:`rounded px-1.5 py-px text-[10px] font-medium ${n?`bg-muted`:`bg-green-500/10 text-green-600 dark:text-green-400`}`,children:t.Command})}),(0,C.jsx)(l,{className:`tabular-nums ${i?`font-semibold text-catppuccin-yellow`:``}`,children:O(r)}),(0,C.jsx)(l,{className:a?`font-medium text-destructive`:``,children:t.State}),(0,C.jsx)(l,{className:`max-w-[260px] truncate font-mono`,title:t.Info??``,children:t.Info??``}),(0,C.jsx)(l,{className:`text-right`,children:(0,C.jsx)(`button`,{type:`button`,className:`rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive`,title:e(`command.processList.kill`),onClick:e=>{e.stopPropagation(),$(t.Id)},children:(0,C.jsx)(x,{className:`size-3.5`})})})]},t.Id)})})]})}),Q&&(0,C.jsxs)(`div`,{className:`shrink-0 rounded-md border`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 border-b bg-muted/30 px-3 py-1`,children:[(0,C.jsx)(`span`,{className:`text-[10px] font-semibold uppercase tracking-wide text-muted-foreground`,children:e(`command.processList.statementOf`,{id:Q.Id})}),(0,C.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[Q.User,`@`,Q.Host,Q.db?` · ${Q.db}`:``]}),(0,C.jsx)(`div`,{className:`flex-1`}),(0,C.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-40`,onClick:ye,disabled:!Q.Info,children:[W?(0,C.jsx)(a,{className:`size-3`}):(0,C.jsx)(ee,{className:`size-3`}),e(W?`command.processList.copied`:`command.processList.copy`)]})]}),(0,C.jsx)(`pre`,{className:`max-h-32 overflow-auto whitespace-pre-wrap break-words px-3 py-2 font-mono text-xs`,children:Q.Info||(0,C.jsx)(`span`,{className:`italic text-muted-foreground`,children:e(`command.processList.noStatement`)})})]}),(0,C.jsxs)(v,{children:[(0,C.jsx)(p,{variant:`destructive`,onClick:()=>{$()},disabled:!F,children:e(`command.processList.killProcess`)}),(0,C.jsx)(p,{variant:`outline`,onClick:()=>Y(!1),children:e(`command.close`)})]})]})})}export{A as ProcessListDialog};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e,h as t,n,v as r}from"./ui-store-DfspmPOn.js";import{$ as i,B as a,F as o,G as s,J as c,K as l,L as u,Q as d,U as f,W as p,Y as m,Z as ee,_t as h,at as g,ct as te,dt as ne,ft as _,it as v,nt as y,ot as b,q as x,rt as S,tt as C,ut as w,xt as T,z as re}from"./main-DLYTmffu.js";import{a as E,f as D,l as O,m as k,o as A,s as j}from"./button--s6nUzD8.js";import{r as ie,t as ae}from"./i18n-XcmivDWI.js";import{_ as M,a as N,o as oe,r as se,t as ce}from"./dist-CBYDYlja.js";import{t as P}from"./connection-store-DjSajhjh.js";import{n as le,t as ue}from"./query-store-Bz1pmp4E.js";import{n as de,r as fe}from"./settings-store-CSRx4hwh.js";import{n as pe,t as me}from"./database-_lr1w6xK.js";import{r as he,s as ge}from"./query-execution-DMUlIoF2.js";import{t as _e}from"./use-engine-C_C2qpfD.js";import{a as ve,n as F,o as ye,r as I,t as be}from"./dialog-CJoWJzRo.js";var xe=E(`book-open`,[[`path`,{d:`M12 7v14`,key:`1akyts`}],[`path`,{d:`M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z`,key:`ruj8y`}]]),Se=E(`copy-plus`,[[`line`,{x1:`15`,x2:`15`,y1:`12`,y2:`18`,key:`1p7wdc`}],[`line`,{x1:`12`,x2:`18`,y1:`15`,y2:`15`,key:`1nscbv`}],[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),Ce=E(`corner-down-left`,[[`path`,{d:`M20 4v7a4 4 0 0 1-4 4H4`,key:`6o5b7l`}],[`path`,{d:`m9 10-5 5 5 5`,key:`1kshq7`}]]),we=E(`database-zap`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 15 21.84`,key:`14ibmq`}],[`path`,{d:`M21 5V8`,key:`1marbg`}],[`path`,{d:`M21 12L18 17H22L19 22`,key:`zafso`}],[`path`,{d:`M3 12A9 3 0 0 0 14.59 14.87`,key:`1y4wr8`}]]),Te=E(`file-code`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]),Ee=E(`file-spreadsheet`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M8 13h2`,key:`yr2amv`}],[`path`,{d:`M14 13h2`,key:`un5t4a`}],[`path`,{d:`M8 17h2`,key:`2yhykz`}],[`path`,{d:`M14 17h2`,key:`10kma7`}]]),De=E(`git-compare`,[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M13 6h3a2 2 0 0 1 2 2v7`,key:`1yeb86`}],[`path`,{d:`M11 18H8a2 2 0 0 1-2-2V9`,key:`19pyzm`}]]),Oe=E(`git-compare-arrows`,[[`circle`,{cx:`5`,cy:`6`,r:`3`,key:`1qnov2`}],[`path`,{d:`M12 6h5a2 2 0 0 1 2 2v7`,key:`1yj91y`}],[`path`,{d:`m15 9-3-3 3-3`,key:`1lwv8l`}],[`circle`,{cx:`19`,cy:`18`,r:`3`,key:`1qljk2`}],[`path`,{d:`M12 18H7a2 2 0 0 1-2-2V9`,key:`16sdep`}],[`path`,{d:`m9 15 3 3-3 3`,key:`1m3kbl`}]]),ke=E(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]),Ae=E(`languages`,[[`path`,{d:`m5 8 6 6`,key:`1wu5hv`}],[`path`,{d:`m4 14 6-6 2-3`,key:`1k1g8d`}],[`path`,{d:`M2 5h12`,key:`or177f`}],[`path`,{d:`M7 2h1`,key:`1t2jsx`}],[`path`,{d:`m22 22-5-10-5 10`,key:`don7ne`}],[`path`,{d:`M14 18h6`,key:`1m8k6r`}]]),je=E(`network`,[[`rect`,{x:`16`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`4q2zg0`}],[`rect`,{x:`2`,y:`16`,width:`6`,height:`6`,rx:`1`,key:`8cvhb9`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`6`,rx:`1`,key:`1egb70`}],[`path`,{d:`M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3`,key:`1jsf9p`}],[`path`,{d:`M12 12V8`,key:`2874zd`}]]),Me=E(`plug`,[[`path`,{d:`M12 22v-5`,key:`1ega77`}],[`path`,{d:`M15 8V2`,key:`18g5xt`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`,key:`1xoxul`}],[`path`,{d:`M9 8V2`,key:`14iosj`}]]),Ne=E(`replace`,[[`path`,{d:`M14 4a1 1 0 0 1 1-1`,key:`dhj8ez`}],[`path`,{d:`M15 10a1 1 0 0 1-1-1`,key:`1mnyi5`}],[`path`,{d:`M21 4a1 1 0 0 0-1-1`,key:`sfs9ap`}],[`path`,{d:`M21 9a1 1 0 0 1-1 1`,key:`mp6qeo`}],[`path`,{d:`m3 7 3 3 3-3`,key:`x25e72`}],[`path`,{d:`M6 10V5a2 2 0 0 1 2-2h2`,key:`15xut4`}],[`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`,key:`1bkyp8`}]]),Pe=E(`rocket`,[[`path`,{d:`M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5`,key:`qeys4`}],[`path`,{d:`M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09`,key:`u4xsad`}],[`path`,{d:`M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z`,key:`676m9`}],[`path`,{d:`M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05`,key:`92ym6u`}]]),Fe=E(`scale`,[[`path`,{d:`M12 3v18`,key:`108xh3`}],[`path`,{d:`m19 8 3 8a5 5 0 0 1-6 0zV7`,key:`zcdpyk`}],[`path`,{d:`M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1`,key:`1yorad`}],[`path`,{d:`m5 8 3 8a5 5 0 0 1-6 0zV7`,key:`eua70x`}],[`path`,{d:`M7 21h10`,key:`1b0cd5`}]]),Ie=E(`scroll-text`,[[`path`,{d:`M15 12h-5`,key:`r7krc0`}],[`path`,{d:`M15 8h-5`,key:`1khuty`}],[`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`,key:`zz82l3`}],[`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3`,key:`1ph1d7`}]]),Le=E(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),Re=E(`shield-alert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),ze=E(`waypoints`,[[`path`,{d:`m10.586 5.414-5.172 5.172`,key:`4mc350`}],[`path`,{d:`m18.586 13.414-5.172 5.172`,key:`8c96vv`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`circle`,{cx:`12`,cy:`20`,r:`2`,key:`144qzu`}],[`circle`,{cx:`12`,cy:`4`,r:`2`,key:`muu5ef`}],[`circle`,{cx:`20`,cy:`12`,r:`2`,key:`1xzzfp`}],[`circle`,{cx:`4`,cy:`12`,r:`2`,key:`1hvhnz`}]]),Be=E(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]),L=r(t(),1),Ve=1,He=.9,Ue=.8,We=.17,R=.1,z=.999,Ge=.9999,B=.99,V=/[\\\/_+.#"@\[\(\{&]/,Ke=/[\\\/_+.#"@\[\(\{&]/g,qe=/[\s-]/,Je=/[\s-]/g;function H(e,t,n,r,i,a,o){if(a===t.length)return i===e.length?Ve:B;var s=`${i},${a}`;if(o[s]!==void 0)return o[s];for(var c=r.charAt(a),l=n.indexOf(c,i),u=0,d,f,p,m;l>=0;)d=H(e,t,n,r,l+1,a+1,o),d>u&&(l===i?d*=Ve:V.test(e.charAt(l-1))?(d*=Ue,p=e.slice(i,l-1).match(Ke),p&&i>0&&(d*=z**+p.length)):qe.test(e.charAt(l-1))?(d*=He,m=e.slice(i,l-1).match(Je),m&&i>0&&(d*=z**+m.length)):(d*=We,i>0&&(d*=z**+(l-i))),e.charAt(l)!==t.charAt(a)&&(d*=Ge)),(d<R&&n.charAt(l-1)===r.charAt(a+1)||r.charAt(a+1)===r.charAt(a)&&n.charAt(l-1)!==r.charAt(a))&&(f=H(e,t,n,r,l+1,a+2,o),f*R>d&&(d=f*R)),d>u&&(u=d),l=n.indexOf(c,l+1);return o[s]=u,u}function Ye(e){return e.toLowerCase().replace(Je,` `)}function Xe(e,t,n){return e=n&&n.length>0?`${e+` `+n.join(` `)}`:e,H(e,t,Ye(e),Ye(t),0,0,{})}var U=`[cmdk-group=""]`,W=`[cmdk-group-items=""]`,Ze=`[cmdk-group-heading=""]`,Qe=`[cmdk-item=""]`,$e=`${Qe}:not([aria-disabled="true"])`,G=`cmdk-item-select`,K=`data-value`,et=(e,t,n)=>Xe(e,t,n),tt=L.createContext(void 0),q=()=>L.useContext(tt),nt=L.createContext(void 0),rt=()=>L.useContext(nt),it=L.createContext(void 0),at=L.forwardRef((e,t)=>{let n=X(()=>({search:``,value:e.value??e.defaultValue??``,selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}})),r=X(()=>new Set),i=X(()=>new Map),a=X(()=>new Map),o=X(()=>new Set),s=gt(e),{label:c,children:l,value:u,onValueChange:d,filter:f,shouldFilter:p,loop:m,disablePointerSelection:ee=!1,vimBindings:h=!0,...g}=e,te=M(),ne=M(),_=M(),v=L.useRef(null),y=vt();Y(()=>{if(u!==void 0){let e=u.trim();n.current.value=e,b.emit()}},[u]),Y(()=>{y(6,re)},[]);let b=L.useMemo(()=>({subscribe:e=>(o.current.add(e),()=>o.current.delete(e)),snapshot:()=>n.current,setState:(e,t,r)=>{var i,a,o;if(!Object.is(n.current[e],t)){if(n.current[e]=t,e===`search`)T(),C(),y(1,w);else if(e===`value`){if(document.activeElement.hasAttribute(`cmdk-input`)||document.activeElement.hasAttribute(`cmdk-root`)){let e=document.getElementById(_);e?e.focus():(i=document.getElementById(te))==null||i.focus()}if(y(7,()=>{n.current.selectedItemId=E()?.id,b.emit()}),r||y(5,re),s.current?.value!==void 0){let e=t??``;(o=(a=s.current).onValueChange)==null||o.call(a,e);return}}b.emit()}},emit:()=>{o.current.forEach(e=>e())}}),[]),x=L.useMemo(()=>({value:(e,t,r)=>{t!==a.current.get(e)?.value&&(a.current.set(e,{value:t,keywords:r}),n.current.filtered.items.set(e,S(t,r)),y(2,()=>{C(),b.emit()}))},item:(e,t)=>(r.current.add(e),t&&(i.current.has(t)?i.current.get(t).add(e):i.current.set(t,new Set([e]))),y(3,()=>{T(),C(),n.current.value||w(),b.emit()}),()=>{a.current.delete(e),r.current.delete(e),n.current.filtered.items.delete(e);let t=E();y(4,()=>{T(),t?.getAttribute(`id`)===e&&w(),b.emit()})}),group:e=>(i.current.has(e)||i.current.set(e,new Set),()=>{a.current.delete(e),i.current.delete(e)}),filter:()=>s.current.shouldFilter,label:c||e[`aria-label`],getDisablePointerSelection:()=>s.current.disablePointerSelection,listId:te,inputId:_,labelId:ne,listInnerRef:v}),[]);function S(e,t){let r=s.current?.filter??et;return e?r(e,n.current.search,t):0}function C(){if(!n.current.search||s.current.shouldFilter===!1)return;let e=n.current.filtered.items,t=[];n.current.filtered.groups.forEach(n=>{let r=i.current.get(n),a=0;r.forEach(t=>{let n=e.get(t);a=Math.max(n,a)}),t.push([n,a])});let r=v.current;D().sort((t,n)=>{let r=t.getAttribute(`id`),i=n.getAttribute(`id`);return(e.get(i)??0)-(e.get(r)??0)}).forEach(e=>{let t=e.closest(W);t?t.appendChild(e.parentElement===t?e:e.closest(`${W} > *`)):r.appendChild(e.parentElement===r?e:e.closest(`${W} > *`))}),t.sort((e,t)=>t[1]-e[1]).forEach(e=>{let t=v.current?.querySelector(`${U}[${K}="${encodeURIComponent(e[0])}"]`);t?.parentElement.appendChild(t)})}function w(){let e=D().find(e=>e.getAttribute(`aria-disabled`)!==`true`)?.getAttribute(K);b.setState(`value`,e||void 0)}function T(){if(!n.current.search||s.current.shouldFilter===!1){n.current.filtered.count=r.current.size;return}n.current.filtered.groups=new Set;let e=0;for(let t of r.current){let r=S(a.current.get(t)?.value??``,a.current.get(t)?.keywords??[]);n.current.filtered.items.set(t,r),r>0&&e++}for(let[e,t]of i.current)for(let r of t)if(n.current.filtered.items.get(r)>0){n.current.filtered.groups.add(e);break}n.current.filtered.count=e}function re(){var e;let t=E();t&&(t.parentElement?.firstChild===t&&((e=t.closest(U)?.querySelector(Ze))==null||e.scrollIntoView({block:`nearest`})),t.scrollIntoView({block:`nearest`}))}function E(){return v.current?.querySelector(`${Qe}[aria-selected="true"]`)}function D(){return Array.from(v.current?.querySelectorAll($e)||[])}function O(e){let t=D()[e];t&&b.setState(`value`,t.getAttribute(K))}function k(e){var t;let n=E(),r=D(),i=r.findIndex(e=>e===n),a=r[i+e];(t=s.current)!=null&&t.loop&&(a=i+e<0?r[r.length-1]:i+e===r.length?r[0]:r[i+e]),a&&b.setState(`value`,a.getAttribute(K))}function A(e){let t=E()?.closest(U),n;for(;t&&!n;)t=e>0?mt(t,U):ht(t,U),n=t?.querySelector($e);n?b.setState(`value`,n.getAttribute(K)):k(e)}let ie=()=>O(D().length-1),ae=e=>{e.preventDefault(),e.metaKey?ie():e.altKey?A(1):k(1)},N=e=>{e.preventDefault(),e.metaKey?O(0):e.altKey?A(-1):k(-1)};return L.createElement(j.div,{ref:t,tabIndex:-1,...g,"cmdk-root":``,onKeyDown:e=>{var t;(t=g.onKeyDown)==null||t.call(g,e);let n=e.nativeEvent.isComposing||e.keyCode===229;if(!(e.defaultPrevented||n))switch(e.key){case`n`:case`j`:h&&e.ctrlKey&&ae(e);break;case`ArrowDown`:ae(e);break;case`p`:case`k`:h&&e.ctrlKey&&N(e);break;case`ArrowUp`:N(e);break;case`Home`:e.preventDefault(),O(0);break;case`End`:e.preventDefault(),ie();break;case`Enter`:{e.preventDefault();let t=E();if(t){let e=new Event(G);t.dispatchEvent(e)}}}}},L.createElement(`label`,{"cmdk-label":``,htmlFor:x.inputId,id:x.labelId,style:bt},c),Q(e,e=>L.createElement(nt.Provider,{value:b},L.createElement(tt.Provider,{value:x},e))))}),ot=L.forwardRef((e,t)=>{let n=M(),r=L.useRef(null),i=L.useContext(it),a=q(),o=gt(e),s=o.current?.forceMount??i?.forceMount;Y(()=>{if(!s)return a.item(n,i?.id)},[s]);let c=_t(n,r,[e.value,e.children,r],e.keywords),l=rt(),u=Z(e=>e.value&&e.value===c.current),d=Z(e=>s||a.filter()===!1?!0:!e.search||e.filtered.items.get(n)>0);L.useEffect(()=>{let t=r.current;if(!(!t||e.disabled))return t.addEventListener(G,f),()=>t.removeEventListener(G,f)},[d,e.onSelect,e.disabled]);function f(){var e,t;p(),(t=(e=o.current).onSelect)==null||t.call(e,c.current)}function p(){l.setState(`value`,c.current,!0)}if(!d)return null;let{disabled:m,value:ee,onSelect:h,forceMount:g,keywords:te,...ne}=e;return L.createElement(j.div,{ref:D(r,t),...ne,id:n,"cmdk-item":``,role:`option`,"aria-disabled":!!m,"aria-selected":!!u,"data-disabled":!!m,"data-selected":!!u,onPointerMove:m||a.getDisablePointerSelection()?void 0:p,onClick:m?void 0:f},e.children)}),st=L.forwardRef((e,t)=>{let{heading:n,children:r,forceMount:i,...a}=e,o=M(),s=L.useRef(null),c=L.useRef(null),l=M(),u=q(),d=Z(e=>i||u.filter()===!1?!0:!e.search||e.filtered.groups.has(o));Y(()=>u.group(o),[]),_t(o,s,[e.value,e.heading,c]);let f=L.useMemo(()=>({id:o,forceMount:i}),[i]);return L.createElement(j.div,{ref:D(s,t),...a,"cmdk-group":``,role:`presentation`,hidden:!d||void 0},n&&L.createElement(`div`,{ref:c,"cmdk-group-heading":``,"aria-hidden":!0,id:l},n),Q(e,e=>L.createElement(`div`,{"cmdk-group-items":``,role:`group`,"aria-labelledby":n?l:void 0},L.createElement(it.Provider,{value:f},e))))}),ct=L.forwardRef((e,t)=>{let{alwaysRender:n,...r}=e,i=L.useRef(null),a=Z(e=>!e.search);return!n&&!a?null:L.createElement(j.div,{ref:D(i,t),...r,"cmdk-separator":``,role:`separator`})}),lt=L.forwardRef((e,t)=>{let{onValueChange:n,...r}=e,i=e.value!=null,a=rt(),o=Z(e=>e.search),s=Z(e=>e.selectedItemId),c=q();return L.useEffect(()=>{e.value!=null&&a.setState(`search`,e.value)},[e.value]),L.createElement(j.input,{ref:t,...r,"cmdk-input":``,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,"aria-autocomplete":`list`,role:`combobox`,"aria-expanded":!0,"aria-controls":c.listId,"aria-labelledby":c.labelId,"aria-activedescendant":s,id:c.inputId,type:`text`,value:i?e.value:o,onChange:e=>{i||a.setState(`search`,e.target.value),n?.(e.target.value)}})}),ut=L.forwardRef((e,t)=>{let{children:n,label:r=`Suggestions`,...i}=e,a=L.useRef(null),o=L.useRef(null),s=Z(e=>e.selectedItemId),c=q();return L.useEffect(()=>{if(o.current&&a.current){let e=o.current,t=a.current,n,r=new ResizeObserver(()=>{n=requestAnimationFrame(()=>{let n=e.offsetHeight;t.style.setProperty(`--cmdk-list-height`,n.toFixed(1)+`px`)})});return r.observe(e),()=>{cancelAnimationFrame(n),r.unobserve(e)}}},[]),L.createElement(j.div,{ref:D(a,t),...i,"cmdk-list":``,role:`listbox`,tabIndex:-1,"aria-activedescendant":s,"aria-label":r,id:c.listId},Q(e,e=>L.createElement(`div`,{ref:D(o,c.listInnerRef),"cmdk-list-sizer":``},e)))}),dt=L.forwardRef((e,t)=>{let{open:n,onOpenChange:r,overlayClassName:i,contentClassName:a,container:o,...s}=e;return L.createElement(ce,{open:n,onOpenChange:r},L.createElement(oe,{container:o},L.createElement(N,{"cmdk-overlay":``,className:i}),L.createElement(se,{"aria-label":e.label,"cmdk-dialog":``,className:a},L.createElement(at,{ref:t,...s}))))}),ft=L.forwardRef((e,t)=>Z(e=>e.filtered.count===0)?L.createElement(j.div,{ref:t,...e,"cmdk-empty":``,role:`presentation`}):null),pt=L.forwardRef((e,t)=>{let{progress:n,children:r,label:i=`Loading...`,...a}=e;return L.createElement(j.div,{ref:t,...a,"cmdk-loading":``,role:`progressbar`,"aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,"aria-label":i},Q(e,e=>L.createElement(`div`,{"aria-hidden":!0},e)))}),J=Object.assign(at,{List:ut,Item:ot,Input:lt,Group:st,Separator:ct,Dialog:dt,Empty:ft,Loading:pt});function mt(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return n;n=n.nextElementSibling}}function ht(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return n;n=n.previousElementSibling}}function gt(e){let t=L.useRef(e);return Y(()=>{t.current=e}),t}var Y=typeof window>`u`?L.useEffect:L.useLayoutEffect;function X(e){let t=L.useRef();return t.current===void 0&&(t.current=e()),t}function Z(e){let t=rt(),n=()=>e(t.snapshot());return L.useSyncExternalStore(t.subscribe,n,n)}function _t(e,t,n,r=[]){let i=L.useRef(),a=q();return Y(()=>{var o;let s=(()=>{for(let e of n){if(typeof e==`string`)return e.trim();if(typeof e==`object`&&`current`in e)return e.current?e.current.textContent?.trim():i.current}})(),c=r.map(e=>e.trim());a.value(e,s,c),(o=t.current)==null||o.setAttribute(K,s),i.current=s}),i}var vt=()=>{let[e,t]=L.useState(),n=X(()=>new Map);return Y(()=>{n.current.forEach(e=>e()),n.current=new Map},[e]),(e,r)=>{n.current.set(e,r),t({})}};function yt(e){let t=e.type;return typeof t==`function`?t(e.props):`render`in t?t.render(e.props):e}function Q({asChild:e,children:t},n){return e&&L.isValidElement(t)?L.cloneElement(yt(t),{ref:t.ref},n(t.props.children)):n(t)}var bt={position:`absolute`,width:`1px`,height:`1px`,padding:`0`,margin:`-1px`,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,borderWidth:`0`},$=O();function xt({className:e,...t}){return(0,$.jsx)(J,{"data-slot":`command`,className:A(`flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground`,e),...t})}function St({title:e=`Command Palette`,description:t=`Search for a command to run...`,children:n,className:r,showCloseButton:i=!0,...a}){return(0,$.jsxs)(be,{...a,children:[(0,$.jsxs)(ve,{className:`sr-only`,children:[(0,$.jsx)(ye,{children:e}),(0,$.jsx)(I,{children:t})]}),(0,$.jsx)(F,{className:A(`overflow-hidden p-0`,r),showCloseButton:i,children:(0,$.jsx)(xt,{className:`**:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5`,children:n})})]})}function Ct({className:e,...t}){return(0,$.jsxs)(`div`,{"data-slot":`command-input-wrapper`,className:`flex h-9 items-center gap-2 border-b px-3`,children:[(0,$.jsx)(C,{className:`size-4 shrink-0 opacity-50`}),(0,$.jsx)(J.Input,{"data-slot":`command-input`,className:A(`flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50`,e),...t})]})}function wt({className:e,...t}){return(0,$.jsx)(J.List,{"data-slot":`command-list`,className:A(`max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto`,e),...t})}function Tt({...e}){return(0,$.jsx)(J.Empty,{"data-slot":`command-empty`,className:`py-6 text-center text-sm`,...e})}function Et({className:e,...t}){return(0,$.jsx)(J.Group,{"data-slot":`command-group`,className:A(`overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground`,e),...t})}function Dt({className:e,...t}){return(0,$.jsx)(J.Item,{"data-slot":`command-item`,className:A(`relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,e),...t})}function Ot({className:e,...t}){return(0,$.jsx)(`span`,{"data-slot":`command-shortcut`,className:A(`ml-auto text-xs tracking-widest text-muted-foreground`,e),...t})}var kt={sky:`text-catppuccin-sky`,blue:`text-catppuccin-blue`,green:`text-catppuccin-green`,teal:`text-catppuccin-teal`,mauve:`text-catppuccin-mauve`,lavender:`text-catppuccin-lavender`,peach:`text-catppuccin-peach`,yellow:`text-catppuccin-yellow`,red:`text-catppuccin-red`};function At({theme:e}){let{background:t,blue:n,mauve:r,green:i}=e.colors;return(0,$.jsx)(`span`,{className:`flex size-5 shrink-0 overflow-hidden rounded-sm border border-catppuccin-surface2`,children:[t,n,r,i].map((e,t)=>(0,$.jsx)(`span`,{className:`flex-1`,style:{backgroundColor:e}},t))})}function jt(){let{t}=k(),{activeDialog:r,closeDialog:C,openDialog:E}=n(),D=n(e=>e.setWelcomeVisible),O=n(e=>e.setFooterMessage),{executeCurrentQuery:j,executeCurrentStatement:M,executeWholeScript:N,addNewQueryTab:oe,disconnectActive:se}=l(),{capabilities:ce}=_e(),ve=fe(),F=P(e=>e.activeConnections.find(t=>t.id===e.activeConnectionId)),ye=P(e=>e.activeConnectionId?e.transactionOpen[e.activeConnectionId]??!1:!1),I=P(e=>e.updateProfile),be=f(e=>e.themeId),Ve=f(e=>e.setTheme),He=de(e=>e.locale),Ue=de(e=>e.setLocale),We=r===`quick-command`,R=F!==void 0,z=le(e=>{let t=P.getState().activeConnectionId;if(!t)return!1;let n=e.activeTabId[t];return(e.tabs[t]??ue).find(e=>e.id===n)?.isExecuting??!1});async function Ge(){let e=P.getState().activeConnectionId;if(!e)return;let t=pe(await me(e));t&&n.getState().setFooterMessage(t)}let B=(0,L.useCallback)(e=>{C(),e()},[C]),V=(0,L.useCallback)(e=>O(e instanceof Error?e.message:String(e)),[O]),Ke=()=>{let t=P.getState().activeConnectionId;t&&(s.getState().openERD(t),e(`erd_open`),le.getState().setActiveQueryTab(t,`erd`))},qe=[{heading:t(`palette.groups.connection`),commands:[{id:`connect`,label:t(`palette.commands.connect`),icon:Me,tone:`sky`,shortcut:`Alt+N`,keywords:[`connect`,`server`,`profile`,`login`],disabled:!ve,action:()=>B(()=>E(`connect`))},{id:`disconnect`,label:t(`palette.commands.disconnect`),icon:c,tone:`red`,keywords:[`disconnect`,`close`],disabled:!R,action:()=>B(()=>{se()})},{id:`read-only`,label:t(`menu.connection.readOnly`),icon:b,tone:`yellow`,keywords:[`read only`,`safety`,`guard`],disabled:!R,checked:F?.readOnly===!0,action:()=>B(()=>{F&&I(F.id,{readOnly:!F.readOnly})})},{id:`manual-transactions`,capability:`transactions`,label:t(`menu.connection.manualTransactions`),icon:te,tone:`lavender`,keywords:[`transaction`,`manual`,`autocommit`],disabled:!R,checked:F?.transactionMode===`manual`,action:()=>B(()=>{F&&I(F.id,{transactionMode:F.transactionMode===`manual`?`auto`:`manual`})})},{id:`commit`,capability:`transactions`,label:t(`toolbar.commit`),icon:h,tone:`green`,keywords:[`commit`,`transaction`],disabled:!ye||!F,action:()=>B(()=>{F&&he(F.id).catch(V)})},{id:`rollback`,capability:`transactions`,label:t(`toolbar.rollback`),icon:m,tone:`peach`,keywords:[`rollback`,`transaction`,`undo`],disabled:!ye||!F,action:()=>B(()=>{F&&ge(F.id).catch(V)})}]},{heading:t(`palette.groups.query`),commands:[{id:`execute`,label:t(`palette.commands.executeQuery`),icon:v,tone:`green`,shortcut:`F9`,keywords:[`run`,`execute`,`sql`],disabled:!R,action:()=>B(()=>{j()})},{id:`stop-query`,label:t(`result.running.stop`),icon:i,tone:`red`,keywords:[`stop`,`cancel`,`abort`,`kill`],disabled:!z,action:()=>B(()=>{Ge()})},{id:`execute-statement`,label:t(`menu.query.executeStatementAtCursor`),icon:Ce,tone:`green`,shortcut:`Ctrl+Enter`,keywords:[`run`,`statement`,`cursor`],disabled:!R,action:()=>B(()=>{M()})},{id:`execute-script`,label:t(`menu.query.executeWholeScript`),icon:Ie,tone:`teal`,shortcut:`Ctrl+Shift+Enter`,keywords:[`run`,`script`,`batch`],disabled:!R,action:()=>B(()=>{N()})},{id:`new-tab`,label:t(`palette.commands.newQueryTab`),icon:S,tone:`blue`,shortcut:`Alt+T`,keywords:[`new`,`tab`,`editor`],disabled:!R,action:()=>B(()=>oe())},{id:`find-replace`,label:t(`menu.query.findReplace`),icon:Ne,tone:`lavender`,keywords:[`find`,`replace`,`search`],disabled:!R,action:()=>B(()=>E(`find-replace`))},{id:`local-history`,label:t(`menu.query.localHistory`),icon:ke,tone:`mauve`,keywords:[`history`,`snapshot`,`undo`],disabled:!R,action:()=>B(()=>E(`local-history`))}]},{heading:t(`palette.groups.database`),commands:[{id:`create-db`,capability:`multipleDatabases`,label:t(`palette.commands.createDatabase`),icon:ne,tone:`blue`,keywords:[`create`,`database`,`schema`],disabled:!R,action:()=>B(()=>E(`create-database`))},{id:`alter-db`,capability:`multipleDatabases`,label:t(`menu.database.alter`),icon:we,tone:`blue`,keywords:[`alter`,`database`,`charset`],disabled:!R,action:()=>B(()=>E(`alter-database`))},{id:`copy-db`,capability:`multipleDatabases`,label:t(`menu.database.copy`),icon:_,tone:`sky`,keywords:[`copy`,`clone`,`database`],disabled:!R,action:()=>B(()=>E(`copy-database`))},{id:`schema-diff`,label:t(`menu.database.compare`),icon:De,tone:`mauve`,keywords:[`compare`,`diff`,`schema`,`sync`],pro:!0,disabled:!R,action:()=>B(()=>E(`schema-diff`))},{id:`data-diff`,label:t(`menu.database.compareData`),icon:Oe,tone:`mauve`,keywords:[`compare`,`diff`,`data`,`rows`],pro:!0,disabled:!R,action:()=>B(()=>E(`data-diff`))}]},{heading:t(`palette.groups.table`),commands:[{id:`create-table`,label:t(`palette.commands.createTable`),icon:d,tone:`green`,keywords:[`create`,`table`],disabled:!R,action:()=>B(()=>E(`create-table`))},{id:`alter-table`,label:t(`palette.commands.alterTable`),icon:Be,tone:`yellow`,keywords:[`alter`,`table`,`column`],disabled:!R,action:()=>B(()=>E(`alter-table`))},{id:`duplicate-table`,label:t(`menu.table.duplicateStructure`),icon:Se,tone:`teal`,keywords:[`duplicate`,`structure`,`table`],disabled:!R,action:()=>B(()=>E(`duplicate-table-structure`))}]},{heading:t(`menu.export.title`),commands:[{id:`export-csv`,label:t(`menu.export.csv`),icon:Ee,tone:`green`,keywords:[`export`,`csv`,`excel`],disabled:!R,action:()=>B(()=>E(`export-csv`))},{id:`export-html`,label:t(`menu.export.schemaHtml`),icon:Te,tone:`peach`,keywords:[`export`,`html`,`schema`,`documentation`],disabled:!R,action:()=>B(()=>E(`export-html`))}]},{heading:t(`palette.groups.tools`),commands:[{id:`process-list`,capability:`processList`,label:t(`palette.commands.processList`),icon:T,tone:`red`,keywords:[`process`,`kill`,`connections`],disabled:!R,action:()=>B(()=>E(`process-list`))},{id:`variables`,capability:`variables`,label:t(`palette.commands.serverVariables`),icon:Le,tone:`lavender`,keywords:[`variables`,`server`,`settings`],disabled:!R,action:()=>B(()=>E(`variables`))},{id:`status`,capability:`status`,label:t(`palette.commands.serverStatus`),icon:ee,tone:`teal`,keywords:[`status`,`server`,`metrics`],disabled:!R,action:()=>B(()=>E(`status`))},{id:`flush`,capability:`flush`,label:t(`palette.commands.flush`),icon:y,tone:`peach`,keywords:[`flush`,`cache`,`reload`],disabled:!R,action:()=>B(()=>E(`flush`))},{id:`user-manager`,capability:`users`,label:t(`palette.commands.userManager`),icon:x,tone:`blue`,keywords:[`users`,`grants`,`privileges`],disabled:!R,action:()=>B(()=>E(`user-manager`))},{id:`scratchpad`,label:t(`menu.tools.scratchpad`),icon:g,tone:`yellow`,keywords:[`scratchpad`,`sqlite`,`local`],pro:!0,action:()=>B(()=>{a().catch(V)})},{id:`federated`,label:t(`menu.tools.federated`),icon:ze,tone:`mauve`,keywords:[`federated`,`cross`,`join`,`connections`],pro:!0,action:()=>B(()=>{u().catch(V)})},{id:`erd`,label:t(`menu.tools.viewErd`),icon:je,tone:`sky`,keywords:[`erd`,`diagram`,`relations`],disabled:!R,action:()=>B(Ke)}]},{heading:t(`menu.settings.theme`),commands:p().map(e=>({id:`theme-${e.id}`,label:e.name,tone:`lavender`,keywords:[`theme`,`color`,`appearance`,`dark`,`light`,e.id],checked:be===e.id,swatch:e,action:()=>B(()=>Ve(e.id))}))},{heading:t(`menu.settings.language`),commands:[`auto`,...ae].map(e=>({id:`locale-${e}`,label:e===`auto`?t(`language.auto`,{name:t(`language.${ie()}`)}):t(`language.${e}`),icon:Ae,tone:`teal`,keywords:[`language`,`locale`,`i18n`,e],checked:He===e,action:()=>B(()=>Ue(e))}))},{heading:t(`menu.settings.title`),commands:[{id:`safety-settings`,label:t(`menu.settings.safety`),icon:Re,tone:`yellow`,keywords:[`safety`,`settings`,`row limit`,`preferences`],action:()=>B(()=>E(`safety-settings`))}]},{heading:t(`menu.help.title`),commands:[{id:`documentation`,label:t(`menu.help.documentation`),icon:xe,tone:`blue`,keywords:[`docs`,`documentation`,`manual`,`help`],action:()=>B(()=>{window.open(re(),`_blank`,`noopener,noreferrer`)})},{id:`getting-started`,label:t(`menu.help.gettingStarted`),icon:Pe,tone:`green`,keywords:[`welcome`,`onboarding`,`sample`,`getting started`],action:()=>B(()=>D(!0))},{id:`terms`,label:t(`menu.help.terms`),icon:Fe,tone:`peach`,keywords:[`terms`,`privacy`,`legal`],action:()=>B(()=>E(`terms`))},{id:`about`,label:t(`menu.help.about`),icon:w,tone:`sky`,keywords:[`about`,`version`,`agent`],action:()=>B(()=>E(`about`))}]}];function Je(e){e||C()}let H=qe.map(e=>({...e,commands:e.commands.filter(e=>!e.capability||ce[e.capability])})).filter(e=>e.commands.length>0);return(0,$.jsxs)(St,{open:We,onOpenChange:Je,title:t(`palette.title`),description:t(`palette.description`),children:[(0,$.jsx)(Ct,{placeholder:t(`palette.inputPlaceholder`)}),(0,$.jsxs)(wt,{className:`max-h-[60vh]`,children:[(0,$.jsx)(Tt,{children:t(`palette.empty`)}),H.map(e=>(0,$.jsx)(Et,{heading:e.heading,children:e.commands.map(t=>(0,$.jsxs)(Dt,{value:`${e.heading} ${t.label}`,keywords:t.keywords,disabled:t.disabled,onSelect:t.action,children:[t.swatch?(0,$.jsx)(At,{theme:t.swatch}):t.icon?(0,$.jsx)(t.icon,{className:A(`size-4`,kt[t.tone])}):null,(0,$.jsx)(`span`,{className:`truncate`,children:t.label}),(0,$.jsxs)(`span`,{className:`ml-auto flex shrink-0 items-center gap-2`,children:[t.pro&&(0,$.jsx)(o,{className:`ml-0`}),t.checked&&(0,$.jsx)(h,{className:`size-3.5 text-catppuccin-green`}),t.shortcut&&(0,$.jsx)(Ot,{className:`ml-0`,children:t.shortcut})]})]},t.id))},e.heading))]})]})}export{jt as QuickCommandPalette};
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e,n as t,r as n}from"./ui-store-DfspmPOn.js";import{a as r,i}from"./i18n-XcmivDWI.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-Bz1pmp4E.js";import{t as d}from"./hmr-singleton-Bit0Kfog.js";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:y()}),t=await e.json().catch(()=>null);if(!e.ok||!t||t.success!==!0)throw new b(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 fe(e){return e?.trim()||m.token||void 0}function y(e){let t={"Content-Type":`application/json`},n=fe(e);return n&&(t.Authorization=`Bearer ${n}`),t}var b=class extends Error{status;body;constructor(e,t,n=null){super(e),this.status=t,this.body=n}};function pe(e){if(!(e instanceof b)||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 me(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 x(e,t,n){let i;try{i=await fetch(`${h()}${e}`,{method:`POST`,headers:y(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 b(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 he(e,t){let n=await x(`/connect`,e,t);return n.success&&n.connectionId&&(de(n.connectionId,fe(t)),ve()),n}async function ge(e){try{return(await x(`/cancel`,{connectionId:e},v.get(e))).cancelled?`cancelled`:`unsupported`}catch(e){return e instanceof b&&e.status===404?`agent-outdated`:`failed`}}async function _e(e,t,n){let r=performance.now(),i=await x(`/query`,{connectionId:e,sql:t,database:n},v.get(e));return i.execTime||=Math.round(performance.now()-r),i}function ve(){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:y(t),body:JSON.stringify({connectionId:e}),keepalive:!0}).catch(()=>void 0)}))}async function ye(e){try{await x(`/disconnect`,{connectionId:e},v.get(e))}finally{v.delete(e)}}async function be(e,t){return x(`/test-connection`,e,t)}var S=0;function xe(e){S>=3||(async()=>{try{(await fetch(`${h()}/usage`,{method:`POST`,headers:y(),body:JSON.stringify({feature:e})})).ok?S=0:S+=1}catch{S+=1}})()}function C(e,t,n){return e.map(e=>e.id===t?n(e):e.children.length>0?{...e,children:C(e.children,t,n)}:e)}function Se(e,t){for(let n of e){if(n.id===t)return n;let e=Se(n.children,t);if(e)return e}return null}function w(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 Ce=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]:w(e.expandedIds[t],n,!0)},trees:{...e.trees,[t]:C(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]:C(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=!Se(r,n)?.isExpanded;return{expandedIds:{...e.expandedIds,[t]:w(e.expandedIds[t],n,i)},trees:{...e.trees,[t]:C(r,n,e=>({...e,isExpanded:i}))}}}),setExpanded:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{expandedIds:{...e.expandedIds,[t]:w(e.expandedIds[t],n,r)},trees:{...e.trees,[t]:C(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]:C(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})})),T=32,E=24,we=931071618,D=931071619,O=(e,t)=>(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0,Te=(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:Te;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 Ee(e){if(e.byteLength<T)return null;let t=O(e,0);if(t!==we&&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=T;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=Ee(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 De=`planche-file-handles`,j=`handles`;function Oe(){return new Promise((e,t)=>{if(typeof indexedDB>`u`){t(Error(`IndexedDB unavailable`));return}let n=indexedDB.open(De,1);n.onupgradeneeded=()=>n.result.createObjectStore(j),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function M(e,t){return Oe().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 ke(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 Ae(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 je(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 Me(e){try{await o.remove(z(e)),await s.removeItem(R(e))}catch{}}var Ne=`browser:`;function B(e){return typeof e==`string`&&e.startsWith(`browser:`)}var Pe=750;function Fe(e){let t=W.get(e);t?.profileId&&(t.flushTimer&&clearTimeout(t.flushTimer),t.flushTimer=setTimeout(()=>{t.flushTimer=null,V(e)},Pe))}async function V(e){let t=W.get(e);if(t?.profileId)try{let n=await et(e);await Ae(t.profileId,n,H(t))}catch(e){console.warn(`[browser-sqlite] cache flush failed:`,e)}}function H(e){return{name:e.source.name,lastModified:e.fileMeta.lastModified,size:e.fileMeta.size,dirty:e.dirty,cachedAt:Date.now()}}var Ie=d(`browserSqliteVisibilityListener`,()=>({installed:!1}));typeof document<`u`&&!Ie.installed&&(Ie.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),Le=d(`browserSqliteModule`,()=>({promise:null}));async function G(){return Le.promise||=i(()=>import(`./dist-Roudme38.js`).then(e=>e.default()),[]),Le.promise}function K(e){let t=W.get(e);if(!t)throw Error(`Browser connection not found: ${e}`);return t}function Re(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 ze=`SQLite format 3\0`;function Be(e){if(e.byteLength===0)return null;if(e.byteLength<100)return r.t(`services.sqliteFile.tooSmall`);if(String.fromCharCode(...e.subarray(0,16))!==ze)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 Ve(e){let t=Be(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 He(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 Ue(){let e=await He({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 We(){let[e]=await He({multiple:!1,sqliteOnly:!1});return e??null}async function q(e,t,n={}){let{bytes:r,wal:i}=Re(e),a=await Ve(r),o=`${Ne}${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 Ge(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 Ke(e,t){let n=K(e);n.source={...n.source,handle:t}}function qe(e){return W.get(e)?.dirty??!1}async function Je(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 Ye(e){return e&&e.trim().toLowerCase().replace(/\(.*$/,``).trim()||null}function Xe(e){return e==null?`null`:typeof e==`number`?Number.isInteger(e)?`integer`:`real`:typeof e==`bigint`?`bigint`:e instanceof Uint8Array?`blob`:`text`}function Ze(e){return typeof e==`bigint`?Number(e):e instanceof Uint8Array?{type:`Buffer`,data:Array.from(e)}:e}async function Qe(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,Fe(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(Ze));let l=s.getColumnNames(),u=r.capi,d=s.pointer;return{success:!0,fields:l.map((e,t)=>{let n=Ye(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??Xe($e(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 $e(e,t){for(let n of e){let e=n[t];if(e!=null)return e}return null}async function et(e){let{db:t}=K(e);return(await G()).capi.sqlite3_js_db_export(t.pointer)}function tt(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 nt(e){let t=K(e);t.source={...t.source,walAcknowledged:!0}}async function rt(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 it(e){let t=K(e),{source:n}=t,i=tt(e);if(i)throw Error(i);n.handle&&await rt(t);let a=await et(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&&je(i.profileId,{...H(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 at(e){await I(e),await I(N(e)),await Me(e)}async function ot(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 st(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 ct(e,t){let n={remembered:!0,fromCache:!1,restoredUnsaved:!1,fileDetached:!1,diskChanged:!1},r=await ke(e),i=await ot(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 Ge(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 st(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 Ge(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 Ue();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 lt=`SQLite format 3\0`;async function ut(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)===lt}async function dt(e,t){try{let n=await F(e);return n?await n.isSameEntry(t):!1}catch{return!1}}async function ft(n){let i=n.find(e=>!U(e.file.name));if(!i)return;if(!await ut(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 dt(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?Ce.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 pt(e,t){let n=await ot(e,!0);return!n||n===`denied`?!1:(Ke(t,n.handle),!0)}async function mt(e){let t=Z(e),n=Y(e);return n&&!n.handle&&t&&await pt(t,e),it(e)}function ht(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 gt(e,t){let n=await We();if(!n)return null;let r=await Je(t,n);return n.handle&&await P(N(e),n.handle),{connectionId:r.connectionId,appliedFrames:r.appliedFrames}}function _t(e){if(!B(e))return null;let t=Y(e);return t?{wal:t.wal,walApplied:t.walApplied,walAcknowledged:t.walAcknowledged??!1}:null}function vt(e){return e.dbms===`sqlite`&&e.transport===`browser`?`browser`:`tunnel`}async function yt(e,t){return he(e,t)}async function bt(e,t){return be(e,t)}async function xt(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 Qe(e,t)}catch(e){return r(e)}let i=Q.get(e)??e;try{return await _e(i,t,n)}catch(e){if(!(e instanceof b)||e.status!==404)return r(e);let a=await St(i);if(!a)return r(e);try{return await _e(a,t,n)}catch(e){return r(e)}}}var Q=new Map,$=new Map;function St(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||vt(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 he(_(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 Ct(e){if(B(e)){let t=Z(e);X(e),t&&await Me(t);return}return ye(e)}function wt(e){return e===`cancelled`?null:e===`agent-outdated`?r.t(`result.running.agentOutdated`):e===`unsupported`?r.t(`result.running.cannotCancel`):r.t(`result.running.cancelFailed`)}async function Tt(e){if(B(e))return`unsupported`;let t=l.getState().activeConnections.find(t=>t.id===e)?.serverConnectionId;return t?ge(t):`failed`}function Et(e){return async(t,n)=>{let i=await xt(e,t,n);if(!i.success)throw Error(i.message??r.t(`services.query.failed`));return i}}export{xe as A,se as C,pe as D,ue as E,f as M,ee as N,oe as O,p as P,Ce as S,ne as T,nt as _,Et as a,qe as b,xt as c,vt as d,gt as f,bt as g,mt as h,yt as i,_ as j,me as k,at as l,pt as m,wt as n,ht as o,ft as p,ct as r,Ct as s,Tt as t,_t as u,tt as v,le as w,J as x,B as y};
|
|
@@ -1,2 +0,0 @@
|
|
|
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`,tsv:`Als TSV 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`,exportTsv:`Als TSV 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}}`,firstPage:`Erste Seite`,prevPage:`Vorherige Seite`,nextPage:`Nächste Seite`,lastPage:`Letzte 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.`},running:{label:`Abfrage läuft…`,elapsed:`{{seconds}}s`,stop:`Stoppen`,stopping:`Wird gestoppt…`,cannotCancel:`Diese Engine kann eine laufende Anweisung nicht abbrechen.`,agentOutdated:"Der lokale Agent ist zu alt, um eine Abfrage zu stoppen. Aktualisieren Sie ihn mit `npx planche@latest` (oder `planche upgrade`) und verbinden Sie sich neu.",cancelFailed:`Der Agent war nicht erreichbar, die Abfrage wurde nicht gestoppt.`}},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`,applying:`Wird angewendet…`,cannotAlterColumns:`{{engine}} kann eine bereits vorhandene Spalte nicht ändern ({{columns}}). Spalten hinzufügen, entfernen und umbenennen sowie Indizes ändern funktionieren; für eine geänderte Spaltendefinition muss die Tabelle neu erstellt werden.`},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`,creating:`{{database}} wird erstellt…`,copying:`{{table}} wird kopiert ({{index}} von {{total}})…`},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 {{format}} 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 aus {{table}} als {{format}} 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}}`},schema:{createTitle:`Schema erstellen`,name:`Schemaname`,namePlaceholder:`Schemanamen eingeben`,create:`Erstellen`,cancel:`Abbrechen`}},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`,noChanges:`Keine Rechteänderungen zum Anwenden.`},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,2 +0,0 @@
|
|
|
1
|
-
var e={reconnecting:`Reconnexion…`,dropSqlite:`Déposez pour ouvrir le fichier SQLite`,dropSqliteHint:`Ouvert dans votre navigateur via WebAssembly — le fichier reste sur votre ordinateur. Déposez le fichier -wal avec lui s'il existe.`,dropFailedTitle:`Impossible d'ouvrir le fichier déposé`,dropNotSqlite:`{{name}} n'est pas un fichier de base de données SQLite.`,crashTitle:`Un problème est survenu`,crashBody:`L'application a rencontré une erreur inattendue. Recharger restaure les connexions et les onglets ; les modifications de grille non enregistrées sont perdues.`,crashReload:`Recharger`},t={auto:`Langue du système ({{name}})`,en:`English`,ko:`한국어`,zh:`中文(简体)`,ja:`日本語`,de:`Deutsch`,fr:`Français`},n={title:`Sécurité`,description:`Garde-fous contre la perte accidentelle de données. Le mode lecture seule, la couleur d'environnement et le mode de transaction se règlent par connexion.`,language:`Langue`,languageHint:`S'applique immédiatement. « Langue du système » suit votre navigateur.`,resetDefaults:`Rétablir les valeurs par défaut`,done:`Terminé`,analytics:`Partager des statistiques d'utilisation anonymes`,analyticsHint:`Envoie des événements d'utilisation anonymes (moteur, fonctionnalité, type d'instruction) à Google Analytics. Jamais le texte SQL, les noms d'hôte, de table ou d'utilisateur.`,analyticsUnavailableHint:`Inactif dans cette version (aucun identifiant de mesure configuré).`,persistHistory:`Conserver l'historique des requêtes après rechargement`,persistHistoryHint:`Le texte des instructions est stocké dans ce navigateur (les mots de passe littéraux sont masqués ; les onglets d'éditeur ouverts sont toujours conservés). Désactivé : l'historique et les instantanés ne vivent que jusqu'à la fermeture de l'onglet.`},r={settings:{safety:`Sécurité…`,language:`Langue`,title:`Paramètres`,theme:`Thème`},help:{gettingStarted:`Premiers pas`,about:`À propos de Planche`,title:`Aide`,documentation:`Documentation`,learn:`Apprendre le SQL`,terms:`Conditions d’utilisation`},connection:{title:`Connexion`,connect:`Se connecter`,disconnect:`Se déconnecter`,readOnly:`Lecture seule`,manualTransactions:`Transactions manuelles`,saveDatabaseFile:`Enregistrer le fichier de base de données`,saveDatabaseFileBlocked:`Enregistrer le fichier de base de données (charger d'abord le -wal)`,exit:`Quitter`},query:{title:`Requête`,execute:`Exécuter`,executeStatementAtCursor:`Exécuter l'instruction au curseur`,executeWholeScript:`Exécuter tout le script`,newQueryTab:`Nouvel onglet de requête`,findReplace:`Rechercher et remplacer`,localHistory:`Historique local…`},edit:{title:`Édition`,undo:`Annuler`,redo:`Rétablir`,cut:`Couper`,copy:`Copier`,paste:`Coller`,selectAll:`Tout sélectionner`},database:{title:`Base de données`,create:`Créer une base de données`,alter:`Modifier la base de données`,drop:`Supprimer la base de données`,copy:`Copier la base de données`,compare:`Comparer les schémas…`,truncate:`Tronquer la base de données`,compareData:`Comparer les données…`},table:{title:`Table`,create:`Créer une table`,alter:`Modifier la table`,drop:`Supprimer la table`,rename:`Renommer la table`,truncate:`Tronquer la table`,duplicateStructure:`Dupliquer la structure de la table`},export:{title:`Exporter`,csv:`Télécharger en CSV`,tsv:`Télécharger en TSV`,schemaHtml:`Schéma en HTML`,links:`Exporter les liens de colonnes…`,importLinks:`Importer les liens de colonnes…`},tools:{title:`Outils`,userManager:`Gestion des utilisateurs`,processList:`Liste des processus`,variables:`Variables`,status:`État`,flush:`Flush`,quickCommand:`Commande rapide`,viewErd:`Afficher l'ERD`,scratchpad:`Bloc-notes (SQLite dans le navigateur)`,federated:`Requête fédérée (jointure entre connexions)…`,federatedTab:`Fédérée {{n}}`},messages:{databaseFileSaved:`Fichier de base de données enregistré`,databaseExported:`Base de données exportée en téléchargement`,databaseExportedWithReason:`Base de données exportée en téléchargement — {{reason}}`,errorSavingDatabase:`Erreur lors de l'enregistrement de la base de données : {{message}}`,noDatabaseSelected:`Aucune base de données sélectionnée`,noTableSelected:`Aucune table sélectionnée`,noActiveConnection:`Aucune connexion active`,databaseDropped:`Base de données « {{database}} » supprimée`,errorDroppingDatabase:`Erreur lors de la suppression de la base de données : {{message}}`,noTablesInDatabase:`Aucune table trouvée dans la base de données « {{database}} »`,databaseTruncated_one:`{{count}} table de « {{database}} » tronquée`,databaseTruncated_other:`Les {{count}} tables de « {{database}} » ont été tronquées`,errorTruncatingDatabase:`Erreur lors du tronquage de la base de données : {{message}}`,tableDropped:`Table « {{table}} » supprimée`,errorDroppingTable:`Erreur lors de la suppression de la table : {{message}}`,tableTruncated:`Table « {{table}} » tronquée`,errorTruncatingTable:`Erreur lors du tronquage de la table : {{message}}`,renameTablePrompt:`Renommer la table « {{table}} » en :`,tableRenamed:`Table « {{table}} » renommée en « {{newName}} »`,errorRenamingTable:`Erreur lors du renommage de la table : {{message}}`,truncateDatabaseTitle:`Vider toutes les tables de "{{name}}" ?`,truncateDatabaseDescription:`Toutes les lignes des {{count}} table(s) de "{{name}}" seront supprimées. La structure des tables est conservée. Cette action est irréversible.`,truncateDatabaseConfirm:`Vider toutes les tables`,renameTableTitle:`Renommer la table`,renameTableConfirm:`Renommer`,noLinksToExport:`Aucun lien de colonne à exporter.`,linksExported:`{{count}} liens de colonnes exportés.`,linksImported:`{{count}} liens de colonnes importés.`,linksImportedPartial:`{{count}} liens de colonnes importés ; aucun profil correspondant pour : {{profiles}}`,linksImportFailed:`Impossible d'importer les liens de colonnes : {{reason}}`}},i={title:`À propos de Planche`,tagline:`Un client de base de données pour MySQL, MariaDB, PostgreSQL et SQLite.`,version:`Version`,website:`Site web`,licenses:`Licences`,licensesLink:`Mentions des tiers`,disclaimer:`Planche est fourni « tel quel », sans garantie d'aucune sorte. Les auteurs ne sauraient être tenus responsables des dommages ou pertes de données découlant de son utilisation. Sauvegardez vos données avant d'exécuter des instructions destructrices.`,rights:`Tous droits réservés.`},a=JSON.parse(`{"dialog":{"title":"Se connecter à une base de données","firstQueryTab":"Requête 1","colHostName":"Nom de l'hôte","colTarget":"Cible","colDbms":"SGBD","noSaved":"Aucune connexion enregistrée","unnamed":"(sans nom)","pickOnConnect":"(choisir à la connexion)","noFile":"(aucun fichier)","selectPrompt":"Sélectionnez une connexion ou ajoutez-en une nouvelle","addNew":"Ajouter","delete":"Supprimer","testConnection":"Tester la connexion","connect":"Se connecter","close":"Fermer","unknownError":"Erreur inconnue","browserTestHint":"Les connexions SQLite dans le navigateur ouvrent un fichier local lorsque vous cliquez sur Se connecter.","testSuccess":"Connexion réussie","restoredUnsaved":"{{file}} : modifications non enregistrées restaurées depuis la copie en cache","restoredUnsavedDiskChanged":"{{file}} : modifications non enregistrées restaurées depuis la copie en cache — attention, le fichier sur le disque a changé depuis","walPending":"{{file}} est en mode WAL : des modifications récentes peuvent encore se trouver dans son fichier -wal. Utilisez « Charger le fichier -wal » ci-dessus pour les inclure.","walApplied":"{{file}} ouvert avec ses modifications -wal appliquées","connectFailedTitle":"Échec de la connexion","testSuccessDescription":"Le serveur a accepté les identifiants.","testFailedTitle":"Échec du test de connexion","privacy":"Rien de ce que vous saisissez ici n'est envoyé ni stocké sur les serveurs de planche.dev. Les profils de connexion restent uniquement dans le stockage local de ce navigateur ; les requêtes vont directement de l'agent local à votre base de données.","hostKeyTitle":"Clé d'hôte SSH inconnue","hostKeyDescription":"{{host}}:{{port}} a présenté une clé {{type}} d'empreinte {{fingerprint}}. Comparez-la avec l'empreinte fournie par l'administrateur du serveur ; accepter une mauvaise clé permet à un attaquant de lire votre trafic.","hostKeyAccept":"Faire confiance à cet hôte","gatewayTitle":"Profils de la passerelle","gatewayAdd":"Ajouter","gatewayAdded":"Profil de passerelle {{name}} ajouté.","gatewayReadOnly":"lecture seule","gatewayWritable":"modifiable","gatewayProfileHint":"Cette connexion utilise le profil « {{name}} » détenu par la passerelle ; rien à configurer ici.","gatewayLoadFailed":"Impossible de charger les profils de la passerelle : {{error}}"},"form":{"hostName":"Nom de l'hôte","hostNamePlaceholder":"Ma connexion","dataSource":"Source de données","openVia":"Ouvrir via","viaBrowser":"Navigateur (fichier local)","viaAgent":"Agent local","viaBrowserHint":"Rien à installer. Idéal pour les fichiers qu'aucun autre programme n'utilise : le navigateur travaille sur une copie en mémoire et ne peut pas verrouiller le fichier ; les modifications faites ailleurs pendant qu'il est ouvert ne sont pas vues et Enregistrer les écrase.","viaAgentHint":"Ouvre le fichier avec SQLite lui-même via npx planche — verrouillage et WAL corrects, sûr même si d'autres programmes utilisent la même base de données.","databaseFile":"Fichier de base de données","changeFile":"Changer de fichier","filePickerHint":"Un sélecteur de fichier s'ouvre lorsque vous cliquez sur Se connecter (astuce : ⌘⇧. affiche les fichiers cachés, ⌘⇧G permet de saisir un chemin).","fileRememberedHint":"Le fichier choisi est mémorisé (Chromium), la reconnexion ne demande donc que l'autorisation. Utilisez Connexion > Enregistrer le fichier de base de données pour écrire les modifications.","authToken":"Jeton d'authentification","authTokenPlaceholder":"Laisser vide pour utiliser le jeton de l'agent appairé","filePathPlaceholder":"/chemin/vers/database.sqlite ou :memory:","createIfMissing":"Créer si absent","createIfMissingHint":"Le chemin est résolu sur l'hôte du serveur de tunnel","host":"Hôte","port":"Port","database":"Base de données","serviceName":"Nom du service","user":"Utilisateur","password":"Mot de passe","savePassword":"Enregistrer le mot de passe","savePasswordHint":"Désactivé : le mot de passe n'est conservé que pour cette session du navigateur et n'est jamais écrit sur le disque.","charset":"Jeu de caractères","autoConnection":"Connexion automatique","safety":"Sécurité","environment":"Environnement","environmentHint":"colore l'onglet et l'espace de travail","readOnly":"Lecture seule","readOnlyHint":"Refuser les instructions qui modifient les données ou le schéma","transactions":"Transactions","txAuto":"Auto-commit","txManual":"Manuel — Commit / Rollback depuis la barre d'outils","ssh":"SSH","sshTunnel":"Tunnel SSH","sshTunnelHint":"Atteindre la base via un hôte de rebond SSH (le tunnel est ouvert par l'agent local)","sshHost":"Hôte SSH","sshPort":"Port SSH","sshUser":"Utilisateur SSH","sshAuth":"Auth SSH","sshAuthKey":"Clé privée","sshAuthPassword":"Mot de passe","sshAuthAgent":"ssh-agent","sshAuthAgentHint":"Utilise les clés chargées dans le ssh-agent de la machine qui exécute npx planche (SSH_AUTH_SOCK).","sshPassword":"Mot de passe SSH","sshKey":"Clé privée","sshKeyPick":"Choisir un fichier de clé…","sshKeyLoaded":"Clé chargée","sshKeyHint":"Laisser vide pour utiliser l'IdentityFile de ~/.ssh/config (ou ~/.ssh/id_*) sur la machine de l'agent ; une clé choisie est enregistrée avec ce profil","sshPassphrase":"Phrase secrète","sshPassphrasePlaceholder":"Laisser vide si la clé n'en a pas","sshSecretsHint":"Le mot de passe SSH, la clé privée et la phrase de passe suivent le réglage « Enregistrer le mot de passe » ci-dessus. Les clés d'hôte inconnues sont affichées pour vérification avant la première connexion et enregistrées dans ~/.planche/known_hosts sur la machine de l'agent.","sshHostPlaceholder":"bastion.example.com ou un alias Host de ~/.ssh/config","sshUserPlaceholder":"Laisser vide pour utiliser ~/.ssh/config","sshTargetHint":"L'hôte et le port de la base sont résolus sur l'hôte de rebond — indiquez l'adresse réelle de la base (ex. le point de terminaison RDS), pas localhost ni une redirection de port locale.","connectionString":"Chaîne de connexion","connectionStringApplied":"Reportée dans les champs ci-dessous. La chaîne elle-même n'est pas enregistrée, seuls les champs le sont.","connectionStringInvalid":"Ce n'est pas un URI PostgreSQL (attendu : postgresql://user:password@host/database).","neonHint":"Collez l'URI de la console Neon (Connect > Connection string) ; les champs ci-dessous sont remplis à partir de celui-ci.","supabaseHint":"Collez l'URI de Supabase (Connect > Session pooler ou Direct connection) ; les champs ci-dessous sont remplis à partir de celui-ci.","supabasePoolerWarning":"Le port 6543 est le pooler en mode transaction : chaque instruction peut s'exécuter sur un backend différent, donc le changement de schéma, les tables temporaires, les prepared statements et les transactions manuelles ne fonctionnent pas. Utilisez le pooler de session (port 5432) ou la connexion directe.","managedTlsHint":"TLS est toujours activé pour ce service ; la connexion va directement de l'agent local au service (pas de tunnel SSH).","d1AccountId":"Account ID","d1DatabaseId":"Database ID","d1ApiToken":"Jeton API","d1Hint":"Account ID : tableau de bord Cloudflare, à droite de l'accueil du compte. Database ID : Storage & Databases > D1 > votre base. Jeton : My Profile > API Tokens > Create Token avec la permission « D1 Edit » (ou « D1 Read » en lecture seule). L'agent local appelle l'API Cloudflare avec ce jeton.","d1LimitsHint":"D1 exécute chaque requête isolément avec validation automatique : les transactions manuelles sont indisponibles ; la base apparaît comme l'unique schéma « main ».","doDevUrl":"URL wrangler dev","doHint":"Lancez \`wrangler dev\` dans votre projet Worker et collez l'URL affichée (port 8787 par défaut). L'agent local lit les Durable Objects de cette session, y compris ceux des autres sessions \`wrangler dev\` en cours d'exécution.","doLimitsHint":"Développement local uniquement : les Durable Objects déployés ne sont accessibles que depuis un Worker, Cloudflare ne propose donc aucune API pour les interroger. Chaque objet apparaît comme une base nommée « <espace de noms>/<objet> » ; chaque requête est validée automatiquement, les transactions manuelles sont donc indisponibles.","tls":"TLS","tlsEnable":"Chiffrer la connexion","tlsVerify":"Vérifier le certificat du serveur","tlsVerifyHint":"Désactivé : les certificats auto-signés sont acceptés (chiffré, mais le serveur n'est pas authentifié). Indisponible via un tunnel SSH."},"agent":{"copy":"Copier","looking":"Recherche de l'agent Planche…","online":"L'agent <b>v{{version}}</b> est en cours d'exécution sur <mono>{{url}}</mono>","outdated":"L'agent v{{version}} utilise le protocole {{protocol}}, mais cette application en requiert un plus récent. Redémarrez-le avec <cmd/>","unauthorized":"L'agent <b>v{{version}}</b> est en cours d'exécution sur <mono>{{url}}</mono>, mais cette application n'est pas appairée avec lui (le jeton change à chaque démarrage). Ouvrez le lien affiché dans le terminal de l'agent, ou collez le jeton sous Configurer.","offline":"Aucun agent à <mono>{{url}}</mono>. Lancez-le dans un terminal — il ouvre cette application déjà appariée.","close":"Fermer","configure":"Configurer","checkAgain":"Vérifier à nouveau","urlLabel":"URL de l'agent","urlPlaceholder":"http://127.0.0.1:8888 (par défaut)","tokenLabel":"Jeton","tokenPlaceholder":"Affiché par l'agent","reset":"Réinitialiser","save":"Enregistrer","remoteWarning":"Cet agent n'est pas sur votre ordinateur ({{host}}) : chaque connexion y envoie ses mots de passe et clés SSH.","remoteRefusedTitle":"Agent distant refusé","remoteRefused":"L'agent doit tourner sur cet ordinateur (127.0.0.1 ou localhost). Pour un agent sur une autre machine, redirigez son port avec \`ssh -L 8888:127.0.0.1:8888 user@host\` et gardez l'URL http://127.0.0.1:8888.","gateway":"Passerelle « {{name}} » : {{count}} profils côté serveur. Les identifiants restent sur la passerelle ; choisissez un profil ci-dessous."},"tab":{"noConnections":"Aucune connexion ouverte. Cliquez sur Se connecter pour commencer.","theSqliteFile":"le fichier SQLite","reopened":"{{file}} rouvert","reopenFailed":"Impossible de rouvrir le fichier : {{message}}","reopenPrompt":"Le navigateur a de nouveau besoin de votre autorisation pour lire <b>{{file}}</b>.","reopenFile":"Rouvrir le fichier","closeConnection":"Fermer la connexion","reconnected":"{{file}} reconnecté","accessNotGranted":"L'accès au fichier n'a pas été accordé ; Enregistrer exportera un téléchargement à la place.","detachedPrompt":"Travail sur une copie en cache de <b>{{file}}</b>. Reconnectez le fichier pour enregistrer les modifications sur place.","reconnectFile":"Reconnecter le fichier","detachedHide":"Masquer (Enregistrer demandera le fichier si nécessaire)","walFramesApplied_one":"{{count}} trame WAL appliquée depuis {{file}}-wal","walFramesApplied_other":"{{count}} trames WAL appliquées depuis {{file}}-wal","walNoChanges":"Le fichier -wal ne contenait aucune modification validée","walLoadFailed":"Impossible de charger le fichier -wal : {{message}}","walPrompt":"<b>{{file}}</b> est en mode WAL : il peut ne pas afficher les données les plus récentes tant que son fichier <mono>{{file}}-wal</mono> n'est pas chargé, et l'enregistrement est désactivé jusque-là. Si aucun fichier de ce type n'existe à côté (la base de données a été fermée proprement), confirmez-le plutôt. Si un autre programme utilise encore cette base de données, ouvrez-la plutôt via l'agent local (<mono>npx planche</mono>) : le navigateur ne peut pas partager le fichier en toute sécurité.","loadWal":"Charger le fichier -wal","noWalHint":"J'ai vérifié : il n'y a pas de fichier -wal à côté de la base de données","noWal":"Pas de fichier -wal","dismiss":"Ignorer","walHide":"Masquer (l'enregistrement reste désactivé)","readOnlyBadge":"lecture seule"}}`),o={connect:`Se connecter (Alt+N)`,disconnect:`Se déconnecter`,newQueryTab:`Nouvel onglet de requête (Alt+T)`,execute:`Exécuter (F9)`,executeStatement:`Exécuter l'instruction au curseur / la sélection (Ctrl+Enter)`,commit:`Commit`,commitHint:`Valider la transaction ouverte`,noOpenTransaction:`Aucune transaction ouverte`,rollback:`Rollback`,rollbackHint:`Annuler la transaction ouverte`,readOnlyBadge:`lecture seule`,readOnlyHint:`Cette connexion refuse les instructions qui modifient les données ou le schéma`,userManager:`Gestion des utilisateurs (Alt+U)`,quickCommand:`Commande rapide`,processList:`Liste des processus`,variables:`Variables`,status:`État`,flush:`Flush`,fullscreen:`Plein écran`},s={readOnly:`lecture seule`,txOpen:`tx ouverte`,manualTx:`tx manuelle`},c={title:`Commande rapide`,description:`Rechercher une commande à exécuter...`,inputPlaceholder:`Saisissez une commande ou recherchez...`,empty:`Aucune commande trouvée.`,groups:{connection:`Connexion`,query:`Requête`,database:`Base de données`,table:`Table`,tools:`Outils`},commands:{connect:`Se connecter`,disconnect:`Se déconnecter`,executeQuery:`Exécuter la requête`,newQueryTab:`Nouvel onglet de requête`,createDatabase:`Créer une base de données`,dropDatabase:`Supprimer la base de données`,createTable:`Créer une table`,alterTable:`Modifier la table`,dropTable:`Supprimer la table`,processList:`Liste des processus`,serverVariables:`Variables du serveur`,serverStatus:`État du serveur`,flush:`Flush`,userManager:`Gestion des utilisateurs`}},l={title:`Bienvenue dans Planche`,intro:`Un client SQL qui s'exécute dans votre navigateur. Vos bases de données sont accessibles via un petit agent sur votre machine : identifiants et données ne quittent jamais votre ordinateur.`,skip:`Passer`,skipTitle:`Masquer cet écran (Aide > Premiers pas le fait réapparaître)`,copy:`Copier`,copied:`Copié`,sampleOpenFailed:`Impossible d'ouvrir la base de données d'exemple : {{message}}`,steps:{agent:{title:`Lancer l'agent local`,body:`Lancez l’une de ces commandes dans un terminal. Elle démarre l’agent et l’apparie avec cette page.`},connection:{title:`Ajouter une connexion`,body:`Choisissez votre base de données pour ouvrir le formulaire de connexion avec les bons réglages par défaut.`},sample:{title:`Pas de base de données sous la main ? Essayez l'exemple`,body:`Chargez une base de données d'exemple de boutique en ligne (24 tables, ~50 k lignes, vues et déclencheurs) dans le navigateur pour essayer l'éditeur, la grille et l'arborescence du schéma.`,loading:`Chargement de l'exemple…`,button:`Essayer la base de données d'exemple`}},terms:{title:`Avant de commencer`,local:`Tout s’exécute localement : identifiants, requêtes et résultats restent sur votre machine et ne nous sont jamais envoyés.`,asIs:`Planche est fourni en l’état, sans garantie. Les garde-fous (confirmation des opérations destructives, mode lecture seule) sont des commodités, pas des garanties.`,dataLoss:`Vous êtes responsable de chaque instruction exécutée via Planche. Sauvegardez vos données avant toute opération destructive.`,agree:`J’ai lu et j’accepte les conditions d’utilisation.`,accepted:`Vous avez accepté les conditions d’utilisation.`,readFull:`Lire les conditions complètes`}},u={treeLabel:`Schéma`,unreachableHint:`Ce n'est pas la base de données à laquelle cette connexion est liée ; créez un profil pour elle afin de la parcourir`,objectType:{table:`Table`,view:`Vue`,procedure:`Procédure`,function:`Fonction`,trigger:`Déclencheur`,event:`Événement`},menu:{showCreate:`Afficher CREATE {{type}}`,alter:`Modifier {{type}}`,drop:`Supprimer {{type}}`,create:`Créer {{type}}`,refresh:`Actualiser`,unreachable:`Connectez-vous avec un profil lié à cette base de données pour la parcourir`,openDatabase:`Ouvrir la base de données`,createSchema:`Créer un schéma…`,createTable:`Créer une table`,dropDatabase:`Supprimer la base de données`,openSchema:`Ouvrir le schéma`,dropSchema:`Supprimer le schéma`,newQueryTab:`Nouvel onglet de requête`,generateSql:`Générer du SQL`,openTable:`Ouvrir la table`,alterTable:`Modifier la table`,showCreateTable:`Afficher CREATE TABLE`,duplicateStructure:`Dupliquer la structure`,copyTable:`Copier la table vers…`,compare:`Comparer {{type}}…`,truncateTable:`Tronquer la table`,dropTable:`Supprimer la table`,exportCsv:`Exporter en CSV`,exportTsv:`Exporter en TSV…`,openView:`Ouvrir la vue`,alterView:`Modifier la vue`,showCreateView:`Afficher CREATE VIEW`,dropView:`Supprimer la vue`,compareData:`Comparer les données…`},actions:{createStatementUnavailable:`-- Impossible de récupérer l'instruction CREATE pour {{type}} {{name}}`,getCreateFailed:`Échec de la récupération de CREATE {{type}} : {{message}}`,createTabTitle:`Créer {{type}}`,createSchemaTabTitle:`Créer un schéma`,generateSqlFailed:`Impossible de générer le SQL : {{message}}`,dropTableTitle:`Supprimer la table « {{name}} » ?`,dropTableDescription:`Cela supprime définitivement la table et toutes ses lignes{{from}}. Cette action est irréversible.`,dropTableConfirm:`Supprimer la table`,dropObjectTitle:`Supprimer {{type}} « {{name}} » ?`,dropObjectDescription:`La définition de {{type}} sera supprimée{{from}}. Cette action est irréversible.`,dropObjectConfirm:`Supprimer {{type}}`,fromDatabase:` de la base de données « {{database}} »`,dropped:`{{type}} {{name}} supprimé`,dropFailed:`Échec de la suppression de {{type}}`,dropDatabaseTitle:`Supprimer la base de données « {{name}} » ?`,dropDatabaseDescription:`Cela supprime définitivement la base de données avec toutes ses tables et données. Cette action est irréversible.`,dropDatabaseConfirm:`Supprimer la base de données`,droppedDatabase:`Base de données {{name}} supprimée`,dropDatabaseFailed:`Échec de la suppression de la base de données`,dropSchemaTitle:`Supprimer le schéma « {{name}} » ?`,dropSchemaDescription:`Cela supprime définitivement le schéma avec toutes ses tables et données. Cette action est irréversible.`,dropSchemaConfirm:`Supprimer le schéma`,droppedSchema:`Schéma {{name}} supprimé`,dropSchemaFailed:`Échec de la suppression du schéma`,truncateTitle:`Tronquer la table « {{name}} » ?`,truncateDescription:`Toutes les lignes de « {{name}} » seront supprimées. La structure de la table est conservée. Cette action est irréversible.`,truncateConfirm:`Tronquer la table`,truncated:`{{name}} tronquée`,truncateFailed:`Échec du tronquage`},tree:{loadDatabasesFailed:`Échec du chargement des bases de données : {{message}}`}},d={editor:{destructiveMarker:`Destructeur : {{action}} {{names}}`,readOnlyMarker:`La connexion est en lecture seule ; cette instruction modifie les données ou le schéma`,actionExecute:`Exécuter (selon les paramètres)`,actionExecuteStatement:`Exécuter l'instruction au curseur / la sélection`,actionExecuteScript:`Exécuter tout le script`},tabs:{newQuery:`Nouvelle requête`,queryTitle:`Requête {{n}}`,erdViewer:`Visionneuse ERD`,close:`Fermer`,closeOthers:`Fermer les autres`,closeLeft:`Fermer les onglets à gauche`,closeRight:`Fermer les onglets à droite`,closeAll:`Tout fermer`},executor:{noActiveConnection:`Aucune connexion active`,uncommittedTitle:`Transaction non validée`,uncommittedDescription:`Cette connexion a une transaction ouverte. La déconnexion annulera ses modifications.`,uncommittedConfirm:`Annuler (rollback) et se déconnecter`,unsavedTitle:`Modifications non enregistrées`,unsavedDescription:`{{file}} contient des modifications qui n'ont pas été enregistrées dans son fichier. La déconnexion les abandonne (utilisez d'abord Connexion > Enregistrer le fichier de base de données pour les conserver).`,theSqliteDatabase:`La base de données SQLite`,unsavedConfirm:`Abandonner et se déconnecter`}},f={tabs:{message:`Message`,info:`Infos`,history:`Historique`,result:`Résultat`,resultN:`Résultat {{n}}`},message:{executing:`Exécution de la requête...`,error:`Erreur : {{message}}`,total:` (Total : {{ms}} ms)`,ready:`Prêt.`,log:`Journal d'exécution`,statementN:`Instruction {{n}}`,limitedBadge:`limite atteinte`,insertId:`insert id {{id}}`,failed:`Échec`,failedStatement:`Instruction en échec`,summary:`{{ok}} réussies · {{failed}} échouées · {{ms}} au total`,copy:`Copier`,copied:`Copié`,showSql:`Afficher le SQL`,hideSql:`Masquer le SQL`},info:{empty:`Aucune information de requête disponible.`,resultN:`Résultat {{n}}`,metadata:`Métadonnées de la requête`,executionTime:`Temps d'exécution`,notAvailable:`N/D`,affectedRows:`Lignes affectées`,fields:`Champs`,fieldDetails:`Détails des champs`,colName:`Nom`,colType:`Type`,colTable:`Table`,resultSets:`Jeux de résultats`,rowsReturned:`Lignes renvoyées`,insertId:`Dernier ID inséré`,lastQuery:`Dernière instruction exécutée`,copy:`Copier`,copied:`Copié`,colOrigin:`Origine`,primaryKey:`Clé primaire`,rowsAndFields:`{{rows}} lignes × {{fields}} champs`,noFields:`Cette instruction n'a renvoyé aucune colonne.`},rowForm:{colColumn:`Colonne`,colValue:`Valeur`,insertTitle:`Insérer une ligne`,editTitle:`Modifier la ligne`,loading:`Chargement des colonnes...`,preview:`Instruction`,nothingToWrite:`Rien à écrire`,insert:`Insérer`,update:`Mettre à jour`,stageInsert:`Ajouter comme ligne en attente`,stageEdit:`Appliquer à la grille`,stageHint:`Place les valeurs dans la grille sans rien exécuter ; validez plus tard avec les autres modifications.`,inserted:`Ligne insérée dans {{table}}`,updated:`Ligne mise à jour dans {{table}}`,confirmInsertTitle:`Insérer une ligne dans {{table}} ?`,confirmUpdateTitle:`Mettre à jour une ligne de {{table}} ?`,inTransaction:`S'exécute dans la transaction ouverte`,pickDate:`Choisir une date`,now:`Maintenant`,formatJson:`Formater`,binaryUnsupported:`Les colonnes binaires ne sont pas modifiables ici ; laissez NULL/DEFAULT ou utilisez du SQL.`,generateUuid:`Générer un UUID`,defaultValue:`Valeur par défaut`,clickToChange:`Cliquer pour modifier`,empty:`(vide)`,autoHint:`Généré par le serveur`,mode:{keep:`Conserver`,auto:`Auto`,value:`Valeur`},invalid:{integer:`Saisissez un entier`,unsigned:`Cette colonne n'accepte pas les nombres négatifs`,number:`Saisissez un nombre`,json:`JSON invalide`,date:`Utilisez YYYY-MM-DD`,datetime:`Utilisez YYYY-MM-DD HH:MM:SS`,time:`Utilisez HH:MM:SS`,length:`{{max}} caractères maximum`}},history:{copied:`Copié dans le presse-papiers`,searchPlaceholder:`Rechercher dans l'historique...`,all:`Tous`,success:`Réussies`,failed:`Échouées`,thisTab:`Cet onglet seulement`,noMatch:`Aucune entrée ne correspond.`,count:`{{count}} entrées`,clear:`Effacer`,clearTitle:`Effacer l'historique des requêtes ?`,clearDescription:`Les {{count}} entrées de cette connexion seront supprimées. Cette action est irréversible.`,clearConfirm:`Effacer l'historique`,insert:`Insérer dans l'éditeur`,inserted:`Inséré dans l'éditeur`,copy:`Copier`,rows:`{{count}} lignes`,affected:`{{count}} affectées`,today:`Aujourd'hui`,yesterday:`Hier`,empty:`Aucun historique de requêtes.`},json:{arrayLength:`Array[{{count}}]`,keys_one:`{{count}} clé`,keys_other:`{{count}} clés`,invalid:`JSON invalide`,clickToView:`Cliquer pour afficher le JSON`,expandAll:`Tout déplier`,collapseAll:`Tout replier`,edit:`Modifier`,view:`Afficher`,copied:`Copié`,copy:`Copier`,shortcutHint:`{{mod}}+Enter pour enregistrer · Esc pour annuler`,cancel:`Annuler`,save:`Enregistrer`},grid:{readOnlyConnection:`Connexion en lecture seule`,readOnlyWal:`Lecture seule : fichier -wal non chargé`,readOnlyNoPk:`Lecture seule : la table n'a pas de clé primaire`,commitTitle:`Valider {{count}} modification(s) dans {{table}} ?`,commitDescription:`Les instructions suivantes seront exécutées.`,commitConfirm:`Commit`,rowPrefix:`Ligne {{row}} :`,cancelled:`annulé`,commitFailed:`Échec du commit : {{message}}`,executedInTransaction:`{{count}} modification(s) exécutée(s) dans la transaction ouverte — cliquez sur Commit dans la barre d'outils pour les rendre permanentes (un rechargement les annule)`,committed:`{{count}} modification(s) validée(s) dans {{table}}`,noData:`Aucune donnée à afficher.`,commit:`Commit`,discard:`Abandonner`,addRow:`Ajouter une ligne`,removeNewRow:`Annuler cette nouvelle ligne`,addRowForm:`Ajouter via un formulaire`,addRowFormHint:`Ouvre un formulaire avec un champ par colonne (validé en INSERT)`,editRowForm:`Modifier cette ligne dans un formulaire`,addRowHint:`Ajouter une nouvelle ligne (validée par INSERT)`,delete:`Supprimer`,deleteCount:`Supprimer ({{count}})`,deleteHint:`Supprimer les lignes sélectionnées (validé par DELETE). Sélectionnez les lignes avec la colonne des numéros de ligne.`,field:`Champ`,searchPlaceholder:`Rechercher...`,orderBy:`Trier par`,none:`Aucun`,refresh:`Actualiser`,dismiss:`Ignorer`,clearSelection:`Effacer la sélection`,columns:`Colonnes`,showAllColumns:`Tout afficher`,hideAllColumns:`Tout masquer`,resetWidths:`Réinit. largeurs`,selectAll:`Sélectionner toutes les lignes`,emptyTable:`Cette table ne contient aucune ligne.`,noRows:`Aucune ligne renvoyée.`,addARow:`Ajouter une ligne`,markedForDeletion:`Marquée pour suppression — cliquez pour restaurer`,newRow:`Nouvelle ligne`,clickToSelect:`Cliquez pour sélectionner ; Maj/Ctrl pour une sélection multiple`,rows:`Lignes : {{count}}`,rowsWithNew:`Lignes : {{count}} (+{{added}})`,sortedBy:`Trié par : {{column}} {{direction}}`,pageRange:`Lignes {{from}}–{{to}}`,firstPage:`Première page`,prevPage:`Page précédente`,nextPage:`Page suivante`,lastPage:`Dernière page`,pagingBlocked:`Validez ou annulez vos modifications avant de changer de page`,selected:`{{count}} sélectionnée(s)`,cellsModified:`{{count}} cellule(s) modifiée(s)`,newCount:`{{count}} nouvelle(s)`,toDelete:`{{count}} à supprimer`,searchMode:`Mode de correspondance`,contains:`contient`,equals:`égal à`,followLink:`Ouvrir {{table}} où {{column}} = valeur`,linkColumn:`Lier « {{column}} » à une autre table…`,editLink:`Modifier le lien de « {{column}} »…`,removeLink:`Supprimer le lien`,copyValue:`Copier la valeur`,filterByValue:`Filtrer : {{column}} = cette valeur`,clearFilter:`Effacer le filtre`,copyColumnName:`Copier le nom de la colonne`,editCell:`Modifier la cellule`,setNull:`Mettre à NULL`,setEmpty:`Mettre une chaîne vide`,restoreRow:`Restaurer la ligne`,hideColumn:`Masquer la colonne « {{column}} »`,copyRowsTsv_one:`Copier la ligne en TSV (avec en-tête)`,copyRowsTsv_other:`Copier {{count}} lignes en TSV (avec en-tête)`,copyRowsCsv_one:`Copier la ligne en CSV`,copyRowsCsv_other:`Copier {{count}} lignes en CSV`,copyRowsJson_one:`Copier la ligne en JSON`,copyRowsJson_other:`Copier {{count}} lignes en JSON`,copyRowsInsert_one:`Copier la ligne en INSERT`,copyRowsInsert_other:`Copier {{count}} lignes en INSERT`,deleteRowsPending_one:`Supprimer la ligne (en attente du Commit)`,deleteRowsPending_other:`Supprimer {{count}} lignes (en attente du Commit)`,sendRowsToScratchpad_one:`Envoyer la ligne au bloc-notes`,sendRowsToScratchpad_other:`Envoyer {{count}} lignes au bloc-notes`,sendAllToScratchpad:`Envoyer les {{count}} lignes chargées au bloc-notes`,sentToScratchpad:`{{count}} lignes copiées dans la table {{table}} du bloc-notes.`,changesSince:`Depuis le dernier chargement : {{changed}} modifiées · {{added}} nouvelles · {{gone}} disparues`,changesToggle:`Afficher/masquer ce qui a changé depuis le chargement précédent`,changesDismiss:`Oublier ces changements`,previousValue:`Valeur précédente : {{value}}`},link:{title:`Lier la colonne à une autre table`,source:`Colonne`,hint:`Les valeurs de cette colonne deviennent des liens : un clic ouvre la table cible filtrée sur les lignes correspondantes. Les vraies clés étrangères sont liées automatiquement.`,targetDatabase:`Base cible`,targetTable:`Table cible`,targetColumn:`Colonne cible`,pickTable:`Choisir une table`,pickColumn:`Choisir une colonne`,remove:`Supprimer le lien`,cancel:`Annuler`,save:`Enregistrer le lien`,targetConnection:`Connexion cible`,targetNotConnected:`La connexion liée n'est pas ouverte. Connectez-la d'abord.`},running:{label:`Requête en cours…`,elapsed:`{{seconds}} s`,stop:`Arrêter`,stopping:`Arrêt…`,cannotCancel:`Ce moteur ne peut pas interrompre une instruction en cours.`,agentOutdated:"L'agent local est trop ancien pour arrêter une requête. Mettez-le à jour avec `npx planche@latest` (ou `planche upgrade`) puis reconnectez-vous.",cancelFailed:`L'agent est injoignable ; la requête n'a pas été arrêtée.`}},p={defaultDescription:`Cette action est irréversible.`,typeToConfirm:`Saisissez <name/> pour confirmer`,cancel:`Annuler`,confirm:`Confirmer`,ok:`OK`},m={dialog:{createTitle:`Créer une table`,alterTitle:`Modifier la table`,duplicateTitle:`Dupliquer la structure de la table`,create:`Créer`,alter:`Modifier`,cancel:`Annuler`,tableName:`Nom de la table`,tableNamePlaceholder:`Saisissez le nom de la table...`,loading:`Chargement du schéma de la table...`,tabSchema:`Schéma`,tabIndexes:`Index`,tabProperties:`Propriétés`,applying:`Application…`,cannotAlterColumns:`{{engine}} ne peut pas modifier une colonne existante ({{columns}}). Ajouter, supprimer et renommer des colonnes ainsi que modifier les index fonctionnent ; pour changer une définition de colonne, recréez la table.`},schema:{colField:`Nom du champ`,colType:`Type de données`,colLength:`Longueur`,colDefault:`Par défaut`,colPk:`PK`,colNotNull:`Not Null`,colUnsigned:`Unsigned`,colAutoIncrement:`Auto Incr`,colZerofill:`Zerofill`,colComment:`Commentaire`,empty:`Aucune colonne définie. Cliquez sur « Ajouter une colonne » pour en ajouter une.`,add:`Ajouter une colonne`,remove:`Supprimer la colonne`},indexes:{colName:`Nom de l'index`,colType:`Type d'index`,colColumns:`Colonnes`,empty:`Aucun index défini. Cliquez sur « Ajouter un index » pour en ajouter un.`,add:`Ajouter un index`,remove:`Supprimer l'index`},index:{addTitle:`Ajouter un index`,editTitle:`Modifier l'index`,name:`Nom de l'index`,namePlaceholder:`Saisissez le nom de l'index`,type:`Type d'index`,columns:`Colonnes`,noColumns:`Aucune colonne disponible. Définissez d'abord des colonnes dans l'onglet Schéma.`,unnamed:`(sans nom)`,cancel:`Annuler`,ok:`OK`},properties:{engine:`Moteur`,charset:`Jeu de caractères`,collation:`Collation`,autoIncrement:`Auto-incrément`,autoIncrementPlaceholder:`Par défaut`,comment:`Commentaire`},info:{engine:`Moteur`,version:`Version`,rowFormat:`Format des lignes`,rows:`Lignes`,avgRowLength:`Longueur moyenne des lignes`,dataLength:`Taille des données`,createTime:`Date de création`,updateTime:`Date de mise à jour`,collation:`Collation`,comment:`Commentaire`},copy:{title:`Copier la table`,source:`Source`,targetConnection:`Connexion cible`,targetDatabase:`Base cible`,targetTable:`Nom de la table cible`,what:`Copier`,structureAndData:`Structure et données`,structureOnly:`Structure seule`,ifExists:`Si la table cible existe`,abort:`Abandonner (par défaut)`,dropAndRecreate:`Supprimer et recréer (le nom devra être ressaisi)`,preview:`CREATE TABLE sur la cible (modifiable)`,crossEngineHint:`La cible est {{engine}} : vérifiez les types ci-dessous, les attributs propres à MySQL ont été retirés.`,readOnly:`lecture seule`,loading:`Chargement…`,progressCreate:`Création de la table…`,progressCount:`Comptage des lignes…`,progressRows:`{{copied}} lignes copiées sur {{total}}`,progressDone:`Terminé`,doneTitle:`Table copiée`,doneRows:`{{count}} lignes copiées dans {{table}}.`,doneStructure:`Structure de {{table}} créée.`,noColumns:`La table source n'a aucune colonne.`,exists:`La table {{table}} existe déjà dans la cible. Choisissez un autre nom ou « Supprimer et recréer ».`,dropTitle:`Supprimer la table existante {{table}} ?`,dropDescription:`La table cible et toutes ses lignes seront supprimées avant la copie. Cette action est irréversible.`,dropConfirm:`Supprimer et copier`,cancelled:`Copie annulée.`,stop:`Arrêter`,cancel:`Annuler`,copy:`Copier`}},h={copy:{title:`Copier la base de données`,source:`Base de données source`,target:`Nom de la base de données cible`,targetPlaceholder:`Saisissez le nom de la base de données cible`,options:`Options`,structureAndData:`Structure et données`,structureOnly:`Structure uniquement`,cancel:`Annuler`,copy:`Copier`,creating:`Création de {{database}}…`,copying:`Copie de {{table}} ({{index}} sur {{total}})…`},diff:{title:`Comparer les schémas`,source:`Source`,target:`Cible`,pickConnection:`Connexion`,pickDatabase:`Base de données`,crossEngineHint:`Moteurs différents : les noms de types varient selon le dialecte, la plupart des colonnes apparaîtront comme modifiées.`,sameSide:`La source et la cible sont la même base.`,summary:`{{changed}} modifiées, {{missingTarget}} absentes de la cible, {{missingSource}} uniquement dans la cible, {{identical}} identiques`,showIdentical:`Afficher les tables identiques`,identicalAll:`Les tables sont identiques.`,column:`Colonne`,index:`Index`,object:`Objet`,selectTable:`Sélectionnez une table pour voir ses différences.`,missingInTarget:`{{table}} n'existe pas dans la cible ; le script la crée.`,missingInSource:`{{table}} n'existe que dans la cible ; le script la supprime (en commentaire sauf si les DROP sont inclus).`,includeDrops:`Inclure les instructions DROP en SQL exécutable (par défaut : en commentaire)`,tabTitle:`Sync {{database}}`,close:`Fermer`,compare:`Comparer`,comparing:`Comparaison…`,openScript:`Ouvrir le script dans l'éditeur`,noDefinition:`Aucune instruction CREATE disponible`},create:{title:`Créer une base de données`,name:`Nom de la base de données`,namePlaceholder:`Saisissez le nom de la base de données`,charset:`Jeu de caractères`,collation:`Collation`,cancel:`Annuler`,create:`Créer`},csv:{title:`Télécharger en {{format}}`,target:`Cible`,targetQueryResult:`Résultat de la requête actuelle`,targetTableData:`Données de la table`,tableName:`Nom de la table`,tableNamePlaceholder:`Saisissez le nom de la table`,delimiter:`Délimiteur`,delimiterComma:`Virgule (,)`,delimiterTab:`Tabulation (\\t)`,delimiterSemicolon:`Point-virgule (;)`,delimiterPipe:`Barre verticale (|)`,includeHeaders:`Inclure les en-têtes`,cancel:`Annuler`,download:`Télécharger`,downloading:`Téléchargement...`,progress:`{{loaded}} lignes sur {{total}} écrites`,progressUnknown:`{{loaded}} lignes écrites`,stop:`Arrêter`,done:`{{count}} lignes de {{table}} exportées en {{format}}.`,database:`Base de données`,databasePlaceholder:`Choisir une base`},html:{title:`Schéma en HTML`,database:`Base de données`,selectDatabase:`Sélectionner une base de données`,tables:`Tables à inclure`,selectAll:`Tout sélectionner`,deselectAll:`Tout désélectionner`,noTables:`Aucune table disponible.`,include:`Inclure`,includeColumns:`Colonnes`,includeIndexes:`Index`,includeProperties:`Propriétés`,cancel:`Annuler`,generate:`Générer`,generating:`Génération...`,sectionColumns:`Colonnes`,sectionIndexes:`Index`,sectionProperties:`Propriétés`,docTitle:`Schéma : {{database}}`,heading:`Base de données : {{database}}`,summary:`Tables : {{count}} | Généré le : {{date}}`,footer:`Généré par Planche 2026`},dataDiff:{title:`Comparer les données`,pickTable:`Table`,hint:`Les lignes sont associées par la clé primaire de la table source et comparées en texte. Jusqu'à {{cap}} lignes par côté sont chargées ; filtrez d'abord les grandes tables.`,sameSide:`La source et la cible sont la même table.`,noPrimaryKey:`{{table}} n'a pas de clé primaire ; la comparaison en a besoin pour associer les lignes.`,keyMissingInTarget:`La table cible n'a pas la ou les colonnes clés : {{columns}}`,summary:`Clé : {{key}} — {{added}} absentes de la cible, {{changed}} différentes, {{removed}} uniquement dans la cible, {{identical}} identiques`,capped:`Seules les {{cap}} premières lignes de chaque côté ont été comparées.`,ignoredColumns:`Colonnes ignorées (un seul côté) : {{columns}}`,added_one:`{{count}} absente de la cible`,added_other:`{{count}} absentes de la cible`,changed_one:`{{count}} différente`,changed_other:`{{count}} différentes`,removed_one:`{{count}} uniquement dans la cible`,removed_other:`{{count}} uniquement dans la cible`,none:`Rien dans ce groupe.`,more:`… {{count}} de plus non listées`,includeDeletes:`Inclure les instructions DELETE en SQL exécutable (par défaut : en commentaire)`,tabTitle:`Sync données {{table}}`,loading:`Chargement des lignes — source : {{source}}, cible : {{target}}`},schema:{createTitle:`Créer un schéma`,name:`Nom du schéma`,namePlaceholder:`Saisir le nom du schéma`,create:`Créer`,cancel:`Annuler`}},g={manager:{title:`Gestion des utilisateurs`,addUser:`Ajouter un utilisateur`,removeUser:`Supprimer l'utilisateur`,noUsers:`Aucun utilisateur chargé`,grantScope:`Portée des privilèges`,apply:`Appliquer`,close:`Fermer`,removed:`Utilisateur '{{user}}'@'{{host}}' supprimé`,selectUserFirst:`Veuillez d'abord sélectionner un utilisateur`,applied:`Modifications appliquées`,noChanges:`Aucune modification de privilèges à appliquer.`},add:{title:`Ajouter un utilisateur`,username:`Nom d'utilisateur`,usernamePlaceholder:`Saisissez le nom d'utilisateur`,host:`Hôte`,password:`Mot de passe`,passwordPlaceholder:`Saisissez le mot de passe`,confirmPassword:`Confirmer le mot de passe`,confirmPasswordPlaceholder:`Confirmez le mot de passe`,plugin:`Plugin`,cancel:`Annuler`,add:`Ajouter`,usernameRequired:`Le nom d'utilisateur est requis`,passwordMismatch:`Les mots de passe ne correspondent pas`,added:`Utilisateur '{{user}}'@'{{host}}' ajouté`},privileges:{globalTitle:`Privilèges globaux`,databaseTitle:`Privilèges sur la base de données`,tableTitle:`Privilèges sur la table`,checkAll:`Tout cocher`,uncheckAll:`Tout décocher`,categoryData:`Données`,categoryStructure:`Structure`,categoryAdministration:`Administration`},grantTree:{globalPrivileges:`Privilèges globaux`}},_={close:`Fermer`,noActiveConnection:`Aucune connexion active`,variableName:`Nom de la variable`,value:`Valeur`,scope:{session:`Session`,global:`Global`},findReplace:{findPlaceholder:`Rechercher`,replacePlaceholder:`Remplacer`,found:`{{count}} trouvé(s)`,noResults:`Aucun résultat`,previous:`Précédent`,next:`Suivant`,close:`Fermer`,replace:`Remplacer`,all:`Tout`,caseSensitive:`Respecter la casse`,regex:`Regex`,wholeWord:`Mot entier`},flush:{title:`Flush`,executed:`Exécuté : {{command}}`,executeError:`Erreur lors de l'exécution de {{command}} : {{message}}`},localHistory:{title:`Historique local`,description:`Versions de cet onglet capturées avant chaque exécution et avant qu'un modèle ne l'écrase.`,empty:`Aucun historique pour cet onglet pour l'instant.`,restored:`Contenu de l'éditeur restauré depuis l'historique local`,restore:`Restaurer cette version`,chars:`{{count}} caractères`,reason:{execute:`avant exécution`,replaced:`avant écrasement`,restore:`avant restauration`}},processList:{title:`Liste des processus`,refresh:`Actualiser`,autoRefresh:`Actualisation auto`,empty:`Aucun processus à afficher`,kill:`Tuer`,killProcess:`Tuer le processus`,selectToKill:`Veuillez sélectionner un processus à tuer`,killed:`Processus {{id}} tué`,killError:`Erreur lors de l'arrêt du processus : {{message}}`,loadError:`Erreur lors du chargement de la liste des processus : {{message}}`,updatedAt:`mis à jour à {{time}}`,filterPlaceholder:`Filtrer par utilisateur, hôte, base, SQL...`,hideIdle:`Masquer les inactifs`,noMatch:`Aucun processus ne correspond au filtre`,self:`moi`,selfHint:`Il s'agit de la session de Planche`,statementOf:`Instruction de #{{id}}`,noStatement:`Aucune instruction`,copy:`Copier`,copied:`Copié`,killConfirmTitle:`Terminer le processus {{id}} ?`,killConfirmDescription:`La session de {{user}}@{{host}} sera fermée et l'instruction en cours interrompue. Une transaction ouverte sera annulée.`,stats:{total:`Total`,active:`Actifs`,idle:`Inactifs`,longest:`Plus longue exécution`},columns:{id:`Id`,user:`Utilisateur`,host:`Hôte`,db:`db`,command:`Commande`,time:`Temps`,state:`État`,info:`Infos`,action:`Action`}},status:{title:`État du serveur`,filterPlaceholder:`Filtrer les variables d'état...`,empty:`Aucune variable d'état à afficher`,loadError:`Erreur lors du chargement de l'état : {{message}}`},variables:{title:`Variables du serveur`,filterPlaceholder:`Filtrer les variables...`,empty:`Aucune variable à afficher`,loadError:`Erreur lors du chargement des variables : {{message}}`}},v={empty:{title:`Ouvrez un fichier de schéma Prisma (.prisma) pour afficher l'ERD`,description:`Les modèles, énumérations et relations seront analysés automatiquement`,openFile:`Ouvrir un fichier .prisma`,dropHint:`ou glissez-déposez un fichier dans cette zone`},entity:{enumBadge:`ENUM`,modelBadge:`MODEL`,columns:{value:`Valeur`,comment:`Commentaire`,type:`Type`,column:`Colonne`},linkBadge:`LIEN`,externalTitle:`Table liée sur {{location}} (lien de colonne, pas une vraie clé étrangère)`,nullable:`Colonne acceptant NULL`},toolbar:{refresh:`Actualiser`,zoomIn:`Zoom avant`,zoomOut:`Zoom arrière`,resetView:`Réinitialiser la vue`,center:`Centrer`,fitAll:`Tout ajuster`,spreadAll:`Désempiler`,resetLayout:`Réinitialiser la disposition`,legendOneToMany:`1:N (FK)`,tables:`Tables :`,relations:`Relations :`,columns:`Colonnes :`},viewer:{noServerConnection:`Aucune connexion serveur active`,loading:`Chargement du schéma depuis {{database}}...`,loadFailed:`Échec du chargement de l'ERD`,noDatabase:`Aucune base de données sélectionnée.`,selectDatabaseHint:`Sélectionnez une base de données dans l'arborescence du schéma, puis ouvrez Afficher l'ERD.`}},y={runAnyway:`Exécuter quand même`,query:{rowsReturned:`{{count}} ligne(s) renvoyée(s)`,rowsAffected:`{{count}} ligne(s) affectée(s)`,rowsReturnedLimited:`{{count}} ligne(s) renvoyée(s) (limité à {{limit}} ; ajoutez LIMIT pour en récupérer davantage)`,notConnected:`Non connecté`,fileNotOpen:`Le fichier SQLite n'est pas encore ouvert — cliquez sur « Rouvrir le fichier » ci-dessus pour accorder à nouveau l'accès.`,failed:`Échec de la requête`,nothingToExecute:`Rien à exécuter`},destructive:{title_one:`Exécuter l'instruction destructrice ?`,title_other:`Exécuter {{count}} instructions destructrices ?`,description:`Les instructions suivantes modifieront ou supprimeront définitivement des données. Cette action est irréversible.`,unknownTarget:`(inconnu)`,deleteAll:`DELETE de toutes les lignes de {{target}}`,updateAll:`UPDATE de toutes les lignes de {{target}}`,alterDrop:`DROP COLUMN/PARTITION sur {{target}}`},readOnly:{refused:`La connexion « {{label}} » est en lecture seule. {{count}} instruction(s) modifieraient les données ou le schéma.`,title:`« {{label}} » est en lecture seule`,description:`Ces instructions modifient les données ou le schéma. Les exécuter quand même sur cette connexion ?`},transaction:{startFailed:`Impossible de démarrer la transaction`,started:`Transaction démarrée — Commit ou Rollback une fois terminé`,implicitCommit:`{{kind}} a provoqué un COMMIT implicite de la transaction ouverte`,committed:`Transaction validée`,rolledBack:`Transaction annulée`,commandFailed:`Échec de {{name}}`,commandFailedWith:`Échec de {{name}} : {{message}}`},save:{notBrowserSqlite:`Ce n'est pas une connexion SQLite dans le navigateur.`,inMemory:`Base de données en mémoire : elle ne peut être exportée qu'en téléchargement.`,noFileSystemAccess:`Ce navigateur ne dispose pas de l'API File System Access (Chrome/Edge uniquement) : la base de données est exportée en téléchargement au lieu d'être écrite sur place.`,noWritableHandle:`Le fichier a été ouvert sans descripteur en écriture : il est exporté en téléchargement.`},agent:{devProxyUrl:`{{url}} (via le proxy de dev)`,notPlanche:`Quelque chose a répondu, mais ce n'est pas un agent Planche`,unreachable:"Agent Planche injoignable sur {{url}} — exécutez `npx planche` ({{message}})",httpError:`Erreur HTTP : {{status}} {{statusText}}`,emptyResponse:`Le serveur de tunnel a renvoyé une réponse vide`,reconnected:`Reconnecté à {{name}} — l'agent avait abandonné la connexion (redémarrage ou délai d'inactivité).`},sample:{profileName:`Boutique d'exemple (dans le navigateur)`,downloadFailed:`Impossible de télécharger la base de données d'exemple ({{status}})`,tabTitle:`Requête 1`},sqliteFile:{tooSmall:`Le fichier est trop petit pour être une base de données SQLite.`,notSqlite:`Ce n'est pas une base de données SQLite (ou elle est chiffrée, p. ex. SQLCipher). L'en-tête de 16 octets ne contient pas « SQLite format 3 ».`,badPageSize:`En-tête SQLite corrompu : taille de page invalide {{size}}.`,unreadable:`SQLite n'a pas pu lire le fichier : {{message}}`,pickerDescription:`Base de données SQLite`,walNotLoaded:`Cette base de données est en mode WAL et son fichier -wal n'a pas été chargé. Chargez-le, ou confirmez dans la bannière qu'aucun fichier -wal n'existe, avant d'enregistrer.`,changedOnDisk:`{{name}} a changé sur le disque après son chargement (un autre programme y a écrit). Enregistrer écraserait ces modifications — rouvrez le fichier et refaites vos modifications, ou utilisez le serveur de tunnel.`,walHasChanges:`{{name}}-wal contient de nouvelles modifications ; chargez-le avant d'enregistrer.`,walChangedOnDisk:`{{name}}-wal a été écrit par un autre programme après son chargement ; rouvrez le fichier avant d'enregistrer.`,writeDenied:`L'accès en écriture à {{name}} n'a pas été accordé. Autorisez-le dans l'invite du navigateur, ou exportez en téléchargement à la place.`},environment:{none:`Aucun`,green:`Vert (dev)`,blue:`Bleu`,yellow:`Jaune (staging)`,orange:`Orange`,red:`Rouge (production)`,purple:`Violet`},scratchpad:{profileName:`Bloc-notes`,namePromptTitle:`Nom de la table du bloc-notes`,namePromptDescription:`Une table nommée {{table}} existe déjà dans le bloc-notes. Choisissez un autre nom.`,nameTaken:`La table {{table}} existe déjà.`},federated:{pulling:`Récupération de {{table}} depuis {{connection}}…`,capped:`{{table}} : seules les {{limit}} premières lignes ont été récupérées.`,templateLine1:`Référencez une table de n'importe quelle connexion ouverte comme "Nom de connexion".database.table ; elle est copiée dans ce bloc-notes avant l'exécution.`,templateLine2:`Les tables sont limitées à {{limit}} lignes. La requête elle-même s'exécute dans SQLite (dans votre navigateur).`,templateConnections:`Connexions ouvertes : {{names}}`,templateNone:`Aucune autre connexion n'est ouverte. Connectez-en une, puis référencez-la ici.`,done:`{{rows}} lignes récupérées depuis {{tables}} tables distantes vers le bloc-notes.`,pullingProgress:`Récupération de {{table}} depuis {{connection}} : {{loaded}} / {{total}} lignes…`},paged:{noColumns:`{{table}} n'a aucune colonne.`,cancelled:`Annulé.`}},b={title:`Conditions d’utilisation`,version:`Version {{version}}`,englishOnly:`Les conditions sont fournies en anglais. Le résumé de l’écran d’accueil est disponible dans votre langue.`},x={title:`{{kind}} toucherait {{count}} lignes`,titleUnknown:`{{kind}} — lignes affectées inconnues`,description:`Voici les lignes que l'instruction toucherait maintenant, lues avec un SELECT. Rien n'a encore été écrit.`,previewFailed:`La requête d'aperçu a échoué : {{error}}
|
|
2
|
-
Vous pouvez quand même exécuter l'instruction.`,noRows:`Aucune ligne ne correspond — l'instruction ne changerait rien.`,truncated:`Affichage des {{shown}} premières lignes sur {{count}}.`,previewQuery:`Requête d'aperçu`,run:`Exécuter {{kind}} ({{count}} lignes)`,runAnyway:`Exécuter quand même`},S={badge:`PRO`,tooltip:`Nécessitera une licence Pro à partir de Planche 1.0. Gratuit en 0.x, et chaque version 0.x le reste définitivement.`,noticeTitle:`Fonctionnalités Pro`,notice:`Les fonctionnalités marquées PRO nécessiteront une licence Pro à partir de Planche 1.0. Elles sont aujourd'hui pleinement disponibles, et les versions 0.x que vous avez déjà restent gratuites pour toujours.`},C={npxNote:`Nécessite Node.js 22 ou plus récent. Rien n’est installé durablement : npx exécute l’agent directement depuis le registre npm.`,installNote:`Pas besoin de Node.js. L’installation se fait dans votre dossier personnel sans droits d’administrateur ; ensuite la commande planche le démarre à tout moment.`},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 +0,0 @@
|
|
|
1
|
-
function e(e,t){let n=globalThis,r=`__planche_${e}`;return r in n||(n[r]=t()),n[r]}export{e as t};
|