@aphexcms/plugin-forms 0.1.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/dist/schema.js ADDED
@@ -0,0 +1,492 @@
1
+ import { effectiveOrganizationRole } from '@aphexcms/cms-core';
2
+ import { AlignLeft, ClipboardList, Hash, Inbox, List, Mail, MessageSquareText, SquareCheck, Type } from '@lucide/svelte';
3
+ /**
4
+ * The two collections this plugin contributes: `form` (what an editor composes)
5
+ * and `formSubmission` (what a visitor sent).
6
+ *
7
+ * ## Why a field is a block, not a row of settings
8
+ *
9
+ * A form field is a tagged union — a select has options, a number has a range, a
10
+ * message has no input at all — and the page builder's array-of-blocks is exactly
11
+ * that shape. Modelling it as one flat object with every possible setting on it
12
+ * would show an editor a "minimum value" control while they configure a checkbox.
13
+ * Each field kind is its own type, so each one shows only what applies.
14
+ *
15
+ * ## Reserved names
16
+ *
17
+ * Nothing here declares a field called `type`, `status` or `publishedAt`: those
18
+ * are document columns, and the schema validator rejects a shadowing field at
19
+ * startup — including inside nested objects. The discriminator an editor picks
20
+ * from is the block's own `_type`, which the array field manages, so there is
21
+ * nothing to declare.
22
+ */
23
+ /** Settings every field kind shares, spread into each block. */
24
+ function baseFields() {
25
+ return [
26
+ {
27
+ name: 'name',
28
+ type: 'string',
29
+ title: 'Name',
30
+ description: 'The key this answer is stored and emailed under. Lowercase, no spaces — e.g. `email`, `company`.',
31
+ validation: (Rule) => Rule.required().custom((value) => {
32
+ if (typeof value !== 'string')
33
+ return true;
34
+ return /^[a-z][a-z0-9_]*$/.test(value)
35
+ ? true
36
+ : 'Use lowercase letters, digits and underscores, starting with a letter';
37
+ })
38
+ },
39
+ {
40
+ name: 'label',
41
+ type: 'string',
42
+ title: 'Label',
43
+ description: 'What the visitor reads above the input.',
44
+ validation: (Rule) => Rule.required()
45
+ },
46
+ {
47
+ name: 'required',
48
+ type: 'boolean',
49
+ title: 'Required',
50
+ initialValue: false
51
+ },
52
+ {
53
+ name: 'width',
54
+ type: 'string',
55
+ title: 'Width',
56
+ initialValue: 'full',
57
+ list: [
58
+ { title: 'Full width', value: 'full' },
59
+ { title: 'Half', value: 'half' }
60
+ ],
61
+ options: { layout: 'tabs' }
62
+ }
63
+ ];
64
+ }
65
+ function validEmailList(value, multiple) {
66
+ if (typeof value !== 'string' || !value.trim())
67
+ return true;
68
+ if (value.includes('{{') || value.includes('}}'))
69
+ return 'Recipient addresses cannot use templates';
70
+ const addresses = multiple ? value.split(',') : [value];
71
+ return addresses.every((address) => /^[^\s@,]+@[^\s@,]+\.[^\s@,]+$/.test(address.trim()))
72
+ ? true
73
+ : multiple
74
+ ? 'Enter valid email addresses separated by commas'
75
+ : 'Enter a valid email address';
76
+ }
77
+ function validateAuthoredFields(value) {
78
+ if (!Array.isArray(value))
79
+ return true;
80
+ const inputs = value.filter((field) => !!field && typeof field === 'object' && field._type !== 'formMessage');
81
+ if (inputs.length === 0)
82
+ return 'Add at least one input field';
83
+ const names = inputs
84
+ .map((field) => field.name)
85
+ .filter((name) => typeof name === 'string');
86
+ if (new Set(names).size !== names.length)
87
+ return 'Every input must have a unique name';
88
+ for (const field of inputs) {
89
+ if (field._type === 'formNumber' &&
90
+ typeof field.min === 'number' &&
91
+ typeof field.max === 'number' &&
92
+ field.min > field.max) {
93
+ return `Minimum cannot exceed maximum for ${String(field.label ?? field.name ?? 'number field')}`;
94
+ }
95
+ if (field._type === 'formSelect') {
96
+ const options = Array.isArray(field.options) ? field.options : [];
97
+ const values = options.map((option) => {
98
+ if (!option || typeof option !== 'object')
99
+ return '';
100
+ const row = option;
101
+ return String(row.value ?? '').trim() || String(row.label ?? '').trim();
102
+ });
103
+ if (values.some((option) => !option))
104
+ return 'Every select option must have a label or value';
105
+ if (new Set(values).size !== values.length)
106
+ return 'Select option values must be unique';
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ /** The row label an editor reads in the collapsed field list. */
112
+ function fieldPreview(inputType) {
113
+ return {
114
+ select: { title: 'label', name: 'name' },
115
+ prepare: ({ title, name }) => ({
116
+ title: (typeof title === 'string' && title) || inputType,
117
+ subtitle: typeof name === 'string' && name ? `${inputType} · ${name}` : inputType
118
+ })
119
+ };
120
+ }
121
+ const textField = {
122
+ type: 'formText',
123
+ title: 'Text',
124
+ icon: Type,
125
+ fields: [
126
+ ...baseFields(),
127
+ { name: 'placeholder', type: 'string', title: 'Placeholder' },
128
+ { name: 'defaultValue', type: 'string', title: 'Default value' }
129
+ ],
130
+ preview: fieldPreview('Text')
131
+ };
132
+ const textareaField = {
133
+ type: 'formTextarea',
134
+ title: 'Long text',
135
+ icon: AlignLeft,
136
+ fields: [
137
+ ...baseFields(),
138
+ { name: 'placeholder', type: 'string', title: 'Placeholder' },
139
+ { name: 'rows', type: 'number', title: 'Rows', initialValue: 4, min: 2, max: 20, step: 1 }
140
+ ],
141
+ preview: fieldPreview('Long text')
142
+ };
143
+ const emailField = {
144
+ type: 'formEmail',
145
+ title: 'Email',
146
+ icon: Mail,
147
+ fields: [...baseFields(), { name: 'placeholder', type: 'string', title: 'Placeholder' }],
148
+ preview: fieldPreview('Email')
149
+ };
150
+ const numberField = {
151
+ type: 'formNumber',
152
+ title: 'Number',
153
+ icon: Hash,
154
+ fields: [
155
+ ...baseFields(),
156
+ { name: 'min', type: 'number', title: 'Minimum' },
157
+ { name: 'max', type: 'number', title: 'Maximum' }
158
+ ],
159
+ preview: fieldPreview('Number')
160
+ };
161
+ const checkboxField = {
162
+ type: 'formCheckbox',
163
+ title: 'Checkbox',
164
+ icon: SquareCheck,
165
+ fields: [
166
+ ...baseFields(),
167
+ { name: 'defaultValue', type: 'boolean', title: 'Ticked by default', initialValue: false }
168
+ ],
169
+ preview: fieldPreview('Checkbox')
170
+ };
171
+ const selectField = {
172
+ type: 'formSelect',
173
+ title: 'Select',
174
+ icon: List,
175
+ fields: [
176
+ ...baseFields(),
177
+ {
178
+ name: 'options',
179
+ type: 'array',
180
+ title: 'Options',
181
+ validation: (Rule) => Rule.required().min(1).max(100),
182
+ of: [
183
+ {
184
+ type: 'object',
185
+ name: 'option',
186
+ title: 'Option',
187
+ fields: [
188
+ {
189
+ name: 'label',
190
+ type: 'string',
191
+ title: 'Label',
192
+ validation: (Rule) => Rule.required()
193
+ },
194
+ {
195
+ name: 'value',
196
+ type: 'string',
197
+ title: 'Value',
198
+ description: 'What gets stored. Defaults to the label if left blank.'
199
+ }
200
+ ],
201
+ preview: { select: { title: 'label', subtitle: 'value' } }
202
+ }
203
+ ]
204
+ }
205
+ ],
206
+ preview: fieldPreview('Select')
207
+ };
208
+ /**
209
+ * A block of text between inputs — a section heading, an explanation, a consent
210
+ * notice. It has no `name` and collects nothing, so it deliberately doesn't
211
+ * spread `baseFields()`.
212
+ */
213
+ const messageField = {
214
+ type: 'formMessage',
215
+ title: 'Message',
216
+ icon: MessageSquareText,
217
+ fields: [{ name: 'message', type: 'array', title: 'Message', of: [{ type: 'block' }] }],
218
+ preview: {
219
+ select: { heading: 'message.0.children.0.text' },
220
+ prepare: ({ heading }) => ({
221
+ title: heading || 'Message',
222
+ subtitle: 'Message · display text'
223
+ })
224
+ }
225
+ };
226
+ /** Every field kind an editor can add, in the order they appear in the "add" menu. */
227
+ export const formFieldTypes = [
228
+ textField,
229
+ emailField,
230
+ textareaField,
231
+ selectField,
232
+ checkboxField,
233
+ numberField,
234
+ messageField
235
+ ];
236
+ /** Field kinds that actually collect an answer — everything except `formMessage`. */
237
+ export const INPUT_FIELD_TYPES = formFieldTypes
238
+ .map((f) => f.type)
239
+ .filter((type) => type !== 'formMessage');
240
+ export const formSchema = {
241
+ type: 'document',
242
+ name: 'form',
243
+ title: 'Form',
244
+ description: 'A form an editor composes, embedded on a page by the Form block',
245
+ icon: ClipboardList,
246
+ groups: [
247
+ { name: 'build', title: 'Build', default: true },
248
+ { name: 'confirmation', title: 'Confirmation' },
249
+ { name: 'notifications', title: 'Notifications' }
250
+ ],
251
+ preview: { select: { title: 'title' } },
252
+ fields: [
253
+ {
254
+ name: 'title',
255
+ type: 'string',
256
+ title: 'Title',
257
+ description: 'Internal name, and the default heading where the form is embedded.',
258
+ group: 'build',
259
+ validation: (Rule) => Rule.required()
260
+ },
261
+ {
262
+ name: 'fields',
263
+ type: 'array',
264
+ title: 'Fields',
265
+ group: 'build',
266
+ of: formFieldTypes,
267
+ validation: (Rule) => Rule.required().min(1).max(50).custom(validateAuthoredFields)
268
+ },
269
+ {
270
+ name: 'submitButtonLabel',
271
+ type: 'string',
272
+ title: 'Submit button label',
273
+ group: 'build',
274
+ initialValue: 'Submit'
275
+ },
276
+ {
277
+ name: 'confirmationType',
278
+ type: 'string',
279
+ title: 'On submit',
280
+ group: 'confirmation',
281
+ initialValue: 'message',
282
+ list: [
283
+ { title: 'Show a message', value: 'message' },
284
+ { title: 'Redirect', value: 'redirect' }
285
+ ],
286
+ options: { layout: 'tabs' }
287
+ },
288
+ {
289
+ name: 'confirmationMessage',
290
+ type: 'array',
291
+ title: 'Confirmation message',
292
+ group: 'confirmation',
293
+ of: [{ type: 'block' }],
294
+ hidden: ({ siblingData }) => siblingData.confirmationType !== 'message',
295
+ validation: (Rule) => Rule.custom((value, context) => context?.document?.confirmationType === 'message' &&
296
+ (!Array.isArray(value) || value.length === 0)
297
+ ? 'Required when the form shows a confirmation message'
298
+ : true)
299
+ },
300
+ {
301
+ name: 'redirectUrl',
302
+ type: 'string',
303
+ title: 'Redirect to',
304
+ description: 'A site path (/thanks) or an absolute URL.',
305
+ group: 'confirmation',
306
+ hidden: ({ siblingData }) => siblingData.confirmationType !== 'redirect',
307
+ /*
308
+ * `hidden` takes the field off screen for the other branch; validation
309
+ * still has to enforce it, because hiding is an authoring affordance and
310
+ * the API is reachable without the UI.
311
+ *
312
+ * Cross-field invariants belong in validation rather than a hook — a hook
313
+ * transforms, validation judges. `context.document` is the whole document,
314
+ * which is what makes "required, but only for this branch" expressible.
315
+ */
316
+ validation: (Rule) => Rule.custom((value, context) => {
317
+ const url = typeof value === 'string' ? value.trim() : '';
318
+ const redirects = context?.document?.confirmationType === 'redirect';
319
+ if (!url)
320
+ return redirects ? 'Required when the form redirects on submit' : true;
321
+ if (/^https?:\/\//.test(url) || url.startsWith('/'))
322
+ return true;
323
+ return 'Use a site path (/thanks) or an absolute URL (https://…)';
324
+ })
325
+ },
326
+ {
327
+ name: 'emails',
328
+ type: 'array',
329
+ title: 'Notification emails',
330
+ description: 'Sent after a submission is stored. Reference an answer with {{fieldName}}; {{allFields}} expands to the whole submission.',
331
+ group: 'notifications',
332
+ validation: (Rule) => Rule.max(20),
333
+ of: [
334
+ {
335
+ type: 'object',
336
+ name: 'notification',
337
+ title: 'Email',
338
+ fields: [
339
+ {
340
+ name: 'to',
341
+ type: 'string',
342
+ title: 'To',
343
+ description: 'Comma-separated for several recipients.',
344
+ validation: (Rule) => Rule.required().custom((value) => validEmailList(value, true))
345
+ },
346
+ {
347
+ name: 'replyTo',
348
+ type: 'string',
349
+ title: 'Reply to',
350
+ validation: (Rule) => Rule.custom((value) => validEmailList(value, false))
351
+ },
352
+ {
353
+ name: 'subject',
354
+ type: 'string',
355
+ title: 'Subject',
356
+ initialValue: 'New form submission',
357
+ validation: (Rule) => Rule.required()
358
+ },
359
+ {
360
+ name: 'message',
361
+ type: 'text',
362
+ title: 'Message',
363
+ rows: 6,
364
+ initialValue: '{{allFields}}',
365
+ validation: (Rule) => Rule.required()
366
+ }
367
+ ],
368
+ preview: { select: { title: 'to', subtitle: 'subject' } }
369
+ }
370
+ ]
371
+ }
372
+ ]
373
+ };
374
+ /**
375
+ * A stored submission.
376
+ *
377
+ * Answers live in one `submissionData` array of `{ field, value }` rather than as
378
+ * named columns, because the shape is per-form and changes whenever an editor
379
+ * edits the form. Storing them positionally keeps old submissions readable after
380
+ * a field is renamed or removed — the record is what was actually sent.
381
+ *
382
+ * Written only by this plugin's endpoint, under a system context. Nothing in the
383
+ * admin should edit one: a submission is a record of an event, and an editable
384
+ * record of an event is not a record.
385
+ */
386
+ /**
387
+ * No role may write these fields: the UI renders them read-only and the API drops
388
+ * writes at the boundary. Note that built-in `super_admin`/`admin` bypass field
389
+ * access by design, so this discourages rather than forbids — the endpoint remains
390
+ * the only thing that writes submissions in practice.
391
+ */
392
+ const NO_WRITES = { update: [] };
393
+ /**
394
+ * Submissions can contain personal data, so the general document capabilities
395
+ * are too broad. The submit route writes with system access; humans may only
396
+ * read or erase submissions when their organization role explicitly allows it.
397
+ */
398
+ export const defaultSubmissionAccess = {
399
+ read: ({ auth }) => ['owner', 'admin'].includes(effectiveOrganizationRole(auth) ?? ''),
400
+ create: () => false,
401
+ update: () => false,
402
+ delete: ({ auth }) => ['owner', 'admin'].includes(effectiveOrganizationRole(auth) ?? ''),
403
+ publish: () => false,
404
+ unpublish: () => false
405
+ };
406
+ export const formSubmissionSchema = {
407
+ type: 'document',
408
+ name: 'formSubmission',
409
+ title: 'Form submission',
410
+ description: 'A submitted form. Read-only — written by the public submit endpoint.',
411
+ icon: Inbox,
412
+ access: defaultSubmissionAccess,
413
+ preview: {
414
+ select: { title: 'summary', subtitle: 'submittedAt' }
415
+ },
416
+ fields: [
417
+ {
418
+ name: 'form',
419
+ type: 'reference',
420
+ title: 'Form',
421
+ to: [{ type: 'form' }],
422
+ access: NO_WRITES
423
+ },
424
+ {
425
+ // Denormalized one-line description, stamped at submit time so the list
426
+ // view is readable without loading every submission's answers.
427
+ name: 'summary',
428
+ type: 'string',
429
+ title: 'Summary',
430
+ access: NO_WRITES
431
+ },
432
+ {
433
+ name: 'submittedAt',
434
+ type: 'datetime',
435
+ title: 'Submitted at',
436
+ access: NO_WRITES
437
+ },
438
+ {
439
+ name: 'submissionData',
440
+ type: 'array',
441
+ title: 'Answers',
442
+ access: NO_WRITES,
443
+ of: [
444
+ {
445
+ type: 'object',
446
+ name: 'answer',
447
+ title: 'Answer',
448
+ fields: [
449
+ { name: 'field', type: 'string', title: 'Field' },
450
+ { name: 'value', type: 'text', title: 'Value', rows: 2 }
451
+ ],
452
+ preview: { select: { title: 'field', subtitle: 'value' } }
453
+ }
454
+ ]
455
+ },
456
+ {
457
+ name: 'notificationEmails',
458
+ type: 'array',
459
+ title: 'Notification snapshot',
460
+ access: NO_WRITES,
461
+ of: [
462
+ {
463
+ type: 'object',
464
+ name: 'submissionNotification',
465
+ fields: [
466
+ { name: 'to', type: 'string', title: 'To' },
467
+ { name: 'replyTo', type: 'string', title: 'Reply to' },
468
+ { name: 'subject', type: 'string', title: 'Subject' },
469
+ { name: 'message', type: 'text', title: 'Message' }
470
+ ]
471
+ }
472
+ ]
473
+ },
474
+ {
475
+ name: 'notificationFieldLabels',
476
+ type: 'array',
477
+ title: 'Field label snapshot',
478
+ access: NO_WRITES,
479
+ of: [
480
+ {
481
+ type: 'object',
482
+ name: 'submissionFieldLabel',
483
+ fields: [
484
+ { name: 'field', type: 'string', title: 'Field' },
485
+ { name: 'label', type: 'string', title: 'Label' }
486
+ ]
487
+ }
488
+ ]
489
+ }
490
+ ]
491
+ };
492
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/lib/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Context } from 'hono';
2
+ import type { AphexEnv } from '@aphexcms/cms-core/server';
3
+ export declare function handleSubmit(c: Context<AphexEnv>): Promise<Response>;
4
+ //# sourceMappingURL=submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../src/lib/submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAsH1D,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6I1E"}