@lunora/studio 1.0.0-alpha.144 → 1.0.0-alpha.145

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/dist/index.d.mts +3 -3
  2. package/dist/index.d.ts +3 -3
  3. package/dist/index.mjs +1 -1
  4. package/dist/mount.d.mts +1 -1
  5. package/dist/mount.d.ts +1 -1
  6. package/dist/mount.mjs +1 -1
  7. package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -1
  8. package/dist/packem_chunks/ApiTab.mjs +1 -1
  9. package/dist/packem_chunks/AuditPanel.mjs +1 -1
  10. package/dist/packem_chunks/DeploymentHealthPanel.mjs +1 -1
  11. package/dist/packem_chunks/ExportImportPanel.mjs +1 -1
  12. package/dist/packem_chunks/FileBrowser.mjs +1 -1
  13. package/dist/packem_chunks/FunctionRunner.mjs +1 -1
  14. package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -1
  15. package/dist/packem_chunks/HealthPanel.mjs +1 -1
  16. package/dist/packem_chunks/InsightsPanel.mjs +1 -1
  17. package/dist/packem_chunks/LogsPanel.mjs +1 -1
  18. package/dist/packem_chunks/MailPanel.mjs +1 -1
  19. package/dist/packem_chunks/MetricsPanel.mjs +1 -1
  20. package/dist/packem_chunks/NotificationsPanel.mjs +1 -1
  21. package/dist/packem_chunks/PitrPanel.mjs +1 -1
  22. package/dist/packem_chunks/SchemaViewer.mjs +1 -1
  23. package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -1
  24. package/dist/packem_chunks/SettingsPanel.mjs +1 -1
  25. package/dist/packem_chunks/SqlEditorPanel.mjs +1 -1
  26. package/dist/packem_chunks/TableEditor.mjs +1 -1
  27. package/dist/packem_chunks/agents-panel.mjs +1 -1
  28. package/dist/packem_chunks/analytics-panel.mjs +1 -1
  29. package/dist/packem_chunks/auth-audit-panel.mjs +1 -1
  30. package/dist/packem_chunks/auth-config-panel.mjs +1 -1
  31. package/dist/packem_chunks/auth-sessions-panel.mjs +1 -1
  32. package/dist/packem_chunks/containers-panel.mjs +1 -1
  33. package/dist/packem_chunks/dashboards-panel.mjs +1 -1
  34. package/dist/packem_chunks/evals-panel.mjs +1 -1
  35. package/dist/packem_chunks/fanout-panel.mjs +1 -1
  36. package/dist/packem_chunks/flags-panel.mjs +1 -1
  37. package/dist/packem_chunks/issues-panel.mjs +1 -1
  38. package/dist/packem_chunks/kv-browser.mjs +1 -1
  39. package/dist/packem_chunks/log-drains-panel.mjs +1 -1
  40. package/dist/packem_chunks/migrations-route.mjs +1 -1
  41. package/dist/packem_chunks/organizations-panel.mjs +1 -1
  42. package/dist/packem_chunks/payments-panel.mjs +1 -1
  43. package/dist/packem_chunks/permissions-panel.mjs +1 -1
  44. package/dist/packem_chunks/queues-panel.mjs +1 -1
  45. package/dist/packem_chunks/reactors-panel.mjs +1 -1
  46. package/dist/packem_chunks/rls-panel.mjs +1 -1
  47. package/dist/packem_chunks/schedule-panel.mjs +1 -1
  48. package/dist/packem_chunks/storage-rules-panel.mjs +1 -1
  49. package/dist/packem_chunks/subscriptions-panel.mjs +1 -1
  50. package/dist/packem_chunks/sync-client-panel.mjs +1 -1
  51. package/dist/packem_chunks/traces-panel.mjs +1 -1
  52. package/dist/packem_chunks/users-panel.mjs +1 -1
  53. package/dist/packem_chunks/vector-browser.mjs +1 -1
  54. package/dist/packem_chunks/workflows-panel.mjs +1 -1
  55. package/dist/packem_shared/{ApiDocsPanel-l4DQX1Vq.mjs → ApiDocsPanel-CHCIjzZu.mjs} +1 -1
  56. package/dist/packem_shared/{ApiReferencePanel--YThTzHb.mjs → ApiReferencePanel-Cqy9Z7mO.mjs} +1 -1
  57. package/dist/packem_shared/{CommandPalette-C4UrhLxv.mjs → CommandPalette-DtLEYVhX.mjs} +1 -1
  58. package/dist/packem_shared/DataBrowser-Bf32rBcr.mjs +4 -0
  59. package/dist/packem_shared/{GlobalDataBrowser-DK4fgb7h.mjs → GlobalDataBrowser-CDpzXZxj.mjs} +1 -1
  60. package/dist/packem_shared/{HomePanel-B869m6wb.mjs → HomePanel-4gpRjcch.mjs} +1 -1
  61. package/dist/packem_shared/{MigrationsPanel-BZJ_Rv4t.mjs → MigrationsPanel-Cz0x3Pv6.mjs} +1 -1
  62. package/dist/packem_shared/{OpenRpcReferencePanel-Bn5UVD7s.mjs → OpenRpcReferencePanel-DZicbIOf.mjs} +1 -1
  63. package/dist/packem_shared/{ScheduledJobs-Db0HZ8R9.mjs → ScheduledJobs-BWziDVZO.mjs} +1 -1
  64. package/dist/packem_shared/{Studio-UxOpDgEl.mjs → Studio-C_yEjXcG.mjs} +1 -1
  65. package/dist/packem_shared/StudioApp-BQAxVB3v.mjs +1 -0
  66. package/dist/packem_shared/{advisor-view-DoSv436g.mjs → advisor-view-DyXQCN4y.mjs} +1 -1
  67. package/dist/packem_shared/{app.d-DFjg4Uki.d.mts → app.d-BbmO2HA2.d.mts} +25 -8
  68. package/dist/packem_shared/{app.d-DFjg4Uki.d.ts → app.d-BbmO2HA2.d.ts} +25 -8
  69. package/dist/packem_shared/{data-grid-BqNXJ9PF.mjs → data-grid-B8WGnT-5.mjs} +1 -1
  70. package/dist/packem_shared/{error-alert-CWs6gA3I.mjs → error-alert-ClpDVYvo.mjs} +1 -1
  71. package/dist/packem_shared/{grid-features-D8w5isjt.mjs → grid-features-CGs2pKcr.mjs} +1 -1
  72. package/dist/packem_shared/{home-panel-ChKczU0I.mjs → home-panel-CHtt8k50.mjs} +1 -1
  73. package/dist/packem_shared/{internal-CwaF9YNk.mjs → internal-D4gBuklE.mjs} +1 -1
  74. package/dist/packem_shared/{log-line-Dzg4YZ-K.mjs → log-line-DpRfHaVQ.mjs} +1 -1
  75. package/dist/packem_shared/{recording-client-BGyq5_JP.mjs → recording-client-CMvFFEC0.mjs} +1 -1
  76. package/dist/packem_shared/{reference-view-CZxBZSRo.mjs → reference-view-DS7FFPpP.mjs} +1 -1
  77. package/dist/packem_shared/{schema-diagram-DU83ObYH.mjs → schema-diagram-C27ETi10.mjs} +1 -1
  78. package/dist/packem_shared/{sql-result-table-DysT8h5P.mjs → sql-result-table-BLIMecXM.mjs} +1 -1
  79. package/dist/packem_shared/{studio-DE8N0tIQ.mjs → studio-DF0GqQBP.mjs} +1 -1
  80. package/dist/packem_shared/{table-list-sidebar-T7--Fv-V.mjs → table-list-sidebar-DKpSAP6p.mjs} +1 -1
  81. package/dist/packem_shared/use-admin-query-BvZH4unR.mjs +1 -0
  82. package/dist/packem_shared/{use-async-submit-DAKymxcP.mjs → use-async-submit-C1A11ka9.mjs} +1 -1
  83. package/dist/packem_shared/{use-auth-config-o-FcIXzR.mjs → use-auth-config-DocoJ5uQ.mjs} +1 -1
  84. package/dist/packem_shared/{use-open-trace-B5LJ96_0.mjs → use-open-trace-CTQIPjo9.mjs} +1 -1
  85. package/dist/packem_shared/{use-sql-assistant-Ib7Ik6cw.mjs → use-sql-assistant-BGoWYcGL.mjs} +1 -1
  86. package/dist/packem_shared/{wire-codec-DGcjNTbZ.mjs → wire-codec-BE-vgg1L.mjs} +1 -1
  87. package/dist/standalone/{chunk-N6Q4ORVH.js → chunk-2IRZXHAZ.js} +1 -1
  88. package/dist/standalone/{chunk-WQWZR452.js → chunk-2IUHQB2Q.js} +1 -1
  89. package/dist/standalone/{chunk-MFXZDB7X.js → chunk-2KAH7DVZ.js} +1 -1
  90. package/dist/standalone/{chunk-JWORA33E.js → chunk-3BFUVYWS.js} +1 -1
  91. package/dist/standalone/{chunk-3ILVYCWG.js → chunk-3DL3MLWV.js} +1 -1
  92. package/dist/standalone/{chunk-X6GR3SDI.js → chunk-3HEXTCWR.js} +1 -1
  93. package/dist/standalone/{chunk-NBC6NJFJ.js → chunk-3JV5F5SY.js} +1 -1
  94. package/dist/standalone/{chunk-S6K7T563.js → chunk-447V2Q3F.js} +1 -1
  95. package/dist/standalone/{chunk-E3AFG6TS.js → chunk-46XX646F.js} +1 -1
  96. package/dist/standalone/{chunk-7QRRR3K6.js → chunk-5JEYBOS6.js} +1 -1
  97. package/dist/standalone/{chunk-DNNLYDKX.js → chunk-5L3SHBMK.js} +1 -1
  98. package/dist/standalone/{chunk-2WVC52MX.js → chunk-6NO6WOSN.js} +1 -1
  99. package/dist/standalone/{chunk-DEJLINCJ.js → chunk-6T3STPM7.js} +1 -1
  100. package/dist/standalone/chunk-7AU5QSY7.js +1 -0
  101. package/dist/standalone/{chunk-YBWZUB6A.js → chunk-7B3OQXWL.js} +1 -1
  102. package/dist/standalone/{chunk-ZQ2PIQE4.js → chunk-7MJY23GU.js} +1 -1
  103. package/dist/standalone/{chunk-MMSQ35RC.js → chunk-AJQKSUVQ.js} +1 -1
  104. package/dist/standalone/{chunk-4RPBRBOA.js → chunk-B5WPIRI3.js} +1 -1
  105. package/dist/standalone/{chunk-BAKGFOG4.js → chunk-BN5TOI5O.js} +1 -1
  106. package/dist/standalone/chunk-BQ4P3PLU.js +1 -0
  107. package/dist/standalone/{chunk-HD7R6NQT.js → chunk-CIQRB2ET.js} +1 -1
  108. package/dist/standalone/{chunk-KASQ7MFV.js → chunk-CKKZCUAV.js} +1 -1
  109. package/dist/standalone/{chunk-P3MCKI2S.js → chunk-CZU3LZ2O.js} +1 -1
  110. package/dist/standalone/{chunk-FSOA4SEY.js → chunk-DDI4VSJH.js} +1 -1
  111. package/dist/standalone/{chunk-SNHEWTJY.js → chunk-DMPVOWA7.js} +1 -1
  112. package/dist/standalone/{chunk-BOEMUL7H.js → chunk-E6LDY3TC.js} +1 -1
  113. package/dist/standalone/{chunk-IFLTA2OD.js → chunk-E723DEAW.js} +1 -1
  114. package/dist/standalone/{chunk-URVSYGSQ.js → chunk-EDYGNYP2.js} +1 -1
  115. package/dist/standalone/{chunk-WISI2EBQ.js → chunk-EX33M5EE.js} +1 -1
  116. package/dist/standalone/{chunk-24XD27OU.js → chunk-FZKQX74O.js} +1 -1
  117. package/dist/standalone/{chunk-YW3RHFAI.js → chunk-GMEE5NFG.js} +1 -1
  118. package/dist/standalone/{chunk-BGAQFHQC.js → chunk-H3UCYGKY.js} +1 -1
  119. package/dist/standalone/{chunk-VGGVQFKU.js → chunk-H5PZ7JXM.js} +1 -1
  120. package/dist/standalone/{chunk-6HKQM3CN.js → chunk-HDWOQTDN.js} +1 -1
  121. package/dist/standalone/{chunk-FOILW5QP.js → chunk-HLE46T7J.js} +1 -1
  122. package/dist/standalone/{chunk-VNK6MRM6.js → chunk-HQPQTWW4.js} +1 -1
  123. package/dist/standalone/{chunk-NK7VUSL2.js → chunk-IAWCSJRR.js} +1 -1
  124. package/dist/standalone/chunk-IB3MWLG4.js +1 -0
  125. package/dist/standalone/{chunk-Y3YXQ6EU.js → chunk-IDB7SMQU.js} +1 -1
  126. package/dist/standalone/{chunk-IYS3RM7B.js → chunk-IYYZMNOB.js} +1 -1
  127. package/dist/standalone/{chunk-DZVEJZ3C.js → chunk-JMNCMGSE.js} +1 -1
  128. package/dist/standalone/chunk-JOQUDV7F.js +1 -0
  129. package/dist/standalone/{chunk-V4EMZ3HJ.js → chunk-JRN7SEJN.js} +1 -1
  130. package/dist/standalone/{chunk-XDLUQ6RQ.js → chunk-JSXJND3V.js} +1 -1
  131. package/dist/standalone/{chunk-SOUQNAE7.js → chunk-KLQEN4KA.js} +1 -1
  132. package/dist/standalone/{chunk-S73X6JFA.js → chunk-L2OWXMYF.js} +1 -1
  133. package/dist/standalone/{chunk-2BN33A2H.js → chunk-L3JA4OKZ.js} +1 -1
  134. package/dist/standalone/{chunk-6DHQ3IIO.js → chunk-MDVH5C5A.js} +1 -1
  135. package/dist/standalone/{chunk-ADDPGZY7.js → chunk-MHLBCDVW.js} +1 -1
  136. package/dist/standalone/{chunk-V7665E6Y.js → chunk-MJG6GTPL.js} +1 -1
  137. package/dist/standalone/{chunk-Y4Q25F6X.js → chunk-NXKPFGOP.js} +1 -1
  138. package/dist/standalone/{chunk-LSRUM2JJ.js → chunk-OUD7BAWE.js} +1 -1
  139. package/dist/standalone/{chunk-DMAQKIMP.js → chunk-PEEGF7YA.js} +2 -2
  140. package/dist/standalone/{chunk-TFNVT4ZJ.js → chunk-PWHV7BUN.js} +1 -1
  141. package/dist/standalone/{chunk-H2GRI4BS.js → chunk-QPVND4TE.js} +1 -1
  142. package/dist/standalone/{chunk-2V436GDL.js → chunk-RFTFYKFL.js} +1 -1
  143. package/dist/standalone/{chunk-UODFNQOY.js → chunk-RIO2HPN7.js} +4 -4
  144. package/dist/standalone/{chunk-Q2Q4UUXS.js → chunk-RNZ7XXND.js} +1 -1
  145. package/dist/standalone/{chunk-SSNHCN4D.js → chunk-SMVAE2AQ.js} +1 -1
  146. package/dist/standalone/{chunk-I5OKDKON.js → chunk-TWXJF4C2.js} +1 -1
  147. package/dist/standalone/{chunk-OJN5A2JI.js → chunk-UKQTCLDK.js} +4 -4
  148. package/dist/standalone/{chunk-7MXYEEMC.js → chunk-UZ5QI3PB.js} +1 -1
  149. package/dist/standalone/{chunk-MZXZ2XVQ.js → chunk-V5M356X3.js} +1 -1
  150. package/dist/standalone/{chunk-2OLPNCFW.js → chunk-VHMOFAJT.js} +1 -1
  151. package/dist/standalone/{chunk-MFMUFECI.js → chunk-VSHZE77Y.js} +1 -1
  152. package/dist/standalone/{chunk-6VDI4D53.js → chunk-VXWAQW3F.js} +1 -1
  153. package/dist/standalone/chunk-W3Q32C24.js +11 -0
  154. package/dist/standalone/{chunk-KDELXUQD.js → chunk-XABVLLMA.js} +1 -1
  155. package/dist/standalone/{chunk-ESVQSHW2.js → chunk-XGPF7VOP.js} +1 -1
  156. package/dist/standalone/{chunk-XTMBNA4V.js → chunk-YL7OENDU.js} +1 -1
  157. package/dist/standalone/{chunk-VAMUCQ75.js → chunk-YWYJLVEP.js} +1 -1
  158. package/dist/standalone/{chunk-OOKV3V3X.js → chunk-ZZENQM5W.js} +1 -1
  159. package/dist/standalone/studio.js +2 -2
  160. package/package.json +6 -6
  161. package/dist/packem_shared/DataBrowser-C2B-HNOL.mjs +0 -4
  162. package/dist/packem_shared/StudioApp-BdisV3FN.mjs +0 -1
  163. package/dist/packem_shared/use-admin-query-C7JRlFIE.mjs +0 -1
  164. package/dist/standalone/chunk-5NCE6W7L.js +0 -1
  165. package/dist/standalone/chunk-HWBXHONF.js +0 -1
  166. package/dist/standalone/chunk-IP6LZ2OL.js +0 -1
  167. package/dist/standalone/chunk-OT4I4LMO.js +0 -1
  168. package/dist/standalone/chunk-PPNBTM7O.js +0 -11
@@ -0,0 +1 @@
1
+ import{a as f}from"./chunk-IMOHEGMV.js";import{a as j}from"./chunk-66UGPQVC.js";import{a as C}from"./chunk-TWXJF4C2.js";import{P as v}from"./chunk-46ZJ3TM4.js";import"./chunk-4L4WTGN5.js";import{a as U}from"./chunk-EBWXFG4H.js";import"./chunk-TGHH7ZFA.js";import"./chunk-5GFSKIB2.js";import{b as q}from"./chunk-NCCAMFB6.js";import"./chunk-25NFR6EB.js";import{a as w}from"./chunk-4ZEL6BYL.js";import{f as L}from"./chunk-W3Q32C24.js";import"./chunk-FSRSK4LY.js";import"./chunk-RIO2HPN7.js";import{d as P,f as y,g as p,h,o as u}from"./chunk-NXKPFGOP.js";import{a as s,d as S,e as W,g as X}from"./chunk-YKXDMIHQ.js";var a=S(W(),1);var e=S(X(),1);var B=y(w.getPitrBookmark),Y=y(w.pitrRestore),de=s(({initialShardKey:z})=>{let m=L(),t=P(),o=z??"",[A,x]=(0,a.useState)(null),[l,O]=(0,a.useState)(""),[R,I]=(0,a.useState)(null),[c,D]=(0,a.useState)(""),[k,E]=(0,a.useState)(!1),[i,K]=(0,a.useState)(null),[T,n]=(0,a.useState)(null),[b,d]=(0,a.useState)(!1),g=(0,a.useCallback)(async()=>{d(!0),n(null);try{let r=await m.query(B,{},p(o));x(r.current)}catch(r){n(h(r))}d(!1)},[m,o]);(0,a.useEffect)(()=>{u(g())},[g]),j(()=>{u((async()=>{try{let r=await m.query(B,{},p(o));x(r.current)}catch{}})())},!0);let M=s(r=>{O(r.target.value)},"A"),Z=s(r=>{D(r.target.value)},"U"),_=s(r=>{E(r.target.checked)},"q"),G=s(()=>{l.trim()!==""&&u((async()=>{d(!0),n(null);try{let r=await m.query(B,{time:l.trim()},p(o));I(r.forTime??null),x(r.current)}catch(r){I(null),n(h(r))}d(!1)})())},"K"),F=s(r=>{u((async()=>{d(!0),n(null);try{let N=await m.mutation(Y,r,p(o));K(N),await g()}catch(N){n(h(N))}d(!1)})())},"C"),H=c.trim()!==""||l.trim()!=="",J=t("Restore {shard} to {target}?",{shard:o===""?t("root"):o,target:c.trim()===""?l.trim():t("the given bookmark")}),Q=s(()=>{let r=k?{restart:!0}:{};c.trim()===""?r.time=l.trim():r.bookmark=c.trim(),F(r)},"z"),V=s(()=>{i!==null&&F(k?{bookmark:i.undoBookmark,restart:!0}:{bookmark:i.undoBookmark})},"D");return(0,e.jsxs)("div",{className:"flex flex-col gap-4","data-testid":"lunora-pitr",children:[(0,e.jsx)("div",{className:"flex flex-wrap items-center gap-3",children:(0,e.jsxs)("span",{className:"text-xs text-muted-foreground",children:[t("Shard"),": ",(0,e.jsx)("span",{className:"font-mono",children:o===""?t("root"):o})]})}),(0,e.jsx)("p",{className:"text-sm text-muted-foreground","data-testid":"pitr-note",children:t("In-place recovery to any moment in the last 30 days. For older or portable recovery, use the snapshot backup tier.")}),T!==null&&(0,e.jsx)("p",{className:"text-sm text-destructive","data-testid":"pitr-error",role:"alert",children:T}),(0,e.jsxs)("section",{className:"rounded-xl border border-border bg-card p-3 shadow-xs",children:[(0,e.jsx)("h3",{className:"mb-2 text-sm font-semibold",children:t("Current bookmark")}),(0,e.jsx)("p",{className:"font-mono text-xs break-all text-muted-foreground","data-testid":"pitr-current",children:A??(0,e.jsx)("span",{className:"text-muted-foreground",children:"\u2014"})})]}),(0,e.jsxs)("section",{className:"flex flex-col gap-3 rounded-xl border border-border bg-card p-3 shadow-xs",children:[(0,e.jsx)("h3",{className:"text-sm font-semibold",children:t("Restore")}),(0,e.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,e.jsx)(f,{htmlFor:"pitr-time",children:t("Time (ISO or epoch-ms, last 30 days)")}),(0,e.jsxs)("div",{className:"flex items-center gap-2",children:[(0,e.jsx)(v,{"data-testid":"pitr-time",id:"pitr-time",onChange:M,placeholder:"2026-06-01T00:00:00.000Z",value:l}),(0,e.jsx)(U,{"data-testid":"pitr-preview",disabled:b||l.trim()==="",onClick:G,size:"sm",type:"button",variant:"outline",children:t("Preview")})]}),R!==null&&(0,e.jsxs)("p",{className:"font-mono text-xs break-all text-muted-foreground","data-testid":"pitr-preview-bookmark",children:[t("Bookmark for that time"),": ",R]})]}),(0,e.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,e.jsx)(f,{htmlFor:"pitr-bookmark",children:t("Or an explicit bookmark (wins over time)")}),(0,e.jsx)(v,{"data-testid":"pitr-bookmark",id:"pitr-bookmark",onChange:Z,placeholder:t("bookmark string"),value:c})]}),(0,e.jsxs)(f,{className:"flex items-center gap-2 text-xs font-normal text-muted-foreground",htmlFor:"pitr-restart",children:[(0,e.jsx)("input",{checked:k,className:"size-4 accent-primary","data-testid":"pitr-restart",id:"pitr-restart",onChange:_,type:"checkbox"}),t("Restart the shard now so recovery applies immediately")]}),(0,e.jsx)("div",{children:(0,e.jsx)(C,{confirmLabel:J,disabled:b||!H,onConfirm:Q,testId:"pitr-restore",children:t("Restore")})})]}),i!==null&&(0,e.jsxs)("section",{className:"flex flex-col gap-2 rounded-xl border border-border bg-card p-3 shadow-xs","data-testid":"pitr-result",children:[(0,e.jsxs)("div",{className:"flex items-center gap-2",children:[(0,e.jsx)("h3",{className:"text-sm font-semibold",children:t("Restore armed")}),(0,e.jsx)(q,{variant:i.restarted?"destructive":"secondary",children:i.restarted?t("restarted now"):t("on next restart")})]}),(0,e.jsxs)("p",{className:"font-mono text-xs break-all text-muted-foreground",children:[t("Restored to"),": ",i.restoredTo]}),(0,e.jsxs)("p",{className:"font-mono text-xs break-all text-muted-foreground","data-testid":"pitr-undo-bookmark",children:[t("Undo bookmark"),": ",i.undoBookmark]}),(0,e.jsx)("div",{children:(0,e.jsx)(C,{confirmLabel:t("Confirm undo"),disabled:b,onConfirm:V,testId:"pitr-undo",children:t("Undo restore")})})]})]})},"ce");export{de as PitrPanel};
@@ -1 +1 @@
1
- import{a as ke}from"./chunk-EA2JKR5D.js";import{a as A}from"./chunk-IMOHEGMV.js";import{a as Pe}from"./chunk-7QRRR3K6.js";import{a as be}from"./chunk-IFLTA2OD.js";import"./chunk-OGUKYRFM.js";import"./chunk-OKG3HWSJ.js";import{P as M}from"./chunk-46ZJ3TM4.js";import"./chunk-4L4WTGN5.js";import{a as T}from"./chunk-EBWXFG4H.js";import"./chunk-TGHH7ZFA.js";import"./chunk-5GFSKIB2.js";import{b as j}from"./chunk-NCCAMFB6.js";import"./chunk-25NFR6EB.js";import{a as ge}from"./chunk-TFNVT4ZJ.js";import"./chunk-ULIQFBZU.js";import"./chunk-SNHEWTJY.js";import"./chunk-35DM4JJG.js";import{a as Z}from"./chunk-4ZEL6BYL.js";import{c as ae}from"./chunk-IP6LZ2OL.js";import{f as oe}from"./chunk-PPNBTM7O.js";import"./chunk-FSRSK4LY.js";import"./chunk-UODFNQOY.js";import{a as de}from"./chunk-FKVZRPV5.js";import{a as Ne,b as ve,c as we,d as ce,e as le,f as re}from"./chunk-HEAQVSNS.js";import{a as se,b as pe,c as fe,d as ue,e as ne}from"./chunk-WUWBZPUK.js";import{d as V,f as he,g as xe,h as ye,o as te}from"./chunk-Y4Q25F6X.js";import{a as d,d as ie,e as _e,f as Fe,g as Te}from"./chunk-YKXDMIHQ.js";var p=ie(_e(),1);var me=ie(Fe(),1);var t=ie(Te(),1);var Ce=["read","insert","update","delete"],Ae=d((e,a)=>({delete:e("Delete"),insert:e("Insert"),read:e("Read"),update:e("Update")})[a],"_e"),Ee=d(e=>{let a=new Set;for(let i of e?.advisories??[])if(i.name==="rls_uncovered_table"){let{table:s}=i.metadata;typeof s=="string"&&s!==""&&a.add(s)}return a},"Ie"),$e=d((e,a,i)=>{let s=new Map,l=d(n=>{let o=s.get(n);if(o!==void 0)return o;let f={cells:{delete:{},insert:{},read:{},update:{}},maskedColumns:new Set,table:n,uncovered:i.has(n)};return s.set(n,f),f},"l");for(let n of e)l(n.table).cells[n.on]={procedure:n.procedure};for(let n of a)l(n.table).maskedColumns.add(n.column);for(let n of i)l(n);return[...s.values()].toSorted((n,o)=>n.table.localeCompare(o.table))},"Ee"),ze=d(e=>{let a=(0,me.c)(17),i;a[0]!==e?(i=e===void 0?{}:e,a[0]=e,a[1]=i):i=a[1];let{onProbe:s}=i,l=V(),n,o;a[2]===Symbol.for("react.memo_cache_sentinel")?(n={},o={live:!0},a[2]=n,a[3]=o):(n=a[2],o=a[3]);let f=ae(Z.rlsPolicies,n,o),r;a[4]===Symbol.for("react.memo_cache_sentinel")?(r={},a[4]=r):r=a[4];let b=ae(Z.maskPolicies,r),h;a[5]===Symbol.for("react.memo_cache_sentinel")?(h={},a[5]=h):h=a[5];let g=ae(Z.getAdvisories,h),N;if(a[6]!==g.data||a[7]!==b.data||a[8]!==s||a[9]!==f||a[10]!==l){let v=null;f.data!==void 0&&(v=Array.isArray(f.data.policies)?f.data.policies:[]);let E=Array.isArray(b.data?.columns)?b.data.columns:[],O=g.data??null,{error:C,errorSource:w,liveError:S}=f,_=v===null?[]:$e(v,E,Ee(O)),k;a[12]!==S?(k=(0,t.jsx)("div",{className:"flex items-center justify-end",children:(0,t.jsx)(Pe,{message:S,prefix:"pm"})}),a[12]=S,a[13]=k):k=a[13];let x;a[14]!==C||a[15]!==w?(x=C!==null&&(0,t.jsx)(ge,{error:w,testId:"pm-error"}),a[14]=C,a[15]=w,a[16]=x):x=a[16],N=(0,t.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-matrix",children:[k,x,v!==null&&_.length===0?(0,t.jsx)(de,{description:l("Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix."),testId:"pm-empty",title:l("No policy")}):(0,t.jsxs)(Ne,{"data-testid":"pm-table",children:[(0,t.jsx)(ve,{children:(0,t.jsxs)(ce,{children:[(0,t.jsx)(le,{children:l("Table")}),Ce.map(c=>(0,t.jsx)(le,{children:Ae(l,c)},c)),(0,t.jsx)(le,{children:l("Masked columns")})]})}),(0,t.jsx)(we,{children:_.map(c=>(0,t.jsxs)(ce,{"data-testid":`pm-row-${c.table}`,children:[(0,t.jsx)(re,{className:"font-mono text-xs",children:(0,t.jsxs)("span",{className:"flex items-center gap-1.5",children:[c.table,c.uncovered&&(0,t.jsx)(j,{"data-testid":`pm-uncovered-${c.table}`,title:l("Uncovered \u2014 reachable without a policy"),variant:"destructive",children:l("Uncovered \u2014 reachable without a policy")})]})}),Ce.map(I=>{let y=c.cells[I];return(0,t.jsx)(re,{"data-testid":`pm-cell-${c.table}-${I}`,children:y.procedure===void 0?(0,t.jsx)("span",{className:"text-xs text-muted-foreground",children:l("No policy")}):(0,t.jsxs)("span",{className:"flex flex-col gap-1",children:[(0,t.jsx)(j,{variant:"secondary",children:l("Covered by {procedure}",{procedure:y.procedure})}),s!==void 0&&(0,t.jsx)(T,{className:"h-auto justify-start p-0 text-[11px]","data-testid":`pm-probe-${c.table}-${I}`,onClick:d(()=>{s(c.table,I,y.procedure??"")},"onClick"),size:"xs",type:"button",variant:"ghost",children:l("Probe this")})]})},I)}),(0,t.jsx)(re,{children:c.maskedColumns.size===0?(0,t.jsx)("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"\u2014"}):(0,t.jsx)("span",{className:"flex flex-wrap gap-1",children:[...c.maskedColumns].map(Re)})})]},c.table))})]})]}),a[6]=g.data,a[7]=b.data,a[8]=s,a[9]=f,a[10]=l,a[11]=N}else N=a[11];return N},"Fe");function Re(e){return(0,t.jsx)(j,{variant:"outline",children:e},e)}d(Re,"Re");var Le=he(Z.runAs),Oe=d(()=>{let e=oe();return async({args:a,functionPath:i,shardKey:s="",userId:l})=>{let n=Le;try{return{kind:"allowed",value:await e.query(n,{args:a,functionPath:i,userId:l},xe(s))}}catch(o){return{kind:"denied",message:o instanceof Error?o.message:String(o)}}}},"Le"),je=d(e=>e===void 0?"undefined":JSON.stringify(e,null,2),"Me"),Me=d(({functions:e,prefill:a,runAsIdentity:i=!1}={})=>{let s=oe(),l=V(),n=Oe(),[o,f]=(0,p.useState)(null),[r,b]=(0,p.useState)(null),h=e??o??[],[g,N]=(0,p.useState)(""),[v,E]=(0,p.useState)("{}"),[O,C]=(0,p.useState)(""),[w,S]=(0,p.useState)(""),[_,k]=(0,p.useState)(!1),[x,c]=(0,p.useState)(null),[I,y]=(0,p.useState)(null),F=(0,p.useRef)(-1);(0,p.useEffect)(()=>{if(e!==void 0)return;let m=!1;return s.listFunctions().then(u=>(m||f(u),u)).catch(u=>{m||b(ye(u))}),()=>{m=!0}},[s,e]),(0,p.useEffect)(()=>{if(a===void 0||F.current===a.nonce)return;F.current=a.nonce;let m=a.functionPath;queueMicrotask(()=>{N(m),c(null)})},[a]);let P=g===""?h[0]?.path??"":g,$=d(async()=>{if(P==="")return;let m;try{m=v.trim()===""?{}:JSON.parse(v)}catch(u){y(l("Invalid JSON args: {message}",{message:u.message})),c(null);return}y(null),k(!0);try{let u=await n({args:m,functionPath:P,shardKey:O.trim(),userId:w.trim()});c(u)}finally{k(!1)}},"E"),z=d(()=>{te($())},"F"),Y=d(m=>{N(m.target.value)},"Y"),R=d(m=>{E(m.target.value)},"R"),L=d(m=>{S(m.target.value)},"O");return(0,t.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-playground",children:[r!==null&&(0,t.jsx)("p",{className:"text-sm text-destructive","data-testid":"pp-discover-error",role:"alert",children:r}),!i&&(0,t.jsx)(de,{description:l("Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS."),testId:"pp-gate",title:l("Set `runAsIdentity` to forge an identity and probe access.")}),(0,t.jsxs)("div",{className:"flex flex-col gap-3 rounded-md border border-border p-3",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(A,{htmlFor:"pp-function",children:l("Function")}),(0,t.jsx)("select",{"aria-label":l("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","data-testid":"pp-function",id:"pp-function",onChange:Y,value:P,children:h.map(m=>(0,t.jsxs)("option",{value:m.path,children:[m.path," (",m.kind,")"]},m.path))})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(A,{htmlFor:"pp-args",children:l("Arguments")}),(0,t.jsx)(ke,{"aria-label":l("Arguments"),className:"font-mono text-xs","data-testid":"pp-args",id:"pp-args",onChange:R,value:v})]}),(0,t.jsx)(be,{onChange:C,testId:"pp-shard",value:O}),(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(A,{htmlFor:"pp-user",children:l("Run as (userId)")}),(0,t.jsx)(M,{"aria-label":l("Identity (userId) to run as"),className:"font-mono text-xs","data-testid":"pp-user",id:"pp-user",onChange:L,placeholder:l("Leave empty to run as admin"),value:w})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(T,{"data-testid":"pp-run",disabled:!i||_||P==="",onClick:z,type:"button",children:l(_?"Probing\u2026":"Run probe")}),w.trim()!==""&&(0,t.jsx)(j,{"data-testid":"pp-as-badge",variant:"secondary",children:l("as {userId}",{userId:w.trim()})})]})]}),I!==null&&(0,t.jsx)("p",{className:"text-sm text-destructive","data-testid":"pp-args-error",role:"alert",children:I}),x!==null&&x.kind==="allowed"&&(0,t.jsxs)("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-allowed",children:[(0,t.jsx)(j,{variant:"secondary",children:l("Allowed")}),(0,t.jsx)("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-result",children:je(x.value)})]}),x!==null&&x.kind==="denied"&&(0,t.jsxs)("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-denied",children:[(0,t.jsx)(j,{variant:"destructive",children:l("Denied")}),(0,t.jsx)("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"pp-denied",role:"alert",children:x.message})]})]})},"$e"),De="/__lunora/policy-scaffold",Ue={"already-wired":"That procedure already has an rls(...) policy wired in.","file-exists":"A policy file with that name already exists \u2014 pick another name or edit it by hand.","invalid-identifier":"Name, table, and policy-set must be plain identifiers (letters, digits, _ or $).","unknown-procedure":"No exported procedure was found at that file path.","unsupported-procedure-shape":"That procedure uses the bare query({\u2026}) form \u2014 convert it to the builder form (c.use(\u2026).query(\u2026)) before wiring RLS."},qe=d(async e=>{let a=await fetch(De,{body:JSON.stringify(e),headers:{"Content-Type":"application/json"},method:"POST"}),i=await a.json();if(i.needsManualEdit===!0)return{kind:"needs-manual-edit",message:i.message??"This change must be made by hand."};if(a.ok)return{diagnostics:i.diagnostics??[],kind:"ok",label:i.fileName??i.exportName??""};let s=i.error;return{kind:"error",message:s===void 0?`policy scaffold failed (${String(a.status)})`:Ue[s]??s}},"Ue"),Se={exportName:"",filePath:"",policyName:"",policies:"",tableName:""},Je=d(()=>{let e=(0,me.c)(69),a=V(),[i,s]=(0,p.useState)(null),[l,n]=(0,p.useState)(!1),[o,f]=(0,p.useState)(null),[r,b]=(0,p.useState)(Se),h;e[0]===Symbol.for("react.memo_cache_sentinel")?(h=d(ee=>{let G=ee.target.name,{value:H}=ee.target;b(Ie=>({...Ie,[G]:H}))},"u"),e[0]=h):h=e[0];let g=h,N;e[1]===Symbol.for("react.memo_cache_sentinel")?(N=d(()=>{s(null),b(Se)},"v"),e[1]=N):N=e[1];let v=N,E;e[2]===Symbol.for("react.memo_cache_sentinel")?(E=d(async ee=>{n(!0),f(null);try{let G=await qe(ee);f(G),G.kind==="ok"&&v()}catch(G){let H=G;f({kind:"error",message:H instanceof Error?H.message:String(H)})}n(!1)},"I"),e[2]=E):E=e[2];let O=E,C;e[3]!==r.policyName||e[4]!==r.tableName?(C=d(()=>{te(O({kind:"scaffoldPolicy",name:r.policyName.trim(),table:r.tableName.trim()}))},"P"),e[3]=r.policyName,e[4]=r.tableName,e[5]=C):C=e[5];let w=C,S;e[6]!==r.exportName||e[7]!==r.filePath||e[8]!==r.policies?(S=d(()=>{te(O({exportName:r.exportName.trim(),filePath:r.filePath.trim(),kind:"wireRls",policies:r.policies.trim()}))},"w"),e[6]=r.exportName,e[7]=r.filePath,e[8]=r.policies,e[9]=S):S=e[9];let _=S,k;e[10]===Symbol.for("react.memo_cache_sentinel")?(k=d(()=>{f(null),s("scaffold")},"S"),e[10]=k):k=e[10];let x=k,c;e[11]===Symbol.for("react.memo_cache_sentinel")?(c=d(()=>{f(null),s("wire")},"d"),e[11]=c):c=e[11];let I=c,y;e[12]!==a?(y=a("Scaffold access rules"),e[12]=a,e[13]=y):y=e[13];let F;e[14]!==y?(F=(0,t.jsx)(fe,{children:y}),e[14]=y,e[15]=F):F=e[15];let P;e[16]!==a?(P=a("Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only."),e[16]=a,e[17]=P):P=e[17];let $;e[18]!==P?($=(0,t.jsx)(ue,{children:P}),e[18]=P,e[19]=$):$=e[19];let z;e[20]!==$||e[21]!==F?(z=(0,t.jsxs)(pe,{children:[F,$]}),e[20]=$,e[21]=F,e[22]=z):z=e[22];let Y=i==="scaffold"?"default":"outline",R;e[23]!==a?(R=a("New policy file"),e[23]=a,e[24]=R):R=e[24];let L;e[25]!==Y||e[26]!==R?(L=(0,t.jsx)(T,{"data-testid":"policy-scaffolder-new",onClick:x,size:"xs",type:"button",variant:Y,children:R}),e[25]=Y,e[26]=R,e[27]=L):L=e[27];let m=i==="wire"?"default":"outline",u;e[28]!==a?(u=a("Wire into a procedure"),e[28]=a,e[29]=u):u=e[29];let D;e[30]!==m||e[31]!==u?(D=(0,t.jsx)(T,{"data-testid":"policy-scaffolder-wire",onClick:I,size:"xs",type:"button",variant:m,children:u}),e[30]=m,e[31]=u,e[32]=D):D=e[32];let U;e[33]!==L||e[34]!==D?(U=(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[L,D]}),e[33]=L,e[34]=D,e[35]=U):U=e[35];let q;e[36]!==l||e[37]!==r.policyName||e[38]!==r.tableName||e[39]!==i||e[40]!==w||e[41]!==a?(q=i==="scaffold"&&(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-new-form",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-name",children:a("Policy name")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-name",id:"policy-scaffolder-name",name:"policyName",onChange:g,value:r.policyName})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-table",children:a("Table name")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-table",id:"policy-scaffolder-table",name:"tableName",onChange:g,value:r.tableName})]}),(0,t.jsx)(T,{"data-testid":"policy-scaffolder-create",disabled:l||r.policyName.trim()===""||r.tableName.trim()==="",onClick:w,size:"xs",type:"button",children:a(l?"Creating\u2026":"Create policy file")}),(0,t.jsx)(T,{onClick:v,size:"xs",type:"button",variant:"ghost",children:a("Cancel")})]}),e[36]=l,e[37]=r.policyName,e[38]=r.tableName,e[39]=i,e[40]=w,e[41]=a,e[42]=q):q=e[42];let J;e[43]!==l||e[44]!==r.exportName||e[45]!==r.filePath||e[46]!==r.policies||e[47]!==i||e[48]!==_||e[49]!==a?(J=i==="wire"&&(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-wire-form",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-file",children:a("Procedure file path")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-file",id:"policy-scaffolder-file",name:"filePath",onChange:g,value:r.filePath})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-export",children:a("Exported procedure")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-export",id:"policy-scaffolder-export",name:"exportName",onChange:g,value:r.exportName})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-policies",children:a("Policy set identifier")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-policies",id:"policy-scaffolder-policies",name:"policies",onChange:g,value:r.policies})]}),(0,t.jsx)(T,{"data-testid":"policy-scaffolder-apply",disabled:l||r.filePath.trim()===""||r.exportName.trim()===""||r.policies.trim()==="",onClick:_,size:"xs",type:"button",children:a(l?"Wiring\u2026":"Wire RLS")}),(0,t.jsx)(T,{onClick:v,size:"xs",type:"button",variant:"ghost",children:a("Cancel")})]}),e[43]=l,e[44]=r.exportName,e[45]=r.filePath,e[46]=r.policies,e[47]=i,e[48]=_,e[49]=a,e[50]=J):J=e[50];let W;e[51]!==o?(W=o?.kind==="error"&&(0,t.jsx)("p",{className:"mt-3 text-sm text-destructive","data-testid":"policy-scaffolder-error",role:"alert",children:o.message}),e[51]=o,e[52]=W):W=e[52];let B;e[53]!==o?.kind||e[54]!==a?(B=o?.kind==="needs-manual-edit"&&(0,t.jsx)("p",{className:"mt-3 text-sm text-amber-600 dark:text-amber-500","data-testid":"policy-scaffolder-manual",role:"alert",children:a("This change must be made by hand \u2014 the scaffolder only adds new, deny-by-default rules.")}),e[53]=o?.kind,e[54]=a,e[55]=B):B=e[55];let K;e[56]!==o||e[57]!==a?(K=o?.kind==="ok"&&(0,t.jsxs)("div",{className:"mt-3 flex flex-col gap-1","data-testid":"policy-scaffolder-ok",children:[(0,t.jsx)("p",{className:"text-sm text-emerald-600 dark:text-emerald-500",children:a("Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.",{label:o.label})}),o.diagnostics.length>0&&(0,t.jsx)("ul",{className:"flex flex-col gap-0.5","data-testid":"policy-scaffolder-diagnostics",children:o.diagnostics.map(We)})]}),e[56]=o,e[57]=a,e[58]=K):K=e[58];let Q;e[59]!==U||e[60]!==q||e[61]!==J||e[62]!==W||e[63]!==B||e[64]!==K?(Q=(0,t.jsxs)(ne,{children:[U,q,J,W,B,K]}),e[59]=U,e[60]=q,e[61]=J,e[62]=W,e[63]=B,e[64]=K,e[65]=Q):Q=e[65];let X;return e[66]!==z||e[67]!==Q?(X=(0,t.jsxs)(se,{"data-testid":"policy-scaffolder",size:"sm",children:[z,Q]}),e[66]=z,e[67]=Q,e[68]=X):X=e[68],X},"je");function We(e){return(0,t.jsx)("li",{className:"font-mono text-[11px] text-destructive",children:e},e)}d(We,"Be");var st=d(({functions:e,runAsIdentity:a=!1,schemaEditable:i=!1}={})=>{let s=V(),[l,n]=(0,p.useState)(void 0),o=d((f,r,b)=>{b!==""&&n(h=>({functionPath:b,nonce:(h?.nonce??0)+1}))},"o");return(0,t.jsxs)("div",{className:"flex flex-col gap-8","data-testid":"lunora-permissions",children:[(0,t.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,t.jsx)("header",{className:"border-b border-border px-4 py-3",children:(0,t.jsx)("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:s("Permissions")})}),(0,t.jsx)(ze,{onProbe:o})]}),(0,t.jsx)("section",{className:"flex flex-col gap-3",children:(0,t.jsxs)(se,{className:"gap-0 py-0",children:[(0,t.jsx)("header",{className:"border-b border-border px-4 py-3",children:(0,t.jsx)("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:s("Probe")})}),(0,t.jsxs)(ne,{className:"px-4 py-4",children:[(0,t.jsx)("p",{className:"mb-3 text-sm text-muted-foreground",children:s("Pick a function and an identity, then run it to see the access outcome.")}),(0,t.jsx)(Me,{functions:e,prefill:l,runAsIdentity:a})]})]})}),i&&(0,t.jsx)("section",{className:"flex flex-col gap-2",children:(0,t.jsx)(Je,{})})]})},"nt");export{st as PermissionsPanel};
1
+ import{a as ke}from"./chunk-EA2JKR5D.js";import{a as A}from"./chunk-IMOHEGMV.js";import{a as Pe}from"./chunk-5JEYBOS6.js";import{a as be}from"./chunk-E723DEAW.js";import"./chunk-OGUKYRFM.js";import"./chunk-OKG3HWSJ.js";import{P as M}from"./chunk-46ZJ3TM4.js";import"./chunk-4L4WTGN5.js";import{a as T}from"./chunk-EBWXFG4H.js";import"./chunk-TGHH7ZFA.js";import"./chunk-5GFSKIB2.js";import{b as j}from"./chunk-NCCAMFB6.js";import"./chunk-25NFR6EB.js";import{a as ge}from"./chunk-PWHV7BUN.js";import"./chunk-ULIQFBZU.js";import"./chunk-DMPVOWA7.js";import"./chunk-35DM4JJG.js";import{a as Z}from"./chunk-4ZEL6BYL.js";import{c as ae}from"./chunk-BQ4P3PLU.js";import{f as oe}from"./chunk-W3Q32C24.js";import"./chunk-FSRSK4LY.js";import"./chunk-RIO2HPN7.js";import{a as de}from"./chunk-FKVZRPV5.js";import{a as Ne,b as ve,c as we,d as ce,e as le,f as re}from"./chunk-HEAQVSNS.js";import{a as se,b as pe,c as fe,d as ue,e as ne}from"./chunk-WUWBZPUK.js";import{d as V,f as he,g as xe,h as ye,o as te}from"./chunk-NXKPFGOP.js";import{a as d,d as ie,e as _e,f as Fe,g as Te}from"./chunk-YKXDMIHQ.js";var p=ie(_e(),1);var me=ie(Fe(),1);var t=ie(Te(),1);var Ce=["read","insert","update","delete"],Ae=d((e,a)=>({delete:e("Delete"),insert:e("Insert"),read:e("Read"),update:e("Update")})[a],"_e"),Ee=d(e=>{let a=new Set;for(let i of e?.advisories??[])if(i.name==="rls_uncovered_table"){let{table:s}=i.metadata;typeof s=="string"&&s!==""&&a.add(s)}return a},"Ie"),$e=d((e,a,i)=>{let s=new Map,l=d(n=>{let o=s.get(n);if(o!==void 0)return o;let f={cells:{delete:{},insert:{},read:{},update:{}},maskedColumns:new Set,table:n,uncovered:i.has(n)};return s.set(n,f),f},"l");for(let n of e)l(n.table).cells[n.on]={procedure:n.procedure};for(let n of a)l(n.table).maskedColumns.add(n.column);for(let n of i)l(n);return[...s.values()].toSorted((n,o)=>n.table.localeCompare(o.table))},"Ee"),ze=d(e=>{let a=(0,me.c)(17),i;a[0]!==e?(i=e===void 0?{}:e,a[0]=e,a[1]=i):i=a[1];let{onProbe:s}=i,l=V(),n,o;a[2]===Symbol.for("react.memo_cache_sentinel")?(n={},o={live:!0},a[2]=n,a[3]=o):(n=a[2],o=a[3]);let f=ae(Z.rlsPolicies,n,o),r;a[4]===Symbol.for("react.memo_cache_sentinel")?(r={},a[4]=r):r=a[4];let b=ae(Z.maskPolicies,r),h;a[5]===Symbol.for("react.memo_cache_sentinel")?(h={},a[5]=h):h=a[5];let g=ae(Z.getAdvisories,h),N;if(a[6]!==g.data||a[7]!==b.data||a[8]!==s||a[9]!==f||a[10]!==l){let v=null;f.data!==void 0&&(v=Array.isArray(f.data.policies)?f.data.policies:[]);let E=Array.isArray(b.data?.columns)?b.data.columns:[],O=g.data??null,{error:C,errorSource:w,liveError:S}=f,_=v===null?[]:$e(v,E,Ee(O)),k;a[12]!==S?(k=(0,t.jsx)("div",{className:"flex items-center justify-end",children:(0,t.jsx)(Pe,{message:S,prefix:"pm"})}),a[12]=S,a[13]=k):k=a[13];let x;a[14]!==C||a[15]!==w?(x=C!==null&&(0,t.jsx)(ge,{error:w,testId:"pm-error"}),a[14]=C,a[15]=w,a[16]=x):x=a[16],N=(0,t.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-matrix",children:[k,x,v!==null&&_.length===0?(0,t.jsx)(de,{description:l("Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix."),testId:"pm-empty",title:l("No policy")}):(0,t.jsxs)(Ne,{"data-testid":"pm-table",children:[(0,t.jsx)(ve,{children:(0,t.jsxs)(ce,{children:[(0,t.jsx)(le,{children:l("Table")}),Ce.map(c=>(0,t.jsx)(le,{children:Ae(l,c)},c)),(0,t.jsx)(le,{children:l("Masked columns")})]})}),(0,t.jsx)(we,{children:_.map(c=>(0,t.jsxs)(ce,{"data-testid":`pm-row-${c.table}`,children:[(0,t.jsx)(re,{className:"font-mono text-xs",children:(0,t.jsxs)("span",{className:"flex items-center gap-1.5",children:[c.table,c.uncovered&&(0,t.jsx)(j,{"data-testid":`pm-uncovered-${c.table}`,title:l("Uncovered \u2014 reachable without a policy"),variant:"destructive",children:l("Uncovered \u2014 reachable without a policy")})]})}),Ce.map(I=>{let y=c.cells[I];return(0,t.jsx)(re,{"data-testid":`pm-cell-${c.table}-${I}`,children:y.procedure===void 0?(0,t.jsx)("span",{className:"text-xs text-muted-foreground",children:l("No policy")}):(0,t.jsxs)("span",{className:"flex flex-col gap-1",children:[(0,t.jsx)(j,{variant:"secondary",children:l("Covered by {procedure}",{procedure:y.procedure})}),s!==void 0&&(0,t.jsx)(T,{className:"h-auto justify-start p-0 text-[11px]","data-testid":`pm-probe-${c.table}-${I}`,onClick:d(()=>{s(c.table,I,y.procedure??"")},"onClick"),size:"xs",type:"button",variant:"ghost",children:l("Probe this")})]})},I)}),(0,t.jsx)(re,{children:c.maskedColumns.size===0?(0,t.jsx)("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"\u2014"}):(0,t.jsx)("span",{className:"flex flex-wrap gap-1",children:[...c.maskedColumns].map(Re)})})]},c.table))})]})]}),a[6]=g.data,a[7]=b.data,a[8]=s,a[9]=f,a[10]=l,a[11]=N}else N=a[11];return N},"Fe");function Re(e){return(0,t.jsx)(j,{variant:"outline",children:e},e)}d(Re,"Re");var Le=he(Z.runAs),Oe=d(()=>{let e=oe();return async({args:a,functionPath:i,shardKey:s="",userId:l})=>{let n=Le;try{return{kind:"allowed",value:await e.query(n,{args:a,functionPath:i,userId:l},xe(s))}}catch(o){return{kind:"denied",message:o instanceof Error?o.message:String(o)}}}},"Le"),je=d(e=>e===void 0?"undefined":JSON.stringify(e,null,2),"Me"),Me=d(({functions:e,prefill:a,runAsIdentity:i=!1}={})=>{let s=oe(),l=V(),n=Oe(),[o,f]=(0,p.useState)(null),[r,b]=(0,p.useState)(null),h=e??o??[],[g,N]=(0,p.useState)(""),[v,E]=(0,p.useState)("{}"),[O,C]=(0,p.useState)(""),[w,S]=(0,p.useState)(""),[_,k]=(0,p.useState)(!1),[x,c]=(0,p.useState)(null),[I,y]=(0,p.useState)(null),F=(0,p.useRef)(-1);(0,p.useEffect)(()=>{if(e!==void 0)return;let m=!1;return s.listFunctions().then(u=>(m||f(u),u)).catch(u=>{m||b(ye(u))}),()=>{m=!0}},[s,e]),(0,p.useEffect)(()=>{if(a===void 0||F.current===a.nonce)return;F.current=a.nonce;let m=a.functionPath;queueMicrotask(()=>{N(m),c(null)})},[a]);let P=g===""?h[0]?.path??"":g,$=d(async()=>{if(P==="")return;let m;try{m=v.trim()===""?{}:JSON.parse(v)}catch(u){y(l("Invalid JSON args: {message}",{message:u.message})),c(null);return}y(null),k(!0);try{let u=await n({args:m,functionPath:P,shardKey:O.trim(),userId:w.trim()});c(u)}finally{k(!1)}},"E"),z=d(()=>{te($())},"F"),Y=d(m=>{N(m.target.value)},"Y"),R=d(m=>{E(m.target.value)},"R"),L=d(m=>{S(m.target.value)},"O");return(0,t.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-playground",children:[r!==null&&(0,t.jsx)("p",{className:"text-sm text-destructive","data-testid":"pp-discover-error",role:"alert",children:r}),!i&&(0,t.jsx)(de,{description:l("Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS."),testId:"pp-gate",title:l("Set `runAsIdentity` to forge an identity and probe access.")}),(0,t.jsxs)("div",{className:"flex flex-col gap-3 rounded-md border border-border p-3",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(A,{htmlFor:"pp-function",children:l("Function")}),(0,t.jsx)("select",{"aria-label":l("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","data-testid":"pp-function",id:"pp-function",onChange:Y,value:P,children:h.map(m=>(0,t.jsxs)("option",{value:m.path,children:[m.path," (",m.kind,")"]},m.path))})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(A,{htmlFor:"pp-args",children:l("Arguments")}),(0,t.jsx)(ke,{"aria-label":l("Arguments"),className:"font-mono text-xs","data-testid":"pp-args",id:"pp-args",onChange:R,value:v})]}),(0,t.jsx)(be,{onChange:C,testId:"pp-shard",value:O}),(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(A,{htmlFor:"pp-user",children:l("Run as (userId)")}),(0,t.jsx)(M,{"aria-label":l("Identity (userId) to run as"),className:"font-mono text-xs","data-testid":"pp-user",id:"pp-user",onChange:L,placeholder:l("Leave empty to run as admin"),value:w})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(T,{"data-testid":"pp-run",disabled:!i||_||P==="",onClick:z,type:"button",children:l(_?"Probing\u2026":"Run probe")}),w.trim()!==""&&(0,t.jsx)(j,{"data-testid":"pp-as-badge",variant:"secondary",children:l("as {userId}",{userId:w.trim()})})]})]}),I!==null&&(0,t.jsx)("p",{className:"text-sm text-destructive","data-testid":"pp-args-error",role:"alert",children:I}),x!==null&&x.kind==="allowed"&&(0,t.jsxs)("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-allowed",children:[(0,t.jsx)(j,{variant:"secondary",children:l("Allowed")}),(0,t.jsx)("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-result",children:je(x.value)})]}),x!==null&&x.kind==="denied"&&(0,t.jsxs)("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-denied",children:[(0,t.jsx)(j,{variant:"destructive",children:l("Denied")}),(0,t.jsx)("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"pp-denied",role:"alert",children:x.message})]})]})},"$e"),De="/__lunora/policy-scaffold",Ue={"already-wired":"That procedure already has an rls(...) policy wired in.","file-exists":"A policy file with that name already exists \u2014 pick another name or edit it by hand.","invalid-identifier":"Name, table, and policy-set must be plain identifiers (letters, digits, _ or $).","unknown-procedure":"No exported procedure was found at that file path.","unsupported-procedure-shape":"That procedure uses the bare query({\u2026}) form \u2014 convert it to the builder form (c.use(\u2026).query(\u2026)) before wiring RLS."},qe=d(async e=>{let a=await fetch(De,{body:JSON.stringify(e),headers:{"Content-Type":"application/json"},method:"POST"}),i=await a.json();if(i.needsManualEdit===!0)return{kind:"needs-manual-edit",message:i.message??"This change must be made by hand."};if(a.ok)return{diagnostics:i.diagnostics??[],kind:"ok",label:i.fileName??i.exportName??""};let s=i.error;return{kind:"error",message:s===void 0?`policy scaffold failed (${String(a.status)})`:Ue[s]??s}},"Ue"),Se={exportName:"",filePath:"",policyName:"",policies:"",tableName:""},Je=d(()=>{let e=(0,me.c)(69),a=V(),[i,s]=(0,p.useState)(null),[l,n]=(0,p.useState)(!1),[o,f]=(0,p.useState)(null),[r,b]=(0,p.useState)(Se),h;e[0]===Symbol.for("react.memo_cache_sentinel")?(h=d(ee=>{let G=ee.target.name,{value:H}=ee.target;b(Ie=>({...Ie,[G]:H}))},"u"),e[0]=h):h=e[0];let g=h,N;e[1]===Symbol.for("react.memo_cache_sentinel")?(N=d(()=>{s(null),b(Se)},"v"),e[1]=N):N=e[1];let v=N,E;e[2]===Symbol.for("react.memo_cache_sentinel")?(E=d(async ee=>{n(!0),f(null);try{let G=await qe(ee);f(G),G.kind==="ok"&&v()}catch(G){let H=G;f({kind:"error",message:H instanceof Error?H.message:String(H)})}n(!1)},"I"),e[2]=E):E=e[2];let O=E,C;e[3]!==r.policyName||e[4]!==r.tableName?(C=d(()=>{te(O({kind:"scaffoldPolicy",name:r.policyName.trim(),table:r.tableName.trim()}))},"P"),e[3]=r.policyName,e[4]=r.tableName,e[5]=C):C=e[5];let w=C,S;e[6]!==r.exportName||e[7]!==r.filePath||e[8]!==r.policies?(S=d(()=>{te(O({exportName:r.exportName.trim(),filePath:r.filePath.trim(),kind:"wireRls",policies:r.policies.trim()}))},"w"),e[6]=r.exportName,e[7]=r.filePath,e[8]=r.policies,e[9]=S):S=e[9];let _=S,k;e[10]===Symbol.for("react.memo_cache_sentinel")?(k=d(()=>{f(null),s("scaffold")},"S"),e[10]=k):k=e[10];let x=k,c;e[11]===Symbol.for("react.memo_cache_sentinel")?(c=d(()=>{f(null),s("wire")},"d"),e[11]=c):c=e[11];let I=c,y;e[12]!==a?(y=a("Scaffold access rules"),e[12]=a,e[13]=y):y=e[13];let F;e[14]!==y?(F=(0,t.jsx)(fe,{children:y}),e[14]=y,e[15]=F):F=e[15];let P;e[16]!==a?(P=a("Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only."),e[16]=a,e[17]=P):P=e[17];let $;e[18]!==P?($=(0,t.jsx)(ue,{children:P}),e[18]=P,e[19]=$):$=e[19];let z;e[20]!==$||e[21]!==F?(z=(0,t.jsxs)(pe,{children:[F,$]}),e[20]=$,e[21]=F,e[22]=z):z=e[22];let Y=i==="scaffold"?"default":"outline",R;e[23]!==a?(R=a("New policy file"),e[23]=a,e[24]=R):R=e[24];let L;e[25]!==Y||e[26]!==R?(L=(0,t.jsx)(T,{"data-testid":"policy-scaffolder-new",onClick:x,size:"xs",type:"button",variant:Y,children:R}),e[25]=Y,e[26]=R,e[27]=L):L=e[27];let m=i==="wire"?"default":"outline",u;e[28]!==a?(u=a("Wire into a procedure"),e[28]=a,e[29]=u):u=e[29];let D;e[30]!==m||e[31]!==u?(D=(0,t.jsx)(T,{"data-testid":"policy-scaffolder-wire",onClick:I,size:"xs",type:"button",variant:m,children:u}),e[30]=m,e[31]=u,e[32]=D):D=e[32];let U;e[33]!==L||e[34]!==D?(U=(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[L,D]}),e[33]=L,e[34]=D,e[35]=U):U=e[35];let q;e[36]!==l||e[37]!==r.policyName||e[38]!==r.tableName||e[39]!==i||e[40]!==w||e[41]!==a?(q=i==="scaffold"&&(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-new-form",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-name",children:a("Policy name")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-name",id:"policy-scaffolder-name",name:"policyName",onChange:g,value:r.policyName})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-table",children:a("Table name")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-table",id:"policy-scaffolder-table",name:"tableName",onChange:g,value:r.tableName})]}),(0,t.jsx)(T,{"data-testid":"policy-scaffolder-create",disabled:l||r.policyName.trim()===""||r.tableName.trim()==="",onClick:w,size:"xs",type:"button",children:a(l?"Creating\u2026":"Create policy file")}),(0,t.jsx)(T,{onClick:v,size:"xs",type:"button",variant:"ghost",children:a("Cancel")})]}),e[36]=l,e[37]=r.policyName,e[38]=r.tableName,e[39]=i,e[40]=w,e[41]=a,e[42]=q):q=e[42];let J;e[43]!==l||e[44]!==r.exportName||e[45]!==r.filePath||e[46]!==r.policies||e[47]!==i||e[48]!==_||e[49]!==a?(J=i==="wire"&&(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-wire-form",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-file",children:a("Procedure file path")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-file",id:"policy-scaffolder-file",name:"filePath",onChange:g,value:r.filePath})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-export",children:a("Exported procedure")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-export",id:"policy-scaffolder-export",name:"exportName",onChange:g,value:r.exportName})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-1 text-xs",children:[(0,t.jsx)(A,{htmlFor:"policy-scaffolder-policies",children:a("Policy set identifier")}),(0,t.jsx)(M,{"data-testid":"policy-scaffolder-policies",id:"policy-scaffolder-policies",name:"policies",onChange:g,value:r.policies})]}),(0,t.jsx)(T,{"data-testid":"policy-scaffolder-apply",disabled:l||r.filePath.trim()===""||r.exportName.trim()===""||r.policies.trim()==="",onClick:_,size:"xs",type:"button",children:a(l?"Wiring\u2026":"Wire RLS")}),(0,t.jsx)(T,{onClick:v,size:"xs",type:"button",variant:"ghost",children:a("Cancel")})]}),e[43]=l,e[44]=r.exportName,e[45]=r.filePath,e[46]=r.policies,e[47]=i,e[48]=_,e[49]=a,e[50]=J):J=e[50];let W;e[51]!==o?(W=o?.kind==="error"&&(0,t.jsx)("p",{className:"mt-3 text-sm text-destructive","data-testid":"policy-scaffolder-error",role:"alert",children:o.message}),e[51]=o,e[52]=W):W=e[52];let B;e[53]!==o?.kind||e[54]!==a?(B=o?.kind==="needs-manual-edit"&&(0,t.jsx)("p",{className:"mt-3 text-sm text-amber-600 dark:text-amber-500","data-testid":"policy-scaffolder-manual",role:"alert",children:a("This change must be made by hand \u2014 the scaffolder only adds new, deny-by-default rules.")}),e[53]=o?.kind,e[54]=a,e[55]=B):B=e[55];let K;e[56]!==o||e[57]!==a?(K=o?.kind==="ok"&&(0,t.jsxs)("div",{className:"mt-3 flex flex-col gap-1","data-testid":"policy-scaffolder-ok",children:[(0,t.jsx)("p",{className:"text-sm text-emerald-600 dark:text-emerald-500",children:a("Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.",{label:o.label})}),o.diagnostics.length>0&&(0,t.jsx)("ul",{className:"flex flex-col gap-0.5","data-testid":"policy-scaffolder-diagnostics",children:o.diagnostics.map(We)})]}),e[56]=o,e[57]=a,e[58]=K):K=e[58];let Q;e[59]!==U||e[60]!==q||e[61]!==J||e[62]!==W||e[63]!==B||e[64]!==K?(Q=(0,t.jsxs)(ne,{children:[U,q,J,W,B,K]}),e[59]=U,e[60]=q,e[61]=J,e[62]=W,e[63]=B,e[64]=K,e[65]=Q):Q=e[65];let X;return e[66]!==z||e[67]!==Q?(X=(0,t.jsxs)(se,{"data-testid":"policy-scaffolder",size:"sm",children:[z,Q]}),e[66]=z,e[67]=Q,e[68]=X):X=e[68],X},"je");function We(e){return(0,t.jsx)("li",{className:"font-mono text-[11px] text-destructive",children:e},e)}d(We,"Be");var st=d(({functions:e,runAsIdentity:a=!1,schemaEditable:i=!1}={})=>{let s=V(),[l,n]=(0,p.useState)(void 0),o=d((f,r,b)=>{b!==""&&n(h=>({functionPath:b,nonce:(h?.nonce??0)+1}))},"o");return(0,t.jsxs)("div",{className:"flex flex-col gap-8","data-testid":"lunora-permissions",children:[(0,t.jsxs)("section",{className:"flex flex-col gap-3",children:[(0,t.jsx)("header",{className:"border-b border-border px-4 py-3",children:(0,t.jsx)("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:s("Permissions")})}),(0,t.jsx)(ze,{onProbe:o})]}),(0,t.jsx)("section",{className:"flex flex-col gap-3",children:(0,t.jsxs)(se,{className:"gap-0 py-0",children:[(0,t.jsx)("header",{className:"border-b border-border px-4 py-3",children:(0,t.jsx)("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:s("Probe")})}),(0,t.jsxs)(ne,{className:"px-4 py-4",children:[(0,t.jsx)("p",{className:"mb-3 text-sm text-muted-foreground",children:s("Pick a function and an identity, then run it to see the access outcome.")}),(0,t.jsx)(Me,{functions:e,prefill:l,runAsIdentity:a})]})]})}),i&&(0,t.jsx)("section",{className:"flex flex-col gap-2",children:(0,t.jsx)(Je,{})})]})},"nt");export{st as PermissionsPanel};
@@ -1,4 +1,4 @@
1
- import{d as Ee}from"./chunk-OOKV3V3X.js";import{c as Oe}from"./chunk-UYEZR3BI.js";import"./chunk-TJRQUJFS.js";import"./chunk-TWTNWOJU.js";import"./chunk-WQYWA7U6.js";import{a as ye}from"./chunk-VVOVVU53.js";import"./chunk-XZMOZFE6.js";import{a as Le}from"./chunk-66UGPQVC.js";import"./chunk-7RIRJD2P.js";import"./chunk-C3TOZ4LG.js";import"./chunk-D27D4UUI.js";import"./chunk-SB35BJ7A.js";import"./chunk-FO26ZU7E.js";import"./chunk-5AUOM7FK.js";import{a as _e}from"./chunk-I5OKDKON.js";import{a as Te}from"./chunk-IFLTA2OD.js";import"./chunk-OGUKYRFM.js";import"./chunk-OKG3HWSJ.js";import{P as Ce}from"./chunk-46ZJ3TM4.js";import"./chunk-Y6CXU7T4.js";import"./chunk-4L4WTGN5.js";import{a as re}from"./chunk-EBWXFG4H.js";import"./chunk-TGHH7ZFA.js";import"./chunk-5GFSKIB2.js";import{b as ae}from"./chunk-NCCAMFB6.js";import"./chunk-25NFR6EB.js";import{a as be}from"./chunk-4ZEL6BYL.js";import{f as Se}from"./chunk-PPNBTM7O.js";import"./chunk-FSRSK4LY.js";import"./chunk-UODFNQOY.js";import{a as me}from"./chunk-FKVZRPV5.js";import{a as Ke,b as $e,c as Fe,d as ie,e as ne,f as ee}from"./chunk-HEAQVSNS.js";import{a as je,e as ze}from"./chunk-WUWBZPUK.js";import{d as Ne,f as fe,g as ge,h as Q,l as pe,o as V,q as De}from"./chunk-Y4Q25F6X.js";import{a as g,d as he,e as ft,f as gt,g as pt}from"./chunk-YKXDMIHQ.js";var B=he(gt(),1),j=he(ft(),1);var n=he(pt(),1);var Me=g((d,e,t)=>{let{onCopy:r,onDelete:s,onDownload:o,onToggleSelect:i}=t,c=g(()=>{r(d.key)},"a"),l=g(()=>{o(d.key)},"n"),u=g(()=>{s(d.key)},"d"),m=g(()=>{i(d.key)},"h");return{copy:c,download:l,name:d.key.slice(e.length),remove:u,toggle:m}},"$e"),Be=g(d=>{let e=(0,B.c)(31),{busy:t,buttonClassName:r,copied:s,objectKey:o,onCopy:i,onDelete:c,onDownload:l,t:u}=d,m=`storage-copy-${o}`,h;e[0]!==s||e[1]!==u?(h=u(s?"Copied":"Copy URL"),e[0]=s,e[1]=u,e[2]=h):h=e[2];let f;e[3]!==t||e[4]!==r||e[5]!==i||e[6]!==m||e[7]!==h?(f=(0,n.jsx)(re,{className:r,"data-testid":m,disabled:t,onClick:i,size:"sm",type:"button",variant:"ghost",children:h}),e[3]=t,e[4]=r,e[5]=i,e[6]=m,e[7]=h,e[8]=f):f=e[8];let w=`storage-download-${o}`,a;e[9]!==u?(a=u("Download"),e[9]=u,e[10]=a):a=e[10];let k;e[11]!==t||e[12]!==r||e[13]!==l||e[14]!==w||e[15]!==a?(k=(0,n.jsx)(re,{className:r,"data-testid":w,disabled:t,onClick:l,size:"sm",type:"button",variant:"ghost",children:a}),e[11]=t,e[12]=r,e[13]=l,e[14]=w,e[15]=a,e[16]=k):k=e[16];let N;e[17]!==u?(N=u("Delete object?"),e[17]=u,e[18]=N):N=e[18];let x=`storage-delete-${o}`,b;e[19]!==u?(b=u("Delete"),e[19]=u,e[20]=b):b=e[20];let v;e[21]!==t||e[22]!==c||e[23]!==N||e[24]!==x||e[25]!==b?(v=(0,n.jsx)(_e,{confirmLabel:N,disabled:t,onConfirm:c,testId:x,children:b}),e[21]=t,e[22]=c,e[23]=N,e[24]=x,e[25]=b,e[26]=v):v=e[26];let y;return e[27]!==v||e[28]!==f||e[29]!==k?(y=(0,n.jsxs)(n.Fragment,{children:[f,k,v]}),e[27]=v,e[28]=f,e[29]=k,e[30]=y):y=e[30],y},"Fe"),Ae=g(d=>{let e=(0,B.c)(14),{objectKey:t,references:r,t:s}=d;if(r===void 0)return null;if(r.length===0){let m=`storage-orphan-${t}`,h;e[0]!==s?(h=s("Orphan"),e[0]=s,e[1]=h):h=e[1];let f;return e[2]!==m||e[3]!==h?(f=(0,n.jsx)(ae,{"data-testid":m,variant:"warning",children:h}),e[2]=m,e[3]=h,e[4]=f):f=e[4],f}let o;e[5]!==r?(o=r.map(bt).join(`
1
+ import{d as Ee}from"./chunk-ZZENQM5W.js";import{c as Oe}from"./chunk-UYEZR3BI.js";import"./chunk-TJRQUJFS.js";import"./chunk-TWTNWOJU.js";import"./chunk-WQYWA7U6.js";import{a as ye}from"./chunk-VVOVVU53.js";import"./chunk-XZMOZFE6.js";import{a as Le}from"./chunk-66UGPQVC.js";import"./chunk-7RIRJD2P.js";import"./chunk-C3TOZ4LG.js";import"./chunk-D27D4UUI.js";import"./chunk-SB35BJ7A.js";import"./chunk-FO26ZU7E.js";import"./chunk-5AUOM7FK.js";import{a as _e}from"./chunk-TWXJF4C2.js";import{a as Te}from"./chunk-E723DEAW.js";import"./chunk-OGUKYRFM.js";import"./chunk-OKG3HWSJ.js";import{P as Ce}from"./chunk-46ZJ3TM4.js";import"./chunk-Y6CXU7T4.js";import"./chunk-4L4WTGN5.js";import{a as re}from"./chunk-EBWXFG4H.js";import"./chunk-TGHH7ZFA.js";import"./chunk-5GFSKIB2.js";import{b as ae}from"./chunk-NCCAMFB6.js";import"./chunk-25NFR6EB.js";import{a as be}from"./chunk-4ZEL6BYL.js";import{f as Se}from"./chunk-W3Q32C24.js";import"./chunk-FSRSK4LY.js";import"./chunk-RIO2HPN7.js";import{a as me}from"./chunk-FKVZRPV5.js";import{a as Ke,b as $e,c as Fe,d as ie,e as ne,f as ee}from"./chunk-HEAQVSNS.js";import{a as je,e as ze}from"./chunk-WUWBZPUK.js";import{d as Ne,f as fe,g as ge,h as Q,l as pe,o as V,q as De}from"./chunk-NXKPFGOP.js";import{a as g,d as he,e as ft,f as gt,g as pt}from"./chunk-YKXDMIHQ.js";var B=he(gt(),1),j=he(ft(),1);var n=he(pt(),1);var Me=g((d,e,t)=>{let{onCopy:r,onDelete:s,onDownload:o,onToggleSelect:i}=t,c=g(()=>{r(d.key)},"a"),l=g(()=>{o(d.key)},"n"),u=g(()=>{s(d.key)},"d"),m=g(()=>{i(d.key)},"h");return{copy:c,download:l,name:d.key.slice(e.length),remove:u,toggle:m}},"$e"),Be=g(d=>{let e=(0,B.c)(31),{busy:t,buttonClassName:r,copied:s,objectKey:o,onCopy:i,onDelete:c,onDownload:l,t:u}=d,m=`storage-copy-${o}`,h;e[0]!==s||e[1]!==u?(h=u(s?"Copied":"Copy URL"),e[0]=s,e[1]=u,e[2]=h):h=e[2];let f;e[3]!==t||e[4]!==r||e[5]!==i||e[6]!==m||e[7]!==h?(f=(0,n.jsx)(re,{className:r,"data-testid":m,disabled:t,onClick:i,size:"sm",type:"button",variant:"ghost",children:h}),e[3]=t,e[4]=r,e[5]=i,e[6]=m,e[7]=h,e[8]=f):f=e[8];let w=`storage-download-${o}`,a;e[9]!==u?(a=u("Download"),e[9]=u,e[10]=a):a=e[10];let k;e[11]!==t||e[12]!==r||e[13]!==l||e[14]!==w||e[15]!==a?(k=(0,n.jsx)(re,{className:r,"data-testid":w,disabled:t,onClick:l,size:"sm",type:"button",variant:"ghost",children:a}),e[11]=t,e[12]=r,e[13]=l,e[14]=w,e[15]=a,e[16]=k):k=e[16];let N;e[17]!==u?(N=u("Delete object?"),e[17]=u,e[18]=N):N=e[18];let x=`storage-delete-${o}`,b;e[19]!==u?(b=u("Delete"),e[19]=u,e[20]=b):b=e[20];let v;e[21]!==t||e[22]!==c||e[23]!==N||e[24]!==x||e[25]!==b?(v=(0,n.jsx)(_e,{confirmLabel:N,disabled:t,onConfirm:c,testId:x,children:b}),e[21]=t,e[22]=c,e[23]=N,e[24]=x,e[25]=b,e[26]=v):v=e[26];let y;return e[27]!==v||e[28]!==f||e[29]!==k?(y=(0,n.jsxs)(n.Fragment,{children:[f,k,v]}),e[27]=v,e[28]=f,e[29]=k,e[30]=y):y=e[30],y},"Fe"),Ae=g(d=>{let e=(0,B.c)(14),{objectKey:t,references:r,t:s}=d;if(r===void 0)return null;if(r.length===0){let m=`storage-orphan-${t}`,h;e[0]!==s?(h=s("Orphan"),e[0]=s,e[1]=h):h=e[1];let f;return e[2]!==m||e[3]!==h?(f=(0,n.jsx)(ae,{"data-testid":m,variant:"warning",children:h}),e[2]=m,e[3]=h,e[4]=f):f=e[4],f}let o;e[5]!==r?(o=r.map(bt).join(`
2
2
  `),e[5]=r,e[6]=o):o=e[6];let i=o,c=`storage-refs-${t}`,l;e[7]!==r.length||e[8]!==s?(l=r.length===1?s("1 record"):s("{count} records",{count:r.length}),e[7]=r.length,e[8]=s,e[9]=l):l=e[9];let u;return e[10]!==i||e[11]!==c||e[12]!==l?(u=(0,n.jsx)(ae,{"data-testid":c,title:i,variant:"secondary",children:l}),e[10]=i,e[11]=c,e[12]=l,e[13]=u):u=e[13],u},"Re"),Pe=g(d=>{let e=(0,B.c)(7),{objectKey:t,onToggle:r,selected:s,t:o}=d,i;e[0]!==o?(i=o("Select row"),e[0]=o,e[1]=i):i=e[1];let c=`storage-select-${t}`,l;return e[2]!==r||e[3]!==s||e[4]!==i||e[5]!==c?(l=(0,n.jsx)(ye,{"aria-label":i,checked:s,"data-testid":c,onCheckedChange:r}),e[2]=r,e[3]=s,e[4]=i,e[5]=c,e[6]=l):l=e[6],l},"ze");function bt(d){return`${d.table}\xB7${d.id}`}g(bt,"yt");var yt=g(d=>{let e=(0,B.c)(10),{colSpan:t,name:r,onEnter:s}=d,o;e[0]!==r||e[1]!==s?(o=g(()=>{s(r)},"l"),e[0]=r,e[1]=s,e[2]=o):o=e[2];let i=o,c;e[3]===Symbol.for("react.memo_cache_sentinel")?(c=(0,n.jsx)("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:(0,n.jsx)("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 l;e[4]!==i||e[5]!==r?(l=(0,n.jsxs)("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:i,type:"button",children:[c,r]}),e[4]=i,e[5]=r,e[6]=l):l=e[6];let u;return e[7]!==t||e[8]!==l?(u=(0,n.jsx)(ie,{children:(0,n.jsx)(ee,{colSpan:t,children:l})}),e[7]=t,e[8]=l,e[9]=u):u=e[9],u},"xt"),xt=g(d=>{let e=(0,B.c)(37),{busy:t,copiedKey:r,handlers:s,object:o,prefix:i,references:c,selected:l,showReferences:u,t:m}=d,h;e[0]!==s||e[1]!==o||e[2]!==i?(h=Me(o,i,s),e[0]=s,e[1]=o,e[2]=i,e[3]=h):h=e[3];let{copy:f,download:w,name:a,remove:k,toggle:N}=h,x;e[4]!==o.key||e[5]!==l||e[6]!==m||e[7]!==N?(x=(0,n.jsx)(ee,{className:"w-8",children:(0,n.jsx)(Pe,{objectKey:o.key,onToggle:N,selected:l,t:m})}),e[4]=o.key,e[5]=l,e[6]=m,e[7]=N,e[8]=x):x=e[8];let b;e[9]!==a?(b=(0,n.jsx)(ee,{className:"font-mono text-xs",children:a}),e[9]=a,e[10]=b):b=e[10];let v;e[11]!==o.size?(v=pe(o.size),e[11]=o.size,e[12]=v):v=e[12];let y;e[13]!==v?(y=(0,n.jsx)(ee,{className:"tabular-nums text-muted-foreground",children:v}),e[13]=v,e[14]=y):y=e[14];let z=o.httpMetadata?.contentType??"",S;e[15]!==z?(S=(0,n.jsx)(ee,{children:z}),e[15]=z,e[16]=S):S=e[16];let C;e[17]!==o.key||e[18]!==c||e[19]!==u||e[20]!==m?(C=u&&(0,n.jsx)(ee,{children:(0,n.jsx)(Ae,{objectKey:o.key,references:c,t:m})}),e[17]=o.key,e[18]=c,e[19]=u,e[20]=m,e[21]=C):C=e[21];let K=r===o.key,D;e[22]!==t||e[23]!==f||e[24]!==w||e[25]!==o.key||e[26]!==k||e[27]!==m||e[28]!==K?(D=(0,n.jsx)(ee,{className:"text-right",children:(0,n.jsx)("span",{className:"inline-flex items-center gap-1",children:(0,n.jsx)(Be,{busy:t,copied:K,objectKey:o.key,onCopy:f,onDelete:k,onDownload:w,t:m})})}),e[22]=t,e[23]=f,e[24]=w,e[25]=o.key,e[26]=k,e[27]=m,e[28]=K,e[29]=D):D=e[29];let F;return e[30]!==D||e[31]!==x||e[32]!==b||e[33]!==y||e[34]!==S||e[35]!==C?(F=(0,n.jsxs)(ie,{"data-testid":"fb-row",children:[x,b,y,S,C,D]}),e[30]=D,e[31]=x,e[32]=b,e[33]=y,e[34]=S,e[35]=C,e[36]=F):F=e[36],F},"vt"),vt=g(d=>{let e=(0,B.c)(65),{allSelected:t,busy:r,copiedKey:s,files:o,folders:i,handlers:c,onEnterFolder:l,prefix:u,references:m,selected:h,showReferences:f,someSelected:w,t:a,toggleSelectAll:k}=d,N;e[0]!==a?(N=a("Select all rows"),e[0]=a,e[1]=N):N=e[1];let x;e[2]!==t||e[3]!==w||e[4]!==N||e[5]!==k?(x=(0,n.jsx)(ne,{className:"w-8",children:(0,n.jsx)(ye,{"aria-label":N,checked:t,"data-testid":"storage-select-all",indeterminate:w,onCheckedChange:k})}),e[2]=t,e[3]=w,e[4]=N,e[5]=k,e[6]=x):x=e[6];let b;e[7]!==a?(b=a("key"),e[7]=a,e[8]=b):b=e[8];let v;e[9]!==b?(v=(0,n.jsx)(ne,{children:b}),e[9]=b,e[10]=v):v=e[10];let y;e[11]!==a?(y=a("size"),e[11]=a,e[12]=y):y=e[12];let z;e[13]!==y?(z=(0,n.jsx)(ne,{children:y}),e[13]=y,e[14]=z):z=e[14];let S;e[15]!==a?(S=a("content-type"),e[15]=a,e[16]=S):S=e[16];let C;e[17]!==S?(C=(0,n.jsx)(ne,{children:S}),e[17]=S,e[18]=C):C=e[18];let K;e[19]!==f||e[20]!==a?(K=f&&(0,n.jsx)(ne,{children:a("used by")}),e[19]=f,e[20]=a,e[21]=K):K=e[21];let D;e[22]!==a?(D=a("Actions"),e[22]=a,e[23]=D):D=e[23];let F;e[24]!==D?(F=(0,n.jsx)(ne,{"aria-label":D}),e[24]=D,e[25]=F):F=e[25];let $;e[26]!==F||e[27]!==x||e[28]!==v||e[29]!==z||e[30]!==C||e[31]!==K?($=(0,n.jsx)($e,{children:(0,n.jsxs)(ie,{children:[x,v,z,C,K,F]})}),e[26]=F,e[27]=x,e[28]=v,e[29]=z,e[30]=C,e[31]=K,e[32]=$):$=e[32];let _;if(e[33]!==i||e[34]!==l||e[35]!==f){let L;e[37]!==l||e[38]!==f?(L=g(O=>(0,n.jsx)(yt,{colSpan:f?6:5,name:O,onEnter:l},O),"D"),e[37]=l,e[38]=f,e[39]=L):L=e[39],_=i.map(L),e[33]=i,e[34]=l,e[35]=f,e[36]=_}else _=e[36];let I;if(e[40]!==r||e[41]!==s||e[42]!==o||e[43]!==c||e[44]!==u||e[45]!==m||e[46]!==h||e[47]!==f||e[48]!==a){let L;e[50]!==r||e[51]!==s||e[52]!==c||e[53]!==u||e[54]!==m||e[55]!==h||e[56]!==f||e[57]!==a?(L=g(O=>(0,n.jsx)(xt,{busy:r,copiedKey:s,handlers:c,object:O,prefix:u,references:m[O.key],selected:h.has(O.key),showReferences:f,t:a},O.key),"D"),e[50]=r,e[51]=s,e[52]=c,e[53]=u,e[54]=m,e[55]=h,e[56]=f,e[57]=a,e[58]=L):L=e[58],I=o.map(L),e[40]=r,e[41]=s,e[42]=o,e[43]=c,e[44]=u,e[45]=m,e[46]=h,e[47]=f,e[48]=a,e[49]=I}else I=e[49];let E;e[59]!==_||e[60]!==I?(E=(0,n.jsxs)(Fe,{children:[_,I]}),e[59]=_,e[60]=I,e[61]=E):E=e[61];let U;return e[62]!==$||e[63]!==E?(U=(0,n.jsx)(je,{className:"overflow-hidden py-0",children:(0,n.jsx)(ze,{className:"px-0",children:(0,n.jsxs)(Ke,{"data-testid":"fb-table",children:[$,E]})})}),e[62]=$,e[63]=E,e[64]=U):U=e[64],U},"kt"),kt=[{label:"15m",seconds:900},{label:"1h",seconds:3600},{label:"24h",seconds:86400},{label:"7d",seconds:604800}],wt=3600,Ie=g((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;let t=new Date(d.uploaded).getTime();return Number.isNaN(t)?0:t}return e.startsWith("tag:")?d.customMetadata?.[e.slice(4)]??"":d.key},"ve"),St=g((d,e,t)=>{let r=t==="desc"?-1:1;return d.toSorted((s,o)=>{let i=Ie(s,e),c=Ie(o,e);return(typeof i=="number"&&typeof c=="number"?i-c:String(i).localeCompare(String(c)))*r})},"Ct"),Nt=g((d,e)=>{let t=new Set,r=[];for(let s of d){let o=s.key.slice(e.length),i=o.indexOf("/");i===-1?r.push(s):t.add(o.slice(0,i+1))}return{files:r,folders:[...t].toSorted((s,o)=>s.localeCompare(o))}},"Nt"),Ct=g(d=>{let e=(0,B.c)(59),{bucket:t,buckets:r,busy:s,draftPrefix:o,expiry:i,fileInputRef:c,onBucketChange:l,onExpiryChange:u,onFileChange:m,onList:h,onPrefixChange:f,onUploadClick:w,t:a}=d,k;e[0]!==f?(k=g(P=>{f(P.target.value)},"v"),e[0]=f,e[1]=k):k=e[1];let N=k,x;e[2]!==l?(x=g(P=>{l(P.target.value)},"y"),e[2]=l,e[3]=x):x=e[3];let b=x,v;e[4]!==u?(v=g(P=>{u(Number.parseInt(P.target.value,10))},"x"),e[4]=u,e[5]=v):v=e[5];let y=v,z;e[6]!==t||e[7]!==r||e[8]!==b||e[9]!==a?(z=r.length>0&&(0,n.jsx)("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:b,value:t,children:r.map(zt)}),e[6]=t,e[7]=r,e[8]=b,e[9]=a,e[10]=z):z=e[10];let S;e[11]!==a?(S=a("Key prefix"),e[11]=a,e[12]=S):S=e[12];let C;e[13]!==a?(C=a("key prefix (optional)"),e[13]=a,e[14]=C):C=e[14];let K;e[15]!==o||e[16]!==N||e[17]!==S||e[18]!==C?(K=(0,n.jsx)(Ce,{"aria-label":S,className:"h-8 w-64 max-w-full","data-testid":"fb-prefix-input",onChange:N,placeholder:C,value:o}),e[15]=o,e[16]=N,e[17]=S,e[18]=C,e[19]=K):K=e[19];let D;e[20]!==a?(D=a("List"),e[20]=a,e[21]=D):D=e[21];let F;e[22]!==s||e[23]!==h||e[24]!==D?(F=(0,n.jsx)(re,{"data-testid":"fb-list",disabled:s,onClick:h,size:"sm",type:"button",children:D}),e[22]=s,e[23]=h,e[24]=D,e[25]=F):F=e[25];let $;e[26]!==s||e[27]!==a?($=a(s?"Uploading\u2026":"Upload"),e[26]=s,e[27]=a,e[28]=$):$=e[28];let _;e[29]!==s||e[30]!==w||e[31]!==$?(_=(0,n.jsx)(re,{"data-testid":"storage-upload",disabled:s,onClick:w,size:"sm",type:"button",variant:"outline",children:$}),e[29]=s,e[30]=w,e[31]=$,e[32]=_):_=e[32];let I;e[33]!==c||e[34]!==m?(I=(0,n.jsx)("input",{className:"hidden","data-testid":"storage-file-input",onChange:m,ref:c,type:"file"}),e[33]=c,e[34]=m,e[35]=I):I=e[35];let E;e[36]!==a?(E=a("Link expiry"),e[36]=a,e[37]=E):E=e[37];let U;e[38]!==a?(U=kt.map(P=>(0,n.jsx)("option",{value:P.seconds,children:a(P.label)},P.seconds)),e[38]=a,e[39]=U):U=e[39];let L;e[40]!==i||e[41]!==y||e[42]!==U?(L=(0,n.jsx)("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:y,value:i,children:U}),e[40]=i,e[41]=y,e[42]=U,e[43]=L):L=e[43];let O;e[44]!==E||e[45]!==L?(O=(0,n.jsxs)("label",{className:"ml-auto flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"storage-expiry",children:[E,L]}),e[44]=E,e[45]=L,e[46]=O):O=e[46];let M;e[47]!==a?(M=a("Open in Cloudflare"),e[47]=a,e[48]=M):M=e[48];let A;e[49]!==M?(A=(0,n.jsx)("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"fb-cf-link",href:Oe,rel:"noreferrer",target:"_blank",children:M}),e[49]=M,e[50]=A):A=e[50];let W;return e[51]!==_||e[52]!==I||e[53]!==O||e[54]!==A||e[55]!==z||e[56]!==K||e[57]!==F?(W=(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[z,K,F,_,I,O,A]}),e[51]=_,e[52]=I,e[53]=O,e[54]=A,e[55]=z,e[56]=K,e[57]=F,e[58]=W):W=e[58],W},"Tt"),jt=g(d=>{let e=(0,B.c)(66),{onSortKeyChange:t,onThumbSizeChange:r,showGrid:s,showList:o,sortDirection:i,sortKey:c,t:l,tagKeys:u,thumbSize:m,toggleSortDirection:h,view:f}=d,w;e[0]!==t?(w=g(G=>{t(G.target.value)},"k"),e[0]=t,e[1]=w):w=e[1];let a=w,k;e[2]!==r?(k=g(G=>{r(Number.parseInt(G.target.value,10))},"v"),e[2]=r,e[3]=k):k=e[3];let N=k,x=f==="list",b;e[4]!==l?(b=l("List"),e[4]=l,e[5]=b):b=e[5];let v;e[6]!==o||e[7]!==x||e[8]!==b?(v=(0,n.jsx)("button",{"aria-pressed":x,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:o,type:"button",children:b}),e[6]=o,e[7]=x,e[8]=b,e[9]=v):v=e[9];let y=f==="grid",z;e[10]!==l?(z=l("Grid"),e[10]=l,e[11]=z):z=e[11];let S;e[12]!==s||e[13]!==y||e[14]!==z?(S=(0,n.jsx)("button",{"aria-pressed":y,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:s,type:"button",children:z}),e[12]=s,e[13]=y,e[14]=z,e[15]=S):S=e[15];let C;e[16]!==v||e[17]!==S?(C=(0,n.jsxs)("div",{className:"inline-flex overflow-hidden rounded-md border border-border",children:[v,S]}),e[16]=v,e[17]=S,e[18]=C):C=e[18];let K;e[19]!==l?(K=l("Sort"),e[19]=l,e[20]=K):K=e[20];let D;e[21]!==l?(D=l("Name"),e[21]=l,e[22]=D):D=e[22];let F;e[23]!==D?(F=(0,n.jsx)("option",{value:"name",children:D}),e[23]=D,e[24]=F):F=e[24];let $;e[25]!==l?($=l("size"),e[25]=l,e[26]=$):$=e[26];let _;e[27]!==$?(_=(0,n.jsx)("option",{value:"size",children:$}),e[27]=$,e[28]=_):_=e[28];let I;e[29]!==l?(I=l("Type"),e[29]=l,e[30]=I):I=e[30];let E;e[31]!==I?(E=(0,n.jsx)("option",{value:"type",children:I}),e[31]=I,e[32]=E):E=e[32];let U;e[33]!==l?(U=l("Modified"),e[33]=l,e[34]=U):U=e[34];let L;e[35]!==U?(L=(0,n.jsx)("option",{value:"date",children:U}),e[35]=U,e[36]=L):L=e[36];let O;e[37]!==u?(O=u.map(Dt),e[37]=u,e[38]=O):O=e[38];let M;e[39]!==a||e[40]!==c||e[41]!==F||e[42]!==_||e[43]!==E||e[44]!==L||e[45]!==O?(M=(0,n.jsxs)("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:c,children:[F,_,E,L,O]}),e[39]=a,e[40]=c,e[41]=F,e[42]=_,e[43]=E,e[44]=L,e[45]=O,e[46]=M):M=e[46];let A;e[47]!==K||e[48]!==M?(A=(0,n.jsxs)("label",{className:"flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-sort",children:[K,M]}),e[47]=K,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];let P=i==="asc"?"\u2191":"\u2193",H;e[52]!==W||e[53]!==P||e[54]!==h?(H=(0,n.jsx)("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:h,type:"button",children:P}),e[52]=W,e[53]=P,e[54]=h,e[55]=H):H=e[55];let J;e[56]!==N||e[57]!==l||e[58]!==m||e[59]!==f?(J=f==="grid"&&(0,n.jsxs)("label",{className:"ml-auto flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-thumb-size",children:[l("Thumbnail size"),(0,n.jsx)("input",{className:"accent-primary","data-testid":"fb-thumb-size",id:"fb-thumb-size",max:240,min:80,onChange:N,step:8,type:"range",value:m})]}),e[56]=N,e[57]=l,e[58]=m,e[59]=f,e[60]=J):J=e[60];let oe;return e[61]!==A||e[62]!==H||e[63]!==J||e[64]!==C?(oe=(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs","data-testid":"fb-controls",children:[C,A,H,J]}),e[61]=A,e[62]=H,e[63]=J,e[64]=C,e[65]=oe):oe=e[65],oe},"_t");function zt(d){return(0,n.jsx)("option",{value:d,children:d},d)}g(zt,"Et");function Dt(d){return(0,n.jsx)("option",{value:`tag:${d}`,children:d},d)}g(Dt,"$t");var Tt=/\.(?:avif|bmp|gif|ico|jpe?g|png|svg|webp)$/iu,Kt=g(d=>(d.httpMetadata?.contentType??"").startsWith("image/")||Tt.test(d.key),"Rt"),$t=g(()=>{let d=(0,B.c)(1),e;return d[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,n.jsx)("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:(0,n.jsx)("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},"zt"),Ft=g(d=>{let e=(0,B.c)(13),{object:t,resolveUrl:r}=d,[s,o]=(0,j.useState)(null),[i,c]=(0,j.useState)(!1),l;e[0]!==t?(l=Kt(t),e[0]=t,e[1]=l):l=e[1];let u=l,m,h;e[2]!==u||e[3]!==t.key||e[4]!==r?(m=g(()=>{if(!u)return;let k={cancelled:!1};return V((async()=>{try{let N=await r(t.key);k.cancelled||o(N)}catch{k.cancelled||c(!0)}})()),()=>{k.cancelled=!0}},"h"),h=[u,t.key,r],e[2]=u,e[3]=t.key,e[4]=r,e[5]=m,e[6]=h):(m=e[5],h=e[6]),(0,j.useEffect)(m,h);let f;e[7]===Symbol.for("react.memo_cache_sentinel")?(f=g(()=>{c(!0)},"m"),e[7]=f):f=e[7];let w=f,a;return e[8]!==i||e[9]!==u||e[10]!==t.key||e[11]!==s?(a=(0,n.jsx)("div",{className:"flex aspect-square w-full items-center justify-center overflow-hidden rounded-md border border-border bg-muted/30",children:u&&s!==null&&!i?(0,n.jsx)("img",{alt:t.key,className:"size-full object-cover",loading:"lazy",onError:w,src:s}):(0,n.jsx)($t,{})}),e[8]=i,e[9]=u,e[10]=t.key,e[11]=s,e[12]=a):a=e[12],a},"Dt"),_t=g(d=>{let e=(0,B.c)(42),{busy:t,copiedKey:r,handlers:s,object:o,prefix:i,references:c,resolveUrl:l,selected:u,showReferences:m,t:h}=d,f;e[0]!==s||e[1]!==o||e[2]!==i?(f=Me(o,i,s),e[0]=s,e[1]=o,e[2]=i,e[3]=f):f=e[3];let{copy:w,download:a,name:k,remove:N,toggle:x}=f,b;e[4]!==o||e[5]!==l?(b=(0,n.jsx)(Ft,{object:o,resolveUrl:l}),e[4]=o,e[5]=l,e[6]=b):b=e[6];let v;e[7]!==o.key||e[8]!==u||e[9]!==h||e[10]!==x?(v=(0,n.jsx)("span",{className:"absolute left-1.5 top-1.5 rounded bg-background/80 p-0.5",children:(0,n.jsx)(Pe,{objectKey:o.key,onToggle:x,selected:u,t:h})}),e[7]=o.key,e[8]=u,e[9]=h,e[10]=x,e[11]=v):v=e[11];let y;e[12]!==b||e[13]!==v?(y=(0,n.jsxs)("div",{className:"relative",children:[b,v]}),e[12]=b,e[13]=v,e[14]=y):y=e[14];let z;e[15]!==k?(z=(0,n.jsx)("p",{className:"truncate font-mono text-xs",title:k,children:k}),e[15]=k,e[16]=z):z=e[16];let S;e[17]!==o.size?(S=pe(o.size),e[17]=o.size,e[18]=S):S=e[18];let C;e[19]!==S?(C=(0,n.jsx)("p",{className:"text-[11px] tabular-nums text-muted-foreground",children:S}),e[19]=S,e[20]=C):C=e[20];let K;e[21]!==o.key||e[22]!==c||e[23]!==m||e[24]!==h?(K=m&&(0,n.jsx)("div",{className:"mt-1",children:(0,n.jsx)(Ae,{objectKey:o.key,references:c,t:h})}),e[21]=o.key,e[22]=c,e[23]=m,e[24]=h,e[25]=K):K=e[25];let D;e[26]!==z||e[27]!==C||e[28]!==K?(D=(0,n.jsxs)("div",{className:"min-w-0",children:[z,C,K]}),e[26]=z,e[27]=C,e[28]=K,e[29]=D):D=e[29];let F=r===o.key,$;e[30]!==t||e[31]!==w||e[32]!==a||e[33]!==o.key||e[34]!==N||e[35]!==h||e[36]!==F?($=(0,n.jsx)("div",{className:"flex items-center gap-1",children:(0,n.jsx)(Be,{busy:t,buttonClassName:"h-7 px-2 text-xs",copied:F,objectKey:o.key,onCopy:w,onDelete:N,onDownload:a,t:h})}),e[30]=t,e[31]=w,e[32]=a,e[33]=o.key,e[34]=N,e[35]=h,e[36]=F,e[37]=$):$=e[37];let _;return e[38]!==$||e[39]!==y||e[40]!==D?(_=(0,n.jsxs)("div",{className:"flex flex-col gap-1.5","data-testid":"fb-tile",children:[y,D,$]}),e[38]=$,e[39]=y,e[40]=D,e[41]=_):_=e[41],_},"jt"),Lt=g(d=>{let e=(0,B.c)(9),{name:t,onEnter:r}=d,s;e[0]!==t||e[1]!==r?(s=g(()=>{r(t)},"o"),e[0]=t,e[1]=r,e[2]=s):s=e[2];let o=s,i;e[3]===Symbol.for("react.memo_cache_sentinel")?(i=(0,n.jsx)("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:(0,n.jsx)("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:(0,n.jsx)("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 c;e[4]!==t?(c=(0,n.jsx)("span",{className:"truncate font-mono text-xs",title:t,children:t}),e[4]=t,e[5]=c):c=e[5];let l;return e[6]!==o||e[7]!==c?(l=(0,n.jsxs)("button",{className:"flex flex-col gap-1.5 text-left outline-none","data-testid":"fb-folder",onClick:o,type:"button",children:[i,c]}),e[6]=o,e[7]=c,e[8]=l):l=e[8],l},"Kt"),Et=g(d=>{let e=(0,B.c)(34),{busy:t,copiedKey:r,files:s,folders:o,handlers:i,onEnterFolder:c,prefix:l,references:u,resolveUrl:m,selected:h,showReferences:f,size:w,t:a}=d,k;e[0]!==w?(k=w.toString(),e[0]=w,e[1]=k):k=e[1];let N=`repeat(auto-fill, minmax(${k}px, 1fr))`,x;e[2]!==N?(x={gridTemplateColumns:N},e[2]=N,e[3]=x):x=e[3];let b=x,v;if(e[4]!==o||e[5]!==c){let S;e[7]!==c?(S=g(C=>(0,n.jsx)(Lt,{name:C,onEnter:c},C),"S"),e[7]=c,e[8]=S):S=e[8],v=o.map(S),e[4]=o,e[5]=c,e[6]=v}else v=e[6];let y;if(e[9]!==t||e[10]!==r||e[11]!==s||e[12]!==i||e[13]!==l||e[14]!==u||e[15]!==m||e[16]!==h||e[17]!==f||e[18]!==a){let S;e[20]!==t||e[21]!==r||e[22]!==i||e[23]!==l||e[24]!==u||e[25]!==m||e[26]!==h||e[27]!==f||e[28]!==a?(S=g(C=>(0,n.jsx)(_t,{busy:t,copiedKey:r,handlers:i,object:C,prefix:l,references:u[C.key],resolveUrl:m,selected:h.has(C.key),showReferences:f,t:a},C.key),"S"),e[20]=t,e[21]=r,e[22]=i,e[23]=l,e[24]=u,e[25]=m,e[26]=h,e[27]=f,e[28]=a,e[29]=S):S=e[29],y=s.map(S),e[9]=t,e[10]=r,e[11]=s,e[12]=i,e[13]=l,e[14]=u,e[15]=m,e[16]=h,e[17]=f,e[18]=a,e[19]=y}else y=e[19];let z;return e[30]!==b||e[31]!==v||e[32]!==y?(z=(0,n.jsxs)("div",{className:"grid gap-4","data-testid":"fb-gallery",style:b,children:[v,y]}),e[30]=b,e[31]=v,e[32]=y,e[33]=z):z=e[33],z},"Bt"),Ot=g(d=>{let e=(0,B.c)(23),{reference:t,t:r}=d,s=`fb-dangling-${t.table}-${t.id}-${t.column}`,o=`${t.table}\xB7${t.id}`,i;e[0]!==o?(i=(0,n.jsx)(ae,{variant:"secondary",children:o}),e[0]=o,e[1]=i):i=e[1];let c;e[2]!==t.column?(c=(0,n.jsx)("span",{className:"text-muted-foreground",children:t.column}),e[2]=t.column,e[3]=c):c=e[3];let l;e[4]!==r?(l=r("\u2192"),e[4]=r,e[5]=l):l=e[5];let u;e[6]!==l?(u=(0,n.jsx)("span",{className:"text-muted-foreground/60",children:l}),e[6]=l,e[7]=u):u=e[7];let m;e[8]!==t.key?(m=(0,n.jsx)("code",{className:"rounded bg-muted px-1 py-0.5 font-mono text-foreground",children:t.key}),e[8]=t.key,e[9]=m):m=e[9];let h;e[10]!==i||e[11]!==c||e[12]!==u||e[13]!==m?(h=(0,n.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5",children:[i,c,u,m]}),e[10]=i,e[11]=c,e[12]=u,e[13]=m,e[14]=h):h=e[14];let f;e[15]!==r?(f=r("Missing object"),e[15]=r,e[16]=f):f=e[16];let w;e[17]!==f?(w=(0,n.jsx)(ae,{className:"border-destructive/40 text-destructive",variant:"outline",children:f}),e[17]=f,e[18]=w):w=e[18];let a;return e[19]!==s||e[20]!==w||e[21]!==h?(a=(0,n.jsxs)("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":s,children:[h,w]}),e[19]=s,e[20]=w,e[21]=h,e[22]=a):a=e[22],a},"Lt"),It=g(d=>{let e=(0,B.c)(37),{busy:t,onCheck:r,references:s,t:o,truncated:i}=d,c;e[0]!==o?(c=o("Integrity"),e[0]=o,e[1]=c):c=e[1];let l;e[2]!==c?(l=(0,n.jsx)("span",{className:"font-mono text-[11px] uppercase tracking-wide text-muted-foreground",children:c}),e[2]=c,e[3]=l):l=e[3];let u;e[4]!==o?(u=o("Orphaned objects"),e[4]=o,e[5]=u):u=e[5];let m;e[6]!==u?(m=(0,n.jsx)("span",{className:"text-sm font-medium text-foreground",children:u}),e[6]=u,e[7]=m):m=e[7];let h;e[8]!==o?(h=o("Find records whose file reference points at an object the bucket no longer has."),e[8]=o,e[9]=h):h=e[9];let f;e[10]!==h?(f=(0,n.jsx)("span",{className:"text-xs text-muted-foreground",children:h}),e[10]=h,e[11]=f):f=e[11];let w;e[12]!==l||e[13]!==m||e[14]!==f?(w=(0,n.jsxs)("div",{className:"flex flex-col gap-1",children:[l,m,f]}),e[12]=l,e[13]=m,e[14]=f,e[15]=w):w=e[15];let a;e[16]!==t||e[17]!==o?(a=o(t?"Checking\u2026":"Check for orphans"),e[16]=t,e[17]=o,e[18]=a):a=e[18];let k;e[19]!==t||e[20]!==r||e[21]!==a?(k=(0,n.jsx)(re,{"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]=k):k=e[22];let N;e[23]!==w||e[24]!==k?(N=(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[w,k]}),e[23]=w,e[24]=k,e[25]=N):N=e[25];let x;e[26]!==s?.length||e[27]!==o?(x=s?.length===0&&(0,n.jsx)(me,{description:o("Every record's file reference points at an object that exists in the bucket."),testId:"fb-orphans-empty",title:o("No dangling references.")}),e[26]=s?.length,e[27]=o,e[28]=x):x=e[28];let b;e[29]!==s||e[30]!==o||e[31]!==i?(b=s!==void 0&&s.length>0&&(0,n.jsxs)(n.Fragment,{children:[i&&(0,n.jsx)("p",{className:"text-xs text-warning","data-testid":"fb-orphans-truncated",children:o("Showing the first {count} dangling references \u2014 the scan was truncated.",{count:s.length})}),(0,n.jsx)("ul",{className:"flex flex-col gap-1.5","data-testid":"fb-orphans-list",children:s.map(y=>(0,n.jsx)(Ot,{reference:y,t:o},`${y.table}\xB7${y.id}\xB7${y.column}`))})]}),e[29]=s,e[30]=o,e[31]=i,e[32]=b):b=e[32];let v;return e[33]!==N||e[34]!==x||e[35]!==b?(v=(0,n.jsxs)("section",{className:"flex flex-col gap-2 rounded-lg border border-border/60 p-3","data-testid":"fb-orphans",children:[N,x,b]}),e[33]=N,e[34]=x,e[35]=b,e[36]=v):v=e[36],v},"It"),Rt=g(function(d,e){let t=(0,B.c)(18),r;t[0]===Symbol.for("react.memo_cache_sentinel")?(r=new Set,t[0]=r):r=t[0];let[s,o]=(0,j.useState)(r),i;t[1]===Symbol.for("react.memo_cache_sentinel")?(i=g(x=>{o(b=>{let v=new Set(b);return v.has(x)?v.delete(x):v.add(x),v})},"c"),t[1]=i):i=t[1];let c=i,l;t[2]===Symbol.for("react.memo_cache_sentinel")?(l=g(()=>{o(new Set)},"n"),t[2]=l):l=t[2];let u=l,m,h,f;if(t[3]!==d||t[4]!==e||t[5]!==s){let x;t[9]!==e?(x=g(b=>e(b),"y"),t[9]=e,t[10]=x):x=t[10],h=d.map(x),m=h.length>0&&h.every(b=>s.has(b)),f=!m&&h.some(b=>s.has(b)),t[3]=d,t[4]=e,t[5]=s,t[6]=m,t[7]=h,t[8]=f}else m=t[6],h=t[7],f=t[8];let w=f,a;t[11]!==h?(a=g(()=>{o(x=>h.every(b=>x.has(b))?new Set:new Set(h))},"i"),t[11]=h,t[12]=a):a=t[12];let k=a,N;return t[13]!==m||t[14]!==s||t[15]!==w||t[16]!==k?(N={allSelected:m,clear:u,selected:s,someSelected:w,toggle:c,toggleAll:k},t[13]=m,t[14]=s,t[15]=w,t[16]=k,t[17]=N):N=t[17],N},"Ot"),Ut=fe(be.storageReferences),Mt=fe(be.storageOrphans),Re=1e4,Bt=1e3,At=3600,Pt=g((d,e)=>{if(!("document"in globalThis))return;let t=globalThis.document.createElement("a");t.href=d,t.download=e,t.rel="noopener",globalThis.document.body.append(t),t.click(),t.remove()},"Ht"),Vt=g(d=>d.key,"Pt"),Wt=g(({initialPrefix:d,pageSize:e})=>{let t=Se(),[r,s]=(0,j.useState)(d??""),[o,i]=(0,j.useState)(d??""),[c,l]=(0,j.useState)(wt),[u,m]=(0,j.useState)("list"),[h,f]=(0,j.useState)(128),[w,a]=(0,j.useState)("name"),[k,N]=(0,j.useState)("asc"),[x,b]=(0,j.useState)(void 0),[v,y]=(0,j.useState)(void 0),[z,S]=(0,j.useState)(!1),[C,K]=(0,j.useState)(void 0),[D,F]=(0,j.useState)(void 0),[$,_]=(0,j.useState)(""),[I,E]=(0,j.useState)({}),[U,L]=(0,j.useState)(!1),[O,M]=(0,j.useState)(void 0),[A,W]=(0,j.useState)(!1),[P,H]=(0,j.useState)(!1),[J,oe]=(0,j.useState)([]),[G,xe]=(0,j.useState)(""),le=(0,j.useRef)(0),X=(0,j.useRef)(0);(0,j.useEffect)(()=>{let p={cancelled:!1};return V((async()=>{try{let T=await t.listStorageBuckets();if(!p.cancelled){oe(T);let[R]=T;R!==void 0&&xe(q=>q===""?R:q)}}catch{}})()),()=>{p.cancelled=!0}},[t]);let Z=(0,j.useMemo)(()=>({list:g(p=>t.listStorageObjects({...p,bucket:G}),"list"),remove:g(p=>t.deleteStorageObject(p,{bucket:G}),"remove"),signedUrl:g((p,T)=>t.signedStorageUrl(p,{...T,bucket:G}),"signedUrl"),upload:g(p=>t.uploadStorageObject({...p,bucket:G}),"upload")}),[G,t]),Y=(0,j.useCallback)(async(p,T,R)=>{le.current+=1;let q=le.current;y(void 0),S(!0);try{let te=await Z.list({cursor:T,limit:e,prefix:p});if(q!==le.current)return;b(we=>R&&we!==void 0?[...we,...te.objects]:te.objects),F(te.cursor)}catch(te){if(q!==le.current)return;R||b(void 0),y(Q(te))}finally{q===le.current&&S(!1)}},[e,Z]);(0,j.useEffect)(()=>{V(Y(d??"",void 0,!1))},[Y,d]);let Ve=(x?.length??0)<=e;Le(()=>{V(Y(r,void 0,!1))},Ve);let{files:de,folders:We}=Nt(x??[],r),He=(0,j.useMemo)(()=>{let p=new Set;for(let T of de)for(let R of Object.keys(T.customMetadata??{}))p.add(R);return[...p].toSorted((T,R)=>T.localeCompare(R))},[de]),ce=St(de,w,k),ue=(0,j.useMemo)(()=>[...new Set(ce.map(p=>p.key))].toSorted((p,T)=>p.localeCompare(T)).join(`
3
3
  `),[ce]);(0,j.useEffect)(()=>{let p=ue===""?[]:ue.split(`
4
4
  `);if(p.length===0){E({});return}let T={current:!0};return V((async()=>{try{let R=await t.query(Ut,{keys:p},ge($));T.current&&(E(R.references??{}),L(Object.keys(R.storageColumns??{}).length>0))}catch{T.current&&(E({}),L(!1))}})()),()=>{T.current=!1}},[t,ue,$]);let{allSelected:qe,clear:se,selected:ve,someSelected:Ge,toggle:Ze,toggleAll:Ye}=Rt(ce,Vt),Je=g(()=>{s(o),se(),V(Y(o,void 0,!1))},"Ae"),Xe=g(()=>{V(Y(r,D,!0))},"Ue"),ke=g(p=>{s(p),i(p),se(),V(Y(p,void 0,!1))},"ye"),Qe=g(p=>{ke(`${r}${p}`)},"Me"),et=g(p=>Z.signedUrl(p,{expiresInSeconds:At}),"Ge"),tt=g(()=>{m("list")},"He"),rt=g(()=>{m("grid")},"Pe"),nt=g(p=>{a(p)},"qe"),ot=g(()=>{N(p=>p==="asc"?"desc":"asc")},"Ve"),lt=g(p=>{f(p)},"We"),st=g(p=>{l(p)},"Ze"),at=g(()=>{y(void 0),S(!0),V((async()=>{try{for(let p of ve)await Z.remove(p);await Y(r,void 0,!1),se()}catch(p){y(Q(p))}S(!1)})())},"Xe"),ct=g(p=>{y(void 0),V((async()=>{try{let T=await Z.signedUrl(p,{expiresInSeconds:c});De(T)&&K(p)}catch(T){y(Q(T))}})())},"Ye"),it=g(p=>{y(void 0),V((async()=>{try{let T=await Z.signedUrl(p,{expiresInSeconds:c}),R=p.slice(p.lastIndexOf("/")+1)||p;Pt(T,R)}catch(T){y(Q(T))}})())},"Je");(0,j.useEffect)(()=>{if(C===void 0)return;let p=globalThis.setTimeout(()=>{K(void 0)},2e3);return()=>{globalThis.clearTimeout(p)}},[C]);let dt=g(p=>{y(void 0),S(!0),V((async()=>{try{await Z.remove(p),await Y(r,void 0,!1)}catch(T){y(Q(T))}S(!1)})())},"Qe"),ut=g(p=>{let T=`${r}${p.name}`;y(void 0),S(!0),V((async()=>{try{let R=await p.arrayBuffer();await Z.upload({body:R,contentType:p.type===""?void 0:p.type,key:T}),await Y(r,void 0,!1)}catch(R){y(Q(R))}S(!1)})())},"et");(0,j.useEffect)(()=>{X.current+=1,M(void 0),H(!1)},[$]);let ht=g(()=>{X.current+=1;let p=X.current;y(void 0),W(!0),V((async()=>{try{let T=[],R;do{let q=await Z.list({cursor:R,limit:Bt});for(let te of q.objects)T.push(te.key);R=T.length>=Re?void 0:q.cursor}while(R!==void 0);if(T.length>=Re)p===X.current&&(M([]),H(!0));else{let q=await t.query(Mt,{liveKeys:T},ge($));p===X.current&&(M(q.references??[]),H(q.truncated===!0))}}catch(T){p===X.current&&(M([]),H(!1),y(Q(T)))}p===X.current&&W(!1)})())},"tt"),mt=g(p=>{le.current+=1,X.current+=1,xe(p),s(d??""),i(d??""),b(void 0),M(void 0),H(!1),se()},"st");return{allSelected:qe,bucket:G,buckets:J,bulkDelete:at,busy:z,checkOrphans:ht,clearSelection:se,copiedKey:C,danglingBusy:A,danglingReferences:O,danglingTruncated:P,draftPrefix:o,enterFolder:Qe,error:v,expiry:c,files:ce,folders:We,hasObjects:x!==void 0&&x.length>0,hasStorageColumns:U,listFirst:Je,loaded:x!==void 0,loadMore:Xe,navigate:ke,nextCursor:D,onCopy:ct,onDelete:dt,onDownload:it,onExpiryChange:st,onFile:ut,onSortKeyChange:nt,onThumbSizeChange:lt,prefix:r,referenceShard:$,references:I,resolveUrl:et,selectBucket:mt,selected:ve,setDraftPrefix:i,setReferenceShard:_,showGrid:rt,showList:tt,someSelected:Ge,sortDirection:k,sortKey:w,tagKeys:He,thumbSize:h,toggleSelect:Ze,toggleSelectAll:Ye,toggleSortDirection:ot,view:u}},"qt"),Ht=100,Ue=g(d=>{let e=(0,B.c)(6),{label:t,onNavigate:r,target:s}=d,o;e[0]!==r||e[1]!==s?(o=g(()=>{r(s)},"l"),e[0]=r,e[1]=s,e[2]=o):o=e[2];let i=o,c;return e[3]!==i||e[4]!==t?(c=(0,n.jsx)("button",{className:"rounded px-1 text-muted-foreground outline-none hover:text-foreground focus-visible:text-foreground",onClick:i,type:"button",children:t}),e[3]=i,e[4]=t,e[5]=c):c=e[5],c},"Se"),qt=g(d=>{let e=(0,B.c)(11),{onNavigate:t,prefix:r,t:s}=d,o;if(e[0]!==t||e[1]!==r||e[2]!==s){let i=r.split("/").filter(Gt),c;e[4]!==s?(c=s("Folder path"),e[4]=s,e[5]=c):c=e[5];let l;e[6]!==s?(l=s("root"),e[6]=s,e[7]=l):l=e[7];let u;e[8]!==t||e[9]!==l?(u=(0,n.jsx)(Ue,{label:l,onNavigate:t,target:""}),e[8]=t,e[9]=l,e[10]=u):u=e[10],o=(0,n.jsxs)("nav",{"aria-label":c,className:"flex flex-wrap items-center gap-0.5 text-xs","data-testid":"fb-breadcrumbs",children:[u,i.map((m,h)=>(0,n.jsxs)("span",{className:"flex items-center gap-0.5",children:[(0,n.jsx)("span",{className:"text-muted-foreground/50",children:"/"}),(0,n.jsx)(Ue,{label:m,onNavigate:t,target:`${i.slice(0,h+1).join("/")}/`})]},`${m}-${h.toString()}`))]}),e[0]=t,e[1]=r,e[2]=s,e[3]=o}else o=e[3];return o},"Wt"),ur=g(({initialPrefix:d,pageSize:e=Ht})=>{let t=Ne(),r=Wt({initialPrefix:d,pageSize:e}),s=(0,j.useRef)(null),{onCopy:o,onDelete:i,onDownload:c,onFile:l,toggleSelect:u}=r,m={onCopy:o,onDelete:i,onDownload:c,onToggleSelect:u},h=g(()=>{s.current?.click()},"u"),f=g(a=>{let k=a.target,N=k.files?.[0];k.value="",N&&l(N)},"m"),w=r.loaded&&!r.hasObjects;return(0,n.jsxs)("div",{className:"flex flex-col gap-3","data-testid":"lunora-file-browser",children:[(0,n.jsx)(Ct,{bucket:r.bucket,buckets:r.buckets,busy:r.busy,draftPrefix:r.draftPrefix,expiry:r.expiry,fileInputRef:s,onBucketChange:r.selectBucket,onExpiryChange:r.onExpiryChange,onFileChange:f,onList:r.listFirst,onPrefixChange:r.setDraftPrefix,onUploadClick:h,t}),r.loaded&&(0,n.jsx)(qt,{onNavigate:r.navigate,prefix:r.prefix,t}),r.hasObjects&&(0,n.jsx)(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&&(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2","data-testid":"fb-references-shard",children:[(0,n.jsx)("label",{className:"text-xs text-muted-foreground",htmlFor:"fb-reference-shard-input",children:t("References shard")}),(0,n.jsx)(Te,{id:"fb-reference-shard-input",onChange:r.setReferenceShard,testId:"fb-reference-shard-input",value:r.referenceShard}),(0,n.jsx)("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&&(0,n.jsx)(It,{busy:r.danglingBusy,onCheck:r.checkOrphans,references:r.danglingReferences,t,truncated:r.danglingTruncated}),r.selected.size>0&&(0,n.jsx)(Ee,{count:r.selected.size,editable:!0,onClear:r.clearSelection,onDelete:r.bulkDelete}),r.error!==void 0&&(0,n.jsx)("p",{className:"text-sm text-destructive","data-testid":"storage-error",role:"alert",children:r.error}),w&&(0,n.jsx)(me,{description:t("Objects you upload to your R2 buckets will appear here."),icon:(0,n.jsxs)("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[(0,n.jsx)("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"}),(0,n.jsx)("path",{d:"M12 11v5m-2.5-2.5h5"})]}),testId:"fb-empty",title:t("No objects.")}),r.hasObjects&&r.view==="list"&&(0,n.jsx)(vt,{allSelected:r.allSelected,busy:r.busy,copiedKey:r.copiedKey,files:r.files,folders:r.folders,handlers:m,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"&&(0,n.jsx)(Et,{busy:r.busy,copiedKey:r.copiedKey,files:r.files,folders:r.folders,handlers:m,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&&(0,n.jsx)("div",{children:(0,n.jsx)(re,{"data-testid":"fb-next",disabled:r.busy,onClick:r.loadMore,size:"sm",type:"button",variant:"outline",children:t("Load more")})})]})},"ps");function Gt(d){return d!==""}g(Gt,"Zt");export{ur as FileBrowser};