@marktiderman/genesis-forms 0.3.1 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/structured.ts","../src/fields.ts","../src/events.ts","../src/hidden.ts","../src/logic.ts","../src/recall.ts","../src/validate.ts","../src/engine.ts","../src/parse.ts","../src/server.ts"],"names":["i","out","isObject","maxLength","answers"],"mappings":"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","file":"server.js","sourcesContent":["import type { FieldTypeManifest } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\ntype JsonObject = { [key: string]: Json };\nconst isObject = (v: unknown): v is JsonObject => !!v && typeof v === \"object\" && !Array.isArray(v);\nfunction intProp(field: FieldBlock, name: string, fallback: number, floor = 1): number {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : fallback;\n}\nfunction optionalIntProp(field: FieldBlock, name: string, floor = 0): number | undefined {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : undefined;\n}\nconst blank = (v: unknown) => typeof v !== \"string\" || v.trim() === \"\";\n/**\n * Unanswered: nothing, or a list whose every entry is a blank one. Anything\n * else (a string, a list with a malformed entry) is an answer, so validation\n * rejects it instead of dropping it silently.\n */\nconst blankText = (v: unknown) => typeof v === \"string\" && v.trim() === \"\";\nconst emptyList = (value: Json | undefined, isBlank: (entry: Json) => boolean) =>\n value === undefined || value === null || (Array.isArray(value) && value.every(isBlank));\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nexport function listLimits(field: FieldBlock) {\n return { min: optionalIntProp(field, \"min\") ?? 0, max: intProp(field, \"max\", 10), itemMaxLength: intProp(field, \"itemMaxLength\", 500) };\n}\nconst listItems = (value: Json | undefined): string[] =>\n Array.isArray(value) ? value.filter((v): v is string => typeof v === \"string\" && v.trim() !== \"\") : [];\n\nexport interface TableColumn { key: string; label: string; long?: boolean }\nexport const MAX_TABLE_COLUMNS = 6;\nexport const MAX_TABLE_CELL_LENGTH = 2000;\nexport function tableColumns(field: FieldBlock): TableColumn[] {\n const raw = field.props?.columns;\n if (!Array.isArray(raw)) return [];\n const seen = new Set<string>();\n const out: TableColumn[] = [];\n for (const c of raw) {\n if (!isObject(c) || typeof c.key !== \"string\" || !c.key || seen.has(c.key)) continue;\n seen.add(c.key);\n const column: TableColumn = { key: c.key, label: typeof c.label === \"string\" ? c.label : c.key };\n if (c.long === true) column.long = true;\n out.push(column);\n }\n return out;\n}\nexport function tableLimits(field: FieldBlock) {\n return { minRows: optionalIntProp(field, \"minRows\") ?? 0, maxRows: intProp(field, \"maxRows\", 3) };\n}\nconst filledRows = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((r): r is JsonObject => isObject(r) && Object.values(r).some((c) => !blank(c))) : [];\n\nexport interface MediaNote { at: number; text: string }\nexport const MAX_TIMESTAMP_SECONDS = 86400;\nexport function formatTimestamp(seconds: number): string {\n const total = Number.isFinite(seconds) && seconds > 0 ? Math.floor(seconds) : 0;\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = String(total % 60).padStart(2, \"0\");\n return h ? `${h}:${String(m).padStart(2, \"0\")}:${s}` : `${m}:${s}`;\n}\nexport function parseTimestamp(text: string): number | null {\n const t = text.trim();\n if (!t) return null;\n const parts = t.split(\":\");\n if (parts.length > 3) return null;\n if (parts.length === 1) {\n if (!/^\\d+(\\.\\d+)?$/.test(t)) return null;\n const n = Number(t);\n return n <= MAX_TIMESTAMP_SECONDS ? n : null;\n }\n const last = parts.length - 1;\n let total = 0;\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i]!;\n const ok = i === 0 ? /^\\d+$/.test(p) : i === last ? /^\\d{2}(\\.\\d+)?$/.test(p) : /^\\d{2}$/.test(p);\n if (!ok) return null;\n const n = Number(p);\n if (i > 0 && n >= 60) return null;\n total = total * 60 + n;\n }\n return total <= MAX_TIMESTAMP_SECONDS ? total : null;\n}\nconst isTimestamp = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v) && v >= 0 && v <= MAX_TIMESTAMP_SECONDS;\nconst notesWithText = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((n): n is JsonObject => isObject(n) && !blank(n.text)) : [];\n\nexport interface Highlight { start: number; end: number; quote: string; note: string }\nexport const MAX_HIGHLIGHT_NOTE_LENGTH = 1000;\n/** The longest passage one highlight may quote; also bounds a quote the server can't check against `props.text`. */\nexport const MAX_HIGHLIGHT_QUOTE_LENGTH = 2000;\nexport const HIGHLIGHT_NOTE_MESSAGE = \"Add a note to each highlight.\";\nconst sourceText = (field: FieldBlock) => (typeof field.props?.text === \"string\" && field.props.text ? field.props.text : undefined);\n\n/**\n * The structured field types, whose answers are lists or records rather than one\n * value:\n * - `list`: several short answers, e.g. goals, action items, three things that went well.\n * - `table`: a small table each answer fills row by row, e.g. an action plan\n * (What / Who / By when), pros and cons.\n * - `media-notes`: notes pinned to times in a video or audio, e.g. lecture notes,\n * a recorded call review.\n * - `text-highlights`: highlight passages of a text and note on each, e.g.\n * annotating an article, a policy or a contract.\n *\n * They are registered like any other, but the builder offers them only to a\n * host that names them in its palette (`FormBuilder palette`), so forms that\n * never had them don't change.\n */\nexport const STRUCTURED_FIELD_TYPES = [\"list\", \"table\", \"media-notes\", \"text-highlights\"] as const;\n\nexport const structuredFieldTypes: FieldTypeManifest[] = [\n {\n type: \"list\", label: \"List\", category: \"text\", value: { json: true },\n // logic.ts `contains` on an array is exact item equality, same as multi-choice, so it is offered.\n operators: [\"contains\", \"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, blankText),\n validate: (value, field) => {\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) return \"Enter a list of answers.\";\n const { min, max, itemMaxLength } = listLimits(field);\n if (value.some((v) => (v as string).trim().length > itemMaxLength)) return `Keep each item under ${itemMaxLength} characters.`;\n const count = listItems(value).length;\n if (count < min) return `Add at least ${plural(min, \"item\")}.`;\n if (count > max) return `Add at most ${plural(max, \"item\")}.`;\n return null;\n },\n normalize: (value) => (Array.isArray(value) ? listItems(value).map((v) => v.trim()) : value),\n summarize: (value) => listItems(value).map((v) => v.trim()).join(\"; \"),\n samples: (field) => {\n const { min, max } = listLimits(field);\n return [Array.from({ length: Math.min(Math.max(1, min), max) }, (_, i) => `Item ${i + 1}`)];\n },\n },\n {\n type: \"table\", label: \"Table\", category: \"advanced\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (r) => isObject(r) && Object.values(r).every(blankText)),\n validate: (value, field) => {\n const columns = tableColumns(field);\n if (!columns.length) return \"This question has no columns.\";\n if (!Array.isArray(value) || !value.every(isObject)) return \"Fill in the rows.\";\n const keys = new Set(columns.map((c) => c.key));\n for (const row of value as JsonObject[]) {\n for (const [key, cell] of Object.entries(row)) {\n if (!keys.has(key)) return \"An answer names a column this question doesn't have.\";\n if (typeof cell !== \"string\") return \"Fill in the rows with text.\";\n if (cell.trim().length > MAX_TABLE_CELL_LENGTH) return `Keep each answer under ${MAX_TABLE_CELL_LENGTH} characters.`;\n }\n }\n const { minRows, maxRows } = tableLimits(field);\n const count = filledRows(value).length;\n if (count < minRows) return `Fill in at least ${plural(minRows, \"row\")}.`;\n if (count > maxRows) return `Fill in at most ${plural(maxRows, \"row\")}.`;\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? filledRows(value).map((row) => {\n const out: JsonObject = {};\n for (const [key, cell] of Object.entries(row)) if (typeof cell === \"string\") out[key] = cell.trim();\n return out;\n })\n : value,\n summarize: (value, field) => {\n const columns = tableColumns(field);\n return filledRows(value)\n .map((row) => columns.filter((c) => !blank(row[c.key])).map((c) => `${c.label}: ${(row[c.key] as string).trim()}`).join(\" · \"))\n .join(\" / \");\n },\n samples: (field) => {\n const columns = tableColumns(field);\n if (!columns.length) return [];\n const { minRows, maxRows } = tableLimits(field);\n const row = Object.fromEntries(columns.map((c) => [c.key, \"sample\"]));\n return [Array.from({ length: Math.min(Math.max(1, minRows), maxRows) }, () => ({ ...row }))];\n },\n },\n {\n type: \"media-notes\", label: \"Notes at moments\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (n) => isObject(n) && blankText(n.text)),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Add notes.\";\n const textMaxLength = intProp(field, \"textMaxLength\", 1000);\n for (const note of value) {\n if (!isObject(note) || typeof note.text !== \"string\") return \"Add notes.\";\n if (!isTimestamp(note.at)) return \"Each note needs a time.\";\n if (note.text.trim().length > textMaxLength) return `Keep each note under ${textMaxLength} characters.`;\n }\n const maxNotes = intProp(field, \"maxNotes\", 20);\n return notesWithText(value).length > maxNotes ? `Add at most ${plural(maxNotes, \"note\")}.` : null;\n },\n normalize: (value) => Array.isArray(value)\n ? notesWithText(value).map((n) => ({ at: n.at as number, text: (n.text as string).trim() })).sort((a, b) => a.at - b.at)\n : value,\n summarize: (value) => notesWithText(value)\n .map((n) => ({ at: typeof n.at === \"number\" ? n.at : 0, text: (n.text as string).trim() }))\n .sort((a, b) => a.at - b.at)\n .map((n) => `${formatTimestamp(n.at)} ${n.text}`)\n .join(\"; \"),\n samples: () => [[{ at: 0, text: \"sample\" }]],\n },\n {\n type: \"text-highlights\", label: \"Highlights\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, () => false),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Highlight a passage.\";\n const maxHighlights = intProp(field, \"maxHighlights\", 20);\n if (value.length > maxHighlights) return `Add at most ${plural(maxHighlights, \"highlight\")}.`;\n const text = sourceText(field);\n for (const h of value) {\n if (!isObject(h) || !Number.isInteger(h.start) || !Number.isInteger(h.end) || typeof h.quote !== \"string\" || typeof h.note !== \"string\") {\n return \"Highlight a passage of the text.\";\n }\n const start = h.start as number;\n const end = h.end as number;\n if (start < 0 || end <= start || h.quote.length !== end - start) return \"Highlight a passage of the text.\";\n if (end - start > MAX_HIGHLIGHT_QUOTE_LENGTH) return `Highlight under ${MAX_HIGHLIGHT_QUOTE_LENGTH} characters at a time.`;\n if (text !== undefined && (end > text.length || text.slice(start, end) !== h.quote)) return \"A highlight doesn't match the text.\";\n if (h.note.trim() === \"\") return HIGHLIGHT_NOTE_MESSAGE;\n if (h.note.trim().length > MAX_HIGHLIGHT_NOTE_LENGTH) return `Keep each note under ${MAX_HIGHLIGHT_NOTE_LENGTH} characters.`;\n }\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? value.filter(isObject)\n .map((h) => ({ start: h.start as number, end: h.end as number, quote: h.quote as string, note: String(h.note).trim() }))\n .sort((a, b) => a.start - b.start || a.end - b.end)\n : value,\n summarize: (value) => Array.isArray(value)\n ? value.filter(isObject).map((h) => `\"${String(h.quote)}\" — ${String(h.note).trim()}`).join(\"; \")\n : \"\",\n samples: (field) => {\n const text = sourceText(field);\n if (text === undefined) return [[{ start: 0, end: 6, quote: \"sample\", note: \"sample\" }]];\n const end = Math.min(text.length, 20);\n return [[{ start: 0, end, quote: text.slice(0, end), note: \"sample\" }]];\n },\n },\n];\n","import type { Block, FieldBlock, Json, Operator } from \"./types\";\nimport { structuredFieldTypes } from \"./structured\";\n\n/**\n * A field type, without any UI. Renderers are registered separately per\n * platform (`genesis-forms-react`), so a manifest runs anywhere.\n */\nexport interface FieldTypeManifest {\n type: string;\n label: string;\n category: \"text\" | \"choice\" | \"scale\" | \"date\" | \"media\" | \"advanced\";\n /** `json: false` types must convert, so drafts and server replay never lose an answer. */\n value:\n | { json: true }\n | { json: false; serialize: (value: unknown) => Json; deserialize: (json: Json) => unknown };\n operators: Operator[];\n a11y: {\n semantics: \"control\" | \"group\";\n /** The HTML `autocomplete` token, such as `\"email\"` or `\"tel\"`. */\n autocomplete?: string;\n /** The HTML `inputmode` hint for on-screen keyboards, such as `\"email\"` or `\"tel\"`. */\n inputMode?: \"text\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\" | \"url\" | \"search\";\n };\n isEmpty?: (value: Json | undefined) => boolean;\n /** Return an error message, or null when the (non-empty) value is valid. */\n validate?: (value: Json, field: FieldBlock) => string | null;\n /** Plain text for recall, exports and emails. */\n summarize?: (value: Json, field: FieldBlock) => string;\n /**\n * The form a (valid, non-empty) value is stored in, such as an email\n * without surrounding spaces. Applied by `engine.answers()` and the server.\n */\n normalize?: (value: Json, field: FieldBlock) => Json;\n /** Valid example answers, used by `coverage()` and other test tools to explore a path. */\n samples?: (field: FieldBlock) => Json[];\n}\n\n// One registry per process, shared by every entry point (index, server,\n// testing are bundled separately), so a plugin registered once is seen by all.\nconst REGISTRY = Symbol.for(\"@marktiderman/genesis-forms/field-types\");\nconst globalScope = globalThis as typeof globalThis & { [REGISTRY]?: Map<string, FieldTypeManifest> };\nconst registry: Map<string, FieldTypeManifest> = (globalScope[REGISTRY] ??= new Map());\n\nexport function registerFieldType(manifest: FieldTypeManifest): void {\n if (!manifest.type) throw new Error(\"registerFieldType: a field type needs a `type`.\");\n const value = manifest.value as { json: boolean; serialize?: unknown; deserialize?: unknown };\n if (\n !value.json &&\n (typeof value.serialize !== \"function\" || typeof value.deserialize !== \"function\")\n ) {\n throw new Error(\n `registerFieldType: \"${manifest.type}\" stores a non-JSON value, so it must provide both serialize and deserialize.`,\n );\n }\n registry.set(manifest.type, manifest);\n}\n\nexport function getFieldType(type: string): FieldTypeManifest | undefined {\n return registry.get(type);\n}\n\nexport function listFieldTypes(): FieldTypeManifest[] {\n return [...registry.values()];\n}\n\nexport function isEmptyValue(value: Json | undefined, field?: FieldBlock): boolean {\n const manifest = field ? registry.get(field.type) : undefined;\n if (manifest?.isEmpty) return manifest.isEmpty(value);\n if (value === undefined || value === null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/** A value in its stored form (see `FieldTypeManifest.normalize`). */\nexport function normalizeValue(value: Json, field: FieldBlock): Json {\n const manifest = registry.get(field.type);\n return manifest?.normalize ? manifest.normalize(value, field) : value;\n}\n\n/** Whether a block holds personal or secret data: `sensitive: true`, or the `props.sensitive: true` alias. */\nexport function isSensitive(block: Block): boolean {\n return block.kind === \"field\" && (block.sensitive === true || block.props?.sensitive === true);\n}\n\nexport function summarizeValue(value: Json | undefined, field: FieldBlock): string {\n if (isEmptyValue(value, field)) return \"\";\n const manifest = registry.get(field.type);\n if (manifest?.summarize) return manifest.summarize(value as Json, field);\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n\n// ── Built-in types (R1) ──────────────────────────────────────────────────────\n\nexport interface ChoiceOption {\n value: string;\n label?: string;\n}\n\nexport function choiceOptions(field: FieldBlock): ChoiceOption[] {\n const raw = field.props?.options;\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((o) =>\n o && typeof o === \"object\" && !Array.isArray(o) && typeof o.value === \"string\"\n ? [{ value: o.value, label: typeof o.label === \"string\" ? o.label : undefined }]\n : [],\n );\n}\n\nfunction optionLabel(field: FieldBlock, value: string): string {\n const option = choiceOptions(field).find((o) => o.value === value);\n return option?.label ?? value;\n}\n\nfunction intRange(field: FieldBlock, min: number, maxDefault: number) {\n const max = typeof field.props?.max === \"number\" ? field.props.max : maxDefault;\n return { min, max };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\nconst textOps: Operator[] = [\"eq\", \"neq\", \"contains\", \"answered\", \"empty\"];\n\nfunction maxLength(field: FieldBlock, fallback: number): number {\n return typeof field.props?.maxLength === \"number\" ? field.props.maxLength : fallback;\n}\n\nfunction textValidate(fallback: number) {\n return (value: Json, field: FieldBlock) => {\n if (typeof value !== \"string\") return \"Enter text.\";\n const limit = maxLength(field, fallback);\n return value.length > limit ? `Keep it under ${limit} characters.` : null;\n };\n}\n\n/** The longest address SMTP allows (RFC 5321). */\nconst MAX_EMAIL_LENGTH = 254;\n\n/**\n * `local@domain.tld`: no spaces, exactly one `@`, and a dot inside the domain.\n * A linear scan rather than a regex, so a hostile value cannot backtrack.\n */\nexport function isEmailAddress(value: string): boolean {\n if (value.length > MAX_EMAIL_LENGTH || /\\s/.test(value)) return false;\n const at = value.indexOf(\"@\");\n if (at < 1 || value.indexOf(\"@\", at + 1) !== -1) return false;\n const domain = value.slice(at + 1);\n // A dot with at least one character on each side.\n return domain.slice(1, -1).includes(\".\");\n}\n\n/** Longest phone number accepted, separators included. */\nconst MAX_PHONE_LENGTH = 32;\n\n/**\n * Digits with optional separators (spaces, `-`, `(`, `)`, `.`) and an\n * optional leading `+`; 7 to 15 digits (E.164 allows at most 15). One linear scan.\n */\nfunction isPhoneNumber(value: string): boolean {\n if (value.length > MAX_PHONE_LENGTH) return false;\n let digits = 0;\n for (let i = 0; i < value.length; i++) {\n const c = value[i]!;\n if (c >= \"0\" && c <= \"9\") digits++;\n else if (c === \"+\") {\n if (i !== 0) return false;\n } else if (c !== \" \" && c !== \"-\" && c !== \"(\" && c !== \")\" && c !== \".\") return false;\n }\n return digits >= 7 && digits <= 15;\n}\n\nconst builtins: FieldTypeManifest[] = [\n {\n type: \"short-text\",\n label: \"Short text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(500),\n },\n {\n type: \"long-text\",\n label: \"Long text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(5000),\n },\n {\n type: \"email\",\n label: \"Email\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\", autocomplete: \"email\", inputMode: \"email\" },\n validate: (value) =>\n typeof value === \"string\" && isEmailAddress(value.trim())\n ? null\n : \"Enter an email address like name@example.com.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n },\n {\n type: \"phone\",\n label: \"Phone\",\n category: \"text\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\", autocomplete: \"tel\", inputMode: \"tel\" },\n validate: (value) =>\n typeof value === \"string\" && isPhoneNumber(value.trim())\n ? null\n : \"Enter a phone number with 7 to 15 digits.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n summarize: (value) => String(value),\n },\n {\n type: \"rating\",\n label: \"Rating\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const { min, max } = intRange(field, 1, 5);\n return Number.isInteger(value) && (value as number) >= min && (value as number) <= max\n ? null\n : `Choose a rating from ${min} to ${max}.`;\n },\n summarize: (value, field) => `${value}/${intRange(field, 1, 5).max}`,\n },\n {\n type: \"nps\",\n label: \"Net Promoter Score\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value) =>\n Number.isInteger(value) && (value as number) >= 0 && (value as number) <= 10\n ? null\n : \"Choose a score from 0 to 10.\",\n summarize: (value) => `${value}/10`,\n },\n {\n type: \"single-choice\",\n label: \"Single choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) =>\n typeof value === \"string\" && choiceOptions(field).some((o) => o.value === value)\n ? null\n : \"Choose one of the options.\",\n summarize: (value, field) => optionLabel(field, String(value)),\n },\n {\n type: \"multi-choice\",\n label: \"Multiple choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"contains\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const allowed = new Set(choiceOptions(field).map((o) => o.value));\n // Each option at most once, so a value is never longer than the option list.\n return Array.isArray(value) &&\n value.length <= allowed.size &&\n new Set(value).size === value.length &&\n value.every((v) => typeof v === \"string\" && allowed.has(v))\n ? null\n : \"Choose from the options.\";\n },\n summarize: (value, field) =>\n Array.isArray(value) ? value.map((v) => optionLabel(field, String(v))).join(\", \") : String(value),\n },\n {\n type: \"yes-no\",\n label: \"Yes / no\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value) => (typeof value === \"boolean\" ? null : \"Choose yes or no.\"),\n summarize: (value) => (value ? \"Yes\" : \"No\"),\n },\n];\n\nfor (const manifest of [...builtins, ...structuredFieldTypes]) registerFieldType(manifest);\n","/** Guards and helpers for event logs and other untrusted JSON. No dependencies. */\nimport type { FormEvent, Json } from \"./types\";\n\n/** A plain object: `{}` or `Object.create(null)`, not an array, a class instance or null. */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Whether a value is JSON: strings, finite numbers, booleans, null, arrays and\n * plain objects, nested to any depth. Iterative, so a deeply nested value\n * cannot overflow the stack.\n */\nexport function isJson(value: unknown): value is Json {\n const stack: unknown[] = [value];\n while (stack.length) {\n const v = stack.pop();\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") continue;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return false;\n continue;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) stack.push(v[i]);\n continue;\n }\n if (!isPlainObject(v)) return false;\n for (const key of Object.keys(v)) stack.push(v[key]);\n }\n return true;\n}\n\nconst EVENT_TYPES = new Set([\"answer\", \"next\", \"back\", \"submit\"]);\n\n/** Whether `value` is a well-formed `FormEvent` of a known type. */\nexport function isFormEvent(value: unknown): value is FormEvent {\n if (!isPlainObject(value) || typeof value.type !== \"string\" || !EVENT_TYPES.has(value.type)) return false;\n if (value.at !== undefined && !(typeof value.at === \"number\" && Number.isFinite(value.at))) return false;\n if (value.type !== \"answer\") return true;\n return (\n typeof value.field === \"string\" &&\n (value.value === undefined || isJson(value.value)) &&\n (value.source === undefined || value.source === \"prefill\")\n );\n}\n\n/**\n * An event of a type this version does not know, such as one a newer client\n * logs. Replays ignore these, so they are dropped rather than rejected.\n */\nexport function isUnknownEvent(value: unknown): boolean {\n return isPlainObject(value) && typeof value.type === \"string\" && !EVENT_TYPES.has(value.type);\n}\n\n/**\n * Merge consecutive answer events to the same field, keeping the last value.\n * Text inputs log one event per keystroke; the merged log replays to the same\n * state, because the path is derived from values alone.\n */\nexport function compactEvents(events: FormEvent[]): FormEvent[] {\n const out: FormEvent[] = [];\n for (const event of events) {\n const last = out[out.length - 1];\n if (event.type === \"answer\" && last?.type === \"answer\" && last.field === event.field) {\n out[out.length - 1] = event;\n } else out.push(event);\n }\n return out;\n}\n","/** Typing hidden inputs. Shared by the engine and the server, so both type them identically. */\nimport { isPlainObject } from \"./events\";\nimport type { FormDefinition, HiddenInput, Json } from \"./types\";\n\n/** Longest string a hidden input accepts. Longer values are dropped. */\nexport const MAX_HIDDEN_STRING_LENGTH = 1000;\n\n/** A plain decimal: an optional `-`, digits, and an optional fraction. */\nconst DECIMAL = /^-?\\d+(\\.\\d+)?$/;\n\nexport interface CoerceHiddenOptions {\n /** Coerce only inputs with these sources; the rest are reported in `ignored`. Default: all. */\n sources?: readonly HiddenInput[\"source\"][];\n}\n\nexport interface CoercedHidden {\n /** Declared inputs, typed. */\n values: Record<string, Json>;\n /** Names dropped: undeclared, from another source, or not convertible to the declared type. */\n ignored: string[];\n}\n\n/**\n * Convert one raw value to a hidden input's declared type, or `undefined` when\n * it cannot be. Only string, number and boolean primitives are accepted.\n * - `string`: a string (at most 1000 characters), or a number or boolean as text.\n * - `number`: a finite number, or a plain decimal string such as `\"12\"`, `\"-3\"`\n * or `\"2.5\"`. No spaces, hex, exponents or `\"\"`.\n * - `boolean`: `true`/`false`, or the strings `\"true\"`/`\"false\"`.\n */\nexport function coerceHiddenValue(value: unknown, type: HiddenInput[\"type\"]): Json | undefined {\n if (typeof value === \"string\" && value.length > MAX_HIDDEN_STRING_LENGTH) return undefined;\n if (type === \"string\") {\n if (typeof value === \"string\") return value;\n if (typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) return String(value);\n return undefined;\n }\n if (type === \"number\") {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value !== \"string\" || !DECIMAL.test(value)) return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n }\n if (typeof value === \"boolean\") return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\n/**\n * Type raw hidden inputs (from a query string, the host app or the server)\n * by the definition's declarations. `undefined` values are skipped silently.\n */\nexport function coerceHidden(\n definition: FormDefinition,\n raw: Record<string, unknown> | undefined,\n options: CoerceHiddenOptions = {},\n): CoercedHidden {\n const declared = new Map((definition.hidden ?? []).map((h) => [h.name, h]));\n const values: Record<string, Json> = {};\n const ignored: string[] = [];\n if (!isPlainObject(raw)) return { values, ignored };\n for (const name of Object.keys(raw)) {\n const value = raw[name];\n if (value === undefined) continue;\n const spec = declared.get(name);\n if (!spec || (options.sources && !options.sources.includes(spec.source))) {\n ignored.push(name);\n continue;\n }\n const coerced = coerceHiddenValue(value, spec.type);\n if (coerced === undefined) ignored.push(name);\n else Object.defineProperty(values, name, { value: coerced, enumerable: true, writable: true, configurable: true });\n }\n return { values, ignored };\n}\n","import { isEmptyValue } from \"./fields\";\nimport type { Block, Condition, FieldBlock, FormDefinition, Json, LogicRule, Operand } from \"./types\";\n\nexport interface EvalScope {\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n fields: Map<string, FieldBlock>;\n}\n\n/** `record[key]` if it is the record's own property: `values.constructor` is not an answer. */\nexport function own<T>(record: Record<string, T>, key: string): T | undefined {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction resolve(operand: Operand, scope: EvalScope): Json | undefined {\n if (\"field\" in operand) return own(scope.values, operand.field);\n if (\"hidden\" in operand) return own(scope.hidden, operand.hidden);\n return operand.value;\n}\n\nfunction deepEqual(a: Json | undefined, b: Json | undefined): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n return false;\n}\n\n/**\n * Evaluate a condition. Never throws. An empty value (unanswered, `null`,\n * blank text, an empty list: see `isEmptyValue`) is unanswered: it fails\n * every comparison, including `eq`, `in` and `contains`, and passes `neq`.\n */\nexport function evaluate(condition: Condition, scope: EvalScope): boolean {\n if (\"all\" in condition) return condition.all.every((c) => evaluate(c, scope));\n if (\"any\" in condition) return condition.any.some((c) => evaluate(c, scope));\n if (\"not\" in condition) return !evaluate(condition.not, scope);\n\n const left = resolve(condition.left, scope);\n const right = condition.right ? resolve(condition.right, scope) : undefined;\n const field = \"field\" in condition.left ? scope.fields.get(condition.left.field) : undefined;\n const unanswered = isEmptyValue(left, field);\n\n switch (condition.op) {\n case \"answered\":\n return !unanswered;\n case \"empty\":\n return unanswered;\n case \"eq\":\n return !unanswered && deepEqual(left, right);\n case \"neq\":\n // An unanswered field is \"not\" any value.\n return unanswered || !deepEqual(left, right);\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n if (typeof left !== \"number\" || typeof right !== \"number\") return false;\n if (condition.op === \"lt\") return left < right;\n if (condition.op === \"lte\") return left <= right;\n if (condition.op === \"gt\") return left > right;\n return left >= right;\n }\n case \"in\":\n return !unanswered && Array.isArray(right) && right.some((r) => deepEqual(r, left));\n case \"contains\":\n if (unanswered) return false;\n if (Array.isArray(left)) return left.some((l) => deepEqual(l, right));\n return (\n typeof left === \"string\" &&\n typeof right === \"string\" &&\n left.toLowerCase().includes(right.toLowerCase())\n );\n }\n}\n\n/** Blocks a respondent steps through: fields and content, in order. */\nexport function steps(def: FormDefinition): Block[] {\n return def.blocks.filter((b) => b.kind !== \"page-break\");\n}\n\nfunction visibilityRules(def: FormDefinition, blockId: string) {\n return (def.logic ?? []).filter(\n (r): r is Extract<LogicRule, { target: string }> =>\n (r.effect === \"show\" || r.effect === \"hide\") && r.target === blockId,\n );\n}\n\n/** Whether a field is withheld because the form is anonymous and the field identifies the respondent. */\nexport function withheld(def: FormDefinition, field: FieldBlock | undefined): boolean {\n return def.settings?.anonymous === true && field?.identifying === true;\n}\n\n/** Show/hide rules against a scope as given. A matching `hide` wins; any `show` must match. */\nfunction rulesAllow(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n if (withheld(def, scope.fields.get(blockId))) return false;\n const rules = visibilityRules(def, blockId);\n if (rules.some((r) => r.effect === \"hide\" && evaluate(r.when, scope))) return false;\n const shows = rules.filter((r) => r.effect === \"show\");\n return shows.length === 0 || shows.some((r) => evaluate(r.when, scope));\n}\n\nexport interface PathResult {\n /** Block ids the respondent will step through, given the answers on the path. */\n path: string[];\n /** The ending reached by a jump, or the default ending. */\n ending: string | null;\n}\n\nexport interface PathWalk extends PathResult {\n /**\n * The scope logic sees at a block: the values of the fields on the path\n * before it (and of the block itself, with `inclusive`), nothing else.\n */\n scopeAt(blockId: string, inclusive?: boolean): EvalScope;\n}\n\n/** One forward pass over the blocks. See `computePath`. */\nexport function walkPath(def: FormDefinition, scope: EvalScope): PathWalk {\n const list = steps(def);\n const index = new Map(list.map((b, i) => [b.id, i]));\n const position = new Map(def.blocks.map((b, i) => [b.id, i]));\n const jumps = (def.logic ?? []).filter(\n (r): r is Extract<LogicRule, { effect: \"jump\" }> => r.effect === \"jump\",\n );\n const defaultEnding = def.endings?.find((e) => e.id === \"default\")?.id ?? def.endings?.[0]?.id ?? null;\n\n // Values of the fields placed on the path so far. It only grows, so every\n // decision reads blocks already placed and the pass needs no fixed point.\n const placed = Object.create(null) as Record<string, Json | undefined>;\n const local: EvalScope = { values: placed, hidden: scope.hidden, fields: scope.fields };\n const path: string[] = [];\n const nextVisible = (from: number) => {\n for (let i = from; i < list.length; i++) if (rulesAllow(def, list[i]!.id, local)) return i;\n return list.length;\n };\n\n let ending = defaultEnding;\n let i = nextVisible(0);\n while (i < list.length) {\n const block = list[i]!;\n path.push(block.id);\n if (block.kind === \"field\") placed[block.id] = own(scope.values, block.id);\n const jump = jumps.find((r) => r.from === block.id && evaluate(r.when, local));\n if (jump) {\n if (typeof jump.to === \"object\") {\n ending = jump.to.ending;\n break;\n }\n const target = index.get(jump.to);\n if (target !== undefined && target > i) {\n i = nextVisible(target);\n continue;\n }\n }\n i = nextVisible(i + 1);\n }\n\n const scopeAt = (blockId: string, inclusive = false): EvalScope => {\n const at = position.get(blockId) ?? -1;\n const values = Object.create(null) as Record<string, Json | undefined>;\n for (const id of path) {\n const p = position.get(id)!;\n if (p > at || (p === at && !inclusive)) break;\n if (id in placed) values[id] = placed[id];\n }\n return { values, hidden: scope.hidden, fields: scope.fields };\n };\n return { path, ending, scopeAt };\n}\n\n/**\n * The respondent's path, derived from the answers on the path, so the client,\n * the server and a replay always agree. It is built in one forward pass: a\n * block's show/hide rules, and the jumps from it, see only the fields already\n * on the path before it (and, for a jump, the block itself). A field that is\n * hidden, jumped over or later in the form reads as unanswered, whatever\n * value it holds.\n *\n * A block jumped over is off the path and counts as hidden: it is not\n * validated and its value is cleared on submit. A jump never revisits a block;\n * a jump to an earlier block is ignored (the checker in `parseForm` reports it).\n */\nexport function computePath(def: FormDefinition, scope: EvalScope): PathResult {\n const { path, ending } = walkPath(def, scope);\n return { path, ending };\n}\n\n/**\n * Whether a block's show/hide rules let it be shown, ignoring jumps. The rules\n * read the answers on the path before the block, as in `computePath`. A block\n * with any `show` rule is hidden until one matches; a matching `hide` rule\n * always wins.\n */\nexport function ruleVisible(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n return rulesAllow(def, blockId, walkPath(def, scope).scopeAt(blockId));\n}\n\nexport function fieldMap(def: FormDefinition): Map<string, FieldBlock> {\n const map = new Map<string, FieldBlock>();\n for (const block of def.blocks) if (block.kind === \"field\") map.set(block.id, block);\n return map;\n}\n","import { summarizeValue } from \"./fields\";\nimport { own } from \"./logic\";\nimport type { FieldBlock, Json } from \"./types\";\n\nconst TOKEN = /\\{\\{\\s*(field|hidden):([A-Za-z0-9_-]+)\\s*(?:\\|([^}]*))?\\}\\}/g;\n\nexport interface RecallScope {\n /** Fields by key. */\n fieldsByKey: Map<string, FieldBlock>;\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n}\n\n/**\n * Replace `{{field:key|fallback}}` and `{{hidden:name|fallback}}` tokens.\n * An unanswered value renders its fallback (default empty); the text is\n * never dropped.\n */\nexport function recall(text: string, scope: RecallScope): string {\n return text.replace(TOKEN, (_match, kind: string, name: string, fallback?: string) => {\n if (kind === \"field\") {\n const field = scope.fieldsByKey.get(name);\n const out = field ? summarizeValue(own(scope.values, field.id), field) : \"\";\n return out || (fallback ?? \"\").trim();\n }\n const value = own(scope.hidden, name);\n const out = value === undefined || value === null ? \"\" : String(value);\n return out || (fallback ?? \"\").trim();\n });\n}\n\n/** The keys a text recalls, for the checker. */\nexport function recallRefs(text: string): { kind: \"field\" | \"hidden\"; name: string }[] {\n return [...text.matchAll(TOKEN)].map((m) => ({ kind: m[1] as \"field\" | \"hidden\", name: m[2]! }));\n}\n","import { getFieldType, isEmptyValue } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\n/** The Standard Schema interface (standardschema.dev), as far as validation needs it. */\nexport interface StandardSchemaV1<T = unknown> {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) =>\n | { value: T; issues?: undefined }\n | { issues: ReadonlyArray<{ message: string }> }\n | Promise<unknown>;\n };\n}\n\n/** A custom check for one field: a function, or any Standard Schema (Zod, Valibot, ArkType…). */\nexport type FieldValidator = ((value: Json) => string | null) | StandardSchemaV1;\n\nexport const REQUIRED_MESSAGE = \"This question needs an answer.\";\n\nfunction runCustom(validator: FieldValidator, value: Json): string | null {\n if (typeof validator === \"function\") return validator(value);\n const result = validator[\"~standard\"].validate(value);\n if (result instanceof Promise) {\n throw new Error(\"Async validators are not supported in the engine yet; run them on the server.\");\n }\n const issues = (result as { issues?: ReadonlyArray<{ message: string }> }).issues;\n return issues?.length ? issues[0]!.message : null;\n}\n\n/**\n * Validate one field's value. `requireAnswers: false` (drafts) checks the\n * format of what was answered without requiring the rest.\n */\nexport function validateField(\n field: FieldBlock,\n value: Json | undefined,\n options: { requireAnswers?: boolean; custom?: FieldValidator } = {},\n): string | null {\n if (isEmptyValue(value, field)) {\n return field.required && options.requireAnswers !== false ? REQUIRED_MESSAGE : null;\n }\n const manifest = getFieldType(field.type);\n // A type with no manifest cannot say what a valid answer is, so none is accepted.\n if (!manifest) return `Unknown field type \"${field.type}\".`;\n const builtIn = manifest.validate?.(value as Json, field) ?? null;\n if (builtIn) return builtIn;\n return options.custom ? runCustom(options.custom, value as Json) : null;\n}\n","import { isEmptyValue, normalizeValue } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { computePath, fieldMap, own, type EvalScope } from \"./logic\";\nimport { recall } from \"./recall\";\nimport type { Block, FieldBlock, FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface FormState {\n /** Answers keyed by block id. */\n values: Record<string, Json | undefined>;\n /** URL and host inputs (untrusted) and server-resolved inputs, by name. */\n hidden: Record<string, Json | undefined>;\n /** Block ids the respondent steps through, given the answers so far. */\n path: string[];\n /** The block on screen in focus layout. */\n current: string | null;\n /** Visited blocks, for Back. */\n history: string[];\n errors: Record<string, string>;\n status: \"in_progress\" | \"completed\";\n /** The ending reached once completed. */\n ending: string | null;\n events: FormEvent[];\n}\n\nexport interface CreateFormOptions {\n /** Prefilled answers by field id. Logged as leading `answer` events with `source: \"prefill\"`. */\n initialValues?: Record<string, Json> | undefined;\n /** Hidden inputs by name. Declared ones are typed with `coerceHidden`, as the server types them. */\n hidden?: Record<string, Json | undefined> | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /** Timestamps on events. Pass `() => undefined` to record none (anonymous forms). */\n clock?: (() => number | undefined) | undefined;\n}\n\nexport interface FormEngine {\n readonly definition: FormDefinition;\n getState(): FormState;\n subscribe(listener: () => void): () => void;\n /** A field's id, from its key. */\n idOf(key: string): string;\n field(id: string): FieldBlock | undefined;\n block(id: string): Block | undefined;\n isVisible(id: string): boolean;\n /**\n * Set an answer. Like `next`, `back` and `submit`, it does nothing once the\n * response is completed: a completed response is final, so its stored\n * answers are the ones that were validated.\n */\n setValue(id: string, value: Json | undefined): void;\n /** Validate the current step and move on. Returns false if it has errors. */\n next(): boolean;\n back(): void;\n /** Validate every visible field and complete. Returns false if it has errors or is already completed. */\n submit(): boolean;\n /** Text with `{{recall}}` tokens resolved. */\n text(template: string): string;\n /** Visible, non-empty field values only, keyed by id: what a submit stores. */\n answers(): Record<string, Json>;\n}\n\nexport function createForm(definition: FormDefinition, options: CreateFormOptions = {}): FormEngine {\n return build(definition, options).engine;\n}\n\ninterface Built {\n engine: FormEngine;\n /** Apply a logged event as-is, appending to the log in place (replay only). */\n apply(event: FormEvent): void;\n /** End a replay: later events are copied and notify subscribers again. */\n finish(): void;\n}\n\nfunction build(definition: FormDefinition, options: CreateFormOptions, replaying = false): Built {\n const fields = fieldMap(definition);\n const byKey = new Map([...fields.values()].map((f) => [f.key, f]));\n const blocks = new Map(definition.blocks.map((b) => [b.id, b]));\n // An anonymous form records no timestamps, whatever clock is passed.\n const clock = definition.settings?.anonymous === true ? () => undefined : (options.clock ?? (() => Date.now()));\n const listeners = new Set<() => void>();\n // While replaying, events are pushed onto one array instead of copied per\n // event, so a long log replays in linear time.\n let batch = replaying;\n\n const scopeOf = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]): EvalScope => ({\n values,\n hidden,\n fields,\n });\n\n // Declared inputs are typed exactly as the server types them; undeclared\n // names pass through (logic and recall cannot reference them).\n const declared = new Set((definition.hidden ?? []).map((h) => h.name));\n const initialHidden: FormState[\"hidden\"] = {};\n for (const [name, value] of Object.entries(options.hidden ?? {})) {\n if (!declared.has(name)) initialHidden[name] = value;\n }\n Object.assign(initialHidden, coerceHidden(definition, options.hidden).values);\n\n const first = computePath(definition, scopeOf({}, initialHidden));\n let state: FormState = {\n values: {},\n hidden: initialHidden,\n path: first.path,\n current: first.path[0] ?? null,\n history: [],\n errors: {},\n status: \"in_progress\",\n ending: null,\n events: [],\n };\n\n const emit = (next: FormState) => {\n state = next;\n if (batch) return;\n for (const l of listeners) l();\n };\n const log = (event: FormEvent): FormEvent[] => {\n if (!batch) return [...state.events, event];\n state.events.push(event);\n return state.events;\n };\n const stamp = <E extends FormEvent>(event: E): E => {\n const at = clock();\n return at === undefined ? event : { ...event, at };\n };\n\n // Every block on the path is visible: the path only takes blocks whose\n // rules allow them, given the answers before them.\n const isVisibleIn = (s: FormState, id: string) => s.path.includes(id);\n\n const errorsFor = (s: FormState, ids: string[]) => {\n const errors: Record<string, string> = {};\n for (const id of ids) {\n const field = fields.get(id);\n if (!field || !isVisibleIn(s, id)) continue;\n const message = validateField(field, own(s.values, id), { custom: options.validators?.[id] });\n if (message) errors[id] = message;\n }\n return errors;\n };\n\n const answer = (id: string, value: Json | undefined, event: FormEvent) => {\n if (state.status === \"completed\" || own(state.values, id) === value) return;\n const values = { ...state.values, [id]: value };\n const { path } = computePath(definition, scopeOf(values, state.hidden));\n const errors = { ...state.errors };\n delete errors[id];\n emit({ ...state, values, path, errors, events: log(event) });\n };\n\n const engine: FormEngine = {\n definition,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n idOf(key) {\n const field = byKey.get(key);\n if (!field) throw new Error(`No field with key \"${key}\".`);\n return field.id;\n },\n field: (id) => fields.get(id),\n block: (id) => blocks.get(id),\n isVisible: (id) => isVisibleIn(state, id),\n\n setValue(id, value) {\n if (!fields.has(id)) throw new Error(`No field \"${id}\".`);\n answer(id, value, stamp({ type: \"answer\", field: id, value }));\n },\n\n next() {\n if (!state.current || state.status === \"completed\") return false;\n const errors = errorsFor(state, [state.current]);\n // A failed attempt is logged too, so a replay shows the same errors.\n const events = log(stamp({ type: \"next\" as const }));\n if (Object.keys(errors).length) {\n emit({ ...state, errors: { ...state.errors, ...errors }, events });\n return false;\n }\n const at = state.path.indexOf(state.current);\n const target = state.path[at + 1];\n if (!target) {\n emit({ ...state, events });\n return true;\n }\n emit({ ...state, current: target, history: [...state.history, state.current], events });\n return true;\n },\n\n back() {\n if (state.status === \"completed\") return;\n const history = [...state.history];\n let previous = history.pop();\n while (previous && !state.path.includes(previous)) previous = history.pop();\n if (!previous) return;\n emit({ ...state, current: previous, history, events: log(stamp({ type: \"back\" as const })) });\n },\n\n submit() {\n if (state.status === \"completed\") return false;\n const errors = errorsFor(state, state.path);\n const events = log(stamp({ type: \"submit\" as const }));\n if (Object.keys(errors).length) {\n const firstError = state.path.find((id) => own(errors, id)) ?? state.current;\n emit({ ...state, errors, current: firstError, events });\n return false;\n }\n const { ending } = computePath(definition, scopeOf(state.values, state.hidden));\n emit({ ...state, errors: {}, status: \"completed\", ending, events });\n return true;\n },\n\n text: (template) =>\n recall(template, { fieldsByKey: byKey, values: state.values, hidden: state.hidden }),\n\n answers() {\n const out: Record<string, Json> = {};\n for (const id of state.path) {\n const field = fields.get(id);\n const value = own(state.values, id);\n // An empty answer (`\"\"`, blank text, `[]`) is stored as no answer.\n if (field && !isEmptyValue(value, field)) out[id] = normalizeValue(value as Json, field);\n }\n return out;\n },\n };\n\n // Prefilled answers are logged as leading `answer` events, so a replay of\n // the log, and the server, see them too.\n if (options.initialValues) {\n for (const [id, value] of Object.entries(options.initialValues)) {\n if (!fields.has(id) || value === undefined) continue;\n answer(id, value, stamp({ type: \"answer\", field: id, value, source: \"prefill\" }));\n }\n }\n\n const apply = (event: FormEvent) => {\n if (event.type === \"answer\") {\n if (fields.has(event.field)) {\n const { at: _at, ...logged } = event;\n answer(event.field, event.value, logged);\n }\n } else if (event.type === \"next\") engine.next();\n else if (event.type === \"back\") engine.back();\n else if (event.type === \"submit\") engine.submit();\n // Unknown event types are ignored.\n };\n const finish = () => {\n batch = false;\n state = { ...state, events: [...state.events] };\n };\n return { engine, apply, finish };\n}\n\n/** Rebuild a form's state from its event log. Timestamps are ignored. */\nexport function replay(\n definition: FormDefinition,\n events: FormEvent[],\n options: Omit<CreateFormOptions, \"clock\" | \"initialValues\"> = {},\n): FormEngine {\n const { engine, apply, finish } = build(definition, { ...options, initialValues: undefined, clock: () => undefined }, true);\n for (const event of events) apply(event);\n finish();\n return engine;\n}\n","import { isJson } from \"./events\";\nimport { getFieldType } from \"./fields\";\nimport { recallRefs } from \"./recall\";\nimport { MAX_TABLE_COLUMNS } from \"./structured\";\nimport type { Condition, FormDefinition, Operator } from \"./types\";\n\n/** A value for a message. Never throws: parseForm accepts any input, including BigInts, cycles and deep nesting. */\nfunction shown(v: unknown): string {\n let text: string | undefined;\n try {\n text = JSON.stringify(v);\n } catch {\n text = undefined;\n }\n text ??= typeof v === \"bigint\" ? `${v}n` : typeof v;\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\nexport interface FormIssue {\n path: string;\n message: string;\n}\n\nexport type ParseResult =\n | { ok: true; form: FormDefinition; warnings: FormIssue[] }\n | { ok: false; issues: FormIssue[]; warnings: FormIssue[] };\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst isInt = (v: unknown): v is number => typeof v === \"number\" && Number.isInteger(v);\n\n/** The JSON type a comparison operand must have to match a built-in field type's value. */\nconst LITERAL_TYPE: Readonly<Record<string, \"string\" | \"number\" | \"boolean\">> = {\n \"short-text\": \"string\",\n \"long-text\": \"string\",\n email: \"string\",\n phone: \"string\",\n rating: \"number\",\n nps: \"number\",\n \"single-choice\": \"string\",\n \"multi-choice\": \"string\",\n \"yes-no\": \"boolean\",\n list: \"string\",\n};\n\nconst ORDERING: ReadonlySet<string> = new Set<Operator>([\"lt\", \"lte\", \"gt\", \"gte\"]);\n\nconst OPERATORS: ReadonlySet<string> = new Set<Operator>([\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"in\",\n \"contains\",\n \"answered\",\n \"empty\",\n]);\n\n/**\n * Names an id, key or hidden input may not take: they collide with\n * `Object.prototype` (`__proto__`, `constructor`, `toString`…) when used as a\n * record key.\n */\nconst RESERVED: ReadonlySet<string> = new Set(Object.getOwnPropertyNames(Object.prototype));\n\n/** Deepest nesting of `all` / `any` / `not` a condition may have. */\nconst MAX_CONDITION_DEPTH = 32;\n\n/**\n * Check a definition before it is stored or rendered: structure, the types of\n * text fields, unique ids and keys, known field types, references that\n * resolve, operators that fit the field type. Warnings flag things that work\n * but are probably mistakes. Never throws, whatever the input.\n */\nexport function parseForm(input: unknown): ParseResult {\n const issues: FormIssue[] = [];\n const warnings: FormIssue[] = [];\n const fail = () => ({ ok: false as const, issues, warnings });\n const issue = (path: string, message: string) => void issues.push({ path, message });\n\n /** A required string (non-empty with `nonEmpty`). */\n const text = (v: unknown, path: string, nonEmpty = false) => {\n if (typeof v !== \"string\" || (nonEmpty && !v)) issue(path, nonEmpty ? \"Required.\" : \"Required text.\");\n };\n /** An optional string. */\n const optionalText = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"string\") issue(path, \"Must be text.\");\n };\n const optionalBoolean = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"boolean\") issue(path, \"Must be true or false.\");\n };\n /** An identifier: a non-empty string that is not an `Object.prototype` name. */\n const name = (v: unknown, path: string, what: string): v is string => {\n if (typeof v !== \"string\" || !v) {\n issue(path, `${what} must be a non-empty string.`);\n return false;\n }\n if (RESERVED.has(v)) {\n issue(path, `\"${v}\" is reserved and cannot be used as ${what.toLowerCase()}.`);\n return false;\n }\n return true;\n };\n\n /** An optional whole number of at least `floor`. */\n const optionalInt = (v: unknown, path: string, floor: number) => {\n if (v !== undefined && !(isInt(v) && v >= floor)) issue(path, `Must be a whole number of ${floor} or more.`);\n };\n /** `low` may not exceed `high` when both are whole numbers. */\n const ordered = (low: unknown, high: unknown, path: string, what: string) => {\n if (isInt(low) && isInt(high) && low > high) issue(path, `Can't be more than the ${what}.`);\n };\n /** The props of the structured types (list, table, media-notes, text-highlights). */\n const structuredProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"list\") {\n optionalInt(props.min, `${path}.min`, 0);\n optionalInt(props.max, `${path}.max`, 1);\n optionalInt(props.itemMaxLength, `${path}.itemMaxLength`, 1);\n optionalText(props.placeholder, `${path}.placeholder`);\n ordered(props.min, props.max ?? 10, `${path}.min`, \"most items\");\n } else if (type === \"table\") {\n const columns = props.columns;\n if (!Array.isArray(columns) || columns.length < 1 || columns.length > MAX_TABLE_COLUMNS) {\n issue(`${path}.columns`, `Must be a list of 1 to ${MAX_TABLE_COLUMNS} columns.`);\n } else {\n const seen = new Set<string>();\n columns.forEach((c, j) => {\n const at = `${path}.columns[${j}]`;\n if (!isObject(c)) return issue(at, \"Each column needs a key and a label.\");\n if (name(c.key, `${at}.key`, \"A column key\")) {\n if (seen.has(c.key)) issue(`${at}.key`, `Duplicate column key \"${c.key}\".`);\n seen.add(c.key);\n }\n text(c.label, `${at}.label`);\n optionalBoolean(c.long, `${at}.long`);\n });\n }\n optionalInt(props.minRows, `${path}.minRows`, 0);\n optionalInt(props.maxRows, `${path}.maxRows`, 1);\n ordered(props.minRows, props.maxRows ?? 3, `${path}.minRows`, \"most rows\");\n } else if (type === \"media-notes\") {\n optionalInt(props.maxNotes, `${path}.maxNotes`, 1);\n optionalInt(props.textMaxLength, `${path}.textMaxLength`, 1);\n } else if (type === \"text-highlights\") {\n optionalText(props.text, `${path}.text`);\n optionalInt(props.maxHighlights, `${path}.maxHighlights`, 1);\n }\n };\n\n if (!isObject(input)) {\n issue(\"\", \"A form definition must be an object.\");\n return fail();\n }\n if (input.schemaVersion !== 1) issue(\"schemaVersion\", \"Unsupported schemaVersion; expected 1.\");\n text(input.id, \"id\", true);\n text(input.title, \"title\");\n optionalText(input.description, \"description\");\n // Settings change privacy behaviour (anonymous, clearHiddenValues), so a\n // mistyped one is an issue, not a silent default.\n if (input.layout !== undefined) {\n if (!isObject(input.layout)) issue(\"layout\", \"Must be an object.\");\n else if (input.layout.mode !== \"focus\" && input.layout.mode !== \"classic\") {\n issue(\"layout.mode\", \"Must be focus or classic.\");\n }\n }\n if (input.settings !== undefined) {\n if (!isObject(input.settings)) issue(\"settings\", \"Must be an object.\");\n else {\n optionalBoolean(input.settings.anonymous, \"settings.anonymous\");\n optionalBoolean(input.settings.clearHiddenValues, \"settings.clearHiddenValues\");\n }\n }\n if (input.meta !== undefined && (!isObject(input.meta) || !isJson(input.meta))) {\n issue(\"meta\", \"Must be a JSON object.\");\n }\n if (!Array.isArray(input.blocks)) {\n issue(\"blocks\", \"Must be an array.\");\n return fail();\n }\n\n const ids = new Set<string>();\n const pageBreaks = new Set<string>();\n const keys = new Map<string, string>();\n const fieldTypes = new Map<string, string>();\n const order = new Map<string, number>();\n /** Option values of fields with `props.options`, for the operand check. */\n const choices = new Map<string, Set<string>>();\n\n input.blocks.forEach((block: unknown, i) => {\n const path = `blocks[${i}]`;\n if (!isObject(block) || typeof block.id !== \"string\" || !block.id) {\n issue(path, \"Every block needs a string id.\");\n return;\n }\n if (!name(block.id, `${path}.id`, \"A block id\")) return;\n if (ids.has(block.id)) issue(`${path}.id`, `Duplicate id \"${block.id}\".`);\n ids.add(block.id);\n if (block.kind === \"page-break\") pageBreaks.add(block.id);\n order.set(block.id, i);\n if (block.kind === \"field\") {\n text(block.label, `${path}.label`);\n optionalText(block.description, `${path}.description`);\n optionalText(block.placeholder, `${path}.placeholder`);\n optionalBoolean(block.required, `${path}.required`);\n optionalBoolean(block.sensitive, `${path}.sensitive`);\n optionalBoolean(block.identifying, `${path}.identifying`);\n const validKey = name(block.key, `${path}.key`, \"A field key\");\n if (typeof block.type !== \"string\" || !getFieldType(block.type)) {\n issue(`${path}.type`, `Unknown field type \"${String(block.type)}\".`);\n }\n if (block.props !== undefined) {\n if (!isObject(block.props) || !isJson(block.props)) issue(`${path}.props`, \"Must be a JSON object.\");\n else if (block.props.options !== undefined) {\n const options = block.props.options;\n if (!Array.isArray(options)) issue(`${path}.props.options`, \"Must be an array.\");\n else {\n options.forEach((o, j) => {\n const at = `${path}.props.options[${j}]`;\n if (!isObject(o) || typeof o.value !== \"string\") issue(at, \"Each option needs a string value.\");\n else optionalText(o.label, `${at}.label`);\n });\n choices.set(\n block.id,\n new Set(options.flatMap((o) => (isObject(o) && typeof o.value === \"string\" ? [o.value] : []))),\n );\n }\n }\n // Renderers draw one button per point, so the scale is bounded.\n const { max, maxLength } = isObject(block.props) ? block.props : {};\n if (block.type === \"rating\" && max !== undefined && !(isInt(max) && max >= 2 && max <= 10)) {\n issue(`${path}.props.max`, \"Must be a whole number from 2 to 10.\");\n }\n if (maxLength !== undefined && !(isInt(maxLength) && maxLength > 0)) {\n issue(`${path}.props.maxLength`, \"Must be a whole number above 0.\");\n }\n }\n // Checked with or without props: a table with no columns would block every submission.\n if (typeof block.type === \"string\" && (block.props === undefined || isObject(block.props))) {\n structuredProps(block.type, block.props ?? {}, `${path}.props`);\n }\n if (validKey) {\n if (keys.has(block.key as string)) issue(`${path}.key`, `Duplicate key \"${String(block.key)}\".`);\n keys.set(block.key as string, block.id);\n }\n fieldTypes.set(block.id, typeof block.type === \"string\" ? block.type : \"\");\n } else if (block.kind === \"content\") {\n if (block.type !== \"heading\" && block.type !== \"text\") issue(`${path}.type`, \"Must be heading or text.\");\n text(block.text, `${path}.text`);\n } else if (block.kind === \"page-break\") {\n optionalText(block.title, `${path}.title`);\n } else {\n issue(`${path}.kind`, \"Unknown block kind.\");\n }\n });\n\n const hiddenNames = new Set<string>();\n const hiddenTypes = new Map<string, string>();\n if (input.hidden !== undefined && !Array.isArray(input.hidden)) issue(\"hidden\", \"Must be an array.\");\n (Array.isArray(input.hidden) ? input.hidden : []).forEach((h: unknown, i) => {\n if (!isObject(h) || typeof h.name !== \"string\" || !h.name) {\n issue(`hidden[${i}]`, \"Each hidden input needs a name.\");\n return;\n }\n if (!name(h.name, `hidden[${i}].name`, \"A hidden input name\")) return;\n if (hiddenNames.has(h.name)) issue(`hidden[${i}].name`, `Duplicate hidden input \"${h.name}\".`);\n if (typeof h.source !== \"string\" || ![\"url\", \"host\", \"server\"].includes(h.source)) {\n issue(`hidden[${i}].source`, \"Must be url, host or server.\");\n }\n if (typeof h.type !== \"string\" || ![\"string\", \"number\", \"boolean\"].includes(h.type)) {\n issue(`hidden[${i}].type`, \"Must be string, number or boolean.\");\n }\n optionalBoolean(h.sensitive, `hidden[${i}].sensitive`);\n optionalBoolean(h.identifying, `hidden[${i}].identifying`);\n hiddenNames.add(h.name);\n if (typeof h.type === \"string\") hiddenTypes.set(h.name, h.type);\n });\n\n const endingIds = new Set<string>();\n if (input.endings !== undefined && !Array.isArray(input.endings)) issue(\"endings\", \"Must be an array.\");\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n const path = `endings[${i}]`;\n if (!isObject(e)) {\n issue(path, \"Each ending must be an object with an id and a title.\");\n return;\n }\n text(e.title, `${path}.title`);\n optionalText(e.description, `${path}.description`);\n if (!name(e.id, `${path}.id`, \"An ending id\")) return;\n if (endingIds.has(e.id)) issue(`${path}.id`, `Duplicate ending id \"${e.id}\".`);\n endingIds.add(e.id);\n });\n\n /** Field ids a condition reads, for the order check. */\n const checkOperand = (o: unknown, path: string, reads: string[]) => {\n if (o === undefined) return;\n if (!isObject(o)) return issue(path, \"An operand must be an object.\");\n if (\"field\" in o) {\n if (typeof o.field !== \"string\" || !fieldTypes.has(o.field)) return issue(path, `No field \"${String(o.field)}\".`);\n reads.push(o.field);\n } else if (\"hidden\" in o) {\n if (typeof o.hidden !== \"string\" || !hiddenNames.has(o.hidden)) {\n issue(path, `No hidden input \"${String(o.hidden)}\".`);\n }\n } else if (!(\"value\" in o) || !isJson(o.value)) {\n issue(path, \"An operand needs a `field`, a `hidden` input or a JSON `value`.\");\n }\n };\n const checkCondition = (c: unknown, path: string, reads: string[], depth = 0): void => {\n if (!isObject(c)) return issue(path, \"A condition must be an object.\");\n if (depth > MAX_CONDITION_DEPTH) return issue(path, \"The condition is nested too deeply.\");\n if (\"all\" in c || \"any\" in c) {\n const group = \"all\" in c ? \"all\" : \"any\";\n const list = c[group];\n if (!Array.isArray(list)) return issue(path, `\\`${group}\\` must be an array.`);\n return list.forEach((x, i) => checkCondition(x, `${path}.${group}[${i}]`, reads, depth + 1));\n }\n if (\"not\" in c) return checkCondition(c.not, `${path}.not`, reads, depth + 1);\n if (typeof c.op !== \"string\" || !isObject(c.left)) {\n return issue(path, \"A comparison needs an `op` and a `left` operand.\");\n }\n if (!OPERATORS.has(c.op)) issue(`${path}.op`, `Unknown operator \"${c.op}\".`);\n checkOperand(c.left, `${path}.left`, reads);\n checkOperand(c.right, `${path}.right`, reads);\n if (typeof c.left.field === \"string\") {\n const manifest = getFieldType(fieldTypes.get(c.left.field) ?? \"\");\n if (manifest && OPERATORS.has(c.op) && !manifest.operators.includes(c.op as Operator)) {\n // Already wrong; a literal warning on top would only repeat it.\n return issue(`${path}.op`, `\"${c.op}\" does not apply to a ${manifest.type} field.`);\n }\n }\n checkLiterals(c.op, c.left, c.right, path);\n };\n /** Warn when a literal `value` can never match what the left side holds: wrong type, or not an option. */\n const checkLiterals = (op: string, left: Record<string, unknown>, right: unknown, path: string) => {\n if (op === \"answered\" || op === \"empty\" || !OPERATORS.has(op)) return;\n const literal = isObject(right) && \"value\" in right;\n // A `field` or `hidden` operand on the right is only known when the form runs.\n if (right !== undefined && !literal) return;\n let what = \"the left side\";\n let type: string | undefined;\n let options: Set<string> | undefined;\n if (typeof left.field === \"string\" && fieldTypes.has(left.field)) {\n const fieldType = fieldTypes.get(left.field)!;\n what = `\"${keyOf(left.field)}\"`;\n type = LITERAL_TYPE[fieldType];\n if (fieldType === \"single-choice\" || fieldType === \"multi-choice\") options = choices.get(left.field);\n } else if (typeof left.hidden === \"string\" && hiddenTypes.has(left.hidden)) {\n what = `hidden input \"${left.hidden}\"`;\n type = hiddenTypes.get(left.hidden);\n }\n const outcome = op === \"neq\" ? \"always true\" : \"never true\";\n let values: unknown[];\n if (op === \"in\") {\n if (!literal || !Array.isArray(right.value)) {\n return void warnings.push({ path: `${path}.right`, message: \"`in` needs a list of values; it never matches.\" });\n }\n values = right.value;\n } else if (!literal) return;\n else values = [right.value];\n if (ORDERING.has(op)) {\n if (type !== undefined && type !== \"number\") {\n return void warnings.push({ path: `${path}.op`, message: `\"${op}\" compares numbers, but ${what} holds a ${type}; it is never true.` });\n }\n type = \"number\";\n }\n for (const v of values) {\n const message =\n type !== undefined && typeof v !== type\n ? `${what} holds a ${type}, but ${shown(v)} is not one; this comparison is ${outcome}.`\n : options && typeof v === \"string\" && !options.has(v)\n ? `${shown(v)} is not an option of ${what}; this comparison is ${outcome}.`\n : null;\n if (message) warnings.push({ path: `${path}.right`, message });\n }\n };\n const keyOf = (id: string) => [...keys].find(([, v]) => v === id)?.[0] ?? id;\n\n const ruleIds = new Set<string>();\n if (input.logic !== undefined && !Array.isArray(input.logic)) issue(\"logic\", \"Must be an array.\");\n (Array.isArray(input.logic) ? input.logic : []).forEach((rule: unknown, i) => {\n const path = `logic[${i}]`;\n if (!isObject(rule) || typeof rule.id !== \"string\" || !isObject(rule.when)) {\n issue(path, \"Each rule needs an id and a `when` condition.\");\n return;\n }\n if (ruleIds.has(rule.id)) issue(`${path}.id`, `Duplicate rule id \"${rule.id}\".`);\n ruleIds.add(rule.id);\n const reads: string[] = [];\n checkCondition(rule.when, `${path}.when`, reads);\n\n // The block whose position the condition is read at, for the order check.\n let at: string | undefined;\n let inclusive = false;\n if (rule.effect === \"jump\") {\n if (typeof rule.from !== \"string\" || !ids.has(rule.from)) {\n issue(`${path}.from`, `No block \"${String(rule.from)}\".`);\n } else if (pageBreaks.has(rule.from)) {\n issue(`${path}.from`, \"A jump can't start at a page break; use the block before it.\");\n } else {\n at = rule.from;\n inclusive = true;\n }\n if (isObject(rule.to)) {\n if (typeof rule.to.ending !== \"string\" || !endingIds.has(rule.to.ending)) {\n issue(`${path}.to`, `No ending \"${String(rule.to.ending)}\".`);\n }\n } else if (typeof rule.to !== \"string\" || !ids.has(rule.to)) {\n issue(`${path}.to`, `No block \"${String(rule.to)}\".`);\n } else if (pageBreaks.has(rule.to)) {\n issue(`${path}.to`, \"A jump can't land on a page break; jump to the first block after it.\");\n } else if (at !== undefined && (order.get(rule.to) ?? 0) <= (order.get(at) ?? 0)) {\n warnings.push({ path: `${path}.to`, message: \"Jumps only go forward; this one is ignored.\" });\n }\n } else if (rule.effect === \"show\" || rule.effect === \"hide\") {\n if (typeof rule.target !== \"string\" || !ids.has(rule.target)) {\n issue(`${path}.target`, `No block \"${String(rule.target)}\".`);\n } else at = rule.target;\n } else {\n issue(`${path}.effect`, \"Must be show, hide or jump.\");\n }\n\n // Logic reads only the answers on the path before the block it applies to.\n if (at !== undefined) {\n const limit = order.get(at) ?? 0;\n for (const field of new Set(reads)) {\n const p = order.get(field) ?? 0;\n if (p > limit || (p === limit && !inclusive)) {\n warnings.push({\n path: `${path}.when`,\n message: `Reads \"${keyOf(field)}\", which does not come before \"${keyOf(at)}\"; it always reads as unanswered.`,\n });\n }\n }\n }\n });\n\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block)) return;\n const raw =\n block.kind === \"field\" ? [block.label, block.description] : block.kind === \"content\" ? [block.text] : [];\n const texts = raw.filter((t): t is string => typeof t === \"string\");\n for (const t of texts) {\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" && !hiddenNames.has(ref.name)) {\n issue(`blocks[${i}]`, `Recalls unknown hidden input \"${ref.name}\".`);\n }\n if (ref.kind === \"field\") {\n const target = keys.get(ref.name);\n if (!target) issue(`blocks[${i}]`, `Recalls unknown field \"${ref.name}\".`);\n else if ((order.get(target) ?? 0) >= i) {\n warnings.push({ path: `blocks[${i}]`, message: `Recalls \"${ref.name}\", which comes later.` });\n }\n }\n }\n }\n });\n\n // Endings and the introduction recall too. Only warnings: a stale token here shows as\n // its fallback text, and earlier releases accepted these definitions.\n const extra: [string, unknown][] = [[\"description\", input.description]];\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n if (isObject(e)) extra.push([`endings[${i}]`, e.title], [`endings[${i}]`, e.description]);\n });\n for (const [path, t] of extra) {\n if (typeof t !== \"string\") continue;\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" ? !hiddenNames.has(ref.name) : !keys.has(ref.name)) {\n warnings.push({ path, message: `Recalls unknown ${ref.kind === \"hidden\" ? \"hidden input\" : \"field\"} \"${ref.name}\"; it shows its fallback text.` });\n }\n }\n }\n\n return issues.length ? fail() : { ok: true, form: input as unknown as FormDefinition, warnings };\n}\n","/**\n * Server-side checking. No IO: the app loads the published definition,\n * resolves its server inputs, calls `validateSubmission`, and stores what\n * comes back.\n */\nimport { createForm, replay, type FormEngine } from \"./engine\";\nimport { compactEvents, isFormEvent, isJson, isPlainObject, isUnknownEvent } from \"./events\";\nimport { isEmptyValue, normalizeValue } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { fieldMap, own, withheld } from \"./logic\";\nimport { parseForm } from \"./parse\";\nimport type { FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface SubmissionInput {\n /** Answers keyed by field id. Ignored when `events` is given. */\n answers?: Record<string, Json> | undefined;\n /** The respondent's event log. Replayed instead of trusting `answers`. */\n events?: FormEvent[] | undefined;\n /** URL and host inputs sent by the client. Server inputs here are ignored. */\n hidden?: Record<string, Json> | undefined;\n}\n\nexport interface SubmissionOptions {\n /** Values for `source: \"server\"` inputs, resolved by the server (account id, location, user id…). */\n context?: Record<string, Json> | undefined;\n /** `false` checks a draft: formats only, nothing required. Default true. */\n complete?: boolean | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /** Most events accepted, counted after `compactEvents`. Default 10 000. */\n maxEvents?: number | undefined;\n}\n\nexport interface CheckedSubmission {\n status: \"draft\" | \"completed\";\n /** Visible answers only, keyed by field id (kept hidden answers too, with `clearHiddenValues: false`). */\n answers: Record<string, Json>;\n /** Untrusted URL and host inputs, coerced to their declared types. Identifying ones are left out on anonymous forms. */\n hidden: Record<string, Json>;\n /** Trusted server inputs. Identifying ones are left out on anonymous forms. */\n context: Record<string, Json>;\n ending: string | null;\n /** Client-sent keys that were dropped, each once: unknown fields, server inputs, undeclared or withheld hidden names. */\n ignored: string[];\n}\n\nexport type SubmissionResult =\n | { ok: true; submission: CheckedSubmission }\n | { ok: false; errors: Record<string, string> };\n\n/** Default for `SubmissionOptions.maxEvents`. */\nexport const MAX_EVENTS = 10_000;\n\nconst MALFORMED: SubmissionResult = { ok: false, errors: { \"\": \"Malformed submission.\" } };\n\n// Definitions that parsed cleanly. Failures are not cached: registering a\n// missing field type later can fix them.\nconst parsedDefinitions = new WeakMap<object, true>();\n\nfunction checkDefinition(definition: FormDefinition): string | null {\n if (typeof definition === \"object\" && definition !== null && parsedDefinitions.has(definition)) return null;\n const parsed = parseForm(definition);\n if (!parsed.ok) {\n const list = parsed.issues.map((i) => (i.path ? `${i.path}: ${i.message}` : i.message)).join(\"; \");\n return `Invalid form definition: ${list}`;\n }\n parsedDefinitions.set(definition, true);\n return null;\n}\n\n/** The input as a well-formed submission, or null. Unknown event types are dropped. */\nfunction wellFormed(input: unknown): SubmissionInput | null {\n if (!isPlainObject(input)) return null;\n const { answers, events, hidden } = input;\n const record = (v: unknown) =>\n v === undefined ||\n (isPlainObject(v) && Object.keys(v).every((k) => v[k] === undefined || isJson(v[k])));\n if (!record(answers) || !record(hidden)) return null;\n if (events === undefined) return { answers: answers as SubmissionInput[\"answers\"], hidden: hidden as SubmissionInput[\"hidden\"] };\n if (!Array.isArray(events)) return null;\n const known: FormEvent[] = [];\n for (const e of events as unknown[]) {\n if (isFormEvent(e)) known.push(e);\n else if (!isUnknownEvent(e)) return null;\n }\n return { answers: answers as SubmissionInput[\"answers\"], events: known, hidden: hidden as SubmissionInput[\"hidden\"] };\n}\n\n/**\n * Check a submission against the published definition. Never throws on a\n * malformed submission: it returns `{ ok: false, errors: { \"\": … } }`.\n */\nexport function validateSubmission(\n definition: FormDefinition,\n submission: SubmissionInput,\n options: SubmissionOptions = {},\n): SubmissionResult {\n const invalid = checkDefinition(definition);\n if (invalid) return { ok: false, errors: { \"\": invalid } };\n const input = wellFormed(submission);\n if (!input) return MALFORMED;\n\n // A Set: a key sent many times (one answer event per keystroke) is reported once.\n const ignored = new Set<string>();\n const client = coerceHidden(definition, input.hidden, { sources: [\"url\", \"host\"] });\n for (const name of client.ignored) ignored.add(`hidden.${name}`);\n const hidden = client.values;\n const context = coerceHidden(definition, options.context, { sources: [\"server\"] }).values;\n\n const fields = fieldMap(definition);\n // Anonymous forms never store identifying fields: client values are dropped.\n /** `true`: store it; `false`: withheld; `undefined`: not a field. Both of the latter are reported in `ignored`. */\n const accept = (id: string): boolean | undefined => {\n if (!fields.has(id)) return void ignored.add(id);\n if (!withheld(definition, fields.get(id))) return true;\n ignored.add(id);\n return false;\n };\n const engineHidden = { ...hidden, ...context };\n let engine: FormEngine;\n if (input.events) {\n const events = compactEvents(input.events);\n const max = options.maxEvents ?? MAX_EVENTS;\n if (events.length > max) {\n return { ok: false, errors: { \"\": `Too many events: ${events.length} after compaction; the limit is ${max}.` } };\n }\n // Unknown fields stay in the log (replay ignores them); withheld ones are removed.\n const kept = events.filter((e) => e.type !== \"answer\" || accept(e.field) !== false);\n engine = replay(definition, kept, { hidden: engineHidden, validators: options.validators });\n } else {\n const answers: Record<string, Json> = {};\n for (const id of Object.keys(input.answers ?? {})) {\n const value = own(input.answers!, id);\n if (accept(id) && value !== undefined) answers[id] = value;\n }\n engine = createForm(definition, {\n initialValues: answers,\n hidden: engineHidden,\n validators: options.validators,\n clock: () => undefined,\n });\n }\n\n const complete = options.complete !== false;\n if (complete) {\n // A replay only reaches \"completed\" through a submit that validated, and a\n // completed response is final: answers after the submit event are ignored.\n if (engine.getState().status !== \"completed\" && !engine.submit()) {\n return { ok: false, errors: engine.getState().errors };\n }\n } else {\n const errors: Record<string, string> = {};\n for (const [id, value] of Object.entries(engine.answers())) {\n const message = validateField(fields.get(id)!, value, {\n requireAnswers: false,\n custom: options.validators?.[id],\n });\n if (message) errors[id] = message;\n }\n if (Object.keys(errors).length) return { ok: false, errors };\n }\n\n const state = engine.getState();\n const answers = engine.answers();\n if (definition.settings?.clearHiddenValues === false) {\n // Values of fields off the path were never validated. Keep one only if\n // its format is valid; drop the rest, so nothing stored is unchecked.\n for (const [id, field] of fields) {\n if (withheld(definition, field)) continue;\n const value = own(state.values, id);\n if (own(answers, id) !== undefined || value === undefined || isEmptyValue(value, field)) continue;\n const message = validateField(field, value, { requireAnswers: false, custom: options.validators?.[id] });\n if (message === null) answers[id] = normalizeValue(value, field);\n }\n }\n\n // Anonymous forms never store identifying hidden inputs either. Logic above\n // still read them, so the path matches the client's.\n const store = (values: Record<string, Json>, report: boolean) => {\n if (definition.settings?.anonymous !== true) return values;\n const identifying = new Set((definition.hidden ?? []).filter((h) => h.identifying === true).map((h) => h.name));\n const kept: Record<string, Json> = {};\n for (const [name, value] of Object.entries(values)) {\n if (!identifying.has(name)) kept[name] = value;\n else if (report) ignored.add(`hidden.${name}`);\n }\n return kept;\n };\n\n return {\n ok: true,\n submission: {\n status: complete ? \"completed\" : \"draft\",\n answers,\n hidden: store(hidden, true),\n context: store(context, false),\n ending: complete ? state.ending : null,\n ignored: [...ignored],\n },\n };\n}\n\n/**\n * The definition as respondents may see it. R1 forms hold nothing secret;\n * assessment answer keys (R4) will be stripped here.\n */\nexport function publicDefinition(definition: FormDefinition): FormDefinition {\n return JSON.parse(JSON.stringify(definition)) as FormDefinition;\n}\n"]}
1
+ {"version":3,"sources":["../src/formula.ts","../src/calculated.ts","../src/structured.ts","../src/fields.ts","../src/events.ts","../src/hidden.ts","../src/logic.ts","../src/recall.ts","../src/validate.ts","../src/engine.ts","../src/parse.ts","../src/server.ts"],"names":["own","blank","numberOps","finite","i","out","round","isObject","maxLength","name","answers"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * A small, safe formula language for `calculated` fields. It is parsed and\n * evaluated here, never with `eval` or `Function`, and it can only read the\n * answers it names.\n *\n * - Numbers: `12`, `0.5`. Text: `\"High\"` or `'High'`.\n * - Answers by key: `hours`, and one column of a table: `plan.cost`.\n * - Arithmetic: `+ - * /` (also `− × ÷`), unary minus, parentheses.\n * - Comparisons: `== != < <= > >=` (also `= ≠ ≤ ≥`), giving true or false.\n * - A choice: `cond ? a : b`.\n * - `sum(...)`, `avg(...)`, `min(...)`, `max(...)` over numbers, lists and\n * table columns. Blanks and text that is not a number are skipped.\n *\n * An unanswered question reads as blank: arithmetic with a blank is blank\n * (so a total stays empty until its answers are in), and so is dividing by\n * zero. Text that holds a number (\"12\") counts as that number; yes / no\n * counts as 1 / 0.\n */\nimport type { Json } from \"./types\";\n\nexport type FormulaValue = number | string | boolean | null | FormulaValue[];\n\n/** An answer a formula reads: `key`, or `key.column` for one column of a table. */\nexport interface FormulaRef {\n key: string;\n column?: string;\n}\n\ntype BinaryOp = \"+\" | \"-\" | \"*\" | \"/\" | \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\";\n\nexport const FORMULA_FUNCTIONS = [\"sum\", \"avg\", \"min\", \"max\"] as const;\nexport type FormulaFunction = (typeof FORMULA_FUNCTIONS)[number];\n\nexport type FormulaNode =\n | { kind: \"number\"; value: number }\n | { kind: \"text\"; value: string }\n | { kind: \"ref\"; key: string; column?: string; at: number }\n | { kind: \"unary\"; op: \"-\"; arg: FormulaNode }\n | { kind: \"binary\"; op: BinaryOp; left: FormulaNode; right: FormulaNode }\n | { kind: \"if\"; test: FormulaNode; then: FormulaNode; else: FormulaNode }\n | { kind: \"call\"; fn: FormulaFunction; args: FormulaNode[] };\n\nexport type FormulaParseResult =\n | { ok: true; ast: FormulaNode; refs: FormulaRef[] }\n | { ok: false; message: string; /** Character offset of the problem. */ at: number };\n\n/** Longest formula accepted. */\nexport const MAX_FORMULA_LENGTH = 2000;\n/** Deepest nesting of parentheses, function calls, signs and `? :`, each counting one level. */\nconst MAX_DEPTH = 64;\n\ntype Token =\n | { t: \"num\"; v: number; at: number }\n | { t: \"str\"; v: string; at: number }\n | { t: \"id\"; v: string; at: number }\n | { t: \"op\"; v: string; at: number }\n | { t: \"end\"; at: number };\n\nconst OP_ALIASES: Record<string, string> = { \"−\": \"-\", \"×\": \"*\", \"÷\": \"/\", \"≠\": \"!=\", \"≤\": \"<=\", \"≥\": \">=\", \"=\": \"==\" };\nconst TWO_CHAR = new Set([\"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR = new Set([\"+\", \"-\", \"*\", \"/\", \"<\", \">\", \"(\", \")\", \"?\", \":\", \",\", \".\", \"=\", \"−\", \"×\", \"÷\", \"≠\", \"≤\", \"≥\"]);\nconst COMPARISONS = new Set([\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\"]);\n\nclass FormulaError extends Error {\n constructor(\n message: string,\n readonly at: number,\n ) {\n super(message);\n }\n}\n\nconst isIdStart = (c: string) => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\nconst isIdPart = (c: string) => isIdStart(c) || (c >= \"0\" && c <= \"9\");\nconst isDigit = (c: string) => c >= \"0\" && c <= \"9\";\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < source.length) {\n const c = source[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n i++;\n continue;\n }\n const at = i;\n if (isDigit(c) || (c === \".\" && isDigit(source[i + 1] ?? \"\"))) {\n while (isDigit(source[i] ?? \"\")) i++;\n if (source[i] === \".\" && isDigit(source[i + 1] ?? \"\")) {\n i++;\n while (isDigit(source[i] ?? \"\")) i++;\n }\n // `1e6` and `2x` are not numbers here: say so rather than \"expected an operator\".\n if (isIdStart(source[i] ?? \"\")) throw new FormulaError(\"Write a number in digits only, like 1000000.\", at);\n const v = Number(source.slice(at, i));\n if (!Number.isFinite(v)) throw new FormulaError(\"This number is too large.\", at);\n tokens.push({ t: \"num\", v, at });\n continue;\n }\n if (isIdStart(c)) {\n while (isIdPart(source[i] ?? \"\")) i++;\n tokens.push({ t: \"id\", v: source.slice(at, i), at });\n continue;\n }\n if (c === '\"' || c === \"'\" || c === \"“\") {\n const close = c === \"“\" ? \"”\" : c;\n const end = source.indexOf(close, i + 1);\n if (end === -1) throw new FormulaError(\"This text has no closing quote.\", at);\n tokens.push({ t: \"str\", v: source.slice(i + 1, end), at });\n i = end + 1;\n continue;\n }\n const two = source.slice(i, i + 2);\n if (TWO_CHAR.has(two)) {\n tokens.push({ t: \"op\", v: two, at });\n i += 2;\n continue;\n }\n if (ONE_CHAR.has(c)) {\n tokens.push({ t: \"op\", v: OP_ALIASES[c] ?? c, at });\n i++;\n continue;\n }\n throw new FormulaError(`\"${c}\" can't be used in a formula.`, at);\n }\n tokens.push({ t: \"end\", at: source.length });\n return tokens;\n}\n\n/**\n * Parse a formula. Never throws: a mistake comes back as `{ ok: false,\n * message, at }`, with the character offset of the problem.\n */\nexport function parseFormula(source: string): FormulaParseResult {\n if (typeof source !== \"string\" || source.trim() === \"\") return { ok: false, message: \"Write a formula.\", at: 0 };\n if (source.length > MAX_FORMULA_LENGTH) {\n return { ok: false, message: `Keep the formula under ${MAX_FORMULA_LENGTH} characters.`, at: MAX_FORMULA_LENGTH };\n }\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch (e) {\n const err = e as FormulaError;\n return { ok: false, message: err.message, at: err.at };\n }\n let pos = 0;\n const refs: FormulaRef[] = [];\n const peek = () => tokens[pos]!;\n const isOp = (v: string) => {\n const tok = peek();\n return tok.t === \"op\" && tok.v === v;\n };\n const expect = (v: string, message: string) => {\n if (!isOp(v)) throw new FormulaError(message, peek().at);\n pos++;\n };\n const describe = (tok: Token) => (tok.t === \"end\" ? \"the formula ends there\" : `found \"${String(tok.v)}\"`);\n const guard = (depth: number) => {\n if (depth > MAX_DEPTH) throw new FormulaError(\"The formula is nested too deeply.\", peek().at);\n };\n\n const ternary = (depth: number): FormulaNode => {\n guard(depth);\n const test = comparison(depth);\n if (!isOp(\"?\")) return test;\n pos++;\n const then = ternary(depth + 1);\n expect(\":\", \"A `?` needs a `:` and the other value: `test ? a : b`.\");\n const otherwise = ternary(depth + 1);\n return { kind: \"if\", test, then, else: otherwise };\n };\n const comparison = (depth: number): FormulaNode => {\n const left = additive(depth);\n const tok = peek();\n if (tok.t !== \"op\" || !COMPARISONS.has(tok.v)) return left;\n pos++;\n const right = additive(depth);\n const next = peek();\n if (next.t === \"op\" && COMPARISONS.has(next.v)) {\n throw new FormulaError(\"Compare two values at a time; combine comparisons with `? :`.\", next.at);\n }\n return { kind: \"binary\", op: tok.v as BinaryOp, left, right };\n };\n const additive = (depth: number): FormulaNode => {\n let left = multiplicative(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"+\" || tok.v === \"-\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: multiplicative(depth) };\n }\n return left;\n };\n const multiplicative = (depth: number): FormulaNode => {\n let left = unary(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"*\" || tok.v === \"/\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: unary(depth) };\n }\n return left;\n };\n const unary = (depth: number): FormulaNode => {\n guard(depth);\n if (isOp(\"-\")) {\n pos++;\n return { kind: \"unary\", op: \"-\", arg: unary(depth + 1) };\n }\n if (isOp(\"+\")) {\n pos++;\n return unary(depth + 1);\n }\n return primary(depth);\n };\n const primary = (depth: number): FormulaNode => {\n const tok = peek();\n if (tok.t === \"num\") {\n pos++;\n return { kind: \"number\", value: tok.v };\n }\n if (tok.t === \"str\") {\n pos++;\n return { kind: \"text\", value: tok.v };\n }\n if (tok.t === \"op\" && tok.v === \"(\") {\n pos++;\n const inner = ternary(depth + 1);\n expect(\")\", \"A `(` has no matching `)`.\");\n return inner;\n }\n if (tok.t === \"id\") {\n pos++;\n if (isOp(\"(\")) {\n if (!(FORMULA_FUNCTIONS as readonly string[]).includes(tok.v)) {\n throw new FormulaError(`There is no function \"${tok.v}\"; use ${FORMULA_FUNCTIONS.join(\", \")}.`, tok.at);\n }\n pos++;\n const args: FormulaNode[] = [];\n if (!isOp(\")\")) {\n args.push(ternary(depth + 1));\n while (isOp(\",\")) {\n pos++;\n args.push(ternary(depth + 1));\n }\n }\n expect(\")\", `\"${tok.v}(\" has no matching \")\".`);\n if (!args.length) throw new FormulaError(`${tok.v}() needs something to work on.`, tok.at);\n return { kind: \"call\", fn: tok.v as FormulaFunction, args };\n }\n if (isOp(\".\")) {\n pos++;\n const column = peek();\n if (column.t !== \"id\") throw new FormulaError(`Name a column after \"${tok.v}.\".`, column.at);\n pos++;\n refs.push({ key: tok.v, column: column.v });\n return { kind: \"ref\", key: tok.v, column: column.v, at: tok.at };\n }\n refs.push({ key: tok.v });\n return { kind: \"ref\", key: tok.v, at: tok.at };\n }\n throw new FormulaError(`Expected a number, an answer or \"(\", but ${describe(tok)}.`, tok.at);\n };\n\n try {\n const ast = ternary(0);\n const rest = peek();\n if (rest.t !== \"end\") throw new FormulaError(`Expected an operator such as + or *, but ${describe(rest)}.`, rest.at);\n return { ok: true, ast, refs };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, message: e.message, at: e.at };\n return { ok: false, message: \"The formula is nested too deeply.\", at: 0 };\n }\n}\n\n/** The answers a formula names, each once (none when it doesn't parse). */\nexport function formulaRefs(source: string): FormulaRef[] {\n const parsed = parseFormula(source);\n if (!parsed.ok) return [];\n const seen = new Set<string>();\n return parsed.refs.filter((r) => {\n const id = `${r.key}\\u0000${r.column ?? \"\"}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n\n/**\n * The formula with every reference to the answer `from` renamed to `to`.\n * Column names, function names and text are left alone. Returned unchanged\n * when it has a character a formula can't hold.\n */\nexport function renameFormulaKey(source: string, from: string, to: string): string {\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch {\n return source;\n }\n let out = \"\";\n let last = 0;\n tokens.forEach((tok, i) => {\n if (tok.t !== \"id\" || tok.v !== from) return;\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (prev?.t === \"op\" && prev.v === \".\") return;\n if (next?.t === \"op\" && next.v === \"(\") return;\n out += source.slice(last, tok.at) + to;\n last = tok.at + from.length;\n });\n return out + source.slice(last);\n}\n\n// ── Evaluation ───────────────────────────────────────────────────────────────\n\nconst NUMERIC = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\n\n/** A value as a number: numbers, numeric text (\"1,200\" too), yes / no as 1 / 0. Anything else is blank (`null`). */\nexport function formulaNumber(v: FormulaValue | Json | undefined): number | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (typeof v === \"string\") {\n const t = v.trim().replace(/,/g, \"\");\n return t.length <= 64 && NUMERIC.test(t) ? finite(Number(t)) : null;\n }\n return null;\n}\n\nconst finite = (n: number): number | null => (Number.isFinite(n) ? n : null);\n/** A list in arithmetic is blank: add one up with `sum(...)`. */\nconst scalar = (v: FormulaValue): FormulaValue => (Array.isArray(v) ? null : v);\n\nfunction truthy(v: FormulaValue): boolean {\n if (v === null) return false;\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"number\") return v !== 0;\n if (typeof v === \"string\") return v.trim() !== \"\";\n return v.length > 0;\n}\n\nfunction numbersIn(values: FormulaValue[], out: number[] = []): number[] {\n for (const v of values) {\n if (Array.isArray(v)) numbersIn(v, out);\n else {\n const n = formulaNumber(v);\n if (n !== null) out.push(n);\n }\n }\n return out;\n}\n\ninterface Totals {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\n/**\n * Each list's numbers added up once, for the lists this package built and\n * froze itself (the calculator's lists, one per answer and column), so a\n * formula worked out again over an unchanged table doesn't walk it again.\n * Any other list a reader returns may change in place, so it is added up\n * every time.\n */\nconst listTotals = new WeakMap<readonly FormulaValue[], Totals>();\nconst ownLists = new WeakSet<readonly FormulaValue[]>();\n\n/** Mark a frozen list built inside this package as safe to keep totals for (not exported from the package). */\nexport function ownFormulaList(list: FormulaValue[]): readonly FormulaValue[] {\n Object.freeze(list);\n ownLists.add(list);\n return list;\n}\n\nfunction totalsOf(list: readonly FormulaValue[]): Totals {\n const own = ownLists.has(list);\n let t = own ? listTotals.get(list) : undefined;\n if (t) return t;\n const nums = numbersIn(list as FormulaValue[]);\n t = { sum: 0, count: nums.length, min: Infinity, max: -Infinity };\n for (const n of nums) {\n t.sum += n;\n if (n < t.min) t.min = n;\n if (n > t.max) t.max = n;\n }\n if (own) listTotals.set(list, t);\n return t;\n}\n\nfunction compare(op: BinaryOp, a: FormulaValue, b: FormulaValue): boolean {\n const blank = (v: FormulaValue) => v === null || Array.isArray(v) || (typeof v === \"string\" && v.trim() === \"\");\n // A blank equals nothing: `!=` holds and every other comparison fails.\n if (blank(a) || blank(b)) return op === \"!=\";\n const x = formulaNumber(a);\n const y = formulaNumber(b);\n if (x !== null && y !== null) {\n if (op === \"==\") return x === y;\n if (op === \"!=\") return x !== y;\n if (op === \"<\") return x < y;\n if (op === \"<=\") return x <= y;\n if (op === \">\") return x > y;\n return x >= y;\n }\n // Text is equal or not; it has no order.\n if (op === \"==\") return String(a) === String(b);\n if (op === \"!=\") return String(a) !== String(b);\n return false;\n}\n\n/** Reads an answer for `evaluateFormula`: its value, or `null` when unanswered or unknown. */\nexport type FormulaReader = (ref: FormulaRef) => FormulaValue;\n\n/** Evaluate a parsed formula. Never throws; a value it can't work out is `null`. */\nexport function evaluateFormula(ast: FormulaNode, read: FormulaReader): FormulaValue {\n const run = (node: FormulaNode): FormulaValue => {\n switch (node.kind) {\n case \"number\":\n case \"text\":\n return node.value;\n case \"ref\":\n // The node itself: a reader may key on it, and it is never changed.\n return read(node);\n case \"unary\": {\n const n = formulaNumber(scalar(run(node.arg)));\n return n === null ? null : -n;\n }\n case \"if\":\n return truthy(run(node.test)) ? run(node.then) : run(node.else);\n case \"call\": {\n let total = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const arg of node.args) {\n const v = run(arg);\n if (Array.isArray(v)) {\n const t = totalsOf(v);\n total += t.sum;\n count += t.count;\n if (t.min < min) min = t.min;\n if (t.max > max) max = t.max;\n continue;\n }\n const n = formulaNumber(v);\n if (n === null) continue;\n total += n;\n count++;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n if (node.fn === \"sum\") return finite(total);\n if (!count) return null;\n if (node.fn === \"avg\") return finite(total / count);\n return node.fn === \"min\" ? min : max;\n }\n case \"binary\": {\n const a = run(node.left);\n const b = run(node.right);\n if (node.op === \"+\" || node.op === \"-\" || node.op === \"*\" || node.op === \"/\") {\n const x = formulaNumber(scalar(a));\n const y = formulaNumber(scalar(b));\n if (x === null || y === null) return null;\n if (node.op === \"+\") return finite(x + y);\n if (node.op === \"-\") return finite(x - y);\n if (node.op === \"*\") return finite(x * y);\n return y === 0 ? null : finite(x / y);\n }\n return compare(node.op, a, b);\n }\n }\n };\n try {\n return run(ast);\n } catch {\n return null;\n }\n}\n","import type { FieldTypeManifest } from \"./fields\";\nimport { evaluateFormula, formulaNumber, ownFormulaList, parseFormula, type FormulaNode, type FormulaRef, type FormulaValue } from \"./formula\";\nimport type { FieldBlock, FormDefinition, Json, Operator } from \"./types\";\n\n/** The calculated field type's registry key. */\nexport const CALCULATED_TYPE = \"calculated\";\n\n/**\n * Field types the builder offers only to a host that names them in its\n * palette, like `STRUCTURED_FIELD_TYPES`: `calculated` shows a value worked\n * out from other answers, so it is opt-in for hosts that want formulas.\n */\nexport const COMPUTED_FIELD_TYPES = [CALCULATED_TYPE] as const;\n\nexport type CalculatedFormat = \"number\" | \"percent\" | \"text\";\n/** Longest the formulas of one form may be, all together (`parseForm` checks it). */\nexport const MAX_FORM_FORMULA_LENGTH = 20_000;\n/** Most decimal places a calculated value may keep. */\nexport const MAX_CALCULATED_DECIMALS = 10;\n\nexport interface CalculatedProps {\n formula: string;\n format?: CalculatedFormat | undefined;\n decimals?: number | undefined;\n}\n\n/** A calculated field's settings, with anything malformed left out. */\nexport function calculatedProps(field: FieldBlock): CalculatedProps {\n const p = field.props ?? {};\n const out: CalculatedProps = { formula: typeof p.formula === \"string\" ? p.formula : \"\" };\n if (p.format === \"number\" || p.format === \"percent\" || p.format === \"text\") out.format = p.format;\n if (typeof p.decimals === \"number\" && Number.isInteger(p.decimals) && p.decimals >= 0 && p.decimals <= MAX_CALCULATED_DECIMALS) {\n out.decimals = p.decimals;\n }\n return out;\n}\n\nexport const isCalculated = (field: FieldBlock | undefined): boolean => field?.type === CALCULATED_TYPE;\n\nconst round = (n: number, decimals: number | undefined) => {\n if (decimals === undefined) return n;\n const r = Number(n.toFixed(decimals));\n return Object.is(r, -0) ? 0 : r;\n};\n\n/**\n * What a formula's result is stored as. `number` and `percent` keep a number\n * (`0.25` for 25%), rounded to `decimals`; `text` keeps text. Without a\n * format, numbers, text and true / false are kept as they are. A list, and\n * anything the format can't hold, is no value (`undefined`).\n */\nexport function calculatedValue(result: FormulaValue, field: FieldBlock): Json | undefined {\n const { format, decimals } = calculatedProps(field);\n if (result === null || Array.isArray(result)) return undefined;\n if (format === \"number\" || format === \"percent\") {\n const n = formulaNumber(result);\n return n === null ? undefined : round(n, decimals);\n }\n if (format === \"text\") {\n if (typeof result === \"number\") return decimals === undefined ? String(result) : result.toFixed(decimals);\n return typeof result === \"boolean\" ? (result ? \"Yes\" : \"No\") : result;\n }\n return typeof result === \"number\" ? round(result, decimals) : result;\n}\n\n/** A calculated value as shown: `12.5`, `25%`, the text, Yes / No. Empty when there is none. */\nexport function formatCalculated(value: Json | undefined, field: FieldBlock): string {\n if (value === undefined || value === null) return \"\";\n const { format, decimals } = calculatedProps(field);\n const fixed = (n: number) => (decimals === undefined ? String(Number(n.toFixed(6))) : n.toFixed(decimals));\n if (typeof value === \"number\") return format === \"percent\" ? `${fixed(value * 100)}%` : fixed(value);\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return typeof value === \"string\" ? value : \"\";\n}\n\n/**\n * Most items a formula reads from one answer (a list's items, a table's\n * rows). A longer answer reads as blank, so one oversized value sent to the\n * server can't make every formula over it slow.\n */\nexport const MAX_FORMULA_ITEMS = 10_000;\n\n/**\n * Most list items and table rows all of a form's formulas read in one go\n * (each answer and column counted once, in form order). A formula that reads\n * an answer past the limit, or one over `MAX_FORMULA_ITEMS`, has no value\n * (blank, never a partial total), so many big answers can't make working\n * the values out slow either.\n */\nexport const MAX_SETTLE_ITEMS = 50_000;\n\nconst extract = (value: readonly Json[], column: string | undefined): FormulaValue[] =>\n column !== undefined\n ? value.flatMap((row): FormulaValue[] => {\n if (!row || typeof row !== \"object\" || Array.isArray(row)) return [];\n const cell = row[column];\n return typeof cell === \"string\" || typeof cell === \"number\" ? [cell] : [];\n })\n : value.flatMap((v): FormulaValue[] => (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\" ? [v] : []));\n\n/**\n * The calculator's lists, by the answer's array and then the column (`\"\"`\n * for a list's own items), so an unchanged table is walked once. This relies\n * on answers being immutable, which the engine guarantees: it never changes a\n * value it holds (every update spreads a new `values`), the built-in\n * renderers always pass a new array, and `setValue` with the array already\n * held is ignored. A host must not change an answer array in place either\n * (see the README); pass a new one to `setValue`.\n */\nconst extracted = new WeakMap<readonly Json[], Map<string, readonly FormulaValue[]>>();\n\nfunction cachedList(value: readonly Json[], column: string | undefined): readonly FormulaValue[] {\n let byColumn = extracted.get(value);\n if (!byColumn) extracted.set(value, (byColumn = new Map()));\n const key = column ?? \"\";\n let list = byColumn.get(key);\n if (!list) byColumn.set(key, (list = ownFormulaList(extract(value, column))));\n return list;\n}\n\n/** `formulaInput` for the calculator: the same values, with lists kept per answer (see `cachedList`). */\nfunction readAnswer(value: Json | undefined, column: string | undefined): FormulaValue {\n if (Array.isArray(value)) return cachedList(value, column) as FormulaValue[];\n return column !== undefined ? null : formulaInput(value);\n}\n\n/**\n * The value a formula reads for an answer: numbers and text as they are, a\n * list's items, one table column's cells. A list or table of more than\n * `MAX_FORMULA_ITEMS` reads as blank. Each call builds a new list.\n */\nexport function formulaInput(value: Json | undefined, column?: string): FormulaValue {\n if (value === undefined || value === null) return null;\n if (Array.isArray(value) && value.length > MAX_FORMULA_ITEMS) return null;\n if (column !== undefined) {\n if (!Array.isArray(value)) return null;\n return extract(value, column);\n }\n if (Array.isArray(value)) return extract(value, undefined);\n return typeof value === \"object\" ? null : value;\n}\n\ninterface Compiled {\n field: FieldBlock;\n ast: FormulaNode | null;\n /** The answers it reads, each (answer, column) once (`id` is `undefined` for a key that is not a field). */\n reads: Read[];\n /** Each `ref` node of the formula, to its index in `reads`. */\n slots: Map<FormulaNode, number>;\n /** The inputs of the last evaluation and its result, reused while they are the same values. */\n last: { inputs: unknown[]; value: Json | undefined } | null;\n}\n\ninterface Read {\n id: string | undefined;\n column: string | undefined;\n /** `id` and `column` as one key, for the settle's item count. */\n key: string;\n}\n\nfunction refNodes(node: FormulaNode, out: Extract<FormulaNode, { kind: \"ref\" }>[] = []) {\n if (node.kind === \"ref\") out.push(node);\n else if (node.kind === \"unary\") refNodes(node.arg, out);\n else if (node.kind === \"binary\") (refNodes(node.left, out), refNodes(node.right, out));\n else if (node.kind === \"if\") (refNodes(node.test, out), refNodes(node.then, out), refNodes(node.else, out));\n else if (node.kind === \"call\") for (const a of node.args) refNodes(a, out);\n return out;\n}\n\n/** Stands for an answer that is off the path or unanswered. */\nconst UNREAD = Symbol(\"unread\");\n/** Stands for an answer too big to read: over `MAX_FORMULA_ITEMS`, or past `MAX_SETTLE_ITEMS`. */\nconst OVER = Symbol(\"over\");\n\n/**\n * Works out a form's calculated fields from its answers. `withCalculated`\n * returns `values` itself when nothing changed. Each formula reads the\n * answers on `path` only (an answer logic hides reads as blank) and the\n * calculated fields before it, in form order.\n */\nexport function calculator(definition: FormDefinition) {\n const compiled: Compiled[] = [];\n const idByKey = new Map<string, string>();\n for (const block of definition.blocks) {\n if (block.kind !== \"field\") continue;\n idByKey.set(block.key, block.id);\n }\n for (const block of definition.blocks) {\n if (block.kind !== \"field\" || !isCalculated(block)) continue;\n const parsed = parseFormula(calculatedProps(block).formula);\n const reads: Read[] = [];\n const slots = new Map<FormulaNode, number>();\n const byKey = new Map<string, number>();\n for (const ref of parsed.ok ? refNodes(parsed.ast) : []) {\n const id = idByKey.get(ref.key);\n const key = `${id ?? \"\"}\\u0000${ref.column ?? \"\"}`;\n let slot = byKey.get(key);\n if (slot === undefined) {\n slot = reads.push({ id, column: ref.column, key }) - 1;\n byKey.set(key, slot);\n }\n slots.set(ref, slot);\n }\n compiled.push({ field: block, ast: parsed.ok ? parsed.ast : null, reads, slots, last: null });\n }\n const withCalculated = (values: Record<string, Json | undefined>, path: readonly string[]) => {\n if (!compiled.length) return values;\n const visible = new Set(path);\n let next = values;\n // The items every formula may read, together: each list answer and table\n // column counts once, in form order, and one past the limit reads as blank.\n // It depends on the answers only, so a client and the server agree.\n let budget = MAX_SETTLE_ITEMS;\n const within = new Map<string, boolean>();\n const input = ({ id, key }: Read): unknown => {\n if (id === undefined || !visible.has(id) || !Object.prototype.hasOwnProperty.call(next, id)) return UNREAD;\n const value = next[id];\n if (!Array.isArray(value)) return value;\n let ok = within.get(key);\n if (ok === undefined) {\n // An answer over the per-answer limit is never read, so it uses none of the allowance.\n ok = value.length <= MAX_FORMULA_ITEMS && value.length <= budget;\n if (ok) budget -= value.length;\n within.set(key, ok);\n }\n return ok ? value : OVER;\n };\n for (const entry of compiled) {\n const { field, ast } = entry;\n // A formula is worked out again only when an answer it reads is a different value:\n // an engine settles on every answer, and most answers are to other questions.\n const inputs = entry.reads.map(input);\n let value: Json | undefined;\n if (entry.last && entry.last.inputs.length === inputs.length && entry.last.inputs.every((v, i) => v === inputs[i])) {\n value = entry.last.value;\n } else {\n const resolved: (FormulaValue | undefined)[] = new Array(inputs.length);\n const read = (ref: FormulaRef): FormulaValue => {\n const slot = entry.slots.get(ref as FormulaNode);\n if (slot === undefined) return null;\n let v = resolved[slot];\n if (v === undefined) {\n const raw = inputs[slot];\n v = resolved[slot] = raw === UNREAD ? null : readAnswer(raw as Json | undefined, entry.reads[slot]!.column);\n }\n return v;\n };\n // An answer too big to read leaves the value blank rather than a partial total.\n value = ast && !inputs.includes(OVER) ? calculatedValue(evaluateFormula(ast, read), field) : undefined;\n entry.last = { inputs, value };\n }\n const current = Object.prototype.hasOwnProperty.call(next, field.id) ? next[field.id] : undefined;\n if (current !== value) next = { ...next, [field.id]: value };\n }\n return next;\n };\n return { active: compiled.length > 0, withCalculated };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\n\nexport const calculatedFieldType: FieldTypeManifest = {\n type: CALCULATED_TYPE,\n label: \"Calculated\",\n category: \"advanced\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"control\" },\n // The engine works the value out; any number, text or true / false it made is valid.\n validate: (value) => (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\" ? null : \"This value is worked out from other answers.\"),\n summarize: (value, field) => formatCalculated(value, field),\n};\n","import type { FieldTypeManifest } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\ntype JsonObject = { [key: string]: Json };\nconst isObject = (v: unknown): v is JsonObject => !!v && typeof v === \"object\" && !Array.isArray(v);\nfunction intProp(field: FieldBlock, name: string, fallback: number, floor = 1): number {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : fallback;\n}\nfunction optionalIntProp(field: FieldBlock, name: string, floor = 0): number | undefined {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : undefined;\n}\nconst blank = (v: unknown) => typeof v !== \"string\" || v.trim() === \"\";\n/**\n * Unanswered: nothing, or a list whose every entry is a blank one. Anything\n * else (a string, a list with a malformed entry) is an answer, so validation\n * rejects it instead of dropping it silently.\n */\nconst blankText = (v: unknown) => typeof v === \"string\" && v.trim() === \"\";\nconst emptyList = (value: Json | undefined, isBlank: (entry: Json) => boolean) =>\n value === undefined || value === null || (Array.isArray(value) && value.every(isBlank));\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nexport function listLimits(field: FieldBlock) {\n return { min: optionalIntProp(field, \"min\") ?? 0, max: intProp(field, \"max\", 10), itemMaxLength: intProp(field, \"itemMaxLength\", 500) };\n}\nconst listItems = (value: Json | undefined): string[] =>\n Array.isArray(value) ? value.filter((v): v is string => typeof v === \"string\" && v.trim() !== \"\") : [];\n\nexport interface TableColumn { key: string; label: string; long?: boolean }\nexport const MAX_TABLE_COLUMNS = 6;\nexport const MAX_TABLE_CELL_LENGTH = 2000;\nexport function tableColumns(field: FieldBlock): TableColumn[] {\n const raw = field.props?.columns;\n if (!Array.isArray(raw)) return [];\n const seen = new Set<string>();\n const out: TableColumn[] = [];\n for (const c of raw) {\n if (!isObject(c) || typeof c.key !== \"string\" || !c.key || seen.has(c.key)) continue;\n seen.add(c.key);\n const column: TableColumn = { key: c.key, label: typeof c.label === \"string\" ? c.label : c.key };\n if (c.long === true) column.long = true;\n out.push(column);\n }\n return out;\n}\nexport function tableLimits(field: FieldBlock) {\n return { minRows: optionalIntProp(field, \"minRows\") ?? 0, maxRows: intProp(field, \"maxRows\", 3) };\n}\nconst filledRows = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((r): r is JsonObject => isObject(r) && Object.values(r).some((c) => !blank(c))) : [];\n\nexport interface MediaNote { at: number; text: string }\nexport const MAX_TIMESTAMP_SECONDS = 86400;\nexport function formatTimestamp(seconds: number): string {\n const total = Number.isFinite(seconds) && seconds > 0 ? Math.floor(seconds) : 0;\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = String(total % 60).padStart(2, \"0\");\n return h ? `${h}:${String(m).padStart(2, \"0\")}:${s}` : `${m}:${s}`;\n}\nexport function parseTimestamp(text: string): number | null {\n const t = text.trim();\n if (!t) return null;\n const parts = t.split(\":\");\n if (parts.length > 3) return null;\n if (parts.length === 1) {\n if (!/^\\d+(\\.\\d+)?$/.test(t)) return null;\n const n = Number(t);\n return n <= MAX_TIMESTAMP_SECONDS ? n : null;\n }\n const last = parts.length - 1;\n let total = 0;\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i]!;\n const ok = i === 0 ? /^\\d+$/.test(p) : i === last ? /^\\d{2}(\\.\\d+)?$/.test(p) : /^\\d{2}$/.test(p);\n if (!ok) return null;\n const n = Number(p);\n if (i > 0 && n >= 60) return null;\n total = total * 60 + n;\n }\n return total <= MAX_TIMESTAMP_SECONDS ? total : null;\n}\nconst isTimestamp = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v) && v >= 0 && v <= MAX_TIMESTAMP_SECONDS;\nconst notesWithText = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((n): n is JsonObject => isObject(n) && !blank(n.text)) : [];\n\nexport interface Highlight { start: number; end: number; quote: string; note: string }\nexport const MAX_HIGHLIGHT_NOTE_LENGTH = 1000;\n/** The longest passage one highlight may quote; also bounds a quote the server can't check against `props.text`. */\nexport const MAX_HIGHLIGHT_QUOTE_LENGTH = 2000;\nexport const HIGHLIGHT_NOTE_MESSAGE = \"Add a note to each highlight.\";\nconst sourceText = (field: FieldBlock) => (typeof field.props?.text === \"string\" && field.props.text ? field.props.text : undefined);\n\n/**\n * The structured field types, whose answers are lists or records rather than one\n * value:\n * - `list`: several short answers, e.g. goals, action items, three things that went well.\n * - `table`: a small table each answer fills row by row, e.g. an action plan\n * (What / Who / By when), pros and cons.\n * - `media-notes`: notes pinned to times in a video or audio, e.g. lecture notes,\n * a recorded call review.\n * - `text-highlights`: highlight passages of a text and note on each, e.g.\n * annotating an article, a policy or a contract.\n *\n * They are registered like any other, but the builder offers them only to a\n * host that names them in its palette (`FormBuilder palette`), so forms that\n * never had them don't change.\n */\nexport const STRUCTURED_FIELD_TYPES = [\"list\", \"table\", \"media-notes\", \"text-highlights\"] as const;\n\nexport const structuredFieldTypes: FieldTypeManifest[] = [\n {\n type: \"list\", label: \"List\", category: \"text\", value: { json: true },\n // logic.ts `contains` on an array is exact item equality, same as multi-choice, so it is offered.\n operators: [\"contains\", \"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, blankText),\n validate: (value, field) => {\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) return \"Enter a list of answers.\";\n const { min, max, itemMaxLength } = listLimits(field);\n if (value.some((v) => (v as string).trim().length > itemMaxLength)) return `Keep each item under ${itemMaxLength} characters.`;\n const count = listItems(value).length;\n if (count < min) return `Add at least ${plural(min, \"item\")}.`;\n if (count > max) return `Add at most ${plural(max, \"item\")}.`;\n return null;\n },\n normalize: (value) => (Array.isArray(value) ? listItems(value).map((v) => v.trim()) : value),\n summarize: (value) => listItems(value).map((v) => v.trim()).join(\"; \"),\n samples: (field) => {\n const { min, max } = listLimits(field);\n return [Array.from({ length: Math.min(Math.max(1, min), max) }, (_, i) => `Item ${i + 1}`)];\n },\n },\n {\n type: \"table\", label: \"Table\", category: \"advanced\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (r) => isObject(r) && Object.values(r).every(blankText)),\n validate: (value, field) => {\n const columns = tableColumns(field);\n if (!columns.length) return \"This question has no columns.\";\n if (!Array.isArray(value) || !value.every(isObject)) return \"Fill in the rows.\";\n const keys = new Set(columns.map((c) => c.key));\n for (const row of value as JsonObject[]) {\n for (const [key, cell] of Object.entries(row)) {\n if (!keys.has(key)) return \"An answer names a column this question doesn't have.\";\n if (typeof cell !== \"string\") return \"Fill in the rows with text.\";\n if (cell.trim().length > MAX_TABLE_CELL_LENGTH) return `Keep each answer under ${MAX_TABLE_CELL_LENGTH} characters.`;\n }\n }\n const { minRows, maxRows } = tableLimits(field);\n const count = filledRows(value).length;\n if (count < minRows) return `Fill in at least ${plural(minRows, \"row\")}.`;\n if (count > maxRows) return `Fill in at most ${plural(maxRows, \"row\")}.`;\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? filledRows(value).map((row) => {\n const out: JsonObject = {};\n for (const [key, cell] of Object.entries(row)) if (typeof cell === \"string\") out[key] = cell.trim();\n return out;\n })\n : value,\n summarize: (value, field) => {\n const columns = tableColumns(field);\n return filledRows(value)\n .map((row) => columns.filter((c) => !blank(row[c.key])).map((c) => `${c.label}: ${(row[c.key] as string).trim()}`).join(\" · \"))\n .join(\" / \");\n },\n samples: (field) => {\n const columns = tableColumns(field);\n if (!columns.length) return [];\n const { minRows, maxRows } = tableLimits(field);\n const row = Object.fromEntries(columns.map((c) => [c.key, \"sample\"]));\n return [Array.from({ length: Math.min(Math.max(1, minRows), maxRows) }, () => ({ ...row }))];\n },\n },\n {\n type: \"media-notes\", label: \"Notes at moments\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (n) => isObject(n) && blankText(n.text)),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Add notes.\";\n const textMaxLength = intProp(field, \"textMaxLength\", 1000);\n for (const note of value) {\n if (!isObject(note) || typeof note.text !== \"string\") return \"Add notes.\";\n if (!isTimestamp(note.at)) return \"Each note needs a time.\";\n if (note.text.trim().length > textMaxLength) return `Keep each note under ${textMaxLength} characters.`;\n }\n const maxNotes = intProp(field, \"maxNotes\", 20);\n return notesWithText(value).length > maxNotes ? `Add at most ${plural(maxNotes, \"note\")}.` : null;\n },\n normalize: (value) => Array.isArray(value)\n ? notesWithText(value).map((n) => ({ at: n.at as number, text: (n.text as string).trim() })).sort((a, b) => a.at - b.at)\n : value,\n summarize: (value) => notesWithText(value)\n .map((n) => ({ at: typeof n.at === \"number\" ? n.at : 0, text: (n.text as string).trim() }))\n .sort((a, b) => a.at - b.at)\n .map((n) => `${formatTimestamp(n.at)} ${n.text}`)\n .join(\"; \"),\n samples: () => [[{ at: 0, text: \"sample\" }]],\n },\n {\n type: \"text-highlights\", label: \"Highlights\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, () => false),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Highlight a passage.\";\n const maxHighlights = intProp(field, \"maxHighlights\", 20);\n if (value.length > maxHighlights) return `Add at most ${plural(maxHighlights, \"highlight\")}.`;\n const text = sourceText(field);\n for (const h of value) {\n if (!isObject(h) || !Number.isInteger(h.start) || !Number.isInteger(h.end) || typeof h.quote !== \"string\" || typeof h.note !== \"string\") {\n return \"Highlight a passage of the text.\";\n }\n const start = h.start as number;\n const end = h.end as number;\n if (start < 0 || end <= start || h.quote.length !== end - start) return \"Highlight a passage of the text.\";\n if (end - start > MAX_HIGHLIGHT_QUOTE_LENGTH) return `Highlight under ${MAX_HIGHLIGHT_QUOTE_LENGTH} characters at a time.`;\n if (text !== undefined && (end > text.length || text.slice(start, end) !== h.quote)) return \"A highlight doesn't match the text.\";\n if (h.note.trim() === \"\") return HIGHLIGHT_NOTE_MESSAGE;\n if (h.note.trim().length > MAX_HIGHLIGHT_NOTE_LENGTH) return `Keep each note under ${MAX_HIGHLIGHT_NOTE_LENGTH} characters.`;\n }\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? value.filter(isObject)\n .map((h) => ({ start: h.start as number, end: h.end as number, quote: h.quote as string, note: String(h.note).trim() }))\n .sort((a, b) => a.start - b.start || a.end - b.end)\n : value,\n summarize: (value) => Array.isArray(value)\n ? value.filter(isObject).map((h) => `\"${String(h.quote)}\" — ${String(h.note).trim()}`).join(\"; \")\n : \"\",\n samples: (field) => {\n const text = sourceText(field);\n if (text === undefined) return [[{ start: 0, end: 6, quote: \"sample\", note: \"sample\" }]];\n const end = Math.min(text.length, 20);\n return [[{ start: 0, end, quote: text.slice(0, end), note: \"sample\" }]];\n },\n },\n];\n","import type { Block, FieldBlock, Json, Operator } from \"./types\";\nimport { calculatedFieldType } from \"./calculated\";\nimport { structuredFieldTypes } from \"./structured\";\n\n/**\n * A field type, without any UI. Renderers are registered separately per\n * platform (`genesis-forms-react`), so a manifest runs anywhere.\n */\nexport interface FieldTypeManifest {\n type: string;\n label: string;\n category: \"text\" | \"choice\" | \"scale\" | \"date\" | \"media\" | \"advanced\";\n /** `json: false` types must convert, so drafts and server replay never lose an answer. */\n value:\n | { json: true }\n | { json: false; serialize: (value: unknown) => Json; deserialize: (json: Json) => unknown };\n operators: Operator[];\n a11y: {\n semantics: \"control\" | \"group\";\n /** The HTML `autocomplete` token, such as `\"email\"` or `\"tel\"`. */\n autocomplete?: string;\n /** The HTML `inputmode` hint for on-screen keyboards, such as `\"email\"` or `\"tel\"`. */\n inputMode?: \"text\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\" | \"url\" | \"search\";\n };\n isEmpty?: (value: Json | undefined) => boolean;\n /** Return an error message, or null when the (non-empty) value is valid. */\n validate?: (value: Json, field: FieldBlock) => string | null;\n /** Plain text for recall, exports and emails. */\n summarize?: (value: Json, field: FieldBlock) => string;\n /**\n * The form a (valid, non-empty) value is stored in, such as an email\n * without surrounding spaces. Applied by `engine.answers()` and the server.\n */\n normalize?: (value: Json, field: FieldBlock) => Json;\n /** Valid example answers, used by `coverage()` and other test tools to explore a path. */\n samples?: (field: FieldBlock) => Json[];\n}\n\n// One registry per process, shared by every entry point (index, server,\n// testing are bundled separately), so a plugin registered once is seen by all.\nconst REGISTRY = Symbol.for(\"@marktiderman/genesis-forms/field-types\");\nconst globalScope = globalThis as typeof globalThis & { [REGISTRY]?: Map<string, FieldTypeManifest> };\nconst registry: Map<string, FieldTypeManifest> = (globalScope[REGISTRY] ??= new Map());\n\nexport function registerFieldType(manifest: FieldTypeManifest): void {\n if (!manifest.type) throw new Error(\"registerFieldType: a field type needs a `type`.\");\n const value = manifest.value as { json: boolean; serialize?: unknown; deserialize?: unknown };\n if (\n !value.json &&\n (typeof value.serialize !== \"function\" || typeof value.deserialize !== \"function\")\n ) {\n throw new Error(\n `registerFieldType: \"${manifest.type}\" stores a non-JSON value, so it must provide both serialize and deserialize.`,\n );\n }\n registry.set(manifest.type, manifest);\n}\n\nexport function getFieldType(type: string): FieldTypeManifest | undefined {\n return registry.get(type);\n}\n\nexport function listFieldTypes(): FieldTypeManifest[] {\n return [...registry.values()];\n}\n\nexport function isEmptyValue(value: Json | undefined, field?: FieldBlock): boolean {\n const manifest = field ? registry.get(field.type) : undefined;\n if (manifest?.isEmpty) return manifest.isEmpty(value);\n if (value === undefined || value === null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/** A value in its stored form (see `FieldTypeManifest.normalize`). */\nexport function normalizeValue(value: Json, field: FieldBlock): Json {\n const manifest = registry.get(field.type);\n return manifest?.normalize ? manifest.normalize(value, field) : value;\n}\n\n/** Whether a block holds personal or secret data: `sensitive: true`, or the `props.sensitive: true` alias. */\nexport function isSensitive(block: Block): boolean {\n return block.kind === \"field\" && (block.sensitive === true || block.props?.sensitive === true);\n}\n\nexport function summarizeValue(value: Json | undefined, field: FieldBlock): string {\n if (isEmptyValue(value, field)) return \"\";\n const manifest = registry.get(field.type);\n if (manifest?.summarize) return manifest.summarize(value as Json, field);\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n\n// ── Built-in types (R1) ──────────────────────────────────────────────────────\n\nexport interface ChoiceOption {\n value: string;\n label?: string;\n}\n\nexport function choiceOptions(field: FieldBlock): ChoiceOption[] {\n const raw = field.props?.options;\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((o) =>\n o && typeof o === \"object\" && !Array.isArray(o) && typeof o.value === \"string\"\n ? [{ value: o.value, label: typeof o.label === \"string\" ? o.label : undefined }]\n : [],\n );\n}\n\nfunction optionLabel(field: FieldBlock, value: string): string {\n const option = choiceOptions(field).find((o) => o.value === value);\n return option?.label ?? value;\n}\n\nfunction intRange(field: FieldBlock, min: number, maxDefault: number) {\n const max = typeof field.props?.max === \"number\" ? field.props.max : maxDefault;\n return { min, max };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\nconst textOps: Operator[] = [\"eq\", \"neq\", \"contains\", \"answered\", \"empty\"];\n\nfunction maxLength(field: FieldBlock, fallback: number): number {\n return typeof field.props?.maxLength === \"number\" ? field.props.maxLength : fallback;\n}\n\nfunction textValidate(fallback: number) {\n return (value: Json, field: FieldBlock) => {\n if (typeof value !== \"string\") return \"Enter text.\";\n const limit = maxLength(field, fallback);\n return value.length > limit ? `Keep it under ${limit} characters.` : null;\n };\n}\n\n/** The longest address SMTP allows (RFC 5321). */\nconst MAX_EMAIL_LENGTH = 254;\n\n/**\n * `local@domain.tld`: no spaces, exactly one `@`, and a dot inside the domain.\n * A linear scan rather than a regex, so a hostile value cannot backtrack.\n */\nexport function isEmailAddress(value: string): boolean {\n if (value.length > MAX_EMAIL_LENGTH || /\\s/.test(value)) return false;\n const at = value.indexOf(\"@\");\n if (at < 1 || value.indexOf(\"@\", at + 1) !== -1) return false;\n const domain = value.slice(at + 1);\n // A dot with at least one character on each side.\n return domain.slice(1, -1).includes(\".\");\n}\n\n/** Longest phone number accepted, separators included. */\nconst MAX_PHONE_LENGTH = 32;\n\n/**\n * Digits with optional separators (spaces, `-`, `(`, `)`, `.`) and an\n * optional leading `+`; 7 to 15 digits (E.164 allows at most 15). One linear scan.\n */\nfunction isPhoneNumber(value: string): boolean {\n if (value.length > MAX_PHONE_LENGTH) return false;\n let digits = 0;\n for (let i = 0; i < value.length; i++) {\n const c = value[i]!;\n if (c >= \"0\" && c <= \"9\") digits++;\n else if (c === \"+\") {\n if (i !== 0) return false;\n } else if (c !== \" \" && c !== \"-\" && c !== \"(\" && c !== \")\" && c !== \".\") return false;\n }\n return digits >= 7 && digits <= 15;\n}\n\nconst builtins: FieldTypeManifest[] = [\n {\n type: \"short-text\",\n label: \"Short text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(500),\n },\n {\n type: \"long-text\",\n label: \"Long text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(5000),\n },\n {\n type: \"email\",\n label: \"Email\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\", autocomplete: \"email\", inputMode: \"email\" },\n validate: (value) =>\n typeof value === \"string\" && isEmailAddress(value.trim())\n ? null\n : \"Enter an email address like name@example.com.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n },\n {\n type: \"phone\",\n label: \"Phone\",\n category: \"text\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\", autocomplete: \"tel\", inputMode: \"tel\" },\n validate: (value) =>\n typeof value === \"string\" && isPhoneNumber(value.trim())\n ? null\n : \"Enter a phone number with 7 to 15 digits.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n summarize: (value) => String(value),\n },\n {\n type: \"rating\",\n label: \"Rating\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const { min, max } = intRange(field, 1, 5);\n return Number.isInteger(value) && (value as number) >= min && (value as number) <= max\n ? null\n : `Choose a rating from ${min} to ${max}.`;\n },\n summarize: (value, field) => {\n const { max } = intRange(field, 1, 5);\n const end = scaleEndLabel(field, value as number, 1, max);\n return end ? `${value}/${max} (${end})` : `${value}/${max}`;\n },\n },\n {\n type: \"nps\",\n label: \"Net Promoter Score\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value) =>\n Number.isInteger(value) && (value as number) >= 0 && (value as number) <= 10\n ? null\n : \"Choose a score from 0 to 10.\",\n summarize: (value, field) => {\n const end = scaleEndLabel(field, value as number, 0, 10);\n return end ? `${value}/10 (${end})` : `${value}/10`;\n },\n },\n {\n type: \"single-choice\",\n label: \"Single choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) =>\n typeof value === \"string\" && choiceOptions(field).some((o) => o.value === value)\n ? null\n : \"Choose one of the options.\",\n summarize: (value, field) => optionLabel(field, String(value)),\n },\n {\n type: \"multi-choice\",\n label: \"Multiple choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"contains\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const allowed = new Set(choiceOptions(field).map((o) => o.value));\n // Each option at most once, so a value is never longer than the option list.\n return Array.isArray(value) &&\n value.length <= allowed.size &&\n new Set(value).size === value.length &&\n value.every((v) => typeof v === \"string\" && allowed.has(v))\n ? null\n : \"Choose from the options.\";\n },\n summarize: (value, field) =>\n Array.isArray(value) ? value.map((v) => optionLabel(field, String(v))).join(\", \") : String(value),\n },\n {\n type: \"yes-no\",\n label: \"Yes / no\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value) => (typeof value === \"boolean\" ? null : \"Choose yes or no.\"),\n summarize: (value) => (value ? \"Yes\" : \"No\"),\n },\n {\n type: \"dropdown\",\n label: \"Dropdown\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\" },\n validate: (value, field) =>\n typeof value === \"string\" && choiceOptions(field).some((o) => o.value === value)\n ? null\n : \"Choose one of the options.\",\n summarize: (value, field) => optionLabel(field, String(value)),\n },\n {\n type: \"number\",\n label: \"Number\",\n category: \"text\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"control\", inputMode: \"decimal\" },\n validate: (value, field) => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"Enter a number.\";\n const { min, max, step } = numberLimits(field);\n if (min !== undefined && max !== undefined && (value < min || value > max)) {\n return `Enter a number from ${min} to ${max}.`;\n }\n if (min !== undefined && value < min) return `Enter ${min} or more.`;\n if (max !== undefined && value > max) return `Enter ${max} or less.`;\n if (step !== undefined && !onStep(value, min ?? 0, step)) {\n return step === 1 && Number.isInteger(min ?? 0)\n ? \"Enter a whole number.\"\n : `Enter a number in steps of ${step}.`;\n }\n return null;\n },\n summarize: (value) => String(value),\n samples: (field) => {\n const { min, max } = numberLimits(field);\n return [min, max, 0, 1].filter((v): v is number => v !== undefined);\n },\n },\n {\n type: \"date\",\n label: \"Date\",\n category: \"date\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\" },\n validate: (value, field) => {\n if (typeof value !== \"string\" || !isIsoDate(value.trim())) return \"Enter a date like 2026-10-22.\";\n const date = value.trim();\n const { min, max } = dateLimits(field);\n if (min && max && (date < min || date > max)) return `Choose a date from ${min} to ${max}.`;\n if (min && date < min) return `Choose ${min} or later.`;\n if (max && date > max) return `Choose ${max} or earlier.`;\n return null;\n },\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n samples: (field) => {\n const { min, max } = dateLimits(field);\n return [min ?? max ?? \"2000-01-01\"];\n },\n },\n {\n type: \"consent\",\n label: \"Consent checkbox\",\n category: \"choice\",\n value: { json: true },\n operators: [\"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n // Unchecked is unanswered, so a required consent must be checked.\n isEmpty: (value) => value === undefined || value === null || value === false,\n validate: (value) => (value === true ? null : \"Check the box to agree.\"),\n summarize: () => \"Agreed\",\n samples: () => [true],\n },\n];\n\n/** The optional words under the ends of a rating or NPS scale (\"Poor\", \"Great\"). */\nexport function scaleLabels(field: FieldBlock): { low?: string; high?: string } {\n const out: { low?: string; high?: string } = {};\n const low = field.props?.lowLabel;\n const high = field.props?.highLabel;\n if (typeof low === \"string\" && low.trim()) out.low = low.trim();\n if (typeof high === \"string\" && high.trim()) out.high = high.trim();\n return out;\n}\n\n/** How a rating is drawn: `\"numbers\"` (default) or `\"stars\"`. */\nexport function ratingDisplay(field: FieldBlock): \"numbers\" | \"stars\" {\n return field.props?.display === \"stars\" ? \"stars\" : \"numbers\";\n}\n\nfunction scaleEndLabel(field: FieldBlock, value: number, min: number, max: number): string | undefined {\n const { low, high } = scaleLabels(field);\n return value === min ? low : value === max ? high : undefined;\n}\n\nconst finite = (v: Json | undefined): number | undefined =>\n typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n\n/** A `number` field's limits: `min`, `max` and `step` (each optional; `step` is above 0). */\nexport function numberLimits(field: FieldBlock): { min?: number; max?: number; step?: number } {\n const out: { min?: number; max?: number; step?: number } = {};\n const min = finite(field.props?.min);\n const max = finite(field.props?.max);\n const step = finite(field.props?.step);\n if (min !== undefined) out.min = min;\n if (max !== undefined) out.max = max;\n if (step !== undefined && step > 0) out.step = step;\n return out;\n}\n\n/** Whether `value` is `base` plus a whole number of `step`s, allowing for floating-point error. */\nfunction onStep(value: number, base: number, step: number): boolean {\n const n = (value - base) / step;\n return Math.abs(n - Math.round(n)) < 1e-9 * Math.max(1, Math.abs(n));\n}\n\n/** `YYYY-MM-DD`, a real calendar day (no 2026-02-30), years 0001 to 9999. */\nexport function isIsoDate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const [y, m, d] = value.split(\"-\").map(Number) as [number, number, number];\n if (y < 1 || m < 1 || m > 12 || d < 1) return false;\n const days = [31, y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n return d <= days[m - 1]!;\n}\n\n/** A `date` field's earliest and latest days (`YYYY-MM-DD`), when set. */\nexport function dateLimits(field: FieldBlock): { min?: string; max?: string } {\n const out: { min?: string; max?: string } = {};\n const min = field.props?.min;\n const max = field.props?.max;\n if (typeof min === \"string\" && isIsoDate(min)) out.min = min;\n if (typeof max === \"string\" && isIsoDate(max)) out.max = max;\n return out;\n}\n\nfor (const manifest of [...builtins, ...structuredFieldTypes, calculatedFieldType]) registerFieldType(manifest);\n","/** Guards and helpers for event logs and other untrusted JSON. No dependencies. */\nimport type { FormEvent, Json } from \"./types\";\n\n/** A plain object: `{}` or `Object.create(null)`, not an array, a class instance or null. */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Whether a value is JSON: strings, finite numbers, booleans, null, arrays and\n * plain objects, nested to any depth. Iterative, so a deeply nested value\n * cannot overflow the stack.\n */\nexport function isJson(value: unknown): value is Json {\n const stack: unknown[] = [value];\n while (stack.length) {\n const v = stack.pop();\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") continue;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return false;\n continue;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) stack.push(v[i]);\n continue;\n }\n if (!isPlainObject(v)) return false;\n for (const key of Object.keys(v)) stack.push(v[key]);\n }\n return true;\n}\n\nconst EVENT_TYPES = new Set([\"answer\", \"next\", \"back\", \"submit\"]);\n\n/** Whether `value` is a well-formed `FormEvent` of a known type. */\nexport function isFormEvent(value: unknown): value is FormEvent {\n if (!isPlainObject(value) || typeof value.type !== \"string\" || !EVENT_TYPES.has(value.type)) return false;\n if (value.at !== undefined && !(typeof value.at === \"number\" && Number.isFinite(value.at))) return false;\n if (value.type !== \"answer\") return true;\n return (\n typeof value.field === \"string\" &&\n (value.value === undefined || isJson(value.value)) &&\n (value.source === undefined || value.source === \"prefill\")\n );\n}\n\n/**\n * An event of a type this version does not know, such as one a newer client\n * logs. Replays ignore these, so they are dropped rather than rejected.\n */\nexport function isUnknownEvent(value: unknown): boolean {\n return isPlainObject(value) && typeof value.type === \"string\" && !EVENT_TYPES.has(value.type);\n}\n\n/**\n * Merge consecutive answer events to the same field, keeping the last value.\n * Text inputs log one event per keystroke; the merged log replays to the same\n * state, because the path is derived from values alone.\n */\nexport function compactEvents(events: FormEvent[]): FormEvent[] {\n const out: FormEvent[] = [];\n for (const event of events) {\n const last = out[out.length - 1];\n if (event.type === \"answer\" && last?.type === \"answer\" && last.field === event.field) {\n out[out.length - 1] = event;\n } else out.push(event);\n }\n return out;\n}\n","/** Typing hidden inputs. Shared by the engine and the server, so both type them identically. */\nimport { isPlainObject } from \"./events\";\nimport type { FormDefinition, HiddenInput, Json } from \"./types\";\n\n/** Longest string a hidden input accepts. Longer values are dropped. */\nexport const MAX_HIDDEN_STRING_LENGTH = 1000;\n\n/** A plain decimal: an optional `-`, digits, and an optional fraction. */\nconst DECIMAL = /^-?\\d+(\\.\\d+)?$/;\n\nexport interface CoerceHiddenOptions {\n /** Coerce only inputs with these sources; the rest are reported in `ignored`. Default: all. */\n sources?: readonly HiddenInput[\"source\"][];\n}\n\nexport interface CoercedHidden {\n /** Declared inputs, typed. */\n values: Record<string, Json>;\n /** Names dropped: undeclared, from another source, or not convertible to the declared type. */\n ignored: string[];\n}\n\n/**\n * Convert one raw value to a hidden input's declared type, or `undefined` when\n * it cannot be. Only string, number and boolean primitives are accepted.\n * - `string`: a string (at most 1000 characters), or a number or boolean as text.\n * - `number`: a finite number, or a plain decimal string such as `\"12\"`, `\"-3\"`\n * or `\"2.5\"`. No spaces, hex, exponents or `\"\"`.\n * - `boolean`: `true`/`false`, or the strings `\"true\"`/`\"false\"`.\n */\nexport function coerceHiddenValue(value: unknown, type: HiddenInput[\"type\"]): Json | undefined {\n if (typeof value === \"string\" && value.length > MAX_HIDDEN_STRING_LENGTH) return undefined;\n if (type === \"string\") {\n if (typeof value === \"string\") return value;\n if (typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) return String(value);\n return undefined;\n }\n if (type === \"number\") {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value !== \"string\" || !DECIMAL.test(value)) return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n }\n if (typeof value === \"boolean\") return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\n/**\n * Type raw hidden inputs (from a query string, the host app or the server)\n * by the definition's declarations. `undefined` values are skipped silently.\n */\nexport function coerceHidden(\n definition: FormDefinition,\n raw: Record<string, unknown> | undefined,\n options: CoerceHiddenOptions = {},\n): CoercedHidden {\n const declared = new Map((definition.hidden ?? []).map((h) => [h.name, h]));\n const values: Record<string, Json> = {};\n const ignored: string[] = [];\n if (!isPlainObject(raw)) return { values, ignored };\n for (const name of Object.keys(raw)) {\n const value = raw[name];\n if (value === undefined) continue;\n const spec = declared.get(name);\n if (!spec || (options.sources && !options.sources.includes(spec.source))) {\n ignored.push(name);\n continue;\n }\n const coerced = coerceHiddenValue(value, spec.type);\n if (coerced === undefined) ignored.push(name);\n else Object.defineProperty(values, name, { value: coerced, enumerable: true, writable: true, configurable: true });\n }\n return { values, ignored };\n}\n","import { isEmptyValue } from \"./fields\";\nimport type { Block, Condition, FieldBlock, FormDefinition, Json, LogicRule, Operand } from \"./types\";\n\nexport interface EvalScope {\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n fields: Map<string, FieldBlock>;\n}\n\n/** `record[key]` if it is the record's own property: `values.constructor` is not an answer. */\nexport function own<T>(record: Record<string, T>, key: string): T | undefined {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction resolve(operand: Operand, scope: EvalScope): Json | undefined {\n if (\"field\" in operand) return own(scope.values, operand.field);\n if (\"hidden\" in operand) return own(scope.hidden, operand.hidden);\n return operand.value;\n}\n\nfunction deepEqual(a: Json | undefined, b: Json | undefined): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n return false;\n}\n\n/**\n * Evaluate a condition. Never throws. An empty value (unanswered, `null`,\n * blank text, an empty list: see `isEmptyValue`) is unanswered: it fails\n * every comparison, including `eq`, `in` and `contains`, and passes `neq`.\n */\nexport function evaluate(condition: Condition, scope: EvalScope): boolean {\n if (\"all\" in condition) return condition.all.every((c) => evaluate(c, scope));\n if (\"any\" in condition) return condition.any.some((c) => evaluate(c, scope));\n if (\"not\" in condition) return !evaluate(condition.not, scope);\n\n const left = resolve(condition.left, scope);\n const right = condition.right ? resolve(condition.right, scope) : undefined;\n const field = \"field\" in condition.left ? scope.fields.get(condition.left.field) : undefined;\n const unanswered = isEmptyValue(left, field);\n\n switch (condition.op) {\n case \"answered\":\n return !unanswered;\n case \"empty\":\n return unanswered;\n case \"eq\":\n return !unanswered && deepEqual(left, right);\n case \"neq\":\n // An unanswered field is \"not\" any value.\n return unanswered || !deepEqual(left, right);\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n if (typeof left !== \"number\" || typeof right !== \"number\") return false;\n if (condition.op === \"lt\") return left < right;\n if (condition.op === \"lte\") return left <= right;\n if (condition.op === \"gt\") return left > right;\n return left >= right;\n }\n case \"in\":\n return !unanswered && Array.isArray(right) && right.some((r) => deepEqual(r, left));\n case \"contains\":\n if (unanswered) return false;\n if (Array.isArray(left)) return left.some((l) => deepEqual(l, right));\n return (\n typeof left === \"string\" &&\n typeof right === \"string\" &&\n left.toLowerCase().includes(right.toLowerCase())\n );\n }\n}\n\n/** Blocks a respondent steps through: fields and content, in order. */\nexport function steps(def: FormDefinition): Block[] {\n return def.blocks.filter((b) => b.kind !== \"page-break\");\n}\n\nfunction visibilityRules(def: FormDefinition, blockId: string) {\n return (def.logic ?? []).filter(\n (r): r is Extract<LogicRule, { target: string }> =>\n (r.effect === \"show\" || r.effect === \"hide\") && r.target === blockId,\n );\n}\n\n/** Whether a field is withheld because the form is anonymous and the field identifies the respondent. */\nexport function withheld(def: FormDefinition, field: FieldBlock | undefined): boolean {\n return def.settings?.anonymous === true && field?.identifying === true;\n}\n\n/** Show/hide rules against a scope as given. A matching `hide` wins; any `show` must match. */\nfunction rulesAllow(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n if (withheld(def, scope.fields.get(blockId))) return false;\n const rules = visibilityRules(def, blockId);\n if (rules.some((r) => r.effect === \"hide\" && evaluate(r.when, scope))) return false;\n const shows = rules.filter((r) => r.effect === \"show\");\n return shows.length === 0 || shows.some((r) => evaluate(r.when, scope));\n}\n\nexport interface PathResult {\n /** Block ids the respondent will step through, given the answers on the path. */\n path: string[];\n /** The ending reached by a jump, or the default ending. */\n ending: string | null;\n}\n\nexport interface PathWalk extends PathResult {\n /**\n * The scope logic sees at a block: the values of the fields on the path\n * before it (and of the block itself, with `inclusive`), nothing else.\n */\n scopeAt(blockId: string, inclusive?: boolean): EvalScope;\n}\n\n/** One forward pass over the blocks. See `computePath`. */\nexport function walkPath(def: FormDefinition, scope: EvalScope): PathWalk {\n const list = steps(def);\n const index = new Map(list.map((b, i) => [b.id, i]));\n const position = new Map(def.blocks.map((b, i) => [b.id, i]));\n const jumps = (def.logic ?? []).filter(\n (r): r is Extract<LogicRule, { effect: \"jump\" }> => r.effect === \"jump\",\n );\n const defaultEnding = def.endings?.find((e) => e.id === \"default\")?.id ?? def.endings?.[0]?.id ?? null;\n\n // Values of the fields placed on the path so far. It only grows, so every\n // decision reads blocks already placed and the pass needs no fixed point.\n const placed = Object.create(null) as Record<string, Json | undefined>;\n const local: EvalScope = { values: placed, hidden: scope.hidden, fields: scope.fields };\n const path: string[] = [];\n const nextVisible = (from: number) => {\n for (let i = from; i < list.length; i++) if (rulesAllow(def, list[i]!.id, local)) return i;\n return list.length;\n };\n\n let ending = defaultEnding;\n let i = nextVisible(0);\n while (i < list.length) {\n const block = list[i]!;\n path.push(block.id);\n if (block.kind === \"field\") placed[block.id] = own(scope.values, block.id);\n const jump = jumps.find((r) => r.from === block.id && evaluate(r.when, local));\n if (jump) {\n if (typeof jump.to === \"object\") {\n ending = jump.to.ending;\n break;\n }\n const target = index.get(jump.to);\n if (target !== undefined && target > i) {\n i = nextVisible(target);\n continue;\n }\n }\n i = nextVisible(i + 1);\n }\n\n const scopeAt = (blockId: string, inclusive = false): EvalScope => {\n const at = position.get(blockId) ?? -1;\n const values = Object.create(null) as Record<string, Json | undefined>;\n for (const id of path) {\n const p = position.get(id)!;\n if (p > at || (p === at && !inclusive)) break;\n if (id in placed) values[id] = placed[id];\n }\n return { values, hidden: scope.hidden, fields: scope.fields };\n };\n return { path, ending, scopeAt };\n}\n\n/**\n * The respondent's path, derived from the answers on the path, so the client,\n * the server and a replay always agree. It is built in one forward pass: a\n * block's show/hide rules, and the jumps from it, see only the fields already\n * on the path before it (and, for a jump, the block itself). A field that is\n * hidden, jumped over or later in the form reads as unanswered, whatever\n * value it holds.\n *\n * A block jumped over is off the path and counts as hidden: it is not\n * validated and its value is cleared on submit. A jump never revisits a block;\n * a jump to an earlier block is ignored (the checker in `parseForm` reports it).\n */\nexport function computePath(def: FormDefinition, scope: EvalScope): PathResult {\n const { path, ending } = walkPath(def, scope);\n return { path, ending };\n}\n\n/**\n * Whether a block's show/hide rules let it be shown, ignoring jumps. The rules\n * read the answers on the path before the block, as in `computePath`. A block\n * with any `show` rule is hidden until one matches; a matching `hide` rule\n * always wins.\n */\nexport function ruleVisible(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n return rulesAllow(def, blockId, walkPath(def, scope).scopeAt(blockId));\n}\n\nexport function fieldMap(def: FormDefinition): Map<string, FieldBlock> {\n const map = new Map<string, FieldBlock>();\n for (const block of def.blocks) if (block.kind === \"field\") map.set(block.id, block);\n return map;\n}\n","import { summarizeValue } from \"./fields\";\nimport { own } from \"./logic\";\nimport type { FieldBlock, Json } from \"./types\";\n\nconst TOKEN = /\\{\\{\\s*(field|hidden):([A-Za-z0-9_-]+)\\s*(?:\\|([^}]*))?\\}\\}/g;\n\nexport interface RecallScope {\n /** Fields by key. */\n fieldsByKey: Map<string, FieldBlock>;\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n}\n\n/**\n * Replace `{{field:key|fallback}}` and `{{hidden:name|fallback}}` tokens.\n * An unanswered value renders its fallback (default empty); the text is\n * never dropped.\n */\nexport function recall(text: string, scope: RecallScope): string {\n return text.replace(TOKEN, (_match, kind: string, name: string, fallback?: string) => {\n if (kind === \"field\") {\n const field = scope.fieldsByKey.get(name);\n const out = field ? summarizeValue(own(scope.values, field.id), field) : \"\";\n return out || (fallback ?? \"\").trim();\n }\n const value = own(scope.hidden, name);\n const out = value === undefined || value === null ? \"\" : String(value);\n return out || (fallback ?? \"\").trim();\n });\n}\n\n/** The keys a text recalls, for the checker. */\nexport function recallRefs(text: string): { kind: \"field\" | \"hidden\"; name: string }[] {\n return [...text.matchAll(TOKEN)].map((m) => ({ kind: m[1] as \"field\" | \"hidden\", name: m[2]! }));\n}\n","import { CALCULATED_TYPE } from \"./calculated\";\nimport { getFieldType, isEmptyValue } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\n/** The Standard Schema interface (standardschema.dev), as far as validation needs it. */\nexport interface StandardSchemaV1<T = unknown> {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) =>\n | { value: T; issues?: undefined }\n | { issues: ReadonlyArray<{ message: string }> }\n | Promise<unknown>;\n };\n}\n\n/** A custom check for one field: a function, or any Standard Schema (Zod, Valibot, ArkType…). */\nexport type FieldValidator = ((value: Json) => string | null) | StandardSchemaV1;\n\nexport const REQUIRED_MESSAGE = \"This question needs an answer.\";\n\nfunction runCustom(validator: FieldValidator, value: Json): string | null {\n if (typeof validator === \"function\") return validator(value);\n const result = validator[\"~standard\"].validate(value);\n if (result instanceof Promise) {\n throw new Error(\"Async validators are not supported in the engine yet; run them on the server.\");\n }\n const issues = (result as { issues?: ReadonlyArray<{ message: string }> }).issues;\n return issues?.length ? issues[0]!.message : null;\n}\n\n/**\n * Validate one field's value. `requireAnswers: false` (drafts) checks the\n * format of what was answered without requiring the rest.\n */\nexport function validateField(\n field: FieldBlock,\n value: Json | undefined,\n options: { requireAnswers?: boolean; custom?: FieldValidator } = {},\n): string | null {\n if (isEmptyValue(value, field)) {\n // A calculated field is worked out, not answered, so it is never required.\n return field.required && field.type !== CALCULATED_TYPE && options.requireAnswers !== false ? REQUIRED_MESSAGE : null;\n }\n const manifest = getFieldType(field.type);\n // A type with no manifest cannot say what a valid answer is, so none is accepted.\n if (!manifest) return `Unknown field type \"${field.type}\".`;\n const builtIn = manifest.validate?.(value as Json, field) ?? null;\n if (builtIn) return builtIn;\n return options.custom ? runCustom(options.custom, value as Json) : null;\n}\n","import { calculator, isCalculated } from \"./calculated\";\nimport { isEmptyValue, normalizeValue } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { computePath, fieldMap, own, type EvalScope } from \"./logic\";\nimport { recall } from \"./recall\";\nimport type { Block, FieldBlock, FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface FormState {\n /** Answers keyed by block id. */\n values: Record<string, Json | undefined>;\n /** URL and host inputs (untrusted) and server-resolved inputs, by name. */\n hidden: Record<string, Json | undefined>;\n /** Block ids the respondent steps through, given the answers so far. */\n path: string[];\n /** The block on screen in focus layout. */\n current: string | null;\n /** Visited blocks, for Back. */\n history: string[];\n errors: Record<string, string>;\n status: \"in_progress\" | \"completed\";\n /** The ending reached once completed. */\n ending: string | null;\n events: FormEvent[];\n}\n\nexport interface CreateFormOptions {\n /** Prefilled answers by field id. Logged as leading `answer` events with `source: \"prefill\"`. */\n initialValues?: Record<string, Json> | undefined;\n /** Hidden inputs by name. Declared ones are typed with `coerceHidden`, as the server types them. */\n hidden?: Record<string, Json | undefined> | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /** Timestamps on events. Pass `() => undefined` to record none (anonymous forms). */\n clock?: (() => number | undefined) | undefined;\n}\n\nexport interface FormEngine {\n readonly definition: FormDefinition;\n getState(): FormState;\n subscribe(listener: () => void): () => void;\n /** A field's id, from its key. */\n idOf(key: string): string;\n field(id: string): FieldBlock | undefined;\n block(id: string): Block | undefined;\n isVisible(id: string): boolean;\n /**\n * Set an answer. Like `next`, `back` and `submit`, it does nothing once the\n * response is completed: a completed response is final, so its stored\n * answers are the ones that were validated. It does nothing for a\n * `calculated` field either: the engine works that value out.\n */\n setValue(id: string, value: Json | undefined): void;\n /** Validate the current step and move on. Returns false if it has errors. */\n next(): boolean;\n back(): void;\n /** Validate every visible field and complete. Returns false if it has errors or is already completed. */\n submit(): boolean;\n /** Text with `{{recall}}` tokens resolved. */\n text(template: string): string;\n /** Visible, non-empty field values only, keyed by id: what a submit stores. */\n answers(): Record<string, Json>;\n}\n\nexport function createForm(definition: FormDefinition, options: CreateFormOptions = {}): FormEngine {\n return build(definition, options).engine;\n}\n\ninterface Built {\n engine: FormEngine;\n /** Apply a logged event as-is, appending to the log in place (replay only). */\n apply(event: FormEvent): void;\n /** End a replay: later events are copied and notify subscribers again. */\n finish(): void;\n}\n\nfunction build(definition: FormDefinition, options: CreateFormOptions, replaying = false): Built {\n const fields = fieldMap(definition);\n const byKey = new Map([...fields.values()].map((f) => [f.key, f]));\n const blocks = new Map(definition.blocks.map((b) => [b.id, b]));\n // An anonymous form records no timestamps, whatever clock is passed.\n const clock = definition.settings?.anonymous === true ? () => undefined : (options.clock ?? (() => Date.now()));\n const listeners = new Set<() => void>();\n // While replaying, events are pushed onto one array instead of copied per\n // event, so a long log replays in linear time.\n let batch = replaying;\n\n const scopeOf = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]): EvalScope => ({\n values,\n hidden,\n fields,\n });\n\n // Declared inputs are typed exactly as the server types them; undeclared\n // names pass through (logic and recall cannot reference them).\n const declared = new Set((definition.hidden ?? []).map((h) => h.name));\n const initialHidden: FormState[\"hidden\"] = {};\n for (const [name, value] of Object.entries(options.hidden ?? {})) {\n if (!declared.has(name)) initialHidden[name] = value;\n }\n Object.assign(initialHidden, coerceHidden(definition, options.hidden).values);\n\n // Calculated fields are worked out from the answers on the path, and logic\n // may read them, so the two settle together (a few rounds at most).\n const calc = calculator(definition);\n const settle = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]) => {\n let { path } = computePath(definition, scopeOf(values, hidden));\n if (!calc.active) return { values, path };\n for (let round = 0; round < 4; round++) {\n const next = calc.withCalculated(values, path);\n if (next === values) break;\n values = next;\n path = computePath(definition, scopeOf(values, hidden)).path;\n }\n return { values, path };\n };\n\n const first = settle({}, initialHidden);\n let state: FormState = {\n values: first.values,\n hidden: initialHidden,\n path: first.path,\n current: first.path[0] ?? null,\n history: [],\n errors: {},\n status: \"in_progress\",\n ending: null,\n events: [],\n };\n\n const emit = (next: FormState) => {\n state = next;\n if (batch) return;\n for (const l of listeners) l();\n };\n const log = (event: FormEvent): FormEvent[] => {\n if (!batch) return [...state.events, event];\n state.events.push(event);\n return state.events;\n };\n const stamp = <E extends FormEvent>(event: E): E => {\n const at = clock();\n return at === undefined ? event : { ...event, at };\n };\n\n // Every block on the path is visible: the path only takes blocks whose\n // rules allow them, given the answers before them.\n const isVisibleIn = (s: FormState, id: string) => s.path.includes(id);\n\n const errorsFor = (s: FormState, ids: string[]) => {\n const errors: Record<string, string> = {};\n for (const id of ids) {\n const field = fields.get(id);\n if (!field || !isVisibleIn(s, id)) continue;\n const message = validateField(field, own(s.values, id), { custom: options.validators?.[id] });\n if (message) errors[id] = message;\n }\n return errors;\n };\n\n // While replaying, answers only record the value: the path and calculated\n // fields are settled once, before the next step that reads them\n // (`next`, `back`, `submit`, or the end of the replay), not once per event.\n let unsettled = false;\n const settleNow = () => {\n if (!unsettled) return;\n unsettled = false;\n const { values, path } = settle(state.values, state.hidden);\n state = { ...state, values, path };\n };\n\n const answer = (id: string, value: Json | undefined, event: FormEvent) => {\n if (state.status === \"completed\" || own(state.values, id) === value || isCalculated(fields.get(id))) return;\n const errors = { ...state.errors };\n delete errors[id];\n if (batch) {\n // `state` is not seen by anyone until the replay ends, so it is updated in place.\n state.values = { ...state.values, [id]: value };\n state.errors = errors;\n log(event);\n unsettled = true;\n return;\n }\n const { values, path } = settle({ ...state.values, [id]: value }, state.hidden);\n emit({ ...state, values, path, errors, events: log(event) });\n };\n\n const engine: FormEngine = {\n definition,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n idOf(key) {\n const field = byKey.get(key);\n if (!field) throw new Error(`No field with key \"${key}\".`);\n return field.id;\n },\n field: (id) => fields.get(id),\n block: (id) => blocks.get(id),\n isVisible: (id) => isVisibleIn(state, id),\n\n setValue(id, value) {\n if (!fields.has(id)) throw new Error(`No field \"${id}\".`);\n answer(id, value, stamp({ type: \"answer\", field: id, value }));\n },\n\n next() {\n if (!state.current || state.status === \"completed\") return false;\n const errors = errorsFor(state, [state.current]);\n // A failed attempt is logged too, so a replay shows the same errors.\n const events = log(stamp({ type: \"next\" as const }));\n if (Object.keys(errors).length) {\n emit({ ...state, errors: { ...state.errors, ...errors }, events });\n return false;\n }\n const at = state.path.indexOf(state.current);\n const target = state.path[at + 1];\n if (!target) {\n emit({ ...state, events });\n return true;\n }\n emit({ ...state, current: target, history: [...state.history, state.current], events });\n return true;\n },\n\n back() {\n if (state.status === \"completed\") return;\n const history = [...state.history];\n let previous = history.pop();\n while (previous && !state.path.includes(previous)) previous = history.pop();\n if (!previous) return;\n emit({ ...state, current: previous, history, events: log(stamp({ type: \"back\" as const })) });\n },\n\n submit() {\n if (state.status === \"completed\") return false;\n const errors = errorsFor(state, state.path);\n const events = log(stamp({ type: \"submit\" as const }));\n if (Object.keys(errors).length) {\n const firstError = state.path.find((id) => own(errors, id)) ?? state.current;\n emit({ ...state, errors, current: firstError, events });\n return false;\n }\n const { ending } = computePath(definition, scopeOf(state.values, state.hidden));\n emit({ ...state, errors: {}, status: \"completed\", ending, events });\n return true;\n },\n\n text: (template) =>\n recall(template, { fieldsByKey: byKey, values: state.values, hidden: state.hidden }),\n\n answers() {\n const out: Record<string, Json> = {};\n for (const id of state.path) {\n const field = fields.get(id);\n const value = own(state.values, id);\n // An empty answer (`\"\"`, blank text, `[]`) is stored as no answer.\n if (field && !isEmptyValue(value, field)) out[id] = normalizeValue(value as Json, field);\n }\n return out;\n },\n };\n\n // Prefilled answers are logged as leading `answer` events, so a replay of\n // the log, and the server, see them too. They settle once, like a replay.\n if (options.initialValues) {\n const wasBatch = batch;\n batch = true;\n for (const [id, value] of Object.entries(options.initialValues)) {\n if (!fields.has(id) || value === undefined) continue;\n answer(id, value, stamp({ type: \"answer\", field: id, value, source: \"prefill\" }));\n }\n settleNow();\n batch = wasBatch;\n }\n\n const apply = (event: FormEvent) => {\n if (event.type === \"answer\") {\n if (fields.has(event.field)) {\n const { at: _at, ...logged } = event;\n answer(event.field, event.value, logged);\n }\n } else if (event.type === \"next\") {\n settleNow();\n engine.next();\n } else if (event.type === \"back\") {\n settleNow();\n engine.back();\n } else if (event.type === \"submit\") {\n settleNow();\n engine.submit();\n }\n // Unknown event types are ignored.\n };\n const finish = () => {\n settleNow();\n batch = false;\n state = { ...state, events: [...state.events] };\n };\n return { engine, apply, finish };\n}\n\n/** Rebuild a form's state from its event log. Timestamps are ignored. */\nexport function replay(\n definition: FormDefinition,\n events: FormEvent[],\n options: Omit<CreateFormOptions, \"clock\" | \"initialValues\"> = {},\n): FormEngine {\n const { engine, apply, finish } = build(definition, { ...options, initialValues: undefined, clock: () => undefined }, true);\n for (const event of events) apply(event);\n finish();\n return engine;\n}\n","import { CALCULATED_TYPE, MAX_CALCULATED_DECIMALS, MAX_FORM_FORMULA_LENGTH } from \"./calculated\";\nimport { isJson } from \"./events\";\nimport { getFieldType, isIsoDate } from \"./fields\";\nimport { parseFormula } from \"./formula\";\nimport { recallRefs } from \"./recall\";\nimport { MAX_TABLE_COLUMNS } from \"./structured\";\nimport type { Condition, FormDefinition, Operator } from \"./types\";\n\n/** A value for a message. Never throws: parseForm accepts any input, including BigInts, cycles and deep nesting. */\nfunction shown(v: unknown): string {\n let text: string | undefined;\n try {\n text = JSON.stringify(v);\n } catch {\n text = undefined;\n }\n text ??= typeof v === \"bigint\" ? `${v}n` : typeof v;\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\nexport interface FormIssue {\n path: string;\n message: string;\n}\n\nexport type ParseResult =\n | { ok: true; form: FormDefinition; warnings: FormIssue[] }\n | { ok: false; issues: FormIssue[]; warnings: FormIssue[] };\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst isInt = (v: unknown): v is number => typeof v === \"number\" && Number.isInteger(v);\n\n/** The JSON type a comparison operand must have to match a built-in field type's value. */\nconst LITERAL_TYPE: Readonly<Record<string, \"string\" | \"number\" | \"boolean\">> = {\n \"short-text\": \"string\",\n \"long-text\": \"string\",\n email: \"string\",\n phone: \"string\",\n rating: \"number\",\n nps: \"number\",\n \"single-choice\": \"string\",\n \"multi-choice\": \"string\",\n \"yes-no\": \"boolean\",\n list: \"string\",\n dropdown: \"string\",\n number: \"number\",\n date: \"string\",\n consent: \"boolean\",\n // A calculated field holds a number unless its format says text; see `literalType`.\n calculated: \"number\",\n};\n\n/** Field types whose answer is one of `props.options`. */\nconst CHOICE_TYPES: ReadonlySet<string> = new Set([\"single-choice\", \"multi-choice\", \"dropdown\"]);\n\nconst ORDERING: ReadonlySet<string> = new Set<Operator>([\"lt\", \"lte\", \"gt\", \"gte\"]);\n\nconst OPERATORS: ReadonlySet<string> = new Set<Operator>([\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"in\",\n \"contains\",\n \"answered\",\n \"empty\",\n]);\n\n/**\n * Names an id, key or hidden input may not take: they collide with\n * `Object.prototype` (`__proto__`, `constructor`, `toString`…) when used as a\n * record key.\n */\nconst RESERVED: ReadonlySet<string> = new Set(Object.getOwnPropertyNames(Object.prototype));\n\n/** Deepest nesting of `all` / `any` / `not` a condition may have. */\nconst MAX_CONDITION_DEPTH = 32;\n\n/**\n * Check a definition before it is stored or rendered: structure, the types of\n * text fields, unique ids and keys, known field types, references that\n * resolve, operators that fit the field type. Warnings flag things that work\n * but are probably mistakes. Never throws, whatever the input.\n */\nexport function parseForm(input: unknown): ParseResult {\n const issues: FormIssue[] = [];\n const warnings: FormIssue[] = [];\n const fail = () => ({ ok: false as const, issues, warnings });\n const issue = (path: string, message: string) => void issues.push({ path, message });\n\n /** A required string (non-empty with `nonEmpty`). */\n const text = (v: unknown, path: string, nonEmpty = false) => {\n if (typeof v !== \"string\" || (nonEmpty && !v)) issue(path, nonEmpty ? \"Required.\" : \"Required text.\");\n };\n /** An optional string. */\n const optionalText = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"string\") issue(path, \"Must be text.\");\n };\n const optionalBoolean = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"boolean\") issue(path, \"Must be true or false.\");\n };\n /** An identifier: a non-empty string that is not an `Object.prototype` name. */\n const name = (v: unknown, path: string, what: string): v is string => {\n if (typeof v !== \"string\" || !v) {\n issue(path, `${what} must be a non-empty string.`);\n return false;\n }\n if (RESERVED.has(v)) {\n issue(path, `\"${v}\" is reserved and cannot be used as ${what.toLowerCase()}.`);\n return false;\n }\n return true;\n };\n\n /** An optional whole number of at least `floor`. */\n const optionalInt = (v: unknown, path: string, floor: number) => {\n if (v !== undefined && !(isInt(v) && v >= floor)) issue(path, `Must be a whole number of ${floor} or more.`);\n };\n /** `low` may not exceed `high` when both are whole numbers. */\n const ordered = (low: unknown, high: unknown, path: string, what: string) => {\n if (isInt(low) && isInt(high) && low > high) issue(path, `Can't be more than the ${what}.`);\n };\n /** The props of the structured types (list, table, media-notes, text-highlights). */\n const structuredProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"list\") {\n optionalInt(props.min, `${path}.min`, 0);\n optionalInt(props.max, `${path}.max`, 1);\n optionalInt(props.itemMaxLength, `${path}.itemMaxLength`, 1);\n optionalText(props.placeholder, `${path}.placeholder`);\n ordered(props.min, props.max ?? 10, `${path}.min`, \"most items\");\n } else if (type === \"table\") {\n const columns = props.columns;\n if (!Array.isArray(columns) || columns.length < 1 || columns.length > MAX_TABLE_COLUMNS) {\n issue(`${path}.columns`, `Must be a list of 1 to ${MAX_TABLE_COLUMNS} columns.`);\n } else {\n const seen = new Set<string>();\n columns.forEach((c, j) => {\n const at = `${path}.columns[${j}]`;\n if (!isObject(c)) return issue(at, \"Each column needs a key and a label.\");\n if (name(c.key, `${at}.key`, \"A column key\")) {\n if (seen.has(c.key)) issue(`${at}.key`, `Duplicate column key \"${c.key}\".`);\n seen.add(c.key);\n }\n text(c.label, `${at}.label`);\n optionalBoolean(c.long, `${at}.long`);\n });\n }\n optionalInt(props.minRows, `${path}.minRows`, 0);\n optionalInt(props.maxRows, `${path}.maxRows`, 1);\n ordered(props.minRows, props.maxRows ?? 3, `${path}.minRows`, \"most rows\");\n } else if (type === \"media-notes\") {\n optionalInt(props.maxNotes, `${path}.maxNotes`, 1);\n optionalInt(props.textMaxLength, `${path}.textMaxLength`, 1);\n } else if (type === \"text-highlights\") {\n optionalText(props.text, `${path}.text`);\n optionalInt(props.maxHighlights, `${path}.maxHighlights`, 1);\n } else if (type === CALCULATED_TYPE) {\n // The formula itself is checked once every key is known, below.\n if (props.format !== undefined && props.format !== \"number\" && props.format !== \"percent\" && props.format !== \"text\") {\n issue(`${path}.format`, \"Must be number, percent or text.\");\n }\n if (props.decimals !== undefined && !(isInt(props.decimals) && props.decimals >= 0 && props.decimals <= MAX_CALCULATED_DECIMALS)) {\n issue(`${path}.decimals`, `Must be a whole number from 0 to ${MAX_CALCULATED_DECIMALS}.`);\n }\n }\n };\n\n const isFiniteNumber = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\n /** The props of the scale, number, date and consent types. */\n const fieldProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"rating\" || type === \"nps\") {\n optionalText(props.lowLabel, `${path}.lowLabel`);\n optionalText(props.highLabel, `${path}.highLabel`);\n }\n if (type === \"rating\" && props.display !== undefined && props.display !== \"numbers\" && props.display !== \"stars\") {\n issue(`${path}.display`, \"Must be numbers or stars.\");\n }\n if (type === \"number\") {\n for (const k of [\"min\", \"max\", \"step\"] as const) {\n if (props[k] !== undefined && !isFiniteNumber(props[k])) issue(`${path}.${k}`, \"Must be a number.\");\n }\n if (isFiniteNumber(props.step) && props.step <= 0) issue(`${path}.step`, \"Must be above 0.\");\n if (isFiniteNumber(props.min) && isFiniteNumber(props.max) && props.min > props.max) {\n issue(`${path}.min`, \"Can't be more than the largest number.\");\n }\n }\n if (type === \"date\") {\n for (const k of [\"min\", \"max\"] as const) {\n if (props[k] !== undefined && !(typeof props[k] === \"string\" && isIsoDate(props[k]))) {\n issue(`${path}.${k}`, \"Must be a date like 2026-10-22.\");\n }\n }\n if (typeof props.min === \"string\" && typeof props.max === \"string\" && isIsoDate(props.min) && isIsoDate(props.max) && props.min > props.max) {\n issue(`${path}.min`, \"Can't be after the latest date.\");\n }\n }\n if (type === \"consent\") optionalText(props.text, `${path}.text`);\n };\n\n if (!isObject(input)) {\n issue(\"\", \"A form definition must be an object.\");\n return fail();\n }\n if (input.schemaVersion !== 1) issue(\"schemaVersion\", \"Unsupported schemaVersion; expected 1.\");\n text(input.id, \"id\", true);\n text(input.title, \"title\");\n optionalText(input.description, \"description\");\n // Settings change privacy behaviour (anonymous, clearHiddenValues), so a\n // mistyped one is an issue, not a silent default.\n if (input.layout !== undefined) {\n if (!isObject(input.layout)) issue(\"layout\", \"Must be an object.\");\n else if (input.layout.mode !== \"focus\" && input.layout.mode !== \"classic\") {\n issue(\"layout.mode\", \"Must be focus or classic.\");\n }\n }\n if (input.settings !== undefined) {\n if (!isObject(input.settings)) issue(\"settings\", \"Must be an object.\");\n else {\n optionalBoolean(input.settings.anonymous, \"settings.anonymous\");\n optionalBoolean(input.settings.clearHiddenValues, \"settings.clearHiddenValues\");\n }\n }\n if (input.meta !== undefined && (!isObject(input.meta) || !isJson(input.meta))) {\n issue(\"meta\", \"Must be a JSON object.\");\n }\n if (!Array.isArray(input.blocks)) {\n issue(\"blocks\", \"Must be an array.\");\n return fail();\n }\n\n const ids = new Set<string>();\n const pageBreaks = new Set<string>();\n const keys = new Map<string, string>();\n const fieldTypes = new Map<string, string>();\n const order = new Map<string, number>();\n /** Column keys of table fields, for formulas. */\n const tableColumnKeys = new Map<string, Set<string>>();\n /** Option values of fields with `props.options`, for the operand check. */\n const choices = new Map<string, Set<string>>();\n /** Calculated fields that don't hold a number: `format: \"text\"` holds text, no format can hold either. */\n const calculatedLiteral = new Map<string, \"string\" | undefined>();\n\n input.blocks.forEach((block: unknown, i) => {\n const path = `blocks[${i}]`;\n if (!isObject(block) || typeof block.id !== \"string\" || !block.id) {\n issue(path, \"Every block needs a string id.\");\n return;\n }\n if (!name(block.id, `${path}.id`, \"A block id\")) return;\n if (ids.has(block.id)) issue(`${path}.id`, `Duplicate id \"${block.id}\".`);\n ids.add(block.id);\n if (block.kind === \"page-break\") pageBreaks.add(block.id);\n order.set(block.id, i);\n if (block.kind === \"field\") {\n text(block.label, `${path}.label`);\n optionalText(block.description, `${path}.description`);\n optionalText(block.placeholder, `${path}.placeholder`);\n optionalBoolean(block.required, `${path}.required`);\n optionalBoolean(block.sensitive, `${path}.sensitive`);\n optionalBoolean(block.identifying, `${path}.identifying`);\n const validKey = name(block.key, `${path}.key`, \"A field key\");\n if (typeof block.type !== \"string\" || !getFieldType(block.type)) {\n issue(`${path}.type`, `Unknown field type \"${String(block.type)}\".`);\n }\n if (block.props !== undefined) {\n if (!isObject(block.props) || !isJson(block.props)) issue(`${path}.props`, \"Must be a JSON object.\");\n else if (block.props.options !== undefined) {\n const options = block.props.options;\n if (!Array.isArray(options)) issue(`${path}.props.options`, \"Must be an array.\");\n else {\n options.forEach((o, j) => {\n const at = `${path}.props.options[${j}]`;\n if (!isObject(o) || typeof o.value !== \"string\") issue(at, \"Each option needs a string value.\");\n else optionalText(o.label, `${at}.label`);\n });\n choices.set(\n block.id,\n new Set(options.flatMap((o) => (isObject(o) && typeof o.value === \"string\" ? [o.value] : []))),\n );\n }\n }\n // Renderers draw one button per point, so the scale is bounded.\n const { max, maxLength } = isObject(block.props) ? block.props : {};\n if (block.type === \"rating\" && max !== undefined && !(isInt(max) && max >= 2 && max <= 10)) {\n issue(`${path}.props.max`, \"Must be a whole number from 2 to 10.\");\n }\n if (maxLength !== undefined && !(isInt(maxLength) && maxLength > 0)) {\n issue(`${path}.props.maxLength`, \"Must be a whole number above 0.\");\n }\n }\n // Checked with or without props: a table with no columns would block every submission.\n if (typeof block.type === \"string\" && (block.props === undefined || isObject(block.props))) {\n structuredProps(block.type, block.props ?? {}, `${path}.props`);\n fieldProps(block.type, block.props ?? {}, `${path}.props`);\n }\n if (validKey) {\n if (keys.has(block.key as string)) issue(`${path}.key`, `Duplicate key \"${String(block.key)}\".`);\n keys.set(block.key as string, block.id);\n }\n fieldTypes.set(block.id, typeof block.type === \"string\" ? block.type : \"\");\n if (block.type === CALCULATED_TYPE) {\n const format = isObject(block.props) ? block.props.format : undefined;\n if (format === \"text\") calculatedLiteral.set(block.id, \"string\");\n else if (format !== \"number\" && format !== \"percent\") calculatedLiteral.set(block.id, undefined);\n }\n if (block.type === \"table\" && isObject(block.props) && Array.isArray(block.props.columns)) {\n tableColumnKeys.set(\n block.id,\n new Set(block.props.columns.flatMap((c) => (isObject(c) && typeof c.key === \"string\" ? [c.key] : []))),\n );\n }\n } else if (block.kind === \"content\") {\n if (block.type !== \"heading\" && block.type !== \"text\") issue(`${path}.type`, \"Must be heading or text.\");\n text(block.text, `${path}.text`);\n } else if (block.kind === \"page-break\") {\n optionalText(block.title, `${path}.title`);\n } else {\n issue(`${path}.kind`, \"Unknown block kind.\");\n }\n });\n\n // Calculated fields: the formula parses, and every answer it names is a\n // question of this form (a table by one of its columns), and a calculated\n // one only when it comes earlier, so values never go round in a circle.\n // The formulas are worked out again on each step that changes an answer\n // they read, so all of them together are capped too.\n let formulaChars = 0;\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block) || block.kind !== \"field\" || block.type !== CALCULATED_TYPE) return;\n const path = `blocks[${i}].props.formula`;\n const source = isObject(block.props) && typeof block.props.formula === \"string\" ? block.props.formula : \"\";\n formulaChars += source.length;\n if (formulaChars > MAX_FORM_FORMULA_LENGTH && formulaChars - source.length <= MAX_FORM_FORMULA_LENGTH) {\n issue(path, `The form's formulas together are over ${MAX_FORM_FORMULA_LENGTH} characters; shorten some, or work part out once in an earlier calculated field.`);\n }\n if (block.required === true) {\n warnings.push({ path: `blocks[${i}].required`, message: \"A calculated field is worked out, not answered, so it is never required.\" });\n }\n const formula = isObject(block.props) ? block.props.formula : undefined;\n if (typeof formula !== \"string\" || !formula.trim()) return issue(path, \"A calculated field needs a formula.\");\n const parsed = parseFormula(formula);\n if (!parsed.ok) return issue(path, `${parsed.message} (at character ${parsed.at + 1})`);\n const reported = new Set<string>();\n for (const ref of parsed.refs) {\n const name = ref.column === undefined ? ref.key : `${ref.key}.${ref.column}`;\n if (reported.has(name)) continue;\n reported.add(name);\n const target = keys.get(ref.key);\n const targetType = target === undefined ? undefined : fieldTypes.get(target);\n const at = target === undefined ? undefined : order.get(target);\n if (target === undefined || targetType === undefined) issue(path, `The formula uses \"${ref.key}\", which is not the answer name of a question in this form.`);\n else if (target === block.id) issue(path, \"The formula uses this field's own value.\");\n else if (targetType === CALCULATED_TYPE && (at ?? 0) > i) {\n issue(path, `The formula uses \"${ref.key}\", a calculated field that comes after this one; move it earlier.`);\n } else if (targetType === \"table\") {\n const columns = tableColumnKeys.get(target);\n if (ref.column === undefined) issue(path, `\"${ref.key}\" is a table: name one of its columns, like ${ref.key}.${[...(columns ?? [])][0] ?? \"column\"}.`);\n else if (columns && !columns.has(ref.column)) issue(path, `The table \"${ref.key}\" has no column \"${ref.column}\".`);\n } else if (ref.column !== undefined) issue(path, `\"${ref.key}\" is not a table, so it has no column \"${ref.column}\".`);\n else if (targetType === \"media-notes\" || targetType === \"text-highlights\") {\n warnings.push({ path, message: `\"${ref.key}\" holds notes, not numbers; the formula reads it as blank.` });\n }\n }\n });\n\n const hiddenNames = new Set<string>();\n const hiddenTypes = new Map<string, string>();\n if (input.hidden !== undefined && !Array.isArray(input.hidden)) issue(\"hidden\", \"Must be an array.\");\n (Array.isArray(input.hidden) ? input.hidden : []).forEach((h: unknown, i) => {\n if (!isObject(h) || typeof h.name !== \"string\" || !h.name) {\n issue(`hidden[${i}]`, \"Each hidden input needs a name.\");\n return;\n }\n if (!name(h.name, `hidden[${i}].name`, \"A hidden input name\")) return;\n if (hiddenNames.has(h.name)) issue(`hidden[${i}].name`, `Duplicate hidden input \"${h.name}\".`);\n if (typeof h.source !== \"string\" || ![\"url\", \"host\", \"server\"].includes(h.source)) {\n issue(`hidden[${i}].source`, \"Must be url, host or server.\");\n }\n if (typeof h.type !== \"string\" || ![\"string\", \"number\", \"boolean\"].includes(h.type)) {\n issue(`hidden[${i}].type`, \"Must be string, number or boolean.\");\n }\n optionalBoolean(h.sensitive, `hidden[${i}].sensitive`);\n optionalBoolean(h.identifying, `hidden[${i}].identifying`);\n hiddenNames.add(h.name);\n if (typeof h.type === \"string\") hiddenTypes.set(h.name, h.type);\n });\n\n const endingIds = new Set<string>();\n if (input.endings !== undefined && !Array.isArray(input.endings)) issue(\"endings\", \"Must be an array.\");\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n const path = `endings[${i}]`;\n if (!isObject(e)) {\n issue(path, \"Each ending must be an object with an id and a title.\");\n return;\n }\n text(e.title, `${path}.title`);\n optionalText(e.description, `${path}.description`);\n if (!name(e.id, `${path}.id`, \"An ending id\")) return;\n if (endingIds.has(e.id)) issue(`${path}.id`, `Duplicate ending id \"${e.id}\".`);\n endingIds.add(e.id);\n });\n\n /** Field ids a condition reads, for the order check. */\n const checkOperand = (o: unknown, path: string, reads: string[]) => {\n if (o === undefined) return;\n if (!isObject(o)) return issue(path, \"An operand must be an object.\");\n if (\"field\" in o) {\n if (typeof o.field !== \"string\" || !fieldTypes.has(o.field)) return issue(path, `No field \"${String(o.field)}\".`);\n reads.push(o.field);\n } else if (\"hidden\" in o) {\n if (typeof o.hidden !== \"string\" || !hiddenNames.has(o.hidden)) {\n issue(path, `No hidden input \"${String(o.hidden)}\".`);\n }\n } else if (!(\"value\" in o) || !isJson(o.value)) {\n issue(path, \"An operand needs a `field`, a `hidden` input or a JSON `value`.\");\n }\n };\n const checkCondition = (c: unknown, path: string, reads: string[], depth = 0): void => {\n if (!isObject(c)) return issue(path, \"A condition must be an object.\");\n if (depth > MAX_CONDITION_DEPTH) return issue(path, \"The condition is nested too deeply.\");\n if (\"all\" in c || \"any\" in c) {\n const group = \"all\" in c ? \"all\" : \"any\";\n const list = c[group];\n if (!Array.isArray(list)) return issue(path, `\\`${group}\\` must be an array.`);\n return list.forEach((x, i) => checkCondition(x, `${path}.${group}[${i}]`, reads, depth + 1));\n }\n if (\"not\" in c) return checkCondition(c.not, `${path}.not`, reads, depth + 1);\n if (typeof c.op !== \"string\" || !isObject(c.left)) {\n return issue(path, \"A comparison needs an `op` and a `left` operand.\");\n }\n if (!OPERATORS.has(c.op)) issue(`${path}.op`, `Unknown operator \"${c.op}\".`);\n checkOperand(c.left, `${path}.left`, reads);\n checkOperand(c.right, `${path}.right`, reads);\n if (typeof c.left.field === \"string\") {\n const manifest = getFieldType(fieldTypes.get(c.left.field) ?? \"\");\n if (manifest && OPERATORS.has(c.op) && !manifest.operators.includes(c.op as Operator)) {\n // Already wrong; a literal warning on top would only repeat it.\n return issue(`${path}.op`, `\"${c.op}\" does not apply to a ${manifest.type} field.`);\n }\n }\n checkLiterals(c.op, c.left, c.right, path);\n };\n /** Warn when a literal `value` can never match what the left side holds: wrong type, or not an option. */\n const checkLiterals = (op: string, left: Record<string, unknown>, right: unknown, path: string) => {\n if (op === \"answered\" || op === \"empty\" || !OPERATORS.has(op)) return;\n const literal = isObject(right) && \"value\" in right;\n // A `field` or `hidden` operand on the right is only known when the form runs.\n if (right !== undefined && !literal) return;\n let what = \"the left side\";\n let type: string | undefined;\n let options: Set<string> | undefined;\n if (typeof left.field === \"string\" && fieldTypes.has(left.field)) {\n const fieldType = fieldTypes.get(left.field)!;\n what = `\"${keyOf(left.field)}\"`;\n type = calculatedLiteral.has(left.field) ? calculatedLiteral.get(left.field) : LITERAL_TYPE[fieldType];\n if (CHOICE_TYPES.has(fieldType)) options = choices.get(left.field);\n } else if (typeof left.hidden === \"string\" && hiddenTypes.has(left.hidden)) {\n what = `hidden input \"${left.hidden}\"`;\n type = hiddenTypes.get(left.hidden);\n }\n const outcome = op === \"neq\" ? \"always true\" : \"never true\";\n let values: unknown[];\n if (op === \"in\") {\n if (!literal || !Array.isArray(right.value)) {\n return void warnings.push({ path: `${path}.right`, message: \"`in` needs a list of values; it never matches.\" });\n }\n values = right.value;\n } else if (!literal) return;\n else values = [right.value];\n if (ORDERING.has(op)) {\n if (type !== undefined && type !== \"number\") {\n return void warnings.push({ path: `${path}.op`, message: `\"${op}\" compares numbers, but ${what} holds a ${type}; it is never true.` });\n }\n type = \"number\";\n }\n for (const v of values) {\n const message =\n type !== undefined && typeof v !== type\n ? `${what} holds a ${type}, but ${shown(v)} is not one; this comparison is ${outcome}.`\n : options && typeof v === \"string\" && !options.has(v)\n ? `${shown(v)} is not an option of ${what}; this comparison is ${outcome}.`\n : null;\n if (message) warnings.push({ path: `${path}.right`, message });\n }\n };\n const keyOf = (id: string) => [...keys].find(([, v]) => v === id)?.[0] ?? id;\n\n const ruleIds = new Set<string>();\n if (input.logic !== undefined && !Array.isArray(input.logic)) issue(\"logic\", \"Must be an array.\");\n (Array.isArray(input.logic) ? input.logic : []).forEach((rule: unknown, i) => {\n const path = `logic[${i}]`;\n if (!isObject(rule) || typeof rule.id !== \"string\" || !isObject(rule.when)) {\n issue(path, \"Each rule needs an id and a `when` condition.\");\n return;\n }\n if (ruleIds.has(rule.id)) issue(`${path}.id`, `Duplicate rule id \"${rule.id}\".`);\n ruleIds.add(rule.id);\n const reads: string[] = [];\n checkCondition(rule.when, `${path}.when`, reads);\n\n // The block whose position the condition is read at, for the order check.\n let at: string | undefined;\n let inclusive = false;\n if (rule.effect === \"jump\") {\n if (typeof rule.from !== \"string\" || !ids.has(rule.from)) {\n issue(`${path}.from`, `No block \"${String(rule.from)}\".`);\n } else if (pageBreaks.has(rule.from)) {\n issue(`${path}.from`, \"A jump can't start at a page break; use the block before it.\");\n } else {\n at = rule.from;\n inclusive = true;\n }\n if (isObject(rule.to)) {\n if (typeof rule.to.ending !== \"string\" || !endingIds.has(rule.to.ending)) {\n issue(`${path}.to`, `No ending \"${String(rule.to.ending)}\".`);\n }\n } else if (typeof rule.to !== \"string\" || !ids.has(rule.to)) {\n issue(`${path}.to`, `No block \"${String(rule.to)}\".`);\n } else if (pageBreaks.has(rule.to)) {\n issue(`${path}.to`, \"A jump can't land on a page break; jump to the first block after it.\");\n } else if (at !== undefined && (order.get(rule.to) ?? 0) <= (order.get(at) ?? 0)) {\n warnings.push({ path: `${path}.to`, message: \"Jumps only go forward; this one is ignored.\" });\n }\n } else if (rule.effect === \"show\" || rule.effect === \"hide\") {\n if (typeof rule.target !== \"string\" || !ids.has(rule.target)) {\n issue(`${path}.target`, `No block \"${String(rule.target)}\".`);\n } else at = rule.target;\n } else {\n issue(`${path}.effect`, \"Must be show, hide or jump.\");\n }\n\n // Logic reads only the answers on the path before the block it applies to.\n if (at !== undefined) {\n const limit = order.get(at) ?? 0;\n for (const field of new Set(reads)) {\n const p = order.get(field) ?? 0;\n if (p > limit || (p === limit && !inclusive)) {\n warnings.push({\n path: `${path}.when`,\n message: `Reads \"${keyOf(field)}\", which does not come before \"${keyOf(at)}\"; it always reads as unanswered.`,\n });\n }\n }\n }\n });\n\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block)) return;\n const raw =\n block.kind === \"field\" ? [block.label, block.description] : block.kind === \"content\" ? [block.text] : [];\n const texts = raw.filter((t): t is string => typeof t === \"string\");\n for (const t of texts) {\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" && !hiddenNames.has(ref.name)) {\n issue(`blocks[${i}]`, `Recalls unknown hidden input \"${ref.name}\".`);\n }\n if (ref.kind === \"field\") {\n const target = keys.get(ref.name);\n if (!target) issue(`blocks[${i}]`, `Recalls unknown field \"${ref.name}\".`);\n else if ((order.get(target) ?? 0) >= i) {\n warnings.push({ path: `blocks[${i}]`, message: `Recalls \"${ref.name}\", which comes later.` });\n }\n }\n }\n }\n });\n\n // Endings and the introduction recall too. Only warnings: a stale token here shows as\n // its fallback text, and earlier releases accepted these definitions.\n const extra: [string, unknown][] = [[\"description\", input.description]];\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n if (isObject(e)) extra.push([`endings[${i}]`, e.title], [`endings[${i}]`, e.description]);\n });\n for (const [path, t] of extra) {\n if (typeof t !== \"string\") continue;\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" ? !hiddenNames.has(ref.name) : !keys.has(ref.name)) {\n warnings.push({ path, message: `Recalls unknown ${ref.kind === \"hidden\" ? \"hidden input\" : \"field\"} \"${ref.name}\"; it shows its fallback text.` });\n }\n }\n }\n\n return issues.length ? fail() : { ok: true, form: input as unknown as FormDefinition, warnings };\n}\n","/**\n * Server-side checking. No IO: the app loads the published definition,\n * resolves its server inputs, calls `validateSubmission`, and stores what\n * comes back.\n */\nimport { isCalculated } from \"./calculated\";\nimport { createForm, replay, type FormEngine } from \"./engine\";\nimport { compactEvents, isFormEvent, isJson, isPlainObject, isUnknownEvent } from \"./events\";\nimport { isEmptyValue, normalizeValue } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { fieldMap, own, withheld } from \"./logic\";\nimport { parseForm } from \"./parse\";\nimport type { FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface SubmissionInput {\n /** Answers keyed by field id. Ignored when `events` is given. */\n answers?: Record<string, Json> | undefined;\n /** The respondent's event log. Replayed instead of trusting `answers`. */\n events?: FormEvent[] | undefined;\n /** URL and host inputs sent by the client. Server inputs here are ignored. */\n hidden?: Record<string, Json> | undefined;\n}\n\nexport interface SubmissionOptions {\n /** Values for `source: \"server\"` inputs, resolved by the server (account id, location, user id…). */\n context?: Record<string, Json> | undefined;\n /** `false` checks a draft: formats only, nothing required. Default true. */\n complete?: boolean | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /** Most events accepted, counted after `compactEvents`. Default 10 000. */\n maxEvents?: number | undefined;\n}\n\nexport interface CheckedSubmission {\n status: \"draft\" | \"completed\";\n /**\n * Visible answers only, keyed by field id (kept hidden answers too, with\n * `clearHiddenValues: false`). Calculated fields hold the value worked out\n * here from these answers.\n */\n answers: Record<string, Json>;\n /** Untrusted URL and host inputs, coerced to their declared types. Identifying ones are left out on anonymous forms. */\n hidden: Record<string, Json>;\n /** Trusted server inputs. Identifying ones are left out on anonymous forms. */\n context: Record<string, Json>;\n ending: string | null;\n /** Client-sent keys that were dropped, each once: unknown fields, server inputs, undeclared or withheld hidden names. */\n ignored: string[];\n}\n\nexport type SubmissionResult =\n | { ok: true; submission: CheckedSubmission }\n | { ok: false; errors: Record<string, string> };\n\n/** Default for `SubmissionOptions.maxEvents`. */\nexport const MAX_EVENTS = 10_000;\n\nconst MALFORMED: SubmissionResult = { ok: false, errors: { \"\": \"Malformed submission.\" } };\n\n// Definitions that parsed cleanly. Failures are not cached: registering a\n// missing field type later can fix them.\nconst parsedDefinitions = new WeakMap<object, true>();\n\nfunction checkDefinition(definition: FormDefinition): string | null {\n if (typeof definition === \"object\" && definition !== null && parsedDefinitions.has(definition)) return null;\n const parsed = parseForm(definition);\n if (!parsed.ok) {\n const list = parsed.issues.map((i) => (i.path ? `${i.path}: ${i.message}` : i.message)).join(\"; \");\n return `Invalid form definition: ${list}`;\n }\n parsedDefinitions.set(definition, true);\n return null;\n}\n\n/** The input as a well-formed submission, or null. Unknown event types are dropped. */\nfunction wellFormed(input: unknown): SubmissionInput | null {\n if (!isPlainObject(input)) return null;\n const { answers, events, hidden } = input;\n const record = (v: unknown) =>\n v === undefined ||\n (isPlainObject(v) && Object.keys(v).every((k) => v[k] === undefined || isJson(v[k])));\n if (!record(answers) || !record(hidden)) return null;\n if (events === undefined) return { answers: answers as SubmissionInput[\"answers\"], hidden: hidden as SubmissionInput[\"hidden\"] };\n if (!Array.isArray(events)) return null;\n const known: FormEvent[] = [];\n for (const e of events as unknown[]) {\n if (isFormEvent(e)) known.push(e);\n else if (!isUnknownEvent(e)) return null;\n }\n return { answers: answers as SubmissionInput[\"answers\"], events: known, hidden: hidden as SubmissionInput[\"hidden\"] };\n}\n\n/**\n * Check a submission against the published definition. Never throws on a\n * malformed submission: it returns `{ ok: false, errors: { \"\": … } }`.\n */\nexport function validateSubmission(\n definition: FormDefinition,\n submission: SubmissionInput,\n options: SubmissionOptions = {},\n): SubmissionResult {\n const invalid = checkDefinition(definition);\n if (invalid) return { ok: false, errors: { \"\": invalid } };\n const input = wellFormed(submission);\n if (!input) return MALFORMED;\n\n // A Set: a key sent many times (one answer event per keystroke) is reported once.\n const ignored = new Set<string>();\n const client = coerceHidden(definition, input.hidden, { sources: [\"url\", \"host\"] });\n for (const name of client.ignored) ignored.add(`hidden.${name}`);\n const hidden = client.values;\n const context = coerceHidden(definition, options.context, { sources: [\"server\"] }).values;\n\n const fields = fieldMap(definition);\n // Anonymous forms never store identifying fields: client values are dropped.\n /** `true`: store it; `false`: withheld; `undefined`: not a field. Both of the latter are reported in `ignored`. */\n const accept = (id: string): boolean | undefined => {\n if (!fields.has(id)) return void ignored.add(id);\n // Calculated values are worked out again here, never taken from the client\n // (whose `engine.answers()` holds them), so they are dropped without a report.\n if (isCalculated(fields.get(id))) return false;\n if (!withheld(definition, fields.get(id))) return true;\n ignored.add(id);\n return false;\n };\n const engineHidden = { ...hidden, ...context };\n let engine: FormEngine;\n if (input.events) {\n const events = compactEvents(input.events);\n const max = options.maxEvents ?? MAX_EVENTS;\n if (events.length > max) {\n return { ok: false, errors: { \"\": `Too many events: ${events.length} after compaction; the limit is ${max}.` } };\n }\n // Unknown fields stay in the log (replay ignores them); withheld ones are removed.\n const kept = events.filter((e) => e.type !== \"answer\" || accept(e.field) !== false);\n engine = replay(definition, kept, { hidden: engineHidden, validators: options.validators });\n } else {\n const answers: Record<string, Json> = {};\n for (const id of Object.keys(input.answers ?? {})) {\n const value = own(input.answers!, id);\n if (accept(id) && value !== undefined) answers[id] = value;\n }\n engine = createForm(definition, {\n initialValues: answers,\n hidden: engineHidden,\n validators: options.validators,\n clock: () => undefined,\n });\n }\n\n const complete = options.complete !== false;\n if (complete) {\n // A replay only reaches \"completed\" through a submit that validated, and a\n // completed response is final: answers after the submit event are ignored.\n if (engine.getState().status !== \"completed\" && !engine.submit()) {\n return { ok: false, errors: engine.getState().errors };\n }\n } else {\n const errors: Record<string, string> = {};\n for (const [id, value] of Object.entries(engine.answers())) {\n const message = validateField(fields.get(id)!, value, {\n requireAnswers: false,\n custom: options.validators?.[id],\n });\n if (message) errors[id] = message;\n }\n if (Object.keys(errors).length) return { ok: false, errors };\n }\n\n const state = engine.getState();\n const answers = engine.answers();\n if (definition.settings?.clearHiddenValues === false) {\n // Values of fields off the path were never validated. Keep one only if\n // its format is valid; drop the rest, so nothing stored is unchecked.\n for (const [id, field] of fields) {\n if (withheld(definition, field)) continue;\n const value = own(state.values, id);\n if (own(answers, id) !== undefined || value === undefined || isEmptyValue(value, field)) continue;\n const message = validateField(field, value, { requireAnswers: false, custom: options.validators?.[id] });\n if (message === null) answers[id] = normalizeValue(value, field);\n }\n }\n\n // Anonymous forms never store identifying hidden inputs either. Logic above\n // still read them, so the path matches the client's.\n const store = (values: Record<string, Json>, report: boolean) => {\n if (definition.settings?.anonymous !== true) return values;\n const identifying = new Set((definition.hidden ?? []).filter((h) => h.identifying === true).map((h) => h.name));\n const kept: Record<string, Json> = {};\n for (const [name, value] of Object.entries(values)) {\n if (!identifying.has(name)) kept[name] = value;\n else if (report) ignored.add(`hidden.${name}`);\n }\n return kept;\n };\n\n return {\n ok: true,\n submission: {\n status: complete ? \"completed\" : \"draft\",\n answers,\n hidden: store(hidden, true),\n context: store(context, false),\n ending: complete ? state.ending : null,\n ignored: [...ignored],\n },\n };\n}\n\n/**\n * The definition as respondents may see it. R1 forms hold nothing secret;\n * assessment answer keys (R4) will be stripped here.\n */\nexport function publicDefinition(definition: FormDefinition): FormDefinition {\n return JSON.parse(JSON.stringify(definition)) as FormDefinition;\n}\n"]}