@adminiumjs/manifest 0.3.0-rc.4 → 0.3.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.
Files changed (67) hide show
  1. package/dist/add-ons.d.ts +63 -0
  2. package/dist/add-ons.d.ts.map +1 -0
  3. package/dist/add-ons.js +100 -0
  4. package/dist/add-ons.js.map +1 -0
  5. package/dist/booking.d.ts +100 -0
  6. package/dist/booking.d.ts.map +1 -0
  7. package/dist/booking.js +237 -0
  8. package/dist/booking.js.map +1 -0
  9. package/dist/documents.d.ts +100 -0
  10. package/dist/documents.d.ts.map +1 -0
  11. package/dist/documents.js +148 -0
  12. package/dist/documents.js.map +1 -0
  13. package/dist/formula.d.ts +124 -0
  14. package/dist/formula.d.ts.map +1 -0
  15. package/dist/formula.js +428 -0
  16. package/dist/formula.js.map +1 -0
  17. package/dist/index.d.ts +14 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +14 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/outbox.d.ts +543 -0
  22. package/dist/outbox.d.ts.map +1 -0
  23. package/dist/outbox.js +559 -0
  24. package/dist/outbox.js.map +1 -0
  25. package/dist/page-calendar.d.ts +42 -0
  26. package/dist/page-calendar.d.ts.map +1 -0
  27. package/dist/page-calendar.js +95 -0
  28. package/dist/page-calendar.js.map +1 -0
  29. package/dist/plan-model.d.ts +1 -1
  30. package/dist/plan-model.d.ts.map +1 -1
  31. package/dist/public-access.d.ts +208 -0
  32. package/dist/public-access.d.ts.map +1 -0
  33. package/dist/public-access.js +681 -0
  34. package/dist/public-access.js.map +1 -0
  35. package/dist/refs.d.ts +91 -0
  36. package/dist/refs.d.ts.map +1 -0
  37. package/dist/refs.js +82 -0
  38. package/dist/refs.js.map +1 -0
  39. package/dist/roles.d.ts +44 -0
  40. package/dist/roles.d.ts.map +1 -0
  41. package/dist/roles.js +75 -0
  42. package/dist/roles.js.map +1 -0
  43. package/dist/sample.d.ts +150 -2
  44. package/dist/sample.d.ts.map +1 -1
  45. package/dist/sample.js +101 -3
  46. package/dist/sample.js.map +1 -1
  47. package/dist/schema.d.ts +3464 -151
  48. package/dist/schema.d.ts.map +1 -1
  49. package/dist/schema.js +681 -143
  50. package/dist/schema.js.map +1 -1
  51. package/dist/semver.d.ts +28 -0
  52. package/dist/semver.d.ts.map +1 -0
  53. package/dist/semver.js +85 -0
  54. package/dist/semver.js.map +1 -0
  55. package/dist/shapes.d.ts +97 -0
  56. package/dist/shapes.d.ts.map +1 -0
  57. package/dist/shapes.js +190 -0
  58. package/dist/shapes.js.map +1 -0
  59. package/dist/states.d.ts +134 -0
  60. package/dist/states.d.ts.map +1 -0
  61. package/dist/states.js +244 -0
  62. package/dist/states.js.map +1 -0
  63. package/dist/validate.d.ts +14 -0
  64. package/dist/validate.d.ts.map +1 -1
  65. package/dist/validate.js +29 -2
  66. package/dist/validate.js.map +1 -1
  67. package/package.json +2 -2
package/dist/outbox.js ADDED
@@ -0,0 +1,559 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ /**
3
+ * `outbox` and `emailTemplates` — the emails an app sends, declared with the
4
+ * app and versioned with it.
5
+ *
6
+ * The app's own table IS the outbox: every email is a row in it, queued by
7
+ * whatever wants it sent (a producer below, the desk's "Send now", an
8
+ * operator), then sent by Adminium, which records `sent`, `failed` or
9
+ * `skipped` on the row. So the table is the log a person reads, and a row of
10
+ * a kind already there for the same source is what stops a second send.
11
+ *
12
+ * Producers queue rows by themselves: when a row is created, when a column
13
+ * changes to a value, or a lead time before a timestamp (a reminder at the
14
+ * time each patient chose).
15
+ *
16
+ * Templates are stored with the app as their owner. An operator who edits
17
+ * one keeps the edit across the app's updates.
18
+ *
19
+ * A producer may HOLD what it queues: the row is written `held`, with the
20
+ * moment it becomes due, and nothing is sent until someone approves it (a
21
+ * reminder about an unpaid invoice, whose wording the sender may edit).
22
+ * Messages of one `supersede` group give way to a later one that comes due,
23
+ * `dropWhen` skips waiting ones once they are no longer needed (the invoice
24
+ * was paid), and `onSent` changes a linked row once the message has gone
25
+ * (the third reminder pauses the project).
26
+ */
27
+ import { z } from 'zod';
28
+ import { bcp47TagSchema, refSchema, scalarSchema, settingRefSchema, settingSourceSchema, textOrLabels, valueFits, } from './refs.js';
29
+ /** The statuses an outbox table's status column must offer. */
30
+ export const OUTBOX_STATUSES = ['queued', 'sent', 'failed', 'skipped'];
31
+ /** The status a held message waits in, when any producer holds. */
32
+ export const OUTBOX_HELD = 'held';
33
+ /** Why a waiting message was skipped. `overtaken` and `by-hand` are Adminium's and the desk's. */
34
+ export const OUTBOX_SKIP_REASONS = ['overtaken', 'paid', 'void', 'no-longer-needed', 'by-hand'];
35
+ /** One condition on a row: equal to a value, one of several, or empty (or not). */
36
+ const conditionSchema = z
37
+ .object({
38
+ column: refSchema,
39
+ eq: scalarSchema.optional(),
40
+ in: z.array(scalarSchema).min(1).max(32).optional(),
41
+ isNull: z.boolean().optional(),
42
+ })
43
+ .strict()
44
+ .refine((c) => [c.eq, c.in, c.isNull].filter((part) => part !== undefined).length === 1, {
45
+ message: 'a condition says one of eq, in or isNull',
46
+ });
47
+ /** How many days after the source row's date a held message comes due. */
48
+ const dueDaysSchema = z.union([
49
+ z.number().int().min(0).max(3650),
50
+ /** A number per value of a column of the source row (`ladder`: gentle 7, firm 1). */
51
+ z.object({ byColumn: refSchema, values: z.record(z.string().min(1), z.number().int().min(0).max(3650)) }).strict(),
52
+ /**
53
+ * Read from a setting when the message is made (and again when the date
54
+ * moves): a number, a list (`index` picks one), or lists per value of
55
+ * `byColumn` (`{gentle: [7, 21, 45], …}`).
56
+ */
57
+ z
58
+ .object({ setting: settingSourceSchema, byColumn: refSchema.optional(), index: z.number().int().min(0).max(9).optional() })
59
+ .strict(),
60
+ ]);
61
+ const dropConditionSchema = z
62
+ .object({
63
+ column: refSchema,
64
+ eq: scalarSchema.optional(),
65
+ in: z.array(scalarSchema).min(1).max(32).optional(),
66
+ isNull: z.boolean().optional(),
67
+ lte: z.number().finite().optional(),
68
+ gte: z.number().finite().optional(),
69
+ reason: z.enum(['paid', 'void', 'no-longer-needed']),
70
+ })
71
+ .strict()
72
+ .refine((c) => [c.eq, c.in, c.isNull, c.lte, c.gte].filter((part) => part !== undefined).length === 1, {
73
+ message: 'a condition says one of eq, in, isNull, lte or gte',
74
+ });
75
+ const producerBase = {
76
+ /** The kind of row it queues (a key of `outbox.kinds`). */
77
+ kind: z.string().min(1).max(40),
78
+ /** The outbox column that links the queued row to the row that produced it. */
79
+ link: refSchema,
80
+ /**
81
+ * Paused while the settings row's `enabled` column is false — or, naming
82
+ * one, while that bool of the settings row is false (each of a studio's
83
+ * notices has its own switch).
84
+ */
85
+ gate: z.union([z.literal('enabled'), z.object({ setting: settingRefSchema }).strict()]).optional(),
86
+ /** Skipped for a recipient whose `recipient.optIn` column is false. */
87
+ optIn: z.literal(true).optional(),
88
+ /** Written `held`: sent only once someone approves it. */
89
+ hold: z.literal(true).optional(),
90
+ /** When it comes due: days after a date of the source row, at a time of day on the venue's clock (09:00 by default). */
91
+ due: z
92
+ .object({
93
+ date: refSchema,
94
+ days: dueDaysSchema,
95
+ at: z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, 'a time such as 09:00').optional(),
96
+ })
97
+ .strict()
98
+ .optional(),
99
+ /** Messages of this group for one row: when one comes due, the earlier ones not yet sent are skipped as overtaken. */
100
+ supersede: z.string().regex(/^[a-z][a-z0-9-]{0,39}$/, 'a group name').optional(),
101
+ /** While the source row meets one of these, its waiting messages are skipped, with the reason. */
102
+ dropWhen: z.array(dropConditionSchema).min(1).max(4).optional(),
103
+ /** Sent to an address a setting holds (the studio's own) instead of the outbox's recipient. */
104
+ recipient: z.object({ setting: settingSourceSchema }).strict().optional(),
105
+ /** One message per linked row in each window of this many minutes. */
106
+ batchMinutes: z.number().int().min(1).max(240).optional(),
107
+ /**
108
+ * A change made once the message has gone, through the ordinary write: to
109
+ * the source row, or (with `via`) the row its foreign key points at.
110
+ */
111
+ onSent: z
112
+ .object({
113
+ table: refSchema,
114
+ via: refSchema.optional(),
115
+ set: z.record(refSchema, z.union([scalarSchema, z.null()])),
116
+ })
117
+ .strict()
118
+ .optional(),
119
+ };
120
+ export const outboxProducerSchema = z.union([
121
+ z
122
+ .object({
123
+ ...producerBase,
124
+ /** `via`: the source is a child row, and the message links the row its foreign key points at. */
125
+ onCreate: z.object({ table: refSchema, via: refSchema.optional(), where: conditionSchema.optional() }).strict(),
126
+ })
127
+ .strict(),
128
+ z
129
+ .object({
130
+ ...producerBase,
131
+ onChange: z
132
+ .object({
133
+ table: refSchema,
134
+ via: refSchema.optional(),
135
+ column: refSchema,
136
+ to: z.union([scalarSchema, z.array(scalarSchema).min(1).max(16)]),
137
+ where: conditionSchema.optional(),
138
+ })
139
+ .strict(),
140
+ })
141
+ .strict(),
142
+ z
143
+ .object({
144
+ ...producerBase,
145
+ before: z
146
+ .object({
147
+ table: refSchema,
148
+ /** The moment the email leads: a timestamptz. */
149
+ at: refSchema,
150
+ /** How many hours before: read through one link, with a settings fallback. */
151
+ lead: z
152
+ .object({
153
+ via: refSchema,
154
+ table: refSchema,
155
+ column: refSchema,
156
+ fallback: settingRefSchema.optional(),
157
+ /** The largest lead anyone may choose, in hours — how far ahead Adminium looks. */
158
+ max: z.number().int().min(1).max(24 * 14),
159
+ })
160
+ .strict(),
161
+ where: conditionSchema.optional(),
162
+ })
163
+ .strict(),
164
+ })
165
+ .strict(),
166
+ ]);
167
+ const recipientSchema = z
168
+ .object({
169
+ /** The outbox column pointing at the person, and their table's columns. */
170
+ via: refSchema,
171
+ table: refSchema,
172
+ email: refSchema,
173
+ name: refSchema.optional(),
174
+ language: refSchema.optional(),
175
+ /** A bool the person sets: false means no reminders. */
176
+ optIn: refSchema.optional(),
177
+ /**
178
+ * Where the address comes from when `via` is empty — a first visit made
179
+ * by someone not yet on file carries their details on the row itself.
180
+ */
181
+ fallback: z
182
+ .object({ via: refSchema, email: refSchema, name: refSchema.optional(), language: refSchema.optional() })
183
+ .strict()
184
+ .optional(),
185
+ })
186
+ .strict();
187
+ export const outboxSchema = z
188
+ .object({
189
+ table: refSchema,
190
+ columns: z
191
+ .object({
192
+ kind: refSchema,
193
+ status: refSchema,
194
+ to: refSchema,
195
+ language: refSchema.optional(),
196
+ due: refSchema.optional(),
197
+ sentAt: refSchema.optional(),
198
+ error: refSchema.optional(),
199
+ /** Why a message was skipped (overtaken, paid, void, no-longer-needed, by-hand). */
200
+ skipReason: refSchema.optional(),
201
+ /** The wording a person approving a held message wrote instead of the template's. */
202
+ subjectOverride: refSchema.optional(),
203
+ bodyOverride: refSchema.optional(),
204
+ /** Who approved a held message. */
205
+ approvedBy: refSchema.optional(),
206
+ /** When `onSent`'s change was made, or why it was refused. */
207
+ effectAt: refSchema.optional(),
208
+ effectError: refSchema.optional(),
209
+ })
210
+ .strict(),
211
+ /**
212
+ * The outbox's foreign keys, by the name a template reads them under:
213
+ * `{appointment: 'appointment_id'}` gives a template `appointment.*`.
214
+ */
215
+ links: z.record(z.string().regex(/^[a-z][a-z_]*$/, 'a link name is snake_case'), refSchema).optional(),
216
+ recipient: recipientSchema,
217
+ /**
218
+ * The app's one-row settings table, read as `practice.*` by every template;
219
+ * `name` is the column its emails are signed with (the sign-in code's too),
220
+ * and `phone` the number Adminium's own notices give a person to ring —
221
+ * the one sent to an old address after a change of email.
222
+ */
223
+ settings: z
224
+ .object({ table: refSchema, enabled: refSchema.optional(), name: refSchema.optional(), phone: refSchema.optional() })
225
+ .strict()
226
+ .optional(),
227
+ /**
228
+ * Where a template's links lead on the app's guest side: `manage_url` and
229
+ * `booking_url`, as paths under its address (default: its front page).
230
+ */
231
+ pages: z
232
+ .object({
233
+ manage: z.string().regex(/^\/[A-Za-z0-9/_-]{0,119}$/, 'a path on the guest side, e.g. /my-visits').optional(),
234
+ booking: z.string().regex(/^\/[A-Za-z0-9/_-]{0,119}$/, 'a path on the guest side, e.g. /').optional(),
235
+ })
236
+ .strict()
237
+ .optional(),
238
+ /** Each value of the kind column, and the template it is sent with. */
239
+ kinds: z.record(z.string().min(1).max(40), z.string().min(1).max(80)),
240
+ producers: z.array(outboxProducerSchema).max(24).optional(),
241
+ })
242
+ .strict();
243
+ /**
244
+ * One block of a template, in the shape the template store keeps. The `html`
245
+ * block is refused: its variables are not escaped, and a manifest's template
246
+ * renders values a stranger typed (a name on a first visit).
247
+ */
248
+ const emailBlockSchema = z
249
+ .object({
250
+ block: z
251
+ .string()
252
+ .regex(/^email\.[a-z][a-z0-9-]*$/, 'an email block kind, e.g. email.text')
253
+ .refine((kind) => kind !== 'email.html', { message: 'an app template may not use the html block' }),
254
+ id: z.string().min(1).max(60).optional(),
255
+ label: z.string().min(1).max(120).optional(),
256
+ data: z.record(z.string(), z.unknown()).optional(),
257
+ })
258
+ .strict();
259
+ const emailContentSchema = z
260
+ .object({
261
+ subject: z.string().min(1).max(200),
262
+ preheader: z.string().min(1).max(200).optional(),
263
+ blocks: z.array(emailBlockSchema).min(1).max(40),
264
+ footer: z.string().min(1).max(1000).optional(),
265
+ })
266
+ .strict();
267
+ export const emailTemplateSchema = z
268
+ .object({
269
+ /** `<app key>-<name>`: an app names only its own templates. */
270
+ key: z.string().regex(/^[a-z][a-z0-9-]{1,79}$/, 'a template key is kebab-case'),
271
+ name: textOrLabels,
272
+ /**
273
+ * A document the email carries, drawn by an add-on for the row an
274
+ * outbox link names (a receipt for a sale): the PDF where its text allows,
275
+ * else the print copy. A message whose document cannot be drawn fails
276
+ * rather than going without it.
277
+ */
278
+ attach: z.object({ kind: z.string().regex(/^[a-z][a-z0-9-]*$/, 'a document kind'), link: z.string().min(1).max(40) }).strict().optional(),
279
+ /** The variables it reads, for the editor's list. */
280
+ vars: z.array(z.string().regex(/^[a-z_]+(\.[a-z_]+)*$/, 'a variable such as patient.name')).max(60).optional(),
281
+ /** The template in each language it ships, US English always among them. */
282
+ locales: z
283
+ .record(bcp47TagSchema, emailContentSchema)
284
+ .refine((locales) => locales['en-US'] !== undefined, { message: 'a template includes en-US' }),
285
+ })
286
+ .strict();
287
+ /** Everything in `outbox` and `emailTemplates` that names something undeclared, or does not fit. */
288
+ export function outboxIssues(m, index) {
289
+ const out = [];
290
+ const templates = new Set();
291
+ (m.emailTemplates ?? []).forEach((template, i) => {
292
+ if (template.attach !== undefined && m.outbox?.links?.[template.attach.link] === undefined) {
293
+ out.push({ path: ['emailTemplates', i, 'attach', 'link'], message: `"${template.attach.link}" is not one of the outbox's links` });
294
+ }
295
+ if (!template.key.startsWith(`${m.key}-`)) {
296
+ out.push({ path: ['emailTemplates', i, 'key'], message: `an app's template key starts with "${m.key}-"` });
297
+ }
298
+ if (templates.has(template.key))
299
+ out.push({ path: ['emailTemplates', i, 'key'], message: `"${template.key}" is declared twice` });
300
+ templates.add(template.key);
301
+ });
302
+ const box = m.outbox;
303
+ if (box === undefined) {
304
+ if (templates.size > 0)
305
+ out.push({ path: ['emailTemplates'], message: 'templates are sent through an outbox, and this app declares none' });
306
+ return out;
307
+ }
308
+ const at = (...rest) => ['outbox', ...rest];
309
+ if (index.table(box.table) === undefined) {
310
+ out.push({ path: at('table'), message: `"${box.table}" is not a table of this app` });
311
+ return out;
312
+ }
313
+ const col = (table, ref, types, path, what) => {
314
+ if (index.table(table) === undefined) {
315
+ out.push({ path, message: `"${table}" is not a table of this app` });
316
+ return undefined;
317
+ }
318
+ const found = index.column(table, ref);
319
+ if (found === undefined)
320
+ out.push({ path, message: `"${table}" has no column "${ref}"` });
321
+ else if (types !== null && !types.includes(found.type))
322
+ out.push({ path, message: `"${table}.${ref}" must be ${what}` });
323
+ else
324
+ return found;
325
+ return undefined;
326
+ };
327
+ const fk = (table, ref, target, path) => {
328
+ const found = col(table, ref, ['fk'], path, 'a foreign key');
329
+ if (found !== undefined && target !== undefined && found.references !== target) {
330
+ out.push({ path, message: `"${table}.${ref}" does not point at "${target}"` });
331
+ }
332
+ if (found !== undefined && found.nullable !== true && table === box.table) {
333
+ out.push({ path, message: `"${table}.${ref}" must be nullable: not every email is about one` });
334
+ }
335
+ return found;
336
+ };
337
+ const condition = (table, cond, path) => {
338
+ if (cond === undefined)
339
+ return;
340
+ const found = col(table, cond.column, null, [...path, 'column'], '');
341
+ const values = cond.eq !== undefined ? [cond.eq] : (cond.in ?? []);
342
+ if (found !== undefined)
343
+ for (const value of values) {
344
+ if (!valueFits(found, value))
345
+ out.push({ path, message: `${JSON.stringify(value)} is not a value of "${table}.${cond.column}"` });
346
+ }
347
+ if (found !== undefined && cond.isNull !== undefined && found.nullable !== true) {
348
+ out.push({ path, message: `"${table}.${cond.column}" is never empty` });
349
+ }
350
+ };
351
+ const kind = col(box.table, box.columns.kind, ['enum'], at('columns', 'kind'), 'an enum of the kinds');
352
+ const status = col(box.table, box.columns.status, ['enum'], at('columns', 'status'), `an enum of ${OUTBOX_STATUSES.join(', ')}`);
353
+ if (status !== undefined) {
354
+ const missing = OUTBOX_STATUSES.filter((value) => !(status.enum ?? []).includes(value));
355
+ if (missing.length > 0)
356
+ out.push({ path: at('columns', 'status'), message: `"${box.table}.${status.ref}" lacks ${missing.join(', ')}` });
357
+ }
358
+ col(box.table, box.columns.to, ['text'], at('columns', 'to'), 'a text column');
359
+ if (box.columns.language !== undefined)
360
+ col(box.table, box.columns.language, ['text'], at('columns', 'language'), 'a text column');
361
+ if (box.columns.due !== undefined)
362
+ col(box.table, box.columns.due, ['timestamptz'], at('columns', 'due'), 'a timestamptz');
363
+ if (box.columns.sentAt !== undefined)
364
+ col(box.table, box.columns.sentAt, ['timestamptz'], at('columns', 'sentAt'), 'a timestamptz');
365
+ if (box.columns.error !== undefined)
366
+ col(box.table, box.columns.error, ['text'], at('columns', 'error'), 'a text column');
367
+ for (const name of ['skipReason', 'subjectOverride', 'bodyOverride', 'approvedBy', 'effectError']) {
368
+ const ref = box.columns[name];
369
+ if (ref !== undefined)
370
+ col(box.table, ref, name === 'skipReason' ? ['text', 'enum'] : ['text'], at('columns', name), 'a text column');
371
+ }
372
+ if (box.columns.effectAt !== undefined)
373
+ col(box.table, box.columns.effectAt, ['timestamptz'], at('columns', 'effectAt'), 'a timestamptz');
374
+ const holds = (box.producers ?? []).some((producer) => producer.hold === true);
375
+ if (holds && status !== undefined && !(status.enum ?? []).includes(OUTBOX_HELD)) {
376
+ out.push({ path: at('columns', 'status'), message: `a producer holds its messages, so "${box.table}.${status.ref}" offers "${OUTBOX_HELD}"` });
377
+ }
378
+ if (holds && box.columns.due === undefined) {
379
+ out.push({ path: at('columns'), message: 'a held message waits for its due moment: name the outbox\'s due column' });
380
+ }
381
+ const setting = (source, path) => {
382
+ if ('addOn' in source) {
383
+ if (!(m.addOns?.requires ?? []).some((need) => need.key === source.addOn)) {
384
+ out.push({ path, message: `"${source.addOn}" is not required by the app (addOns.requires), so its setting may not be there` });
385
+ }
386
+ }
387
+ else {
388
+ col(source.table, source.column, null, path, '');
389
+ }
390
+ };
391
+ const linkTargets = new Map();
392
+ for (const [name, ref] of Object.entries(box.links ?? {})) {
393
+ linkTargets.set(ref, fk(box.table, ref, undefined, at('links', name))?.references);
394
+ }
395
+ const r = box.recipient;
396
+ fk(box.table, r.via, r.table, at('recipient', 'via'));
397
+ col(r.table, r.email, ['text'], at('recipient', 'email'), 'a text column');
398
+ if (r.name !== undefined)
399
+ col(r.table, r.name, ['text'], at('recipient', 'name'), 'a text column');
400
+ if (r.language !== undefined)
401
+ col(r.table, r.language, ['text'], at('recipient', 'language'), 'a text column');
402
+ if (r.optIn !== undefined)
403
+ col(r.table, r.optIn, ['bool'], at('recipient', 'optIn'), 'a bool');
404
+ if (r.fallback !== undefined) {
405
+ const via = fk(box.table, r.fallback.via, undefined, at('recipient', 'fallback', 'via'));
406
+ const holder = via?.references;
407
+ if (holder !== undefined) {
408
+ col(holder, r.fallback.email, ['text'], at('recipient', 'fallback', 'email'), 'a text column');
409
+ if (r.fallback.name !== undefined)
410
+ col(holder, r.fallback.name, ['text'], at('recipient', 'fallback', 'name'), 'a text column');
411
+ if (r.fallback.language !== undefined)
412
+ col(holder, r.fallback.language, ['text'], at('recipient', 'fallback', 'language'), 'a text column');
413
+ }
414
+ }
415
+ if (box.settings !== undefined && index.table(box.settings.table) === undefined) {
416
+ out.push({ path: at('settings', 'table'), message: `"${box.settings.table}" is not a table of this app` });
417
+ }
418
+ else if (box.settings !== undefined) {
419
+ if (box.settings.enabled !== undefined)
420
+ col(box.settings.table, box.settings.enabled, ['bool'], at('settings', 'enabled'), 'a bool');
421
+ if (box.settings.name !== undefined)
422
+ col(box.settings.table, box.settings.name, ['text'], at('settings', 'name'), 'a text column');
423
+ if (box.settings.phone !== undefined)
424
+ col(box.settings.table, box.settings.phone, ['text'], at('settings', 'phone'), 'a text column');
425
+ }
426
+ for (const [value, template] of Object.entries(box.kinds)) {
427
+ if (kind !== undefined && !(kind.enum ?? []).includes(value)) {
428
+ out.push({ path: at('kinds', value), message: `"${value}" is not a value of "${box.table}.${kind.ref}"` });
429
+ }
430
+ if (!templates.has(template))
431
+ out.push({ path: at('kinds', value), message: `"${template}" is not one of the app's emailTemplates` });
432
+ }
433
+ (box.producers ?? []).forEach((producer, p) => {
434
+ const here = (...rest) => at('producers', p, ...rest);
435
+ if (box.kinds[producer.kind] === undefined)
436
+ out.push({ path: here('kind'), message: `"${producer.kind}" is not one of the outbox's kinds` });
437
+ if (producer.gate === 'enabled' && box.settings?.enabled === undefined) {
438
+ out.push({ path: here('gate'), message: 'the outbox names no settings column to be gated by' });
439
+ }
440
+ else if (typeof producer.gate === 'object') {
441
+ col(producer.gate.setting.table, producer.gate.setting.column, ['bool'], here('gate', 'setting'), 'a bool');
442
+ }
443
+ if (producer.optIn === true && r.optIn === undefined) {
444
+ out.push({ path: here('optIn'), message: 'the recipient names no opt-in column' });
445
+ }
446
+ const source = 'onCreate' in producer ? producer.onCreate : 'onChange' in producer ? producer.onChange : producer.before;
447
+ if (index.table(source.table) === undefined) {
448
+ out.push({ path: here(), message: `"${source.table}" is not a table of this app` });
449
+ return;
450
+ }
451
+ // A child source links the row its foreign key points at.
452
+ const via = 'via' in source ? source.via : undefined;
453
+ let linked = source.table;
454
+ if (via !== undefined) {
455
+ const found = fk(source.table, via, undefined, here('via'));
456
+ if (found?.references !== undefined)
457
+ linked = found.references;
458
+ }
459
+ if (!linkTargets.has(producer.link)) {
460
+ out.push({ path: here('link'), message: `"${producer.link}" is not one of the outbox's links` });
461
+ }
462
+ else if (linkTargets.get(producer.link) !== undefined && linkTargets.get(producer.link) !== linked) {
463
+ out.push({ path: here('link'), message: `"${box.table}.${producer.link}" does not point at "${linked}"` });
464
+ }
465
+ condition(source.table, source.where, here('where'));
466
+ if (producer.due !== undefined) {
467
+ const due = producer.due;
468
+ if (box.columns.due === undefined)
469
+ out.push({ path: here('due'), message: 'a due moment is kept in the outbox\'s due column, and none is named' });
470
+ col(linked, due.date, ['date', 'timestamptz'], here('due', 'date'), 'a date');
471
+ if (typeof due.days === 'object') {
472
+ if ('setting' in due.days)
473
+ setting(due.days.setting, here('due', 'days', 'setting'));
474
+ const by = due.days.byColumn;
475
+ if (by !== undefined) {
476
+ const found = col(linked, by, null, here('due', 'days', 'byColumn'), '');
477
+ if (found !== undefined && 'values' in due.days) {
478
+ const missing = (found.enum ?? []).filter((value) => due.days.values[value] === undefined);
479
+ if (missing.length > 0)
480
+ out.push({ path: here('due', 'days', 'values'), message: `each value of "${linked}.${by}" needs its days (${missing.join(', ')})` });
481
+ }
482
+ }
483
+ }
484
+ if ('before' in producer)
485
+ out.push({ path: here('due'), message: 'a reminder before a moment is due by its lead, not by due' });
486
+ }
487
+ // A batch comes due when its window closes: that is its due, and it takes no other.
488
+ if (producer.batchMinutes !== undefined && producer.due !== undefined) {
489
+ out.push({ path: here('due'), message: 'a batch comes due when its window closes, so it takes no due of its own' });
490
+ }
491
+ if (producer.supersede !== undefined && producer.due === undefined && producer.batchMinutes === undefined) {
492
+ out.push({ path: here('supersede'), message: 'one message overtakes another when it comes due: name its due' });
493
+ }
494
+ (producer.dropWhen ?? []).forEach((drop, d) => {
495
+ const found = col(linked, drop.column, null, here('dropWhen', d, 'column'), '');
496
+ const values = drop.eq !== undefined ? [drop.eq] : (drop.in ?? []);
497
+ if (found !== undefined)
498
+ for (const value of values) {
499
+ if (!valueFits(found, value))
500
+ out.push({ path: here('dropWhen', d), message: `${JSON.stringify(value)} is not a value of "${linked}.${drop.column}"` });
501
+ }
502
+ });
503
+ if (producer.dropWhen !== undefined && producer.hold !== true && producer.due === undefined && producer.batchMinutes === undefined) {
504
+ out.push({ path: here('dropWhen'), message: 'only a message that waits (held, or due later) can be dropped' });
505
+ }
506
+ if (producer.recipient !== undefined)
507
+ setting(producer.recipient.setting, here('recipient', 'setting'));
508
+ if (producer.batchMinutes !== undefined && 'before' in producer) {
509
+ out.push({ path: here('batchMinutes'), message: 'a reminder before a moment is one per row already' });
510
+ }
511
+ if (producer.onSent !== undefined) {
512
+ const effect = producer.onSent;
513
+ if (index.table(effect.table) === undefined) {
514
+ out.push({ path: here('onSent', 'table'), message: `"${effect.table}" is not a table of this app` });
515
+ }
516
+ else {
517
+ if (effect.via === undefined) {
518
+ if (effect.table !== linked)
519
+ out.push({ path: here('onSent', 'table'), message: `the message is about "${linked}"; name the foreign key (via) that reaches "${effect.table}"` });
520
+ }
521
+ else {
522
+ fk(linked, effect.via, effect.table, here('onSent', 'via'));
523
+ }
524
+ for (const [ref, value] of Object.entries(effect.set)) {
525
+ const found = col(effect.table, ref, null, here('onSent', 'set', ref), '');
526
+ if (found !== undefined && value === null && found.nullable !== true) {
527
+ out.push({ path: here('onSent', 'set', ref), message: `"${effect.table}.${ref}" is never empty` });
528
+ }
529
+ else if (found !== undefined && value !== null && !valueFits(found, value)) {
530
+ out.push({ path: here('onSent', 'set', ref), message: `${JSON.stringify(value)} is not a value of "${effect.table}.${ref}"` });
531
+ }
532
+ }
533
+ }
534
+ }
535
+ if ('onChange' in producer) {
536
+ const change = producer.onChange;
537
+ const watched = col(change.table, change.column, null, here('onChange', 'column'), '');
538
+ if (watched !== undefined)
539
+ for (const value of Array.isArray(change.to) ? change.to : [change.to]) {
540
+ if (!valueFits(watched, value))
541
+ out.push({ path: here('onChange', 'to'), message: `${JSON.stringify(value)} is not a value of "${change.table}.${change.column}"` });
542
+ }
543
+ }
544
+ if ('before' in producer) {
545
+ const before = producer.before;
546
+ col(before.table, before.at, ['timestamptz'], here('before', 'at'), 'a timestamptz');
547
+ fk(before.table, before.lead.via, before.lead.table, here('before', 'lead', 'via'));
548
+ col(before.lead.table, before.lead.column, ['int', 'bigint'], here('before', 'lead', 'column'), 'an int');
549
+ if (before.lead.fallback !== undefined) {
550
+ col(before.lead.fallback.table, before.lead.fallback.column, ['int', 'bigint'], here('before', 'lead', 'fallback'), 'an int');
551
+ }
552
+ if (box.columns.due === undefined) {
553
+ out.push({ path: here('before'), message: 'a reminder records the moment it leads in the outbox\'s due column, and none is named' });
554
+ }
555
+ }
556
+ });
557
+ return out;
558
+ }
559
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}