@kernhq/module-quire 0.5.0 → 0.6.1
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/dist/contract/properties.d.ts +2 -0
- package/dist/contract/properties.d.ts.map +1 -1
- package/dist/contract/properties.js.map +1 -1
- package/dist/contract/router.d.ts +1101 -0
- package/dist/contract/router.d.ts.map +1 -1
- package/dist/contract/router.js +88 -0
- package/dist/contract/router.js.map +1 -1
- package/dist/server/_impl.d.ts +1182 -0
- package/dist/server/_impl.d.ts.map +1 -1
- package/dist/server/_impl.js +113 -0
- package/dist/server/_impl.js.map +1 -1
- package/dist/server/formula.d.ts +13 -3
- package/dist/server/formula.d.ts.map +1 -1
- package/dist/server/formula.js +4 -4
- package/dist/server/formula.js.map +1 -1
- package/dist/server/schema.d.ts +51 -0
- package/dist/server/schema.d.ts.map +1 -1
- package/dist/server/schema.js +15 -0
- package/dist/server/schema.js.map +1 -1
- package/dist/server/services/access.d.ts +3 -0
- package/dist/server/services/access.d.ts.map +1 -1
- package/dist/server/services/databases.d.ts +330 -0
- package/dist/server/services/databases.d.ts.map +1 -0
- package/dist/server/services/databases.js +515 -0
- package/dist/server/services/databases.js.map +1 -0
- package/dist/server/services/index.d.ts +3 -0
- package/dist/server/services/index.d.ts.map +1 -1
- package/dist/server/services/index.js +3 -0
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/query.d.ts +13 -0
- package/dist/server/services/query.d.ts.map +1 -0
- package/dist/server/services/query.js +154 -0
- package/dist/server/services/query.js.map +1 -0
- package/dist/server/services/versions.d.ts +6 -0
- package/dist/server/services/versions.d.ts.map +1 -1
- package/migrations/0005_rows_are_pages.sql +6 -0
- package/migrations/meta/0004_snapshot.json +1 -1
- package/migrations/meta/0005_snapshot.json +1191 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +1 -1
- package/src/contract/properties.ts +2 -0
- package/src/contract/router.ts +115 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import type { Principal } from '@kernhq/contracts';
|
|
2
|
+
import { type Kernel, type Tx } from '@kernhq/kernel';
|
|
3
|
+
import type { Database, Property, Row, View, ViewConfig } from '../../contract/index.js';
|
|
4
|
+
import { pages, properties, views } from '../schema.js';
|
|
5
|
+
import type { QuireAccess } from './access.js';
|
|
6
|
+
type PropertyRow = typeof properties.$inferSelect;
|
|
7
|
+
type ViewRow = typeof views.$inferSelect;
|
|
8
|
+
type PageRow = typeof pages.$inferSelect;
|
|
9
|
+
export declare const toProperty: (r: PropertyRow) => Property;
|
|
10
|
+
export declare const toView: (r: ViewRow) => View;
|
|
11
|
+
export declare const toRow: (p: PageRow) => Row;
|
|
12
|
+
export declare function quireDatabases(kernel: Kernel, access: QuireAccess): {
|
|
13
|
+
get(tx: Tx, workspaceId: string, databaseId: string): Promise<Database>;
|
|
14
|
+
/**
|
|
15
|
+
* Create a database on a page.
|
|
16
|
+
*
|
|
17
|
+
* It arrives with a title property and a table view, because a database with no columns and no
|
|
18
|
+
* view is a screen with nothing on it and no obvious way forward.
|
|
19
|
+
*/
|
|
20
|
+
create(tx: Tx, principal: Principal, workspaceId: string, input: {
|
|
21
|
+
spaceId: string;
|
|
22
|
+
pageId: string;
|
|
23
|
+
name: string;
|
|
24
|
+
inline: boolean;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
id: string;
|
|
27
|
+
workspaceId: string;
|
|
28
|
+
spaceId: string;
|
|
29
|
+
pageId: string;
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
inline: boolean;
|
|
33
|
+
properties: {
|
|
34
|
+
id: string;
|
|
35
|
+
databaseId: string;
|
|
36
|
+
key: string;
|
|
37
|
+
name: string;
|
|
38
|
+
type: "number" | "date" | "email" | "text" | "select" | "multi_select" | "status" | "person" | "files" | "checkbox" | "url" | "phone" | "relation" | "rollup" | "formula" | "created_time" | "created_by" | "edited_time" | "edited_by";
|
|
39
|
+
config: {
|
|
40
|
+
options?: {
|
|
41
|
+
id: string;
|
|
42
|
+
label: string;
|
|
43
|
+
colour: string;
|
|
44
|
+
group?: "todo" | "doing" | "done" | undefined;
|
|
45
|
+
}[] | undefined;
|
|
46
|
+
format?: string | undefined;
|
|
47
|
+
precision?: number | undefined;
|
|
48
|
+
includeTime?: boolean | undefined;
|
|
49
|
+
isRange?: boolean | undefined;
|
|
50
|
+
relationDatabaseId?: string | undefined;
|
|
51
|
+
relationPropertyId?: string | undefined;
|
|
52
|
+
rollupRelationPropertyId?: string | undefined;
|
|
53
|
+
rollupTargetPropertyId?: string | undefined;
|
|
54
|
+
rollupFunction?: "count" | "count_values" | "count_unique" | "sum" | "average" | "min" | "max" | "range" | "show_original" | "checked" | "unchecked" | "percent_checked" | undefined;
|
|
55
|
+
expression?: string | undefined;
|
|
56
|
+
multiple?: boolean | undefined;
|
|
57
|
+
};
|
|
58
|
+
position: string;
|
|
59
|
+
hidden: boolean;
|
|
60
|
+
}[];
|
|
61
|
+
views: {
|
|
62
|
+
id: string;
|
|
63
|
+
databaseId: string;
|
|
64
|
+
name: string;
|
|
65
|
+
kind: "table" | "board" | "calendar" | "gallery" | "list" | "timeline";
|
|
66
|
+
config: {
|
|
67
|
+
filters: {
|
|
68
|
+
propertyKey: string;
|
|
69
|
+
operator: "equals" | "not_equals" | "contains" | "not_contains" | "starts_with" | "ends_with" | "is_empty" | "is_not_empty" | "greater_than" | "less_than" | "on_or_before" | "on_or_after" | "is_any_of" | "is_none_of";
|
|
70
|
+
value?: unknown;
|
|
71
|
+
}[];
|
|
72
|
+
filterMode: "and" | "or";
|
|
73
|
+
sorts: {
|
|
74
|
+
propertyKey: string;
|
|
75
|
+
direction: "asc" | "desc";
|
|
76
|
+
}[];
|
|
77
|
+
groupBy: string | null;
|
|
78
|
+
dateProperty: string | null;
|
|
79
|
+
visibleProperties: string[] | null;
|
|
80
|
+
columnWidths: Record<string, number>;
|
|
81
|
+
cardSize: "small" | "medium" | "large";
|
|
82
|
+
coverProperty: string | null;
|
|
83
|
+
};
|
|
84
|
+
position: string;
|
|
85
|
+
isDefault: boolean;
|
|
86
|
+
}[];
|
|
87
|
+
createdAt: string;
|
|
88
|
+
updatedAt: string;
|
|
89
|
+
}>;
|
|
90
|
+
addProperty(tx: Tx, workspaceId: string, databaseId: string, input: {
|
|
91
|
+
name: string;
|
|
92
|
+
type: Property["type"];
|
|
93
|
+
config?: Property["config"];
|
|
94
|
+
}): Promise<{
|
|
95
|
+
id: string;
|
|
96
|
+
databaseId: string;
|
|
97
|
+
key: string;
|
|
98
|
+
name: string;
|
|
99
|
+
type: "number" | "date" | "email" | "text" | "select" | "multi_select" | "status" | "person" | "files" | "checkbox" | "url" | "phone" | "relation" | "rollup" | "formula" | "created_time" | "created_by" | "edited_time" | "edited_by";
|
|
100
|
+
config: {
|
|
101
|
+
options?: {
|
|
102
|
+
id: string;
|
|
103
|
+
label: string;
|
|
104
|
+
colour: string;
|
|
105
|
+
group?: "todo" | "doing" | "done" | undefined;
|
|
106
|
+
}[] | undefined;
|
|
107
|
+
format?: string | undefined;
|
|
108
|
+
precision?: number | undefined;
|
|
109
|
+
includeTime?: boolean | undefined;
|
|
110
|
+
isRange?: boolean | undefined;
|
|
111
|
+
relationDatabaseId?: string | undefined;
|
|
112
|
+
relationPropertyId?: string | undefined;
|
|
113
|
+
rollupRelationPropertyId?: string | undefined;
|
|
114
|
+
rollupTargetPropertyId?: string | undefined;
|
|
115
|
+
rollupFunction?: "count" | "count_values" | "count_unique" | "sum" | "average" | "min" | "max" | "range" | "show_original" | "checked" | "unchecked" | "percent_checked" | undefined;
|
|
116
|
+
expression?: string | undefined;
|
|
117
|
+
multiple?: boolean | undefined;
|
|
118
|
+
};
|
|
119
|
+
position: string;
|
|
120
|
+
hidden: boolean;
|
|
121
|
+
}>;
|
|
122
|
+
/**
|
|
123
|
+
* Rename, retype or reconfigure a column.
|
|
124
|
+
*
|
|
125
|
+
* The `key` never changes, because it is what every row's `props` is keyed by — renaming a
|
|
126
|
+
* column must not empty it. That is the whole reason a key exists separately from a name.
|
|
127
|
+
*/
|
|
128
|
+
updateProperty(tx: Tx, workspaceId: string, propertyId: string, patch: Partial<Pick<PropertyRow, "name" | "type" | "config" | "hidden" | "position">>): Promise<{
|
|
129
|
+
id: string;
|
|
130
|
+
databaseId: string;
|
|
131
|
+
key: string;
|
|
132
|
+
name: string;
|
|
133
|
+
type: "number" | "date" | "email" | "text" | "select" | "multi_select" | "status" | "person" | "files" | "checkbox" | "url" | "phone" | "relation" | "rollup" | "formula" | "created_time" | "created_by" | "edited_time" | "edited_by";
|
|
134
|
+
config: {
|
|
135
|
+
options?: {
|
|
136
|
+
id: string;
|
|
137
|
+
label: string;
|
|
138
|
+
colour: string;
|
|
139
|
+
group?: "todo" | "doing" | "done" | undefined;
|
|
140
|
+
}[] | undefined;
|
|
141
|
+
format?: string | undefined;
|
|
142
|
+
precision?: number | undefined;
|
|
143
|
+
includeTime?: boolean | undefined;
|
|
144
|
+
isRange?: boolean | undefined;
|
|
145
|
+
relationDatabaseId?: string | undefined;
|
|
146
|
+
relationPropertyId?: string | undefined;
|
|
147
|
+
rollupRelationPropertyId?: string | undefined;
|
|
148
|
+
rollupTargetPropertyId?: string | undefined;
|
|
149
|
+
rollupFunction?: "count" | "count_values" | "count_unique" | "sum" | "average" | "min" | "max" | "range" | "show_original" | "checked" | "unchecked" | "percent_checked" | undefined;
|
|
150
|
+
expression?: string | undefined;
|
|
151
|
+
multiple?: boolean | undefined;
|
|
152
|
+
};
|
|
153
|
+
position: string;
|
|
154
|
+
hidden: boolean;
|
|
155
|
+
}>;
|
|
156
|
+
removeProperty(tx: Tx, workspaceId: string, propertyId: string): Promise<{
|
|
157
|
+
id: string;
|
|
158
|
+
databaseId: string;
|
|
159
|
+
key: string;
|
|
160
|
+
name: string;
|
|
161
|
+
type: "number" | "date" | "email" | "text" | "select" | "multi_select" | "status" | "person" | "files" | "checkbox" | "url" | "phone" | "relation" | "rollup" | "formula" | "created_time" | "created_by" | "edited_time" | "edited_by";
|
|
162
|
+
config: {
|
|
163
|
+
options?: {
|
|
164
|
+
id: string;
|
|
165
|
+
label: string;
|
|
166
|
+
colour: string;
|
|
167
|
+
group?: "todo" | "doing" | "done" | undefined;
|
|
168
|
+
}[] | undefined;
|
|
169
|
+
format?: string | undefined;
|
|
170
|
+
precision?: number | undefined;
|
|
171
|
+
includeTime?: boolean | undefined;
|
|
172
|
+
isRange?: boolean | undefined;
|
|
173
|
+
relationDatabaseId?: string | undefined;
|
|
174
|
+
relationPropertyId?: string | undefined;
|
|
175
|
+
rollupRelationPropertyId?: string | undefined;
|
|
176
|
+
rollupTargetPropertyId?: string | undefined;
|
|
177
|
+
rollupFunction?: "count" | "count_values" | "count_unique" | "sum" | "average" | "min" | "max" | "range" | "show_original" | "checked" | "unchecked" | "percent_checked" | undefined;
|
|
178
|
+
expression?: string | undefined;
|
|
179
|
+
multiple?: boolean | undefined;
|
|
180
|
+
};
|
|
181
|
+
position: string;
|
|
182
|
+
hidden: boolean;
|
|
183
|
+
}>;
|
|
184
|
+
addView(tx: Tx, workspaceId: string, databaseId: string, input: {
|
|
185
|
+
name: string;
|
|
186
|
+
kind: View["kind"];
|
|
187
|
+
config?: Partial<ViewConfig>;
|
|
188
|
+
}): Promise<{
|
|
189
|
+
id: string;
|
|
190
|
+
databaseId: string;
|
|
191
|
+
name: string;
|
|
192
|
+
kind: "table" | "board" | "calendar" | "gallery" | "list" | "timeline";
|
|
193
|
+
config: {
|
|
194
|
+
filters: {
|
|
195
|
+
propertyKey: string;
|
|
196
|
+
operator: "equals" | "not_equals" | "contains" | "not_contains" | "starts_with" | "ends_with" | "is_empty" | "is_not_empty" | "greater_than" | "less_than" | "on_or_before" | "on_or_after" | "is_any_of" | "is_none_of";
|
|
197
|
+
value?: unknown;
|
|
198
|
+
}[];
|
|
199
|
+
filterMode: "and" | "or";
|
|
200
|
+
sorts: {
|
|
201
|
+
propertyKey: string;
|
|
202
|
+
direction: "asc" | "desc";
|
|
203
|
+
}[];
|
|
204
|
+
groupBy: string | null;
|
|
205
|
+
dateProperty: string | null;
|
|
206
|
+
visibleProperties: string[] | null;
|
|
207
|
+
columnWidths: Record<string, number>;
|
|
208
|
+
cardSize: "small" | "medium" | "large";
|
|
209
|
+
coverProperty: string | null;
|
|
210
|
+
};
|
|
211
|
+
position: string;
|
|
212
|
+
isDefault: boolean;
|
|
213
|
+
}>;
|
|
214
|
+
updateView(tx: Tx, workspaceId: string, viewId: string, patch: Partial<Pick<ViewRow, "name" | "kind" | "config" | "position">>): Promise<{
|
|
215
|
+
id: string;
|
|
216
|
+
databaseId: string;
|
|
217
|
+
name: string;
|
|
218
|
+
kind: "table" | "board" | "calendar" | "gallery" | "list" | "timeline";
|
|
219
|
+
config: {
|
|
220
|
+
filters: {
|
|
221
|
+
propertyKey: string;
|
|
222
|
+
operator: "equals" | "not_equals" | "contains" | "not_contains" | "starts_with" | "ends_with" | "is_empty" | "is_not_empty" | "greater_than" | "less_than" | "on_or_before" | "on_or_after" | "is_any_of" | "is_none_of";
|
|
223
|
+
value?: unknown;
|
|
224
|
+
}[];
|
|
225
|
+
filterMode: "and" | "or";
|
|
226
|
+
sorts: {
|
|
227
|
+
propertyKey: string;
|
|
228
|
+
direction: "asc" | "desc";
|
|
229
|
+
}[];
|
|
230
|
+
groupBy: string | null;
|
|
231
|
+
dateProperty: string | null;
|
|
232
|
+
visibleProperties: string[] | null;
|
|
233
|
+
columnWidths: Record<string, number>;
|
|
234
|
+
cardSize: "small" | "medium" | "large";
|
|
235
|
+
coverProperty: string | null;
|
|
236
|
+
};
|
|
237
|
+
position: string;
|
|
238
|
+
isDefault: boolean;
|
|
239
|
+
}>;
|
|
240
|
+
removeView(tx: Tx, workspaceId: string, viewId: string): Promise<{
|
|
241
|
+
id: string;
|
|
242
|
+
databaseId: string;
|
|
243
|
+
name: string;
|
|
244
|
+
kind: "table" | "board" | "calendar" | "gallery" | "list" | "timeline";
|
|
245
|
+
config: {
|
|
246
|
+
filters: {
|
|
247
|
+
propertyKey: string;
|
|
248
|
+
operator: "equals" | "not_equals" | "contains" | "not_contains" | "starts_with" | "ends_with" | "is_empty" | "is_not_empty" | "greater_than" | "less_than" | "on_or_before" | "on_or_after" | "is_any_of" | "is_none_of";
|
|
249
|
+
value?: unknown;
|
|
250
|
+
}[];
|
|
251
|
+
filterMode: "and" | "or";
|
|
252
|
+
sorts: {
|
|
253
|
+
propertyKey: string;
|
|
254
|
+
direction: "asc" | "desc";
|
|
255
|
+
}[];
|
|
256
|
+
groupBy: string | null;
|
|
257
|
+
dateProperty: string | null;
|
|
258
|
+
visibleProperties: string[] | null;
|
|
259
|
+
columnWidths: Record<string, number>;
|
|
260
|
+
cardSize: "small" | "medium" | "large";
|
|
261
|
+
coverProperty: string | null;
|
|
262
|
+
};
|
|
263
|
+
position: string;
|
|
264
|
+
isDefault: boolean;
|
|
265
|
+
}>;
|
|
266
|
+
/**
|
|
267
|
+
* The rows of a database, filtered and ordered by a view.
|
|
268
|
+
*
|
|
269
|
+
* Filtering happens in SQL rather than after the fact: a page of fifty rows filtered down to
|
|
270
|
+
* three is not a page of three, and the caller has no way to ask for the rest.
|
|
271
|
+
*/
|
|
272
|
+
rows(tx: Tx, workspaceId: string, databaseId: string, opts: {
|
|
273
|
+
view?: View | null;
|
|
274
|
+
limit: number;
|
|
275
|
+
cursor: string | null;
|
|
276
|
+
}): Promise<{
|
|
277
|
+
items: {
|
|
278
|
+
id: string;
|
|
279
|
+
databaseId: string;
|
|
280
|
+
title: string;
|
|
281
|
+
icon: string | null;
|
|
282
|
+
props: Record<string, unknown>;
|
|
283
|
+
computed: Record<string, unknown>;
|
|
284
|
+
createdBy: (string & import("zod").$brand<"UserId">) | null;
|
|
285
|
+
updatedBy: (string & import("zod").$brand<"UserId">) | null;
|
|
286
|
+
createdAt: string;
|
|
287
|
+
updatedAt: string;
|
|
288
|
+
}[];
|
|
289
|
+
nextCursor: string | null;
|
|
290
|
+
}>;
|
|
291
|
+
/**
|
|
292
|
+
* Recompute the formulas and rollups of one row.
|
|
293
|
+
*
|
|
294
|
+
* Written into `computed` rather than calculated on read, so a view can filter and sort by a
|
|
295
|
+
* formula in SQL like any other column. The cost is that a change has to say what it invalidates
|
|
296
|
+
* — which is what `formulaDependencies` is for.
|
|
297
|
+
*/
|
|
298
|
+
recompute(tx: Tx, workspaceId: string, pageId: string): Promise<Record<string, unknown> | null>;
|
|
299
|
+
/** Gather the values on the other side of a relation and reduce them. */
|
|
300
|
+
rollup(tx: Tx, workspaceId: string, pageId: string, property: Property, all: Property[]): Promise<unknown>;
|
|
301
|
+
/**
|
|
302
|
+
* Set both ends of a relation.
|
|
303
|
+
*
|
|
304
|
+
* Symmetric by construction rather than by convention: a link set from one side that is not
|
|
305
|
+
* visible from the other is the bug people report as "the rollup is wrong".
|
|
306
|
+
*/
|
|
307
|
+
setRelation(tx: Tx, workspaceId: string, propertyId: string, fromPageId: string, toPageIds: string[]): Promise<void>;
|
|
308
|
+
/**
|
|
309
|
+
* Which other rows have to be recomputed because this one changed.
|
|
310
|
+
*
|
|
311
|
+
* Only the rows that roll up *through* a relation that reaches this one — recomputing the whole
|
|
312
|
+
* database on every keystroke would be correct and unusable.
|
|
313
|
+
*/
|
|
314
|
+
dependentsOf(tx: Tx, workspaceId: string, pageId: string): Promise<string[]>;
|
|
315
|
+
/** One row, after it has been written. */
|
|
316
|
+
rowById(tx: Tx, workspaceId: string, pageId: string): Promise<Row>;
|
|
317
|
+
/**
|
|
318
|
+
* Write cells, merging rather than replacing.
|
|
319
|
+
*
|
|
320
|
+
* A table sends the cell somebody edited, not the whole row — replacing would blank every
|
|
321
|
+
* column the client happened not to know about, which is every column added since it loaded.
|
|
322
|
+
*/
|
|
323
|
+
setRowFields(tx: Tx, workspaceId: string, pageId: string, databaseId: string | null, props: Record<string, unknown>): Promise<void>;
|
|
324
|
+
/** The columns a formula reads, so a property rename can report what it would break. */
|
|
325
|
+
dependenciesOf(expression: string): string[];
|
|
326
|
+
kernel: Kernel;
|
|
327
|
+
};
|
|
328
|
+
export type QuireDatabases = ReturnType<typeof quireDatabases>;
|
|
329
|
+
export {};
|
|
330
|
+
//# sourceMappingURL=databases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../../../src/server/services/databases.ts"],"names":[],"mappings":"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"}
|