@lunora/studio 1.0.0-alpha.8 → 1.0.0-alpha.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +6 -0
- package/dist/index.d.ts +777 -780
- package/dist/index.js +1 -41
- package/dist/mount.d.ts +10 -10
- package/dist/mount.js +1 -26
- package/dist/packem_chunks/ApiTab.js +1 -0
- package/dist/packem_chunks/AuditPanel.js +1 -0
- package/dist/packem_chunks/DeploymentHealthPanel.js +1 -0
- package/dist/packem_chunks/ExportImportPanel.js +3 -0
- package/dist/packem_chunks/FileBrowser.js +4 -0
- package/dist/packem_chunks/FunctionRunner.js +1 -0
- package/dist/packem_chunks/FunctionStatsPanel.js +1 -0
- package/dist/packem_chunks/HealthPanel.js +1 -0
- package/dist/packem_chunks/InsightsPanel.js +1 -0
- package/dist/packem_chunks/LogsPanel.js +1 -0
- package/dist/packem_chunks/MailPanel.js +2 -0
- package/dist/packem_chunks/MetricsPanel.js +1 -0
- package/dist/packem_chunks/NotificationsPanel.js +1 -0
- package/dist/packem_chunks/PitrPanel.js +1 -0
- package/dist/packem_chunks/SchemaViewer.js +1 -0
- package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -0
- package/dist/packem_chunks/SettingsPanel.js +1 -0
- package/dist/packem_chunks/SqlEditorPanel.js +6 -0
- package/dist/packem_chunks/TableEditor.js +1 -0
- package/dist/packem_chunks/agents-panel.js +1 -0
- package/dist/packem_chunks/analytics-panel.js +1 -0
- package/dist/packem_chunks/auth-audit-panel.js +1 -0
- package/dist/packem_chunks/auth-config-panel.js +1 -0
- package/dist/packem_chunks/auth-sessions-panel.js +1 -0
- package/dist/packem_chunks/containers-panel.js +1 -0
- package/dist/packem_chunks/dashboards-panel.js +1 -0
- package/dist/packem_chunks/fanout-panel.js +1 -0
- package/dist/packem_chunks/flags-panel.js +1 -0
- package/dist/packem_chunks/issues-panel.js +1 -0
- package/dist/packem_chunks/kv-browser.js +1 -0
- package/dist/packem_chunks/log-drains-panel.js +4 -0
- package/dist/packem_chunks/migrations-route.js +1 -0
- package/dist/packem_chunks/organizations-panel.js +1 -0
- package/dist/packem_chunks/payments-panel.js +1 -0
- package/dist/packem_chunks/permissions-panel.js +1 -0
- package/dist/packem_chunks/queues-panel.js +1 -0
- package/dist/packem_chunks/rls-panel.js +1 -0
- package/dist/packem_chunks/schedule-panel.js +1 -0
- package/dist/packem_chunks/sparkline.js +1 -0
- package/dist/packem_chunks/storage-rules-panel.js +1 -0
- package/dist/packem_chunks/subscriptions-panel.js +1 -0
- package/dist/packem_chunks/sync-client-panel.js +1 -0
- package/dist/packem_chunks/traces-panel.js +1 -0
- package/dist/packem_chunks/users-panel.js +1 -0
- package/dist/packem_chunks/vector-browser.js +1 -0
- package/dist/packem_chunks/workflows-panel.js +1 -0
- package/dist/packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js +1 -0
- package/dist/packem_shared/ApiDocsPanel-DfUQ1ZAF.js +2 -0
- package/dist/packem_shared/ApiReferencePanel-9q8BbJl-.js +1 -0
- package/dist/packem_shared/CommandPalette--SQwfTW1.js +1 -0
- package/dist/packem_shared/ConfirmButton-CTL3f3kr.js +1 -0
- package/dist/packem_shared/ConnectionBadge-DOk0CQWo.js +1 -0
- package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js +1 -0
- package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js +1 -0
- package/dist/packem_shared/DEFAULT_LOCALE-BZ4NojpD.js +1 -0
- package/dist/packem_shared/DataBrowser-CuRlztBz.js +1 -0
- package/dist/packem_shared/DataFilters-B26ZeqBZ.js +1 -0
- package/dist/packem_shared/ErrorBoundary-DvzYskH7.js +1 -0
- package/dist/packem_shared/GlobalDataBrowser-DB-vQ2_H.js +1 -0
- package/dist/packem_shared/HomePanel-Dcs4a3Ax.js +1 -0
- package/dist/packem_shared/MigrationsPanel-C2OnsqRb.js +1 -0
- package/dist/packem_shared/OpenRpcReferencePanel-qOZcWXMs.js +1 -0
- package/dist/packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.js +1 -0
- package/dist/packem_shared/ScheduledJobs-D8kBZWBu.js +1 -0
- package/dist/packem_shared/ShardInput-BVn2iCU0.js +1 -0
- package/dist/packem_shared/Studio-B26_pT8J.js +1 -0
- package/dist/packem_shared/StudioApp-bXhJeLlZ.js +1 -0
- package/dist/packem_shared/StudioI18nProvider-CZ5h4nrV.js +1 -0
- package/dist/packem_shared/advisor-view-Pa8HLtBv.js +1 -0
- package/dist/packem_shared/aggregateMetrics-BNfajLa2.js +1 -0
- package/dist/packem_shared/alert-CVcOFuDR.js +1 -0
- package/dist/packem_shared/app.d-DW7yZsfu.d.ts +252 -0
- package/dist/packem_shared/badge-BbuuAio7.js +1 -0
- package/dist/packem_shared/bar-chart-DraN_srt.js +9 -0
- package/dist/packem_shared/browser-storage-xjTyMKY0.js +1 -0
- package/dist/packem_shared/button-BkCrNcAs.js +1 -0
- package/dist/packem_shared/card-CIDGUN6K.js +1 -0
- package/dist/packem_shared/cf-links-gbDy51nR.js +1 -0
- package/dist/packem_shared/checkbox-StT4Gob6.js +1 -0
- package/dist/packem_shared/data-grid-DcxyIXwG.js +1 -0
- package/dist/packem_shared/data-view-params-ClrV7XgF.js +1 -0
- package/dist/packem_shared/dropdown-menu-C3RQ_HlW.js +2 -0
- package/dist/packem_shared/empty-state-Cg7t_8qu.js +1 -0
- package/dist/packem_shared/error-alert-t6cpEi0z.js +1 -0
- package/dist/packem_shared/grid-features-jnrD0SpX.js +6 -0
- package/dist/packem_shared/home-panel-CU6MWLHG.js +3 -0
- package/dist/packem_shared/input-JHu63lTv.js +1 -0
- package/dist/packem_shared/internal-BSIsQVC6.js +2 -0
- package/dist/packem_shared/label-6uP1obNF.js +1 -0
- package/dist/packem_shared/live-status-CmuRLFKf.js +1 -0
- package/dist/packem_shared/log-fields-CoL3hsIQ.js +1 -0
- package/dist/packem_shared/modal-shell-CUwwWC2o.js +1 -0
- package/dist/packem_shared/operation-console-provider-BMJNtiyB.js +1 -0
- package/dist/packem_shared/recording-client-DRAZEmzE.js +1 -0
- package/dist/packem_shared/reference-view-DnYYWr7I.js +12 -0
- package/dist/packem_shared/result-chart-DzJOVsaw.js +1 -0
- package/dist/packem_shared/schema-diagram-cg-bz_VL.js +2 -0
- package/dist/packem_shared/scroll-area-DTEq6Jec.js +2 -0
- package/dist/packem_shared/select-Bul-DeII.js +2 -0
- package/dist/packem_shared/shard-history-DMEW5VBE.js +1 -0
- package/dist/packem_shared/skeleton-C1wQ9M5t.js +1 -0
- package/dist/packem_shared/sparkline-CgjeUU2I.js +1 -0
- package/dist/packem_shared/storage-tier-DznqOf-q.js +1 -0
- package/dist/packem_shared/studio-q-C-acL7.js +2 -0
- package/dist/packem_shared/table-DdJBrClo.js +2 -0
- package/dist/packem_shared/table-list-sidebar-BFkSQwlB.js +1 -0
- package/dist/packem_shared/textarea-Bu2-jKAs.js +1 -0
- package/dist/packem_shared/trace-handoff-Dw7mwjxu.js +1 -0
- package/dist/packem_shared/use-admin-query-QJ-ibl5u.js +1 -0
- package/dist/packem_shared/use-async-submit-q3ymBJkD.js +1 -0
- package/dist/packem_shared/use-auth-config-BObBpdsi.js +1 -0
- package/dist/packem_shared/use-sql-assistant-CHEu2-Rk.js +1 -0
- package/dist/packem_shared/useDebounced-Ihdiid_k.js +1 -0
- package/dist/packem_shared/utils-bhneXptQ.js +1 -0
- package/dist/packem_shared/virtual-rect-1o1veP7R.js +1 -0
- package/dist/standalone/chunk-2GA4SHO7.js +1 -0
- package/dist/standalone/chunk-2OUPA2WJ.js +1 -0
- package/dist/standalone/chunk-2PJNAWB3.js +1 -0
- package/dist/standalone/chunk-2VDFV5TD.js +1 -0
- package/dist/standalone/chunk-2WOIRKEI.js +1 -0
- package/dist/standalone/chunk-33CL6OHR.js +1 -0
- package/dist/standalone/chunk-34D36UCW.js +1 -0
- package/dist/standalone/chunk-3C3CG7ZK.js +1 -0
- package/dist/standalone/chunk-3O3HAXW7.js +1 -0
- package/dist/standalone/chunk-3STOIE7Q.js +1 -0
- package/dist/standalone/chunk-3XIESWL4.js +1 -0
- package/dist/standalone/chunk-4UOFSGUS.js +1 -0
- package/dist/standalone/chunk-53WEPGUD.js +1 -0
- package/dist/standalone/chunk-54MMVNPT.js +1 -0
- package/dist/standalone/chunk-5CVJS7ON.js +1 -0
- package/dist/standalone/chunk-5Y3QLNWX.js +1 -0
- package/dist/standalone/chunk-6IKEW5LG.js +1 -0
- package/dist/standalone/chunk-6LNCYDZO.js +1 -0
- package/dist/standalone/chunk-6NY7SPDL.js +1 -0
- package/dist/standalone/chunk-6PNPIW6I.js +2 -0
- package/dist/standalone/chunk-6ST5ECQA.js +1 -0
- package/dist/standalone/chunk-6VAKZALJ.js +1 -0
- package/dist/standalone/chunk-6YI4WJO4.js +1 -0
- package/dist/standalone/chunk-6YTSSIEJ.js +3 -0
- package/dist/standalone/chunk-7LWMHTJ3.js +1 -0
- package/dist/standalone/chunk-7QIFDWQV.js +1 -0
- package/dist/standalone/chunk-7T7UOTYK.js +1 -0
- package/dist/standalone/chunk-A74VSSA2.js +4 -0
- package/dist/standalone/chunk-AADILRJW.js +14 -0
- package/dist/standalone/chunk-AVAC26HJ.js +1 -0
- package/dist/standalone/chunk-BGBLQ563.js +1 -0
- package/dist/standalone/chunk-CCVXYYPJ.js +1 -0
- package/dist/standalone/chunk-CFPZYHPY.js +2 -0
- package/dist/standalone/chunk-CT5MMH4O.js +1 -0
- package/dist/standalone/chunk-CTNB2KIA.js +1 -0
- package/dist/standalone/chunk-CU55Y5TV.js +62 -0
- package/dist/standalone/chunk-D2RKH6JK.js +1 -0
- package/dist/standalone/chunk-E3NMX2VU.js +4 -0
- package/dist/standalone/chunk-EN2QAEO4.js +11 -0
- package/dist/standalone/chunk-ESVP44Y3.js +1 -0
- package/dist/standalone/chunk-FNPJ7GJZ.js +1 -0
- package/dist/standalone/chunk-FOBRNWBG.js +3 -0
- package/dist/standalone/chunk-FXCBF4XT.js +1 -0
- package/dist/standalone/chunk-G6PSMGLD.js +1 -0
- package/dist/standalone/chunk-GAX5IZYG.js +8 -0
- package/dist/standalone/chunk-GB6U2BPU.js +1 -0
- package/dist/standalone/chunk-GEDMLM4A.js +6 -0
- package/dist/standalone/chunk-GMR677FL.js +1 -0
- package/dist/standalone/chunk-GRL5MG3Z.js +1 -0
- package/dist/standalone/chunk-GXSZH7VJ.js +13 -0
- package/dist/standalone/chunk-GYKVBKT5.js +1 -0
- package/dist/standalone/chunk-H6YOWRFB.js +1 -0
- package/dist/standalone/chunk-HJ3E4YF5.js +1 -0
- package/dist/standalone/chunk-HJD2YUQS.js +1 -0
- package/dist/standalone/chunk-HPFLBYRI.js +1 -0
- package/dist/standalone/chunk-IC4L6G56.js +1 -0
- package/dist/standalone/chunk-IHQC7J35.js +1 -0
- package/dist/standalone/chunk-ILNELDFC.js +1 -0
- package/dist/standalone/chunk-IVFHIQOT.js +1 -0
- package/dist/standalone/chunk-JLOWAJRR.js +1 -0
- package/dist/standalone/chunk-JN2Y24PY.js +1 -0
- package/dist/standalone/chunk-JRMMYIAF.js +1 -0
- package/dist/standalone/chunk-KC44QCN6.js +1 -0
- package/dist/standalone/chunk-KJB7YAKB.js +1 -0
- package/dist/standalone/chunk-KLQYC6CC.js +1 -0
- package/dist/standalone/chunk-KUVMORDQ.js +1 -0
- package/dist/standalone/chunk-KZ3ALMMP.js +1 -0
- package/dist/standalone/chunk-L7R74G63.js +1 -0
- package/dist/standalone/chunk-LEDWUPXM.js +1 -0
- package/dist/standalone/chunk-LFKCLLPT.js +1 -0
- package/dist/standalone/chunk-MIQTKZAR.js +1 -0
- package/dist/standalone/chunk-OG4N2XHD.js +19 -0
- package/dist/standalone/chunk-OY2RVUZL.js +1 -0
- package/dist/standalone/chunk-P4YLIBCN.js +1 -0
- package/dist/standalone/chunk-PZVU2QMX.js +1 -0
- package/dist/standalone/chunk-Q7O6B7WC.js +1 -0
- package/dist/standalone/chunk-QBWRC5YX.js +1 -0
- package/dist/standalone/chunk-QLQADHFE.js +1 -0
- package/dist/standalone/chunk-QWGT25SE.js +1 -0
- package/dist/standalone/chunk-QXXIJAD5.js +1 -0
- package/dist/standalone/chunk-QZGTH6WH.js +1 -0
- package/dist/standalone/chunk-RJP3WBZ4.js +1 -0
- package/dist/standalone/chunk-RNL6BSFM.js +1 -0
- package/dist/standalone/chunk-RNRJKBY3.js +4 -0
- package/dist/standalone/chunk-RQ7AFLIV.js +1 -0
- package/dist/standalone/chunk-S252DAFP.js +1 -0
- package/dist/standalone/chunk-S2VVR7HI.js +1 -0
- package/dist/standalone/chunk-SD4BERSA.js +1 -0
- package/dist/standalone/chunk-SFDOII3B.js +1 -0
- package/dist/standalone/chunk-SKHEGARW.js +1 -0
- package/dist/standalone/chunk-SKW6J4VW.js +1 -0
- package/dist/standalone/chunk-SMIESS7P.js +1 -0
- package/dist/standalone/chunk-T6VMSOBB.js +1 -0
- package/dist/standalone/chunk-T7IUZIF4.js +1 -0
- package/dist/standalone/chunk-THIXMMZD.js +1 -0
- package/dist/standalone/chunk-TTGOOYLF.js +1 -0
- package/dist/standalone/chunk-U6TNNM5U.js +1 -0
- package/dist/standalone/chunk-UZERI5YC.js +1 -0
- package/dist/standalone/chunk-V53KNYRN.js +1 -0
- package/dist/standalone/chunk-VHWOCPRK.js +1 -0
- package/dist/standalone/chunk-W6SAOXGH.js +6 -0
- package/dist/standalone/chunk-WBYSSCV2.js +1 -0
- package/dist/standalone/chunk-X665E2HU.js +1 -0
- package/dist/standalone/chunk-XBDKZZ67.js +1 -0
- package/dist/standalone/chunk-XDAT7LHC.js +1 -0
- package/dist/standalone/chunk-XQCVZAGU.js +1 -0
- package/dist/standalone/chunk-XS5LDR52.js +1 -0
- package/dist/standalone/chunk-XXQUMVWH.js +1 -0
- package/dist/standalone/chunk-Y5Y7DHFW.js +1 -0
- package/dist/standalone/chunk-YJYTMQJI.js +1 -0
- package/dist/standalone/chunk-Z2V42P7J.js +1 -0
- package/dist/standalone/chunk-ZJGP6EKR.js +1 -0
- package/dist/standalone/studio.js +9 -356
- package/dist/styles.css +2 -2
- package/package.json +16 -14
- package/dist/packem_shared/ADMIN_FUNCTIONS-DjXgvJb6.js +0 -46
- package/dist/packem_shared/ApiDocsPanel-yVSGHK3H.js +0 -842
- package/dist/packem_shared/ApiReferencePanel-1vubqG5s.js +0 -229
- package/dist/packem_shared/ApiTab-rwttyQ1-.js +0 -251
- package/dist/packem_shared/AuditPanel-BqXZAsu_.js +0 -212
- package/dist/packem_shared/CommandPalette-BtgkBzZI.js +0 -373
- package/dist/packem_shared/ConfirmButton-C2eVi2Qv.js +0 -59
- package/dist/packem_shared/ConnectionBadge-B2DDM2Tn.js +0 -111
- package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js +0 -50
- package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js +0 -89
- package/dist/packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js +0 -27
- package/dist/packem_shared/DataBrowser-Ck_7QwNK.js +0 -4542
- package/dist/packem_shared/DataFilters-FNquMaiu.js +0 -249
- package/dist/packem_shared/ErrorBoundary-BzAApI7J.js +0 -66
- package/dist/packem_shared/ExportImportPanel-Dq6rj0tI.js +0 -193
- package/dist/packem_shared/FileBrowser-0pCpdKPE.js +0 -2932
- package/dist/packem_shared/FunctionRunner-7NH3KcTg.js +0 -343
- package/dist/packem_shared/FunctionStatsPanel-Cn_EBpDy.js +0 -432
- package/dist/packem_shared/GlobalDataBrowser-BTEmGrph.js +0 -318
- package/dist/packem_shared/HealthPanel-CQ4LzVET.js +0 -640
- package/dist/packem_shared/HomePanel-CP0lN1eF.js +0 -1273
- package/dist/packem_shared/InsightsPanel-DzNtoz7k.js +0 -423
- package/dist/packem_shared/LogsPanel-C3W0mabf.js +0 -839
- package/dist/packem_shared/MailPanel-CoEfWkCh.js +0 -447
- package/dist/packem_shared/MetricsPanel-CujtUfpl.js +0 -1625
- package/dist/packem_shared/MigrationsPanel-RX5qIFSr.js +0 -246
- package/dist/packem_shared/OpenRpcReferencePanel-vbcYbv3V.js +0 -191
- package/dist/packem_shared/PitrPanel-LJGNP_IX.js +0 -252
- package/dist/packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js +0 -3
- package/dist/packem_shared/ScheduledJobs-CabfKbyM.js +0 -159
- package/dist/packem_shared/SchemaViewer-Bam6ylvw.js +0 -2512
- package/dist/packem_shared/SecurityAdvisorPanel-DHr_bI38.js +0 -79
- package/dist/packem_shared/SettingsPanel-CBXQpYQA.js +0 -176
- package/dist/packem_shared/ShardInput-gx_DZXXn.js +0 -107
- package/dist/packem_shared/SqlEditorPanel-D5wMIxcg.js +0 -13
- package/dist/packem_shared/Studio-DkgODWD3.js +0 -33
- package/dist/packem_shared/StudioApp-ColQCvC_.js +0 -657
- package/dist/packem_shared/StudioI18nProvider-B-tDCZIi.js +0 -48
- package/dist/packem_shared/TableEditor-B8K5nUna.js +0 -371
- package/dist/packem_shared/advisor-view-CGcfMiPq.js +0 -159
- package/dist/packem_shared/aggregateMetrics-D4nUHEKU.js +0 -108
- package/dist/packem_shared/app.d-Nbhpihxv.d.ts +0 -300
- package/dist/packem_shared/badge-B2PKA1-5.js +0 -49
- package/dist/packem_shared/bar-chart-CzJAgqkp.js +0 -3245
- package/dist/packem_shared/button-BhsN2uZH.js +0 -49
- package/dist/packem_shared/card-DURq3ElK.js +0 -175
- package/dist/packem_shared/cf-links-2cktDedA.js +0 -8
- package/dist/packem_shared/checkbox-UNkzAxl-.js +0 -63
- package/dist/packem_shared/data-grid-B5CaV3wS.js +0 -183
- package/dist/packem_shared/dropdown-menu-WY4B_eJO.js +0 -280
- package/dist/packem_shared/empty-state-DY_oe0k6.js +0 -98
- package/dist/packem_shared/grid-features-CzUfqgsM.js +0 -840
- package/dist/packem_shared/input-XH4r1Pt1.js +0 -53
- package/dist/packem_shared/internal-rXJEAhXS.js +0 -68
- package/dist/packem_shared/label-D8ykjn5J.js +0 -46
- package/dist/packem_shared/live-status-FZ0psC1z.js +0 -44
- package/dist/packem_shared/reference-view-B4E49Lip.js +0 -2180
- package/dist/packem_shared/shard-history-DyebH1R5.js +0 -38
- package/dist/packem_shared/sparkline-10dG-_f0.js +0 -93
- package/dist/packem_shared/sql-editor-panel-Smfl_FDF.js +0 -2562
- package/dist/packem_shared/storage-tier-CL98eOvn.js +0 -85
- package/dist/packem_shared/studio-Be28OqIx.js +0 -10413
- package/dist/packem_shared/table-_RzNvy3R.js +0 -246
- package/dist/packem_shared/table-list-sidebar-Bg7uzbvC.js +0 -832
- package/dist/packem_shared/textarea-D3gaCU_-.js +0 -46
- package/dist/packem_shared/use-live-admin-Dq6g3daN.js +0 -73
- package/dist/packem_shared/use-live-shard-seed-Cuk3dnH0.js +0 -76
- package/dist/packem_shared/useDebounced-Dxncpg6z.js +0 -32
- package/dist/packem_shared/utils-B05Dmz_H.js +0 -8
- package/dist/packem_shared/virtual-rect-CVMUskSm.js +0 -10
package/dist/index.js
CHANGED
|
@@ -1,41 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { CommandPalette, openCommandPalette } from './packem_shared/CommandPalette-BtgkBzZI.js';
|
|
3
|
-
export { S as Studio } from './packem_shared/studio-Be28OqIx.js';
|
|
4
|
-
export { ConfirmButton } from './packem_shared/ConfirmButton-C2eVi2Qv.js';
|
|
5
|
-
export { default as ConnectionBadge } from './packem_shared/ConnectionBadge-B2DDM2Tn.js';
|
|
6
|
-
export { ErrorBoundary } from './packem_shared/ErrorBoundary-BzAApI7J.js';
|
|
7
|
-
export { ShardInput } from './packem_shared/ShardInput-gx_DZXXn.js';
|
|
8
|
-
export { DEFAULT_INSIGHT_THRESHOLDS, deriveInsights } from './packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js';
|
|
9
|
-
export { InsightsPanel } from './packem_shared/InsightsPanel-DzNtoz7k.js';
|
|
10
|
-
export { default as SecurityAdvisorPanel } from './packem_shared/SecurityAdvisorPanel-DHr_bI38.js';
|
|
11
|
-
export { default as ApiDocsPanel } from './packem_shared/ApiDocsPanel-yVSGHK3H.js';
|
|
12
|
-
export { default as ApiReferencePanel } from './packem_shared/ApiReferencePanel-1vubqG5s.js';
|
|
13
|
-
export { default as ApiTab } from './packem_shared/ApiTab-rwttyQ1-.js';
|
|
14
|
-
export { default as OpenRpcReferencePanel } from './packem_shared/OpenRpcReferencePanel-vbcYbv3V.js';
|
|
15
|
-
export { DataBrowser } from './packem_shared/DataBrowser-Ck_7QwNK.js';
|
|
16
|
-
export { DataFilters, toFilterClauses } from './packem_shared/DataFilters-FNquMaiu.js';
|
|
17
|
-
export { GlobalDataBrowser } from './packem_shared/GlobalDataBrowser-BTEmGrph.js';
|
|
18
|
-
export { TableEditor } from './packem_shared/TableEditor-B8K5nUna.js';
|
|
19
|
-
export { ExportImportPanel } from './packem_shared/ExportImportPanel-Dq6rj0tI.js';
|
|
20
|
-
export { MigrationsPanel } from './packem_shared/MigrationsPanel-RX5qIFSr.js';
|
|
21
|
-
export { PitrPanel } from './packem_shared/PitrPanel-LJGNP_IX.js';
|
|
22
|
-
export { FunctionRunner } from './packem_shared/FunctionRunner-7NH3KcTg.js';
|
|
23
|
-
export { FunctionStatsPanel } from './packem_shared/FunctionStatsPanel-Cn_EBpDy.js';
|
|
24
|
-
export { HomePanel } from './packem_shared/HomePanel-CP0lN1eF.js';
|
|
25
|
-
export { AuditPanel } from './packem_shared/AuditPanel-BqXZAsu_.js';
|
|
26
|
-
export { LogsPanel } from './packem_shared/LogsPanel-C3W0mabf.js';
|
|
27
|
-
export { MailPanel } from './packem_shared/MailPanel-CoEfWkCh.js';
|
|
28
|
-
export { ScheduledJobs } from './packem_shared/ScheduledJobs-CabfKbyM.js';
|
|
29
|
-
export { HealthPanel } from './packem_shared/HealthPanel-CQ4LzVET.js';
|
|
30
|
-
export { aggregateMetrics, shardsToAggregate } from './packem_shared/aggregateMetrics-D4nUHEKU.js';
|
|
31
|
-
export { MetricsPanel } from './packem_shared/MetricsPanel-CujtUfpl.js';
|
|
32
|
-
export { SchemaViewer } from './packem_shared/SchemaViewer-Bam6ylvw.js';
|
|
33
|
-
export { SettingsPanel } from './packem_shared/SettingsPanel-CBXQpYQA.js';
|
|
34
|
-
export { S as SqlEditorPanel } from './packem_shared/sql-editor-panel-Smfl_FDF.js';
|
|
35
|
-
export { FileBrowser } from './packem_shared/FileBrowser-0pCpdKPE.js';
|
|
36
|
-
export { DEFAULT_AUTO_REFRESH_MS, useAutoRefresh } from './packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
|
|
37
|
-
export { default as useDebounced } from './packem_shared/useDebounced-Dxncpg6z.js';
|
|
38
|
-
export { DEFAULT_LOCALE, createStudioI18n, studioI18n, useT } from './packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
|
|
39
|
-
export { StudioI18nProvider } from './packem_shared/StudioI18nProvider-B-tDCZIi.js';
|
|
40
|
-
export { ADMIN_FUNCTIONS, ADMIN_FUNCTION_PREFIX } from './packem_shared/ADMIN_FUNCTIONS-DjXgvJb6.js';
|
|
41
|
-
export { default as STUDIO_ROOT_CLASS } from './packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js';
|
|
1
|
+
import{StudioApp as r}from"./packem_shared/StudioApp-bXhJeLlZ.js";import{CommandPalette as a,openCommandPalette as f}from"./packem_shared/CommandPalette--SQwfTW1.js";import{S as m}from"./packem_shared/studio-q-C-acL7.js";import{ConfirmButton as x}from"./packem_shared/ConfirmButton-CTL3f3kr.js";import{default as s}from"./packem_shared/ConnectionBadge-DOk0CQWo.js";import{ErrorBoundary as d}from"./packem_shared/ErrorBoundary-DvzYskH7.js";import{ShardInput as P}from"./packem_shared/ShardInput-BVn2iCU0.js";import{DEFAULT_INSIGHT_THRESHOLDS as A,deriveInsights as c}from"./packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js";import{InsightsPanel as T}from"./packem_chunks/InsightsPanel.js";import{default as g}from"./packem_chunks/SecurityAdvisorPanel.js";import{default as F}from"./packem_shared/ApiDocsPanel-DfUQ1ZAF.js";import{default as R}from"./packem_shared/ApiReferencePanel-9q8BbJl-.js";import{default as C}from"./packem_chunks/ApiTab.js";import{default as H}from"./packem_shared/OpenRpcReferencePanel-qOZcWXMs.js";import{DataBrowser as N}from"./packem_shared/DataBrowser-CuRlztBz.js";import{DataFilters as U,toFilterClauses as B}from"./packem_shared/DataFilters-B26ZeqBZ.js";import{GlobalDataBrowser as w}from"./packem_shared/GlobalDataBrowser-DB-vQ2_H.js";import{TableEditor as y}from"./packem_chunks/TableEditor.js";import{ExportImportPanel as q}from"./packem_chunks/ExportImportPanel.js";import{MigrationsPanel as V}from"./packem_shared/MigrationsPanel-C2OnsqRb.js";import{PitrPanel as j}from"./packem_chunks/PitrPanel.js";import{FunctionRunner as z}from"./packem_chunks/FunctionRunner.js";import{FunctionStatsPanel as Q}from"./packem_chunks/FunctionStatsPanel.js";import{DeploymentHealthPanel as Y}from"./packem_chunks/DeploymentHealthPanel.js";import{H as $}from"./packem_shared/home-panel-CU6MWLHG.js";import{AuditPanel as oe}from"./packem_chunks/AuditPanel.js";import{LogsPanel as te}from"./packem_chunks/LogsPanel.js";import{MailPanel as fe}from"./packem_chunks/MailPanel.js";import{ScheduledJobs as me}from"./packem_shared/ScheduledJobs-D8kBZWBu.js";import{NotificationsPanel as xe}from"./packem_chunks/NotificationsPanel.js";import{HealthPanel as se}from"./packem_chunks/HealthPanel.js";import{aggregateMetrics as de,shardsToAggregate as ue}from"./packem_shared/aggregateMetrics-BNfajLa2.js";import{MetricsPanel as Se}from"./packem_chunks/MetricsPanel.js";import{SchemaViewer as ce}from"./packem_chunks/SchemaViewer.js";import{SettingsPanel as Te}from"./packem_chunks/SettingsPanel.js";import{SqlEditorPanel as ge}from"./packem_chunks/SqlEditorPanel.js";import{FileBrowser as Fe}from"./packem_chunks/FileBrowser.js";import{DEFAULT_AUTO_REFRESH_MS as Re,useAutoRefresh as he}from"./packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{default as Oe}from"./packem_shared/useDebounced-Ihdiid_k.js";import{DEFAULT_LOCALE as Le,createStudioI18n as Ne,studioI18n as Me,useT as Ue}from"./packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{StudioI18nProvider as be}from"./packem_shared/StudioI18nProvider-CZ5h4nrV.js";import{ADMIN_FUNCTIONS as ve,ADMIN_FUNCTION_PREFIX as ye}from"./packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{default as qe}from"./packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.js";export{ve as ADMIN_FUNCTIONS,ye as ADMIN_FUNCTION_PREFIX,F as ApiDocsPanel,R as ApiReferencePanel,C as ApiTab,oe as AuditPanel,a as CommandPalette,x as ConfirmButton,s as ConnectionBadge,Re as DEFAULT_AUTO_REFRESH_MS,A as DEFAULT_INSIGHT_THRESHOLDS,Le as DEFAULT_LOCALE,N as DataBrowser,U as DataFilters,Y as DeploymentHealthPanel,d as ErrorBoundary,q as ExportImportPanel,Fe as FileBrowser,z as FunctionRunner,Q as FunctionStatsPanel,w as GlobalDataBrowser,se as HealthPanel,$ as HomePanel,T as InsightsPanel,te as LogsPanel,fe as MailPanel,Se as MetricsPanel,V as MigrationsPanel,xe as NotificationsPanel,H as OpenRpcReferencePanel,j as PitrPanel,qe as STUDIO_ROOT_CLASS,me as ScheduledJobs,ce as SchemaViewer,g as SecurityAdvisorPanel,Te as SettingsPanel,P as ShardInput,ge as SqlEditorPanel,m as Studio,r as StudioApp,be as StudioI18nProvider,y as TableEditor,de as aggregateMetrics,Ne as createStudioI18n,c as deriveInsights,f as openCommandPalette,ue as shardsToAggregate,Me as studioI18n,B as toFilterClauses,he as useAutoRefresh,Oe as useDebounced,Ue as useT};
|
package/dist/mount.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { Root } from 'react-dom/client';
|
|
2
|
-
import { S as StudioAppProps } from "./packem_shared/app.d-
|
|
2
|
+
import { S as StudioAppProps } from "./packem_shared/app.d-DW7yZsfu.js";
|
|
3
3
|
import '@lunora/client';
|
|
4
4
|
import 'react';
|
|
5
5
|
import '@lingui/core';
|
|
6
6
|
interface MountStudioOptions extends StudioAppProps {
|
|
7
7
|
/**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
* The container to mount into. Accepts an element or a selector; defaults to
|
|
9
|
+
* `#root`. Throws if the selector matches nothing so misconfiguration fails
|
|
10
|
+
* loudly rather than silently rendering nowhere.
|
|
11
|
+
*/
|
|
12
12
|
readonly container?: Element | string;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* Mount the batteries-included {@link StudioApp} into the DOM and return the
|
|
16
|
-
* React root (call `.unmount()` to tear it down). This is the entry the
|
|
17
|
-
* standalone app's `main.tsx` and the `@lunora/vite` dev route both call — it
|
|
18
|
-
* keeps the host HTML to a single `<div id="root">` plus one script.
|
|
19
|
-
*/
|
|
15
|
+
* Mount the batteries-included {@link StudioApp} into the DOM and return the
|
|
16
|
+
* React root (call `.unmount()` to tear it down). This is the entry the
|
|
17
|
+
* standalone app's `main.tsx` and the `@lunora/vite` dev route both call — it
|
|
18
|
+
* keeps the host HTML to a single `<div id="root">` plus one script.
|
|
19
|
+
*/
|
|
20
20
|
declare const mountStudio: (options?: MountStudioOptions) => Root;
|
|
21
21
|
export { MountStudioOptions, mountStudio };
|
package/dist/mount.js
CHANGED
|
@@ -1,26 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { StudioApp } from './packem_shared/StudioApp-ColQCvC_.js';
|
|
3
|
-
import { jsxDEV } from 'react/jsx-dev-runtime';
|
|
4
|
-
|
|
5
|
-
const mountStudio = (options = {}) => {
|
|
6
|
-
const {
|
|
7
|
-
container = "#root",
|
|
8
|
-
...appProps
|
|
9
|
-
} = options;
|
|
10
|
-
const element = typeof container === "string" ? document.querySelector(container) : container;
|
|
11
|
-
if (element === null) {
|
|
12
|
-
throw new Error(`mountStudio: container ${typeof container === "string" ? container : "element"} not found`);
|
|
13
|
-
}
|
|
14
|
-
const root = createRoot(element);
|
|
15
|
-
root.render(/* @__PURE__ */ jsxDEV(StudioApp, {
|
|
16
|
-
adminToken: appProps.adminToken,
|
|
17
|
-
basePath: appProps.basePath,
|
|
18
|
-
baseUrl: appProps.baseUrl,
|
|
19
|
-
locale: appProps.locale,
|
|
20
|
-
rulesInstalled: appProps.rulesInstalled,
|
|
21
|
-
studio: appProps.studio
|
|
22
|
-
}, void 0, false));
|
|
23
|
-
return root;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export { mountStudio };
|
|
1
|
+
import{LunoraError as a}from"@lunora/errors";import{createRoot as s}from"react-dom/client";import{StudioApp as i}from"./packem_shared/StudioApp-bXhJeLlZ.js";import{jsx as l}from"react/jsx-runtime";const p=(n={})=>{const{container:t="#root",...o}=n,e=typeof t=="string"?document.querySelector(t):t;if(e===null)throw new a("INTERNAL",`mountStudio: container ${typeof t=="string"?t:"element"} not found`);const r=s(e);return r.render(l(i,{adminToken:o.adminToken,basePath:o.basePath,baseUrl:o.baseUrl,locale:o.locale,rulesInstalled:o.rulesInstalled,studio:o.studio})),r};export{p as mountStudio};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as q}from"react/compiler-runtime";import{useState as j}from"react";import{u as k}from"../packem_shared/button-BkCrNcAs.js";import{useT as F}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import M from"../packem_shared/ApiDocsPanel-DfUQ1ZAF.js";import V from"../packem_shared/ApiReferencePanel-9q8BbJl-.js";import W from"../packem_shared/OpenRpcReferencePanel-qOZcWXMs.js";import{jsx as o,jsxs as T}from"react/jsx-runtime";const B=["reference","snippets"],E=["openapi","openrpc"],Z=I=>{const e=q(51),{functions:$,initialShardKey:A,openApiSpec:P,openRpcSpec:_}=I,t=F(),[r,O]=j("reference"),[l,z]=j("openapi");let i;e[0]!==t?(i=t("Reference"),e[0]=t,e[1]=i):i=e[1];let n;e[2]!==t?(n=t("Snippets"),e[2]=t,e[3]=n):n=e[3];let g;e[4]!==i||e[5]!==n?(g={reference:i,snippets:n},e[4]=i,e[5]=n,e[6]=g):g=e[6];const C=g;let p;e[7]!==t?(p=t("OpenAPI"),e[7]=t,e[8]=p):p=e[8];let s;e[9]!==t?(s=t("OpenRPC"),e[9]=t,e[10]=s):s=e[10];let w;e[11]!==p||e[12]!==s?(w={openapi:p,openrpc:s},e[11]=p,e[12]=s,e[13]=w):w=e[13];const R=w;let y;e[14]===Symbol.for("react.memo_cache_sentinel")?(y=a=>{O(a.currentTarget.dataset.view)},e[14]=y):y=e[14];const D=y;let S;e[15]===Symbol.for("react.memo_cache_sentinel")?(S=a=>{z(a.currentTarget.dataset.format)},e[15]=S):S=e[15];const K=S;let c;e[16]!==t?(c=t("API view"),e[16]=t,e[17]=c):c=e[17];let m;e[18]!==r||e[19]!==C?(m=B.map(a=>o(k,{"aria-selected":r===a,"data-testid":`api-view-${a}`,"data-view":a,onClick:D,role:"tab",size:"sm",type:"button",variant:r===a?"default":"outline",children:C[a]},a)),e[18]=r,e[19]=C,e[20]=m):m=e[20];let f;e[21]!==m||e[22]!==c?(f=o("div",{"aria-label":c,className:"flex gap-1.5","data-testid":"api-view-toggle",role:"tablist",children:m}),e[21]=m,e[22]=c,e[23]=f):f=e[23];let d;e[24]!==l||e[25]!==R||e[26]!==t||e[27]!==r?(d=r==="reference"&&o("div",{"aria-label":t("API spec format"),className:"flex gap-1.5","data-testid":"api-format-toggle",role:"tablist",children:E.map(a=>o(k,{"aria-selected":l===a,"data-format":a,"data-testid":`api-format-${a}`,onClick:K,role:"tab",size:"sm",type:"button",variant:l===a?"default":"outline",children:R[a]},a))}),e[24]=l,e[25]=R,e[26]=t,e[27]=r,e[28]=d):d=e[28];let h;e[29]!==f||e[30]!==d?(h=T("div",{className:"flex shrink-0 flex-wrap items-center gap-3 border-b border-border px-6 py-3",children:[f,d]}),e[29]=f,e[30]=d,e[31]=h):h=e[31];let u;e[32]!==$||e[33]!==A||e[34]!==r?(u=r==="snippets"&&o("div",{className:"min-h-0 flex-1 overflow-y-auto p-6",children:o(M,{functions:$,initialShardKey:A})}),e[32]=$,e[33]=A,e[34]=r,e[35]=u):u=e[35];let b;e[36]!==l||e[37]!==P||e[38]!==r?(b=r==="reference"&&l==="openapi"&&o(V,{spec:P}),e[36]=l,e[37]=P,e[38]=r,e[39]=b):b=e[39];let v;e[40]!==l||e[41]!==_||e[42]!==r?(v=r==="reference"&&l==="openrpc"&&o(W,{spec:_}),e[40]=l,e[41]=_,e[42]=r,e[43]=v):v=e[43];let x;e[44]!==u||e[45]!==b||e[46]!==v?(x=T("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",children:[u,b,v]}),e[44]=u,e[45]=b,e[46]=v,e[47]=x):x=e[47];let N;return e[48]!==h||e[49]!==x?(N=T("div",{className:"flex min-h-0 flex-1 flex-col","data-testid":"lunora-api-tab",children:[h,x]}),e[48]=h,e[49]=x,e[50]=N):N=e[50],N};export{Z as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useVirtualizer as j,observeElementRect as F}from"@tanstack/react-virtual";import{useState as w,useMemo as S,useRef as H}from"react";import{E as K}from"../packem_shared/error-alert-t6cpEi0z.js";import{L as O}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as P}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as _}from"../packem_shared/badge-BbuuAio7.js";import{c as q,u as B}from"../packem_shared/card-CIDGUN6K.js";import{E as D}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as J}from"../packem_shared/input-JHu63lTv.js";import{n as U,d as W,m as L,p as l,f as Z,u as d}from"../packem_shared/table-DdJBrClo.js";import{N as G}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import Q from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Y}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{i as ee}from"../packem_shared/internal-BSIsQVC6.js";import{jsxs as n,jsx as e}from"react/jsx-runtime";const $=80,te=i=>{if(i===void 0)return"";const t=JSON.stringify(i);return t.length>$?`${t.slice(0,$)}…`:t},re=41,y=480,b=5,ae=(i,t)=>F(i,o=>{t(o.height>0?o:{height:y,width:o.width})}),we=({initialShardKey:i})=>{const t=X(),[o,C]=w(i??""),[m,E]=w(""),I=Q(o.trim(),400),{data:u,error:p,errorSource:A,isLoading:M,liveError:R}=G(Y.getAuditLog,{},{live:!0,shardKey:I}),c=S(()=>u?.entries??[],[u]),s=S(()=>{const a=m.trim().toLowerCase();return a===""?c:c.filter(r=>r.op.toLowerCase().includes(a)||(r.table??"").toLowerCase().includes(a)||(r.id??"").toLowerCase().includes(a))},[c,m]),f=H(null),g=j({count:s.length,estimateSize:()=>re,getScrollElement:()=>f.current,initialRect:{height:y,width:800},observeElementRect:ae,overscan:8}),h=g.getVirtualItems(),T=g.getTotalSize(),x=h[0]?.start??0,v=T-(h.at(-1)?.end??0),k={height:x},z={height:v},V=a=>{E(a.target.value)};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-audit",children:[n("div",{className:"flex flex-wrap items-center gap-2",children:[e(P,{onChange:C,testId:"au-shard-input",value:o}),e(O,{message:R,prefix:"au"}),e(J,{"aria-label":t("Filter audit log"),className:"h-8 w-48","data-testid":"au-search",onChange:V,placeholder:t("filter op, table, id"),value:m})]}),p!==null&&e(K,{error:A,testId:"au-error"}),p===null&&!M&&s.length===0&&e(D,{description:t("State-changing admin operations are recorded here."),icon:e("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:e("path",{d:"M8 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2h-2M9 3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V3Zm-1 9h8m-8 4h5"})}),testId:"au-empty",title:t("No audit entries.")}),s.length>0&&e(q,{className:"overflow-hidden py-0",children:e(B,{className:"max-h-[30rem] overflow-auto px-0",ref:f,children:n(U,{"data-testid":"au-table",children:[e(W,{children:n(L,{children:[e(l,{children:t("time")}),e(l,{children:t("op")}),e(l,{children:t("table")}),e(l,{children:t("id")}),e(l,{children:t("detail")})]})}),n(Z,{children:[x>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:k})}),h.map(a=>{const r=s[a.index],N=te(r.detail);return n(L,{"data-testid":"au-row",children:[e(d,{className:"text-muted-foreground tabular-nums",children:ee(r.ts,"—")}),e(d,{children:e(_,{variant:"secondary",children:r.op})}),e(d,{className:"font-medium",children:r.table??e("span",{className:"text-muted-foreground",children:"—"})}),e(d,{className:"max-w-[20ch] truncate font-mono text-xs",children:r.id??e("span",{className:"text-muted-foreground",children:"—"})}),e(d,{className:"max-w-[32ch] truncate font-mono text-xs text-muted-foreground",title:N||void 0,children:N||e("span",{className:"text-muted-foreground",children:"—"})})]},r.seq)}),v>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:z})})]})]})})})]})};export{we as AuditPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as ie}from"react/compiler-runtime";import{useLunora as ce}from"@lunora/react";import{useQuery as me}from"@tanstack/react-query";import{g as le}from"../packem_shared/badge-BbuuAio7.js";import{c as se}from"../packem_shared/card-CIDGUN6K.js";import{E as pe}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as re}from"../packem_shared/skeleton-C1wQ9M5t.js";import{useT as he}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{i as ue}from"../packem_shared/internal-BSIsQVC6.js";import{c as te}from"../packem_shared/utils-bhneXptQ.js";import{jsxs as o,jsx as l}from"react/jsx-runtime";const fe="/_lunora/health",ge="/_lunora/health/ready",xe=(n,e)=>(n.endsWith("/")?n.slice(0,-1):n)+e,Ne=()=>{const n=ce();return async e=>{const w=e==="ready"?ge:fe,t=n.getAuthToken(),$=xe(n.url,w);try{const r=await fetch($,{headers:t===null?{}:{authorization:`Bearer ${t}`}});let d=null;try{d=await r.json()}catch{d=null}return{body:d,ok:r.ok,status:r.status}}catch(r){return{body:null,error:r instanceof Error?r.message:String(r),ok:!1,status:0}}}},de={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ve={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},ye=n=>n==="unhealthy"?"crit":n==="degraded"?"warn":"ok",ne=n=>{const e=ie(13),{label:w,level:t,testId:$,value:r}=n,d=de[t];let c;e[0]!==d?(c=te("size-1.5 shrink-0 rounded-full",d),e[0]=d,e[1]=c):c=e[1];let m;e[2]!==c?(m=l("span",{"aria-hidden":"true",className:c}),e[2]=c,e[3]=m):m=e[3];let x;e[4]!==w||e[5]!==m?(x=o("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[m,w]}),e[4]=w,e[5]=m,e[6]=x):x=e[6];let N;e[7]!==$||e[8]!==r?(N=l("span",{className:"text-lg font-semibold text-foreground","data-testid":$,children:r}),e[7]=$,e[8]=r,e[9]=N):N=e[9];let u;return e[10]!==x||e[11]!==N?(u=l(se,{className:"gap-0 py-0",children:o("div",{className:"flex flex-col gap-2.5 p-4",children:[x,N]})}),e[10]=x,e[11]=N,e[12]=u):u=e[12],u},Ie=n=>{const e=ie(115),{probe:w}=n,t=he(),$=Ne(),r=w??$;let d;e[0]!==r?(d=async()=>{const[a,i]=await Promise.all([r("live"),r("ready")]);return{live:a,ready:i}},e[0]=r,e[1]=d):d=e[1];let c;e[2]===Symbol.for("react.memo_cache_sentinel")?(c=["deployment-health"],e[2]=c):c=e[2];let m;e[3]!==d?(m={queryFn:d,queryKey:c},e[3]=d,e[4]=m):m=e[4];const{data:x,isPending:N}=me(m),u=x?.live??null,oe=x?.ready??null;if(N){let a;return e[5]===Symbol.for("react.memo_cache_sentinel")?(a=o("div",{className:"flex flex-col gap-4","data-testid":"deployment-health-loading",children:[l(re,{className:"h-16 w-full"}),l(re,{className:"h-40 w-full"})]}),e[5]=a):a=e[5],a}const s=u?.body??null;if(s===null){const a=u?.status===403;let i;e[6]!==a||e[7]!==u?.error||e[8]!==t?(i=a?t("The health endpoint is in the admin posture. Paste a valid admin token in the connect popover, or set its auth to public."):t("Couldn't reach the health endpoint: {message}",{message:u?.error??t("no response")}),e[6]=a,e[7]=u?.error,e[8]=t,e[9]=i):i=e[9];let f;e[10]!==t?(f=t("Health endpoint unavailable"),e[10]=t,e[11]=f):f=e[11];let h;return e[12]!==i||e[13]!==f?(h=l(pe,{description:i,testId:"deployment-health-error",title:f}),e[12]=i,e[13]=f,e[14]=h):h=e[14],h}let Z;e[15]!==s.status?(Z=ye(s.status),e[15]=s.status,e[16]=Z):Z=e[16];const _=Z;let p;if(s.status==="unhealthy"){let a;e[17]!==t?(a=t("Unhealthy"),e[17]=t,e[18]=a):a=e[18],p=a}else if(s.status==="degraded"){let a;e[19]!==t?(a=t("Degraded"),e[19]=t,e[20]=a):a=e[20],p=a}else{let a;e[21]!==t?(a=t("Healthy"),e[21]=t,e[22]=a):a=e[22],p=a}const j=oe?.ok??!1,Y=j?"ok":"crit";let C,P,v,y,b,S,z,k,V,H;if(e[23]!==s.appName||e[24]!==s.appVersion||e[25]!==s.checks||e[26]!==s.timestamp||e[27]!==_||e[28]!==Y||e[29]!==j||e[30]!==p||e[31]!==t){const a=[...s.checks].toSorted(be);H="flex flex-col gap-6",P="deployment-health";let i;e[42]!==t?(i=t("Live liveness, readiness, and per-binding health from the deployment's /_lunora/health endpoint — wire an uptime monitor or a Cloudflare Health Check at it."),e[42]=t,e[43]=i):i=e[43],e[44]!==i?(v=l("p",{className:"text-sm text-muted-foreground",children:i}),e[44]=i,e[45]=v):v=e[45];const f=ve[_];let h;e[46]!==f?(h=te("flex size-10 shrink-0 items-center justify-center rounded-full",f),e[46]=f,e[47]=h):h=e[47];const ae=de[_];let T;e[48]!==ae?(T=te("size-3 rounded-full",ae),e[48]=ae,e[49]=T):T=e[49];let D;e[50]!==T?(D=l("span",{className:T}),e[50]=T,e[51]=D):D=e[51];let E;e[52]!==h||e[53]!==D?(E=l("span",{"aria-hidden":"true",className:h,children:D}),e[52]=h,e[53]=D,e[54]=E):E=e[54];let L;e[55]!==p?(L=l("span",{className:"text-sm font-semibold text-foreground","data-testid":"dh-status",children:p}),e[55]=p,e[56]=L):L=e[56];let q;e[57]!==s.appName||e[58]!==s.appVersion?(q=o("span",{className:"font-mono text-[13px] text-muted-foreground","data-testid":"dh-app",children:[s.appName," · ",s.appVersion]}),e[57]=s.appName,e[58]=s.appVersion,e[59]=q):q=e[59];let R;e[60]!==L||e[61]!==q?(R=o("div",{className:"grid leading-tight",children:[L,q]}),e[60]=L,e[61]=q,e[62]=R):R=e[62];let U;e[63]!==E||e[64]!==R?(U=o("div",{className:"flex items-center gap-3",children:[E,R]}),e[63]=E,e[64]=R,e[65]=U):U=e[65];let A;e[66]!==t?(A=t("Checked"),e[66]=t,e[67]=A):A=e[67];let B;e[68]!==A?(B=l("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:A}),e[68]=A,e[69]=B):B=e[69];let F;e[70]!==s.timestamp?(F=ue(s.timestamp),e[70]=s.timestamp,e[71]=F):F=e[71];let K;e[72]!==F?(K=l("time",{className:"text-[13px] text-muted-foreground","data-testid":"dh-timestamp",children:F}),e[72]=F,e[73]=K):K=e[73];let Q;e[74]!==B||e[75]!==K?(Q=o("div",{className:"text-end",children:[B,K]}),e[74]=B,e[75]=K,e[76]=Q):Q=e[76],e[77]!==U||e[78]!==Q?(y=l(se,{className:"gap-0 py-0",children:o("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[U,Q]})}),e[77]=U,e[78]=Q,e[79]=y):y=e[79];let W;e[80]!==t?(W=t("Liveness"),e[80]=t,e[81]=W):W=e[81];let G;e[82]!==_||e[83]!==p||e[84]!==W?(G=l(ne,{label:W,level:_,testId:"dh-liveness",value:p}),e[82]=_,e[83]=p,e[84]=W,e[85]=G):G=e[85];let J;e[86]!==t?(J=t("Readiness"),e[86]=t,e[87]=J):J=e[87];let M;e[88]!==j||e[89]!==t?(M=t(j?"Ready":"Not ready"),e[88]=j,e[89]=t,e[90]=M):M=e[90];let O;e[91]!==Y||e[92]!==J||e[93]!==M?(O=l(ne,{label:J,level:Y,testId:"dh-readiness",value:M}),e[91]=Y,e[92]=J,e[93]=M,e[94]=O):O=e[94],e[95]!==G||e[96]!==O?(b=o("div",{className:"grid gap-3 sm:grid-cols-2","data-testid":"dh-probes",children:[G,O]}),e[95]=G,e[96]=O,e[97]=b):b=e[97],C=se,S="gap-0 py-0",z="dh-checks";let X;e[98]!==t?(X=t("Subsystem checks"),e[98]=t,e[99]=X):X=e[99],e[100]!==X?(k=l("header",{className:"border-b border-border px-4 py-3",children:l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:X})}),e[100]=X,e[101]=k):k=e[101],V=a.length===0?l("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"dh-checks-empty",children:t("No checks reported.")}):l("ul",{className:"divide-y divide-border",children:a.map(g=>o("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2.5 text-xs","data-testid":`dh-check-${g.name}`,children:[o("span",{className:"flex items-center gap-2",children:[l("span",{"aria-hidden":"true",className:te("size-1.5 shrink-0 rounded-full",g.status==="up"?"bg-success":"bg-destructive")}),l("span",{className:"font-mono text-foreground",children:g.name}),g.critical&&l(le,{variant:"outline",children:t("Critical")})]}),o("span",{className:"flex shrink-0 items-center gap-2",children:[g.message!==void 0&&l("span",{className:"text-muted-foreground",children:g.message}),l(le,{"data-testid":`dh-check-status-${g.name}`,variant:g.status==="up"?"secondary":"destructive",children:g.status==="up"?t("Up"):t("Down")})]})]},g.name))}),e[23]=s.appName,e[24]=s.appVersion,e[25]=s.checks,e[26]=s.timestamp,e[27]=_,e[28]=Y,e[29]=j,e[30]=p,e[31]=t,e[32]=C,e[33]=P,e[34]=v,e[35]=y,e[36]=b,e[37]=S,e[38]=z,e[39]=k,e[40]=V,e[41]=H}else C=e[32],P=e[33],v=e[34],y=e[35],b=e[36],S=e[37],z=e[38],k=e[39],V=e[40],H=e[41];let I;e[102]!==C||e[103]!==S||e[104]!==z||e[105]!==k||e[106]!==V?(I=o(C,{className:S,"data-testid":z,children:[k,V]}),e[102]=C,e[103]=S,e[104]=z,e[105]=k,e[106]=V,e[107]=I):I=e[107];let ee;return e[108]!==P||e[109]!==v||e[110]!==y||e[111]!==b||e[112]!==I||e[113]!==H?(ee=o("div",{className:H,"data-testid":P,children:[v,y,b,I]}),e[108]=P,e[109]=v,e[110]=y,e[111]=b,e[112]=I,e[113]=H,e[114]=ee):ee=e[114],ee};function be(n,e){return n.name.localeCompare(e.name)}export{Ie as DeploymentHealthPanel};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{c as xe}from"react/compiler-runtime";import{LunoraError as ne}from"@lunora/errors";import{useLunora as be}from"@lunora/react";import{useState as q}from"react";import{ConfirmButton as he}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{ShardInput as ge}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as Ne}from"../packem_shared/button-BkCrNcAs.js";import{u as ie,c as ce}from"../packem_shared/card-CIDGUN6K.js";import{l as we}from"../packem_shared/textarea-Bu2-jKAs.js";import{U as ye}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import{useT as Se}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{d as de,b as oe,f as me,g as fe}from"../packem_shared/internal-BSIsQVC6.js";import{r as pe}from"../packem_shared/shard-history-DMEW5VBE.js";import{jsx as l,jsxs as h}from"react/jsx-runtime";const Ie=fe(Z.exportShard),ve=fe(Z.importShard),je=u=>u.map(e=>JSON.stringify(e)).join(`
|
|
2
|
+
`),$e=u=>{const e=[],ee=u.split(`
|
|
3
|
+
`);for(const[a,g]of ee.entries()){const t=g.trim();if(t==="")continue;const r=JSON.parse(t);if(typeof r!="object"||r===null)throw new ne("INTERNAL",`line ${(a+1).toString()}: expected a { table, doc } object`);const x=r;if(typeof x.table!="string"||typeof x.doc!="object"||x.doc===null||Array.isArray(x.doc))throw new ne("INTERNAL",`line ${(a+1).toString()}: expected a { table, doc } object`);e.push(x)}return e},Be=u=>{const e=xe(94),{initialShardKey:ee}=u,a=be(),g=ye(),t=Se(),[r,x]=q(ee??""),[o,se]=q(""),[c,B]=q(!1),[H,K]=q(null),[n,te]=q(null),[N,ae]=q(null);let Q;e[0]!==a||e[1]!==r?(Q=async()=>{B(!0),K(null),te(null);try{const i=await a.query(Ie,{},de(r));pe(r),se(je(i.rows)),ae(i.rows.length)}catch(i){K(oe(i))}B(!1)},e[0]=a,e[1]=r,e[2]=Q):Q=e[2];const z=Q;let V;e[3]!==a||e[4]!==g||e[5]!==o||e[6]!==r||e[7]!==t?(V=async()=>{B(!0),K(null),te(null),ae(null);let i;try{i=$e(o)}catch(s){K(t("Invalid NDJSON: {message}",{message:oe(s)})),B(!1);return}try{const s=await a.query(ve,{rows:i},de(r));pe(r),te(s),g(Z.readTablePage),g(Z.listTables)}catch(s){K(oe(s))}B(!1)},e[3]=a,e[4]=g,e[5]=o,e[6]=r,e[7]=t,e[8]=V):V=e[8];const G=V;let w,y,S,d,I,m,p,v,j,f,$;if(e[9]!==c||e[10]!==N||e[11]!==z||e[12]!==n||e[13]!==G||e[14]!==o||e[15]!==r||e[16]!==t){const i=n===null?0:Object.values(n.inserted).reduce(Ee,0);let s;e[28]!==z?(s=()=>{me(z())},e[28]=z,e[29]=s):s=e[29];const re=s;let X;e[30]!==G?(X=()=>{me(G())},e[30]=G,e[31]=X):X=e[31];const le=X;let Y;e[32]===Symbol.for("react.memo_cache_sentinel")?(Y=b=>{se(b.target.value)},e[32]=Y):Y=e[32];const ue=Y;$="flex flex-col gap-4",S="lunora-export-import";let C;e[33]!==t?(C=t("Export"),e[33]=t,e[34]=C):C=e[34];let T;e[35]!==C?(T=l("header",{className:"border-b border-border px-4 py-3",children:l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:C})}),e[35]=C,e[36]=T):T=e[36];let L;e[37]!==r?(L=l(ge,{onChange:x,testId:"ei-shard-input",value:r}),e[37]=r,e[38]=L):L=e[38];let J;e[39]!==t?(J=t("Export"),e[39]=t,e[40]=J):J=e[40];let R;e[41]!==c||e[42]!==re||e[43]!==J?(R=l(Ne,{"data-testid":"ei-export",disabled:c,onClick:re,type:"button",children:J}),e[41]=c,e[42]=re,e[43]=J,e[44]=R):R=e[44];let _;e[45]!==L||e[46]!==R?(_=h("div",{className:"flex flex-wrap items-center gap-2",children:[L,R]}),e[45]=L,e[46]=R,e[47]=_):_=e[47];let k;e[48]!==N||e[49]!==t?(k=N!==null&&l("p",{className:"text-sm text-muted-foreground","data-testid":"ei-export-result",children:t("Exported {count} rows.",{count:N})}),e[48]=N,e[49]=t,e[50]=k):k=e[50];let D;e[51]!==_||e[52]!==k?(D=h(ie,{className:"flex flex-col gap-3 p-4",children:[_,k]}),e[51]=_,e[52]=k,e[53]=D):D=e[53],e[54]!==T||e[55]!==D?(d=h(ce,{className:"rounded-xl border border-border bg-card shadow-xs",children:[T,D]}),e[54]=T,e[55]=D,e[56]=d):d=e[56],y=ce,j="rounded-xl border border-border bg-card shadow-xs";let F;e[57]!==t?(F=t("Import"),e[57]=t,e[58]=F):F=e[58],e[59]!==F?(f=l("header",{className:"border-b border-border px-4 py-3",children:l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:F})}),e[59]=F,e[60]=f):f=e[60],w=ie,I="flex flex-col gap-3 p-4",e[61]!==o?(m=l(we,{"aria-label":"NDJSON",className:"font-mono text-xs min-h-40 rounded-md","data-testid":"ei-ndjson",onChange:ue,placeholder:'{"table":"messages","doc":{…}}',value:o}),e[61]=o,e[62]=m):m=e[62];let M;e[63]!==t?(M=t("Import (writes rows)?"),e[63]=t,e[64]=M):M=e[64];let P;e[65]!==c||e[66]!==o?(P=c||o.trim()==="",e[65]=c,e[66]=o,e[67]=P):P=e[67];let U;e[68]!==t?(U=t("Import"),e[68]=t,e[69]=U):U=e[69],e[70]!==le||e[71]!==M||e[72]!==P||e[73]!==U?(p=l("div",{className:"flex flex-wrap items-center gap-2",children:l(he,{confirmLabel:M,disabled:P,onConfirm:le,testId:"ei-import",children:U})}),e[70]=le,e[71]=M,e[72]=P,e[73]=U,e[74]=p):p=e[74],v=n!==null&&h("div",{className:"flex flex-col gap-2","data-testid":"ei-import-result",children:[l("p",{className:"text-sm text-muted-foreground",children:t("Inserted {inserted}, {conflicts} conflicts, {errors} errors.",{conflicts:n.conflicts,errors:n.errors.length,inserted:i})}),n.errors.length>0&&l("ul",{className:"flex flex-col gap-1","data-testid":"ei-import-errors",children:n.errors.map(b=>l("li",{className:"text-xs text-destructive",children:t("line {line} ({table}): {message}",{line:b.line,message:b.message,table:b.table})},`${b.table}-${b.line.toString()}`))})]}),e[9]=c,e[10]=N,e[11]=z,e[12]=n,e[13]=G,e[14]=o,e[15]=r,e[16]=t,e[17]=w,e[18]=y,e[19]=S,e[20]=d,e[21]=I,e[22]=m,e[23]=p,e[24]=v,e[25]=j,e[26]=f,e[27]=$}else w=e[17],y=e[18],S=e[19],d=e[20],I=e[21],m=e[22],p=e[23],v=e[24],j=e[25],f=e[26],$=e[27];let E;e[75]!==w||e[76]!==I||e[77]!==m||e[78]!==p||e[79]!==v?(E=h(w,{className:I,children:[m,p,v]}),e[75]=w,e[76]=I,e[77]=m,e[78]=p,e[79]=v,e[80]=E):E=e[80];let O;e[81]!==y||e[82]!==E||e[83]!==j||e[84]!==f?(O=h(y,{className:j,children:[f,E]}),e[81]=y,e[82]=E,e[83]=j,e[84]=f,e[85]=O):O=e[85];let A;e[86]!==H?(A=H!==null&&l("p",{className:"text-sm text-destructive","data-testid":"ei-error",role:"alert",children:H}),e[86]=H,e[87]=A):A=e[87];let W;return e[88]!==S||e[89]!==d||e[90]!==O||e[91]!==A||e[92]!==$?(W=h("div",{className:$,"data-testid":S,children:[d,O,A]}),e[88]=S,e[89]=d,e[90]=O,e[91]=A,e[92]=$,e[93]=W):W=e[93],W};function Ee(u,e){return u+e}export{Be as ExportImportPanel};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{c as M}from"react/compiler-runtime";import{useState as E,useEffect as le,useRef as he,useMemo as fe,useCallback as nt}from"react";import{ShardInput as ot}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{E as Se}from"../packem_shared/empty-state-Cg7t_8qu.js";import{useT as lt}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{z as st}from"../packem_shared/grid-features-jnrD0SpX.js";import{c as at,u as it}from"../packem_shared/card-CIDGUN6K.js";import{f as Ne}from"../packem_shared/checkbox-StT4Gob6.js";import{p as oe,d as ct,m as me,f as dt,n as ut,u as te}from"../packem_shared/table-DdJBrClo.js";import{k as Ce,f as q,b as ee,d as xe,g as $e,c as ft}from"../packem_shared/internal-BSIsQVC6.js";import{ConfirmButton as ht}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{g as ce}from"../packem_shared/badge-BbuuAio7.js";import{jsx as s,jsxs as T,Fragment as je}from"react/jsx-runtime";import{u as mt}from"../packem_shared/input-JHu63lTv.js";import{d as pt}from"../packem_shared/cf-links-gbDy51nR.js";import{useLunora as gt}from"@lunora/react";import{useAutoRefresh as bt}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{ADMIN_FUNCTIONS as ze}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";const Ke=(d,e,t)=>{const{onCopy:r,onDelete:l,onDownload:n,onToggleSelect:c}=t,i=()=>{r(d.key)},o=()=>{n(d.key)},u=()=>{l(d.key)},h=()=>{c(d.key)};return{copy:i,download:o,name:d.key.slice(e.length),remove:u,toggle:h}},De=d=>{const e=M(31),{busy:t,buttonClassName:r,copied:l,objectKey:n,onCopy:c,onDelete:i,onDownload:o,t:u}=d,h=`storage-copy-${n}`;let f;e[0]!==l||e[1]!==u?(f=u(l?"Copied":"Copy URL"),e[0]=l,e[1]=u,e[2]=f):f=e[2];let m;e[3]!==t||e[4]!==r||e[5]!==c||e[6]!==h||e[7]!==f?(m=s(se,{className:r,"data-testid":h,disabled:t,onClick:c,size:"sm",type:"button",variant:"ghost",children:f}),e[3]=t,e[4]=r,e[5]=c,e[6]=h,e[7]=f,e[8]=m):m=e[8];const k=`storage-download-${n}`;let a;e[9]!==u?(a=u("Download"),e[9]=u,e[10]=a):a=e[10];let v;e[11]!==t||e[12]!==r||e[13]!==o||e[14]!==k||e[15]!==a?(v=s(se,{className:r,"data-testid":k,disabled:t,onClick:o,size:"sm",type:"button",variant:"ghost",children:a}),e[11]=t,e[12]=r,e[13]=o,e[14]=k,e[15]=a,e[16]=v):v=e[16];let S;e[17]!==u?(S=u("Delete object?"),e[17]=u,e[18]=S):S=e[18];const y=`storage-delete-${n}`;let g;e[19]!==u?(g=u("Delete"),e[19]=u,e[20]=g):g=e[20];let x;e[21]!==t||e[22]!==i||e[23]!==S||e[24]!==y||e[25]!==g?(x=s(ht,{confirmLabel:S,disabled:t,onConfirm:i,testId:y,children:g}),e[21]=t,e[22]=i,e[23]=S,e[24]=y,e[25]=g,e[26]=x):x=e[26];let b;return e[27]!==x||e[28]!==m||e[29]!==v?(b=T(je,{children:[m,v,x]}),e[27]=x,e[28]=m,e[29]=v,e[30]=b):b=e[30],b},Te=d=>{const e=M(14),{objectKey:t,references:r,t:l}=d;if(r===void 0)return null;if(r.length===0){const h=`storage-orphan-${t}`;let f;e[0]!==l?(f=l("Orphan"),e[0]=l,e[1]=f):f=e[1];let m;return e[2]!==h||e[3]!==f?(m=s(ce,{"data-testid":h,variant:"warning",children:f}),e[2]=h,e[3]=f,e[4]=m):m=e[4],m}let n;e[5]!==r?(n=r.map(yt).join(`
|
|
2
|
+
`),e[5]=r,e[6]=n):n=e[6];const c=n,i=`storage-refs-${t}`;let o;e[7]!==r.length||e[8]!==l?(o=r.length===1?l("1 record"):l("{count} records",{count:r.length}),e[7]=r.length,e[8]=l,e[9]=o):o=e[9];let u;return e[10]!==c||e[11]!==i||e[12]!==o?(u=s(ce,{"data-testid":i,title:c,variant:"secondary",children:o}),e[10]=c,e[11]=i,e[12]=o,e[13]=u):u=e[13],u},Fe=d=>{const e=M(7),{objectKey:t,onToggle:r,selected:l,t:n}=d;let c;e[0]!==n?(c=n("Select row"),e[0]=n,e[1]=c):c=e[1];const i=`storage-select-${t}`;let o;return e[2]!==r||e[3]!==l||e[4]!==c||e[5]!==i?(o=s(Ne,{"aria-label":c,checked:l,"data-testid":i,onCheckedChange:r}),e[2]=r,e[3]=l,e[4]=c,e[5]=i,e[6]=o):o=e[6],o};function yt(d){return`${d.table}·${d.id}`}const xt=d=>{const e=M(10),{colSpan:t,name:r,onEnter:l}=d;let n;e[0]!==r||e[1]!==l?(n=()=>{l(r)},e[0]=r,e[1]=l,e[2]=n):n=e[2];const c=n;let i;e[3]===Symbol.for("react.memo_cache_sentinel")?(i=s("svg",{"aria-hidden":"true",className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:s("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})}),e[3]=i):i=e[3];let o;e[4]!==c||e[5]!==r?(o=T("button",{className:"inline-flex items-center gap-2 font-mono text-xs outline-none hover:text-foreground focus-visible:text-foreground","data-testid":"fb-folder",onClick:c,type:"button",children:[i,r]}),e[4]=c,e[5]=r,e[6]=o):o=e[6];let u;return e[7]!==t||e[8]!==o?(u=s(me,{children:s(te,{colSpan:t,children:o})}),e[7]=t,e[8]=o,e[9]=u):u=e[9],u},vt=d=>{const e=M(37),{busy:t,copiedKey:r,handlers:l,object:n,prefix:c,references:i,selected:o,showReferences:u,t:h}=d;let f;e[0]!==l||e[1]!==n||e[2]!==c?(f=Ke(n,c,l),e[0]=l,e[1]=n,e[2]=c,e[3]=f):f=e[3];const{copy:m,download:k,name:a,remove:v,toggle:S}=f;let y;e[4]!==n.key||e[5]!==o||e[6]!==h||e[7]!==S?(y=s(te,{className:"w-8",children:s(Fe,{objectKey:n.key,onToggle:S,selected:o,t:h})}),e[4]=n.key,e[5]=o,e[6]=h,e[7]=S,e[8]=y):y=e[8];let g;e[9]!==a?(g=s(te,{className:"font-mono text-xs",children:a}),e[9]=a,e[10]=g):g=e[10];let x;e[11]!==n.size?(x=Ce(n.size),e[11]=n.size,e[12]=x):x=e[12];let b;e[13]!==x?(b=s(te,{className:"tabular-nums text-muted-foreground",children:x}),e[13]=x,e[14]=b):b=e[14];const C=n.httpMetadata?.contentType??"";let w;e[15]!==C?(w=s(te,{children:C}),e[15]=C,e[16]=w):w=e[16];let N;e[17]!==n.key||e[18]!==i||e[19]!==u||e[20]!==h?(N=u&&s(te,{children:s(Te,{objectKey:n.key,references:i,t:h})}),e[17]=n.key,e[18]=i,e[19]=u,e[20]=h,e[21]=N):N=e[21];const z=r===n.key;let $;e[22]!==t||e[23]!==m||e[24]!==k||e[25]!==n.key||e[26]!==v||e[27]!==h||e[28]!==z?($=s(te,{className:"text-right",children:s("span",{className:"inline-flex items-center gap-1",children:s(De,{busy:t,copied:z,objectKey:n.key,onCopy:m,onDelete:v,onDownload:k,t:h})})}),e[22]=t,e[23]=m,e[24]=k,e[25]=n.key,e[26]=v,e[27]=h,e[28]=z,e[29]=$):$=e[29];let D;return e[30]!==$||e[31]!==y||e[32]!==g||e[33]!==b||e[34]!==w||e[35]!==N?(D=T(me,{"data-testid":"fb-row",children:[y,g,b,w,N,$]}),e[30]=$,e[31]=y,e[32]=g,e[33]=b,e[34]=w,e[35]=N,e[36]=D):D=e[36],D},kt=d=>{const e=M(65),{allSelected:t,busy:r,copiedKey:l,files:n,folders:c,handlers:i,onEnterFolder:o,prefix:u,references:h,selected:f,showReferences:m,someSelected:k,t:a,toggleSelectAll:v}=d;let S;e[0]!==a?(S=a("Select all rows"),e[0]=a,e[1]=S):S=e[1];let y;e[2]!==t||e[3]!==k||e[4]!==S||e[5]!==v?(y=s(oe,{className:"w-8",children:s(Ne,{"aria-label":S,checked:t,"data-testid":"storage-select-all",indeterminate:k,onCheckedChange:v})}),e[2]=t,e[3]=k,e[4]=S,e[5]=v,e[6]=y):y=e[6];let g;e[7]!==a?(g=a("key"),e[7]=a,e[8]=g):g=e[8];let x;e[9]!==g?(x=s(oe,{children:g}),e[9]=g,e[10]=x):x=e[10];let b;e[11]!==a?(b=a("size"),e[11]=a,e[12]=b):b=e[12];let C;e[13]!==b?(C=s(oe,{children:b}),e[13]=b,e[14]=C):C=e[14];let w;e[15]!==a?(w=a("content-type"),e[15]=a,e[16]=w):w=e[16];let N;e[17]!==w?(N=s(oe,{children:w}),e[17]=w,e[18]=N):N=e[18];let z;e[19]!==m||e[20]!==a?(z=m&&s(oe,{children:a("used by")}),e[19]=m,e[20]=a,e[21]=z):z=e[21];let $;e[22]!==a?($=a("Actions"),e[22]=a,e[23]=$):$=e[23];let D;e[24]!==$?(D=s(oe,{"aria-label":$}),e[24]=$,e[25]=D):D=e[25];let K;e[26]!==D||e[27]!==y||e[28]!==x||e[29]!==C||e[30]!==N||e[31]!==z?(K=s(ct,{children:T(me,{children:[y,x,C,N,z,D]})}),e[26]=D,e[27]=y,e[28]=x,e[29]=C,e[30]=N,e[31]=z,e[32]=K):K=e[32];let F;if(e[33]!==c||e[34]!==o||e[35]!==m){let R;e[37]!==o||e[38]!==m?(R=O=>s(xt,{colSpan:m?6:5,name:O,onEnter:o},O),e[37]=o,e[38]=m,e[39]=R):R=e[39],F=c.map(R),e[33]=c,e[34]=o,e[35]=m,e[36]=F}else F=e[36];let U;if(e[40]!==r||e[41]!==l||e[42]!==n||e[43]!==i||e[44]!==u||e[45]!==h||e[46]!==f||e[47]!==m||e[48]!==a){let R;e[50]!==r||e[51]!==l||e[52]!==i||e[53]!==u||e[54]!==h||e[55]!==f||e[56]!==m||e[57]!==a?(R=O=>s(vt,{busy:r,copiedKey:l,handlers:i,object:O,prefix:u,references:h[O.key],selected:f.has(O.key),showReferences:m,t:a},O.key),e[50]=r,e[51]=l,e[52]=i,e[53]=u,e[54]=h,e[55]=f,e[56]=m,e[57]=a,e[58]=R):R=e[58],U=n.map(R),e[40]=r,e[41]=l,e[42]=n,e[43]=i,e[44]=u,e[45]=h,e[46]=f,e[47]=m,e[48]=a,e[49]=U}else U=e[49];let L;e[59]!==F||e[60]!==U?(L=T(dt,{children:[F,U]}),e[59]=F,e[60]=U,e[61]=L):L=e[61];let B;return e[62]!==K||e[63]!==L?(B=s(at,{className:"overflow-hidden py-0",children:s(it,{className:"px-0",children:T(ut,{"data-testid":"fb-table",children:[K,L]})})}),e[62]=K,e[63]=L,e[64]=B):B=e[64],B},wt=[{label:"15m",seconds:900},{label:"1h",seconds:3600},{label:"24h",seconds:86400},{label:"7d",seconds:604800}],St=3600,ve=(d,e)=>{if(e==="size")return d.size;if(e==="type")return d.httpMetadata?.contentType??"";if(e==="date"){if(d.uploaded===void 0)return 0;const t=new Date(d.uploaded).getTime();return Number.isNaN(t)?0:t}return e.startsWith("tag:")?d.customMetadata?.[e.slice(4)]??"":d.key},Nt=(d,e,t)=>{const r=t==="desc"?-1:1;return d.toSorted((l,n)=>{const c=ve(l,e),i=ve(n,e);return(typeof c=="number"&&typeof i=="number"?c-i:String(c).localeCompare(String(i)))*r})},Ct=(d,e)=>{const t=new Set,r=[];for(const l of d){const n=l.key.slice(e.length),c=n.indexOf("/");c===-1?r.push(l):t.add(n.slice(0,c+1))}return{files:r,folders:[...t].toSorted((l,n)=>l.localeCompare(n))}},$t=d=>{const e=M(59),{bucket:t,buckets:r,busy:l,draftPrefix:n,expiry:c,fileInputRef:i,onBucketChange:o,onExpiryChange:u,onFileChange:h,onList:f,onPrefixChange:m,onUploadClick:k,t:a}=d;let v;e[0]!==m?(v=P=>{m(P.target.value)},e[0]=m,e[1]=v):v=e[1];const S=v;let y;e[2]!==o?(y=P=>{o(P.target.value)},e[2]=o,e[3]=y):y=e[3];const g=y;let x;e[4]!==u?(x=P=>{u(Number.parseInt(P.target.value,10))},e[4]=u,e[5]=x):x=e[5];const b=x;let C;e[6]!==t||e[7]!==r||e[8]!==g||e[9]!==a?(C=r.length>0&&s("select",{"aria-label":a("Bucket"),className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-bucket",onChange:g,value:t,children:r.map(zt)}),e[6]=t,e[7]=r,e[8]=g,e[9]=a,e[10]=C):C=e[10];let w;e[11]!==a?(w=a("Key prefix"),e[11]=a,e[12]=w):w=e[12];let N;e[13]!==a?(N=a("key prefix (optional)"),e[13]=a,e[14]=N):N=e[14];let z;e[15]!==n||e[16]!==S||e[17]!==w||e[18]!==N?(z=s(mt,{"aria-label":w,className:"h-8 w-64 max-w-full","data-testid":"fb-prefix-input",onChange:S,placeholder:N,value:n}),e[15]=n,e[16]=S,e[17]=w,e[18]=N,e[19]=z):z=e[19];let $;e[20]!==a?($=a("List"),e[20]=a,e[21]=$):$=e[21];let D;e[22]!==l||e[23]!==f||e[24]!==$?(D=s(se,{"data-testid":"fb-list",disabled:l,onClick:f,size:"sm",type:"button",children:$}),e[22]=l,e[23]=f,e[24]=$,e[25]=D):D=e[25];let K;e[26]!==l||e[27]!==a?(K=a(l?"Uploading…":"Upload"),e[26]=l,e[27]=a,e[28]=K):K=e[28];let F;e[29]!==l||e[30]!==k||e[31]!==K?(F=s(se,{"data-testid":"storage-upload",disabled:l,onClick:k,size:"sm",type:"button",variant:"outline",children:K}),e[29]=l,e[30]=k,e[31]=K,e[32]=F):F=e[32];let U;e[33]!==i||e[34]!==h?(U=s("input",{className:"hidden","data-testid":"storage-file-input",onChange:h,ref:i,type:"file"}),e[33]=i,e[34]=h,e[35]=U):U=e[35];let L;e[36]!==a?(L=a("Link expiry"),e[36]=a,e[37]=L):L=e[37];let B;e[38]!==a?(B=wt.map(P=>s("option",{value:P.seconds,children:a(P.label)},P.seconds)),e[38]=a,e[39]=B):B=e[39];let R;e[40]!==c||e[41]!==b||e[42]!==B?(R=s("select",{className:"h-8 rounded-md border border-border bg-background px-1 tabular-nums outline-none focus-visible:border-ring","data-testid":"storage-expiry",id:"storage-expiry",onChange:b,value:c,children:B}),e[40]=c,e[41]=b,e[42]=B,e[43]=R):R=e[43];let O;e[44]!==L||e[45]!==R?(O=T("label",{className:"ml-auto flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"storage-expiry",children:[L,R]}),e[44]=L,e[45]=R,e[46]=O):O=e[46];let I;e[47]!==a?(I=a("Open in Cloudflare"),e[47]=a,e[48]=I):I=e[48];let A;e[49]!==I?(A=s("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"fb-cf-link",href:pt,rel:"noreferrer",target:"_blank",children:I}),e[49]=I,e[50]=A):A=e[50];let W;return e[51]!==F||e[52]!==U||e[53]!==O||e[54]!==A||e[55]!==C||e[56]!==z||e[57]!==D?(W=T("div",{className:"flex flex-wrap items-center gap-2",children:[C,z,D,F,U,O,A]}),e[51]=F,e[52]=U,e[53]=O,e[54]=A,e[55]=C,e[56]=z,e[57]=D,e[58]=W):W=e[58],W},jt=d=>{const e=M(66),{onSortKeyChange:t,onThumbSizeChange:r,showGrid:l,showList:n,sortDirection:c,sortKey:i,t:o,tagKeys:u,thumbSize:h,toggleSortDirection:f,view:m}=d;let k;e[0]!==t?(k=Z=>{t(Z.target.value)},e[0]=t,e[1]=k):k=e[1];const a=k;let v;e[2]!==r?(v=Z=>{r(Number.parseInt(Z.target.value,10))},e[2]=r,e[3]=v):v=e[3];const S=v,y=m==="list";let g;e[4]!==o?(g=o("List"),e[4]=o,e[5]=g):g=e[5];let x;e[6]!==n||e[7]!==y||e[8]!==g?(x=s("button",{"aria-pressed":y,className:"px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-list",onClick:n,type:"button",children:g}),e[6]=n,e[7]=y,e[8]=g,e[9]=x):x=e[9];const b=m==="grid";let C;e[10]!==o?(C=o("Grid"),e[10]=o,e[11]=C):C=e[11];let w;e[12]!==l||e[13]!==b||e[14]!==C?(w=s("button",{"aria-pressed":b,className:"border-s border-border px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-grid",onClick:l,type:"button",children:C}),e[12]=l,e[13]=b,e[14]=C,e[15]=w):w=e[15];let N;e[16]!==x||e[17]!==w?(N=T("div",{className:"inline-flex overflow-hidden rounded-md border border-border",children:[x,w]}),e[16]=x,e[17]=w,e[18]=N):N=e[18];let z;e[19]!==o?(z=o("Sort"),e[19]=o,e[20]=z):z=e[20];let $;e[21]!==o?($=o("Name"),e[21]=o,e[22]=$):$=e[22];let D;e[23]!==$?(D=s("option",{value:"name",children:$}),e[23]=$,e[24]=D):D=e[24];let K;e[25]!==o?(K=o("size"),e[25]=o,e[26]=K):K=e[26];let F;e[27]!==K?(F=s("option",{value:"size",children:K}),e[27]=K,e[28]=F):F=e[28];let U;e[29]!==o?(U=o("Type"),e[29]=o,e[30]=U):U=e[30];let L;e[31]!==U?(L=s("option",{value:"type",children:U}),e[31]=U,e[32]=L):L=e[32];let B;e[33]!==o?(B=o("Modified"),e[33]=o,e[34]=B):B=e[34];let R;e[35]!==B?(R=s("option",{value:"date",children:B}),e[35]=B,e[36]=R):R=e[36];let O;e[37]!==u?(O=u.map(Kt),e[37]=u,e[38]=O):O=e[38];let I;e[39]!==a||e[40]!==i||e[41]!==D||e[42]!==F||e[43]!==L||e[44]!==R||e[45]!==O?(I=T("select",{className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-sort",id:"fb-sort",onChange:a,value:i,children:[D,F,L,R,O]}),e[39]=a,e[40]=i,e[41]=D,e[42]=F,e[43]=L,e[44]=R,e[45]=O,e[46]=I):I=e[46];let A;e[47]!==z||e[48]!==I?(A=T("label",{className:"flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-sort",children:[z,I]}),e[47]=z,e[48]=I,e[49]=A):A=e[49];let W;e[50]!==o?(W=o("Toggle sort direction"),e[50]=o,e[51]=W):W=e[51];const P=c==="asc"?"↑":"↓";let G;e[52]!==W||e[53]!==P||e[54]!==f?(G=s("button",{"aria-label":W,className:"flex size-8 items-center justify-center rounded-md border border-border tabular-nums outline-none transition-colors hover:bg-accent focus-visible:bg-accent","data-testid":"fb-sort-dir",onClick:f,type:"button",children:P}),e[52]=W,e[53]=P,e[54]=f,e[55]=G):G=e[55];let Y;e[56]!==S||e[57]!==o||e[58]!==h||e[59]!==m?(Y=m==="grid"&&T("label",{className:"ml-auto flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-thumb-size",children:[o("Thumbnail size"),s("input",{className:"accent-primary","data-testid":"fb-thumb-size",id:"fb-thumb-size",max:240,min:80,onChange:S,step:8,type:"range",value:h})]}),e[56]=S,e[57]=o,e[58]=h,e[59]=m,e[60]=Y):Y=e[60];let re;return e[61]!==A||e[62]!==G||e[63]!==Y||e[64]!==N?(re=T("div",{className:"flex flex-wrap items-center gap-2 text-xs","data-testid":"fb-controls",children:[N,A,G,Y]}),e[61]=A,e[62]=G,e[63]=Y,e[64]=N,e[65]=re):re=e[65],re};function zt(d){return s("option",{value:d,children:d},d)}function Kt(d){return s("option",{value:`tag:${d}`,children:d},d)}const Dt=/\.(?:avif|bmp|gif|ico|jpe?g|png|svg|webp)$/iu,Tt=d=>(d.httpMetadata?.contentType??"").startsWith("image/")||Dt.test(d.key),Ft=()=>{const d=M(1);let e;return d[0]===Symbol.for("react.memo_cache_sentinel")?(e=s("svg",{"aria-hidden":"true",className:"size-8 text-muted-foreground/60",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:s("path",{d:"M7 3h7l5 5v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm7 0v5h5"})}),d[0]=e):e=d[0],e},Rt=d=>{const e=M(13),{object:t,resolveUrl:r}=d,[l,n]=E(null),[c,i]=E(!1);let o;e[0]!==t?(o=Tt(t),e[0]=t,e[1]=o):o=e[1];const u=o;let h,f;e[2]!==u||e[3]!==t.key||e[4]!==r?(h=()=>{if(!u)return;const v={cancelled:!1};return q((async()=>{try{const S=await r(t.key);v.cancelled||n(S)}catch{v.cancelled||i(!0)}})()),()=>{v.cancelled=!0}},f=[u,t.key,r],e[2]=u,e[3]=t.key,e[4]=r,e[5]=h,e[6]=f):(h=e[5],f=e[6]),le(h,f);let m;e[7]===Symbol.for("react.memo_cache_sentinel")?(m=()=>{i(!0)},e[7]=m):m=e[7];const k=m;let a;return e[8]!==c||e[9]!==u||e[10]!==t.key||e[11]!==l?(a=s("div",{className:"flex aspect-square w-full items-center justify-center overflow-hidden rounded-md border border-border bg-muted/30",children:u&&l!==null&&!c?s("img",{alt:t.key,className:"size-full object-cover",loading:"lazy",onError:k,src:l}):s(Ft,{})}),e[8]=c,e[9]=u,e[10]=t.key,e[11]=l,e[12]=a):a=e[12],a},Lt=d=>{const e=M(42),{busy:t,copiedKey:r,handlers:l,object:n,prefix:c,references:i,resolveUrl:o,selected:u,showReferences:h,t:f}=d;let m;e[0]!==l||e[1]!==n||e[2]!==c?(m=Ke(n,c,l),e[0]=l,e[1]=n,e[2]=c,e[3]=m):m=e[3];const{copy:k,download:a,name:v,remove:S,toggle:y}=m;let g;e[4]!==n||e[5]!==o?(g=s(Rt,{object:n,resolveUrl:o}),e[4]=n,e[5]=o,e[6]=g):g=e[6];let x;e[7]!==n.key||e[8]!==u||e[9]!==f||e[10]!==y?(x=s("span",{className:"absolute left-1.5 top-1.5 rounded bg-background/80 p-0.5",children:s(Fe,{objectKey:n.key,onToggle:y,selected:u,t:f})}),e[7]=n.key,e[8]=u,e[9]=f,e[10]=y,e[11]=x):x=e[11];let b;e[12]!==g||e[13]!==x?(b=T("div",{className:"relative",children:[g,x]}),e[12]=g,e[13]=x,e[14]=b):b=e[14];let C;e[15]!==v?(C=s("p",{className:"truncate font-mono text-xs",title:v,children:v}),e[15]=v,e[16]=C):C=e[16];let w;e[17]!==n.size?(w=Ce(n.size),e[17]=n.size,e[18]=w):w=e[18];let N;e[19]!==w?(N=s("p",{className:"text-[11px] tabular-nums text-muted-foreground",children:w}),e[19]=w,e[20]=N):N=e[20];let z;e[21]!==n.key||e[22]!==i||e[23]!==h||e[24]!==f?(z=h&&s("div",{className:"mt-1",children:s(Te,{objectKey:n.key,references:i,t:f})}),e[21]=n.key,e[22]=i,e[23]=h,e[24]=f,e[25]=z):z=e[25];let $;e[26]!==C||e[27]!==N||e[28]!==z?($=T("div",{className:"min-w-0",children:[C,N,z]}),e[26]=C,e[27]=N,e[28]=z,e[29]=$):$=e[29];const D=r===n.key;let K;e[30]!==t||e[31]!==k||e[32]!==a||e[33]!==n.key||e[34]!==S||e[35]!==f||e[36]!==D?(K=s("div",{className:"flex items-center gap-1",children:s(De,{busy:t,buttonClassName:"h-7 px-2 text-xs",copied:D,objectKey:n.key,onCopy:k,onDelete:S,onDownload:a,t:f})}),e[30]=t,e[31]=k,e[32]=a,e[33]=n.key,e[34]=S,e[35]=f,e[36]=D,e[37]=K):K=e[37];let F;return e[38]!==K||e[39]!==b||e[40]!==$?(F=T("div",{className:"flex flex-col gap-1.5","data-testid":"fb-tile",children:[b,$,K]}),e[38]=K,e[39]=b,e[40]=$,e[41]=F):F=e[41],F},Ot=d=>{const e=M(9),{name:t,onEnter:r}=d;let l;e[0]!==t||e[1]!==r?(l=()=>{r(t)},e[0]=t,e[1]=r,e[2]=l):l=e[2];const n=l;let c;e[3]===Symbol.for("react.memo_cache_sentinel")?(c=s("span",{className:"flex aspect-square w-full items-center justify-center rounded-md border border-border bg-muted/30 transition-colors hover:bg-accent",children:s("svg",{"aria-hidden":"true",className:"size-10 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:s("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})})}),e[3]=c):c=e[3];let i;e[4]!==t?(i=s("span",{className:"truncate font-mono text-xs",title:t,children:t}),e[4]=t,e[5]=i):i=e[5];let o;return e[6]!==n||e[7]!==i?(o=T("button",{className:"flex flex-col gap-1.5 text-left outline-none","data-testid":"fb-folder",onClick:n,type:"button",children:[c,i]}),e[6]=n,e[7]=i,e[8]=o):o=e[8],o},Et=d=>{const e=M(34),{busy:t,copiedKey:r,files:l,folders:n,handlers:c,onEnterFolder:i,prefix:o,references:u,resolveUrl:h,selected:f,showReferences:m,size:k,t:a}=d;let v;e[0]!==k?(v=k.toString(),e[0]=k,e[1]=v):v=e[1];const S=`repeat(auto-fill, minmax(${v}px, 1fr))`;let y;e[2]!==S?(y={gridTemplateColumns:S},e[2]=S,e[3]=y):y=e[3];const g=y;let x;if(e[4]!==n||e[5]!==i){let w;e[7]!==i?(w=N=>s(Ot,{name:N,onEnter:i},N),e[7]=i,e[8]=w):w=e[8],x=n.map(w),e[4]=n,e[5]=i,e[6]=x}else x=e[6];let b;if(e[9]!==t||e[10]!==r||e[11]!==l||e[12]!==c||e[13]!==o||e[14]!==u||e[15]!==h||e[16]!==f||e[17]!==m||e[18]!==a){let w;e[20]!==t||e[21]!==r||e[22]!==c||e[23]!==o||e[24]!==u||e[25]!==h||e[26]!==f||e[27]!==m||e[28]!==a?(w=N=>s(Lt,{busy:t,copiedKey:r,handlers:c,object:N,prefix:o,references:u[N.key],resolveUrl:h,selected:f.has(N.key),showReferences:m,t:a},N.key),e[20]=t,e[21]=r,e[22]=c,e[23]=o,e[24]=u,e[25]=h,e[26]=f,e[27]=m,e[28]=a,e[29]=w):w=e[29],b=l.map(w),e[9]=t,e[10]=r,e[11]=l,e[12]=c,e[13]=o,e[14]=u,e[15]=h,e[16]=f,e[17]=m,e[18]=a,e[19]=b}else b=e[19];let C;return e[30]!==g||e[31]!==x||e[32]!==b?(C=T("div",{className:"grid gap-4","data-testid":"fb-gallery",style:g,children:[x,b]}),e[30]=g,e[31]=x,e[32]=b,e[33]=C):C=e[33],C},Ut=d=>{const e=M(23),{reference:t,t:r}=d,l=`fb-dangling-${t.table}-${t.id}-${t.column}`,n=`${t.table}·${t.id}`;let c;e[0]!==n?(c=s(ce,{variant:"secondary",children:n}),e[0]=n,e[1]=c):c=e[1];let i;e[2]!==t.column?(i=s("span",{className:"text-muted-foreground",children:t.column}),e[2]=t.column,e[3]=i):i=e[3];let o;e[4]!==r?(o=r("→"),e[4]=r,e[5]=o):o=e[5];let u;e[6]!==o?(u=s("span",{className:"text-muted-foreground/60",children:o}),e[6]=o,e[7]=u):u=e[7];let h;e[8]!==t.key?(h=s("code",{className:"rounded bg-muted px-1 py-0.5 font-mono text-foreground",children:t.key}),e[8]=t.key,e[9]=h):h=e[9];let f;e[10]!==c||e[11]!==i||e[12]!==u||e[13]!==h?(f=T("span",{className:"flex flex-wrap items-center gap-1.5",children:[c,i,u,h]}),e[10]=c,e[11]=i,e[12]=u,e[13]=h,e[14]=f):f=e[14];let m;e[15]!==r?(m=r("Missing object"),e[15]=r,e[16]=m):m=e[16];let k;e[17]!==m?(k=s(ce,{className:"border-destructive/40 text-destructive",variant:"outline",children:m}),e[17]=m,e[18]=k):k=e[18];let a;return e[19]!==l||e[20]!==k||e[21]!==f?(a=T("li",{className:"flex flex-wrap items-center justify-between gap-2 rounded-md border border-border/60 px-3 py-2 text-xs","data-testid":l,children:[f,k]}),e[19]=l,e[20]=k,e[21]=f,e[22]=a):a=e[22],a},_t=d=>{const e=M(37),{busy:t,onCheck:r,references:l,t:n,truncated:c}=d;let i;e[0]!==n?(i=n("Integrity"),e[0]=n,e[1]=i):i=e[1];let o;e[2]!==i?(o=s("span",{className:"font-mono text-[11px] uppercase tracking-wide text-muted-foreground",children:i}),e[2]=i,e[3]=o):o=e[3];let u;e[4]!==n?(u=n("Orphaned objects"),e[4]=n,e[5]=u):u=e[5];let h;e[6]!==u?(h=s("span",{className:"text-sm font-medium text-foreground",children:u}),e[6]=u,e[7]=h):h=e[7];let f;e[8]!==n?(f=n("Find records whose file reference points at an object the bucket no longer has."),e[8]=n,e[9]=f):f=e[9];let m;e[10]!==f?(m=s("span",{className:"text-xs text-muted-foreground",children:f}),e[10]=f,e[11]=m):m=e[11];let k;e[12]!==o||e[13]!==h||e[14]!==m?(k=T("div",{className:"flex flex-col gap-1",children:[o,h,m]}),e[12]=o,e[13]=h,e[14]=m,e[15]=k):k=e[15];let a;e[16]!==t||e[17]!==n?(a=n(t?"Checking…":"Check for orphans"),e[16]=t,e[17]=n,e[18]=a):a=e[18];let v;e[19]!==t||e[20]!==r||e[21]!==a?(v=s(se,{"data-testid":"fb-orphans-check",disabled:t,onClick:r,size:"sm",type:"button",variant:"outline",children:a}),e[19]=t,e[20]=r,e[21]=a,e[22]=v):v=e[22];let S;e[23]!==k||e[24]!==v?(S=T("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[k,v]}),e[23]=k,e[24]=v,e[25]=S):S=e[25];let y;e[26]!==l?.length||e[27]!==n?(y=l?.length===0&&s(Se,{description:n("Every record's file reference points at an object that exists in the bucket."),testId:"fb-orphans-empty",title:n("No dangling references.")}),e[26]=l?.length,e[27]=n,e[28]=y):y=e[28];let g;e[29]!==l||e[30]!==n||e[31]!==c?(g=l!==void 0&&l.length>0&&T(je,{children:[c&&s("p",{className:"text-xs text-warning","data-testid":"fb-orphans-truncated",children:n("Showing the first {count} dangling references — the scan was truncated.",{count:l.length})}),s("ul",{className:"flex flex-col gap-1.5","data-testid":"fb-orphans-list",children:l.map(b=>s(Ut,{reference:b,t:n},`${b.table}·${b.id}·${b.column}`))})]}),e[29]=l,e[30]=n,e[31]=c,e[32]=g):g=e[32];let x;return e[33]!==S||e[34]!==y||e[35]!==g?(x=T("section",{className:"flex flex-col gap-2 rounded-lg border border-border/60 p-3","data-testid":"fb-orphans",children:[S,y,g]}),e[33]=S,e[34]=y,e[35]=g,e[36]=x):x=e[36],x},Bt=function(d,e){const t=M(18);let r;t[0]===Symbol.for("react.memo_cache_sentinel")?(r=new Set,t[0]=r):r=t[0];const[l,n]=E(r);let c;t[1]===Symbol.for("react.memo_cache_sentinel")?(c=y=>{n(g=>{const x=new Set(g);return x.has(y)?x.delete(y):x.add(y),x})},t[1]=c):c=t[1];const i=c;let o;t[2]===Symbol.for("react.memo_cache_sentinel")?(o=()=>{n(new Set)},t[2]=o):o=t[2];const u=o;let h,f,m;if(t[3]!==d||t[4]!==e||t[5]!==l){let y;t[9]!==e?(y=g=>e(g),t[9]=e,t[10]=y):y=t[10],f=d.map(y),h=f.length>0&&f.every(g=>l.has(g)),m=!h&&f.some(g=>l.has(g)),t[3]=d,t[4]=e,t[5]=l,t[6]=h,t[7]=f,t[8]=m}else h=t[6],f=t[7],m=t[8];const k=m;let a;t[11]!==f?(a=()=>{n(y=>f.every(g=>y.has(g))?new Set:new Set(f))},t[11]=f,t[12]=a):a=t[12];const v=a;let S;return t[13]!==h||t[14]!==l||t[15]!==k||t[16]!==v?(S={allSelected:h,clear:u,selected:l,someSelected:k,toggle:i,toggleAll:v},t[13]=h,t[14]=l,t[15]=k,t[16]=v,t[17]=S):S=t[17],S},It=$e(ze.storageReferences),Mt=$e(ze.storageOrphans),ke=1e4,At=1e3,Pt=3600,Wt=(d,e)=>{if(!("document"in globalThis))return;const t=globalThis.document.createElement("a");t.href=d,t.download=e,t.rel="noopener",globalThis.document.body.append(t),t.click(),t.remove()},qt=d=>d.key,Gt=({initialPrefix:d,pageSize:e})=>{const t=gt(),[r,l]=E(d??""),[n,c]=E(d??""),[i,o]=E(St),[u,h]=E("list"),[f,m]=E(128),[k,a]=E("name"),[v,S]=E("asc"),[y,g]=E(void 0),[x,b]=E(void 0),[C,w]=E(!1),[N,z]=E(void 0),[$,D]=E(void 0),[K,F]=E(""),[U,L]=E({}),[B,R]=E(!1),[O,I]=E(void 0),[A,W]=E(!1),[P,G]=E(!1),[Y,re]=E([]),[Z,pe]=E(""),ne=he(0),Q=he(0);le(()=>{const p={cancelled:!1};return q((async()=>{try{const j=await t.listStorageBuckets();if(!p.cancelled){re(j);const[_]=j;_!==void 0&&pe(H=>H===""?_:H)}}catch{}})()),()=>{p.cancelled=!0}},[t]);const V=fe(()=>({list:p=>t.listStorageObjects({...p,bucket:Z}),remove:p=>t.deleteStorageObject(p,{bucket:Z}),signedUrl:(p,j)=>t.signedStorageUrl(p,{...j,bucket:Z}),upload:p=>t.uploadStorageObject({...p,bucket:Z})}),[Z,t]),X=nt(async(p,j,_)=>{ne.current+=1;const H=ne.current;b(void 0),w(!0);try{const J=await V.list({cursor:j,limit:e,prefix:p});if(H!==ne.current)return;g(ye=>_&&ye!==void 0?[...ye,...J.objects]:J.objects),D(J.cursor)}catch(J){if(H!==ne.current)return;_||g(void 0),b(ee(J))}finally{H===ne.current&&w(!1)}},[e,V]);le(()=>{q(X(d??"",void 0,!1))},[X,d]);const Re=(y?.length??0)<=e;bt(()=>{q(X(r,void 0,!1))},Re);const{files:de,folders:Le}=Ct(y??[],r),Oe=fe(()=>{const p=new Set;for(const j of de)for(const _ of Object.keys(j.customMetadata??{}))p.add(_);return[...p].toSorted((j,_)=>j.localeCompare(_))},[de]),ie=Nt(de,k,v),ue=fe(()=>[...new Set(ie.map(p=>p.key))].toSorted((p,j)=>p.localeCompare(j)).join(`
|
|
3
|
+
`),[ie]);le(()=>{const p=ue===""?[]:ue.split(`
|
|
4
|
+
`);if(p.length===0){L({});return}const j={current:!0};return q((async()=>{try{const _=await t.query(It,{keys:p},xe(K));j.current&&(L(_.references??{}),R(Object.keys(_.storageColumns??{}).length>0))}catch{j.current&&(L({}),R(!1))}})()),()=>{j.current=!1}},[t,ue,K]);const{allSelected:Ee,clear:ae,selected:ge,someSelected:Ue,toggle:_e,toggleAll:Be}=Bt(ie,qt),Ie=()=>{l(n),ae(),q(X(n,void 0,!1))},Me=()=>{q(X(r,$,!0))},be=p=>{l(p),c(p),ae(),q(X(p,void 0,!1))},Ae=p=>{be(`${r}${p}`)},Pe=p=>V.signedUrl(p,{expiresInSeconds:Pt}),We=()=>{h("list")},qe=()=>{h("grid")},Ge=p=>{a(p)},He=()=>{S(p=>p==="asc"?"desc":"asc")},Ze=p=>{m(p)},Ve=p=>{o(p)},Xe=()=>{b(void 0),w(!0),q((async()=>{try{for(const p of ge)await V.remove(p);await X(r,void 0,!1),ae()}catch(p){b(ee(p))}w(!1)})())},Ye=p=>{b(void 0),q((async()=>{try{const j=await V.signedUrl(p,{expiresInSeconds:i});ft(j)&&z(p)}catch(j){b(ee(j))}})())},Qe=p=>{b(void 0),q((async()=>{try{const j=await V.signedUrl(p,{expiresInSeconds:i}),_=p.slice(p.lastIndexOf("/")+1)||p;Wt(j,_)}catch(j){b(ee(j))}})())};le(()=>{if(N===void 0)return;const p=globalThis.setTimeout(()=>{z(void 0)},2e3);return()=>{globalThis.clearTimeout(p)}},[N]);const Je=p=>{b(void 0),w(!0),q((async()=>{try{await V.remove(p),await X(r,void 0,!1)}catch(j){b(ee(j))}w(!1)})())},et=p=>{const j=`${r}${p.name}`;b(void 0),w(!0),q((async()=>{try{const _=await p.arrayBuffer();await V.upload({body:_,contentType:p.type===""?void 0:p.type,key:j}),await X(r,void 0,!1)}catch(_){b(ee(_))}w(!1)})())};le(()=>{Q.current+=1,I(void 0),G(!1)},[K]);const tt=()=>{Q.current+=1;const p=Q.current;b(void 0),W(!0),q((async()=>{try{const j=[];let _;do{const H=await V.list({cursor:_,limit:At});for(const J of H.objects)j.push(J.key);_=j.length>=ke?void 0:H.cursor}while(_!==void 0);if(j.length>=ke)p===Q.current&&(I([]),G(!0));else{const H=await t.query(Mt,{liveKeys:j},xe(K));p===Q.current&&(I(H.references??[]),G(H.truncated===!0))}}catch(j){p===Q.current&&(I([]),G(!1),b(ee(j)))}p===Q.current&&W(!1)})())},rt=p=>{ne.current+=1,Q.current+=1,pe(p),l(d??""),c(d??""),g(void 0),I(void 0),G(!1),ae()};return{allSelected:Ee,bucket:Z,buckets:Y,bulkDelete:Xe,busy:C,checkOrphans:tt,clearSelection:ae,copiedKey:N,danglingBusy:A,danglingReferences:O,danglingTruncated:P,draftPrefix:n,enterFolder:Ae,error:x,expiry:i,files:ie,folders:Le,hasObjects:y!==void 0&&y.length>0,hasStorageColumns:B,listFirst:Ie,loaded:y!==void 0,loadMore:Me,navigate:be,nextCursor:$,onCopy:Ye,onDelete:Je,onDownload:Qe,onExpiryChange:Ve,onFile:et,onSortKeyChange:Ge,onThumbSizeChange:Ze,prefix:r,referenceShard:K,references:U,resolveUrl:Pe,selectBucket:rt,selected:ge,setDraftPrefix:c,setReferenceShard:F,showGrid:qe,showList:We,someSelected:Ue,sortDirection:v,sortKey:k,tagKeys:Oe,thumbSize:f,toggleSelect:_e,toggleSelectAll:Be,toggleSortDirection:He,view:u}},Ht=100,we=d=>{const e=M(6),{label:t,onNavigate:r,target:l}=d;let n;e[0]!==r||e[1]!==l?(n=()=>{r(l)},e[0]=r,e[1]=l,e[2]=n):n=e[2];const c=n;let i;return e[3]!==c||e[4]!==t?(i=s("button",{className:"rounded px-1 text-muted-foreground outline-none hover:text-foreground focus-visible:text-foreground",onClick:c,type:"button",children:t}),e[3]=c,e[4]=t,e[5]=i):i=e[5],i},Zt=d=>{const e=M(11),{onNavigate:t,prefix:r,t:l}=d;let n;if(e[0]!==t||e[1]!==r||e[2]!==l){const c=r.split("/").filter(Vt);let i;e[4]!==l?(i=l("Folder path"),e[4]=l,e[5]=i):i=e[5];let o;e[6]!==l?(o=l("root"),e[6]=l,e[7]=o):o=e[7];let u;e[8]!==t||e[9]!==o?(u=s(we,{label:o,onNavigate:t,target:""}),e[8]=t,e[9]=o,e[10]=u):u=e[10],n=T("nav",{"aria-label":i,className:"flex flex-wrap items-center gap-0.5 text-xs","data-testid":"fb-breadcrumbs",children:[u,c.map((h,f)=>T("span",{className:"flex items-center gap-0.5",children:[s("span",{className:"text-muted-foreground/50",children:"/"}),s(we,{label:h,onNavigate:t,target:`${c.slice(0,f+1).join("/")}/`})]},`${h}-${f.toString()}`))]}),e[0]=t,e[1]=r,e[2]=l,e[3]=n}else n=e[3];return n},pr=({initialPrefix:d,pageSize:e=Ht})=>{const t=lt(),r=Gt({initialPrefix:d,pageSize:e}),l=he(null),{onCopy:n,onDelete:c,onDownload:i,onFile:o,toggleSelect:u}=r,h={onCopy:n,onDelete:c,onDownload:i,onToggleSelect:u},f=()=>{l.current?.click()},m=a=>{const v=a.target,S=v.files?.[0];v.value="",S&&o(S)},k=r.loaded&&!r.hasObjects;return T("div",{className:"flex flex-col gap-3","data-testid":"lunora-file-browser",children:[s($t,{bucket:r.bucket,buckets:r.buckets,busy:r.busy,draftPrefix:r.draftPrefix,expiry:r.expiry,fileInputRef:l,onBucketChange:r.selectBucket,onExpiryChange:r.onExpiryChange,onFileChange:m,onList:r.listFirst,onPrefixChange:r.setDraftPrefix,onUploadClick:f,t}),r.loaded&&s(Zt,{onNavigate:r.navigate,prefix:r.prefix,t}),r.hasObjects&&s(jt,{onSortKeyChange:r.onSortKeyChange,onThumbSizeChange:r.onThumbSizeChange,showGrid:r.showGrid,showList:r.showList,sortDirection:r.sortDirection,sortKey:r.sortKey,t,tagKeys:r.tagKeys,thumbSize:r.thumbSize,toggleSortDirection:r.toggleSortDirection,view:r.view}),r.hasStorageColumns&&T("div",{className:"flex flex-wrap items-center gap-2","data-testid":"fb-references-shard",children:[s("label",{className:"text-xs text-muted-foreground",htmlFor:"fb-reference-shard-input",children:t("References shard")}),s(ot,{id:"fb-reference-shard-input",onChange:r.setReferenceShard,testId:"fb-reference-shard-input",value:r.referenceShard}),s("span",{className:"text-xs text-muted-foreground",children:t("Which shard's records are checked for references to these files. Empty = root shard.")})]}),r.hasStorageColumns&&s(_t,{busy:r.danglingBusy,onCheck:r.checkOrphans,references:r.danglingReferences,t,truncated:r.danglingTruncated}),r.selected.size>0&&s(st,{count:r.selected.size,editable:!0,onClear:r.clearSelection,onDelete:r.bulkDelete}),r.error!==void 0&&s("p",{className:"text-sm text-destructive","data-testid":"storage-error",role:"alert",children:r.error}),k&&s(Se,{description:t("Objects you upload to your R2 buckets will appear here."),icon:T("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[s("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"}),s("path",{d:"M12 11v5m-2.5-2.5h5"})]}),testId:"fb-empty",title:t("No objects.")}),r.hasObjects&&r.view==="list"&&s(kt,{allSelected:r.allSelected,busy:r.busy,copiedKey:r.copiedKey,files:r.files,folders:r.folders,handlers:h,onEnterFolder:r.enterFolder,prefix:r.prefix,references:r.references,selected:r.selected,showReferences:r.hasStorageColumns,someSelected:r.someSelected,t,toggleSelectAll:r.toggleSelectAll}),r.hasObjects&&r.view==="grid"&&s(Et,{busy:r.busy,copiedKey:r.copiedKey,files:r.files,folders:r.folders,handlers:h,onEnterFolder:r.enterFolder,prefix:r.prefix,references:r.references,resolveUrl:r.resolveUrl,selected:r.selected,showReferences:r.hasStorageColumns,size:r.thumbSize,t}),r.nextCursor!==void 0&&s("div",{children:s(se,{"data-testid":"fb-next",disabled:r.busy,onClick:r.loadMore,size:"sm",type:"button",variant:"outline",children:t("Load more")})})]})};function Vt(d){return d!==""}export{pr as FileBrowser};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useLunora as G}from"@lunora/react";import{useState as o,useEffect as H}from"react";import{ShardInput as Q}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as T}from"../packem_shared/badge-BbuuAio7.js";import{u as y}from"../packem_shared/button-BkCrNcAs.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as N}from"../packem_shared/label-6uP1obNF.js";import{l as W}from"../packem_shared/textarea-Bu2-jKAs.js";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{b as ee,i as te,f as re,j as ae,g as se}from"../packem_shared/internal-BSIsQVC6.js";import{r as ne}from"../packem_shared/shard-history-DMEW5VBE.js";import{jsxs as n,jsx as r}from"react/jsx-runtime";const ie=t=>t.kind==="id"?t.table===void 0?"id":`id<${t.table}>`:t.kind==="array"?t.element===void 0?"array":`${t.element}[]`:t.kind,oe=t=>t===void 0||t.length===0?"()":`(${t.map(i=>`${i.name}${i.optional?"?":""}: ${ie(i)}`).join(", ")})`,de=t=>{switch(t){case"array":return[];case"bigint":case"number":return 0;case"boolean":return!1;case"object":case"record":return{};default:return""}},le=t=>{const i={};for(const a of t??[])a.optional||(i[a.name]=de(a.kind));return JSON.stringify(i,void 0,2)},ce=se(Z.runAs),ue=10,me=t=>t===void 0?"undefined":JSON.stringify(t,null,2),Ie=({functions:t,runAsIdentity:i=!1}={})=>{const a=Y(),u=G(),[J,K]=o(null),[w,L]=o(null),p=t??J??[],[k,S]=o(""),[m,g]=o("{}"),[c,$]=o(""),[f,z]=o(""),[x,h]=o("idle"),[M,b]=o(void 0),[I,v]=o(null),[F,P]=o([]);H(()=>{if(t!==void 0)return;let e=!1;return u.listFunctions().then(d=>(e||K(d),d)).catch(d=>{e||L(ee(d))}),()=>{e=!0}},[u,t]);const C=k===""?p[0]?.path??"":k,s=p.find(e=>e.path===C),_=async()=>{if(!s)return;let e;try{e=m.trim()===""?{}:JSON.parse(m)}catch(l){h("error"),b(void 0),v(a("Invalid JSON args: {message}",{message:l.message}));return}const d={__lunoraRef:s.path},R=c.trim()===""?{}:{shardKey:c.trim()},j=i?f.trim():"",A=l=>{P(O=>[{argsText:m,at:Date.now(),id:(O[0]?.id??0)+1,kind:s.kind,path:s.path,shardKey:c,status:l},...O].slice(0,ue))};h("running"),v(null);try{const l=j===""?await ae(u,s.kind,d,e,R):await u.query(ce,{args:e,functionPath:s.path,userId:j},R);ne(c),b(l),h("success"),A("success")}catch(l){b(void 0),v(l.message),h("error"),A("error")}},q=e=>{S(e.path),g(e.argsText),$(e.shardKey)},B=e=>{S(e.target.value)},D=e=>{g(e.target.value)},E=e=>{z(e.target.value)},U=()=>{re(_())},X=()=>{g(le(s?.args))};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-runner",children:[w!==null&&r("p",{className:"text-sm text-destructive","data-testid":"function-discover-error",role:"alert",children:w}),n("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4",children:[n("div",{className:"flex flex-col gap-1.5",children:[r(N,{htmlFor:"function-select",children:a("Function")}),r("select",{"aria-label":a("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50","data-testid":"function-select",id:"function-select",onChange:B,value:C,children:p.map(e=>n("option",{value:e.path,children:[e.path," (",e.kind,")"]},e.path))}),s!==void 0&&n("p",{className:"text-xs text-muted-foreground",children:[r("span",{className:"mr-1.5 font-medium",children:a("Signature")}),r("code",{className:"font-mono","data-testid":"function-signature",children:oe(s.args)})]})]}),n("div",{className:"flex flex-col gap-1.5",children:[n("div",{className:"flex items-center justify-between gap-2",children:[r(N,{htmlFor:"args-input",children:a("Arguments")}),r(y,{"data-testid":"prefill-button",disabled:s===void 0,onClick:X,size:"xs",type:"button",variant:"ghost",children:a("Prefill")})]}),r(W,{"aria-label":a("Arguments"),className:"font-mono text-xs","data-testid":"args-input",id:"args-input",onChange:D,value:m})]}),r(Q,{onChange:$,testId:"shard-input",value:c}),i&&n("div",{className:"flex flex-col gap-1.5","data-testid":"run-as-field",children:[r(N,{htmlFor:"run-as-input",children:a("Run as identity (userId)")}),r(V,{"aria-label":a("Run as identity (userId)"),className:"font-mono text-xs","data-testid":"run-as-input",id:"run-as-input",onChange:E,placeholder:a("Leave empty to run as admin"),value:f}),r("p",{className:"text-[11px] text-muted-foreground",children:a("Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.")})]}),n("div",{className:"flex flex-wrap items-center gap-2",children:[r(y,{"data-testid":"run-button",disabled:x==="running"||s===void 0,onClick:U,type:"button",children:a("Run")}),s!==void 0&&r(T,{variant:"outline",children:s.kind}),i&&f.trim()!==""&&r(T,{"data-testid":"run-as-badge",variant:"secondary",children:a("as {userId}",{userId:f.trim()})})]})]}),x==="error"&&I!==null&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"error",role:"alert",children:I}),x==="success"&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"result",children:me(M)}),F.length>0&&r("ul",{className:"flex flex-col overflow-hidden rounded-xl border border-border","data-testid":"fn-history",children:F.map((e,d)=>n("li",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-sm last:border-b-0","data-testid":"fn-history-row",children:[r("span",{className:e.status==="success"?"text-success":"text-destructive","data-testid":`fn-history-status-${d.toString()}`,children:e.status==="success"?"✓":"✗"})," ",n("span",{className:"font-mono text-xs",children:[e.path," (",e.kind,")"]})," ",r("time",{className:"text-xs text-muted-foreground",children:te(e.at)})," ",r(y,{className:"ml-auto","data-testid":`fn-history-load-${d.toString()}`,onClick:()=>{q(e)},size:"xs",type:"button",variant:"ghost",children:a("Load")})]},e.id))})]})};export{Ie as FunctionRunner};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as W}from"react/compiler-runtime";import{useState as K}from"react";import{E as G}from"../packem_shared/error-alert-t6cpEi0z.js";import{L as J}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as V}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as X}from"../packem_shared/badge-BbuuAio7.js";import{u as Y}from"../packem_shared/button-BkCrNcAs.js";import{c as Z,u as tt}from"../packem_shared/card-CIDGUN6K.js";import{E as et}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as rt,d as at,m as P,p as l,f as st,u as n}from"../packem_shared/table-DdJBrClo.js";import{N as lt}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import nt from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ot}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as it}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{i as ct}from"../packem_shared/internal-BSIsQVC6.js";import{c as z}from"../packem_shared/utils-bhneXptQ.js";import{jsx as e,jsxs as y}from"react/jsx-runtime";const dt={action:"outline",mutation:"default",query:"secondary"},O=r=>r<1e3?`${r<10?r.toFixed(1):Math.round(r).toString()}ms`:`${(r/1e3).toFixed(2)}s`,mt=r=>r.calls===0?"—":r.errors===0?"0":`${r.errors.toString()} (${(r.errors/r.calls*100).toFixed(1)}%)`,ut=r=>{const t=r.conflicts??0;return r.calls===0?"—":t===0?"0":`${t.toString()} (${(t/r.calls*100).toFixed(1)}%)`},ht={calls:(r,t)=>t.calls-r.calls,recent:(r,t)=>t.lastCalledAt-r.lastCalledAt,slowest:(r,t)=>t.maxDurationMs-r.maxDurationMs},Dt=r=>{const t=W(47),{functions:_,initialShardKey:R}=r,s=ot(),[o,U]=K(R??""),[i,B]=K("recent");let S;t[0]!==o?(S=o.trim(),t[0]=o,t[1]=S):S=t[1];const T=nt(S,400);let M;t[2]===Symbol.for("react.memo_cache_sentinel")?(M={},t[2]=M):M=t[2];let w;t[3]!==T?(w={live:!0,shardKey:T},t[3]=T,t[4]=w):w=t[4];const{data:H,error:c,errorSource:$,liveError:v}=lt(it.getFunctionStats,M,w),b=H?.functions??null;let E;t[5]!==_?(E=new Map((_??[]).map(ft)),t[5]=_,t[6]=E):E=t[6];const L=E;let C;t[7]===Symbol.for("react.memo_cache_sentinel")?(C=k=>{B(k.currentTarget.dataset.sort)},t[7]=C):C=t[7];const Q=C;let F;if(t[8]!==c||t[9]!==$||t[10]!==L||t[11]!==v||t[12]!==o||t[13]!==i||t[14]!==b||t[15]!==s){const k=b===null?[]:b.toSorted(ht[i]);let d;t[17]!==s?(d=s("Recent"),t[17]=s,t[18]=d):d=t[18];let m;t[19]!==d?(m={key:"recent",label:d},t[19]=d,t[20]=m):m=t[20];let u;t[21]!==s?(u=s("Most called"),t[21]=s,t[22]=u):u=t[22];let h;t[23]!==u?(h={key:"calls",label:u},t[23]=u,t[24]=h):h=t[24];let f;t[25]!==s?(f=s("Slowest"),t[25]=s,t[26]=f):f=t[26];let p;t[27]!==f?(p={key:"slowest",label:f},t[27]=f,t[28]=p):p=t[28];let I;t[29]!==h||t[30]!==p||t[31]!==m?(I=[m,h,p],t[29]=h,t[30]=p,t[31]=m,t[32]=I):I=t[32];const j=I;let x;t[33]!==o?(x=e(V,{onChange:U,testId:"fs-shard-input",value:o}),t[33]=o,t[34]=x):x=t[34];let g;t[35]!==v?(g=e(J,{message:v,prefix:"fs"}),t[35]=v,t[36]=g):g=t[36];let N;t[37]!==j||t[38]!==i?(N=e("div",{className:"ml-auto flex items-center gap-1",role:"group",children:j.map(a=>e(Y,{"data-sort":a.key,"data-testid":`fs-sort-${a.key}`,onClick:Q,size:"sm",type:"button",variant:i===a.key?"secondary":"ghost",children:a.label},a.key))}),t[37]=j,t[38]=i,t[39]=N):N=t[39];let A;t[40]!==x||t[41]!==g||t[42]!==N?(A=y("div",{className:"flex flex-wrap items-center gap-2",children:[x,g,N]}),t[40]=x,t[41]=g,t[42]=N,t[43]=A):A=t[43];let D;t[44]!==c||t[45]!==$?(D=c!==null&&e(G,{error:$,testId:"fs-error"}),t[44]=c,t[45]=$,t[46]=D):D=t[46],F=y("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-stats",children:[A,D,b!==null&&k.length===0&&c===null&&e(et,{description:s("Per-function call counts, error rates, and latency land here after your first request."),icon:y("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[e("path",{d:"M3 3v18h18"}),e("path",{d:"M7 14l4-4 3 3 5-6"})]}),testId:"fs-empty",title:s("No functions have run on this shard yet.")}),k.length>0&&e(Z,{className:"overflow-hidden py-0",children:e(tt,{className:"px-0",children:y(rt,{"data-testid":"fs-table",children:[e(at,{children:y(P,{children:[e(l,{children:s("function")}),e(l,{children:s("kind")}),e(l,{className:"text-right",children:s("calls")}),e(l,{className:"text-right",children:s("errors")}),e(l,{className:"text-right",children:s("conflicts")}),e(l,{className:"text-right",children:s("avg")}),e(l,{className:"text-right",children:s("max")}),e(l,{children:s("last run")}),e(l,{children:s("last error")})]})}),e(st,{children:k.map(a=>{const q=L.get(a.path);return y(P,{"data-testid":`fs-row-${a.path}`,children:[e(n,{className:"font-medium",children:a.path}),e(n,{children:q===void 0?e("span",{className:"text-muted-foreground",children:"—"}):e(X,{variant:dt[q],children:q})}),e(n,{className:"text-right tabular-nums",children:a.calls}),e(n,{className:z("text-right tabular-nums",a.errors>0&&"text-destructive"),children:mt(a)}),e(n,{className:z("text-right tabular-nums",(a.conflicts??0)>0&&"text-warning"),children:ut(a)}),e(n,{className:"text-right tabular-nums",children:a.calls===0?"—":O(a.totalDurationMs/a.calls)}),e(n,{className:"text-right tabular-nums",children:a.calls===0?"—":O(a.maxDurationMs)}),e(n,{className:"text-muted-foreground",children:ct(a.lastCalledAt,"—")}),e(n,{className:"max-w-[24ch] truncate text-destructive",title:a.lastErrorMessage??void 0,children:a.lastErrorMessage??e("span",{className:"text-muted-foreground",children:"—"})})]},a.path)})})]})})})]}),t[8]=c,t[9]=$,t[10]=L,t[11]=v,t[12]=o,t[13]=i,t[14]=b,t[15]=s,t[16]=F}else F=t[16];return F};function ft(r){return[r.path,r.kind]}export{Dt as FunctionStatsPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as fe}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useState as v,useRef as P,useEffect as C,useCallback as he}from"react";import ge from"../packem_shared/ConnectionBadge-DOk0CQWo.js";import{L as xe}from"../packem_shared/live-status-CmuRLFKf.js";import{g as F}from"../packem_shared/badge-BbuuAio7.js";import{c as S}from"../packem_shared/card-CIDGUN6K.js";import{N as ve}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import{useT as Ne}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as b}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{f as B,i as be,d as Z,b as ee,g as q}from"../packem_shared/internal-BSIsQVC6.js";import{l as we}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as M}from"../packem_shared/utils-bhneXptQ.js";import{shardsToAggregate as ye}from"../packem_shared/aggregateMetrics-BNfajLa2.js";import{S as G}from"../packem_shared/sparkline-CgjeUU2I.js";import{jsxs as i,jsx as s}from"react/jsx-runtime";const te={completed:0,failed:2,in_progress:1},ke=a=>{let e=0,t=0,r=0,l=0;const u=[];for(const{metrics:m}of a){if(m===null){l+=1;continue}r+=1,e+=m.requests,t+=m.errors,u.push(...m.history??[])}return{errors:t,failed:l,history:u,reachable:r,requests:e}},Se=a=>{const e=new Map;for(const t of a)for(const r of t){const l=e.get(r.path);if(l===void 0){e.set(r.path,{...r});continue}l.calls+=r.calls,l.errors+=r.errors,l.totalDurationMs+=r.totalDurationMs,l.scans=(l.scans??0)+(r.scans??0),l.maxDurationMs=Math.max(l.maxDurationMs,r.maxDurationMs),l.lastCalledAt=Math.max(l.lastCalledAt,r.lastCalledAt),(r.lastErrorAt??0)>(l.lastErrorAt??0)&&(l.lastErrorAt=r.lastErrorAt,l.lastErrorMessage=r.lastErrorMessage)}return[...e.values()]},Me=a=>{const e=new Map;for(const t of a)for(const r of t){const l=e.get(r.id);if(l===void 0){e.set(r.id,r);continue}const u=te[r.status]-te[l.status];(u>0||u===0&&(r.updatedAt??0)>(l.updatedAt??0))&&e.set(r.id,r)}return[...e.values()]},qe=q(b.getAuthMetrics),Ae=q(b.getFunctionStats),Ee=q(b.getLogs),je=q(b.getMetrics),De=q(b.migrationStatus),Ie=5,re=2e3,$e=5,se=.01,ae=.05,Le=.1,Pe=.3,Ce=1,Fe=50,V=(a,e,t)=>a>=t?"crit":a>=e?"warn":"ok",Te=(a,e,t)=>a>=t?"crit":a>=e?"warn":"ok",Oe={crit:"destructive",ok:"secondary",warn:"default"},T=(a,e)=>e===0?"—":`${(a/e*100).toFixed(1)}%`,Re=a=>{const e=new Map;for(const r of a??[]){const l=e.get(r.bucketMs)??{calls:0,errors:0};l.calls+=r.calls,l.errors+=r.errors,e.set(r.bucketMs,l)}const t=[...e.entries()].toSorted((r,l)=>r[0]-l[0]);return{errors:t.map(([,r])=>r.errors),requests:t.map(([,r])=>r.calls)}},_e=a=>{let e=0,t=0;for(const l of a)l.status==="failed"?e+=1:l.status==="in_progress"&&(t+=1);let r="ok";return e>0?r="crit":t>0&&(r="warn"),{failed:e,level:r,running:t}},ze=(a,e)=>a.failed>0?e("{count} failed",{count:a.failed.toString()}):a.running>0?e("{count} running",{count:a.running.toString()}):e("OK"),le={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ne={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},He={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},Ke=a=>a.includes("crit")?"crit":a.includes("warn")?"warn":"ok",O=a=>{const e=fe(19),{chart:t,label:r,level:l,testId:u,value:m}=a,c=le[l];let p;e[0]!==c?(p=M("size-1.5 shrink-0 rounded-full",c),e[0]=c,e[1]=p):p=e[1];let f;e[2]!==p?(f=s("span",{"aria-hidden":"true",className:p}),e[2]=p,e[3]=f):f=e[3];let h;e[4]!==r||e[5]!==f?(h=i("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[f,r]}),e[4]=r,e[5]=f,e[6]=h):h=e[6];const N=ne[l];let d;e[7]!==N?(d=M("truncate text-2xl font-semibold tabular-nums",N),e[7]=N,e[8]=d):d=e[8];let o;e[9]!==d||e[10]!==u||e[11]!==m?(o=s("span",{className:d,"data-testid":u,children:m}),e[9]=d,e[10]=u,e[11]=m,e[12]=o):o=e[12];let g;e[13]!==t||e[14]!==o?(g=i("div",{className:"flex items-center justify-between gap-3",children:[o,t]}),e[13]=t,e[14]=o,e[15]=g):g=e[15];let x;return e[16]!==h||e[17]!==g?(x=s(S,{className:"gap-0 py-0",children:i("div",{className:"flex flex-col gap-2.5 p-4",children:[h,g]})}),e[16]=h,e[17]=g,e[18]=x):x=e[18],x},Ue=async(a,e,t)=>{const r=await Promise.all(t.map(d=>{const o=Z(d);return Promise.allSettled([a.query(je,{},o),a.query(Ae,{},o),a.query(De,{},o)])})),l=Z(e),u=typeof a.schedulerStatus=="function"?a.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[m,c,p]=await Promise.allSettled([a.query(Ee,{},l),a.query(qe,{},l),u]),f=r.map(([d,o,g])=>({functions:o.status==="fulfilled"?o.value.functions:[],metrics:d.status==="fulfilled"?d.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),h=ke(f),N=r[0]?.[0];return{auth:c.status==="fulfilled"?c.value:null,entries:m.status==="fulfilled"?m.value.entries:[],functions:Se(f.map(d=>d.functions)),logsError:m.status==="rejected"?ee(m.reason):null,metricsError:h.reachable===0&&N?.status==="rejected"?ee(N.reason):null,migrations:Me(f.map(d=>d.migrations)),scheduler:p.status==="fulfilled"?p.value:null,totals:h}},Be=a=>{const e=a?.history??[];return{attempts:e.map(t=>t.attempts),failures:e.map(t=>t.failures)}},ot=({initialShardKey:a})=>{const e=pe(),t=Ne(),[r,l]=v([]),[u,m]=v(null),[c,p]=v(null),[f,h]=v(null),[N,d]=v([]),[o,g]=v(null),[x,ie]=v(null),[oe,ce]=v([]),[w]=v(we),A=P(!1),R=P(!0);C(()=>(R.current=!0,()=>{R.current=!1}),[]);const E=a??"",j=he(async()=>{if(A.current)return;A.current=!0;const n=await Ue(e,E,ye(E,w));if(!R.current){A.current=!1;return}p(n.totals),h(n.metricsError),d(n.functions),ce(n.migrations),l(n.entries),m(n.logsError),g(n.auth),ie(n.scheduler),A.current=!1},[e,w,E]);C(()=>{B(j())},[j]);const _=P(0),y=P(null),de=()=>{const n=Date.now()-_.current;if(n>=re){_.current=Date.now(),B(j());return}y.current===null&&(y.current=setTimeout(()=>{y.current=null,_.current=Date.now(),B(j())},re-n))};C(()=>()=>{y.current!==null&&clearTimeout(y.current)},[]);const{data:J,liveError:ue}=ve(b.getMetrics,{},{live:!0,shardKey:E});C(()=>{J!==void 0&&de()},[J]);const z=r.filter(n=>n.level==="error"),H=z.slice(0,Ie),D=Re(c?.history),Q=Be(o),W=N.filter(n=>n.calls>0).toSorted((n,k)=>k.errors/k.calls-n.errors/n.calls||k.calls-n.calls).slice(0,$e),K=_e(oe),me=c===null||c.requests===0?0:c.errors/c.requests,U=V(me,se,ae),X=o===null?"ok":V(o.failureRate,Le,Pe),Y=x===null?"ok":Te(x.backlog,Ce,Fe),I=Ke([U,X,Y,K.level]);let $,L;return I==="crit"?($=t("Critical"),L=t("One or more service levels are breached.")):I==="warn"?($=t("Degraded"),L=t("Some service levels need attention.")):($=t("All systems healthy"),L=t("All service levels are within target.")),i("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[i(S,{className:"gap-0 py-0",children:[i("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[i("div",{className:"flex items-center gap-3",children:[s("span",{"aria-hidden":"true",className:M("flex size-10 shrink-0 items-center justify-center rounded-full",He[I]),children:s("span",{className:M("size-3 rounded-full",le[I])})}),i("div",{className:"grid leading-tight",children:[s("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:$}),s("span",{className:"text-[13px] text-muted-foreground",children:L})]})]}),i("div",{className:"flex flex-wrap items-center gap-4",children:[i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:t("Requests")}),i("div",{className:"flex items-center justify-end gap-2",children:[D.requests.length>=2&&s(G,{ariaLabel:t("Requests over time"),className:"h-6 w-20 text-foreground",series:D.requests,testId:"hl-spark-requests"}),s("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:(c?.requests??0).toString()})]})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:t("Error rate")}),s("div",{className:M("text-lg font-semibold tabular-nums",ne[U]),"data-testid":"hl-error-rate",children:c===null?"—":T(c.errors,c.requests)})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"flex items-center gap-2",children:[s(ge,{}),s(xe,{message:ue,prefix:"hl"})]})]})]}),f!==null&&s("div",{className:"border-t border-border bg-destructive/5 px-4 py-2 text-sm text-destructive","data-testid":"hl-metrics-error",role:"alert",children:f})]}),i("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[s(O,{chart:D.errors.length>=2?s(G,{ariaLabel:t("Errors over time"),className:"h-7 w-20 text-destructive",series:D.errors,testId:"hl-spark-errors"}):void 0,label:t("Error rate"),level:U,testId:"hl-slo-errorrate",value:c===null?"—":T(c.errors,c.requests)}),s(O,{chart:Q.failures.length>=2?s(G,{ariaLabel:t("Auth failures over time"),className:"h-7 w-20 text-destructive",series:Q.failures,testId:"hl-spark-auth"}):void 0,label:t("Auth failures"),level:X,testId:"hl-slo-auth",value:o===null?"—":T(o.failures,o.attempts)}),s(O,{label:t("Scheduler backlog"),level:Y,testId:"hl-slo-backlog",value:x===null?"—":x.backlog.toString()}),s(O,{label:t("Migrations"),level:K.level,testId:"hl-slo-migrations",value:ze(K,t)})]}),i("div",{className:"grid gap-3 lg:grid-cols-2",children:[i(S,{className:"gap-0 py-0","data-testid":"hl-functions",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Functions by error rate")})}),W.length===0?s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:t("No function activity yet.")}):s("ul",{className:"divide-y divide-border",children:W.map(n=>i("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[s("span",{className:"truncate font-mono text-foreground",children:n.path}),i("span",{className:"flex shrink-0 items-center gap-2",children:[s("span",{className:"tabular-nums text-muted-foreground",children:t("{count} calls",{count:n.calls.toString()})}),s(F,{variant:Oe[V(n.errors/n.calls,se,ae)],children:T(n.errors,n.calls)})]})]},n.path))})]}),i(S,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Recent errors")}),s(F,{"data-testid":"hl-error-count",variant:z.length>0?"destructive":"outline",children:z.length})]}),u!==null&&s("p",{className:"px-4 py-8 text-center text-sm text-destructive","data-testid":"hl-logs-error",role:"alert",children:u}),u===null&&H.length===0&&s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:t("No recent errors.")}),H.length>0&&s("ul",{className:"divide-y divide-border",children:H.map((n,k)=>i("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[i("span",{className:"flex items-center gap-2",children:[s("time",{className:"shrink-0 text-muted-foreground",children:be(n.timestamp)}),n.functionPath!==void 0&&s("span",{className:"truncate font-mono text-foreground",children:n.functionPath})]}),s("span",{className:"text-destructive",children:n.message})]},`${n.timestamp.toString()}-${k.toString()}`))})]})]}),i(S,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Shards seen")}),s(F,{"data-testid":"hl-shard-count",variant:"outline",children:w.length})]}),w.length>0&&s("ul",{className:"flex flex-wrap gap-1.5 p-4",children:w.map(n=>s("li",{"data-testid":"hl-shard",children:s(F,{variant:"secondary",children:n})},n))})]})]})};export{ot as HealthPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as B}from"react/compiler-runtime";import{useLunora as ee}from"@lunora/react";import{useNavigate as te}from"@tanstack/react-router";import{useState as I,useRef as ne,useCallback as j,useEffect as O,useEffectEvent as ae,useMemo as re}from"react";import{ShardInput as ie}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{N as H}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import oe from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as K}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as T}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{f as E,d as q,g as J}from"../packem_shared/internal-BSIsQVC6.js";import{r as le}from"../packem_shared/shard-history-DMEW5VBE.js";import{E as U,A as ce}from"../packem_shared/advisor-view-Pa8HLtBv.js";import{ConfirmButton as de}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{jsx as w}from"react/jsx-runtime";import{deriveInsights as ue}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js";import{runAdvisor as fe,RUNTIME_LINTS as me}from"@lunora/advisor";const he=t=>{const{suggestedIndex:e,table:r}=t;return!(typeof r!="string"||r.length===0||typeof e!="object"||e===null||!Array.isArray(e.fields)||e.fields.length===0)},pe=(t,e,r)=>{const n=`"${t}"`,a=`"${e}"`,l=r.map(o=>`"${o}"`).join(", ");return`CREATE INDEX IF NOT EXISTS ${a} ON ${n} (${l});`},ge=t=>{const e=B(19),{fields:r,indexName:n,table:a,testId:l}=t,o=K(),[x,d]=I(!1);let u;e[0]!==r||e[1]!==n||e[2]!==a?(u=()=>{const v="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(v===void 0)return;const b=pe(a,n,r);E(v.writeText(b)),d(!0)},e[0]=r,e[1]=n,e[2]=a,e[3]=u):u=e[3];const m=u;if(x){const v=`${l}-applied`;let b;e[4]!==o?(b=o("CREATE INDEX SQL copied to clipboard."),e[4]=o,e[5]=b):b=e[5];let S;return e[6]!==v||e[7]!==b?(S=w("span",{className:"text-xs text-muted-foreground","data-testid":v,children:b}),e[6]=v,e[7]=b,e[8]=S):S=e[8],S}let h;e[9]!==o?(h=o("Apply?"),e[9]=o,e[10]=h):h=e[10];let f;e[11]!==o||e[12]!==a?(f=o("Apply index on {table}",{table:a}),e[11]=o,e[12]=a,e[13]=f):f=e[13];let g;return e[14]!==m||e[15]!==h||e[16]!==f||e[17]!==l?(g=w(de,{confirmLabel:h,onConfirm:m,testId:l,children:f}),e[14]=m,e[15]=h,e[16]=f,e[17]=l,e[18]=g):g=e[18],g},be=(t,e)=>{const r=new Map;for(const n of e){const a=`${n.table} ${n.index}`;r.set(a,(r.get(a)??0)+n.reads)}return t.map(n=>({index:n.index,reads:r.get(`${n.table} ${n.index}`)??0,table:n.table}))},ve=t=>{const e=new Map;for(const r of t)for(const n of r.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([r,n])=>({scans:n,table:r}))},xe=(t,e)=>e.map(r=>({index:r.name,table:t})),ye=t=>{const e=be(t.declaredIndexes??[],t.indexHits??[]),r=ve(t.functions??[]),n=t.shardTraffic??[],a=t.analyticsMetrics,l=a&&a.indexHits.length>0?a.indexHits:e,o=a&&a.tableScans.length>0?a.tableScans:r,x=a&&a.shardTraffic.length>0?a.shardTraffic:n,d=fe({indexHits:l,schema:{tables:[]},shardTraffic:x,tableScans:o},{lints:me,source:"runtime"}),u=t.suppressHotScanTables;return(u===void 0?d:d.filter(m=>!(m.metadata.kind==="hot_scan"&&typeof m.metadata.table=="string"&&u.has(m.metadata.table)))).map(m=>U(m))},$e=J(T.listTables),we=J(T.listTableIndexes),M=t=>`${(t*100).toFixed(1)}%`,D=t=>`${(t/1e3).toFixed(2)}s`,Se=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},Te=(t,e)=>({"high-error-rate":t("High error rate"),"high-evictions":t("High cache eviction rate"),"high-write-contention":t("High write contention"),"low-cache-hit-rate":t("Low cache hit rate"),"missing-index":t("Missing index"),"slow-function":t("Slow function")})[e.kind],X=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:M(e.value)}),"high-evictions":t("{count} entries evicted recently.",{count:e.value}),"high-write-contention":t("{rate} of calls hit a write conflict — consider sharding to cut contention.",{rate:M(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:M(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:D(e.value),tables:Se(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:D(e.value)})})[e.kind],Ie=t=>{const e=B(10),{onJump:r,table:n}=t,a=K();let l;e[0]!==r||e[1]!==n?(l=()=>{r(n)},e[0]=r,e[1]=n,e[2]=l):l=e[2];const o=l,x=`in-add-index-${n}`;let d;e[3]!==a||e[4]!==n?(d=a("Add index on {table}",{table:n}),e[3]=a,e[4]=n,e[5]=d):d=e[5];let u;return e[6]!==o||e[7]!==x||e[8]!==d?(u=w(se,{"data-testid":x,onClick:o,size:"sm",type:"button",variant:"outline",children:d}),e[6]=o,e[7]=x,e[8]=d,e[9]=u):u=e[9],u},Be=({initialShardKey:t,loadShardTraffic:e})=>{const r=ee(),n=te(),a=K(),[l,o]=I(t??""),[x,d]=I(null),[u,m]=I(null),h=oe(l.trim(),400),f=ne(""),g=H(T.getMetrics,{},{live:!0,shardKey:h}),v=H(T.getFunctionStats,{},{live:!0,shardKey:h}),b=H(T.getAdvisories,{},{live:!0,shardKey:h}),S=g.data??null,C=v.data?.functions??null,L=b.data?.advisories??null,z=g.data?.indexHits??null,_=g.error!==null&&v.error!==null?g.error:null,P=e??(i=>r.shardTraffic(i)),V=async(i,$)=>{const s=i[0];if(s===void 0||s===""){f.current===$&&m(null);return}try{const y=await P(s);if(f.current!==$)return;const p=new Map;for(const c of y.shards)p.has(c.shardKey)||p.set(c.shardKey,{requests:c.requests,shardKey:c.shardKey});m([...p.values()])}catch{f.current===$&&m(null)}},A=j(async i=>{f.current=i;let $=[];try{const s=await r.query($e,{},q(i));if(f.current!==i)return;le(i),$=s.map(c=>c.name);const y=await Promise.allSettled(s.map(async c=>[c.name,await r.query(we,{table:c.name},q(i))]));if(f.current!==i)return;const p=[];for(const c of y)if(c.status==="fulfilled"){const[k,Z]=c.value;p.push(...xe(k,Z.indexes))}d(p)}catch{f.current===i&&d(null)}await V($,i)},[r]);O(()=>{E(A(h))},[h,A]);const G=ae(()=>{g.refetch(),v.refetch(),b.refetch(),E(A(h))});O(()=>{const i=()=>{document.visibilityState==="visible"&&G()};return document.addEventListener("visibilitychange",i),()=>{document.removeEventListener("visibilitychange",i)}},[]);const R=j(i=>{E(n({search:{table:i},to:"/schema"}))},[n]),N=ue(S,C),Q=new Set(N.filter(i=>i.kind==="missing-index").flatMap(i=>i.tables??[])),F=ye({declaredIndexes:x??[],functions:C,indexHits:z,shardTraffic:u,suppressHotScanTables:Q}),W=re(()=>{const i=N.map(s=>{const y=s.kind==="missing-index"?s.tables??[]:[];return{action:y.length>0?y.map(p=>w(Ie,{onJump:R,table:p},p)):void 0,description:s.message===void 0?X(a,s):`${X(a,s)} — ${s.message}`,entity:s.fn,issueType:Te(a,s),key:`${s.kind}:${s.fn??""}`,level:s.severity}}),$=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(L??[]).map(s=>{const y=U(s);if($.has(s.name)&&he(s.metadata)){const{table:p,suggestedIndex:c}=s.metadata,k=`in-apply-index-${p}-${c.name}`;return{...y,action:w(ge,{fields:c.fields,indexName:c.name,table:p,testId:k})}}return y}),...F,...i]},[L,N,R,F,a]),Y=w(ie,{onChange:o,testId:"in-shard-input",value:l});return w(ce,{error:_,errorSource:_===null?void 0:g.errorSource,rows:W,testId:"lunora-insights",toolbar:Y})};export{Be as InsightsPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as M}from"react/compiler-runtime";import{useVirtualizer as qe}from"@tanstack/react-virtual";import{useState as $,useReducer as Me,useRef as ie,useEffect as de,useMemo as Ae}from"react";import{f as Q}from"../packem_shared/log-fields-CoL3hsIQ.js";import{E as Oe}from"../packem_shared/error-alert-t6cpEi0z.js";import{L as Fe}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as De}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as Y}from"../packem_shared/badge-BbuuAio7.js";import{E as B}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as _}from"../packem_shared/input-JHu63lTv.js";import{N as re}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import G from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ce}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as te}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{b as ue}from"../packem_shared/cf-links-gbDy51nR.js";import{r as Ue}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as q}from"../packem_shared/utils-bhneXptQ.js";import{l as Ke}from"../packem_shared/virtual-rect-1o1veP7R.js";import{useLunora as Ve}from"@lunora/react";import{u as ze}from"../packem_shared/button-BkCrNcAs.js";import{n as je,d as Be,m as me,p as P,f as Ge,u as T}from"../packem_shared/table-DdJBrClo.js";import{f as ae,l as We,b as le}from"../packem_shared/internal-BSIsQVC6.js";import{jsx as t,jsxs as w,Fragment as Qe}from"react/jsx-runtime";const he=["trace","debug","log","info","warn","error","fatal"],Ye="LOG_ARCHIVE_NOT_CONFIGURED",ge={debug:"secondary",error:"destructive",fatal:"destructive",info:"outline",log:"outline",trace:"outline",warn:"secondary"},He={cursor:void 0,error:null,loading:!1,notConfigured:!1,rows:null},Je=(l,e)=>{switch(e.type){case"append":return{...l,cursor:e.cursor,error:null,loading:!1,rows:[...l.rows??[],...e.rows]};case"failed":return{cursor:void 0,error:e.message,loading:!1,notConfigured:!1,rows:null};case"loaded":return{cursor:e.cursor,error:null,loading:!1,notConfigured:!1,rows:e.rows};case"loading":return{...l,error:null,loading:!0,notConfigured:!1};case"notConfigured":return{cursor:void 0,error:null,loading:!1,notConfigured:!0,rows:null};case"pageFailed":return{...l,error:e.message,loading:!1};default:return l}},Xe=l=>{const e=M(33),{row:r}=l;let s;e[0]!==r.fields?(s=Q(r.fields),e[0]=r.fields,e[1]=s):s=e[1];const n=s,a=`lg-archive-row-${String(r.ts)}`;let i;e[2]!==r.ts?(i=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=i):i=e[3];let u;e[4]!==i?(u=t(T,{className:"tabular-nums whitespace-nowrap text-xs text-muted-foreground",children:i}),e[4]=i,e[5]=u):u=e[5];const v=ge[r.level];let c;e[6]!==r.level||e[7]!==v?(c=t(T,{children:t(Y,{variant:v,children:r.level})}),e[6]=r.level,e[7]=v,e[8]=c):c=e[8];let d;e[9]!==r.functionPath?(d=t(T,{className:"font-mono text-xs",children:r.functionPath}),e[9]=r.functionPath,e[10]=d):d=e[10];let b;e[11]!==r.message?(b=t("div",{className:"truncate",title:r.message,children:r.message}),e[11]=r.message,e[12]=b):b=e[12];let f;e[13]!==n?(f=n!==""&&t("div",{className:"truncate font-mono text-[11px] text-muted-foreground",title:n,children:n}),e[13]=n,e[14]=f):f=e[14];let m;e[15]!==b||e[16]!==f?(m=w(T,{className:"max-w-md",children:[b,f]}),e[15]=b,e[16]=f,e[17]=m):m=e[17];const h=r.traceId??"—";let p;e[18]!==h?(p=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:h}),e[18]=h,e[19]=p):p=e[19];const L=r.shardKey??"—";let g;e[20]!==L?(g=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:L}),e[20]=L,e[21]=g):g=e[21];const x=r.userId??"—";let y;e[22]!==x?(y=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:x}),e[22]=x,e[23]=y):y=e[23];let C;return e[24]!==m||e[25]!==p||e[26]!==g||e[27]!==y||e[28]!==a||e[29]!==u||e[30]!==c||e[31]!==d?(C=w(me,{"data-testid":a,children:[u,c,d,m,p,g,y]}),e[24]=m,e[25]=p,e[26]=g,e[27]=y,e[28]=a,e[29]=u,e[30]=c,e[31]=d,e[32]=C):C=e[32],C},Ze=({shardKey:l})=>{const e=Ve(),r=ce(),[s,n]=$(""),[a,i]=$(""),[u,v]=$(""),[{cursor:c,error:d,loading:b,notConfigured:f,rows:m},h]=Me(Je,He),p=G(s.trim(),400),L=G(a.trim(),400),g={...p===""?{}:{functionPathPrefix:p},...u===""?{}:{minLevel:u},...l===""?{}:{shardKey:l},...L===""?{}:{userId:L}},x=JSON.stringify(g),y=ie(x);de(()=>{const N={cancelled:!1};return y.current=x,ae((async()=>{h({type:"loading"});try{const k=await e.queryLogArchive(g);N.cancelled||h({cursor:k.nextCursor,rows:k.rows,type:"loaded"})}catch(k){N.cancelled||h(We(k)===Ye?{type:"notConfigured"}:{message:le(k),type:"failed"})}})()),()=>{N.cancelled=!0}},[e,x]);const C=async()=>{if(c===void 0)return;const N=x;h({type:"loading"});try{const k=await e.queryLogArchive({...g,cursor:c});y.current===N&&h({cursor:k.nextCursor,rows:k.rows,type:"append"})}catch(k){y.current===N&&h({message:le(k),type:"pageFailed"})}},R=N=>{n(N.target.value)},S=N=>{i(N.target.value)},I=N=>{v(N.target.value)},E=()=>{ae(C())};return f?t(B,{action:t("a",{className:"text-sm text-primary underline-offset-4 hover:underline",href:ue,rel:"noreferrer",target:"_blank",children:r("Open in Cloudflare")}),description:r("Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here."),testId:"lg-archive-not-configured",title:r("Log archive not configured")}):w("div",{className:"flex flex-col gap-4","data-testid":"lg-archive",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":r("Function path prefix"),className:"h-8 w-48","data-testid":"lg-archive-path",onChange:R,placeholder:r("function path…"),value:s}),t(_,{"aria-label":r("User id"),className:"h-8 w-40","data-testid":"lg-archive-user",onChange:S,placeholder:r("user id…"),value:a}),w("select",{"aria-label":r("Minimum level"),className:"h-8 rounded-md border border-border bg-background px-2 text-sm","data-testid":"lg-archive-min-level",onChange:I,value:u,children:[t("option",{value:"",children:r("min level")}),he.map(N=>t("option",{value:N,children:N},N))]})]}),d!==null&&t("p",{className:"text-sm text-destructive","data-testid":"lg-archive-error",role:"alert",children:d}),b&&m===null&&d===null&&t("p",{className:"text-sm text-muted-foreground","data-testid":"lg-archive-loading",children:r("Loading…")}),m!==null&&m.length===0&&t(B,{description:r("No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2."),testId:"lg-archive-empty",title:r("No archived logs.")}),m!==null&&m.length>0&&t("div",{className:"overflow-hidden rounded-xl border border-border shadow-xs",children:w(je,{"data-testid":"lg-archive-table",children:[t(Be,{children:w(me,{children:[t(P,{children:r("Time")}),t(P,{children:r("Level")}),t(P,{children:r("Function")}),t(P,{children:r("Message")}),t(P,{children:r("Trace")}),t(P,{children:r("Shard")}),t(P,{children:r("User")})]})}),t(Ge,{children:m.map((N,k)=>t(Xe,{row:N},`${String(N.ts)}-${String(k)}`))})]})}),c!==void 0&&t("div",{children:t(ze,{"data-testid":"lg-archive-more",disabled:b,onClick:E,size:"sm",variant:"outline",children:r(b?"Loading…":"Load more")})})]})},W=400,er=36,rr={height:W,overflow:"auto"},fe={left:0,position:"absolute",top:0,width:"100%"},tr={error:"destructive",ok:"secondary"},ar=l=>{const e=M(26),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.fields?(c=Q(r.fields),e[2]=r.fields,e[3]=c):c=e[3];const d=c;let b;e[4]!==r.timestamp?(b=new Date(r.timestamp).toLocaleString(),e[4]=r.timestamp,e[5]=b):b=e[5];let f;e[6]!==b?(f=t("span",{className:"w-44 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:b}),e[6]=b,e[7]=f):f=e[7];const m=ge[r.level];let h;e[8]!==r.level||e[9]!==m?(h=t("span",{className:"w-20 shrink-0",role:"gridcell",children:t(Y,{variant:m,children:r.level})}),e[8]=r.level,e[9]=m,e[10]=h):h=e[10];const p=r.functionPath??"—";let L;e[11]!==p?(L=t("span",{className:"w-48 shrink-0 truncate text-muted-foreground",role:"gridcell",children:p}),e[11]=p,e[12]=L):L=e[12];let g;e[13]!==d?(g=d===""?null:t("span",{className:"ml-2 text-muted-foreground","data-testid":"lg-fields",children:d}),e[13]=d,e[14]=g):g=e[14];let x;e[15]!==r.message||e[16]!==g?(x=w("span",{className:"flex-1 truncate",role:"gridcell",children:[r.message,g]}),e[15]=r.message,e[16]=g,e[17]=x):x=e[17];let y;return e[18]!==s||e[19]!==n||e[20]!==v||e[21]!==x||e[22]!==f||e[23]!==h||e[24]!==L?(y=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-row",ref:n,role:"row",style:v,children:[f,h,L,x]}),e[18]=s,e[19]=n,e[20]=v,e[21]=x,e[22]=f,e[23]=h,e[24]=L,e[25]=y):y=e[25],y},oe=l=>l.length===0?"—":l.join(", "),lr=l=>{const e=M(37),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.ts?(c=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=c):c=e[3];let d;e[4]!==c?(d=t("span",{className:"w-40 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:c}),e[4]=c,e[5]=d):d=e[5];const b=tr[r.outcome];let f;e[6]!==r.outcome||e[7]!==b?(f=t("span",{className:"w-16 shrink-0",role:"gridcell",children:t(Y,{variant:b,children:r.outcome})}),e[6]=r.outcome,e[7]=b,e[8]=f):f=e[8];let m;e[9]!==r.functionPath?(m=t("span",{className:"w-44 shrink-0 truncate",role:"gridcell",title:r.functionPath,children:r.functionPath}),e[9]=r.functionPath,e[10]=m):m=e[10];const h=r.shardKey??"—";let p;e[11]!==h?(p=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:h}),e[11]=h,e[12]=p):p=e[12];const L=r.userId??"—";let g;e[13]!==L?(g=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:L}),e[13]=L,e[14]=g):g=e[14];let x;e[15]!==r.durationMs?(x=Math.round(r.durationMs),e[15]=r.durationMs,e[16]=x):x=e[16];const y=`${String(x)}ms`;let C;e[17]!==y?(C=t("span",{className:"w-16 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:y}),e[17]=y,e[18]=C):C=e[18];let R;e[19]!==r.errorMessage||e[20]!==r.outcome||e[21]!==r.tablesRead||e[22]!==r.tablesWritten?(R=r.outcome==="error"&&r.errorMessage!==void 0?r.errorMessage:`r:${oe(r.tablesRead)} · w:${oe(r.tablesWritten)}`,e[19]=r.errorMessage,e[20]=r.outcome,e[21]=r.tablesRead,e[22]=r.tablesWritten,e[23]=R):R=e[23];let S;e[24]!==R?(S=t("span",{className:"flex-1 truncate text-muted-foreground",role:"gridcell",children:R}),e[24]=R,e[25]=S):S=e[25];let I;return e[26]!==s||e[27]!==n||e[28]!==v||e[29]!==g||e[30]!==C||e[31]!==S||e[32]!==d||e[33]!==f||e[34]!==m||e[35]!==p?(I=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-req-row",ref:n,role:"row",style:v,children:[d,f,m,p,g,C,S]}),e[26]=s,e[27]=n,e[28]=v,e[29]=g,e[30]=C,e[31]=S,e[32]=d,e[33]=f,e[34]=m,e[35]=p,e[36]=I):I=e[36],I},se=l=>{const{entries:e}=l??{};return Array.isArray(e)?e:[]},or=l=>{const e={};return l.functionPathPrefix.trim()!==""&&(e.functionPathPrefix=l.functionPathPrefix.trim()),l.userId.trim()!==""&&(e.userId=l.userId.trim()),l.tableTouched.trim()!==""&&(e.tableTouched=l.tableTouched.trim()),(l.outcome==="ok"||l.outcome==="error")&&(e.outcome=l.outcome),e},pe=he,sr={"5m":300*1e3,"15m":900*1e3,"1h":3600*1e3},nr=(l,e)=>{const r=e.search.trim().toLowerCase(),s=e.path.trim().toLowerCase(),n=e.range==="all"?Number.NEGATIVE_INFINITY:e.now-sr[e.range];return l.filter(a=>e.levels.size>0&&!e.levels.has(a.level)||a.timestamp<n||s!==""&&!(a.functionPath??"").toLowerCase().includes(s)?!1:r===""||a.message.toLowerCase().includes(r)||Q(a.fields).toLowerCase().includes(r))},ir="—",dr=l=>{const e=new Map,r=new Map;for(const a of l){e.set(a.level,(e.get(a.level)??0)+1);const i=a.functionPath??ir;r.set(i,(r.get(i)??0)+1)}const s=pe.filter(a=>e.has(a)).map(a=>({count:e.get(a)??0,key:a})),n=[...r.entries()].map(([a,i])=>({count:i,key:a})).toSorted((a,i)=>i.count===a.count?a.key.localeCompare(i.key):i.count-a.count);return{byLevel:s,byPath:n,total:l.length}},cr=l=>{const e=M(11),{level:r,onToggle:s,selected:n}=l;let a;e[0]!==r||e[1]!==s?(a=()=>{s(r)},e[0]=r,e[1]=s,e[2]=a):a=e[2];const i=a,u=n?"border-border bg-muted font-medium":"border-input text-muted-foreground";let v;e[3]!==u?(v=q("rounded-md border px-2 py-1 text-xs",u),e[3]=u,e[4]=v):v=e[4];const c=`logs-level-${r}`;let d;return e[5]!==r||e[6]!==i||e[7]!==n||e[8]!==v||e[9]!==c?(d=t("button",{"aria-pressed":n,className:v,"data-testid":c,onClick:i,type:"button",children:r}),e[5]=r,e[6]=i,e[7]=n,e[8]=v,e[9]=c,e[10]=d):d=e[10],d},ne=l=>{const e=M(7),{bucket:r}=l;let s;e[0]!==r.key?(s=t("span",{className:"truncate text-muted-foreground",role:"gridcell",children:r.key}),e[0]=r.key,e[1]=s):s=e[1];let n;e[2]!==r.count?(n=t("span",{className:"shrink-0 tabular-nums",role:"gridcell",children:r.count}),e[2]=r.count,e[3]=n):n=e[3];let a;return e[4]!==s||e[5]!==n?(a=w("div",{className:"flex items-center justify-between gap-4 px-3 py-1 font-mono text-xs","data-testid":"logs-summary-row",role:"row",children:[s,n]}),e[4]=s,e[5]=n,e[6]=a):a=e[6],a},qr=({initialShardKey:l})=>{const e=ce(),[r,s]=$("requests"),[n,a]=$(l??""),[i,u]=$(""),[v,c]=$(()=>new Set),[d,b]=$(""),[f,m]=$("all"),[h,p]=$(!1),[L,g]=$(""),[x,y]=$(""),[C,R]=$(""),[S,I]=$("all"),E=G(n.trim(),400),N=or({functionPathPrefix:L,outcome:S,tableTouched:C,userId:x}),k=re(te.getRequestLog,N,{enabled:r==="requests",live:!0,shardKey:E}),H=re(te.getLogs,{},{enabled:r==="errors",live:!0,shardKey:E}),D=r==="requests"?k:H,{error:J,errorSource:ve,isLoading:X,liveError:be}=D,xe=se(H.data),Z=se(k.data);de(()=>{D.data!==void 0&&Ue(E)},[D.data,E]);const U=nr(xe,{levels:v,now:Date.now(),path:d,range:f,search:i}),K=dr(U),V=r==="requests"?Z.length:U.length,z=r==="errors"&&h,A=Ae(()=>J!==null?"error":V===0?X?z?"summary":"list":"empty":z?"summary":"list",[V,X,J,z]),ee=ie(null),O=qe({count:V,estimateSize:()=>er,getScrollElement:()=>ee.current,initialRect:{height:W,width:800},observeElementRect:(o,j)=>Ke(o,j,W),overscan:8}),we=O.getVirtualItems(),ye={height:O.getTotalSize(),position:"relative",width:"100%"},Ne=o=>{u(o.target.value)},Le=o=>{c(j=>{const F=new Set(j);return F.has(o)?F.delete(o):F.add(o),F})},Ce=o=>{b(o.target.value)},ke=o=>{m(o.target.value)},$e=()=>{p(o=>!o)},Se=o=>{g(o.target.value)},Re=o=>{y(o.target.value)},Ie=o=>{R(o.target.value)},Ee=o=>{I(o.target.value)},Pe=()=>{s("requests"),p(!1)},Te=()=>{s("errors"),p(!1)},_e=()=>{s("archive"),p(!1)};return w("div",{className:"flex flex-col gap-4","data-testid":"lunora-logs",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[w("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",role:"tablist",children:[t("button",{"aria-selected":r==="requests",className:q("px-3 py-1 text-sm",r==="requests"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-requests",onClick:Pe,role:"tab",type:"button",children:e("Requests")}),t("button",{"aria-selected":r==="errors",className:q("px-3 py-1 text-sm",r==="errors"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-errors",onClick:Te,role:"tab",type:"button",children:e("Errors")}),t("button",{"aria-selected":r==="archive",className:q("px-3 py-1 text-sm",r==="archive"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-archive",onClick:_e,role:"tab",type:"button",children:e("Archive")})]}),t(De,{onChange:a,testId:"lg-shard-input",value:n}),r!=="archive"&&t(Fe,{message:be,prefix:"lg"}),t("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"lg-cf-link",href:ue,rel:"noreferrer",target:"_blank",children:e("Open in Cloudflare")})]}),r==="errors"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Search messages"),className:"h-8 w-48","data-testid":"lg-search",onChange:Ne,placeholder:e("search message"),value:i}),t(_,{"aria-label":e("Function path"),className:"h-8 w-40","data-testid":"logs-path-filter",onChange:Ce,placeholder:e("filter path"),value:d}),t("div",{"aria-label":e("Level filter"),className:"inline-flex items-center gap-1","data-testid":"logs-level-filter",role:"group",children:pe.map(o=>t(cr,{level:o,onToggle:Le,selected:v.has(o)},o))}),w("select",{"aria-label":e("Time range"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"logs-time-range",onChange:ke,value:f,children:[t("option",{value:"all",children:e("All time")}),t("option",{value:"5m",children:e("Last 5m")}),t("option",{value:"15m",children:e("Last 15m")}),t("option",{value:"1h",children:e("Last hour")})]}),t("button",{"aria-pressed":h,className:q("h-8 rounded-md border px-3 text-sm",h?"border-border bg-muted font-medium":"border-input text-muted-foreground"),"data-testid":"logs-summary-toggle",onClick:$e,type:"button",children:e(h?"List":"Summary")})]}),r==="requests"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Function path"),className:"h-8 w-44","data-testid":"lg-req-path",onChange:Se,placeholder:e("file:function"),value:L}),t(_,{"aria-label":e("User id"),className:"h-8 w-32","data-testid":"lg-req-user",onChange:Re,placeholder:e("userId"),value:x}),t(_,{"aria-label":e("Table touched"),className:"h-8 w-32","data-testid":"lg-req-table",onChange:Ie,placeholder:e("table"),value:C}),w("select",{"aria-label":e("Outcome filter"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"lg-req-outcome",onChange:Ee,value:S,children:[t("option",{value:"all",children:e("all")}),t("option",{value:"ok",children:e("ok")}),t("option",{value:"error",children:e("error")})]})]}),r==="archive"?t(Ze,{shardKey:E}):w(Qe,{children:[A==="error"&&t(Oe,{error:ve,testId:"lg-error"}),A==="empty"&&t(B,{description:e("Function and request logs for this shard show up here as your app handles traffic."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M4 5h16M4 12h16M4 19h10"})}),testId:"lg-empty",title:e("No logs.")}),A==="summary"&&w("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"logs-summary",children:[t("p",{className:"text-xs text-muted-foreground","data-testid":"logs-summary-total",children:e("{count} entries",{count:K.total})}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By level")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-levels",role:"grid",children:K.byLevel.map(o=>t(ne,{bucket:o},o.key))})]}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By function")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-paths",role:"grid",children:K.byPath.map(o=>t(ne,{bucket:o},o.key))})]})]}),A==="list"&&t("div",{className:"rounded-xl border border-border shadow-xs","data-testid":"lg-scroll",ref:ee,style:rr,children:t("div",{"aria-label":e("Recent logs"),"data-testid":"lg-table",role:"grid",style:ye,children:we.map(o=>r==="requests"?t(lr,{entry:Z[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key):t(ar,{entry:U[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key))})})]})]})};export{qr as LogsPanel,nr as filterLogs,dr as summarizeLogs};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useLunora as G}from"@lunora/react";import{useState as p}from"react";import{E as J}from"../packem_shared/error-alert-t6cpEi0z.js";import{g as K}from"../packem_shared/badge-BbuuAio7.js";import{u as m}from"../packem_shared/button-BkCrNcAs.js";import{E as Q}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as X}from"../packem_shared/scroll-area-DTEq6Jec.js";import{Separator as Y}from"@base-ui/react/separator";import{c as Z}from"../packem_shared/utils-bhneXptQ.js";import{jsx as e,jsxs as l,Fragment as ee}from"react/jsx-runtime";import{N as te}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import{useAutoRefresh as ae}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{useT as re}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as g}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{i as k,f as $,c as ie,d as j,b as T,g as L}from"../packem_shared/internal-BSIsQVC6.js";function de({className:r,orientation:s="horizontal",...a}){return e(Y,{"data-slot":"separator",orientation:s,className:Z("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",r),...a})}const le=L(g.clearCapturedMail),se=L(g.sendTestMail),oe=/https?:\/\/[^\s"'<>)]+/i,z=r=>r===void 0?void 0:oe.exec(r)?.[0],ne=r=>{if(r!==void 0)return z(r.html)??z(r.text)},ce=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,me=r=>`${ce}${r}`,f=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,ue=(r,s)=>{const a=s.trim().toLowerCase();return a===""?r:r.filter(u=>`${u.subject} ${f(u.to)}`.toLowerCase().includes(a))},he=(r,s)=>{if(r.length!==0)return r.find(a=>a.id===s)??r[0]},Me=({limit:r=100})=>{const s=G(),a=re(),{data:u,error:b,errorSource:M,isLoading:S,refetch:x}=te(g.getCapturedMail,{limit:r}),[v,h]=p(null),[A,N]=p(null),[c,E]=p("html"),[w,F]=p(""),o=u?.entries??[],y=b??v,O=b===null?v:M,H=async()=>{h(null);try{await s.query(le,{},j("")),N(null),x()}catch(t){h(T(t))}},I=async()=>{h(null);try{await s.query(se,{},j("")),x()}catch(t){h(T(t))}};ae(()=>{x()},!0);const _=()=>{$(H())},q=()=>{$(I())},P=t=>{F(t.currentTarget.value)},D=t=>{const{id:d}=t.currentTarget.dataset;d!==void 0&&N(d)},R=t=>{const d=t.currentTarget.dataset.tab;(d==="headers"||d==="html"||d==="text")&&E(d)},B=t=>a(t==="html"?"HTML":t==="text"?"Plain text":"Headers"),C=ue(o,w),i=he(C,A),n=ne(i),U=()=>{n!==void 0&&ie(n)},W=()=>{n!==void 0&&"window"in globalThis&&globalThis.window.open(n,"_blank","noopener")};return l("div",{className:"flex flex-col gap-4","data-testid":"mail-panel",children:[l("div",{className:"flex flex-wrap items-center gap-2",children:[e(m,{"data-testid":"mail-send-test",onClick:q,size:"sm",type:"button",variant:"outline",children:a("Send test")}),e(m,{"data-testid":"mail-clear",disabled:o.length===0,onClick:_,size:"sm",type:"button",variant:"outline",children:a("Clear inbox")}),o.length>0&&e(K,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:a("{count} messages",{count:o.length})})]}),y!==null&&e(J,{error:O,testId:"mail-error"}),y===null&&!S&&o.length===0&&e(Q,{description:a("Email your app sends in dev is captured here — nothing is delivered."),icon:l("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[e("path",{d:"M4 5h16v14H4z"}),e("path",{d:"m4 6 8 6 8-6"})]}),testId:"mail-empty",title:a("No captured email.")}),o.length>0&&l("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[minmax(0,22rem)_1fr]","data-testid":"mail-reader",children:[l("div",{className:"flex flex-col gap-2",children:[e(V,{"aria-label":a("Search messages"),"data-testid":"mail-search",onChange:P,placeholder:a("Filter messages"),type:"search",value:w}),e(X,{className:"max-h-[32rem] rounded-xl border border-border bg-card shadow-xs","data-testid":"mail-list",children:e("ul",{className:"divide-y",children:C.map(t=>{const d=t.id===i?.id;return e("li",{children:l("button",{className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-sm hover:bg-muted/60 ${d?"bg-muted":""}`,"data-active":d,"data-id":t.id,"data-testid":"mail-list-item",onClick:D,type:"button",children:[e("span",{className:"w-full truncate font-medium",children:t.subject||a("(no subject)")}),e("span",{className:"w-full truncate text-xs text-muted-foreground",children:f(t.to)}),e("span",{className:"text-xs text-muted-foreground tabular-nums",children:k(t.capturedAt,"—")})]})},t.id)})})})]}),i!==void 0&&l("div",{className:"flex min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"mail-detail",children:[l("div",{className:"flex flex-col gap-1",children:[e("h2",{className:"truncate text-base font-semibold","data-testid":"mail-subject",children:i.subject||a("(no subject)")}),l("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs text-muted-foreground",children:[e("dt",{children:a("From")}),e("dd",{className:"truncate font-mono",children:i.from??"—"}),e("dt",{children:a("To")}),e("dd",{className:"truncate font-mono",children:f(i.to)}),i.cc!==void 0&&i.cc.length>0&&l(ee,{children:[e("dt",{children:a("Cc")}),e("dd",{className:"truncate font-mono",children:f(i.cc)})]}),e("dt",{children:a("Sent")}),e("dd",{className:"tabular-nums",children:k(i.capturedAt,"—")})]})]}),l("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[e(m,{"data-testid":"mail-copy-link",disabled:n===void 0,onClick:U,size:"sm",type:"button",variant:"outline",children:a("Copy link")}),e(m,{"data-testid":"mail-open-link",disabled:n===void 0,onClick:W,size:"sm",type:"button",variant:"outline",children:a("Open in new tab")})]}),e(de,{}),e("div",{className:"flex items-center gap-1","data-testid":"mail-tabs",role:"tablist",children:["html","text","headers"].map(t=>e(m,{"aria-selected":c===t,"data-tab":t,"data-testid":`mail-tab-${t}`,onClick:R,role:"tab",size:"sm",type:"button",variant:c===t?"secondary":"ghost",children:B(t)},t))}),l("div",{className:"min-h-[12rem]",children:[c==="html"&&(i.html===void 0?e("p",{className:"text-sm text-muted-foreground",children:a("No HTML body.")}):e("iframe",{className:"h-[24rem] w-full rounded-md border bg-white","data-testid":"mail-preview-html",sandbox:"",srcDoc:me(i.html),title:a("Email preview")})),c==="text"&&(i.text===void 0?e("p",{className:"text-sm text-muted-foreground",children:a("No text body.")}):e("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-text",children:i.text})),c==="headers"&&(i.headers===void 0||Object.keys(i.headers).length===0?e("p",{className:"text-sm text-muted-foreground",children:a("No headers.")}):e("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-headers",children:Object.entries(i.headers).map(([t,d])=>`${t}: ${d}`).join(`
|
|
2
|
+
`)}))]})]})]})]})};export{Me as MailPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as Re}from"react/compiler-runtime";import{useLunora as pt}from"@lunora/react";import{useNavigate as xt}from"@tanstack/react-router";import{useState as ue,useRef as Ge,useEffect as tt,useMemo as bt}from"react";import{L as vt}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as yt}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as rt}from"../packem_shared/button-BkCrNcAs.js";import{c as he,u as ge,n as Qe,f as Ue,m as Nt}from"../packem_shared/card-CIDGUN6K.js";import{p as ie,d as ct,m as Be,u as se,n as mt,f as ut}from"../packem_shared/table-DdJBrClo.js";import{N as He}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import wt from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as Ae}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Oe}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{c as St}from"../packem_shared/cf-links-gbDy51nR.js";import{l as $t,k as Xe,f as at,d as kt,b as qt,g as _t}from"../packem_shared/internal-BSIsQVC6.js";import{r as Mt,l as It}from"../packem_shared/shard-history-DMEW5VBE.js";import{w as Ct}from"../packem_shared/trace-handoff-Dw7mwjxu.js";import{f as Tt}from"../packem_shared/log-fields-CoL3hsIQ.js";import{g as et}from"../packem_shared/badge-BbuuAio7.js";import{S as ht}from"../packem_shared/sparkline-CgjeUU2I.js";import{jsx as t,jsxs as n,Fragment as Ye}from"react/jsx-runtime";import{aggregateMetrics as Dt,computeLatencyPercentiles as Ft,enrichQueryStats as Lt,shardsToAggregate as Ot}from"../packem_shared/aggregateMetrics-BNfajLa2.js";import{ResponsiveContainer as st,AreaChart as Rt,CartesianGrid as lt,XAxis as nt,YAxis as it,Tooltip as ot,Area as At,LineChart as zt,Line as Kt}from"recharts";import{E as Et}from"../packem_shared/empty-state-Cg7t_8qu.js";import{c as jt}from"../packem_shared/utils-bhneXptQ.js";import{N as Qt,y as Ut,k as Pe,_ as Pt,w as Jt}from"../packem_shared/select-Bul-DeII.js";const Bt=(s,e)=>s<e?-1:s>e?1:0,Ze=s=>{if(s===void 0)return"null";if(typeof s=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(s===null||typeof s!="object")return JSON.stringify(s);if(Array.isArray(s))return`[${s.map(u=>Ze(u)).join(",")}]`;const e=Object.getPrototypeOf(s);if(e!==null&&e!==Object.prototype){const u=s.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${u} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const l=s,r=Object.keys(l).toSorted(Bt),a=[];for(const u of r){const c=l[u];c!==void 0&&a.push(`${JSON.stringify(u)}:${Ze(c)}`)}return`{${a.join(",")}}`},gt=(s,e,l)=>`${s}:${e}:${Ze(l??{})}`,ft=(s,e)=>s==="gauge"?e.last:s==="histogram"?e.sum/Math.max(1,e.count):e.sum,Ht=(s,e)=>ft(s,e),Wt=s=>ft(s.kind,s),Ve=s=>Number.isInteger(s)?s.toLocaleString():s.toLocaleString(void 0,{maximumFractionDigits:2}),Gt=s=>Array.isArray(s?.series)?s.series:[],Xt="FUNCTION_NOT_FOUND",Yt=s=>{const e=new Map;if(!Array.isArray(s?.series))return e;for(const l of s.series)e.set(gt(l.kind,l.name,l.attributes),l.points);return e},Vt={counter:"secondary",gauge:"default",histogram:"outline"},Zt=s=>{const e=Re(18),{name:l,onOpenTrace:r,traceId:a}=s,u=Ae();if(a===void 0){let m;return e[0]===Symbol.for("react.memo_cache_sentinel")?(m=t("span",{className:"text-muted-foreground",children:"—"}),e[0]=m):m=e[0],m}let c;e[1]!==a?(c=a.slice(0,8),e[1]=a,e[2]=c):c=e[2];const g=c;if(r===void 0){const m=`mt-instrument-trace-${l}`;let b;return e[3]!==g||e[4]!==m||e[5]!==a?(b=t("span",{className:"text-muted-foreground","data-testid":m,title:a,children:g}),e[3]=g,e[4]=m,e[5]=a,e[6]=b):b=e[6],b}const p=`mt-instrument-trace-${l}`;let x;e[7]!==r||e[8]!==a?(x=()=>{r(a)},e[7]=r,e[8]=a,e[9]=x):x=e[9];let v;e[10]!==u||e[11]!==a?(v=u("Open the exemplar trace {trace}",{trace:a}),e[10]=u,e[11]=a,e[12]=v):v=e[12];let h;return e[13]!==g||e[14]!==p||e[15]!==x||e[16]!==v?(h=t("button",{className:"text-primary underline-offset-4 hover:underline","data-testid":p,onClick:x,title:v,type:"button",children:g}),e[13]=g,e[14]=p,e[15]=x,e[16]=v,e[17]=h):h=e[17],h},er=s=>{const e=Re(105),{onOpenTrace:l,shardKey:r}=s,a=Ae();let u;e[0]===Symbol.for("react.memo_cache_sentinel")?(u={},e[0]=u):u=e[0];let c;e[1]!==r?(c={live:!0,shardKey:r},e[1]=r,e[2]=c):c=e[2];const{data:g,error:p,errorSource:x}=He(Oe.getMetricSeries,u,c);let v;e[3]===Symbol.for("react.memo_cache_sentinel")?(v={},e[3]=v):v=e[3];let h;e[4]!==r?(h={live:!0,shardKey:r},e[4]=r,e[5]=h):h=e[5];const{data:m}=He(Oe.getMetricHistory,v,h);let b,O,k,C,R,o,y,$,T,D,_,N,A;if(e[6]!==g||e[7]!==p||e[8]!==x||e[9]!==m||e[10]!==l||e[11]!==a){$=Symbol.for("react.early_return_sentinel");e:{const de=Gt(g),ce=$t(x)===Xt;if(p!==null&&!ce){let i;e[25]!==a?(i=a("Instruments"),e[25]=a,e[26]=i):i=e[26];let I;e[27]!==i?(I=t("h3",{className:"text-sm font-semibold text-foreground",children:i}),e[27]=i,e[28]=I):I=e[28];let F;e[29]!==p||e[30]!==a?(F=a("Instruments unavailable: {error}",{error:p}),e[29]=p,e[30]=a,e[31]=F):F=e[31];let L;e[32]!==F?(L=t("span",{className:"text-xs text-muted-foreground","data-testid":"mt-instruments-error",role:"status",children:F}),e[32]=F,e[33]=L):L=e[33];let ae;e[34]!==I||e[35]!==L?(ae=n("section",{className:"flex flex-col gap-2","data-testid":"mt-instruments",children:[I,L]}),e[34]=I,e[35]=L,e[36]=ae):ae=e[36],$=ae;break e}if(de.length===0){$=null;break e}const Fe=Yt(m);let d;e[37]!==a?(d=i=>a(i==="counter"?"Counter":i==="gauge"?"Gauge":"Histogram"),e[37]=a,e[38]=d):d=e[38];const K=d;R="flex flex-col gap-2",o="mt-instruments";let w;e[39]!==a?(w=a("Instruments"),e[39]=a,e[40]=w):w=e[40],e[41]!==w?(y=t("h3",{className:"text-sm font-semibold text-foreground",children:w}),e[41]=w,e[42]=y):y=e[42],C=he,A="overflow-hidden py-0",k=ge,N="px-0",O=mt,D="mt-instruments-table";let S;e[43]!==a?(S=a("name"),e[43]=a,e[44]=S):S=e[44];let Q;e[45]!==S?(Q=t(ie,{children:S}),e[45]=S,e[46]=Q):Q=e[46];let U;e[47]!==a?(U=a("kind"),e[47]=a,e[48]=U):U=e[48];let P;e[49]!==U?(P=t(ie,{children:U}),e[49]=U,e[50]=P):P=e[50];let J;e[51]!==a?(J=a("value"),e[51]=a,e[52]=J):J=e[52];let B;e[53]!==J?(B=t(ie,{className:"text-right",children:J}),e[53]=J,e[54]=B):B=e[54];let H;e[55]!==a?(H=a("count"),e[55]=a,e[56]=H):H=e[56];let W;e[57]!==H?(W=t(ie,{className:"text-right",children:H}),e[57]=H,e[58]=W):W=e[58];let G;e[59]!==a?(G=a("range"),e[59]=a,e[60]=G):G=e[60];let X;e[61]!==G?(X=t(ie,{className:"text-right",children:G}),e[61]=G,e[62]=X):X=e[62];let Y;e[63]!==a?(Y=a("trend"),e[63]=a,e[64]=Y):Y=e[64];let V;e[65]!==Y?(V=t(ie,{children:Y}),e[65]=Y,e[66]=V):V=e[66];let Z;e[67]!==a?(Z=a("trace"),e[67]=a,e[68]=Z):Z=e[68];let ee;e[69]!==Z?(ee=t(ie,{children:Z}),e[69]=Z,e[70]=ee):ee=e[70];let te;e[71]!==a?(te=a("dimensions"),e[71]=a,e[72]=te):te=e[72];let re;e[73]!==te?(re=t(ie,{children:te}),e[73]=te,e[74]=re):re=e[74],e[75]!==Q||e[76]!==P||e[77]!==B||e[78]!==W||e[79]!==X||e[80]!==V||e[81]!==ee||e[82]!==re?(_=t(ct,{children:n(Be,{children:[Q,P,B,W,X,V,ee,re]})}),e[75]=Q,e[76]=P,e[77]=B,e[78]=W,e[79]=X,e[80]=V,e[81]=ee,e[82]=re,e[83]=_):_=e[83],b=ut,T=de.map(i=>{const I=Tt(i.attributes),F=gt(i.kind,i.name,i.attributes),L=(Fe.get(F)??[]).map(ae=>Ht(i.kind,ae));return n(Be,{"data-testid":`mt-instrument-${i.name}`,children:[t(se,{className:"font-mono text-xs",title:i.functionPath,children:i.name}),t(se,{children:t(et,{variant:Vt[i.kind],children:K(i.kind)})}),t(se,{className:"text-right font-mono tabular-nums","data-testid":`mt-instrument-value-${i.name}`,children:Ve(Wt(i))}),t(se,{className:"text-right tabular-nums text-muted-foreground",children:i.count.toLocaleString()}),t(se,{className:"text-right font-mono text-xs tabular-nums text-muted-foreground",children:i.min===i.max?"—":`${Ve(i.min)}–${Ve(i.max)}`}),t(se,{children:L.length>=2?t(ht,{ariaLabel:a("{name} trend",{name:i.name}),className:"h-6 w-24 text-foreground",series:L,testId:`mt-instrument-trend-${i.name}`}):t("span",{className:"text-xs text-muted-foreground",children:"—"})}),t(se,{className:"font-mono text-xs",children:t(Zt,{name:i.name,onOpenTrace:l,traceId:i.exemplarTraceId})}),t(se,{className:"max-w-64 truncate font-mono text-xs text-muted-foreground",title:I,children:I===""?"—":I})]},F)})}e[6]=g,e[7]=p,e[8]=x,e[9]=m,e[10]=l,e[11]=a,e[12]=b,e[13]=O,e[14]=k,e[15]=C,e[16]=R,e[17]=o,e[18]=y,e[19]=$,e[20]=T,e[21]=D,e[22]=_,e[23]=N,e[24]=A}else b=e[12],O=e[13],k=e[14],C=e[15],R=e[16],o=e[17],y=e[18],$=e[19],T=e[20],D=e[21],_=e[22],N=e[23],A=e[24];if($!==Symbol.for("react.early_return_sentinel"))return $;let j;e[84]!==b||e[85]!==T?(j=t(b,{children:T}),e[84]=b,e[85]=T,e[86]=j):j=e[86];let z;e[87]!==O||e[88]!==j||e[89]!==D||e[90]!==_?(z=n(O,{"data-testid":D,children:[_,j]}),e[87]=O,e[88]=j,e[89]=D,e[90]=_,e[91]=z):z=e[91];let M;e[92]!==k||e[93]!==z||e[94]!==N?(M=t(k,{className:N,children:z}),e[92]=k,e[93]=z,e[94]=N,e[95]=M):M=e[95];let q;e[96]!==C||e[97]!==M||e[98]!==A?(q=t(C,{className:A,children:M}),e[96]=C,e[97]=M,e[98]=A,e[99]=q):q=e[99];let oe;return e[100]!==R||e[101]!==o||e[102]!==y||e[103]!==q?(oe=n("section",{className:R,"data-testid":o,children:[y,q]}),e[100]=R,e[101]=o,e[102]=y,e[103]=q,e[104]=oe):oe=e[104],oe},We=s=>s>=100?"critical":s>=50?"warning":"good",Le=s=>s<1?`${(s*1e3).toFixed(0)}μs`:s<1e3?`${s.toFixed(1)}ms`:`${(s/1e3).toFixed(2)}s`,Je=s=>s>=1e9?`${(s/1e9).toFixed(1)}B`:s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString(),tr=s=>{const e=Re(3),{level:l}=s;if(l==="critical"){let a;return e[0]===Symbol.for("react.memo_cache_sentinel")?(a=t(et,{variant:"destructive",children:"Slow"}),e[0]=a):a=e[0],a}if(l==="warning"){let a;return e[1]===Symbol.for("react.memo_cache_sentinel")?(a=t("span",{className:"inline-flex items-center gap-1 rounded-md border border-transparent bg-warning/10 px-2 py-0.5 text-xs font-medium text-warning",children:"Moderate"}),e[1]=a):a=e[1],a}let r;return e[2]===Symbol.for("react.memo_cache_sentinel")?(r=t("span",{className:"inline-flex items-center gap-1 rounded-md border border-transparent bg-success/10 px-2 py-0.5 text-xs font-medium text-success",children:"Fast"}),e[2]=r):r=e[2],r},rr=(s,e)=>{const l=[...s];return l.sort((r,a)=>{switch(e){case"avgTime":return a.avgDurationMs-r.avgDurationMs;case"execCount":return a.execCount-r.execCount;case"rowsRead":return a.rowsRead-r.rowsRead;default:return a.totalDurationMs-r.totalDurationMs}}),l},ar=s=>{const e=Re(161),{queryStats:l}=s,r=Ae(),[a,u]=ue("totalTime");let c;e[0]===Symbol.for("react.memo_cache_sentinel")?(c=new Set,e[0]=c):c=e[0];const[g,p]=ue(c);let x;e[1]===Symbol.for("react.memo_cache_sentinel")?(x=A=>{A!==null&&u(A)},e[1]=x):x=e[1];const v=x;let h,m,b,O,k,C,R,o,y,$;if(e[2]!==g||e[3]!==l||e[4]!==a||e[5]!==r){b=Symbol.for("react.early_return_sentinel");e:{const A=rr(l,a);let j;e[16]!==l?(j=l.filter(sr),e[16]=l,e[17]=j):j=e[17];const z=j.length;let M;e[18]!==l?(M=l.filter(lr),e[18]=l,e[19]=M):M=e[19];const q=M.length;let oe;e[20]!==l?(oe=l.filter(nr),e[20]=l,e[21]=oe):oe=e[21];const de=oe.length;let ce;e[22]===Symbol.for("react.memo_cache_sentinel")?(ce=f=>{p(le=>{const E=new Set(le);return E.has(f)?E.delete(f):E.add(f),E})},e[22]=ce):ce=e[22];const Fe=ce;if(l.length===0){let f;e[23]!==r?(f=r("No query insights yet"),e[23]=r,e[24]=f):f=e[24];let le;e[25]!==f?(le=t("p",{className:"text-lg font-medium","data-testid":"qi-empty",children:f}),e[25]=f,e[26]=le):le=e[26];let E;e[27]!==r?(E=r("Query insights appear once statements are executed against this shard."),e[27]=r,e[28]=E):E=e[28];let me;e[29]!==E?(me=t("p",{className:"mt-1 text-sm",children:E}),e[29]=E,e[30]=me):me=e[30];let je;e[31]!==le||e[32]!==me?(je=t(he,{children:t(ge,{className:"py-12",children:n("div",{className:"text-center text-muted-foreground",children:[le,me]})})}),e[31]=le,e[32]=me,e[33]=je):je=e[33],b=je;break e}R="space-y-4",o="qi-root";let d;e[34]!==r?(d=r("Critical queries"),e[34]=r,e[35]=d):d=e[35];let K;e[36]!==d?(K=t(Qe,{className:"pb-2",children:t(Ue,{className:"text-sm font-medium",children:d})}),e[36]=d,e[37]=K):K=e[37];let w;e[38]!==z?(w=t("div",{className:"text-2xl font-bold text-destructive","data-testid":"qi-critical",children:z}),e[38]=z,e[39]=w):w=e[39];let S;e[40]!==r?(S=r(">100ms avg execution"),e[40]=r,e[41]=S):S=e[41];let Q;e[42]!==S?(Q=t("p",{className:"text-xs text-muted-foreground",children:S}),e[42]=S,e[43]=Q):Q=e[43];let U;e[44]!==w||e[45]!==Q?(U=n(ge,{children:[w,Q]}),e[44]=w,e[45]=Q,e[46]=U):U=e[46];let P;e[47]!==K||e[48]!==U?(P=n(he,{children:[K,U]}),e[47]=K,e[48]=U,e[49]=P):P=e[49];let J;e[50]!==r?(J=r("Moderate queries"),e[50]=r,e[51]=J):J=e[51];let B;e[52]!==J?(B=t(Qe,{className:"pb-2",children:t(Ue,{className:"text-sm font-medium",children:J})}),e[52]=J,e[53]=B):B=e[53];let H;e[54]!==q?(H=t("div",{className:"text-2xl font-bold text-warning","data-testid":"qi-moderate",children:q}),e[54]=q,e[55]=H):H=e[55];let W;e[56]!==r?(W=r("50–100ms avg execution"),e[56]=r,e[57]=W):W=e[57];let G;e[58]!==W?(G=t("p",{className:"text-xs text-muted-foreground",children:W}),e[58]=W,e[59]=G):G=e[59];let X;e[60]!==H||e[61]!==G?(X=n(ge,{children:[H,G]}),e[60]=H,e[61]=G,e[62]=X):X=e[62];let Y;e[63]!==B||e[64]!==X?(Y=n(he,{children:[B,X]}),e[63]=B,e[64]=X,e[65]=Y):Y=e[65];let V;e[66]!==r?(V=r("Fast queries"),e[66]=r,e[67]=V):V=e[67];let Z;e[68]!==V?(Z=t(Qe,{className:"pb-2",children:t(Ue,{className:"text-sm font-medium",children:V})}),e[68]=V,e[69]=Z):Z=e[69];let ee;e[70]!==de?(ee=t("div",{className:"text-2xl font-bold text-success","data-testid":"qi-fast",children:de}),e[70]=de,e[71]=ee):ee=e[71];let te;e[72]!==r?(te=r("<50ms avg execution"),e[72]=r,e[73]=te):te=e[73];let re;e[74]!==te?(re=t("p",{className:"text-xs text-muted-foreground",children:te}),e[74]=te,e[75]=re):re=e[75];let i;e[76]!==ee||e[77]!==re?(i=n(ge,{children:[ee,re]}),e[76]=ee,e[77]=re,e[78]=i):i=e[78];let I;e[79]!==Z||e[80]!==i?(I=n(he,{children:[Z,i]}),e[79]=Z,e[80]=i,e[81]=I):I=e[81],e[82]!==P||e[83]!==Y||e[84]!==I?(y=n("div",{className:"grid gap-4 md:grid-cols-3",children:[P,Y,I]}),e[82]=P,e[83]=Y,e[84]=I,e[85]=y):y=e[85];let F;e[86]!==r?(F=r("Query leaderboard"),e[86]=r,e[87]=F):F=e[87];let L;e[88]!==F?(L=t("h3",{className:"text-lg font-semibold",children:F}),e[88]=F,e[89]=L):L=e[89];let ae;e[90]!==a||e[91]!==r?(ae=r("Slow queries sorted by {sortField}",{sortField:r(a)}),e[90]=a,e[91]=r,e[92]=ae):ae=e[92];let fe;e[93]!==ae?(fe=t("p",{className:"text-sm text-muted-foreground",children:ae}),e[93]=ae,e[94]=fe):fe=e[94];let pe;e[95]!==L||e[96]!==fe?(pe=n("div",{children:[L,fe]}),e[95]=L,e[96]=fe,e[97]=pe):pe=e[97];let xe;e[98]!==r?(xe=r("Sort by"),e[98]=r,e[99]=xe):xe=e[99];let be;e[100]!==xe?(be=t("span",{className:"text-sm text-muted-foreground",children:xe}),e[100]=xe,e[101]=be):be=e[101];let ve;e[102]!==r?(ve=r("Sort queries by"),e[102]=r,e[103]=ve):ve=e[103];let ze;e[104]===Symbol.for("react.memo_cache_sentinel")?(ze=t(Qt,{}),e[104]=ze):ze=e[104];let ye;e[105]!==ve?(ye=t(Ut,{"aria-label":ve,className:"w-[140px]","data-testid":"qi-sort",children:ze}),e[105]=ve,e[106]=ye):ye=e[106];let Ne;e[107]!==r?(Ne=r("Total time"),e[107]=r,e[108]=Ne):Ne=e[108];let we;e[109]!==Ne?(we=t(Pe,{value:"totalTime",children:Ne}),e[109]=Ne,e[110]=we):we=e[110];let Se;e[111]!==r?(Se=r("Avg time"),e[111]=r,e[112]=Se):Se=e[112];let $e;e[113]!==Se?($e=t(Pe,{value:"avgTime",children:Se}),e[113]=Se,e[114]=$e):$e=e[114];let ke;e[115]!==r?(ke=r("Execution count"),e[115]=r,e[116]=ke):ke=e[116];let qe;e[117]!==ke?(qe=t(Pe,{value:"execCount",children:ke}),e[117]=ke,e[118]=qe):qe=e[118];let _e;e[119]!==r?(_e=r("Rows read"),e[119]=r,e[120]=_e):_e=e[120];let Me;e[121]!==_e?(Me=t(Pe,{value:"rowsRead",children:_e}),e[121]=_e,e[122]=Me):Me=e[122];let Ie;e[123]!==we||e[124]!==$e||e[125]!==qe||e[126]!==Me?(Ie=n(Pt,{children:[we,$e,qe,Me]}),e[123]=we,e[124]=$e,e[125]=qe,e[126]=Me,e[127]=Ie):Ie=e[127];let Ce;e[128]!==a||e[129]!==ye||e[130]!==Ie?(Ce=n(Jt,{onValueChange:v,value:a,children:[ye,Ie]}),e[128]=a,e[129]=ye,e[130]=Ie,e[131]=Ce):Ce=e[131];let Te;e[132]!==be||e[133]!==Ce?(Te=n("div",{className:"flex items-center gap-2",children:[be,Ce]}),e[132]=be,e[133]=Ce,e[134]=Te):Te=e[134],e[135]!==pe||e[136]!==Te?($=n("div",{className:"flex items-center justify-between",children:[pe,Te]}),e[135]=pe,e[136]=Te,e[137]=$):$=e[137],m=he;let De;e[138]!==r?(De=r("Statements"),e[138]=r,e[139]=De):De=e[139];let Ke;e[140]!==De?(Ke=t(Ue,{children:De}),e[140]=De,e[141]=Ke):Ke=e[141],C=n(Qe,{children:[Ke,t(Nt,{children:r("{count} tracked statements",{count:A.length})})]}),h=ge,O="space-y-2";let Ee;e[142]!==g||e[143]!==r?(Ee=f=>{const le=f.normalizedSql,E=g.has(le),me=We(f.avgDurationMs);return n("div",{className:"overflow-hidden rounded-lg border","data-testid":"qi-row",children:[n("button",{"aria-expanded":E,className:"flex w-full items-center justify-between p-3 text-left transition-colors hover:bg-muted/50",onClick:()=>{Fe(le)},type:"button",children:[n("div",{className:"flex min-w-0 flex-1 items-center gap-3",children:[t(tr,{level:me}),t("span",{className:"max-w-[300px] truncate font-mono text-sm lg:max-w-[500px]",children:f.normalizedSql})]}),n("div",{className:"flex shrink-0 items-center gap-4",children:[n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Le(f.totalDurationMs)}),t("div",{className:"text-xs text-muted-foreground",children:r("total")})]}),n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Le(f.avgDurationMs)}),t("div",{className:"text-xs text-muted-foreground",children:r("avg")})]}),f.p95DurationMs!==void 0&&n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Le(f.p95DurationMs)}),t("div",{className:"text-xs text-muted-foreground",children:r("p95")})]}),n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Je(f.execCount)}),t("div",{className:"text-xs text-muted-foreground",children:r("calls")})]})]})]}),E&&n("div",{className:"space-y-3 border-t bg-muted/30 p-4",children:[n("div",{children:[t("p",{className:"mb-2 text-sm font-medium",children:r("Full statement")}),t("pre",{className:"overflow-x-auto rounded-md bg-muted p-3 font-mono text-sm whitespace-pre-wrap break-all",children:f.normalizedSql})]}),n("div",{className:"grid grid-cols-2 gap-4 text-sm md:grid-cols-4",children:[f.p50DurationMs!==void 0&&n("div",{children:[t("span",{className:"text-muted-foreground",children:r("p50")}),t("span",{className:"block font-medium tabular-nums",children:Le(f.p50DurationMs)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Exec count")}),t("span",{className:"block font-medium tabular-nums",children:Je(f.execCount)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Total time")}),t("span",{className:"block font-medium tabular-nums",children:Le(f.totalDurationMs)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Rows read")}),t("span",{className:"block font-medium tabular-nums",children:Je(f.rowsRead)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Rows written")}),t("span",{className:"block font-medium tabular-nums",children:Je(f.rowsWritten)})]})]})]})]},le)},e[142]=g,e[143]=r,e[144]=Ee):Ee=e[144],k=A.map(Ee)}e[2]=g,e[3]=l,e[4]=a,e[5]=r,e[6]=h,e[7]=m,e[8]=b,e[9]=O,e[10]=k,e[11]=C,e[12]=R,e[13]=o,e[14]=y,e[15]=$}else h=e[6],m=e[7],b=e[8],O=e[9],k=e[10],C=e[11],R=e[12],o=e[13],y=e[14],$=e[15];if(b!==Symbol.for("react.early_return_sentinel"))return b;let T;e[145]!==O||e[146]!==k?(T=t("div",{className:O,children:k}),e[145]=O,e[146]=k,e[147]=T):T=e[147];let D;e[148]!==h||e[149]!==T?(D=t(h,{children:T}),e[148]=h,e[149]=T,e[150]=D):D=e[150];let _;e[151]!==m||e[152]!==D||e[153]!==C?(_=n(m,{children:[C,D]}),e[151]=m,e[152]=D,e[153]=C,e[154]=_):_=e[154];let N;return e[155]!==_||e[156]!==R||e[157]!==o||e[158]!==y||e[159]!==$?(N=n("div",{className:R,"data-testid":o,children:[y,$,_]}),e[155]=_,e[156]=R,e[157]=o,e[158]=y,e[159]=$,e[160]=N):N=e[160],N};function sr(s){return We(s.avgDurationMs)==="critical"}function lr(s){return We(s.avgDurationMs)==="warning"}function nr(s){return We(s.avgDurationMs)==="good"}const ir=["1m","5m","15m","1h"],or=s=>new Date(s).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}),dr=s=>s.map(e=>({avg:Math.round(e.avgDurationMs*100)/100,execs:e.execCount,label:or(e.bucketMs)})),cr=({shardKey:s=""})=>{const e=Ae(),[l,r]=ue("15m"),a=He(Oe.getQueryInsights,{range:l},{live:!0,shardKey:s}).data,u=dr(a?.buckets??[]);return n("div",{className:"flex flex-col gap-4","data-testid":"qi-range",children:[n("div",{className:"flex flex-wrap items-center gap-2",children:[t("div",{className:"flex gap-1 rounded-lg border border-border p-0.5","data-testid":"qi-ranges",role:"group",children:ir.map(c=>t("button",{"aria-pressed":c===l,className:jt("rounded px-2 py-1 text-xs outline-none transition-colors hover:bg-accent focus-visible:bg-accent",c===l&&"bg-accent font-medium text-foreground"),"data-testid":`qi-range-${c}`,onClick:()=>{r(c)},type:"button",children:c},c))}),a?.capped===!0&&t(et,{"data-testid":"qi-capped",variant:"secondary",children:e("showing a capped set")})]}),u.length===0?t(Et,{description:e("Statements executed in the selected window appear here, with throughput and latency over time."),testId:"qi-empty",title:e("No queries in this window.")}):n("div",{className:"grid gap-4 lg:grid-cols-2",children:[n("figure",{className:"rounded-xl border border-border p-3","data-testid":"qi-throughput",children:[t("figcaption",{className:"mb-2 text-xs font-medium text-muted-foreground",children:e("Throughput")}),t(st,{height:140,width:"100%",children:n(Rt,{data:u,children:[t(lt,{strokeDasharray:"3 3",vertical:!1}),t(nt,{dataKey:"label",fontSize:10,tickLine:!1}),t(it,{allowDecimals:!1,fontSize:10,tickLine:!1,width:32}),t(ot,{}),t(At,{dataKey:"execs",fill:"var(--color-primary)",fillOpacity:.15,stroke:"var(--color-primary)",type:"monotone"})]})})]}),n("figure",{className:"rounded-xl border border-border p-3","data-testid":"qi-latency",children:[t("figcaption",{className:"mb-2 text-xs font-medium text-muted-foreground",children:e("Mean latency (ms)")}),t(st,{height:140,width:"100%",children:n(zt,{data:u,children:[t(lt,{strokeDasharray:"3 3",vertical:!1}),t(nt,{dataKey:"label",fontSize:10,tickLine:!1}),t(it,{fontSize:10,tickLine:!1,width:32}),t(ot,{}),t(Kt,{dataKey:"avg",dot:!1,stroke:"var(--color-destructive)",type:"monotone"})]})})]})]}),t(ar,{queryStats:a?.entries??[]})]})},mr=_t(Oe.getMetrics),ur=s=>{const e=Math.floor(s/1e3),l=Math.floor(e/3600),r=Math.floor(e%3600/60),a=e%60;return l>0?`${l.toString()}h ${r.toString()}m`:r>0?`${r.toString()}m ${a.toString()}s`:`${a.toString()}s`},hr=(s,e)=>s?e:"overview",gr=(s,e)=>{const l=s+e;return l===0?"—":`${(s/l*100).toFixed(1)}%`},ne=s=>{const e=Re(16),{chart:l,footer:r,label:a,testId:u,value:c}=s;let g;e[0]!==a?(g=t("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:a}),e[0]=a,e[1]=g):g=e[1];let p;e[2]!==u||e[3]!==c?(p=t("span",{className:"truncate text-2xl font-semibold tabular-nums text-foreground","data-testid":u,children:c}),e[2]=u,e[3]=c,e[4]=p):p=e[4];let x;e[5]!==l||e[6]!==p?(x=n("div",{className:"flex items-center justify-between gap-3",children:[p,l]}),e[5]=l,e[6]=p,e[7]=x):x=e[7];let v;e[8]!==g||e[9]!==x?(v=n("div",{className:"flex flex-col gap-2.5 p-4",children:[g,x]}),e[8]=g,e[9]=x,e[10]=v):v=e[10];let h;e[11]!==r?(h=r!=null&&t("div",{className:"border-t border-border bg-muted/50 px-4 py-2.5 text-[11px] text-muted-foreground",children:r}),e[11]=r,e[12]=h):h=e[12];let m;return e[13]!==v||e[14]!==h?(m=n(he,{className:"justify-between gap-0 py-0",children:[v,h]}),e[13]=v,e[14]=h,e[15]=m):m=e[15],m},dt=s=>s<=0?"—":s<1?`${(s*1e3).toFixed(0)}μs`:s<1e3?`${s.toFixed(1)}ms`:`${(s/1e3).toFixed(2)}s`,jr=({initialShardKey:s})=>{const e=pt(),l=Ae(),r=xt(),[a,u]=ue(s??""),[c,g]=ue("overview"),[p,x]=ue([]),v=Ge(null),h=Ge(null),m=Ge(!0);tt(()=>(m.current=!0,()=>{m.current=!1}),[]);const b=wt(a.trim(),400),O=d=>{Ct({shardKey:b,traceId:d}),at(r({to:"/traces"}))},{data:k,error:C,liveError:R}=He(Oe.getMetrics,{},{live:!0,shardKey:b}),o=k??null;tt(()=>{if(k===void 0)return;Mt(b);const d=k,K=v.current,w=h.current!==null&&h.current!==d.shard;if(h.current=d.shard,v.current=d.requests,w){x([]);return}K!==null&&d.requests>=K&&x(S=>[...S,d.requests-K].slice(-30))},[k,b]);const[y,$]=ue(null),[T,D]=ue(!1),_=async()=>{D(!0);const d=Ot(a,It());try{const K=await Promise.all(d.map(async w=>{try{const S=await e.query(mr,{},kt(w));return{error:null,metrics:S,shard:w===""?S.shard:w}}catch(S){return{error:qt(S),metrics:null,shard:w===""?"__root__":w}}}));m.current&&$(K)}finally{m.current&&D(!1)}},N=y===null?null:Dt(y),A=o===null||o.requests===0?"—":`${(o.errors/o.requests*100).toFixed(1)}%`,j=p.length>0?p.at(-1):0,z=o?Ft(o):{p90:0,p95:0},M=bt(()=>{if(!o||!("queryStats"in o))return;const d=o.queryStats;if(!(!d||!Array.isArray(d)))return Lt(d)},[o]),q=hr(M!==void 0,c),oe=()=>{at(_())},de=()=>{$(null)},ce=()=>{g("overview")},Fe=()=>{g("query-insights")};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-metrics",children:[n("div",{className:"flex flex-wrap items-center gap-2",children:[t(yt,{onChange:u,testId:"mt-shard-input",value:a}),t(vt,{message:R,prefix:"mt"}),t(rt,{"data-testid":"mt-aggregate",disabled:T,onClick:oe,size:"sm",type:"button",variant:"secondary",children:l(T?"Aggregating…":"All shards")}),y!==null&&t(rt,{"data-testid":"mt-aggregate-clear",onClick:de,size:"sm",type:"button",variant:"ghost",children:l("Hide")}),t("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"mt-cf-link",href:St,rel:"noreferrer",target:"_blank",children:l("Open in Cloudflare")})]}),C!==null&&t("p",{className:"text-sm text-destructive","data-testid":"mt-error",role:"alert",children:C}),M!==void 0&&n("div",{className:"flex gap-2 border-b","data-testid":"mt-tabs",children:[t("button",{className:`pb-2 text-sm font-medium transition-colors ${q==="overview"?"border-b-2 border-primary text-foreground":"text-muted-foreground hover:text-foreground"}`,"data-testid":"mt-tab-overview",onClick:ce,type:"button",children:l("Overview")}),n("button",{className:`pb-2 text-sm font-medium transition-colors ${q==="query-insights"?"border-b-2 border-primary text-foreground":"text-muted-foreground hover:text-foreground"}`,"data-testid":"mt-tab-query-insights",onClick:Fe,type:"button",children:[l("Query insights"),M.length>0&&t("span",{className:"ml-1.5 rounded-full bg-primary/10 px-1.5 py-0.5 text-xs text-primary",children:M.length})]})]}),q==="query-insights"&&M!==void 0&&t(cr,{shardKey:b}),q==="overview"&&o!==null&&n("dl",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4","data-testid":"mt-stats",children:[t(ne,{chart:p.length>=2?t(ht,{ariaLabel:l("Requests per interval over time"),className:"h-7 w-24 text-foreground",series:p,testId:"mt-sparkline"}):void 0,footer:p.length>=2?n(Ye,{children:[t("span",{className:"font-semibold text-foreground",children:`+${j.toLocaleString()}`})," ",l("last interval")]}):t("span",{"data-testid":"mt-sparkline-empty",children:l("collecting samples…")}),label:l("Requests"),testId:"mt-requests",value:o.requests}),t(ne,{footer:l("{rate} error rate",{rate:A}),label:l("Errors"),testId:"mt-errors",value:n(Ye,{children:[o.errors," (",A,")"]})}),t(ne,{footer:z.p90>0?`P90 ${dt(z.p90)}`:void 0,label:l("P95 latency"),testId:"mt-p95",value:z.p95>0?dt(z.p95):"—"}),t(ne,{footer:o.cache===null?void 0:`${o.cache.entries.toLocaleString()} ${l("cache entries")}`,label:l("Database size"),testId:"mt-db-size",value:Xe(o.databaseSize)}),t(ne,{label:l("Shard"),testId:"mt-shard",value:o.shard}),t(ne,{label:l("Uptime"),testId:"mt-uptime",value:ur(o.uptimeMs)}),t(ne,{label:l("Cache hit rate"),testId:"mt-cache",value:o.cache===null?l("no cache configured"):l("{rate} ({count} entries)",{count:o.cache.entries,rate:gr(o.cache.hits,o.cache.misses)})})]}),q==="overview"&&o===null&&null,q==="overview"&&t(er,{onOpenTrace:O,shardKey:b}),q==="overview"&&N!==null&&y!==null&&n("div",{className:"flex flex-col gap-4","data-testid":"mt-aggregate-view",children:[n("dl",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3","data-testid":"mt-aggregate-stats",children:[t(ne,{label:l("Shards"),testId:"mt-agg-shards",value:N.failed>0?l("{reachable} reachable, {failed} unreachable",{failed:N.failed,reachable:N.reachable}):l("{reachable} reachable",{reachable:N.reachable})}),t(ne,{label:l("Total requests"),testId:"mt-agg-requests",value:N.totalRequests}),t(ne,{label:l("Total errors"),testId:"mt-agg-errors",value:N.totalErrors}),t(ne,{label:l("Total database size"),testId:"mt-agg-db-size",value:Xe(N.totalDatabaseSize)}),t(ne,{label:l("Combined cache hit rate"),testId:"mt-agg-cache",value:N.hitRate===null?l("no cache configured"):`${(N.hitRate*100).toFixed(1)}%`})]}),t(he,{className:"overflow-hidden py-0",children:t(ge,{className:"px-0",children:n(mt,{"data-testid":"mt-agg-table",children:[t(ct,{children:n(Be,{children:[t(ie,{children:l("shard")}),t(ie,{children:l("requests")}),t(ie,{children:l("errors")}),t(ie,{children:l("db size")})]})}),t(ut,{children:y.map(d=>n(Be,{"data-testid":`mt-agg-row-${d.shard}`,children:[t(se,{children:d.shard}),d.metrics===null?t(se,{className:"text-destructive",colSpan:3,children:d.error??l("unreachable")}):n(Ye,{children:[t(se,{className:"tabular-nums",children:d.metrics.requests}),t(se,{className:"tabular-nums",children:d.metrics.errors}),t(se,{className:"tabular-nums",children:Xe(d.metrics.databaseSize)})]})]},d.shard))})]})})})]})]})};export{jr as MetricsPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as W}from"react/compiler-runtime";import{useState as T}from"react";import{E as B}from"../packem_shared/error-alert-t6cpEi0z.js";import{g as _}from"../packem_shared/badge-BbuuAio7.js";import{u as z}from"../packem_shared/button-BkCrNcAs.js";import{c as O,u as U}from"../packem_shared/card-CIDGUN6K.js";import{E as q}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as G}from"../packem_shared/input-JHu63lTv.js";import{n as J,d as K,m as F,p as h,f as Q,u as f}from"../packem_shared/table-DdJBrClo.js";import{N as X}from"../packem_shared/use-admin-query-QJ-ibl5u.js";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{i as ee}from"../packem_shared/internal-BSIsQVC6.js";import{jsx as t,jsxs as x}from"react/jsx-runtime";const te=e=>e==="ok"?"success":e==="failed"?"destructive":e==="expired"?"warning":"secondary",P=e=>e.endpoint??e.id,ve=()=>{const e=W(38),r=Y(),[i,R]=T("all"),[s,V]=T("");let g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g={},e[0]=g):g=e[0];const{data:S,error:o,errorSource:p,isLoading:C,refetch:v}=X(Z.listPushSubscriptions,g);let N;if(e[1]!==S?.subscriptions||e[2]!==o||e[3]!==p||e[4]!==C||e[5]!==i||e[6]!==v||e[7]!==s||e[8]!==r){const A=S?.subscriptions??[],j=s.trim().toLowerCase(),E=A.filter(a=>i!=="all"&&a.kind!==i?!1:j===""?!0:`${P(a)} ${a.userId??""}`.toLowerCase().includes(j));let b;e[10]===Symbol.for("react.memo_cache_sentinel")?(b=a=>{V(a.target.value)},e[10]=b):b=e[10];const D=b;let w;e[11]!==v?(w=()=>{v()},e[11]=v,e[12]=w):w=e[12];const I=w;let y;e[13]===Symbol.for("react.memo_cache_sentinel")?(y=["all","web-push","fcm"],e[13]=y):y=e[13];const H=y;let l;e[14]!==i||e[15]!==r?(l=t("div",{className:"flex items-center gap-1","data-testid":"nt-kind-filter",role:"tablist",children:H.map(a=>t(z,{"aria-selected":i===a,"data-testid":`nt-kind-${a}`,onClick:()=>{R(a)},role:"tab",size:"sm",type:"button",variant:i===a?"secondary":"ghost",children:a==="all"?r("All"):a},a))}),e[14]=i,e[15]=r,e[16]=l):l=e[16];let n;e[17]!==r?(n=r("Filter devices"),e[17]=r,e[18]=n):n=e[18];let c;e[19]!==r?(c=r("filter endpoint, user"),e[19]=r,e[20]=c):c=e[20];let d;e[21]!==s||e[22]!==n||e[23]!==c?(d=t(G,{"aria-label":n,className:"h-8 w-56","data-testid":"nt-search",onChange:D,placeholder:c,value:s}),e[21]=s,e[22]=n,e[23]=c,e[24]=d):d=e[24];let m;e[25]!==r?(m=r("Refresh"),e[25]=r,e[26]=m):m=e[26];let u;e[27]!==I||e[28]!==m?(u=t(z,{className:"ml-auto","data-testid":"nt-refresh",onClick:I,size:"sm",type:"button",variant:"outline",children:m}),e[27]=I,e[28]=m,e[29]=u):u=e[29];const L=A.length>0&&t(_,{"data-testid":"nt-count",variant:"secondary",children:r("{count} devices",{count:A.length})});let $;e[30]!==u||e[31]!==L||e[32]!==l||e[33]!==d?($=x("div",{className:"flex flex-wrap items-center gap-2",children:[l,d,u,L]}),e[30]=u,e[31]=L,e[32]=l,e[33]=d,e[34]=$):$=e[34];let k;e[35]!==o||e[36]!==p?(k=o!==null&&t(B,{error:p,testId:"nt-error"}),e[35]=o,e[36]=p,e[37]=k):k=e[37],N=x("div",{className:"flex flex-col gap-4","data-testid":"lunora-notifications",children:[$,k,o===null&&!C&&E.length===0&&t(q,{description:r("Registered Web Push / FCM devices appear here. Configure lunora/notify.ts with defineNotify({ store }) and register a device with ctx.push.register(...)."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 0 0-4-5.7V5a2 2 0 1 0-4 0v.3A6 6 0 0 0 6 11v3.2a2 2 0 0 1-.6 1.4L4 17h5m6 0v1a3 3 0 1 1-6 0v-1m6 0H9"})}),testId:"nt-empty",title:r("No registered devices.")}),E.length>0&&t(O,{className:"overflow-hidden py-0",children:t(U,{className:"max-h-[30rem] overflow-auto px-0",children:x(J,{"data-testid":"nt-table",children:[t(K,{children:x(F,{children:[t(h,{children:r("kind")}),t(h,{children:r("endpoint")}),t(h,{children:r("user")}),t(h,{children:r("last seen")}),t(h,{children:r("status")}),t(h,{children:r("error")})]})}),t(Q,{children:E.map(a=>{const M=P(a);return x(F,{"data-testid":"nt-row",children:[t(f,{children:t(_,{variant:"outline",children:a.kind})}),t(f,{className:"max-w-[28ch] truncate font-mono text-xs",title:M,children:M}),t(f,{className:"max-w-[16ch] truncate font-mono text-xs",children:a.userId??t("span",{className:"text-muted-foreground",children:"—"})}),t(f,{className:"text-muted-foreground tabular-nums",children:ee(a.lastSeenAt,"—")}),t(f,{children:t(_,{"data-testid":`nt-status-${a.id}`,variant:te(a.lastStatus),children:a.lastStatus??r("n/a")})}),t(f,{className:"max-w-[28ch] truncate font-mono text-xs text-muted-foreground",title:a.lastError??void 0,children:a.lastError??t("span",{className:"text-muted-foreground",children:"—"})})]},a.id)})})]})})})]}),e[1]=S?.subscriptions,e[2]=o,e[3]=p,e[4]=C,e[5]=i,e[6]=v,e[7]=s,e[8]=r,e[9]=N}else N=e[9];return N};export{ve as NotificationsPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useLunora as E}from"@lunora/react";import{useState as s,useCallback as H,useEffect as W}from"react";import{ConfirmButton as F}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{g as Z}from"../packem_shared/badge-BbuuAio7.js";import{u as _}from"../packem_shared/button-BkCrNcAs.js";import{u as I}from"../packem_shared/input-JHu63lTv.js";import{p as g}from"../packem_shared/label-6uP1obNF.js";import{useAutoRefresh as G}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{useT as J}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as B}from"../packem_shared/ADMIN_FUNCTIONS-BnD4aovm.js";import{d as u,b as N,f as p,g as S}from"../packem_shared/internal-BSIsQVC6.js";import{jsxs as a,jsx as r}from"react/jsx-runtime";const y=S(B.getPitrBookmark),Q=S(B.pitrRestore),de=({initialShardKey:T})=>{const m=E(),t=J(),i=T??"",[O,f]=s(null),[l,P]=s(""),[v,w]=s(null),[c,q]=s(""),[h,A]=s(!1),[o,L]=s(null),[C,n]=s(null),[x,d]=s(!1),b=H(async()=>{d(!0),n(null);try{const e=await m.query(y,{},u(i));f(e.current)}catch(e){n(N(e))}d(!1)},[m,i]);W(()=>{p(b())},[b]),G(()=>{p((async()=>{try{const e=await m.query(y,{},u(i));f(e.current)}catch{}})())},!0);const U=e=>{P(e.target.value)},j=e=>{q(e.target.value)},M=e=>{A(e.target.checked)},z=()=>{l.trim()!==""&&p((async()=>{d(!0),n(null);try{const e=await m.query(y,{time:l.trim()},u(i));w(e.forTime??null),f(e.current)}catch(e){w(null),n(N(e))}d(!1)})())},R=e=>{p((async()=>{d(!0),n(null);try{const k=await m.mutation(Q,e,u(i));L(k),await b()}catch(k){n(N(k))}d(!1)})())},K=c.trim()!==""||l.trim()!=="",$=()=>{const e=h?{restart:!0}:{};c.trim()===""?e.time=l.trim():e.bookmark=c.trim(),R(e)},D=()=>{o!==null&&R(h?{bookmark:o.undoBookmark,restart:!0}:{bookmark:o.undoBookmark})};return a("div",{className:"flex flex-col gap-4","data-testid":"lunora-pitr",children:[r("div",{className:"flex flex-wrap items-center gap-3",children:a("span",{className:"text-xs text-muted-foreground",children:[t("Shard"),": ",r("span",{className:"font-mono",children:i===""?t("root"):i})]})}),r("p",{className:"text-sm text-muted-foreground","data-testid":"pitr-note",children:t("In-place recovery to any moment in the last 30 days. For older or portable recovery, use the snapshot backup tier.")}),C!==null&&r("p",{className:"text-sm text-destructive","data-testid":"pitr-error",role:"alert",children:C}),a("section",{className:"rounded-xl border border-border bg-card p-3 shadow-xs",children:[r("h3",{className:"mb-2 text-sm font-semibold",children:t("Current bookmark")}),r("p",{className:"font-mono text-xs break-all text-muted-foreground","data-testid":"pitr-current",children:O??r("span",{className:"text-muted-foreground",children:"—"})})]}),a("section",{className:"flex flex-col gap-3 rounded-xl border border-border bg-card p-3 shadow-xs",children:[r("h3",{className:"text-sm font-semibold",children:t("Restore")}),a("div",{className:"flex flex-col gap-1",children:[r(g,{htmlFor:"pitr-time",children:t("Time (ISO or epoch-ms, last 30 days)")}),a("div",{className:"flex items-center gap-2",children:[r(I,{"data-testid":"pitr-time",id:"pitr-time",onChange:U,placeholder:"2026-06-01T00:00:00.000Z",value:l}),r(_,{"data-testid":"pitr-preview",disabled:x||l.trim()==="",onClick:z,size:"sm",type:"button",variant:"outline",children:t("Preview")})]}),v!==null&&a("p",{className:"font-mono text-xs break-all text-muted-foreground","data-testid":"pitr-preview-bookmark",children:[t("Bookmark for that time"),": ",v]})]}),a("div",{className:"flex flex-col gap-1",children:[r(g,{htmlFor:"pitr-bookmark",children:t("Or an explicit bookmark (wins over time)")}),r(I,{"data-testid":"pitr-bookmark",id:"pitr-bookmark",onChange:j,placeholder:t("bookmark string"),value:c})]}),a(g,{className:"flex items-center gap-2 text-xs font-normal text-muted-foreground",htmlFor:"pitr-restart",children:[r("input",{checked:h,className:"size-4 accent-primary","data-testid":"pitr-restart",id:"pitr-restart",onChange:M,type:"checkbox"}),t("Restart the shard now so recovery applies immediately")]}),r("div",{children:r(F,{confirmLabel:t("Confirm restore"),disabled:x||!K,onConfirm:$,testId:"pitr-restore",children:t("Restore")})})]}),o!==null&&a("section",{className:"flex flex-col gap-2 rounded-xl border border-border bg-card p-3 shadow-xs","data-testid":"pitr-result",children:[a("div",{className:"flex items-center gap-2",children:[r("h3",{className:"text-sm font-semibold",children:t("Restore armed")}),r(Z,{variant:o.restarted?"destructive":"secondary",children:o.restarted?t("restarted now"):t("on next restart")})]}),a("p",{className:"font-mono text-xs break-all text-muted-foreground",children:[t("Restored to"),": ",o.restoredTo]}),a("p",{className:"font-mono text-xs break-all text-muted-foreground","data-testid":"pitr-undo-bookmark",children:[t("Undo bookmark"),": ",o.undoBookmark]}),r("div",{children:r(F,{confirmLabel:t("Confirm undo"),disabled:x,onConfirm:D,testId:"pitr-undo",children:t("Undo restore")})})]})]})};export{de as PitrPanel};
|