@lunora/studio 1.0.0-alpha.3 → 1.0.0-alpha.30

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 (174) hide show
  1. package/__assets__/package-og.svg +1 -1
  2. package/dist/index.d.ts +29 -18
  3. package/dist/index.js +29 -29
  4. package/dist/mount.d.ts +1 -1
  5. package/dist/mount.js +1 -1
  6. package/dist/{packem_shared/ApiTab-W3no0KOj.js → packem_chunks/ApiTab.js} +5 -5
  7. package/dist/{packem_shared/AuditPanel-Bq4o_IqT.js → packem_chunks/AuditPanel.js} +24 -36
  8. package/dist/{packem_shared/ExportImportPanel-dxY56TDF.js → packem_chunks/ExportImportPanel.js} +13 -9
  9. package/dist/{packem_shared/FileBrowser-Dhy4zES8.js → packem_chunks/FileBrowser.js} +15 -15
  10. package/dist/{packem_shared/FunctionRunner--fQJRPAD.js → packem_chunks/FunctionRunner.js} +10 -10
  11. package/dist/{packem_shared/FunctionStatsPanel-BjRUA_G3.js → packem_chunks/FunctionStatsPanel.js} +147 -204
  12. package/dist/{packem_shared/HealthPanel-PxclMWmA.js → packem_chunks/HealthPanel.js} +37 -29
  13. package/dist/{packem_shared/InsightsPanel-CWS_C-xW.js → packem_chunks/InsightsPanel.js} +107 -69
  14. package/dist/{packem_shared/LogsPanel-CTW8CFcM.js → packem_chunks/LogsPanel.js} +41 -53
  15. package/dist/{packem_shared/MailPanel-BwkvfIHF.js → packem_chunks/MailPanel.js} +37 -44
  16. package/dist/{packem_shared/MetricsPanel-BLuOhZQ4.js → packem_chunks/MetricsPanel.js} +41 -322
  17. package/dist/{packem_shared/MigrationsPanel-DT3lnwHF.js → packem_chunks/MigrationsPanel.js} +39 -46
  18. package/dist/{packem_shared/PitrPanel-CdErL7EJ.js → packem_chunks/PitrPanel.js} +9 -9
  19. package/dist/{packem_shared/SchemaViewer-LJDcmNIO.js → packem_chunks/SchemaViewer.js} +15 -15
  20. package/dist/{packem_shared/SecurityAdvisorPanel-C_ETsPih.js → packem_chunks/SecurityAdvisorPanel.js} +44 -31
  21. package/dist/packem_chunks/SettingsPanel.js +390 -0
  22. package/dist/{packem_shared/sql-editor-panel-BFRpzj6r.js → packem_chunks/SqlEditorPanel.js} +12 -252
  23. package/dist/{packem_shared/TableEditor-ChfUOZec.js → packem_chunks/TableEditor.js} +10 -68
  24. package/dist/packem_chunks/analytics-panel.js +261 -0
  25. package/dist/packem_chunks/auth-config-panel.js +179 -0
  26. package/dist/packem_chunks/auth-sessions-panel.js +175 -0
  27. package/dist/packem_chunks/dashboards-panel.js +779 -0
  28. package/dist/packem_chunks/fanout-panel.js +481 -0
  29. package/dist/packem_chunks/flags-panel.js +176 -0
  30. package/dist/packem_chunks/kv-browser.js +1896 -0
  31. package/dist/packem_chunks/log-drains-panel.js +273 -0
  32. package/dist/packem_chunks/organizations-panel.js +670 -0
  33. package/dist/packem_chunks/payments-panel.js +185 -0
  34. package/dist/packem_chunks/permissions-panel.js +804 -0
  35. package/dist/packem_chunks/queues-panel.js +147 -0
  36. package/dist/packem_chunks/rls-panel.js +313 -0
  37. package/dist/packem_chunks/schedule-panel.js +831 -0
  38. package/dist/packem_chunks/sparkline.js +79 -0
  39. package/dist/packem_chunks/storage-rules-panel.js +138 -0
  40. package/dist/packem_chunks/subscriptions-panel.js +236 -0
  41. package/dist/packem_chunks/users-panel.js +1265 -0
  42. package/dist/packem_chunks/vector-browser.js +281 -0
  43. package/dist/packem_chunks/workflows-panel.js +562 -0
  44. package/dist/packem_shared/{ADMIN_FUNCTIONS-DmBqMZ-z.js → ADMIN_FUNCTIONS-CdaxLGkE.js} +3 -0
  45. package/dist/packem_shared/{ApiDocsPanel-C5-yJ1p7.js → ApiDocsPanel-B6u_wnz-.js} +2 -2
  46. package/dist/packem_shared/{ApiReferencePanel-1vubqG5s.js → ApiReferencePanel-Drz4UO0a.js} +2 -1
  47. package/dist/packem_shared/{CommandPalette-BtgkBzZI.js → CommandPalette-B5BertvU.js} +1 -1
  48. package/dist/packem_shared/{DataBrowser-CtBe1So9.js → DataBrowser-ANTHLWWh.js} +198 -247
  49. package/dist/packem_shared/{GlobalDataBrowser-BTEmGrph.js → GlobalDataBrowser-CjgTG_wa.js} +37 -66
  50. package/dist/packem_shared/HomePanel-c2FodE9t.js +14 -0
  51. package/dist/packem_shared/{OpenRpcReferencePanel-vbcYbv3V.js → OpenRpcReferencePanel-CspFdbUT.js} +2 -1
  52. package/dist/packem_shared/{ScheduledJobs-CabfKbyM.js → ScheduledJobs-BEJXtsBn.js} +163 -60
  53. package/dist/packem_shared/Studio-CVTtA_sB.js +16 -0
  54. package/dist/packem_shared/{StudioApp-CHOZA-z-.js → StudioApp-BSYV2fz6.js} +277 -3
  55. package/dist/packem_shared/{advisor-view-CGcfMiPq.js → advisor-view-DzqyvUU3.js} +1 -1
  56. package/dist/packem_shared/{app.d-CCmwDEVs.d.ts → app.d-B6MyY_al.d.ts} +1 -1
  57. package/dist/packem_shared/{bar-chart-CzJAgqkp.js → bar-chart-Bb__F5-u.js} +1 -1
  58. package/dist/packem_shared/browser-storage-d03UsV7v.js +249 -0
  59. package/dist/packem_shared/{cf-links-2cktDedA.js → cf-links-BZfRdxSE.js} +1 -1
  60. package/dist/packem_shared/{data-grid-B5CaV3wS.js → data-grid-Dsg6nRjo.js} +1 -1
  61. package/dist/packem_shared/data-view-params-Cd6yRVbv.js +96 -0
  62. package/dist/packem_shared/{grid-features-CzUfqgsM.js → grid-features-D7nNzBYm.js} +4 -99
  63. package/dist/packem_shared/{HomePanel-Cw16stjq.js → home-panel-aOR_drVv.js} +833 -469
  64. package/dist/packem_shared/{internal-rXJEAhXS.js → internal-FcNZ3beb.js} +1 -1
  65. package/dist/packem_shared/modal-shell-hyaJvIJ6.js +100 -0
  66. package/dist/packem_shared/{reference-view-B4E49Lip.js → reference-view-Doy1XlQq.js} +4 -44
  67. package/dist/packem_shared/select-UkNYCT3s.js +273 -0
  68. package/dist/packem_shared/skeleton-CGhL0p20.js +45 -0
  69. package/dist/packem_shared/{sparkline-10dG-_f0.js → sparkline-KgMPHS4u.js} +1 -1
  70. package/dist/packem_shared/studio-dMTJ-kRR.js +3987 -0
  71. package/dist/packem_shared/{table-_RzNvy3R.js → table-DsCa9Qp9.js} +1 -1
  72. package/dist/packem_shared/{table-list-sidebar-Bg7uzbvC.js → table-list-sidebar-VMo0ftxD.js} +1 -1
  73. package/dist/packem_shared/use-admin-query-BViPA3US.js +105 -0
  74. package/dist/packem_shared/use-auth-capabilities-BHkoBnbZ.js +32 -0
  75. package/dist/standalone/chunk-2DS7JLWL.js +13 -0
  76. package/dist/standalone/chunk-2K47A3P6.js +1 -0
  77. package/dist/standalone/chunk-2NGUNNGW.js +1 -0
  78. package/dist/standalone/chunk-2PDQ4KZ6.js +1 -0
  79. package/dist/standalone/chunk-3BP4BTLR.js +4 -0
  80. package/dist/standalone/chunk-3OA7PECS.js +6 -0
  81. package/dist/standalone/chunk-4QHKBC77.js +1 -0
  82. package/dist/standalone/chunk-57LYXHXH.js +1 -0
  83. package/dist/standalone/chunk-5NSZVXCS.js +1 -0
  84. package/dist/standalone/chunk-5OIBXYZM.js +1 -0
  85. package/dist/standalone/chunk-63XKJQTQ.js +1 -0
  86. package/dist/standalone/chunk-6RC6L33K.js +4 -0
  87. package/dist/standalone/chunk-6VTGE3WJ.js +1 -0
  88. package/dist/standalone/chunk-7PBZKXYA.js +1 -0
  89. package/dist/standalone/chunk-7POIIWC5.js +3 -0
  90. package/dist/standalone/chunk-7RYIQKZA.js +1 -0
  91. package/dist/standalone/chunk-7TJJXVSE.js +1 -0
  92. package/dist/standalone/chunk-AB6QGMBF.js +1 -0
  93. package/dist/standalone/chunk-AHILM3ZP.js +1 -0
  94. package/dist/standalone/chunk-AQGOX5DK.js +1 -0
  95. package/dist/standalone/chunk-ASLGNHAX.js +1 -0
  96. package/dist/standalone/chunk-BHTPZS7L.js +4 -0
  97. package/dist/standalone/chunk-BJGBHGK3.js +1 -0
  98. package/dist/standalone/chunk-D7HKX4DI.js +1 -0
  99. package/dist/standalone/chunk-DGWTR4G7.js +1 -0
  100. package/dist/standalone/chunk-DSX53PBM.js +1 -0
  101. package/dist/standalone/chunk-DV2MNASX.js +1 -0
  102. package/dist/standalone/chunk-DWDILV2E.js +1 -0
  103. package/dist/standalone/chunk-E7AVZZKO.js +1 -0
  104. package/dist/standalone/chunk-EGJX34WM.js +1 -0
  105. package/dist/standalone/chunk-FCR3HKFV.js +1 -0
  106. package/dist/standalone/chunk-FKO3HO6I.js +4 -0
  107. package/dist/standalone/chunk-FQKNJSRA.js +76 -0
  108. package/dist/standalone/chunk-G2TFEWEQ.js +4 -0
  109. package/dist/standalone/chunk-GABMIICA.js +1 -0
  110. package/dist/standalone/chunk-GTM65MVX.js +1 -0
  111. package/dist/standalone/chunk-GZXPPJVK.js +1 -0
  112. package/dist/standalone/chunk-HFBRE65A.js +1 -0
  113. package/dist/standalone/chunk-HFMQNUBC.js +1 -0
  114. package/dist/standalone/chunk-HG7Q5B3H.js +1 -0
  115. package/dist/standalone/chunk-HTQL7AXU.js +1 -0
  116. package/dist/standalone/chunk-HV7G6DFP.js +5 -0
  117. package/dist/standalone/chunk-ITLLHEVG.js +1 -0
  118. package/dist/standalone/chunk-J6J54MBP.js +1 -0
  119. package/dist/standalone/chunk-JSEXCW5Q.js +1 -0
  120. package/dist/standalone/chunk-KEGAWN6Y.js +1 -0
  121. package/dist/standalone/chunk-KG3QTFWE.js +1 -0
  122. package/dist/standalone/chunk-KGS7KM4A.js +2 -0
  123. package/dist/standalone/chunk-KODWGUAB.js +1 -0
  124. package/dist/standalone/chunk-KZ6INM5M.js +1 -0
  125. package/dist/standalone/chunk-MGFEVTRI.js +1 -0
  126. package/dist/standalone/chunk-N2QDG3MW.js +1 -0
  127. package/dist/standalone/chunk-N4JI6VQD.js +1 -0
  128. package/dist/standalone/chunk-NNISYDNI.js +1 -0
  129. package/dist/standalone/chunk-O4PXDNR3.js +1 -0
  130. package/dist/standalone/chunk-O77VNUFD.js +1 -0
  131. package/dist/standalone/chunk-OD2POGPJ.js +1 -0
  132. package/dist/standalone/chunk-OXCK3ZUG.js +1 -0
  133. package/dist/standalone/chunk-P7DSVO4U.js +1 -0
  134. package/dist/standalone/chunk-PKAM3N5C.js +1 -0
  135. package/dist/standalone/chunk-QGXGBHQO.js +1 -0
  136. package/dist/standalone/chunk-QHA3TAEJ.js +1 -0
  137. package/dist/standalone/chunk-QQWC62X7.js +1 -0
  138. package/dist/standalone/chunk-RMYA7NAH.js +1 -0
  139. package/dist/standalone/chunk-RRCPZMC2.js +22 -0
  140. package/dist/standalone/chunk-S53RUBW5.js +1 -0
  141. package/dist/standalone/chunk-SB4GT6PK.js +1 -0
  142. package/dist/standalone/chunk-SEU5V7I6.js +1 -0
  143. package/dist/standalone/chunk-SHIOUDOT.js +1 -0
  144. package/dist/standalone/chunk-SIDRSX7Y.js +1 -0
  145. package/dist/standalone/chunk-SVR644RF.js +1 -0
  146. package/dist/standalone/chunk-TAD43CG5.js +1 -0
  147. package/dist/standalone/chunk-TBMYIZIO.js +1 -0
  148. package/dist/standalone/chunk-TICVNLPM.js +1 -0
  149. package/dist/standalone/chunk-TQ36RWOP.js +1 -0
  150. package/dist/standalone/chunk-UGMRUEBU.js +1 -0
  151. package/dist/standalone/chunk-UII66UVF.js +1 -0
  152. package/dist/standalone/chunk-VJPQUBN6.js +8 -0
  153. package/dist/standalone/chunk-VLXV72QE.js +1 -0
  154. package/dist/standalone/chunk-VMJKJWG6.js +1 -0
  155. package/dist/standalone/chunk-VPDPN5RR.js +2 -0
  156. package/dist/standalone/chunk-VSEGZA3J.js +1 -0
  157. package/dist/standalone/chunk-VXBZQIGY.js +4 -0
  158. package/dist/standalone/chunk-W7PCVQTE.js +1 -0
  159. package/dist/standalone/chunk-XLILSHPE.js +1 -0
  160. package/dist/standalone/chunk-XURNGQSS.js +1 -0
  161. package/dist/standalone/chunk-YJGANMU7.js +18 -0
  162. package/dist/standalone/chunk-YQQJ4N6U.js +1 -0
  163. package/dist/standalone/chunk-ZH7UES4T.js +2 -0
  164. package/dist/standalone/chunk-ZPUO7FNI.js +1 -0
  165. package/dist/standalone/chunk-ZQCVDXDL.js +1 -0
  166. package/dist/standalone/studio.js +104 -246
  167. package/dist/styles.css +1 -1
  168. package/package.json +13 -12
  169. package/dist/packem_shared/SettingsPanel-C0uLRf5P.js +0 -176
  170. package/dist/packem_shared/SqlEditorPanel-CguV7otm.js +0 -13
  171. package/dist/packem_shared/Studio-DFWAlcuf.js +0 -33
  172. package/dist/packem_shared/studio-Bj8psK1c.js +0 -10303
  173. package/dist/packem_shared/use-live-admin-Dq6g3daN.js +0 -73
  174. package/dist/packem_shared/use-live-shard-seed-Cuk3dnH0.js +0 -76
@@ -5,20 +5,21 @@ import { ConfirmButton } from './ConfirmButton-C2eVi2Qv.js';
5
5
  import { ShardInput } from './ShardInput-gx_DZXXn.js';
6
6
  import { E as EmptyState } from './empty-state-DY_oe0k6.js';
7
7
  import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
8
- import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-DmBqMZ-z.js';
9
- import { h as formatCell, f as fireAndForget, c as callOptions, a as adminRef, b as formatTimestamp } from './internal-rXJEAhXS.js';
8
+ import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-CdaxLGkE.js';
9
+ import { d as formatCell, f as fireAndForget, c as callOptions, a as adminRef, g as formatTimestamp } from './internal-FcNZ3beb.js';
10
10
  import { useReactTable, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
11
11
  import { useVirtualizer } from '@tanstack/react-virtual';
12
12
  import { C as Checkbox } from './checkbox-UNkzAxl-.js';
13
13
  import { c as cn } from './utils-B05Dmz_H.js';
14
14
  import { f as flooredRectObserver } from './virtual-rect-CVMUskSm.js';
15
- import { G as GridContainer, C as CellValue, T as TransposedTable } from './data-grid-B5CaV3wS.js';
15
+ import { G as GridContainer, C as CellValue, T as TransposedTable } from './data-grid-Dsg6nRjo.js';
16
16
  import { jsxDEV, Fragment } from 'react/jsx-dev-runtime';
17
- import { u as useFacets, T as TableListSidebar, G as GridPagination, D as DataFacets } from './table-list-sidebar-Bg7uzbvC.js';
17
+ import { u as useFacets, T as TableListSidebar, G as GridPagination, D as DataFacets } from './table-list-sidebar-VMo0ftxD.js';
18
18
  import { toFilterClauses, DataFilters } from './DataFilters-FNquMaiu.js';
19
- import { M as ModalShell, G as GridActionsBar, C as CellDetailDialog } from './grid-features-CzUfqgsM.js';
19
+ import { M as ModalShell } from './modal-shell-hyaJvIJ6.js';
20
+ import { G as GridActionsBar, C as CellDetailDialog } from './grid-features-D7nNzBYm.js';
21
+ import { u as useAdminQuery } from './use-admin-query-BViPA3US.js';
20
22
  import useDebounced from './useDebounced-Dxncpg6z.js';
21
- import { u as useLiveAdmin } from './use-live-admin-Dq6g3daN.js';
22
23
  import { r as recordShard, l as loadRecentShards } from './shard-history-DyebH1R5.js';
23
24
 
24
25
  const CAMEL_BOUNDARY_RE = /([a-z\d])([A-Z])/gu;
@@ -1564,7 +1565,7 @@ const useDataBrowserTable = (page, sorting, onSortingChange) => {
1564
1565
  };
1565
1566
  });
1566
1567
  }, [columns, references]);
1567
- const data = rows ?? [];
1568
+ const data = useMemo(() => rows ?? [], [rows]);
1568
1569
  const [rowSelection, setRowSelection] = useState({});
1569
1570
  const [columnVisibility, setColumnVisibility] = useState({});
1570
1571
  const table = useReactTable({
@@ -2160,12 +2161,12 @@ const fromOrderBy = (orderBy) => orderBy === void 0 ? [] : [{
2160
2161
  }];
2161
2162
  const MAX_BULK_DELETE_BATCHES = 200;
2162
2163
  const PREVIEW_CANDIDATES = 20;
2163
- const LIST_TABLES$1 = adminRef(ADMIN_FUNCTIONS.listTables);
2164
2164
  const READ_TABLE_PAGE$1 = adminRef(ADMIN_FUNCTIONS.readTablePage);
2165
2165
  const FACET_COLUMN = adminRef(ADMIN_FUNCTIONS.facetColumn);
2166
2166
  const WRITE_ROW$1 = adminRef(ADMIN_FUNCTIONS.writeRow);
2167
2167
  const DELETE_ROWS = adminRef(ADMIN_FUNCTIONS.deleteRows);
2168
2168
  const CLEAR_TABLE = adminRef(ADMIN_FUNCTIONS.clearTable);
2169
+ const NO_ARGS = {};
2169
2170
  const META_COLUMNS = /* @__PURE__ */ new Set(["__doc__", "__id__", "_creationTime", "_id", "id"]);
2170
2171
  const rowDocument = (row) => {
2171
2172
  const raw = row["__doc__"];
@@ -2199,18 +2200,8 @@ const useDataBrowser = ({
2199
2200
  const client = useLunora();
2200
2201
  const [pageSize, setPageSize] = useState(initialPageSize);
2201
2202
  const [shardKey, setShardKey] = useState(initialShardKey ?? "");
2202
- const hydrationRef = useRef({
2203
- filters: initialFilters,
2204
- orderBy: initialOrderBy,
2205
- search: initialSearch,
2206
- table: tableParam
2207
- });
2208
- const [tables, setTables] = useState(null);
2209
- const [tablesError, setTablesError] = useState(null);
2210
- const [selectedTable, setSelectedTable] = useState(null);
2203
+ const selectedTable = tableParam === void 0 || tableParam === "" ? null : tableParam;
2211
2204
  const [offset, setOffset] = useState(0);
2212
- const [page, setPage] = useState(null);
2213
- const [pageError, setPageError] = useState(null);
2214
2205
  const [viewMode, setViewMode] = useState("table");
2215
2206
  const [sorting, setSorting] = useState(() => fromOrderBy(initialOrderBy));
2216
2207
  const [filter, setFilter] = useState(initialSearch ?? "");
@@ -2225,183 +2216,160 @@ const useDataBrowser = ({
2225
2216
  refetchFacets,
2226
2217
  toggleFacet: toggleFacetColumn
2227
2218
  } = useFacets();
2228
- const sortingRef = useRef(sorting);
2229
- sortingRef.current = sorting;
2230
2219
  const [editing, setEditing] = useState(null);
2231
2220
  const [writeError, setWriteError] = useState(null);
2232
2221
  const stagedEdits = useStagedEdits();
2233
2222
  const [editingCell, setEditingCell] = useState(null);
2234
2223
  const [committing, setCommitting] = useState(false);
2235
- const [liveError, setLiveError] = useState(void 0);
2236
- const [loaded, setLoaded] = useState(null);
2237
- const fetchTables = useCallback(async (shard) => {
2238
- setTablesError(null);
2239
- try {
2240
- const result = await client.query(LIST_TABLES$1, {}, callOptions(shard));
2241
- recordShard(shard);
2242
- setTables(result);
2243
- } catch (error) {
2244
- setTables(null);
2245
- setTablesError(error.message);
2246
- }
2247
- }, [client]);
2248
- const fetchSeqRef = useRef(0);
2249
- const fetchPage = useCallback(async (shard_0, table, nextOffset, searchQuery) => {
2250
- fetchSeqRef.current += 1;
2251
- const seq = fetchSeqRef.current;
2252
- setPageError(null);
2253
- const activeFilters = filtersRef.current;
2254
- const activeSort = sortingRef.current;
2255
- try {
2256
- const result_0 = await client.query(READ_TABLE_PAGE$1, {
2257
- filters: toFilterClauses(activeFilters),
2258
- limit: pageSize,
2259
- offset: nextOffset,
2260
- orderBy: toOrderBy(activeSort),
2261
- search: searchQuery,
2262
- table
2263
- }, callOptions(shard_0));
2264
- if (fetchSeqRef.current !== seq) {
2265
- return;
2266
- }
2267
- setPage(result_0);
2268
- setOffset(nextOffset);
2269
- setLoaded({
2270
- filters: activeFilters,
2271
- offset: nextOffset,
2272
- pageSize,
2273
- search: searchQuery,
2274
- shard: shard_0,
2275
- sort: activeSort,
2276
- table
2277
- });
2278
- } catch (error_0) {
2279
- if (fetchSeqRef.current !== seq) {
2280
- return;
2281
- }
2282
- setPage(null);
2283
- setPageError(error_0.message);
2284
- }
2285
- }, [client, pageSize]);
2224
+ const tablesQuery = useAdminQuery(ADMIN_FUNCTIONS.listTables, NO_ARGS, {
2225
+ live: true,
2226
+ shardKey: debouncedShard
2227
+ });
2228
+ const tables = tablesQuery.data ?? null;
2229
+ const tablesError = tablesQuery.error;
2230
+ const pageArgs = useMemo(() => {
2231
+ return {
2232
+ filters: toFilterClauses(filters),
2233
+ limit: pageSize,
2234
+ offset,
2235
+ orderBy: toOrderBy(sorting),
2236
+ search,
2237
+ // The page read skips the COUNT — the total rides a separate
2238
+ // predicate-keyed query (`countArgs`) that page navigation never
2239
+ // re-keys, so paging no longer re-runs the full-table COUNT.
2240
+ skipCount: true,
2241
+ table: selectedTable ?? ""
2242
+ };
2243
+ }, [filters, pageSize, offset, sorting, search, selectedTable]);
2244
+ const countArgs = useMemo(() => {
2245
+ return {
2246
+ filters: toFilterClauses(filters),
2247
+ limit: 1,
2248
+ search,
2249
+ table: selectedTable ?? ""
2250
+ };
2251
+ }, [filters, search, selectedTable]);
2252
+ const pageQuery = useAdminQuery(ADMIN_FUNCTIONS.readTablePage, pageArgs, {
2253
+ enabled: selectedTable !== null,
2254
+ keepPreviousData: false,
2255
+ live: true,
2256
+ shardKey: debouncedShard
2257
+ });
2258
+ const page = pageQuery.data ?? null;
2259
+ const pageError = pageQuery.error;
2260
+ const {
2261
+ liveError
2262
+ } = pageQuery;
2263
+ const countQuery = useAdminQuery(ADMIN_FUNCTIONS.readTablePage, countArgs, {
2264
+ enabled: selectedTable !== null,
2265
+ live: true,
2266
+ shardKey: debouncedShard
2267
+ });
2286
2268
  useEffect(() => {
2287
- fireAndForget(fetchTables(debouncedShard));
2288
- }, [fetchTables, debouncedShard]);
2289
- useLiveAdmin(ADMIN_FUNCTIONS.readTablePage, {
2290
- filters: toFilterClauses(loaded?.filters ?? []),
2291
- limit: pageSize,
2292
- offset: loaded?.offset ?? 0,
2293
- orderBy: toOrderBy(loaded?.sort ?? []),
2294
- search: loaded?.search ?? "",
2295
- table: loaded?.table ?? ""
2296
- }, loaded?.shard ?? "", (result_1) => {
2297
- setPageError(null);
2298
- setLiveError(void 0);
2299
- setPage(result_1);
2300
- }, loaded !== null, setLiveError);
2301
- useLiveAdmin(ADMIN_FUNCTIONS.listTables, {}, loaded?.shard ?? "", (result_2) => {
2302
- setTablesError(null);
2303
- setLiveError(void 0);
2304
- setTables(result_2);
2305
- }, loaded !== null, setLiveError);
2306
- const appliedTableRef = useRef(null);
2307
- const selectTable = useCallback((table_0) => {
2308
- const hydration = hydrationRef.current?.table === void 0 || hydrationRef.current.table === table_0 ? hydrationRef.current : null;
2309
- hydrationRef.current = null;
2310
- const nextSorting = fromOrderBy(hydration?.orderBy);
2311
- const nextFilters = toEditableFilters(hydration?.filters ?? []);
2312
- const nextSearch = hydration?.search ?? "";
2313
- setSorting(nextSorting);
2314
- setFilter(nextSearch);
2315
- setFilters(nextFilters);
2316
- filtersRef.current = nextFilters;
2317
- sortingRef.current = nextSorting;
2318
- clearFacets();
2319
- stagedEdits.clear();
2320
- setEditingCell(null);
2321
- setSelectedTable(table_0);
2322
- appliedTableRef.current = table_0;
2323
- fireAndForget(fetchPage(shardKey, table_0, 0, nextSearch));
2324
- onSelectTable?.(table_0);
2325
- }, [clearFacets, fetchPage, onSelectTable, shardKey, stagedEdits]);
2269
+ if (tablesQuery.data !== void 0) {
2270
+ recordShard(debouncedShard);
2271
+ }
2272
+ }, [tablesQuery.data, debouncedShard]);
2273
+ const selectTable = useCallback((table2) => {
2274
+ onSelectTable?.(table2);
2275
+ }, [onSelectTable]);
2326
2276
  const navigateToRef = (targetTable, id) => {
2327
- setSorting([]);
2328
- setFilters([]);
2329
- filtersRef.current = [];
2330
- clearFacets();
2331
- setSelectedTable(targetTable);
2332
- appliedTableRef.current = targetTable;
2333
- setFilter(id);
2334
- fireAndForget(fetchPage(shardKey, targetTable, 0, id));
2335
- onSelectTable?.(targetTable);
2277
+ onSelectTable?.(targetTable, {
2278
+ search: id
2279
+ });
2336
2280
  };
2337
- const previewRef = async (targetTable_0, id_0) => {
2281
+ const previewRef = async (targetTable, id) => {
2338
2282
  try {
2339
- const result_3 = await client.query(READ_TABLE_PAGE$1, {
2283
+ const result = await client.query(READ_TABLE_PAGE$1, {
2340
2284
  filters: [],
2341
2285
  limit: PREVIEW_CANDIDATES,
2342
2286
  offset: 0,
2343
- search: id_0,
2344
- table: targetTable_0
2345
- }, callOptions(shardKey));
2346
- return result_3.rows.find((row) => rowId(row) === id_0) ?? null;
2287
+ search: id,
2288
+ table: targetTable
2289
+ }, callOptions(debouncedShard));
2290
+ return result.rows.find((row) => rowId(row) === id) ?? null;
2347
2291
  } catch {
2348
2292
  return null;
2349
2293
  }
2350
2294
  };
2351
- const facetFetcher = useCallback((shard_1, table_1, activeFilters_0, searchQuery_0) => (column) => client.query(FACET_COLUMN, {
2295
+ const facetFetcher = useCallback((shard, table2, activeFilters, searchQuery) => (column) => client.query(FACET_COLUMN, {
2352
2296
  column,
2353
- filters: toFilterClauses(activeFilters_0),
2354
- search: searchQuery_0,
2355
- table: table_1
2356
- }, callOptions(shard_1)), [client]);
2357
- const toggleFacet = (column_0) => {
2358
- toggleFacetColumn(column_0, selectedTable === null ? null : facetFetcher(shardKey, selectedTable, filtersRef.current, search));
2297
+ filters: toFilterClauses(activeFilters),
2298
+ search: searchQuery,
2299
+ table: table2
2300
+ }, callOptions(shard)), [client]);
2301
+ const toggleFacet = (column) => {
2302
+ toggleFacetColumn(column, selectedTable === null ? null : facetFetcher(debouncedShard, selectedTable, filtersRef.current, search));
2359
2303
  };
2360
- const facetFilter = (column_1, value) => {
2304
+ const facetFilter = (column, value) => {
2361
2305
  const text = facetValueText(value);
2362
- setFilters((current) => [...current.filter((clause) => clause.column !== column_1), {
2363
- column: column_1,
2306
+ setFilters((current) => [...current.filter((clause) => clause.column !== column), {
2307
+ column,
2364
2308
  operator: "eq",
2365
2309
  value: text
2366
2310
  }]);
2311
+ setOffset(0);
2367
2312
  };
2313
+ const facetFetcherRef = useRef(facetFetcher);
2314
+ const refetchFacetsRef = useRef(refetchFacets);
2315
+ const onViewChangeRef = useRef(onViewChange);
2316
+ facetFetcherRef.current = facetFetcher;
2317
+ refetchFacetsRef.current = refetchFacets;
2318
+ onViewChangeRef.current = onViewChange;
2368
2319
  useEffect(() => {
2369
- if (loaded === null) {
2320
+ if (selectedTable === null) {
2370
2321
  return;
2371
2322
  }
2372
- refetchFacets(facetFetcher(loaded.shard, loaded.table, loaded.filters, loaded.search));
2373
- }, [loaded, facetFetcher, refetchFacets]);
2323
+ refetchFacetsRef.current(facetFetcherRef.current(debouncedShard, selectedTable, filters, search));
2324
+ }, [debouncedShard, selectedTable, filters, search]);
2325
+ const seededTableRef = useRef(tableParam);
2374
2326
  useEffect(() => {
2375
- if (loaded === null || onViewChange === void 0) {
2327
+ if (selectedTable === null || onViewChangeRef.current === void 0 || seededTableRef.current !== tableParam) {
2376
2328
  return;
2377
2329
  }
2378
- onViewChange({
2379
- filters: toFilterClauses(loaded.filters),
2380
- orderBy: toOrderBy(loaded.sort),
2381
- search: loaded.search,
2382
- shard: loaded.shard
2330
+ onViewChangeRef.current({
2331
+ filters: toFilterClauses(filters),
2332
+ orderBy: toOrderBy(sorting),
2333
+ search,
2334
+ shard: debouncedShard
2383
2335
  });
2384
- }, [loaded, onViewChange]);
2336
+ }, [selectedTable, tableParam, filters, sorting, search, debouncedShard]);
2337
+ const initialFiltersRef = useRef(initialFilters);
2338
+ const initialOrderByRef = useRef(initialOrderBy);
2339
+ const initialSearchRef = useRef(initialSearch);
2340
+ const initialShardKeyRef = useRef(initialShardKey);
2341
+ initialFiltersRef.current = initialFilters;
2342
+ initialOrderByRef.current = initialOrderBy;
2343
+ initialSearchRef.current = initialSearch;
2344
+ initialShardKeyRef.current = initialShardKey;
2385
2345
  useEffect(() => {
2386
- if (tableParam === void 0 || tableParam === "" || tableParam === appliedTableRef.current) {
2346
+ if (seededTableRef.current === tableParam) {
2387
2347
  return;
2388
2348
  }
2389
- appliedTableRef.current = tableParam;
2390
- const target = tableParam;
2349
+ seededTableRef.current = tableParam;
2391
2350
  queueMicrotask(() => {
2392
- selectTable(target);
2351
+ const nextFilters = toEditableFilters(initialFiltersRef.current ?? []);
2352
+ setSorting(fromOrderBy(initialOrderByRef.current));
2353
+ setFilter(initialSearchRef.current ?? "");
2354
+ setFilters(nextFilters);
2355
+ filtersRef.current = nextFilters;
2356
+ setShardKey(initialShardKeyRef.current ?? "");
2357
+ clearFacets();
2358
+ stagedEdits.clear();
2359
+ setEditingCell(null);
2360
+ setOffset(0);
2393
2361
  });
2394
- }, [tableParam, selectTable]);
2395
- const goToPage = (nextOffset_0) => {
2362
+ }, [tableParam]);
2363
+ const goToPage = (nextOffset) => {
2396
2364
  if (selectedTable === null) {
2397
2365
  return;
2398
2366
  }
2399
- fireAndForget(fetchPage(shardKey, selectedTable, Math.max(0, nextOffset_0), search));
2367
+ setOffset(Math.max(0, nextOffset));
2400
2368
  };
2401
- const editableColumn = (column_2) => !META_COLUMNS.has(column_2);
2402
- const startCellEdit = (targetRow, column_3) => {
2369
+ const editableColumn = (column) => !META_COLUMNS.has(column);
2370
+ const startCellEdit = (targetRow, column) => {
2403
2371
  setEditingCell({
2404
- column: column_3,
2372
+ column,
2405
2373
  rowId: targetRow
2406
2374
  });
2407
2375
  };
@@ -2415,19 +2383,19 @@ const useDataBrowser = ({
2415
2383
  setWriteError(null);
2416
2384
  setCommitting(true);
2417
2385
  try {
2418
- for (const [id_1, columns] of Object.entries(stagedEdits.staged)) {
2386
+ for (const [id, columns] of Object.entries(stagedEdits.staged)) {
2419
2387
  await client.query(WRITE_ROW$1, {
2420
2388
  doc: columns,
2421
- id: id_1,
2389
+ id,
2422
2390
  op: "patch",
2423
2391
  table: selectedTable
2424
- }, callOptions(shardKey));
2392
+ }, callOptions(debouncedShard));
2425
2393
  }
2426
2394
  stagedEdits.clear();
2427
2395
  setEditingCell(null);
2428
- await fetchPage(shardKey, selectedTable, offset, search);
2429
- } catch (error_1) {
2430
- setWriteError(error_1.message);
2396
+ pageQuery.refetch();
2397
+ } catch (error) {
2398
+ setWriteError(error.message);
2431
2399
  } finally {
2432
2400
  setCommitting(false);
2433
2401
  }
@@ -2438,50 +2406,26 @@ const useDataBrowser = ({
2438
2406
  };
2439
2407
  const stagedChanges = useMemo(() => {
2440
2408
  const rowsById = /* @__PURE__ */ new Map();
2441
- for (const row_0 of page?.rows ?? []) {
2442
- const id_2 = rowId(row_0);
2443
- if (id_2 !== null) {
2444
- rowsById.set(id_2, row_0);
2409
+ for (const row of page?.rows ?? []) {
2410
+ const id = rowId(row);
2411
+ if (id !== null) {
2412
+ rowsById.set(id, row);
2445
2413
  }
2446
2414
  }
2447
2415
  const changes = [];
2448
- for (const [id_3, columns_0] of Object.entries(stagedEdits.staged)) {
2449
- for (const [column_4, newValue] of Object.entries(columns_0)) {
2416
+ for (const [id, columns] of Object.entries(stagedEdits.staged)) {
2417
+ for (const [column, newValue] of Object.entries(columns)) {
2450
2418
  changes.push({
2451
- column: column_4,
2419
+ column,
2452
2420
  newValue,
2453
- oldValue: rowsById.get(id_3)?.[column_4],
2454
- rowId: id_3
2421
+ oldValue: rowsById.get(id)?.[column],
2422
+ rowId: id
2455
2423
  });
2456
2424
  }
2457
2425
  }
2458
2426
  return changes;
2459
2427
  }, [page, stagedEdits.staged]);
2460
- useEffect(() => {
2461
- if (selectedTable === null || loaded === null || loaded.search === search) {
2462
- return;
2463
- }
2464
- fireAndForget(fetchPage(shardKey, selectedTable, 0, search));
2465
- }, [search, selectedTable, shardKey, loaded, fetchPage]);
2466
- useEffect(() => {
2467
- if (selectedTable === null || loaded === null || loaded.filters === filters) {
2468
- return;
2469
- }
2470
- fireAndForget(fetchPage(shardKey, selectedTable, 0, search));
2471
- }, [filters, selectedTable, shardKey, loaded, search, fetchPage]);
2472
- useEffect(() => {
2473
- if (selectedTable === null || loaded === null || loaded.sort === sorting) {
2474
- return;
2475
- }
2476
- fireAndForget(fetchPage(shardKey, selectedTable, 0, search));
2477
- }, [sorting, selectedTable, shardKey, loaded, search, fetchPage]);
2478
- useEffect(() => {
2479
- if (selectedTable === null || loaded === null || loaded.pageSize === pageSize) {
2480
- return;
2481
- }
2482
- fireAndForget(fetchPage(shardKey, selectedTable, 0, search));
2483
- }, [pageSize, selectedTable, shardKey, loaded, search, fetchPage]);
2484
- const writeRow = async (op, id_4, documentText) => {
2428
+ const writeRow = async (op, id, documentText) => {
2485
2429
  if (selectedTable === null) {
2486
2430
  return;
2487
2431
  }
@@ -2490,22 +2434,22 @@ const useDataBrowser = ({
2490
2434
  if (op !== "delete") {
2491
2435
  try {
2492
2436
  parsedDocument = documentText === void 0 || documentText.trim() === "" ? {} : JSON.parse(documentText);
2493
- } catch (error_2) {
2494
- setWriteError(`Invalid JSON: ${error_2.message}`);
2437
+ } catch (error) {
2438
+ setWriteError(`Invalid JSON: ${error.message}`);
2495
2439
  return;
2496
2440
  }
2497
2441
  }
2498
2442
  try {
2499
2443
  await client.query(WRITE_ROW$1, {
2500
2444
  doc: parsedDocument,
2501
- id: id_4 ?? void 0,
2445
+ id: id ?? void 0,
2502
2446
  op,
2503
2447
  table: selectedTable
2504
- }, callOptions(shardKey));
2448
+ }, callOptions(debouncedShard));
2505
2449
  setEditing(null);
2506
- await fetchPage(shardKey, selectedTable, offset, search);
2507
- } catch (error_3) {
2508
- setWriteError(error_3.message);
2450
+ pageQuery.refetch();
2451
+ } catch (error) {
2452
+ setWriteError(error.message);
2509
2453
  }
2510
2454
  };
2511
2455
  const drainBulk = async (ref, args) => {
@@ -2515,17 +2459,22 @@ const useDataBrowser = ({
2515
2459
  setWriteError(null);
2516
2460
  try {
2517
2461
  for (let batch = 0; batch < MAX_BULK_DELETE_BATCHES; batch += 1) {
2518
- const result_4 = await client.query(ref, args, callOptions(shardKey));
2519
- if (!result_4.hasMore) {
2462
+ const result = await client.query(ref, args, callOptions(debouncedShard));
2463
+ if (!result.hasMore) {
2520
2464
  break;
2521
2465
  }
2522
2466
  }
2523
- await fetchPage(shardKey, selectedTable, 0, search);
2524
- } catch (error_4) {
2525
- setWriteError(error_4.message);
2467
+ setOffset(0);
2468
+ pageQuery.refetch();
2469
+ } catch (error) {
2470
+ setWriteError(error.message);
2526
2471
  }
2527
2472
  };
2528
- const table_2 = useDataBrowserTable(page, sorting, setSorting);
2473
+ const changeSorting = (updater) => {
2474
+ setSorting(updater);
2475
+ setOffset(0);
2476
+ };
2477
+ const table = useDataBrowserTable(page, sorting, changeSorting);
2529
2478
  const currentView = {
2530
2479
  filters: toFilterClauses(filters),
2531
2480
  orderBy: toOrderBy(sorting),
@@ -2533,13 +2482,13 @@ const useDataBrowser = ({
2533
2482
  shard: shardKey,
2534
2483
  table: selectedTable ?? void 0
2535
2484
  };
2536
- const total = page?.total ?? 0;
2485
+ const total = countQuery.data?.total ?? (page === null ? 0 : offset + page.rows.length);
2537
2486
  const hasPrevious = offset > 0;
2538
2487
  const hasNext = page !== null && offset + page.rows.length < total;
2539
2488
  const rangeStart = page === null || page.rows.length === 0 ? 0 : offset + 1;
2540
2489
  const rangeEnd = page === null ? 0 : offset + page.rows.length;
2541
2490
  const loadTables = () => {
2542
- fireAndForget(fetchTables(shardKey));
2491
+ tablesQuery.refetch();
2543
2492
  };
2544
2493
  const showTable = () => {
2545
2494
  setViewMode("table");
@@ -2561,13 +2510,18 @@ const useDataBrowser = ({
2561
2510
  };
2562
2511
  const onFilterChange = (event) => {
2563
2512
  setFilter(event.target.value);
2513
+ setOffset(0);
2514
+ };
2515
+ const changeFilters = (next) => {
2516
+ setFilters(next);
2517
+ setOffset(0);
2564
2518
  };
2565
2519
  const addRow = () => {
2566
2520
  setWriteError(null);
2567
2521
  const seed = {};
2568
- for (const column_5 of page?.columns ?? []) {
2569
- if (!META_COLUMNS.has(column_5)) {
2570
- seed[column_5] = "";
2522
+ for (const column of page?.columns ?? []) {
2523
+ if (!META_COLUMNS.has(column)) {
2524
+ seed[column] = "";
2571
2525
  }
2572
2526
  }
2573
2527
  setEditing({
@@ -2575,10 +2529,10 @@ const useDataBrowser = ({
2575
2529
  id: ""
2576
2530
  });
2577
2531
  };
2578
- const setEditorDocumentText = (text_0) => {
2579
- setEditing((current_0) => current_0 === null ? current_0 : {
2580
- docText: text_0,
2581
- id: current_0.id
2532
+ const setEditorDocumentText = (text) => {
2533
+ setEditing((current) => current === null ? current : {
2534
+ docText: text,
2535
+ id: current.id
2582
2536
  });
2583
2537
  };
2584
2538
  const saveEdit = () => {
@@ -2604,15 +2558,15 @@ const useDataBrowser = ({
2604
2558
  setPageSize(size);
2605
2559
  setOffset(0);
2606
2560
  };
2607
- const onRowEdit = (id_5, original) => {
2561
+ const onRowEdit = (id, original) => {
2608
2562
  setWriteError(null);
2609
2563
  setEditing({
2610
2564
  docText: JSON.stringify(rowDocument(original), null, 2),
2611
- id: id_5
2565
+ id
2612
2566
  });
2613
2567
  };
2614
- const onRowDelete = (id_6) => {
2615
- fireAndForget(writeRow("delete", id_6));
2568
+ const onRowDelete = (id) => {
2569
+ fireAndForget(writeRow("delete", id));
2616
2570
  };
2617
2571
  const deleteSelected = async (ids) => {
2618
2572
  if (selectedTable === null || ids.length === 0) {
@@ -2620,20 +2574,20 @@ const useDataBrowser = ({
2620
2574
  }
2621
2575
  setWriteError(null);
2622
2576
  try {
2623
- for (const id_7 of ids) {
2577
+ for (const id of ids) {
2624
2578
  await client.query(WRITE_ROW$1, {
2625
- id: id_7,
2579
+ id,
2626
2580
  op: "delete",
2627
2581
  table: selectedTable
2628
- }, callOptions(shardKey));
2582
+ }, callOptions(debouncedShard));
2629
2583
  }
2630
- await fetchPage(shardKey, selectedTable, offset, search);
2631
- } catch (error_5) {
2632
- setWriteError(error_5.message);
2584
+ pageQuery.refetch();
2585
+ } catch (error) {
2586
+ setWriteError(error.message);
2633
2587
  }
2634
2588
  };
2635
- const onBulkDeleteSelected = (ids_0) => {
2636
- fireAndForget(deleteSelected(ids_0));
2589
+ const onBulkDeleteSelected = (ids) => {
2590
+ fireAndForget(deleteSelected(ids));
2637
2591
  };
2638
2592
  const onCommitStaged = () => {
2639
2593
  fireAndForget(commitStaged());
@@ -2667,7 +2621,7 @@ const useDataBrowser = ({
2667
2621
  onBulkDeleteSelected,
2668
2622
  onCommitStaged,
2669
2623
  onFilterChange,
2670
- onFiltersChange: setFilters,
2624
+ onFiltersChange: changeFilters,
2671
2625
  onRowDelete,
2672
2626
  onRowEdit,
2673
2627
  page,
@@ -2688,7 +2642,7 @@ const useDataBrowser = ({
2688
2642
  stagedChanges,
2689
2643
  stagedValue: stagedEdits.stagedValue,
2690
2644
  startCellEdit,
2691
- table: table_2,
2645
+ table,
2692
2646
  tables,
2693
2647
  tablesError,
2694
2648
  toggleFacet,
@@ -2812,23 +2766,20 @@ const useGenerateRows = (onRefresh) => {
2812
2766
  };
2813
2767
  };
2814
2768
 
2815
- const MASK_POLICIES = adminRef(ADMIN_FUNCTIONS.maskPolicies);
2816
2769
  const NO_COLUMNS = [];
2817
2770
  const useMaskPolicies = () => {
2818
- const client = useLunora();
2819
- const [columns, setColumns] = useState(NO_COLUMNS);
2820
- const refresh = async () => {
2821
- try {
2822
- const result = await client.query(MASK_POLICIES, {}, callOptions(""));
2823
- setColumns(Array.isArray(result.columns) ? result.columns : NO_COLUMNS);
2824
- } catch {
2825
- setColumns(NO_COLUMNS);
2826
- }
2827
- };
2828
- useEffect(() => {
2829
- fireAndForget(refresh());
2830
- }, [refresh]);
2831
- return columns;
2771
+ const $ = c(1);
2772
+ let t0;
2773
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
2774
+ t0 = {};
2775
+ $[0] = t0;
2776
+ } else {
2777
+ t0 = $[0];
2778
+ }
2779
+ const {
2780
+ data
2781
+ } = useAdminQuery(ADMIN_FUNCTIONS.maskPolicies, t0);
2782
+ return Array.isArray(data?.columns) ? data.columns : NO_COLUMNS;
2832
2783
  };
2833
2784
 
2834
2785
  const TIMESTAMP_RE$1 = /(?:_creationtime|(?:^|[a-z])(?:time|at))$/iu;