@ai-matrx/records 0.87.32 → 0.92.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/CHANGELOG.md +92 -0
- package/README.md +115 -0
- package/dist/{client-E0VQ0NPO.d.ts → client-DE9Mq6YX.d.cts} +8 -5
- package/dist/{client-C3ZZNfGH.d.cts → client-vJAb7g9r.d.ts} +8 -5
- package/dist/core/index.cjs +25 -7
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +23 -12
- package/dist/core/index.d.ts +23 -12
- package/dist/core/index.js +25 -7
- package/dist/core/index.js.map +1 -1
- package/dist/data/index.cjs +19 -7
- package/dist/data/index.cjs.map +1 -1
- package/dist/data/index.d.cts +12 -142
- package/dist/data/index.d.ts +12 -142
- package/dist/data/index.js +19 -7
- package/dist/data/index.js.map +1 -1
- package/dist/{declareTable-BK3zufr7.d.cts → declareTable-Btg5bql1.d.cts} +4 -4
- package/dist/{declareTable-B12XybRp.d.ts → declareTable-JKt2q34d.d.ts} +4 -4
- package/dist/entity/index.cjs +984 -0
- package/dist/entity/index.cjs.map +1 -0
- package/dist/entity/index.d.cts +36 -0
- package/dist/entity/index.d.ts +36 -0
- package/dist/entity/index.js +964 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/react.cjs +1024 -0
- package/dist/entity/react.cjs.map +1 -0
- package/dist/entity/react.d.cts +511 -0
- package/dist/entity/react.d.ts +511 -0
- package/dist/entity/react.js +1015 -0
- package/dist/entity/react.js.map +1 -0
- package/dist/{field-BanTVGK2.d.cts → field-BJBnTyJ0.d.cts} +1 -1
- package/dist/{field-BPABOJ2Y.d.ts → field-Ti5iAxFr.d.ts} +1 -1
- package/dist/forms/index.cjs +984 -0
- package/dist/forms/index.cjs.map +1 -0
- package/dist/forms/index.d.cts +333 -0
- package/dist/forms/index.d.ts +333 -0
- package/dist/forms/index.js +961 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/index.cjs +10 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -8
- package/dist/index.d.ts +11 -8
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.cts +7 -6
- package/dist/memory/index.d.ts +7 -6
- package/dist/port-CPVBfDxS.d.cts +301 -0
- package/dist/port-D2i2o7Lg.d.ts +301 -0
- package/dist/portal-Db4CYyHe.d.ts +331 -0
- package/dist/portal-DfeY2Boy.d.cts +331 -0
- package/dist/{ports-TMWX-t9l.d.ts → ports-BWtxAnXh.d.ts} +2 -2
- package/dist/{ports-D8-iuY1P.d.cts → ports-DSU2RsR6.d.cts} +2 -2
- package/dist/react/index.cjs +55 -523
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +14 -1
- package/dist/react/index.d.ts +14 -1
- package/dist/react/index.js +52 -527
- package/dist/react/index.js.map +1 -1
- package/dist/realtime/index.d.cts +2 -2
- package/dist/realtime/index.d.ts +2 -2
- package/dist/{record-DpB2QgAZ.d.cts → record-BQi92d4-.d.cts} +7 -1
- package/dist/{record-DpB2QgAZ.d.ts → record-BQi92d4-.d.ts} +7 -1
- package/dist/relation-DMwkmzgN.d.cts +230 -0
- package/dist/relation-DlcqV_W5.d.ts +230 -0
- package/dist/rule-B8kR0l01.d.ts +250 -0
- package/dist/rule-BMViCLmW.d.cts +250 -0
- package/dist/search/index.cjs +283 -0
- package/dist/search/index.cjs.map +1 -0
- package/dist/search/index.d.cts +44 -0
- package/dist/search/index.d.ts +44 -0
- package/dist/search/index.js +260 -0
- package/dist/search/index.js.map +1 -0
- package/dist/setup/index.cjs +6854 -0
- package/dist/setup/index.cjs.map +1 -0
- package/dist/setup/index.d.cts +87 -0
- package/dist/setup/index.d.ts +87 -0
- package/dist/setup/index.js +6829 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/{subscription-D7KQBHXN.d.ts → subscription-5CLN3Jug.d.ts} +3 -249
- package/dist/{subscription-BD9DnJxX.d.cts → subscription-D-VEzvyy.d.cts} +3 -249
- package/dist/{table-kind-BZu8mtND.d.cts → table-kind-CVp43g6h.d.ts} +3 -558
- package/dist/{table-kind-xKxTHtrV.d.ts → table-kind-Cm6PXkWx.d.cts} +3 -558
- package/dist/templates/index.d.cts +10 -9
- package/dist/templates/index.d.ts +10 -9
- package/dist/typed-table/index.cjs +19 -7
- package/dist/typed-table/index.cjs.map +1 -1
- package/dist/typed-table/index.d.cts +10 -7
- package/dist/typed-table/index.d.ts +10 -7
- package/dist/typed-table/index.js +19 -7
- package/dist/typed-table/index.js.map +1 -1
- package/dist/{types-CLP5H4Wk.d.cts → types-9Q5SHRDJ.d.cts} +2 -2
- package/dist/{types-DmPkWQic.d.ts → types-CfYy-vdV.d.ts} +2 -2
- package/dist/{types-C2uspRtf.d.cts → types-Cs2MyE3u.d.cts} +2 -2
- package/dist/{types-Dv61jStB.d.ts → types-DF-dxB_l.d.ts} +2 -2
- package/dist/types-DTEGaxso.d.cts +139 -0
- package/dist/types-Dji5SpFS.d.ts +139 -0
- package/dist/use-cases/index.d.cts +5 -5
- package/dist/use-cases/index.d.ts +5 -5
- package/dist/{validate-CWVToe1T.d.ts → validate-BydKd-Le.d.ts} +1 -1
- package/dist/{validate-DEB_mn4Y.d.cts → validate-CqJakTKk.d.cts} +1 -1
- package/dist/versions/index.cjs +375 -0
- package/dist/versions/index.cjs.map +1 -0
- package/dist/versions/index.d.cts +160 -0
- package/dist/versions/index.d.ts +160 -0
- package/dist/versions/index.js +353 -0
- package/dist/versions/index.js.map +1 -0
- package/package.json +62 -2
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { U as Uuid, T as Timestamp } from './record-BQi92d4-.js';
|
|
2
|
+
|
|
3
|
+
/** One portal as `custom.portals` reports it to its organization. */
|
|
4
|
+
interface PortalSummary {
|
|
5
|
+
portal_id: Uuid;
|
|
6
|
+
title: string;
|
|
7
|
+
slug: string;
|
|
8
|
+
/** The Table whose records ARE the clients. A principal is one of its rows. */
|
|
9
|
+
client_table_id: Uuid;
|
|
10
|
+
/** That Table's name, so a list never has to read a second door to draw a row. */
|
|
11
|
+
client_table: string;
|
|
12
|
+
is_active: boolean;
|
|
13
|
+
/** How many Tables this portal exposes. */
|
|
14
|
+
tables: number;
|
|
15
|
+
/** Everybody invited and not revoked — NOT everybody who can see anything. */
|
|
16
|
+
invited: number;
|
|
17
|
+
/** Of those, how many have followed the link and hold an identity. */
|
|
18
|
+
signed_in: number;
|
|
19
|
+
/** `magic_link` today, and the door refuses every other word by name. */
|
|
20
|
+
sign_in_method: string;
|
|
21
|
+
opened_at: Timestamp | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* ONE (portal, Table) PAIR, as `custom.portal_tables` reports it.
|
|
25
|
+
*
|
|
26
|
+
* 🚨 WHY THIS EXISTS (TAILS-3, 2026-09-21). The Portals rail sits on a Table's
|
|
27
|
+
* page beside Forms, Bookings and Dashboards — all table-scoped — while
|
|
28
|
+
* `custom.portals` takes no table at all. On Rincon Plumbing Co's **Parts**
|
|
29
|
+
* table the rail read "Portals 10" and listed ten cards titled "Your jobs and
|
|
30
|
+
* invoices", which belong to **Jobs**; the empty state never rendered, so the
|
|
31
|
+
* "Build it / Ask an agent" offer was unreachable on EVERY table of any
|
|
32
|
+
* organization that already had one portal.
|
|
33
|
+
*
|
|
34
|
+
* This is the whole of what a table-scoped rail needs: is the table I am
|
|
35
|
+
* standing on in any portal, and if not, which portals could take it.
|
|
36
|
+
*/
|
|
37
|
+
interface PortalTableRef {
|
|
38
|
+
portal_id: Uuid;
|
|
39
|
+
table_id: Uuid;
|
|
40
|
+
/** That Table's name, so a rail never reads a second door to draw a row. */
|
|
41
|
+
name: string;
|
|
42
|
+
}
|
|
43
|
+
/** One Table a portal exposes, as `custom.portal_card` reports it. */
|
|
44
|
+
interface PortalTableExposure {
|
|
45
|
+
table_id: Uuid;
|
|
46
|
+
/** The Table's own name. */
|
|
47
|
+
name: string;
|
|
48
|
+
/**
|
|
49
|
+
* The key of the relation Field that says WHOSE a record is. This is the
|
|
50
|
+
* whole of "only theirs": the association that Field writes is what carries
|
|
51
|
+
* the record to the client, so a portal cannot exist without one.
|
|
52
|
+
*/
|
|
53
|
+
names_via: string;
|
|
54
|
+
/** The field keys a client sees. Empty is impossible — the door fills it. */
|
|
55
|
+
visible_fields: string[];
|
|
56
|
+
/** The subset a client may change. Always a subset of `visible_fields`. */
|
|
57
|
+
editable_fields: string[];
|
|
58
|
+
comments: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* The most a client is ever conveyed on this Table — `viewer`, `commenter`
|
|
61
|
+
* or `editor` — worked out by the door from the two lists above, never by a
|
|
62
|
+
* screen.
|
|
63
|
+
*/
|
|
64
|
+
conveys: string;
|
|
65
|
+
}
|
|
66
|
+
/** One person a portal was opened to, as `custom.portal_card` reports them. */
|
|
67
|
+
interface PortalPrincipal {
|
|
68
|
+
principal_id: Uuid;
|
|
69
|
+
email: string;
|
|
70
|
+
/** The record of the client Table this person IS, for the portal's purposes. */
|
|
71
|
+
client_record_id: Uuid;
|
|
72
|
+
/** That record's title — what an owner calls this client. */
|
|
73
|
+
client: string;
|
|
74
|
+
/** They followed the link and hold an identity. Until then this is false. */
|
|
75
|
+
signed_in: boolean;
|
|
76
|
+
/** Not revoked. An invitation that was never followed is still active. */
|
|
77
|
+
is_active: boolean;
|
|
78
|
+
invited_at: Timestamp;
|
|
79
|
+
revoked_at: Timestamp | null;
|
|
80
|
+
/**
|
|
81
|
+
* THE LINK THE OFFICE COPIES FOR THIS PERSON — `/invitations/portal/accept/<token>`, the
|
|
82
|
+
* path `custom.portal_invite` handed back when they were asked, read off the same
|
|
83
|
+
* `iam.invitations` row and never re-templated.
|
|
84
|
+
*
|
|
85
|
+
* 🚨 `null` IS AN ANSWER, NOT AN ABSENCE, and a screen must say which. It is null when they
|
|
86
|
+
* have already followed the link, when the office took it back (a revoke withdraws the
|
|
87
|
+
* invitation in the same statement), when it has expired, or when they were let in through
|
|
88
|
+
* the server's own magic-link route, which binds without an invitation at all. In every one
|
|
89
|
+
* of those cases there is genuinely no link to copy — so draw a sentence, never a dead
|
|
90
|
+
* control. (TAILS-5, 2026-09-21; the gap PORTAL-BIND left named.)
|
|
91
|
+
*/
|
|
92
|
+
accept_path: string | null;
|
|
93
|
+
}
|
|
94
|
+
/** Everything about ONE portal: what it shows, and who it was opened to. */
|
|
95
|
+
interface PortalCard {
|
|
96
|
+
portal_id: Uuid;
|
|
97
|
+
title: string;
|
|
98
|
+
slug: string;
|
|
99
|
+
is_active: boolean;
|
|
100
|
+
sign_in_method: string;
|
|
101
|
+
client_table_id: Uuid;
|
|
102
|
+
tables: PortalTableExposure[];
|
|
103
|
+
principals: PortalPrincipal[];
|
|
104
|
+
/**
|
|
105
|
+
* Whether this organization's outside lane is open
|
|
106
|
+
* (`custom/external_principal_enabled`). Declaring a portal opens it; while
|
|
107
|
+
* it is false every door refuses an outsider BY NAME, and a screen that drew
|
|
108
|
+
* the people as reachable anyway would be lying about the one thing that
|
|
109
|
+
* decides whether they can sign in at all.
|
|
110
|
+
*/
|
|
111
|
+
external_lane_open: boolean;
|
|
112
|
+
/** S6 — the look and forms exactly as the owner stored them (`{}` when none). */
|
|
113
|
+
config: PortalConfig;
|
|
114
|
+
/** S6 — the look as a client sees it: the portal's own values over the organization's brand. */
|
|
115
|
+
style: PortalStyle;
|
|
116
|
+
/** S6 — every form on the portal, in its order, with its title, Table and state. */
|
|
117
|
+
forms: PortalFormRef[];
|
|
118
|
+
/** S6 — the accent names a portal may carry (the design system's `STYLE_COLORS`). */
|
|
119
|
+
accents: PortalAccent[];
|
|
120
|
+
/**
|
|
121
|
+
* S6 — the pictures that could be this portal's logo: the organization's own PUBLIC pictures in
|
|
122
|
+
* Files, newest first. A private file is never offered, because the store would refuse it.
|
|
123
|
+
*/
|
|
124
|
+
logo_candidates: PublicPicture[];
|
|
125
|
+
}
|
|
126
|
+
/** The design system's colour names (`STYLE_COLORS`), which is all an accent may be. */
|
|
127
|
+
declare const PORTAL_ACCENTS: readonly ["slate", "green", "amber", "red", "blue", "violet", "teal"];
|
|
128
|
+
type PortalAccent = (typeof PORTAL_ACCENTS)[number];
|
|
129
|
+
declare function isPortalAccent(word: unknown): word is PortalAccent;
|
|
130
|
+
/** One link in a portal's footer. The store takes only `https://`, `mailto:` and `tel:`. */
|
|
131
|
+
interface PortalFooterLink {
|
|
132
|
+
label: string;
|
|
133
|
+
url: string;
|
|
134
|
+
}
|
|
135
|
+
/** A portal's look as the owner sets it. Every key is optional; absent means "the organization's". */
|
|
136
|
+
interface PortalStyleInput {
|
|
137
|
+
display_name?: string | null;
|
|
138
|
+
welcome?: string | null;
|
|
139
|
+
logo_file_id?: Uuid | null;
|
|
140
|
+
accent?: PortalAccent | null;
|
|
141
|
+
footer_links?: PortalFooterLink[] | null;
|
|
142
|
+
}
|
|
143
|
+
/** One form on a portal, as the owner sets it. `order` is the position; `label` overrides the title. */
|
|
144
|
+
interface PortalFormInput {
|
|
145
|
+
form_id: Uuid;
|
|
146
|
+
label?: string | null;
|
|
147
|
+
order?: number | null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* What `portalDeclare({ config })` sends. A key given REPLACES that key; a key not given is KEPT;
|
|
151
|
+
* `style: null` puts the organization's brand back and `forms: []` takes every form off.
|
|
152
|
+
*/
|
|
153
|
+
interface PortalConfigInput {
|
|
154
|
+
style?: PortalStyleInput | null;
|
|
155
|
+
forms?: PortalFormInput[] | null;
|
|
156
|
+
}
|
|
157
|
+
/** The look and forms as the store holds them (normalized by the store). */
|
|
158
|
+
interface PortalConfig {
|
|
159
|
+
style?: PortalStyleInput;
|
|
160
|
+
forms?: Array<{
|
|
161
|
+
form_id: Uuid;
|
|
162
|
+
label?: string;
|
|
163
|
+
order: number;
|
|
164
|
+
}>;
|
|
165
|
+
}
|
|
166
|
+
/** The look a client is shown — resolved by the store, never computed by a screen. */
|
|
167
|
+
interface PortalStyle {
|
|
168
|
+
display_name: string;
|
|
169
|
+
welcome: string | null;
|
|
170
|
+
logo_file_id: Uuid | null;
|
|
171
|
+
/** The logo's PUBLIC address, or null. Readable by anybody the portal is shown to. */
|
|
172
|
+
logo_url: string | null;
|
|
173
|
+
/** Null means the app's own colour. */
|
|
174
|
+
accent: PortalAccent | null;
|
|
175
|
+
footer_links: PortalFooterLink[];
|
|
176
|
+
/** MAKE-HOME W5 — a cover picture's PUBLIC address (a form's look carries one), or null. */
|
|
177
|
+
cover_file_id?: Uuid | null;
|
|
178
|
+
cover_url?: string | null;
|
|
179
|
+
/** Which of the values above came from the organization rather than the portal. */
|
|
180
|
+
from_organization: Array<"display_name" | "logo">;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* One of the organization's PUBLIC pictures (`custom._public_pictures`): the only pictures a
|
|
184
|
+
* portal's logo or a form's logo and cover may be, because a stranger sees them before signing in.
|
|
185
|
+
*/
|
|
186
|
+
interface PublicPicture {
|
|
187
|
+
file_id: Uuid;
|
|
188
|
+
name: string;
|
|
189
|
+
url: string | null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* What a form's look editor needs (`custom.form_look_options`, MAKE-HOME W5b): the pictures the
|
|
193
|
+
* store accepts, the colours, and the look a stranger would see for the draft presentation.
|
|
194
|
+
*/
|
|
195
|
+
interface FormLookOptions {
|
|
196
|
+
pictures: PublicPicture[];
|
|
197
|
+
accents: PortalAccent[];
|
|
198
|
+
look: PortalStyle;
|
|
199
|
+
}
|
|
200
|
+
/** One form on a portal, with what the owner needs to see about it. */
|
|
201
|
+
interface PortalFormRef {
|
|
202
|
+
form_id: Uuid;
|
|
203
|
+
/** What the portal calls it (the owner's label, else the form's title). */
|
|
204
|
+
label: string;
|
|
205
|
+
order: number;
|
|
206
|
+
title: string;
|
|
207
|
+
table_id: Uuid | null;
|
|
208
|
+
table: string;
|
|
209
|
+
/** `gone` is a form that was removed; the outsider's list only ever carries `open`. */
|
|
210
|
+
state: "open" | "closed" | "full" | "gone";
|
|
211
|
+
}
|
|
212
|
+
/** A Table's stages as a portal client may be told them (`custom.portal_me` → tables[].stage). */
|
|
213
|
+
interface PortalStage {
|
|
214
|
+
/** The stage Field's key on the record. */
|
|
215
|
+
field: string;
|
|
216
|
+
label: string;
|
|
217
|
+
/** In the order they were declared. A record stores the stage's `key`. */
|
|
218
|
+
stages: Array<{
|
|
219
|
+
key: string;
|
|
220
|
+
label: string;
|
|
221
|
+
retired: boolean;
|
|
222
|
+
}>;
|
|
223
|
+
}
|
|
224
|
+
/** What `custom.portal_form` answers: one form on the caller's own portal. */
|
|
225
|
+
interface PortalFormSpec {
|
|
226
|
+
form_id: Uuid;
|
|
227
|
+
portal_id: Uuid;
|
|
228
|
+
table_id: Uuid;
|
|
229
|
+
title: string;
|
|
230
|
+
label: string;
|
|
231
|
+
presentation: Record<string, unknown>;
|
|
232
|
+
/** The form's exposed Fields as the store holds them — never the one naming the client. */
|
|
233
|
+
fields: Array<Record<string, unknown> & {
|
|
234
|
+
id: Uuid;
|
|
235
|
+
key: string;
|
|
236
|
+
}>;
|
|
237
|
+
required: string[];
|
|
238
|
+
state: "open" | "closed" | "full";
|
|
239
|
+
message: string | null;
|
|
240
|
+
}
|
|
241
|
+
/** What `custom.portal_form_submit` answers. `held` waits for the office; `message` says so. */
|
|
242
|
+
interface PortalFormAnswer {
|
|
243
|
+
submission_id: Uuid | null;
|
|
244
|
+
record_id: Uuid | null;
|
|
245
|
+
state: "accepted" | "held" | "rejected" | "closed" | "full" | "too_many";
|
|
246
|
+
message: string | null;
|
|
247
|
+
}
|
|
248
|
+
/** What `custom.portal_invite` answers. `say` is the door's own sentence. */
|
|
249
|
+
interface PortalInvitation {
|
|
250
|
+
invited: boolean;
|
|
251
|
+
principal_id: Uuid;
|
|
252
|
+
portal_id: Uuid;
|
|
253
|
+
slug: string;
|
|
254
|
+
email: string;
|
|
255
|
+
client_record_id: Uuid;
|
|
256
|
+
client: string;
|
|
257
|
+
/** They already hold an identity. From a screen this is false: the door is passed no user. */
|
|
258
|
+
bound: boolean;
|
|
259
|
+
/**
|
|
260
|
+
* The door's own words, and the ONLY correct summary of what just happened —
|
|
261
|
+
* it says outright that an invitation confers nothing until the link is
|
|
262
|
+
* followed. Show it; never paraphrase it.
|
|
263
|
+
*/
|
|
264
|
+
say: string;
|
|
265
|
+
}
|
|
266
|
+
/** What `custom.portal_revoke` answers. `say` names the consequence, past tense. */
|
|
267
|
+
interface PortalRevocation {
|
|
268
|
+
revoked: boolean;
|
|
269
|
+
principal_id: Uuid;
|
|
270
|
+
email: string;
|
|
271
|
+
/** The door's own sentence: they can no longer sign in, and their records stop reaching them. */
|
|
272
|
+
say: string;
|
|
273
|
+
}
|
|
274
|
+
/** One row of "what this client sees", from `custom.portal_preview`. */
|
|
275
|
+
interface PortalPreviewRow {
|
|
276
|
+
record_id: Uuid;
|
|
277
|
+
title: string;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* THE PUBLIC ADDRESS OF A PORTAL, and the one place its shape is written down.
|
|
281
|
+
*
|
|
282
|
+
* Unlike a form's link, a portal's slug is NOT the capability: the page it
|
|
283
|
+
* serves asks who you are and emails a one-time link, so the slug is a name and
|
|
284
|
+
* nothing more. That is why it is readable and why copying it is safe.
|
|
285
|
+
*/
|
|
286
|
+
declare function portalPath(slug: string): string;
|
|
287
|
+
/**
|
|
288
|
+
* The platform archive filter's own three values, and no fourth. `custom.list_portals`
|
|
289
|
+
* refuses anything else with `22023` rather than quietly treating it as one of them.
|
|
290
|
+
*/
|
|
291
|
+
declare const PORTAL_ARCHIVE_FILTERS: readonly ["active", "archived", "all"];
|
|
292
|
+
type PortalArchiveFilter = (typeof PORTAL_ARCHIVE_FILTERS)[number];
|
|
293
|
+
/** THE LAW'S DEFAULT IS TO HIDE. A list nobody narrowed is the live things. */
|
|
294
|
+
declare const DEFAULT_PORTAL_ARCHIVE_FILTER: PortalArchiveFilter;
|
|
295
|
+
declare function isPortalArchiveFilter(word: unknown): word is PortalArchiveFilter;
|
|
296
|
+
/** What `custom.portal_archive` and `custom.portal_restore` answer with. */
|
|
297
|
+
interface PortalArchiveAnswer {
|
|
298
|
+
/** Where the portal stands NOW — true after an archive, false after a restore. */
|
|
299
|
+
archived: boolean;
|
|
300
|
+
/** False when it was already in that state; the sentence says so rather than lying about an act. */
|
|
301
|
+
changed: boolean;
|
|
302
|
+
portal_id: Uuid;
|
|
303
|
+
archived_at?: Timestamp | null;
|
|
304
|
+
/** The store's own sentence, in plain English. Show it verbatim; never a constraint name. */
|
|
305
|
+
sentence: string;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* THE CONSEQUENCE, SAID BEFORE THE CLICK — never a generic "are you sure?".
|
|
309
|
+
*
|
|
310
|
+
* What actually changes is two things: nobody can sign in to it any more, and it
|
|
311
|
+
* leaves the organization's portal list. What does NOT change is everything
|
|
312
|
+
* else, and saying so is the difference between an archive somebody dares to
|
|
313
|
+
* press and one they avoid.
|
|
314
|
+
*/
|
|
315
|
+
declare function portalArchiveConsequence(title: string, signedIn: number, invited: number): string;
|
|
316
|
+
/**
|
|
317
|
+
* WHY THE TITLE HAS TO BE TYPED BACK, in the store's own reasoning. Ten portals
|
|
318
|
+
* can carry one title, so the title is not what PICKS this one — the portal you
|
|
319
|
+
* opened is. Typing it back is how you say you meant this one.
|
|
320
|
+
*/
|
|
321
|
+
declare function portalConfirmLine(title: string): string;
|
|
322
|
+
/** True when what the person typed is what the door will accept. The door decides; this only spares them a round trip. */
|
|
323
|
+
declare function portalTitleTypedBack(typed: string, title: string): boolean;
|
|
324
|
+
/**
|
|
325
|
+
* WHAT AN EMPTY ARCHIVE LANE SAYS. An empty list is an answer: it says nothing
|
|
326
|
+
* has been archived, so "none here" can never be read as "the archive is broken"
|
|
327
|
+
* or as "this organization has no portals at all".
|
|
328
|
+
*/
|
|
329
|
+
declare function emptyPortalArchiveLine(): string;
|
|
330
|
+
|
|
331
|
+
export { portalArchiveConsequence as A, portalConfirmLine as B, portalPath as C, DEFAULT_PORTAL_ARCHIVE_FILTER as D, portalTitleTypedBack as E, type FormLookOptions as F, type PortalSummary as P, type PortalArchiveFilter as a, type PortalArchiveAnswer as b, type PortalTableRef as c, type PortalCard as d, type PortalConfigInput as e, type PortalFormSpec as f, type PortalFormAnswer as g, type PortalInvitation as h, type PortalRevocation as i, type PortalPreviewRow as j, type PortalAccent as k, PORTAL_ACCENTS as l, PORTAL_ARCHIVE_FILTERS as m, type PortalConfig as n, type PortalFooterLink as o, type PortalFormInput as p, type PortalFormRef as q, type PortalPrincipal as r, type PortalStage as s, type PortalStyle as t, type PortalStyleInput as u, type PortalTableExposure as v, type PublicPicture as w, emptyPortalArchiveLine as x, isPortalAccent as y, isPortalArchiveFilter as z };
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { U as Uuid, T as Timestamp } from './record-BQi92d4-.cjs';
|
|
2
|
+
|
|
3
|
+
/** One portal as `custom.portals` reports it to its organization. */
|
|
4
|
+
interface PortalSummary {
|
|
5
|
+
portal_id: Uuid;
|
|
6
|
+
title: string;
|
|
7
|
+
slug: string;
|
|
8
|
+
/** The Table whose records ARE the clients. A principal is one of its rows. */
|
|
9
|
+
client_table_id: Uuid;
|
|
10
|
+
/** That Table's name, so a list never has to read a second door to draw a row. */
|
|
11
|
+
client_table: string;
|
|
12
|
+
is_active: boolean;
|
|
13
|
+
/** How many Tables this portal exposes. */
|
|
14
|
+
tables: number;
|
|
15
|
+
/** Everybody invited and not revoked — NOT everybody who can see anything. */
|
|
16
|
+
invited: number;
|
|
17
|
+
/** Of those, how many have followed the link and hold an identity. */
|
|
18
|
+
signed_in: number;
|
|
19
|
+
/** `magic_link` today, and the door refuses every other word by name. */
|
|
20
|
+
sign_in_method: string;
|
|
21
|
+
opened_at: Timestamp | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* ONE (portal, Table) PAIR, as `custom.portal_tables` reports it.
|
|
25
|
+
*
|
|
26
|
+
* 🚨 WHY THIS EXISTS (TAILS-3, 2026-09-21). The Portals rail sits on a Table's
|
|
27
|
+
* page beside Forms, Bookings and Dashboards — all table-scoped — while
|
|
28
|
+
* `custom.portals` takes no table at all. On Rincon Plumbing Co's **Parts**
|
|
29
|
+
* table the rail read "Portals 10" and listed ten cards titled "Your jobs and
|
|
30
|
+
* invoices", which belong to **Jobs**; the empty state never rendered, so the
|
|
31
|
+
* "Build it / Ask an agent" offer was unreachable on EVERY table of any
|
|
32
|
+
* organization that already had one portal.
|
|
33
|
+
*
|
|
34
|
+
* This is the whole of what a table-scoped rail needs: is the table I am
|
|
35
|
+
* standing on in any portal, and if not, which portals could take it.
|
|
36
|
+
*/
|
|
37
|
+
interface PortalTableRef {
|
|
38
|
+
portal_id: Uuid;
|
|
39
|
+
table_id: Uuid;
|
|
40
|
+
/** That Table's name, so a rail never reads a second door to draw a row. */
|
|
41
|
+
name: string;
|
|
42
|
+
}
|
|
43
|
+
/** One Table a portal exposes, as `custom.portal_card` reports it. */
|
|
44
|
+
interface PortalTableExposure {
|
|
45
|
+
table_id: Uuid;
|
|
46
|
+
/** The Table's own name. */
|
|
47
|
+
name: string;
|
|
48
|
+
/**
|
|
49
|
+
* The key of the relation Field that says WHOSE a record is. This is the
|
|
50
|
+
* whole of "only theirs": the association that Field writes is what carries
|
|
51
|
+
* the record to the client, so a portal cannot exist without one.
|
|
52
|
+
*/
|
|
53
|
+
names_via: string;
|
|
54
|
+
/** The field keys a client sees. Empty is impossible — the door fills it. */
|
|
55
|
+
visible_fields: string[];
|
|
56
|
+
/** The subset a client may change. Always a subset of `visible_fields`. */
|
|
57
|
+
editable_fields: string[];
|
|
58
|
+
comments: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* The most a client is ever conveyed on this Table — `viewer`, `commenter`
|
|
61
|
+
* or `editor` — worked out by the door from the two lists above, never by a
|
|
62
|
+
* screen.
|
|
63
|
+
*/
|
|
64
|
+
conveys: string;
|
|
65
|
+
}
|
|
66
|
+
/** One person a portal was opened to, as `custom.portal_card` reports them. */
|
|
67
|
+
interface PortalPrincipal {
|
|
68
|
+
principal_id: Uuid;
|
|
69
|
+
email: string;
|
|
70
|
+
/** The record of the client Table this person IS, for the portal's purposes. */
|
|
71
|
+
client_record_id: Uuid;
|
|
72
|
+
/** That record's title — what an owner calls this client. */
|
|
73
|
+
client: string;
|
|
74
|
+
/** They followed the link and hold an identity. Until then this is false. */
|
|
75
|
+
signed_in: boolean;
|
|
76
|
+
/** Not revoked. An invitation that was never followed is still active. */
|
|
77
|
+
is_active: boolean;
|
|
78
|
+
invited_at: Timestamp;
|
|
79
|
+
revoked_at: Timestamp | null;
|
|
80
|
+
/**
|
|
81
|
+
* THE LINK THE OFFICE COPIES FOR THIS PERSON — `/invitations/portal/accept/<token>`, the
|
|
82
|
+
* path `custom.portal_invite` handed back when they were asked, read off the same
|
|
83
|
+
* `iam.invitations` row and never re-templated.
|
|
84
|
+
*
|
|
85
|
+
* 🚨 `null` IS AN ANSWER, NOT AN ABSENCE, and a screen must say which. It is null when they
|
|
86
|
+
* have already followed the link, when the office took it back (a revoke withdraws the
|
|
87
|
+
* invitation in the same statement), when it has expired, or when they were let in through
|
|
88
|
+
* the server's own magic-link route, which binds without an invitation at all. In every one
|
|
89
|
+
* of those cases there is genuinely no link to copy — so draw a sentence, never a dead
|
|
90
|
+
* control. (TAILS-5, 2026-09-21; the gap PORTAL-BIND left named.)
|
|
91
|
+
*/
|
|
92
|
+
accept_path: string | null;
|
|
93
|
+
}
|
|
94
|
+
/** Everything about ONE portal: what it shows, and who it was opened to. */
|
|
95
|
+
interface PortalCard {
|
|
96
|
+
portal_id: Uuid;
|
|
97
|
+
title: string;
|
|
98
|
+
slug: string;
|
|
99
|
+
is_active: boolean;
|
|
100
|
+
sign_in_method: string;
|
|
101
|
+
client_table_id: Uuid;
|
|
102
|
+
tables: PortalTableExposure[];
|
|
103
|
+
principals: PortalPrincipal[];
|
|
104
|
+
/**
|
|
105
|
+
* Whether this organization's outside lane is open
|
|
106
|
+
* (`custom/external_principal_enabled`). Declaring a portal opens it; while
|
|
107
|
+
* it is false every door refuses an outsider BY NAME, and a screen that drew
|
|
108
|
+
* the people as reachable anyway would be lying about the one thing that
|
|
109
|
+
* decides whether they can sign in at all.
|
|
110
|
+
*/
|
|
111
|
+
external_lane_open: boolean;
|
|
112
|
+
/** S6 — the look and forms exactly as the owner stored them (`{}` when none). */
|
|
113
|
+
config: PortalConfig;
|
|
114
|
+
/** S6 — the look as a client sees it: the portal's own values over the organization's brand. */
|
|
115
|
+
style: PortalStyle;
|
|
116
|
+
/** S6 — every form on the portal, in its order, with its title, Table and state. */
|
|
117
|
+
forms: PortalFormRef[];
|
|
118
|
+
/** S6 — the accent names a portal may carry (the design system's `STYLE_COLORS`). */
|
|
119
|
+
accents: PortalAccent[];
|
|
120
|
+
/**
|
|
121
|
+
* S6 — the pictures that could be this portal's logo: the organization's own PUBLIC pictures in
|
|
122
|
+
* Files, newest first. A private file is never offered, because the store would refuse it.
|
|
123
|
+
*/
|
|
124
|
+
logo_candidates: PublicPicture[];
|
|
125
|
+
}
|
|
126
|
+
/** The design system's colour names (`STYLE_COLORS`), which is all an accent may be. */
|
|
127
|
+
declare const PORTAL_ACCENTS: readonly ["slate", "green", "amber", "red", "blue", "violet", "teal"];
|
|
128
|
+
type PortalAccent = (typeof PORTAL_ACCENTS)[number];
|
|
129
|
+
declare function isPortalAccent(word: unknown): word is PortalAccent;
|
|
130
|
+
/** One link in a portal's footer. The store takes only `https://`, `mailto:` and `tel:`. */
|
|
131
|
+
interface PortalFooterLink {
|
|
132
|
+
label: string;
|
|
133
|
+
url: string;
|
|
134
|
+
}
|
|
135
|
+
/** A portal's look as the owner sets it. Every key is optional; absent means "the organization's". */
|
|
136
|
+
interface PortalStyleInput {
|
|
137
|
+
display_name?: string | null;
|
|
138
|
+
welcome?: string | null;
|
|
139
|
+
logo_file_id?: Uuid | null;
|
|
140
|
+
accent?: PortalAccent | null;
|
|
141
|
+
footer_links?: PortalFooterLink[] | null;
|
|
142
|
+
}
|
|
143
|
+
/** One form on a portal, as the owner sets it. `order` is the position; `label` overrides the title. */
|
|
144
|
+
interface PortalFormInput {
|
|
145
|
+
form_id: Uuid;
|
|
146
|
+
label?: string | null;
|
|
147
|
+
order?: number | null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* What `portalDeclare({ config })` sends. A key given REPLACES that key; a key not given is KEPT;
|
|
151
|
+
* `style: null` puts the organization's brand back and `forms: []` takes every form off.
|
|
152
|
+
*/
|
|
153
|
+
interface PortalConfigInput {
|
|
154
|
+
style?: PortalStyleInput | null;
|
|
155
|
+
forms?: PortalFormInput[] | null;
|
|
156
|
+
}
|
|
157
|
+
/** The look and forms as the store holds them (normalized by the store). */
|
|
158
|
+
interface PortalConfig {
|
|
159
|
+
style?: PortalStyleInput;
|
|
160
|
+
forms?: Array<{
|
|
161
|
+
form_id: Uuid;
|
|
162
|
+
label?: string;
|
|
163
|
+
order: number;
|
|
164
|
+
}>;
|
|
165
|
+
}
|
|
166
|
+
/** The look a client is shown — resolved by the store, never computed by a screen. */
|
|
167
|
+
interface PortalStyle {
|
|
168
|
+
display_name: string;
|
|
169
|
+
welcome: string | null;
|
|
170
|
+
logo_file_id: Uuid | null;
|
|
171
|
+
/** The logo's PUBLIC address, or null. Readable by anybody the portal is shown to. */
|
|
172
|
+
logo_url: string | null;
|
|
173
|
+
/** Null means the app's own colour. */
|
|
174
|
+
accent: PortalAccent | null;
|
|
175
|
+
footer_links: PortalFooterLink[];
|
|
176
|
+
/** MAKE-HOME W5 — a cover picture's PUBLIC address (a form's look carries one), or null. */
|
|
177
|
+
cover_file_id?: Uuid | null;
|
|
178
|
+
cover_url?: string | null;
|
|
179
|
+
/** Which of the values above came from the organization rather than the portal. */
|
|
180
|
+
from_organization: Array<"display_name" | "logo">;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* One of the organization's PUBLIC pictures (`custom._public_pictures`): the only pictures a
|
|
184
|
+
* portal's logo or a form's logo and cover may be, because a stranger sees them before signing in.
|
|
185
|
+
*/
|
|
186
|
+
interface PublicPicture {
|
|
187
|
+
file_id: Uuid;
|
|
188
|
+
name: string;
|
|
189
|
+
url: string | null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* What a form's look editor needs (`custom.form_look_options`, MAKE-HOME W5b): the pictures the
|
|
193
|
+
* store accepts, the colours, and the look a stranger would see for the draft presentation.
|
|
194
|
+
*/
|
|
195
|
+
interface FormLookOptions {
|
|
196
|
+
pictures: PublicPicture[];
|
|
197
|
+
accents: PortalAccent[];
|
|
198
|
+
look: PortalStyle;
|
|
199
|
+
}
|
|
200
|
+
/** One form on a portal, with what the owner needs to see about it. */
|
|
201
|
+
interface PortalFormRef {
|
|
202
|
+
form_id: Uuid;
|
|
203
|
+
/** What the portal calls it (the owner's label, else the form's title). */
|
|
204
|
+
label: string;
|
|
205
|
+
order: number;
|
|
206
|
+
title: string;
|
|
207
|
+
table_id: Uuid | null;
|
|
208
|
+
table: string;
|
|
209
|
+
/** `gone` is a form that was removed; the outsider's list only ever carries `open`. */
|
|
210
|
+
state: "open" | "closed" | "full" | "gone";
|
|
211
|
+
}
|
|
212
|
+
/** A Table's stages as a portal client may be told them (`custom.portal_me` → tables[].stage). */
|
|
213
|
+
interface PortalStage {
|
|
214
|
+
/** The stage Field's key on the record. */
|
|
215
|
+
field: string;
|
|
216
|
+
label: string;
|
|
217
|
+
/** In the order they were declared. A record stores the stage's `key`. */
|
|
218
|
+
stages: Array<{
|
|
219
|
+
key: string;
|
|
220
|
+
label: string;
|
|
221
|
+
retired: boolean;
|
|
222
|
+
}>;
|
|
223
|
+
}
|
|
224
|
+
/** What `custom.portal_form` answers: one form on the caller's own portal. */
|
|
225
|
+
interface PortalFormSpec {
|
|
226
|
+
form_id: Uuid;
|
|
227
|
+
portal_id: Uuid;
|
|
228
|
+
table_id: Uuid;
|
|
229
|
+
title: string;
|
|
230
|
+
label: string;
|
|
231
|
+
presentation: Record<string, unknown>;
|
|
232
|
+
/** The form's exposed Fields as the store holds them — never the one naming the client. */
|
|
233
|
+
fields: Array<Record<string, unknown> & {
|
|
234
|
+
id: Uuid;
|
|
235
|
+
key: string;
|
|
236
|
+
}>;
|
|
237
|
+
required: string[];
|
|
238
|
+
state: "open" | "closed" | "full";
|
|
239
|
+
message: string | null;
|
|
240
|
+
}
|
|
241
|
+
/** What `custom.portal_form_submit` answers. `held` waits for the office; `message` says so. */
|
|
242
|
+
interface PortalFormAnswer {
|
|
243
|
+
submission_id: Uuid | null;
|
|
244
|
+
record_id: Uuid | null;
|
|
245
|
+
state: "accepted" | "held" | "rejected" | "closed" | "full" | "too_many";
|
|
246
|
+
message: string | null;
|
|
247
|
+
}
|
|
248
|
+
/** What `custom.portal_invite` answers. `say` is the door's own sentence. */
|
|
249
|
+
interface PortalInvitation {
|
|
250
|
+
invited: boolean;
|
|
251
|
+
principal_id: Uuid;
|
|
252
|
+
portal_id: Uuid;
|
|
253
|
+
slug: string;
|
|
254
|
+
email: string;
|
|
255
|
+
client_record_id: Uuid;
|
|
256
|
+
client: string;
|
|
257
|
+
/** They already hold an identity. From a screen this is false: the door is passed no user. */
|
|
258
|
+
bound: boolean;
|
|
259
|
+
/**
|
|
260
|
+
* The door's own words, and the ONLY correct summary of what just happened —
|
|
261
|
+
* it says outright that an invitation confers nothing until the link is
|
|
262
|
+
* followed. Show it; never paraphrase it.
|
|
263
|
+
*/
|
|
264
|
+
say: string;
|
|
265
|
+
}
|
|
266
|
+
/** What `custom.portal_revoke` answers. `say` names the consequence, past tense. */
|
|
267
|
+
interface PortalRevocation {
|
|
268
|
+
revoked: boolean;
|
|
269
|
+
principal_id: Uuid;
|
|
270
|
+
email: string;
|
|
271
|
+
/** The door's own sentence: they can no longer sign in, and their records stop reaching them. */
|
|
272
|
+
say: string;
|
|
273
|
+
}
|
|
274
|
+
/** One row of "what this client sees", from `custom.portal_preview`. */
|
|
275
|
+
interface PortalPreviewRow {
|
|
276
|
+
record_id: Uuid;
|
|
277
|
+
title: string;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* THE PUBLIC ADDRESS OF A PORTAL, and the one place its shape is written down.
|
|
281
|
+
*
|
|
282
|
+
* Unlike a form's link, a portal's slug is NOT the capability: the page it
|
|
283
|
+
* serves asks who you are and emails a one-time link, so the slug is a name and
|
|
284
|
+
* nothing more. That is why it is readable and why copying it is safe.
|
|
285
|
+
*/
|
|
286
|
+
declare function portalPath(slug: string): string;
|
|
287
|
+
/**
|
|
288
|
+
* The platform archive filter's own three values, and no fourth. `custom.list_portals`
|
|
289
|
+
* refuses anything else with `22023` rather than quietly treating it as one of them.
|
|
290
|
+
*/
|
|
291
|
+
declare const PORTAL_ARCHIVE_FILTERS: readonly ["active", "archived", "all"];
|
|
292
|
+
type PortalArchiveFilter = (typeof PORTAL_ARCHIVE_FILTERS)[number];
|
|
293
|
+
/** THE LAW'S DEFAULT IS TO HIDE. A list nobody narrowed is the live things. */
|
|
294
|
+
declare const DEFAULT_PORTAL_ARCHIVE_FILTER: PortalArchiveFilter;
|
|
295
|
+
declare function isPortalArchiveFilter(word: unknown): word is PortalArchiveFilter;
|
|
296
|
+
/** What `custom.portal_archive` and `custom.portal_restore` answer with. */
|
|
297
|
+
interface PortalArchiveAnswer {
|
|
298
|
+
/** Where the portal stands NOW — true after an archive, false after a restore. */
|
|
299
|
+
archived: boolean;
|
|
300
|
+
/** False when it was already in that state; the sentence says so rather than lying about an act. */
|
|
301
|
+
changed: boolean;
|
|
302
|
+
portal_id: Uuid;
|
|
303
|
+
archived_at?: Timestamp | null;
|
|
304
|
+
/** The store's own sentence, in plain English. Show it verbatim; never a constraint name. */
|
|
305
|
+
sentence: string;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* THE CONSEQUENCE, SAID BEFORE THE CLICK — never a generic "are you sure?".
|
|
309
|
+
*
|
|
310
|
+
* What actually changes is two things: nobody can sign in to it any more, and it
|
|
311
|
+
* leaves the organization's portal list. What does NOT change is everything
|
|
312
|
+
* else, and saying so is the difference between an archive somebody dares to
|
|
313
|
+
* press and one they avoid.
|
|
314
|
+
*/
|
|
315
|
+
declare function portalArchiveConsequence(title: string, signedIn: number, invited: number): string;
|
|
316
|
+
/**
|
|
317
|
+
* WHY THE TITLE HAS TO BE TYPED BACK, in the store's own reasoning. Ten portals
|
|
318
|
+
* can carry one title, so the title is not what PICKS this one — the portal you
|
|
319
|
+
* opened is. Typing it back is how you say you meant this one.
|
|
320
|
+
*/
|
|
321
|
+
declare function portalConfirmLine(title: string): string;
|
|
322
|
+
/** True when what the person typed is what the door will accept. The door decides; this only spares them a round trip. */
|
|
323
|
+
declare function portalTitleTypedBack(typed: string, title: string): boolean;
|
|
324
|
+
/**
|
|
325
|
+
* WHAT AN EMPTY ARCHIVE LANE SAYS. An empty list is an answer: it says nothing
|
|
326
|
+
* has been archived, so "none here" can never be read as "the archive is broken"
|
|
327
|
+
* or as "this organization has no portals at all".
|
|
328
|
+
*/
|
|
329
|
+
declare function emptyPortalArchiveLine(): string;
|
|
330
|
+
|
|
331
|
+
export { portalArchiveConsequence as A, portalConfirmLine as B, portalPath as C, DEFAULT_PORTAL_ARCHIVE_FILTER as D, portalTitleTypedBack as E, type FormLookOptions as F, type PortalSummary as P, type PortalArchiveFilter as a, type PortalArchiveAnswer as b, type PortalTableRef as c, type PortalCard as d, type PortalConfigInput as e, type PortalFormSpec as f, type PortalFormAnswer as g, type PortalInvitation as h, type PortalRevocation as i, type PortalPreviewRow as j, type PortalAccent as k, PORTAL_ACCENTS as l, PORTAL_ARCHIVE_FILTERS as m, type PortalConfig as n, type PortalFooterLink as o, type PortalFormInput as p, type PortalFormRef as q, type PortalPrincipal as r, type PortalStage as s, type PortalStyle as t, type PortalStyleInput as u, type PortalTableExposure as v, type PublicPicture as w, emptyPortalArchiveLine as x, isPortalAccent as y, isPortalArchiveFilter as z };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as Actor, U as Uuid, P as PgError } from './record-
|
|
1
|
+
import { A as Actor, U as Uuid, P as PgError } from './record-BQi92d4-.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* The data seam: a structural subset of `SupabaseClient`. The package never
|
|
@@ -190,4 +190,4 @@ interface RecordsConfig {
|
|
|
190
190
|
knownDoors?: readonly string[];
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
export type { RecordsRealtimePort as R, RecordsConfig as a,
|
|
193
|
+
export type { RecordsRealtimePort as R, RecordsConfig as a, RecordsErrorSink as b, RecordsDataSource as c, RecordsChangeSink as d, RecordsActor as e, RecordsFilter as f, RecordsResolverPort as g, RecordsResponse as h, RecordsTableQuery as i };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as Actor, U as Uuid, P as PgError } from './record-
|
|
1
|
+
import { A as Actor, U as Uuid, P as PgError } from './record-BQi92d4-.cjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* The data seam: a structural subset of `SupabaseClient`. The package never
|
|
@@ -190,4 +190,4 @@ interface RecordsConfig {
|
|
|
190
190
|
knownDoors?: readonly string[];
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
export type { RecordsRealtimePort as R, RecordsConfig as a,
|
|
193
|
+
export type { RecordsRealtimePort as R, RecordsConfig as a, RecordsErrorSink as b, RecordsDataSource as c, RecordsChangeSink as d, RecordsActor as e, RecordsFilter as f, RecordsResolverPort as g, RecordsResponse as h, RecordsTableQuery as i };
|