@lunora/studio 1.0.0-alpha.33 → 1.0.0-alpha.330

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/LICENSE.md +6 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.mts +1581 -0
  4. package/dist/index.d.ts +974 -806
  5. package/dist/index.mjs +1 -0
  6. package/dist/mount.d.mts +22 -0
  7. package/dist/mount.d.ts +11 -10
  8. package/dist/mount.mjs +1 -0
  9. package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -0
  10. package/dist/packem_chunks/ApiTab.mjs +1 -0
  11. package/dist/packem_chunks/AuditPanel.mjs +1 -0
  12. package/dist/packem_chunks/DeploymentHealthPanel.mjs +1 -0
  13. package/dist/packem_chunks/ExportImportPanel.mjs +3 -0
  14. package/dist/packem_chunks/FileBrowser.mjs +4 -0
  15. package/dist/packem_chunks/FunctionRunner.mjs +1 -0
  16. package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -0
  17. package/dist/packem_chunks/HealthPanel.mjs +1 -0
  18. package/dist/packem_chunks/InsightsPanel.mjs +1 -0
  19. package/dist/packem_chunks/LogsPanel.mjs +1 -0
  20. package/dist/packem_chunks/MailPanel.mjs +2 -0
  21. package/dist/packem_chunks/MetricsPanel.mjs +1 -0
  22. package/dist/packem_chunks/NotificationsPanel.mjs +1 -0
  23. package/dist/packem_chunks/PitrPanel.mjs +1 -0
  24. package/dist/packem_chunks/SchemaViewer.mjs +1 -0
  25. package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -0
  26. package/dist/packem_chunks/SettingsPanel.mjs +1 -0
  27. package/dist/packem_chunks/SqlEditorPanel.mjs +10 -0
  28. package/dist/packem_chunks/TableEditor.mjs +1 -0
  29. package/dist/packem_chunks/agents-panel.mjs +1 -0
  30. package/dist/packem_chunks/ai-usage-panel.mjs +1 -0
  31. package/dist/packem_chunks/analytics-panel.mjs +1 -0
  32. package/dist/packem_chunks/architecture-panel.mjs +1 -0
  33. package/dist/packem_chunks/auth-audit-panel.mjs +1 -0
  34. package/dist/packem_chunks/auth-config-panel.mjs +1 -0
  35. package/dist/packem_chunks/auth-sessions-panel.mjs +1 -0
  36. package/dist/packem_chunks/containers-panel.mjs +1 -0
  37. package/dist/packem_chunks/dashboards-panel.mjs +1 -0
  38. package/dist/packem_chunks/evals-panel.mjs +1 -0
  39. package/dist/packem_chunks/fanout-panel.mjs +1 -0
  40. package/dist/packem_chunks/flags-panel.mjs +1 -0
  41. package/dist/packem_chunks/issues-panel.mjs +1 -0
  42. package/dist/packem_chunks/kv-browser.mjs +1 -0
  43. package/dist/packem_chunks/log-drains-panel.mjs +4 -0
  44. package/dist/packem_chunks/migrations-route.mjs +1 -0
  45. package/dist/packem_chunks/organizations-panel.mjs +1 -0
  46. package/dist/packem_chunks/payments-panel.mjs +1 -0
  47. package/dist/packem_chunks/permissions-panel.mjs +1 -0
  48. package/dist/packem_chunks/privacy-requests-panel.mjs +1 -0
  49. package/dist/packem_chunks/queues-panel.mjs +1 -0
  50. package/dist/packem_chunks/reactors-panel.mjs +1 -0
  51. package/dist/packem_chunks/rls-panel.mjs +1 -0
  52. package/dist/packem_chunks/schedule-panel.mjs +1 -0
  53. package/dist/packem_chunks/sparkline.mjs +1 -0
  54. package/dist/packem_chunks/storage-rules-panel.mjs +1 -0
  55. package/dist/packem_chunks/subscriptions-panel.mjs +1 -0
  56. package/dist/packem_chunks/sync-client-panel.mjs +1 -0
  57. package/dist/packem_chunks/traces-panel.mjs +1 -0
  58. package/dist/packem_chunks/users-panel.mjs +1 -0
  59. package/dist/packem_chunks/vector-browser.mjs +1 -0
  60. package/dist/packem_chunks/workflows-panel.mjs +1 -0
  61. package/dist/packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs +1 -0
  62. package/dist/packem_shared/ApiDocsPanel-6yZaaxch.mjs +2 -0
  63. package/dist/packem_shared/ApiReferencePanel-mwEK_vL7.mjs +1 -0
  64. package/dist/packem_shared/CommandPalette-CcTVGQvw.mjs +1 -0
  65. package/dist/packem_shared/ConfirmButton-DU4p72Er.mjs +1 -0
  66. package/dist/packem_shared/ConnectionBadge-B8Hj5DaE.mjs +1 -0
  67. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs +1 -0
  68. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs +1 -0
  69. package/dist/packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs +1 -0
  70. package/dist/packem_shared/DataBrowser-B6xr6S3s.mjs +4 -0
  71. package/dist/packem_shared/DataFilters-CYZFt2EK.mjs +1 -0
  72. package/dist/packem_shared/ErrorBoundary-BWNF98VF.mjs +1 -0
  73. package/dist/packem_shared/GlobalDataBrowser-DlBYI85g.mjs +1 -0
  74. package/dist/packem_shared/HomePanel-DBUgY2yE.mjs +1 -0
  75. package/dist/packem_shared/MigrationsPanel-_H327LDl.mjs +1 -0
  76. package/dist/packem_shared/OpenRpcReferencePanel-DJg4AbuZ.mjs +1 -0
  77. package/dist/packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.mjs +1 -0
  78. package/dist/packem_shared/ScheduledJobs-CscRWLW-.mjs +1 -0
  79. package/dist/packem_shared/ShardInput-C6mjgAh4.mjs +1 -0
  80. package/dist/packem_shared/Studio-s4EbmwaL.mjs +1 -0
  81. package/dist/packem_shared/StudioApp-D1e2uc7_.mjs +1 -0
  82. package/dist/packem_shared/StudioI18nProvider-fVsCSs5L.mjs +1 -0
  83. package/dist/packem_shared/advisor-view-kg9uZT7H.mjs +1 -0
  84. package/dist/packem_shared/aggregateMetrics-DKFJc-o5.mjs +1 -0
  85. package/dist/packem_shared/alert-PB5W11MM.mjs +1 -0
  86. package/dist/packem_shared/app.d-D45VvUTx.d.mts +351 -0
  87. package/dist/packem_shared/app.d-D45VvUTx.d.ts +351 -0
  88. package/dist/packem_shared/auth-pager-DiDnXsfe.mjs +1 -0
  89. package/dist/packem_shared/badge-r_5B4LHP.mjs +1 -0
  90. package/dist/packem_shared/bar-chart-BCsEIQoQ.mjs +6 -0
  91. package/dist/packem_shared/browser-storage-BH1MxLZs.mjs +1 -0
  92. package/dist/packem_shared/button-q0UYSmrn.mjs +1 -0
  93. package/dist/packem_shared/card-By2O8ULa.mjs +1 -0
  94. package/dist/packem_shared/cf-links-CBJ5SywP.mjs +1 -0
  95. package/dist/packem_shared/checkbox-CnS9cyCz.mjs +1 -0
  96. package/dist/packem_shared/control-button-BOZ5K-FC.mjs +1 -0
  97. package/dist/packem_shared/data-grid-XIuWrWDy.mjs +1 -0
  98. package/dist/packem_shared/data-view-params-DhYmAkcj.mjs +1 -0
  99. package/dist/packem_shared/diagram-export-panel-DrYRni_b.mjs +2 -0
  100. package/dist/packem_shared/dropdown-menu-jLZenfWH.mjs +2 -0
  101. package/dist/packem_shared/empty-state-D7jEML_T.mjs +1 -0
  102. package/dist/packem_shared/error-alert-Dr4RMEID.mjs +1 -0
  103. package/dist/packem_shared/grid-features-6mTvrzgT.mjs +6 -0
  104. package/dist/packem_shared/grid-pagination-DgzyzfBh.mjs +1 -0
  105. package/dist/packem_shared/home-panel-CKbpgpz9.mjs +3 -0
  106. package/dist/packem_shared/input-CXhxesPC.mjs +1 -0
  107. package/dist/packem_shared/internal-S7SDbbPa.mjs +2 -0
  108. package/dist/packem_shared/label-DKFzyHq6.mjs +1 -0
  109. package/dist/packem_shared/live-status-BuJdUZFU.mjs +1 -0
  110. package/dist/packem_shared/log-fields-BolUoZ9g.mjs +1 -0
  111. package/dist/packem_shared/log-line-DP0b3YT5.mjs +1 -0
  112. package/dist/packem_shared/metrics-format-1sNGG47R.mjs +1 -0
  113. package/dist/packem_shared/modal-shell-CDztwLnv.mjs +1 -0
  114. package/dist/packem_shared/operation-console-provider-DoloEvon.mjs +1 -0
  115. package/dist/packem_shared/recording-client-BbX9ql7w.mjs +1 -0
  116. package/dist/packem_shared/reference-view-DNdYDPow.mjs +13 -0
  117. package/dist/packem_shared/schema-diagram-DKBYRWsL.mjs +2 -0
  118. package/dist/packem_shared/scroll-area-CXCQH7VT.mjs +2 -0
  119. package/dist/packem_shared/select-DPyS18Vy.mjs +2 -0
  120. package/dist/packem_shared/shard-history-CaO3C4KQ.mjs +1 -0
  121. package/dist/packem_shared/shortcuts-B9gDaXmw.mjs +1 -0
  122. package/dist/packem_shared/skeleton-DX1gfixl.mjs +1 -0
  123. package/dist/packem_shared/sparkline-B_sPPO_8.mjs +1 -0
  124. package/dist/packem_shared/sql-result-table-B7g48CHO.mjs +1 -0
  125. package/dist/packem_shared/stat-card-BAv73QtB.mjs +1 -0
  126. package/dist/packem_shared/storage-tier-C2mKwYRj.mjs +1 -0
  127. package/dist/packem_shared/studio-BTM7dITm.mjs +2 -0
  128. package/dist/packem_shared/table-D0SBiDu-.mjs +2 -0
  129. package/dist/packem_shared/table-list-sidebar-DcvrtBkE.mjs +1 -0
  130. package/dist/packem_shared/textarea--40GKAyz.mjs +1 -0
  131. package/dist/packem_shared/trace-handoff-BV3EWqy_.mjs +1 -0
  132. package/dist/packem_shared/use-admin-query-B2jU5P5u.mjs +1 -0
  133. package/dist/packem_shared/use-admin-spec-CISwmdXM.mjs +1 -0
  134. package/dist/packem_shared/use-async-submit-CgvRHgaD.mjs +1 -0
  135. package/dist/packem_shared/use-auth-config-B9w5-1-p.mjs +1 -0
  136. package/dist/packem_shared/use-mirrored-ref-CVDf2z1M.mjs +1 -0
  137. package/dist/packem_shared/use-open-trace-CUyoDXjN.mjs +1 -0
  138. package/dist/packem_shared/use-shard-key-BsP3o5wT.mjs +1 -0
  139. package/dist/packem_shared/use-sql-assistant-CK6G1ycr.mjs +1 -0
  140. package/dist/packem_shared/useDebounced-DVeQ5-oW.mjs +1 -0
  141. package/dist/packem_shared/utils-bhneXptQ.mjs +1 -0
  142. package/dist/packem_shared/virtual-rect-D_j7aLxX.mjs +1 -0
  143. package/dist/standalone/chunk-253UHWDX.js +1 -0
  144. package/dist/standalone/chunk-2EYOYWS2.js +1 -0
  145. package/dist/standalone/chunk-2G3B5PAO.js +1 -0
  146. package/dist/standalone/chunk-2I4NHEKA.js +1 -0
  147. package/dist/standalone/chunk-2IKDEUCX.js +1 -0
  148. package/dist/standalone/chunk-2PNG3QHQ.js +1 -0
  149. package/dist/standalone/chunk-2QXJTBVX.js +1 -0
  150. package/dist/standalone/chunk-2W67FQCF.js +1 -0
  151. package/dist/standalone/chunk-37WYCOQ2.js +1 -0
  152. package/dist/standalone/chunk-3ADTLIRI.js +1 -0
  153. package/dist/standalone/chunk-3CBQDJ4S.js +1 -0
  154. package/dist/standalone/chunk-3RSD3XAG.js +1 -0
  155. package/dist/standalone/chunk-3YXASVTP.js +1 -0
  156. package/dist/standalone/chunk-4ZEL6BYL.js +1 -0
  157. package/dist/standalone/chunk-55UGUCQ6.js +1 -0
  158. package/dist/standalone/chunk-5B2RTXBS.js +1 -0
  159. package/dist/standalone/chunk-5LEVE36K.js +1 -0
  160. package/dist/standalone/chunk-5OMZCVRF.js +19 -0
  161. package/dist/standalone/chunk-5QR2SQIS.js +1 -0
  162. package/dist/standalone/chunk-6B7YJY6X.js +1 -0
  163. package/dist/standalone/chunk-6XIDYONR.js +1 -0
  164. package/dist/standalone/chunk-74WMPCOL.js +1 -0
  165. package/dist/standalone/chunk-7G4Z6Q7X.js +1 -0
  166. package/dist/standalone/chunk-7RKB5KS7.js +1 -0
  167. package/dist/standalone/chunk-7XYNQ3JS.js +1 -0
  168. package/dist/standalone/chunk-7Y3SY37W.js +1 -0
  169. package/dist/standalone/chunk-A4R7GZQS.js +4 -0
  170. package/dist/standalone/chunk-AFX6YYGP.js +1 -0
  171. package/dist/standalone/chunk-AJSSEAMP.js +1 -0
  172. package/dist/standalone/chunk-AQFI2GWT.js +1 -0
  173. package/dist/standalone/chunk-AUAECCXB.js +1 -0
  174. package/dist/standalone/{chunk-BJGBHGK3.js → chunk-AUGKHAMQ.js} +1 -1
  175. package/dist/standalone/chunk-BOMPSVRC.js +1 -0
  176. package/dist/standalone/chunk-BPBEVNUM.js +3 -0
  177. package/dist/standalone/chunk-C5KBRXQG.js +1 -0
  178. package/dist/standalone/chunk-CCDX5RYT.js +1 -0
  179. package/dist/standalone/chunk-CGQMJYCW.js +1 -0
  180. package/dist/standalone/chunk-CVPVFONU.js +1 -0
  181. package/dist/standalone/chunk-CVXNHIQW.js +1 -0
  182. package/dist/standalone/chunk-CYWRJGWD.js +1 -0
  183. package/dist/standalone/chunk-D3HPOVEQ.js +1 -0
  184. package/dist/standalone/chunk-D6ZXOSCM.js +1 -0
  185. package/dist/standalone/chunk-D746I7ZX.js +1 -0
  186. package/dist/standalone/chunk-DQSV2OFA.js +1 -0
  187. package/dist/standalone/chunk-DS2DTZFS.js +14 -0
  188. package/dist/standalone/chunk-DSXEICMD.js +1 -0
  189. package/dist/standalone/chunk-DVX5J34S.js +59 -0
  190. package/dist/standalone/chunk-DXYCOA4Y.js +1 -0
  191. package/dist/standalone/chunk-E4PXACVL.js +3 -0
  192. package/dist/standalone/chunk-ECY2JC5F.js +1 -0
  193. package/dist/standalone/chunk-FBGCQYRO.js +8 -0
  194. package/dist/standalone/chunk-FCVKROK5.js +4 -0
  195. package/dist/standalone/chunk-FGVGIVB6.js +1 -0
  196. package/dist/standalone/chunk-FPI7AMQJ.js +1 -0
  197. package/dist/standalone/chunk-FUYEZFBP.js +1 -0
  198. package/dist/standalone/chunk-G3NIGELJ.js +1 -0
  199. package/dist/standalone/chunk-GHQ2VDI2.js +1 -0
  200. package/dist/standalone/chunk-GPNP4QSZ.js +1 -0
  201. package/dist/standalone/chunk-GV2QZP42.js +2 -0
  202. package/dist/standalone/chunk-GV6O3NPO.js +1 -0
  203. package/dist/standalone/chunk-GXYXVKOM.js +1 -0
  204. package/dist/standalone/chunk-HCTJKP5J.js +1 -0
  205. package/dist/standalone/chunk-HHT7X6VO.js +1 -0
  206. package/dist/standalone/chunk-HKQSHNFB.js +1 -0
  207. package/dist/standalone/chunk-HYKN42SO.js +1 -0
  208. package/dist/standalone/chunk-I23ULEUU.js +1 -0
  209. package/dist/standalone/chunk-I26MS5PJ.js +1 -0
  210. package/dist/standalone/chunk-I5RZUA4J.js +1 -0
  211. package/dist/standalone/chunk-IWZ7GVQO.js +1 -0
  212. package/dist/standalone/chunk-J5NS6XO4.js +1 -0
  213. package/dist/standalone/chunk-JQXA2OYK.js +1 -0
  214. package/dist/standalone/chunk-K7OJ77CA.js +1 -0
  215. package/dist/standalone/chunk-KRVD6WPH.js +1 -0
  216. package/dist/standalone/chunk-KXYSX2SV.js +1 -0
  217. package/dist/standalone/chunk-LSEISHAB.js +1 -0
  218. package/dist/standalone/chunk-LXBSXLLK.js +1 -0
  219. package/dist/standalone/chunk-MCHTZFX6.js +1 -0
  220. package/dist/standalone/chunk-MRFJSQBZ.js +1 -0
  221. package/dist/standalone/chunk-MVWZMWPD.js +1 -0
  222. package/dist/standalone/chunk-NA7GP6EE.js +1 -0
  223. package/dist/standalone/chunk-NCPW7WHO.js +1 -0
  224. package/dist/standalone/chunk-NGVP66OH.js +1 -0
  225. package/dist/standalone/chunk-NQZALRU3.js +1 -0
  226. package/dist/standalone/chunk-NRP22GKC.js +1 -0
  227. package/dist/standalone/chunk-NXQW5E6W.js +1 -0
  228. package/dist/standalone/chunk-NXVOCK3P.js +5 -0
  229. package/dist/standalone/chunk-OMN44W6V.js +1 -0
  230. package/dist/standalone/chunk-OPM7ESDV.js +1 -0
  231. package/dist/standalone/chunk-OQ6I6OXT.js +2 -0
  232. package/dist/standalone/chunk-OU56VN3R.js +1 -0
  233. package/dist/standalone/chunk-OYCUPD3Q.js +1 -0
  234. package/dist/standalone/chunk-P6UD4I65.js +1 -0
  235. package/dist/standalone/chunk-PAAYRW3Q.js +9 -0
  236. package/dist/standalone/chunk-PDF22AMX.js +1 -0
  237. package/dist/standalone/chunk-PH4VNMUO.js +1 -0
  238. package/dist/standalone/chunk-PLVFYL6L.js +1 -0
  239. package/dist/standalone/chunk-Q6ED4KUL.js +1 -0
  240. package/dist/standalone/chunk-Q6IT6ZD7.js +1 -0
  241. package/dist/standalone/{chunk-ZHVTQ37P.js → chunk-QAQDMS6R.js} +1 -1
  242. package/dist/standalone/chunk-QBTZMN5E.js +1 -0
  243. package/dist/standalone/chunk-QJACMRR5.js +1 -0
  244. package/dist/standalone/chunk-QJLHH3ET.js +1 -0
  245. package/dist/standalone/chunk-R6U22RSY.js +1 -0
  246. package/dist/standalone/chunk-RGMVGZV4.js +1 -0
  247. package/dist/standalone/chunk-RWVIV3U7.js +1 -0
  248. package/dist/standalone/chunk-S4Z7K55A.js +1 -0
  249. package/dist/standalone/chunk-S63L3TCR.js +1 -0
  250. package/dist/standalone/chunk-SA2OGF3F.js +1 -0
  251. package/dist/standalone/chunk-SJQERRSZ.js +1 -0
  252. package/dist/standalone/chunk-SZIEPXZM.js +1 -0
  253. package/dist/standalone/chunk-TM5C7YPO.js +1 -0
  254. package/dist/standalone/chunk-TSNDFT5D.js +1 -0
  255. package/dist/standalone/chunk-UC7MNI2F.js +1 -0
  256. package/dist/standalone/chunk-ULW7I6FO.js +1 -0
  257. package/dist/standalone/chunk-UYEZR3BI.js +1 -0
  258. package/dist/standalone/chunk-V3RAWH63.js +1 -0
  259. package/dist/standalone/chunk-VASJTDMU.js +1 -0
  260. package/dist/standalone/chunk-VCFEO3RI.js +1 -0
  261. package/dist/standalone/chunk-VESGIGMQ.js +1 -0
  262. package/dist/standalone/chunk-WJRYEML4.js +1 -0
  263. package/dist/standalone/chunk-WMPXMPVF.js +1 -0
  264. package/dist/standalone/chunk-WS7WNXF3.js +15 -0
  265. package/dist/standalone/chunk-X2YHVCMH.js +1 -0
  266. package/dist/standalone/chunk-X472RKFD.js +6 -0
  267. package/dist/standalone/chunk-XGCIDUJF.js +1 -0
  268. package/dist/standalone/chunk-Y3AYVFTK.js +1 -0
  269. package/dist/standalone/chunk-Y57U7WES.js +1 -0
  270. package/dist/standalone/chunk-YGNPACVK.js +1 -0
  271. package/dist/standalone/chunk-YPY2NU35.js +3 -0
  272. package/dist/standalone/chunk-YQQTRX55.js +1 -0
  273. package/dist/standalone/chunk-ZBRLJQ46.js +15 -0
  274. package/dist/standalone/chunk-ZKJS6EBE.js +1 -0
  275. package/dist/standalone/chunk-ZQ4C2DMJ.js +1 -0
  276. package/dist/standalone/studio.js +9 -214
  277. package/dist/styles.css +2 -2
  278. package/package.json +26 -22
  279. package/dist/index.js +0 -41
  280. package/dist/mount.js +0 -27
  281. package/dist/packem_chunks/ApiTab.js +0 -251
  282. package/dist/packem_chunks/AuditPanel.js +0 -200
  283. package/dist/packem_chunks/ExportImportPanel.js +0 -198
  284. package/dist/packem_chunks/FileBrowser.js +0 -2932
  285. package/dist/packem_chunks/FunctionRunner.js +0 -343
  286. package/dist/packem_chunks/FunctionStatsPanel.js +0 -377
  287. package/dist/packem_chunks/HealthPanel.js +0 -648
  288. package/dist/packem_chunks/InsightsPanel.js +0 -462
  289. package/dist/packem_chunks/LogsPanel.js +0 -827
  290. package/dist/packem_chunks/MailPanel.js +0 -441
  291. package/dist/packem_chunks/MetricsPanel.js +0 -1344
  292. package/dist/packem_chunks/MigrationsPanel.js +0 -239
  293. package/dist/packem_chunks/PitrPanel.js +0 -252
  294. package/dist/packem_chunks/SchemaViewer.js +0 -2513
  295. package/dist/packem_chunks/SecurityAdvisorPanel.js +0 -95
  296. package/dist/packem_chunks/SettingsPanel.js +0 -391
  297. package/dist/packem_chunks/SqlEditorPanel.js +0 -2323
  298. package/dist/packem_chunks/TableEditor.js +0 -313
  299. package/dist/packem_chunks/analytics-panel.js +0 -261
  300. package/dist/packem_chunks/auth-config-panel.js +0 -179
  301. package/dist/packem_chunks/auth-sessions-panel.js +0 -175
  302. package/dist/packem_chunks/containers-panel.js +0 -247
  303. package/dist/packem_chunks/dashboards-panel.js +0 -780
  304. package/dist/packem_chunks/fanout-panel.js +0 -482
  305. package/dist/packem_chunks/flags-panel.js +0 -176
  306. package/dist/packem_chunks/kv-browser.js +0 -1896
  307. package/dist/packem_chunks/log-drains-panel.js +0 -273
  308. package/dist/packem_chunks/organizations-panel.js +0 -670
  309. package/dist/packem_chunks/payments-panel.js +0 -186
  310. package/dist/packem_chunks/permissions-panel.js +0 -805
  311. package/dist/packem_chunks/queues-panel.js +0 -148
  312. package/dist/packem_chunks/rls-panel.js +0 -315
  313. package/dist/packem_chunks/schedule-panel.js +0 -831
  314. package/dist/packem_chunks/sparkline.js +0 -79
  315. package/dist/packem_chunks/storage-rules-panel.js +0 -140
  316. package/dist/packem_chunks/subscriptions-panel.js +0 -238
  317. package/dist/packem_chunks/users-panel.js +0 -1265
  318. package/dist/packem_chunks/vector-browser.js +0 -281
  319. package/dist/packem_chunks/workflows-panel.js +0 -562
  320. package/dist/packem_shared/ADMIN_FUNCTIONS-CdaxLGkE.js +0 -48
  321. package/dist/packem_shared/ApiDocsPanel-Cu6mD4u7.js +0 -842
  322. package/dist/packem_shared/ApiReferencePanel-Co_wpRF2.js +0 -230
  323. package/dist/packem_shared/CommandPalette-BUPpbpMc.js +0 -373
  324. package/dist/packem_shared/ConfirmButton-C2eVi2Qv.js +0 -59
  325. package/dist/packem_shared/ConnectionBadge-B2DDM2Tn.js +0 -111
  326. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js +0 -50
  327. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js +0 -89
  328. package/dist/packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js +0 -27
  329. package/dist/packem_shared/DataBrowser-DSNK1tPg.js +0 -4493
  330. package/dist/packem_shared/DataFilters-FNquMaiu.js +0 -249
  331. package/dist/packem_shared/ErrorBoundary-BzAApI7J.js +0 -66
  332. package/dist/packem_shared/GlobalDataBrowser-ErfvIs1S.js +0 -289
  333. package/dist/packem_shared/HomePanel-DQk3P8xX.js +0 -14
  334. package/dist/packem_shared/OpenRpcReferencePanel-DLWzrIx9.js +0 -192
  335. package/dist/packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js +0 -3
  336. package/dist/packem_shared/ScheduledJobs-ClaNpZsg.js +0 -262
  337. package/dist/packem_shared/ShardInput-gx_DZXXn.js +0 -107
  338. package/dist/packem_shared/Studio-CFTYGEUt.js +0 -16
  339. package/dist/packem_shared/StudioApp-Cy9vUwVl.js +0 -657
  340. package/dist/packem_shared/StudioI18nProvider-B-tDCZIi.js +0 -48
  341. package/dist/packem_shared/advisor-view-D3-U4kRR.js +0 -159
  342. package/dist/packem_shared/aggregateMetrics-D4nUHEKU.js +0 -108
  343. package/dist/packem_shared/alert-CdAET2K_.js +0 -68
  344. package/dist/packem_shared/app.d-CNLRTrWw.d.ts +0 -300
  345. package/dist/packem_shared/badge-B2PKA1-5.js +0 -49
  346. package/dist/packem_shared/bar-chart-DSwcWIRy.js +0 -3246
  347. package/dist/packem_shared/browser-storage-tLOxkIHd.js +0 -185
  348. package/dist/packem_shared/button-BhsN2uZH.js +0 -49
  349. package/dist/packem_shared/card-DURq3ElK.js +0 -175
  350. package/dist/packem_shared/cf-links-BZfRdxSE.js +0 -8
  351. package/dist/packem_shared/checkbox-UNkzAxl-.js +0 -63
  352. package/dist/packem_shared/data-grid-Jz8FqQ2C.js +0 -183
  353. package/dist/packem_shared/data-view-params-Cd6yRVbv.js +0 -96
  354. package/dist/packem_shared/dropdown-menu-WY4B_eJO.js +0 -280
  355. package/dist/packem_shared/empty-state-DY_oe0k6.js +0 -98
  356. package/dist/packem_shared/error-alert-BBT6D22d.js +0 -114
  357. package/dist/packem_shared/grid-features-CUr8Z1_O.js +0 -745
  358. package/dist/packem_shared/home-panel-Bo-Mgrkn.js +0 -1639
  359. package/dist/packem_shared/input-XH4r1Pt1.js +0 -53
  360. package/dist/packem_shared/internal-DTsYVn-g.js +0 -97
  361. package/dist/packem_shared/label-D8ykjn5J.js +0 -46
  362. package/dist/packem_shared/live-status-FZ0psC1z.js +0 -44
  363. package/dist/packem_shared/modal-shell-hyaJvIJ6.js +0 -100
  364. package/dist/packem_shared/reference-view-CSKyUyPl.js +0 -2141
  365. package/dist/packem_shared/select-UkNYCT3s.js +0 -273
  366. package/dist/packem_shared/shard-history-DyebH1R5.js +0 -38
  367. package/dist/packem_shared/skeleton-CGhL0p20.js +0 -45
  368. package/dist/packem_shared/sparkline-BnA1kC9X.js +0 -93
  369. package/dist/packem_shared/storage-tier-CL98eOvn.js +0 -85
  370. package/dist/packem_shared/studio-Dg2e-dsR.js +0 -4014
  371. package/dist/packem_shared/table-DsCa9Qp9.js +0 -246
  372. package/dist/packem_shared/table-list-sidebar-B5psdSV1.js +0 -832
  373. package/dist/packem_shared/textarea-D3gaCU_-.js +0 -46
  374. package/dist/packem_shared/use-admin-query-BHPKmPuj.js +0 -106
  375. package/dist/packem_shared/use-auth-capabilities-C-VH0oJJ.js +0 -32
  376. package/dist/packem_shared/useDebounced-Dxncpg6z.js +0 -32
  377. package/dist/packem_shared/utils-B05Dmz_H.js +0 -8
  378. package/dist/packem_shared/virtual-rect-CVMUskSm.js +0 -10
  379. package/dist/standalone/chunk-25VHPD2I.js +0 -1
  380. package/dist/standalone/chunk-2GGMGPEP.js +0 -1
  381. package/dist/standalone/chunk-2K47A3P6.js +0 -1
  382. package/dist/standalone/chunk-2NGUNNGW.js +0 -1
  383. package/dist/standalone/chunk-3CJW6NWG.js +0 -4
  384. package/dist/standalone/chunk-3OA7PECS.js +0 -6
  385. package/dist/standalone/chunk-4H2OJBXO.js +0 -1
  386. package/dist/standalone/chunk-4LDOOKES.js +0 -1
  387. package/dist/standalone/chunk-4MLAVZP4.js +0 -1
  388. package/dist/standalone/chunk-4QHKBC77.js +0 -1
  389. package/dist/standalone/chunk-55YA7ZZI.js +0 -76
  390. package/dist/standalone/chunk-5OH3VPZF.js +0 -1
  391. package/dist/standalone/chunk-5OIBXYZM.js +0 -1
  392. package/dist/standalone/chunk-5PQMXK24.js +0 -1
  393. package/dist/standalone/chunk-66DNF4AJ.js +0 -1
  394. package/dist/standalone/chunk-6GFEVKJP.js +0 -1
  395. package/dist/standalone/chunk-764T6X6X.js +0 -1
  396. package/dist/standalone/chunk-7M3F6U4L.js +0 -1
  397. package/dist/standalone/chunk-7TJJXVSE.js +0 -1
  398. package/dist/standalone/chunk-7VF3IAAW.js +0 -2
  399. package/dist/standalone/chunk-AHILM3ZP.js +0 -1
  400. package/dist/standalone/chunk-AJIUI7DD.js +0 -1
  401. package/dist/standalone/chunk-AQGOX5DK.js +0 -1
  402. package/dist/standalone/chunk-BACPICH6.js +0 -1
  403. package/dist/standalone/chunk-BET2625I.js +0 -1
  404. package/dist/standalone/chunk-BQUQS7QN.js +0 -1
  405. package/dist/standalone/chunk-CKSHCYGC.js +0 -2
  406. package/dist/standalone/chunk-DCECRP45.js +0 -1
  407. package/dist/standalone/chunk-DFP2DADO.js +0 -1
  408. package/dist/standalone/chunk-DORBUITF.js +0 -1
  409. package/dist/standalone/chunk-DVKPRFIJ.js +0 -1
  410. package/dist/standalone/chunk-DWDILV2E.js +0 -1
  411. package/dist/standalone/chunk-E6WUCLSI.js +0 -1
  412. package/dist/standalone/chunk-E7WLF6IU.js +0 -1
  413. package/dist/standalone/chunk-EVPLBWUT.js +0 -8
  414. package/dist/standalone/chunk-FCSPAJW4.js +0 -1
  415. package/dist/standalone/chunk-FKO3HO6I.js +0 -4
  416. package/dist/standalone/chunk-G2ICR3DL.js +0 -1
  417. package/dist/standalone/chunk-GJ6PGSES.js +0 -13
  418. package/dist/standalone/chunk-GMSGZDDH.js +0 -13
  419. package/dist/standalone/chunk-GTM65MVX.js +0 -1
  420. package/dist/standalone/chunk-GVRM4U6W.js +0 -2
  421. package/dist/standalone/chunk-GZDWDDXN.js +0 -1
  422. package/dist/standalone/chunk-HV7G6DFP.js +0 -5
  423. package/dist/standalone/chunk-ISJAJWYI.js +0 -1
  424. package/dist/standalone/chunk-J6J54MBP.js +0 -1
  425. package/dist/standalone/chunk-JIDZFLTB.js +0 -4
  426. package/dist/standalone/chunk-JSEXCW5Q.js +0 -1
  427. package/dist/standalone/chunk-K3GNLVYK.js +0 -1
  428. package/dist/standalone/chunk-K4ZDRTQM.js +0 -1
  429. package/dist/standalone/chunk-KEGAWN6Y.js +0 -1
  430. package/dist/standalone/chunk-KZ6INM5M.js +0 -1
  431. package/dist/standalone/chunk-LI43EKM6.js +0 -1
  432. package/dist/standalone/chunk-MFPTVCJ6.js +0 -1
  433. package/dist/standalone/chunk-MPYFGAOW.js +0 -1
  434. package/dist/standalone/chunk-O3NAGRTR.js +0 -1
  435. package/dist/standalone/chunk-O77VNUFD.js +0 -1
  436. package/dist/standalone/chunk-PA3LN4XJ.js +0 -1
  437. package/dist/standalone/chunk-PN5NCZDX.js +0 -1
  438. package/dist/standalone/chunk-PVZI3CXP.js +0 -19
  439. package/dist/standalone/chunk-PZ7HD5T2.js +0 -1
  440. package/dist/standalone/chunk-QAFAJBAW.js +0 -1
  441. package/dist/standalone/chunk-QBAT52GB.js +0 -1
  442. package/dist/standalone/chunk-QHIIRFG7.js +0 -1
  443. package/dist/standalone/chunk-RRCPZMC2.js +0 -22
  444. package/dist/standalone/chunk-RSEEHNFI.js +0 -1
  445. package/dist/standalone/chunk-SEU5V7I6.js +0 -1
  446. package/dist/standalone/chunk-SGDQIWAR.js +0 -4
  447. package/dist/standalone/chunk-SVR644RF.js +0 -1
  448. package/dist/standalone/chunk-SYEIXTEU.js +0 -1
  449. package/dist/standalone/chunk-T5HRXUSY.js +0 -1
  450. package/dist/standalone/chunk-TAD43CG5.js +0 -1
  451. package/dist/standalone/chunk-TBMYIZIO.js +0 -1
  452. package/dist/standalone/chunk-TDL7NEWA.js +0 -1
  453. package/dist/standalone/chunk-TM7CMA7X.js +0 -1
  454. package/dist/standalone/chunk-TQ36RWOP.js +0 -1
  455. package/dist/standalone/chunk-U4OAQPBT.js +0 -1
  456. package/dist/standalone/chunk-UDSVXA42.js +0 -1
  457. package/dist/standalone/chunk-UII66UVF.js +0 -1
  458. package/dist/standalone/chunk-UK64ZSUW.js +0 -1
  459. package/dist/standalone/chunk-VEZO7G5Q.js +0 -3
  460. package/dist/standalone/chunk-VLXV72QE.js +0 -1
  461. package/dist/standalone/chunk-VSHUSN6T.js +0 -1
  462. package/dist/standalone/chunk-VYMCCC6O.js +0 -1
  463. package/dist/standalone/chunk-WXPWVBIY.js +0 -1
  464. package/dist/standalone/chunk-X72PYOEW.js +0 -1
  465. package/dist/standalone/chunk-X7MMBSNW.js +0 -1
  466. package/dist/standalone/chunk-XIGIWZLO.js +0 -4
  467. package/dist/standalone/chunk-XNJNSCLM.js +0 -1
  468. package/dist/standalone/chunk-XUGSA2NG.js +0 -1
  469. package/dist/standalone/chunk-Y2ZPNDL7.js +0 -4
  470. package/dist/standalone/chunk-YM6BBZDN.js +0 -1
  471. package/dist/standalone/chunk-ZPP2KOR4.js +0 -1
  472. package/dist/standalone/chunk-ZPUO7FNI.js +0 -1
@@ -1,2513 +0,0 @@
1
- 'use client';
2
- import { c } from 'react/compiler-runtime';
3
- import { useLunora } from '@lunora/react';
4
- import { useState, useRef, useEffect } from 'react';
5
- import { ShardInput } from '../packem_shared/ShardInput-gx_DZXXn.js';
6
- import { S as StorageTierBadge, T as TIER_META } from '../packem_shared/storage-tier-CL98eOvn.js';
7
- import { B as Badge } from '../packem_shared/badge-B2PKA1-5.js';
8
- import { B as Button } from '../packem_shared/button-BhsN2uZH.js';
9
- import { C as Card, b as CardHeader, c as CardTitle, d as CardDescription, a as CardContent } from '../packem_shared/card-DURq3ElK.js';
10
- import { E as EmptyState } from '../packem_shared/empty-state-DY_oe0k6.js';
11
- import { I as Input } from '../packem_shared/input-XH4r1Pt1.js';
12
- import useDebounced from '../packem_shared/useDebounced-Dxncpg6z.js';
13
- import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
14
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-CdaxLGkE.js';
15
- import { f as fireAndForget, c as callOptions, e as errorMessage, a as adminRef } from '../packem_shared/internal-DTsYVn-g.js';
16
- import { r as recordShard } from '../packem_shared/shard-history-DyebH1R5.js';
17
- import { c as cn } from '../packem_shared/utils-B05Dmz_H.js';
18
- import { Download01Icon } from '@hugeicons/core-free-icons';
19
- import { HugeiconsIcon } from '@hugeicons/react';
20
- import { Handle, Position, getNodesBounds, getViewportForBounds, useNodesState, useEdgesState, Background, Panel, Controls, MiniMap, ReactFlow, useNodes, useReactFlow } from '@xyflow/react';
21
- import { d as DropdownMenu, D as DropdownMenuTrigger, c as DropdownMenuContent, b as DropdownMenuItem } from '../packem_shared/dropdown-menu-WY4B_eJO.js';
22
- import { jsxDEV } from 'react/jsx-dev-runtime';
23
- import { LunoraError } from '@lunora/errors';
24
- import { toBlob, toSvg } from 'html-to-image';
25
- import { useNavigate } from '@tanstack/react-router';
26
- import { L as Label } from '../packem_shared/label-D8ykjn5J.js';
27
-
28
- function BaseNode(t0) {
29
- const $ = c(10);
30
- let className;
31
- let props;
32
- let selected;
33
- if ($[0] !== t0) {
34
- ({
35
- className,
36
- selected,
37
- ...props
38
- } = t0);
39
- $[0] = t0;
40
- $[1] = className;
41
- $[2] = props;
42
- $[3] = selected;
43
- } else {
44
- className = $[1];
45
- props = $[2];
46
- selected = $[3];
47
- }
48
- const t1 = selected === true ? "" : void 0;
49
- let t2;
50
- if ($[4] !== className) {
51
- t2 = cn("rounded-md border border-border bg-card text-card-foreground shadow-sm transition-colors", "data-[selected]:border-ring data-[selected]:ring-[3px] data-[selected]:ring-ring/30", className);
52
- $[4] = className;
53
- $[5] = t2;
54
- } else {
55
- t2 = $[5];
56
- }
57
- let t3;
58
- if ($[6] !== props || $[7] !== t1 || $[8] !== t2) {
59
- t3 = /* @__PURE__ */ jsxDEV("div", {
60
- "data-slot": "base-node",
61
- "data-selected": t1,
62
- className: t2,
63
- ...props
64
- }, void 0, false);
65
- $[6] = props;
66
- $[7] = t1;
67
- $[8] = t2;
68
- $[9] = t3;
69
- } else {
70
- t3 = $[9];
71
- }
72
- return t3;
73
- }
74
- function BaseNodeHeader(t0) {
75
- const $ = c(8);
76
- let className;
77
- let props;
78
- if ($[0] !== t0) {
79
- ({
80
- className,
81
- ...props
82
- } = t0);
83
- $[0] = t0;
84
- $[1] = className;
85
- $[2] = props;
86
- } else {
87
- className = $[1];
88
- props = $[2];
89
- }
90
- let t1;
91
- if ($[3] !== className) {
92
- t1 = cn("flex items-center gap-2 rounded-t-md bg-muted/50 px-3 py-1.5", className);
93
- $[3] = className;
94
- $[4] = t1;
95
- } else {
96
- t1 = $[4];
97
- }
98
- let t2;
99
- if ($[5] !== props || $[6] !== t1) {
100
- t2 = /* @__PURE__ */ jsxDEV("div", {
101
- "data-slot": "base-node-header",
102
- className: t1,
103
- ...props
104
- }, void 0, false);
105
- $[5] = props;
106
- $[6] = t1;
107
- $[7] = t2;
108
- } else {
109
- t2 = $[7];
110
- }
111
- return t2;
112
- }
113
- function BaseNodeContent(t0) {
114
- const $ = c(8);
115
- let className;
116
- let props;
117
- if ($[0] !== t0) {
118
- ({
119
- className,
120
- ...props
121
- } = t0);
122
- $[0] = t0;
123
- $[1] = className;
124
- $[2] = props;
125
- } else {
126
- className = $[1];
127
- props = $[2];
128
- }
129
- let t1;
130
- if ($[3] !== className) {
131
- t1 = cn("flex flex-col", className);
132
- $[3] = className;
133
- $[4] = t1;
134
- } else {
135
- t1 = $[4];
136
- }
137
- let t2;
138
- if ($[5] !== props || $[6] !== t1) {
139
- t2 = /* @__PURE__ */ jsxDEV("div", {
140
- "data-slot": "base-node-content",
141
- className: t1,
142
- ...props
143
- }, void 0, false);
144
- $[5] = props;
145
- $[6] = t1;
146
- $[7] = t2;
147
- } else {
148
- t2 = $[7];
149
- }
150
- return t2;
151
- }
152
-
153
- const typeLabel = (column) => {
154
- const base = column.ref === void 0 ? column.type : `${column.type} → ${column.ref}`;
155
- return column.optional === true ? `${base}?` : base;
156
- };
157
- const DatabaseSchemaNode = (t0) => {
158
- const $ = c(22);
159
- const {
160
- data,
161
- selected
162
- } = t0;
163
- const t = useT();
164
- let t1;
165
- if ($[0] !== data.label || $[1] !== data.loadError || $[2] !== t) {
166
- t1 = data.loadError === true ? /* @__PURE__ */ jsxDEV("span", {
167
- className: "px-3 py-1.5 text-xs text-destructive",
168
- "data-testid": `sd-node-${data.label}-error`,
169
- children: t("Columns unavailable")
170
- }, void 0, false) : /* @__PURE__ */ jsxDEV("span", {
171
- className: "px-3 py-1.5 text-xs text-muted-foreground",
172
- children: "—"
173
- }, void 0, false);
174
- $[0] = data.label;
175
- $[1] = data.loadError;
176
- $[2] = t;
177
- $[3] = t1;
178
- } else {
179
- t1 = $[3];
180
- }
181
- const emptyPlaceholder = t1;
182
- const t2 = `sd-node-${data.label}`;
183
- let t3;
184
- if ($[4] !== data.label) {
185
- t3 = /* @__PURE__ */ jsxDEV("span", {
186
- className: "truncate font-mono text-xs font-semibold",
187
- title: data.label,
188
- children: data.label
189
- }, void 0, false);
190
- $[4] = data.label;
191
- $[5] = t3;
192
- } else {
193
- t3 = $[5];
194
- }
195
- let t4;
196
- if ($[6] !== data.tier) {
197
- t4 = /* @__PURE__ */ jsxDEV("span", {
198
- className: "ms-auto",
199
- children: /* @__PURE__ */ jsxDEV(StorageTierBadge, {
200
- tier: data.tier
201
- }, void 0, false)
202
- }, void 0, false);
203
- $[6] = data.tier;
204
- $[7] = t4;
205
- } else {
206
- t4 = $[7];
207
- }
208
- let t5;
209
- if ($[8] !== t3 || $[9] !== t4) {
210
- t5 = /* @__PURE__ */ jsxDEV(BaseNodeHeader, {
211
- children: [t3, t4]
212
- }, void 0, true);
213
- $[8] = t3;
214
- $[9] = t4;
215
- $[10] = t5;
216
- } else {
217
- t5 = $[10];
218
- }
219
- let t6;
220
- if ($[11] !== data.columns || $[12] !== data.label || $[13] !== emptyPlaceholder) {
221
- t6 = data.columns.length === 0 ? emptyPlaceholder : data.columns.map((column) => /* @__PURE__ */ jsxDEV("div", {
222
- className: cn("relative flex items-center gap-2 border-t border-border px-3 py-1.5 text-xs first:border-t-0", column.pk === true && "bg-muted/30"),
223
- "data-testid": `sd-col-${data.label}-${column.name}`,
224
- children: [/* @__PURE__ */ jsxDEV(Handle, {
225
- className: "!h-2 !w-2 !-left-1 !border-border !bg-muted-foreground/70",
226
- id: column.name,
227
- isConnectable: false,
228
- position: Position.Left,
229
- type: "target"
230
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
231
- className: "truncate font-mono",
232
- title: column.name,
233
- children: column.name
234
- }, void 0, false), column.pk === true && /* @__PURE__ */ jsxDEV(Badge, {
235
- className: "px-1 py-0 text-[10px] leading-tight",
236
- variant: "secondary",
237
- children: "PK"
238
- }, void 0, false), column.ref !== void 0 && /* @__PURE__ */ jsxDEV(Badge, {
239
- className: "px-1 py-0 text-[10px] leading-tight",
240
- variant: "outline",
241
- children: "FK"
242
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
243
- className: "ms-auto truncate text-muted-foreground",
244
- title: typeLabel(column),
245
- children: typeLabel(column)
246
- }, void 0, false), /* @__PURE__ */ jsxDEV(Handle, {
247
- className: "!h-2 !w-2 !-right-1 !border-border !bg-muted-foreground/70",
248
- id: column.name,
249
- isConnectable: false,
250
- position: Position.Right,
251
- type: "source"
252
- }, void 0, false)]
253
- }, column.name, true));
254
- $[11] = data.columns;
255
- $[12] = data.label;
256
- $[13] = emptyPlaceholder;
257
- $[14] = t6;
258
- } else {
259
- t6 = $[14];
260
- }
261
- let t7;
262
- if ($[15] !== t6) {
263
- t7 = /* @__PURE__ */ jsxDEV(BaseNodeContent, {
264
- children: t6
265
- }, void 0, false);
266
- $[15] = t6;
267
- $[16] = t7;
268
- } else {
269
- t7 = $[16];
270
- }
271
- let t8;
272
- if ($[17] !== selected || $[18] !== t2 || $[19] !== t5 || $[20] !== t7) {
273
- t8 = /* @__PURE__ */ jsxDEV(BaseNode, {
274
- className: "w-64 overflow-hidden",
275
- "data-testid": t2,
276
- selected,
277
- children: [t5, t7]
278
- }, void 0, true);
279
- $[17] = selected;
280
- $[18] = t2;
281
- $[19] = t5;
282
- $[20] = t7;
283
- $[21] = t8;
284
- } else {
285
- t8 = $[21];
286
- }
287
- return t8;
288
- };
289
-
290
- const IMAGE_WIDTH = 1920;
291
- const IMAGE_HEIGHT = 1080;
292
- const IMAGE_PADDING = 32;
293
- const triggerDownload = (href, filename) => {
294
- const link = globalThis.document.createElement("a");
295
- link.href = href;
296
- link.download = filename;
297
- globalThis.document.body.append(link);
298
- link.click();
299
- link.remove();
300
- };
301
- const exportDiagramAsJson = (nodes, edges, filename = "schema-diagram.json") => {
302
- const payload = {
303
- edges,
304
- exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
305
- nodes
306
- };
307
- const json = JSON.stringify(payload, void 0, 2);
308
- const url = globalThis.URL.createObjectURL(new globalThis.Blob([json], {
309
- type: "application/json"
310
- }));
311
- triggerDownload(url, filename);
312
- globalThis.setTimeout(() => {
313
- globalThis.URL.revokeObjectURL(url);
314
- }, 0);
315
- };
316
- const viewportForExport = (nodes, width, height, padding) => {
317
- const bounds = getNodesBounds(nodes);
318
- const {
319
- x,
320
- y,
321
- zoom
322
- } = getViewportForBounds(bounds, width, height, 0.1, 2, padding);
323
- return {
324
- transform: [x, y, zoom],
325
- zoom
326
- };
327
- };
328
- const exportDiagramAsPng = async (viewportElement, nodes, filename = "schema-diagram.png") => {
329
- const {
330
- transform
331
- } = viewportForExport(nodes, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PADDING);
332
- const [tx, ty, scale] = transform;
333
- const blob = await toBlob(viewportElement, {
334
- backgroundColor: "#ffffff",
335
- height: IMAGE_HEIGHT,
336
- style: {
337
- transform: `translate(${tx.toString()}px, ${ty.toString()}px) scale(${scale.toString()})`,
338
- transformOrigin: "top left",
339
- width: `${IMAGE_WIDTH.toString()}px`
340
- },
341
- width: IMAGE_WIDTH
342
- });
343
- if (blob === null) {
344
- throw new LunoraError("INTERNAL", "html-to-image produced no blob");
345
- }
346
- const url = globalThis.URL.createObjectURL(blob);
347
- triggerDownload(url, filename);
348
- globalThis.setTimeout(() => {
349
- globalThis.URL.revokeObjectURL(url);
350
- }, 0);
351
- };
352
- const exportDiagramAsSvg = async (viewportElement, nodes, filename = "schema-diagram.svg") => {
353
- const {
354
- transform
355
- } = viewportForExport(nodes, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PADDING);
356
- const [tx, ty, scale] = transform;
357
- const svgDataUrl = await toSvg(viewportElement, {
358
- backgroundColor: "#ffffff",
359
- height: IMAGE_HEIGHT,
360
- style: {
361
- transform: `translate(${tx.toString()}px, ${ty.toString()}px) scale(${scale.toString()})`,
362
- transformOrigin: "top left",
363
- width: `${IMAGE_WIDTH.toString()}px`
364
- },
365
- width: IMAGE_WIDTH
366
- });
367
- triggerDownload(svgDataUrl, filename);
368
- };
369
-
370
- const NODE_WIDTH = 256;
371
- const COLUMN_GAP = 112;
372
- const ROW_GAP = 36;
373
- const PADDING = 24;
374
- const HEADER_HEIGHT = 38;
375
- const ROW_HEIGHT = 28;
376
- const nodeHeight = (columnCount) => HEADER_HEIGHT + Math.max(1, columnCount) * ROW_HEIGHT;
377
- const computeDepths = (tables, edges) => {
378
- const targetsOf = /* @__PURE__ */ new Map();
379
- for (const table of tables) {
380
- targetsOf.set(table, []);
381
- }
382
- for (const edge of edges) {
383
- if (edge.to !== edge.from && targetsOf.has(edge.from) && targetsOf.has(edge.to)) {
384
- targetsOf.get(edge.from)?.push(edge.to);
385
- }
386
- }
387
- const depth = /* @__PURE__ */ new Map();
388
- const visiting = /* @__PURE__ */ new Set();
389
- const resolve = (table) => {
390
- const cached = depth.get(table);
391
- if (cached !== void 0) {
392
- return cached;
393
- }
394
- if (visiting.has(table)) {
395
- return 0;
396
- }
397
- visiting.add(table);
398
- let deepest = 0;
399
- for (const target of targetsOf.get(table) ?? []) {
400
- deepest = Math.max(deepest, resolve(target) + 1);
401
- }
402
- visiting.delete(table);
403
- depth.set(table, deepest);
404
- return deepest;
405
- };
406
- for (const table of tables) {
407
- resolve(table);
408
- }
409
- return depth;
410
- };
411
- const computeLayout = (tables, edges, columnCounts) => {
412
- const depth = computeDepths(tables, edges);
413
- const offsetByColumn = /* @__PURE__ */ new Map();
414
- const nodes = [];
415
- for (const name of tables) {
416
- const column = depth.get(name) ?? 0;
417
- const y = offsetByColumn.get(column) ?? PADDING;
418
- nodes.push({
419
- name,
420
- x: PADDING + column * (NODE_WIDTH + COLUMN_GAP),
421
- y
422
- });
423
- offsetByColumn.set(column, y + nodeHeight(columnCounts.get(name) ?? 0) + ROW_GAP);
424
- }
425
- return nodes;
426
- };
427
-
428
- const NODE_TYPES = {
429
- databaseSchema: DatabaseSchemaNode
430
- };
431
- const SHARD_DOT_STYLE = {
432
- backgroundColor: TIER_META.shard.color
433
- };
434
- const GLOBAL_DOT_STYLE = {
435
- backgroundColor: TIER_META.global.color
436
- };
437
- const ALL_TIERS = {
438
- global: true,
439
- shard: true
440
- };
441
- const pkColumnOf = (columns) => {
442
- const flagged = columns.find((column) => column.pk === true)?.name;
443
- if (flagged !== void 0) {
444
- return flagged;
445
- }
446
- if (columns.some((column) => column.name === "_id")) {
447
- return "_id";
448
- }
449
- if (columns.some((column) => column.name === "id")) {
450
- return "id";
451
- }
452
- return columns[0]?.name ?? "_id";
453
- };
454
- const deriveEdges = (tables) => tables.flatMap((table) => table.columns.filter((column) => column.ref !== void 0).map((column) => {
455
- return {
456
- column: column.name,
457
- from: table.name,
458
- to: column.ref
459
- };
460
- }));
461
- const buildNodes = (tables, columnsError) => {
462
- const names = tables.map((table) => table.name);
463
- const counts = new Map(tables.map((table) => [table.name, table.columns.length]));
464
- const positions = computeLayout(names, deriveEdges(tables), counts);
465
- const byName = new Map(tables.map((table) => [table.name, table]));
466
- return positions.flatMap(({
467
- name,
468
- x,
469
- y
470
- }) => {
471
- const table = byName.get(name);
472
- if (table === void 0) {
473
- return [];
474
- }
475
- return [{
476
- data: {
477
- columns: table.columns,
478
- label: name,
479
- loadError: columnsError,
480
- tier: table.tier
481
- },
482
- id: name,
483
- position: {
484
- x,
485
- y
486
- },
487
- type: "databaseSchema"
488
- }];
489
- });
490
- };
491
- const buildEdges = (tables) => {
492
- const columnsByTable = new Map(tables.map((table) => [table.name, table.columns]));
493
- return deriveEdges(tables).flatMap((edge) => {
494
- const targetColumns = columnsByTable.get(edge.to) ?? [];
495
- const sourceColumns = columnsByTable.get(edge.from) ?? [];
496
- const pk = pkColumnOf(targetColumns);
497
- if (!targetColumns.some((column) => column.name === pk) || !sourceColumns.some((column) => column.name === edge.column)) {
498
- return [];
499
- }
500
- return [{
501
- id: `${edge.from}.${edge.column}->${edge.to}`,
502
- source: edge.to,
503
- sourceHandle: pk,
504
- target: edge.from,
505
- targetHandle: edge.column
506
- }];
507
- });
508
- };
509
- const Legend = () => {
510
- const $ = c(15);
511
- const t = useT();
512
- let t0;
513
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
514
- t0 = /* @__PURE__ */ jsxDEV("span", {
515
- className: "flex items-center gap-1",
516
- children: [/* @__PURE__ */ jsxDEV("span", {
517
- "aria-hidden": "true",
518
- className: "size-1.5 rounded-full",
519
- style: SHARD_DOT_STYLE
520
- }, void 0, false), TIER_META.shard.label]
521
- }, void 0, true);
522
- $[0] = t0;
523
- } else {
524
- t0 = $[0];
525
- }
526
- let t1;
527
- if ($[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
528
- t1 = /* @__PURE__ */ jsxDEV("span", {
529
- className: "flex items-center gap-1",
530
- children: [/* @__PURE__ */ jsxDEV("span", {
531
- "aria-hidden": "true",
532
- className: "size-1.5 rounded-full",
533
- style: GLOBAL_DOT_STYLE
534
- }, void 0, false), TIER_META.global.label]
535
- }, void 0, true);
536
- $[1] = t1;
537
- } else {
538
- t1 = $[1];
539
- }
540
- let t2;
541
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
542
- t2 = /* @__PURE__ */ jsxDEV(Badge, {
543
- className: "px-1 py-0 text-[10px] leading-tight",
544
- variant: "secondary",
545
- children: "PK"
546
- }, void 0, false);
547
- $[2] = t2;
548
- } else {
549
- t2 = $[2];
550
- }
551
- let t3;
552
- if ($[3] !== t) {
553
- t3 = t("Primary key");
554
- $[3] = t;
555
- $[4] = t3;
556
- } else {
557
- t3 = $[4];
558
- }
559
- let t4;
560
- if ($[5] !== t3) {
561
- t4 = /* @__PURE__ */ jsxDEV("span", {
562
- className: "flex items-center gap-1",
563
- children: [t2, t3]
564
- }, void 0, true);
565
- $[5] = t3;
566
- $[6] = t4;
567
- } else {
568
- t4 = $[6];
569
- }
570
- let t5;
571
- if ($[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
572
- t5 = /* @__PURE__ */ jsxDEV(Badge, {
573
- className: "px-1 py-0 text-[10px] leading-tight",
574
- variant: "outline",
575
- children: "FK"
576
- }, void 0, false);
577
- $[7] = t5;
578
- } else {
579
- t5 = $[7];
580
- }
581
- let t6;
582
- if ($[8] !== t) {
583
- t6 = t("Foreign key");
584
- $[8] = t;
585
- $[9] = t6;
586
- } else {
587
- t6 = $[9];
588
- }
589
- let t7;
590
- if ($[10] !== t6) {
591
- t7 = /* @__PURE__ */ jsxDEV("span", {
592
- className: "flex items-center gap-1",
593
- children: [t5, t6]
594
- }, void 0, true);
595
- $[10] = t6;
596
- $[11] = t7;
597
- } else {
598
- t7 = $[11];
599
- }
600
- let t8;
601
- if ($[12] !== t4 || $[13] !== t7) {
602
- t8 = /* @__PURE__ */ jsxDEV("div", {
603
- className: "flex flex-wrap items-center gap-x-3 gap-y-1 rounded-xl border border-border bg-card/95 px-2.5 py-1.5 text-[11px] text-muted-foreground shadow-xs",
604
- children: [t0, t1, t4, t7]
605
- }, void 0, true);
606
- $[12] = t4;
607
- $[13] = t7;
608
- $[14] = t8;
609
- } else {
610
- t8 = $[14];
611
- }
612
- return t8;
613
- };
614
- const DiagramExportPanel = ({
615
- containerRef,
616
- testIdPrefix
617
- }) => {
618
- const t = useT();
619
- const nodes = useNodes();
620
- const {
621
- getEdges
622
- } = useReactFlow();
623
- const [exporting, setExporting] = useState(null);
624
- const handlePng = async () => {
625
- const viewport = containerRef.current?.querySelector(".react-flow__viewport");
626
- if (!viewport) {
627
- return;
628
- }
629
- setExporting("png");
630
- try {
631
- await exportDiagramAsPng(viewport, nodes, `${testIdPrefix}-schema-diagram.png`);
632
- } finally {
633
- setExporting(null);
634
- }
635
- };
636
- const handleSvg = async () => {
637
- const viewport_0 = containerRef.current?.querySelector(".react-flow__viewport");
638
- if (!viewport_0) {
639
- return;
640
- }
641
- setExporting("svg");
642
- try {
643
- await exportDiagramAsSvg(viewport_0, nodes, `${testIdPrefix}-schema-diagram.svg`);
644
- } finally {
645
- setExporting(null);
646
- }
647
- };
648
- const handleJson = () => {
649
- setExporting("json");
650
- try {
651
- exportDiagramAsJson(nodes, getEdges(), `${testIdPrefix}-schema-diagram.json`);
652
- } finally {
653
- setExporting(null);
654
- }
655
- };
656
- const onClickPng = () => {
657
- fireAndForget(handlePng());
658
- };
659
- const onClickSvg = () => {
660
- fireAndForget(handleSvg());
661
- };
662
- return /* @__PURE__ */ jsxDEV(Panel, {
663
- position: "top-right",
664
- children: /* @__PURE__ */ jsxDEV(DropdownMenu, {
665
- children: [/* @__PURE__ */ jsxDEV(DropdownMenuTrigger, {
666
- className: "group/button inline-flex shrink-0 cursor-pointer items-center justify-center gap-1 rounded-md border border-border bg-background px-2 text-xs font-medium whitespace-nowrap hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
667
- "data-testid": `${testIdPrefix}-export-trigger`,
668
- disabled: exporting !== null,
669
- children: [/* @__PURE__ */ jsxDEV(HugeiconsIcon, {
670
- className: "size-3.5",
671
- icon: Download01Icon,
672
- strokeWidth: 2
673
- }, void 0, false), t("Export")]
674
- }, void 0, true), /* @__PURE__ */ jsxDEV(DropdownMenuContent, {
675
- align: "end",
676
- children: [/* @__PURE__ */ jsxDEV(DropdownMenuItem, {
677
- "data-testid": `${testIdPrefix}-export-png`,
678
- disabled: exporting !== null,
679
- onClick: onClickPng,
680
- children: t("PNG")
681
- }, void 0, false), /* @__PURE__ */ jsxDEV(DropdownMenuItem, {
682
- "data-testid": `${testIdPrefix}-export-svg`,
683
- disabled: exporting !== null,
684
- onClick: onClickSvg,
685
- children: t("SVG")
686
- }, void 0, false), /* @__PURE__ */ jsxDEV(DropdownMenuItem, {
687
- "data-testid": `${testIdPrefix}-export-json`,
688
- disabled: exporting !== null,
689
- onClick: handleJson,
690
- children: t("JSON")
691
- }, void 0, false)]
692
- }, void 0, true)]
693
- }, void 0, true)
694
- }, void 0, false);
695
- };
696
- const SchemaDiagram = (t0) => {
697
- const $ = c(75);
698
- const {
699
- columnsError,
700
- tables,
701
- testIdPrefix
702
- } = t0;
703
- const t = useT();
704
- const [tierFilter, setTierFilter] = useState(ALL_TIERS);
705
- const [query, setQuery] = useState("");
706
- let t1;
707
- if ($[0] !== query || $[1] !== tables || $[2] !== tierFilter) {
708
- const needle = query.trim().toLowerCase();
709
- t1 = tables.filter((table) => tierFilter[table.tier] && table.name.toLowerCase().includes(needle));
710
- $[0] = query;
711
- $[1] = tables;
712
- $[2] = tierFilter;
713
- $[3] = t1;
714
- } else {
715
- t1 = $[3];
716
- }
717
- const visibleTables = t1;
718
- const t2 = columnsError ?? false;
719
- let t3;
720
- if ($[4] !== t2 || $[5] !== visibleTables) {
721
- t3 = buildNodes(visibleTables, t2);
722
- $[4] = t2;
723
- $[5] = visibleTables;
724
- $[6] = t3;
725
- } else {
726
- t3 = $[6];
727
- }
728
- const seededNodes = t3;
729
- let t4;
730
- if ($[7] !== visibleTables) {
731
- t4 = buildEdges(visibleTables);
732
- $[7] = visibleTables;
733
- $[8] = t4;
734
- } else {
735
- t4 = $[8];
736
- }
737
- const seededEdges = t4;
738
- const [nodes, setNodes, onNodesChange] = useNodesState(seededNodes);
739
- const [flowEdges, setEdges, onEdgesChange] = useEdgesState(seededEdges);
740
- const canvasRef = useRef(null);
741
- let t5;
742
- let t6;
743
- if ($[9] !== seededNodes || $[10] !== setNodes) {
744
- t5 = () => {
745
- setNodes(seededNodes);
746
- };
747
- t6 = [seededNodes, setNodes];
748
- $[9] = seededNodes;
749
- $[10] = setNodes;
750
- $[11] = t5;
751
- $[12] = t6;
752
- } else {
753
- t5 = $[11];
754
- t6 = $[12];
755
- }
756
- useEffect(t5, t6);
757
- let t7;
758
- let t8;
759
- if ($[13] !== seededEdges || $[14] !== setEdges) {
760
- t7 = () => {
761
- setEdges(seededEdges);
762
- };
763
- t8 = [seededEdges, setEdges];
764
- $[13] = seededEdges;
765
- $[14] = setEdges;
766
- $[15] = t7;
767
- $[16] = t8;
768
- } else {
769
- t7 = $[15];
770
- t8 = $[16];
771
- }
772
- useEffect(t7, t8);
773
- let t9;
774
- if ($[17] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
775
- t9 = (event) => {
776
- setQuery(event.target.value);
777
- };
778
- $[17] = t9;
779
- } else {
780
- t9 = $[17];
781
- }
782
- const onQueryChange = t9;
783
- let t10;
784
- if ($[18] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
785
- t10 = () => {
786
- setTierFilter(_temp$1);
787
- };
788
- $[18] = t10;
789
- } else {
790
- t10 = $[18];
791
- }
792
- const toggleShard = t10;
793
- let t11;
794
- if ($[19] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
795
- t11 = () => {
796
- setTierFilter(_temp2$1);
797
- };
798
- $[19] = t11;
799
- } else {
800
- t11 = $[19];
801
- }
802
- const toggleGlobal = t11;
803
- if (tables.length === 0) {
804
- const t122 = `${testIdPrefix}-section`;
805
- const t132 = `${testIdPrefix}-empty`;
806
- let t142;
807
- if ($[20] !== t) {
808
- t142 = t("No tables to graph.");
809
- $[20] = t;
810
- $[21] = t142;
811
- } else {
812
- t142 = $[21];
813
- }
814
- let t152;
815
- if ($[22] !== t132 || $[23] !== t142) {
816
- t152 = /* @__PURE__ */ jsxDEV("p", {
817
- className: "text-sm text-muted-foreground",
818
- "data-testid": t132,
819
- children: t142
820
- }, void 0, false);
821
- $[22] = t132;
822
- $[23] = t142;
823
- $[24] = t152;
824
- } else {
825
- t152 = $[24];
826
- }
827
- let t162;
828
- if ($[25] !== t122 || $[26] !== t152) {
829
- t162 = /* @__PURE__ */ jsxDEV("section", {
830
- className: "flex flex-col gap-2",
831
- "data-testid": t122,
832
- children: t152
833
- }, void 0, false);
834
- $[25] = t122;
835
- $[26] = t152;
836
- $[27] = t162;
837
- } else {
838
- t162 = $[27];
839
- }
840
- return t162;
841
- }
842
- const t12 = `${testIdPrefix}-section`;
843
- const t13 = `${testIdPrefix}-canvas`;
844
- let t14;
845
- if ($[28] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
846
- t14 = /* @__PURE__ */ jsxDEV(Background, {}, void 0, false);
847
- $[28] = t14;
848
- } else {
849
- t14 = $[28];
850
- }
851
- let t15;
852
- if ($[29] !== t) {
853
- t15 = t("Find table…");
854
- $[29] = t;
855
- $[30] = t15;
856
- } else {
857
- t15 = $[30];
858
- }
859
- const t16 = `${testIdPrefix}-find`;
860
- let t17;
861
- if ($[31] !== t) {
862
- t17 = t("Find table…");
863
- $[31] = t;
864
- $[32] = t17;
865
- } else {
866
- t17 = $[32];
867
- }
868
- let t18;
869
- if ($[33] !== query || $[34] !== t15 || $[35] !== t16 || $[36] !== t17) {
870
- t18 = /* @__PURE__ */ jsxDEV(Input, {
871
- "aria-label": t15,
872
- className: "h-7 w-44 text-xs",
873
- "data-testid": t16,
874
- onChange: onQueryChange,
875
- placeholder: t17,
876
- value: query
877
- }, void 0, false);
878
- $[33] = query;
879
- $[34] = t15;
880
- $[35] = t16;
881
- $[36] = t17;
882
- $[37] = t18;
883
- } else {
884
- t18 = $[37];
885
- }
886
- let t19;
887
- if ($[38] !== t) {
888
- t19 = t("Storage tiers");
889
- $[38] = t;
890
- $[39] = t19;
891
- } else {
892
- t19 = $[39];
893
- }
894
- const t20 = `${testIdPrefix}-tier-shard`;
895
- const t21 = tierFilter.shard ? "default" : "outline";
896
- let t22;
897
- if ($[40] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
898
- t22 = /* @__PURE__ */ jsxDEV("span", {
899
- "aria-hidden": "true",
900
- className: "size-1.5 rounded-full",
901
- style: SHARD_DOT_STYLE
902
- }, void 0, false);
903
- $[40] = t22;
904
- } else {
905
- t22 = $[40];
906
- }
907
- let t23;
908
- if ($[41] !== t20 || $[42] !== t21 || $[43] !== tierFilter.shard) {
909
- t23 = /* @__PURE__ */ jsxDEV(Button, {
910
- "aria-pressed": tierFilter.shard,
911
- className: "gap-1.5",
912
- "data-testid": t20,
913
- onClick: toggleShard,
914
- size: "xs",
915
- type: "button",
916
- variant: t21,
917
- children: [t22, TIER_META.shard.label]
918
- }, void 0, true);
919
- $[41] = t20;
920
- $[42] = t21;
921
- $[43] = tierFilter.shard;
922
- $[44] = t23;
923
- } else {
924
- t23 = $[44];
925
- }
926
- const t24 = `${testIdPrefix}-tier-global`;
927
- const t25 = tierFilter.global ? "default" : "outline";
928
- let t26;
929
- if ($[45] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
930
- t26 = /* @__PURE__ */ jsxDEV("span", {
931
- "aria-hidden": "true",
932
- className: "size-1.5 rounded-full",
933
- style: GLOBAL_DOT_STYLE
934
- }, void 0, false);
935
- $[45] = t26;
936
- } else {
937
- t26 = $[45];
938
- }
939
- let t27;
940
- if ($[46] !== t24 || $[47] !== t25 || $[48] !== tierFilter.global) {
941
- t27 = /* @__PURE__ */ jsxDEV(Button, {
942
- "aria-pressed": tierFilter.global,
943
- className: "gap-1.5",
944
- "data-testid": t24,
945
- onClick: toggleGlobal,
946
- size: "xs",
947
- type: "button",
948
- variant: t25,
949
- children: [t26, TIER_META.global.label]
950
- }, void 0, true);
951
- $[46] = t24;
952
- $[47] = t25;
953
- $[48] = tierFilter.global;
954
- $[49] = t27;
955
- } else {
956
- t27 = $[49];
957
- }
958
- let t28;
959
- if ($[50] !== t19 || $[51] !== t23 || $[52] !== t27) {
960
- t28 = /* @__PURE__ */ jsxDEV("div", {
961
- "aria-label": t19,
962
- className: "flex items-center gap-1.5",
963
- role: "group",
964
- children: [t23, t27]
965
- }, void 0, true);
966
- $[50] = t19;
967
- $[51] = t23;
968
- $[52] = t27;
969
- $[53] = t28;
970
- } else {
971
- t28 = $[53];
972
- }
973
- let t29;
974
- if ($[54] !== t18 || $[55] !== t28) {
975
- t29 = /* @__PURE__ */ jsxDEV(Panel, {
976
- position: "top-left",
977
- children: /* @__PURE__ */ jsxDEV("div", {
978
- className: "flex flex-col gap-2 rounded-xl border border-border bg-card/95 p-2 shadow-xs",
979
- children: [t18, t28]
980
- }, void 0, true)
981
- }, void 0, false);
982
- $[54] = t18;
983
- $[55] = t28;
984
- $[56] = t29;
985
- } else {
986
- t29 = $[56];
987
- }
988
- let t30;
989
- let t31;
990
- let t32;
991
- if ($[57] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
992
- t30 = /* @__PURE__ */ jsxDEV(Panel, {
993
- position: "bottom-left",
994
- children: /* @__PURE__ */ jsxDEV(Legend, {}, void 0, false)
995
- }, void 0, false);
996
- t31 = /* @__PURE__ */ jsxDEV(Controls, {
997
- showInteractive: false
998
- }, void 0, false);
999
- t32 = /* @__PURE__ */ jsxDEV(MiniMap, {
1000
- pannable: true,
1001
- zoomable: true
1002
- }, void 0, false);
1003
- $[57] = t30;
1004
- $[58] = t31;
1005
- $[59] = t32;
1006
- } else {
1007
- t30 = $[57];
1008
- t31 = $[58];
1009
- t32 = $[59];
1010
- }
1011
- let t33;
1012
- if ($[60] !== testIdPrefix) {
1013
- t33 = /* @__PURE__ */ jsxDEV(DiagramExportPanel, {
1014
- containerRef: canvasRef,
1015
- testIdPrefix
1016
- }, void 0, false);
1017
- $[60] = testIdPrefix;
1018
- $[61] = t33;
1019
- } else {
1020
- t33 = $[61];
1021
- }
1022
- let t34;
1023
- if ($[62] !== flowEdges || $[63] !== nodes || $[64] !== onEdgesChange || $[65] !== onNodesChange || $[66] !== t29 || $[67] !== t33) {
1024
- t34 = /* @__PURE__ */ jsxDEV(ReactFlow, {
1025
- edges: flowEdges,
1026
- elementsSelectable: true,
1027
- fitView: true,
1028
- minZoom: 0.2,
1029
- nodes,
1030
- nodesConnectable: false,
1031
- nodeTypes: NODE_TYPES,
1032
- onEdgesChange,
1033
- onNodesChange,
1034
- children: [t14, t29, t30, t31, t32, t33]
1035
- }, void 0, true);
1036
- $[62] = flowEdges;
1037
- $[63] = nodes;
1038
- $[64] = onEdgesChange;
1039
- $[65] = onNodesChange;
1040
- $[66] = t29;
1041
- $[67] = t33;
1042
- $[68] = t34;
1043
- } else {
1044
- t34 = $[68];
1045
- }
1046
- let t35;
1047
- if ($[69] !== t13 || $[70] !== t34) {
1048
- t35 = /* @__PURE__ */ jsxDEV("div", {
1049
- className: "h-[560px] w-full overflow-hidden rounded-xl border border-border bg-muted/20 shadow-xs",
1050
- "data-testid": t13,
1051
- ref: canvasRef,
1052
- children: t34
1053
- }, void 0, false);
1054
- $[69] = t13;
1055
- $[70] = t34;
1056
- $[71] = t35;
1057
- } else {
1058
- t35 = $[71];
1059
- }
1060
- let t36;
1061
- if ($[72] !== t12 || $[73] !== t35) {
1062
- t36 = /* @__PURE__ */ jsxDEV("section", {
1063
- className: "flex flex-col gap-2",
1064
- "data-testid": t12,
1065
- children: t35
1066
- }, void 0, false);
1067
- $[72] = t12;
1068
- $[73] = t35;
1069
- $[74] = t36;
1070
- } else {
1071
- t36 = $[74];
1072
- }
1073
- return t36;
1074
- };
1075
- function _temp$1(previous) {
1076
- return {
1077
- ...previous,
1078
- shard: !previous.shard
1079
- };
1080
- }
1081
- function _temp2$1(previous_0) {
1082
- return {
1083
- ...previous_0,
1084
- global: !previous_0.global
1085
- };
1086
- }
1087
-
1088
- const SCHEMA_EDIT_ENDPOINT = "/__lunora/schema-edit";
1089
- const applyEdit = async (edit) => {
1090
- const response = await fetch(SCHEMA_EDIT_ENDPOINT, {
1091
- body: JSON.stringify(edit),
1092
- // `Content-Type: application/json` is non-simple and forces a CORS preflight
1093
- // for cross-origin fetches, preventing CSRF via the browser's same-origin
1094
- // policy. `X-Lunora-Studio` is an additional custom header that also triggers
1095
- // a preflight and lets the server-side guard identify studio traffic; both
1096
- // headers are checked by the `@lunora/config` `csrfRejectionReason` guard.
1097
- headers: {
1098
- "Content-Type": "application/json",
1099
- "X-Lunora-Studio": "1"
1100
- },
1101
- method: "POST"
1102
- });
1103
- const body = await response.json();
1104
- if (body.needsMigration === true) {
1105
- return {
1106
- kind: "needs-migration",
1107
- message: body.message ?? "This edit needs a migration."
1108
- };
1109
- }
1110
- if (response.ok && body.tables !== void 0) {
1111
- return {
1112
- diagnostics: body.diagnostics ?? [],
1113
- kind: "ok",
1114
- tables: body.tables
1115
- };
1116
- }
1117
- return {
1118
- kind: "error",
1119
- message: body.error ?? `schema edit failed (${String(response.status)})`
1120
- };
1121
- };
1122
-
1123
- const COLUMN_TYPES = [{
1124
- label: "string",
1125
- validator: "v.string()"
1126
- }, {
1127
- label: "number",
1128
- validator: "v.number()"
1129
- }, {
1130
- label: "boolean",
1131
- validator: "v.boolean()"
1132
- }, {
1133
- label: "bigint",
1134
- validator: "v.int64()"
1135
- }, {
1136
- label: "bytes",
1137
- validator: "v.bytes()"
1138
- }, {
1139
- label: "any",
1140
- validator: "v.any()"
1141
- }];
1142
- const DEFAULT_VALIDATOR = "v.string()";
1143
- const splitFields = (raw) => raw.split(",").map((field) => field.trim()).filter((field) => field !== "");
1144
- const SchemaEditorOverlay = ({
1145
- onApplied,
1146
- tableNames
1147
- }) => {
1148
- const t = useT();
1149
- const navigate = useNavigate();
1150
- const [mode, setMode] = useState(null);
1151
- const [busy, setBusy] = useState(false);
1152
- const [result, setResult] = useState(null);
1153
- const [tableName, setTableName] = useState("");
1154
- const [columnName, setColumnName] = useState("");
1155
- const [validator, setValidator] = useState(DEFAULT_VALIDATOR);
1156
- const [targetTable, setTargetTable] = useState(tableNames[0] ?? "");
1157
- const [indexName, setIndexName] = useState("");
1158
- const [indexFields, setIndexFields] = useState("");
1159
- const [unique, setUnique] = useState(false);
1160
- const reset = () => {
1161
- setMode(null);
1162
- setTableName("");
1163
- setColumnName("");
1164
- setIndexName("");
1165
- setIndexFields("");
1166
- setUnique(false);
1167
- };
1168
- const submit = async (edit) => {
1169
- setBusy(true);
1170
- setResult(null);
1171
- try {
1172
- const outcome = await applyEdit(edit);
1173
- setResult(outcome);
1174
- if (outcome.kind === "ok") {
1175
- onApplied(outcome.tables);
1176
- reset();
1177
- }
1178
- } catch (error) {
1179
- setResult({
1180
- kind: "error",
1181
- message: error instanceof Error ? error.message : String(error)
1182
- });
1183
- } finally {
1184
- setBusy(false);
1185
- }
1186
- };
1187
- const onSubmitTable = () => {
1188
- fireAndForget(submit({
1189
- kind: "addTable",
1190
- table: tableName.trim()
1191
- }));
1192
- };
1193
- const onSubmitColumn = () => {
1194
- fireAndForget(submit({
1195
- column: columnName.trim(),
1196
- kind: "addOptionalColumn",
1197
- table: targetTable,
1198
- validator
1199
- }));
1200
- };
1201
- const onSubmitIndex = () => {
1202
- fireAndForget(submit({
1203
- fields: splitFields(indexFields),
1204
- kind: "addIndex",
1205
- name: indexName.trim(),
1206
- table: targetTable,
1207
- unique
1208
- }));
1209
- };
1210
- const openTable = () => {
1211
- setResult(null);
1212
- setMode("addTable");
1213
- };
1214
- const openColumn = () => {
1215
- setResult(null);
1216
- setMode("addColumn");
1217
- };
1218
- const openIndex = () => {
1219
- setResult(null);
1220
- setMode("addIndex");
1221
- };
1222
- const openDestructive = () => {
1223
- setMode("destructive");
1224
- setResult({
1225
- kind: "needs-migration",
1226
- message: t("This edit changes stored data and must go through a migration. Review the migration before applying.")
1227
- });
1228
- };
1229
- const onTableNameChange = (event) => {
1230
- setTableName(event.target.value);
1231
- };
1232
- const onColumnNameChange = (event_0) => {
1233
- setColumnName(event_0.target.value);
1234
- };
1235
- const onValidatorChange = (event_1) => {
1236
- setValidator(event_1.target.value);
1237
- };
1238
- const onTargetTableChange = (event_2) => {
1239
- setTargetTable(event_2.target.value);
1240
- };
1241
- const onIndexNameChange = (event_3) => {
1242
- setIndexName(event_3.target.value);
1243
- };
1244
- const onIndexFieldsChange = (event_4) => {
1245
- setIndexFields(event_4.target.value);
1246
- };
1247
- const onUniqueChange = (event_5) => {
1248
- setUnique(event_5.target.checked);
1249
- };
1250
- const onOpenMigrations = () => {
1251
- fireAndForget(navigate({
1252
- to: "/migrations"
1253
- }));
1254
- };
1255
- return /* @__PURE__ */ jsxDEV(Card, {
1256
- "data-testid": "sc-editor",
1257
- size: "sm",
1258
- children: [/* @__PURE__ */ jsxDEV(CardHeader, {
1259
- children: [/* @__PURE__ */ jsxDEV(CardTitle, {
1260
- children: t("Edit schema")
1261
- }, void 0, false), /* @__PURE__ */ jsxDEV(CardDescription, {
1262
- children: t("Adds a table, column, or index to lunora/schema.ts and reruns codegen.")
1263
- }, void 0, false)]
1264
- }, void 0, true), /* @__PURE__ */ jsxDEV(CardContent, {
1265
- children: [/* @__PURE__ */ jsxDEV("div", {
1266
- className: "flex flex-wrap gap-2",
1267
- children: [/* @__PURE__ */ jsxDEV(Button, {
1268
- "data-testid": "sc-editor-add-table",
1269
- onClick: openTable,
1270
- size: "xs",
1271
- type: "button",
1272
- variant: mode === "addTable" ? "default" : "outline",
1273
- children: t("Add table")
1274
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1275
- "data-testid": "sc-editor-add-column",
1276
- disabled: tableNames.length === 0,
1277
- onClick: openColumn,
1278
- size: "xs",
1279
- type: "button",
1280
- variant: mode === "addColumn" ? "default" : "outline",
1281
- children: t("Add column")
1282
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1283
- "data-testid": "sc-editor-add-index",
1284
- disabled: tableNames.length === 0,
1285
- onClick: openIndex,
1286
- size: "xs",
1287
- type: "button",
1288
- variant: mode === "addIndex" ? "default" : "outline",
1289
- children: t("Add index")
1290
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1291
- "data-testid": "sc-editor-destructive",
1292
- disabled: tableNames.length === 0,
1293
- onClick: openDestructive,
1294
- size: "xs",
1295
- type: "button",
1296
- variant: mode === "destructive" ? "default" : "ghost",
1297
- children: t("Rename / drop / change type…")
1298
- }, void 0, false)]
1299
- }, void 0, true), mode === "addTable" && /* @__PURE__ */ jsxDEV("div", {
1300
- className: "mt-3 flex flex-wrap items-end gap-2",
1301
- "data-testid": "sc-editor-table-form",
1302
- children: [/* @__PURE__ */ jsxDEV("div", {
1303
- className: "flex flex-col gap-1 text-xs",
1304
- children: [/* @__PURE__ */ jsxDEV(Label, {
1305
- htmlFor: "sc-editor-table-name",
1306
- children: t("Table name")
1307
- }, void 0, false), /* @__PURE__ */ jsxDEV(Input, {
1308
- "data-testid": "sc-editor-table-name",
1309
- id: "sc-editor-table-name",
1310
- onChange: onTableNameChange,
1311
- value: tableName
1312
- }, void 0, false)]
1313
- }, void 0, true), /* @__PURE__ */ jsxDEV(Button, {
1314
- "data-testid": "sc-editor-table-apply",
1315
- disabled: busy || tableName.trim() === "",
1316
- onClick: onSubmitTable,
1317
- size: "xs",
1318
- type: "button",
1319
- children: busy ? t("Applying…") : t("Apply")
1320
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1321
- onClick: reset,
1322
- size: "xs",
1323
- type: "button",
1324
- variant: "ghost",
1325
- children: t("Cancel")
1326
- }, void 0, false)]
1327
- }, void 0, true), mode === "addColumn" && /* @__PURE__ */ jsxDEV("div", {
1328
- className: "mt-3 flex flex-wrap items-end gap-2",
1329
- "data-testid": "sc-editor-column-form",
1330
- children: [/* @__PURE__ */ jsxDEV("div", {
1331
- className: "flex flex-col gap-1 text-xs",
1332
- children: [/* @__PURE__ */ jsxDEV(Label, {
1333
- htmlFor: "sc-editor-column-table",
1334
- children: t("Table name")
1335
- }, void 0, false), /* @__PURE__ */ jsxDEV("select", {
1336
- className: "h-8 rounded-md border border-input bg-transparent px-2 text-xs",
1337
- "data-testid": "sc-editor-column-table",
1338
- id: "sc-editor-column-table",
1339
- onChange: onTargetTableChange,
1340
- value: targetTable,
1341
- children: tableNames.map((name) => /* @__PURE__ */ jsxDEV("option", {
1342
- value: name,
1343
- children: name
1344
- }, name, false))
1345
- }, void 0, false)]
1346
- }, void 0, true), /* @__PURE__ */ jsxDEV("div", {
1347
- className: "flex flex-col gap-1 text-xs",
1348
- children: [/* @__PURE__ */ jsxDEV(Label, {
1349
- htmlFor: "sc-editor-column-name",
1350
- children: t("Column name")
1351
- }, void 0, false), /* @__PURE__ */ jsxDEV(Input, {
1352
- "data-testid": "sc-editor-column-name",
1353
- id: "sc-editor-column-name",
1354
- onChange: onColumnNameChange,
1355
- value: columnName
1356
- }, void 0, false)]
1357
- }, void 0, true), /* @__PURE__ */ jsxDEV("div", {
1358
- className: "flex flex-col gap-1 text-xs",
1359
- children: [/* @__PURE__ */ jsxDEV(Label, {
1360
- htmlFor: "sc-editor-column-type",
1361
- children: t("Column type")
1362
- }, void 0, false), /* @__PURE__ */ jsxDEV("select", {
1363
- className: "h-8 rounded-md border border-input bg-transparent px-2 text-xs",
1364
- "data-testid": "sc-editor-column-type",
1365
- id: "sc-editor-column-type",
1366
- onChange: onValidatorChange,
1367
- value: validator,
1368
- children: COLUMN_TYPES.map((type) => /* @__PURE__ */ jsxDEV("option", {
1369
- value: type.validator,
1370
- children: type.label
1371
- }, type.validator, false))
1372
- }, void 0, false)]
1373
- }, void 0, true), /* @__PURE__ */ jsxDEV("span", {
1374
- className: "text-[11px] text-muted-foreground",
1375
- children: t("Optional")
1376
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1377
- "data-testid": "sc-editor-column-apply",
1378
- disabled: busy || columnName.trim() === "" || targetTable === "",
1379
- onClick: onSubmitColumn,
1380
- size: "xs",
1381
- type: "button",
1382
- children: busy ? t("Applying…") : t("Apply")
1383
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1384
- onClick: reset,
1385
- size: "xs",
1386
- type: "button",
1387
- variant: "ghost",
1388
- children: t("Cancel")
1389
- }, void 0, false)]
1390
- }, void 0, true), mode === "addIndex" && /* @__PURE__ */ jsxDEV("div", {
1391
- className: "mt-3 flex flex-wrap items-end gap-2",
1392
- "data-testid": "sc-editor-index-form",
1393
- children: [/* @__PURE__ */ jsxDEV("div", {
1394
- className: "flex flex-col gap-1 text-xs",
1395
- children: [/* @__PURE__ */ jsxDEV(Label, {
1396
- htmlFor: "sc-editor-index-table",
1397
- children: t("Table name")
1398
- }, void 0, false), /* @__PURE__ */ jsxDEV("select", {
1399
- className: "h-8 rounded-md border border-input bg-transparent px-2 text-xs",
1400
- "data-testid": "sc-editor-index-table",
1401
- id: "sc-editor-index-table",
1402
- onChange: onTargetTableChange,
1403
- value: targetTable,
1404
- children: tableNames.map((name_0) => /* @__PURE__ */ jsxDEV("option", {
1405
- value: name_0,
1406
- children: name_0
1407
- }, name_0, false))
1408
- }, void 0, false)]
1409
- }, void 0, true), /* @__PURE__ */ jsxDEV("div", {
1410
- className: "flex flex-col gap-1 text-xs",
1411
- children: [/* @__PURE__ */ jsxDEV(Label, {
1412
- htmlFor: "sc-editor-index-name",
1413
- children: t("Index name")
1414
- }, void 0, false), /* @__PURE__ */ jsxDEV(Input, {
1415
- "data-testid": "sc-editor-index-name",
1416
- id: "sc-editor-index-name",
1417
- onChange: onIndexNameChange,
1418
- value: indexName
1419
- }, void 0, false)]
1420
- }, void 0, true), /* @__PURE__ */ jsxDEV("div", {
1421
- className: "flex flex-col gap-1 text-xs",
1422
- children: [/* @__PURE__ */ jsxDEV(Label, {
1423
- htmlFor: "sc-editor-index-fields",
1424
- children: t("Index fields (comma-separated)")
1425
- }, void 0, false), /* @__PURE__ */ jsxDEV(Input, {
1426
- "data-testid": "sc-editor-index-fields",
1427
- id: "sc-editor-index-fields",
1428
- onChange: onIndexFieldsChange,
1429
- value: indexFields
1430
- }, void 0, false)]
1431
- }, void 0, true), /* @__PURE__ */ jsxDEV(Label, {
1432
- className: "flex items-center gap-1 text-xs",
1433
- htmlFor: "sc-editor-index-unique",
1434
- children: [/* @__PURE__ */ jsxDEV("input", {
1435
- checked: unique,
1436
- "data-testid": "sc-editor-index-unique",
1437
- id: "sc-editor-index-unique",
1438
- onChange: onUniqueChange,
1439
- type: "checkbox"
1440
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
1441
- className: "text-muted-foreground",
1442
- children: t("Unique")
1443
- }, void 0, false)]
1444
- }, void 0, true), /* @__PURE__ */ jsxDEV(Button, {
1445
- "data-testid": "sc-editor-index-apply",
1446
- disabled: busy || indexName.trim() === "" || indexFields.trim() === "",
1447
- onClick: onSubmitIndex,
1448
- size: "xs",
1449
- type: "button",
1450
- children: busy ? t("Applying…") : t("Apply")
1451
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1452
- onClick: reset,
1453
- size: "xs",
1454
- type: "button",
1455
- variant: "ghost",
1456
- children: t("Cancel")
1457
- }, void 0, false)]
1458
- }, void 0, true), result?.kind === "error" && /* @__PURE__ */ jsxDEV("p", {
1459
- className: "mt-3 text-sm text-destructive",
1460
- "data-testid": "sc-editor-error",
1461
- role: "alert",
1462
- children: result.message
1463
- }, void 0, false), result?.kind === "needs-migration" && /* @__PURE__ */ jsxDEV("div", {
1464
- className: "mt-3 flex flex-col gap-2",
1465
- "data-testid": "sc-editor-needs-migration",
1466
- children: [/* @__PURE__ */ jsxDEV("p", {
1467
- className: "text-sm text-warning",
1468
- role: "alert",
1469
- children: t("This edit changes stored data and must go through a migration. Review the migration before applying.")
1470
- }, void 0, false), /* @__PURE__ */ jsxDEV(Button, {
1471
- className: "self-start",
1472
- "data-testid": "sc-editor-open-migrations",
1473
- onClick: onOpenMigrations,
1474
- size: "xs",
1475
- type: "button",
1476
- variant: "outline",
1477
- children: t("Open Migrations")
1478
- }, void 0, false)]
1479
- }, void 0, true), result?.kind === "ok" && result.diagnostics.length > 0 && /* @__PURE__ */ jsxDEV("div", {
1480
- className: "mt-3 flex flex-col gap-1",
1481
- "data-testid": "sc-editor-diagnostics",
1482
- children: [/* @__PURE__ */ jsxDEV("p", {
1483
- className: "text-sm text-destructive",
1484
- role: "alert",
1485
- children: t("Codegen reported diagnostics:")
1486
- }, void 0, false), /* @__PURE__ */ jsxDEV("ul", {
1487
- className: "flex flex-col gap-0.5",
1488
- children: result.diagnostics.map((diagnostic) => /* @__PURE__ */ jsxDEV("li", {
1489
- className: "font-mono text-[11px] text-destructive",
1490
- children: diagnostic
1491
- }, diagnostic, false))
1492
- }, void 0, false)]
1493
- }, void 0, true)]
1494
- }, void 0, true)]
1495
- }, void 0, true);
1496
- };
1497
-
1498
- const LIST_TABLES = adminRef(ADMIN_FUNCTIONS.listTables);
1499
- const LIST_TABLE_INDEXES = adminRef(ADMIN_FUNCTIONS.listTableIndexes);
1500
- const READ_TABLE_PAGE = adminRef(ADMIN_FUNCTIONS.readTablePage);
1501
- const DESCRIBE_TABLES = adminRef(ADMIN_FUNCTIONS.describeTables);
1502
- const EMPTY_COLUMNS = {};
1503
- const EMPTY_COLUMN_NAMES = [];
1504
- const EMPTY_COLUMN_META = [];
1505
- const ChevronIcon = (t0) => {
1506
- const $ = c(5);
1507
- const {
1508
- open
1509
- } = t0;
1510
- const t1 = open && "rotate-90";
1511
- let t2;
1512
- if ($[0] !== t1) {
1513
- t2 = cn("size-3.5 shrink-0 text-muted-foreground transition-transform duration-150", t1);
1514
- $[0] = t1;
1515
- $[1] = t2;
1516
- } else {
1517
- t2 = $[1];
1518
- }
1519
- let t3;
1520
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1521
- t3 = /* @__PURE__ */ jsxDEV("path", {
1522
- d: "m9 6 6 6-6 6"
1523
- }, void 0, false);
1524
- $[2] = t3;
1525
- } else {
1526
- t3 = $[2];
1527
- }
1528
- let t4;
1529
- if ($[3] !== t2) {
1530
- t4 = /* @__PURE__ */ jsxDEV("svg", {
1531
- "aria-hidden": "true",
1532
- className: t2,
1533
- fill: "none",
1534
- stroke: "currentColor",
1535
- strokeLinecap: "round",
1536
- strokeLinejoin: "round",
1537
- strokeWidth: 1.8,
1538
- viewBox: "0 0 24 24",
1539
- children: t3
1540
- }, void 0, false);
1541
- $[3] = t2;
1542
- $[4] = t4;
1543
- } else {
1544
- t4 = $[4];
1545
- }
1546
- return t4;
1547
- };
1548
- const TableEntry = (t0) => {
1549
- const $ = c(20);
1550
- const {
1551
- children,
1552
- expanded,
1553
- name,
1554
- onToggle,
1555
- rowCount,
1556
- rowTestId,
1557
- toggleTestId
1558
- } = t0;
1559
- let t1;
1560
- if ($[0] !== expanded) {
1561
- t1 = /* @__PURE__ */ jsxDEV(ChevronIcon, {
1562
- open: expanded
1563
- }, void 0, false);
1564
- $[0] = expanded;
1565
- $[1] = t1;
1566
- } else {
1567
- t1 = $[1];
1568
- }
1569
- let t2;
1570
- if ($[2] !== name) {
1571
- t2 = /* @__PURE__ */ jsxDEV("span", {
1572
- className: "truncate font-mono text-xs text-foreground",
1573
- title: name,
1574
- children: name
1575
- }, void 0, false);
1576
- $[2] = name;
1577
- $[3] = t2;
1578
- } else {
1579
- t2 = $[3];
1580
- }
1581
- let t3;
1582
- if ($[4] !== rowCount) {
1583
- t3 = /* @__PURE__ */ jsxDEV("span", {
1584
- className: "ms-auto shrink-0 text-xs text-muted-foreground tabular-nums",
1585
- children: ["(", rowCount, ")"]
1586
- }, void 0, true);
1587
- $[4] = rowCount;
1588
- $[5] = t3;
1589
- } else {
1590
- t3 = $[5];
1591
- }
1592
- let t4;
1593
- if ($[6] !== expanded || $[7] !== onToggle || $[8] !== t1 || $[9] !== t2 || $[10] !== t3 || $[11] !== toggleTestId) {
1594
- t4 = /* @__PURE__ */ jsxDEV("button", {
1595
- "aria-expanded": expanded,
1596
- className: "flex w-full items-center gap-2 px-3 py-2 text-start transition-colors hover:bg-muted/50 aria-expanded:bg-muted/40",
1597
- "data-testid": toggleTestId,
1598
- onClick: onToggle,
1599
- type: "button",
1600
- children: [t1, t2, " ", t3]
1601
- }, void 0, true);
1602
- $[6] = expanded;
1603
- $[7] = onToggle;
1604
- $[8] = t1;
1605
- $[9] = t2;
1606
- $[10] = t3;
1607
- $[11] = toggleTestId;
1608
- $[12] = t4;
1609
- } else {
1610
- t4 = $[12];
1611
- }
1612
- let t5;
1613
- if ($[13] !== children || $[14] !== expanded) {
1614
- t5 = expanded && /* @__PURE__ */ jsxDEV("div", {
1615
- className: "px-3 pb-3 ps-8",
1616
- children
1617
- }, void 0, false);
1618
- $[13] = children;
1619
- $[14] = expanded;
1620
- $[15] = t5;
1621
- } else {
1622
- t5 = $[15];
1623
- }
1624
- let t6;
1625
- if ($[16] !== rowTestId || $[17] !== t4 || $[18] !== t5) {
1626
- t6 = /* @__PURE__ */ jsxDEV("li", {
1627
- className: "border-t border-border/60 first:border-t-0",
1628
- "data-testid": rowTestId,
1629
- children: [t4, t5]
1630
- }, void 0, true);
1631
- $[16] = rowTestId;
1632
- $[17] = t4;
1633
- $[18] = t5;
1634
- $[19] = t6;
1635
- } else {
1636
- t6 = $[19];
1637
- }
1638
- return t6;
1639
- };
1640
- const ColumnChips = (t0) => {
1641
- const $ = c(5);
1642
- const {
1643
- columns,
1644
- testId
1645
- } = t0;
1646
- let t1;
1647
- if ($[0] !== columns) {
1648
- t1 = columns.map(_temp);
1649
- $[0] = columns;
1650
- $[1] = t1;
1651
- } else {
1652
- t1 = $[1];
1653
- }
1654
- let t2;
1655
- if ($[2] !== t1 || $[3] !== testId) {
1656
- t2 = /* @__PURE__ */ jsxDEV("ul", {
1657
- className: "flex flex-wrap gap-1.5 pt-1",
1658
- "data-testid": testId,
1659
- children: t1
1660
- }, void 0, false);
1661
- $[2] = t1;
1662
- $[3] = testId;
1663
- $[4] = t2;
1664
- } else {
1665
- t2 = $[4];
1666
- }
1667
- return t2;
1668
- };
1669
- const IndexList = (t0) => {
1670
- const $ = c(10);
1671
- const {
1672
- heading,
1673
- indexes,
1674
- testId
1675
- } = t0;
1676
- let t1;
1677
- if ($[0] !== heading) {
1678
- t1 = /* @__PURE__ */ jsxDEV("p", {
1679
- className: "mb-1.5 font-mono text-[10px] tracking-wide text-muted-foreground uppercase",
1680
- children: heading
1681
- }, void 0, false);
1682
- $[0] = heading;
1683
- $[1] = t1;
1684
- } else {
1685
- t1 = $[1];
1686
- }
1687
- let t2;
1688
- if ($[2] !== indexes) {
1689
- t2 = indexes.map(_temp2);
1690
- $[2] = indexes;
1691
- $[3] = t2;
1692
- } else {
1693
- t2 = $[3];
1694
- }
1695
- let t3;
1696
- if ($[4] !== t2 || $[5] !== testId) {
1697
- t3 = /* @__PURE__ */ jsxDEV("ul", {
1698
- className: "flex flex-col gap-1",
1699
- "data-testid": testId,
1700
- children: t2
1701
- }, void 0, false);
1702
- $[4] = t2;
1703
- $[5] = testId;
1704
- $[6] = t3;
1705
- } else {
1706
- t3 = $[6];
1707
- }
1708
- let t4;
1709
- if ($[7] !== t1 || $[8] !== t3) {
1710
- t4 = /* @__PURE__ */ jsxDEV("div", {
1711
- className: "pt-3",
1712
- children: [t1, t3]
1713
- }, void 0, true);
1714
- $[7] = t1;
1715
- $[8] = t3;
1716
- $[9] = t4;
1717
- } else {
1718
- t4 = $[9];
1719
- }
1720
- return t4;
1721
- };
1722
- const SchemaViewer = (t0) => {
1723
- const $ = c(126);
1724
- const {
1725
- initialShardKey,
1726
- initialTable,
1727
- schemaEditable
1728
- } = t0;
1729
- const client = useLunora();
1730
- const t = useT();
1731
- const [view, setView] = useState("list");
1732
- const [shardKey, setShardKey] = useState(initialShardKey ?? "");
1733
- const [tableFilter, setTableFilter] = useState("");
1734
- const [tables, setTables] = useState(null);
1735
- const [error, setError] = useState(null);
1736
- let t1;
1737
- if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1738
- t1 = {};
1739
- $[0] = t1;
1740
- } else {
1741
- t1 = $[0];
1742
- }
1743
- const [columns, setColumns] = useState(t1);
1744
- let t2;
1745
- if ($[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1746
- t2 = {};
1747
- $[1] = t2;
1748
- } else {
1749
- t2 = $[1];
1750
- }
1751
- const [indexes, setIndexes] = useState(t2);
1752
- const [expanded, setExpanded] = useState(null);
1753
- let t3;
1754
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1755
- t3 = {};
1756
- $[2] = t3;
1757
- } else {
1758
- t3 = $[2];
1759
- }
1760
- const [shardColumns, setShardColumns] = useState(t3);
1761
- let t4;
1762
- if ($[3] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1763
- t4 = {};
1764
- $[3] = t4;
1765
- } else {
1766
- t4 = $[3];
1767
- }
1768
- const [shardColumnsError, setShardColumnsError] = useState(t4);
1769
- const [globalTables, setGlobalTables] = useState(null);
1770
- const [globalError, setGlobalError] = useState(null);
1771
- let t5;
1772
- if ($[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1773
- t5 = {};
1774
- $[4] = t5;
1775
- } else {
1776
- t5 = $[4];
1777
- }
1778
- const [globalColumns, setGlobalColumns] = useState(t5);
1779
- const [globalExpanded, setGlobalExpanded] = useState(null);
1780
- let t6;
1781
- if ($[5] !== client) {
1782
- t6 = async (shard) => {
1783
- setError(null);
1784
- try {
1785
- const result = await client.query(LIST_TABLES, {}, callOptions(shard));
1786
- recordShard(shard);
1787
- setTables(result);
1788
- setColumns({});
1789
- setIndexes({});
1790
- setExpanded(null);
1791
- setShardColumns((previous) => Object.fromEntries(Object.entries(previous).filter((t82) => {
1792
- const [cachedShard] = t82;
1793
- return cachedShard !== shard;
1794
- })));
1795
- setShardColumnsError((previous_0) => Object.fromEntries(Object.entries(previous_0).filter((t92) => {
1796
- const [cachedShard_0] = t92;
1797
- return cachedShard_0 !== shard;
1798
- })));
1799
- } catch (t72) {
1800
- const error_ = t72;
1801
- setTables(null);
1802
- setError(errorMessage(error_));
1803
- }
1804
- };
1805
- $[5] = client;
1806
- $[6] = t6;
1807
- } else {
1808
- t6 = $[6];
1809
- }
1810
- const refresh = t6;
1811
- let t7;
1812
- if ($[7] !== client) {
1813
- t7 = async () => {
1814
- setGlobalError(null);
1815
- try {
1816
- setGlobalTables(await client.listGlobalTables());
1817
- } catch (t82) {
1818
- const error__0 = t82;
1819
- setGlobalTables(null);
1820
- setGlobalError(errorMessage(error__0));
1821
- }
1822
- };
1823
- $[7] = client;
1824
- $[8] = t7;
1825
- } else {
1826
- t7 = $[8];
1827
- }
1828
- const refreshGlobal = t7;
1829
- let t8;
1830
- if ($[9] !== shardKey) {
1831
- t8 = shardKey.trim();
1832
- $[9] = shardKey;
1833
- $[10] = t8;
1834
- } else {
1835
- t8 = $[10];
1836
- }
1837
- const debouncedShard = useDebounced(t8, 400);
1838
- let t10;
1839
- let t9;
1840
- if ($[11] !== debouncedShard || $[12] !== refresh || $[13] !== refreshGlobal) {
1841
- t9 = () => {
1842
- fireAndForget(refresh(debouncedShard));
1843
- fireAndForget(refreshGlobal());
1844
- };
1845
- t10 = [refresh, refreshGlobal, debouncedShard];
1846
- $[11] = debouncedShard;
1847
- $[12] = refresh;
1848
- $[13] = refreshGlobal;
1849
- $[14] = t10;
1850
- $[15] = t9;
1851
- } else {
1852
- t10 = $[14];
1853
- t9 = $[15];
1854
- }
1855
- useEffect(t9, t10);
1856
- let t11;
1857
- if ($[16] !== client || $[17] !== columns || $[18] !== expanded || $[19] !== shardKey) {
1858
- t11 = async (table) => {
1859
- if (expanded === table) {
1860
- setExpanded(null);
1861
- return;
1862
- }
1863
- setExpanded(table);
1864
- const cacheKey = `${shardKey}:${table}`;
1865
- if (columns[cacheKey] !== void 0) {
1866
- return;
1867
- }
1868
- const [page, indexResult] = await Promise.allSettled([client.query(READ_TABLE_PAGE, {
1869
- limit: 1,
1870
- offset: 0,
1871
- table
1872
- }, callOptions(shardKey)), client.query(LIST_TABLE_INDEXES, {
1873
- table
1874
- }, callOptions(shardKey))]);
1875
- if (page.status === "fulfilled") {
1876
- setColumns((previous_1) => ({
1877
- ...previous_1,
1878
- [cacheKey]: page.value.columns
1879
- }));
1880
- } else {
1881
- setError(errorMessage(page.reason));
1882
- }
1883
- if (indexResult.status === "fulfilled") {
1884
- setIndexes((previous_2) => ({
1885
- ...previous_2,
1886
- [cacheKey]: indexResult.value.indexes
1887
- }));
1888
- }
1889
- };
1890
- $[16] = client;
1891
- $[17] = columns;
1892
- $[18] = expanded;
1893
- $[19] = shardKey;
1894
- $[20] = t11;
1895
- } else {
1896
- t11 = $[20];
1897
- }
1898
- const toggle = t11;
1899
- let t12;
1900
- if ($[21] !== client || $[22] !== globalColumns || $[23] !== globalExpanded) {
1901
- t12 = async (table_0) => {
1902
- if (globalExpanded === table_0) {
1903
- setGlobalExpanded(null);
1904
- return;
1905
- }
1906
- setGlobalExpanded(table_0);
1907
- if (globalColumns[table_0] !== void 0) {
1908
- return;
1909
- }
1910
- try {
1911
- const page_0 = await client.readGlobalTablePage({
1912
- limit: 1,
1913
- offset: 0,
1914
- table: table_0
1915
- });
1916
- setGlobalColumns((previous_3) => ({
1917
- ...previous_3,
1918
- [table_0]: page_0.columns
1919
- }));
1920
- } catch (t132) {
1921
- const error__1 = t132;
1922
- setGlobalError(errorMessage(error__1));
1923
- }
1924
- };
1925
- $[21] = client;
1926
- $[22] = globalColumns;
1927
- $[23] = globalExpanded;
1928
- $[24] = t12;
1929
- } else {
1930
- t12 = $[24];
1931
- }
1932
- const toggleGlobal = t12;
1933
- const appliedTable = useRef(void 0);
1934
- let t13;
1935
- let t14;
1936
- if ($[25] !== initialTable || $[26] !== tables || $[27] !== toggle) {
1937
- t13 = () => {
1938
- if (initialTable === void 0 || tables === null || appliedTable.current === initialTable) {
1939
- return;
1940
- }
1941
- if (tables.some((table_1) => table_1.name === initialTable)) {
1942
- appliedTable.current = initialTable;
1943
- fireAndForget(toggle(initialTable));
1944
- }
1945
- };
1946
- t14 = [initialTable, tables, toggle];
1947
- $[25] = initialTable;
1948
- $[26] = tables;
1949
- $[27] = toggle;
1950
- $[28] = t13;
1951
- $[29] = t14;
1952
- } else {
1953
- t13 = $[28];
1954
- t14 = $[29];
1955
- }
1956
- useEffect(t13, t14);
1957
- let t15;
1958
- if ($[30] !== client) {
1959
- t15 = async (shard_0, shardNames, globalNames) => {
1960
- const [described, globalPages] = await Promise.all([Promise.allSettled([client.query(DESCRIBE_TABLES, {
1961
- tables: [...shardNames, ...globalNames]
1962
- }, callOptions(shard_0))]), Promise.all(globalNames.map(async (table_2) => {
1963
- const page_1 = await Promise.allSettled([client.readGlobalTablePage({
1964
- limit: 1,
1965
- offset: 0,
1966
- table: table_2
1967
- })]);
1968
- const value = page_1[0].status === "fulfilled" ? page_1[0].value : void 0;
1969
- return {
1970
- columns: value?.columns ?? [],
1971
- refs: value?.refs ?? {},
1972
- table: table_2
1973
- };
1974
- }))]);
1975
- const typedColumns = described[0].status === "fulfilled" ? described[0].value?.columnsByTable ?? {} : {};
1976
- const columnsFailed = described[0].status === "rejected";
1977
- const globalFallback = new Map(globalPages.map(_temp3));
1978
- const resolved = [...shardNames, ...globalNames].map((table_4) => {
1979
- const typed = typedColumns[table_4] ?? [];
1980
- return [table_4, typed.length > 0 ? typed : globalFallback.get(table_4) ?? []];
1981
- });
1982
- setShardColumns((previous_4) => ({
1983
- ...previous_4,
1984
- [shard_0]: Object.fromEntries(resolved)
1985
- }));
1986
- setShardColumnsError((previous_5) => ({
1987
- ...previous_5,
1988
- [shard_0]: columnsFailed
1989
- }));
1990
- };
1991
- $[30] = client;
1992
- $[31] = t15;
1993
- } else {
1994
- t15 = $[31];
1995
- }
1996
- const probeSchema = t15;
1997
- let t16;
1998
- let t17;
1999
- if ($[32] !== globalError || $[33] !== globalTables || $[34] !== probeSchema || $[35] !== shardColumns || $[36] !== shardKey || $[37] !== tables || $[38] !== view) {
2000
- t16 = () => {
2001
- if (view !== "graph" || tables === null || globalTables === null && globalError === null || shardColumns[shardKey] !== void 0) {
2002
- return;
2003
- }
2004
- fireAndForget(probeSchema(shardKey, tables.map(_temp4), (globalTables ?? []).map(_temp5)));
2005
- };
2006
- t17 = [view, tables, globalTables, globalError, shardKey, shardColumns, probeSchema];
2007
- $[32] = globalError;
2008
- $[33] = globalTables;
2009
- $[34] = probeSchema;
2010
- $[35] = shardColumns;
2011
- $[36] = shardKey;
2012
- $[37] = tables;
2013
- $[38] = view;
2014
- $[39] = t16;
2015
- $[40] = t17;
2016
- } else {
2017
- t16 = $[39];
2018
- t17 = $[40];
2019
- }
2020
- useEffect(t16, t17);
2021
- const columnsForShard = shardColumns[shardKey] ?? EMPTY_COLUMNS;
2022
- let t18;
2023
- if ($[41] !== columnsForShard || $[42] !== globalTables || $[43] !== tables) {
2024
- let t192;
2025
- if ($[45] !== columnsForShard) {
2026
- t192 = (table_7) => ({
2027
- columns: columnsForShard[table_7.name] ?? EMPTY_COLUMN_META,
2028
- name: table_7.name,
2029
- tier: "shard"
2030
- });
2031
- $[45] = columnsForShard;
2032
- $[46] = t192;
2033
- } else {
2034
- t192 = $[46];
2035
- }
2036
- const shardOnes = (tables ?? []).map(t192);
2037
- let t202;
2038
- if ($[47] !== columnsForShard) {
2039
- t202 = (table_8) => ({
2040
- columns: columnsForShard[table_8.name] ?? EMPTY_COLUMN_META,
2041
- name: table_8.name,
2042
- tier: "global"
2043
- });
2044
- $[47] = columnsForShard;
2045
- $[48] = t202;
2046
- } else {
2047
- t202 = $[48];
2048
- }
2049
- const globalOnes = (globalTables ?? []).map(t202);
2050
- t18 = [...shardOnes, ...globalOnes];
2051
- $[41] = columnsForShard;
2052
- $[42] = globalTables;
2053
- $[43] = tables;
2054
- $[44] = t18;
2055
- } else {
2056
- t18 = $[44];
2057
- }
2058
- const diagramTables = t18;
2059
- let t19;
2060
- if ($[49] !== tableFilter || $[50] !== tables) {
2061
- const needle = tableFilter.trim().toLowerCase();
2062
- t19 = (tables ?? []).filter((table_9) => table_9.name.toLowerCase().includes(needle));
2063
- $[49] = tableFilter;
2064
- $[50] = tables;
2065
- $[51] = t19;
2066
- } else {
2067
- t19 = $[51];
2068
- }
2069
- const filteredTables = t19;
2070
- let t20;
2071
- if ($[52] !== globalTables || $[53] !== tableFilter) {
2072
- const needle_0 = tableFilter.trim().toLowerCase();
2073
- t20 = (globalTables ?? []).filter((table_10) => table_10.name.toLowerCase().includes(needle_0));
2074
- $[52] = globalTables;
2075
- $[53] = tableFilter;
2076
- $[54] = t20;
2077
- } else {
2078
- t20 = $[54];
2079
- }
2080
- const filteredGlobalTables = t20;
2081
- let t21;
2082
- if ($[55] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2083
- t21 = () => {
2084
- setView("list");
2085
- };
2086
- $[55] = t21;
2087
- } else {
2088
- t21 = $[55];
2089
- }
2090
- const showList = t21;
2091
- let t22;
2092
- if ($[56] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2093
- t22 = () => {
2094
- setView("graph");
2095
- };
2096
- $[56] = t22;
2097
- } else {
2098
- t22 = $[56];
2099
- }
2100
- const showGraph = t22;
2101
- let t23;
2102
- if ($[57] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2103
- t23 = (event) => {
2104
- setTableFilter(event.target.value);
2105
- };
2106
- $[57] = t23;
2107
- } else {
2108
- t23 = $[57];
2109
- }
2110
- const onFilterChange = t23;
2111
- let t24;
2112
- if ($[58] !== refresh || $[59] !== shardKey) {
2113
- t24 = (_tables) => {
2114
- fireAndForget(refresh(shardKey));
2115
- };
2116
- $[58] = refresh;
2117
- $[59] = shardKey;
2118
- $[60] = t24;
2119
- } else {
2120
- t24 = $[60];
2121
- }
2122
- const onSchemaApplied = t24;
2123
- let t25;
2124
- if ($[61] !== tables) {
2125
- t25 = tables ?? [];
2126
- $[61] = tables;
2127
- $[62] = t25;
2128
- } else {
2129
- t25 = $[62];
2130
- }
2131
- let t26;
2132
- if ($[63] !== t25) {
2133
- t26 = t25.map(_temp6);
2134
- $[63] = t25;
2135
- $[64] = t26;
2136
- } else {
2137
- t26 = $[64];
2138
- }
2139
- const shardTableNames = t26;
2140
- let t27;
2141
- if ($[65] !== shardKey) {
2142
- t27 = /* @__PURE__ */ jsxDEV(ShardInput, {
2143
- onChange: setShardKey,
2144
- testId: "sc-shard-input",
2145
- value: shardKey
2146
- }, void 0, false);
2147
- $[65] = shardKey;
2148
- $[66] = t27;
2149
- } else {
2150
- t27 = $[66];
2151
- }
2152
- let t28;
2153
- if ($[67] !== t) {
2154
- t28 = t("Schema view");
2155
- $[67] = t;
2156
- $[68] = t28;
2157
- } else {
2158
- t28 = $[68];
2159
- }
2160
- const t29 = view === "list";
2161
- const t30 = view === "list" ? "default" : "outline";
2162
- let t31;
2163
- if ($[69] !== t) {
2164
- t31 = t("Table list");
2165
- $[69] = t;
2166
- $[70] = t31;
2167
- } else {
2168
- t31 = $[70];
2169
- }
2170
- let t32;
2171
- if ($[71] !== t29 || $[72] !== t30 || $[73] !== t31) {
2172
- t32 = /* @__PURE__ */ jsxDEV(Button, {
2173
- "aria-pressed": t29,
2174
- "data-testid": "sc-view-list",
2175
- onClick: showList,
2176
- size: "xs",
2177
- type: "button",
2178
- variant: t30,
2179
- children: t31
2180
- }, void 0, false);
2181
- $[71] = t29;
2182
- $[72] = t30;
2183
- $[73] = t31;
2184
- $[74] = t32;
2185
- } else {
2186
- t32 = $[74];
2187
- }
2188
- const t33 = view === "graph";
2189
- const t34 = view === "graph" ? "default" : "outline";
2190
- let t35;
2191
- if ($[75] !== t) {
2192
- t35 = t("Graph");
2193
- $[75] = t;
2194
- $[76] = t35;
2195
- } else {
2196
- t35 = $[76];
2197
- }
2198
- let t36;
2199
- if ($[77] !== t33 || $[78] !== t34 || $[79] !== t35) {
2200
- t36 = /* @__PURE__ */ jsxDEV(Button, {
2201
- "aria-pressed": t33,
2202
- "data-testid": "sc-view-graph",
2203
- onClick: showGraph,
2204
- size: "xs",
2205
- type: "button",
2206
- variant: t34,
2207
- children: t35
2208
- }, void 0, false);
2209
- $[77] = t33;
2210
- $[78] = t34;
2211
- $[79] = t35;
2212
- $[80] = t36;
2213
- } else {
2214
- t36 = $[80];
2215
- }
2216
- let t37;
2217
- if ($[81] !== t28 || $[82] !== t32 || $[83] !== t36) {
2218
- t37 = /* @__PURE__ */ jsxDEV("div", {
2219
- "aria-label": t28,
2220
- className: "flex gap-1.5",
2221
- "data-testid": "sc-view-toggle",
2222
- role: "group",
2223
- children: [t32, t36]
2224
- }, void 0, true);
2225
- $[81] = t28;
2226
- $[82] = t32;
2227
- $[83] = t36;
2228
- $[84] = t37;
2229
- } else {
2230
- t37 = $[84];
2231
- }
2232
- let t38;
2233
- if ($[85] !== t27 || $[86] !== t37) {
2234
- t38 = /* @__PURE__ */ jsxDEV("div", {
2235
- className: "flex flex-wrap items-center gap-3",
2236
- children: [t27, t37]
2237
- }, void 0, true);
2238
- $[85] = t27;
2239
- $[86] = t37;
2240
- $[87] = t38;
2241
- } else {
2242
- t38 = $[87];
2243
- }
2244
- let t39;
2245
- if ($[88] !== onSchemaApplied || $[89] !== schemaEditable || $[90] !== shardTableNames) {
2246
- t39 = schemaEditable === true && /* @__PURE__ */ jsxDEV(SchemaEditorOverlay, {
2247
- onApplied: onSchemaApplied,
2248
- tableNames: shardTableNames
2249
- }, void 0, false);
2250
- $[88] = onSchemaApplied;
2251
- $[89] = schemaEditable;
2252
- $[90] = shardTableNames;
2253
- $[91] = t39;
2254
- } else {
2255
- t39 = $[91];
2256
- }
2257
- let t40;
2258
- if ($[92] !== t || $[93] !== tableFilter || $[94] !== view) {
2259
- t40 = view === "list" && /* @__PURE__ */ jsxDEV(Input, {
2260
- "aria-label": t("Filter tables"),
2261
- className: "h-8 max-w-xs",
2262
- "data-testid": "sc-filter",
2263
- onChange: onFilterChange,
2264
- placeholder: t("Filter tables"),
2265
- value: tableFilter
2266
- }, void 0, false);
2267
- $[92] = t;
2268
- $[93] = tableFilter;
2269
- $[94] = view;
2270
- $[95] = t40;
2271
- } else {
2272
- t40 = $[95];
2273
- }
2274
- let t41;
2275
- if ($[96] !== diagramTables || $[97] !== error || $[98] !== globalError || $[99] !== shardColumnsError || $[100] !== shardKey || $[101] !== view) {
2276
- t41 = view === "graph" && /* @__PURE__ */ jsxDEV("div", {
2277
- className: "flex flex-col gap-2",
2278
- "data-testid": "sc-graph-view",
2279
- children: [error !== null && /* @__PURE__ */ jsxDEV("p", {
2280
- className: "text-sm text-destructive",
2281
- "data-testid": "sc-error",
2282
- role: "alert",
2283
- children: error
2284
- }, void 0, false), globalError !== null && /* @__PURE__ */ jsxDEV("p", {
2285
- className: "text-sm text-destructive",
2286
- "data-testid": "sc-global-error",
2287
- role: "alert",
2288
- children: globalError
2289
- }, void 0, false), /* @__PURE__ */ jsxDEV(SchemaDiagram, {
2290
- columnsError: shardColumnsError[shardKey] === true,
2291
- tables: diagramTables,
2292
- testIdPrefix: "sc-graph"
2293
- }, void 0, false)]
2294
- }, void 0, true);
2295
- $[96] = diagramTables;
2296
- $[97] = error;
2297
- $[98] = globalError;
2298
- $[99] = shardColumnsError;
2299
- $[100] = shardKey;
2300
- $[101] = view;
2301
- $[102] = t41;
2302
- } else {
2303
- t41 = $[102];
2304
- }
2305
- let t42;
2306
- if ($[103] !== columns || $[104] !== error || $[105] !== expanded || $[106] !== filteredGlobalTables || $[107] !== filteredTables || $[108] !== globalColumns || $[109] !== globalError || $[110] !== globalExpanded || $[111] !== globalTables || $[112] !== indexes || $[113] !== shardKey || $[114] !== t || $[115] !== tables || $[116] !== toggle || $[117] !== toggleGlobal || $[118] !== view) {
2307
- t42 = view === "list" && /* @__PURE__ */ jsxDEV("div", {
2308
- className: "flex flex-col gap-4",
2309
- children: [/* @__PURE__ */ jsxDEV(Card, {
2310
- "data-testid": "sc-shard-section",
2311
- size: "sm",
2312
- children: [/* @__PURE__ */ jsxDEV(CardHeader, {
2313
- children: [/* @__PURE__ */ jsxDEV("div", {
2314
- className: "flex items-center gap-2",
2315
- children: [/* @__PURE__ */ jsxDEV(StorageTierBadge, {
2316
- tier: "shard"
2317
- }, void 0, false), /* @__PURE__ */ jsxDEV(CardTitle, {
2318
- children: t("Shard tables")
2319
- }, void 0, false), tables !== null && /* @__PURE__ */ jsxDEV(Badge, {
2320
- className: "ms-auto tabular-nums",
2321
- variant: "outline",
2322
- children: filteredTables.length
2323
- }, void 0, false)]
2324
- }, void 0, true), /* @__PURE__ */ jsxDEV(CardDescription, {
2325
- children: TIER_META.shard.hint
2326
- }, void 0, false)]
2327
- }, void 0, true), /* @__PURE__ */ jsxDEV(CardContent, {
2328
- children: [error !== null && /* @__PURE__ */ jsxDEV("p", {
2329
- className: "text-sm text-destructive",
2330
- "data-testid": "sc-error",
2331
- role: "alert",
2332
- children: error
2333
- }, void 0, false), tables !== null && tables.length === 0 && /* @__PURE__ */ jsxDEV("p", {
2334
- className: "text-sm text-muted-foreground",
2335
- "data-testid": "sc-empty",
2336
- children: t("No tables in this shard.")
2337
- }, void 0, false), tables !== null && tables.length > 0 && filteredTables.length === 0 && /* @__PURE__ */ jsxDEV("p", {
2338
- className: "text-sm text-muted-foreground",
2339
- "data-testid": "sc-no-match",
2340
- children: t("No tables match your filter.")
2341
- }, void 0, false), filteredTables.length > 0 && /* @__PURE__ */ jsxDEV("ul", {
2342
- className: "-mx-3 overflow-hidden border-t border-border",
2343
- "data-testid": "sc-table-list",
2344
- children: filteredTables.map((table_12) => {
2345
- const cacheKey_0 = `${shardKey}:${table_12.name}`;
2346
- const tableIndexes = indexes[cacheKey_0] ?? [];
2347
- return /* @__PURE__ */ jsxDEV(TableEntry, {
2348
- expanded: expanded === table_12.name,
2349
- name: table_12.name,
2350
- onToggle: () => {
2351
- fireAndForget(toggle(table_12.name));
2352
- },
2353
- rowCount: table_12.rowCount,
2354
- rowTestId: `sc-table-${table_12.name}`,
2355
- toggleTestId: `sc-toggle-${table_12.name}`,
2356
- children: [/* @__PURE__ */ jsxDEV(ColumnChips, {
2357
- columns: columns[cacheKey_0] ?? EMPTY_COLUMN_NAMES,
2358
- testId: `sc-columns-${table_12.name}`
2359
- }, void 0, false), tableIndexes.length > 0 && /* @__PURE__ */ jsxDEV(IndexList, {
2360
- heading: t("Indexes"),
2361
- indexes: tableIndexes,
2362
- testId: `sc-indexes-${table_12.name}`
2363
- }, void 0, false)]
2364
- }, table_12.name, true);
2365
- })
2366
- }, void 0, false)]
2367
- }, void 0, true)]
2368
- }, void 0, true), /* @__PURE__ */ jsxDEV(Card, {
2369
- "data-testid": "sc-global-section",
2370
- size: "sm",
2371
- children: [/* @__PURE__ */ jsxDEV(CardHeader, {
2372
- children: [/* @__PURE__ */ jsxDEV("div", {
2373
- className: "flex items-center gap-2",
2374
- children: [/* @__PURE__ */ jsxDEV(StorageTierBadge, {
2375
- tier: "global"
2376
- }, void 0, false), /* @__PURE__ */ jsxDEV(CardTitle, {
2377
- children: t("Global tables (D1)")
2378
- }, void 0, false), globalTables !== null && /* @__PURE__ */ jsxDEV(Badge, {
2379
- className: "ms-auto tabular-nums",
2380
- variant: "outline",
2381
- children: filteredGlobalTables.length
2382
- }, void 0, false)]
2383
- }, void 0, true), /* @__PURE__ */ jsxDEV(CardDescription, {
2384
- children: TIER_META.global.hint
2385
- }, void 0, false)]
2386
- }, void 0, true), /* @__PURE__ */ jsxDEV(CardContent, {
2387
- children: [globalError !== null && /* @__PURE__ */ jsxDEV("p", {
2388
- className: "text-sm text-destructive",
2389
- "data-testid": "sc-global-error",
2390
- role: "alert",
2391
- children: globalError
2392
- }, void 0, false), globalTables !== null && globalTables.length === 0 && /* @__PURE__ */ jsxDEV(EmptyState, {
2393
- description: TIER_META.global.hint,
2394
- testId: "sc-global-empty",
2395
- title: t("No global tables.")
2396
- }, void 0, false), globalTables !== null && globalTables.length > 0 && filteredGlobalTables.length === 0 && /* @__PURE__ */ jsxDEV("p", {
2397
- className: "text-sm text-muted-foreground",
2398
- "data-testid": "sc-global-no-match",
2399
- children: t("No tables match your filter.")
2400
- }, void 0, false), filteredGlobalTables.length > 0 && /* @__PURE__ */ jsxDEV("ul", {
2401
- className: "-mx-3 overflow-hidden border-t border-border",
2402
- "data-testid": "sc-global-table-list",
2403
- children: filteredGlobalTables.map((table_13) => /* @__PURE__ */ jsxDEV(TableEntry, {
2404
- expanded: globalExpanded === table_13.name,
2405
- name: table_13.name,
2406
- onToggle: () => {
2407
- fireAndForget(toggleGlobal(table_13.name));
2408
- },
2409
- rowCount: table_13.rowCount,
2410
- rowTestId: `sc-global-table-${table_13.name}`,
2411
- toggleTestId: `sc-global-toggle-${table_13.name}`,
2412
- children: /* @__PURE__ */ jsxDEV(ColumnChips, {
2413
- columns: globalColumns[table_13.name] ?? EMPTY_COLUMN_NAMES,
2414
- testId: `sc-global-columns-${table_13.name}`
2415
- }, void 0, false)
2416
- }, table_13.name, false))
2417
- }, void 0, false)]
2418
- }, void 0, true)]
2419
- }, void 0, true)]
2420
- }, void 0, true);
2421
- $[103] = columns;
2422
- $[104] = error;
2423
- $[105] = expanded;
2424
- $[106] = filteredGlobalTables;
2425
- $[107] = filteredTables;
2426
- $[108] = globalColumns;
2427
- $[109] = globalError;
2428
- $[110] = globalExpanded;
2429
- $[111] = globalTables;
2430
- $[112] = indexes;
2431
- $[113] = shardKey;
2432
- $[114] = t;
2433
- $[115] = tables;
2434
- $[116] = toggle;
2435
- $[117] = toggleGlobal;
2436
- $[118] = view;
2437
- $[119] = t42;
2438
- } else {
2439
- t42 = $[119];
2440
- }
2441
- let t43;
2442
- if ($[120] !== t38 || $[121] !== t39 || $[122] !== t40 || $[123] !== t41 || $[124] !== t42) {
2443
- t43 = /* @__PURE__ */ jsxDEV("div", {
2444
- className: "flex flex-col gap-4",
2445
- "data-testid": "lunora-schema",
2446
- children: [t38, t39, t40, t41, t42]
2447
- }, void 0, true);
2448
- $[120] = t38;
2449
- $[121] = t39;
2450
- $[122] = t40;
2451
- $[123] = t41;
2452
- $[124] = t42;
2453
- $[125] = t43;
2454
- } else {
2455
- t43 = $[125];
2456
- }
2457
- return t43;
2458
- };
2459
- function _temp(column) {
2460
- return /* @__PURE__ */ jsxDEV("li", {
2461
- className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground",
2462
- children: column
2463
- }, column, false);
2464
- }
2465
- function _temp2(index) {
2466
- return /* @__PURE__ */ jsxDEV("li", {
2467
- className: "flex flex-wrap items-center gap-1.5 text-xs",
2468
- children: [/* @__PURE__ */ jsxDEV("span", {
2469
- className: "font-mono",
2470
- children: index.name
2471
- }, void 0, false), /* @__PURE__ */ jsxDEV(Badge, {
2472
- variant: "outline",
2473
- children: index.type
2474
- }, void 0, false), index.unique === true && /* @__PURE__ */ jsxDEV(Badge, {
2475
- variant: "secondary",
2476
- children: "unique"
2477
- }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
2478
- className: "text-muted-foreground",
2479
- children: index.fields.join(", ")
2480
- }, void 0, false)]
2481
- }, `${index.type}:${index.name}`, true);
2482
- }
2483
- function _temp3(t0) {
2484
- const {
2485
- columns: columnNames,
2486
- refs,
2487
- table: table_3
2488
- } = t0;
2489
- return [table_3, columnNames.map((name) => {
2490
- const ref = refs[name];
2491
- return ref === void 0 ? {
2492
- name,
2493
- optional: false,
2494
- type: ""
2495
- } : {
2496
- name,
2497
- optional: false,
2498
- ref,
2499
- type: "id"
2500
- };
2501
- })];
2502
- }
2503
- function _temp4(table_5) {
2504
- return table_5.name;
2505
- }
2506
- function _temp5(table_6) {
2507
- return table_6.name;
2508
- }
2509
- function _temp6(table_11) {
2510
- return table_11.name;
2511
- }
2512
-
2513
- export { SchemaViewer };