@hienlh/ppm 0.13.8 → 0.13.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/http-api.md +1 -1
  4. package/dist/web/assets/ai-settings-section-CLNBWLS4.js +1 -0
  5. package/dist/web/assets/{audio-preview-DQbX8gfL.js → audio-preview-C1p-Q5XZ.js} +1 -1
  6. package/dist/web/assets/{chat-tab-BJQT9kie.js → chat-tab-BSJUkgxB.js} +8 -8
  7. package/dist/web/assets/code-editor-rNw5_pXh.js +8 -0
  8. package/dist/web/assets/{conflict-editor-BKwJLX0D.js → conflict-editor-Dcn3HuLD.js} +1 -1
  9. package/dist/web/assets/data-grid-nZfSIop5.js +5 -0
  10. package/dist/web/assets/database-DOWH9-Vv.js +1 -0
  11. package/dist/web/assets/database-viewer-CNoq5Uxp.js +1 -0
  12. package/dist/web/assets/{diff-viewer-SAtaBwNI.js → diff-viewer-NMLD4V8q.js} +1 -1
  13. package/dist/web/assets/{extension-webview-PiV4bKJ1.js → extension-webview-DW2dBswj.js} +1 -1
  14. package/dist/web/assets/{image-preview-CbFFD9BS.js → image-preview-Dqp1KSus.js} +1 -1
  15. package/dist/web/assets/index-CoMWx5VS.js +27 -0
  16. package/dist/web/assets/index-Dzb3OtrX.css +2 -0
  17. package/dist/web/assets/{input-BMvRUOr7.js → input-DYWhyaze.js} +1 -1
  18. package/dist/web/assets/keybindings-store-B7nlHmDh.js +1 -0
  19. package/dist/web/assets/{markdown-renderer-CHWA0KAo.js → markdown-renderer-DNIXdY0d.js} +1 -1
  20. package/dist/web/assets/{pdf-preview-DQMdjqa2.js → pdf-preview-ChC1gaaZ.js} +1 -1
  21. package/dist/web/assets/{port-forwarding-tab-9BpNC9_7.js → port-forwarding-tab-dLhH_g2l.js} +1 -1
  22. package/dist/web/assets/{postgres-viewer-Bm5T51n6.js → postgres-viewer-De0pzd1C.js} +2 -2
  23. package/dist/web/assets/{settings-tab-BUstSDLR.js → settings-tab-Mrs9uzCZ.js} +1 -1
  24. package/dist/web/assets/sqlite-viewer-BqtIjvil.js +1 -0
  25. package/dist/web/assets/{terminal-tab-Xtj6RN0d.js → terminal-tab-CeHEtoE2.js} +1 -1
  26. package/dist/web/assets/{video-preview-BLI_RruT.js → video-preview-CHPVrMtx.js} +1 -1
  27. package/dist/web/assets/x-OGGXhtlb.js +1 -0
  28. package/dist/web/index.html +8 -8
  29. package/dist/web/sw.js +1 -1
  30. package/package.json +2 -1
  31. package/src/web/components/database/data-grid.tsx +18 -2
  32. package/src/web/components/database/glide-grid-theme.ts +82 -0
  33. package/src/web/components/database/glide-grid-types.ts +79 -0
  34. package/src/web/components/database/use-glide-cell-content.ts +124 -0
  35. package/src/web/components/database/use-glide-columns.ts +61 -0
  36. package/src/web/components/database/use-glide-selection.ts +48 -0
  37. package/src/web/components/editor/code-editor.tsx +124 -7
  38. package/src/web/index.html +1 -0
  39. package/test.sql +1 -0
  40. package/dist/web/assets/ai-settings-section-CHgpQ_OP.js +0 -1
  41. package/dist/web/assets/code-editor-CeKTvfyz.js +0 -8
  42. package/dist/web/assets/database-DCT0OjgQ.js +0 -1
  43. package/dist/web/assets/database-viewer-DixWWvjx.js +0 -5
  44. package/dist/web/assets/index-C1RBJe0a.css +0 -2
  45. package/dist/web/assets/index-ZFyltHwi.js +0 -27
  46. package/dist/web/assets/keybindings-store-D0C-Pq2o.js +0 -1
  47. package/dist/web/assets/plus-51UQ45rf.js +0 -1
  48. package/dist/web/assets/sqlite-viewer-C7rhO4bn.js +0 -1
  49. package/dist/web/assets/x-BtqbfkR7.js +0 -1
  50. /package/dist/web/assets/{chevron-right-BzAdxJRG.js → chevron-right-DnHIvvcy.js} +0 -0
  51. /package/dist/web/assets/{code-CuravVys.js → code-DGBecc50.js} +0 -0
@@ -0,0 +1,8 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-renderer-DNIXdY0d.js","assets/rolldown-runtime-FhOqtrmT.js","assets/index-CoMWx5VS.js","assets/vendor-mermaid-CMiurk2b.js","assets/vendor-ui-B-89Uj8i.js","assets/vendor-markdown-0Mxgxy0L.js","assets/input-DYWhyaze.js","assets/utils-CTg5uAYR.js","assets/createLucideIcon-BjHrJDVb.js","assets/x-OGGXhtlb.js","assets/settings-store-BHBb62gq.js","assets/react-GqWghJ-L.js","assets/api-client-Dvzcc_EO.js","assets/scroll-area-BEllam7_.js","assets/ai-settings-section-CLNBWLS4.js","assets/dist-D7KGU7Vl.js","assets/refresh-cw-CSFrDtiu.js","assets/trash-2-CJYoLw7Q.js","assets/api-settings-D0_eiIYv.js","assets/database-DOWH9-Vv.js","assets/chevron-right-DnHIvvcy.js","assets/file-store-BrbCNyLm.js","assets/tab-store-0rGchMXr.js","assets/index-Dzb3OtrX.css","assets/csv-preview-D5lmgVEy.js","assets/lib-D_kRA9p6.js","assets/arrow-up-Dtrfv490.js","assets/csv-parser-DO0dz4x_.js","assets/image-preview-Dqp1KSus.js","assets/file-exclamation-point-Baz81y5z.js","assets/use-blob-url-Hn6n1730.js","assets/pdf-preview-ChC1gaaZ.js","assets/video-preview-CHPVrMtx.js","assets/audio-preview-C1p-Q5XZ.js"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import"./vendor-ui-B-89Uj8i.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import"./scroll-area-BEllam7_.js";import{i,r as a,t as o}from"./x-OGGXhtlb.js";import{t as s}from"./database-DOWH9-Vv.js";import{t as c}from"./chevron-right-DnHIvvcy.js";import{a as l,l as u,n as d,o as f,r as p,s as ee,t as m}from"./input-DYWhyaze.js";import{t as h}from"./code-DGBecc50.js";import{t as g}from"./data-grid-nZfSIop5.js";import{t as te}from"./file-exclamation-point-Baz81y5z.js";import{t as _}from"./table-Dq575bPF.js";import{t as v}from"./text-wrap-Cn6BNQfq.js";import{i as ne,t as y}from"./api-client-Dvzcc_EO.js";import{n as re}from"./settings-store-BHBb62gq.js";import{G as b}from"./vendor-mermaid-CMiurk2b.js";import{t as x}from"./utils-CTg5uAYR.js";import{n as ie,t as S}from"./tab-store-0rGchMXr.js";import{r as C,t as w}from"./file-store-BrbCNyLm.js";import{$ as ae,G as T,J as oe,K as E,Q as D,X as O,Y as k,Z as A,a as se,c as j,d as M,f as N,g as P,h as F,j as I,l as ce,m as le,nt as ue,o as L,p as de,q as fe,u as pe,z as me}from"./index-CoMWx5VS.js";import{n as he,t as ge}from"./use-monaco-theme-CP-vyTF8.js";import{n as _e,t as ve}from"./sql-completion-provider-tCzZfqWs.js";var ye=r(`redo-2`,[[`path`,{d:`m15 14 5-5-5-5`,key:`12vg1m`}],[`path`,{d:`M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13`,key:`6uklza`}]]),R=e(n(),1),z=t(),B={ts:A,tsx:A,js:A,jsx:A,py:A,rs:A,go:A,html:A,css:A,scss:A,json:D,md:O,txt:O,yaml:k,yml:k};function be(e,t){return t?fe:B[e.split(`.`).pop()?.toLowerCase()??``]??oe}function xe(e,t){let n=[],r=e;for(let e=0;e<t.length;e++){let i=t[e],a=t.slice(0,e+1).join(`/`),o=r.find(e=>e.name===i);if(n.push({name:i,fullPath:a,node:o??null,siblings:r}),o?.children)r=o.children;else{for(let r=e+1;r<t.length;r++)n.push({name:t[r],fullPath:t.slice(0,r+1).join(`/`),node:null,siblings:[]});break}}return n}function V(e){return[...e].sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1)}function Se({filePath:e,projectName:t,tabId:n,className:r}){let i=w(e=>e.tree),{updateTab:a,openTab:o}=S(F(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=(0,R.useRef)(null),l=(0,R.useMemo)(()=>xe(i,e.split(`/`).filter(Boolean)),[i,e]);(0,R.useEffect)(()=>{s.current&&(s.current.scrollLeft=s.current.scrollWidth)},[l]);function u(e,r){let i=x(e);r.metaKey||r.ctrlKey?o({type:`editor`,title:i,metadata:{filePath:e,projectName:t},projectId:t,closable:!0}):a(n,{title:i,metadata:{filePath:e,projectName:t}})}return(0,z.jsx)(`div`,{ref:s,className:r,children:l.map((e,n)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[n>0&&(0,z.jsx)(c,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),e.siblings.length>0?(0,z.jsx)(Ce,{segment:e,isLast:n===l.length-1,projectName:t,onFileClick:u}):(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e.name})]},e.fullPath))})}function Ce({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=(0,R.useMemo)(()=>V(e.siblings),[e.siblings]);return(0,z.jsxs)(j,{children:[(0,z.jsx)(le,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,z.jsx)(ce,{align:`start`,className:`max-h-[300px] p-1`,children:i.map(t=>(0,z.jsx)(H,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function H({node:e,projectName:t,activePath:n,onFileClick:r}){let i=be(e.name,e.type===`directory`),a=e.path===n;return e.type===`directory`&&e.children&&e.children.length>0?(0,z.jsxs)(M,{children:[(0,z.jsxs)(de,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,z.jsx)(N,{className:`max-h-[300px] overflow-y-auto p-1`,children:V(e.children).map(e=>(0,z.jsx)(H,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]}):(0,z.jsxs)(pe,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{e.type!==`directory`&&r(e.path,t)},children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]})}function U({active:e,onClick:t,icon:n,label:r}){return(0,z.jsxs)(`button`,{type:`button`,onClick:t,className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${e?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:[(0,z.jsx)(n,{className:`size-3`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:r})]})}function we({ext:e,mdMode:t,onMdModeChange:n,csvMode:r,onCsvModeChange:o,wordWrap:s,onToggleWordWrap:c,filePath:l,projectName:u,className:d}){return(0,z.jsxs)(`div`,{className:d,children:[(e===`md`||e===`mdx`)&&n&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(U,{active:t===`edit`,onClick:()=>n(`edit`),icon:h,label:`Edit`}),(0,z.jsx)(U,{active:t===`preview`,onClick:()=>n(`preview`),icon:a,label:`Preview`})]}),e===`csv`&&o&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(U,{active:r===`table`,onClick:()=>o(`table`),icon:_,label:`Table`}),(0,z.jsx)(U,{active:r===`raw`,onClick:()=>o(`raw`),icon:h,label:`Raw`})]}),(0,z.jsx)(U,{active:s,onClick:c,icon:v,label:`Wrap`}),l&&u&&(0,z.jsx)(U,{active:!1,onClick:()=>P(u,l),icon:i,label:`Download`})]})}function Te({open:e,defaultName:t,content:n,onSave:r,onCancel:i}){let[a,o]=(0,R.useState)(t),[s,c]=(0,R.useState)(!1),[h,g]=(0,R.useState)(``),te=C(e=>e.activeProject),_=(0,R.useCallback)(()=>{let e=a.trim();if(!e){g(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){g(`Filename cannot contain / or \\`);return}g(``),c(!0)},[a]),v=(0,R.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,z.jsx)(L,{open:!0,mode:`folder`,root:te?.path,title:`Save "${a.trim()}" to...`,onSelect:v,onCancel:()=>c(!1)}):(0,z.jsx)(d,{open:e,onOpenChange:e=>{e||i()},children:(0,z.jsxs)(p,{className:`sm:max-w-md`,children:[(0,z.jsx)(f,{children:(0,z.jsx)(ee,{children:`Save As`})}),(0,z.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,z.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,z.jsx)(m,{value:a,onChange:e=>{o(e.target.value),g(``)},onKeyDown:e=>{e.key===`Enter`&&_()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),h&&(0,z.jsx)(`p`,{className:`text-xs text-destructive`,children:h})]}),(0,z.jsxs)(l,{children:[(0,z.jsx)(u,{variant:`outline`,onClick:i,children:`Cancel`}),(0,z.jsx)(u,{onClick:_,children:`Choose Folder...`})]})]})})}var W=typeof window<`u`&&window.isSecureContext,Ee=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],G=`px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,K=`px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,De=`w-px h-5 bg-border mx-0.5 shrink-0`;function Oe({editorRef:e,readOnly:t}){let n=(0,R.useCallback)(()=>e.current,[e]),r=(0,R.useCallback)(e=>{let t=n();if(!t)return;t.focus();let r=t.getSelection();r&&t.executeEdits(`mobile-toolbar`,[{range:r,text:e}])},[n]),[i,a]=(0,R.useState)(!1),s=(0,R.useRef)(null),c=(0,R.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&r(e)}catch{}},[r]),l=(0,R.useCallback)(()=>{a(!0),requestAnimationFrame(()=>s.current?.focus())},[]),u=(0,R.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(a(!1),r(t))},[r]),d=(0,R.useCallback)(()=>{let e=n();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[n]),f=(0,R.useCallback)(()=>{let e=n();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[n]),p=(0,R.useCallback)(()=>{let e=n();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[n]);return t?null:(0,z.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!W&&i&&(0,z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,z.jsx)(`textarea`,{ref:s,onPaste:u,placeholder:`Long-press here → Paste`,className:`flex-1 h-8 rounded border border-border bg-background text-foreground text-xs px-2 py-1.5 resize-none focus:outline-none focus:ring-1 focus:ring-primary`}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>a(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,z.jsx)(o,{size:14})})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,z.jsx)(`button`,{type:`button`,onClick:W?c:l,className:G,title:`Paste`,children:(0,z.jsx)(ue,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:d,className:G,title:`Undo`,children:(0,z.jsx)(I,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:f,className:G,title:`Redo`,children:(0,z.jsx)(ye,{size:14})}),(0,z.jsx)(`div`,{className:De}),(0,z.jsx)(`button`,{type:`button`,onClick:p,className:K,children:`Tab`}),(0,z.jsx)(`div`,{className:De}),Ee.map(e=>(0,z.jsx)(`button`,{type:`button`,onClick:()=>r(e),className:K,children:e},e))]})]})}var ke=(0,R.lazy)(()=>b(()=>import(`./markdown-renderer-DNIXdY0d.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]))),Ae=(0,R.lazy)(()=>b(()=>import(`./csv-preview-D5lmgVEy.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([24,1,4,5,25,8,26,27]))),je=(0,R.lazy)(()=>b(()=>import(`./image-preview-Dqp1KSus.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([28,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,29,30]))),Me=(0,R.lazy)(()=>b(()=>import(`./pdf-preview-ChC1gaaZ.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([31,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,29,30]))),Ne=(0,R.lazy)(()=>b(()=>import(`./video-preview-CHPVrMtx.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([32,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,29,30]))),Pe=(0,R.lazy)(()=>b(()=>import(`./audio-preview-C1p-Q5XZ.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([33,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,29,30]))),Fe=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`svg`,`ico`]),Ie=new Set([`mp4`,`webm`,`mov`,`ogg`,`avi`,`mkv`]),Le=new Set([`mp3`,`wav`,`flac`,`aac`,`m4a`,`wma`]),Re=new Set([`db`,`sqlite`,`sqlite3`]);function ze(e){return e.split(`.`).pop()?.toLowerCase()??``}function Be(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,sql:`sql`}[ze(e)]??`plaintext`}var q=(0,R.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,c]=(0,R.useState)(i??null),[l,u]=(0,R.useState)(`utf-8`),[d,f]=(0,R.useState)(!0),[p,ee]=(0,R.useState)(null),[m,h]=(0,R.useState)(!1),g=(0,R.useRef)(null),_=(0,R.useRef)(``),v=(0,R.useRef)(null),{tabs:b,updateTab:C}=S(F(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:w,toggleWordWrap:ae}=re(F(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap}))),oe=ge(),E=e?.isUntitled===!0,D=e?.unsavedContent,[O,k]=(0,R.useState)(!1),A=b.find(e=>e.id===t),j=n?ze(n):``,M=Fe.has(j),N=j===`pdf`,P=Ie.has(j),I=Le.has(j),ce=Re.has(j),le=j===`md`||j===`mdx`,ue=j===`csv`,L=j===`sql`,[de,fe]=(0,R.useState)(`preview`),[pe,ye]=(0,R.useState)(`table`),{connections:B,cachedTables:be,refreshTables:xe}=se(),[V,Ce]=(0,R.useState)(()=>{if(!L||!n)return null;let e=localStorage.getItem(`ppm:sql-conn:${n}`);return e?Number(e):null}),H=(0,R.useRef)(null),U=(0,R.useRef)(null),W=(0,R.useMemo)(()=>B.find(e=>e.id===V)??null,[B,V]),Ee=i!=null&&(a===`json`||a===`xml`),[G,K]=(0,R.useState)(!1),De=(0,R.useCallback)(()=>{if(i)if(G)c(i),K(!1);else{let e=i.trimStart();if(a===`json`)try{c(JSON.stringify(JSON.parse(e),null,2)),K(!0)}catch{}else if(a===`xml`){let t=0;c(e.replace(/(>)(<)(\/*)/g,`$1
3
+ $2$3`).split(`
4
+ `).map(e=>{let n=e.trim();n.startsWith(`</`)&&(t=Math.max(0,t-1));let r=` `.repeat(t)+n;return n.startsWith(`<`)&&!n.startsWith(`</`)&&!n.endsWith(`/>`)&&!n.includes(`</`)&&t++,r}).join(`
5
+ `)),K(!0)}}},[i,a,G]),ke=(0,R.useCallback)(e=>{Ce(e),n&&localStorage.setItem(`ppm:sql-conn:${n}`,String(e)),xe(e).catch(()=>{})},[n,xe]),q=(0,R.useMemo)(()=>{if(!L||!V)return;let e=(be.get(V)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>y.get(`/api/db/connections/${V}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[L,V,be]);(0,R.useEffect)(()=>{if(!(!H.current||!q))return U.current?.dispose(),ve(),U.current=H.current.languages.registerCompletionItemProvider(`sql`,_e(H.current,q)),()=>{U.current?.dispose()}},[q]);let J=S(e=>e.openTab),[Ue,We]=(0,R.useState)(null),[Ge,Ke]=(0,R.useState)(null),[qe,Je]=(0,R.useState)(!1),[Ye,Xe]=(0,R.useState)(``),X=(0,R.useCallback)(async e=>{if(W){Je(!0),Ke(null),Xe(e);try{We(await y.post(`/api/db/connections/${W.id}/query`,{sql:e}))}catch(e){Ke(e.message),We(null)}finally{Je(!1)}}},[W]),Ze=(0,R.useCallback)(()=>{!W||!Ye||J({type:`database`,title:`${W.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:W.id,connectionName:W.name,dbType:W.type,initialSql:Ye}})},[W,J,Ye]),Qe=(0,R.useCallback)(()=>{if(!v.current||!W)return;let e=v.current,t=e.getSelection();X(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[W,X]),$e=typeof window<`u`&&`ontouchstart`in window,et=(0,R.useRef)(null),[tt,nt]=(0,R.useState)(null);(0,R.useEffect)(()=>{if(!$e)return;let e=window.visualViewport;if(!e)return;let t=()=>{let t=et.current;if(!t)return;let n=t.getBoundingClientRect().top;nt(e.height-Math.max(0,n))};return e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[$e]);let Z=(0,R.useRef)([]),rt=(0,R.useRef)(X);rt.current=X,(0,R.useEffect)(()=>()=>{Z.current.forEach(e=>e.dispose()),Z.current=[]},[]),(0,R.useEffect)(()=>{ce&&t&&C(t,{type:`sqlite`})},[ce,t,C]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,R.useEffect)(()=>{if(i!=null){f(!1);return}if(E){c(D??``),_.current=D??``,f(!1),D&&h(!0);return}if(!n||!Q&&!r)return;if(M||N||P||I){f(!1);return}f(!0),ee(null);let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${ne(r)}/files/read?path=${encodeURIComponent(n)}`;return y.get(e).then(e=>{c(e.content),e.encoding&&u(e.encoding),_.current=e.content,f(!1)}).catch(e=>{ee(e instanceof Error?e.message:`Failed to load file`),f(!1)}),()=>{g.current&&clearTimeout(g.current)}},[n,r,M,N,Q,E]);let it=(0,R.useRef)(m);it.current=m,(0,R.useEffect)(()=>{if(!n||!r||i!=null||E)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||it.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${ne(r)}/files/read?path=${encodeURIComponent(n)}`;y.get(i).then(e=>{e.content!==_.current&&(c(e.content),_.current=e.content,e.encoding&&u(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,E]),(0,R.useEffect)(()=>{if(!A||i!=null)return;let t=E?`Untitled-${e?.untitledNumber??1}`:n?x(n):`Untitled`,r=m?`${t} \u25CF`:t;A.title!==r&&C(A.id,{title:r})},[m]);let at=(0,R.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await y.put(`/api/fs/write`,{path:n,content:e}):await y.put(`${ne(r)}/files/write`,{path:n,content:e}),h(!1)}catch{}},[n,r,Q]);function ot(n){let r=n??``;c(r),_.current=r,h(!0),g.current&&clearTimeout(g.current),E?g.current=setTimeout(()=>{t&&C(t,{metadata:{...e,unsavedContent:_.current}})},2e3):g.current=setTimeout(()=>at(_.current),1e3)}let st=(0,R.useCallback)(async(e,n)=>{try{if(g.current&&clearTimeout(g.current),await y.put(`/api/fs/write`,{path:e,content:n}),t){let{closeTab:n,openTab:r}=ie.getState();n(t),r({type:`editor`,title:x(e),projectId:null,metadata:{filePath:e},closable:!0})}h(!1),k(!1)}catch{}},[t]),$=e?.lineNumber,ct=(0,R.useCallback)((e,t)=>{if(v.current=e,H.current=t,$&&$>0&&setTimeout(()=>{e.revealLineInCenter($),e.setPosition({lineNumber:$,column:1}),e.focus()},100),E&&e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>k(!0)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyZ,()=>re.getState().toggleWordWrap()),t.languages.typescript.typescriptDefaults.setDiagnosticsOptions({noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0}),t.languages.typescript.javascriptDefaults.setDiagnosticsOptions({noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0}),q&&(U.current?.dispose(),U.current=t.languages.registerCompletionItemProvider(`sql`,_e(t,q))),L){Z.current.forEach(e=>e.dispose()),Z.current=[];let n=e.getModel(),r=e.addCommand(0,(e,t)=>{t&&rt.current(t)});if(r&&n){let e=t.languages.registerCodeLensProvider(`sql`,{provideCodeLenses:e=>{if(e!==n)return{lenses:[],dispose:()=>{}};let t=[],i=e.getValue().split(`
6
+ `),a=-1,o=[],s=!1,c=(e,n)=>{let i=n.trim();!i||i.startsWith(`--`)||t.push({range:{startLineNumber:e,startColumn:1,endLineNumber:e,endColumn:1},command:{id:r,title:`▷ Run`,arguments:[i]}})};for(let e=0;e<i.length;e++){let t=i[e].trim();if(a===-1){if(!t||t.startsWith(`--`))continue;a=e+1,o=[]}o.push(i[e]),(t.match(/\$\$/g)||[]).length%2==1&&(s=!s),!s&&t.endsWith(`;`)&&(c(a,o.join(`
7
+ `)),a=-1,o=[])}return a>0&&o.join(``).trim()&&c(a,o.join(`
8
+ `)),{lenses:t,dispose:()=>{}}}});Z.current.push(e)}}},[q]);if(!i&&!E&&(!n||!Q&&!r))return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:`No file selected.`});if(d)return(0,z.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,z.jsx)(T,{className:`size-5 animate-spin`}),(0,z.jsx)(`span`,{className:`text-sm`,children:`Loading file...`})]});if(p)return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full text-error text-sm`,children:p});if(M)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Y,{}),children:(0,z.jsx)(je,{filePath:n,projectName:r})});if(N)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Y,{}),children:(0,z.jsx)(Me,{filePath:n,projectName:r})});if(P)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Y,{}),children:(0,z.jsx)(Ne,{filePath:n,projectName:r})});if(I)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Y,{}),children:(0,z.jsx)(Pe,{filePath:n,projectName:r})});if(l===`base64`)return(0,z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,z.jsx)(te,{className:`size-10 text-text-subtle`}),(0,z.jsx)(`p`,{className:`text-sm`,children:`This file is a binary format and cannot be displayed.`}),(0,z.jsx)(`p`,{className:`text-xs text-text-subtle`,children:n})]});let lt=L?(0,z.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,z.jsx)(s,{className:`size-3 text-muted-foreground`}),(0,z.jsxs)(`select`,{value:V??``,onChange:e=>{let t=Number(e.target.value);t&&ke(t)},className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[140px]`,title:`Select connection for autocomplete`,children:[(0,z.jsx)(`option`,{value:``,children:`Connection…`}),B.map(e=>(0,z.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,z.jsx)(`button`,{type:`button`,onClick:Qe,disabled:!W,className:`p-0.5 rounded text-muted-foreground hover:text-primary disabled:opacity-30 transition-colors`,title:`Run SQL`,children:(0,z.jsx)(me,{className:`size-3.5`})})]}):null;return(0,z.jsxs)(`div`,{ref:et,className:`flex flex-col h-full w-full overflow-hidden`,style:tt?{height:`${tt}px`,maxHeight:`${tt}px`}:void 0,children:[i!=null&&Ee&&(0,z.jsx)(`div`,{className:`flex items-center h-7 border-b border-border bg-background shrink-0 px-2 gap-2`,children:(0,z.jsx)(`button`,{type:`button`,onClick:De,className:`text-[10px] px-2 py-0.5 rounded border border-border hover:bg-muted transition-colors text-foreground`,children:G?`Raw`:`Beautify`})}),n&&r&&t&&(0,z.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0`,children:[(0,z.jsx)(Se,{filePath:n,projectName:r,tabId:t,className:`flex items-center flex-1 min-w-0 overflow-x-auto scrollbar-none px-2 gap-0.5`}),lt,(0,z.jsx)(we,{ext:j,mdMode:de,onMdModeChange:fe,csvMode:pe,onCsvModeChange:ye,wordWrap:w,onToggleWordWrap:ae,filePath:n,projectName:r,className:`shrink-0 flex items-center gap-1 px-2`})]}),L&&(!r||!t)&&(0,z.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0 px-2`,children:[(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground truncate flex-1`,children:n?x(n):`SQL`}),lt]}),ue&&pe===`table`?(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(T,{className:`size-5 animate-spin text-text-subtle`})}),children:(0,z.jsx)(Ae,{content:o??``,onContentChange:ot,wordWrap:w})}):le&&de===`preview`?(0,z.jsx)(He,{content:o??``}):(0,z.jsx)(`div`,{className:`flex-1 overflow-hidden min-h-0`,children:(0,z.jsx)(he,{height:`100%`,language:a??Be(n??``),value:o??``,onChange:i==null?ot:void 0,onMount:ct,theme:oe,options:{fontSize:13,fontFamily:`Menlo, Monaco, Consolas, monospace`,wordWrap:w?`on`:`off`,minimap:{enabled:!1},scrollBeyondLastLine:!1,automaticLayout:!0,lineNumbers:`on`,folding:!0,bracketPairColorization:{enabled:!0},readOnly:i!=null},loading:(0,z.jsx)(T,{className:`size-5 animate-spin text-text-subtle`})})}),L&&(Ue||Ge||qe)&&(0,z.jsx)(Ve,{result:Ue,error:Ge,loading:qe,connName:W?.name,onClose:()=>{We(null),Ke(null),Je(!1)},onOpenInTab:Ze}),$e&&(0,z.jsx)(Oe,{editorRef:v,readOnly:i!=null}),O&&(0,z.jsx)(Te,{open:O,defaultName:`Untitled-${e?.untitledNumber??1}`,content:_.current,onSave:st,onCancel:()=>k(!1)})]})}),J=()=>{};function Ve({result:e,error:t,loading:n,connName:r,onClose:i,onOpenInTab:a}){let c=(0,R.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),l=(0,R.useMemo)(()=>(e?.columns??[]).map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null})),[e?.columns]),[u,d]=(0,R.useState)(250),f=(0,R.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=u,r=e=>d(Math.max(80,n+(t-e.clientY))),i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[u]);return(0,z.jsxs)(`div`,{className:`shrink-0 border-t border-border flex flex-col`,style:{height:u},children:[(0,z.jsx)(`div`,{onMouseDown:f,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,z.jsx)(E,{className:`size-3 text-muted-foreground/50`})}),(0,z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1 bg-muted/50 border-b border-border shrink-0`,children:[(0,z.jsx)(s,{className:`size-3 text-muted-foreground`}),(0,z.jsxs)(`span`,{className:`text-xs font-medium text-foreground truncate flex-1`,children:[r?`${r} · Results`:`Query Results`,e?.executionTimeMs!=null&&(0,z.jsxs)(`span`,{className:`text-muted-foreground ml-1.5 font-normal`,children:[e.executionTimeMs,`ms`]})]}),(0,z.jsxs)(`button`,{type:`button`,onClick:a,title:`Open in DB Viewer tab`,className:`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,children:[(0,z.jsx)(ae,{className:`size-3`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:`Open in Tab`})]}),(0,z.jsx)(`button`,{type:`button`,onClick:i,title:`Close results`,className:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,z.jsx)(o,{className:`size-3`})})]}),(0,z.jsxs)(`div`,{className:`flex-1 overflow-hidden min-h-0`,children:[n&&(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(T,{className:`size-4 animate-spin text-muted-foreground`})}),t&&(0,z.jsx)(`div`,{className:`px-3 py-2 text-xs text-destructive bg-destructive/5`,children:t}),e?.changeType===`modify`&&(0,z.jsxs)(`div`,{className:`px-3 py-2 text-xs text-green-500`,children:[e.rowsAffected,` row(s) affected`]}),c&&(0,z.jsx)(g,{tableData:c,schema:l,loading:!1,page:1,onPageChange:J,onCellUpdate:J,orderBy:null,orderDir:`ASC`,onToggleSort:J,connectionName:r}),e?.changeType===`select`&&e.rows.length===0&&(0,z.jsx)(`div`,{className:`px-3 py-2 text-xs text-muted-foreground`,children:`No results`})]})]})}function Y(){return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(T,{className:`size-5 animate-spin text-text-subtle`})})}function He({content:e}){return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`div`,{className:`animate-pulse h-4 bg-muted rounded m-4`}),children:(0,z.jsx)(ke,{content:e,className:`flex-1 overflow-auto p-4`})})}export{q as CodeEditor};
@@ -1,4 +1,4 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{i as r,t as i}from"./api-client-Dvzcc_EO.js";import{n as a}from"./settings-store-BHBb62gq.js";import"./vendor-mermaid-CMiurk2b.js";import{G as o,h as s}from"./index-ZFyltHwi.js";import{n as c,t as l}from"./use-monaco-theme-CP-vyTF8.js";var u=e(n(),1),d=t();function f(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,go:`go`,rs:`rust`,java:`java`,rb:`ruby`,php:`php`,swift:`swift`,sql:`sql`,xml:`xml`,toml:`toml`}[e.split(`.`).pop()?.toLowerCase()??``]??`plaintext`}function p(e){let t=e.split(`
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{i as r,t as i}from"./api-client-Dvzcc_EO.js";import{n as a}from"./settings-store-BHBb62gq.js";import"./vendor-mermaid-CMiurk2b.js";import{G as o,h as s}from"./index-CoMWx5VS.js";import{n as c,t as l}from"./use-monaco-theme-CP-vyTF8.js";var u=e(n(),1),d=t();function f(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,go:`go`,rs:`rust`,java:`java`,rb:`ruby`,php:`php`,swift:`swift`,sql:`sql`,xml:`xml`,toml:`toml`}[e.split(`.`).pop()?.toLowerCase()??``]??`plaintext`}function p(e){let t=e.split(`
2
2
  `),n=[],r=0,i=0;for(;r<t.length;){let e=t[r];if(e.startsWith(`<<<<<<<`)){let a=r,o=e.substring(7).trim(),s=[];for(r++;r<t.length&&!t[r].startsWith(`=======`);)s.push(t[r]),r++;if(r>=t.length)break;let c=r,l=[];for(r++;r<t.length&&!t[r].startsWith(`>>>>>>>`);)l.push(t[r]),r++;if(r>=t.length)break;let u=t[r].substring(7).trim();n.push({id:i++,startLine:a+1,separatorLine:c+1,endLine:r+1,currentContent:s.join(`
3
3
  `),incomingContent:l.join(`
4
4
  `),currentLabel:o,incomingLabel:u})}r++}return n}function m({metadata:e}){let t=e?.filePath,n=e?.projectName,[m,g]=(0,u.useState)(null),[_,v]=(0,u.useState)(!0),[y,b]=(0,u.useState)(null),[x,S]=(0,u.useState)(0),C=(0,u.useRef)(null),w=(0,u.useRef)(null),T=(0,u.useRef)([]),E=(0,u.useRef)(null),{wordWrap:D}=a(s(e=>({wordWrap:e.wordWrap}))),O=l(),k=(0,u.useRef)(null),[A,j]=(0,u.useState)();(0,u.useEffect)(()=>{let e=k.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&j(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[]),(0,u.useEffect)(()=>{!t||!n||(v(!0),i.get(`${r(n)}/files/read?path=${encodeURIComponent(t)}`).then(e=>{g(e.content),v(!1)}).catch(e=>{b(e.message||`Failed to load file`),v(!1)}))},[t,n]);let M=(0,u.useCallback)(()=>{let e=C.current,t=w.current;if(!e||!t)return;let n=p(e.getModel()?.getValue()||``);S(n.length);for(let t of T.current)e.removeContentWidget(t);if(T.current=[],E.current&&E.current.clear(),n.length===0)return;let r=[];for(let e of n)r.push({range:new t.Range(e.startLine,1,e.startLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`,glyphMarginClassName:`conflict-glyph-current`}}),r.push({range:new t.Range(e.separatorLine,1,e.separatorLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`}}),r.push({range:new t.Range(e.endLine,1,e.endLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`,glyphMarginClassName:`conflict-glyph-incoming`}}),e.separatorLine-e.startLine>1&&r.push({range:new t.Range(e.startLine+1,1,e.separatorLine-1,1),options:{isWholeLine:!0,className:`conflict-current-content`}}),e.endLine-e.separatorLine>1&&r.push({range:new t.Range(e.separatorLine+1,1,e.endLine-1,1),options:{isWholeLine:!0,className:`conflict-incoming-content`}});E.current=e.createDecorationsCollection(r);for(let r of n){let n=`conflict-widget-${r.id}`,i=document.createElement(`div`);i.className=`conflict-actions`,i.innerHTML=`<span class="conflict-label">Current Change (${h(r.currentLabel||`HEAD`)})</span><button class="conflict-btn conflict-btn-current" data-action="current">Accept Current</button><button class="conflict-btn conflict-btn-incoming" data-action="incoming">Accept Incoming</button><button class="conflict-btn conflict-btn-both" data-action="both">Accept Both</button>`,i.addEventListener(`click`,e=>{let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.getAttribute(`data-action`);N(r.id,n)});let a={getId:()=>n,getDomNode:()=>i,getPosition:()=>({position:{lineNumber:r.startLine,column:1},preference:[t.editor.ContentWidgetPositionPreference.ABOVE]})};e.addContentWidget(a),T.current.push(a)}},[]),N=(0,u.useCallback)((e,t)=>{let n=C.current,r=w.current;if(!n||!r)return;let i=n.getModel();if(!i)return;let a=p(i.getValue()).find(t=>t.id===e);if(!a)return;let o;switch(t){case`current`:o=a.currentContent;break;case`incoming`:o=a.incomingContent;break;case`both`:o=a.currentContent+`
@@ -0,0 +1,5 @@
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import{a as i,i as a,n as o,o as s,r as c,t as l}from"./x-OGGXhtlb.js";import{n as u}from"./database-DOWH9-Vv.js";import{t as d}from"./chevron-right-DnHIvvcy.js";import{t as f}from"./sparkles-B0mRBy_j.js";import{t as p}from"./text-wrap-Cn6BNQfq.js";import{t as m}from"./trash-2-CJYoLw7Q.js";import{t as h}from"./tab-store-0rGchMXr.js";import{$ as g,B as _,G as v,K as y,L as b,V as ee,h as x}from"./index-CoMWx5VS.js";import{n as S,t as C}from"./use-monaco-theme-CP-vyTF8.js";import{n as w}from"./csv-parser-DO0dz4x_.js";var te=r(`columns-3`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]),ne=r(`funnel`,[[`path`,{d:`M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z`,key:`sc7q7i`}]]),T=e(n(),1),E=t();function D(e,t,n){let r=new Blob([t],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=e,a.click(),URL.revokeObjectURL(i)}function re({columns:e,rows:t,filename:n=`export`,exportAllUrl:r}){let[i,o]=(0,T.useState)(!1),[s,c]=(0,T.useState)(!1),l=(0,T.useRef)(null);(0,T.useEffect)(()=>{if(!i)return;let e=e=>{l.current&&!l.current.contains(e.target)&&o(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[i]);let u=()=>{let r=w(e,t.map(t=>e.map(e=>String(t[e]??``))));D(`${n}.csv`,r,`text/csv`),o(!1)},d=()=>{let e=JSON.stringify(t,null,2);D(`${n}.json`,e,`application/json`),o(!1)},f=async e=>{if(r){c(!0);try{let t=await(await fetch(`${r}&format=${e}&limit=10000`)).text(),i=e===`csv`?`text/csv`:`application/json`;D(`${n}-all.${e}`,t,i)}catch{}c(!1),o(!1)}};return e.length===0||t.length===0?null:(0,E.jsxs)(`div`,{className:`relative`,ref:l,children:[(0,E.jsx)(`button`,{type:`button`,onClick:()=>o(e=>!e),className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,title:`Export`,children:(0,E.jsx)(a,{className:`size-3.5`})}),i&&(0,E.jsxs)(`div`,{className:`absolute right-0 top-full mt-1 z-50 bg-popover border border-border rounded-md shadow-md py-1 min-w-[160px] text-xs`,children:[(0,E.jsx)(`button`,{onClick:u,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors`,children:`Export Page (CSV)`}),(0,E.jsx)(`button`,{onClick:d,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors`,children:`Export Page (JSON)`}),r&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`div`,{className:`border-t border-border my-1`}),(0,E.jsx)(`button`,{onClick:()=>f(`csv`),disabled:s,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors disabled:opacity-50`,children:s?`Exporting…`:`Export All (CSV)`}),(0,E.jsx)(`button`,{onClick:()=>f(`json`),disabled:s,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors disabled:opacity-50`,children:s?`Exporting…`:`Export All (JSON)`})]})]})]})}function ie({tableData:e,schema:t,loading:n,page:r,onPageChange:a,onCellUpdate:c,onRowDelete:f,orderBy:p,orderDir:g,onToggleSort:y,onBulkDelete:S,onInsertRow:C,connectionId:w,selectedTable:D,selectedSchema:ie,connectionName:O,columnFilters:k={},onColumnFilter:A}){let[j,le]=(0,T.useState)(null),[M,ue]=(0,T.useState)(``),[N,de]=(0,T.useState)(null),[P,fe]=(0,T.useState)(``),[F,I]=(0,T.useState)(new Set),[pe,L]=(0,T.useState)(!1),[R,z]=(0,T.useState)({}),[me,B]=(0,T.useState)(null),[he,V]=(0,T.useState)(!1),{openTab:ge}=h(x(e=>({openTab:e.openTab}))),[H,U]=(0,T.useState)(null),_e=(0,T.useCallback)(e=>{let t=D??``,n=ae(e.value),r=`${w??`local`}:${t}:${e.col}:${e.pkVal}`;U({title:t?`${e.col} #${e.pkVal} — ${t}`:`${e.col} #${e.pkVal}`,content:e.value,language:n,viewerKey:r})},[w,D]),[W,ve]=(0,T.useState)(new Set),[G,ye]=(0,T.useState)(new Set),[be,xe]=(0,T.useState)(null),[Se,K]=(0,T.useState)(!1),Ce=(0,T.useRef)(null),q=(0,T.useMemo)(()=>t.find(e=>e.pk)?.name||(t.find(e=>e.name.toLowerCase()===`id`)?.name??null),[t]),we=(0,T.useCallback)(e=>{let t=JSON.stringify(e,null,2),n=q?String(e[q]??``):``,r=D??``,i=`${w??`local`}:${r}:row:${n||`unknown`}`;U({title:n?`Row #${n}${r?` — ${r}`:``}`:`Row${r?` — ${r}`:``}`,content:t,language:`json`,viewerKey:i})},[q,w,D]),Te=(0,T.useCallback)(()=>{H&&ge({type:`editor`,title:H.title,projectId:null,closable:!0,metadata:{inlineContent:H.content,inlineLanguage:H.language,viewerKey:H.viewerKey}})},[ge,H]),Ee=(0,T.useRef)(j);Ee.current=j;let J=(0,T.useRef)(M);J.current=M;let De=(0,T.useRef)(F);De.current=F;let Oe=(0,T.useRef)(N);Oe.current=N;let ke=(0,T.useCallback)((e,t,n)=>{le({rowIdx:e,col:t}),ue(n==null?``:typeof n==`object`?JSON.stringify(n):String(n))},[]),Ae=(0,T.useCallback)(()=>{let t=Ee.current;if(!t||!e||!q)return;let n=e.rows[t.rowIdx];if(!n)return;let r=n[t.col];String(r??``)!==J.current&&c(q,n[q],t.col,J.current===``?null:J.current),le(null)},[e,q,c]),je=(0,T.useCallback)(()=>le(null),[]),Me=(0,T.useCallback)(t=>{if(!e||!q||!f)return;let n=e.rows[t];n&&(f(q,n[q]),de(null))},[e,q,f]),Ne=(0,T.useCallback)(e=>{ve(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Pe=(0,T.useCallback)(e=>{ye(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Fe=(0,T.useCallback)((e,t)=>{let n={...k};t?n[e]=t:delete n[e],A?.(n)},[k,A]),Ie=(0,T.useCallback)(e=>{I(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Le=(0,T.useCallback)(()=>{e&&I(t=>t.size===e.rows.length?new Set:new Set(e.rows.map((e,t)=>t)))},[e]),Re=(0,T.useCallback)(()=>{!e||!q||!S||(S(q,Array.from(F).map(t=>e.rows[t]?.[q]).filter(e=>e!=null)),I(new Set),V(!1))},[e,q,S,F]),ze=(0,T.useCallback)(async()=>{if(C){B(null);try{let e={};for(let[t,n]of Object.entries(R))n!==``&&(e[t]=n);await C(e),L(!1),z({})}catch(e){B(e.message)}}},[C,R]),Y=(0,T.useMemo)(()=>{if(!e||!P)return e?.rows??[];let t=P.toLowerCase();return e.rows.filter(n=>e.columns.some(e=>String(n[e]??``).toLowerCase().includes(t)))},[e,P]),Be=(0,T.useRef)(null);(0,T.useEffect)(()=>{let t=Be.current;if(!t)return;let n=t=>{if(t.key===`Escape`){K(!1),U(null);return}let n=t.target?.tagName;if(!(n===`INPUT`||n===`TEXTAREA`)){if(t.key===`/`){t.preventDefault(),K(!0);return}if(!(!(t.metaKey||t.ctrlKey)||!e)&&(t.key===`a`&&(t.preventDefault(),I(new Set(e.rows.map((e,t)=>t)))),t.key===`c`&&F.size>0)){t.preventDefault();let n=e.columns,r=n.join(` `),i=Array.from(F).sort((e,t)=>e-t).map(t=>n.map(n=>{let r=e.rows[t]?.[n];return r==null?``:typeof r==`object`?JSON.stringify(r):String(r)}).join(` `));navigator.clipboard.writeText([r,...i].join(`
2
+ `))}}};return t.addEventListener(`keydown`,n),()=>t.removeEventListener(`keydown`,n)},[e,F]);let X=(0,T.useMemo)(()=>{if(!e)return[];let t=e.columns.filter(e=>W.has(e)),n=e.columns.filter(e=>!W.has(e));return[...t,...n]},[e?.columns,W]),Ve=(0,T.useRef)(null),[He,Ue]=(0,T.useState)(0),[Z,We]=(0,T.useState)(new Map);(0,T.useEffect)(()=>{let e=Ve.current;if(!e)return;let t=()=>{Ue(e.offsetHeight);let t=new Map;e.querySelectorAll(`th[data-col]`).forEach(e=>{t.set(e.dataset.col,e.offsetWidth)});let n=e.querySelector(`th[data-col='_cb']`);n&&t.set(`_cb`,n.offsetWidth),We(t)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[e?.columns,W]);let Q=(0,T.useMemo)(()=>{let e=new Map,t=Z.get(`_cb`)??(q?40:0);for(let n of X){if(!W.has(n))break;e.set(n,t),t+=Z.get(n)??100}return e},[X,W,q,Z]),$=(0,T.useMemo)(()=>Array.from(G).sort((e,t)=>e-t).map(e=>({idx:e,row:Y[e]})).filter(e=>e.row),[G,Y]),Ge=(0,T.useRef)(new Map),[Ke,qe]=(0,T.useState)(new Map),Je=(0,T.useCallback)((e,t)=>{t?Ge.current.set(e,t):Ge.current.delete(e)},[]);(0,T.useEffect)(()=>{if($.length===0){Ke.size>0&&qe(new Map);return}let e=requestAnimationFrame(()=>{let e=new Map;for(let{idx:t}of $){let n=Ge.current.get(t);n&&e.set(t,n.offsetHeight)}qe(e)});return()=>cancelAnimationFrame(e)},[$,e]);let Ye=(0,T.useMemo)(()=>{let e=new Map,t=He;for(let{idx:n}of $)e.set(n,t),t+=Ke.get(n)??28;return e},[He,$,Ke]),Xe=(0,T.useCallback)(e=>{let t=Ce.current,n=t?.querySelector(`th[data-col="${e}"]`);if(!t||!n)return;let r=0,i=t.querySelector(`th[data-col="_cb"]`);i&&(r+=i.offsetWidth);for(let[t,n]of Q)t!==e&&(r=Math.max(r,n+(Z.get(t)??0)));let a=n.offsetLeft-r;t.scrollTo({left:a,behavior:`instant`}),K(!1)},[Q,Z]);if(!e)return(0,E.jsx)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:n?(0,E.jsx)(v,{className:`size-4 animate-spin`}):`Select a table`});let Ze=Math.ceil(e.total/e.limit)||1,Qe=F.size>0,$e=F.size===e.rows.length&&e.rows.length>0;return(0,E.jsxs)(`div`,{ref:Be,tabIndex:0,className:`flex flex-col h-full overflow-hidden outline-none`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1 border-b border-border bg-background shrink-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-1 flex-1`,children:[(0,E.jsx)(b,{className:`size-3 text-muted-foreground`}),(0,E.jsx)(`input`,{type:`text`,value:P,onChange:e=>fe(e.target.value),placeholder:`Search current page…`,className:`flex-1 text-xs bg-transparent outline-none text-foreground placeholder:text-muted-foreground`}),P&&(0,E.jsx)(`button`,{type:`button`,onClick:()=>fe(``),className:`text-muted-foreground hover:text-foreground`,children:(0,E.jsx)(l,{className:`size-3`})})]}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`button`,{type:`button`,onClick:()=>K(!Se),className:`p-0.5 rounded transition-colors ${Se?`text-primary`:`text-muted-foreground hover:text-foreground`}`,title:`Jump to column ( / )`,children:(0,E.jsx)(te,{className:`size-3.5`})}),Se&&(0,E.jsx)(se,{columns:e.columns,onSelect:Xe,onClose:()=>K(!1)})]}),Qe&&(0,E.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,E.jsxs)(`span`,{className:`text-muted-foreground`,children:[F.size,` selected`]}),S&&q&&(he?(0,E.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,E.jsxs)(`button`,{type:`button`,onClick:Re,className:`text-destructive text-[10px] font-medium hover:underline`,children:[`Delete `,F.size,`?`]}),(0,E.jsx)(`button`,{type:`button`,onClick:()=>V(!1),className:`text-muted-foreground text-[10px] hover:underline`,children:`Cancel`})]}):(0,E.jsx)(`button`,{type:`button`,onClick:()=>V(!0),className:`p-0.5 text-muted-foreground hover:text-destructive`,children:(0,E.jsx)(m,{className:`size-3`})})),(0,E.jsx)(re,{columns:e.columns,rows:Array.from(F).map(t=>e.rows[t]).filter(Boolean),filename:`${O??`db`}-selected`})]}),C&&(0,E.jsx)(`button`,{type:`button`,onClick:()=>{L(!0),z({}),B(null)},className:`p-0.5 rounded text-muted-foreground hover:text-primary transition-colors`,title:`Insert row`,children:(0,E.jsx)(o,{className:`size-3.5`})})]}),pe&&(0,E.jsxs)(`div`,{className:`px-2 py-1.5 border-b border-border bg-muted/30 text-xs space-y-1`,children:[(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.filter(e=>!e.pk).map(e=>(0,E.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,E.jsx)(`label`,{className:`text-muted-foreground text-[10px] w-16 truncate`,title:e.name,children:e.name}),(0,E.jsx)(`input`,{value:R[e.name]??``,onChange:t=>z(n=>({...n,[e.name]:t.target.value})),placeholder:e.defaultValue??(e.nullable?`NULL`:``),className:`h-5 w-24 text-[11px] px-1 rounded border border-border bg-background outline-none focus:border-primary`})]},e.name))}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(`button`,{type:`button`,onClick:ze,className:`text-[10px] px-2 py-0.5 rounded bg-primary text-primary-foreground hover:bg-primary/90`,children:`Save`}),(0,E.jsx)(`button`,{type:`button`,onClick:()=>L(!1),className:`text-[10px] text-muted-foreground hover:underline`,children:`Cancel`}),me&&(0,E.jsx)(`span`,{className:`text-[10px] text-destructive`,children:me})]})]}),(0,E.jsxs)(`div`,{ref:Ce,className:`flex-1 overflow-auto relative min-h-0`,children:[n&&(0,E.jsx)(`div`,{className:`absolute inset-0 z-30 flex items-center justify-center bg-background/60`,children:(0,E.jsx)(v,{className:`size-5 animate-spin text-primary`})}),(0,E.jsxs)(`table`,{className:`w-full text-xs`,style:{borderCollapse:`separate`,borderSpacing:0},children:[(0,E.jsx)(`thead`,{ref:Ve,className:`sticky top-0 z-20 bg-muted`,children:(0,E.jsxs)(`tr`,{children:[q&&(0,E.jsx)(`th`,{"data-col":`_cb`,className:`px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border w-10 bg-muted`,style:{position:`sticky`,left:0,zIndex:30},children:(0,E.jsx)(`input`,{type:`checkbox`,checked:$e,onChange:Le,className:`size-3 accent-primary`})}),X.map(e=>{let n=t.find(t=>t.name===e)?.pk,r=p===e,a=W.has(e),o=!!k[e],c=be===e,u=Q.get(e);return(0,E.jsxs)(`th`,{"data-col":e,className:`group/th px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border whitespace-nowrap bg-muted ${a?`border-r border-r-primary/20`:``}`,style:u==null?void 0:{position:`sticky`,left:u,zIndex:25},children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,E.jsxs)(`button`,{type:`button`,onClick:()=>y(e),className:`flex items-center gap-0.5 ${n?`font-bold`:``} hover:text-foreground transition-colors`,children:[e,r&&g===`ASC`&&(0,E.jsx)(i,{className:`size-3`}),r&&g===`DESC`&&(0,E.jsx)(s,{className:`size-3`})]}),A&&(0,E.jsx)(`button`,{type:`button`,title:`Filter column`,onClick:()=>xe(c?null:e),className:`p-0.5 rounded transition-colors ${o||c?`text-primary`:`text-muted-foreground/40 md:opacity-0 md:group-hover/th:opacity-100 hover:text-foreground`}`,children:(0,E.jsx)(ne,{className:`size-2.5`})}),(0,E.jsx)(`button`,{type:`button`,title:a?`Unpin column`:`Pin column`,onClick:()=>Ne(e),className:`p-0.5 rounded transition-colors ${a?`text-primary`:`text-muted-foreground/40 md:opacity-0 md:group-hover/th:opacity-100 hover:text-foreground`}`,children:a?(0,E.jsx)(ee,{className:`size-2.5`}):(0,E.jsx)(_,{className:`size-2.5`})})]}),c&&(0,E.jsxs)(`div`,{className:`mt-1 flex items-center gap-1`,children:[(0,E.jsx)(`input`,{autoFocus:!0,type:`text`,value:k[e]??``,placeholder:`ILIKE filter…`,onChange:t=>Fe(e,t.target.value),onKeyDown:e=>{e.key===`Escape`&&xe(null)},className:`w-full h-5 text-[10px] px-1 rounded border border-border bg-background outline-none focus:border-primary`}),o&&(0,E.jsx)(`button`,{type:`button`,onClick:()=>Fe(e,``),className:`text-muted-foreground hover:text-foreground`,children:(0,E.jsx)(l,{className:`size-2.5`})})]})]},e)}),f&&q&&(0,E.jsx)(`th`,{className:`px-2 py-1.5 border-b border-border w-14 bg-muted`})]})}),(0,E.jsxs)(`tbody`,{children:[$.map(({idx:e,row:t})=>(0,E.jsx)(ce,{row:t,rowIdx:e,columns:X,selected:F.has(e),onToggleSelect:Ie,pkCol:q,editingCell:j,editValue:M,onStartEdit:ke,onCommitEdit:Ae,onCancelEdit:je,onSetEditValue:ue,showDelete:!!f,confirmingDelete:N===e,onDelete:Me,onConfirmDelete:de,onViewCell:_e,onViewRow:we,pinned:!0,onTogglePin:Pe,pinnedCols:W,pinnedColOffsets:Q,stickyTop:Ye.get(e)??He,trRef:t=>Je(e,t)},`pin-${e}`)),Y.map((e,t)=>G.has(t)?null:(0,E.jsx)(ce,{row:e,rowIdx:t,columns:X,selected:F.has(t),onToggleSelect:Ie,pkCol:q,editingCell:j,editValue:M,onStartEdit:ke,onCommitEdit:Ae,onCancelEdit:je,onSetEditValue:ue,showDelete:!!f,confirmingDelete:N===t,onDelete:Me,onConfirmDelete:de,onViewCell:_e,onViewRow:we,pinned:!1,onTogglePin:Pe,pinnedCols:W,pinnedColOffsets:Q},t)),Y.length===0&&(0,E.jsx)(`tr`,{children:(0,E.jsx)(`td`,{colSpan:X.length+2,className:`px-2 py-8 text-center text-muted-foreground`,children:`No data`})})]})]})]}),H&&(0,E.jsx)(oe,{data:H,onClose:()=>U(null),onOpenInTab:Te}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-1.5 border-t border-border bg-background shrink-0 text-xs text-muted-foreground`,children:[(0,E.jsxs)(`span`,{children:[e.total.toLocaleString(),` rows`]}),(0,E.jsxs)(`div`,{className:`hidden md:flex items-center gap-2 text-[10px] text-muted-foreground/50`,children:[(0,E.jsxs)(`span`,{children:[(0,E.jsx)(`kbd`,{className:`px-1 py-0.5 rounded bg-muted text-[9px]`,children:`/`}),` columns`]}),(0,E.jsxs)(`span`,{children:[(0,E.jsxs)(`kbd`,{className:`px-1 py-0.5 rounded bg-muted text-[9px]`,children:[`⌘`,`A`]}),` select all`]}),(0,E.jsxs)(`span`,{children:[(0,E.jsxs)(`kbd`,{className:`px-1 py-0.5 rounded bg-muted text-[9px]`,children:[`⌘`,`C`]}),` copy`]})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(`button`,{type:`button`,disabled:r<=1,onClick:()=>a(r-1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,E.jsx)(u,{className:`size-3.5`})}),(0,E.jsxs)(`span`,{children:[r,` / `,Ze]}),(0,E.jsx)(`button`,{type:`button`,disabled:r>=Ze,onClick:()=>a(r+1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,E.jsx)(d,{className:`size-3.5`})})]})]})]})}function O(e){return e==null?`NULL`:typeof e==`object`?JSON.stringify(e):String(e)}var k=200;function A(e){if(e==null)return!1;if(typeof e==`object`)return!0;let t=String(e);if(t.length>=k)return!0;let n=t.trimStart();return!!((n[0]===`{`||n[0]===`[`)&&(n.endsWith(`}`)||n.endsWith(`]`))||n.startsWith(`<?xml`)||n.startsWith(`<`)&&n.endsWith(`>`))}function ae(e){let t=e.trimStart();if(t[0]===`{`||t[0]===`[`)try{return JSON.parse(t),`json`}catch{}return t.startsWith(`<?xml`)||t.startsWith(`<`)&&/<\/\w+>/.test(t)?`xml`:t.startsWith(`---`)||/^\w+:\s/m.test(t)?`yaml`:`plaintext`}function oe({data:e,onClose:t,onOpenInTab:n}){let r=C(),[i,a]=(0,T.useState)(!0),[o,s]=(0,T.useState)(e.content),[u,d]=(0,T.useState)(!1),m=e.language===`json`||e.language===`xml`,h=(0,T.useRef)(e.title);h.current!==e.title&&(h.current=e.title,s(e.content),d(!1));let _=(0,T.useCallback)(()=>{if(u)s(e.content),d(!1);else if(e.language===`json`)try{s(JSON.stringify(JSON.parse(e.content.trim()),null,2)),d(!0)}catch{}else if(e.language===`xml`){let t=0;s(e.content.trim().replace(/>\s*</g,`>
3
+ <`).split(`
4
+ `).map(e=>{let n=e.trim();n.startsWith(`</`)&&(t=Math.max(0,t-1));let r=` `.repeat(t)+n;return n.startsWith(`<`)&&!n.startsWith(`</`)&&!n.endsWith(`/>`)&&!n.startsWith(`<?`)&&t++,r}).join(`
5
+ `)),d(!0)}},[u,e.content,e.language]),[b,ee]=(0,T.useState)(200),x=(0,T.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=b,r=e=>ee(Math.max(80,n+(t-e.clientY))),i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[b]);return(0,E.jsxs)(`div`,{className:`shrink-0 border-t border-border flex flex-col`,style:{height:b},children:[(0,E.jsx)(`div`,{onMouseDown:x,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,E.jsx)(y,{className:`size-3 text-muted-foreground/50`})}),(0,E.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1 bg-muted/50 border-b border-border shrink-0`,children:[(0,E.jsx)(c,{className:`size-3 text-muted-foreground`}),(0,E.jsx)(`span`,{className:`text-xs font-medium text-foreground truncate flex-1`,children:e.title}),m&&(0,E.jsx)(`button`,{type:`button`,onClick:_,title:u?`Raw`:`Beautify`,className:`p-0.5 rounded transition-colors ${u?`text-primary`:`text-muted-foreground hover:text-foreground`}`,children:(0,E.jsx)(f,{className:`size-3`})}),(0,E.jsx)(`button`,{type:`button`,onClick:()=>a(!i),title:i?`No wrap`:`Word wrap`,className:`p-0.5 rounded transition-colors ${i?`text-primary`:`text-muted-foreground hover:text-foreground`}`,children:(0,E.jsx)(p,{className:`size-3`})}),(0,E.jsxs)(`button`,{type:`button`,onClick:n,title:`Open in new tab`,className:`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,children:[(0,E.jsx)(g,{className:`size-3`}),(0,E.jsx)(`span`,{className:`hidden sm:inline`,children:`Open in Tab`})]}),(0,E.jsx)(`button`,{type:`button`,onClick:t,title:`Close preview (Esc)`,className:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,E.jsx)(l,{className:`size-3`})})]}),(0,E.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,E.jsx)(S,{height:`100%`,language:e.language===`plaintext`?void 0:e.language,value:o,theme:r,options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:i?`on`:`off`,lineNumbers:`on`,fontSize:12,folding:!0,bracketPairColorization:{enabled:!0},domReadOnly:!0,contextmenu:!1,overviewRulerLanes:0},loading:(0,E.jsx)(v,{className:`size-4 animate-spin text-muted-foreground`})})})]})}function se({columns:e,onSelect:t,onClose:n}){let[r,i]=(0,T.useState)(``),[a,o]=(0,T.useState)(0),s=(0,T.useMemo)(()=>{if(!r)return e;let t=r.toLowerCase();return e.filter(e=>e.toLowerCase().includes(t))},[e,r]),c=(0,T.useRef)(null);return(0,T.useEffect)(()=>{c.current?.scrollIntoView({block:`nearest`})},[a]),(0,E.jsxs)(`div`,{className:`absolute top-full right-0 mt-1 z-50 w-52 max-h-56 bg-popover border border-border rounded-md shadow-lg overflow-hidden flex flex-col`,children:[(0,E.jsx)(`input`,{autoFocus:!0,type:`text`,value:r,onChange:e=>{i(e.target.value),o(0)},onKeyDown:e=>{e.key===`Escape`?n():e.key===`ArrowDown`?(e.preventDefault(),o(e=>Math.min(e+1,s.length-1))):e.key===`ArrowUp`?(e.preventDefault(),o(e=>Math.max(e-1,0))):e.key===`Enter`&&s[a]&&t(s[a])},placeholder:`Search columns…`,className:`px-2 py-1.5 text-xs bg-transparent outline-none border-b border-border text-foreground placeholder:text-muted-foreground`}),(0,E.jsx)(`div`,{className:`overflow-auto flex-1`,children:s.map((e,n)=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(e),ref:n===a?c:void 0,className:`w-full text-left px-2 py-1 text-xs truncate ${n===a?`bg-primary/10 text-primary`:`text-foreground hover:bg-muted`}`,children:e},e))})]})}var ce=(0,T.memo)(function({row:e,rowIdx:t,columns:n,selected:r,onToggleSelect:i,pkCol:a,editingCell:o,editValue:s,onStartEdit:l,onCommitEdit:u,onCancelEdit:d,onSetEditValue:f,showDelete:p,confirmingDelete:h,onDelete:g,onConfirmDelete:v,onViewCell:y,onViewRow:b,pinned:x,onTogglePin:S,pinnedCols:C,pinnedColOffsets:w,stickyTop:te,trRef:ne}){let T=x?`bg-muted`:r?`bg-primary/5`:`bg-background`;return(0,E.jsxs)(`tr`,{ref:ne,className:`group ${x?``:`hover:bg-muted/30`}`,style:x?{position:`sticky`,top:te,zIndex:15}:void 0,children:[a&&(0,E.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 ${T}`,style:{position:`sticky`,left:0,zIndex:12},children:(0,E.jsxs)(`span`,{className:`flex items-center gap-0.5`,children:[(0,E.jsx)(`input`,{type:`checkbox`,checked:r,onChange:()=>i(t),className:`size-3 accent-primary`}),(0,E.jsx)(`button`,{type:`button`,title:`View row as JSON`,onClick:()=>b(e),className:`p-0.5 rounded transition-colors text-muted-foreground/30 md:opacity-0 md:group-hover:opacity-100 hover:text-foreground`,children:(0,E.jsx)(c,{className:`size-2.5`})}),(0,E.jsx)(`button`,{type:`button`,title:x?`Unpin row`:`Pin row`,onClick:()=>S(t),className:`p-0.5 rounded transition-colors ${x?`text-primary`:`text-muted-foreground/30 md:opacity-0 md:group-hover:opacity-100 hover:text-foreground`}`,children:x?(0,E.jsx)(ee,{className:`size-2.5`}):(0,E.jsx)(_,{className:`size-2.5`})})]})}),n.map(n=>{let r=o?.rowIdx===t&&o?.col===n,i=e[n],p=!r&&A(i),m=C.has(n),h=w.get(n);return(0,E.jsx)(`td`,{className:`px-2 py-1 max-w-[300px] border-b border-border/50 ${m?`border-r border-r-primary/20`:``} ${m||x?T:``}`,style:h==null?void 0:{position:`sticky`,left:h,zIndex:10},children:r?(0,E.jsx)(`input`,{autoFocus:!0,className:`w-full bg-transparent border border-primary/50 rounded px-1 py-0 text-xs outline-none`,value:s,onChange:e=>f(e.target.value),onBlur:u,onKeyDown:e=>{e.key===`Enter`&&u(),e.key===`Escape`&&d()}}):(0,E.jsxs)(`span`,{className:`flex items-center gap-0.5`,children:[(0,E.jsx)(`span`,{className:`cursor-pointer truncate flex-1 ${i==null?`text-muted-foreground/40 italic`:``}`,onDoubleClick:()=>a&&l(t,n,i),title:O(i),children:O(i)}),p&&(0,E.jsx)(`button`,{type:`button`,title:`View full content`,onClick:()=>y({col:n,value:O(i),pkVal:a?String(e[a]??t):String(t)}),className:`shrink-0 p-0.5 rounded text-muted-foreground/50 hover:text-foreground transition-colors`,children:(0,E.jsx)(c,{className:`size-3`})})]})},n)}),p&&a&&(0,E.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 ${x?T:``}`,children:h?(0,E.jsxs)(`span`,{className:`flex items-center gap-1 whitespace-nowrap`,children:[(0,E.jsx)(`button`,{type:`button`,onClick:()=>g(t),className:`text-destructive text-[10px] font-medium hover:underline`,children:`Confirm`}),(0,E.jsx)(`button`,{type:`button`,onClick:()=>v(null),className:`text-muted-foreground text-[10px] hover:underline`,children:`Cancel`})]}):(0,E.jsx)(`button`,{type:`button`,onClick:()=>v(t),className:`p-0.5 rounded md:opacity-0 md:group-hover:opacity-100 hover:bg-destructive/10 hover:text-destructive transition-opacity`,title:`Delete row`,children:(0,E.jsx)(m,{className:`size-3`})})})]})});export{re as n,ie as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./createLucideIcon-BjHrJDVb.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]),n=e(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]);export{t as n,n as t};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{t as r}from"./database-DOWH9-Vv.js";import{n as i,t as a}from"./data-grid-nZfSIop5.js";import{t as o}from"./refresh-cw-CSFrDtiu.js";import{t as s}from"./api-client-Dvzcc_EO.js";import"./settings-store-BHBb62gq.js";import"./vendor-mermaid-CMiurk2b.js";import"./tab-store-0rGchMXr.js";import{G as c,K as l}from"./index-CoMWx5VS.js";import"./use-monaco-theme-CP-vyTF8.js";import{t as u}from"./sql-query-editor-CMQpaOjA.js";var d=e(n(),1);function f(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function p(e,t,n,r){try{let i=sessionStorage.getItem(f(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function m(e,t,n,r,i,a){try{sessionStorage.setItem(f(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function h(e){let t=`/api/db/connections/${e}`,[n,r]=(0,d.useState)(null),[i,a]=(0,d.useState)(`public`),[o,c]=(0,d.useState)(null),[l,u]=(0,d.useState)([]),[f,h]=(0,d.useState)(!1),[g,_]=(0,d.useState)(null),[v,y]=(0,d.useState)(1),[b,x]=(0,d.useState)(null),[S,C]=(0,d.useState)(null),[w,T]=(0,d.useState)(!1),[E,D]=(0,d.useState)(null),[O,k]=(0,d.useState)(`ASC`),A=(0,d.useCallback)(async(r,a,o,l,d)=>{let f=r??n,p=a??i;if(!f)return;h(!0);let g=l===void 0?E:l,y=d??O;try{let n=g?`&orderBy=${encodeURIComponent(g)}&orderDir=${y}`:``,[r,i]=await Promise.all([s.get(`${t}/data?table=${encodeURIComponent(f)}&schema=${p}&page=${o??v}&limit=100${n}`),s.get(`${t}/schema?table=${encodeURIComponent(f)}&schema=${p}`)]);c(r),u(i),m(e,f,p,o??v,r,i)}catch(e){_(e.message)}finally{h(!1)}},[t,e,n,i,v,E,O]),j=(0,d.useCallback)((t,n=`public`)=>{r(t),a(n),y(1),x(null);let i=p(e,t,n,1);i?(c(i.data),u(i.cols),h(!1),A(t,n,1)):A(t,n,1)},[e,A]),M=(0,d.useCallback)(e=>{y(e),A(void 0,void 0,e)},[A]),N=(0,d.useCallback)(async e=>{T(!0),C(null);try{let r=await s.post(`${t}/query`,{sql:e});x(r),r.changeType===`modify`&&A(n??void 0,i)}catch(e){C(e.message)}finally{T(!1)}},[t,n,i,A]),P=(0,d.useCallback)(async(e,r,a,o)=>{if(!n)return;let c=n,l=i;try{await s.put(`${t}/cell`,{table:c,schema:l,pkColumn:e,pkValue:r,column:a,value:o}),A(c,l)}catch(e){_(e.message)}},[t,n,i,A]),F=(0,d.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await s.del(`${t}/row`,{table:a,schema:o,pkColumn:e,pkValue:r}),A(a,o)}catch(e){_(e.message)}},[t,n,i,A]);return{selectedTable:n,selectedSchema:i,selectTable:j,tableData:o,schema:l,loading:f,error:g,page:v,setPage:M,orderBy:E,orderDir:O,toggleSort:(0,d.useCallback)(e=>{let t,n=`ASC`;E===e?O===`ASC`?(t=e,n=`DESC`):(t=null,n=`ASC`):(t=e,n=`ASC`),D(t),k(n),y(1),A(void 0,void 0,1,t,n)},[E,O,A]),queryResult:b,queryError:S,queryLoading:w,executeQuery:N,updateCell:P,deleteRow:F,bulkDelete:(0,d.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await s.post(`${t}/rows/delete`,{table:a,schema:o,pkColumn:e,pkValues:r}),A(a,o)}catch(e){_(e.message)}},[t,n,i,A]),insertRow:(0,d.useCallback)(async e=>{if(!n)return;let r=n,a=i;try{await s.post(`${t}/row`,{table:r,schema:a,values:e}),A(r,a)}catch(e){throw _(e.message),e}},[t,n,i,A]),refreshData:A,queryAsTable:(0,d.useCallback)(async e=>{h(!0);try{let n=await s.post(`${t}/query`,{sql:e});n.changeType===`select`&&c({columns:n.columns,rows:n.rows,total:n.rows.length,page:1,limit:n.rows.length})}catch(e){_(e.message)}finally{h(!1)}},[t])}}var g=t();function _(e){let t={},n=/"(\w+)"\s+ILIKE\s+'%([^']*?)%'/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2].replace(/''/g,`'`);return t}function v({metadata:e}){let t=e?.connectionId,n=e?.connectionName,c=e?.tableName,f=e?.schemaName??`public`,p=e?.initialSql,m=h(t),[v,y]=(0,d.useState)([]),[x,S]=(0,d.useState)(180),C=(0,d.useRef)(null),[w,T]=(0,d.useState)({}),E=(0,d.useMemo)(()=>{if(p&&!m.selectedTable)return p;if(m.selectedTable){let e=`SELECT * FROM "${m.selectedTable}"`,t=Object.entries(w).filter(([,e])=>e.trim()).map(([e,t])=>`"${e}" ILIKE '%${t.replace(/'/g,`''`)}%'`);t.length>0&&(e+=` WHERE ${t.join(` AND `)}`),m.orderBy&&(e+=` ORDER BY "${m.orderBy}" ${m.orderDir}`);let n=(m.page-1)*100;return e+=` LIMIT 100`,n>0&&(e+=` OFFSET ${n}`),e}return`SELECT * FROM `},[p,m.selectedTable,m.orderBy,m.orderDir,m.page,w]),D=(0,d.useCallback)(e=>{T(e)},[]),O=(0,d.useRef)(void 0);(0,d.useEffect)(()=>{if(!(!m.selectedTable||Object.keys(w).length===0))return clearTimeout(O.current),O.current=setTimeout(()=>{m.queryAsTable(E)},500),()=>clearTimeout(O.current)},[w]);let k=(0,d.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=x,r=e=>{let r=e.clientY-t;S(Math.max(80,Math.min(n+r,(C.current?.clientHeight??600)-100)))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[x]);(0,d.useEffect)(()=>{s.get(`/api/db/connections/${t}/tables?cached=1`).then(e=>y(e.map(e=>({name:e.name,schema:e.schema})))).catch(()=>{})},[t]);let A=(0,d.useMemo)(()=>{if(v.length!==0)return{tables:v,getColumns:async(e,n)=>await s.get(`/api/db/connections/${t}/schema?table=${encodeURIComponent(e)}${n?`&schema=${encodeURIComponent(n)}`:``}`)}},[t,v]),j=(0,d.useRef)(!1);(0,d.useEffect)(()=>{j.current||(j.current=!0,p?m.executeQuery(p):c&&m.selectTable(c,f))},[c,f,p]);let[M,N]=(0,d.useState)(!!p),P=(0,d.useCallback)(e=>{let t=e.trim();if(m.selectedTable&&RegExp(`^SELECT\\s+\\*\\s+FROM\\s+"?${m.selectedTable.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}"?\\b`,`i`).test(t)){T(_(t)),m.queryAsTable(t);return}N(!0),m.executeQuery(e)},[m.executeQuery,m.queryAsTable,m.selectedTable]),F=(0,d.useCallback)(e=>{N(!1),m.toggleSort(e)},[m.toggleSort]),I=(0,d.useCallback)(e=>{N(!1),m.setPage(e)},[m.setPage]),L=m.queryResult,R=M&&!!(L||m.queryError),z=m.selectedTable&&!R;return(0,g.jsx)(`div`,{ref:C,className:`flex h-full w-full overflow-hidden`,children:(0,g.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,g.jsx)(r,{className:`size-3.5 text-muted-foreground`}),(0,g.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:n??`Database`}),m.selectedTable&&(0,g.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,m.selectedTable]}),(0,g.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[m.tableData&&(0,g.jsx)(i,{columns:m.tableData.columns,rows:m.tableData.rows,filename:n?`${n}-${m.selectedTable??`data`}`:m.selectedTable??`data`,exportAllUrl:m.selectedTable?`/api/db/connections/${t}/export?table=${encodeURIComponent(m.selectedTable)}&schema=${m.selectedSchema}`:void 0}),(0,g.jsx)(`button`,{type:`button`,onClick:()=>m.refreshData(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,g.jsx)(o,{className:`size-3 ${m.loading?`animate-spin`:``}`})})]})]}),(0,g.jsx)(`div`,{className:`shrink-0 border-b border-border`,style:{height:x},children:(0,g.jsx)(u,{onExecute:P,loading:m.queryLoading,defaultValue:E,schemaInfo:A})}),(0,g.jsx)(`div`,{onMouseDown:k,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,g.jsx)(l,{className:`size-3 text-muted-foreground/50`})}),(0,g.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[z&&(0,g.jsx)(a,{tableData:m.tableData,schema:m.schema,loading:m.loading,page:m.page,onPageChange:I,onCellUpdate:m.updateCell,onRowDelete:m.deleteRow,orderBy:m.orderBy,orderDir:m.orderDir,onToggleSort:F,onBulkDelete:m.bulkDelete,onInsertRow:m.insertRow,connectionId:t,selectedTable:m.selectedTable,selectedSchema:m.selectedSchema,connectionName:n,columnFilters:w,onColumnFilter:D}),R&&(0,g.jsx)(b,{result:L,error:m.queryError,loading:m.queryLoading,schema:m.schema,connectionName:n})]})]})})}var y=()=>{};function b({result:e,error:t,loading:n,schema:r,connectionName:i}){let o=(0,d.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,d.useMemo)(()=>r?.length?r:(e?.columns??[]).map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null})),[r,e?.columns]);return(0,g.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden text-xs`,children:[t&&(0,g.jsx)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5 shrink-0`,children:t}),e?.changeType===`modify`&&(0,g.jsxs)(`div`,{className:`px-3 py-2 text-green-500 shrink-0`,children:[e.rowsAffected,` row(s) affected`,e.executionTimeMs!=null&&(0,g.jsxs)(`span`,{className:`text-muted-foreground ml-2`,children:[e.executionTimeMs,`ms`]})]}),o&&(0,g.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[(0,g.jsx)(a,{tableData:o,schema:s,loading:!!n,page:1,onPageChange:y,onCellUpdate:y,orderBy:null,orderDir:`ASC`,onToggleSort:y,connectionName:i}),e?.executionTimeMs!=null&&(0,g.jsxs)(`div`,{className:`px-3 py-0.5 border-t border-border text-[10px] text-muted-foreground shrink-0`,children:[e.rows.length,` rows · `,e.executionTimeMs,`ms`]})]}),e?.changeType===`select`&&e.rows.length===0&&(0,g.jsxs)(`div`,{className:`px-3 py-2 text-muted-foreground shrink-0`,children:[`No results`,e.executionTimeMs!=null&&(0,g.jsxs)(`span`,{className:`ml-2 text-muted-foreground/60`,children:[e.executionTimeMs,`ms`]})]}),!e&&!t&&(0,g.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:n?(0,g.jsx)(c,{className:`size-4 animate-spin`}):`Run a query to see results`})]})}export{v as DatabaseViewer};
@@ -1,4 +1,4 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import{t as i}from"./text-wrap-Cn6BNQfq.js";import{i as a,t as o}from"./api-client-Dvzcc_EO.js";import{n as s}from"./settings-store-BHBb62gq.js";import"./vendor-mermaid-CMiurk2b.js";import{G as c,H as l,Z as u,h as d,tt as f}from"./index-ZFyltHwi.js";import{r as p,t as m}from"./use-monaco-theme-CP-vyTF8.js";var h=r(`panel-right-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m10 15-3-3 3-3`,key:`1pgupc`}]]),g=e(n(),1),_=t();function v(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`}[e.split(`.`).pop()?.toLowerCase()??``]??`plaintext`}function y({metadata:e}){let t=e?.filePath,n=e?.projectName,r=e?.ref1,y=e?.ref2,x=e?.file1,S=e?.file2,C=e?.original,w=e?.modified,T=C!=null||w!=null,E=!!(x&&S),[D,O]=(0,g.useState)(null),[k,A]=(0,g.useState)(null),[j,M]=(0,g.useState)(null),[N,P]=(0,g.useState)(!T),[F,I]=(0,g.useState)(null),[L,R]=(0,g.useState)(`both`),{wordWrap:z,toggleWordWrap:B}=s(d(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap}))),V=m(),H=(0,g.useRef)(null),[U,W]=(0,g.useState)();(0,g.useEffect)(()=>{let e=H.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&W(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[N,F]),(0,g.useEffect)(()=>{if(T||!n)return;if(P(!0),I(null),M(null),A(null),O(null),x&&S){let e=new URLSearchParams({file1:x,file2:S});o.get(`${a(n)}/files/compare?${e}`).then(e=>{A(e),P(!1)}).catch(e=>{I(e instanceof Error?e.message:`Failed to compare files`),P(!1)});return}if(t){let e=new URLSearchParams({file:t});r&&e.set(`ref`,r),o.get(`${a(n)}/git/file-full-diff?${e}`).then(e=>{M(e),P(!1)}).catch(e=>{I(e instanceof Error?e.message:`Failed to load diff`),P(!1)});return}let e;if(r||y){let t=new URLSearchParams;r&&t.set(`ref1`,r),y&&t.set(`ref2`,y),e=`${a(n)}/git/diff?${t}`}else e=`${a(n)}/git/diff`;o.get(e).then(e=>{O(e.diff),P(!1)}).catch(e=>{I(e instanceof Error?e.message:`Failed to load diff`),P(!1)})},[t,n,r,y,x,S,T]);let{original:G,modified:K}=(0,g.useMemo)(()=>T?{original:C??``,modified:w??``}:E&&k?k:j||(D?b(D):{original:``,modified:``}),[D,T,C,w,E,k,j]),q=(0,g.useMemo)(()=>{let e=t??S??x;return e?v(e):`plaintext`},[t,x,S]),J=typeof window<`u`&&window.innerWidth<768,Y=!J&&L===`both`;return!n&&!T?(0,_.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`No project selected.`}):N?(0,_.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,_.jsx)(c,{className:`size-5 animate-spin`}),(0,_.jsx)(`span`,{className:`text-sm`,children:`Loading diff...`})]}):F?(0,_.jsx)(`div`,{className:`flex items-center justify-center h-full text-destructive text-sm`,children:F}):!T&&!E&&!j&&!G&&!K?(0,_.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,_.jsx)(u,{className:`size-8`}),(0,_.jsx)(`p`,{className:`text-sm`,children:`No content changes`}),t&&(0,_.jsx)(`p`,{className:`text-xs font-mono`,children:t})]}):(0,_.jsxs)(`div`,{className:`flex flex-col h-full`,children:[!J&&(0,_.jsxs)(`div`,{className:`flex items-center justify-end gap-0.5 px-2 py-0.5 border-b border-border shrink-0`,children:[(0,_.jsx)(`button`,{type:`button`,onClick:()=>R(L===`left`?`both`:`left`),className:`p-1 rounded hover:bg-muted transition-colors ${L===`left`?`bg-muted text-foreground`:``}`,title:`Expand original`,children:(0,_.jsx)(l,{className:`size-3.5`})}),(0,_.jsx)(`button`,{type:`button`,onClick:()=>R(`both`),className:`p-1 rounded hover:bg-muted transition-colors ${L===`both`?`bg-muted text-foreground`:``}`,title:`Side by side`,children:(0,_.jsx)(f,{className:`size-3.5`})}),(0,_.jsx)(`button`,{type:`button`,onClick:()=>R(L===`right`?`both`:`right`),className:`p-1 rounded hover:bg-muted transition-colors ${L===`right`?`bg-muted text-foreground`:``}`,title:`Expand modified`,children:(0,_.jsx)(h,{className:`size-3.5`})}),(0,_.jsx)(`div`,{className:`w-px h-3.5 bg-border mx-0.5 shrink-0`}),(0,_.jsx)(`button`,{type:`button`,onClick:B,title:`Toggle word wrap`,className:`p-1 rounded hover:bg-muted transition-colors ${z?`bg-muted text-foreground`:``}`,children:(0,_.jsx)(i,{className:`size-3.5`})})]}),(0,_.jsx)(`div`,{ref:H,className:`flex-1 overflow-hidden`,children:U&&U>0?(0,_.jsx)(p,{height:U,language:q,original:G,modified:K,theme:V,options:{fontSize:J?11:13,fontFamily:`Menlo, Monaco, Consolas, monospace`,wordWrap:J||z?`on`:`off`,renderSideBySide:Y,readOnly:!0,automaticLayout:!0,scrollBeyondLastLine:!1},loading:(0,_.jsx)(c,{className:`size-5 animate-spin text-muted-foreground`})}):(0,_.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,_.jsx)(c,{className:`size-5 animate-spin text-muted-foreground`})})})]})}function b(e){let t=e.split(`
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import{t as i}from"./text-wrap-Cn6BNQfq.js";import{i as a,t as o}from"./api-client-Dvzcc_EO.js";import{n as s}from"./settings-store-BHBb62gq.js";import"./vendor-mermaid-CMiurk2b.js";import{G as c,H as l,Z as u,h as d,tt as f}from"./index-CoMWx5VS.js";import{r as p,t as m}from"./use-monaco-theme-CP-vyTF8.js";var h=r(`panel-right-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m10 15-3-3 3-3`,key:`1pgupc`}]]),g=e(n(),1),_=t();function v(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`}[e.split(`.`).pop()?.toLowerCase()??``]??`plaintext`}function y({metadata:e}){let t=e?.filePath,n=e?.projectName,r=e?.ref1,y=e?.ref2,x=e?.file1,S=e?.file2,C=e?.original,w=e?.modified,T=C!=null||w!=null,E=!!(x&&S),[D,O]=(0,g.useState)(null),[k,A]=(0,g.useState)(null),[j,M]=(0,g.useState)(null),[N,P]=(0,g.useState)(!T),[F,I]=(0,g.useState)(null),[L,R]=(0,g.useState)(`both`),{wordWrap:z,toggleWordWrap:B}=s(d(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap}))),V=m(),H=(0,g.useRef)(null),[U,W]=(0,g.useState)();(0,g.useEffect)(()=>{let e=H.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&W(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[N,F]),(0,g.useEffect)(()=>{if(T||!n)return;if(P(!0),I(null),M(null),A(null),O(null),x&&S){let e=new URLSearchParams({file1:x,file2:S});o.get(`${a(n)}/files/compare?${e}`).then(e=>{A(e),P(!1)}).catch(e=>{I(e instanceof Error?e.message:`Failed to compare files`),P(!1)});return}if(t){let e=new URLSearchParams({file:t});r&&e.set(`ref`,r),o.get(`${a(n)}/git/file-full-diff?${e}`).then(e=>{M(e),P(!1)}).catch(e=>{I(e instanceof Error?e.message:`Failed to load diff`),P(!1)});return}let e;if(r||y){let t=new URLSearchParams;r&&t.set(`ref1`,r),y&&t.set(`ref2`,y),e=`${a(n)}/git/diff?${t}`}else e=`${a(n)}/git/diff`;o.get(e).then(e=>{O(e.diff),P(!1)}).catch(e=>{I(e instanceof Error?e.message:`Failed to load diff`),P(!1)})},[t,n,r,y,x,S,T]);let{original:G,modified:K}=(0,g.useMemo)(()=>T?{original:C??``,modified:w??``}:E&&k?k:j||(D?b(D):{original:``,modified:``}),[D,T,C,w,E,k,j]),q=(0,g.useMemo)(()=>{let e=t??S??x;return e?v(e):`plaintext`},[t,x,S]),J=typeof window<`u`&&window.innerWidth<768,Y=!J&&L===`both`;return!n&&!T?(0,_.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`No project selected.`}):N?(0,_.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,_.jsx)(c,{className:`size-5 animate-spin`}),(0,_.jsx)(`span`,{className:`text-sm`,children:`Loading diff...`})]}):F?(0,_.jsx)(`div`,{className:`flex items-center justify-center h-full text-destructive text-sm`,children:F}):!T&&!E&&!j&&!G&&!K?(0,_.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,_.jsx)(u,{className:`size-8`}),(0,_.jsx)(`p`,{className:`text-sm`,children:`No content changes`}),t&&(0,_.jsx)(`p`,{className:`text-xs font-mono`,children:t})]}):(0,_.jsxs)(`div`,{className:`flex flex-col h-full`,children:[!J&&(0,_.jsxs)(`div`,{className:`flex items-center justify-end gap-0.5 px-2 py-0.5 border-b border-border shrink-0`,children:[(0,_.jsx)(`button`,{type:`button`,onClick:()=>R(L===`left`?`both`:`left`),className:`p-1 rounded hover:bg-muted transition-colors ${L===`left`?`bg-muted text-foreground`:``}`,title:`Expand original`,children:(0,_.jsx)(l,{className:`size-3.5`})}),(0,_.jsx)(`button`,{type:`button`,onClick:()=>R(`both`),className:`p-1 rounded hover:bg-muted transition-colors ${L===`both`?`bg-muted text-foreground`:``}`,title:`Side by side`,children:(0,_.jsx)(f,{className:`size-3.5`})}),(0,_.jsx)(`button`,{type:`button`,onClick:()=>R(L===`right`?`both`:`right`),className:`p-1 rounded hover:bg-muted transition-colors ${L===`right`?`bg-muted text-foreground`:``}`,title:`Expand modified`,children:(0,_.jsx)(h,{className:`size-3.5`})}),(0,_.jsx)(`div`,{className:`w-px h-3.5 bg-border mx-0.5 shrink-0`}),(0,_.jsx)(`button`,{type:`button`,onClick:B,title:`Toggle word wrap`,className:`p-1 rounded hover:bg-muted transition-colors ${z?`bg-muted text-foreground`:``}`,children:(0,_.jsx)(i,{className:`size-3.5`})})]}),(0,_.jsx)(`div`,{ref:H,className:`flex-1 overflow-hidden`,children:U&&U>0?(0,_.jsx)(p,{height:U,language:q,original:G,modified:K,theme:V,options:{fontSize:J?11:13,fontFamily:`Menlo, Monaco, Consolas, monospace`,wordWrap:J||z?`on`:`off`,renderSideBySide:Y,readOnly:!0,automaticLayout:!0,scrollBeyondLastLine:!1},loading:(0,_.jsx)(c,{className:`size-5 animate-spin text-muted-foreground`})}):(0,_.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,_.jsx)(c,{className:`size-5 animate-spin text-muted-foreground`})})})]})}function b(e){let t=e.split(`
2
2
  `),n=[],r=[],i=!1;for(let e of t)if(!(e.startsWith(`diff --git`)||e.startsWith(`diff --no-index`)||e.startsWith(`index `)||e.startsWith(`new file`)||e.startsWith(`deleted file`)||e.startsWith(`old mode`)||e.startsWith(`new mode`)||e.startsWith(`---`)||e.startsWith(`+++`)||e.startsWith(`Binary files`)||e.startsWith(`\\ No newline`))){if(e.startsWith(`@@`)){i=!0;continue}if(i)if(e.startsWith(`-`))n.push(e.slice(1));else if(e.startsWith(`+`))r.push(e.slice(1));else{let t=e.startsWith(` `)?e.slice(1):e;n.push(t),r.push(t)}}return{original:n.join(`
3
3
  `),modified:r.join(`
4
4
  `)}}export{y as DiffViewer};
@@ -1,3 +1,3 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{r}from"./api-client-Dvzcc_EO.js";import{G as i,b as a}from"./index-ZFyltHwi.js";var o=e(n(),1),s=t(),c=`<script>
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{r}from"./api-client-Dvzcc_EO.js";import{G as i,b as a}from"./index-CoMWx5VS.js";var o=e(n(),1),s=t(),c=`<script>
2
2
  function acquireVsCodeApi(){return{postMessage:function(m){window.parent.postMessage(m,"*")},getState:function(){try{return JSON.parse(sessionStorage.getItem("vscode-state")||"null")}catch{return null}},setState:function(s){sessionStorage.setItem("vscode-state",JSON.stringify(s));return s}}}
3
3
  <\/script>`;function l(e){if(!e)return e;let t=e.indexOf(`<head>`);return t===-1?c+e:e.slice(0,t+6)+c+e.slice(t+6)}function u({metadata:e}){let t=e?.panelId,n=e?.viewType,c=e?.projectName||void 0,[u,d]=(0,o.useState)(!1),f=a(e=>e.contributions!==null),p=a(e=>{if(t&&e.webviewPanels[t])return e.webviewPanels[t];if(n){let t=n.includes(`.`)?n:`${n}.view`;return Object.values(e.webviewPanels).find(e=>e.viewType===n||e.viewType===t)}}),m=p?.id??t,h=(0,o.useRef)(null),g=p?.html??``,_=l(g),v=(0,o.useRef)(null);(0,o.useEffect)(()=>{if(p||!n||!f||c&&c===v.current)return;c&&(v.current=c);let e=n.includes(`.`)?n:`${n}.view`,t=!1;async function i(){let n=[];if(c)try{let e=r(),t=(await(await fetch(`/api/projects`,e?{headers:{Authorization:`Bearer ${e}`}}:{})).json()).data?.find(e=>e.name===c);t&&(n=[t.path])}catch{}t||window.dispatchEvent(new CustomEvent(`ext:command:execute`,{detail:{command:e,args:n}}))}return i(),()=>{t=!0}},[p,n,c,f]);let y=e?.extensionId,b=a(e=>{if(y&&e.activationErrors[y])return e.activationErrors[y];if(n){for(let[t,r]of Object.entries(e.activationErrors))if(t===`ext-${n}`)return r}}),x=(0,o.useCallback)(()=>{if(d(!1),!n)return;let e=n.includes(`.`)?n:`${n}.view`;(async()=>{try{let t=r(),n=(await(await fetch(`/api/projects`,t?{headers:{Authorization:`Bearer ${t}`}}:{})).json()).data?.find(e=>e.name===c),i=n?[n.path]:[];window.dispatchEvent(new CustomEvent(`ext:command:execute`,{detail:{command:e,args:i}}))}catch{}})()},[n,c]),S=(0,o.useRef)(null),C=(0,o.useRef)(n);return(0,o.useEffect)(()=>{S.current=m??null},[m]),(0,o.useEffect)(()=>{C.current=n},[n]),(0,o.useEffect)(()=>()=>{let e=S.current;if(e){let t=C.current;a.getState().removeWebviewPanel(e),window.dispatchEvent(new CustomEvent(`ext:webview:close`,{detail:{panelId:e,viewType:t}}))}},[]),(0,o.useEffect)(()=>{if(p){d(!1);return}if(!f||!n)return;let e=0,t=setInterval(()=>{if(e++,e>3){clearInterval(t),d(!0);return}x()},2e3);return()=>clearInterval(t)},[p,f,n,x]),(0,o.useEffect)(()=>{if(!m)return;let e=e=>{h.current&&e.source===h.current.contentWindow&&window.dispatchEvent(new CustomEvent(`ext:webview:send`,{detail:{panelId:m,message:e.data}}))};return window.addEventListener(`message`,e),()=>window.removeEventListener(`message`,e)},[m]),(0,o.useEffect)(()=>{if(!m)return;let e=e=>{let{panelId:t,message:n}=e.detail;t===m&&h.current?.contentWindow?.postMessage(n,`*`)};return window.addEventListener(`ext:webview:message`,e),()=>window.removeEventListener(`ext:webview:message`,e)},[m]),!p||!g?(0,s.jsx)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-sm text-text-subtle`,children:u?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(`span`,{className:`text-destructive font-medium`,children:`Extension failed to load`}),b&&(0,s.jsx)(`span`,{className:`text-xs text-muted-foreground max-w-md text-center`,children:b}),(0,s.jsx)(`button`,{onClick:x,className:`text-xs text-primary hover:underline`,children:`Retry`})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i,{className:`size-5 animate-spin`}),(0,s.jsx)(`span`,{children:`Loading extension...`})]})}):(0,s.jsx)(`div`,{className:`h-full w-full relative`,children:(0,s.jsx)(`iframe`,{ref:h,srcDoc:_,sandbox:`allow-scripts`,className:`w-full h-full border-0 bg-white dark:bg-zinc-900`,title:p.title},m)})}export{u as ExtensionWebview};
@@ -1 +1 @@
1
- import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-Baz81y5z.js";import"./api-client-Dvzcc_EO.js";import{G as n}from"./index-ZFyltHwi.js";import{t as r}from"./use-blob-url-Hn6n1730.js";var i=e();function a({filePath:e,projectName:a}){let{blobUrl:o,error:s}=r(e,a);return s?(0,i.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,i.jsx)(t,{className:`size-10 text-text-subtle`}),(0,i.jsx)(`p`,{className:`text-sm`,children:`Failed to load image.`})]}):o?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full p-4 bg-surface overflow-auto`,children:(0,i.jsx)(`img`,{src:o,alt:e,className:`max-w-full max-h-full object-contain`})}):(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,i.jsx)(n,{className:`size-5 animate-spin text-text-subtle`})})}export{a as ImagePreview};
1
+ import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-Baz81y5z.js";import"./api-client-Dvzcc_EO.js";import{G as n}from"./index-CoMWx5VS.js";import{t as r}from"./use-blob-url-Hn6n1730.js";var i=e();function a({filePath:e,projectName:a}){let{blobUrl:o,error:s}=r(e,a);return s?(0,i.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,i.jsx)(t,{className:`size-10 text-text-subtle`}),(0,i.jsx)(`p`,{className:`text-sm`,children:`Failed to load image.`})]}):o?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full p-4 bg-surface overflow-auto`,children:(0,i.jsx)(`img`,{src:o,alt:e,className:`max-w-full max-h-full object-contain`})}):(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,i.jsx)(n,{className:`size-5 animate-spin text-text-subtle`})})}export{a as ImagePreview};