@marktiderman/genesis-forms 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hash.ts","../src/events.ts","../src/structured.ts","../src/fields.ts","../src/logic.ts","../src/recall.ts","../src/parse.ts","../src/define.ts","../src/hidden.ts","../src/validate.ts","../src/engine.ts","../src/explain.ts"],"names":["field","i","out","isObject","props","maxLength","resolve","f"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Json } from \"./types\";\n\n/** JSON with object keys sorted, so equal definitions serialize identically. */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v !== undefined) out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * A short content fingerprint (cyrb53, 14 hex characters). It detects drift\n * between a definition and its published version; it is not a security hash.\n */\nexport function fingerprint(value: Json | object): string {\n const str = canonicalJson(value);\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16).padStart(14, \"0\");\n}\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","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","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 { 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 if (isObject(block.props) && typeof block.type === \"string\") 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","import { fingerprint } from \"./hash\";\nimport { parseForm } from \"./parse\";\nimport type {\n Condition,\n ContentBlock,\n Ending,\n FieldBlock,\n FormDefinition,\n FormLayout,\n FormSettings,\n HiddenInput,\n Json,\n LogicRule,\n Operator,\n PageBreakBlock,\n} from \"./types\";\n\n// ── Field builders ───────────────────────────────────────────────────────────\n\n/** A field block that remembers its key and value type, for answer inference. */\nexport type FieldSpec<K extends string = string, V = unknown> = FieldBlock & {\n readonly key: K;\n /** Type-level only. */\n readonly __value?: V;\n};\n\nexport interface FieldOptions {\n label: string;\n description?: string | undefined;\n placeholder?: string | undefined;\n required?: boolean | undefined;\n /** Personal or secret data (see `isSensitive`). */\n sensitive?: boolean | undefined;\n /** Identifies the respondent (name, email, phone). Not asked when `settings.anonymous` is true. */\n identifying?: boolean | undefined;\n /** Defaults to the key. Set it before renaming a key on a live form, so answers stay linked. */\n id?: string | undefined;\n}\n\nexport interface ChoiceFieldOptions<O extends string> extends FieldOptions {\n options: readonly { value: O; label?: string }[];\n}\n\nfunction field<K extends string, V>(\n type: string,\n key: K,\n options: FieldOptions,\n props?: Record<string, Json>,\n): FieldSpec<K, V> {\n const block: FieldBlock = {\n kind: \"field\",\n id: options.id ?? key,\n key,\n type,\n label: options.label,\n };\n if (options.description) block.description = options.description;\n if (options.placeholder) block.placeholder = options.placeholder;\n if (options.required) block.required = true;\n if (options.sensitive) block.sensitive = true;\n if (options.identifying) block.identifying = true;\n if (props && Object.keys(props).length) block.props = props;\n return block as FieldSpec<K, V>;\n}\n\n/** The props that are set, so an unset option never becomes `undefined` in the JSON. */\nconst props = (all: Record<string, Json | undefined>): Record<string, Json> =>\n Object.fromEntries(Object.entries(all).filter((e): e is [string, Json] => e[1] !== undefined));\n\nconst choiceProps = (options: readonly { value: string; label?: string }[]): Record<string, Json> => ({\n options: options.map((o): Json => (o.label ? { value: o.value, label: o.label } : { value: o.value })),\n});\n\ninterface HiddenOptions {\n source?: HiddenInput[\"source\"] | undefined;\n sensitive?: boolean | undefined;\n /** Identifies the respondent. Not stored when `settings.anonymous` is true. */\n identifying?: boolean | undefined;\n}\n\n// Typed explicitly: the inferred `sensitive?: true | undefined` from the\n// conditional spread breaks consumers with exactOptionalPropertyTypes on.\nconst hiddenSpec = <T extends HiddenInput[\"type\"]>(\n type: T,\n o: HiddenOptions,\n): { type: T; source: HiddenInput[\"source\"]; sensitive?: true; identifying?: true } => ({\n type,\n source: o.source ?? \"url\",\n ...(o.sensitive ? { sensitive: true as const } : {}),\n ...(o.identifying ? { identifying: true as const } : {}),\n});\n\nexport const f = {\n shortText: <K extends string>(key: K, o: FieldOptions & { maxLength?: number | undefined }) =>\n field<K, string>(\"short-text\", key, o, o.maxLength ? { maxLength: o.maxLength } : undefined),\n longText: <K extends string>(key: K, o: FieldOptions & { maxLength?: number | undefined }) =>\n field<K, string>(\"long-text\", key, o, o.maxLength ? { maxLength: o.maxLength } : undefined),\n email: <K extends string>(key: K, o: FieldOptions) => field<K, string>(\"email\", key, o),\n phone: <K extends string>(key: K, o: FieldOptions) => field<K, string>(\"phone\", key, o),\n rating: <K extends string>(key: K, o: FieldOptions & { max?: number | undefined }) =>\n field<K, number>(\"rating\", key, o, { max: o.max ?? 5 }),\n nps: <K extends string>(key: K, o: FieldOptions) => field<K, number>(\"nps\", key, o),\n singleChoice: <K extends string, O extends string>(key: K, o: ChoiceFieldOptions<O>) =>\n field<K, O>(\"single-choice\", key, o, choiceProps(o.options)),\n multiChoice: <K extends string, O extends string>(key: K, o: ChoiceFieldOptions<O>) =>\n field<K, O[]>(\"multi-choice\", key, o, choiceProps(o.options)),\n yesNo: <K extends string>(key: K, o: FieldOptions) => field<K, boolean>(\"yes-no\", key, o),\n /** Several short answers, one per line: goals, action items, three things that went well. */\n list: <K extends string>(\n key: K,\n o: FieldOptions & {\n min?: number | undefined;\n max?: number | undefined;\n itemMaxLength?: number | undefined;\n itemPlaceholder?: string | undefined;\n },\n ) =>\n field<K, string[]>(\n \"list\",\n key,\n o,\n props({ min: o.min, max: o.max, itemMaxLength: o.itemMaxLength, placeholder: o.itemPlaceholder }),\n ),\n /**\n * A small table each answer fills row by row, one answer per column: an\n * action plan (What / Who / By when), pros and cons.\n */\n table: <K extends string, C extends string>(\n key: K,\n o: FieldOptions & {\n columns: readonly { key: C; label: string; long?: boolean | undefined }[];\n minRows?: number | undefined;\n maxRows?: number | undefined;\n },\n ) =>\n field<K, Partial<Record<C, string>>[]>(\"table\", key, o, {\n columns: o.columns.map((c): Json => (c.long ? { key: c.key, label: c.label, long: true } : { key: c.key, label: c.label })),\n ...props({ minRows: o.minRows, maxRows: o.maxRows }),\n }),\n /**\n * Notes pinned to times in a video or audio (lecture notes, a recorded call\n * review): `at` is seconds from its start.\n */\n mediaNotes: <K extends string>(\n key: K,\n o: FieldOptions & { maxNotes?: number | undefined; textMaxLength?: number | undefined },\n ) =>\n field<K, { at: number; text: string }[]>(\n \"media-notes\",\n key,\n o,\n props({ maxNotes: o.maxNotes, textMaxLength: o.textMaxLength }),\n ),\n /**\n * Highlight passages of a text and note on each (annotating an article, a\n * policy or a contract): `text` here, or supplied by the host app.\n */\n textHighlights: <K extends string>(\n key: K,\n o: FieldOptions & { text?: string | undefined; maxHighlights?: number | undefined },\n ) =>\n field<K, { start: number; end: number; quote: string; note: string }[]>(\n \"text-highlights\",\n key,\n o,\n props({ text: o.text, maxHighlights: o.maxHighlights }),\n ),\n /** Any registered field type, including plugins. */\n custom: <K extends string, V = Json>(type: string, key: K, o: FieldOptions & { props?: Record<string, Json> }) =>\n field<K, V>(type, key, o, o.props),\n\n heading: (id: string, text: string): ContentBlock => ({ kind: \"content\", id, type: \"heading\", text }),\n text: (id: string, text: string): ContentBlock => ({ kind: \"content\", id, type: \"text\", text }),\n pageBreak: (id: string, title?: string): PageBreakBlock =>\n title ? { kind: \"page-break\", id, title } : { kind: \"page-break\", id },\n\n hidden: {\n string: (o: HiddenOptions = {}) => hiddenSpec(\"string\" as const, o),\n number: (o: HiddenOptions = {}) => hiddenSpec(\"number\" as const, o),\n boolean: (o: HiddenOptions = {}) => hiddenSpec(\"boolean\" as const, o),\n },\n};\n\n// ── Rule builder ─────────────────────────────────────────────────────────────\n\n/**\n * Resolves a field key to its id. `\"target\"` (a show/hide target or a jump\n * destination) also accepts the id of a content block.\n */\nexport type KeyResolver = (key: string, as?: \"field\" | \"target\") => string;\n\n/** A rule written with field keys; `defineForm` resolves keys to ids. */\nexport interface RuleSpec {\n readonly __rule: true;\n build(resolve: KeyResolver, id: string): LogicRule;\n}\n\ntype Effects = {\n /** Show a field (by key) or a content block (by id). */\n show(targetKey: string): RuleSpec;\n /** Hide a field (by key) or a content block (by id). */\n hide(targetKey: string): RuleSpec;\n /** Jump from this field to a later field or content block, or to an ending. */\n jumpTo(target: string | { ending: string }): RuleSpec;\n};\n\nfunction effects(fromKey: string | null, condition: (resolve: KeyResolver) => Condition): Effects {\n const spec = (make: (resolve: KeyResolver, id: string) => LogicRule): RuleSpec => ({\n __rule: true,\n build: make,\n });\n return {\n show: (target) => spec((r, id) => ({ id, when: condition(r), effect: \"show\", target: r(target, \"target\") })),\n hide: (target) => spec((r, id) => ({ id, when: condition(r), effect: \"hide\", target: r(target, \"target\") })),\n jumpTo: (target) =>\n spec((r, id) => {\n if (!fromKey) throw new Error(\"jumpTo needs a starting field: use when(key)…\");\n return {\n id,\n when: condition(r),\n effect: \"jump\",\n from: r(fromKey),\n to: typeof target === \"string\" ? r(target, \"target\") : target,\n };\n }),\n };\n}\n\nconst compare =\n (key: string, op: Operator, value?: Json) =>\n (r: KeyResolver): Condition =>\n value === undefined ? { op, left: { field: r(key) } } : { op, left: { field: r(key) }, right: { value } };\n\n/** Start a rule on a field: `when(\"overall\").lessThan(4).jumpTo(\"improve\")`. */\nexport function when(key: string) {\n const on = (op: Operator, value?: Json) => effects(key, compare(key, op, value));\n return {\n is: (value: Json) => on(\"eq\", value),\n isNot: (value: Json) => on(\"neq\", value),\n lessThan: (n: number) => on(\"lt\", n),\n atMost: (n: number) => on(\"lte\", n),\n greaterThan: (n: number) => on(\"gt\", n),\n atLeast: (n: number) => on(\"gte\", n),\n isOneOf: (values: Json[]) => on(\"in\", values),\n includes: (value: Json) => on(\"contains\", value),\n isAnswered: () => on(\"answered\"),\n isEmpty: () => on(\"empty\"),\n };\n}\n\n/** A rule from a raw condition (keys inside `{ field }` operands are resolved). */\nwhen.condition = (condition: Condition, from?: string) =>\n effects(from ?? null, (r) => resolveCondition(condition, r));\n\nfunction resolveCondition(c: Condition, r: KeyResolver): Condition {\n if (\"all\" in c) return { all: c.all.map((x) => resolveCondition(x, r)) };\n if (\"any\" in c) return { any: c.any.map((x) => resolveCondition(x, r)) };\n if (\"not\" in c) return { not: resolveCondition(c.not, r) };\n const fix = (o: typeof c.left) => (\"field\" in o ? { field: r(o.field) } : o);\n return c.right ? { op: c.op, left: fix(c.left), right: fix(c.right) } : { op: c.op, left: fix(c.left) };\n}\n\n// ── defineForm ───────────────────────────────────────────────────────────────\n\ntype HiddenSpec = {\n type: HiddenInput[\"type\"];\n source: HiddenInput[\"source\"];\n sensitive?: boolean | undefined;\n identifying?: boolean | undefined;\n};\ntype HiddenValue<T extends HiddenSpec[\"type\"]> = T extends \"number\" ? number : T extends \"boolean\" ? boolean : string;\n\ntype AnyBlock = FieldSpec<string, unknown> | ContentBlock | PageBreakBlock;\n\nexport type AnswersOf<B extends readonly AnyBlock[]> = {\n [E in B[number] as E extends FieldSpec<infer K, unknown> ? K : never]?: E extends FieldSpec<string, infer V>\n ? V\n : never;\n};\n\nexport interface FormInput<B extends readonly AnyBlock[], H extends Record<string, HiddenSpec>> {\n id: string;\n title: string;\n description?: string;\n layout?: FormLayout;\n /** Authoring sugar: a map of name → spec. Normalized to the canonical array. */\n hidden?: H;\n blocks: B;\n logic?: RuleSpec[];\n endings?: Ending[];\n settings?: FormSettings;\n meta?: Record<string, Json>;\n}\n\nexport interface Form<A = Record<string, unknown>, H = Record<string, unknown>> {\n readonly definition: FormDefinition;\n /** The canonical JSON, identical to what a builder would produce. */\n toJSON(): FormDefinition;\n /** Content fingerprint of the canonical JSON. */\n hash(): string;\n /** Type-level only: the answers, keyed by field key. */\n readonly $answers: A;\n /** Type-level only: the hidden inputs. */\n readonly $hidden: H;\n}\n\n/**\n * Define a form in code. The result's `definition` is the same canonical JSON\n * a builder or `parseForm` produces; answer types are inferred from the blocks.\n */\nexport function defineForm<\n const B extends readonly AnyBlock[],\n H extends Record<string, HiddenSpec> = Record<never, HiddenSpec>,\n>(input: FormInput<B, H>): Form<AnswersOf<B>, { [K in keyof H]?: HiddenValue<H[K][\"type\"]> }> {\n const keyToId = new Map<string, string>();\n const contentIds = new Set<string>();\n for (const block of input.blocks) {\n if (block.kind === \"field\") keyToId.set(block.key, block.id);\n else contentIds.add(block.id);\n }\n const resolve: KeyResolver = (key, as = \"field\") => {\n const id = keyToId.get(key) ?? (as === \"target\" && contentIds.has(key) ? key : undefined);\n if (!id) {\n const what = as === \"target\" ? \"field key or content block id\" : \"field with key\";\n throw new Error(`defineForm \"${input.id}\": no ${what} \"${key}\".`);\n }\n return id;\n };\n\n const definition: FormDefinition = {\n schemaVersion: 1,\n id: input.id,\n title: input.title,\n blocks: input.blocks.map((b) => ({ ...b }) as FieldBlock | ContentBlock | PageBreakBlock),\n };\n if (input.description) definition.description = input.description;\n if (input.layout) definition.layout = input.layout;\n if (input.hidden && Object.keys(input.hidden).length) {\n definition.hidden = Object.entries(input.hidden).map(([name, spec]) => ({\n name,\n type: spec.type,\n source: spec.source,\n ...(spec.sensitive ? { sensitive: true } : {}),\n ...(spec.identifying ? { identifying: true } : {}),\n }));\n }\n if (input.logic?.length) definition.logic = input.logic.map((rule, i) => rule.build(resolve, `r${i + 1}`));\n if (input.endings?.length) definition.endings = input.endings;\n if (input.settings) definition.settings = input.settings;\n if (input.meta) definition.meta = input.meta;\n\n const frozen = JSON.parse(JSON.stringify(definition)) as FormDefinition;\n const parsed = parseForm(frozen);\n if (!parsed.ok) {\n const list = parsed.issues.map((i) => ` - ${i.path ? `${i.path}: ` : \"\"}${i.message}`).join(\"\\n\");\n throw new Error(`defineForm \"${input.id}\" is not a valid form:\\n${list}`);\n }\n return {\n definition: frozen,\n toJSON: () => JSON.parse(JSON.stringify(frozen)) as FormDefinition,\n hash: () => fingerprint(frozen),\n $answers: undefined as never,\n $hidden: undefined as never,\n };\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 { 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","/**\n * \"Why is this hidden?\" A structured trace of one block's visibility, for\n * devtools and tests. Pure: it reads a definition and values, never an engine's\n * internals, so it explains a stored response as well as a live one.\n */\nimport type { FormEngine } from \"./engine\";\nimport { choiceOptions, isEmptyValue } from \"./fields\";\nimport { evaluate, fieldMap, own, ruleVisible, steps, walkPath, withheld, type EvalScope, type PathWalk } from \"./logic\";\nimport type { Condition, FieldBlock, FormDefinition, Json, LogicRule, Operand } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface ExplainInput {\n definition: FormDefinition;\n values: Record<string, Json | undefined>;\n hidden?: Record<string, Json | undefined>;\n}\n\nexport interface RuleTrace {\n ruleId: string;\n effect: \"show\" | \"hide\";\n /** The rule's condition, evaluated against the current values. */\n matched: boolean;\n /** \"Hidden because contact_me is not Yes.\" */\n sentence: string;\n}\n\nexport interface JumpTrace {\n ruleId: string;\n /** Block id the jump fired from. */\n from: string;\n to: string | { ending: string };\n sentence: string;\n}\n\nexport interface FieldValidation {\n /** `not-checked`: the field is hidden, so it is neither validated nor stored. */\n status: \"valid\" | \"invalid\" | \"unanswered\" | \"not-checked\";\n message?: string;\n}\n\nexport interface Explanation {\n blockId: string;\n /** The field key, or the block id for content. */\n key: string;\n kind: \"field\" | \"content\" | \"page-break\";\n /** On the respondent's path given the answers so far. */\n onPath: boolean;\n /** Visible by show/hide rules alone (ignoring jumps). */\n ruleVisible: boolean;\n /** What the respondent sees: on the path and rule-visible. */\n visible: boolean;\n /** The jump that carried the path past this block, if any. */\n skippedBy?: JumpTrace;\n /** Every show/hide rule targeting this block, in definition order. */\n rules: RuleTrace[];\n /** Fields only. */\n validation?: FieldValidation;\n /** One plain-English line: the main reason. */\n summary: string;\n}\n\nexport interface ExplainOptions {\n validators?: Record<string, FieldValidator>;\n}\n\ntype JumpRule = Extract<LogicRule, { effect: \"jump\" }>;\ntype VisibilityRule = Extract<LogicRule, { target: string }>;\n\n/** Explain a block's visibility. `blockId` may also be a field key. */\nexport function explain(\n source: FormEngine | ExplainInput,\n blockId: string,\n options: ExplainOptions = {},\n): Explanation {\n const input: ExplainInput =\n \"getState\" in source\n ? { definition: source.definition, values: source.getState().values, hidden: source.getState().hidden }\n : source;\n const def = input.definition;\n const fields = fieldMap(def);\n const scope: EvalScope = { values: input.values, hidden: input.hidden ?? {}, fields };\n\n const block =\n def.blocks.find((b) => b.id === blockId) ??\n def.blocks.find((b) => b.kind === \"field\" && b.key === blockId);\n if (!block) throw new Error(`explain: no block \"${blockId}\".`);\n const id = block.id;\n const nameOf = (bid: string) => {\n const b = def.blocks.find((x) => x.id === bid);\n return b?.kind === \"field\" ? b.key : bid;\n };\n const key = nameOf(id);\n // Logic reads only the answers on the path before a block.\n const walk = walkPath(def, scope);\n const at = walk.scopeAt(id);\n\n const rules: RuleTrace[] = (def.logic ?? [])\n .filter((r): r is VisibilityRule => (r.effect === \"show\" || r.effect === \"hide\") && r.target === id)\n .map((r) => {\n const matched = evaluate(r.when, at);\n const cond = describeCondition(r.when, def, fields);\n const sentence =\n r.effect === \"hide\"\n ? matched\n ? `Hidden because ${cond}.`\n : `Would be hidden if ${cond}.`\n : matched\n ? `Shown because ${cond}.`\n : `Hidden until ${cond}.`;\n return { ruleId: r.id, effect: r.effect, matched, sentence };\n });\n\n const { path } = walk;\n const onPath = path.includes(id);\n const visibleByRules = ruleVisible(def, id, scope);\n const skippedBy = onPath ? undefined : findSkippingJump(def, walk, id, nameOf);\n const visible = onPath && visibleByRules;\n\n let validation: FieldValidation | undefined;\n if (block.kind === \"field\") {\n const value = own(input.values, id);\n if (!visible) validation = { status: \"not-checked\" };\n else {\n const message = validateField(block, value, { custom: options.validators?.[id] });\n if (message) validation = { status: \"invalid\", message };\n else validation = { status: isEmptyValue(value, block) ? \"unanswered\" : \"valid\" };\n }\n }\n\n let summary: string;\n if (block.kind === \"page-break\") summary = \"Page breaks are never on the path; they only group blocks into pages.\";\n else if (visible) summary = rules.find((r) => r.effect === \"show\" && r.matched)?.sentence ?? \"Visible: no rule hides it.\";\n else if (block.kind === \"field\" && withheld(def, block)) {\n summary = \"Not asked: the form is anonymous and this field identifies the respondent.\";\n } else if (!visibleByRules) {\n summary =\n rules.find((r) => r.effect === \"hide\" && r.matched)?.sentence ??\n rules.find((r) => r.effect === \"show\")?.sentence ??\n \"Hidden by logic.\";\n } else if (skippedBy) summary = skippedBy.sentence;\n else summary = \"Not on the path.\";\n\n return {\n blockId: id,\n key,\n kind: block.kind,\n onPath,\n ruleVisible: visibleByRules,\n visible,\n ...(skippedBy ? { skippedBy } : {}),\n rules,\n ...(validation ? { validation } : {}),\n summary,\n };\n}\n\n/** The effective jump on the path that passes over `id`, mirroring `computePath`. */\nfunction findSkippingJump(\n def: FormDefinition,\n walk: PathWalk,\n id: string,\n nameOf: (id: string) => string,\n): JumpTrace | undefined {\n const list = steps(def);\n const index = new Map(list.map((b, i) => [b.id, i]));\n const at = index.get(id);\n if (at === undefined) return undefined;\n const jumps = (def.logic ?? []).filter((r): r is JumpRule => r.effect === \"jump\");\n for (const from of walk.path) {\n const i = index.get(from)!;\n if (i >= at) break;\n const scope = walk.scopeAt(from, true);\n const jump = jumps.find((r) => r.from === from && evaluate(r.when, scope));\n if (!jump) continue;\n const cond = describeCondition(jump.when, def, fieldMap(def));\n if (typeof jump.to === \"object\") {\n return {\n ruleId: jump.id,\n from,\n to: jump.to,\n sentence: `Skipped: ${nameOf(from)} jumps to the \"${jump.to.ending}\" ending because ${cond}.`,\n };\n }\n const target = index.get(jump.to);\n if (target !== undefined && target > i && at < target) {\n return {\n ruleId: jump.id,\n from,\n to: jump.to,\n sentence: `Skipped: ${nameOf(from)} jumps to ${nameOf(jump.to)} because ${cond}.`,\n };\n }\n }\n return undefined;\n}\n\nconst OPS: Record<string, string> = {\n eq: \"is\",\n neq: \"is not\",\n lt: \"is less than\",\n lte: \"is at most\",\n gt: \"is more than\",\n gte: \"is at least\",\n in: \"is one of\",\n contains: \"includes\",\n answered: \"is answered\",\n empty: \"is unanswered\",\n};\n\nfunction describeValue(value: Json | undefined, field?: FieldBlock): string {\n if (value === undefined || value === null) return \"nothing\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"string\") {\n const label = field ? choiceOptions(field).find((o) => o.value === value)?.label : undefined;\n return `\"${label ?? value}\"`;\n }\n if (Array.isArray(value)) return value.map((v) => describeValue(v, field)).join(\", \");\n return JSON.stringify(value);\n}\n\nfunction describeOperand(operand: Operand, def: FormDefinition, fields: Map<string, FieldBlock>): string {\n if (\"field\" in operand) return fields.get(operand.field)?.key ?? operand.field;\n if (\"hidden\" in operand) return `the ${operand.hidden} input`;\n return describeValue(operand.value);\n}\n\n/** A condition as a plain-English clause: `contact_me is not Yes`. */\nexport function describeCondition(\n condition: Condition,\n def: FormDefinition,\n fields: Map<string, FieldBlock> = fieldMap(def),\n): string {\n const group = (c: Condition) => {\n const text = describeCondition(c, def, fields);\n return \"all\" in c || \"any\" in c ? `(${text})` : text;\n };\n if (\"all\" in condition) return condition.all.map(group).join(\" and \");\n if (\"any\" in condition) return condition.any.map(group).join(\" or \");\n if (\"not\" in condition) return `it is not the case that ${group(condition.not)}`;\n const left = describeOperand(condition.left, def, fields);\n const op = OPS[condition.op] ?? condition.op;\n if (!condition.right) return `${left} ${op}`;\n const field = \"field\" in condition.left ? fields.get(condition.left.field) : undefined;\n const right =\n \"value\" in condition.right\n ? describeValue(condition.right.value, field)\n : describeOperand(condition.right, def, fields);\n return `${left} ${op} ${right}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/hash.ts","../src/events.ts","../src/structured.ts","../src/fields.ts","../src/logic.ts","../src/recall.ts","../src/parse.ts","../src/define.ts","../src/hidden.ts","../src/validate.ts","../src/engine.ts","../src/explain.ts"],"names":["field","i","out","isObject","props","maxLength","resolve","f"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Json } from \"./types\";\n\n/** JSON with object keys sorted, so equal definitions serialize identically. */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v !== undefined) out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * A short content fingerprint (cyrb53, 14 hex characters). It detects drift\n * between a definition and its published version; it is not a security hash.\n */\nexport function fingerprint(value: Json | object): string {\n const str = canonicalJson(value);\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16).padStart(14, \"0\");\n}\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","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","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 { 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","import { fingerprint } from \"./hash\";\nimport { parseForm } from \"./parse\";\nimport type {\n Condition,\n ContentBlock,\n Ending,\n FieldBlock,\n FormDefinition,\n FormLayout,\n FormSettings,\n HiddenInput,\n Json,\n LogicRule,\n Operator,\n PageBreakBlock,\n} from \"./types\";\n\n// ── Field builders ───────────────────────────────────────────────────────────\n\n/** A field block that remembers its key and value type, for answer inference. */\nexport type FieldSpec<K extends string = string, V = unknown> = FieldBlock & {\n readonly key: K;\n /** Type-level only. */\n readonly __value?: V;\n};\n\nexport interface FieldOptions {\n label: string;\n description?: string | undefined;\n placeholder?: string | undefined;\n required?: boolean | undefined;\n /** Personal or secret data (see `isSensitive`). */\n sensitive?: boolean | undefined;\n /** Identifies the respondent (name, email, phone). Not asked when `settings.anonymous` is true. */\n identifying?: boolean | undefined;\n /** Defaults to the key. Set it before renaming a key on a live form, so answers stay linked. */\n id?: string | undefined;\n}\n\nexport interface ChoiceFieldOptions<O extends string> extends FieldOptions {\n options: readonly { value: O; label?: string }[];\n}\n\nfunction field<K extends string, V>(\n type: string,\n key: K,\n options: FieldOptions,\n props?: Record<string, Json>,\n): FieldSpec<K, V> {\n const block: FieldBlock = {\n kind: \"field\",\n id: options.id ?? key,\n key,\n type,\n label: options.label,\n };\n if (options.description) block.description = options.description;\n if (options.placeholder) block.placeholder = options.placeholder;\n if (options.required) block.required = true;\n if (options.sensitive) block.sensitive = true;\n if (options.identifying) block.identifying = true;\n if (props && Object.keys(props).length) block.props = props;\n return block as FieldSpec<K, V>;\n}\n\n/** The props that are set, so an unset option never becomes `undefined` in the JSON. */\nconst props = (all: Record<string, Json | undefined>): Record<string, Json> =>\n Object.fromEntries(Object.entries(all).filter((e): e is [string, Json] => e[1] !== undefined));\n\nconst choiceProps = (options: readonly { value: string; label?: string }[]): Record<string, Json> => ({\n options: options.map((o): Json => (o.label ? { value: o.value, label: o.label } : { value: o.value })),\n});\n\ninterface HiddenOptions {\n source?: HiddenInput[\"source\"] | undefined;\n sensitive?: boolean | undefined;\n /** Identifies the respondent. Not stored when `settings.anonymous` is true. */\n identifying?: boolean | undefined;\n}\n\n// Typed explicitly: the inferred `sensitive?: true | undefined` from the\n// conditional spread breaks consumers with exactOptionalPropertyTypes on.\nconst hiddenSpec = <T extends HiddenInput[\"type\"]>(\n type: T,\n o: HiddenOptions,\n): { type: T; source: HiddenInput[\"source\"]; sensitive?: true; identifying?: true } => ({\n type,\n source: o.source ?? \"url\",\n ...(o.sensitive ? { sensitive: true as const } : {}),\n ...(o.identifying ? { identifying: true as const } : {}),\n});\n\nexport const f = {\n shortText: <K extends string>(key: K, o: FieldOptions & { maxLength?: number | undefined }) =>\n field<K, string>(\"short-text\", key, o, o.maxLength ? { maxLength: o.maxLength } : undefined),\n longText: <K extends string>(key: K, o: FieldOptions & { maxLength?: number | undefined }) =>\n field<K, string>(\"long-text\", key, o, o.maxLength ? { maxLength: o.maxLength } : undefined),\n email: <K extends string>(key: K, o: FieldOptions) => field<K, string>(\"email\", key, o),\n phone: <K extends string>(key: K, o: FieldOptions) => field<K, string>(\"phone\", key, o),\n rating: <K extends string>(key: K, o: FieldOptions & { max?: number | undefined }) =>\n field<K, number>(\"rating\", key, o, { max: o.max ?? 5 }),\n nps: <K extends string>(key: K, o: FieldOptions) => field<K, number>(\"nps\", key, o),\n singleChoice: <K extends string, O extends string>(key: K, o: ChoiceFieldOptions<O>) =>\n field<K, O>(\"single-choice\", key, o, choiceProps(o.options)),\n multiChoice: <K extends string, O extends string>(key: K, o: ChoiceFieldOptions<O>) =>\n field<K, O[]>(\"multi-choice\", key, o, choiceProps(o.options)),\n yesNo: <K extends string>(key: K, o: FieldOptions) => field<K, boolean>(\"yes-no\", key, o),\n /** Several short answers, one per line: goals, action items, three things that went well. */\n list: <K extends string>(\n key: K,\n o: FieldOptions & {\n min?: number | undefined;\n max?: number | undefined;\n itemMaxLength?: number | undefined;\n itemPlaceholder?: string | undefined;\n },\n ) =>\n field<K, string[]>(\n \"list\",\n key,\n o,\n props({ min: o.min, max: o.max, itemMaxLength: o.itemMaxLength, placeholder: o.itemPlaceholder }),\n ),\n /**\n * A small table each answer fills row by row, one answer per column: an\n * action plan (What / Who / By when), pros and cons.\n */\n table: <K extends string, C extends string>(\n key: K,\n o: FieldOptions & {\n columns: readonly { key: C; label: string; long?: boolean | undefined }[];\n minRows?: number | undefined;\n maxRows?: number | undefined;\n },\n ) =>\n field<K, Partial<Record<C, string>>[]>(\"table\", key, o, {\n columns: o.columns.map((c): Json => (c.long ? { key: c.key, label: c.label, long: true } : { key: c.key, label: c.label })),\n ...props({ minRows: o.minRows, maxRows: o.maxRows }),\n }),\n /**\n * Notes pinned to times in a video or audio (lecture notes, a recorded call\n * review): `at` is seconds from its start.\n */\n mediaNotes: <K extends string>(\n key: K,\n o: FieldOptions & { maxNotes?: number | undefined; textMaxLength?: number | undefined },\n ) =>\n field<K, { at: number; text: string }[]>(\n \"media-notes\",\n key,\n o,\n props({ maxNotes: o.maxNotes, textMaxLength: o.textMaxLength }),\n ),\n /**\n * Highlight passages of a text and note on each (annotating an article, a\n * policy or a contract): `text` here, or supplied by the host app.\n */\n textHighlights: <K extends string>(\n key: K,\n o: FieldOptions & { text?: string | undefined; maxHighlights?: number | undefined },\n ) =>\n field<K, { start: number; end: number; quote: string; note: string }[]>(\n \"text-highlights\",\n key,\n o,\n props({ text: o.text, maxHighlights: o.maxHighlights }),\n ),\n /** Any registered field type, including plugins. */\n custom: <K extends string, V = Json>(type: string, key: K, o: FieldOptions & { props?: Record<string, Json> }) =>\n field<K, V>(type, key, o, o.props),\n\n heading: (id: string, text: string): ContentBlock => ({ kind: \"content\", id, type: \"heading\", text }),\n text: (id: string, text: string): ContentBlock => ({ kind: \"content\", id, type: \"text\", text }),\n pageBreak: (id: string, title?: string): PageBreakBlock =>\n title ? { kind: \"page-break\", id, title } : { kind: \"page-break\", id },\n\n hidden: {\n string: (o: HiddenOptions = {}) => hiddenSpec(\"string\" as const, o),\n number: (o: HiddenOptions = {}) => hiddenSpec(\"number\" as const, o),\n boolean: (o: HiddenOptions = {}) => hiddenSpec(\"boolean\" as const, o),\n },\n};\n\n// ── Rule builder ─────────────────────────────────────────────────────────────\n\n/**\n * Resolves a field key to its id. `\"target\"` (a show/hide target or a jump\n * destination) also accepts the id of a content block.\n */\nexport type KeyResolver = (key: string, as?: \"field\" | \"target\") => string;\n\n/** A rule written with field keys; `defineForm` resolves keys to ids. */\nexport interface RuleSpec {\n readonly __rule: true;\n build(resolve: KeyResolver, id: string): LogicRule;\n}\n\ntype Effects = {\n /** Show a field (by key) or a content block (by id). */\n show(targetKey: string): RuleSpec;\n /** Hide a field (by key) or a content block (by id). */\n hide(targetKey: string): RuleSpec;\n /** Jump from this field to a later field or content block, or to an ending. */\n jumpTo(target: string | { ending: string }): RuleSpec;\n};\n\nfunction effects(fromKey: string | null, condition: (resolve: KeyResolver) => Condition): Effects {\n const spec = (make: (resolve: KeyResolver, id: string) => LogicRule): RuleSpec => ({\n __rule: true,\n build: make,\n });\n return {\n show: (target) => spec((r, id) => ({ id, when: condition(r), effect: \"show\", target: r(target, \"target\") })),\n hide: (target) => spec((r, id) => ({ id, when: condition(r), effect: \"hide\", target: r(target, \"target\") })),\n jumpTo: (target) =>\n spec((r, id) => {\n if (!fromKey) throw new Error(\"jumpTo needs a starting field: use when(key)…\");\n return {\n id,\n when: condition(r),\n effect: \"jump\",\n from: r(fromKey),\n to: typeof target === \"string\" ? r(target, \"target\") : target,\n };\n }),\n };\n}\n\nconst compare =\n (key: string, op: Operator, value?: Json) =>\n (r: KeyResolver): Condition =>\n value === undefined ? { op, left: { field: r(key) } } : { op, left: { field: r(key) }, right: { value } };\n\n/** Start a rule on a field: `when(\"overall\").lessThan(4).jumpTo(\"improve\")`. */\nexport function when(key: string) {\n const on = (op: Operator, value?: Json) => effects(key, compare(key, op, value));\n return {\n is: (value: Json) => on(\"eq\", value),\n isNot: (value: Json) => on(\"neq\", value),\n lessThan: (n: number) => on(\"lt\", n),\n atMost: (n: number) => on(\"lte\", n),\n greaterThan: (n: number) => on(\"gt\", n),\n atLeast: (n: number) => on(\"gte\", n),\n isOneOf: (values: Json[]) => on(\"in\", values),\n includes: (value: Json) => on(\"contains\", value),\n isAnswered: () => on(\"answered\"),\n isEmpty: () => on(\"empty\"),\n };\n}\n\n/** A rule from a raw condition (keys inside `{ field }` operands are resolved). */\nwhen.condition = (condition: Condition, from?: string) =>\n effects(from ?? null, (r) => resolveCondition(condition, r));\n\nfunction resolveCondition(c: Condition, r: KeyResolver): Condition {\n if (\"all\" in c) return { all: c.all.map((x) => resolveCondition(x, r)) };\n if (\"any\" in c) return { any: c.any.map((x) => resolveCondition(x, r)) };\n if (\"not\" in c) return { not: resolveCondition(c.not, r) };\n const fix = (o: typeof c.left) => (\"field\" in o ? { field: r(o.field) } : o);\n return c.right ? { op: c.op, left: fix(c.left), right: fix(c.right) } : { op: c.op, left: fix(c.left) };\n}\n\n// ── defineForm ───────────────────────────────────────────────────────────────\n\ntype HiddenSpec = {\n type: HiddenInput[\"type\"];\n source: HiddenInput[\"source\"];\n sensitive?: boolean | undefined;\n identifying?: boolean | undefined;\n};\ntype HiddenValue<T extends HiddenSpec[\"type\"]> = T extends \"number\" ? number : T extends \"boolean\" ? boolean : string;\n\ntype AnyBlock = FieldSpec<string, unknown> | ContentBlock | PageBreakBlock;\n\nexport type AnswersOf<B extends readonly AnyBlock[]> = {\n [E in B[number] as E extends FieldSpec<infer K, unknown> ? K : never]?: E extends FieldSpec<string, infer V>\n ? V\n : never;\n};\n\nexport interface FormInput<B extends readonly AnyBlock[], H extends Record<string, HiddenSpec>> {\n id: string;\n title: string;\n description?: string;\n layout?: FormLayout;\n /** Authoring sugar: a map of name → spec. Normalized to the canonical array. */\n hidden?: H;\n blocks: B;\n logic?: RuleSpec[];\n endings?: Ending[];\n settings?: FormSettings;\n meta?: Record<string, Json>;\n}\n\nexport interface Form<A = Record<string, unknown>, H = Record<string, unknown>> {\n readonly definition: FormDefinition;\n /** The canonical JSON, identical to what a builder would produce. */\n toJSON(): FormDefinition;\n /** Content fingerprint of the canonical JSON. */\n hash(): string;\n /** Type-level only: the answers, keyed by field key. */\n readonly $answers: A;\n /** Type-level only: the hidden inputs. */\n readonly $hidden: H;\n}\n\n/**\n * Define a form in code. The result's `definition` is the same canonical JSON\n * a builder or `parseForm` produces; answer types are inferred from the blocks.\n */\nexport function defineForm<\n const B extends readonly AnyBlock[],\n H extends Record<string, HiddenSpec> = Record<never, HiddenSpec>,\n>(input: FormInput<B, H>): Form<AnswersOf<B>, { [K in keyof H]?: HiddenValue<H[K][\"type\"]> }> {\n const keyToId = new Map<string, string>();\n const contentIds = new Set<string>();\n for (const block of input.blocks) {\n if (block.kind === \"field\") keyToId.set(block.key, block.id);\n else contentIds.add(block.id);\n }\n const resolve: KeyResolver = (key, as = \"field\") => {\n const id = keyToId.get(key) ?? (as === \"target\" && contentIds.has(key) ? key : undefined);\n if (!id) {\n const what = as === \"target\" ? \"field key or content block id\" : \"field with key\";\n throw new Error(`defineForm \"${input.id}\": no ${what} \"${key}\".`);\n }\n return id;\n };\n\n const definition: FormDefinition = {\n schemaVersion: 1,\n id: input.id,\n title: input.title,\n blocks: input.blocks.map((b) => ({ ...b }) as FieldBlock | ContentBlock | PageBreakBlock),\n };\n if (input.description) definition.description = input.description;\n if (input.layout) definition.layout = input.layout;\n if (input.hidden && Object.keys(input.hidden).length) {\n definition.hidden = Object.entries(input.hidden).map(([name, spec]) => ({\n name,\n type: spec.type,\n source: spec.source,\n ...(spec.sensitive ? { sensitive: true } : {}),\n ...(spec.identifying ? { identifying: true } : {}),\n }));\n }\n if (input.logic?.length) definition.logic = input.logic.map((rule, i) => rule.build(resolve, `r${i + 1}`));\n if (input.endings?.length) definition.endings = input.endings;\n if (input.settings) definition.settings = input.settings;\n if (input.meta) definition.meta = input.meta;\n\n const frozen = JSON.parse(JSON.stringify(definition)) as FormDefinition;\n const parsed = parseForm(frozen);\n if (!parsed.ok) {\n const list = parsed.issues.map((i) => ` - ${i.path ? `${i.path}: ` : \"\"}${i.message}`).join(\"\\n\");\n throw new Error(`defineForm \"${input.id}\" is not a valid form:\\n${list}`);\n }\n return {\n definition: frozen,\n toJSON: () => JSON.parse(JSON.stringify(frozen)) as FormDefinition,\n hash: () => fingerprint(frozen),\n $answers: undefined as never,\n $hidden: undefined as never,\n };\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 { 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","/**\n * \"Why is this hidden?\" A structured trace of one block's visibility, for\n * devtools and tests. Pure: it reads a definition and values, never an engine's\n * internals, so it explains a stored response as well as a live one.\n */\nimport type { FormEngine } from \"./engine\";\nimport { choiceOptions, isEmptyValue } from \"./fields\";\nimport { evaluate, fieldMap, own, ruleVisible, steps, walkPath, withheld, type EvalScope, type PathWalk } from \"./logic\";\nimport type { Condition, FieldBlock, FormDefinition, Json, LogicRule, Operand } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface ExplainInput {\n definition: FormDefinition;\n values: Record<string, Json | undefined>;\n hidden?: Record<string, Json | undefined>;\n}\n\nexport interface RuleTrace {\n ruleId: string;\n effect: \"show\" | \"hide\";\n /** The rule's condition, evaluated against the current values. */\n matched: boolean;\n /** \"Hidden because contact_me is not Yes.\" */\n sentence: string;\n}\n\nexport interface JumpTrace {\n ruleId: string;\n /** Block id the jump fired from. */\n from: string;\n to: string | { ending: string };\n sentence: string;\n}\n\nexport interface FieldValidation {\n /** `not-checked`: the field is hidden, so it is neither validated nor stored. */\n status: \"valid\" | \"invalid\" | \"unanswered\" | \"not-checked\";\n message?: string;\n}\n\nexport interface Explanation {\n blockId: string;\n /** The field key, or the block id for content. */\n key: string;\n kind: \"field\" | \"content\" | \"page-break\";\n /** On the respondent's path given the answers so far. */\n onPath: boolean;\n /** Visible by show/hide rules alone (ignoring jumps). */\n ruleVisible: boolean;\n /** What the respondent sees: on the path and rule-visible. */\n visible: boolean;\n /** The jump that carried the path past this block, if any. */\n skippedBy?: JumpTrace;\n /** Every show/hide rule targeting this block, in definition order. */\n rules: RuleTrace[];\n /** Fields only. */\n validation?: FieldValidation;\n /** One plain-English line: the main reason. */\n summary: string;\n}\n\nexport interface ExplainOptions {\n validators?: Record<string, FieldValidator>;\n}\n\ntype JumpRule = Extract<LogicRule, { effect: \"jump\" }>;\ntype VisibilityRule = Extract<LogicRule, { target: string }>;\n\n/** Explain a block's visibility. `blockId` may also be a field key. */\nexport function explain(\n source: FormEngine | ExplainInput,\n blockId: string,\n options: ExplainOptions = {},\n): Explanation {\n const input: ExplainInput =\n \"getState\" in source\n ? { definition: source.definition, values: source.getState().values, hidden: source.getState().hidden }\n : source;\n const def = input.definition;\n const fields = fieldMap(def);\n const scope: EvalScope = { values: input.values, hidden: input.hidden ?? {}, fields };\n\n const block =\n def.blocks.find((b) => b.id === blockId) ??\n def.blocks.find((b) => b.kind === \"field\" && b.key === blockId);\n if (!block) throw new Error(`explain: no block \"${blockId}\".`);\n const id = block.id;\n const nameOf = (bid: string) => {\n const b = def.blocks.find((x) => x.id === bid);\n return b?.kind === \"field\" ? b.key : bid;\n };\n const key = nameOf(id);\n // Logic reads only the answers on the path before a block.\n const walk = walkPath(def, scope);\n const at = walk.scopeAt(id);\n\n const rules: RuleTrace[] = (def.logic ?? [])\n .filter((r): r is VisibilityRule => (r.effect === \"show\" || r.effect === \"hide\") && r.target === id)\n .map((r) => {\n const matched = evaluate(r.when, at);\n const cond = describeCondition(r.when, def, fields);\n const sentence =\n r.effect === \"hide\"\n ? matched\n ? `Hidden because ${cond}.`\n : `Would be hidden if ${cond}.`\n : matched\n ? `Shown because ${cond}.`\n : `Hidden until ${cond}.`;\n return { ruleId: r.id, effect: r.effect, matched, sentence };\n });\n\n const { path } = walk;\n const onPath = path.includes(id);\n const visibleByRules = ruleVisible(def, id, scope);\n const skippedBy = onPath ? undefined : findSkippingJump(def, walk, id, nameOf);\n const visible = onPath && visibleByRules;\n\n let validation: FieldValidation | undefined;\n if (block.kind === \"field\") {\n const value = own(input.values, id);\n if (!visible) validation = { status: \"not-checked\" };\n else {\n const message = validateField(block, value, { custom: options.validators?.[id] });\n if (message) validation = { status: \"invalid\", message };\n else validation = { status: isEmptyValue(value, block) ? \"unanswered\" : \"valid\" };\n }\n }\n\n let summary: string;\n if (block.kind === \"page-break\") summary = \"Page breaks are never on the path; they only group blocks into pages.\";\n else if (visible) summary = rules.find((r) => r.effect === \"show\" && r.matched)?.sentence ?? \"Visible: no rule hides it.\";\n else if (block.kind === \"field\" && withheld(def, block)) {\n summary = \"Not asked: the form is anonymous and this field identifies the respondent.\";\n } else if (!visibleByRules) {\n summary =\n rules.find((r) => r.effect === \"hide\" && r.matched)?.sentence ??\n rules.find((r) => r.effect === \"show\")?.sentence ??\n \"Hidden by logic.\";\n } else if (skippedBy) summary = skippedBy.sentence;\n else summary = \"Not on the path.\";\n\n return {\n blockId: id,\n key,\n kind: block.kind,\n onPath,\n ruleVisible: visibleByRules,\n visible,\n ...(skippedBy ? { skippedBy } : {}),\n rules,\n ...(validation ? { validation } : {}),\n summary,\n };\n}\n\n/** The effective jump on the path that passes over `id`, mirroring `computePath`. */\nfunction findSkippingJump(\n def: FormDefinition,\n walk: PathWalk,\n id: string,\n nameOf: (id: string) => string,\n): JumpTrace | undefined {\n const list = steps(def);\n const index = new Map(list.map((b, i) => [b.id, i]));\n const at = index.get(id);\n if (at === undefined) return undefined;\n const jumps = (def.logic ?? []).filter((r): r is JumpRule => r.effect === \"jump\");\n for (const from of walk.path) {\n const i = index.get(from)!;\n if (i >= at) break;\n const scope = walk.scopeAt(from, true);\n const jump = jumps.find((r) => r.from === from && evaluate(r.when, scope));\n if (!jump) continue;\n const cond = describeCondition(jump.when, def, fieldMap(def));\n if (typeof jump.to === \"object\") {\n return {\n ruleId: jump.id,\n from,\n to: jump.to,\n sentence: `Skipped: ${nameOf(from)} jumps to the \"${jump.to.ending}\" ending because ${cond}.`,\n };\n }\n const target = index.get(jump.to);\n if (target !== undefined && target > i && at < target) {\n return {\n ruleId: jump.id,\n from,\n to: jump.to,\n sentence: `Skipped: ${nameOf(from)} jumps to ${nameOf(jump.to)} because ${cond}.`,\n };\n }\n }\n return undefined;\n}\n\nconst OPS: Record<string, string> = {\n eq: \"is\",\n neq: \"is not\",\n lt: \"is less than\",\n lte: \"is at most\",\n gt: \"is more than\",\n gte: \"is at least\",\n in: \"is one of\",\n contains: \"includes\",\n answered: \"is answered\",\n empty: \"is unanswered\",\n};\n\nfunction describeValue(value: Json | undefined, field?: FieldBlock): string {\n if (value === undefined || value === null) return \"nothing\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"string\") {\n const label = field ? choiceOptions(field).find((o) => o.value === value)?.label : undefined;\n return `\"${label ?? value}\"`;\n }\n if (Array.isArray(value)) return value.map((v) => describeValue(v, field)).join(\", \");\n return JSON.stringify(value);\n}\n\nfunction describeOperand(operand: Operand, def: FormDefinition, fields: Map<string, FieldBlock>): string {\n if (\"field\" in operand) return fields.get(operand.field)?.key ?? operand.field;\n if (\"hidden\" in operand) return `the ${operand.hidden} input`;\n return describeValue(operand.value);\n}\n\n/** A condition as a plain-English clause: `contact_me is not Yes`. */\nexport function describeCondition(\n condition: Condition,\n def: FormDefinition,\n fields: Map<string, FieldBlock> = fieldMap(def),\n): string {\n const group = (c: Condition) => {\n const text = describeCondition(c, def, fields);\n return \"all\" in c || \"any\" in c ? `(${text})` : text;\n };\n if (\"all\" in condition) return condition.all.map(group).join(\" and \");\n if (\"any\" in condition) return condition.any.map(group).join(\" or \");\n if (\"not\" in condition) return `it is not the case that ${group(condition.not)}`;\n const left = describeOperand(condition.left, def, fields);\n const op = OPS[condition.op] ?? condition.op;\n if (!condition.right) return `${left} ${op}`;\n const field = \"field\" in condition.left ? fields.get(condition.left.field) : undefined;\n const right =\n \"value\" in condition.right\n ? describeValue(condition.right.value, field)\n : describeOperand(condition.right, def, fields);\n return `${left} ${op} ${right}`;\n}\n"]}