@lunora/studio 1.0.0-alpha.361 → 1.0.0-alpha.363
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.mjs +1 -1
- package/dist/mount.mjs +1 -1
- package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -1
- package/dist/packem_chunks/ApiTab.mjs +1 -1
- package/dist/packem_chunks/AuditPanel.mjs +1 -1
- package/dist/packem_chunks/ExportImportPanel.mjs +1 -1
- package/dist/packem_chunks/FileBrowser.mjs +1 -1
- package/dist/packem_chunks/FunctionRunner.mjs +1 -1
- package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -1
- package/dist/packem_chunks/HealthPanel.mjs +1 -1
- package/dist/packem_chunks/InsightsPanel.mjs +1 -1
- package/dist/packem_chunks/LogsPanel.mjs +1 -1
- package/dist/packem_chunks/MailPanel.mjs +1 -1
- package/dist/packem_chunks/MetricsPanel.mjs +1 -1
- package/dist/packem_chunks/NotificationsPanel.mjs +1 -1
- package/dist/packem_chunks/PitrPanel.mjs +1 -1
- package/dist/packem_chunks/SchemaViewer.mjs +1 -1
- package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -1
- package/dist/packem_chunks/SettingsPanel.mjs +1 -1
- package/dist/packem_chunks/SqlEditorPanel.mjs +24 -9
- package/dist/packem_chunks/TableEditor.mjs +1 -1
- package/dist/packem_chunks/agents-panel.mjs +1 -1
- package/dist/packem_chunks/ai-knowledge.mjs +1 -0
- package/dist/packem_chunks/ai-usage-panel.mjs +1 -1
- package/dist/packem_chunks/assistant-panel.mjs +3 -0
- package/dist/packem_chunks/auth-audit-panel.mjs +1 -1
- package/dist/packem_chunks/containers-panel.mjs +1 -1
- package/dist/packem_chunks/dashboards-panel.mjs +1 -1
- package/dist/packem_chunks/evals-panel.mjs +1 -1
- package/dist/packem_chunks/fanout-panel.mjs +1 -1
- package/dist/packem_chunks/flags-panel.mjs +1 -1
- package/dist/packem_chunks/issues-panel.mjs +1 -1
- package/dist/packem_chunks/kv-browser.mjs +1 -1
- package/dist/packem_chunks/log-drains-panel.mjs +1 -1
- package/dist/packem_chunks/migrations-route.mjs +1 -1
- package/dist/packem_chunks/payments-panel.mjs +1 -1
- package/dist/packem_chunks/permissions-panel.mjs +1 -1
- package/dist/packem_chunks/privacy-requests-panel.mjs +1 -1
- package/dist/packem_chunks/queues-panel.mjs +1 -1
- package/dist/packem_chunks/reactors-panel.mjs +1 -1
- package/dist/packem_chunks/rls-panel.mjs +1 -1
- package/dist/packem_chunks/schedule-panel.mjs +1 -1
- package/dist/packem_chunks/storage-rules-panel.mjs +1 -1
- package/dist/packem_chunks/subscriptions-panel.mjs +1 -1
- package/dist/packem_chunks/traces-panel.mjs +1 -1
- package/dist/packem_chunks/workflows-panel.mjs +1 -1
- package/dist/packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs +1 -0
- package/dist/packem_shared/{ApiDocsPanel-DD2Uns6b.mjs → ApiDocsPanel-B9S9l1Ce.mjs} +1 -1
- package/dist/packem_shared/{DataBrowser-CVRWnNWu.mjs → DataBrowser-Dm-jhIUP.mjs} +2 -2
- package/dist/packem_shared/{GlobalDataBrowser-DC47T6Zl.mjs → GlobalDataBrowser-C1Y8GUhe.mjs} +1 -1
- package/dist/packem_shared/{HomePanel-D12HxHQo.mjs → HomePanel-B5ytwPIo.mjs} +1 -1
- package/dist/packem_shared/{MigrationsPanel-DMkxSXNl.mjs → MigrationsPanel-CwLikxDT.mjs} +1 -1
- package/dist/packem_shared/Studio-B89ZNMOD.mjs +1 -0
- package/dist/packem_shared/{StudioApp-isdWpF9P.mjs → StudioApp-C9l1a3A8.mjs} +1 -1
- package/dist/packem_shared/advisor-view-CzieqKMe.mjs +5 -0
- package/dist/packem_shared/assistant-provider-Bp72uWsq.mjs +1 -0
- package/dist/packem_shared/assistant-reason-D6EwMCxT.mjs +1 -0
- package/dist/packem_shared/{cf-links-CBJ5SywP.mjs → cf-links-C4DVTr8A.mjs} +1 -1
- package/dist/packem_shared/error-alert-DKXm5h19.mjs +6 -0
- package/dist/packem_shared/{home-panel-CDVTuTF8.mjs → home-panel-5fGktYeD.mjs} +1 -1
- package/dist/packem_shared/recording-client-z4CBi0y8.mjs +1 -0
- package/dist/packem_shared/studio-gZfpz1wC.mjs +2 -0
- package/dist/packem_shared/{table-list-sidebar-CNadcIgG.mjs → table-list-sidebar-kpHaDWjy.mjs} +1 -1
- package/dist/packem_shared/use-assistant-rpc-GCUK2zPa.mjs +1 -0
- package/dist/standalone/chunk-2DT3QG6Q.js +1 -0
- package/dist/standalone/chunk-2EB7FN5S.js +1 -0
- package/dist/standalone/chunk-2H6VLY2M.js +1 -0
- package/dist/standalone/chunk-2NGKUO32.js +1 -0
- package/dist/standalone/chunk-2SNHKJXK.js +1 -0
- package/dist/standalone/chunk-2W4UO5BC.js +1 -0
- package/dist/standalone/chunk-32V7XGNC.js +1 -0
- package/dist/standalone/{chunk-SLIDAWNX.js → chunk-3D67ZJRW.js} +1 -1
- package/dist/standalone/chunk-3X3NXJBR.js +1 -0
- package/dist/standalone/chunk-4EPW63HS.js +1 -0
- package/dist/standalone/chunk-4L55URI5.js +2 -0
- package/dist/standalone/chunk-4N76XUNG.js +1 -0
- package/dist/standalone/{chunk-WS36BO4R.js → chunk-4NKJV7YX.js} +1 -1
- package/dist/standalone/chunk-4PI2OSSP.js +1 -0
- package/dist/standalone/chunk-53XKGQEE.js +1 -0
- package/dist/standalone/chunk-5GYHGDIF.js +8 -0
- package/dist/standalone/chunk-5PEAXTYQ.js +1 -0
- package/dist/standalone/chunk-5QUTVSHM.js +1 -0
- package/dist/standalone/{chunk-BYOGQ2IV.js → chunk-5RX5CQSU.js} +2 -2
- package/dist/standalone/{chunk-O2NMPIV2.js → chunk-5WNGRT7N.js} +1 -1
- package/dist/standalone/chunk-5Z2U4KBN.js +1 -0
- package/dist/standalone/chunk-66BMMNUR.js +1 -0
- package/dist/standalone/chunk-6FPV3EK2.js +1 -0
- package/dist/standalone/chunk-6G3E4PJ2.js +1 -0
- package/dist/standalone/chunk-75TRPM7O.js +1 -0
- package/dist/standalone/chunk-7MLX5CGD.js +1 -0
- package/dist/standalone/chunk-7QEZ2SFW.js +1 -0
- package/dist/standalone/chunk-7TQ7BZ67.js +1 -0
- package/dist/standalone/chunk-A2Q3TGIQ.js +1 -0
- package/dist/standalone/chunk-AD5J2ANS.js +1 -0
- package/dist/standalone/chunk-ALR4VAUE.js +1 -0
- package/dist/standalone/chunk-AXE2SDRU.js +1 -0
- package/dist/standalone/chunk-AZIKM5BA.js +1 -0
- package/dist/standalone/chunk-BAEIW3YS.js +1 -0
- package/dist/standalone/chunk-BBDTJG2K.js +1 -0
- package/dist/standalone/chunk-BCUOQNI2.js +1 -0
- package/dist/standalone/chunk-BG2CJOVS.js +1 -0
- package/dist/standalone/chunk-BI6MZHZJ.js +1 -0
- package/dist/standalone/chunk-BKI3JMXQ.js +1 -0
- package/dist/standalone/chunk-CKEQX655.js +1 -0
- package/dist/standalone/{chunk-DX55P3KZ.js → chunk-CL3JOU6F.js} +1 -1
- package/dist/standalone/chunk-CP7QNLR4.js +1 -0
- package/dist/standalone/chunk-CVSIFPI5.js +1 -0
- package/dist/standalone/chunk-D57B4MFK.js +1 -0
- package/dist/standalone/chunk-D65UVZIA.js +1 -0
- package/dist/standalone/{chunk-DBVJ5VLI.js → chunk-DA2CAFXI.js} +1 -1
- package/dist/standalone/chunk-DB6QX4X6.js +1 -0
- package/dist/standalone/chunk-DZFXH55R.js +1 -0
- package/dist/standalone/chunk-ELSQ4FVH.js +1 -0
- package/dist/standalone/chunk-EPWCW2DF.js +1 -0
- package/dist/standalone/chunk-FHLODLBC.js +1 -0
- package/dist/standalone/chunk-FJLRSFTE.js +1 -0
- package/dist/standalone/{chunk-3FS22LNI.js → chunk-FVCBNFQW.js} +3 -3
- package/dist/standalone/{chunk-VEWQWS3J.js → chunk-FWM5Z6CH.js} +1 -1
- package/dist/standalone/chunk-GJXCPZDN.js +1 -0
- package/dist/standalone/chunk-GNI37YCV.js +33 -0
- package/dist/standalone/chunk-GVQPNM3T.js +3 -0
- package/dist/standalone/chunk-GWNGVKLG.js +1 -0
- package/dist/standalone/chunk-GXTSE66Z.js +1 -0
- package/dist/standalone/chunk-H3EIPYRZ.js +1 -0
- package/dist/standalone/chunk-H5TMLWIS.js +1 -0
- package/dist/standalone/{chunk-XIRKBJPD.js → chunk-HBG6SSE2.js} +5 -5
- package/dist/standalone/chunk-HC2B7SXW.js +1 -0
- package/dist/standalone/chunk-HCOF7HOM.js +1 -0
- package/dist/standalone/chunk-HGCOTYPV.js +1 -0
- package/dist/standalone/chunk-HLHMHCXS.js +1 -0
- package/dist/standalone/chunk-HSF2DCJ2.js +30 -0
- package/dist/standalone/chunk-HZDLUAWS.js +1 -0
- package/dist/standalone/{chunk-3PAYDWHN.js → chunk-I3SSF2T6.js} +2 -2
- package/dist/standalone/chunk-I5QX75DE.js +1 -0
- package/dist/standalone/chunk-ICHZ2IBL.js +1 -0
- package/dist/standalone/{chunk-7ZIYHKLX.js → chunk-IG5VD7R7.js} +3 -3
- package/dist/standalone/{chunk-SU5DTRGK.js → chunk-IHGRWY3Y.js} +1 -1
- package/dist/standalone/chunk-J45HAKBU.js +1 -0
- package/dist/standalone/chunk-J4PQAVOF.js +1 -0
- package/dist/standalone/chunk-JD6PRRFO.js +1 -0
- package/dist/standalone/chunk-JOPNP4EO.js +1 -0
- package/dist/standalone/chunk-JVP3TR3A.js +1 -0
- package/dist/standalone/chunk-KGLIQIZU.js +1 -0
- package/dist/standalone/{chunk-ONWGX5Y4.js → chunk-KH6OXCG3.js} +1 -1
- package/dist/standalone/chunk-KKMQUBYH.js +1 -0
- package/dist/standalone/chunk-L2FYX4FN.js +1 -0
- package/dist/standalone/chunk-LDHJRHPZ.js +1 -0
- package/dist/standalone/chunk-LSEUUZN4.js +1 -0
- package/dist/standalone/chunk-MNYDT3RH.js +1 -0
- package/dist/standalone/chunk-MT4ICMXJ.js +1 -0
- package/dist/standalone/chunk-MXJTD2OX.js +1 -0
- package/dist/standalone/chunk-NGZNXNRD.js +1 -0
- package/dist/standalone/chunk-O3AZ7JKE.js +1 -0
- package/dist/standalone/chunk-OK2QU2EV.js +1 -0
- package/dist/standalone/{chunk-IH2CJZF2.js → chunk-ONTGYVAN.js} +1 -1
- package/dist/standalone/chunk-OWRKSQPE.js +1 -0
- package/dist/standalone/chunk-OZAOWE7T.js +1 -0
- package/dist/standalone/chunk-P5EVJEGC.js +1 -0
- package/dist/standalone/chunk-PDBW6GTJ.js +1 -0
- package/dist/standalone/chunk-PJUVJTDR.js +1 -0
- package/dist/standalone/chunk-Q3IA6HPX.js +1 -0
- package/dist/standalone/chunk-QAOZXPLU.js +1 -0
- package/dist/standalone/chunk-QKUVJIRX.js +1 -0
- package/dist/standalone/chunk-QNM2J7MG.js +1 -0
- package/dist/standalone/chunk-QRA7AKYO.js +1 -0
- package/dist/standalone/chunk-RBIVXSXT.js +1 -0
- package/dist/standalone/chunk-RCXNYW7P.js +1 -0
- package/dist/standalone/{chunk-TDVDZ7XQ.js → chunk-RIAOZECW.js} +1 -1
- package/dist/standalone/{chunk-LUHXNZI4.js → chunk-RTS5G3ET.js} +1 -1
- package/dist/standalone/chunk-S36FVTKK.js +1 -0
- package/dist/standalone/chunk-SDDEOSQB.js +1 -0
- package/dist/standalone/chunk-SHHGIT7M.js +7 -0
- package/dist/standalone/chunk-SR6CPTRT.js +1 -0
- package/dist/standalone/chunk-SVQWZPO4.js +1 -0
- package/dist/standalone/chunk-T3ZCW3RG.js +1 -0
- package/dist/standalone/chunk-TEMI7MVE.js +1 -0
- package/dist/standalone/chunk-TKBTZX4K.js +1 -0
- package/dist/standalone/chunk-TW4O2BA5.js +159 -0
- package/dist/standalone/chunk-U5MPNEM2.js +1 -0
- package/dist/standalone/chunk-UD5REVU2.js +1 -0
- package/dist/standalone/chunk-ULQNADMJ.js +1 -0
- package/dist/standalone/chunk-UPPNZ6MI.js +1 -0
- package/dist/standalone/{chunk-PQH2LSJX.js → chunk-UQA2AJGI.js} +1 -1
- package/dist/standalone/chunk-UTQLJKHH.js +1 -0
- package/dist/standalone/chunk-UVG3ZISC.js +1 -0
- package/dist/standalone/chunk-UXBNXITB.js +1 -0
- package/dist/standalone/chunk-UZ2ZXB74.js +1 -0
- package/dist/standalone/chunk-V3BE427M.js +1 -0
- package/dist/standalone/chunk-VQDTA4P6.js +1 -0
- package/dist/standalone/chunk-W4LJQYCI.js +1 -0
- package/dist/standalone/chunk-WLHQ4FKC.js +1 -0
- package/dist/standalone/chunk-XPFVUAPX.js +1 -0
- package/dist/standalone/{chunk-SYGCASPT.js → chunk-Y2YLTUMD.js} +1 -1
- package/dist/standalone/chunk-Y3IGTWUE.js +1 -0
- package/dist/standalone/chunk-Y64STA6O.js +1 -0
- package/dist/standalone/chunk-YEVTA35E.js +1 -0
- package/dist/standalone/chunk-YEXTJUKQ.js +6 -0
- package/dist/standalone/chunk-YFTPHGS2.js +1 -0
- package/dist/standalone/{chunk-R36QXQZX.js → chunk-YORPLSI5.js} +1 -1
- package/dist/standalone/chunk-Z64BZNPS.js +1 -0
- package/dist/standalone/chunk-Z6VILGGP.js +5 -0
- package/dist/standalone/chunk-ZBOB33BA.js +1 -0
- package/dist/standalone/{chunk-5R2YO7HF.js → chunk-ZOKSVUID.js} +4 -4
- package/dist/standalone/{chunk-H7HZ42JY.js → chunk-ZPQBVYNN.js} +1 -1
- package/dist/standalone/chunk-ZSWW2UGP.js +1 -0
- package/dist/standalone/studio.js +2 -2
- package/dist/styles.css +1 -1
- package/package.json +7 -6
- package/dist/packem_shared/ADMIN_FUNCTIONS-4aGsMs95.mjs +0 -1
- package/dist/packem_shared/Studio-MA8kKZLu.mjs +0 -1
- package/dist/packem_shared/advisor-view-tBumWci_.mjs +0 -1
- package/dist/packem_shared/error-alert-C0R39DO1.mjs +0 -1
- package/dist/packem_shared/recording-client-DAipTA_n.mjs +0 -1
- package/dist/packem_shared/studio-UhUrPz5J.mjs +0 -2
- package/dist/packem_shared/use-sql-assistant-rZPs3LC3.mjs +0 -1
- package/dist/standalone/chunk-2AH4ABE5.js +0 -1
- package/dist/standalone/chunk-2G57ENH5.js +0 -1
- package/dist/standalone/chunk-3GXPALXG.js +0 -1
- package/dist/standalone/chunk-3GYLOE4V.js +0 -1
- package/dist/standalone/chunk-473JK2PQ.js +0 -1
- package/dist/standalone/chunk-4C4THJUD.js +0 -1
- package/dist/standalone/chunk-4DAKKAK7.js +0 -1
- package/dist/standalone/chunk-4M57OYFX.js +0 -1
- package/dist/standalone/chunk-4SQBAPY6.js +0 -1
- package/dist/standalone/chunk-5DNGK3NT.js +0 -1
- package/dist/standalone/chunk-5GIQ6C5N.js +0 -1
- package/dist/standalone/chunk-5WJG7FMH.js +0 -1
- package/dist/standalone/chunk-63KDHS3H.js +0 -1
- package/dist/standalone/chunk-6B6ARRMI.js +0 -1
- package/dist/standalone/chunk-6LMO2D54.js +0 -1
- package/dist/standalone/chunk-6M7FLLMT.js +0 -1
- package/dist/standalone/chunk-6QEXGYWH.js +0 -1
- package/dist/standalone/chunk-6UTZXEW3.js +0 -1
- package/dist/standalone/chunk-6VAY6L4J.js +0 -1
- package/dist/standalone/chunk-7PADVGQX.js +0 -1
- package/dist/standalone/chunk-7RGYCU6F.js +0 -1
- package/dist/standalone/chunk-7UM5ROG6.js +0 -1
- package/dist/standalone/chunk-A566HCBX.js +0 -1
- package/dist/standalone/chunk-A5JISKHE.js +0 -1
- package/dist/standalone/chunk-ADNRFCMZ.js +0 -1
- package/dist/standalone/chunk-AP4PC2M4.js +0 -1
- package/dist/standalone/chunk-BFE2DRP6.js +0 -33
- package/dist/standalone/chunk-BPEB4KFE.js +0 -1
- package/dist/standalone/chunk-BVX45MU5.js +0 -7
- package/dist/standalone/chunk-C6GN7ZXJ.js +0 -1
- package/dist/standalone/chunk-CL2VZNDI.js +0 -1
- package/dist/standalone/chunk-CNA3TVUK.js +0 -1
- package/dist/standalone/chunk-CZ6HBDIL.js +0 -1
- package/dist/standalone/chunk-D6S7MXW4.js +0 -1
- package/dist/standalone/chunk-E26OT26O.js +0 -1
- package/dist/standalone/chunk-FCAXVYAX.js +0 -1
- package/dist/standalone/chunk-FXPAJDES.js +0 -1
- package/dist/standalone/chunk-HHRYM6UW.js +0 -1
- package/dist/standalone/chunk-HPRF5LMA.js +0 -1
- package/dist/standalone/chunk-IB22LETR.js +0 -1
- package/dist/standalone/chunk-IBJVVHV5.js +0 -1
- package/dist/standalone/chunk-IENQRRQT.js +0 -1
- package/dist/standalone/chunk-IQ4TTHQT.js +0 -1
- package/dist/standalone/chunk-ITH5LRWM.js +0 -1
- package/dist/standalone/chunk-J6VFG6M5.js +0 -1
- package/dist/standalone/chunk-JSDKOE4U.js +0 -1
- package/dist/standalone/chunk-JTGGWF7R.js +0 -1
- package/dist/standalone/chunk-JZD7ZN3F.js +0 -1
- package/dist/standalone/chunk-K3CWB3AM.js +0 -1
- package/dist/standalone/chunk-KNFB3FGW.js +0 -1
- package/dist/standalone/chunk-KNXWDE4N.js +0 -1
- package/dist/standalone/chunk-KRPXOSBL.js +0 -1
- package/dist/standalone/chunk-KRY7BYHT.js +0 -1
- package/dist/standalone/chunk-KYAG2YMF.js +0 -1
- package/dist/standalone/chunk-KZCEJFZF.js +0 -1
- package/dist/standalone/chunk-KZILJQX3.js +0 -8
- package/dist/standalone/chunk-LEYUH5TS.js +0 -1
- package/dist/standalone/chunk-LFM672WN.js +0 -1
- package/dist/standalone/chunk-LIGOLZND.js +0 -1
- package/dist/standalone/chunk-LPU6YTSU.js +0 -1
- package/dist/standalone/chunk-MWJC3S62.js +0 -1
- package/dist/standalone/chunk-NP2AQOLE.js +0 -1
- package/dist/standalone/chunk-NVKLYDOH.js +0 -1
- package/dist/standalone/chunk-O2X2XYCM.js +0 -1
- package/dist/standalone/chunk-O3MDWYXF.js +0 -1
- package/dist/standalone/chunk-ONG4JEZD.js +0 -1
- package/dist/standalone/chunk-OS26JXYA.js +0 -1
- package/dist/standalone/chunk-OXFKZ4BM.js +0 -1
- package/dist/standalone/chunk-PGTEGUAB.js +0 -1
- package/dist/standalone/chunk-PTBUWRBY.js +0 -1
- package/dist/standalone/chunk-Q6HA3L2H.js +0 -1
- package/dist/standalone/chunk-QGV5ARD2.js +0 -1
- package/dist/standalone/chunk-QWRK4ESB.js +0 -1
- package/dist/standalone/chunk-RL2ITK2N.js +0 -1
- package/dist/standalone/chunk-RTJO3AR4.js +0 -1
- package/dist/standalone/chunk-SFY646MC.js +0 -1
- package/dist/standalone/chunk-T5UMHPAB.js +0 -1
- package/dist/standalone/chunk-T6HV2FQP.js +0 -2
- package/dist/standalone/chunk-T7ZKNNGX.js +0 -1
- package/dist/standalone/chunk-TCYPNSTV.js +0 -1
- package/dist/standalone/chunk-TQM6XHBA.js +0 -1
- package/dist/standalone/chunk-TRMWBRRU.js +0 -1
- package/dist/standalone/chunk-TW7KJSMR.js +0 -15
- package/dist/standalone/chunk-TYD3V4NB.js +0 -1
- package/dist/standalone/chunk-TZKLK52W.js +0 -1
- package/dist/standalone/chunk-U4RXQSQ7.js +0 -1
- package/dist/standalone/chunk-UNZ2UBVL.js +0 -1
- package/dist/standalone/chunk-VJRNOSRY.js +0 -1
- package/dist/standalone/chunk-W2BCSK5S.js +0 -1
- package/dist/standalone/chunk-W7MRISE3.js +0 -1
- package/dist/standalone/chunk-WM72PRE3.js +0 -1
- package/dist/standalone/chunk-X4WHMCOZ.js +0 -1
- package/dist/standalone/chunk-X74GEPSG.js +0 -1
- package/dist/standalone/chunk-XKPD4SFN.js +0 -1
- package/dist/standalone/chunk-XMSNLMWU.js +0 -1
- package/dist/standalone/chunk-XOPFDWXX.js +0 -1
- package/dist/standalone/chunk-XQLOVFPP.js +0 -1
- package/dist/standalone/chunk-XSHYZPGF.js +0 -1
- package/dist/standalone/chunk-XST3UEHU.js +0 -1
- package/dist/standalone/chunk-XYR5NST4.js +0 -1
- package/dist/standalone/chunk-Y74LIFSL.js +0 -1
- package/dist/standalone/chunk-YHTHRYP5.js +0 -1
- package/dist/standalone/chunk-YMEKCV27.js +0 -1
- package/dist/standalone/chunk-Z5EV64KS.js +0 -1
- package/dist/standalone/chunk-ZBON5T5A.js +0 -1
- package/dist/standalone/chunk-ZGSL4DPP.js +0 -1
- package/dist/standalone/chunk-ZOQTXWPK.js +0 -1
- package/dist/standalone/chunk-ZTOREMGH.js +0 -1
- package/dist/standalone/chunk-ZZ5GICTF.js +0 -1
- /package/dist/standalone/{chunk-UYEZR3BI.js → chunk-P6VNMPWR.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useState as Z,useReducer as ne,useRef as ie,useEffect as te}from"react";import{C as ye,a as ge}from"../packem_shared/card-By2O8ULa.mjs";import{E as Ie}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as be,a as ke,b as ee,c as Q,d as xe,e as X}from"../packem_shared/table-D0SBiDu-.mjs";import{u as le}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as W}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{f as J,b as H,n as Le,g as de}from"../packem_shared/internal-hIuTpSbx.mjs";import{B as z}from"../packem_shared/button-q0UYSmrn.mjs";import{I as se}from"../packem_shared/input-CXhxesPC.mjs";import{b as oe,c as ce,d as ue,e as me}from"../packem_shared/studio-UhUrPz5J.mjs";import{c as re}from"react/compiler-runtime";import{L as q}from"../packem_shared/label-DKFzyHq6.mjs";import{T as Ne}from"../packem_shared/textarea--40GKAyz.mjs";import{c as Oe,S as Me,a as Be,b as De,d as Ae}from"../packem_shared/select-DPyS18Vy.mjs";import{jsx as a,jsxs as E,Fragment as Se}from"react/jsx-runtime";import{useVirtualizer as Re,observeElementOffset as ze}from"@tanstack/react-virtual";import{C as fe}from"../packem_shared/checkbox-CnS9cyCz.mjs";import{f as Pe}from"../packem_shared/virtual-rect-D_j7aLxX.mjs";import{B as $e}from"../packem_shared/badge-r_5B4LHP.mjs";const Je=l=>{const e=l.trim();if(e==="")return;const n=Number(e);return Number.isFinite(n)&&n>0?Math.floor(n):void 0},He=l=>l===void 0?"—":new Date(l*1e3).toISOString(),We=l=>new TextEncoder().encode(l).length,Ce=l=>{if(l.trim()!=="")try{return JSON.stringify(JSON.parse(l),void 0,2)}catch{return}},Ee=l=>{if(l.trim()==="")return!0;try{return JSON.parse(l),!0}catch{return!1}},we=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ve=(l,e)=>{const n=l.trim();if(n==="")return"";const s=Number(n),i=we.find(v=>v.key===e)?.seconds??1;return Number.isFinite(s)&&s>0?String(Math.round(s*i)):n},Te=l=>{const e=l.trim();if(e==="")return!0;const n=Number(e);return Number.isInteger(n)&&n>=60},Ke=(l,e,n,s)=>{const i=Je(l.ttl);return{expiration:i===void 0?s:void 0,expirationTtl:i,key:e,metadata:l.metadata.trim()===""?void 0:JSON.parse(l.metadata),namespace:n,value:l.value}},_e=l=>{const e=re(60),{helper:n,id:s,invalid:i,onChange:v,testId:d}=l,t=W(),[r,p]=Z(""),[c,k]=Z("seconds");let x;e[0]!==v||e[1]!==c?(x=C=>{p(C.target.value),v(ve(C.target.value,c))},e[0]=v,e[1]=c,e[2]=x):x=e[2];const _=x;let F;e[3]!==r||e[4]!==v?(F=C=>{C!==null&&(k(C),v(ve(r,C)))},e[3]=r,e[4]=v,e[5]=F):F=e[5];const w=F;let o;e[6]!==t?(o=t("days"),e[6]=t,e[7]=o):o=e[7];let u;e[8]!==t?(u=t("hours"),e[8]=t,e[9]=u):u=e[9];let f;e[10]!==t?(f=t("minutes"),e[10]=t,e[11]=f):f=e[11];let y;e[12]!==t?(y=t("seconds"),e[12]=t,e[13]=y):y=e[13];let b;e[14]!==o||e[15]!==u||e[16]!==f||e[17]!==y?(b={days:o,hours:u,minutes:f,seconds:y},e[14]=o,e[15]=u,e[16]=f,e[17]=y,e[18]=b):b=e[18];const N=b;let g;e[19]!==t?(g=t("Expires after"),e[19]=t,e[20]=g):g=e[20];let S;e[21]!==s||e[22]!==g?(S=a(q,{className:"text-xs",htmlFor:s,children:g}),e[21]=s,e[22]=g,e[23]=S):S=e[23];let V;e[24]!==t?(V=t("No expiration"),e[24]=t,e[25]=V):V=e[25];let B;e[26]!==r||e[27]!==s||e[28]!==i||e[29]!==_||e[30]!==V||e[31]!==d?(B=a(se,{"aria-invalid":i,className:"flex-1","data-testid":d,id:s,inputMode:"numeric",onChange:_,placeholder:V,value:r}),e[26]=r,e[27]=s,e[28]=i,e[29]=_,e[30]=V,e[31]=d,e[32]=B):B=e[32];let I;e[33]!==t?(I=t("TTL unit"),e[33]=t,e[34]=I):I=e[34];const A=`${d}-unit`;let D;e[35]===Symbol.for("react.memo_cache_sentinel")?(D=a(Me,{}),e[35]=D):D=e[35];let L;e[36]!==I||e[37]!==A?(L=a(Be,{"aria-label":I,className:"w-[7.5rem]","data-testid":A,children:D}),e[36]=I,e[37]=A,e[38]=L):L=e[38];let m;e[39]!==N?(m=we.map(C=>a(Oe,{value:C.key,children:N[C.key]},C.key)),e[39]=N,e[40]=m):m=e[40];let h;e[41]!==m?(h=a(De,{children:m}),e[41]=m,e[42]=h):h=e[42];let T;e[43]!==w||e[44]!==L||e[45]!==h||e[46]!==c?(T=E(Ae,{onValueChange:w,value:c,children:[L,h]}),e[43]=w,e[44]=L,e[45]=h,e[46]=c,e[47]=T):T=e[47];let O;e[48]!==B||e[49]!==T?(O=E("div",{className:"flex gap-2",children:[B,T]}),e[48]=B,e[49]=T,e[50]=O):O=e[50];let K;e[51]!==n||e[52]!==i||e[53]!==t||e[54]!==d?(K=i?a("p",{className:"text-xs text-destructive","data-testid":`${d}-invalid`,children:t("TTL must be at least 60 seconds.")}):n!==void 0&&a("p",{className:"text-xs text-muted-foreground",children:n}),e[51]=n,e[52]=i,e[53]=t,e[54]=d,e[55]=K):K=e[55];let M;return e[56]!==O||e[57]!==K||e[58]!==S?(M=E("div",{className:"mb-3 grid gap-1",children:[S,O,K]}),e[56]=O,e[57]=K,e[58]=S,e[59]=M):M=e[59],M},Fe=l=>{const e=re(36),{id:n,invalidTestId:s,onChange:i,testId:v,valid:d,value:t}=l,r=W();let p;e[0]!==t?(p=Ce(t),e[0]=t,e[1]=p):p=e[1];const c=p;let k;e[2]!==r?(k=r("Metadata (JSON)"),e[2]=r,e[3]=k):k=e[3];let x;e[4]!==n||e[5]!==k?(x=a(q,{className:"text-xs",htmlFor:n,children:k}),e[4]=n,e[5]=k,e[6]=x):x=e[6];const _=`${v}-format`,F=c===void 0;let w;e[7]!==c||e[8]!==i?(w=()=>{c!==void 0&&i(c)},e[7]=c,e[8]=i,e[9]=w):w=e[9];let o;e[10]!==r?(o=r("Format JSON"),e[10]=r,e[11]=o):o=e[11];let u;e[12]!==_||e[13]!==F||e[14]!==w||e[15]!==o?(u=a(z,{"data-testid":_,disabled:F,onClick:w,size:"sm",variant:"outline",children:o}),e[12]=_,e[13]=F,e[14]=w,e[15]=o,e[16]=u):u=e[16];let f;e[17]!==x||e[18]!==u?(f=E("div",{className:"flex items-center justify-between gap-2",children:[x,u]}),e[17]=x,e[18]=u,e[19]=f):f=e[19];const y=!d;let b;e[20]!==i?(b=V=>{i(V.target.value)},e[20]=i,e[21]=b):b=e[21];let N;e[22]!==n||e[23]!==y||e[24]!==b||e[25]!==v||e[26]!==t?(N=a(Ne,{"aria-invalid":y,className:"min-h-[4rem] font-mono text-xs","data-testid":v,id:n,onChange:b,value:t}),e[22]=n,e[23]=y,e[24]=b,e[25]=v,e[26]=t,e[27]=N):N=e[27];let g;e[28]!==s||e[29]!==r||e[30]!==d?(g=!d&&a("p",{className:"text-xs text-destructive","data-testid":s,children:r("Metadata must be valid JSON.")}),e[28]=s,e[29]=r,e[30]=d,e[31]=g):g=e[31];let S;return e[32]!==N||e[33]!==g||e[34]!==f?(S=E("div",{className:"mb-3 grid gap-1",children:[f,N,g]}),e[32]=N,e[33]=g,e[34]=f,e[35]=S):S=e[35],S},je={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Ue=(l,e)=>{switch(e.type){case"setField":return{...l,[e.field]:e.value};case"submitFailed":return{...l,busy:!1,error:e.error};case"submitStart":return{...l,busy:!0,error:null};default:return l}},Ze=l=>{const e=re(73),{namespace:n,onCancel:s,onCreated:i}=l,v=le(),d=W(),[t,r]=ne(Ue,je);let p;e[0]!==t.metadata?(p=Ee(t.metadata),e[0]=t.metadata,e[1]=p):p=e[1];const c=p;let k;e[2]!==t.ttl?(k=Te(t.ttl),e[2]=t.ttl,e[3]=k):k=e[3];const x=k;let _;e[4]!==c||e[5]!==t.busy||e[6]!==t.name||e[7]!==x?(_=t.name.trim()!==""&&c&&x&&!t.busy,e[4]=c,e[5]=t.busy,e[6]=t.name,e[7]=x,e[8]=_):_=e[8];const F=_;let w;e[9]!==F||e[10]!==v||e[11]!==n||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(w=()=>{F&&(r({type:"submitStart"}),J((async()=>{try{await v.putKvValue(Ke({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,n)),i()}catch(P){r({error:H(P),type:"submitFailed"})}})()))},e[9]=F,e[10]=v,e[11]=n,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=w):w=e[17];const o=w;let u;e[18]!==d?(u=d("Key name"),e[18]=d,e[19]=u):u=e[19];let f;e[20]!==u?(f=a(q,{className:"text-xs",htmlFor:"kv-create-name",children:u}),e[20]=u,e[21]=f):f=e[21];let y;e[22]===Symbol.for("react.memo_cache_sentinel")?(y=P=>{r({field:"name",type:"setField",value:P.target.value})},e[22]=y):y=e[22];let b;e[23]!==d?(b=d("Key name"),e[23]=d,e[24]=b):b=e[24];let N;e[25]!==t.name||e[26]!==b?(N=a(se,{autoFocus:!0,"data-testid":"kv-create-name",id:"kv-create-name",onChange:y,placeholder:b,value:t.name}),e[25]=t.name,e[26]=b,e[27]=N):N=e[27];let g;e[28]!==f||e[29]!==N?(g=E("div",{className:"grid gap-1",children:[f,N]}),e[28]=f,e[29]=N,e[30]=g):g=e[30];let S;e[31]!==d?(S=d("Value"),e[31]=d,e[32]=S):S=e[32];let V;e[33]!==S?(V=a(q,{className:"text-xs",htmlFor:"kv-create-value",children:S}),e[33]=S,e[34]=V):V=e[34];let B;e[35]===Symbol.for("react.memo_cache_sentinel")?(B=P=>{r({field:"value",type:"setField",value:P.target.value})},e[35]=B):B=e[35];let I;e[36]!==t.value?(I=a(Ne,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:B,value:t.value}),e[36]=t.value,e[37]=I):I=e[37];let A;e[38]!==V||e[39]!==I?(A=E("div",{className:"grid gap-1",children:[V,I]}),e[38]=V,e[39]=I,e[40]=A):A=e[40];const D=!x;let L;e[41]===Symbol.for("react.memo_cache_sentinel")?(L=P=>{r({field:"ttl",type:"setField",value:P})},e[41]=L):L=e[41];let m;e[42]!==D?(m=a(_e,{id:"kv-create-ttl",invalid:D,onChange:L,testId:"kv-create-ttl"}),e[42]=D,e[43]=m):m=e[43];let h;e[44]===Symbol.for("react.memo_cache_sentinel")?(h=P=>{r({field:"metadata",type:"setField",value:P})},e[44]=h):h=e[44];let T;e[45]!==c||e[46]!==t.metadata?(T=a(Fe,{id:"kv-create-metadata",invalidTestId:"kv-create-metadata-invalid",onChange:h,testId:"kv-create-metadata",valid:c,value:t.metadata}),e[45]=c,e[46]=t.metadata,e[47]=T):T=e[47];const O=!F;let K;e[48]!==t.busy||e[49]!==d?(K=t.busy?d("Creating…"):d("Create key"),e[48]=t.busy,e[49]=d,e[50]=K):K=e[50];let M;e[51]!==o||e[52]!==O||e[53]!==K?(M=a(z,{"data-testid":"kv-create-submit",disabled:O,onClick:o,children:K}),e[51]=o,e[52]=O,e[53]=K,e[54]=M):M=e[54];const C=t.busy;let R;e[55]!==d?(R=d("Cancel"),e[55]=d,e[56]=R):R=e[56];let $;e[57]!==s||e[58]!==t.busy||e[59]!==R?($=a(z,{"data-testid":"kv-create-cancel",disabled:C,onClick:s,variant:"outline",children:R}),e[57]=s,e[58]=t.busy,e[59]=R,e[60]=$):$=e[60];let j;e[61]!==M||e[62]!==$?(j=E("div",{className:"flex flex-wrap gap-2",children:[M,$]}),e[61]=M,e[62]=$,e[63]=j):j=e[63];let U;e[64]!==t.error?(U=t.error!==null&&a("p",{className:"text-sm text-destructive","data-testid":"kv-create-error",role:"alert",children:t.error}),e[64]=t.error,e[65]=U):U=e[65];let G;return e[66]!==g||e[67]!==A||e[68]!==m||e[69]!==T||e[70]!==j||e[71]!==U?(G=E("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[g,A,m,T,j,U]}),e[66]=g,e[67]=A,e[68]=m,e[69]=T,e[70]=j,e[71]=U,e[72]=G):G=e[72],G},Y=33,pe=600,qe=l=>{for(let e=l?.parentElement??null;e!==null;e=e.parentElement){const{overflowY:n}=getComputedStyle(e);if(n==="auto"||n==="scroll")return e}return document.scrollingElement},Ve=(l,e,n)=>{if(l===null||typeof ResizeObserver>"u")return;const s=new ResizeObserver(n),i=[];for(let t=l;t!==null&&t!==e;t=t.parentElement)i.push(t);const v=()=>{s.disconnect();for(const t of i)for(let r=t.previousElementSibling;r!==null;r=r.previousElementSibling)s.observe(r)};v();const d=typeof MutationObserver>"u"?void 0:new MutationObserver(()=>{v(),n()});for(const t of i)t.parentElement!==null&&d?.observe(t.parentElement,{childList:!0});return()=>{d?.disconnect(),s.disconnect()}},ae=l=>l.scrollElement===document.scrollingElement,Ge=(l,e,n)=>{const s=l.targetWindow;if(!s)return;const i=r=>{e(Math.max(0,-(n()?.getBoundingClientRect().top??0)),r)},v=()=>{i(!0)},d=()=>{i(!1)};i(!1),s.addEventListener("scroll",v,{passive:!0}),s.addEventListener("scrollend",d);const t=Ve(n(),null,d);return()=>{t?.(),s.removeEventListener("scroll",v),s.removeEventListener("scrollend",d)}},Ye=(l,e)=>{const n=l.targetWindow;if(!n)return;const s=()=>{e({height:n.innerHeight,width:n.innerWidth})};return s(),n.addEventListener("resize",s),()=>{n.removeEventListener("resize",s)}},Qe=({allSelected:l,bulkSelected:e,keys:n,onSelectKey:s,onToggleAll:i,onToggleBulk:v,selectedKey:d})=>{const t=W(),r=ie(null),p=ie(null),c=Re({count:n.length,estimateSize:()=>Y,getItemKey:o=>n[o]?.name??o,getScrollElement:()=>qe(r.current),initialRect:{height:pe,width:800},observeElementOffset:(o,u)=>{if(ae(o))return Ge(o,u,()=>r.current);const f=N=>{const g=o.scrollElement,S=r.current;u(g&&S?Math.max(0,g.getBoundingClientRect().top-S.getBoundingClientRect().top):0,N)},y=ze(o,(N,g)=>{f(g)}),b=Ve(r.current,o.scrollElement,()=>{f(!1)});return()=>{b?.(),y?.()}},observeElementRect:(o,u)=>ae(o)?Ye(o,u):Pe(o,u,pe),overscan:12}),k=c.getVirtualItems(),x=k[0]?.start??0,_=c.getTotalSize()-(k.at(-1)?.end??0),F=o=>{const u=o.key==="Tab"&&o.target instanceof Element?o.target.closest("[data-index]"):null;if(u===null)return;const f=o.shiftKey?-1:1,y=(p.current?.index??Number(u.dataset.index))+f,b=n[y];b===void 0||p.current===null&&u.parentElement?.querySelector(`[data-index="${String(y)}"]`)||(o.preventDefault(),p.current={index:y,name:b.name},ae(c)?c.targetWindow?.scrollBy(0,f*Y):c.scrollElement?.scrollBy(0,f*Y))};te(()=>{const o=p.current?.name,f=(o===void 0?void 0:[...r.current?.querySelectorAll("[data-key]")??[]].find(y=>y.dataset.key===o))?.querySelector('[data-testid^="kv-select-"]');f&&(p.current=null,f.focus())});let w=0;for(const o of n)w=Math.max(w,o.name.length);return E(be,{"data-testid":"kv-key-table",children:[a(ke,{children:E(ee,{children:[a(Q,{className:"w-10",children:a(fe,{"aria-label":t("Select all"),checked:l,"data-testid":"kv-select-all",onCheckedChange:i})}),a(Q,{children:t("Key")}),a(Q,{children:t("Expiration")})]})}),E(xe,{onKeyDown:F,ref:r,children:[x>0&&a("tr",{"aria-hidden":"true",style:{height:x}}),k.map(o=>{const u=n[o.index];return u===void 0?null:E(ee,{className:u.name===d?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-index":o.index,"data-key":u.name,"data-testid":`kv-key-row-${u.name}`,onClick:s,style:{height:Y},children:[a(X,{onClick:f=>{f.stopPropagation()},children:a(fe,{"aria-label":t("Select {name}",{name:u.name}),checked:e.has(u.name),"data-testid":`kv-select-${u.name}`,onCheckedChange:()=>{v(u.name)}})}),a(X,{className:"font-mono text-xs",style:{width:`${String(w)}ch`},children:u.name}),a(X,{className:"tabular-nums text-xs",children:He(u.expiration)})]},u.name)}),_>0&&a("tr",{"aria-hidden":"true",style:{height:_}})]})]})},Xe={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},et=(l,e)=>{switch(e.type){case"deleteStart":return{...l,busy:"deleting",writeError:null};case"editMetadata":return{...l,editedMetadata:e.value};case"editTtl":return{...l,editedTtl:e.value};case"editValue":return{...l,editedValue:e.value};case"loaded":return{...l,editedMetadata:e.metadata===null||e.metadata===void 0?"":JSON.stringify(e.metadata,null,2),editedValue:e.value??"",loading:!1,value:e.value};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"saveOk":return{...l,busy:"",value:l.editedValue};case"saveStart":return{...l,busy:"saving",writeError:null};case"writeFailed":return{...l,busy:"",writeError:e.error};default:return l}},tt=l=>{const e=re(67),{expiration:n,keyName:s,namespace:i,onDeleted:v}=l,d=le(),t=W(),[r,p]=ne(et,Xe);let c,k;e[0]!==d||e[1]!==s||e[2]!==i?(c=()=>{const C={cancelled:!1};return J((async()=>{try{const R=await d.getKvValue({key:s,namespace:i});C.cancelled||p({metadata:R.metadata,type:"loaded",value:R.value})}catch(R){const $=R;C.cancelled||p({error:H($),type:"loadFailed"})}})()),()=>{C.cancelled=!0}},k=[d,i,s],e[0]=d,e[1]=s,e[2]=i,e[3]=c,e[4]=k):(c=e[3],k=e[4]),te(c,k);let x;e[5]===Symbol.for("react.memo_cache_sentinel")?(x=C=>{p({type:"editValue",value:C.target.value})},e[5]=x):x=e[5];const _=x;let F;e[6]===Symbol.for("react.memo_cache_sentinel")?(F=C=>{p({type:"editMetadata",value:C})},e[6]=F):F=e[6];const w=F;let o;e[7]!==r.editedValue?(o=Ce(r.editedValue),e[7]=r.editedValue,e[8]=o):o=e[8];const u=o;let f;e[9]!==r.editedMetadata?(f=Ee(r.editedMetadata),e[9]=r.editedMetadata,e[10]=f):f=e[10];const y=f;let b;e[11]!==r.editedTtl?(b=Te(r.editedTtl),e[11]=r.editedTtl,e[12]=b):b=e[12];const N=b;let g;e[13]!==u?(g=()=>{u!==void 0&&p({type:"editValue",value:u})},e[13]=u,e[14]=g):g=e[14];const S=g;let V;e[15]!==d||e[16]!==n||e[17]!==s||e[18]!==y||e[19]!==i||e[20]!==r.editedMetadata||e[21]!==r.editedTtl||e[22]!==r.editedValue||e[23]!==t?(V=()=>{if(!y){p({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}p({type:"saveStart"}),J((async()=>{try{await d.putKvValue(Ke({metadata:r.editedMetadata,ttl:r.editedTtl,value:r.editedValue},s,i,n)),p({type:"saveOk"})}catch(C){p({error:H(C),type:"writeFailed"})}})())},e[15]=d,e[16]=n,e[17]=s,e[18]=y,e[19]=i,e[20]=r.editedMetadata,e[21]=r.editedTtl,e[22]=r.editedValue,e[23]=t,e[24]=V):V=e[24];const B=V;let I;e[25]!==d||e[26]!==s||e[27]!==i||e[28]!==v?(I=()=>{p({type:"deleteStart"}),J((async()=>{try{await d.deleteKvKey({key:s,namespace:i}),v(s)}catch(C){p({error:H(C),type:"writeFailed"})}})())},e[25]=d,e[26]=s,e[27]=i,e[28]=v,e[29]=I):I=e[29];const A=I;let D;e[30]!==s?(D=()=>{de(s)},e[30]=s,e[31]=D):D=e[31];let L;e[32]!==t?(L=t("Copy key"),e[32]=t,e[33]=L):L=e[33];let m;e[34]!==D||e[35]!==L?(m=a("div",{className:"mb-2 flex justify-end",children:a(z,{"data-testid":"kv-copy-key-btn",onClick:D,size:"sm",variant:"outline",children:L})}),e[34]=D,e[35]=L,e[36]=m):m=e[36];let h;e[37]!==r.loadError?(h=r.loadError!==null&&a("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:r.loadError}),e[37]=r.loadError,e[38]=h):h=e[38];let T;e[39]!==r.loading||e[40]!==t?(T=r.loading&&a("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=r.loading,e[40]=t,e[41]=T):T=e[41];let O;e[42]!==u||e[43]!==y||e[44]!==A||e[45]!==S||e[46]!==B||e[47]!==r.busy||e[48]!==r.editedMetadata||e[49]!==r.editedValue||e[50]!==r.loading||e[51]!==r.value||e[52]!==r.writeError||e[53]!==t||e[54]!==N?(O=!r.loading&&r.value!==null&&E(Se,{children:[E("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[a(q,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),u!==void 0&&a($e,{variant:"secondary",children:t("JSON")}),a("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Le(We(r.editedValue))})]}),a("textarea",{"aria-label":t("KV value"),className:"mb-2 min-h-[8rem] w-full rounded border border-border bg-muted/30 p-2 font-mono text-xs","data-testid":"kv-value-editor",id:"kv-value-editor",onChange:_,value:r.editedValue}),E("div",{className:"mb-3 flex flex-wrap gap-2",children:[a(z,{"data-testid":"kv-format-btn",disabled:u===void 0,onClick:S,size:"sm",variant:"outline",children:t("Format JSON")}),a(z,{"data-testid":"kv-copy-value-btn",onClick:()=>{de(r.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),a(_e,{helper:t("Leave blank to keep the current expiration."),id:"kv-ttl-input",invalid:!N,onChange:C=>{p({type:"editTtl",value:C})},testId:"kv-ttl-input"}),a(Fe,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:w,testId:"kv-metadata-editor",valid:y,value:r.editedMetadata}),E("div",{className:"flex flex-wrap gap-2",children:[a(z,{"data-testid":"kv-save-btn",disabled:r.busy!==""||!y||!N,onClick:B,children:r.busy==="saving"?t("Saving…"):t("Save")}),a(z,{"data-testid":"kv-delete-btn",disabled:r.busy!=="",onClick:A,variant:"destructive",children:r.busy==="deleting"?t("Deleting…"):t("Delete")})]}),r.writeError!==null&&a("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:r.writeError})]}),e[42]=u,e[43]=y,e[44]=A,e[45]=S,e[46]=B,e[47]=r.busy,e[48]=r.editedMetadata,e[49]=r.editedValue,e[50]=r.loading,e[51]=r.value,e[52]=r.writeError,e[53]=t,e[54]=N,e[55]=O):O=e[55];let K;e[56]!==r.loadError||e[57]!==r.loading||e[58]!==r.value||e[59]!==t?(K=!r.loading&&r.value===null&&r.loadError===null&&a("p",{className:"text-sm text-muted-foreground","data-testid":"kv-absent",children:t("Key is absent or has no value.")}),e[56]=r.loadError,e[57]=r.loading,e[58]=r.value,e[59]=t,e[60]=K):K=e[60];let M;return e[61]!==m||e[62]!==h||e[63]!==T||e[64]!==O||e[65]!==K?(M=E("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[m,h,T,O,K]}),e[61]=m,e[62]=h,e[63]=T,e[64]=O,e[65]=K,e[66]=M):M=e[66],M},he=100,lt={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},rt=(l,e)=>{switch(e.type){case"appendPage":return e.generation!==l.reloadNonce?l:{...l,cursor:e.cursor,keys:[...l.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...l,appliedPrefix:l.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,reloadNonce:l.reloadNonce+1,selectedKey:null};case"bulkDeleted":{const n=new Set(e.deleted);return{...l,bulk:l.bulk.filter(s=>!n.has(s)),bulkBusy:!1,bulkError:e.error,keys:l.keys===null?null:l.keys.filter(s=>!n.has(s.name)),selectedKey:l.selectedKey!==null&&n.has(l.selectedKey)?null:l.selectedKey}}case"bulkDeleteStart":return{...l,bulkBusy:!0,bulkError:null};case"firstPage":return{...l,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...l,bulk:l.bulk.filter(n=>n!==e.name),keys:l.keys===null?null:l.keys.filter(n=>n.name!==e.name),selectedKey:null};case"loadFailed":return e.generation!==void 0&&e.generation!==l.reloadNonce?l:{...l,loadError:e.error,loading:!1};case"loadStart":return{...l,loadError:null,loading:!0};case"prefixInput":return{...l,prefixInput:e.value};case"reload":return{...l,bulk:[],bulkError:null,reloadNonce:l.reloadNonce+1,selectedKey:null};case"selectKey":return{...l,selectedKey:e.name};case"toggleAllBulk":return{...l,bulk:e.names};case"toggleBulk":return{...l,bulk:l.bulk.includes(e.name)?l.bulk.filter(n=>n!==e.name):[...l.bulk,e.name]};default:return l}},at=({namespace:l})=>{const e=le(),n=W(),[s,i]=ne(rt,lt),{appliedPrefix:v,bulk:d,bulkBusy:t,bulkError:r,cursor:p,keys:c,listComplete:k,loadError:x,loading:_,prefixInput:F,reloadNonce:w,selectedKey:o}=s,[u,f]=Z(!1);te(()=>{const m={cancelled:!1};return J((async()=>{i({type:"loadStart"});try{const h=await e.listKvKeys({limit:he,namespace:l,prefix:v===""?void 0:v});m.cancelled||i({cursor:h.cursor??null,keys:h.keys,listComplete:h.listComplete,type:"firstPage"})}catch(h){m.cancelled||i({error:H(h),type:"loadFailed"})}})()),()=>{m.cancelled=!0}},[e,l,v,w]);const y=m=>{i({type:"prefixInput",value:m.target.value})},b=()=>{i({type:"applyFilter"})},N=m=>{i({name:m.currentTarget.dataset.key??null,type:"selectKey"})},g=()=>{if(p===null)return;i({type:"loadStart"});const m=w;J((async()=>{try{const h=await e.listKvKeys({cursor:p,limit:he,namespace:l,prefix:v===""?void 0:v});i({cursor:h.cursor??null,generation:m,keys:h.keys,listComplete:h.listComplete,type:"appendPage"})}catch(h){i({error:H(h),generation:m,type:"loadFailed"})}})())},S=m=>{i({name:m,type:"keyDeleted"})},V=m=>{i({name:m,type:"toggleBulk"})},B=m=>{i({names:m&&c!==null?c.map(h=>h.name):[],type:"toggleAllBulk"})},I=()=>{if(d.length===0)return;const m=[...d];i({type:"bulkDeleteStart"}),J((async()=>{const h=await Promise.allSettled(m.map(K=>e.deleteKvKey({key:K,namespace:l}))),T=m.filter((K,M)=>h[M]?.status==="fulfilled"),O=m.length-T.length;i({deleted:T,error:O>0?n("Failed to delete {count} keys.",{count:O}):null,type:"bulkDeleted"})})())},A=()=>{f(!1),i({type:"reload"})},D=c!==null&&c.length>0&&d.length===c.length,L=new Set(d);return E(Se,{children:[E("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[E("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[a(se,{"aria-label":n("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:y,placeholder:n("Filter by prefix…"),value:F}),a(z,{"data-testid":"kv-filter-btn",disabled:_,onClick:b,children:n("Filter")}),a(z,{"data-testid":"kv-new-key-btn",onClick:()=>{f(m=>!m)},variant:"outline",children:n("New key")}),d.length>0&&a(z,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:I,variant:"destructive",children:t?n("Deleting…"):n("Delete {count}",{count:d.length})})]}),r!==null&&a("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:r}),x!==null&&a("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:x}),c!==null&&c.length===0&&!_&&a("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:n("No keys.")}),c!==null&&c.length>0&&a(ye,{className:"overflow-hidden py-0",children:a(ge,{className:"px-0",children:a(Qe,{allSelected:D,bulkSelected:L,keys:c,onSelectKey:N,onToggleAll:B,onToggleBulk:V,selectedKey:o})})}),!k&&p!==null&&a("div",{className:"mt-2",children:a(z,{"data-testid":"kv-load-more",disabled:_,onClick:g,variant:"outline",children:n(_?"Loading…":"Load more")})})]}),a(oe,{onOpenChange:m=>{m||f(!1)},open:u,children:E(ce,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-create-sheet",side:"right",children:[a(ue,{children:a(me,{children:n("New key")})}),a(Ze,{namespace:l,onCancel:()=>{f(!1)},onCreated:A})]})}),a(oe,{onOpenChange:m=>{m||i({name:null,type:"selectKey"})},open:o!==null,children:E(ce,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-editor-sheet",side:"right",children:[a(ue,{children:a(me,{className:"truncate font-mono text-xs",children:o})}),o!==null&&a(tt,{expiration:c?.find(m=>m.name===o)?.expiration,keyName:o,namespace:l,onDeleted:S},`${l}:${o}`)]})})]})},Et=({loadNamespaces:l}={})=>{const e=le(),n=W(),[s,i]=Z(null),[v,d]=Z(null),[t,r]=Z(null);te(()=>{const c={cancelled:!1};return J((async()=>{try{const k=await(l??(()=>e.listKvNamespaces()))();c.cancelled||(i(k),d(null),r(x=>x??k[0]?.binding??null))}catch(k){c.cancelled||(i(null),d(H(k)))}})()),()=>{c.cancelled=!0}},[e,l]);const p=c=>{r(c.currentTarget.dataset.ns??null)};return E("div",{className:"flex flex-col gap-4","data-testid":"lunora-kv-browser",children:[v!==null&&a("p",{className:"text-sm text-destructive","data-testid":"kv-ns-error",role:"alert",children:v}),s!==null&&s.length===0&&a(Ie,{description:n("Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed."),icon:a("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:a("path",{d:"M5 5h14v4H5V5Zm0 5h14v4H5v-4Zm0 5h14v4H5v-4Z"})}),testId:"kv-empty",title:n("No KV namespaces.")}),s!==null&&s.length>0&&a(ye,{className:"overflow-hidden py-0",children:a(ge,{className:"px-0",children:E(be,{"data-testid":"kv-namespace-table",children:[a(ke,{children:a(ee,{children:a(Q,{children:n("Namespace")})})}),a(xe,{children:s.map(c=>a(ee,{className:c.binding===t?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-ns":c.binding,"data-testid":`kv-ns-row-${c.binding}`,onClick:p,children:a(X,{className:"font-mono text-xs",children:c.binding})},c.binding))})]})})}),t!==null&&a(at,{namespace:t},t)]})};export{Et as KvBrowser};
|
|
1
|
+
import{useState as Z,useReducer as ne,useRef as ie,useEffect as te}from"react";import{C as ye,a as ge}from"../packem_shared/card-By2O8ULa.mjs";import{E as Ie}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as be,a as ke,b as ee,c as Q,d as xe,e as X}from"../packem_shared/table-D0SBiDu-.mjs";import{u as le}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as W}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{f as J,b as H,n as Le,g as de}from"../packem_shared/internal-hIuTpSbx.mjs";import{B as z}from"../packem_shared/button-q0UYSmrn.mjs";import{I as se}from"../packem_shared/input-CXhxesPC.mjs";import{b as oe,c as ce,d as ue,e as me}from"../packem_shared/studio-gZfpz1wC.mjs";import{c as re}from"react/compiler-runtime";import{L as q}from"../packem_shared/label-DKFzyHq6.mjs";import{T as Ne}from"../packem_shared/textarea--40GKAyz.mjs";import{c as Oe,S as Me,a as Be,b as De,d as Ae}from"../packem_shared/select-DPyS18Vy.mjs";import{jsx as a,jsxs as E,Fragment as Se}from"react/jsx-runtime";import{useVirtualizer as Re,observeElementOffset as ze}from"@tanstack/react-virtual";import{C as fe}from"../packem_shared/checkbox-CnS9cyCz.mjs";import{f as Pe}from"../packem_shared/virtual-rect-D_j7aLxX.mjs";import{B as $e}from"../packem_shared/badge-r_5B4LHP.mjs";const Je=l=>{const e=l.trim();if(e==="")return;const n=Number(e);return Number.isFinite(n)&&n>0?Math.floor(n):void 0},He=l=>l===void 0?"—":new Date(l*1e3).toISOString(),We=l=>new TextEncoder().encode(l).length,Ce=l=>{if(l.trim()!=="")try{return JSON.stringify(JSON.parse(l),void 0,2)}catch{return}},Ee=l=>{if(l.trim()==="")return!0;try{return JSON.parse(l),!0}catch{return!1}},we=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ve=(l,e)=>{const n=l.trim();if(n==="")return"";const s=Number(n),i=we.find(v=>v.key===e)?.seconds??1;return Number.isFinite(s)&&s>0?String(Math.round(s*i)):n},Te=l=>{const e=l.trim();if(e==="")return!0;const n=Number(e);return Number.isInteger(n)&&n>=60},Ke=(l,e,n,s)=>{const i=Je(l.ttl);return{expiration:i===void 0?s:void 0,expirationTtl:i,key:e,metadata:l.metadata.trim()===""?void 0:JSON.parse(l.metadata),namespace:n,value:l.value}},_e=l=>{const e=re(60),{helper:n,id:s,invalid:i,onChange:v,testId:d}=l,t=W(),[r,p]=Z(""),[c,k]=Z("seconds");let x;e[0]!==v||e[1]!==c?(x=C=>{p(C.target.value),v(ve(C.target.value,c))},e[0]=v,e[1]=c,e[2]=x):x=e[2];const _=x;let F;e[3]!==r||e[4]!==v?(F=C=>{C!==null&&(k(C),v(ve(r,C)))},e[3]=r,e[4]=v,e[5]=F):F=e[5];const w=F;let o;e[6]!==t?(o=t("days"),e[6]=t,e[7]=o):o=e[7];let u;e[8]!==t?(u=t("hours"),e[8]=t,e[9]=u):u=e[9];let f;e[10]!==t?(f=t("minutes"),e[10]=t,e[11]=f):f=e[11];let y;e[12]!==t?(y=t("seconds"),e[12]=t,e[13]=y):y=e[13];let b;e[14]!==o||e[15]!==u||e[16]!==f||e[17]!==y?(b={days:o,hours:u,minutes:f,seconds:y},e[14]=o,e[15]=u,e[16]=f,e[17]=y,e[18]=b):b=e[18];const N=b;let g;e[19]!==t?(g=t("Expires after"),e[19]=t,e[20]=g):g=e[20];let S;e[21]!==s||e[22]!==g?(S=a(q,{className:"text-xs",htmlFor:s,children:g}),e[21]=s,e[22]=g,e[23]=S):S=e[23];let V;e[24]!==t?(V=t("No expiration"),e[24]=t,e[25]=V):V=e[25];let B;e[26]!==r||e[27]!==s||e[28]!==i||e[29]!==_||e[30]!==V||e[31]!==d?(B=a(se,{"aria-invalid":i,className:"flex-1","data-testid":d,id:s,inputMode:"numeric",onChange:_,placeholder:V,value:r}),e[26]=r,e[27]=s,e[28]=i,e[29]=_,e[30]=V,e[31]=d,e[32]=B):B=e[32];let I;e[33]!==t?(I=t("TTL unit"),e[33]=t,e[34]=I):I=e[34];const A=`${d}-unit`;let D;e[35]===Symbol.for("react.memo_cache_sentinel")?(D=a(Me,{}),e[35]=D):D=e[35];let L;e[36]!==I||e[37]!==A?(L=a(Be,{"aria-label":I,className:"w-[7.5rem]","data-testid":A,children:D}),e[36]=I,e[37]=A,e[38]=L):L=e[38];let m;e[39]!==N?(m=we.map(C=>a(Oe,{value:C.key,children:N[C.key]},C.key)),e[39]=N,e[40]=m):m=e[40];let h;e[41]!==m?(h=a(De,{children:m}),e[41]=m,e[42]=h):h=e[42];let T;e[43]!==w||e[44]!==L||e[45]!==h||e[46]!==c?(T=E(Ae,{onValueChange:w,value:c,children:[L,h]}),e[43]=w,e[44]=L,e[45]=h,e[46]=c,e[47]=T):T=e[47];let O;e[48]!==B||e[49]!==T?(O=E("div",{className:"flex gap-2",children:[B,T]}),e[48]=B,e[49]=T,e[50]=O):O=e[50];let K;e[51]!==n||e[52]!==i||e[53]!==t||e[54]!==d?(K=i?a("p",{className:"text-xs text-destructive","data-testid":`${d}-invalid`,children:t("TTL must be at least 60 seconds.")}):n!==void 0&&a("p",{className:"text-xs text-muted-foreground",children:n}),e[51]=n,e[52]=i,e[53]=t,e[54]=d,e[55]=K):K=e[55];let M;return e[56]!==O||e[57]!==K||e[58]!==S?(M=E("div",{className:"mb-3 grid gap-1",children:[S,O,K]}),e[56]=O,e[57]=K,e[58]=S,e[59]=M):M=e[59],M},Fe=l=>{const e=re(36),{id:n,invalidTestId:s,onChange:i,testId:v,valid:d,value:t}=l,r=W();let p;e[0]!==t?(p=Ce(t),e[0]=t,e[1]=p):p=e[1];const c=p;let k;e[2]!==r?(k=r("Metadata (JSON)"),e[2]=r,e[3]=k):k=e[3];let x;e[4]!==n||e[5]!==k?(x=a(q,{className:"text-xs",htmlFor:n,children:k}),e[4]=n,e[5]=k,e[6]=x):x=e[6];const _=`${v}-format`,F=c===void 0;let w;e[7]!==c||e[8]!==i?(w=()=>{c!==void 0&&i(c)},e[7]=c,e[8]=i,e[9]=w):w=e[9];let o;e[10]!==r?(o=r("Format JSON"),e[10]=r,e[11]=o):o=e[11];let u;e[12]!==_||e[13]!==F||e[14]!==w||e[15]!==o?(u=a(z,{"data-testid":_,disabled:F,onClick:w,size:"sm",variant:"outline",children:o}),e[12]=_,e[13]=F,e[14]=w,e[15]=o,e[16]=u):u=e[16];let f;e[17]!==x||e[18]!==u?(f=E("div",{className:"flex items-center justify-between gap-2",children:[x,u]}),e[17]=x,e[18]=u,e[19]=f):f=e[19];const y=!d;let b;e[20]!==i?(b=V=>{i(V.target.value)},e[20]=i,e[21]=b):b=e[21];let N;e[22]!==n||e[23]!==y||e[24]!==b||e[25]!==v||e[26]!==t?(N=a(Ne,{"aria-invalid":y,className:"min-h-[4rem] font-mono text-xs","data-testid":v,id:n,onChange:b,value:t}),e[22]=n,e[23]=y,e[24]=b,e[25]=v,e[26]=t,e[27]=N):N=e[27];let g;e[28]!==s||e[29]!==r||e[30]!==d?(g=!d&&a("p",{className:"text-xs text-destructive","data-testid":s,children:r("Metadata must be valid JSON.")}),e[28]=s,e[29]=r,e[30]=d,e[31]=g):g=e[31];let S;return e[32]!==N||e[33]!==g||e[34]!==f?(S=E("div",{className:"mb-3 grid gap-1",children:[f,N,g]}),e[32]=N,e[33]=g,e[34]=f,e[35]=S):S=e[35],S},je={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Ue=(l,e)=>{switch(e.type){case"setField":return{...l,[e.field]:e.value};case"submitFailed":return{...l,busy:!1,error:e.error};case"submitStart":return{...l,busy:!0,error:null};default:return l}},Ze=l=>{const e=re(73),{namespace:n,onCancel:s,onCreated:i}=l,v=le(),d=W(),[t,r]=ne(Ue,je);let p;e[0]!==t.metadata?(p=Ee(t.metadata),e[0]=t.metadata,e[1]=p):p=e[1];const c=p;let k;e[2]!==t.ttl?(k=Te(t.ttl),e[2]=t.ttl,e[3]=k):k=e[3];const x=k;let _;e[4]!==c||e[5]!==t.busy||e[6]!==t.name||e[7]!==x?(_=t.name.trim()!==""&&c&&x&&!t.busy,e[4]=c,e[5]=t.busy,e[6]=t.name,e[7]=x,e[8]=_):_=e[8];const F=_;let w;e[9]!==F||e[10]!==v||e[11]!==n||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(w=()=>{F&&(r({type:"submitStart"}),J((async()=>{try{await v.putKvValue(Ke({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,n)),i()}catch(P){r({error:H(P),type:"submitFailed"})}})()))},e[9]=F,e[10]=v,e[11]=n,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=w):w=e[17];const o=w;let u;e[18]!==d?(u=d("Key name"),e[18]=d,e[19]=u):u=e[19];let f;e[20]!==u?(f=a(q,{className:"text-xs",htmlFor:"kv-create-name",children:u}),e[20]=u,e[21]=f):f=e[21];let y;e[22]===Symbol.for("react.memo_cache_sentinel")?(y=P=>{r({field:"name",type:"setField",value:P.target.value})},e[22]=y):y=e[22];let b;e[23]!==d?(b=d("Key name"),e[23]=d,e[24]=b):b=e[24];let N;e[25]!==t.name||e[26]!==b?(N=a(se,{autoFocus:!0,"data-testid":"kv-create-name",id:"kv-create-name",onChange:y,placeholder:b,value:t.name}),e[25]=t.name,e[26]=b,e[27]=N):N=e[27];let g;e[28]!==f||e[29]!==N?(g=E("div",{className:"grid gap-1",children:[f,N]}),e[28]=f,e[29]=N,e[30]=g):g=e[30];let S;e[31]!==d?(S=d("Value"),e[31]=d,e[32]=S):S=e[32];let V;e[33]!==S?(V=a(q,{className:"text-xs",htmlFor:"kv-create-value",children:S}),e[33]=S,e[34]=V):V=e[34];let B;e[35]===Symbol.for("react.memo_cache_sentinel")?(B=P=>{r({field:"value",type:"setField",value:P.target.value})},e[35]=B):B=e[35];let I;e[36]!==t.value?(I=a(Ne,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:B,value:t.value}),e[36]=t.value,e[37]=I):I=e[37];let A;e[38]!==V||e[39]!==I?(A=E("div",{className:"grid gap-1",children:[V,I]}),e[38]=V,e[39]=I,e[40]=A):A=e[40];const D=!x;let L;e[41]===Symbol.for("react.memo_cache_sentinel")?(L=P=>{r({field:"ttl",type:"setField",value:P})},e[41]=L):L=e[41];let m;e[42]!==D?(m=a(_e,{id:"kv-create-ttl",invalid:D,onChange:L,testId:"kv-create-ttl"}),e[42]=D,e[43]=m):m=e[43];let h;e[44]===Symbol.for("react.memo_cache_sentinel")?(h=P=>{r({field:"metadata",type:"setField",value:P})},e[44]=h):h=e[44];let T;e[45]!==c||e[46]!==t.metadata?(T=a(Fe,{id:"kv-create-metadata",invalidTestId:"kv-create-metadata-invalid",onChange:h,testId:"kv-create-metadata",valid:c,value:t.metadata}),e[45]=c,e[46]=t.metadata,e[47]=T):T=e[47];const O=!F;let K;e[48]!==t.busy||e[49]!==d?(K=t.busy?d("Creating…"):d("Create key"),e[48]=t.busy,e[49]=d,e[50]=K):K=e[50];let M;e[51]!==o||e[52]!==O||e[53]!==K?(M=a(z,{"data-testid":"kv-create-submit",disabled:O,onClick:o,children:K}),e[51]=o,e[52]=O,e[53]=K,e[54]=M):M=e[54];const C=t.busy;let R;e[55]!==d?(R=d("Cancel"),e[55]=d,e[56]=R):R=e[56];let $;e[57]!==s||e[58]!==t.busy||e[59]!==R?($=a(z,{"data-testid":"kv-create-cancel",disabled:C,onClick:s,variant:"outline",children:R}),e[57]=s,e[58]=t.busy,e[59]=R,e[60]=$):$=e[60];let j;e[61]!==M||e[62]!==$?(j=E("div",{className:"flex flex-wrap gap-2",children:[M,$]}),e[61]=M,e[62]=$,e[63]=j):j=e[63];let U;e[64]!==t.error?(U=t.error!==null&&a("p",{className:"text-sm text-destructive","data-testid":"kv-create-error",role:"alert",children:t.error}),e[64]=t.error,e[65]=U):U=e[65];let G;return e[66]!==g||e[67]!==A||e[68]!==m||e[69]!==T||e[70]!==j||e[71]!==U?(G=E("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[g,A,m,T,j,U]}),e[66]=g,e[67]=A,e[68]=m,e[69]=T,e[70]=j,e[71]=U,e[72]=G):G=e[72],G},Y=33,pe=600,qe=l=>{for(let e=l?.parentElement??null;e!==null;e=e.parentElement){const{overflowY:n}=getComputedStyle(e);if(n==="auto"||n==="scroll")return e}return document.scrollingElement},Ve=(l,e,n)=>{if(l===null||typeof ResizeObserver>"u")return;const s=new ResizeObserver(n),i=[];for(let t=l;t!==null&&t!==e;t=t.parentElement)i.push(t);const v=()=>{s.disconnect();for(const t of i)for(let r=t.previousElementSibling;r!==null;r=r.previousElementSibling)s.observe(r)};v();const d=typeof MutationObserver>"u"?void 0:new MutationObserver(()=>{v(),n()});for(const t of i)t.parentElement!==null&&d?.observe(t.parentElement,{childList:!0});return()=>{d?.disconnect(),s.disconnect()}},ae=l=>l.scrollElement===document.scrollingElement,Ge=(l,e,n)=>{const s=l.targetWindow;if(!s)return;const i=r=>{e(Math.max(0,-(n()?.getBoundingClientRect().top??0)),r)},v=()=>{i(!0)},d=()=>{i(!1)};i(!1),s.addEventListener("scroll",v,{passive:!0}),s.addEventListener("scrollend",d);const t=Ve(n(),null,d);return()=>{t?.(),s.removeEventListener("scroll",v),s.removeEventListener("scrollend",d)}},Ye=(l,e)=>{const n=l.targetWindow;if(!n)return;const s=()=>{e({height:n.innerHeight,width:n.innerWidth})};return s(),n.addEventListener("resize",s),()=>{n.removeEventListener("resize",s)}},Qe=({allSelected:l,bulkSelected:e,keys:n,onSelectKey:s,onToggleAll:i,onToggleBulk:v,selectedKey:d})=>{const t=W(),r=ie(null),p=ie(null),c=Re({count:n.length,estimateSize:()=>Y,getItemKey:o=>n[o]?.name??o,getScrollElement:()=>qe(r.current),initialRect:{height:pe,width:800},observeElementOffset:(o,u)=>{if(ae(o))return Ge(o,u,()=>r.current);const f=N=>{const g=o.scrollElement,S=r.current;u(g&&S?Math.max(0,g.getBoundingClientRect().top-S.getBoundingClientRect().top):0,N)},y=ze(o,(N,g)=>{f(g)}),b=Ve(r.current,o.scrollElement,()=>{f(!1)});return()=>{b?.(),y?.()}},observeElementRect:(o,u)=>ae(o)?Ye(o,u):Pe(o,u,pe),overscan:12}),k=c.getVirtualItems(),x=k[0]?.start??0,_=c.getTotalSize()-(k.at(-1)?.end??0),F=o=>{const u=o.key==="Tab"&&o.target instanceof Element?o.target.closest("[data-index]"):null;if(u===null)return;const f=o.shiftKey?-1:1,y=(p.current?.index??Number(u.dataset.index))+f,b=n[y];b===void 0||p.current===null&&u.parentElement?.querySelector(`[data-index="${String(y)}"]`)||(o.preventDefault(),p.current={index:y,name:b.name},ae(c)?c.targetWindow?.scrollBy(0,f*Y):c.scrollElement?.scrollBy(0,f*Y))};te(()=>{const o=p.current?.name,f=(o===void 0?void 0:[...r.current?.querySelectorAll("[data-key]")??[]].find(y=>y.dataset.key===o))?.querySelector('[data-testid^="kv-select-"]');f&&(p.current=null,f.focus())});let w=0;for(const o of n)w=Math.max(w,o.name.length);return E(be,{"data-testid":"kv-key-table",children:[a(ke,{children:E(ee,{children:[a(Q,{className:"w-10",children:a(fe,{"aria-label":t("Select all"),checked:l,"data-testid":"kv-select-all",onCheckedChange:i})}),a(Q,{children:t("Key")}),a(Q,{children:t("Expiration")})]})}),E(xe,{onKeyDown:F,ref:r,children:[x>0&&a("tr",{"aria-hidden":"true",style:{height:x}}),k.map(o=>{const u=n[o.index];return u===void 0?null:E(ee,{className:u.name===d?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-index":o.index,"data-key":u.name,"data-testid":`kv-key-row-${u.name}`,onClick:s,style:{height:Y},children:[a(X,{onClick:f=>{f.stopPropagation()},children:a(fe,{"aria-label":t("Select {name}",{name:u.name}),checked:e.has(u.name),"data-testid":`kv-select-${u.name}`,onCheckedChange:()=>{v(u.name)}})}),a(X,{className:"font-mono text-xs",style:{width:`${String(w)}ch`},children:u.name}),a(X,{className:"tabular-nums text-xs",children:He(u.expiration)})]},u.name)}),_>0&&a("tr",{"aria-hidden":"true",style:{height:_}})]})]})},Xe={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},et=(l,e)=>{switch(e.type){case"deleteStart":return{...l,busy:"deleting",writeError:null};case"editMetadata":return{...l,editedMetadata:e.value};case"editTtl":return{...l,editedTtl:e.value};case"editValue":return{...l,editedValue:e.value};case"loaded":return{...l,editedMetadata:e.metadata===null||e.metadata===void 0?"":JSON.stringify(e.metadata,null,2),editedValue:e.value??"",loading:!1,value:e.value};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"saveOk":return{...l,busy:"",value:l.editedValue};case"saveStart":return{...l,busy:"saving",writeError:null};case"writeFailed":return{...l,busy:"",writeError:e.error};default:return l}},tt=l=>{const e=re(67),{expiration:n,keyName:s,namespace:i,onDeleted:v}=l,d=le(),t=W(),[r,p]=ne(et,Xe);let c,k;e[0]!==d||e[1]!==s||e[2]!==i?(c=()=>{const C={cancelled:!1};return J((async()=>{try{const R=await d.getKvValue({key:s,namespace:i});C.cancelled||p({metadata:R.metadata,type:"loaded",value:R.value})}catch(R){const $=R;C.cancelled||p({error:H($),type:"loadFailed"})}})()),()=>{C.cancelled=!0}},k=[d,i,s],e[0]=d,e[1]=s,e[2]=i,e[3]=c,e[4]=k):(c=e[3],k=e[4]),te(c,k);let x;e[5]===Symbol.for("react.memo_cache_sentinel")?(x=C=>{p({type:"editValue",value:C.target.value})},e[5]=x):x=e[5];const _=x;let F;e[6]===Symbol.for("react.memo_cache_sentinel")?(F=C=>{p({type:"editMetadata",value:C})},e[6]=F):F=e[6];const w=F;let o;e[7]!==r.editedValue?(o=Ce(r.editedValue),e[7]=r.editedValue,e[8]=o):o=e[8];const u=o;let f;e[9]!==r.editedMetadata?(f=Ee(r.editedMetadata),e[9]=r.editedMetadata,e[10]=f):f=e[10];const y=f;let b;e[11]!==r.editedTtl?(b=Te(r.editedTtl),e[11]=r.editedTtl,e[12]=b):b=e[12];const N=b;let g;e[13]!==u?(g=()=>{u!==void 0&&p({type:"editValue",value:u})},e[13]=u,e[14]=g):g=e[14];const S=g;let V;e[15]!==d||e[16]!==n||e[17]!==s||e[18]!==y||e[19]!==i||e[20]!==r.editedMetadata||e[21]!==r.editedTtl||e[22]!==r.editedValue||e[23]!==t?(V=()=>{if(!y){p({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}p({type:"saveStart"}),J((async()=>{try{await d.putKvValue(Ke({metadata:r.editedMetadata,ttl:r.editedTtl,value:r.editedValue},s,i,n)),p({type:"saveOk"})}catch(C){p({error:H(C),type:"writeFailed"})}})())},e[15]=d,e[16]=n,e[17]=s,e[18]=y,e[19]=i,e[20]=r.editedMetadata,e[21]=r.editedTtl,e[22]=r.editedValue,e[23]=t,e[24]=V):V=e[24];const B=V;let I;e[25]!==d||e[26]!==s||e[27]!==i||e[28]!==v?(I=()=>{p({type:"deleteStart"}),J((async()=>{try{await d.deleteKvKey({key:s,namespace:i}),v(s)}catch(C){p({error:H(C),type:"writeFailed"})}})())},e[25]=d,e[26]=s,e[27]=i,e[28]=v,e[29]=I):I=e[29];const A=I;let D;e[30]!==s?(D=()=>{de(s)},e[30]=s,e[31]=D):D=e[31];let L;e[32]!==t?(L=t("Copy key"),e[32]=t,e[33]=L):L=e[33];let m;e[34]!==D||e[35]!==L?(m=a("div",{className:"mb-2 flex justify-end",children:a(z,{"data-testid":"kv-copy-key-btn",onClick:D,size:"sm",variant:"outline",children:L})}),e[34]=D,e[35]=L,e[36]=m):m=e[36];let h;e[37]!==r.loadError?(h=r.loadError!==null&&a("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:r.loadError}),e[37]=r.loadError,e[38]=h):h=e[38];let T;e[39]!==r.loading||e[40]!==t?(T=r.loading&&a("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=r.loading,e[40]=t,e[41]=T):T=e[41];let O;e[42]!==u||e[43]!==y||e[44]!==A||e[45]!==S||e[46]!==B||e[47]!==r.busy||e[48]!==r.editedMetadata||e[49]!==r.editedValue||e[50]!==r.loading||e[51]!==r.value||e[52]!==r.writeError||e[53]!==t||e[54]!==N?(O=!r.loading&&r.value!==null&&E(Se,{children:[E("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[a(q,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),u!==void 0&&a($e,{variant:"secondary",children:t("JSON")}),a("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Le(We(r.editedValue))})]}),a("textarea",{"aria-label":t("KV value"),className:"mb-2 min-h-[8rem] w-full rounded border border-border bg-muted/30 p-2 font-mono text-xs","data-testid":"kv-value-editor",id:"kv-value-editor",onChange:_,value:r.editedValue}),E("div",{className:"mb-3 flex flex-wrap gap-2",children:[a(z,{"data-testid":"kv-format-btn",disabled:u===void 0,onClick:S,size:"sm",variant:"outline",children:t("Format JSON")}),a(z,{"data-testid":"kv-copy-value-btn",onClick:()=>{de(r.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),a(_e,{helper:t("Leave blank to keep the current expiration."),id:"kv-ttl-input",invalid:!N,onChange:C=>{p({type:"editTtl",value:C})},testId:"kv-ttl-input"}),a(Fe,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:w,testId:"kv-metadata-editor",valid:y,value:r.editedMetadata}),E("div",{className:"flex flex-wrap gap-2",children:[a(z,{"data-testid":"kv-save-btn",disabled:r.busy!==""||!y||!N,onClick:B,children:r.busy==="saving"?t("Saving…"):t("Save")}),a(z,{"data-testid":"kv-delete-btn",disabled:r.busy!=="",onClick:A,variant:"destructive",children:r.busy==="deleting"?t("Deleting…"):t("Delete")})]}),r.writeError!==null&&a("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:r.writeError})]}),e[42]=u,e[43]=y,e[44]=A,e[45]=S,e[46]=B,e[47]=r.busy,e[48]=r.editedMetadata,e[49]=r.editedValue,e[50]=r.loading,e[51]=r.value,e[52]=r.writeError,e[53]=t,e[54]=N,e[55]=O):O=e[55];let K;e[56]!==r.loadError||e[57]!==r.loading||e[58]!==r.value||e[59]!==t?(K=!r.loading&&r.value===null&&r.loadError===null&&a("p",{className:"text-sm text-muted-foreground","data-testid":"kv-absent",children:t("Key is absent or has no value.")}),e[56]=r.loadError,e[57]=r.loading,e[58]=r.value,e[59]=t,e[60]=K):K=e[60];let M;return e[61]!==m||e[62]!==h||e[63]!==T||e[64]!==O||e[65]!==K?(M=E("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[m,h,T,O,K]}),e[61]=m,e[62]=h,e[63]=T,e[64]=O,e[65]=K,e[66]=M):M=e[66],M},he=100,lt={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},rt=(l,e)=>{switch(e.type){case"appendPage":return e.generation!==l.reloadNonce?l:{...l,cursor:e.cursor,keys:[...l.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...l,appliedPrefix:l.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,reloadNonce:l.reloadNonce+1,selectedKey:null};case"bulkDeleted":{const n=new Set(e.deleted);return{...l,bulk:l.bulk.filter(s=>!n.has(s)),bulkBusy:!1,bulkError:e.error,keys:l.keys===null?null:l.keys.filter(s=>!n.has(s.name)),selectedKey:l.selectedKey!==null&&n.has(l.selectedKey)?null:l.selectedKey}}case"bulkDeleteStart":return{...l,bulkBusy:!0,bulkError:null};case"firstPage":return{...l,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...l,bulk:l.bulk.filter(n=>n!==e.name),keys:l.keys===null?null:l.keys.filter(n=>n.name!==e.name),selectedKey:null};case"loadFailed":return e.generation!==void 0&&e.generation!==l.reloadNonce?l:{...l,loadError:e.error,loading:!1};case"loadStart":return{...l,loadError:null,loading:!0};case"prefixInput":return{...l,prefixInput:e.value};case"reload":return{...l,bulk:[],bulkError:null,reloadNonce:l.reloadNonce+1,selectedKey:null};case"selectKey":return{...l,selectedKey:e.name};case"toggleAllBulk":return{...l,bulk:e.names};case"toggleBulk":return{...l,bulk:l.bulk.includes(e.name)?l.bulk.filter(n=>n!==e.name):[...l.bulk,e.name]};default:return l}},at=({namespace:l})=>{const e=le(),n=W(),[s,i]=ne(rt,lt),{appliedPrefix:v,bulk:d,bulkBusy:t,bulkError:r,cursor:p,keys:c,listComplete:k,loadError:x,loading:_,prefixInput:F,reloadNonce:w,selectedKey:o}=s,[u,f]=Z(!1);te(()=>{const m={cancelled:!1};return J((async()=>{i({type:"loadStart"});try{const h=await e.listKvKeys({limit:he,namespace:l,prefix:v===""?void 0:v});m.cancelled||i({cursor:h.cursor??null,keys:h.keys,listComplete:h.listComplete,type:"firstPage"})}catch(h){m.cancelled||i({error:H(h),type:"loadFailed"})}})()),()=>{m.cancelled=!0}},[e,l,v,w]);const y=m=>{i({type:"prefixInput",value:m.target.value})},b=()=>{i({type:"applyFilter"})},N=m=>{i({name:m.currentTarget.dataset.key??null,type:"selectKey"})},g=()=>{if(p===null)return;i({type:"loadStart"});const m=w;J((async()=>{try{const h=await e.listKvKeys({cursor:p,limit:he,namespace:l,prefix:v===""?void 0:v});i({cursor:h.cursor??null,generation:m,keys:h.keys,listComplete:h.listComplete,type:"appendPage"})}catch(h){i({error:H(h),generation:m,type:"loadFailed"})}})())},S=m=>{i({name:m,type:"keyDeleted"})},V=m=>{i({name:m,type:"toggleBulk"})},B=m=>{i({names:m&&c!==null?c.map(h=>h.name):[],type:"toggleAllBulk"})},I=()=>{if(d.length===0)return;const m=[...d];i({type:"bulkDeleteStart"}),J((async()=>{const h=await Promise.allSettled(m.map(K=>e.deleteKvKey({key:K,namespace:l}))),T=m.filter((K,M)=>h[M]?.status==="fulfilled"),O=m.length-T.length;i({deleted:T,error:O>0?n("Failed to delete {count} keys.",{count:O}):null,type:"bulkDeleted"})})())},A=()=>{f(!1),i({type:"reload"})},D=c!==null&&c.length>0&&d.length===c.length,L=new Set(d);return E(Se,{children:[E("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[E("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[a(se,{"aria-label":n("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:y,placeholder:n("Filter by prefix…"),value:F}),a(z,{"data-testid":"kv-filter-btn",disabled:_,onClick:b,children:n("Filter")}),a(z,{"data-testid":"kv-new-key-btn",onClick:()=>{f(m=>!m)},variant:"outline",children:n("New key")}),d.length>0&&a(z,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:I,variant:"destructive",children:t?n("Deleting…"):n("Delete {count}",{count:d.length})})]}),r!==null&&a("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:r}),x!==null&&a("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:x}),c!==null&&c.length===0&&!_&&a("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:n("No keys.")}),c!==null&&c.length>0&&a(ye,{className:"overflow-hidden py-0",children:a(ge,{className:"px-0",children:a(Qe,{allSelected:D,bulkSelected:L,keys:c,onSelectKey:N,onToggleAll:B,onToggleBulk:V,selectedKey:o})})}),!k&&p!==null&&a("div",{className:"mt-2",children:a(z,{"data-testid":"kv-load-more",disabled:_,onClick:g,variant:"outline",children:n(_?"Loading…":"Load more")})})]}),a(oe,{onOpenChange:m=>{m||f(!1)},open:u,children:E(ce,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-create-sheet",side:"right",children:[a(ue,{children:a(me,{children:n("New key")})}),a(Ze,{namespace:l,onCancel:()=>{f(!1)},onCreated:A})]})}),a(oe,{onOpenChange:m=>{m||i({name:null,type:"selectKey"})},open:o!==null,children:E(ce,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-editor-sheet",side:"right",children:[a(ue,{children:a(me,{className:"truncate font-mono text-xs",children:o})}),o!==null&&a(tt,{expiration:c?.find(m=>m.name===o)?.expiration,keyName:o,namespace:l,onDeleted:S},`${l}:${o}`)]})})]})},Et=({loadNamespaces:l}={})=>{const e=le(),n=W(),[s,i]=Z(null),[v,d]=Z(null),[t,r]=Z(null);te(()=>{const c={cancelled:!1};return J((async()=>{try{const k=await(l??(()=>e.listKvNamespaces()))();c.cancelled||(i(k),d(null),r(x=>x??k[0]?.binding??null))}catch(k){c.cancelled||(i(null),d(H(k)))}})()),()=>{c.cancelled=!0}},[e,l]);const p=c=>{r(c.currentTarget.dataset.ns??null)};return E("div",{className:"flex flex-col gap-4","data-testid":"lunora-kv-browser",children:[v!==null&&a("p",{className:"text-sm text-destructive","data-testid":"kv-ns-error",role:"alert",children:v}),s!==null&&s.length===0&&a(Ie,{description:n("Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed."),icon:a("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:a("path",{d:"M5 5h14v4H5V5Zm0 5h14v4H5v-4Zm0 5h14v4H5v-4Z"})}),testId:"kv-empty",title:n("No KV namespaces.")}),s!==null&&s.length>0&&a(ye,{className:"overflow-hidden py-0",children:a(ge,{className:"px-0",children:E(be,{"data-testid":"kv-namespace-table",children:[a(ke,{children:a(ee,{children:a(Q,{children:n("Namespace")})})}),a(xe,{children:s.map(c=>a(ee,{className:c.binding===t?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-ns":c.binding,"data-testid":`kv-ns-row-${c.binding}`,onClick:p,children:a(X,{className:"font-mono text-xs",children:c.binding})},c.binding))})]})})}),t!==null&&a(at,{namespace:t},t)]})};export{Et as KvBrowser};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as ie}from"react/compiler-runtime";import{useState as te}from"react";import{B as oe}from"../packem_shared/button-q0UYSmrn.mjs";import{C as re,a as ne}from"../packem_shared/card-By2O8ULa.mjs";import{I as pe}from"../packem_shared/input-CXhxesPC.mjs";import{useT as ae}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{
|
|
1
|
+
import{c as ie}from"react/compiler-runtime";import{useState as te}from"react";import{B as oe}from"../packem_shared/button-q0UYSmrn.mjs";import{C as re,a as ne}from"../packem_shared/card-By2O8ULa.mjs";import{I as pe}from"../packem_shared/input-CXhxesPC.mjs";import{useT as ae}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{C as ue}from"../packem_shared/cf-links-C4DVTr8A.mjs";import{g as he,b as ge,f as xe}from"../packem_shared/internal-hIuTpSbx.mjs";import{jsx as l,jsxs as g}from"react/jsx-runtime";const be=e=>{const t=ie(23),{destination:s}=e,u=ae();let x;t[0]!==s.snippet?(x=()=>{he(s.snippet)},t[0]=s.snippet,t[1]=x):x=t[1];const m=x;let i;t[2]!==s.title?(i=l("h4",{className:"text-sm font-semibold",children:s.title}),t[2]=s.title,t[3]=i):i=t[3];let o;t[4]!==s.description?(o=l("p",{className:"text-sm text-muted-foreground",children:s.description}),t[4]=s.description,t[5]=o):o=t[5];let c;t[6]!==i||t[7]!==o?(c=g("div",{children:[i,o]}),t[6]=i,t[7]=o,t[8]=c):c=t[8];const P=`drain-copy-${s.id}`;let r;t[9]!==u?(r=u("Copy"),t[9]=u,t[10]=r):r=t[10];let n;t[11]!==m||t[12]!==P||t[13]!==r?(n=l(oe,{"data-testid":P,onClick:m,size:"sm",variant:"outline",children:r}),t[11]=m,t[12]=P,t[13]=r,t[14]=n):n=t[14];let a;t[15]!==c||t[16]!==n?(a=g("div",{className:"flex items-start justify-between gap-3",children:[c,n]}),t[15]=c,t[16]=n,t[17]=a):a=t[17];let f;t[18]!==s.snippet?(f=l("pre",{className:"mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-xs",children:s.snippet}),t[18]=s.snippet,t[19]=f):f=t[19];let b;return t[20]!==a||t[21]!==f?(b=l(re,{className:"py-0","data-testid":"drain-card",children:g(ne,{className:"p-3",children:[a,f]})}),t[20]=a,t[21]=f,t[22]=b):b=t[22],b},je=()=>{const e=ie(93),t=ae();let s;e[0]!==t?(s=t("Stream every request log to R2, a SIEM, or a third-party log service."),e[0]=t,e[1]=s):s=e[1];let u;e[2]===Symbol.for("react.memo_cache_sentinel")?(u=["{",' "logpush": true',"}"],e[2]=u):u=e[2];const x=u.join(`
|
|
2
2
|
`);let m;e[3]!==t?(m=t("Logpush"),e[3]=t,e[4]=m):m=e[4];let i;e[5]!==s||e[6]!==m?(i={description:s,id:"logpush",snippet:x,title:m},e[5]=s,e[6]=m,e[7]=i):i=e[7];let o;e[8]!==t?(o=t("Send logs programmatically to a Worker for custom capture and forwarding."),e[8]=t,e[9]=o):o=e[9];let c;e[10]===Symbol.for("react.memo_cache_sentinel")?(c=["{",' "tail_consumers": [{ "service": "my-log-forwarder" }]',"}"],e[10]=c):c=e[10];const P=c.join(`
|
|
3
3
|
`);let r;e[11]!==t?(r=t("Tail Workers"),e[11]=t,e[12]=r):r=e[12];let n;e[13]!==o||e[14]!==r?(n={description:o,id:"tail-worker",snippet:P,title:r},e[13]=o,e[14]=r,e[15]=n):n=e[15];let a;e[16]!==t?(a=t("Retain and query recent request logs directly in Cloudflare's dashboard."),e[16]=t,e[17]=a):a=e[17];let f;e[18]===Symbol.for("react.memo_cache_sentinel")?(f=["{",' "observability": { "enabled": true }',"}"],e[18]=f):f=e[18];const b=f.join(`
|
|
4
4
|
`);let y;e[19]!==t?(y=t("Workers Logs"),e[19]=t,e[20]=y):y=e[20];let k;e[21]!==a||e[22]!==y?(k={description:a,id:"workers-logs",snippet:b,title:y},e[21]=a,e[22]=y,e[23]=k):k=e[23];let $;e[24]!==k||e[25]!==i||e[26]!==n?($=[i,n,k],e[24]=k,e[25]=i,e[26]=n,e[27]=$):$=e[27];const Q=$,[d,de]=te(""),[v,se]=te(!1),[z,J]=te(null);let V;e[28]!==t||e[29]!==d?(V=async()=>{const h=d.trim();if(h==="")return;const le="fetch"in globalThis?globalThis.fetch:void 0;if(le===void 0){J({kind:"error",message:t("fetch is unavailable in this environment."),url:h});return}const fe={durationMs:12,function:"messages:list",outcome:"ok",shard:"root",source:"lunora",tablesRead:["messages"],tablesWritten:[],ts:new Date().toISOString(),type:"request"};se(!0),J(null);const me=performance.now();try{const ee=await le(h,{body:JSON.stringify(fe),headers:{"Content-Type":"application/json"},method:"POST"});J({kind:"success",latencyMs:Math.round(performance.now()-me),status:ee.status,url:h})}catch(ee){J({kind:"error",message:ge(ee),url:h})}se(!1)},e[28]=t,e[29]=d,e[30]=V):V=e[30];const X=V;let Y;e[31]!==z||e[32]!==d?(Y=z?.url===d.trim()?z:null,e[31]=z,e[32]=d,e[33]=Y):Y=e[33];const p=Y;let G;e[34]!==X?(G=()=>{xe(X())},e[34]=X,e[35]=G):G=e[35];const Z=G;let H;e[36]===Symbol.for("react.memo_cache_sentinel")?(H=h=>{de(h.target.value)},e[36]=H):H=e[36];const ce=H;let w;e[37]!==t?(w=t("Open in Cloudflare"),e[37]=t,e[38]=w):w=e[38];let N;e[39]!==w?(N=l("div",{className:"flex flex-wrap items-center gap-3",children:l("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"drain-cf-link",href:ue,rel:"noreferrer",target:"_blank",children:w})}),e[39]=w,e[40]=N):N=e[40];let C;e[41]!==t?(C=t("Lunora does not ship logs itself — forwarding is handled by Cloudflare. Configure a destination below, then test your collector."),e[41]=t,e[42]=C):C=e[42];let S;e[43]!==C?(S=l("p",{className:"text-sm text-muted-foreground","data-testid":"drain-readonly-note",children:C}),e[43]=C,e[44]=S):S=e[44];let _;e[45]!==t?(_=t("Cloudflare destinations"),e[45]=t,e[46]=_):_=e[46];let T;e[47]!==_?(T=l("h3",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:_}),e[47]=_,e[48]=T):T=e[48];let L;e[49]!==Q?(L=Q.map(ye),e[49]=Q,e[50]=L):L=e[50];let R;e[51]!==T||e[52]!==L?(R=g("section",{className:"flex flex-col gap-3","data-testid":"drain-destinations",children:[T,L]}),e[51]=T,e[52]=L,e[53]=R):R=e[53];let j;e[54]!==t?(j=t("Webhook test"),e[54]=t,e[55]=j):j=e[55];let O;e[56]!==j?(O=l("h3",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:j}),e[56]=j,e[57]=O):O=e[57];let W;e[58]!==t?(W=t("POST a sample Lunora request-log envelope to your collector to confirm it is reachable."),e[58]=t,e[59]=W):W=e[59];let I;e[60]!==W?(I=l("p",{className:"mb-2 text-sm text-muted-foreground",children:W}),e[60]=W,e[61]=I):I=e[61];let M;e[62]!==t?(M=t("https://example.com/logs"),e[62]=t,e[63]=M):M=e[63];let q;e[64]!==M||e[65]!==d?(q=l(pe,{className:"min-w-[20rem] flex-1","data-testid":"drain-webhook-url",onChange:ce,placeholder:M,type:"url",value:d}),e[64]=M,e[65]=d,e[66]=q):q=e[66];let D;e[67]!==v||e[68]!==d?(D=v||d.trim()==="",e[67]=v,e[68]=d,e[69]=D):D=e[69];let U;e[70]!==v||e[71]!==t?(U=t(v?"Sending…":"Send test event"),e[70]=v,e[71]=t,e[72]=U):U=e[72];let A;e[73]!==Z||e[74]!==D||e[75]!==U?(A=l(oe,{"data-testid":"drain-webhook-test",disabled:D,onClick:Z,children:U}),e[73]=Z,e[74]=D,e[75]=U,e[76]=A):A=e[76];let B;e[77]!==q||e[78]!==A?(B=g("div",{className:"flex flex-wrap items-center gap-2",children:[q,A]}),e[77]=q,e[78]=A,e[79]=B):B=e[79];let E;e[80]!==p||e[81]!==t?(E=p!==null&&l("p",{className:p.kind==="success"?"mt-2 text-sm text-muted-foreground":"mt-2 text-sm text-destructive","data-testid":"drain-webhook-result",role:p.kind==="error"?"alert":void 0,children:p.kind==="success"?t("Delivered — status {status} in {latency}ms",{latency:p.latencyMs,status:p.status}):t("Failed: {message}",{message:p.message})}),e[80]=p,e[81]=t,e[82]=E):E=e[82];let F;e[83]!==O||e[84]!==I||e[85]!==B||e[86]!==E?(F=l(re,{className:"py-0",children:l(ne,{className:"p-3",children:g("section",{"data-testid":"drain-webhook",children:[O,I,B,E]})})}),e[83]=O,e[84]=I,e[85]=B,e[86]=E,e[87]=F):F=e[87];let K;return e[88]!==N||e[89]!==S||e[90]!==R||e[91]!==F?(K=g("div",{className:"flex flex-col gap-4","data-testid":"log-drains",children:[N,S,R,F]}),e[88]=N,e[89]=S,e[90]=R,e[91]=F,e[92]=K):K=e[92],K};function ye(e){return l(be,{destination:e},e.id)}export{je as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as R}from"react/compiler-runtime";import{useMemo as A,useState as ne}from"react";import{useT as P}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{c as M}from"../packem_shared/utils-bhneXptQ.mjs";import{MigrationsPanel as ie}from"../packem_shared/MigrationsPanel-DMkxSXNl.mjs";import{useNavigate as oe,useSearch as se}from"@tanstack/react-router";import{E as re}from"../packem_shared/error-alert-C0R39DO1.mjs";import{E as ae}from"../packem_shared/empty-state-D7jEML_T.mjs";import{u as D}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{ADMIN_FUNCTIONS as L}from"../packem_shared/ADMIN_FUNCTIONS-4aGsMs95.mjs";import{h as de,f as ce}from"../packem_shared/internal-hIuTpSbx.mjs";import{S as le}from"../packem_shared/schema-diagram-CtVPhOGj.mjs";import{jsx as l,jsxs as y}from"react/jsx-runtime";const J=1;function me(t){const e={},n=Object.keys(t);n.sort();for(const i of n)e[i]=t[i];return e}const O=t=>typeof t=="object"&&t!==null,ue=t=>O(t)&&O(t.fields)&&O(t.indexes)&&O(t.relations)&&typeof t.shardMode=="string",fe=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(i){return{error:`baseline is not valid JSON: ${i instanceof Error?i.message:String(i)}`,status:"invalid"}}if(!O(e)||e.version!==J||!O(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(J)})`,status:"invalid"};for(const[i,o]of Object.entries(e.tables))if(!ue(o))return{error:`baseline table "${i}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof e.jurisdiction=="string"?e.jurisdiction:void 0,migrationIds:Array.isArray(e.migrationIds)?e.migrationIds:[],tables:e.tables,version:J},status:"ok"}},he=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((n,i)=>n===e.fields[i]),V=t=>t.unique!==void 0,q=({nullable:t,optional:e,refined:n,unique:i,...o})=>JSON.stringify(me(o)),G=t=>({form:JSON.stringify([q(t),t.optional===!0,t.nullable===!0]),refined:t.refined===!0}),Q=t=>t.kind==="union"&&t.members?t.members.map(e=>G(e)):[G({...t,nullable:!1,optional:!1})],pe=(t,e)=>{if(e.kind!=="union")return!1;const n=Q(e);return Q(t).every(i=>n.some(o=>o.form===i.form&&(i.refined||!o.refined)))},x=t=>{switch(t.kind){case"array":return`array(${t.of?x(t.of):"?"})`;case"from":return t.output===void 0?"from":`from(${t.output})`;case"id":return`id(${t.ref??"?"})`;case"literal":return`literal(${t.literal??"?"})`;case"object":return`object({ ${Object.keys(t.fields??{}).join(", ")} })`;case"record":return`record(${t.key?x(t.key):"?"}, ${t.of?x(t.of):"?"})`;case"union":return(t.members??[]).map(e=>x(e)).join(" | ");default:return t.kind}},F=(t,e,n)=>({remediation:"backfill",scope:"table",severity:"breaking",summary:n,table:t,type:e}),T=(t,e,n)=>({remediation:"none",scope:"table",severity:"safe",summary:n,table:t,type:e}),Z=(t,e)=>{const n=JSON.stringify(t),i=JSON.stringify(e);return n===i?0:n<i?-1:1},S=t=>({...t,...t.kind==="from"?{output:void 0}:{},...t.fields?{fields:Object.fromEntries(Object.entries(t.fields).map(([e,n])=>[e,S(n)]))}:{},...t.key?{key:S(t.key)}:{},...t.of?{of:S(t.of)}:{},...t.members?{members:t.members.map(e=>S(e)).toSorted(Z)}:{}}),U=t=>t.kind==="union"?t.members??[]:[t],ge=(t,e)=>{const n=[...t],i=[...e],o=new Set,r=new Set,s=(a,d)=>{for(const[m,f]of n.entries()){if(r.has(m))continue;const u=i.findIndex((g,p)=>!o.has(p)&&a(f,g));u!==-1&&(o.add(u),r.add(m),d&&([n[m],i[u]]=I(f,i[u])))}};return s((a,d)=>JSON.stringify(a)===JSON.stringify(d),!1),s((a,d)=>q(S(a))===q(S(d)),!0),[n,i]},I=(t,e)=>{if(t.kind==="union"||e.kind==="union"){const[o,r]=ge(U(t),U(e)),s=(a,d)=>a.kind==="union"?{...a,members:d.toSorted(Z)}:d[0];return[s(t,o),s(e,r)]}if(t.kind!==e.kind)return[t,e];if(t.kind==="from")return t.output===void 0||e.output===void 0?[{...t,output:void 0},{...e,output:void 0}]:[t,e];const n={...t.fields?{fields:{...t.fields}}:{}},i={...e.fields?{fields:{...e.fields}}:{}};for(const o of["key","of"])t[o]&&e[o]&&([n[o],i[o]]=I(t[o],e[o]));for(const o of Object.keys(t.fields??{})){const r=t.fields?.[o],s=e.fields?.[o];r&&s&&n.fields&&i.fields&&([n.fields[o],i.fields[o]]=I(r,s))}return[{...t,...n},{...e,...i}]},be=(t,e,n,i,o)=>{const[r,s]=I(n,i);if(r.kind===s.kind&&(!o||q(r)===q(s)))return;if(o&&pe(r,s))return T(t,"widenedFieldShape",`field ${t}.${e} widened: ${x(r)} → ${x(s)} — every stored value stays valid`);if(r.kind!==s.kind)return F(t,"changedFieldKind",`field ${t}.${e} changed type: ${r.kind} → ${s.kind} — add a data migration to convert existing values`);const a=Object.values(s.fields??{});return o&&r.kind==="object"&&Object.keys(r.fields??{}).length===0&&a.length>0&&a.every(d=>d.optional)?T(t,"widenedFieldShape",`field ${t}.${e} now records its optional object shape — stored values stay valid`):F(t,"changedFieldShape",`field ${t}.${e} changed shape: ${x(r)} → ${x(s)} — stored values were written against the old shape; add a data migration to convert them`)},ye=(t,e,n,i)=>{const o=[];return n.unique!==i.unique&&o.push(i.unique===!0?F(t,"addedFieldConstraint",`field ${t}.${e} became unique — existing duplicates would violate it; add a data migration to de-duplicate first`):T(t,"relaxedFieldConstraint",`field ${t}.${e} is no longer unique`)),n.nullable!==i.nullable&&o.push(i.nullable===!0?T(t,"relaxedFieldConstraint",`field ${t}.${e} became nullable`):F(t,"addedFieldConstraint",`field ${t}.${e} is no longer nullable — rows holding NULL would be invalid; add a data migration to backfill them`)),n.refined!==i.refined&&o.push(i.refined===!0?F(t,"addedFieldConstraint",`field ${t}.${e} gained a validation refinement — stored values were never checked against it; add a data migration if any could fail`):T(t,"relaxedFieldConstraint",`field ${t}.${e} dropped its validation refinement`)),o},N=(t,e,n,i)=>{const o=[],r=V(n)&&V(i),s=be(t,e,n,i,r);return s&&o.push(s),r&&o.push(...ye(t,e,n,i)),n.optional&&!i.optional?o.push({remediation:"backfill",severity:"breaking",summary:`field ${t}.${e} became required — rows missing it would be invalid; add a data migration to backfill it`,table:t,scope:"table",type:"fieldOptionalToRequired"}):!n.optional&&i.optional&&o.push({remediation:"none",scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),o},ve=(t,e,n)=>n.optional?{remediation:"none",scope:"table",severity:"safe",summary:`added optional field ${t}.${e}`,table:t,type:"addedOptionalField"}:{remediation:"backfill",severity:"breaking",summary:`added required field ${t}.${e} — existing rows have no value; add a data migration to backfill it`,table:t,scope:"table",type:"addedRequiredField"},xe=(t,e,n,i)=>{for(const[o,r]of Object.entries(n.fields)){const s=e.fields[o];s===void 0?i.push(ve(t,o,r)):i.push(...N(t,o,s,r))}for(const o of Object.keys(e.fields))n.fields[o]===void 0&&i.push({remediation:"backfill",severity:"breaking",summary:`removed field ${t}.${o} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},ke=(t,e,n,i)=>{for(const[o,r]of Object.entries(n.indexes)){const s=e.indexes[o];if(s===void 0){i.push(r.unique?{remediation:"backfill",scope:"table",severity:"breaking",summary:`added unique index ${o} on ${t} — existing duplicates would violate it; add a data migration to de-duplicate first`,table:t,type:"addedIndex"}:{remediation:"none",scope:"table",severity:"safe",summary:`added index ${o} on ${t}`,table:t,type:"addedIndex"});continue}he(s,r)||i.push({remediation:"code",severity:"breaking",summary:`index ${o} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const o of Object.keys(e.indexes))n.indexes[o]===void 0&&i.push({remediation:"code",severity:"breaking",summary:`removed index ${o} on ${t} — a query that used \`.withIndex("${o}")\` would break`,table:t,scope:"table",type:"removedIndex"})},$e=(t,e,n,i)=>{for(const o of Object.keys(n.relations))e.relations[o]===void 0&&i.push({remediation:"none",scope:"schema",severity:"safe",summary:`added relation ${t}.${o}`,table:t,type:"addedRelation"});for(const o of Object.keys(e.relations))n.relations[o]===void 0&&i.push({remediation:"code",scope:"schema",severity:"breaking",summary:`removed relation ${t}.${o}`,table:t,type:"removedRelation"})},W="shardBy:_unknown_",C="global",we=(t,e)=>t===C&&e.startsWith(`${C}:`)||e===C&&t.startsWith(`${C}:`),Oe=(t,e,n)=>{if(e===n)return n!==W?void 0:{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} declares a non-literal .shardBy(...) key, so codegen cannot read which column partitions it — every such key records as "${W}" and two DIFFERENT keys would compare equal. Pass the shard key as a string literal; until then this is reported on every run, because the alternative is a silent pass on a re-home that strands every row (export/import is the only way back).`,table:t,type:"changedShardMode"};if(!we(e,n))return{remediation:"rehome",severity:"breaking",summary:`table ${t} changed shard mode: ${e} → ${n} — its physical storage moves, and existing rows do NOT follow the schema; re-home them with an export/import round trip (https://lunora.sh/docs/concepts/sharding#migrating-a-populated-table)`,table:t,scope:"table",type:"changedShardMode"}},B=t=>t.memory!==void 0,K=t=>t.after??0,w=t=>t.after===void 0?`.ttl("${t.field}")`:`.ttl("${t.field}", { after: ${String(t.after)} })`,Se=(t,e,n)=>{if(e===void 0&&n===void 0)return;const i=a=>({remediation:"backfill",scope:"table",severity:"breaking",summary:a,table:t,type:"changedTtlPolicy"}),o=a=>({remediation:"none",scope:"table",severity:"safe",summary:a,table:t,type:"changedTtlPolicy"});if(n===void 0)return o(`table ${t} dropped its TTL policy — its rows are no longer swept`);if(e===void 0)return i(`table ${t} gained a TTL policy ${w(n)} — every row already past the cutoff is deleted on the next alarm sweep; add a data migration to refresh or clear "${n.field}" on the rows written before it`);if(e.field!==n.field)return i(`table ${t} moved its TTL to a different column: ${w(e)} → ${w(n)} — rows are now expired by a column they were never written against; add a data migration to populate "${n.field}"`);const r=K(e),s=K(n);return s<r?i(`table ${t} shortened its TTL: ${w(e)} → ${w(n)} — rows that were not expired under the old offset are deleted on the next alarm sweep; add a data migration to refresh "${n.field}" on the rows that must survive`):s>r?o(`table ${t} lengthened its TTL: ${w(e)} → ${w(n)}`):void 0},je=(t,e,n)=>{const i=[];return e.memory!==n.memory&&i.push(n.memory===!0?{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} became a .memory() table — every row is deleted in every shard on the next Durable Object cold start, and no data migration survives that; export the rows first if they must be kept, or revert`,table:t,type:"changedMemoryMode"}:{remediation:"none",scope:"table",severity:"safe",summary:`table ${t} is no longer a .memory() table — its rows now survive a cold start`,table:t,type:"changedMemoryMode"}),e.commitOrdered!==n.commitOrdered&&i.push(n.commitOrdered===!0?{remediation:"backfill",scope:"table",severity:"breaking",summary:`table ${t} became .commitOrdered() — rows written before it carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed never offers them; add a data migration over the table to stamp them (the rewrite allocates a sequence)`,table:t,type:"changedCommitOrdering"}:{remediation:"code",scope:"table",severity:"breaking",summary:`table ${t} is no longer .commitOrdered() — new rows carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed stops advancing without erroring; update the consumers before deploying`,table:t,type:"changedCommitOrdering"}),i},Fe=(t,e,n,i)=>{const o=Oe(t,e.shardMode,n.shardMode);if(o&&i.push(o),B(e)&&B(n)){i.push(...je(t,e,n));const r=Se(t,e.ttl,n.ttl);r&&i.push(r)}xe(t,e,n,i),ke(t,e,n,i),$e(t,e,n,i)},Te=(t,e)=>{const n=[],i=t?.tables??{};for(const[o,r]of Object.entries(e.tables)){const s=i[o];if(s===void 0){n.push({remediation:"none",scope:"table",severity:"safe",summary:`added table ${o}`,table:o,type:"addedTable"});continue}Fe(o,s,r,n)}for(const o of Object.keys(i))e.tables[o]===void 0&&n.push({remediation:"rehome",scope:"table",severity:"breaking",summary:`removed table ${o} — its rows stay in each shard's SQLite, unreachable through the schema; export the shard first if the data must be kept`,table:o,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const o=t.jurisdiction??"(none)",r=e.jurisdiction??"(none)";n.push({remediation:"rehome",scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${o} to ${r} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:n}},Y=t=>Object.entries(t.fields).map(([e,n])=>({name:e,optional:n.optional,ref:Object.values(t.relations).find(i=>i.field===e&&i.kind==="one")?.table,type:x(n)})),z=(t,e,n)=>{const i={},o=e?.fields??{},r=n?.fields??{};for(const[s,a]of Object.entries(r)){const d=o[s];d===void 0?i[s]=e===void 0?"unchanged":"added":i[s]=N(t,s,d,a).length===0?"unchanged":"changed"}for(const s of Object.keys(o))r[s]===void 0&&(i[s]="removed");return i},Me=(t,e)=>{const{changes:n}=Te(t,e),i=new Set(n.filter(s=>s.scope==="table"&&s.table!==void 0).map(s=>s.table)),o=[],r=(s,a)=>s?"added":i.has(a)?"changed":"context";for(const[s,a]of Object.entries(e.tables)){const d=t?.tables[s],m=r(d===void 0,s);o.push({columns:Y(a),fieldStatus:z(s,d,a),name:s,shardMode:a.shardMode,status:m})}for(const[s,a]of Object.entries(t?.tables??{}))e.tables[s]===void 0&&o.push({columns:Y(a),fieldStatus:z(s,a,void 0),name:s,shardMode:a.shardMode,status:"removed"});return o.sort((s,a)=>s.name.localeCompare(a.name)),{breakingCount:n.filter(s=>s.severity==="breaking").length,changes:n,tables:o}},X=t=>{const e=fe(t);return e.status==="ok"?e.snapshot:void 0},qe={added:"ring-2 ring-emerald-500/60",changed:"ring-2 ring-amber-500/70",context:"opacity-55",removed:"opacity-70 ring-2 ring-destructive/60"},Ce=t=>t==="global"||t.startsWith("global:")?"global":"shard",Ie=t=>{const e=R(24),{appliedAt:n,hash:i,onSelect:o,selected:r,seq:s}=t,a=r?"border-s-primary bg-accent/60 text-foreground":"border-s-transparent text-muted-foreground hover:bg-accent/30 hover:text-foreground";let d;e[0]!==a?(d=M("flex w-full flex-col items-start gap-1 border-s-2 px-4 py-3 text-start outline-none transition-colors",a),e[0]=a,e[1]=d):d=e[1];const m=`sh-version-${i}`;let f;e[2]!==i||e[3]!==o?(f=()=>{o(i)},e[2]=i,e[3]=o,e[4]=f):f=e[4];let u;e[5]!==s?(u=y("span",{className:"font-mono text-[13px] tabular-nums",children:["v",s]}),e[5]=s,e[6]=u):u=e[6];let g;e[7]!==i?(g=i.slice(0,7),e[7]=i,e[8]=g):g=e[8];let p;e[9]!==g?(p=l("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:g}),e[9]=g,e[10]=p):p=e[10];let h;e[11]!==u||e[12]!==p?(h=y("span",{className:"flex w-full items-baseline gap-2",children:[u,p]}),e[11]=u,e[12]=p,e[13]=h):h=e[13];let b;e[14]!==n?(b=de(n),e[14]=n,e[15]=b):b=e[15];let v;e[16]!==b?(v=l("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:b}),e[16]=b,e[17]=v):v=e[17];let k;return e[18]!==v||e[19]!==d||e[20]!==m||e[21]!==f||e[22]!==h?(k=l("li",{children:y("button",{className:d,"data-testid":m,onClick:f,type:"button",children:[h,v]})}),e[18]=v,e[19]=d,e[20]=m,e[21]=f,e[22]=h,e[23]=k):k=e[23],k},Re=t=>{const e=R(26),{breaking:n,count:i,first:o}=t,r=P();if(o){let p;e[0]!==i?(p=l("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:i}),e[0]=i,e[1]=p):p=e[1];let h;e[2]!==r?(h=r("tables"),e[2]=r,e[3]=h):h=e[3];let b;e[4]!==h?(b=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:h}),e[4]=h,e[5]=b):b=e[5];let v;return e[6]!==p||e[7]!==b?(v=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[p,b]}),e[6]=p,e[7]=b,e[8]=v):v=e[8],v}const s=n>0&&"text-destructive";let a;e[9]!==s?(a=M("text-3xl leading-none font-light tracking-tight tabular-nums",s),e[9]=s,e[10]=a):a=e[10];let d;e[11]!==i||e[12]!==a?(d=l("span",{className:a,children:i}),e[11]=i,e[12]=a,e[13]=d):d=e[13];let m;e[14]!==i||e[15]!==r?(m=r(i===1?"change":"changes"),e[14]=i,e[15]=r,e[16]=m):m=e[16];let f;e[17]!==m?(f=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:m}),e[17]=m,e[18]=f):f=e[18];let u;e[19]!==n||e[20]!==r?(u=n>0&&y("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",r("{count} breaking",{count:n})]}),e[19]=n,e[20]=r,e[21]=u):u=e[21];let g;return e[22]!==d||e[23]!==f||e[24]!==u?(g=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[d,f,u]}),e[22]=d,e[23]=f,e[24]=u,e[25]=g):g=e[25],g},ee={addedFieldConstraint:{action:"added",kind:"constraint"},addedIndex:{action:"added",kind:"index"},addedOptionalField:{action:"added",kind:"field?"},addedRelation:{action:"added",kind:"relation"},addedRequiredField:{action:"added",kind:"field"},addedTable:{action:"added",kind:"table"},changedCommitOrdering:{action:"changed",kind:"commit ordering"},changedFieldKind:{action:"changed",kind:"field kind"},changedFieldShape:{action:"changed",kind:"field shape"},changedIndex:{action:"changed",kind:"index"},changedJurisdiction:{action:"changed",kind:"jurisdiction"},changedMemoryMode:{action:"changed",kind:"memory mode"},changedShardMode:{action:"changed",kind:"shard mode"},changedTtlPolicy:{action:"changed",kind:"TTL policy"},fieldOptionalToRequired:{action:"changed",kind:"field → required"},fieldRequiredToOptional:{action:"changed",kind:"field → optional"},relaxedFieldConstraint:{action:"removed",kind:"constraint"},removedField:{action:"removed",kind:"field"},removedIndex:{action:"removed",kind:"index"},removedRelation:{action:"removed",kind:"relation"},removedTable:{action:"removed",kind:"table"},widenedFieldShape:{action:"changed",kind:"field → wider"}},Ee=(t,e)=>{const n=`${ee[t.type].action} ${e} `;return t.summary.startsWith(n)?t.summary.slice(n.length):t.summary},Ae=t=>{const e=new Map;for(const i of t){const o=i.table??"",r=e.get(o);r===void 0?e.set(o,[i]):r.push(i)}const n=[...e].map(([i,o])=>({changes:o,table:i}));return[...n.filter(i=>i.table!==""),...n.filter(i=>i.table==="")]},De=t=>{const e=R(2),{children:n}=t;let i;return e[0]!==n?(i=l("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:n}),e[0]=n,e[1]=i):i=e[1],i},Le=({pane:t,shardKey:e=""})=>{const n=P(),i=oe(),r=se({strict:!1}).version,s=c=>{ce(i({search:{version:c},to:"/migrations"}))},a=D(L.schemaHistory,{},{shardKey:e}),d=a.data?.versions??[],m=r!==void 0&&d.some(c=>c.hash===r)?r:d[0]?.hash,f=d.findIndex(c=>c.hash===m),u=f===-1?void 0:d[f+1]?.hash,g=D(L.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),p=D(L.schemaVersion,{hash:u??""},{enabled:u!==void 0,shardKey:e}),h=A(()=>{const c=X(g.data?.version?.snapshotJson);if(c!==void 0)return Me(X(p.data?.version?.snapshotJson),c)},[g.data,p.data]),b=A(()=>(h?.tables??[]).map(c=>({columns:c.columns,name:c.name,tier:Ce(c.shardMode)})),[h]),v=A(()=>{const c={};for(const j of h?.tables??[])c[j.name]=qe[j.status];return c},[h]);if(a.error!==null)return l(re,{error:a.errorSource,testId:"sh-error"});if(d.length===0)return l(ae,{description:n("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:n("No schema versions recorded yet.")});const k=h?.changes??[];return y("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[y("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[l(De,{children:n("Schema versions")}),l("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:d.map(c=>l(Ie,{appliedAt:c.appliedAt,hash:c.hash,onSelect:s,selected:c.hash===m,seq:c.seq},c.hash))})]}),y("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[l(Re,{breaking:h?.breakingCount??0,count:u===void 0?b.length:k.length,first:u===void 0}),t==="diagram"?l("div",{className:"flex min-h-0 flex-1 flex-col",children:l(le,{fill:!0,nodeClasses:v,tables:b,testIdPrefix:"sh"})}):l("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:Ae(k).map(c=>{const j=(h?.tables??[]).find($=>$.name===c.table);return y("section",{className:"mb-6",children:[y("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[l("span",{className:"font-mono text-[13px] text-foreground",children:c.table===""?n("schema"):c.table}),j!==void 0&&l("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:n("{count} columns",{count:j.columns.length})}),c.changes.length>1&&l("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:c.changes.length})]}),l("ul",{children:c.changes.map($=>{const{action:te,kind:_}=ee[$.type],E=$.severity==="breaking",H=Ee($,_);return y("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[l("span",{"aria-hidden":"true",className:M("-ms-3 h-3 w-0.5 shrink-0 self-center",E?"bg-destructive":"bg-transparent")}),y("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[n(te)," ",_]}),H!==c.table&&l("span",{className:M("min-w-0 font-mono text-[13px]",E?"text-destructive":"text-foreground"),children:H}),E&&l("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:n("breaking")})]},`${$.type}-${$.summary}`)})})]},c.table)})})]})]})},Je=t=>M("-mb-px border-b-2 px-3 py-2.5 font-mono text-[11px] tracking-wider uppercase transition-colors outline-none","hover:bg-accent/40 focus-visible:bg-accent/40",t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),Ze=t=>{const e=R(11),{initialShardKey:n}=t,i=P(),[o,r]=ne("diagram");let s;e[0]!==o?(s=(u,g,p,h)=>y("button",{"aria-selected":o===u,className:Je(o===u),"data-testid":p,onClick:()=>{r(u)},role:"tab",type:"button",children:[g,h!==void 0&&l("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:h})]}),e[0]=o,e[1]=s):s=e[1];const a=s;let d;e[2]!==i||e[3]!==a?(d=y("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[a("diagram",i("Diagram"),"mg-pane-diagram"),a("changes",i("Changes"),"mg-pane-changes"),a("data",i("Data migrations"),"mg-pane-data")]}),e[2]=i,e[3]=a,e[4]=d):d=e[4];let m;e[5]!==n||e[6]!==o?(m=l("div",{className:"flex min-h-0 flex-1 flex-col",children:o==="data"?l("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:l(ie,{initialShardKey:n})}):l(Le,{pane:o,shardKey:n})}),e[5]=n,e[6]=o,e[7]=m):m=e[7];let f;return e[8]!==d||e[9]!==m?(f=y("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[d,m]}),e[8]=d,e[9]=m,e[10]=f):f=e[10],f};export{Ze as default};
|
|
1
|
+
import{c as R}from"react/compiler-runtime";import{useMemo as A,useState as ne}from"react";import{useT as P}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{c as M}from"../packem_shared/utils-bhneXptQ.mjs";import{MigrationsPanel as ie}from"../packem_shared/MigrationsPanel-CwLikxDT.mjs";import{useNavigate as oe,useSearch as se}from"@tanstack/react-router";import{E as re}from"../packem_shared/error-alert-DKXm5h19.mjs";import{E as ae}from"../packem_shared/empty-state-D7jEML_T.mjs";import{u as D}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{ADMIN_FUNCTIONS as L}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{h as de,f as ce}from"../packem_shared/internal-hIuTpSbx.mjs";import{S as le}from"../packem_shared/schema-diagram-CtVPhOGj.mjs";import{jsx as l,jsxs as y}from"react/jsx-runtime";const J=1;function me(t){const e={},n=Object.keys(t);n.sort();for(const i of n)e[i]=t[i];return e}const O=t=>typeof t=="object"&&t!==null,ue=t=>O(t)&&O(t.fields)&&O(t.indexes)&&O(t.relations)&&typeof t.shardMode=="string",fe=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(i){return{error:`baseline is not valid JSON: ${i instanceof Error?i.message:String(i)}`,status:"invalid"}}if(!O(e)||e.version!==J||!O(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(J)})`,status:"invalid"};for(const[i,o]of Object.entries(e.tables))if(!ue(o))return{error:`baseline table "${i}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof e.jurisdiction=="string"?e.jurisdiction:void 0,migrationIds:Array.isArray(e.migrationIds)?e.migrationIds:[],tables:e.tables,version:J},status:"ok"}},he=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((n,i)=>n===e.fields[i]),V=t=>t.unique!==void 0,q=({nullable:t,optional:e,refined:n,unique:i,...o})=>JSON.stringify(me(o)),G=t=>({form:JSON.stringify([q(t),t.optional===!0,t.nullable===!0]),refined:t.refined===!0}),Q=t=>t.kind==="union"&&t.members?t.members.map(e=>G(e)):[G({...t,nullable:!1,optional:!1})],pe=(t,e)=>{if(e.kind!=="union")return!1;const n=Q(e);return Q(t).every(i=>n.some(o=>o.form===i.form&&(i.refined||!o.refined)))},x=t=>{switch(t.kind){case"array":return`array(${t.of?x(t.of):"?"})`;case"from":return t.output===void 0?"from":`from(${t.output})`;case"id":return`id(${t.ref??"?"})`;case"literal":return`literal(${t.literal??"?"})`;case"object":return`object({ ${Object.keys(t.fields??{}).join(", ")} })`;case"record":return`record(${t.key?x(t.key):"?"}, ${t.of?x(t.of):"?"})`;case"union":return(t.members??[]).map(e=>x(e)).join(" | ");default:return t.kind}},F=(t,e,n)=>({remediation:"backfill",scope:"table",severity:"breaking",summary:n,table:t,type:e}),T=(t,e,n)=>({remediation:"none",scope:"table",severity:"safe",summary:n,table:t,type:e}),Z=(t,e)=>{const n=JSON.stringify(t),i=JSON.stringify(e);return n===i?0:n<i?-1:1},S=t=>({...t,...t.kind==="from"?{output:void 0}:{},...t.fields?{fields:Object.fromEntries(Object.entries(t.fields).map(([e,n])=>[e,S(n)]))}:{},...t.key?{key:S(t.key)}:{},...t.of?{of:S(t.of)}:{},...t.members?{members:t.members.map(e=>S(e)).toSorted(Z)}:{}}),U=t=>t.kind==="union"?t.members??[]:[t],ge=(t,e)=>{const n=[...t],i=[...e],o=new Set,r=new Set,s=(a,d)=>{for(const[m,f]of n.entries()){if(r.has(m))continue;const u=i.findIndex((g,p)=>!o.has(p)&&a(f,g));u!==-1&&(o.add(u),r.add(m),d&&([n[m],i[u]]=I(f,i[u])))}};return s((a,d)=>JSON.stringify(a)===JSON.stringify(d),!1),s((a,d)=>q(S(a))===q(S(d)),!0),[n,i]},I=(t,e)=>{if(t.kind==="union"||e.kind==="union"){const[o,r]=ge(U(t),U(e)),s=(a,d)=>a.kind==="union"?{...a,members:d.toSorted(Z)}:d[0];return[s(t,o),s(e,r)]}if(t.kind!==e.kind)return[t,e];if(t.kind==="from")return t.output===void 0||e.output===void 0?[{...t,output:void 0},{...e,output:void 0}]:[t,e];const n={...t.fields?{fields:{...t.fields}}:{}},i={...e.fields?{fields:{...e.fields}}:{}};for(const o of["key","of"])t[o]&&e[o]&&([n[o],i[o]]=I(t[o],e[o]));for(const o of Object.keys(t.fields??{})){const r=t.fields?.[o],s=e.fields?.[o];r&&s&&n.fields&&i.fields&&([n.fields[o],i.fields[o]]=I(r,s))}return[{...t,...n},{...e,...i}]},be=(t,e,n,i,o)=>{const[r,s]=I(n,i);if(r.kind===s.kind&&(!o||q(r)===q(s)))return;if(o&&pe(r,s))return T(t,"widenedFieldShape",`field ${t}.${e} widened: ${x(r)} → ${x(s)} — every stored value stays valid`);if(r.kind!==s.kind)return F(t,"changedFieldKind",`field ${t}.${e} changed type: ${r.kind} → ${s.kind} — add a data migration to convert existing values`);const a=Object.values(s.fields??{});return o&&r.kind==="object"&&Object.keys(r.fields??{}).length===0&&a.length>0&&a.every(d=>d.optional)?T(t,"widenedFieldShape",`field ${t}.${e} now records its optional object shape — stored values stay valid`):F(t,"changedFieldShape",`field ${t}.${e} changed shape: ${x(r)} → ${x(s)} — stored values were written against the old shape; add a data migration to convert them`)},ye=(t,e,n,i)=>{const o=[];return n.unique!==i.unique&&o.push(i.unique===!0?F(t,"addedFieldConstraint",`field ${t}.${e} became unique — existing duplicates would violate it; add a data migration to de-duplicate first`):T(t,"relaxedFieldConstraint",`field ${t}.${e} is no longer unique`)),n.nullable!==i.nullable&&o.push(i.nullable===!0?T(t,"relaxedFieldConstraint",`field ${t}.${e} became nullable`):F(t,"addedFieldConstraint",`field ${t}.${e} is no longer nullable — rows holding NULL would be invalid; add a data migration to backfill them`)),n.refined!==i.refined&&o.push(i.refined===!0?F(t,"addedFieldConstraint",`field ${t}.${e} gained a validation refinement — stored values were never checked against it; add a data migration if any could fail`):T(t,"relaxedFieldConstraint",`field ${t}.${e} dropped its validation refinement`)),o},N=(t,e,n,i)=>{const o=[],r=V(n)&&V(i),s=be(t,e,n,i,r);return s&&o.push(s),r&&o.push(...ye(t,e,n,i)),n.optional&&!i.optional?o.push({remediation:"backfill",severity:"breaking",summary:`field ${t}.${e} became required — rows missing it would be invalid; add a data migration to backfill it`,table:t,scope:"table",type:"fieldOptionalToRequired"}):!n.optional&&i.optional&&o.push({remediation:"none",scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),o},ve=(t,e,n)=>n.optional?{remediation:"none",scope:"table",severity:"safe",summary:`added optional field ${t}.${e}`,table:t,type:"addedOptionalField"}:{remediation:"backfill",severity:"breaking",summary:`added required field ${t}.${e} — existing rows have no value; add a data migration to backfill it`,table:t,scope:"table",type:"addedRequiredField"},xe=(t,e,n,i)=>{for(const[o,r]of Object.entries(n.fields)){const s=e.fields[o];s===void 0?i.push(ve(t,o,r)):i.push(...N(t,o,s,r))}for(const o of Object.keys(e.fields))n.fields[o]===void 0&&i.push({remediation:"backfill",severity:"breaking",summary:`removed field ${t}.${o} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},ke=(t,e,n,i)=>{for(const[o,r]of Object.entries(n.indexes)){const s=e.indexes[o];if(s===void 0){i.push(r.unique?{remediation:"backfill",scope:"table",severity:"breaking",summary:`added unique index ${o} on ${t} — existing duplicates would violate it; add a data migration to de-duplicate first`,table:t,type:"addedIndex"}:{remediation:"none",scope:"table",severity:"safe",summary:`added index ${o} on ${t}`,table:t,type:"addedIndex"});continue}he(s,r)||i.push({remediation:"code",severity:"breaking",summary:`index ${o} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const o of Object.keys(e.indexes))n.indexes[o]===void 0&&i.push({remediation:"code",severity:"breaking",summary:`removed index ${o} on ${t} — a query that used \`.withIndex("${o}")\` would break`,table:t,scope:"table",type:"removedIndex"})},$e=(t,e,n,i)=>{for(const o of Object.keys(n.relations))e.relations[o]===void 0&&i.push({remediation:"none",scope:"schema",severity:"safe",summary:`added relation ${t}.${o}`,table:t,type:"addedRelation"});for(const o of Object.keys(e.relations))n.relations[o]===void 0&&i.push({remediation:"code",scope:"schema",severity:"breaking",summary:`removed relation ${t}.${o}`,table:t,type:"removedRelation"})},W="shardBy:_unknown_",C="global",we=(t,e)=>t===C&&e.startsWith(`${C}:`)||e===C&&t.startsWith(`${C}:`),Oe=(t,e,n)=>{if(e===n)return n!==W?void 0:{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} declares a non-literal .shardBy(...) key, so codegen cannot read which column partitions it — every such key records as "${W}" and two DIFFERENT keys would compare equal. Pass the shard key as a string literal; until then this is reported on every run, because the alternative is a silent pass on a re-home that strands every row (export/import is the only way back).`,table:t,type:"changedShardMode"};if(!we(e,n))return{remediation:"rehome",severity:"breaking",summary:`table ${t} changed shard mode: ${e} → ${n} — its physical storage moves, and existing rows do NOT follow the schema; re-home them with an export/import round trip (https://lunora.sh/docs/concepts/sharding#migrating-a-populated-table)`,table:t,scope:"table",type:"changedShardMode"}},B=t=>t.memory!==void 0,K=t=>t.after??0,w=t=>t.after===void 0?`.ttl("${t.field}")`:`.ttl("${t.field}", { after: ${String(t.after)} })`,Se=(t,e,n)=>{if(e===void 0&&n===void 0)return;const i=a=>({remediation:"backfill",scope:"table",severity:"breaking",summary:a,table:t,type:"changedTtlPolicy"}),o=a=>({remediation:"none",scope:"table",severity:"safe",summary:a,table:t,type:"changedTtlPolicy"});if(n===void 0)return o(`table ${t} dropped its TTL policy — its rows are no longer swept`);if(e===void 0)return i(`table ${t} gained a TTL policy ${w(n)} — every row already past the cutoff is deleted on the next alarm sweep; add a data migration to refresh or clear "${n.field}" on the rows written before it`);if(e.field!==n.field)return i(`table ${t} moved its TTL to a different column: ${w(e)} → ${w(n)} — rows are now expired by a column they were never written against; add a data migration to populate "${n.field}"`);const r=K(e),s=K(n);return s<r?i(`table ${t} shortened its TTL: ${w(e)} → ${w(n)} — rows that were not expired under the old offset are deleted on the next alarm sweep; add a data migration to refresh "${n.field}" on the rows that must survive`):s>r?o(`table ${t} lengthened its TTL: ${w(e)} → ${w(n)}`):void 0},je=(t,e,n)=>{const i=[];return e.memory!==n.memory&&i.push(n.memory===!0?{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} became a .memory() table — every row is deleted in every shard on the next Durable Object cold start, and no data migration survives that; export the rows first if they must be kept, or revert`,table:t,type:"changedMemoryMode"}:{remediation:"none",scope:"table",severity:"safe",summary:`table ${t} is no longer a .memory() table — its rows now survive a cold start`,table:t,type:"changedMemoryMode"}),e.commitOrdered!==n.commitOrdered&&i.push(n.commitOrdered===!0?{remediation:"backfill",scope:"table",severity:"breaking",summary:`table ${t} became .commitOrdered() — rows written before it carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed never offers them; add a data migration over the table to stamp them (the rewrite allocates a sequence)`,table:t,type:"changedCommitOrdering"}:{remediation:"code",scope:"table",severity:"breaking",summary:`table ${t} is no longer .commitOrdered() — new rows carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed stops advancing without erroring; update the consumers before deploying`,table:t,type:"changedCommitOrdering"}),i},Fe=(t,e,n,i)=>{const o=Oe(t,e.shardMode,n.shardMode);if(o&&i.push(o),B(e)&&B(n)){i.push(...je(t,e,n));const r=Se(t,e.ttl,n.ttl);r&&i.push(r)}xe(t,e,n,i),ke(t,e,n,i),$e(t,e,n,i)},Te=(t,e)=>{const n=[],i=t?.tables??{};for(const[o,r]of Object.entries(e.tables)){const s=i[o];if(s===void 0){n.push({remediation:"none",scope:"table",severity:"safe",summary:`added table ${o}`,table:o,type:"addedTable"});continue}Fe(o,s,r,n)}for(const o of Object.keys(i))e.tables[o]===void 0&&n.push({remediation:"rehome",scope:"table",severity:"breaking",summary:`removed table ${o} — its rows stay in each shard's SQLite, unreachable through the schema; export the shard first if the data must be kept`,table:o,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const o=t.jurisdiction??"(none)",r=e.jurisdiction??"(none)";n.push({remediation:"rehome",scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${o} to ${r} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:n}},Y=t=>Object.entries(t.fields).map(([e,n])=>({name:e,optional:n.optional,ref:Object.values(t.relations).find(i=>i.field===e&&i.kind==="one")?.table,type:x(n)})),z=(t,e,n)=>{const i={},o=e?.fields??{},r=n?.fields??{};for(const[s,a]of Object.entries(r)){const d=o[s];d===void 0?i[s]=e===void 0?"unchanged":"added":i[s]=N(t,s,d,a).length===0?"unchanged":"changed"}for(const s of Object.keys(o))r[s]===void 0&&(i[s]="removed");return i},Me=(t,e)=>{const{changes:n}=Te(t,e),i=new Set(n.filter(s=>s.scope==="table"&&s.table!==void 0).map(s=>s.table)),o=[],r=(s,a)=>s?"added":i.has(a)?"changed":"context";for(const[s,a]of Object.entries(e.tables)){const d=t?.tables[s],m=r(d===void 0,s);o.push({columns:Y(a),fieldStatus:z(s,d,a),name:s,shardMode:a.shardMode,status:m})}for(const[s,a]of Object.entries(t?.tables??{}))e.tables[s]===void 0&&o.push({columns:Y(a),fieldStatus:z(s,a,void 0),name:s,shardMode:a.shardMode,status:"removed"});return o.sort((s,a)=>s.name.localeCompare(a.name)),{breakingCount:n.filter(s=>s.severity==="breaking").length,changes:n,tables:o}},X=t=>{const e=fe(t);return e.status==="ok"?e.snapshot:void 0},qe={added:"ring-2 ring-emerald-500/60",changed:"ring-2 ring-amber-500/70",context:"opacity-55",removed:"opacity-70 ring-2 ring-destructive/60"},Ce=t=>t==="global"||t.startsWith("global:")?"global":"shard",Ie=t=>{const e=R(24),{appliedAt:n,hash:i,onSelect:o,selected:r,seq:s}=t,a=r?"border-s-primary bg-accent/60 text-foreground":"border-s-transparent text-muted-foreground hover:bg-accent/30 hover:text-foreground";let d;e[0]!==a?(d=M("flex w-full flex-col items-start gap-1 border-s-2 px-4 py-3 text-start outline-none transition-colors",a),e[0]=a,e[1]=d):d=e[1];const m=`sh-version-${i}`;let f;e[2]!==i||e[3]!==o?(f=()=>{o(i)},e[2]=i,e[3]=o,e[4]=f):f=e[4];let u;e[5]!==s?(u=y("span",{className:"font-mono text-[13px] tabular-nums",children:["v",s]}),e[5]=s,e[6]=u):u=e[6];let g;e[7]!==i?(g=i.slice(0,7),e[7]=i,e[8]=g):g=e[8];let p;e[9]!==g?(p=l("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:g}),e[9]=g,e[10]=p):p=e[10];let h;e[11]!==u||e[12]!==p?(h=y("span",{className:"flex w-full items-baseline gap-2",children:[u,p]}),e[11]=u,e[12]=p,e[13]=h):h=e[13];let b;e[14]!==n?(b=de(n),e[14]=n,e[15]=b):b=e[15];let v;e[16]!==b?(v=l("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:b}),e[16]=b,e[17]=v):v=e[17];let k;return e[18]!==v||e[19]!==d||e[20]!==m||e[21]!==f||e[22]!==h?(k=l("li",{children:y("button",{className:d,"data-testid":m,onClick:f,type:"button",children:[h,v]})}),e[18]=v,e[19]=d,e[20]=m,e[21]=f,e[22]=h,e[23]=k):k=e[23],k},Re=t=>{const e=R(26),{breaking:n,count:i,first:o}=t,r=P();if(o){let p;e[0]!==i?(p=l("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:i}),e[0]=i,e[1]=p):p=e[1];let h;e[2]!==r?(h=r("tables"),e[2]=r,e[3]=h):h=e[3];let b;e[4]!==h?(b=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:h}),e[4]=h,e[5]=b):b=e[5];let v;return e[6]!==p||e[7]!==b?(v=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[p,b]}),e[6]=p,e[7]=b,e[8]=v):v=e[8],v}const s=n>0&&"text-destructive";let a;e[9]!==s?(a=M("text-3xl leading-none font-light tracking-tight tabular-nums",s),e[9]=s,e[10]=a):a=e[10];let d;e[11]!==i||e[12]!==a?(d=l("span",{className:a,children:i}),e[11]=i,e[12]=a,e[13]=d):d=e[13];let m;e[14]!==i||e[15]!==r?(m=r(i===1?"change":"changes"),e[14]=i,e[15]=r,e[16]=m):m=e[16];let f;e[17]!==m?(f=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:m}),e[17]=m,e[18]=f):f=e[18];let u;e[19]!==n||e[20]!==r?(u=n>0&&y("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",r("{count} breaking",{count:n})]}),e[19]=n,e[20]=r,e[21]=u):u=e[21];let g;return e[22]!==d||e[23]!==f||e[24]!==u?(g=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[d,f,u]}),e[22]=d,e[23]=f,e[24]=u,e[25]=g):g=e[25],g},ee={addedFieldConstraint:{action:"added",kind:"constraint"},addedIndex:{action:"added",kind:"index"},addedOptionalField:{action:"added",kind:"field?"},addedRelation:{action:"added",kind:"relation"},addedRequiredField:{action:"added",kind:"field"},addedTable:{action:"added",kind:"table"},changedCommitOrdering:{action:"changed",kind:"commit ordering"},changedFieldKind:{action:"changed",kind:"field kind"},changedFieldShape:{action:"changed",kind:"field shape"},changedIndex:{action:"changed",kind:"index"},changedJurisdiction:{action:"changed",kind:"jurisdiction"},changedMemoryMode:{action:"changed",kind:"memory mode"},changedShardMode:{action:"changed",kind:"shard mode"},changedTtlPolicy:{action:"changed",kind:"TTL policy"},fieldOptionalToRequired:{action:"changed",kind:"field → required"},fieldRequiredToOptional:{action:"changed",kind:"field → optional"},relaxedFieldConstraint:{action:"removed",kind:"constraint"},removedField:{action:"removed",kind:"field"},removedIndex:{action:"removed",kind:"index"},removedRelation:{action:"removed",kind:"relation"},removedTable:{action:"removed",kind:"table"},widenedFieldShape:{action:"changed",kind:"field → wider"}},Ee=(t,e)=>{const n=`${ee[t.type].action} ${e} `;return t.summary.startsWith(n)?t.summary.slice(n.length):t.summary},Ae=t=>{const e=new Map;for(const i of t){const o=i.table??"",r=e.get(o);r===void 0?e.set(o,[i]):r.push(i)}const n=[...e].map(([i,o])=>({changes:o,table:i}));return[...n.filter(i=>i.table!==""),...n.filter(i=>i.table==="")]},De=t=>{const e=R(2),{children:n}=t;let i;return e[0]!==n?(i=l("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:n}),e[0]=n,e[1]=i):i=e[1],i},Le=({pane:t,shardKey:e=""})=>{const n=P(),i=oe(),r=se({strict:!1}).version,s=c=>{ce(i({search:{version:c},to:"/migrations"}))},a=D(L.schemaHistory,{},{shardKey:e}),d=a.data?.versions??[],m=r!==void 0&&d.some(c=>c.hash===r)?r:d[0]?.hash,f=d.findIndex(c=>c.hash===m),u=f===-1?void 0:d[f+1]?.hash,g=D(L.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),p=D(L.schemaVersion,{hash:u??""},{enabled:u!==void 0,shardKey:e}),h=A(()=>{const c=X(g.data?.version?.snapshotJson);if(c!==void 0)return Me(X(p.data?.version?.snapshotJson),c)},[g.data,p.data]),b=A(()=>(h?.tables??[]).map(c=>({columns:c.columns,name:c.name,tier:Ce(c.shardMode)})),[h]),v=A(()=>{const c={};for(const j of h?.tables??[])c[j.name]=qe[j.status];return c},[h]);if(a.error!==null)return l(re,{error:a.errorSource,testId:"sh-error"});if(d.length===0)return l(ae,{description:n("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:n("No schema versions recorded yet.")});const k=h?.changes??[];return y("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[y("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[l(De,{children:n("Schema versions")}),l("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:d.map(c=>l(Ie,{appliedAt:c.appliedAt,hash:c.hash,onSelect:s,selected:c.hash===m,seq:c.seq},c.hash))})]}),y("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[l(Re,{breaking:h?.breakingCount??0,count:u===void 0?b.length:k.length,first:u===void 0}),t==="diagram"?l("div",{className:"flex min-h-0 flex-1 flex-col",children:l(le,{fill:!0,nodeClasses:v,tables:b,testIdPrefix:"sh"})}):l("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:Ae(k).map(c=>{const j=(h?.tables??[]).find($=>$.name===c.table);return y("section",{className:"mb-6",children:[y("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[l("span",{className:"font-mono text-[13px] text-foreground",children:c.table===""?n("schema"):c.table}),j!==void 0&&l("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:n("{count} columns",{count:j.columns.length})}),c.changes.length>1&&l("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:c.changes.length})]}),l("ul",{children:c.changes.map($=>{const{action:te,kind:_}=ee[$.type],E=$.severity==="breaking",H=Ee($,_);return y("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[l("span",{"aria-hidden":"true",className:M("-ms-3 h-3 w-0.5 shrink-0 self-center",E?"bg-destructive":"bg-transparent")}),y("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[n(te)," ",_]}),H!==c.table&&l("span",{className:M("min-w-0 font-mono text-[13px]",E?"text-destructive":"text-foreground"),children:H}),E&&l("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:n("breaking")})]},`${$.type}-${$.summary}`)})})]},c.table)})})]})]})},Je=t=>M("-mb-px border-b-2 px-3 py-2.5 font-mono text-[11px] tracking-wider uppercase transition-colors outline-none","hover:bg-accent/40 focus-visible:bg-accent/40",t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),Ze=t=>{const e=R(11),{initialShardKey:n}=t,i=P(),[o,r]=ne("diagram");let s;e[0]!==o?(s=(u,g,p,h)=>y("button",{"aria-selected":o===u,className:Je(o===u),"data-testid":p,onClick:()=>{r(u)},role:"tab",type:"button",children:[g,h!==void 0&&l("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:h})]}),e[0]=o,e[1]=s):s=e[1];const a=s;let d;e[2]!==i||e[3]!==a?(d=y("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[a("diagram",i("Diagram"),"mg-pane-diagram"),a("changes",i("Changes"),"mg-pane-changes"),a("data",i("Data migrations"),"mg-pane-data")]}),e[2]=i,e[3]=a,e[4]=d):d=e[4];let m;e[5]!==n||e[6]!==o?(m=l("div",{className:"flex min-h-0 flex-1 flex-col",children:o==="data"?l("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:l(ie,{initialShardKey:n})}):l(Le,{pane:o,shardKey:n})}),e[5]=n,e[6]=o,e[7]=m):m=e[7];let f;return e[8]!==d||e[9]!==m?(f=y("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[d,m]}),e[8]=d,e[9]=m,e[10]=f):f=e[10],f};export{Ze as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{decodeDocument as D}from"@lunora/wire";import{E as F}from"../packem_shared/error-alert-
|
|
1
|
+
import{decodeDocument as D}from"@lunora/wire";import{E as F}from"../packem_shared/error-alert-DKXm5h19.mjs";import{B as E}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as x,a as A}from"../packem_shared/card-By2O8ULa.mjs";import{E as I}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as P,a as V,b as g,c as m,d as C,e as o}from"../packem_shared/table-D0SBiDu-.mjs";import{u as h}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{useAutoRefresh as H}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-Py5Yx7rP.mjs";import{u as M}from"../packem_shared/home-panel-5fGktYeD.mjs";import{useT as U}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as b}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{h as B}from"../packem_shared/internal-hIuTpSbx.mjs";import{jsx as e,jsxs as d}from"react/jsx-runtime";const T="payment_subscriptions",R="payment_events",k=[T,R],G={},N=new Set(["active","trialing"]),Y=new Set(["past_due","unpaid"]),a=(n,r)=>{if(n[r]!==void 0)return n[r];const p=n.__doc__;return typeof p=="string"?D(p)?.[r]:void 0},s=n=>typeof n=="string"?n:typeof n=="number"||typeof n=="bigint"||typeof n=="boolean"?String(n):"",q=n=>N.has(n)?"default":Y.has(n)?"destructive":"outline",oe=({limit:n=100})=>{const r=U(),p=M(),{data:y}=h(b.listTables,G,{live:!0}),_=y!==void 0,w=Array.isArray(y)&&k.every(t=>y.some(c=>c.name===t)),l=p.payments&&w,i=h(b.readTablePage,{filters:[],limit:n,offset:0,orderBy:{column:"updatedAt",direction:"desc"},search:"",table:T},{enabled:l}),u=h(b.readTablePage,{filters:[],limit:25,offset:0,orderBy:{column:"processedAt",direction:"desc"},search:"",table:R},{enabled:l}),v=h(b.facetColumn,{column:"state",table:T},{enabled:l});H(()=>{if(l)return Promise.all([i.poll(),u.poll(),v.poll()])},!0);const f=i.data?.rows??[],L=u.data?.rows??[],O=i.error??u.error,Q=i.error===null?u.errorSource:i.errorSource,j=i.data?.total??f.length,S=v.data?.values===void 0?f.filter(t=>N.has(s(a(t,"state")))).length:v.data.values.reduce((t,c)=>t+(N.has(s(c.value))?c.count:0),0);return _&&!l?e("div",{className:"flex flex-col gap-4","data-testid":"payments-panel",children:e(I,{description:r("No @lunora/payment tables found in this deployment. Add `.extend(paymentExtension)` to lunora/schema.ts and wire `payment` on createShardDO() to sync customers and subscriptions."),testId:"payments-unconfigured",title:r("No payments configured")})}):d("div",{className:"flex flex-col gap-4","data-testid":"payments-panel",children:[e("div",{className:"flex items-center gap-2","data-testid":"payments-summary",children:d(x,{className:"justify-between gap-0 py-0",children:[d("div",{className:"flex flex-col gap-2.5 p-4",children:[e("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Subscriptions")}),d("div",{className:"flex items-center gap-2",children:[e("span",{className:"text-2xl font-semibold tabular-nums text-foreground",children:S}),e(E,{variant:"default",children:r("{count} active",{count:S})})]})]}),e("div",{className:"border-t border-border bg-muted/50 px-4 py-2.5 text-[11px] text-muted-foreground",children:r("{total} total",{total:j})})]})}),O===null?void 0:e(F,{error:Q}),f.length===0&&!i.isLoading?e(I,{testId:"payments-empty",title:r("No subscriptions yet")}):e(x,{className:"overflow-hidden py-0",children:e(A,{className:"px-0",children:d(P,{children:[e(V,{children:d(g,{children:[e(m,{children:r("Provider")}),e(m,{children:r("Reference")}),e(m,{children:r("Plan")}),e(m,{children:r("State")}),e(m,{children:r("Renews")})]})}),e(C,{children:f.map(t=>{const c=s(a(t,"state"));return d(g,{"data-testid":"payment-subscription-row",children:[e(o,{children:s(a(t,"provider"))}),e(o,{children:s(a(t,"referenceId"))}),e(o,{children:s(a(t,"priceId"))}),e(o,{children:e(E,{variant:q(c),children:c})}),e(o,{children:B(a(t,"currentPeriodEnd"))})]},s(a(t,"providerSubscriptionId")))})})]})})}),d(x,{className:"overflow-hidden py-0",children:[e("header",{className:"border-b border-border px-4 py-3",children:e("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Recent webhook events")})}),e(A,{className:"px-0",children:e(P,{children:e(C,{children:L.map(t=>d(g,{"data-testid":"payment-event-row",children:[e(o,{children:s(a(t,"provider"))}),e(o,{className:"font-medium",children:s(a(t,"type"))}),e(o,{className:"text-muted-foreground",children:s(a(t,"providerEventId"))}),e(o,{children:B(a(t,"processedAt"))})]},s(a(t,"providerEventId"))))})})})]})]})};export{oe as PaymentsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useState as b,useRef as oe,useEffect as ie}from"react";import{c as xe,d as ge,b as be,a as fe,C as me}from"../packem_shared/card-By2O8ULa.mjs";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{c as te}from"react/compiler-runtime";import{E as ye}from"../packem_shared/error-alert-C0R39DO1.mjs";import{L as ve}from"../packem_shared/live-status-D1GasNsH.mjs";import{B as Q}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as j}from"../packem_shared/button-q0UYSmrn.mjs";import{E as pe}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as Ne,a as ke,b as ne,c as ae,d as Ce,e as se}from"../packem_shared/table-D0SBiDu-.mjs";import{u as le}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{ADMIN_FUNCTIONS as ee}from"../packem_shared/ADMIN_FUNCTIONS-4aGsMs95.mjs";import{jsxs as u,jsx as s}from"react/jsx-runtime";import{decodeWire as Se}from"@lunora/wire";import{ConfirmButton as we}from"../packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{ShardInput as Pe}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{I as Y}from"../packem_shared/input-CXhxesPC.mjs";import{L as _}from"../packem_shared/label-DKFzyHq6.mjs";import{T as Ie}from"../packem_shared/textarea--40GKAyz.mjs";import{u as ue}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{d as Re,c as Te,b as Ae,f as re,k as Ee}from"../packem_shared/internal-hIuTpSbx.mjs";const ce=["read","insert","update","delete"],_e=(t,e)=>({delete:t("Delete"),insert:t("Insert"),read:t("Read"),update:t("Update")})[e],Fe=t=>t.file===""?t.procedure:`${t.file}:${t.procedure}`,Oe=t=>{const e=new Set;for(const l of t?.advisories??[])if(l.name==="rls_uncovered_table"){const{table:o}=l.metadata;typeof o=="string"&&o!==""&&e.add(o)}return e},De=(t,e,l)=>{const o=new Map,r=n=>{const i=o.get(n);if(i!==void 0)return i;const m={cells:{delete:{},insert:{},read:{},update:{}},maskedColumns:new Set,table:n,uncovered:l.has(n)};return o.set(n,m),m};for(const n of t)r(n.table).cells[n.on]={path:Fe(n),procedure:n.procedure};for(const n of e)r(n.table).maskedColumns.add(n.column);for(const n of l)r(n);return[...o.values()].toSorted((n,i)=>n.table.localeCompare(i.table))},Le=t=>{const e=te(17);let l;e[0]!==t?(l=t===void 0?{}:t,e[0]=t,e[1]=l):l=e[1];const{onProbe:o}=l,r=G();let n,i;e[2]===Symbol.for("react.memo_cache_sentinel")?(n={},i={live:!0},e[2]=n,e[3]=i):(n=e[2],i=e[3]);const m=le(ee.rlsPolicies,n,i);let a;e[4]===Symbol.for("react.memo_cache_sentinel")?(a={},e[4]=a):a=e[4];const f=le(ee.maskPolicies,a);let c;e[5]===Symbol.for("react.memo_cache_sentinel")?(c={},e[5]=c):c=e[5];const d=le(ee.getAdvisories,c);let h;if(e[6]!==d.data||e[7]!==f.data||e[8]!==o||e[9]!==m||e[10]!==r){let g=null;m.data!==void 0&&(g=Array.isArray(m.data.policies)?m.data.policies:[]);const F=Array.isArray(f.data?.columns)?f.data.columns:[],H=d.data??null,{error:w,errorSource:C,liveError:P}=m,R=g===null?[]:De(g,F,Oe(H));let k;e[12]!==P?(k=s("div",{className:"flex items-center justify-end",children:s(ve,{message:P,prefix:"pm"})}),e[12]=P,e[13]=k):k=e[13];let T;e[14]!==w||e[15]!==C?(T=w!==null&&s(ye,{error:C,testId:"pm-error"}),e[14]=w,e[15]=C,e[16]=T):T=e[16],h=u("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-matrix",children:[k,T,g!==null&&R.length===0?s(pe,{description:r("Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix."),testId:"pm-empty",title:r("No policy")}):u(Ne,{"data-testid":"pm-table",children:[s(ke,{children:u(ne,{children:[s(ae,{children:r("Table")}),ce.map(x=>s(ae,{children:_e(r,x)},x)),s(ae,{children:r("Masked columns")})]})}),s(Ce,{children:R.map(x=>u(ne,{"data-testid":`pm-row-${x.table}`,children:[s(se,{className:"font-mono text-xs",children:u("span",{className:"flex items-center gap-1.5",children:[x.table,x.uncovered&&s(Q,{"data-testid":`pm-uncovered-${x.table}`,title:r("Uncovered — reachable without a policy"),variant:"destructive",children:r("Uncovered — reachable without a policy")})]})}),ce.map(I=>{const v=x.cells[I];return s(se,{"data-testid":`pm-cell-${x.table}-${I}`,children:v.procedure===void 0?s("span",{className:"text-xs text-muted-foreground",children:r("No policy")}):u("span",{className:"flex flex-col gap-1",children:[s(Q,{variant:"secondary",children:r("Covered by {procedure}",{procedure:v.procedure})}),o!==void 0&&s(j,{className:"h-auto justify-start p-0 text-[11px]","data-testid":`pm-probe-${x.table}-${I}`,onClick:()=>{o(x.table,I,v.path??"")},size:"xs",type:"button",variant:"ghost",children:r("Probe this")})]})},I)}),s(se,{children:x.maskedColumns.size===0?s("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"}):s("span",{className:"flex flex-wrap gap-1",children:[...x.maskedColumns].map($e)})})]},x.table))})]})]}),e[6]=d.data,e[7]=f.data,e[8]=o,e[9]=m,e[10]=r,e[11]=h}else h=e[11];return h};function $e(t){return s(Q,{variant:"outline",children:t},t)}const Ue=Te(ee.runAs),We=new Set(["FORBIDDEN","RLS_REQUIRED","UNAUTHORIZED"]),Me=t=>{const e=t?.code;return typeof e=="string"?e:void 0},ze=()=>{const t=ue();return async({args:e,functionPath:l,shardKey:o="",userId:r})=>{if(r.trim()==="")return{kind:"invalid",message:"No identity to probe: enter the userId whose access you want to test."};const n=Ue;try{return{kind:"allowed",value:await t.query(n,{args:e,functionPath:l,userId:r},Re(o))}}catch(i){const m=i instanceof Error?i.message:String(i),a=Me(i);return a!==void 0&&We.has(a)?{kind:"denied",message:m}:{kind:"errored",message:m}}}},qe=t=>t===void 0?"undefined":JSON.stringify(t,Ee,2),Be=t=>{const e=te(43),{outcome:l}=t,o=G();if(l.kind==="allowed"){let a;e[0]!==o?(a=o("Allowed"),e[0]=o,e[1]=a):a=e[1];let f;e[2]!==a?(f=s(Q,{variant:"secondary",children:a}),e[2]=a,e[3]=f):f=e[3];let c;e[4]!==l.value?(c=qe(l.value),e[4]=l.value,e[5]=c):c=e[5];let d;e[6]!==c?(d=s("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-result",children:c}),e[6]=c,e[7]=d):d=e[7];let h;return e[8]!==f||e[9]!==d?(h=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-allowed",children:[f,d]}),e[8]=f,e[9]=d,e[10]=h):h=e[10],h}if(l.kind==="denied"){let a;e[11]!==o?(a=o("Denied"),e[11]=o,e[12]=a):a=e[12];let f;e[13]!==a?(f=s(Q,{variant:"destructive",children:a}),e[13]=a,e[14]=f):f=e[14];let c;e[15]!==l.message?(c=s("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:l.message}),e[15]=l.message,e[16]=c):c=e[16];let d;return e[17]!==f||e[18]!==c?(d=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-denied",children:[f,c]}),e[17]=f,e[18]=c,e[19]=d):d=e[19],d}if(l.kind==="errored"){let a;e[20]!==o?(a=o("Errored"),e[20]=o,e[21]=a):a=e[21];let f;e[22]!==a?(f=s(Q,{variant:"outline",children:a}),e[22]=a,e[23]=f):f=e[23];let c;e[24]!==o?(c=o("The call failed for a reason that is not an access verdict, so it says nothing about the policy."),e[24]=o,e[25]=c):c=e[25];let d;e[26]!==c?(d=s("p",{className:"text-sm text-muted-foreground",children:c}),e[26]=c,e[27]=d):d=e[27];let h;e[28]!==l.message?(h=s("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-errored",role:"alert",children:l.message}),e[28]=l.message,e[29]=h):h=e[29];let g;return e[30]!==f||e[31]!==d||e[32]!==h?(g=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-errored",children:[f,d,h]}),e[30]=f,e[31]=d,e[32]=h,e[33]=g):g=e[33],g}let r;e[34]!==o?(r=o("Not run"),e[34]=o,e[35]=r):r=e[35];let n;e[36]!==r?(n=s(Q,{variant:"outline",children:r}),e[36]=r,e[37]=n):n=e[37];let i;e[38]!==l.message?(i=s("p",{className:"text-sm text-muted-foreground","data-testid":"pp-invalid",role:"status",children:l.message}),e[38]=l.message,e[39]=i):i=e[39];let m;return e[40]!==n||e[41]!==i?(m=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-invalid",children:[n,i]}),e[40]=n,e[41]=i,e[42]=m):m=e[42],m},je=t=>{const e=te(17),{disabled:l,executesWrites:o,functionPath:r,onRun:n,running:i,userId:m}=t,a=G();let f;e[0]!==i||e[1]!==a?(f=a(i?"Probing…":"Run probe"),e[0]=i,e[1]=a,e[2]=f):f=e[2];const c=f;let d;e[3]!==l||e[4]!==o||e[5]!==r||e[6]!==c||e[7]!==n||e[8]!==a||e[9]!==m?(d=o?s(we,{confirmLabel:a("This will execute `{functionPath}` as user `{userId}`.",{functionPath:r,userId:m}),disabled:l,onConfirm:n,testId:"pp-run",children:c}):s(j,{"data-testid":"pp-run",disabled:l,onClick:n,type:"button",children:c}),e[3]=l,e[4]=o,e[5]=r,e[6]=c,e[7]=n,e[8]=a,e[9]=m,e[10]=d):d=e[10];let h;e[11]!==a||e[12]!==m?(h=m!==""&&s(Q,{"data-testid":"pp-as-badge",variant:"secondary",children:a("as {userId}",{userId:m})}),e[11]=a,e[12]=m,e[13]=h):h=e[13];let g;return e[14]!==d||e[15]!==h?(g=u("div",{className:"flex items-center gap-2",children:[d,h]}),e[14]=d,e[15]=h,e[16]=g):g=e[16],g},Qe=({functions:t,prefill:e,runAsIdentity:l=!1}={})=>{const o=ue(),r=G(),n=ze(),[i,m]=b(null),[a,f]=b(null),c=t??i??[],[d,h]=b(""),[g,F]=b("{}"),[H,w]=b(""),[C,P]=b(""),[R,k]=b(!1),[T,x]=b(null),[I,v]=b(null),[A,O]=b(!1),E=oe(-1),S=oe(0);ie(()=>{if(t!==void 0)return;let p=!1;return o.listFunctions().then(N=>(p||m(N),N)).catch(N=>{p||f(Ae(N))}),()=>{p=!0}},[o,t]),ie(()=>{if(e===void 0||E.current===e.nonce)return;E.current=e.nonce,S.current+=1;const p=e.functionPath;queueMicrotask(()=>{h(p),x(null)})},[e]);const J=A?c:c.filter(p=>p.kind==="query"||p.path===d),y=d===""?J[0]?.path??"":d,D=c.find(p=>p.path===y),K=y!==""&&D?.kind!=="query",L=async()=>{if(y==="")return;let p;try{p=g.trim()===""?{}:Se(JSON.parse(g))}catch(B){v(r("Invalid JSON args: {message}",{message:B.message})),x(null);return}S.current+=1;const N=S.current;v(null),k(!0);try{const B=await n({args:p,functionPath:y,shardKey:H.trim(),userId:C.trim()});N===S.current&&x(B)}finally{k(!1)}},$=()=>{re(L())},U=p=>{h(p.target.value)},W=p=>{F(p.target.value)},M=p=>{P(p.target.value)},z=p=>{O(p.target.checked),!p.target.checked&&K&&h("")},q=!l||R||y==="";return u("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-playground",children:[a!==null&&s("p",{className:"text-sm text-destructive","data-testid":"pp-discover-error",role:"alert",children:a}),!l&&s(pe,{description:r("Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS."),testId:"pp-gate",title:r("Set `runAsIdentity` to forge an identity and probe access.")}),u("div",{className:"flex flex-col gap-3 rounded-md border border-border p-3",children:[u("div",{className:"flex flex-col gap-1.5",children:[s(_,{htmlFor:"pp-function",children:r("Function")}),s("select",{"aria-label":r("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:U,value:y,children:J.map(p=>u("option",{value:p.path,children:[p.path," (",p.kind,")"]},p.path))}),u(_,{className:"flex items-center gap-1.5 text-xs font-normal",htmlFor:"pp-include-writes",children:[s("input",{checked:A,className:"size-4 accent-primary","data-testid":"pp-include-writes",id:"pp-include-writes",onChange:z,type:"checkbox"}),r("Include mutations and actions")]})]}),u("div",{className:"flex flex-col gap-1.5",children:[s(_,{htmlFor:"pp-args",children:r("Arguments")}),s(Ie,{"aria-label":r("Arguments"),className:"font-mono text-xs","data-testid":"pp-args",id:"pp-args",onChange:W,value:g})]}),s(Pe,{onChange:w,testId:"pp-shard",value:H}),u("div",{className:"flex flex-col gap-1.5",children:[s(_,{htmlFor:"pp-user",children:r("Run as (userId)")}),s(Y,{"aria-label":r("Identity (userId) to run as"),className:"font-mono text-xs","data-testid":"pp-user",id:"pp-user",onChange:M,placeholder:r("Required — the identity to probe as"),value:C})]}),s(je,{disabled:q,executesWrites:K,functionPath:y,onRun:$,running:R,userId:C.trim()})]}),I!==null&&s("p",{className:"text-sm text-destructive","data-testid":"pp-args-error",role:"alert",children:I}),T!==null&&s(Be,{outcome:T})]})},He="/__lunora/policy-scaffold",Je={"already-wired":"That procedure already has an rls(...) policy wired in.","file-exists":"A policy file with that name already exists — 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({…}) form — convert it to the builder form (c.use(…).query(…)) before wiring RLS."},Ke=async t=>{const e=await fetch(He,{body:JSON.stringify(t),headers:{"Content-Type":"application/json"},method:"POST"}),l=await e.json();if(l.needsManualEdit===!0)return{kind:"needs-manual-edit",message:l.message??"This change must be made by hand."};if(e.ok)return{diagnostics:l.diagnostics??[],kind:"ok",label:l.fileName??l.exportName??""};const o=l.error;return{kind:"error",message:o===void 0?`policy scaffold failed (${String(e.status)})`:Je[o]??o}},de={exportName:"",filePath:"",policyName:"",policies:"",tableName:""},Ve=()=>{const t=te(69),e=G(),[l,o]=b(null),[r,n]=b(!1),[i,m]=b(null),[a,f]=b(de);let c;t[0]===Symbol.for("react.memo_cache_sentinel")?(c=X=>{const V=X.target.name,{value:Z}=X.target;f(he=>({...he,[V]:Z}))},t[0]=c):c=t[0];const d=c;let h;t[1]===Symbol.for("react.memo_cache_sentinel")?(h=()=>{o(null),f(de)},t[1]=h):h=t[1];const g=h;let F;t[2]===Symbol.for("react.memo_cache_sentinel")?(F=async X=>{n(!0),m(null);try{const V=await Ke(X);m(V),V.kind==="ok"&&g()}catch(V){const Z=V;m({kind:"error",message:Z instanceof Error?Z.message:String(Z)})}n(!1)},t[2]=F):F=t[2];const H=F;let w;t[3]!==a.policyName||t[4]!==a.tableName?(w=()=>{re(H({kind:"scaffoldPolicy",name:a.policyName.trim(),table:a.tableName.trim()}))},t[3]=a.policyName,t[4]=a.tableName,t[5]=w):w=t[5];const C=w;let P;t[6]!==a.exportName||t[7]!==a.filePath||t[8]!==a.policies?(P=()=>{re(H({exportName:a.exportName.trim(),filePath:a.filePath.trim(),kind:"wireRls",policies:a.policies.trim()}))},t[6]=a.exportName,t[7]=a.filePath,t[8]=a.policies,t[9]=P):P=t[9];const R=P;let k;t[10]===Symbol.for("react.memo_cache_sentinel")?(k=()=>{m(null),o("scaffold")},t[10]=k):k=t[10];const T=k;let x;t[11]===Symbol.for("react.memo_cache_sentinel")?(x=()=>{m(null),o("wire")},t[11]=x):x=t[11];const I=x;let v;t[12]!==e?(v=e("Scaffold access rules"),t[12]=e,t[13]=v):v=t[13];let A;t[14]!==v?(A=s(xe,{children:v}),t[14]=v,t[15]=A):A=t[15];let O;t[16]!==e?(O=e("Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only."),t[16]=e,t[17]=O):O=t[17];let E;t[18]!==O?(E=s(ge,{children:O}),t[18]=O,t[19]=E):E=t[19];let S;t[20]!==E||t[21]!==A?(S=u(be,{children:[A,E]}),t[20]=E,t[21]=A,t[22]=S):S=t[22];const J=l==="scaffold"?"default":"outline";let y;t[23]!==e?(y=e("New policy file"),t[23]=e,t[24]=y):y=t[24];let D;t[25]!==J||t[26]!==y?(D=s(j,{"data-testid":"policy-scaffolder-new",onClick:T,size:"xs",type:"button",variant:J,children:y}),t[25]=J,t[26]=y,t[27]=D):D=t[27];const K=l==="wire"?"default":"outline";let L;t[28]!==e?(L=e("Wire into a procedure"),t[28]=e,t[29]=L):L=t[29];let $;t[30]!==K||t[31]!==L?($=s(j,{"data-testid":"policy-scaffolder-wire",onClick:I,size:"xs",type:"button",variant:K,children:L}),t[30]=K,t[31]=L,t[32]=$):$=t[32];let U;t[33]!==D||t[34]!==$?(U=u("div",{className:"flex flex-wrap gap-2",children:[D,$]}),t[33]=D,t[34]=$,t[35]=U):U=t[35];let W;t[36]!==r||t[37]!==a.policyName||t[38]!==a.tableName||t[39]!==l||t[40]!==C||t[41]!==e?(W=l==="scaffold"&&u("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-new-form",children:[u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-name",children:e("Policy name")}),s(Y,{"data-testid":"policy-scaffolder-name",id:"policy-scaffolder-name",name:"policyName",onChange:d,value:a.policyName})]}),u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-table",children:e("Table name")}),s(Y,{"data-testid":"policy-scaffolder-table",id:"policy-scaffolder-table",name:"tableName",onChange:d,value:a.tableName})]}),s(j,{"data-testid":"policy-scaffolder-create",disabled:r||a.policyName.trim()===""||a.tableName.trim()==="",onClick:C,size:"xs",type:"button",children:e(r?"Creating…":"Create policy file")}),s(j,{onClick:g,size:"xs",type:"button",variant:"ghost",children:e("Cancel")})]}),t[36]=r,t[37]=a.policyName,t[38]=a.tableName,t[39]=l,t[40]=C,t[41]=e,t[42]=W):W=t[42];let M;t[43]!==r||t[44]!==a.exportName||t[45]!==a.filePath||t[46]!==a.policies||t[47]!==l||t[48]!==R||t[49]!==e?(M=l==="wire"&&u("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-wire-form",children:[u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-file",children:e("Procedure file path")}),s(Y,{"data-testid":"policy-scaffolder-file",id:"policy-scaffolder-file",name:"filePath",onChange:d,value:a.filePath})]}),u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-export",children:e("Exported procedure")}),s(Y,{"data-testid":"policy-scaffolder-export",id:"policy-scaffolder-export",name:"exportName",onChange:d,value:a.exportName})]}),u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-policies",children:e("Policy set identifier")}),s(Y,{"data-testid":"policy-scaffolder-policies",id:"policy-scaffolder-policies",name:"policies",onChange:d,value:a.policies})]}),s(j,{"data-testid":"policy-scaffolder-apply",disabled:r||a.filePath.trim()===""||a.exportName.trim()===""||a.policies.trim()==="",onClick:R,size:"xs",type:"button",children:e(r?"Wiring…":"Wire RLS")}),s(j,{onClick:g,size:"xs",type:"button",variant:"ghost",children:e("Cancel")})]}),t[43]=r,t[44]=a.exportName,t[45]=a.filePath,t[46]=a.policies,t[47]=l,t[48]=R,t[49]=e,t[50]=M):M=t[50];let z;t[51]!==i?(z=i?.kind==="error"&&s("p",{className:"mt-3 text-sm text-destructive","data-testid":"policy-scaffolder-error",role:"alert",children:i.message}),t[51]=i,t[52]=z):z=t[52];let q;t[53]!==i?.kind||t[54]!==e?(q=i?.kind==="needs-manual-edit"&&s("p",{className:"mt-3 text-sm text-amber-600 dark:text-amber-500","data-testid":"policy-scaffolder-manual",role:"alert",children:e("This change must be made by hand — the scaffolder only adds new, deny-by-default rules.")}),t[53]=i?.kind,t[54]=e,t[55]=q):q=t[55];let p;t[56]!==i||t[57]!==e?(p=i?.kind==="ok"&&u("div",{className:"mt-3 flex flex-col gap-1","data-testid":"policy-scaffolder-ok",children:[s("p",{className:"text-sm text-emerald-600 dark:text-emerald-500",children:e("Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.",{label:i.label})}),i.diagnostics.length>0&&s("ul",{className:"flex flex-col gap-0.5","data-testid":"policy-scaffolder-diagnostics",children:i.diagnostics.map(Ye)})]}),t[56]=i,t[57]=e,t[58]=p):p=t[58];let N;t[59]!==U||t[60]!==W||t[61]!==M||t[62]!==z||t[63]!==q||t[64]!==p?(N=u(fe,{children:[U,W,M,z,q,p]}),t[59]=U,t[60]=W,t[61]=M,t[62]=z,t[63]=q,t[64]=p,t[65]=N):N=t[65];let B;return t[66]!==S||t[67]!==N?(B=u(me,{"data-testid":"policy-scaffolder",size:"sm",children:[S,N]}),t[66]=S,t[67]=N,t[68]=B):B=t[68],B};function Ye(t){return s("li",{className:"font-mono text-[11px] text-destructive",children:t},t)}const bt=({functions:t,runAsIdentity:e=!1,schemaEditable:l=!1}={})=>{const o=G(),[r,n]=b(void 0),i=(m,a,f)=>{f!==""&&n(c=>({functionPath:f,nonce:(c?.nonce??0)+1}))};return u("div",{className:"flex flex-col gap-8","data-testid":"lunora-permissions",children:[u("section",{className:"flex flex-col gap-3",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:o("Permissions")})}),s(Le,{onProbe:i})]}),s("section",{className:"flex flex-col gap-3",children:u(me,{className:"gap-0 py-0",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:o("Probe")})}),u(fe,{className:"px-4 py-4",children:[s("p",{className:"mb-3 text-sm text-muted-foreground",children:o("Pick a function and an identity, then run it to see the access outcome.")}),s(Qe,{functions:t,prefill:r,runAsIdentity:e})]})]})}),l&&s("section",{className:"flex flex-col gap-2",children:s(Ve,{})})]})};export{bt as PermissionsPanel};
|
|
1
|
+
import{useState as b,useRef as oe,useEffect as ie}from"react";import{c as xe,d as ge,b as be,a as fe,C as me}from"../packem_shared/card-By2O8ULa.mjs";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{c as te}from"react/compiler-runtime";import{E as ye}from"../packem_shared/error-alert-DKXm5h19.mjs";import{L as ve}from"../packem_shared/live-status-D1GasNsH.mjs";import{B as Q}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as j}from"../packem_shared/button-q0UYSmrn.mjs";import{E as pe}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as Ne,a as ke,b as ne,c as ae,d as Ce,e as se}from"../packem_shared/table-D0SBiDu-.mjs";import{u as le}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{ADMIN_FUNCTIONS as ee}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{jsxs as u,jsx as s}from"react/jsx-runtime";import{decodeWire as Se}from"@lunora/wire";import{ConfirmButton as we}from"../packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{ShardInput as Pe}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{I as Y}from"../packem_shared/input-CXhxesPC.mjs";import{L as _}from"../packem_shared/label-DKFzyHq6.mjs";import{T as Ie}from"../packem_shared/textarea--40GKAyz.mjs";import{u as ue}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{d as Re,c as Te,b as Ae,f as re,k as Ee}from"../packem_shared/internal-hIuTpSbx.mjs";const ce=["read","insert","update","delete"],_e=(t,e)=>({delete:t("Delete"),insert:t("Insert"),read:t("Read"),update:t("Update")})[e],Fe=t=>t.file===""?t.procedure:`${t.file}:${t.procedure}`,Oe=t=>{const e=new Set;for(const l of t?.advisories??[])if(l.name==="rls_uncovered_table"){const{table:o}=l.metadata;typeof o=="string"&&o!==""&&e.add(o)}return e},De=(t,e,l)=>{const o=new Map,r=n=>{const i=o.get(n);if(i!==void 0)return i;const m={cells:{delete:{},insert:{},read:{},update:{}},maskedColumns:new Set,table:n,uncovered:l.has(n)};return o.set(n,m),m};for(const n of t)r(n.table).cells[n.on]={path:Fe(n),procedure:n.procedure};for(const n of e)r(n.table).maskedColumns.add(n.column);for(const n of l)r(n);return[...o.values()].toSorted((n,i)=>n.table.localeCompare(i.table))},Le=t=>{const e=te(17);let l;e[0]!==t?(l=t===void 0?{}:t,e[0]=t,e[1]=l):l=e[1];const{onProbe:o}=l,r=G();let n,i;e[2]===Symbol.for("react.memo_cache_sentinel")?(n={},i={live:!0},e[2]=n,e[3]=i):(n=e[2],i=e[3]);const m=le(ee.rlsPolicies,n,i);let a;e[4]===Symbol.for("react.memo_cache_sentinel")?(a={},e[4]=a):a=e[4];const f=le(ee.maskPolicies,a);let c;e[5]===Symbol.for("react.memo_cache_sentinel")?(c={},e[5]=c):c=e[5];const d=le(ee.getAdvisories,c);let h;if(e[6]!==d.data||e[7]!==f.data||e[8]!==o||e[9]!==m||e[10]!==r){let g=null;m.data!==void 0&&(g=Array.isArray(m.data.policies)?m.data.policies:[]);const F=Array.isArray(f.data?.columns)?f.data.columns:[],H=d.data??null,{error:w,errorSource:C,liveError:P}=m,R=g===null?[]:De(g,F,Oe(H));let k;e[12]!==P?(k=s("div",{className:"flex items-center justify-end",children:s(ve,{message:P,prefix:"pm"})}),e[12]=P,e[13]=k):k=e[13];let T;e[14]!==w||e[15]!==C?(T=w!==null&&s(ye,{error:C,testId:"pm-error"}),e[14]=w,e[15]=C,e[16]=T):T=e[16],h=u("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-matrix",children:[k,T,g!==null&&R.length===0?s(pe,{description:r("Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix."),testId:"pm-empty",title:r("No policy")}):u(Ne,{"data-testid":"pm-table",children:[s(ke,{children:u(ne,{children:[s(ae,{children:r("Table")}),ce.map(x=>s(ae,{children:_e(r,x)},x)),s(ae,{children:r("Masked columns")})]})}),s(Ce,{children:R.map(x=>u(ne,{"data-testid":`pm-row-${x.table}`,children:[s(se,{className:"font-mono text-xs",children:u("span",{className:"flex items-center gap-1.5",children:[x.table,x.uncovered&&s(Q,{"data-testid":`pm-uncovered-${x.table}`,title:r("Uncovered — reachable without a policy"),variant:"destructive",children:r("Uncovered — reachable without a policy")})]})}),ce.map(I=>{const v=x.cells[I];return s(se,{"data-testid":`pm-cell-${x.table}-${I}`,children:v.procedure===void 0?s("span",{className:"text-xs text-muted-foreground",children:r("No policy")}):u("span",{className:"flex flex-col gap-1",children:[s(Q,{variant:"secondary",children:r("Covered by {procedure}",{procedure:v.procedure})}),o!==void 0&&s(j,{className:"h-auto justify-start p-0 text-[11px]","data-testid":`pm-probe-${x.table}-${I}`,onClick:()=>{o(x.table,I,v.path??"")},size:"xs",type:"button",variant:"ghost",children:r("Probe this")})]})},I)}),s(se,{children:x.maskedColumns.size===0?s("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"}):s("span",{className:"flex flex-wrap gap-1",children:[...x.maskedColumns].map($e)})})]},x.table))})]})]}),e[6]=d.data,e[7]=f.data,e[8]=o,e[9]=m,e[10]=r,e[11]=h}else h=e[11];return h};function $e(t){return s(Q,{variant:"outline",children:t},t)}const Ue=Te(ee.runAs),We=new Set(["FORBIDDEN","RLS_REQUIRED","UNAUTHORIZED"]),Me=t=>{const e=t?.code;return typeof e=="string"?e:void 0},ze=()=>{const t=ue();return async({args:e,functionPath:l,shardKey:o="",userId:r})=>{if(r.trim()==="")return{kind:"invalid",message:"No identity to probe: enter the userId whose access you want to test."};const n=Ue;try{return{kind:"allowed",value:await t.query(n,{args:e,functionPath:l,userId:r},Re(o))}}catch(i){const m=i instanceof Error?i.message:String(i),a=Me(i);return a!==void 0&&We.has(a)?{kind:"denied",message:m}:{kind:"errored",message:m}}}},qe=t=>t===void 0?"undefined":JSON.stringify(t,Ee,2),Be=t=>{const e=te(43),{outcome:l}=t,o=G();if(l.kind==="allowed"){let a;e[0]!==o?(a=o("Allowed"),e[0]=o,e[1]=a):a=e[1];let f;e[2]!==a?(f=s(Q,{variant:"secondary",children:a}),e[2]=a,e[3]=f):f=e[3];let c;e[4]!==l.value?(c=qe(l.value),e[4]=l.value,e[5]=c):c=e[5];let d;e[6]!==c?(d=s("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-result",children:c}),e[6]=c,e[7]=d):d=e[7];let h;return e[8]!==f||e[9]!==d?(h=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-allowed",children:[f,d]}),e[8]=f,e[9]=d,e[10]=h):h=e[10],h}if(l.kind==="denied"){let a;e[11]!==o?(a=o("Denied"),e[11]=o,e[12]=a):a=e[12];let f;e[13]!==a?(f=s(Q,{variant:"destructive",children:a}),e[13]=a,e[14]=f):f=e[14];let c;e[15]!==l.message?(c=s("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:l.message}),e[15]=l.message,e[16]=c):c=e[16];let d;return e[17]!==f||e[18]!==c?(d=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-denied",children:[f,c]}),e[17]=f,e[18]=c,e[19]=d):d=e[19],d}if(l.kind==="errored"){let a;e[20]!==o?(a=o("Errored"),e[20]=o,e[21]=a):a=e[21];let f;e[22]!==a?(f=s(Q,{variant:"outline",children:a}),e[22]=a,e[23]=f):f=e[23];let c;e[24]!==o?(c=o("The call failed for a reason that is not an access verdict, so it says nothing about the policy."),e[24]=o,e[25]=c):c=e[25];let d;e[26]!==c?(d=s("p",{className:"text-sm text-muted-foreground",children:c}),e[26]=c,e[27]=d):d=e[27];let h;e[28]!==l.message?(h=s("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-errored",role:"alert",children:l.message}),e[28]=l.message,e[29]=h):h=e[29];let g;return e[30]!==f||e[31]!==d||e[32]!==h?(g=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-errored",children:[f,d,h]}),e[30]=f,e[31]=d,e[32]=h,e[33]=g):g=e[33],g}let r;e[34]!==o?(r=o("Not run"),e[34]=o,e[35]=r):r=e[35];let n;e[36]!==r?(n=s(Q,{variant:"outline",children:r}),e[36]=r,e[37]=n):n=e[37];let i;e[38]!==l.message?(i=s("p",{className:"text-sm text-muted-foreground","data-testid":"pp-invalid",role:"status",children:l.message}),e[38]=l.message,e[39]=i):i=e[39];let m;return e[40]!==n||e[41]!==i?(m=u("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-invalid",children:[n,i]}),e[40]=n,e[41]=i,e[42]=m):m=e[42],m},je=t=>{const e=te(17),{disabled:l,executesWrites:o,functionPath:r,onRun:n,running:i,userId:m}=t,a=G();let f;e[0]!==i||e[1]!==a?(f=a(i?"Probing…":"Run probe"),e[0]=i,e[1]=a,e[2]=f):f=e[2];const c=f;let d;e[3]!==l||e[4]!==o||e[5]!==r||e[6]!==c||e[7]!==n||e[8]!==a||e[9]!==m?(d=o?s(we,{confirmLabel:a("This will execute `{functionPath}` as user `{userId}`.",{functionPath:r,userId:m}),disabled:l,onConfirm:n,testId:"pp-run",children:c}):s(j,{"data-testid":"pp-run",disabled:l,onClick:n,type:"button",children:c}),e[3]=l,e[4]=o,e[5]=r,e[6]=c,e[7]=n,e[8]=a,e[9]=m,e[10]=d):d=e[10];let h;e[11]!==a||e[12]!==m?(h=m!==""&&s(Q,{"data-testid":"pp-as-badge",variant:"secondary",children:a("as {userId}",{userId:m})}),e[11]=a,e[12]=m,e[13]=h):h=e[13];let g;return e[14]!==d||e[15]!==h?(g=u("div",{className:"flex items-center gap-2",children:[d,h]}),e[14]=d,e[15]=h,e[16]=g):g=e[16],g},Qe=({functions:t,prefill:e,runAsIdentity:l=!1}={})=>{const o=ue(),r=G(),n=ze(),[i,m]=b(null),[a,f]=b(null),c=t??i??[],[d,h]=b(""),[g,F]=b("{}"),[H,w]=b(""),[C,P]=b(""),[R,k]=b(!1),[T,x]=b(null),[I,v]=b(null),[A,O]=b(!1),E=oe(-1),S=oe(0);ie(()=>{if(t!==void 0)return;let p=!1;return o.listFunctions().then(N=>(p||m(N),N)).catch(N=>{p||f(Ae(N))}),()=>{p=!0}},[o,t]),ie(()=>{if(e===void 0||E.current===e.nonce)return;E.current=e.nonce,S.current+=1;const p=e.functionPath;queueMicrotask(()=>{h(p),x(null)})},[e]);const J=A?c:c.filter(p=>p.kind==="query"||p.path===d),y=d===""?J[0]?.path??"":d,D=c.find(p=>p.path===y),K=y!==""&&D?.kind!=="query",L=async()=>{if(y==="")return;let p;try{p=g.trim()===""?{}:Se(JSON.parse(g))}catch(B){v(r("Invalid JSON args: {message}",{message:B.message})),x(null);return}S.current+=1;const N=S.current;v(null),k(!0);try{const B=await n({args:p,functionPath:y,shardKey:H.trim(),userId:C.trim()});N===S.current&&x(B)}finally{k(!1)}},$=()=>{re(L())},U=p=>{h(p.target.value)},W=p=>{F(p.target.value)},M=p=>{P(p.target.value)},z=p=>{O(p.target.checked),!p.target.checked&&K&&h("")},q=!l||R||y==="";return u("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-playground",children:[a!==null&&s("p",{className:"text-sm text-destructive","data-testid":"pp-discover-error",role:"alert",children:a}),!l&&s(pe,{description:r("Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS."),testId:"pp-gate",title:r("Set `runAsIdentity` to forge an identity and probe access.")}),u("div",{className:"flex flex-col gap-3 rounded-md border border-border p-3",children:[u("div",{className:"flex flex-col gap-1.5",children:[s(_,{htmlFor:"pp-function",children:r("Function")}),s("select",{"aria-label":r("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:U,value:y,children:J.map(p=>u("option",{value:p.path,children:[p.path," (",p.kind,")"]},p.path))}),u(_,{className:"flex items-center gap-1.5 text-xs font-normal",htmlFor:"pp-include-writes",children:[s("input",{checked:A,className:"size-4 accent-primary","data-testid":"pp-include-writes",id:"pp-include-writes",onChange:z,type:"checkbox"}),r("Include mutations and actions")]})]}),u("div",{className:"flex flex-col gap-1.5",children:[s(_,{htmlFor:"pp-args",children:r("Arguments")}),s(Ie,{"aria-label":r("Arguments"),className:"font-mono text-xs","data-testid":"pp-args",id:"pp-args",onChange:W,value:g})]}),s(Pe,{onChange:w,testId:"pp-shard",value:H}),u("div",{className:"flex flex-col gap-1.5",children:[s(_,{htmlFor:"pp-user",children:r("Run as (userId)")}),s(Y,{"aria-label":r("Identity (userId) to run as"),className:"font-mono text-xs","data-testid":"pp-user",id:"pp-user",onChange:M,placeholder:r("Required — the identity to probe as"),value:C})]}),s(je,{disabled:q,executesWrites:K,functionPath:y,onRun:$,running:R,userId:C.trim()})]}),I!==null&&s("p",{className:"text-sm text-destructive","data-testid":"pp-args-error",role:"alert",children:I}),T!==null&&s(Be,{outcome:T})]})},He="/__lunora/policy-scaffold",Je={"already-wired":"That procedure already has an rls(...) policy wired in.","file-exists":"A policy file with that name already exists — 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({…}) form — convert it to the builder form (c.use(…).query(…)) before wiring RLS."},Ke=async t=>{const e=await fetch(He,{body:JSON.stringify(t),headers:{"Content-Type":"application/json"},method:"POST"}),l=await e.json();if(l.needsManualEdit===!0)return{kind:"needs-manual-edit",message:l.message??"This change must be made by hand."};if(e.ok)return{diagnostics:l.diagnostics??[],kind:"ok",label:l.fileName??l.exportName??""};const o=l.error;return{kind:"error",message:o===void 0?`policy scaffold failed (${String(e.status)})`:Je[o]??o}},de={exportName:"",filePath:"",policyName:"",policies:"",tableName:""},Ve=()=>{const t=te(69),e=G(),[l,o]=b(null),[r,n]=b(!1),[i,m]=b(null),[a,f]=b(de);let c;t[0]===Symbol.for("react.memo_cache_sentinel")?(c=X=>{const V=X.target.name,{value:Z}=X.target;f(he=>({...he,[V]:Z}))},t[0]=c):c=t[0];const d=c;let h;t[1]===Symbol.for("react.memo_cache_sentinel")?(h=()=>{o(null),f(de)},t[1]=h):h=t[1];const g=h;let F;t[2]===Symbol.for("react.memo_cache_sentinel")?(F=async X=>{n(!0),m(null);try{const V=await Ke(X);m(V),V.kind==="ok"&&g()}catch(V){const Z=V;m({kind:"error",message:Z instanceof Error?Z.message:String(Z)})}n(!1)},t[2]=F):F=t[2];const H=F;let w;t[3]!==a.policyName||t[4]!==a.tableName?(w=()=>{re(H({kind:"scaffoldPolicy",name:a.policyName.trim(),table:a.tableName.trim()}))},t[3]=a.policyName,t[4]=a.tableName,t[5]=w):w=t[5];const C=w;let P;t[6]!==a.exportName||t[7]!==a.filePath||t[8]!==a.policies?(P=()=>{re(H({exportName:a.exportName.trim(),filePath:a.filePath.trim(),kind:"wireRls",policies:a.policies.trim()}))},t[6]=a.exportName,t[7]=a.filePath,t[8]=a.policies,t[9]=P):P=t[9];const R=P;let k;t[10]===Symbol.for("react.memo_cache_sentinel")?(k=()=>{m(null),o("scaffold")},t[10]=k):k=t[10];const T=k;let x;t[11]===Symbol.for("react.memo_cache_sentinel")?(x=()=>{m(null),o("wire")},t[11]=x):x=t[11];const I=x;let v;t[12]!==e?(v=e("Scaffold access rules"),t[12]=e,t[13]=v):v=t[13];let A;t[14]!==v?(A=s(xe,{children:v}),t[14]=v,t[15]=A):A=t[15];let O;t[16]!==e?(O=e("Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only."),t[16]=e,t[17]=O):O=t[17];let E;t[18]!==O?(E=s(ge,{children:O}),t[18]=O,t[19]=E):E=t[19];let S;t[20]!==E||t[21]!==A?(S=u(be,{children:[A,E]}),t[20]=E,t[21]=A,t[22]=S):S=t[22];const J=l==="scaffold"?"default":"outline";let y;t[23]!==e?(y=e("New policy file"),t[23]=e,t[24]=y):y=t[24];let D;t[25]!==J||t[26]!==y?(D=s(j,{"data-testid":"policy-scaffolder-new",onClick:T,size:"xs",type:"button",variant:J,children:y}),t[25]=J,t[26]=y,t[27]=D):D=t[27];const K=l==="wire"?"default":"outline";let L;t[28]!==e?(L=e("Wire into a procedure"),t[28]=e,t[29]=L):L=t[29];let $;t[30]!==K||t[31]!==L?($=s(j,{"data-testid":"policy-scaffolder-wire",onClick:I,size:"xs",type:"button",variant:K,children:L}),t[30]=K,t[31]=L,t[32]=$):$=t[32];let U;t[33]!==D||t[34]!==$?(U=u("div",{className:"flex flex-wrap gap-2",children:[D,$]}),t[33]=D,t[34]=$,t[35]=U):U=t[35];let W;t[36]!==r||t[37]!==a.policyName||t[38]!==a.tableName||t[39]!==l||t[40]!==C||t[41]!==e?(W=l==="scaffold"&&u("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-new-form",children:[u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-name",children:e("Policy name")}),s(Y,{"data-testid":"policy-scaffolder-name",id:"policy-scaffolder-name",name:"policyName",onChange:d,value:a.policyName})]}),u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-table",children:e("Table name")}),s(Y,{"data-testid":"policy-scaffolder-table",id:"policy-scaffolder-table",name:"tableName",onChange:d,value:a.tableName})]}),s(j,{"data-testid":"policy-scaffolder-create",disabled:r||a.policyName.trim()===""||a.tableName.trim()==="",onClick:C,size:"xs",type:"button",children:e(r?"Creating…":"Create policy file")}),s(j,{onClick:g,size:"xs",type:"button",variant:"ghost",children:e("Cancel")})]}),t[36]=r,t[37]=a.policyName,t[38]=a.tableName,t[39]=l,t[40]=C,t[41]=e,t[42]=W):W=t[42];let M;t[43]!==r||t[44]!==a.exportName||t[45]!==a.filePath||t[46]!==a.policies||t[47]!==l||t[48]!==R||t[49]!==e?(M=l==="wire"&&u("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-wire-form",children:[u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-file",children:e("Procedure file path")}),s(Y,{"data-testid":"policy-scaffolder-file",id:"policy-scaffolder-file",name:"filePath",onChange:d,value:a.filePath})]}),u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-export",children:e("Exported procedure")}),s(Y,{"data-testid":"policy-scaffolder-export",id:"policy-scaffolder-export",name:"exportName",onChange:d,value:a.exportName})]}),u("div",{className:"flex flex-col gap-1 text-xs",children:[s(_,{htmlFor:"policy-scaffolder-policies",children:e("Policy set identifier")}),s(Y,{"data-testid":"policy-scaffolder-policies",id:"policy-scaffolder-policies",name:"policies",onChange:d,value:a.policies})]}),s(j,{"data-testid":"policy-scaffolder-apply",disabled:r||a.filePath.trim()===""||a.exportName.trim()===""||a.policies.trim()==="",onClick:R,size:"xs",type:"button",children:e(r?"Wiring…":"Wire RLS")}),s(j,{onClick:g,size:"xs",type:"button",variant:"ghost",children:e("Cancel")})]}),t[43]=r,t[44]=a.exportName,t[45]=a.filePath,t[46]=a.policies,t[47]=l,t[48]=R,t[49]=e,t[50]=M):M=t[50];let z;t[51]!==i?(z=i?.kind==="error"&&s("p",{className:"mt-3 text-sm text-destructive","data-testid":"policy-scaffolder-error",role:"alert",children:i.message}),t[51]=i,t[52]=z):z=t[52];let q;t[53]!==i?.kind||t[54]!==e?(q=i?.kind==="needs-manual-edit"&&s("p",{className:"mt-3 text-sm text-amber-600 dark:text-amber-500","data-testid":"policy-scaffolder-manual",role:"alert",children:e("This change must be made by hand — the scaffolder only adds new, deny-by-default rules.")}),t[53]=i?.kind,t[54]=e,t[55]=q):q=t[55];let p;t[56]!==i||t[57]!==e?(p=i?.kind==="ok"&&u("div",{className:"mt-3 flex flex-col gap-1","data-testid":"policy-scaffolder-ok",children:[s("p",{className:"text-sm text-emerald-600 dark:text-emerald-500",children:e("Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.",{label:i.label})}),i.diagnostics.length>0&&s("ul",{className:"flex flex-col gap-0.5","data-testid":"policy-scaffolder-diagnostics",children:i.diagnostics.map(Ye)})]}),t[56]=i,t[57]=e,t[58]=p):p=t[58];let N;t[59]!==U||t[60]!==W||t[61]!==M||t[62]!==z||t[63]!==q||t[64]!==p?(N=u(fe,{children:[U,W,M,z,q,p]}),t[59]=U,t[60]=W,t[61]=M,t[62]=z,t[63]=q,t[64]=p,t[65]=N):N=t[65];let B;return t[66]!==S||t[67]!==N?(B=u(me,{"data-testid":"policy-scaffolder",size:"sm",children:[S,N]}),t[66]=S,t[67]=N,t[68]=B):B=t[68],B};function Ye(t){return s("li",{className:"font-mono text-[11px] text-destructive",children:t},t)}const bt=({functions:t,runAsIdentity:e=!1,schemaEditable:l=!1}={})=>{const o=G(),[r,n]=b(void 0),i=(m,a,f)=>{f!==""&&n(c=>({functionPath:f,nonce:(c?.nonce??0)+1}))};return u("div",{className:"flex flex-col gap-8","data-testid":"lunora-permissions",children:[u("section",{className:"flex flex-col gap-3",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:o("Permissions")})}),s(Le,{onProbe:i})]}),s("section",{className:"flex flex-col gap-3",children:u(me,{className:"gap-0 py-0",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:o("Probe")})}),u(fe,{className:"px-4 py-4",children:[s("p",{className:"mb-3 text-sm text-muted-foreground",children:o("Pick a function and an identity, then run it to see the access outcome.")}),s(Qe,{functions:t,prefill:r,runAsIdentity:e})]})]})}),l&&s("section",{className:"flex flex-col gap-2",children:s(Ve,{})})]})};export{bt as PermissionsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as W}from"react/compiler-runtime";import{useQueryClient as se,useQuery as ie,useMutation as re}from"@tanstack/react-query";import{useId as le}from"react";import{E as Z}from"../packem_shared/error-alert-
|
|
1
|
+
import{c as W}from"react/compiler-runtime";import{useQueryClient as se,useQuery as ie,useMutation as re}from"@tanstack/react-query";import{useId as le}from"react";import{E as Z}from"../packem_shared/error-alert-DKXm5h19.mjs";import{B as G}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as ne}from"../packem_shared/button-q0UYSmrn.mjs";import{E as ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{c as w,a as ae,b as te,d as de,T as ce,e as O}from"../packem_shared/table-D0SBiDu-.mjs";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{h as J}from"../packem_shared/internal-hIuTpSbx.mjs";import{c as oe}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as i,jsxs as z}from"react/jsx-runtime";const ue=new Set(["cancelled","completed","expired"]),fe=r=>ue.has(r),me=r=>r.extendedDueAt??r.dueAt,ve=r=>!fe(r)&&r!=="ready",pe=(r,e)=>ve(r.status)&&e.getTime()>me(r).getTime(),ye=(r,e)=>pe({dueAt:new Date(r.dueAt),status:r.status,...r.extendedDueAt===void 0||r.extendedDueAt===null?{}:{extendedDueAt:new Date(r.extendedDueAt)}},new Date(e)),he=["studio","privacy-requests"],xe={cancelled:"outline",completed:"success",expired:"outline",failed:"destructive",grace:"secondary",processing:"warning",ready:"success",received:"info"},Ae=r=>J(r??void 0,"—"),ge=r=>{const e=W(55),{asOf:o,retrying:t,row:s,onRetry:q}=r,a=X();let d,c,D;e[0]!==o||e[1]!==s?(c=ye(s,o),d=te,D=oe(c&&"bg-destructive/5"),e[0]=o,e[1]=s,e[2]=d,e[3]=c,e[4]=D):(d=e[2],c=e[3],D=e[4]);const S=c?"true":"false";let u;e[5]!==s.id?(u=i(O,{className:"font-mono text-xs",children:s.id}),e[5]=s.id,e[6]=u):u=e[6];let f;e[7]!==s.type||e[8]!==a?(f=s.type==="export"?a("Export"):a("Erasure"),e[7]=s.type,e[8]=a,e[9]=f):f=e[9];let E;e[10]!==f?(E=i(O,{children:i(G,{variant:"secondary",children:f})}),e[10]=f,e[11]=E):E=e[11];let n;e[12]!==s.subjectId?(n=i(O,{className:"font-mono text-xs",children:s.subjectId}),e[12]=s.subjectId,e[13]=n):n=e[13];const N=xe[s.status];let b;e[14]!==s.status||e[15]!==N?(b=i(O,{children:i(G,{variant:N,children:s.status})}),e[14]=s.status,e[15]=N,e[16]=b):b=e[16];let R;e[17]!==s.receivedAt?(R=J(s.receivedAt),e[17]=s.receivedAt,e[18]=R):R=e[18];let P;e[19]!==R?(P=i(O,{children:R}),e[19]=R,e[20]=P):P=e[20];let m;e[21]!==s.dueAt?(m=J(s.dueAt),e[21]=s.dueAt,e[22]=m):m=e[22];let v;e[23]!==m?(v=i(O,{children:m}),e[23]=m,e[24]=v):v=e[24];let p;e[25]!==s.extendedDueAt?(p=Ae(s.extendedDueAt),e[25]=s.extendedDueAt,e[26]=p):p=e[26];let y;e[27]!==p?(y=i(O,{children:p}),e[27]=p,e[28]=y):y=e[28];let h;e[29]!==c||e[30]!==a?(h=c&&i(G,{"data-testid":"privacy-overdue",variant:"destructive",children:a("Overdue")}),e[29]=c,e[30]=a,e[31]=h):h=e[31];let x;e[32]!==h?(x=i(O,{children:h}),e[32]=h,e[33]=x):x=e[33];let A;e[34]!==q||e[35]!==t||e[36]!==s.id||e[37]!==s.status||e[38]!==a?(A=s.status==="failed"&&i(ne,{disabled:t,onClick:()=>{q(s.id)},size:"xs",variant:"outline",children:a("Retry")}),e[34]=q,e[35]=t,e[36]=s.id,e[37]=s.status,e[38]=a,e[39]=A):A=e[39];let g;e[40]!==A?(g=i(O,{children:A}),e[40]=A,e[41]=g):g=e[41];let I;return e[42]!==d||e[43]!==D||e[44]!==P||e[45]!==v||e[46]!==y||e[47]!==x||e[48]!==g||e[49]!==S||e[50]!==u||e[51]!==E||e[52]!==n||e[53]!==b?(I=z(d,{className:D,"data-overdue":S,"data-testid":"privacy-request-row",children:[u,E,n,b,P,v,y,x,g]}),e[42]=d,e[43]=D,e[44]=P,e[45]=v,e[46]=y,e[47]=x,e[48]=g,e[49]=S,e[50]=u,e[51]=E,e[52]=n,e[53]=b,e[54]=I):I=e[54],I},Te=r=>{const e=W(95),{source:o}=r,t=X(),s=se(),q=le();let a;e[0]!==q?(a=[...he,q],e[0]=q,e[1]=a):a=e[1];const d=a;let c;e[2]!==o?(c=async()=>({asOf:Date.now(),requests:await o.listOpenPrivacyRequests()}),e[2]=o,e[3]=c):c=e[3];let D;e[4]!==d||e[5]!==c?(D={queryKey:d,refetchInterval:6e4,queryFn:c,staleTime:0},e[4]=d,e[5]=c,e[6]=D):D=e[6];const S=ie(D);let u;e[7]!==o?(u=l=>o.retryPrivacyRequest(l),e[7]=o,e[8]=u):u=e[8];let f;e[9]!==s||e[10]!==d?(f=async()=>{await s.invalidateQueries({queryKey:d})},e[9]=s,e[10]=d,e[11]=f):f=e[11];let E;e[12]!==u||e[13]!==f?(E={mutationFn:u,onSuccess:f},e[12]=u,e[13]=f,e[14]=E):E=e[14];const n=re(E);let N;e[15]!==n?(N=l=>{n.mutate(l)},e[15]=n,e[16]=N):N=e[16];const b=N;if(S.isPending){let l;e[17]!==t?(l=t("Loading privacy requests…"),e[17]=t,e[18]=l):l=e[18];let T;return e[19]!==l?(T=i("p",{className:"text-sm text-muted-foreground","data-testid":"privacy-requests-loading",role:"status",children:l}),e[19]=l,e[20]=T):T=e[20],T}if(S.isError){let l;return e[21]!==S.error?(l=i(Z,{error:S.error,testId:"privacy-requests-error"}),e[21]=S.error,e[22]=l):l=e[22],l}const{asOf:R,requests:P}=S.data;if(P.length===0){let l;e[23]!==t?(l=t("No open privacy requests."),e[23]=t,e[24]=l):l=e[24];let T;return e[25]!==l?(T=i(ee,{testId:"privacy-requests-empty",title:l}),e[25]=l,e[26]=T):T=e[26],T}let m;e[27]!==n.error||e[28]!==n.isError?(m=n.isError&&i(Z,{error:n.error,testId:"privacy-retry-error"}),e[27]=n.error,e[28]=n.isError,e[29]=m):m=e[29];let v;e[30]!==t?(v=t("ID"),e[30]=t,e[31]=v):v=e[31];let p;e[32]!==v?(p=i(w,{children:v}),e[32]=v,e[33]=p):p=e[33];let y;e[34]!==t?(y=t("Type"),e[34]=t,e[35]=y):y=e[35];let h;e[36]!==y?(h=i(w,{children:y}),e[36]=y,e[37]=h):h=e[37];let x;e[38]!==t?(x=t("Subject"),e[38]=t,e[39]=x):x=e[39];let A;e[40]!==x?(A=i(w,{children:x}),e[40]=x,e[41]=A):A=e[41];let g;e[42]!==t?(g=t("Status"),e[42]=t,e[43]=g):g=e[43];let I;e[44]!==g?(I=i(w,{children:g}),e[44]=g,e[45]=I):I=e[45];let j;e[46]!==t?(j=t("Received"),e[46]=t,e[47]=j):j=e[47];let B;e[48]!==j?(B=i(w,{children:j}),e[48]=j,e[49]=B):B=e[49];let C;e[50]!==t?(C=t("Due"),e[50]=t,e[51]=C):C=e[51];let Q;e[52]!==C?(Q=i(w,{children:C}),e[52]=C,e[53]=Q):Q=e[53];let U;e[54]!==t?(U=t("Extended due"),e[54]=t,e[55]=U):U=e[55];let V;e[56]!==U?(V=i(w,{children:U}),e[56]=U,e[57]=V):V=e[57];let _;e[58]!==t?(_=t("Overdue"),e[58]=t,e[59]=_):_=e[59];let $;e[60]!==_?($=i(w,{children:_}),e[60]=_,e[61]=$):$=e[61];let F;e[62]!==t?(F=t("Actions"),e[62]=t,e[63]=F):F=e[63];let H;e[64]!==F?(H=i(w,{children:F}),e[64]=F,e[65]=H):H=e[65];let K;e[66]!==p||e[67]!==h||e[68]!==A||e[69]!==I||e[70]!==B||e[71]!==Q||e[72]!==V||e[73]!==$||e[74]!==H?(K=i(ae,{children:z(te,{children:[p,h,A,I,B,Q,V,$,H]})}),e[66]=p,e[67]=h,e[68]=A,e[69]=I,e[70]=B,e[71]=Q,e[72]=V,e[73]=$,e[74]=H,e[75]=K):K=e[75];let L;if(e[76]!==R||e[77]!==b||e[78]!==P||e[79]!==n.isPending||e[80]!==n.variables){let l;e[82]!==R||e[83]!==b||e[84]!==n.isPending||e[85]!==n.variables?(l=T=>i(ge,{asOf:R,onRetry:b,retrying:n.isPending&&n.variables===T.id,row:T},T.id),e[82]=R,e[83]=b,e[84]=n.isPending,e[85]=n.variables,e[86]=l):l=e[86],L=P.map(l),e[76]=R,e[77]=b,e[78]=P,e[79]=n.isPending,e[80]=n.variables,e[81]=L}else L=e[81];let M;e[87]!==L?(M=i(de,{children:L}),e[87]=L,e[88]=M):M=e[88];let Y;e[89]!==K||e[90]!==M?(Y=z(ce,{children:[K,M]}),e[89]=K,e[90]=M,e[91]=Y):Y=e[91];let k;return e[92]!==Y||e[93]!==m?(k=z("div",{className:"flex flex-col gap-3",children:[m,Y]}),e[92]=Y,e[93]=m,e[94]=k):k=e[94],k},Be=r=>{const e=W(11);let o;e[0]!==r?(o=r===void 0?{}:r,e[0]=r,e[1]=o):o=e[1];const{source:t}=o,s=X();if(t===void 0){let a;e[2]!==s?(a=s("Pass privacyRequests to the Studio to list and retry data-subject requests."),e[2]=s,e[3]=a):a=e[3];let d;e[4]!==s?(d=s("Privacy requests not configured"),e[4]=s,e[5]=d):d=e[5];let c;return e[6]!==a||e[7]!==d?(c=i(ee,{description:a,testId:"privacy-requests-not-configured",title:d}),e[6]=a,e[7]=d,e[8]=c):c=e[8],c}let q;return e[9]!==t?(q=i(Te,{source:t}),e[9]=t,e[10]=q):q=e[10],q};export{Be as PrivacyRequestsPanel};
|