@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.
- package/README.md +93 -55
- package/dist/{server → client}/formula.d.ts +6 -0
- package/dist/client/formula.d.ts.map +1 -0
- package/dist/{server → client}/formula.js +6 -0
- package/dist/client/formula.js.map +1 -0
- package/dist/contract/properties.d.ts +26 -0
- package/dist/contract/properties.d.ts.map +1 -1
- package/dist/contract/properties.js +24 -0
- package/dist/contract/properties.js.map +1 -1
- package/dist/contract/router.d.ts +334 -0
- package/dist/contract/router.d.ts.map +1 -1
- package/dist/contract/router.js +43 -1
- package/dist/contract/router.js.map +1 -1
- package/dist/server/_impl.d.ts +341 -0
- package/dist/server/_impl.d.ts.map +1 -1
- package/dist/server/_impl.js +79 -10
- package/dist/server/_impl.js.map +1 -1
- package/dist/server/document.d.ts +13 -0
- package/dist/server/document.d.ts.map +1 -0
- package/dist/server/document.js +58 -0
- package/dist/server/document.js.map +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +26 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/render.d.ts +53 -0
- package/dist/server/render.d.ts.map +1 -0
- package/dist/server/render.js +358 -0
- package/dist/server/render.js.map +1 -0
- package/dist/server/services/databases.d.ts +73 -1
- package/dist/server/services/databases.d.ts.map +1 -1
- package/dist/server/services/databases.js +167 -10
- package/dist/server/services/databases.js.map +1 -1
- package/dist/server/services/pages.d.ts.map +1 -1
- package/dist/server/services/pages.js +11 -1
- package/dist/server/services/pages.js.map +1 -1
- package/dist/server/services/query.d.ts.map +1 -1
- package/dist/server/services/query.js +93 -37
- package/dist/server/services/query.js.map +1 -1
- package/dist/server/services/versions.d.ts.map +1 -1
- package/dist/server/services/versions.js +13 -1
- package/dist/server/services/versions.js.map +1 -1
- package/migrations/0006_rank_collation.sql +14 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +12 -9
- package/src/client/components/PageEditor.svelte +7 -0
- package/src/client/components/PageTreeRow.svelte +1 -1
- package/src/client/core-api.ts +38 -0
- package/src/client/database/BoardView.svelte +354 -0
- package/src/client/database/CalendarView.svelte +346 -0
- package/src/client/database/DatabaseView.svelte +785 -0
- package/src/client/database/FilterMenu.svelte +281 -0
- package/src/client/database/FilterValue.svelte +176 -0
- package/src/client/database/GalleryView.svelte +177 -0
- package/src/client/database/ListView.svelte +108 -0
- package/src/client/database/OptionChip.svelte +38 -0
- package/src/client/database/PropertyDialog.svelte +460 -0
- package/src/client/database/PropertyMenu.svelte +162 -0
- package/src/client/database/RowPanel.svelte +157 -0
- package/src/client/database/SortMenu.svelte +199 -0
- package/src/client/database/TableView.svelte +388 -0
- package/src/client/database/ViewDialog.svelte +229 -0
- package/src/client/database/cells/Cell.svelte +103 -0
- package/src/client/database/cells/CheckboxCell.svelte +33 -0
- package/src/client/database/cells/ComputedCell.svelte +100 -0
- package/src/client/database/cells/DateCell.svelte +97 -0
- package/src/client/database/cells/LinkCell.svelte +143 -0
- package/src/client/database/cells/NumberCell.svelte +131 -0
- package/src/client/database/cells/PersonCell.svelte +116 -0
- package/src/client/database/cells/RelationCell.svelte +222 -0
- package/src/client/database/cells/SelectCell.svelte +133 -0
- package/src/client/database/cells/TextCell.svelte +85 -0
- package/src/client/database/colours.ts +27 -0
- package/src/client/database/property-types.test.ts +64 -0
- package/src/client/database/property-types.ts +294 -0
- package/src/client/database/view-config.test.ts +148 -0
- package/src/client/database/view-config.ts +102 -0
- package/src/client/formula.test.ts +139 -0
- package/src/client/formula.ts +430 -0
- package/src/client/i18n.ts +1176 -0
- package/src/client/index.ts +31 -0
- package/src/client/mock.ts +511 -1
- package/src/client/pages/PageView.svelte +47 -17
- package/src/client/pages/SpacePage.svelte +8 -2
- package/src/client/query.ts +17 -4
- package/src/contract/properties.ts +28 -0
- package/src/contract/router.ts +46 -0
- package/dist/server/formula.d.ts.map +0 -1
- package/dist/server/formula.js.map +0 -1
package/dist/server/_impl.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/server/_impl.js
CHANGED
|
@@ -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
|
-
|
|
347
|
-
|
|
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 }) =>
|
|
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
|
-
|
|
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 }) =>
|
|
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
|
-
|
|
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
|