@lunora/studio 1.0.0-alpha.79 → 1.0.0-alpha.80
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/dist/index.d.ts +28 -14
- package/dist/index.js +1 -1
- package/dist/mount.d.ts +1 -1
- package/dist/mount.js +1 -1
- package/dist/packem_chunks/ApiTab.js +1 -1
- package/dist/packem_chunks/AuditPanel.js +1 -1
- package/dist/packem_chunks/DeploymentHealthPanel.js +1 -1
- package/dist/packem_chunks/ExportImportPanel.js +3 -3
- package/dist/packem_chunks/FileBrowser.js +4 -4
- package/dist/packem_chunks/FunctionRunner.js +1 -1
- package/dist/packem_chunks/FunctionStatsPanel.js +1 -1
- package/dist/packem_chunks/HealthPanel.js +1 -1
- package/dist/packem_chunks/InsightsPanel.js +1 -1
- package/dist/packem_chunks/LogsPanel.js +1 -1
- package/dist/packem_chunks/MailPanel.js +2 -2
- package/dist/packem_chunks/MetricsPanel.js +1 -1
- package/dist/packem_chunks/NotificationsPanel.js +1 -1
- package/dist/packem_chunks/PitrPanel.js +1 -1
- package/dist/packem_chunks/SchemaViewer.js +1 -2
- package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -1
- package/dist/packem_chunks/SettingsPanel.js +1 -1
- package/dist/packem_chunks/SqlEditorPanel.js +6 -4
- package/dist/packem_chunks/TableEditor.js +1 -1
- package/dist/packem_chunks/agents-panel.js +1 -1
- package/dist/packem_chunks/analytics-panel.js +1 -1
- package/dist/packem_chunks/auth-audit-panel.js +1 -1
- package/dist/packem_chunks/auth-config-panel.js +1 -1
- package/dist/packem_chunks/auth-sessions-panel.js +1 -1
- package/dist/packem_chunks/containers-panel.js +1 -1
- package/dist/packem_chunks/dashboards-panel.js +1 -1
- package/dist/packem_chunks/fanout-panel.js +1 -1
- package/dist/packem_chunks/flags-panel.js +1 -1
- package/dist/packem_chunks/issues-panel.js +1 -1
- package/dist/packem_chunks/kv-browser.js +1 -1
- package/dist/packem_chunks/log-drains-panel.js +4 -4
- package/dist/packem_chunks/migrations-route.js +1 -0
- package/dist/packem_chunks/organizations-panel.js +1 -1
- package/dist/packem_chunks/payments-panel.js +1 -1
- package/dist/packem_chunks/permissions-panel.js +1 -1
- package/dist/packem_chunks/queues-panel.js +1 -1
- package/dist/packem_chunks/rls-panel.js +1 -1
- package/dist/packem_chunks/schedule-panel.js +1 -1
- package/dist/packem_chunks/sparkline.js +1 -1
- package/dist/packem_chunks/storage-rules-panel.js +1 -1
- package/dist/packem_chunks/subscriptions-panel.js +1 -1
- package/dist/packem_chunks/sync-client-panel.js +1 -1
- package/dist/packem_chunks/traces-panel.js +1 -1
- package/dist/packem_chunks/users-panel.js +1 -1
- package/dist/packem_chunks/vector-browser.js +1 -1
- package/dist/packem_chunks/workflows-panel.js +1 -1
- package/dist/packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js +1 -0
- package/dist/packem_shared/ApiDocsPanel-DfUQ1ZAF.js +2 -0
- package/dist/packem_shared/{ApiReferencePanel-C42v1jr6.js → ApiReferencePanel-9q8BbJl-.js} +1 -1
- package/dist/packem_shared/CommandPalette--SQwfTW1.js +1 -0
- package/dist/packem_shared/DataBrowser-CuRlztBz.js +1 -0
- package/dist/packem_shared/DataFilters-B26ZeqBZ.js +1 -0
- package/dist/packem_shared/GlobalDataBrowser-DB-vQ2_H.js +1 -0
- package/dist/packem_shared/HomePanel-Dcs4a3Ax.js +1 -0
- package/dist/packem_shared/MigrationsPanel-C2OnsqRb.js +1 -0
- package/dist/packem_shared/{OpenRpcReferencePanel-sGsIgYWj.js → OpenRpcReferencePanel-qOZcWXMs.js} +1 -1
- package/dist/packem_shared/ScheduledJobs-D8kBZWBu.js +1 -0
- package/dist/packem_shared/Studio-B26_pT8J.js +1 -0
- package/dist/packem_shared/StudioApp-bXhJeLlZ.js +1 -0
- package/dist/packem_shared/advisor-view-Pa8HLtBv.js +1 -0
- package/dist/packem_shared/{app.d-bRPJhby-.d.ts → app.d-DW7yZsfu.d.ts} +1 -3
- package/dist/packem_shared/bar-chart-DraN_srt.js +9 -0
- package/dist/packem_shared/data-grid-DcxyIXwG.js +1 -0
- package/dist/packem_shared/data-view-params-ClrV7XgF.js +1 -0
- package/dist/packem_shared/error-alert-t6cpEi0z.js +1 -0
- package/dist/packem_shared/grid-features-jnrD0SpX.js +6 -0
- package/dist/packem_shared/{home-panel-Cm88Nvqh.js → home-panel-CU6MWLHG.js} +2 -2
- package/dist/packem_shared/{internal-AtZ4bTal.js → internal-BSIsQVC6.js} +1 -1
- package/dist/packem_shared/live-status-CmuRLFKf.js +1 -0
- package/dist/packem_shared/operation-console-provider-BMJNtiyB.js +1 -0
- package/dist/packem_shared/recording-client-DRAZEmzE.js +1 -0
- package/dist/packem_shared/reference-view-DnYYWr7I.js +12 -0
- package/dist/packem_shared/result-chart-DzJOVsaw.js +1 -0
- package/dist/packem_shared/schema-diagram-cg-bz_VL.js +2 -0
- package/dist/packem_shared/{sparkline-DtcZoU48.js → sparkline-CgjeUU2I.js} +1 -1
- package/dist/packem_shared/studio-q-C-acL7.js +2 -0
- package/dist/packem_shared/table-list-sidebar-BFkSQwlB.js +1 -0
- package/dist/packem_shared/use-admin-query-QJ-ibl5u.js +1 -0
- package/dist/packem_shared/use-async-submit-q3ymBJkD.js +1 -0
- package/dist/packem_shared/{use-auth-config-9S_K_W-G.js → use-auth-config-BObBpdsi.js} +1 -1
- package/dist/packem_shared/use-sql-assistant-CHEu2-Rk.js +1 -0
- package/dist/standalone/chunk-2GA4SHO7.js +1 -0
- package/dist/standalone/{chunk-NG6LYBPJ.js → chunk-2VDFV5TD.js} +1 -1
- package/dist/standalone/chunk-2WOIRKEI.js +1 -0
- package/dist/standalone/chunk-33CL6OHR.js +1 -0
- package/dist/standalone/{chunk-EIT7ERYE.js → chunk-34D36UCW.js} +1 -1
- package/dist/standalone/chunk-3C3CG7ZK.js +1 -0
- package/dist/standalone/{chunk-6CULAILE.js → chunk-3O3HAXW7.js} +1 -1
- package/dist/standalone/{chunk-LSEZN2ZL.js → chunk-3STOIE7Q.js} +1 -1
- package/dist/standalone/chunk-53WEPGUD.js +1 -0
- package/dist/standalone/chunk-5CVJS7ON.js +1 -0
- package/dist/standalone/chunk-6IKEW5LG.js +1 -0
- package/dist/standalone/chunk-6LNCYDZO.js +1 -0
- package/dist/standalone/chunk-6NY7SPDL.js +1 -0
- package/dist/standalone/chunk-6PNPIW6I.js +2 -0
- package/dist/standalone/{chunk-AVZGVZZ7.js → chunk-6VAKZALJ.js} +1 -1
- package/dist/standalone/chunk-6YI4WJO4.js +1 -0
- package/dist/standalone/{chunk-HYT2ZUNP.js → chunk-6YTSSIEJ.js} +2 -2
- package/dist/standalone/{chunk-KYF2E5CJ.js → chunk-7LWMHTJ3.js} +1 -1
- package/dist/standalone/chunk-A74VSSA2.js +4 -0
- package/dist/standalone/chunk-CCVXYYPJ.js +1 -0
- package/dist/standalone/chunk-CT5MMH4O.js +1 -0
- package/dist/standalone/chunk-CTNB2KIA.js +1 -0
- package/dist/standalone/chunk-CU55Y5TV.js +62 -0
- package/dist/standalone/chunk-D2RKH6JK.js +1 -0
- package/dist/standalone/chunk-E3NMX2VU.js +4 -0
- package/dist/standalone/chunk-FNPJ7GJZ.js +1 -0
- package/dist/standalone/chunk-FOBRNWBG.js +3 -0
- package/dist/standalone/chunk-G6PSMGLD.js +1 -0
- package/dist/standalone/chunk-GAX5IZYG.js +8 -0
- package/dist/standalone/chunk-GB6U2BPU.js +1 -0
- package/dist/standalone/chunk-GEDMLM4A.js +6 -0
- package/dist/standalone/chunk-GXSZH7VJ.js +13 -0
- package/dist/standalone/chunk-GYKVBKT5.js +1 -0
- package/dist/standalone/chunk-H6YOWRFB.js +1 -0
- package/dist/standalone/chunk-HJ3E4YF5.js +1 -0
- package/dist/standalone/chunk-HJD2YUQS.js +1 -0
- package/dist/standalone/chunk-IHQC7J35.js +1 -0
- package/dist/standalone/chunk-JLOWAJRR.js +1 -0
- package/dist/standalone/chunk-JRMMYIAF.js +1 -0
- package/dist/standalone/{chunk-W6TE2I2D.js → chunk-KC44QCN6.js} +1 -1
- package/dist/standalone/chunk-KJB7YAKB.js +1 -0
- package/dist/standalone/chunk-KLQYC6CC.js +1 -0
- package/dist/standalone/{chunk-XQGANNLS.js → chunk-KZ3ALMMP.js} +1 -1
- package/dist/standalone/chunk-L7R74G63.js +1 -0
- package/dist/standalone/{chunk-3RTTXLMU.js → chunk-OY2RVUZL.js} +1 -1
- package/dist/standalone/chunk-P4YLIBCN.js +1 -0
- package/dist/standalone/chunk-PZVU2QMX.js +1 -0
- package/dist/standalone/{chunk-PRJ4RJDU.js → chunk-Q7O6B7WC.js} +1 -1
- package/dist/standalone/chunk-QLQADHFE.js +1 -0
- package/dist/standalone/{chunk-7LQWFOEU.js → chunk-QXXIJAD5.js} +1 -1
- package/dist/standalone/chunk-QZGTH6WH.js +1 -0
- package/dist/standalone/chunk-RJP3WBZ4.js +1 -0
- package/dist/standalone/chunk-RNL6BSFM.js +1 -0
- package/dist/standalone/chunk-RNRJKBY3.js +4 -0
- package/dist/standalone/{chunk-7YEFOSPH.js → chunk-RQ7AFLIV.js} +1 -1
- package/dist/standalone/chunk-S252DAFP.js +1 -0
- package/dist/standalone/chunk-S2VVR7HI.js +1 -0
- package/dist/standalone/chunk-SKW6J4VW.js +1 -0
- package/dist/standalone/chunk-T7IUZIF4.js +1 -0
- package/dist/standalone/chunk-TTGOOYLF.js +1 -0
- package/dist/standalone/chunk-U6TNNM5U.js +1 -0
- package/dist/standalone/chunk-VHWOCPRK.js +1 -0
- package/dist/standalone/chunk-W6SAOXGH.js +6 -0
- package/dist/standalone/{chunk-YCRMVBPW.js → chunk-WBYSSCV2.js} +1 -1
- package/dist/standalone/{chunk-LFXFP4IF.js → chunk-X665E2HU.js} +1 -1
- package/dist/standalone/chunk-XDAT7LHC.js +1 -0
- package/dist/standalone/chunk-XS5LDR52.js +1 -0
- package/dist/standalone/chunk-Y5Y7DHFW.js +1 -0
- package/dist/standalone/chunk-YJYTMQJI.js +1 -0
- package/dist/standalone/chunk-Z2V42P7J.js +1 -0
- package/dist/standalone/studio.js +5 -5
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/packem_chunks/MigrationsPanel.js +0 -1
- package/dist/packem_shared/ADMIN_FUNCTIONS-CpgIo9pj.js +0 -1
- package/dist/packem_shared/ApiDocsPanel-CjdsxN1t.js +0 -2
- package/dist/packem_shared/CommandPalette-CVIaY3j8.js +0 -1
- package/dist/packem_shared/DataBrowser-Bfstz_au.js +0 -1
- package/dist/packem_shared/DataFilters-Csb30F0C.js +0 -1
- package/dist/packem_shared/GlobalDataBrowser-RLJ6NvOs.js +0 -1
- package/dist/packem_shared/HomePanel-B8EFM4u3.js +0 -1
- package/dist/packem_shared/ScheduledJobs-DUbo6epc.js +0 -1
- package/dist/packem_shared/Studio-BDtS9C5g.js +0 -1
- package/dist/packem_shared/StudioApp-DjLzIO9E.js +0 -1
- package/dist/packem_shared/advisor-view-DaCX9Jy5.js +0 -1
- package/dist/packem_shared/bar-chart-AryFCeoa.js +0 -9
- package/dist/packem_shared/data-grid-BMBKzMEJ.js +0 -1
- package/dist/packem_shared/data-view-params-C8T3bW1z.js +0 -1
- package/dist/packem_shared/error-alert-B59DnrDI.js +0 -1
- package/dist/packem_shared/grid-features-uZCUj955.js +0 -6
- package/dist/packem_shared/live-status-CGW2JHf_.js +0 -1
- package/dist/packem_shared/reference-view-KvhektwF.js +0 -12
- package/dist/packem_shared/result-chart-CwKhhKM0.js +0 -1
- package/dist/packem_shared/studio-BmWFd-Rz.js +0 -2
- package/dist/packem_shared/table-list-sidebar-CMCcNALK.js +0 -1
- package/dist/packem_shared/use-admin-query-Di3fLE8H.js +0 -1
- package/dist/packem_shared/use-async-submit-DLNCqLFq.js +0 -1
- package/dist/standalone/chunk-2SHUN7KF.js +0 -1
- package/dist/standalone/chunk-2Y36BVVM.js +0 -4
- package/dist/standalone/chunk-3EXLKL6V.js +0 -1
- package/dist/standalone/chunk-3KAERFMC.js +0 -1
- package/dist/standalone/chunk-4XDMVUS5.js +0 -1
- package/dist/standalone/chunk-5RF4QDDA.js +0 -6
- package/dist/standalone/chunk-5YWJNF5X.js +0 -1
- package/dist/standalone/chunk-66YJ3IOZ.js +0 -1
- package/dist/standalone/chunk-6KHEBRBB.js +0 -1
- package/dist/standalone/chunk-6WCIFGDW.js +0 -1
- package/dist/standalone/chunk-7RG3AKPY.js +0 -1
- package/dist/standalone/chunk-A2FPLOMJ.js +0 -1
- package/dist/standalone/chunk-AADXUXZO.js +0 -1
- package/dist/standalone/chunk-ARI4JTIH.js +0 -1
- package/dist/standalone/chunk-BDO4J5AP.js +0 -1
- package/dist/standalone/chunk-BMQJ4CAO.js +0 -1
- package/dist/standalone/chunk-CMUP7HPS.js +0 -1
- package/dist/standalone/chunk-CP7AUUOU.js +0 -1
- package/dist/standalone/chunk-DX3RMFQU.js +0 -8
- package/dist/standalone/chunk-E2CJUP53.js +0 -13
- package/dist/standalone/chunk-FLYO3XY5.js +0 -1
- package/dist/standalone/chunk-FWCKM2CU.js +0 -1
- package/dist/standalone/chunk-GITJXQOS.js +0 -4
- package/dist/standalone/chunk-GP6IRITM.js +0 -1
- package/dist/standalone/chunk-GXU3ATKS.js +0 -1
- package/dist/standalone/chunk-H5Y5NQPL.js +0 -1
- package/dist/standalone/chunk-HALNNKTC.js +0 -1
- package/dist/standalone/chunk-HK4OVYG3.js +0 -1
- package/dist/standalone/chunk-HQEMYD2K.js +0 -1
- package/dist/standalone/chunk-I4WGRDL2.js +0 -1
- package/dist/standalone/chunk-ISZSYNTI.js +0 -4
- package/dist/standalone/chunk-JWG3VRGB.js +0 -1
- package/dist/standalone/chunk-KDYNM3GV.js +0 -1
- package/dist/standalone/chunk-KP6JQSH2.js +0 -4
- package/dist/standalone/chunk-LLXFYRGQ.js +0 -1
- package/dist/standalone/chunk-LU3GW7HI.js +0 -1
- package/dist/standalone/chunk-M536Y2KX.js +0 -1
- package/dist/standalone/chunk-MVGE3JJN.js +0 -1
- package/dist/standalone/chunk-MXSHWB3M.js +0 -1
- package/dist/standalone/chunk-NL2DZKFI.js +0 -1
- package/dist/standalone/chunk-OGVCXKRL.js +0 -2
- package/dist/standalone/chunk-OPC233PZ.js +0 -1
- package/dist/standalone/chunk-P4CWOYFL.js +0 -1
- package/dist/standalone/chunk-PUY3YDXI.js +0 -1
- package/dist/standalone/chunk-QZMR6MUG.js +0 -1
- package/dist/standalone/chunk-WCWYSOCN.js +0 -62
- package/dist/standalone/chunk-WEO3YVP6.js +0 -3
- package/dist/standalone/chunk-X2FQ6B5V.js +0 -1
- package/dist/standalone/chunk-XIZNYKOD.js +0 -1
- package/dist/standalone/chunk-XS6Q6GGV.js +0 -1
- package/dist/standalone/chunk-Y3CQDULJ.js +0 -1
- package/dist/standalone/chunk-Z2JPEI2V.js +0 -1
- /package/dist/standalone/{chunk-4CGALXS3.js → chunk-OG4N2XHD.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as
|
|
2
|
-
`),e[5]=t,e[6]=n):n=e[6];const u=n,i=`storage-refs-${r}`;let l;e[7]!==t.length||e[8]!==o?(l=t.length===1?o("1 record"):o("{count} records",{count:t.length}),e[7]=t.length,e[8]=o,e[9]=l):l=e[9];let f;return e[10]!==u||e[11]!==i||e[12]!==l?(f=a(ce,{"data-testid":i,title:u,variant:"secondary",children:l}),e[10]=u,e[11]=i,e[12]=l,e[13]=f):f=e[13],f},Fe=c=>{const e=B(7),{objectKey:r,onToggle:t,selected:o,t:n}=c;let u;e[0]!==n?(u=n("Select row"),e[0]=n,e[1]=u):u=e[1];const i=`storage-select-${r}`;let l;return e[2]!==t||e[3]!==o||e[4]!==u||e[5]!==i?(l=a(Ne,{"aria-label":u,checked:o,"data-testid":i,onCheckedChange:t}),e[2]=t,e[3]=o,e[4]=u,e[5]=i,e[6]=l):l=e[6],l};function xt(c){return`${c.table}·${c.id}`}const kt=c=>{const e=B(10),{colSpan:r,name:t,onEnter:o}=c;let n;e[0]!==t||e[1]!==o?(n=()=>{o(t)},e[0]=t,e[1]=o,e[2]=n):n=e[2];const u=n;let i;e[3]===Symbol.for("react.memo_cache_sentinel")?(i=a("svg",{"aria-hidden":"true",className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:a("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})}),e[3]=i):i=e[3];let l;e[4]!==u||e[5]!==t?(l=T("button",{className:"inline-flex items-center gap-2 font-mono text-xs outline-none hover:text-foreground focus-visible:text-foreground","data-testid":"fb-folder",onClick:u,type:"button",children:[i,t]}),e[4]=u,e[5]=t,e[6]=l):l=e[6];let f;return e[7]!==r||e[8]!==l?(f=a(me,{children:a(te,{colSpan:r,children:l})}),e[7]=r,e[8]=l,e[9]=f):f=e[9],f},vt=c=>{const e=B(33),{busy:r,copiedKey:t,handlers:o,object:n,prefix:u,references:i,selected:l,showReferences:f,t:h}=c,{copy:d,download:m,name:v,remove:s,toggle:x}=Ke(n,u,o);let y;e[0]!==n.key||e[1]!==l||e[2]!==h||e[3]!==x?(y=a(te,{className:"w-8",children:a(Fe,{objectKey:n.key,onToggle:x,selected:l,t:h})}),e[0]=n.key,e[1]=l,e[2]=h,e[3]=x,e[4]=y):y=e[4];let g;e[5]!==v?(g=a(te,{className:"font-mono text-xs",children:v}),e[5]=v,e[6]=g):g=e[6];let b;e[7]!==n.size?(b=Ce(n.size),e[7]=n.size,e[8]=b):b=e[8];let k;e[9]!==b?(k=a(te,{className:"tabular-nums text-muted-foreground",children:b}),e[9]=b,e[10]=k):k=e[10];const w=n.httpMetadata?.contentType??"";let C;e[11]!==w?(C=a(te,{children:w}),e[11]=w,e[12]=C):C=e[12];let S;e[13]!==n.key||e[14]!==i||e[15]!==f||e[16]!==h?(S=f&&a(te,{children:a(Te,{objectKey:n.key,references:i,t:h})}),e[13]=n.key,e[14]=i,e[15]=f,e[16]=h,e[17]=S):S=e[17];const N=t===n.key;let $;e[18]!==r||e[19]!==d||e[20]!==m||e[21]!==n.key||e[22]!==s||e[23]!==h||e[24]!==N?($=a(te,{className:"text-right",children:a("span",{className:"inline-flex items-center gap-1",children:a(De,{busy:r,copied:N,objectKey:n.key,onCopy:d,onDelete:s,onDownload:m,t:h})})}),e[18]=r,e[19]=d,e[20]=m,e[21]=n.key,e[22]=s,e[23]=h,e[24]=N,e[25]=$):$=e[25];let z;return e[26]!==y||e[27]!==g||e[28]!==k||e[29]!==C||e[30]!==S||e[31]!==$?(z=T(me,{"data-testid":"fb-row",children:[y,g,k,C,S,$]}),e[26]=y,e[27]=g,e[28]=k,e[29]=C,e[30]=S,e[31]=$,e[32]=z):z=e[32],z},wt=c=>{const e=B(65),{allSelected:r,busy:t,copiedKey:o,files:n,folders:u,handlers:i,onEnterFolder:l,prefix:f,references:h,selected:d,showReferences:m,someSelected:v,t:s,toggleSelectAll:x}=c;let y;e[0]!==s?(y=s("Select all rows"),e[0]=s,e[1]=y):y=e[1];let g;e[2]!==r||e[3]!==v||e[4]!==y||e[5]!==x?(g=a(le,{className:"w-8",children:a(Ne,{"aria-label":y,checked:r,"data-testid":"storage-select-all",indeterminate:v,onCheckedChange:x})}),e[2]=r,e[3]=v,e[4]=y,e[5]=x,e[6]=g):g=e[6];let b;e[7]!==s?(b=s("key"),e[7]=s,e[8]=b):b=e[8];let k;e[9]!==b?(k=a(le,{children:b}),e[9]=b,e[10]=k):k=e[10];let w;e[11]!==s?(w=s("size"),e[11]=s,e[12]=w):w=e[12];let C;e[13]!==w?(C=a(le,{children:w}),e[13]=w,e[14]=C):C=e[14];let S;e[15]!==s?(S=s("content-type"),e[15]=s,e[16]=S):S=e[16];let N;e[17]!==S?(N=a(le,{children:S}),e[17]=S,e[18]=N):N=e[18];let $;e[19]!==m||e[20]!==s?($=m&&a(le,{children:s("used by")}),e[19]=m,e[20]=s,e[21]=$):$=e[21];let z;e[22]!==s?(z=s("Actions"),e[22]=s,e[23]=z):z=e[23];let D;e[24]!==z?(D=a(le,{"aria-label":z}),e[24]=z,e[25]=D):D=e[25];let K;e[26]!==D||e[27]!==g||e[28]!==k||e[29]!==C||e[30]!==N||e[31]!==$?(K=a(dt,{children:T(me,{children:[g,k,C,N,$,D]})}),e[26]=D,e[27]=g,e[28]=k,e[29]=C,e[30]=N,e[31]=$,e[32]=K):K=e[32];let E;if(e[33]!==u||e[34]!==l||e[35]!==m){let F;e[37]!==l||e[38]!==m?(F=L=>a(kt,{colSpan:m?6:5,name:L,onEnter:l},L),e[37]=l,e[38]=m,e[39]=F):F=e[39],E=u.map(F),e[33]=u,e[34]=l,e[35]=m,e[36]=E}else E=e[36];let U;if(e[40]!==t||e[41]!==o||e[42]!==n||e[43]!==i||e[44]!==f||e[45]!==h||e[46]!==d||e[47]!==m||e[48]!==s){let F;e[50]!==t||e[51]!==o||e[52]!==i||e[53]!==f||e[54]!==h||e[55]!==d||e[56]!==m||e[57]!==s?(F=L=>a(vt,{busy:t,copiedKey:o,handlers:i,object:L,prefix:f,references:h[L.key],selected:d.has(L.key),showReferences:m,t:s},L.key),e[50]=t,e[51]=o,e[52]=i,e[53]=f,e[54]=h,e[55]=d,e[56]=m,e[57]=s,e[58]=F):F=e[58],U=n.map(F),e[40]=t,e[41]=o,e[42]=n,e[43]=i,e[44]=f,e[45]=h,e[46]=d,e[47]=m,e[48]=s,e[49]=U}else U=e[49];let R;e[59]!==E||e[60]!==U?(R=T(ut,{children:[E,U]}),e[59]=E,e[60]=U,e[61]=R):R=e[61];let I;return e[62]!==K||e[63]!==R?(I=a(it,{className:"overflow-hidden py-0",children:a(ct,{className:"px-0",children:T(ft,{"data-testid":"fb-table",children:[K,R]})})}),e[62]=K,e[63]=R,e[64]=I):I=e[64],I},St=[{label:"15m",seconds:900},{label:"1h",seconds:3600},{label:"24h",seconds:86400},{label:"7d",seconds:604800}],Nt=3600,ke=(c,e)=>{if(e==="size")return c.size;if(e==="type")return c.httpMetadata?.contentType??"";if(e==="date"){if(c.uploaded===void 0)return 0;const r=new Date(c.uploaded).getTime();return Number.isNaN(r)?0:r}return e.startsWith("tag:")?c.customMetadata?.[e.slice(4)]??"":c.key},Ct=(c,e,r)=>{const t=r==="desc"?-1:1;return c.toSorted((o,n)=>{const u=ke(o,e),i=ke(n,e);return(typeof u=="number"&&typeof i=="number"?u-i:String(u).localeCompare(String(i)))*t})},$t=(c,e)=>{const r=new Set,t=[];for(const o of c){const n=o.key.slice(e.length),u=n.indexOf("/");u===-1?t.push(o):r.add(n.slice(0,u+1))}return{files:t,folders:[...r].toSorted((o,n)=>o.localeCompare(n))}},jt=c=>{const e=B(59),{bucket:r,buckets:t,busy:o,draftPrefix:n,expiry:u,fileInputRef:i,onBucketChange:l,onExpiryChange:f,onFileChange:h,onList:d,onPrefixChange:m,onUploadClick:v,t:s}=c;let x;e[0]!==m?(x=P=>{m(P.target.value)},e[0]=m,e[1]=x):x=e[1];const y=x;let g;e[2]!==l?(g=P=>{l(P.target.value)},e[2]=l,e[3]=g):g=e[3];const b=g;let k;e[4]!==f?(k=P=>{f(Number.parseInt(P.target.value,10))},e[4]=f,e[5]=k):k=e[5];const w=k;let C;e[6]!==r||e[7]!==t||e[8]!==b||e[9]!==s?(C=t.length>0&&a("select",{"aria-label":s("Bucket"),className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-bucket",onChange:b,value:r,children:t.map(Kt)}),e[6]=r,e[7]=t,e[8]=b,e[9]=s,e[10]=C):C=e[10];let S;e[11]!==s?(S=s("Key prefix"),e[11]=s,e[12]=S):S=e[12];let N;e[13]!==s?(N=s("key prefix (optional)"),e[13]=s,e[14]=N):N=e[14];let $;e[15]!==n||e[16]!==y||e[17]!==S||e[18]!==N?($=a(pt,{"aria-label":S,className:"h-8 w-64 max-w-full","data-testid":"fb-prefix-input",onChange:y,placeholder:N,value:n}),e[15]=n,e[16]=y,e[17]=S,e[18]=N,e[19]=$):$=e[19];let z;e[20]!==s?(z=s("List"),e[20]=s,e[21]=z):z=e[21];let D;e[22]!==o||e[23]!==d||e[24]!==z?(D=a(se,{"data-testid":"fb-list",disabled:o,onClick:d,size:"sm",type:"button",children:z}),e[22]=o,e[23]=d,e[24]=z,e[25]=D):D=e[25];let K;e[26]!==o||e[27]!==s?(K=s(o?"Uploading…":"Upload"),e[26]=o,e[27]=s,e[28]=K):K=e[28];let E;e[29]!==o||e[30]!==v||e[31]!==K?(E=a(se,{"data-testid":"storage-upload",disabled:o,onClick:v,size:"sm",type:"button",variant:"outline",children:K}),e[29]=o,e[30]=v,e[31]=K,e[32]=E):E=e[32];let U;e[33]!==i||e[34]!==h?(U=a("input",{className:"hidden","data-testid":"storage-file-input",onChange:h,ref:i,type:"file"}),e[33]=i,e[34]=h,e[35]=U):U=e[35];let R;e[36]!==s?(R=s("Link expiry"),e[36]=s,e[37]=R):R=e[37];let I;e[38]!==s?(I=St.map(P=>a("option",{value:P.seconds,children:s(P.label)},P.seconds)),e[38]=s,e[39]=I):I=e[39];let F;e[40]!==u||e[41]!==w||e[42]!==I?(F=a("select",{className:"h-8 rounded-md border border-border bg-background px-1 tabular-nums outline-none focus-visible:border-ring","data-testid":"storage-expiry",id:"storage-expiry",onChange:w,value:u,children:I}),e[40]=u,e[41]=w,e[42]=I,e[43]=F):F=e[43];let L;e[44]!==R||e[45]!==F?(L=T("label",{className:"ml-auto flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"storage-expiry",children:[R,F]}),e[44]=R,e[45]=F,e[46]=L):L=e[46];let M;e[47]!==s?(M=s("Open in Cloudflare"),e[47]=s,e[48]=M):M=e[48];let A;e[49]!==M?(A=a("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"fb-cf-link",href:gt,rel:"noreferrer",target:"_blank",children:M}),e[49]=M,e[50]=A):A=e[50];let W;return e[51]!==E||e[52]!==U||e[53]!==L||e[54]!==A||e[55]!==C||e[56]!==$||e[57]!==D?(W=T("div",{className:"flex flex-wrap items-center gap-2",children:[C,$,D,E,U,L,A]}),e[51]=E,e[52]=U,e[53]=L,e[54]=A,e[55]=C,e[56]=$,e[57]=D,e[58]=W):W=e[58],W},zt=c=>{const e=B(66),{onSortKeyChange:r,onThumbSizeChange:t,showGrid:o,showList:n,sortDirection:u,sortKey:i,t:l,tagKeys:f,thumbSize:h,toggleSortDirection:d,view:m}=c;let v;e[0]!==r?(v=q=>{r(q.target.value)},e[0]=r,e[1]=v):v=e[1];const s=v;let x;e[2]!==t?(x=q=>{t(Number.parseInt(q.target.value,10))},e[2]=t,e[3]=x):x=e[3];const y=x,g=m==="list";let b;e[4]!==l?(b=l("List"),e[4]=l,e[5]=b):b=e[5];let k;e[6]!==n||e[7]!==g||e[8]!==b?(k=a("button",{"aria-pressed":g,className:"px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-list",onClick:n,type:"button",children:b}),e[6]=n,e[7]=g,e[8]=b,e[9]=k):k=e[9];const w=m==="grid";let C;e[10]!==l?(C=l("Grid"),e[10]=l,e[11]=C):C=e[11];let S;e[12]!==o||e[13]!==w||e[14]!==C?(S=a("button",{"aria-pressed":w,className:"border-s border-border px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-grid",onClick:o,type:"button",children:C}),e[12]=o,e[13]=w,e[14]=C,e[15]=S):S=e[15];let N;e[16]!==k||e[17]!==S?(N=T("div",{className:"inline-flex overflow-hidden rounded-md border border-border",children:[k,S]}),e[16]=k,e[17]=S,e[18]=N):N=e[18];let $;e[19]!==l?($=l("Sort"),e[19]=l,e[20]=$):$=e[20];let z;e[21]!==l?(z=l("Name"),e[21]=l,e[22]=z):z=e[22];let D;e[23]!==z?(D=a("option",{value:"name",children:z}),e[23]=z,e[24]=D):D=e[24];let K;e[25]!==l?(K=l("size"),e[25]=l,e[26]=K):K=e[26];let E;e[27]!==K?(E=a("option",{value:"size",children:K}),e[27]=K,e[28]=E):E=e[28];let U;e[29]!==l?(U=l("Type"),e[29]=l,e[30]=U):U=e[30];let R;e[31]!==U?(R=a("option",{value:"type",children:U}),e[31]=U,e[32]=R):R=e[32];let I;e[33]!==l?(I=l("Modified"),e[33]=l,e[34]=I):I=e[34];let F;e[35]!==I?(F=a("option",{value:"date",children:I}),e[35]=I,e[36]=F):F=e[36];let L;e[37]!==f?(L=f.map(Dt),e[37]=f,e[38]=L):L=e[38];let M;e[39]!==s||e[40]!==i||e[41]!==D||e[42]!==E||e[43]!==R||e[44]!==F||e[45]!==L?(M=T("select",{className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-sort",id:"fb-sort",onChange:s,value:i,children:[D,E,R,F,L]}),e[39]=s,e[40]=i,e[41]=D,e[42]=E,e[43]=R,e[44]=F,e[45]=L,e[46]=M):M=e[46];let A;e[47]!==$||e[48]!==M?(A=T("label",{className:"flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-sort",children:[$,M]}),e[47]=$,e[48]=M,e[49]=A):A=e[49];let W;e[50]!==l?(W=l("Toggle sort direction"),e[50]=l,e[51]=W):W=e[51];const P=u==="asc"?"↑":"↓";let H;e[52]!==W||e[53]!==P||e[54]!==d?(H=a("button",{"aria-label":W,className:"flex size-8 items-center justify-center rounded-md border border-border tabular-nums outline-none transition-colors hover:bg-accent focus-visible:bg-accent","data-testid":"fb-sort-dir",onClick:d,type:"button",children:P}),e[52]=W,e[53]=P,e[54]=d,e[55]=H):H=e[55];let Q;e[56]!==y||e[57]!==l||e[58]!==h||e[59]!==m?(Q=m==="grid"&&T("label",{className:"ml-auto flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-thumb-size",children:[l("Thumbnail size"),a("input",{className:"accent-primary","data-testid":"fb-thumb-size",id:"fb-thumb-size",max:240,min:80,onChange:y,step:8,type:"range",value:h})]}),e[56]=y,e[57]=l,e[58]=h,e[59]=m,e[60]=Q):Q=e[60];let re;return e[61]!==A||e[62]!==H||e[63]!==Q||e[64]!==N?(re=T("div",{className:"flex flex-wrap items-center gap-2 text-xs","data-testid":"fb-controls",children:[N,A,H,Q]}),e[61]=A,e[62]=H,e[63]=Q,e[64]=N,e[65]=re):re=e[65],re};function Kt(c){return a("option",{value:c,children:c},c)}function Dt(c){return a("option",{value:`tag:${c}`,children:c},c)}const Tt=/\.(?:avif|bmp|gif|ico|jpe?g|png|svg|webp)$/iu,Ft=c=>(c.httpMetadata?.contentType??"").startsWith("image/")||Tt.test(c.key),Rt=()=>{const c=B(1);let e;return c[0]===Symbol.for("react.memo_cache_sentinel")?(e=a("svg",{"aria-hidden":"true",className:"size-8 text-muted-foreground/60",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:a("path",{d:"M7 3h7l5 5v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm7 0v5h5"})}),c[0]=e):e=c[0],e},Lt=c=>{const e=B(13),{object:r,resolveUrl:t}=c,[o,n]=O(null),[u,i]=O(!1);let l;e[0]!==r?(l=Ft(r),e[0]=r,e[1]=l):l=e[1];const f=l;let h,d;e[2]!==f||e[3]!==r.key||e[4]!==t?(h=()=>{if(!f)return;const x={cancelled:!1};return G((async()=>{try{const y=await t(r.key);x.cancelled||n(y)}catch{x.cancelled||i(!0)}})()),()=>{x.cancelled=!0}},d=[f,r.key,t],e[2]=f,e[3]=r.key,e[4]=t,e[5]=h,e[6]=d):(h=e[5],d=e[6]),oe(h,d);let m;e[7]===Symbol.for("react.memo_cache_sentinel")?(m=()=>{i(!0)},e[7]=m):m=e[7];const v=m;let s;return e[8]!==u||e[9]!==f||e[10]!==r.key||e[11]!==o?(s=a("div",{className:"flex aspect-square w-full items-center justify-center overflow-hidden rounded-md border border-border bg-muted/30",children:f&&o!==null&&!u?a("img",{alt:r.key,className:"size-full object-cover",loading:"lazy",onError:v,src:o}):a(Rt,{})}),e[8]=u,e[9]=f,e[10]=r.key,e[11]=o,e[12]=s):s=e[12],s},Ot=c=>{const e=B(38),{busy:r,copiedKey:t,handlers:o,object:n,prefix:u,references:i,resolveUrl:l,selected:f,showReferences:h,t:d}=c,{copy:m,download:v,name:s,remove:x,toggle:y}=Ke(n,u,o);let g;e[0]!==n||e[1]!==l?(g=a(Lt,{object:n,resolveUrl:l}),e[0]=n,e[1]=l,e[2]=g):g=e[2];let b;e[3]!==n.key||e[4]!==f||e[5]!==d||e[6]!==y?(b=a("span",{className:"absolute left-1.5 top-1.5 rounded bg-background/80 p-0.5",children:a(Fe,{objectKey:n.key,onToggle:y,selected:f,t:d})}),e[3]=n.key,e[4]=f,e[5]=d,e[6]=y,e[7]=b):b=e[7];let k;e[8]!==g||e[9]!==b?(k=T("div",{className:"relative",children:[g,b]}),e[8]=g,e[9]=b,e[10]=k):k=e[10];let w;e[11]!==s?(w=a("p",{className:"truncate font-mono text-xs",title:s,children:s}),e[11]=s,e[12]=w):w=e[12];let C;e[13]!==n.size?(C=Ce(n.size),e[13]=n.size,e[14]=C):C=e[14];let S;e[15]!==C?(S=a("p",{className:"text-[11px] tabular-nums text-muted-foreground",children:C}),e[15]=C,e[16]=S):S=e[16];let N;e[17]!==n.key||e[18]!==i||e[19]!==h||e[20]!==d?(N=h&&a("div",{className:"mt-1",children:a(Te,{objectKey:n.key,references:i,t:d})}),e[17]=n.key,e[18]=i,e[19]=h,e[20]=d,e[21]=N):N=e[21];let $;e[22]!==w||e[23]!==S||e[24]!==N?($=T("div",{className:"min-w-0",children:[w,S,N]}),e[22]=w,e[23]=S,e[24]=N,e[25]=$):$=e[25];const z=t===n.key;let D;e[26]!==r||e[27]!==m||e[28]!==v||e[29]!==n.key||e[30]!==x||e[31]!==d||e[32]!==z?(D=a("div",{className:"flex items-center gap-1",children:a(De,{busy:r,buttonClassName:"h-7 px-2 text-xs",copied:z,objectKey:n.key,onCopy:m,onDelete:x,onDownload:v,t:d})}),e[26]=r,e[27]=m,e[28]=v,e[29]=n.key,e[30]=x,e[31]=d,e[32]=z,e[33]=D):D=e[33];let K;return e[34]!==D||e[35]!==k||e[36]!==$?(K=T("div",{className:"flex flex-col gap-1.5","data-testid":"fb-tile",children:[k,$,D]}),e[34]=D,e[35]=k,e[36]=$,e[37]=K):K=e[37],K},Et=c=>{const e=B(9),{name:r,onEnter:t}=c;let o;e[0]!==r||e[1]!==t?(o=()=>{t(r)},e[0]=r,e[1]=t,e[2]=o):o=e[2];const n=o;let u;e[3]===Symbol.for("react.memo_cache_sentinel")?(u=a("span",{className:"flex aspect-square w-full items-center justify-center rounded-md border border-border bg-muted/30 transition-colors hover:bg-accent",children:a("svg",{"aria-hidden":"true",className:"size-10 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:a("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})})}),e[3]=u):u=e[3];let i;e[4]!==r?(i=a("span",{className:"truncate font-mono text-xs",title:r,children:r}),e[4]=r,e[5]=i):i=e[5];let l;return e[6]!==n||e[7]!==i?(l=T("button",{className:"flex flex-col gap-1.5 text-left outline-none","data-testid":"fb-folder",onClick:n,type:"button",children:[u,i]}),e[6]=n,e[7]=i,e[8]=l):l=e[8],l},Ut=c=>{const e=B(34),{busy:r,copiedKey:t,files:o,folders:n,handlers:u,onEnterFolder:i,prefix:l,references:f,resolveUrl:h,selected:d,showReferences:m,size:v,t:s}=c;let x;e[0]!==v?(x=v.toString(),e[0]=v,e[1]=x):x=e[1];const y=`repeat(auto-fill, minmax(${x}px, 1fr))`;let g;e[2]!==y?(g={gridTemplateColumns:y},e[2]=y,e[3]=g):g=e[3];const b=g;let k;if(e[4]!==n||e[5]!==i){let S;e[7]!==i?(S=N=>a(Et,{name:N,onEnter:i},N),e[7]=i,e[8]=S):S=e[8],k=n.map(S),e[4]=n,e[5]=i,e[6]=k}else k=e[6];let w;if(e[9]!==r||e[10]!==t||e[11]!==o||e[12]!==u||e[13]!==l||e[14]!==f||e[15]!==h||e[16]!==d||e[17]!==m||e[18]!==s){let S;e[20]!==r||e[21]!==t||e[22]!==u||e[23]!==l||e[24]!==f||e[25]!==h||e[26]!==d||e[27]!==m||e[28]!==s?(S=N=>a(Ot,{busy:r,copiedKey:t,handlers:u,object:N,prefix:l,references:f[N.key],resolveUrl:h,selected:d.has(N.key),showReferences:m,t:s},N.key),e[20]=r,e[21]=t,e[22]=u,e[23]=l,e[24]=f,e[25]=h,e[26]=d,e[27]=m,e[28]=s,e[29]=S):S=e[29],w=o.map(S),e[9]=r,e[10]=t,e[11]=o,e[12]=u,e[13]=l,e[14]=f,e[15]=h,e[16]=d,e[17]=m,e[18]=s,e[19]=w}else w=e[19];let C;return e[30]!==b||e[31]!==k||e[32]!==w?(C=T("div",{className:"grid gap-4","data-testid":"fb-gallery",style:b,children:[k,w]}),e[30]=b,e[31]=k,e[32]=w,e[33]=C):C=e[33],C},_t=c=>{const e=B(23),{reference:r,t}=c,o=`fb-dangling-${r.table}-${r.id}-${r.column}`,n=`${r.table}·${r.id}`;let u;e[0]!==n?(u=a(ce,{variant:"secondary",children:n}),e[0]=n,e[1]=u):u=e[1];let i;e[2]!==r.column?(i=a("span",{className:"text-muted-foreground",children:r.column}),e[2]=r.column,e[3]=i):i=e[3];let l;e[4]!==t?(l=t("→"),e[4]=t,e[5]=l):l=e[5];let f;e[6]!==l?(f=a("span",{className:"text-muted-foreground/60",children:l}),e[6]=l,e[7]=f):f=e[7];let h;e[8]!==r.key?(h=a("code",{className:"rounded bg-muted px-1 py-0.5 font-mono text-foreground",children:r.key}),e[8]=r.key,e[9]=h):h=e[9];let d;e[10]!==u||e[11]!==i||e[12]!==f||e[13]!==h?(d=T("span",{className:"flex flex-wrap items-center gap-1.5",children:[u,i,f,h]}),e[10]=u,e[11]=i,e[12]=f,e[13]=h,e[14]=d):d=e[14];let m;e[15]!==t?(m=t("Missing object"),e[15]=t,e[16]=m):m=e[16];let v;e[17]!==m?(v=a(ce,{className:"border-destructive/40 text-destructive",variant:"outline",children:m}),e[17]=m,e[18]=v):v=e[18];let s;return e[19]!==o||e[20]!==v||e[21]!==d?(s=T("li",{className:"flex flex-wrap items-center justify-between gap-2 rounded-md border border-border/60 px-3 py-2 text-xs","data-testid":o,children:[d,v]}),e[19]=o,e[20]=v,e[21]=d,e[22]=s):s=e[22],s},It=c=>{const e=B(37),{busy:r,onCheck:t,references:o,t:n,truncated:u}=c;let i;e[0]!==n?(i=n("Integrity"),e[0]=n,e[1]=i):i=e[1];let l;e[2]!==i?(l=a("span",{className:"font-mono text-[11px] uppercase tracking-wide text-muted-foreground",children:i}),e[2]=i,e[3]=l):l=e[3];let f;e[4]!==n?(f=n("Orphaned objects"),e[4]=n,e[5]=f):f=e[5];let h;e[6]!==f?(h=a("span",{className:"text-sm font-medium text-foreground",children:f}),e[6]=f,e[7]=h):h=e[7];let d;e[8]!==n?(d=n("Find records whose file reference points at an object the bucket no longer has."),e[8]=n,e[9]=d):d=e[9];let m;e[10]!==d?(m=a("span",{className:"text-xs text-muted-foreground",children:d}),e[10]=d,e[11]=m):m=e[11];let v;e[12]!==l||e[13]!==h||e[14]!==m?(v=T("div",{className:"flex flex-col gap-1",children:[l,h,m]}),e[12]=l,e[13]=h,e[14]=m,e[15]=v):v=e[15];let s;e[16]!==r||e[17]!==n?(s=n(r?"Checking…":"Check for orphans"),e[16]=r,e[17]=n,e[18]=s):s=e[18];let x;e[19]!==r||e[20]!==t||e[21]!==s?(x=a(se,{"data-testid":"fb-orphans-check",disabled:r,onClick:t,size:"sm",type:"button",variant:"outline",children:s}),e[19]=r,e[20]=t,e[21]=s,e[22]=x):x=e[22];let y;e[23]!==v||e[24]!==x?(y=T("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[v,x]}),e[23]=v,e[24]=x,e[25]=y):y=e[25];let g;e[26]!==o?.length||e[27]!==n?(g=o?.length===0&&a(Se,{description:n("Every record's file reference points at an object that exists in the bucket."),testId:"fb-orphans-empty",title:n("No dangling references.")}),e[26]=o?.length,e[27]=n,e[28]=g):g=e[28];let b;e[29]!==o||e[30]!==n||e[31]!==u?(b=o!==void 0&&o.length>0&&T(je,{children:[u&&a("p",{className:"text-xs text-warning","data-testid":"fb-orphans-truncated",children:n("Showing the first {count} dangling references — the scan was truncated.",{count:o.length})}),a("ul",{className:"flex flex-col gap-1.5","data-testid":"fb-orphans-list",children:o.map(w=>a(_t,{reference:w,t:n},`${w.table}·${w.id}·${w.column}`))})]}),e[29]=o,e[30]=n,e[31]=u,e[32]=b):b=e[32];let k;return e[33]!==y||e[34]!==g||e[35]!==b?(k=T("section",{className:"flex flex-col gap-2 rounded-lg border border-border/60 p-3","data-testid":"fb-orphans",children:[y,g,b]}),e[33]=y,e[34]=g,e[35]=b,e[36]=k):k=e[36],k},Mt=function(c,e){const r=B(18);let t;r[0]===Symbol.for("react.memo_cache_sentinel")?(t=new Set,r[0]=t):t=r[0];const[o,n]=O(t);let u;r[1]===Symbol.for("react.memo_cache_sentinel")?(u=g=>{n(b=>{const k=new Set(b);return k.has(g)?k.delete(g):k.add(g),k})},r[1]=u):u=r[1];const i=u;let l;r[2]===Symbol.for("react.memo_cache_sentinel")?(l=()=>{n(new Set)},r[2]=l):l=r[2];const f=l;let h,d,m;if(r[3]!==c||r[4]!==e||r[5]!==o){let g;r[9]!==e?(g=b=>e(b),r[9]=e,r[10]=g):g=r[10],d=c.map(g),h=d.length>0&&d.every(b=>o.has(b)),m=!h&&d.some(b=>o.has(b)),r[3]=c,r[4]=e,r[5]=o,r[6]=h,r[7]=d,r[8]=m}else h=r[6],d=r[7],m=r[8];const v=m;let s;r[11]!==d?(s=()=>{n(g=>d.every(b=>g.has(b))?new Set:new Set(d))},r[11]=d,r[12]=s):s=r[12];const x=s;let y;return r[13]!==h||r[14]!==o||r[15]!==v||r[16]!==x?(y={allSelected:h,clear:f,selected:o,someSelected:v,toggle:i,toggleAll:x},r[13]=h,r[14]=o,r[15]=v,r[16]=x,r[17]=y):y=r[17],y},Bt=$e(ze.storageReferences),At=$e(ze.storageOrphans),ve=1e4,Pt=1e3,Wt=3600,Gt=(c,e)=>{if(!("document"in globalThis))return;const r=globalThis.document.createElement("a");r.href=c,r.download=e,r.rel="noopener",globalThis.document.body.append(r),r.click(),r.remove()},Ht=({initialPrefix:c,pageSize:e})=>{const r=bt(),[t,o]=O(c??""),[n,u]=O(c??""),[i,l]=O(Nt),[f,h]=O("list"),[d,m]=O(128),[v,s]=O("name"),[x,y]=O("asc"),[g,b]=O(void 0),[k,w]=O(void 0),[C,S]=O(!1),[N,$]=O(void 0),[z,D]=O(void 0),[K,E]=O(""),[U,R]=O({}),[I,F]=O(!1),[L,M]=O(void 0),[A,W]=O(!1),[P,H]=O(!1),[Q,re]=O([]),[q,pe]=O(""),ne=he(0),Y=he(0);oe(()=>{const p={cancelled:!1};return G((async()=>{try{const j=await r.listStorageBuckets();if(!p.cancelled){re(j);const[_]=j;_!==void 0&&pe(Z=>Z===""?_:Z)}}catch{}})()),()=>{p.cancelled=!0}},[r]);const V=fe(()=>({list:p=>r.listStorageObjects({...p,bucket:q}),remove:p=>r.deleteStorageObject(p,{bucket:q}),signedUrl:(p,j)=>r.signedStorageUrl(p,{...j,bucket:q}),upload:p=>r.uploadStorageObject({...p,bucket:q})}),[q,r]),X=lt(async(p,j,_)=>{ne.current+=1;const Z=ne.current;w(void 0),S(!0);try{const J=await V.list({cursor:j,limit:e,prefix:p});if(Z!==ne.current)return;b(ye=>_&&ye!==void 0?[...ye,...J.objects]:J.objects),D(J.cursor)}catch(J){if(Z!==ne.current)return;_||b(void 0),w(ee(J))}finally{Z===ne.current&&S(!1)}},[e,V]);oe(()=>{G(X(c??"",void 0,!1))},[X,c]);const Re=(g?.length??0)<=e;yt(()=>{G(X(t,void 0,!1))},Re);const{files:de,folders:Le}=$t(g??[],t),Oe=fe(()=>{const p=new Set;for(const j of de)for(const _ of Object.keys(j.customMetadata??{}))p.add(_);return[...p].toSorted((j,_)=>j.localeCompare(_))},[de]),ie=Ct(de,v,x),ue=fe(()=>[...new Set(ie.map(p=>p.key))].toSorted((p,j)=>p.localeCompare(j)).join(`
|
|
3
|
-
`),[ie]);
|
|
4
|
-
`);if(p.length===0){
|
|
1
|
+
import{c as M}from"react/compiler-runtime";import{useState as E,useEffect as le,useRef as he,useMemo as fe,useCallback as nt}from"react";import{ShardInput as ot}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{E as Se}from"../packem_shared/empty-state-Cg7t_8qu.js";import{useT as lt}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{z as st}from"../packem_shared/grid-features-jnrD0SpX.js";import{c as at,u as it}from"../packem_shared/card-CIDGUN6K.js";import{f as Ne}from"../packem_shared/checkbox-StT4Gob6.js";import{p as oe,d as ct,m as me,f as dt,n as ut,u as te}from"../packem_shared/table-DdJBrClo.js";import{k as Ce,f as q,b as ee,d as xe,g as $e,c as ft}from"../packem_shared/internal-BSIsQVC6.js";import{ConfirmButton as ht}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{g as ce}from"../packem_shared/badge-BbuuAio7.js";import{jsx as s,jsxs as T,Fragment as je}from"react/jsx-runtime";import{u as mt}from"../packem_shared/input-JHu63lTv.js";import{d as pt}from"../packem_shared/cf-links-gbDy51nR.js";import{useLunora as gt}from"@lunora/react";import{useAutoRefresh as bt}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{ADMIN_FUNCTIONS as ze}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";const Ke=(d,e,t)=>{const{onCopy:r,onDelete:l,onDownload:n,onToggleSelect:c}=t,i=()=>{r(d.key)},o=()=>{n(d.key)},u=()=>{l(d.key)},h=()=>{c(d.key)};return{copy:i,download:o,name:d.key.slice(e.length),remove:u,toggle:h}},De=d=>{const e=M(31),{busy:t,buttonClassName:r,copied:l,objectKey:n,onCopy:c,onDelete:i,onDownload:o,t:u}=d,h=`storage-copy-${n}`;let f;e[0]!==l||e[1]!==u?(f=u(l?"Copied":"Copy URL"),e[0]=l,e[1]=u,e[2]=f):f=e[2];let m;e[3]!==t||e[4]!==r||e[5]!==c||e[6]!==h||e[7]!==f?(m=s(se,{className:r,"data-testid":h,disabled:t,onClick:c,size:"sm",type:"button",variant:"ghost",children:f}),e[3]=t,e[4]=r,e[5]=c,e[6]=h,e[7]=f,e[8]=m):m=e[8];const k=`storage-download-${n}`;let a;e[9]!==u?(a=u("Download"),e[9]=u,e[10]=a):a=e[10];let v;e[11]!==t||e[12]!==r||e[13]!==o||e[14]!==k||e[15]!==a?(v=s(se,{className:r,"data-testid":k,disabled:t,onClick:o,size:"sm",type:"button",variant:"ghost",children:a}),e[11]=t,e[12]=r,e[13]=o,e[14]=k,e[15]=a,e[16]=v):v=e[16];let S;e[17]!==u?(S=u("Delete object?"),e[17]=u,e[18]=S):S=e[18];const y=`storage-delete-${n}`;let g;e[19]!==u?(g=u("Delete"),e[19]=u,e[20]=g):g=e[20];let x;e[21]!==t||e[22]!==i||e[23]!==S||e[24]!==y||e[25]!==g?(x=s(ht,{confirmLabel:S,disabled:t,onConfirm:i,testId:y,children:g}),e[21]=t,e[22]=i,e[23]=S,e[24]=y,e[25]=g,e[26]=x):x=e[26];let b;return e[27]!==x||e[28]!==m||e[29]!==v?(b=T(je,{children:[m,v,x]}),e[27]=x,e[28]=m,e[29]=v,e[30]=b):b=e[30],b},Te=d=>{const e=M(14),{objectKey:t,references:r,t:l}=d;if(r===void 0)return null;if(r.length===0){const h=`storage-orphan-${t}`;let f;e[0]!==l?(f=l("Orphan"),e[0]=l,e[1]=f):f=e[1];let m;return e[2]!==h||e[3]!==f?(m=s(ce,{"data-testid":h,variant:"warning",children:f}),e[2]=h,e[3]=f,e[4]=m):m=e[4],m}let n;e[5]!==r?(n=r.map(yt).join(`
|
|
2
|
+
`),e[5]=r,e[6]=n):n=e[6];const c=n,i=`storage-refs-${t}`;let o;e[7]!==r.length||e[8]!==l?(o=r.length===1?l("1 record"):l("{count} records",{count:r.length}),e[7]=r.length,e[8]=l,e[9]=o):o=e[9];let u;return e[10]!==c||e[11]!==i||e[12]!==o?(u=s(ce,{"data-testid":i,title:c,variant:"secondary",children:o}),e[10]=c,e[11]=i,e[12]=o,e[13]=u):u=e[13],u},Fe=d=>{const e=M(7),{objectKey:t,onToggle:r,selected:l,t:n}=d;let c;e[0]!==n?(c=n("Select row"),e[0]=n,e[1]=c):c=e[1];const i=`storage-select-${t}`;let o;return e[2]!==r||e[3]!==l||e[4]!==c||e[5]!==i?(o=s(Ne,{"aria-label":c,checked:l,"data-testid":i,onCheckedChange:r}),e[2]=r,e[3]=l,e[4]=c,e[5]=i,e[6]=o):o=e[6],o};function yt(d){return`${d.table}·${d.id}`}const xt=d=>{const e=M(10),{colSpan:t,name:r,onEnter:l}=d;let n;e[0]!==r||e[1]!==l?(n=()=>{l(r)},e[0]=r,e[1]=l,e[2]=n):n=e[2];const c=n;let i;e[3]===Symbol.for("react.memo_cache_sentinel")?(i=s("svg",{"aria-hidden":"true",className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:s("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})}),e[3]=i):i=e[3];let o;e[4]!==c||e[5]!==r?(o=T("button",{className:"inline-flex items-center gap-2 font-mono text-xs outline-none hover:text-foreground focus-visible:text-foreground","data-testid":"fb-folder",onClick:c,type:"button",children:[i,r]}),e[4]=c,e[5]=r,e[6]=o):o=e[6];let u;return e[7]!==t||e[8]!==o?(u=s(me,{children:s(te,{colSpan:t,children:o})}),e[7]=t,e[8]=o,e[9]=u):u=e[9],u},vt=d=>{const e=M(37),{busy:t,copiedKey:r,handlers:l,object:n,prefix:c,references:i,selected:o,showReferences:u,t:h}=d;let f;e[0]!==l||e[1]!==n||e[2]!==c?(f=Ke(n,c,l),e[0]=l,e[1]=n,e[2]=c,e[3]=f):f=e[3];const{copy:m,download:k,name:a,remove:v,toggle:S}=f;let y;e[4]!==n.key||e[5]!==o||e[6]!==h||e[7]!==S?(y=s(te,{className:"w-8",children:s(Fe,{objectKey:n.key,onToggle:S,selected:o,t:h})}),e[4]=n.key,e[5]=o,e[6]=h,e[7]=S,e[8]=y):y=e[8];let g;e[9]!==a?(g=s(te,{className:"font-mono text-xs",children:a}),e[9]=a,e[10]=g):g=e[10];let x;e[11]!==n.size?(x=Ce(n.size),e[11]=n.size,e[12]=x):x=e[12];let b;e[13]!==x?(b=s(te,{className:"tabular-nums text-muted-foreground",children:x}),e[13]=x,e[14]=b):b=e[14];const C=n.httpMetadata?.contentType??"";let w;e[15]!==C?(w=s(te,{children:C}),e[15]=C,e[16]=w):w=e[16];let N;e[17]!==n.key||e[18]!==i||e[19]!==u||e[20]!==h?(N=u&&s(te,{children:s(Te,{objectKey:n.key,references:i,t:h})}),e[17]=n.key,e[18]=i,e[19]=u,e[20]=h,e[21]=N):N=e[21];const z=r===n.key;let $;e[22]!==t||e[23]!==m||e[24]!==k||e[25]!==n.key||e[26]!==v||e[27]!==h||e[28]!==z?($=s(te,{className:"text-right",children:s("span",{className:"inline-flex items-center gap-1",children:s(De,{busy:t,copied:z,objectKey:n.key,onCopy:m,onDelete:v,onDownload:k,t:h})})}),e[22]=t,e[23]=m,e[24]=k,e[25]=n.key,e[26]=v,e[27]=h,e[28]=z,e[29]=$):$=e[29];let D;return e[30]!==$||e[31]!==y||e[32]!==g||e[33]!==b||e[34]!==w||e[35]!==N?(D=T(me,{"data-testid":"fb-row",children:[y,g,b,w,N,$]}),e[30]=$,e[31]=y,e[32]=g,e[33]=b,e[34]=w,e[35]=N,e[36]=D):D=e[36],D},kt=d=>{const e=M(65),{allSelected:t,busy:r,copiedKey:l,files:n,folders:c,handlers:i,onEnterFolder:o,prefix:u,references:h,selected:f,showReferences:m,someSelected:k,t:a,toggleSelectAll:v}=d;let S;e[0]!==a?(S=a("Select all rows"),e[0]=a,e[1]=S):S=e[1];let y;e[2]!==t||e[3]!==k||e[4]!==S||e[5]!==v?(y=s(oe,{className:"w-8",children:s(Ne,{"aria-label":S,checked:t,"data-testid":"storage-select-all",indeterminate:k,onCheckedChange:v})}),e[2]=t,e[3]=k,e[4]=S,e[5]=v,e[6]=y):y=e[6];let g;e[7]!==a?(g=a("key"),e[7]=a,e[8]=g):g=e[8];let x;e[9]!==g?(x=s(oe,{children:g}),e[9]=g,e[10]=x):x=e[10];let b;e[11]!==a?(b=a("size"),e[11]=a,e[12]=b):b=e[12];let C;e[13]!==b?(C=s(oe,{children:b}),e[13]=b,e[14]=C):C=e[14];let w;e[15]!==a?(w=a("content-type"),e[15]=a,e[16]=w):w=e[16];let N;e[17]!==w?(N=s(oe,{children:w}),e[17]=w,e[18]=N):N=e[18];let z;e[19]!==m||e[20]!==a?(z=m&&s(oe,{children:a("used by")}),e[19]=m,e[20]=a,e[21]=z):z=e[21];let $;e[22]!==a?($=a("Actions"),e[22]=a,e[23]=$):$=e[23];let D;e[24]!==$?(D=s(oe,{"aria-label":$}),e[24]=$,e[25]=D):D=e[25];let K;e[26]!==D||e[27]!==y||e[28]!==x||e[29]!==C||e[30]!==N||e[31]!==z?(K=s(ct,{children:T(me,{children:[y,x,C,N,z,D]})}),e[26]=D,e[27]=y,e[28]=x,e[29]=C,e[30]=N,e[31]=z,e[32]=K):K=e[32];let F;if(e[33]!==c||e[34]!==o||e[35]!==m){let R;e[37]!==o||e[38]!==m?(R=O=>s(xt,{colSpan:m?6:5,name:O,onEnter:o},O),e[37]=o,e[38]=m,e[39]=R):R=e[39],F=c.map(R),e[33]=c,e[34]=o,e[35]=m,e[36]=F}else F=e[36];let U;if(e[40]!==r||e[41]!==l||e[42]!==n||e[43]!==i||e[44]!==u||e[45]!==h||e[46]!==f||e[47]!==m||e[48]!==a){let R;e[50]!==r||e[51]!==l||e[52]!==i||e[53]!==u||e[54]!==h||e[55]!==f||e[56]!==m||e[57]!==a?(R=O=>s(vt,{busy:r,copiedKey:l,handlers:i,object:O,prefix:u,references:h[O.key],selected:f.has(O.key),showReferences:m,t:a},O.key),e[50]=r,e[51]=l,e[52]=i,e[53]=u,e[54]=h,e[55]=f,e[56]=m,e[57]=a,e[58]=R):R=e[58],U=n.map(R),e[40]=r,e[41]=l,e[42]=n,e[43]=i,e[44]=u,e[45]=h,e[46]=f,e[47]=m,e[48]=a,e[49]=U}else U=e[49];let L;e[59]!==F||e[60]!==U?(L=T(dt,{children:[F,U]}),e[59]=F,e[60]=U,e[61]=L):L=e[61];let B;return e[62]!==K||e[63]!==L?(B=s(at,{className:"overflow-hidden py-0",children:s(it,{className:"px-0",children:T(ut,{"data-testid":"fb-table",children:[K,L]})})}),e[62]=K,e[63]=L,e[64]=B):B=e[64],B},wt=[{label:"15m",seconds:900},{label:"1h",seconds:3600},{label:"24h",seconds:86400},{label:"7d",seconds:604800}],St=3600,ve=(d,e)=>{if(e==="size")return d.size;if(e==="type")return d.httpMetadata?.contentType??"";if(e==="date"){if(d.uploaded===void 0)return 0;const t=new Date(d.uploaded).getTime();return Number.isNaN(t)?0:t}return e.startsWith("tag:")?d.customMetadata?.[e.slice(4)]??"":d.key},Nt=(d,e,t)=>{const r=t==="desc"?-1:1;return d.toSorted((l,n)=>{const c=ve(l,e),i=ve(n,e);return(typeof c=="number"&&typeof i=="number"?c-i:String(c).localeCompare(String(i)))*r})},Ct=(d,e)=>{const t=new Set,r=[];for(const l of d){const n=l.key.slice(e.length),c=n.indexOf("/");c===-1?r.push(l):t.add(n.slice(0,c+1))}return{files:r,folders:[...t].toSorted((l,n)=>l.localeCompare(n))}},$t=d=>{const e=M(59),{bucket:t,buckets:r,busy:l,draftPrefix:n,expiry:c,fileInputRef:i,onBucketChange:o,onExpiryChange:u,onFileChange:h,onList:f,onPrefixChange:m,onUploadClick:k,t:a}=d;let v;e[0]!==m?(v=P=>{m(P.target.value)},e[0]=m,e[1]=v):v=e[1];const S=v;let y;e[2]!==o?(y=P=>{o(P.target.value)},e[2]=o,e[3]=y):y=e[3];const g=y;let x;e[4]!==u?(x=P=>{u(Number.parseInt(P.target.value,10))},e[4]=u,e[5]=x):x=e[5];const b=x;let C;e[6]!==t||e[7]!==r||e[8]!==g||e[9]!==a?(C=r.length>0&&s("select",{"aria-label":a("Bucket"),className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-bucket",onChange:g,value:t,children:r.map(zt)}),e[6]=t,e[7]=r,e[8]=g,e[9]=a,e[10]=C):C=e[10];let w;e[11]!==a?(w=a("Key prefix"),e[11]=a,e[12]=w):w=e[12];let N;e[13]!==a?(N=a("key prefix (optional)"),e[13]=a,e[14]=N):N=e[14];let z;e[15]!==n||e[16]!==S||e[17]!==w||e[18]!==N?(z=s(mt,{"aria-label":w,className:"h-8 w-64 max-w-full","data-testid":"fb-prefix-input",onChange:S,placeholder:N,value:n}),e[15]=n,e[16]=S,e[17]=w,e[18]=N,e[19]=z):z=e[19];let $;e[20]!==a?($=a("List"),e[20]=a,e[21]=$):$=e[21];let D;e[22]!==l||e[23]!==f||e[24]!==$?(D=s(se,{"data-testid":"fb-list",disabled:l,onClick:f,size:"sm",type:"button",children:$}),e[22]=l,e[23]=f,e[24]=$,e[25]=D):D=e[25];let K;e[26]!==l||e[27]!==a?(K=a(l?"Uploading…":"Upload"),e[26]=l,e[27]=a,e[28]=K):K=e[28];let F;e[29]!==l||e[30]!==k||e[31]!==K?(F=s(se,{"data-testid":"storage-upload",disabled:l,onClick:k,size:"sm",type:"button",variant:"outline",children:K}),e[29]=l,e[30]=k,e[31]=K,e[32]=F):F=e[32];let U;e[33]!==i||e[34]!==h?(U=s("input",{className:"hidden","data-testid":"storage-file-input",onChange:h,ref:i,type:"file"}),e[33]=i,e[34]=h,e[35]=U):U=e[35];let L;e[36]!==a?(L=a("Link expiry"),e[36]=a,e[37]=L):L=e[37];let B;e[38]!==a?(B=wt.map(P=>s("option",{value:P.seconds,children:a(P.label)},P.seconds)),e[38]=a,e[39]=B):B=e[39];let R;e[40]!==c||e[41]!==b||e[42]!==B?(R=s("select",{className:"h-8 rounded-md border border-border bg-background px-1 tabular-nums outline-none focus-visible:border-ring","data-testid":"storage-expiry",id:"storage-expiry",onChange:b,value:c,children:B}),e[40]=c,e[41]=b,e[42]=B,e[43]=R):R=e[43];let O;e[44]!==L||e[45]!==R?(O=T("label",{className:"ml-auto flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"storage-expiry",children:[L,R]}),e[44]=L,e[45]=R,e[46]=O):O=e[46];let I;e[47]!==a?(I=a("Open in Cloudflare"),e[47]=a,e[48]=I):I=e[48];let A;e[49]!==I?(A=s("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"fb-cf-link",href:pt,rel:"noreferrer",target:"_blank",children:I}),e[49]=I,e[50]=A):A=e[50];let W;return e[51]!==F||e[52]!==U||e[53]!==O||e[54]!==A||e[55]!==C||e[56]!==z||e[57]!==D?(W=T("div",{className:"flex flex-wrap items-center gap-2",children:[C,z,D,F,U,O,A]}),e[51]=F,e[52]=U,e[53]=O,e[54]=A,e[55]=C,e[56]=z,e[57]=D,e[58]=W):W=e[58],W},jt=d=>{const e=M(66),{onSortKeyChange:t,onThumbSizeChange:r,showGrid:l,showList:n,sortDirection:c,sortKey:i,t:o,tagKeys:u,thumbSize:h,toggleSortDirection:f,view:m}=d;let k;e[0]!==t?(k=Z=>{t(Z.target.value)},e[0]=t,e[1]=k):k=e[1];const a=k;let v;e[2]!==r?(v=Z=>{r(Number.parseInt(Z.target.value,10))},e[2]=r,e[3]=v):v=e[3];const S=v,y=m==="list";let g;e[4]!==o?(g=o("List"),e[4]=o,e[5]=g):g=e[5];let x;e[6]!==n||e[7]!==y||e[8]!==g?(x=s("button",{"aria-pressed":y,className:"px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-list",onClick:n,type:"button",children:g}),e[6]=n,e[7]=y,e[8]=g,e[9]=x):x=e[9];const b=m==="grid";let C;e[10]!==o?(C=o("Grid"),e[10]=o,e[11]=C):C=e[11];let w;e[12]!==l||e[13]!==b||e[14]!==C?(w=s("button",{"aria-pressed":b,className:"border-s border-border px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-grid",onClick:l,type:"button",children:C}),e[12]=l,e[13]=b,e[14]=C,e[15]=w):w=e[15];let N;e[16]!==x||e[17]!==w?(N=T("div",{className:"inline-flex overflow-hidden rounded-md border border-border",children:[x,w]}),e[16]=x,e[17]=w,e[18]=N):N=e[18];let z;e[19]!==o?(z=o("Sort"),e[19]=o,e[20]=z):z=e[20];let $;e[21]!==o?($=o("Name"),e[21]=o,e[22]=$):$=e[22];let D;e[23]!==$?(D=s("option",{value:"name",children:$}),e[23]=$,e[24]=D):D=e[24];let K;e[25]!==o?(K=o("size"),e[25]=o,e[26]=K):K=e[26];let F;e[27]!==K?(F=s("option",{value:"size",children:K}),e[27]=K,e[28]=F):F=e[28];let U;e[29]!==o?(U=o("Type"),e[29]=o,e[30]=U):U=e[30];let L;e[31]!==U?(L=s("option",{value:"type",children:U}),e[31]=U,e[32]=L):L=e[32];let B;e[33]!==o?(B=o("Modified"),e[33]=o,e[34]=B):B=e[34];let R;e[35]!==B?(R=s("option",{value:"date",children:B}),e[35]=B,e[36]=R):R=e[36];let O;e[37]!==u?(O=u.map(Kt),e[37]=u,e[38]=O):O=e[38];let I;e[39]!==a||e[40]!==i||e[41]!==D||e[42]!==F||e[43]!==L||e[44]!==R||e[45]!==O?(I=T("select",{className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-sort",id:"fb-sort",onChange:a,value:i,children:[D,F,L,R,O]}),e[39]=a,e[40]=i,e[41]=D,e[42]=F,e[43]=L,e[44]=R,e[45]=O,e[46]=I):I=e[46];let A;e[47]!==z||e[48]!==I?(A=T("label",{className:"flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-sort",children:[z,I]}),e[47]=z,e[48]=I,e[49]=A):A=e[49];let W;e[50]!==o?(W=o("Toggle sort direction"),e[50]=o,e[51]=W):W=e[51];const P=c==="asc"?"↑":"↓";let G;e[52]!==W||e[53]!==P||e[54]!==f?(G=s("button",{"aria-label":W,className:"flex size-8 items-center justify-center rounded-md border border-border tabular-nums outline-none transition-colors hover:bg-accent focus-visible:bg-accent","data-testid":"fb-sort-dir",onClick:f,type:"button",children:P}),e[52]=W,e[53]=P,e[54]=f,e[55]=G):G=e[55];let Y;e[56]!==S||e[57]!==o||e[58]!==h||e[59]!==m?(Y=m==="grid"&&T("label",{className:"ml-auto flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-thumb-size",children:[o("Thumbnail size"),s("input",{className:"accent-primary","data-testid":"fb-thumb-size",id:"fb-thumb-size",max:240,min:80,onChange:S,step:8,type:"range",value:h})]}),e[56]=S,e[57]=o,e[58]=h,e[59]=m,e[60]=Y):Y=e[60];let re;return e[61]!==A||e[62]!==G||e[63]!==Y||e[64]!==N?(re=T("div",{className:"flex flex-wrap items-center gap-2 text-xs","data-testid":"fb-controls",children:[N,A,G,Y]}),e[61]=A,e[62]=G,e[63]=Y,e[64]=N,e[65]=re):re=e[65],re};function zt(d){return s("option",{value:d,children:d},d)}function Kt(d){return s("option",{value:`tag:${d}`,children:d},d)}const Dt=/\.(?:avif|bmp|gif|ico|jpe?g|png|svg|webp)$/iu,Tt=d=>(d.httpMetadata?.contentType??"").startsWith("image/")||Dt.test(d.key),Ft=()=>{const d=M(1);let e;return d[0]===Symbol.for("react.memo_cache_sentinel")?(e=s("svg",{"aria-hidden":"true",className:"size-8 text-muted-foreground/60",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:s("path",{d:"M7 3h7l5 5v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm7 0v5h5"})}),d[0]=e):e=d[0],e},Rt=d=>{const e=M(13),{object:t,resolveUrl:r}=d,[l,n]=E(null),[c,i]=E(!1);let o;e[0]!==t?(o=Tt(t),e[0]=t,e[1]=o):o=e[1];const u=o;let h,f;e[2]!==u||e[3]!==t.key||e[4]!==r?(h=()=>{if(!u)return;const v={cancelled:!1};return q((async()=>{try{const S=await r(t.key);v.cancelled||n(S)}catch{v.cancelled||i(!0)}})()),()=>{v.cancelled=!0}},f=[u,t.key,r],e[2]=u,e[3]=t.key,e[4]=r,e[5]=h,e[6]=f):(h=e[5],f=e[6]),le(h,f);let m;e[7]===Symbol.for("react.memo_cache_sentinel")?(m=()=>{i(!0)},e[7]=m):m=e[7];const k=m;let a;return e[8]!==c||e[9]!==u||e[10]!==t.key||e[11]!==l?(a=s("div",{className:"flex aspect-square w-full items-center justify-center overflow-hidden rounded-md border border-border bg-muted/30",children:u&&l!==null&&!c?s("img",{alt:t.key,className:"size-full object-cover",loading:"lazy",onError:k,src:l}):s(Ft,{})}),e[8]=c,e[9]=u,e[10]=t.key,e[11]=l,e[12]=a):a=e[12],a},Lt=d=>{const e=M(42),{busy:t,copiedKey:r,handlers:l,object:n,prefix:c,references:i,resolveUrl:o,selected:u,showReferences:h,t:f}=d;let m;e[0]!==l||e[1]!==n||e[2]!==c?(m=Ke(n,c,l),e[0]=l,e[1]=n,e[2]=c,e[3]=m):m=e[3];const{copy:k,download:a,name:v,remove:S,toggle:y}=m;let g;e[4]!==n||e[5]!==o?(g=s(Rt,{object:n,resolveUrl:o}),e[4]=n,e[5]=o,e[6]=g):g=e[6];let x;e[7]!==n.key||e[8]!==u||e[9]!==f||e[10]!==y?(x=s("span",{className:"absolute left-1.5 top-1.5 rounded bg-background/80 p-0.5",children:s(Fe,{objectKey:n.key,onToggle:y,selected:u,t:f})}),e[7]=n.key,e[8]=u,e[9]=f,e[10]=y,e[11]=x):x=e[11];let b;e[12]!==g||e[13]!==x?(b=T("div",{className:"relative",children:[g,x]}),e[12]=g,e[13]=x,e[14]=b):b=e[14];let C;e[15]!==v?(C=s("p",{className:"truncate font-mono text-xs",title:v,children:v}),e[15]=v,e[16]=C):C=e[16];let w;e[17]!==n.size?(w=Ce(n.size),e[17]=n.size,e[18]=w):w=e[18];let N;e[19]!==w?(N=s("p",{className:"text-[11px] tabular-nums text-muted-foreground",children:w}),e[19]=w,e[20]=N):N=e[20];let z;e[21]!==n.key||e[22]!==i||e[23]!==h||e[24]!==f?(z=h&&s("div",{className:"mt-1",children:s(Te,{objectKey:n.key,references:i,t:f})}),e[21]=n.key,e[22]=i,e[23]=h,e[24]=f,e[25]=z):z=e[25];let $;e[26]!==C||e[27]!==N||e[28]!==z?($=T("div",{className:"min-w-0",children:[C,N,z]}),e[26]=C,e[27]=N,e[28]=z,e[29]=$):$=e[29];const D=r===n.key;let K;e[30]!==t||e[31]!==k||e[32]!==a||e[33]!==n.key||e[34]!==S||e[35]!==f||e[36]!==D?(K=s("div",{className:"flex items-center gap-1",children:s(De,{busy:t,buttonClassName:"h-7 px-2 text-xs",copied:D,objectKey:n.key,onCopy:k,onDelete:S,onDownload:a,t:f})}),e[30]=t,e[31]=k,e[32]=a,e[33]=n.key,e[34]=S,e[35]=f,e[36]=D,e[37]=K):K=e[37];let F;return e[38]!==K||e[39]!==b||e[40]!==$?(F=T("div",{className:"flex flex-col gap-1.5","data-testid":"fb-tile",children:[b,$,K]}),e[38]=K,e[39]=b,e[40]=$,e[41]=F):F=e[41],F},Ot=d=>{const e=M(9),{name:t,onEnter:r}=d;let l;e[0]!==t||e[1]!==r?(l=()=>{r(t)},e[0]=t,e[1]=r,e[2]=l):l=e[2];const n=l;let c;e[3]===Symbol.for("react.memo_cache_sentinel")?(c=s("span",{className:"flex aspect-square w-full items-center justify-center rounded-md border border-border bg-muted/30 transition-colors hover:bg-accent",children:s("svg",{"aria-hidden":"true",className:"size-10 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:s("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})})}),e[3]=c):c=e[3];let i;e[4]!==t?(i=s("span",{className:"truncate font-mono text-xs",title:t,children:t}),e[4]=t,e[5]=i):i=e[5];let o;return e[6]!==n||e[7]!==i?(o=T("button",{className:"flex flex-col gap-1.5 text-left outline-none","data-testid":"fb-folder",onClick:n,type:"button",children:[c,i]}),e[6]=n,e[7]=i,e[8]=o):o=e[8],o},Et=d=>{const e=M(34),{busy:t,copiedKey:r,files:l,folders:n,handlers:c,onEnterFolder:i,prefix:o,references:u,resolveUrl:h,selected:f,showReferences:m,size:k,t:a}=d;let v;e[0]!==k?(v=k.toString(),e[0]=k,e[1]=v):v=e[1];const S=`repeat(auto-fill, minmax(${v}px, 1fr))`;let y;e[2]!==S?(y={gridTemplateColumns:S},e[2]=S,e[3]=y):y=e[3];const g=y;let x;if(e[4]!==n||e[5]!==i){let w;e[7]!==i?(w=N=>s(Ot,{name:N,onEnter:i},N),e[7]=i,e[8]=w):w=e[8],x=n.map(w),e[4]=n,e[5]=i,e[6]=x}else x=e[6];let b;if(e[9]!==t||e[10]!==r||e[11]!==l||e[12]!==c||e[13]!==o||e[14]!==u||e[15]!==h||e[16]!==f||e[17]!==m||e[18]!==a){let w;e[20]!==t||e[21]!==r||e[22]!==c||e[23]!==o||e[24]!==u||e[25]!==h||e[26]!==f||e[27]!==m||e[28]!==a?(w=N=>s(Lt,{busy:t,copiedKey:r,handlers:c,object:N,prefix:o,references:u[N.key],resolveUrl:h,selected:f.has(N.key),showReferences:m,t:a},N.key),e[20]=t,e[21]=r,e[22]=c,e[23]=o,e[24]=u,e[25]=h,e[26]=f,e[27]=m,e[28]=a,e[29]=w):w=e[29],b=l.map(w),e[9]=t,e[10]=r,e[11]=l,e[12]=c,e[13]=o,e[14]=u,e[15]=h,e[16]=f,e[17]=m,e[18]=a,e[19]=b}else b=e[19];let C;return e[30]!==g||e[31]!==x||e[32]!==b?(C=T("div",{className:"grid gap-4","data-testid":"fb-gallery",style:g,children:[x,b]}),e[30]=g,e[31]=x,e[32]=b,e[33]=C):C=e[33],C},Ut=d=>{const e=M(23),{reference:t,t:r}=d,l=`fb-dangling-${t.table}-${t.id}-${t.column}`,n=`${t.table}·${t.id}`;let c;e[0]!==n?(c=s(ce,{variant:"secondary",children:n}),e[0]=n,e[1]=c):c=e[1];let i;e[2]!==t.column?(i=s("span",{className:"text-muted-foreground",children:t.column}),e[2]=t.column,e[3]=i):i=e[3];let o;e[4]!==r?(o=r("→"),e[4]=r,e[5]=o):o=e[5];let u;e[6]!==o?(u=s("span",{className:"text-muted-foreground/60",children:o}),e[6]=o,e[7]=u):u=e[7];let h;e[8]!==t.key?(h=s("code",{className:"rounded bg-muted px-1 py-0.5 font-mono text-foreground",children:t.key}),e[8]=t.key,e[9]=h):h=e[9];let f;e[10]!==c||e[11]!==i||e[12]!==u||e[13]!==h?(f=T("span",{className:"flex flex-wrap items-center gap-1.5",children:[c,i,u,h]}),e[10]=c,e[11]=i,e[12]=u,e[13]=h,e[14]=f):f=e[14];let m;e[15]!==r?(m=r("Missing object"),e[15]=r,e[16]=m):m=e[16];let k;e[17]!==m?(k=s(ce,{className:"border-destructive/40 text-destructive",variant:"outline",children:m}),e[17]=m,e[18]=k):k=e[18];let a;return e[19]!==l||e[20]!==k||e[21]!==f?(a=T("li",{className:"flex flex-wrap items-center justify-between gap-2 rounded-md border border-border/60 px-3 py-2 text-xs","data-testid":l,children:[f,k]}),e[19]=l,e[20]=k,e[21]=f,e[22]=a):a=e[22],a},_t=d=>{const e=M(37),{busy:t,onCheck:r,references:l,t:n,truncated:c}=d;let i;e[0]!==n?(i=n("Integrity"),e[0]=n,e[1]=i):i=e[1];let o;e[2]!==i?(o=s("span",{className:"font-mono text-[11px] uppercase tracking-wide text-muted-foreground",children:i}),e[2]=i,e[3]=o):o=e[3];let u;e[4]!==n?(u=n("Orphaned objects"),e[4]=n,e[5]=u):u=e[5];let h;e[6]!==u?(h=s("span",{className:"text-sm font-medium text-foreground",children:u}),e[6]=u,e[7]=h):h=e[7];let f;e[8]!==n?(f=n("Find records whose file reference points at an object the bucket no longer has."),e[8]=n,e[9]=f):f=e[9];let m;e[10]!==f?(m=s("span",{className:"text-xs text-muted-foreground",children:f}),e[10]=f,e[11]=m):m=e[11];let k;e[12]!==o||e[13]!==h||e[14]!==m?(k=T("div",{className:"flex flex-col gap-1",children:[o,h,m]}),e[12]=o,e[13]=h,e[14]=m,e[15]=k):k=e[15];let a;e[16]!==t||e[17]!==n?(a=n(t?"Checking…":"Check for orphans"),e[16]=t,e[17]=n,e[18]=a):a=e[18];let v;e[19]!==t||e[20]!==r||e[21]!==a?(v=s(se,{"data-testid":"fb-orphans-check",disabled:t,onClick:r,size:"sm",type:"button",variant:"outline",children:a}),e[19]=t,e[20]=r,e[21]=a,e[22]=v):v=e[22];let S;e[23]!==k||e[24]!==v?(S=T("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[k,v]}),e[23]=k,e[24]=v,e[25]=S):S=e[25];let y;e[26]!==l?.length||e[27]!==n?(y=l?.length===0&&s(Se,{description:n("Every record's file reference points at an object that exists in the bucket."),testId:"fb-orphans-empty",title:n("No dangling references.")}),e[26]=l?.length,e[27]=n,e[28]=y):y=e[28];let g;e[29]!==l||e[30]!==n||e[31]!==c?(g=l!==void 0&&l.length>0&&T(je,{children:[c&&s("p",{className:"text-xs text-warning","data-testid":"fb-orphans-truncated",children:n("Showing the first {count} dangling references — the scan was truncated.",{count:l.length})}),s("ul",{className:"flex flex-col gap-1.5","data-testid":"fb-orphans-list",children:l.map(b=>s(Ut,{reference:b,t:n},`${b.table}·${b.id}·${b.column}`))})]}),e[29]=l,e[30]=n,e[31]=c,e[32]=g):g=e[32];let x;return e[33]!==S||e[34]!==y||e[35]!==g?(x=T("section",{className:"flex flex-col gap-2 rounded-lg border border-border/60 p-3","data-testid":"fb-orphans",children:[S,y,g]}),e[33]=S,e[34]=y,e[35]=g,e[36]=x):x=e[36],x},Bt=function(d,e){const t=M(18);let r;t[0]===Symbol.for("react.memo_cache_sentinel")?(r=new Set,t[0]=r):r=t[0];const[l,n]=E(r);let c;t[1]===Symbol.for("react.memo_cache_sentinel")?(c=y=>{n(g=>{const x=new Set(g);return x.has(y)?x.delete(y):x.add(y),x})},t[1]=c):c=t[1];const i=c;let o;t[2]===Symbol.for("react.memo_cache_sentinel")?(o=()=>{n(new Set)},t[2]=o):o=t[2];const u=o;let h,f,m;if(t[3]!==d||t[4]!==e||t[5]!==l){let y;t[9]!==e?(y=g=>e(g),t[9]=e,t[10]=y):y=t[10],f=d.map(y),h=f.length>0&&f.every(g=>l.has(g)),m=!h&&f.some(g=>l.has(g)),t[3]=d,t[4]=e,t[5]=l,t[6]=h,t[7]=f,t[8]=m}else h=t[6],f=t[7],m=t[8];const k=m;let a;t[11]!==f?(a=()=>{n(y=>f.every(g=>y.has(g))?new Set:new Set(f))},t[11]=f,t[12]=a):a=t[12];const v=a;let S;return t[13]!==h||t[14]!==l||t[15]!==k||t[16]!==v?(S={allSelected:h,clear:u,selected:l,someSelected:k,toggle:i,toggleAll:v},t[13]=h,t[14]=l,t[15]=k,t[16]=v,t[17]=S):S=t[17],S},It=$e(ze.storageReferences),Mt=$e(ze.storageOrphans),ke=1e4,At=1e3,Pt=3600,Wt=(d,e)=>{if(!("document"in globalThis))return;const t=globalThis.document.createElement("a");t.href=d,t.download=e,t.rel="noopener",globalThis.document.body.append(t),t.click(),t.remove()},qt=d=>d.key,Gt=({initialPrefix:d,pageSize:e})=>{const t=gt(),[r,l]=E(d??""),[n,c]=E(d??""),[i,o]=E(St),[u,h]=E("list"),[f,m]=E(128),[k,a]=E("name"),[v,S]=E("asc"),[y,g]=E(void 0),[x,b]=E(void 0),[C,w]=E(!1),[N,z]=E(void 0),[$,D]=E(void 0),[K,F]=E(""),[U,L]=E({}),[B,R]=E(!1),[O,I]=E(void 0),[A,W]=E(!1),[P,G]=E(!1),[Y,re]=E([]),[Z,pe]=E(""),ne=he(0),Q=he(0);le(()=>{const p={cancelled:!1};return q((async()=>{try{const j=await t.listStorageBuckets();if(!p.cancelled){re(j);const[_]=j;_!==void 0&&pe(H=>H===""?_:H)}}catch{}})()),()=>{p.cancelled=!0}},[t]);const V=fe(()=>({list:p=>t.listStorageObjects({...p,bucket:Z}),remove:p=>t.deleteStorageObject(p,{bucket:Z}),signedUrl:(p,j)=>t.signedStorageUrl(p,{...j,bucket:Z}),upload:p=>t.uploadStorageObject({...p,bucket:Z})}),[Z,t]),X=nt(async(p,j,_)=>{ne.current+=1;const H=ne.current;b(void 0),w(!0);try{const J=await V.list({cursor:j,limit:e,prefix:p});if(H!==ne.current)return;g(ye=>_&&ye!==void 0?[...ye,...J.objects]:J.objects),D(J.cursor)}catch(J){if(H!==ne.current)return;_||g(void 0),b(ee(J))}finally{H===ne.current&&w(!1)}},[e,V]);le(()=>{q(X(d??"",void 0,!1))},[X,d]);const Re=(y?.length??0)<=e;bt(()=>{q(X(r,void 0,!1))},Re);const{files:de,folders:Le}=Ct(y??[],r),Oe=fe(()=>{const p=new Set;for(const j of de)for(const _ of Object.keys(j.customMetadata??{}))p.add(_);return[...p].toSorted((j,_)=>j.localeCompare(_))},[de]),ie=Nt(de,k,v),ue=fe(()=>[...new Set(ie.map(p=>p.key))].toSorted((p,j)=>p.localeCompare(j)).join(`
|
|
3
|
+
`),[ie]);le(()=>{const p=ue===""?[]:ue.split(`
|
|
4
|
+
`);if(p.length===0){L({});return}const j={current:!0};return q((async()=>{try{const _=await t.query(It,{keys:p},xe(K));j.current&&(L(_.references??{}),R(Object.keys(_.storageColumns??{}).length>0))}catch{j.current&&(L({}),R(!1))}})()),()=>{j.current=!1}},[t,ue,K]);const{allSelected:Ee,clear:ae,selected:ge,someSelected:Ue,toggle:_e,toggleAll:Be}=Bt(ie,qt),Ie=()=>{l(n),ae(),q(X(n,void 0,!1))},Me=()=>{q(X(r,$,!0))},be=p=>{l(p),c(p),ae(),q(X(p,void 0,!1))},Ae=p=>{be(`${r}${p}`)},Pe=p=>V.signedUrl(p,{expiresInSeconds:Pt}),We=()=>{h("list")},qe=()=>{h("grid")},Ge=p=>{a(p)},He=()=>{S(p=>p==="asc"?"desc":"asc")},Ze=p=>{m(p)},Ve=p=>{o(p)},Xe=()=>{b(void 0),w(!0),q((async()=>{try{for(const p of ge)await V.remove(p);await X(r,void 0,!1),ae()}catch(p){b(ee(p))}w(!1)})())},Ye=p=>{b(void 0),q((async()=>{try{const j=await V.signedUrl(p,{expiresInSeconds:i});ft(j)&&z(p)}catch(j){b(ee(j))}})())},Qe=p=>{b(void 0),q((async()=>{try{const j=await V.signedUrl(p,{expiresInSeconds:i}),_=p.slice(p.lastIndexOf("/")+1)||p;Wt(j,_)}catch(j){b(ee(j))}})())};le(()=>{if(N===void 0)return;const p=globalThis.setTimeout(()=>{z(void 0)},2e3);return()=>{globalThis.clearTimeout(p)}},[N]);const Je=p=>{b(void 0),w(!0),q((async()=>{try{await V.remove(p),await X(r,void 0,!1)}catch(j){b(ee(j))}w(!1)})())},et=p=>{const j=`${r}${p.name}`;b(void 0),w(!0),q((async()=>{try{const _=await p.arrayBuffer();await V.upload({body:_,contentType:p.type===""?void 0:p.type,key:j}),await X(r,void 0,!1)}catch(_){b(ee(_))}w(!1)})())};le(()=>{Q.current+=1,I(void 0),G(!1)},[K]);const tt=()=>{Q.current+=1;const p=Q.current;b(void 0),W(!0),q((async()=>{try{const j=[];let _;do{const H=await V.list({cursor:_,limit:At});for(const J of H.objects)j.push(J.key);_=j.length>=ke?void 0:H.cursor}while(_!==void 0);if(j.length>=ke)p===Q.current&&(I([]),G(!0));else{const H=await t.query(Mt,{liveKeys:j},xe(K));p===Q.current&&(I(H.references??[]),G(H.truncated===!0))}}catch(j){p===Q.current&&(I([]),G(!1),b(ee(j)))}p===Q.current&&W(!1)})())},rt=p=>{ne.current+=1,Q.current+=1,pe(p),l(d??""),c(d??""),g(void 0),I(void 0),G(!1),ae()};return{allSelected:Ee,bucket:Z,buckets:Y,bulkDelete:Xe,busy:C,checkOrphans:tt,clearSelection:ae,copiedKey:N,danglingBusy:A,danglingReferences:O,danglingTruncated:P,draftPrefix:n,enterFolder:Ae,error:x,expiry:i,files:ie,folders:Le,hasObjects:y!==void 0&&y.length>0,hasStorageColumns:B,listFirst:Ie,loaded:y!==void 0,loadMore:Me,navigate:be,nextCursor:$,onCopy:Ye,onDelete:Je,onDownload:Qe,onExpiryChange:Ve,onFile:et,onSortKeyChange:Ge,onThumbSizeChange:Ze,prefix:r,referenceShard:K,references:U,resolveUrl:Pe,selectBucket:rt,selected:ge,setDraftPrefix:c,setReferenceShard:F,showGrid:qe,showList:We,someSelected:Ue,sortDirection:v,sortKey:k,tagKeys:Oe,thumbSize:f,toggleSelect:_e,toggleSelectAll:Be,toggleSortDirection:He,view:u}},Ht=100,we=d=>{const e=M(6),{label:t,onNavigate:r,target:l}=d;let n;e[0]!==r||e[1]!==l?(n=()=>{r(l)},e[0]=r,e[1]=l,e[2]=n):n=e[2];const c=n;let i;return e[3]!==c||e[4]!==t?(i=s("button",{className:"rounded px-1 text-muted-foreground outline-none hover:text-foreground focus-visible:text-foreground",onClick:c,type:"button",children:t}),e[3]=c,e[4]=t,e[5]=i):i=e[5],i},Zt=d=>{const e=M(11),{onNavigate:t,prefix:r,t:l}=d;let n;if(e[0]!==t||e[1]!==r||e[2]!==l){const c=r.split("/").filter(Vt);let i;e[4]!==l?(i=l("Folder path"),e[4]=l,e[5]=i):i=e[5];let o;e[6]!==l?(o=l("root"),e[6]=l,e[7]=o):o=e[7];let u;e[8]!==t||e[9]!==o?(u=s(we,{label:o,onNavigate:t,target:""}),e[8]=t,e[9]=o,e[10]=u):u=e[10],n=T("nav",{"aria-label":i,className:"flex flex-wrap items-center gap-0.5 text-xs","data-testid":"fb-breadcrumbs",children:[u,c.map((h,f)=>T("span",{className:"flex items-center gap-0.5",children:[s("span",{className:"text-muted-foreground/50",children:"/"}),s(we,{label:h,onNavigate:t,target:`${c.slice(0,f+1).join("/")}/`})]},`${h}-${f.toString()}`))]}),e[0]=t,e[1]=r,e[2]=l,e[3]=n}else n=e[3];return n},pr=({initialPrefix:d,pageSize:e=Ht})=>{const t=lt(),r=Gt({initialPrefix:d,pageSize:e}),l=he(null),{onCopy:n,onDelete:c,onDownload:i,onFile:o,toggleSelect:u}=r,h={onCopy:n,onDelete:c,onDownload:i,onToggleSelect:u},f=()=>{l.current?.click()},m=a=>{const v=a.target,S=v.files?.[0];v.value="",S&&o(S)},k=r.loaded&&!r.hasObjects;return T("div",{className:"flex flex-col gap-3","data-testid":"lunora-file-browser",children:[s($t,{bucket:r.bucket,buckets:r.buckets,busy:r.busy,draftPrefix:r.draftPrefix,expiry:r.expiry,fileInputRef:l,onBucketChange:r.selectBucket,onExpiryChange:r.onExpiryChange,onFileChange:m,onList:r.listFirst,onPrefixChange:r.setDraftPrefix,onUploadClick:f,t}),r.loaded&&s(Zt,{onNavigate:r.navigate,prefix:r.prefix,t}),r.hasObjects&&s(jt,{onSortKeyChange:r.onSortKeyChange,onThumbSizeChange:r.onThumbSizeChange,showGrid:r.showGrid,showList:r.showList,sortDirection:r.sortDirection,sortKey:r.sortKey,t,tagKeys:r.tagKeys,thumbSize:r.thumbSize,toggleSortDirection:r.toggleSortDirection,view:r.view}),r.hasStorageColumns&&T("div",{className:"flex flex-wrap items-center gap-2","data-testid":"fb-references-shard",children:[s("label",{className:"text-xs text-muted-foreground",htmlFor:"fb-reference-shard-input",children:t("References shard")}),s(ot,{id:"fb-reference-shard-input",onChange:r.setReferenceShard,testId:"fb-reference-shard-input",value:r.referenceShard}),s("span",{className:"text-xs text-muted-foreground",children:t("Which shard's records are checked for references to these files. Empty = root shard.")})]}),r.hasStorageColumns&&s(_t,{busy:r.danglingBusy,onCheck:r.checkOrphans,references:r.danglingReferences,t,truncated:r.danglingTruncated}),r.selected.size>0&&s(st,{count:r.selected.size,editable:!0,onClear:r.clearSelection,onDelete:r.bulkDelete}),r.error!==void 0&&s("p",{className:"text-sm text-destructive","data-testid":"storage-error",role:"alert",children:r.error}),k&&s(Se,{description:t("Objects you upload to your R2 buckets will appear here."),icon:T("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[s("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"}),s("path",{d:"M12 11v5m-2.5-2.5h5"})]}),testId:"fb-empty",title:t("No objects.")}),r.hasObjects&&r.view==="list"&&s(kt,{allSelected:r.allSelected,busy:r.busy,copiedKey:r.copiedKey,files:r.files,folders:r.folders,handlers:h,onEnterFolder:r.enterFolder,prefix:r.prefix,references:r.references,selected:r.selected,showReferences:r.hasStorageColumns,someSelected:r.someSelected,t,toggleSelectAll:r.toggleSelectAll}),r.hasObjects&&r.view==="grid"&&s(Et,{busy:r.busy,copiedKey:r.copiedKey,files:r.files,folders:r.folders,handlers:h,onEnterFolder:r.enterFolder,prefix:r.prefix,references:r.references,resolveUrl:r.resolveUrl,selected:r.selected,showReferences:r.hasStorageColumns,size:r.thumbSize,t}),r.nextCursor!==void 0&&s("div",{children:s(se,{"data-testid":"fb-next",disabled:r.busy,onClick:r.loadMore,size:"sm",type:"button",variant:"outline",children:t("Load more")})})]})};function Vt(d){return d!==""}export{pr as FileBrowser};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useLunora as G}from"@lunora/react";import{useState as o,useEffect as H}from"react";import{ShardInput as Q}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as T}from"../packem_shared/badge-BbuuAio7.js";import{u as y}from"../packem_shared/button-BkCrNcAs.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as N}from"../packem_shared/label-6uP1obNF.js";import{l as W}from"../packem_shared/textarea-Bu2-jKAs.js";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-
|
|
1
|
+
import{useLunora as G}from"@lunora/react";import{useState as o,useEffect as H}from"react";import{ShardInput as Q}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as T}from"../packem_shared/badge-BbuuAio7.js";import{u as y}from"../packem_shared/button-BkCrNcAs.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as N}from"../packem_shared/label-6uP1obNF.js";import{l as W}from"../packem_shared/textarea-Bu2-jKAs.js";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{b as ee,i as te,f as re,j as ae,g as se}from"../packem_shared/internal-BSIsQVC6.js";import{r as ne}from"../packem_shared/shard-history-DMEW5VBE.js";import{jsxs as n,jsx as r}from"react/jsx-runtime";const ie=t=>t.kind==="id"?t.table===void 0?"id":`id<${t.table}>`:t.kind==="array"?t.element===void 0?"array":`${t.element}[]`:t.kind,oe=t=>t===void 0||t.length===0?"()":`(${t.map(i=>`${i.name}${i.optional?"?":""}: ${ie(i)}`).join(", ")})`,de=t=>{switch(t){case"array":return[];case"bigint":case"number":return 0;case"boolean":return!1;case"object":case"record":return{};default:return""}},le=t=>{const i={};for(const a of t??[])a.optional||(i[a.name]=de(a.kind));return JSON.stringify(i,void 0,2)},ce=se(Z.runAs),ue=10,me=t=>t===void 0?"undefined":JSON.stringify(t,null,2),Ie=({functions:t,runAsIdentity:i=!1}={})=>{const a=Y(),u=G(),[J,K]=o(null),[w,L]=o(null),p=t??J??[],[k,S]=o(""),[m,g]=o("{}"),[c,$]=o(""),[f,z]=o(""),[x,h]=o("idle"),[M,b]=o(void 0),[I,v]=o(null),[F,P]=o([]);H(()=>{if(t!==void 0)return;let e=!1;return u.listFunctions().then(d=>(e||K(d),d)).catch(d=>{e||L(ee(d))}),()=>{e=!0}},[u,t]);const C=k===""?p[0]?.path??"":k,s=p.find(e=>e.path===C),_=async()=>{if(!s)return;let e;try{e=m.trim()===""?{}:JSON.parse(m)}catch(l){h("error"),b(void 0),v(a("Invalid JSON args: {message}",{message:l.message}));return}const d={__lunoraRef:s.path},R=c.trim()===""?{}:{shardKey:c.trim()},j=i?f.trim():"",A=l=>{P(O=>[{argsText:m,at:Date.now(),id:(O[0]?.id??0)+1,kind:s.kind,path:s.path,shardKey:c,status:l},...O].slice(0,ue))};h("running"),v(null);try{const l=j===""?await ae(u,s.kind,d,e,R):await u.query(ce,{args:e,functionPath:s.path,userId:j},R);ne(c),b(l),h("success"),A("success")}catch(l){b(void 0),v(l.message),h("error"),A("error")}},q=e=>{S(e.path),g(e.argsText),$(e.shardKey)},B=e=>{S(e.target.value)},D=e=>{g(e.target.value)},E=e=>{z(e.target.value)},U=()=>{re(_())},X=()=>{g(le(s?.args))};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-runner",children:[w!==null&&r("p",{className:"text-sm text-destructive","data-testid":"function-discover-error",role:"alert",children:w}),n("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4",children:[n("div",{className:"flex flex-col gap-1.5",children:[r(N,{htmlFor:"function-select",children:a("Function")}),r("select",{"aria-label":a("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50","data-testid":"function-select",id:"function-select",onChange:B,value:C,children:p.map(e=>n("option",{value:e.path,children:[e.path," (",e.kind,")"]},e.path))}),s!==void 0&&n("p",{className:"text-xs text-muted-foreground",children:[r("span",{className:"mr-1.5 font-medium",children:a("Signature")}),r("code",{className:"font-mono","data-testid":"function-signature",children:oe(s.args)})]})]}),n("div",{className:"flex flex-col gap-1.5",children:[n("div",{className:"flex items-center justify-between gap-2",children:[r(N,{htmlFor:"args-input",children:a("Arguments")}),r(y,{"data-testid":"prefill-button",disabled:s===void 0,onClick:X,size:"xs",type:"button",variant:"ghost",children:a("Prefill")})]}),r(W,{"aria-label":a("Arguments"),className:"font-mono text-xs","data-testid":"args-input",id:"args-input",onChange:D,value:m})]}),r(Q,{onChange:$,testId:"shard-input",value:c}),i&&n("div",{className:"flex flex-col gap-1.5","data-testid":"run-as-field",children:[r(N,{htmlFor:"run-as-input",children:a("Run as identity (userId)")}),r(V,{"aria-label":a("Run as identity (userId)"),className:"font-mono text-xs","data-testid":"run-as-input",id:"run-as-input",onChange:E,placeholder:a("Leave empty to run as admin"),value:f}),r("p",{className:"text-[11px] text-muted-foreground",children:a("Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.")})]}),n("div",{className:"flex flex-wrap items-center gap-2",children:[r(y,{"data-testid":"run-button",disabled:x==="running"||s===void 0,onClick:U,type:"button",children:a("Run")}),s!==void 0&&r(T,{variant:"outline",children:s.kind}),i&&f.trim()!==""&&r(T,{"data-testid":"run-as-badge",variant:"secondary",children:a("as {userId}",{userId:f.trim()})})]})]}),x==="error"&&I!==null&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"error",role:"alert",children:I}),x==="success"&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"result",children:me(M)}),F.length>0&&r("ul",{className:"flex flex-col overflow-hidden rounded-xl border border-border","data-testid":"fn-history",children:F.map((e,d)=>n("li",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-sm last:border-b-0","data-testid":"fn-history-row",children:[r("span",{className:e.status==="success"?"text-success":"text-destructive","data-testid":`fn-history-status-${d.toString()}`,children:e.status==="success"?"✓":"✗"})," ",n("span",{className:"font-mono text-xs",children:[e.path," (",e.kind,")"]})," ",r("time",{className:"text-xs text-muted-foreground",children:te(e.at)})," ",r(y,{className:"ml-auto","data-testid":`fn-history-load-${d.toString()}`,onClick:()=>{q(e)},size:"xs",type:"button",variant:"ghost",children:a("Load")})]},e.id))})]})};export{Ie as FunctionRunner};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as W}from"react/compiler-runtime";import{useState as
|
|
1
|
+
import{c as W}from"react/compiler-runtime";import{useState as K}from"react";import{E as G}from"../packem_shared/error-alert-t6cpEi0z.js";import{L as J}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as V}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as X}from"../packem_shared/badge-BbuuAio7.js";import{u as Y}from"../packem_shared/button-BkCrNcAs.js";import{c as Z,u as tt}from"../packem_shared/card-CIDGUN6K.js";import{E as et}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as rt,d as at,m as P,p as l,f as st,u as n}from"../packem_shared/table-DdJBrClo.js";import{N as lt}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import nt from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ot}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as it}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{i as ct}from"../packem_shared/internal-BSIsQVC6.js";import{c as z}from"../packem_shared/utils-bhneXptQ.js";import{jsx as e,jsxs as y}from"react/jsx-runtime";const dt={action:"outline",mutation:"default",query:"secondary"},O=r=>r<1e3?`${r<10?r.toFixed(1):Math.round(r).toString()}ms`:`${(r/1e3).toFixed(2)}s`,mt=r=>r.calls===0?"—":r.errors===0?"0":`${r.errors.toString()} (${(r.errors/r.calls*100).toFixed(1)}%)`,ut=r=>{const t=r.conflicts??0;return r.calls===0?"—":t===0?"0":`${t.toString()} (${(t/r.calls*100).toFixed(1)}%)`},ht={calls:(r,t)=>t.calls-r.calls,recent:(r,t)=>t.lastCalledAt-r.lastCalledAt,slowest:(r,t)=>t.maxDurationMs-r.maxDurationMs},Dt=r=>{const t=W(47),{functions:_,initialShardKey:R}=r,s=ot(),[o,U]=K(R??""),[i,B]=K("recent");let S;t[0]!==o?(S=o.trim(),t[0]=o,t[1]=S):S=t[1];const T=nt(S,400);let M;t[2]===Symbol.for("react.memo_cache_sentinel")?(M={},t[2]=M):M=t[2];let w;t[3]!==T?(w={live:!0,shardKey:T},t[3]=T,t[4]=w):w=t[4];const{data:H,error:c,errorSource:$,liveError:v}=lt(it.getFunctionStats,M,w),b=H?.functions??null;let E;t[5]!==_?(E=new Map((_??[]).map(ft)),t[5]=_,t[6]=E):E=t[6];const L=E;let C;t[7]===Symbol.for("react.memo_cache_sentinel")?(C=k=>{B(k.currentTarget.dataset.sort)},t[7]=C):C=t[7];const Q=C;let F;if(t[8]!==c||t[9]!==$||t[10]!==L||t[11]!==v||t[12]!==o||t[13]!==i||t[14]!==b||t[15]!==s){const k=b===null?[]:b.toSorted(ht[i]);let d;t[17]!==s?(d=s("Recent"),t[17]=s,t[18]=d):d=t[18];let m;t[19]!==d?(m={key:"recent",label:d},t[19]=d,t[20]=m):m=t[20];let u;t[21]!==s?(u=s("Most called"),t[21]=s,t[22]=u):u=t[22];let h;t[23]!==u?(h={key:"calls",label:u},t[23]=u,t[24]=h):h=t[24];let f;t[25]!==s?(f=s("Slowest"),t[25]=s,t[26]=f):f=t[26];let p;t[27]!==f?(p={key:"slowest",label:f},t[27]=f,t[28]=p):p=t[28];let I;t[29]!==h||t[30]!==p||t[31]!==m?(I=[m,h,p],t[29]=h,t[30]=p,t[31]=m,t[32]=I):I=t[32];const j=I;let x;t[33]!==o?(x=e(V,{onChange:U,testId:"fs-shard-input",value:o}),t[33]=o,t[34]=x):x=t[34];let g;t[35]!==v?(g=e(J,{message:v,prefix:"fs"}),t[35]=v,t[36]=g):g=t[36];let N;t[37]!==j||t[38]!==i?(N=e("div",{className:"ml-auto flex items-center gap-1",role:"group",children:j.map(a=>e(Y,{"data-sort":a.key,"data-testid":`fs-sort-${a.key}`,onClick:Q,size:"sm",type:"button",variant:i===a.key?"secondary":"ghost",children:a.label},a.key))}),t[37]=j,t[38]=i,t[39]=N):N=t[39];let A;t[40]!==x||t[41]!==g||t[42]!==N?(A=y("div",{className:"flex flex-wrap items-center gap-2",children:[x,g,N]}),t[40]=x,t[41]=g,t[42]=N,t[43]=A):A=t[43];let D;t[44]!==c||t[45]!==$?(D=c!==null&&e(G,{error:$,testId:"fs-error"}),t[44]=c,t[45]=$,t[46]=D):D=t[46],F=y("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-stats",children:[A,D,b!==null&&k.length===0&&c===null&&e(et,{description:s("Per-function call counts, error rates, and latency land here after your first request."),icon:y("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[e("path",{d:"M3 3v18h18"}),e("path",{d:"M7 14l4-4 3 3 5-6"})]}),testId:"fs-empty",title:s("No functions have run on this shard yet.")}),k.length>0&&e(Z,{className:"overflow-hidden py-0",children:e(tt,{className:"px-0",children:y(rt,{"data-testid":"fs-table",children:[e(at,{children:y(P,{children:[e(l,{children:s("function")}),e(l,{children:s("kind")}),e(l,{className:"text-right",children:s("calls")}),e(l,{className:"text-right",children:s("errors")}),e(l,{className:"text-right",children:s("conflicts")}),e(l,{className:"text-right",children:s("avg")}),e(l,{className:"text-right",children:s("max")}),e(l,{children:s("last run")}),e(l,{children:s("last error")})]})}),e(st,{children:k.map(a=>{const q=L.get(a.path);return y(P,{"data-testid":`fs-row-${a.path}`,children:[e(n,{className:"font-medium",children:a.path}),e(n,{children:q===void 0?e("span",{className:"text-muted-foreground",children:"—"}):e(X,{variant:dt[q],children:q})}),e(n,{className:"text-right tabular-nums",children:a.calls}),e(n,{className:z("text-right tabular-nums",a.errors>0&&"text-destructive"),children:mt(a)}),e(n,{className:z("text-right tabular-nums",(a.conflicts??0)>0&&"text-warning"),children:ut(a)}),e(n,{className:"text-right tabular-nums",children:a.calls===0?"—":O(a.totalDurationMs/a.calls)}),e(n,{className:"text-right tabular-nums",children:a.calls===0?"—":O(a.maxDurationMs)}),e(n,{className:"text-muted-foreground",children:ct(a.lastCalledAt,"—")}),e(n,{className:"max-w-[24ch] truncate text-destructive",title:a.lastErrorMessage??void 0,children:a.lastErrorMessage??e("span",{className:"text-muted-foreground",children:"—"})})]},a.path)})})]})})})]}),t[8]=c,t[9]=$,t[10]=L,t[11]=v,t[12]=o,t[13]=i,t[14]=b,t[15]=s,t[16]=F}else F=t[16];return F};function ft(r){return[r.path,r.kind]}export{Dt as FunctionStatsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as fe}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useState as b,useRef as P,useEffect as T,useCallback as he,useMemo as ge}from"react";import xe from"../packem_shared/ConnectionBadge-DOk0CQWo.js";import{L as ve}from"../packem_shared/live-status-CGW2JHf_.js";import{g as C}from"../packem_shared/badge-BbuuAio7.js";import{c as k}from"../packem_shared/card-CIDGUN6K.js";import{K as be}from"../packem_shared/use-admin-query-Di3fLE8H.js";import{useT as Ne}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as y}from"../packem_shared/ADMIN_FUNCTIONS-CpgIo9pj.js";import{f as B,i as ye,c as Z,e as ee,a as M}from"../packem_shared/internal-AtZ4bTal.js";import{l as we}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as S}from"../packem_shared/utils-bhneXptQ.js";import{shardsToAggregate as ke}from"../packem_shared/aggregateMetrics-BNfajLa2.js";import{S as G}from"../packem_shared/sparkline-DtcZoU48.js";import{jsxs as i,jsx as s}from"react/jsx-runtime";const te={completed:0,failed:2,in_progress:1},Se=l=>{let e=0,r=0,t=0,n=0;const u=[];for(const{metrics:m}of l){if(m===null){n+=1;continue}t+=1,e+=m.requests,r+=m.errors,u.push(...m.history??[])}return{errors:r,failed:n,history:u,reachable:t,requests:e}},Me=l=>{const e=new Map;for(const r of l)for(const t of r){const n=e.get(t.path);if(n===void 0){e.set(t.path,{...t});continue}n.calls+=t.calls,n.errors+=t.errors,n.totalDurationMs+=t.totalDurationMs,n.scans=(n.scans??0)+(t.scans??0),n.maxDurationMs=Math.max(n.maxDurationMs,t.maxDurationMs),n.lastCalledAt=Math.max(n.lastCalledAt,t.lastCalledAt),(t.lastErrorAt??0)>(n.lastErrorAt??0)&&(n.lastErrorAt=t.lastErrorAt,n.lastErrorMessage=t.lastErrorMessage)}return[...e.values()]},qe=l=>{const e=new Map;for(const r of l)for(const t of r){const n=e.get(t.id);if(n===void 0){e.set(t.id,t);continue}const u=te[t.status]-te[n.status];(u>0||u===0&&(t.updatedAt??0)>(n.updatedAt??0))&&e.set(t.id,t)}return[...e.values()]},Ae=M(y.getAuthMetrics),Ee=M(y.getFunctionStats),je=M(y.getLogs),De=M(y.getMetrics),Ie=M(y.migrationStatus),Le=5,re=2e3,$e=5,se=.01,ae=.05,Pe=.1,Te=.3,Ce=1,Fe=50,V=(l,e,r)=>l>=r?"crit":l>=e?"warn":"ok",Re=(l,e,r)=>l>=r?"crit":l>=e?"warn":"ok",Oe={crit:"destructive",ok:"secondary",warn:"default"},F=(l,e)=>e===0?"—":`${(l/e*100).toFixed(1)}%`,_e=l=>{const e=new Map;for(const t of l??[]){const n=e.get(t.bucketMs)??{calls:0,errors:0};n.calls+=t.calls,n.errors+=t.errors,e.set(t.bucketMs,n)}const r=[...e.entries()].toSorted((t,n)=>t[0]-n[0]);return{errors:r.map(([,t])=>t.errors),requests:r.map(([,t])=>t.calls)}},ze=l=>{let e=0,r=0;for(const n of l)n.status==="failed"?e+=1:n.status==="in_progress"&&(r+=1);let t="ok";return e>0?t="crit":r>0&&(t="warn"),{failed:e,level:t,running:r}},Ke=(l,e)=>l.failed>0?e("{count} failed",{count:l.failed.toString()}):l.running>0?e("{count} running",{count:l.running.toString()}):e("OK"),le={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ne={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},He={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},Ue=l=>l.includes("crit")?"crit":l.includes("warn")?"warn":"ok",R=l=>{const e=fe(19),{chart:r,label:t,level:n,testId:u,value:m}=l,c=le[n];let p;e[0]!==c?(p=S("size-1.5 shrink-0 rounded-full",c),e[0]=c,e[1]=p):p=e[1];let f;e[2]!==p?(f=s("span",{"aria-hidden":"true",className:p}),e[2]=p,e[3]=f):f=e[3];let h;e[4]!==t||e[5]!==f?(h=i("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[f,t]}),e[4]=t,e[5]=f,e[6]=h):h=e[6];const N=ne[n];let d;e[7]!==N?(d=S("truncate text-2xl font-semibold tabular-nums",N),e[7]=N,e[8]=d):d=e[8];let o;e[9]!==d||e[10]!==u||e[11]!==m?(o=s("span",{className:d,"data-testid":u,children:m}),e[9]=d,e[10]=u,e[11]=m,e[12]=o):o=e[12];let g;e[13]!==r||e[14]!==o?(g=i("div",{className:"flex items-center justify-between gap-3",children:[o,r]}),e[13]=r,e[14]=o,e[15]=g):g=e[15];let x;return e[16]!==h||e[17]!==g?(x=s(k,{className:"gap-0 py-0",children:i("div",{className:"flex flex-col gap-2.5 p-4",children:[h,g]})}),e[16]=h,e[17]=g,e[18]=x):x=e[18],x},Be=async(l,e,r)=>{const t=await Promise.all(r.map(d=>{const o=Z(d);return Promise.allSettled([l.query(De,{},o),l.query(Ee,{},o),l.query(Ie,{},o)])})),n=Z(e),u=typeof l.schedulerStatus=="function"?l.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[m,c,p]=await Promise.allSettled([l.query(je,{},n),l.query(Ae,{},n),u]),f=t.map(([d,o,g])=>({functions:o.status==="fulfilled"?o.value.functions:[],metrics:d.status==="fulfilled"?d.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),h=Se(f),N=t[0]?.[0];return{auth:c.status==="fulfilled"?c.value:null,entries:m.status==="fulfilled"?m.value.entries:[],functions:Me(f.map(d=>d.functions)),logsError:m.status==="rejected"?ee(m.reason):null,metricsError:h.reachable===0&&N?.status==="rejected"?ee(N.reason):null,migrations:qe(f.map(d=>d.migrations)),scheduler:p.status==="fulfilled"?p.value:null,totals:h}},ot=({initialShardKey:l})=>{const e=pe(),r=Ne(),[t,n]=b([]),[u,m]=b(null),[c,p]=b(null),[f,h]=b(null),[N,d]=b([]),[o,g]=b(null),[x,ie]=b(null),[oe,ce]=b([]),[w]=b(we),q=P(!1),O=P(!0);T(()=>(O.current=!0,()=>{O.current=!1}),[]);const A=l??"",E=he(async()=>{if(q.current)return;q.current=!0;const a=await Be(e,A,ke(A,w));if(!O.current){q.current=!1;return}p(a.totals),h(a.metricsError),d(a.functions),ce(a.migrations),n(a.entries),m(a.logsError),g(a.auth),ie(a.scheduler),q.current=!1},[e,w,A]);T(()=>{B(E())},[E]);const _=P(0),j=P(null),de=()=>{const a=Date.now()-_.current;if(a>=re){_.current=Date.now(),B(E());return}j.current??=setTimeout(()=>{j.current=null,_.current=Date.now(),B(E())},re-a)};T(()=>()=>{j.current!==null&&clearTimeout(j.current)},[]);const{data:J,liveError:ue}=be(y.getMetrics,{},{live:!0,shardKey:A});T(()=>{J!==void 0&&de()},[J]);const z=t.filter(a=>a.level==="error"),K=z.slice(0,Le),D=_e(c?.history),Q=ge(()=>{const a=o?.history??[];return{attempts:a.map(v=>v.attempts),failures:a.map(v=>v.failures)}},[o?.history]),W=N.filter(a=>a.calls>0).toSorted((a,v)=>v.errors/v.calls-a.errors/a.calls||v.calls-a.calls).slice(0,$e),H=ze(oe),me=c===null||c.requests===0?0:c.errors/c.requests,U=V(me,se,ae),X=o===null?"ok":V(o.failureRate,Pe,Te),Y=x===null?"ok":Re(x.backlog,Ce,Fe),I=Ue([U,X,Y,H.level]);let L,$;return I==="crit"?(L=r("Critical"),$=r("One or more service levels are breached.")):I==="warn"?(L=r("Degraded"),$=r("Some service levels need attention.")):(L=r("All systems healthy"),$=r("All service levels are within target.")),i("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[i(k,{className:"gap-0 py-0",children:[i("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[i("div",{className:"flex items-center gap-3",children:[s("span",{"aria-hidden":"true",className:S("flex size-10 shrink-0 items-center justify-center rounded-full",He[I]),children:s("span",{className:S("size-3 rounded-full",le[I])})}),i("div",{className:"grid leading-tight",children:[s("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:L}),s("span",{className:"text-[13px] text-muted-foreground",children:$})]})]}),i("div",{className:"flex flex-wrap items-center gap-4",children:[i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Requests")}),i("div",{className:"flex items-center justify-end gap-2",children:[D.requests.length>=2&&s(G,{ariaLabel:r("Requests over time"),className:"h-6 w-20 text-foreground",series:D.requests,testId:"hl-spark-requests"}),s("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:(c?.requests??0).toString()})]})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Error rate")}),s("div",{className:S("text-lg font-semibold tabular-nums",ne[U]),"data-testid":"hl-error-rate",children:c===null?"—":F(c.errors,c.requests)})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"flex items-center gap-2",children:[s(xe,{}),s(ve,{message:ue,prefix:"hl"})]})]})]}),f!==null&&s("div",{className:"border-t border-border bg-destructive/5 px-4 py-2 text-sm text-destructive","data-testid":"hl-metrics-error",role:"alert",children:f})]}),i("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[s(R,{chart:D.errors.length>=2?s(G,{ariaLabel:r("Errors over time"),className:"h-7 w-20 text-destructive",series:D.errors,testId:"hl-spark-errors"}):void 0,label:r("Error rate"),level:U,testId:"hl-slo-errorrate",value:c===null?"—":F(c.errors,c.requests)}),s(R,{chart:Q.failures.length>=2?s(G,{ariaLabel:r("Auth failures over time"),className:"h-7 w-20 text-destructive",series:Q.failures,testId:"hl-spark-auth"}):void 0,label:r("Auth failures"),level:X,testId:"hl-slo-auth",value:o===null?"—":F(o.failures,o.attempts)}),s(R,{label:r("Scheduler backlog"),level:Y,testId:"hl-slo-backlog",value:x===null?"—":x.backlog.toString()}),s(R,{label:r("Migrations"),level:H.level,testId:"hl-slo-migrations",value:Ke(H,r)})]}),i("div",{className:"grid gap-3 lg:grid-cols-2",children:[i(k,{className:"gap-0 py-0","data-testid":"hl-functions",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Functions by error rate")})}),W.length===0?s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:r("No function activity yet.")}):s("ul",{className:"divide-y divide-border",children:W.map(a=>i("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[s("span",{className:"truncate font-mono text-foreground",children:a.path}),i("span",{className:"flex shrink-0 items-center gap-2",children:[s("span",{className:"tabular-nums text-muted-foreground",children:r("{count} calls",{count:a.calls.toString()})}),s(C,{variant:Oe[V(a.errors/a.calls,se,ae)],children:F(a.errors,a.calls)})]})]},a.path))})]}),i(k,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Recent errors")}),s(C,{"data-testid":"hl-error-count",variant:z.length>0?"destructive":"outline",children:z.length})]}),u!==null&&s("p",{className:"px-4 py-8 text-center text-sm text-destructive","data-testid":"hl-logs-error",role:"alert",children:u}),u===null&&K.length===0&&s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:r("No recent errors.")}),K.length>0&&s("ul",{className:"divide-y divide-border",children:K.map((a,v)=>i("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[i("span",{className:"flex items-center gap-2",children:[s("time",{className:"shrink-0 text-muted-foreground",children:ye(a.timestamp)}),a.functionPath!==void 0&&s("span",{className:"truncate font-mono text-foreground",children:a.functionPath})]}),s("span",{className:"text-destructive",children:a.message})]},`${a.timestamp.toString()}-${v.toString()}`))})]})]}),i(k,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Shards seen")}),s(C,{"data-testid":"hl-shard-count",variant:"outline",children:w.length})]}),w.length>0&&s("ul",{className:"flex flex-wrap gap-1.5 p-4",children:w.map(a=>s("li",{"data-testid":"hl-shard",children:s(C,{variant:"secondary",children:a})},a))})]})]})};export{ot as HealthPanel};
|
|
1
|
+
import{c as fe}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useState as v,useRef as P,useEffect as C,useCallback as he}from"react";import ge from"../packem_shared/ConnectionBadge-DOk0CQWo.js";import{L as xe}from"../packem_shared/live-status-CmuRLFKf.js";import{g as F}from"../packem_shared/badge-BbuuAio7.js";import{c as S}from"../packem_shared/card-CIDGUN6K.js";import{N as ve}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import{useT as Ne}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as b}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{f as B,i as be,d as Z,b as ee,g as q}from"../packem_shared/internal-BSIsQVC6.js";import{l as we}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as M}from"../packem_shared/utils-bhneXptQ.js";import{shardsToAggregate as ye}from"../packem_shared/aggregateMetrics-BNfajLa2.js";import{S as G}from"../packem_shared/sparkline-CgjeUU2I.js";import{jsxs as i,jsx as s}from"react/jsx-runtime";const te={completed:0,failed:2,in_progress:1},ke=a=>{let e=0,t=0,r=0,l=0;const u=[];for(const{metrics:m}of a){if(m===null){l+=1;continue}r+=1,e+=m.requests,t+=m.errors,u.push(...m.history??[])}return{errors:t,failed:l,history:u,reachable:r,requests:e}},Se=a=>{const e=new Map;for(const t of a)for(const r of t){const l=e.get(r.path);if(l===void 0){e.set(r.path,{...r});continue}l.calls+=r.calls,l.errors+=r.errors,l.totalDurationMs+=r.totalDurationMs,l.scans=(l.scans??0)+(r.scans??0),l.maxDurationMs=Math.max(l.maxDurationMs,r.maxDurationMs),l.lastCalledAt=Math.max(l.lastCalledAt,r.lastCalledAt),(r.lastErrorAt??0)>(l.lastErrorAt??0)&&(l.lastErrorAt=r.lastErrorAt,l.lastErrorMessage=r.lastErrorMessage)}return[...e.values()]},Me=a=>{const e=new Map;for(const t of a)for(const r of t){const l=e.get(r.id);if(l===void 0){e.set(r.id,r);continue}const u=te[r.status]-te[l.status];(u>0||u===0&&(r.updatedAt??0)>(l.updatedAt??0))&&e.set(r.id,r)}return[...e.values()]},qe=q(b.getAuthMetrics),Ae=q(b.getFunctionStats),Ee=q(b.getLogs),je=q(b.getMetrics),De=q(b.migrationStatus),Ie=5,re=2e3,$e=5,se=.01,ae=.05,Le=.1,Pe=.3,Ce=1,Fe=50,V=(a,e,t)=>a>=t?"crit":a>=e?"warn":"ok",Te=(a,e,t)=>a>=t?"crit":a>=e?"warn":"ok",Oe={crit:"destructive",ok:"secondary",warn:"default"},T=(a,e)=>e===0?"—":`${(a/e*100).toFixed(1)}%`,Re=a=>{const e=new Map;for(const r of a??[]){const l=e.get(r.bucketMs)??{calls:0,errors:0};l.calls+=r.calls,l.errors+=r.errors,e.set(r.bucketMs,l)}const t=[...e.entries()].toSorted((r,l)=>r[0]-l[0]);return{errors:t.map(([,r])=>r.errors),requests:t.map(([,r])=>r.calls)}},_e=a=>{let e=0,t=0;for(const l of a)l.status==="failed"?e+=1:l.status==="in_progress"&&(t+=1);let r="ok";return e>0?r="crit":t>0&&(r="warn"),{failed:e,level:r,running:t}},ze=(a,e)=>a.failed>0?e("{count} failed",{count:a.failed.toString()}):a.running>0?e("{count} running",{count:a.running.toString()}):e("OK"),le={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ne={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},He={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},Ke=a=>a.includes("crit")?"crit":a.includes("warn")?"warn":"ok",O=a=>{const e=fe(19),{chart:t,label:r,level:l,testId:u,value:m}=a,c=le[l];let p;e[0]!==c?(p=M("size-1.5 shrink-0 rounded-full",c),e[0]=c,e[1]=p):p=e[1];let f;e[2]!==p?(f=s("span",{"aria-hidden":"true",className:p}),e[2]=p,e[3]=f):f=e[3];let h;e[4]!==r||e[5]!==f?(h=i("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[f,r]}),e[4]=r,e[5]=f,e[6]=h):h=e[6];const N=ne[l];let d;e[7]!==N?(d=M("truncate text-2xl font-semibold tabular-nums",N),e[7]=N,e[8]=d):d=e[8];let o;e[9]!==d||e[10]!==u||e[11]!==m?(o=s("span",{className:d,"data-testid":u,children:m}),e[9]=d,e[10]=u,e[11]=m,e[12]=o):o=e[12];let g;e[13]!==t||e[14]!==o?(g=i("div",{className:"flex items-center justify-between gap-3",children:[o,t]}),e[13]=t,e[14]=o,e[15]=g):g=e[15];let x;return e[16]!==h||e[17]!==g?(x=s(S,{className:"gap-0 py-0",children:i("div",{className:"flex flex-col gap-2.5 p-4",children:[h,g]})}),e[16]=h,e[17]=g,e[18]=x):x=e[18],x},Ue=async(a,e,t)=>{const r=await Promise.all(t.map(d=>{const o=Z(d);return Promise.allSettled([a.query(je,{},o),a.query(Ae,{},o),a.query(De,{},o)])})),l=Z(e),u=typeof a.schedulerStatus=="function"?a.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[m,c,p]=await Promise.allSettled([a.query(Ee,{},l),a.query(qe,{},l),u]),f=r.map(([d,o,g])=>({functions:o.status==="fulfilled"?o.value.functions:[],metrics:d.status==="fulfilled"?d.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),h=ke(f),N=r[0]?.[0];return{auth:c.status==="fulfilled"?c.value:null,entries:m.status==="fulfilled"?m.value.entries:[],functions:Se(f.map(d=>d.functions)),logsError:m.status==="rejected"?ee(m.reason):null,metricsError:h.reachable===0&&N?.status==="rejected"?ee(N.reason):null,migrations:Me(f.map(d=>d.migrations)),scheduler:p.status==="fulfilled"?p.value:null,totals:h}},Be=a=>{const e=a?.history??[];return{attempts:e.map(t=>t.attempts),failures:e.map(t=>t.failures)}},ot=({initialShardKey:a})=>{const e=pe(),t=Ne(),[r,l]=v([]),[u,m]=v(null),[c,p]=v(null),[f,h]=v(null),[N,d]=v([]),[o,g]=v(null),[x,ie]=v(null),[oe,ce]=v([]),[w]=v(we),A=P(!1),R=P(!0);C(()=>(R.current=!0,()=>{R.current=!1}),[]);const E=a??"",j=he(async()=>{if(A.current)return;A.current=!0;const n=await Ue(e,E,ye(E,w));if(!R.current){A.current=!1;return}p(n.totals),h(n.metricsError),d(n.functions),ce(n.migrations),l(n.entries),m(n.logsError),g(n.auth),ie(n.scheduler),A.current=!1},[e,w,E]);C(()=>{B(j())},[j]);const _=P(0),y=P(null),de=()=>{const n=Date.now()-_.current;if(n>=re){_.current=Date.now(),B(j());return}y.current===null&&(y.current=setTimeout(()=>{y.current=null,_.current=Date.now(),B(j())},re-n))};C(()=>()=>{y.current!==null&&clearTimeout(y.current)},[]);const{data:J,liveError:ue}=ve(b.getMetrics,{},{live:!0,shardKey:E});C(()=>{J!==void 0&&de()},[J]);const z=r.filter(n=>n.level==="error"),H=z.slice(0,Ie),D=Re(c?.history),Q=Be(o),W=N.filter(n=>n.calls>0).toSorted((n,k)=>k.errors/k.calls-n.errors/n.calls||k.calls-n.calls).slice(0,$e),K=_e(oe),me=c===null||c.requests===0?0:c.errors/c.requests,U=V(me,se,ae),X=o===null?"ok":V(o.failureRate,Le,Pe),Y=x===null?"ok":Te(x.backlog,Ce,Fe),I=Ke([U,X,Y,K.level]);let $,L;return I==="crit"?($=t("Critical"),L=t("One or more service levels are breached.")):I==="warn"?($=t("Degraded"),L=t("Some service levels need attention.")):($=t("All systems healthy"),L=t("All service levels are within target.")),i("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[i(S,{className:"gap-0 py-0",children:[i("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[i("div",{className:"flex items-center gap-3",children:[s("span",{"aria-hidden":"true",className:M("flex size-10 shrink-0 items-center justify-center rounded-full",He[I]),children:s("span",{className:M("size-3 rounded-full",le[I])})}),i("div",{className:"grid leading-tight",children:[s("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:$}),s("span",{className:"text-[13px] text-muted-foreground",children:L})]})]}),i("div",{className:"flex flex-wrap items-center gap-4",children:[i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:t("Requests")}),i("div",{className:"flex items-center justify-end gap-2",children:[D.requests.length>=2&&s(G,{ariaLabel:t("Requests over time"),className:"h-6 w-20 text-foreground",series:D.requests,testId:"hl-spark-requests"}),s("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:(c?.requests??0).toString()})]})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:t("Error rate")}),s("div",{className:M("text-lg font-semibold tabular-nums",ne[U]),"data-testid":"hl-error-rate",children:c===null?"—":T(c.errors,c.requests)})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"flex items-center gap-2",children:[s(ge,{}),s(xe,{message:ue,prefix:"hl"})]})]})]}),f!==null&&s("div",{className:"border-t border-border bg-destructive/5 px-4 py-2 text-sm text-destructive","data-testid":"hl-metrics-error",role:"alert",children:f})]}),i("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[s(O,{chart:D.errors.length>=2?s(G,{ariaLabel:t("Errors over time"),className:"h-7 w-20 text-destructive",series:D.errors,testId:"hl-spark-errors"}):void 0,label:t("Error rate"),level:U,testId:"hl-slo-errorrate",value:c===null?"—":T(c.errors,c.requests)}),s(O,{chart:Q.failures.length>=2?s(G,{ariaLabel:t("Auth failures over time"),className:"h-7 w-20 text-destructive",series:Q.failures,testId:"hl-spark-auth"}):void 0,label:t("Auth failures"),level:X,testId:"hl-slo-auth",value:o===null?"—":T(o.failures,o.attempts)}),s(O,{label:t("Scheduler backlog"),level:Y,testId:"hl-slo-backlog",value:x===null?"—":x.backlog.toString()}),s(O,{label:t("Migrations"),level:K.level,testId:"hl-slo-migrations",value:ze(K,t)})]}),i("div",{className:"grid gap-3 lg:grid-cols-2",children:[i(S,{className:"gap-0 py-0","data-testid":"hl-functions",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Functions by error rate")})}),W.length===0?s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:t("No function activity yet.")}):s("ul",{className:"divide-y divide-border",children:W.map(n=>i("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[s("span",{className:"truncate font-mono text-foreground",children:n.path}),i("span",{className:"flex shrink-0 items-center gap-2",children:[s("span",{className:"tabular-nums text-muted-foreground",children:t("{count} calls",{count:n.calls.toString()})}),s(F,{variant:Oe[V(n.errors/n.calls,se,ae)],children:T(n.errors,n.calls)})]})]},n.path))})]}),i(S,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Recent errors")}),s(F,{"data-testid":"hl-error-count",variant:z.length>0?"destructive":"outline",children:z.length})]}),u!==null&&s("p",{className:"px-4 py-8 text-center text-sm text-destructive","data-testid":"hl-logs-error",role:"alert",children:u}),u===null&&H.length===0&&s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:t("No recent errors.")}),H.length>0&&s("ul",{className:"divide-y divide-border",children:H.map((n,k)=>i("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[i("span",{className:"flex items-center gap-2",children:[s("time",{className:"shrink-0 text-muted-foreground",children:be(n.timestamp)}),n.functionPath!==void 0&&s("span",{className:"truncate font-mono text-foreground",children:n.functionPath})]}),s("span",{className:"text-destructive",children:n.message})]},`${n.timestamp.toString()}-${k.toString()}`))})]})]}),i(S,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Shards seen")}),s(F,{"data-testid":"hl-shard-count",variant:"outline",children:w.length})]}),w.length>0&&s("ul",{className:"flex flex-wrap gap-1.5 p-4",children:w.map(n=>s("li",{"data-testid":"hl-shard",children:s(F,{variant:"secondary",children:n})},n))})]})]})};export{ot as HealthPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as B}from"react/compiler-runtime";import{useLunora as
|
|
1
|
+
import{c as B}from"react/compiler-runtime";import{useLunora as ee}from"@lunora/react";import{useNavigate as te}from"@tanstack/react-router";import{useState as I,useRef as ne,useCallback as j,useEffect as O,useEffectEvent as ae,useMemo as re}from"react";import{ShardInput as ie}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{N as H}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import oe from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as K}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as T}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{f as E,d as q,g as J}from"../packem_shared/internal-BSIsQVC6.js";import{r as le}from"../packem_shared/shard-history-DMEW5VBE.js";import{E as U,A as ce}from"../packem_shared/advisor-view-Pa8HLtBv.js";import{ConfirmButton as de}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{jsx as w}from"react/jsx-runtime";import{deriveInsights as ue}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js";import{runAdvisor as fe,RUNTIME_LINTS as me}from"@lunora/advisor";const he=t=>{const{suggestedIndex:e,table:r}=t;return!(typeof r!="string"||r.length===0||typeof e!="object"||e===null||!Array.isArray(e.fields)||e.fields.length===0)},pe=(t,e,r)=>{const n=`"${t}"`,a=`"${e}"`,l=r.map(o=>`"${o}"`).join(", ");return`CREATE INDEX IF NOT EXISTS ${a} ON ${n} (${l});`},ge=t=>{const e=B(19),{fields:r,indexName:n,table:a,testId:l}=t,o=K(),[x,d]=I(!1);let u;e[0]!==r||e[1]!==n||e[2]!==a?(u=()=>{const v="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(v===void 0)return;const b=pe(a,n,r);E(v.writeText(b)),d(!0)},e[0]=r,e[1]=n,e[2]=a,e[3]=u):u=e[3];const m=u;if(x){const v=`${l}-applied`;let b;e[4]!==o?(b=o("CREATE INDEX SQL copied to clipboard."),e[4]=o,e[5]=b):b=e[5];let S;return e[6]!==v||e[7]!==b?(S=w("span",{className:"text-xs text-muted-foreground","data-testid":v,children:b}),e[6]=v,e[7]=b,e[8]=S):S=e[8],S}let h;e[9]!==o?(h=o("Apply?"),e[9]=o,e[10]=h):h=e[10];let f;e[11]!==o||e[12]!==a?(f=o("Apply index on {table}",{table:a}),e[11]=o,e[12]=a,e[13]=f):f=e[13];let g;return e[14]!==m||e[15]!==h||e[16]!==f||e[17]!==l?(g=w(de,{confirmLabel:h,onConfirm:m,testId:l,children:f}),e[14]=m,e[15]=h,e[16]=f,e[17]=l,e[18]=g):g=e[18],g},be=(t,e)=>{const r=new Map;for(const n of e){const a=`${n.table} ${n.index}`;r.set(a,(r.get(a)??0)+n.reads)}return t.map(n=>({index:n.index,reads:r.get(`${n.table} ${n.index}`)??0,table:n.table}))},ve=t=>{const e=new Map;for(const r of t)for(const n of r.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([r,n])=>({scans:n,table:r}))},xe=(t,e)=>e.map(r=>({index:r.name,table:t})),ye=t=>{const e=be(t.declaredIndexes??[],t.indexHits??[]),r=ve(t.functions??[]),n=t.shardTraffic??[],a=t.analyticsMetrics,l=a&&a.indexHits.length>0?a.indexHits:e,o=a&&a.tableScans.length>0?a.tableScans:r,x=a&&a.shardTraffic.length>0?a.shardTraffic:n,d=fe({indexHits:l,schema:{tables:[]},shardTraffic:x,tableScans:o},{lints:me,source:"runtime"}),u=t.suppressHotScanTables;return(u===void 0?d:d.filter(m=>!(m.metadata.kind==="hot_scan"&&typeof m.metadata.table=="string"&&u.has(m.metadata.table)))).map(m=>U(m))},$e=J(T.listTables),we=J(T.listTableIndexes),M=t=>`${(t*100).toFixed(1)}%`,D=t=>`${(t/1e3).toFixed(2)}s`,Se=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},Te=(t,e)=>({"high-error-rate":t("High error rate"),"high-evictions":t("High cache eviction rate"),"high-write-contention":t("High write contention"),"low-cache-hit-rate":t("Low cache hit rate"),"missing-index":t("Missing index"),"slow-function":t("Slow function")})[e.kind],X=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:M(e.value)}),"high-evictions":t("{count} entries evicted recently.",{count:e.value}),"high-write-contention":t("{rate} of calls hit a write conflict — consider sharding to cut contention.",{rate:M(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:M(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:D(e.value),tables:Se(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:D(e.value)})})[e.kind],Ie=t=>{const e=B(10),{onJump:r,table:n}=t,a=K();let l;e[0]!==r||e[1]!==n?(l=()=>{r(n)},e[0]=r,e[1]=n,e[2]=l):l=e[2];const o=l,x=`in-add-index-${n}`;let d;e[3]!==a||e[4]!==n?(d=a("Add index on {table}",{table:n}),e[3]=a,e[4]=n,e[5]=d):d=e[5];let u;return e[6]!==o||e[7]!==x||e[8]!==d?(u=w(se,{"data-testid":x,onClick:o,size:"sm",type:"button",variant:"outline",children:d}),e[6]=o,e[7]=x,e[8]=d,e[9]=u):u=e[9],u},Be=({initialShardKey:t,loadShardTraffic:e})=>{const r=ee(),n=te(),a=K(),[l,o]=I(t??""),[x,d]=I(null),[u,m]=I(null),h=oe(l.trim(),400),f=ne(""),g=H(T.getMetrics,{},{live:!0,shardKey:h}),v=H(T.getFunctionStats,{},{live:!0,shardKey:h}),b=H(T.getAdvisories,{},{live:!0,shardKey:h}),S=g.data??null,C=v.data?.functions??null,L=b.data?.advisories??null,z=g.data?.indexHits??null,_=g.error!==null&&v.error!==null?g.error:null,P=e??(i=>r.shardTraffic(i)),V=async(i,$)=>{const s=i[0];if(s===void 0||s===""){f.current===$&&m(null);return}try{const y=await P(s);if(f.current!==$)return;const p=new Map;for(const c of y.shards)p.has(c.shardKey)||p.set(c.shardKey,{requests:c.requests,shardKey:c.shardKey});m([...p.values()])}catch{f.current===$&&m(null)}},A=j(async i=>{f.current=i;let $=[];try{const s=await r.query($e,{},q(i));if(f.current!==i)return;le(i),$=s.map(c=>c.name);const y=await Promise.allSettled(s.map(async c=>[c.name,await r.query(we,{table:c.name},q(i))]));if(f.current!==i)return;const p=[];for(const c of y)if(c.status==="fulfilled"){const[k,Z]=c.value;p.push(...xe(k,Z.indexes))}d(p)}catch{f.current===i&&d(null)}await V($,i)},[r]);O(()=>{E(A(h))},[h,A]);const G=ae(()=>{g.refetch(),v.refetch(),b.refetch(),E(A(h))});O(()=>{const i=()=>{document.visibilityState==="visible"&&G()};return document.addEventListener("visibilitychange",i),()=>{document.removeEventListener("visibilitychange",i)}},[]);const R=j(i=>{E(n({search:{table:i},to:"/schema"}))},[n]),N=ue(S,C),Q=new Set(N.filter(i=>i.kind==="missing-index").flatMap(i=>i.tables??[])),F=ye({declaredIndexes:x??[],functions:C,indexHits:z,shardTraffic:u,suppressHotScanTables:Q}),W=re(()=>{const i=N.map(s=>{const y=s.kind==="missing-index"?s.tables??[]:[];return{action:y.length>0?y.map(p=>w(Ie,{onJump:R,table:p},p)):void 0,description:s.message===void 0?X(a,s):`${X(a,s)} — ${s.message}`,entity:s.fn,issueType:Te(a,s),key:`${s.kind}:${s.fn??""}`,level:s.severity}}),$=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(L??[]).map(s=>{const y=U(s);if($.has(s.name)&&he(s.metadata)){const{table:p,suggestedIndex:c}=s.metadata,k=`in-apply-index-${p}-${c.name}`;return{...y,action:w(ge,{fields:c.fields,indexName:c.name,table:p,testId:k})}}return y}),...F,...i]},[L,N,R,F,a]),Y=w(ie,{onChange:o,testId:"in-shard-input",value:l});return w(ce,{error:_,errorSource:_===null?void 0:g.errorSource,rows:W,testId:"lunora-insights",toolbar:Y})};export{Be as InsightsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as M}from"react/compiler-runtime";import{useVirtualizer as qe}from"@tanstack/react-virtual";import{useState as $,useReducer as Me,useRef as ie,useEffect as de,useMemo as Ae}from"react";import{f as Q}from"../packem_shared/log-fields-CoL3hsIQ.js";import{E as Oe}from"../packem_shared/error-alert-B59DnrDI.js";import{L as Fe}from"../packem_shared/live-status-CGW2JHf_.js";import{ShardInput as De}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as Y}from"../packem_shared/badge-BbuuAio7.js";import{E as B}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as _}from"../packem_shared/input-JHu63lTv.js";import{K as re}from"../packem_shared/use-admin-query-Di3fLE8H.js";import G from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ce}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as te}from"../packem_shared/ADMIN_FUNCTIONS-CpgIo9pj.js";import{b as ue}from"../packem_shared/cf-links-gbDy51nR.js";import{r as Ke}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as q}from"../packem_shared/utils-bhneXptQ.js";import{l as Ue}from"../packem_shared/virtual-rect-1o1veP7R.js";import{useLunora as Ve}from"@lunora/react";import{u as ze}from"../packem_shared/button-BkCrNcAs.js";import{n as je,d as Be,m as me,p as P,f as Ge,u as T}from"../packem_shared/table-DdJBrClo.js";import{f as ae,l as We,e as le}from"../packem_shared/internal-AtZ4bTal.js";import{jsx as t,jsxs as w,Fragment as Qe}from"react/jsx-runtime";const he=["trace","debug","log","info","warn","error","fatal"],Ye="LOG_ARCHIVE_NOT_CONFIGURED",ge={debug:"secondary",error:"destructive",fatal:"destructive",info:"outline",log:"outline",trace:"outline",warn:"secondary"},He={cursor:void 0,error:null,loading:!1,notConfigured:!1,rows:null},Je=(l,e)=>{switch(e.type){case"append":return{...l,cursor:e.cursor,error:null,loading:!1,rows:[...l.rows??[],...e.rows]};case"failed":return{cursor:void 0,error:e.message,loading:!1,notConfigured:!1,rows:null};case"loaded":return{cursor:e.cursor,error:null,loading:!1,notConfigured:!1,rows:e.rows};case"loading":return{...l,error:null,loading:!0,notConfigured:!1};case"notConfigured":return{cursor:void 0,error:null,loading:!1,notConfigured:!0,rows:null};case"pageFailed":return{...l,error:e.message,loading:!1};default:return l}},Xe=l=>{const e=M(33),{row:r}=l;let s;e[0]!==r.fields?(s=Q(r.fields),e[0]=r.fields,e[1]=s):s=e[1];const n=s,a=`lg-archive-row-${String(r.ts)}`;let i;e[2]!==r.ts?(i=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=i):i=e[3];let u;e[4]!==i?(u=t(T,{className:"tabular-nums whitespace-nowrap text-xs text-muted-foreground",children:i}),e[4]=i,e[5]=u):u=e[5];const v=ge[r.level];let c;e[6]!==r.level||e[7]!==v?(c=t(T,{children:t(Y,{variant:v,children:r.level})}),e[6]=r.level,e[7]=v,e[8]=c):c=e[8];let d;e[9]!==r.functionPath?(d=t(T,{className:"font-mono text-xs",children:r.functionPath}),e[9]=r.functionPath,e[10]=d):d=e[10];let b;e[11]!==r.message?(b=t("div",{className:"truncate",title:r.message,children:r.message}),e[11]=r.message,e[12]=b):b=e[12];let f;e[13]!==n?(f=n!==""&&t("div",{className:"truncate font-mono text-[11px] text-muted-foreground",title:n,children:n}),e[13]=n,e[14]=f):f=e[14];let m;e[15]!==b||e[16]!==f?(m=w(T,{className:"max-w-md",children:[b,f]}),e[15]=b,e[16]=f,e[17]=m):m=e[17];const h=r.traceId??"—";let p;e[18]!==h?(p=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:h}),e[18]=h,e[19]=p):p=e[19];const L=r.shardKey??"—";let g;e[20]!==L?(g=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:L}),e[20]=L,e[21]=g):g=e[21];const x=r.userId??"—";let y;e[22]!==x?(y=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:x}),e[22]=x,e[23]=y):y=e[23];let C;return e[24]!==m||e[25]!==p||e[26]!==g||e[27]!==y||e[28]!==a||e[29]!==u||e[30]!==c||e[31]!==d?(C=w(me,{"data-testid":a,children:[u,c,d,m,p,g,y]}),e[24]=m,e[25]=p,e[26]=g,e[27]=y,e[28]=a,e[29]=u,e[30]=c,e[31]=d,e[32]=C):C=e[32],C},Ze=({shardKey:l})=>{const e=Ve(),r=ce(),[s,n]=$(""),[a,i]=$(""),[u,v]=$(""),[{cursor:c,error:d,loading:b,notConfigured:f,rows:m},h]=Me(Je,He),p=G(s.trim(),400),L=G(a.trim(),400),g={...p===""?{}:{functionPathPrefix:p},...u===""?{}:{minLevel:u},...l===""?{}:{shardKey:l},...L===""?{}:{userId:L}},x=JSON.stringify(g),y=ie(x);de(()=>{const N={cancelled:!1};return y.current=x,ae((async()=>{h({type:"loading"});try{const k=await e.queryLogArchive(g);N.cancelled||h({cursor:k.nextCursor,rows:k.rows,type:"loaded"})}catch(k){N.cancelled||h(We(k)===Ye?{type:"notConfigured"}:{message:le(k),type:"failed"})}})()),()=>{N.cancelled=!0}},[e,x]);const C=async()=>{if(c===void 0)return;const N=x;h({type:"loading"});try{const k=await e.queryLogArchive({...g,cursor:c});y.current===N&&h({cursor:k.nextCursor,rows:k.rows,type:"append"})}catch(k){y.current===N&&h({message:le(k),type:"pageFailed"})}},R=N=>{n(N.target.value)},S=N=>{i(N.target.value)},I=N=>{v(N.target.value)},E=()=>{ae(C())};return f?t(B,{action:t("a",{className:"text-sm text-primary underline-offset-4 hover:underline",href:ue,rel:"noreferrer",target:"_blank",children:r("Open in Cloudflare")}),description:r("Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here."),testId:"lg-archive-not-configured",title:r("Log archive not configured")}):w("div",{className:"flex flex-col gap-4","data-testid":"lg-archive",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":r("Function path prefix"),className:"h-8 w-48","data-testid":"lg-archive-path",onChange:R,placeholder:r("function path…"),value:s}),t(_,{"aria-label":r("User id"),className:"h-8 w-40","data-testid":"lg-archive-user",onChange:S,placeholder:r("user id…"),value:a}),w("select",{"aria-label":r("Minimum level"),className:"h-8 rounded-md border border-border bg-background px-2 text-sm","data-testid":"lg-archive-min-level",onChange:I,value:u,children:[t("option",{value:"",children:r("min level")}),he.map(N=>t("option",{value:N,children:N},N))]})]}),d!==null&&t("p",{className:"text-sm text-destructive","data-testid":"lg-archive-error",role:"alert",children:d}),b&&m===null&&d===null&&t("p",{className:"text-sm text-muted-foreground","data-testid":"lg-archive-loading",children:r("Loading…")}),m!==null&&m.length===0&&t(B,{description:r("No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2."),testId:"lg-archive-empty",title:r("No archived logs.")}),m!==null&&m.length>0&&t("div",{className:"overflow-hidden rounded-xl border border-border shadow-xs",children:w(je,{"data-testid":"lg-archive-table",children:[t(Be,{children:w(me,{children:[t(P,{children:r("Time")}),t(P,{children:r("Level")}),t(P,{children:r("Function")}),t(P,{children:r("Message")}),t(P,{children:r("Trace")}),t(P,{children:r("Shard")}),t(P,{children:r("User")})]})}),t(Ge,{children:m.map((N,k)=>t(Xe,{row:N},`${String(N.ts)}-${String(k)}`))})]})}),c!==void 0&&t("div",{children:t(ze,{"data-testid":"lg-archive-more",disabled:b,onClick:E,size:"sm",variant:"outline",children:r(b?"Loading…":"Load more")})})]})},W=400,er=36,rr={height:W,overflow:"auto"},fe={left:0,position:"absolute",top:0,width:"100%"},tr={error:"destructive",ok:"secondary"},ar=l=>{const e=M(26),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.fields?(c=Q(r.fields),e[2]=r.fields,e[3]=c):c=e[3];const d=c;let b;e[4]!==r.timestamp?(b=new Date(r.timestamp).toLocaleString(),e[4]=r.timestamp,e[5]=b):b=e[5];let f;e[6]!==b?(f=t("span",{className:"w-44 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:b}),e[6]=b,e[7]=f):f=e[7];const m=ge[r.level];let h;e[8]!==r.level||e[9]!==m?(h=t("span",{className:"w-20 shrink-0",role:"gridcell",children:t(Y,{variant:m,children:r.level})}),e[8]=r.level,e[9]=m,e[10]=h):h=e[10];const p=r.functionPath??"—";let L;e[11]!==p?(L=t("span",{className:"w-48 shrink-0 truncate text-muted-foreground",role:"gridcell",children:p}),e[11]=p,e[12]=L):L=e[12];let g;e[13]!==d?(g=d===""?null:t("span",{className:"ml-2 text-muted-foreground","data-testid":"lg-fields",children:d}),e[13]=d,e[14]=g):g=e[14];let x;e[15]!==r.message||e[16]!==g?(x=w("span",{className:"flex-1 truncate",role:"gridcell",children:[r.message,g]}),e[15]=r.message,e[16]=g,e[17]=x):x=e[17];let y;return e[18]!==s||e[19]!==n||e[20]!==v||e[21]!==x||e[22]!==f||e[23]!==h||e[24]!==L?(y=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-row",ref:n,role:"row",style:v,children:[f,h,L,x]}),e[18]=s,e[19]=n,e[20]=v,e[21]=x,e[22]=f,e[23]=h,e[24]=L,e[25]=y):y=e[25],y},oe=l=>l.length===0?"—":l.join(", "),lr=l=>{const e=M(37),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.ts?(c=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=c):c=e[3];let d;e[4]!==c?(d=t("span",{className:"w-40 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:c}),e[4]=c,e[5]=d):d=e[5];const b=tr[r.outcome];let f;e[6]!==r.outcome||e[7]!==b?(f=t("span",{className:"w-16 shrink-0",role:"gridcell",children:t(Y,{variant:b,children:r.outcome})}),e[6]=r.outcome,e[7]=b,e[8]=f):f=e[8];let m;e[9]!==r.functionPath?(m=t("span",{className:"w-44 shrink-0 truncate",role:"gridcell",title:r.functionPath,children:r.functionPath}),e[9]=r.functionPath,e[10]=m):m=e[10];const h=r.shardKey??"—";let p;e[11]!==h?(p=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:h}),e[11]=h,e[12]=p):p=e[12];const L=r.userId??"—";let g;e[13]!==L?(g=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:L}),e[13]=L,e[14]=g):g=e[14];let x;e[15]!==r.durationMs?(x=Math.round(r.durationMs),e[15]=r.durationMs,e[16]=x):x=e[16];const y=`${String(x)}ms`;let C;e[17]!==y?(C=t("span",{className:"w-16 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:y}),e[17]=y,e[18]=C):C=e[18];let R;e[19]!==r.errorMessage||e[20]!==r.outcome||e[21]!==r.tablesRead||e[22]!==r.tablesWritten?(R=r.outcome==="error"&&r.errorMessage!==void 0?r.errorMessage:`r:${oe(r.tablesRead)} · w:${oe(r.tablesWritten)}`,e[19]=r.errorMessage,e[20]=r.outcome,e[21]=r.tablesRead,e[22]=r.tablesWritten,e[23]=R):R=e[23];let S;e[24]!==R?(S=t("span",{className:"flex-1 truncate text-muted-foreground",role:"gridcell",children:R}),e[24]=R,e[25]=S):S=e[25];let I;return e[26]!==s||e[27]!==n||e[28]!==v||e[29]!==g||e[30]!==C||e[31]!==S||e[32]!==d||e[33]!==f||e[34]!==m||e[35]!==p?(I=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-req-row",ref:n,role:"row",style:v,children:[d,f,m,p,g,C,S]}),e[26]=s,e[27]=n,e[28]=v,e[29]=g,e[30]=C,e[31]=S,e[32]=d,e[33]=f,e[34]=m,e[35]=p,e[36]=I):I=e[36],I},se=l=>{const{entries:e}=l??{};return Array.isArray(e)?e:[]},or=l=>{const e={};return l.functionPathPrefix.trim()!==""&&(e.functionPathPrefix=l.functionPathPrefix.trim()),l.userId.trim()!==""&&(e.userId=l.userId.trim()),l.tableTouched.trim()!==""&&(e.tableTouched=l.tableTouched.trim()),(l.outcome==="ok"||l.outcome==="error")&&(e.outcome=l.outcome),e},pe=he,sr={"5m":300*1e3,"15m":900*1e3,"1h":3600*1e3},nr=(l,e)=>{const r=e.search.trim().toLowerCase(),s=e.path.trim().toLowerCase(),n=e.range==="all"?Number.NEGATIVE_INFINITY:e.now-sr[e.range];return l.filter(a=>e.levels.size>0&&!e.levels.has(a.level)||a.timestamp<n||s!==""&&!(a.functionPath??"").toLowerCase().includes(s)?!1:r===""||a.message.toLowerCase().includes(r)||Q(a.fields).toLowerCase().includes(r))},ir="—",dr=l=>{const e=new Map,r=new Map;for(const a of l){e.set(a.level,(e.get(a.level)??0)+1);const i=a.functionPath??ir;r.set(i,(r.get(i)??0)+1)}const s=pe.filter(a=>e.has(a)).map(a=>({count:e.get(a)??0,key:a})),n=[...r.entries()].map(([a,i])=>({count:i,key:a})).toSorted((a,i)=>i.count===a.count?a.key.localeCompare(i.key):i.count-a.count);return{byLevel:s,byPath:n,total:l.length}},cr=l=>{const e=M(11),{level:r,onToggle:s,selected:n}=l;let a;e[0]!==r||e[1]!==s?(a=()=>{s(r)},e[0]=r,e[1]=s,e[2]=a):a=e[2];const i=a,u=n?"border-border bg-muted font-medium":"border-input text-muted-foreground";let v;e[3]!==u?(v=q("rounded-md border px-2 py-1 text-xs",u),e[3]=u,e[4]=v):v=e[4];const c=`logs-level-${r}`;let d;return e[5]!==r||e[6]!==i||e[7]!==n||e[8]!==v||e[9]!==c?(d=t("button",{"aria-pressed":n,className:v,"data-testid":c,onClick:i,type:"button",children:r}),e[5]=r,e[6]=i,e[7]=n,e[8]=v,e[9]=c,e[10]=d):d=e[10],d},ne=l=>{const e=M(7),{bucket:r}=l;let s;e[0]!==r.key?(s=t("span",{className:"truncate text-muted-foreground",role:"gridcell",children:r.key}),e[0]=r.key,e[1]=s):s=e[1];let n;e[2]!==r.count?(n=t("span",{className:"shrink-0 tabular-nums",role:"gridcell",children:r.count}),e[2]=r.count,e[3]=n):n=e[3];let a;return e[4]!==s||e[5]!==n?(a=w("div",{className:"flex items-center justify-between gap-4 px-3 py-1 font-mono text-xs","data-testid":"logs-summary-row",role:"row",children:[s,n]}),e[4]=s,e[5]=n,e[6]=a):a=e[6],a},qr=({initialShardKey:l})=>{const e=ce(),[r,s]=$("requests"),[n,a]=$(l??""),[i,u]=$(""),[v,c]=$(()=>new Set),[d,b]=$(""),[f,m]=$("all"),[h,p]=$(!1),[L,g]=$(""),[x,y]=$(""),[C,R]=$(""),[S,I]=$("all"),E=G(n.trim(),400),N=or({functionPathPrefix:L,outcome:S,tableTouched:C,userId:x}),k=re(te.getRequestLog,N,{enabled:r==="requests",live:!0,shardKey:E}),H=re(te.getLogs,{},{enabled:r==="errors",live:!0,shardKey:E}),D=r==="requests"?k:H,{error:J,errorSource:ve,isLoading:X,liveError:be}=D,xe=se(H.data),Z=se(k.data);de(()=>{D.data!==void 0&&Ke(E)},[D.data,E]);const K=nr(xe,{levels:v,now:Date.now(),path:d,range:f,search:i}),U=dr(K),V=r==="requests"?Z.length:K.length,z=r==="errors"&&h,A=Ae(()=>J!==null?"error":V===0?X?z?"summary":"list":"empty":z?"summary":"list",[V,X,J,z]),ee=ie(null),O=qe({count:V,estimateSize:()=>er,getScrollElement:()=>ee.current,initialRect:{height:W,width:800},observeElementRect:(o,j)=>Ue(o,j,W),overscan:8}),we=O.getVirtualItems(),ye={height:O.getTotalSize(),position:"relative",width:"100%"},Ne=o=>{u(o.target.value)},Le=o=>{c(j=>{const F=new Set(j);return F.has(o)?F.delete(o):F.add(o),F})},Ce=o=>{b(o.target.value)},ke=o=>{m(o.target.value)},$e=()=>{p(o=>!o)},Se=o=>{g(o.target.value)},Re=o=>{y(o.target.value)},Ie=o=>{R(o.target.value)},Ee=o=>{I(o.target.value)},Pe=()=>{s("requests"),p(!1)},Te=()=>{s("errors"),p(!1)},_e=()=>{s("archive"),p(!1)};return w("div",{className:"flex flex-col gap-4","data-testid":"lunora-logs",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[w("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",role:"tablist",children:[t("button",{"aria-selected":r==="requests",className:q("px-3 py-1 text-sm",r==="requests"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-requests",onClick:Pe,role:"tab",type:"button",children:e("Requests")}),t("button",{"aria-selected":r==="errors",className:q("px-3 py-1 text-sm",r==="errors"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-errors",onClick:Te,role:"tab",type:"button",children:e("Errors")}),t("button",{"aria-selected":r==="archive",className:q("px-3 py-1 text-sm",r==="archive"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-archive",onClick:_e,role:"tab",type:"button",children:e("Archive")})]}),t(De,{onChange:a,testId:"lg-shard-input",value:n}),r!=="archive"&&t(Fe,{message:be,prefix:"lg"}),t("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"lg-cf-link",href:ue,rel:"noreferrer",target:"_blank",children:e("Open in Cloudflare")})]}),r==="errors"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Search messages"),className:"h-8 w-48","data-testid":"lg-search",onChange:Ne,placeholder:e("search message"),value:i}),t(_,{"aria-label":e("Function path"),className:"h-8 w-40","data-testid":"logs-path-filter",onChange:Ce,placeholder:e("filter path"),value:d}),t("div",{"aria-label":e("Level filter"),className:"inline-flex items-center gap-1","data-testid":"logs-level-filter",role:"group",children:pe.map(o=>t(cr,{level:o,onToggle:Le,selected:v.has(o)},o))}),w("select",{"aria-label":e("Time range"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"logs-time-range",onChange:ke,value:f,children:[t("option",{value:"all",children:e("All time")}),t("option",{value:"5m",children:e("Last 5m")}),t("option",{value:"15m",children:e("Last 15m")}),t("option",{value:"1h",children:e("Last hour")})]}),t("button",{"aria-pressed":h,className:q("h-8 rounded-md border px-3 text-sm",h?"border-border bg-muted font-medium":"border-input text-muted-foreground"),"data-testid":"logs-summary-toggle",onClick:$e,type:"button",children:e(h?"List":"Summary")})]}),r==="requests"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Function path"),className:"h-8 w-44","data-testid":"lg-req-path",onChange:Se,placeholder:e("file:function"),value:L}),t(_,{"aria-label":e("User id"),className:"h-8 w-32","data-testid":"lg-req-user",onChange:Re,placeholder:e("userId"),value:x}),t(_,{"aria-label":e("Table touched"),className:"h-8 w-32","data-testid":"lg-req-table",onChange:Ie,placeholder:e("table"),value:C}),w("select",{"aria-label":e("Outcome filter"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"lg-req-outcome",onChange:Ee,value:S,children:[t("option",{value:"all",children:e("all")}),t("option",{value:"ok",children:e("ok")}),t("option",{value:"error",children:e("error")})]})]}),r==="archive"?t(Ze,{shardKey:E}):w(Qe,{children:[A==="error"&&t(Oe,{error:ve,testId:"lg-error"}),A==="empty"&&t(B,{description:e("Function and request logs for this shard show up here as your app handles traffic."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M4 5h16M4 12h16M4 19h10"})}),testId:"lg-empty",title:e("No logs.")}),A==="summary"&&w("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"logs-summary",children:[t("p",{className:"text-xs text-muted-foreground","data-testid":"logs-summary-total",children:e("{count} entries",{count:U.total})}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By level")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-levels",role:"grid",children:U.byLevel.map(o=>t(ne,{bucket:o},o.key))})]}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By function")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-paths",role:"grid",children:U.byPath.map(o=>t(ne,{bucket:o},o.key))})]})]}),A==="list"&&t("div",{className:"rounded-xl border border-border shadow-xs","data-testid":"lg-scroll",ref:ee,style:rr,children:t("div",{"aria-label":e("Recent logs"),"data-testid":"lg-table",role:"grid",style:ye,children:we.map(o=>r==="requests"?t(lr,{entry:Z[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key):t(ar,{entry:K[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key))})})]})]})};export{qr as LogsPanel,nr as filterLogs,dr as summarizeLogs};
|
|
1
|
+
import{c as M}from"react/compiler-runtime";import{useVirtualizer as qe}from"@tanstack/react-virtual";import{useState as $,useReducer as Me,useRef as ie,useEffect as de,useMemo as Ae}from"react";import{f as Q}from"../packem_shared/log-fields-CoL3hsIQ.js";import{E as Oe}from"../packem_shared/error-alert-t6cpEi0z.js";import{L as Fe}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as De}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as Y}from"../packem_shared/badge-BbuuAio7.js";import{E as B}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as _}from"../packem_shared/input-JHu63lTv.js";import{N as re}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import G from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ce}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as te}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{b as ue}from"../packem_shared/cf-links-gbDy51nR.js";import{r as Ue}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as q}from"../packem_shared/utils-bhneXptQ.js";import{l as Ke}from"../packem_shared/virtual-rect-1o1veP7R.js";import{useLunora as Ve}from"@lunora/react";import{u as ze}from"../packem_shared/button-BkCrNcAs.js";import{n as je,d as Be,m as me,p as P,f as Ge,u as T}from"../packem_shared/table-DdJBrClo.js";import{f as ae,l as We,b as le}from"../packem_shared/internal-BSIsQVC6.js";import{jsx as t,jsxs as w,Fragment as Qe}from"react/jsx-runtime";const he=["trace","debug","log","info","warn","error","fatal"],Ye="LOG_ARCHIVE_NOT_CONFIGURED",ge={debug:"secondary",error:"destructive",fatal:"destructive",info:"outline",log:"outline",trace:"outline",warn:"secondary"},He={cursor:void 0,error:null,loading:!1,notConfigured:!1,rows:null},Je=(l,e)=>{switch(e.type){case"append":return{...l,cursor:e.cursor,error:null,loading:!1,rows:[...l.rows??[],...e.rows]};case"failed":return{cursor:void 0,error:e.message,loading:!1,notConfigured:!1,rows:null};case"loaded":return{cursor:e.cursor,error:null,loading:!1,notConfigured:!1,rows:e.rows};case"loading":return{...l,error:null,loading:!0,notConfigured:!1};case"notConfigured":return{cursor:void 0,error:null,loading:!1,notConfigured:!0,rows:null};case"pageFailed":return{...l,error:e.message,loading:!1};default:return l}},Xe=l=>{const e=M(33),{row:r}=l;let s;e[0]!==r.fields?(s=Q(r.fields),e[0]=r.fields,e[1]=s):s=e[1];const n=s,a=`lg-archive-row-${String(r.ts)}`;let i;e[2]!==r.ts?(i=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=i):i=e[3];let u;e[4]!==i?(u=t(T,{className:"tabular-nums whitespace-nowrap text-xs text-muted-foreground",children:i}),e[4]=i,e[5]=u):u=e[5];const v=ge[r.level];let c;e[6]!==r.level||e[7]!==v?(c=t(T,{children:t(Y,{variant:v,children:r.level})}),e[6]=r.level,e[7]=v,e[8]=c):c=e[8];let d;e[9]!==r.functionPath?(d=t(T,{className:"font-mono text-xs",children:r.functionPath}),e[9]=r.functionPath,e[10]=d):d=e[10];let b;e[11]!==r.message?(b=t("div",{className:"truncate",title:r.message,children:r.message}),e[11]=r.message,e[12]=b):b=e[12];let f;e[13]!==n?(f=n!==""&&t("div",{className:"truncate font-mono text-[11px] text-muted-foreground",title:n,children:n}),e[13]=n,e[14]=f):f=e[14];let m;e[15]!==b||e[16]!==f?(m=w(T,{className:"max-w-md",children:[b,f]}),e[15]=b,e[16]=f,e[17]=m):m=e[17];const h=r.traceId??"—";let p;e[18]!==h?(p=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:h}),e[18]=h,e[19]=p):p=e[19];const L=r.shardKey??"—";let g;e[20]!==L?(g=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:L}),e[20]=L,e[21]=g):g=e[21];const x=r.userId??"—";let y;e[22]!==x?(y=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:x}),e[22]=x,e[23]=y):y=e[23];let C;return e[24]!==m||e[25]!==p||e[26]!==g||e[27]!==y||e[28]!==a||e[29]!==u||e[30]!==c||e[31]!==d?(C=w(me,{"data-testid":a,children:[u,c,d,m,p,g,y]}),e[24]=m,e[25]=p,e[26]=g,e[27]=y,e[28]=a,e[29]=u,e[30]=c,e[31]=d,e[32]=C):C=e[32],C},Ze=({shardKey:l})=>{const e=Ve(),r=ce(),[s,n]=$(""),[a,i]=$(""),[u,v]=$(""),[{cursor:c,error:d,loading:b,notConfigured:f,rows:m},h]=Me(Je,He),p=G(s.trim(),400),L=G(a.trim(),400),g={...p===""?{}:{functionPathPrefix:p},...u===""?{}:{minLevel:u},...l===""?{}:{shardKey:l},...L===""?{}:{userId:L}},x=JSON.stringify(g),y=ie(x);de(()=>{const N={cancelled:!1};return y.current=x,ae((async()=>{h({type:"loading"});try{const k=await e.queryLogArchive(g);N.cancelled||h({cursor:k.nextCursor,rows:k.rows,type:"loaded"})}catch(k){N.cancelled||h(We(k)===Ye?{type:"notConfigured"}:{message:le(k),type:"failed"})}})()),()=>{N.cancelled=!0}},[e,x]);const C=async()=>{if(c===void 0)return;const N=x;h({type:"loading"});try{const k=await e.queryLogArchive({...g,cursor:c});y.current===N&&h({cursor:k.nextCursor,rows:k.rows,type:"append"})}catch(k){y.current===N&&h({message:le(k),type:"pageFailed"})}},R=N=>{n(N.target.value)},S=N=>{i(N.target.value)},I=N=>{v(N.target.value)},E=()=>{ae(C())};return f?t(B,{action:t("a",{className:"text-sm text-primary underline-offset-4 hover:underline",href:ue,rel:"noreferrer",target:"_blank",children:r("Open in Cloudflare")}),description:r("Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here."),testId:"lg-archive-not-configured",title:r("Log archive not configured")}):w("div",{className:"flex flex-col gap-4","data-testid":"lg-archive",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":r("Function path prefix"),className:"h-8 w-48","data-testid":"lg-archive-path",onChange:R,placeholder:r("function path…"),value:s}),t(_,{"aria-label":r("User id"),className:"h-8 w-40","data-testid":"lg-archive-user",onChange:S,placeholder:r("user id…"),value:a}),w("select",{"aria-label":r("Minimum level"),className:"h-8 rounded-md border border-border bg-background px-2 text-sm","data-testid":"lg-archive-min-level",onChange:I,value:u,children:[t("option",{value:"",children:r("min level")}),he.map(N=>t("option",{value:N,children:N},N))]})]}),d!==null&&t("p",{className:"text-sm text-destructive","data-testid":"lg-archive-error",role:"alert",children:d}),b&&m===null&&d===null&&t("p",{className:"text-sm text-muted-foreground","data-testid":"lg-archive-loading",children:r("Loading…")}),m!==null&&m.length===0&&t(B,{description:r("No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2."),testId:"lg-archive-empty",title:r("No archived logs.")}),m!==null&&m.length>0&&t("div",{className:"overflow-hidden rounded-xl border border-border shadow-xs",children:w(je,{"data-testid":"lg-archive-table",children:[t(Be,{children:w(me,{children:[t(P,{children:r("Time")}),t(P,{children:r("Level")}),t(P,{children:r("Function")}),t(P,{children:r("Message")}),t(P,{children:r("Trace")}),t(P,{children:r("Shard")}),t(P,{children:r("User")})]})}),t(Ge,{children:m.map((N,k)=>t(Xe,{row:N},`${String(N.ts)}-${String(k)}`))})]})}),c!==void 0&&t("div",{children:t(ze,{"data-testid":"lg-archive-more",disabled:b,onClick:E,size:"sm",variant:"outline",children:r(b?"Loading…":"Load more")})})]})},W=400,er=36,rr={height:W,overflow:"auto"},fe={left:0,position:"absolute",top:0,width:"100%"},tr={error:"destructive",ok:"secondary"},ar=l=>{const e=M(26),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.fields?(c=Q(r.fields),e[2]=r.fields,e[3]=c):c=e[3];const d=c;let b;e[4]!==r.timestamp?(b=new Date(r.timestamp).toLocaleString(),e[4]=r.timestamp,e[5]=b):b=e[5];let f;e[6]!==b?(f=t("span",{className:"w-44 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:b}),e[6]=b,e[7]=f):f=e[7];const m=ge[r.level];let h;e[8]!==r.level||e[9]!==m?(h=t("span",{className:"w-20 shrink-0",role:"gridcell",children:t(Y,{variant:m,children:r.level})}),e[8]=r.level,e[9]=m,e[10]=h):h=e[10];const p=r.functionPath??"—";let L;e[11]!==p?(L=t("span",{className:"w-48 shrink-0 truncate text-muted-foreground",role:"gridcell",children:p}),e[11]=p,e[12]=L):L=e[12];let g;e[13]!==d?(g=d===""?null:t("span",{className:"ml-2 text-muted-foreground","data-testid":"lg-fields",children:d}),e[13]=d,e[14]=g):g=e[14];let x;e[15]!==r.message||e[16]!==g?(x=w("span",{className:"flex-1 truncate",role:"gridcell",children:[r.message,g]}),e[15]=r.message,e[16]=g,e[17]=x):x=e[17];let y;return e[18]!==s||e[19]!==n||e[20]!==v||e[21]!==x||e[22]!==f||e[23]!==h||e[24]!==L?(y=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-row",ref:n,role:"row",style:v,children:[f,h,L,x]}),e[18]=s,e[19]=n,e[20]=v,e[21]=x,e[22]=f,e[23]=h,e[24]=L,e[25]=y):y=e[25],y},oe=l=>l.length===0?"—":l.join(", "),lr=l=>{const e=M(37),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.ts?(c=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=c):c=e[3];let d;e[4]!==c?(d=t("span",{className:"w-40 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:c}),e[4]=c,e[5]=d):d=e[5];const b=tr[r.outcome];let f;e[6]!==r.outcome||e[7]!==b?(f=t("span",{className:"w-16 shrink-0",role:"gridcell",children:t(Y,{variant:b,children:r.outcome})}),e[6]=r.outcome,e[7]=b,e[8]=f):f=e[8];let m;e[9]!==r.functionPath?(m=t("span",{className:"w-44 shrink-0 truncate",role:"gridcell",title:r.functionPath,children:r.functionPath}),e[9]=r.functionPath,e[10]=m):m=e[10];const h=r.shardKey??"—";let p;e[11]!==h?(p=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:h}),e[11]=h,e[12]=p):p=e[12];const L=r.userId??"—";let g;e[13]!==L?(g=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:L}),e[13]=L,e[14]=g):g=e[14];let x;e[15]!==r.durationMs?(x=Math.round(r.durationMs),e[15]=r.durationMs,e[16]=x):x=e[16];const y=`${String(x)}ms`;let C;e[17]!==y?(C=t("span",{className:"w-16 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:y}),e[17]=y,e[18]=C):C=e[18];let R;e[19]!==r.errorMessage||e[20]!==r.outcome||e[21]!==r.tablesRead||e[22]!==r.tablesWritten?(R=r.outcome==="error"&&r.errorMessage!==void 0?r.errorMessage:`r:${oe(r.tablesRead)} · w:${oe(r.tablesWritten)}`,e[19]=r.errorMessage,e[20]=r.outcome,e[21]=r.tablesRead,e[22]=r.tablesWritten,e[23]=R):R=e[23];let S;e[24]!==R?(S=t("span",{className:"flex-1 truncate text-muted-foreground",role:"gridcell",children:R}),e[24]=R,e[25]=S):S=e[25];let I;return e[26]!==s||e[27]!==n||e[28]!==v||e[29]!==g||e[30]!==C||e[31]!==S||e[32]!==d||e[33]!==f||e[34]!==m||e[35]!==p?(I=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-req-row",ref:n,role:"row",style:v,children:[d,f,m,p,g,C,S]}),e[26]=s,e[27]=n,e[28]=v,e[29]=g,e[30]=C,e[31]=S,e[32]=d,e[33]=f,e[34]=m,e[35]=p,e[36]=I):I=e[36],I},se=l=>{const{entries:e}=l??{};return Array.isArray(e)?e:[]},or=l=>{const e={};return l.functionPathPrefix.trim()!==""&&(e.functionPathPrefix=l.functionPathPrefix.trim()),l.userId.trim()!==""&&(e.userId=l.userId.trim()),l.tableTouched.trim()!==""&&(e.tableTouched=l.tableTouched.trim()),(l.outcome==="ok"||l.outcome==="error")&&(e.outcome=l.outcome),e},pe=he,sr={"5m":300*1e3,"15m":900*1e3,"1h":3600*1e3},nr=(l,e)=>{const r=e.search.trim().toLowerCase(),s=e.path.trim().toLowerCase(),n=e.range==="all"?Number.NEGATIVE_INFINITY:e.now-sr[e.range];return l.filter(a=>e.levels.size>0&&!e.levels.has(a.level)||a.timestamp<n||s!==""&&!(a.functionPath??"").toLowerCase().includes(s)?!1:r===""||a.message.toLowerCase().includes(r)||Q(a.fields).toLowerCase().includes(r))},ir="—",dr=l=>{const e=new Map,r=new Map;for(const a of l){e.set(a.level,(e.get(a.level)??0)+1);const i=a.functionPath??ir;r.set(i,(r.get(i)??0)+1)}const s=pe.filter(a=>e.has(a)).map(a=>({count:e.get(a)??0,key:a})),n=[...r.entries()].map(([a,i])=>({count:i,key:a})).toSorted((a,i)=>i.count===a.count?a.key.localeCompare(i.key):i.count-a.count);return{byLevel:s,byPath:n,total:l.length}},cr=l=>{const e=M(11),{level:r,onToggle:s,selected:n}=l;let a;e[0]!==r||e[1]!==s?(a=()=>{s(r)},e[0]=r,e[1]=s,e[2]=a):a=e[2];const i=a,u=n?"border-border bg-muted font-medium":"border-input text-muted-foreground";let v;e[3]!==u?(v=q("rounded-md border px-2 py-1 text-xs",u),e[3]=u,e[4]=v):v=e[4];const c=`logs-level-${r}`;let d;return e[5]!==r||e[6]!==i||e[7]!==n||e[8]!==v||e[9]!==c?(d=t("button",{"aria-pressed":n,className:v,"data-testid":c,onClick:i,type:"button",children:r}),e[5]=r,e[6]=i,e[7]=n,e[8]=v,e[9]=c,e[10]=d):d=e[10],d},ne=l=>{const e=M(7),{bucket:r}=l;let s;e[0]!==r.key?(s=t("span",{className:"truncate text-muted-foreground",role:"gridcell",children:r.key}),e[0]=r.key,e[1]=s):s=e[1];let n;e[2]!==r.count?(n=t("span",{className:"shrink-0 tabular-nums",role:"gridcell",children:r.count}),e[2]=r.count,e[3]=n):n=e[3];let a;return e[4]!==s||e[5]!==n?(a=w("div",{className:"flex items-center justify-between gap-4 px-3 py-1 font-mono text-xs","data-testid":"logs-summary-row",role:"row",children:[s,n]}),e[4]=s,e[5]=n,e[6]=a):a=e[6],a},qr=({initialShardKey:l})=>{const e=ce(),[r,s]=$("requests"),[n,a]=$(l??""),[i,u]=$(""),[v,c]=$(()=>new Set),[d,b]=$(""),[f,m]=$("all"),[h,p]=$(!1),[L,g]=$(""),[x,y]=$(""),[C,R]=$(""),[S,I]=$("all"),E=G(n.trim(),400),N=or({functionPathPrefix:L,outcome:S,tableTouched:C,userId:x}),k=re(te.getRequestLog,N,{enabled:r==="requests",live:!0,shardKey:E}),H=re(te.getLogs,{},{enabled:r==="errors",live:!0,shardKey:E}),D=r==="requests"?k:H,{error:J,errorSource:ve,isLoading:X,liveError:be}=D,xe=se(H.data),Z=se(k.data);de(()=>{D.data!==void 0&&Ue(E)},[D.data,E]);const U=nr(xe,{levels:v,now:Date.now(),path:d,range:f,search:i}),K=dr(U),V=r==="requests"?Z.length:U.length,z=r==="errors"&&h,A=Ae(()=>J!==null?"error":V===0?X?z?"summary":"list":"empty":z?"summary":"list",[V,X,J,z]),ee=ie(null),O=qe({count:V,estimateSize:()=>er,getScrollElement:()=>ee.current,initialRect:{height:W,width:800},observeElementRect:(o,j)=>Ke(o,j,W),overscan:8}),we=O.getVirtualItems(),ye={height:O.getTotalSize(),position:"relative",width:"100%"},Ne=o=>{u(o.target.value)},Le=o=>{c(j=>{const F=new Set(j);return F.has(o)?F.delete(o):F.add(o),F})},Ce=o=>{b(o.target.value)},ke=o=>{m(o.target.value)},$e=()=>{p(o=>!o)},Se=o=>{g(o.target.value)},Re=o=>{y(o.target.value)},Ie=o=>{R(o.target.value)},Ee=o=>{I(o.target.value)},Pe=()=>{s("requests"),p(!1)},Te=()=>{s("errors"),p(!1)},_e=()=>{s("archive"),p(!1)};return w("div",{className:"flex flex-col gap-4","data-testid":"lunora-logs",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[w("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",role:"tablist",children:[t("button",{"aria-selected":r==="requests",className:q("px-3 py-1 text-sm",r==="requests"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-requests",onClick:Pe,role:"tab",type:"button",children:e("Requests")}),t("button",{"aria-selected":r==="errors",className:q("px-3 py-1 text-sm",r==="errors"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-errors",onClick:Te,role:"tab",type:"button",children:e("Errors")}),t("button",{"aria-selected":r==="archive",className:q("px-3 py-1 text-sm",r==="archive"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-archive",onClick:_e,role:"tab",type:"button",children:e("Archive")})]}),t(De,{onChange:a,testId:"lg-shard-input",value:n}),r!=="archive"&&t(Fe,{message:be,prefix:"lg"}),t("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"lg-cf-link",href:ue,rel:"noreferrer",target:"_blank",children:e("Open in Cloudflare")})]}),r==="errors"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Search messages"),className:"h-8 w-48","data-testid":"lg-search",onChange:Ne,placeholder:e("search message"),value:i}),t(_,{"aria-label":e("Function path"),className:"h-8 w-40","data-testid":"logs-path-filter",onChange:Ce,placeholder:e("filter path"),value:d}),t("div",{"aria-label":e("Level filter"),className:"inline-flex items-center gap-1","data-testid":"logs-level-filter",role:"group",children:pe.map(o=>t(cr,{level:o,onToggle:Le,selected:v.has(o)},o))}),w("select",{"aria-label":e("Time range"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"logs-time-range",onChange:ke,value:f,children:[t("option",{value:"all",children:e("All time")}),t("option",{value:"5m",children:e("Last 5m")}),t("option",{value:"15m",children:e("Last 15m")}),t("option",{value:"1h",children:e("Last hour")})]}),t("button",{"aria-pressed":h,className:q("h-8 rounded-md border px-3 text-sm",h?"border-border bg-muted font-medium":"border-input text-muted-foreground"),"data-testid":"logs-summary-toggle",onClick:$e,type:"button",children:e(h?"List":"Summary")})]}),r==="requests"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Function path"),className:"h-8 w-44","data-testid":"lg-req-path",onChange:Se,placeholder:e("file:function"),value:L}),t(_,{"aria-label":e("User id"),className:"h-8 w-32","data-testid":"lg-req-user",onChange:Re,placeholder:e("userId"),value:x}),t(_,{"aria-label":e("Table touched"),className:"h-8 w-32","data-testid":"lg-req-table",onChange:Ie,placeholder:e("table"),value:C}),w("select",{"aria-label":e("Outcome filter"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"lg-req-outcome",onChange:Ee,value:S,children:[t("option",{value:"all",children:e("all")}),t("option",{value:"ok",children:e("ok")}),t("option",{value:"error",children:e("error")})]})]}),r==="archive"?t(Ze,{shardKey:E}):w(Qe,{children:[A==="error"&&t(Oe,{error:ve,testId:"lg-error"}),A==="empty"&&t(B,{description:e("Function and request logs for this shard show up here as your app handles traffic."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M4 5h16M4 12h16M4 19h10"})}),testId:"lg-empty",title:e("No logs.")}),A==="summary"&&w("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"logs-summary",children:[t("p",{className:"text-xs text-muted-foreground","data-testid":"logs-summary-total",children:e("{count} entries",{count:K.total})}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By level")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-levels",role:"grid",children:K.byLevel.map(o=>t(ne,{bucket:o},o.key))})]}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By function")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-paths",role:"grid",children:K.byPath.map(o=>t(ne,{bucket:o},o.key))})]})]}),A==="list"&&t("div",{className:"rounded-xl border border-border shadow-xs","data-testid":"lg-scroll",ref:ee,style:rr,children:t("div",{"aria-label":e("Recent logs"),"data-testid":"lg-table",role:"grid",style:ye,children:we.map(o=>r==="requests"?t(lr,{entry:Z[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key):t(ar,{entry:U[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key))})})]})]})};export{qr as LogsPanel,nr as filterLogs,dr as summarizeLogs};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useLunora as G}from"@lunora/react";import{useState as p
|
|
2
|
-
`)}))]})]})]})]})};export{
|
|
1
|
+
import{useLunora as G}from"@lunora/react";import{useState as p}from"react";import{E as J}from"../packem_shared/error-alert-t6cpEi0z.js";import{g as K}from"../packem_shared/badge-BbuuAio7.js";import{u as m}from"../packem_shared/button-BkCrNcAs.js";import{E as Q}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as X}from"../packem_shared/scroll-area-DTEq6Jec.js";import{Separator as Y}from"@base-ui/react/separator";import{c as Z}from"../packem_shared/utils-bhneXptQ.js";import{jsx as e,jsxs as l,Fragment as ee}from"react/jsx-runtime";import{N as te}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import{useAutoRefresh as ae}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{useT as re}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as g}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{i as k,f as $,c as ie,d as j,b as T,g as L}from"../packem_shared/internal-BSIsQVC6.js";function de({className:r,orientation:s="horizontal",...a}){return e(Y,{"data-slot":"separator",orientation:s,className:Z("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",r),...a})}const le=L(g.clearCapturedMail),se=L(g.sendTestMail),oe=/https?:\/\/[^\s"'<>)]+/i,z=r=>r===void 0?void 0:oe.exec(r)?.[0],ne=r=>{if(r!==void 0)return z(r.html)??z(r.text)},ce=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,me=r=>`${ce}${r}`,f=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,ue=(r,s)=>{const a=s.trim().toLowerCase();return a===""?r:r.filter(u=>`${u.subject} ${f(u.to)}`.toLowerCase().includes(a))},he=(r,s)=>{if(r.length!==0)return r.find(a=>a.id===s)??r[0]},Me=({limit:r=100})=>{const s=G(),a=re(),{data:u,error:b,errorSource:M,isLoading:S,refetch:x}=te(g.getCapturedMail,{limit:r}),[v,h]=p(null),[A,N]=p(null),[c,E]=p("html"),[w,F]=p(""),o=u?.entries??[],y=b??v,O=b===null?v:M,H=async()=>{h(null);try{await s.query(le,{},j("")),N(null),x()}catch(t){h(T(t))}},I=async()=>{h(null);try{await s.query(se,{},j("")),x()}catch(t){h(T(t))}};ae(()=>{x()},!0);const _=()=>{$(H())},q=()=>{$(I())},P=t=>{F(t.currentTarget.value)},D=t=>{const{id:d}=t.currentTarget.dataset;d!==void 0&&N(d)},R=t=>{const d=t.currentTarget.dataset.tab;(d==="headers"||d==="html"||d==="text")&&E(d)},B=t=>a(t==="html"?"HTML":t==="text"?"Plain text":"Headers"),C=ue(o,w),i=he(C,A),n=ne(i),U=()=>{n!==void 0&&ie(n)},W=()=>{n!==void 0&&"window"in globalThis&&globalThis.window.open(n,"_blank","noopener")};return l("div",{className:"flex flex-col gap-4","data-testid":"mail-panel",children:[l("div",{className:"flex flex-wrap items-center gap-2",children:[e(m,{"data-testid":"mail-send-test",onClick:q,size:"sm",type:"button",variant:"outline",children:a("Send test")}),e(m,{"data-testid":"mail-clear",disabled:o.length===0,onClick:_,size:"sm",type:"button",variant:"outline",children:a("Clear inbox")}),o.length>0&&e(K,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:a("{count} messages",{count:o.length})})]}),y!==null&&e(J,{error:O,testId:"mail-error"}),y===null&&!S&&o.length===0&&e(Q,{description:a("Email your app sends in dev is captured here — nothing is delivered."),icon:l("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[e("path",{d:"M4 5h16v14H4z"}),e("path",{d:"m4 6 8 6 8-6"})]}),testId:"mail-empty",title:a("No captured email.")}),o.length>0&&l("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[minmax(0,22rem)_1fr]","data-testid":"mail-reader",children:[l("div",{className:"flex flex-col gap-2",children:[e(V,{"aria-label":a("Search messages"),"data-testid":"mail-search",onChange:P,placeholder:a("Filter messages"),type:"search",value:w}),e(X,{className:"max-h-[32rem] rounded-xl border border-border bg-card shadow-xs","data-testid":"mail-list",children:e("ul",{className:"divide-y",children:C.map(t=>{const d=t.id===i?.id;return e("li",{children:l("button",{className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-sm hover:bg-muted/60 ${d?"bg-muted":""}`,"data-active":d,"data-id":t.id,"data-testid":"mail-list-item",onClick:D,type:"button",children:[e("span",{className:"w-full truncate font-medium",children:t.subject||a("(no subject)")}),e("span",{className:"w-full truncate text-xs text-muted-foreground",children:f(t.to)}),e("span",{className:"text-xs text-muted-foreground tabular-nums",children:k(t.capturedAt,"—")})]})},t.id)})})})]}),i!==void 0&&l("div",{className:"flex min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"mail-detail",children:[l("div",{className:"flex flex-col gap-1",children:[e("h2",{className:"truncate text-base font-semibold","data-testid":"mail-subject",children:i.subject||a("(no subject)")}),l("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs text-muted-foreground",children:[e("dt",{children:a("From")}),e("dd",{className:"truncate font-mono",children:i.from??"—"}),e("dt",{children:a("To")}),e("dd",{className:"truncate font-mono",children:f(i.to)}),i.cc!==void 0&&i.cc.length>0&&l(ee,{children:[e("dt",{children:a("Cc")}),e("dd",{className:"truncate font-mono",children:f(i.cc)})]}),e("dt",{children:a("Sent")}),e("dd",{className:"tabular-nums",children:k(i.capturedAt,"—")})]})]}),l("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[e(m,{"data-testid":"mail-copy-link",disabled:n===void 0,onClick:U,size:"sm",type:"button",variant:"outline",children:a("Copy link")}),e(m,{"data-testid":"mail-open-link",disabled:n===void 0,onClick:W,size:"sm",type:"button",variant:"outline",children:a("Open in new tab")})]}),e(de,{}),e("div",{className:"flex items-center gap-1","data-testid":"mail-tabs",role:"tablist",children:["html","text","headers"].map(t=>e(m,{"aria-selected":c===t,"data-tab":t,"data-testid":`mail-tab-${t}`,onClick:R,role:"tab",size:"sm",type:"button",variant:c===t?"secondary":"ghost",children:B(t)},t))}),l("div",{className:"min-h-[12rem]",children:[c==="html"&&(i.html===void 0?e("p",{className:"text-sm text-muted-foreground",children:a("No HTML body.")}):e("iframe",{className:"h-[24rem] w-full rounded-md border bg-white","data-testid":"mail-preview-html",sandbox:"",srcDoc:me(i.html),title:a("Email preview")})),c==="text"&&(i.text===void 0?e("p",{className:"text-sm text-muted-foreground",children:a("No text body.")}):e("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-text",children:i.text})),c==="headers"&&(i.headers===void 0||Object.keys(i.headers).length===0?e("p",{className:"text-sm text-muted-foreground",children:a("No headers.")}):e("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-headers",children:Object.entries(i.headers).map(([t,d])=>`${t}: ${d}`).join(`
|
|
2
|
+
`)}))]})]})]})]})};export{Me as MailPanel};
|