@kernhq/module-quire 0.7.4 → 0.9.0

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 (88) hide show
  1. package/README.md +93 -55
  2. package/dist/{server → client}/formula.d.ts +6 -0
  3. package/dist/client/formula.d.ts.map +1 -0
  4. package/dist/{server → client}/formula.js +6 -0
  5. package/dist/client/formula.js.map +1 -0
  6. package/dist/contract/properties.d.ts +26 -0
  7. package/dist/contract/properties.d.ts.map +1 -1
  8. package/dist/contract/properties.js +24 -0
  9. package/dist/contract/properties.js.map +1 -1
  10. package/dist/contract/router.d.ts +334 -0
  11. package/dist/contract/router.d.ts.map +1 -1
  12. package/dist/contract/router.js +43 -1
  13. package/dist/contract/router.js.map +1 -1
  14. package/dist/server/_impl.d.ts +341 -0
  15. package/dist/server/_impl.d.ts.map +1 -1
  16. package/dist/server/_impl.js +79 -10
  17. package/dist/server/_impl.js.map +1 -1
  18. package/dist/server/document.d.ts +13 -0
  19. package/dist/server/document.d.ts.map +1 -0
  20. package/dist/server/document.js +58 -0
  21. package/dist/server/document.js.map +1 -0
  22. package/dist/server/index.d.ts.map +1 -1
  23. package/dist/server/index.js +26 -1
  24. package/dist/server/index.js.map +1 -1
  25. package/dist/server/render.d.ts +53 -0
  26. package/dist/server/render.d.ts.map +1 -0
  27. package/dist/server/render.js +358 -0
  28. package/dist/server/render.js.map +1 -0
  29. package/dist/server/services/databases.d.ts +73 -1
  30. package/dist/server/services/databases.d.ts.map +1 -1
  31. package/dist/server/services/databases.js +167 -10
  32. package/dist/server/services/databases.js.map +1 -1
  33. package/dist/server/services/pages.d.ts.map +1 -1
  34. package/dist/server/services/pages.js +11 -1
  35. package/dist/server/services/pages.js.map +1 -1
  36. package/dist/server/services/query.d.ts.map +1 -1
  37. package/dist/server/services/query.js +93 -37
  38. package/dist/server/services/query.js.map +1 -1
  39. package/dist/server/services/versions.d.ts.map +1 -1
  40. package/dist/server/services/versions.js +13 -1
  41. package/dist/server/services/versions.js.map +1 -1
  42. package/migrations/0006_rank_collation.sql +14 -0
  43. package/migrations/meta/_journal.json +7 -0
  44. package/package.json +12 -9
  45. package/src/client/components/PageEditor.svelte +7 -0
  46. package/src/client/components/PageTreeRow.svelte +1 -1
  47. package/src/client/core-api.ts +38 -0
  48. package/src/client/database/BoardView.svelte +354 -0
  49. package/src/client/database/CalendarView.svelte +346 -0
  50. package/src/client/database/DatabaseView.svelte +785 -0
  51. package/src/client/database/FilterMenu.svelte +281 -0
  52. package/src/client/database/FilterValue.svelte +176 -0
  53. package/src/client/database/GalleryView.svelte +177 -0
  54. package/src/client/database/ListView.svelte +108 -0
  55. package/src/client/database/OptionChip.svelte +38 -0
  56. package/src/client/database/PropertyDialog.svelte +460 -0
  57. package/src/client/database/PropertyMenu.svelte +162 -0
  58. package/src/client/database/RowPanel.svelte +157 -0
  59. package/src/client/database/SortMenu.svelte +199 -0
  60. package/src/client/database/TableView.svelte +388 -0
  61. package/src/client/database/ViewDialog.svelte +229 -0
  62. package/src/client/database/cells/Cell.svelte +103 -0
  63. package/src/client/database/cells/CheckboxCell.svelte +33 -0
  64. package/src/client/database/cells/ComputedCell.svelte +100 -0
  65. package/src/client/database/cells/DateCell.svelte +97 -0
  66. package/src/client/database/cells/LinkCell.svelte +143 -0
  67. package/src/client/database/cells/NumberCell.svelte +131 -0
  68. package/src/client/database/cells/PersonCell.svelte +116 -0
  69. package/src/client/database/cells/RelationCell.svelte +222 -0
  70. package/src/client/database/cells/SelectCell.svelte +133 -0
  71. package/src/client/database/cells/TextCell.svelte +85 -0
  72. package/src/client/database/colours.ts +27 -0
  73. package/src/client/database/property-types.test.ts +64 -0
  74. package/src/client/database/property-types.ts +294 -0
  75. package/src/client/database/view-config.test.ts +148 -0
  76. package/src/client/database/view-config.ts +102 -0
  77. package/src/client/formula.test.ts +139 -0
  78. package/src/client/formula.ts +430 -0
  79. package/src/client/i18n.ts +1176 -0
  80. package/src/client/index.ts +31 -0
  81. package/src/client/mock.ts +511 -1
  82. package/src/client/pages/PageView.svelte +47 -17
  83. package/src/client/pages/SpacePage.svelte +8 -2
  84. package/src/client/query.ts +17 -4
  85. package/src/contract/properties.ts +28 -0
  86. package/src/contract/router.ts +46 -0
  87. package/dist/server/formula.d.ts.map +0 -1
  88. package/dist/server/formula.js.map +0 -1
@@ -1487,6 +1487,249 @@ export declare function implement_(kernel: Kernel): {
1487
1487
  }, import("zod/v4/core").$strip>;
1488
1488
  };
1489
1489
  }>>, Record<never, never>>;
1490
+ list: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<RequestContext & Record<never, never>, RequestContext & Record<never, never> & Omit<RequestContext & Record<never, never>, keyof RequestContext> & Omit<RequestContext & Record<never, never>, "workspaceId" | "kernel" | "principal" | "requestId" | "ip" | "headers">, RequestContext>, Omit<import("@orpc/server").MergedCurrentContext<RequestContext, {
1491
+ workspaceId: string;
1492
+ kernel: Kernel;
1493
+ principal: import("@kernhq/contracts").Principal;
1494
+ requestId: string;
1495
+ ip: string;
1496
+ headers: Record<string, string | string[] | undefined>;
1497
+ }>, never> & Record<never, never>, import("zod").ZodObject<{
1498
+ workspaceId: import("zod/v4/core").$ZodBranded<import("zod").ZodUUID, "WorkspaceId", "out">;
1499
+ spaceId: import("zod").ZodUUID;
1500
+ }, import("zod/v4/core").$strip>, import("zod").ZodArray<import("zod").ZodObject<{
1501
+ id: import("zod").ZodUUID;
1502
+ pageId: import("zod").ZodUUID;
1503
+ name: import("zod").ZodString;
1504
+ }, import("zod/v4/core").$strip>>, import("@orpc/server").MergedErrorMap<Record<never, never>, import("@orpc/server").MergedErrorMap<Record<never, never>, {
1505
+ BAD_REQUEST: {
1506
+ data: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
1507
+ };
1508
+ UNAUTHORIZED: {};
1509
+ FORBIDDEN: {
1510
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
1511
+ permission: import("zod").ZodOptional<import("zod").ZodString>;
1512
+ }, import("zod/v4/core").$strip>>;
1513
+ };
1514
+ NOT_FOUND: {};
1515
+ CONFLICT: {
1516
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
1517
+ reason: import("zod").ZodOptional<import("zod").ZodString>;
1518
+ }, import("zod/v4/core").$strip>>;
1519
+ };
1520
+ RATE_LIMITED: {};
1521
+ MODULE_DISABLED: {
1522
+ data: import("zod").ZodObject<{
1523
+ module: import("zod").ZodString;
1524
+ }, import("zod/v4/core").$strip>;
1525
+ };
1526
+ }>>, Record<never, never>>;
1527
+ forPage: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<RequestContext & Record<never, never>, RequestContext & Record<never, never> & Omit<RequestContext & Record<never, never>, keyof RequestContext> & Omit<RequestContext & Record<never, never>, "workspaceId" | "kernel" | "principal" | "requestId" | "ip" | "headers">, RequestContext>, Omit<import("@orpc/server").MergedCurrentContext<RequestContext, {
1528
+ workspaceId: string;
1529
+ kernel: Kernel;
1530
+ principal: import("@kernhq/contracts").Principal;
1531
+ requestId: string;
1532
+ ip: string;
1533
+ headers: Record<string, string | string[] | undefined>;
1534
+ }>, never> & Record<never, never>, import("zod").ZodObject<{
1535
+ workspaceId: import("zod/v4/core").$ZodBranded<import("zod").ZodUUID, "WorkspaceId", "out">;
1536
+ pageId: import("zod").ZodUUID;
1537
+ }, import("zod/v4/core").$strip>, import("zod").ZodNullable<import("zod").ZodObject<{
1538
+ id: import("zod").ZodUUID;
1539
+ workspaceId: import("zod").ZodString;
1540
+ spaceId: import("zod").ZodUUID;
1541
+ pageId: import("zod").ZodUUID;
1542
+ name: import("zod").ZodString;
1543
+ description: import("zod").ZodString;
1544
+ inline: import("zod").ZodBoolean;
1545
+ properties: import("zod").ZodArray<import("zod").ZodObject<{
1546
+ id: import("zod").ZodUUID;
1547
+ databaseId: import("zod").ZodUUID;
1548
+ key: import("zod").ZodString;
1549
+ name: import("zod").ZodString;
1550
+ type: import("zod").ZodEnum<{
1551
+ number: "number";
1552
+ date: "date";
1553
+ email: "email";
1554
+ text: "text";
1555
+ select: "select";
1556
+ multi_select: "multi_select";
1557
+ status: "status";
1558
+ person: "person";
1559
+ files: "files";
1560
+ checkbox: "checkbox";
1561
+ url: "url";
1562
+ phone: "phone";
1563
+ relation: "relation";
1564
+ rollup: "rollup";
1565
+ formula: "formula";
1566
+ created_time: "created_time";
1567
+ created_by: "created_by";
1568
+ edited_time: "edited_time";
1569
+ edited_by: "edited_by";
1570
+ }>;
1571
+ config: import("zod").ZodObject<{
1572
+ options: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
1573
+ id: import("zod").ZodString;
1574
+ label: import("zod").ZodString;
1575
+ colour: import("zod").ZodDefault<import("zod").ZodString>;
1576
+ group: import("zod").ZodOptional<import("zod").ZodEnum<{
1577
+ todo: "todo";
1578
+ doing: "doing";
1579
+ done: "done";
1580
+ }>>;
1581
+ }, import("zod/v4/core").$strip>>>;
1582
+ format: import("zod").ZodOptional<import("zod").ZodString>;
1583
+ precision: import("zod").ZodOptional<import("zod").ZodNumber>;
1584
+ includeTime: import("zod").ZodOptional<import("zod").ZodBoolean>;
1585
+ isRange: import("zod").ZodOptional<import("zod").ZodBoolean>;
1586
+ relationDatabaseId: import("zod").ZodOptional<import("zod").ZodUUID>;
1587
+ relationPropertyId: import("zod").ZodOptional<import("zod").ZodUUID>;
1588
+ rollupRelationPropertyId: import("zod").ZodOptional<import("zod").ZodUUID>;
1589
+ rollupTargetPropertyId: import("zod").ZodOptional<import("zod").ZodUUID>;
1590
+ rollupFunction: import("zod").ZodOptional<import("zod").ZodEnum<{
1591
+ count: "count";
1592
+ count_values: "count_values";
1593
+ count_unique: "count_unique";
1594
+ sum: "sum";
1595
+ average: "average";
1596
+ min: "min";
1597
+ max: "max";
1598
+ range: "range";
1599
+ show_original: "show_original";
1600
+ checked: "checked";
1601
+ unchecked: "unchecked";
1602
+ percent_checked: "percent_checked";
1603
+ }>>;
1604
+ expression: import("zod").ZodOptional<import("zod").ZodString>;
1605
+ multiple: import("zod").ZodOptional<import("zod").ZodBoolean>;
1606
+ }, import("zod/v4/core").$strip>;
1607
+ position: import("zod").ZodString;
1608
+ hidden: import("zod").ZodBoolean;
1609
+ }, import("zod/v4/core").$strip>>;
1610
+ views: import("zod").ZodArray<import("zod").ZodObject<{
1611
+ id: import("zod").ZodUUID;
1612
+ databaseId: import("zod").ZodUUID;
1613
+ name: import("zod").ZodString;
1614
+ kind: import("zod").ZodEnum<{
1615
+ table: "table";
1616
+ board: "board";
1617
+ calendar: "calendar";
1618
+ gallery: "gallery";
1619
+ list: "list";
1620
+ timeline: "timeline";
1621
+ }>;
1622
+ config: import("zod").ZodObject<{
1623
+ filters: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
1624
+ propertyKey: import("zod").ZodString;
1625
+ operator: import("zod").ZodEnum<{
1626
+ equals: "equals";
1627
+ not_equals: "not_equals";
1628
+ contains: "contains";
1629
+ not_contains: "not_contains";
1630
+ starts_with: "starts_with";
1631
+ ends_with: "ends_with";
1632
+ is_empty: "is_empty";
1633
+ is_not_empty: "is_not_empty";
1634
+ greater_than: "greater_than";
1635
+ less_than: "less_than";
1636
+ on_or_before: "on_or_before";
1637
+ on_or_after: "on_or_after";
1638
+ is_any_of: "is_any_of";
1639
+ is_none_of: "is_none_of";
1640
+ }>;
1641
+ value: import("zod").ZodOptional<import("zod").ZodUnknown>;
1642
+ }, import("zod/v4/core").$strip>>>;
1643
+ filterMode: import("zod").ZodDefault<import("zod").ZodEnum<{
1644
+ and: "and";
1645
+ or: "or";
1646
+ }>>;
1647
+ sorts: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
1648
+ propertyKey: import("zod").ZodString;
1649
+ direction: import("zod").ZodDefault<import("zod").ZodEnum<{
1650
+ asc: "asc";
1651
+ desc: "desc";
1652
+ }>>;
1653
+ }, import("zod/v4/core").$strip>>>;
1654
+ groupBy: import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodString>>;
1655
+ dateProperty: import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodString>>;
1656
+ visibleProperties: import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodString>>>;
1657
+ columnWidths: import("zod").ZodDefault<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodNumber>>;
1658
+ cardSize: import("zod").ZodDefault<import("zod").ZodEnum<{
1659
+ small: "small";
1660
+ medium: "medium";
1661
+ large: "large";
1662
+ }>>;
1663
+ coverProperty: import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodString>>;
1664
+ }, import("zod/v4/core").$strip>;
1665
+ position: import("zod").ZodString;
1666
+ isDefault: import("zod").ZodBoolean;
1667
+ }, import("zod/v4/core").$strip>>;
1668
+ createdAt: import("zod").ZodISODateTime;
1669
+ updatedAt: import("zod").ZodISODateTime;
1670
+ }, import("zod/v4/core").$strip>>, import("@orpc/server").MergedErrorMap<Record<never, never>, import("@orpc/server").MergedErrorMap<Record<never, never>, {
1671
+ BAD_REQUEST: {
1672
+ data: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
1673
+ };
1674
+ UNAUTHORIZED: {};
1675
+ FORBIDDEN: {
1676
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
1677
+ permission: import("zod").ZodOptional<import("zod").ZodString>;
1678
+ }, import("zod/v4/core").$strip>>;
1679
+ };
1680
+ NOT_FOUND: {};
1681
+ CONFLICT: {
1682
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
1683
+ reason: import("zod").ZodOptional<import("zod").ZodString>;
1684
+ }, import("zod/v4/core").$strip>>;
1685
+ };
1686
+ RATE_LIMITED: {};
1687
+ MODULE_DISABLED: {
1688
+ data: import("zod").ZodObject<{
1689
+ module: import("zod").ZodString;
1690
+ }, import("zod/v4/core").$strip>;
1691
+ };
1692
+ }>>, Record<never, never>>;
1693
+ lookup: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<RequestContext & Record<never, never>, RequestContext & Record<never, never> & Omit<RequestContext & Record<never, never>, keyof RequestContext> & Omit<RequestContext & Record<never, never>, "workspaceId" | "kernel" | "principal" | "requestId" | "ip" | "headers">, RequestContext>, Omit<import("@orpc/server").MergedCurrentContext<RequestContext, {
1694
+ workspaceId: string;
1695
+ kernel: Kernel;
1696
+ principal: import("@kernhq/contracts").Principal;
1697
+ requestId: string;
1698
+ ip: string;
1699
+ headers: Record<string, string | string[] | undefined>;
1700
+ }>, never> & Record<never, never>, import("zod").ZodObject<{
1701
+ workspaceId: import("zod/v4/core").$ZodBranded<import("zod").ZodUUID, "WorkspaceId", "out">;
1702
+ databaseId: import("zod").ZodUUID;
1703
+ query: import("zod").ZodDefault<import("zod").ZodString>;
1704
+ ids: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodUUID>>;
1705
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
1706
+ }, import("zod/v4/core").$strip>, import("zod").ZodArray<import("zod").ZodObject<{
1707
+ id: import("zod").ZodUUID;
1708
+ title: import("zod").ZodString;
1709
+ icon: import("zod").ZodNullable<import("zod").ZodString>;
1710
+ }, import("zod/v4/core").$strip>>, import("@orpc/server").MergedErrorMap<Record<never, never>, import("@orpc/server").MergedErrorMap<Record<never, never>, {
1711
+ BAD_REQUEST: {
1712
+ data: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
1713
+ };
1714
+ UNAUTHORIZED: {};
1715
+ FORBIDDEN: {
1716
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
1717
+ permission: import("zod").ZodOptional<import("zod").ZodString>;
1718
+ }, import("zod/v4/core").$strip>>;
1719
+ };
1720
+ NOT_FOUND: {};
1721
+ CONFLICT: {
1722
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
1723
+ reason: import("zod").ZodOptional<import("zod").ZodString>;
1724
+ }, import("zod/v4/core").$strip>>;
1725
+ };
1726
+ RATE_LIMITED: {};
1727
+ MODULE_DISABLED: {
1728
+ data: import("zod").ZodObject<{
1729
+ module: import("zod").ZodString;
1730
+ }, import("zod/v4/core").$strip>;
1731
+ };
1732
+ }>>, Record<never, never>>;
1490
1733
  create: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<RequestContext & Record<never, never>, RequestContext & Record<never, never> & Omit<RequestContext & Record<never, never>, keyof RequestContext> & Omit<RequestContext & Record<never, never>, "workspaceId" | "kernel" | "principal" | "requestId" | "ip" | "headers">, RequestContext>, Omit<import("@orpc/server").MergedCurrentContext<RequestContext, {
1491
1734
  workspaceId: string;
1492
1735
  kernel: Kernel;
@@ -2110,6 +2353,104 @@ export declare function implement_(kernel: Kernel): {
2110
2353
  }, import("zod/v4/core").$strip>;
2111
2354
  };
2112
2355
  }>>, Record<never, never>>;
2356
+ moveProperty: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<RequestContext & Record<never, never>, RequestContext & Record<never, never> & Omit<RequestContext & Record<never, never>, keyof RequestContext> & Omit<RequestContext & Record<never, never>, "workspaceId" | "kernel" | "principal" | "requestId" | "ip" | "headers">, RequestContext>, Omit<import("@orpc/server").MergedCurrentContext<RequestContext, {
2357
+ workspaceId: string;
2358
+ kernel: Kernel;
2359
+ principal: import("@kernhq/contracts").Principal;
2360
+ requestId: string;
2361
+ ip: string;
2362
+ headers: Record<string, string | string[] | undefined>;
2363
+ }>, never> & Record<never, never>, import("zod").ZodObject<{
2364
+ workspaceId: import("zod/v4/core").$ZodBranded<import("zod").ZodUUID, "WorkspaceId", "out">;
2365
+ propertyId: import("zod").ZodUUID;
2366
+ afterId: import("zod").ZodDefault<import("zod").ZodNullable<import("zod").ZodUUID>>;
2367
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
2368
+ id: import("zod").ZodUUID;
2369
+ databaseId: import("zod").ZodUUID;
2370
+ key: import("zod").ZodString;
2371
+ name: import("zod").ZodString;
2372
+ type: import("zod").ZodEnum<{
2373
+ number: "number";
2374
+ date: "date";
2375
+ email: "email";
2376
+ text: "text";
2377
+ select: "select";
2378
+ multi_select: "multi_select";
2379
+ status: "status";
2380
+ person: "person";
2381
+ files: "files";
2382
+ checkbox: "checkbox";
2383
+ url: "url";
2384
+ phone: "phone";
2385
+ relation: "relation";
2386
+ rollup: "rollup";
2387
+ formula: "formula";
2388
+ created_time: "created_time";
2389
+ created_by: "created_by";
2390
+ edited_time: "edited_time";
2391
+ edited_by: "edited_by";
2392
+ }>;
2393
+ config: import("zod").ZodObject<{
2394
+ options: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
2395
+ id: import("zod").ZodString;
2396
+ label: import("zod").ZodString;
2397
+ colour: import("zod").ZodDefault<import("zod").ZodString>;
2398
+ group: import("zod").ZodOptional<import("zod").ZodEnum<{
2399
+ todo: "todo";
2400
+ doing: "doing";
2401
+ done: "done";
2402
+ }>>;
2403
+ }, import("zod/v4/core").$strip>>>;
2404
+ format: import("zod").ZodOptional<import("zod").ZodString>;
2405
+ precision: import("zod").ZodOptional<import("zod").ZodNumber>;
2406
+ includeTime: import("zod").ZodOptional<import("zod").ZodBoolean>;
2407
+ isRange: import("zod").ZodOptional<import("zod").ZodBoolean>;
2408
+ relationDatabaseId: import("zod").ZodOptional<import("zod").ZodUUID>;
2409
+ relationPropertyId: import("zod").ZodOptional<import("zod").ZodUUID>;
2410
+ rollupRelationPropertyId: import("zod").ZodOptional<import("zod").ZodUUID>;
2411
+ rollupTargetPropertyId: import("zod").ZodOptional<import("zod").ZodUUID>;
2412
+ rollupFunction: import("zod").ZodOptional<import("zod").ZodEnum<{
2413
+ count: "count";
2414
+ count_values: "count_values";
2415
+ count_unique: "count_unique";
2416
+ sum: "sum";
2417
+ average: "average";
2418
+ min: "min";
2419
+ max: "max";
2420
+ range: "range";
2421
+ show_original: "show_original";
2422
+ checked: "checked";
2423
+ unchecked: "unchecked";
2424
+ percent_checked: "percent_checked";
2425
+ }>>;
2426
+ expression: import("zod").ZodOptional<import("zod").ZodString>;
2427
+ multiple: import("zod").ZodOptional<import("zod").ZodBoolean>;
2428
+ }, import("zod/v4/core").$strip>;
2429
+ position: import("zod").ZodString;
2430
+ hidden: import("zod").ZodBoolean;
2431
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, import("@orpc/server").MergedErrorMap<Record<never, never>, {
2432
+ BAD_REQUEST: {
2433
+ data: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
2434
+ };
2435
+ UNAUTHORIZED: {};
2436
+ FORBIDDEN: {
2437
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
2438
+ permission: import("zod").ZodOptional<import("zod").ZodString>;
2439
+ }, import("zod/v4/core").$strip>>;
2440
+ };
2441
+ NOT_FOUND: {};
2442
+ CONFLICT: {
2443
+ data: import("zod").ZodOptional<import("zod").ZodObject<{
2444
+ reason: import("zod").ZodOptional<import("zod").ZodString>;
2445
+ }, import("zod/v4/core").$strip>>;
2446
+ };
2447
+ RATE_LIMITED: {};
2448
+ MODULE_DISABLED: {
2449
+ data: import("zod").ZodObject<{
2450
+ module: import("zod").ZodString;
2451
+ }, import("zod/v4/core").$strip>;
2452
+ };
2453
+ }>>, Record<never, never>>;
2113
2454
  removeProperty: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<RequestContext & Record<never, never>, RequestContext & Record<never, never> & Omit<RequestContext & Record<never, never>, keyof RequestContext> & Omit<RequestContext & Record<never, never>, "workspaceId" | "kernel" | "principal" | "requestId" | "ip" | "headers">, RequestContext>, Omit<import("@orpc/server").MergedCurrentContext<RequestContext, {
2114
2455
  workspaceId: string;
2115
2456
  kernel: Kernel;
@@ -1 +1 @@
1
- {"version":3,"file":"_impl.d.ts","sourceRoot":"","sources":["../../src/server/_impl.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAElB,KAAK,MAAM,EACX,cAAc,EACd,KAAK,cAAc,EAGpB,MAAM,gBAAgB,CAAA;AASvB;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA;AAI3D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4lBxC"}
1
+ {"version":3,"file":"_impl.d.ts","sourceRoot":"","sources":["../../src/server/_impl.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAElB,KAAK,MAAM,EACX,cAAc,EACd,KAAK,cAAc,EAGpB,MAAM,gBAAgB,CAAA;AASvB;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA;AAI3D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmrBxC"}
@@ -287,6 +287,26 @@ export function implement_(kernel) {
287
287
  get: scoped.databases.get
288
288
  .use(requires('quire.page.view'))
289
289
  .handler(({ input, context }) => run(context, input.workspaceId, (tx) => svc.databases.get(tx, input.workspaceId, input.databaseId))),
290
+ list: scoped.databases.list.use(requires('quire.page.view')).handler(({ input, context }) => run(context, input.workspaceId, async (tx) => {
291
+ await svc.access.spaceRow(tx, input.workspaceId, input.spaceId);
292
+ await svc.access.requireSpace(context.principal, 'quire.space.view', input.workspaceId, input.spaceId);
293
+ return svc.databases.list(tx, input.workspaceId, input.spaceId);
294
+ })),
295
+ forPage: scoped.databases.forPage.use(requires('quire.page.view')).handler(({ input, context }) => run(context, input.workspaceId, async (tx) => {
296
+ const scope = await svc.access.scopeOf(tx, input.workspaceId, input.pageId);
297
+ await svc.access.requirePage(context.principal, 'quire.page.view', input.workspaceId, scope);
298
+ return svc.databases.forPage(tx, input.workspaceId, input.pageId);
299
+ })),
300
+ lookup: scoped.databases.lookup.use(requires('quire.page.view')).handler(({ input, context }) => run(context, input.workspaceId, async (tx) => {
301
+ const db = await svc.databases.get(tx, input.workspaceId, input.databaseId);
302
+ const scope = await svc.access.scopeOf(tx, input.workspaceId, db.pageId);
303
+ await svc.access.requirePage(context.principal, 'quire.page.view', input.workspaceId, scope);
304
+ return svc.databases.lookup(tx, input.workspaceId, input.databaseId, {
305
+ query: input.query,
306
+ ids: input.ids,
307
+ limit: input.limit,
308
+ });
309
+ })),
290
310
  create: scoped.databases.create.use(requires('quire.page.edit')).handler(async ({ input, context }) => {
291
311
  const db = await run(context, input.workspaceId, async (tx) => {
292
312
  const scope = await svc.access.scopeOf(tx, input.workspaceId, input.pageId);
@@ -343,8 +363,29 @@ export function implement_(kernel) {
343
363
  await svc.pages.update(tx, context.principal, input.workspaceId, input.rowId, {
344
364
  title: input.title,
345
365
  });
346
- if (input.props)
347
- await svc.databases.setRowFields(tx, input.workspaceId, input.rowId, null, input.props);
366
+ /**
367
+ * A relation cell edited from a table arrives in `props` like any other, and writing it
368
+ * there would leave the join table — which is what a rollup walks and what the other
369
+ * side reads — untouched. Split those keys out and route them through `setRelation`, so
370
+ * the two stores cannot diverge whichever surface did the editing.
371
+ */
372
+ if (input.props) {
373
+ const row = await svc.databases.rowById(tx, input.workspaceId, input.rowId);
374
+ const db = row.databaseId
375
+ ? await svc.databases.get(tx, input.workspaceId, row.databaseId)
376
+ : null;
377
+ const relationProps = (db?.properties ?? []).filter((p) => p.type === 'relation');
378
+ const plain = {};
379
+ for (const [key, value] of Object.entries(input.props)) {
380
+ const relation = relationProps.find((p) => p.key === key);
381
+ if (relation)
382
+ await svc.databases.setRelation(tx, input.workspaceId, relation.id, input.rowId, (Array.isArray(value) ? value : value == null ? [] : [value]).map(String));
383
+ else
384
+ plain[key] = value;
385
+ }
386
+ if (Object.keys(plain).length > 0)
387
+ await svc.databases.setRowFields(tx, input.workspaceId, input.rowId, null, plain);
388
+ }
348
389
  await svc.databases.recompute(tx, input.workspaceId, input.rowId);
349
390
  // Anything rolling this row up is now stale.
350
391
  for (const id of await svc.databases.dependentsOf(tx, input.workspaceId, input.rowId))
@@ -354,34 +395,62 @@ export function implement_(kernel) {
354
395
  await announce(input.workspaceId, 'row', row.id, 'updated', { databaseId: row.databaseId });
355
396
  return row;
356
397
  }),
398
+ /**
399
+ * Every schema change announces `database`.
400
+ *
401
+ * Adding a column, hiding one, or adding a view changes what *every* open tab of this
402
+ * database is drawing, and none of these announced anything — so a second person's table kept
403
+ * the old columns until they reloaded, which reads as their edit having been lost.
404
+ */
357
405
  addProperty: scoped.databases.addProperty
358
406
  .use(requires('quire.page.edit'))
359
- .handler(({ input, context }) => run(context, input.workspaceId, (tx) => svc.databases.addProperty(tx, input.workspaceId, input.databaseId, input))),
407
+ .handler(async ({ input, context }) => {
408
+ const property = await run(context, input.workspaceId, (tx) => svc.databases.addProperty(tx, input.workspaceId, input.databaseId, input));
409
+ await announce(input.workspaceId, 'database', input.databaseId, 'updated');
410
+ return property;
411
+ }),
360
412
  updateProperty: scoped.databases.updateProperty
361
413
  .use(requires('quire.page.edit'))
362
- .handler(({ input, context }) => {
414
+ .handler(async ({ input, context }) => {
363
415
  const { workspaceId, propertyId, ...patch } = input;
364
- return run(context, workspaceId, (tx) => svc.databases.updateProperty(tx, workspaceId, propertyId, patch));
416
+ const property = await run(context, workspaceId, (tx) => svc.databases.updateProperty(tx, workspaceId, propertyId, patch));
417
+ await announce(workspaceId, 'database', property.databaseId, 'updated');
418
+ return property;
419
+ }),
420
+ moveProperty: scoped.databases.moveProperty
421
+ .use(requires('quire.page.edit'))
422
+ .handler(async ({ input, context }) => {
423
+ const property = await run(context, input.workspaceId, (tx) => svc.databases.moveProperty(tx, input.workspaceId, input.propertyId, input.afterId));
424
+ await announce(input.workspaceId, 'database', property.databaseId, 'updated');
425
+ return property;
365
426
  }),
366
427
  removeProperty: scoped.databases.removeProperty
367
428
  .use(requires('quire.page.edit'))
368
429
  .handler(async ({ input, context }) => {
369
- await run(context, input.workspaceId, (tx) => svc.databases.removeProperty(tx, input.workspaceId, input.propertyId));
430
+ const property = await run(context, input.workspaceId, (tx) => svc.databases.removeProperty(tx, input.workspaceId, input.propertyId));
431
+ await announce(input.workspaceId, 'database', property.databaseId, 'updated');
370
432
  return { ok: true };
371
433
  }),
372
434
  addView: scoped.databases.addView
373
435
  .use(requires('quire.page.edit'))
374
- .handler(({ input, context }) => run(context, input.workspaceId, (tx) => svc.databases.addView(tx, input.workspaceId, input.databaseId, input))),
436
+ .handler(async ({ input, context }) => {
437
+ const view = await run(context, input.workspaceId, (tx) => svc.databases.addView(tx, input.workspaceId, input.databaseId, input));
438
+ await announce(input.workspaceId, 'database', input.databaseId, 'updated');
439
+ return view;
440
+ }),
375
441
  updateView: scoped.databases.updateView
376
442
  .use(requires('quire.page.edit'))
377
- .handler(({ input, context }) => {
443
+ .handler(async ({ input, context }) => {
378
444
  const { workspaceId, viewId, ...patch } = input;
379
- return run(context, workspaceId, (tx) => svc.databases.updateView(tx, workspaceId, viewId, patch));
445
+ const view = await run(context, workspaceId, (tx) => svc.databases.updateView(tx, workspaceId, viewId, patch));
446
+ await announce(workspaceId, 'database', view.databaseId, 'updated');
447
+ return view;
380
448
  }),
381
449
  removeView: scoped.databases.removeView
382
450
  .use(requires('quire.page.edit'))
383
451
  .handler(async ({ input, context }) => {
384
- await run(context, input.workspaceId, (tx) => svc.databases.removeView(tx, input.workspaceId, input.viewId));
452
+ const view = await run(context, input.workspaceId, (tx) => svc.databases.removeView(tx, input.workspaceId, input.viewId));
453
+ await announce(input.workspaceId, 'database', view.databaseId, 'updated');
385
454
  return { ok: true };
386
455
  }),
387
456
  setRelation: scoped.databases.setRelation