@book.dev/sdk 3.10.0 → 3.14.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.
@@ -0,0 +1,493 @@
1
+ /** Form controls supported by the shared form runtime. */
2
+ export const FORM_FIELD_KINDS = [
3
+ 'text',
4
+ 'longtext',
5
+ 'number',
6
+ 'select',
7
+ 'multiselect',
8
+ 'checkbox',
9
+ 'date',
10
+ 'email',
11
+ 'phone',
12
+ 'url',
13
+ 'rating',
14
+ 'files',
15
+ ];
16
+ /**
17
+ * Canonical form-kind to database-property mapping. `satisfies Record<...>` is
18
+ * deliberate: adding a field kind without mapping it is a compile-time error.
19
+ */
20
+ export const FORM_FIELD_PROPERTY_TYPES = {
21
+ text: 'text',
22
+ longtext: 'text',
23
+ number: 'number',
24
+ select: 'select',
25
+ multiselect: 'multi_select',
26
+ checkbox: 'checkbox',
27
+ date: 'date',
28
+ email: 'email',
29
+ phone: 'phone',
30
+ url: 'url',
31
+ rating: 'rating',
32
+ files: 'files',
33
+ };
34
+ /** Machine-readable validation codes. User-facing text belongs in FORM-5. */
35
+ export const FORM_VALIDATION_ERROR_CODES = [
36
+ 'required',
37
+ 'type',
38
+ 'min',
39
+ 'max',
40
+ 'minLength',
41
+ 'maxLength',
42
+ 'pattern',
43
+ 'option',
44
+ 'unknown_field',
45
+ 'too_large',
46
+ 'date_format',
47
+ 'email_format',
48
+ 'url_format',
49
+ 'phone_format',
50
+ ];
51
+ /**
52
+ * UTF-8 byte ceilings for every variable-size field representation. Numeric and
53
+ * boolean kinds have fixed-size primitive representations and therefore need no
54
+ * byte cap. Array caps cover the sum of their string payloads.
55
+ */
56
+ export const FORM_FIELD_BYTE_CAPS = {
57
+ text: 1024,
58
+ longtext: 65536,
59
+ select: 512,
60
+ multiselect: 16384,
61
+ date: 64,
62
+ email: 320,
63
+ phone: 64,
64
+ url: 2048,
65
+ files: 32768,
66
+ };
67
+ /** Independent count limits prevent adversarial arrays from forcing full walks. */
68
+ export const FORM_MULTISELECT_MAX_ITEMS = 100;
69
+ export const FORM_FILES_MAX_ITEMS = 20;
70
+ /**
71
+ * JavaScript RegExp has no execution timeout. Patterns are therefore limited to
72
+ * 256 code units, evaluated only against inputs of at most 1,024 code units,
73
+ * and conservatively reject backreferences, lookarounds, and quantified groups
74
+ * containing alternation or another quantifier. This blocks common catastrophic
75
+ * backtracking shapes while keeping the engine dependency-free; it is not a
76
+ * claim that the host RegExp engine is RE2/linear-time.
77
+ */
78
+ export const FORM_PATTERN_MAX_LENGTH = 256;
79
+ export const FORM_PATTERN_INPUT_MAX_LENGTH = 1024;
80
+ const UTF8 = new TextEncoder();
81
+ const EMAIL_RE = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
82
+ const PHONE_CHARS_RE = /^\+?[0-9().\-\s]+$/;
83
+ const ISO_DATE_RE = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?(Z|[+-]\d{2}:\d{2})?)?$/;
84
+ function hasOwn(value, key) {
85
+ return Object.prototype.hasOwnProperty.call(value, key);
86
+ }
87
+ function setOwn(target, key, value) {
88
+ Object.defineProperty(target, key, { value, enumerable: true, configurable: true, writable: true });
89
+ }
90
+ function stringFits(value, cap) {
91
+ // UTF-8 is never shorter than the JS code-unit count, so reject huge strings
92
+ // before TextEncoder allocates an equally huge byte array.
93
+ return value.length <= cap && UTF8.encode(value).byteLength <= cap;
94
+ }
95
+ function stringArrayFits(values, cap) {
96
+ let bytes = 0;
97
+ for (const value of values) {
98
+ const remaining = cap - bytes;
99
+ if (!stringFits(value, remaining))
100
+ return false;
101
+ bytes += UTF8.encode(value).byteLength;
102
+ }
103
+ return true;
104
+ }
105
+ function isStringKind(kind) {
106
+ switch (kind) {
107
+ case 'text':
108
+ case 'longtext':
109
+ case 'select':
110
+ case 'date':
111
+ case 'email':
112
+ case 'phone':
113
+ case 'url':
114
+ return true;
115
+ case 'number':
116
+ case 'multiselect':
117
+ case 'checkbox':
118
+ case 'rating':
119
+ case 'files':
120
+ return false;
121
+ }
122
+ }
123
+ function isEmptyForField(field, value) {
124
+ if (value === null || value === undefined)
125
+ return true;
126
+ if (isStringKind(field.kind) && typeof value === 'string')
127
+ return value.trim().length === 0;
128
+ if ((field.kind === 'multiselect' || field.kind === 'files') && Array.isArray(value))
129
+ return value.length === 0;
130
+ // Required checkboxes model an acknowledgement/consent gate.
131
+ return field.kind === 'checkbox' && field.required && value === false;
132
+ }
133
+ function hasHoneypotValue(value) {
134
+ if (value === null || value === undefined)
135
+ return false;
136
+ if (typeof value === 'string')
137
+ return value.length > 0;
138
+ if (Array.isArray(value))
139
+ return value.length > 0;
140
+ return true;
141
+ }
142
+ function addLengthErrors(field, length, errors) {
143
+ const { minLength, maxLength } = field.validation ?? {};
144
+ if (minLength !== undefined && length < minLength)
145
+ errors.push({ fieldId: field.id, code: 'minLength' });
146
+ if (maxLength !== undefined && length > maxLength)
147
+ errors.push({ fieldId: field.id, code: 'maxLength' });
148
+ }
149
+ function addNumberErrors(field, value, errors) {
150
+ const { min, max } = field.validation ?? {};
151
+ if (min !== undefined && value < min)
152
+ errors.push({ fieldId: field.id, code: 'min' });
153
+ if (max !== undefined && value > max)
154
+ errors.push({ fieldId: field.id, code: 'max' });
155
+ }
156
+ /** Conservative structural screen for common exponential-backtracking forms. */
157
+ function isUnsafePattern(pattern) {
158
+ if (/\\(?:[1-9]|k<)/.test(pattern))
159
+ return true;
160
+ const frames = [{ hasAlternation: false, hasQuantifier: false }];
161
+ let inClass = false;
162
+ let quantifiers = 0;
163
+ for (let i = 0; i < pattern.length; i += 1) {
164
+ const char = pattern[i];
165
+ if (char === '\\') {
166
+ i += 1;
167
+ continue;
168
+ }
169
+ if (inClass) {
170
+ if (char === ']')
171
+ inClass = false;
172
+ continue;
173
+ }
174
+ if (char === '[') {
175
+ inClass = true;
176
+ continue;
177
+ }
178
+ if (char === '(') {
179
+ if (pattern[i + 1] === '?' && pattern[i + 2] !== ':')
180
+ return true;
181
+ if (pattern[i + 1] === '?' && pattern[i + 2] === ':')
182
+ i += 2;
183
+ frames.push({ hasAlternation: false, hasQuantifier: false });
184
+ continue;
185
+ }
186
+ if (char === '|') {
187
+ frames[frames.length - 1].hasAlternation = true;
188
+ continue;
189
+ }
190
+ if (char === ')') {
191
+ if (frames.length === 1)
192
+ continue;
193
+ const frame = frames.pop();
194
+ const next = pattern[i + 1];
195
+ const quantified = next === '*' || next === '+' || next === '?' || next === '{';
196
+ if (quantified && (frame.hasAlternation || frame.hasQuantifier))
197
+ return true;
198
+ const parent = frames[frames.length - 1];
199
+ parent.hasAlternation || (parent.hasAlternation = frame.hasAlternation);
200
+ parent.hasQuantifier || (parent.hasQuantifier = frame.hasQuantifier || quantified);
201
+ continue;
202
+ }
203
+ if (char === '*' || char === '+' || char === '?' || char === '{') {
204
+ frames[frames.length - 1].hasQuantifier = true;
205
+ quantifiers += 1;
206
+ // A small complexity budget also bounds high-degree polynomial patterns.
207
+ if (quantifiers > 8)
208
+ return true;
209
+ }
210
+ }
211
+ return inClass;
212
+ }
213
+ function addPatternError(field, value, errors) {
214
+ const pattern = field.validation?.pattern;
215
+ if (pattern === undefined)
216
+ return;
217
+ if (typeof pattern !== 'string'
218
+ || pattern.length > FORM_PATTERN_MAX_LENGTH
219
+ || value.length > FORM_PATTERN_INPUT_MAX_LENGTH
220
+ || isUnsafePattern(pattern)) {
221
+ errors.push({ fieldId: field.id, code: 'pattern' });
222
+ return;
223
+ }
224
+ try {
225
+ if (!new RegExp(pattern).test(value))
226
+ errors.push({ fieldId: field.id, code: 'pattern' });
227
+ }
228
+ catch {
229
+ errors.push({ fieldId: field.id, code: 'pattern' });
230
+ }
231
+ }
232
+ function isIso8601(value) {
233
+ const match = ISO_DATE_RE.exec(value);
234
+ if (!match)
235
+ return false;
236
+ const year = Number(match[1]);
237
+ const month = Number(match[2]);
238
+ const day = Number(match[3]);
239
+ if (month < 1 || month > 12)
240
+ return false;
241
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
242
+ const monthDays = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
243
+ if (day < 1 || day > monthDays[month - 1])
244
+ return false;
245
+ if (match[4] === undefined)
246
+ return true;
247
+ const hour = Number(match[4]);
248
+ const minute = Number(match[5]);
249
+ const second = match[6] === undefined ? 0 : Number(match[6]);
250
+ if (hour > 23 || minute > 59 || second > 59)
251
+ return false;
252
+ const zone = match[8];
253
+ if (zone && zone !== 'Z') {
254
+ const [zoneHour, zoneMinute] = zone.slice(1).split(':').map(Number);
255
+ if (zoneHour > 23 || zoneMinute > 59)
256
+ return false;
257
+ }
258
+ return !Number.isNaN(Date.parse(value));
259
+ }
260
+ function isHttpUrl(value) {
261
+ try {
262
+ const url = new URL(value);
263
+ return (url.protocol === 'http:' || url.protocol === 'https:') && url.hostname.length > 0;
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }
269
+ function isPhone(value) {
270
+ if (!PHONE_CHARS_RE.test(value))
271
+ return false;
272
+ const digits = value.replace(/\D/g, '').length;
273
+ return digits >= 7 && digits <= 15;
274
+ }
275
+ /**
276
+ * Validate untrusted submitted values without I/O or mutation. Values retain
277
+ * their runtime types; "coercion" is limited to trimming syntactic strings and
278
+ * file refs. Numeric strings, boxed primitives, and scalar/array confusion are
279
+ * rejected rather than converted.
280
+ */
281
+ export function validateSubmission(schema, values) {
282
+ if (!values || typeof values !== 'object' || Array.isArray(values)) {
283
+ return { ok: false, errors: [{ fieldId: '', code: 'type' }] };
284
+ }
285
+ for (const field of schema.fields) {
286
+ if (field.honeypot && hasOwn(values, field.id) && hasHoneypotValue(values[field.id])) {
287
+ return { honeypot: true };
288
+ }
289
+ }
290
+ const errors = [];
291
+ const knownIds = new Set(schema.fields.map((field) => field.id));
292
+ for (const fieldId of Object.keys(values)) {
293
+ if (!knownIds.has(fieldId))
294
+ errors.push({ fieldId, code: 'unknown_field' });
295
+ }
296
+ const coerced = {};
297
+ for (const field of schema.fields) {
298
+ if (field.honeypot)
299
+ continue;
300
+ const present = hasOwn(values, field.id);
301
+ const raw = present ? values[field.id] : undefined;
302
+ if (!present || isEmptyForField(field, raw)) {
303
+ if (field.required)
304
+ errors.push({ fieldId: field.id, code: 'required' });
305
+ continue;
306
+ }
307
+ const before = errors.length;
308
+ let value;
309
+ switch (field.kind) {
310
+ case 'text':
311
+ case 'longtext': {
312
+ if (typeof raw !== 'string') {
313
+ errors.push({ fieldId: field.id, code: 'type' });
314
+ break;
315
+ }
316
+ if (!stringFits(raw, FORM_FIELD_BYTE_CAPS[field.kind])) {
317
+ errors.push({ fieldId: field.id, code: 'too_large' });
318
+ break;
319
+ }
320
+ addLengthErrors(field, raw.length, errors);
321
+ addPatternError(field, raw, errors);
322
+ value = raw;
323
+ break;
324
+ }
325
+ case 'number': {
326
+ if (typeof raw !== 'number' || !Number.isFinite(raw)) {
327
+ errors.push({ fieldId: field.id, code: 'type' });
328
+ break;
329
+ }
330
+ addNumberErrors(field, raw, errors);
331
+ value = raw;
332
+ break;
333
+ }
334
+ case 'rating': {
335
+ if (typeof raw !== 'number' || !Number.isFinite(raw) || !Number.isInteger(raw)) {
336
+ errors.push({ fieldId: field.id, code: 'type' });
337
+ break;
338
+ }
339
+ if (raw < 1)
340
+ errors.push({ fieldId: field.id, code: 'min' });
341
+ if (raw > 5)
342
+ errors.push({ fieldId: field.id, code: 'max' });
343
+ addNumberErrors(field, raw, errors);
344
+ value = raw;
345
+ break;
346
+ }
347
+ case 'checkbox':
348
+ if (typeof raw !== 'boolean')
349
+ errors.push({ fieldId: field.id, code: 'type' });
350
+ else
351
+ value = raw;
352
+ break;
353
+ case 'select': {
354
+ if (typeof raw !== 'string') {
355
+ errors.push({ fieldId: field.id, code: 'type' });
356
+ break;
357
+ }
358
+ if (!stringFits(raw, FORM_FIELD_BYTE_CAPS.select)) {
359
+ errors.push({ fieldId: field.id, code: 'too_large' });
360
+ break;
361
+ }
362
+ addLengthErrors(field, raw.length, errors);
363
+ if (field.options && !field.options.some((option) => option.id === raw)) {
364
+ errors.push({ fieldId: field.id, code: 'option' });
365
+ }
366
+ addPatternError(field, raw, errors);
367
+ value = raw;
368
+ break;
369
+ }
370
+ case 'multiselect':
371
+ case 'files': {
372
+ if (!Array.isArray(raw)) {
373
+ errors.push({ fieldId: field.id, code: 'type' });
374
+ break;
375
+ }
376
+ const itemCap = field.kind === 'multiselect' ? FORM_MULTISELECT_MAX_ITEMS : FORM_FILES_MAX_ITEMS;
377
+ if (raw.length > itemCap) {
378
+ errors.push({ fieldId: field.id, code: 'too_large' });
379
+ break;
380
+ }
381
+ if (!raw.every((item) => typeof item === 'string' && item.trim().length > 0)) {
382
+ errors.push({ fieldId: field.id, code: 'type' });
383
+ break;
384
+ }
385
+ const strings = raw;
386
+ if (!stringArrayFits(strings, FORM_FIELD_BYTE_CAPS[field.kind])) {
387
+ errors.push({ fieldId: field.id, code: 'too_large' });
388
+ break;
389
+ }
390
+ addLengthErrors(field, strings.length, errors);
391
+ if (field.kind === 'multiselect' && field.options) {
392
+ const optionIds = new Set(field.options.map((option) => option.id));
393
+ if (strings.some((item) => !optionIds.has(item)))
394
+ errors.push({ fieldId: field.id, code: 'option' });
395
+ }
396
+ value = field.kind === 'files' ? strings.map((item) => item.trim()) : [...strings];
397
+ break;
398
+ }
399
+ case 'date':
400
+ case 'email':
401
+ case 'phone':
402
+ case 'url': {
403
+ if (typeof raw !== 'string') {
404
+ errors.push({ fieldId: field.id, code: 'type' });
405
+ break;
406
+ }
407
+ if (!stringFits(raw, FORM_FIELD_BYTE_CAPS[field.kind])) {
408
+ errors.push({ fieldId: field.id, code: 'too_large' });
409
+ break;
410
+ }
411
+ const normalized = raw.trim();
412
+ addLengthErrors(field, normalized.length, errors);
413
+ if (field.kind === 'date' && !isIso8601(normalized))
414
+ errors.push({ fieldId: field.id, code: 'date_format' });
415
+ if (field.kind === 'email' && !EMAIL_RE.test(normalized))
416
+ errors.push({ fieldId: field.id, code: 'email_format' });
417
+ if (field.kind === 'phone' && !isPhone(normalized))
418
+ errors.push({ fieldId: field.id, code: 'phone_format' });
419
+ if (field.kind === 'url' && !isHttpUrl(normalized))
420
+ errors.push({ fieldId: field.id, code: 'url_format' });
421
+ addPatternError(field, normalized, errors);
422
+ value = normalized;
423
+ break;
424
+ }
425
+ }
426
+ if (errors.length === before && value !== undefined)
427
+ setOwn(coerced, field.id, value);
428
+ }
429
+ return errors.length > 0 ? { ok: false, errors } : { ok: true, coerced };
430
+ }
431
+ export const FORM_PROJECTION_WARNING_CODES = [
432
+ 'unbound_field',
433
+ 'column_not_found',
434
+ 'column_type_mismatch',
435
+ ];
436
+ /** Project a validated submission onto compatible, bound database properties. */
437
+ export function submissionToRowInput(schema, coerced, dbSchema) {
438
+ const properties = {};
439
+ const warnings = [];
440
+ const dbProperties = new Map(dbSchema.properties.map((property) => [property.id, property]));
441
+ for (const field of schema.fields) {
442
+ if (field.honeypot || !hasOwn(coerced, field.id))
443
+ continue;
444
+ if (!field.columnId) {
445
+ warnings.push({ fieldId: field.id, code: 'unbound_field' });
446
+ continue;
447
+ }
448
+ const property = dbProperties.get(field.columnId);
449
+ if (!property) {
450
+ warnings.push({ fieldId: field.id, code: 'column_not_found' });
451
+ continue;
452
+ }
453
+ if (property.id.startsWith('sys_'))
454
+ continue;
455
+ if (property.type !== FORM_FIELD_PROPERTY_TYPES[field.kind]) {
456
+ warnings.push({ fieldId: field.id, code: 'column_type_mismatch' });
457
+ continue;
458
+ }
459
+ const value = coerced[field.id];
460
+ setOwn(properties, property.id, Array.isArray(value) ? [...value] : value);
461
+ }
462
+ return { rowInput: { properties }, warnings };
463
+ }
464
+ /** Compute, but do not apply, deterministic database properties for unbound fields. */
465
+ export function planColumnCreation(schema, dbSchema) {
466
+ const usedIds = new Set(dbSchema.properties.map((property) => property.id));
467
+ const plan = [];
468
+ for (const field of schema.fields) {
469
+ // Honeypots are anti-automation controls, never stored user data.
470
+ if (field.honeypot || field.columnId)
471
+ continue;
472
+ const baseId = `form_${field.id || 'field'}`;
473
+ let id = baseId;
474
+ let suffix = 2;
475
+ while (usedIds.has(id)) {
476
+ id = `${baseId}_${suffix}`;
477
+ suffix += 1;
478
+ }
479
+ usedIds.add(id);
480
+ const proposedProperty = {
481
+ id,
482
+ name: field.label,
483
+ type: FORM_FIELD_PROPERTY_TYPES[field.kind],
484
+ ...(field.options && (field.kind === 'select' || field.kind === 'multiselect')
485
+ ? { options: field.options.map((option) => ({ ...option })) }
486
+ : {}),
487
+ ...(field.kind === 'rating' ? { numberTarget: 5 } : {}),
488
+ };
489
+ plan.push({ field, proposedProperty });
490
+ }
491
+ return plan;
492
+ }
493
+ //# sourceMappingURL=formSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formSchema.js","sourceRoot":"","sources":["../src/formSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import type { FormValidationError } from './formSchema';
2
+ /** Stable pointer used by a standalone form block to project a database view. */
3
+ export interface DatabaseFormReference {
4
+ databaseId: string;
5
+ viewId: string;
6
+ }
7
+ /** Public form-upload limits, shared by the browser runtime and server. */
8
+ export declare const FORM_UPLOAD_MAX_FILE_BYTES: number;
9
+ export declare const FORM_UPLOAD_MAX_FILES = 5;
10
+ export declare const FORM_UPLOAD_MAX_FORM_STAGED_BYTES: number;
11
+ export declare const FORM_UPLOAD_MAX_FORM_BYTES: number;
12
+ export declare const FORM_UPLOAD_ORPHAN_TTL_MS: number;
13
+ /** File bytes and metadata accepted by the SDK's staged-upload helper. */
14
+ export interface FormUploadInput {
15
+ key: string;
16
+ fieldId: string;
17
+ name: string;
18
+ mime: string;
19
+ bytes: Uint8Array;
20
+ }
21
+ /** JSON/base64 wire envelope accepted by the staged-upload endpoint. */
22
+ export interface FormUploadRequest extends Omit<FormUploadInput, 'bytes'> {
23
+ data: string;
24
+ }
25
+ /** Opaque token returned by a staged upload and submitted as a files-field value. */
26
+ export interface FormUploadResult {
27
+ token: string;
28
+ name: string;
29
+ size: number;
30
+ }
31
+ /** Typed non-success response from the public staged-upload endpoint. */
32
+ export declare class FormUploadError extends Error {
33
+ readonly status: number;
34
+ constructor(status: number);
35
+ }
36
+ /** Payload accepted by the anonymous form-submission endpoint. */
37
+ export interface FormSubmissionRequest {
38
+ /** Per-form capability carried by the form block's persisted props. */
39
+ key: string;
40
+ /** Property-id keyed values to persist on the new database row. */
41
+ values: Record<string, unknown>;
42
+ /** Client-generated replay key; retries return the original result. */
43
+ idempotencyKey: string;
44
+ }
45
+ /** Payload for a database-backed form view submission (F-1/F-4 contract). */
46
+ export interface DatabaseFormSubmissionRequest {
47
+ /** Per-view public fill capability; never accepted as general database auth. */
48
+ capability: string;
49
+ /** Database-property-id keyed values validated by `validateRowAgainstForm`. */
50
+ fields: Record<string, unknown>;
51
+ /** Client-generated replay key; retries return the original result. */
52
+ idempotencyKey: string;
53
+ }
54
+ /** Body for the capability-gated database form descriptor fetch. */
55
+ export interface DatabaseFormDescriptorRequest {
56
+ capability: string;
57
+ }
58
+ /** Read-only publication state suitable for a builder or reference-only embed. */
59
+ export interface DatabaseFormPublication {
60
+ published: boolean;
61
+ responseCount: number;
62
+ maxResponses: number;
63
+ }
64
+ /** One-time result of first-publish or rotation. The capability lives only in this URL's fragment. */
65
+ export interface DatabaseFormPublishResult {
66
+ url: string;
67
+ }
68
+ /** File bytes and capability accepted by a database form view's staging route. */
69
+ export interface DatabaseFormUploadInput {
70
+ capability: string;
71
+ fieldId: string;
72
+ name: string;
73
+ mime: string;
74
+ bytes: Uint8Array;
75
+ }
76
+ /** Typed public database-form failure, including stable server validation codes. */
77
+ export declare class DatabaseFormRequestError extends Error {
78
+ readonly status: number;
79
+ readonly code?: string | undefined;
80
+ readonly errors: Array<{
81
+ propertyId: string;
82
+ code: string;
83
+ }>;
84
+ constructor(status: number, code?: string | undefined, errors?: Array<{
85
+ propertyId: string;
86
+ code: string;
87
+ }>);
88
+ }
89
+ /** Stable success response returned for both a first submission and its replay. */
90
+ export interface FormSubmissionResult {
91
+ rowId: string;
92
+ submittedAt: string;
93
+ /** Revealed only after a successful submission; never included in the public descriptor. */
94
+ confirmation?: {
95
+ type: 'message';
96
+ message: string;
97
+ } | {
98
+ type: 'redirect';
99
+ redirectUrl: string;
100
+ };
101
+ }
102
+ /** Typed non-success response from the public form-submission endpoint. */
103
+ export declare class FormSubmissionError extends Error {
104
+ readonly status: number;
105
+ readonly errors: FormValidationError[];
106
+ constructor(status: number, errors?: FormValidationError[]);
107
+ }
108
+ /**
109
+ * Mint a 256-bit, unpadded base64url form-submission capability.
110
+ *
111
+ * `crypto.getRandomValues` keeps this helper isomorphic across browsers and
112
+ * current Node runtimes. The 32-byte key deliberately exceeds the contract's
113
+ * 128-bit minimum.
114
+ */
115
+ export declare function generateSubmissionKey(): string;
116
+ /** Accept only browser-safe HTTP(S) confirmation destinations, including relative URLs. */
117
+ export declare function safeFormRedirectUrl(raw: string | undefined): string | null;