@marktiderman/genesis-forms 0.4.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula.ts","../src/calculated.ts","../src/structured.ts","../src/fields.ts","../src/events.ts","../src/hidden.ts","../src/logic.ts","../src/recall.ts","../src/validate.ts","../src/engine.ts","../src/hash.ts","../src/coverage.ts","../src/parse.ts","../src/server.ts","../src/scenario.ts","../src/testing.ts"],"names":["own","blank","same","numberOps","finite","i","out","round","isObject","maxLength","name","answers"],"mappings":"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","file":"testing.cjs","sourcesContent":["/**\n * A small, safe formula language for `calculated` fields. It is parsed and\n * evaluated here, never with `eval` or `Function`, and it can only read the\n * answers it names.\n *\n * - Numbers: `12`, `0.5`. Text: `\"High\"` or `'High'`.\n * - Answers by key: `hours`, and one column of a table: `plan.cost`.\n * - Arithmetic: `+ - * /` (also `− × ÷`), unary minus, parentheses.\n * - Comparisons: `== != < <= > >=` (also `= ≠ ≤ ≥`), giving true or false.\n * - A choice: `cond ? a : b`.\n * - `sum(...)`, `avg(...)`, `min(...)`, `max(...)` over numbers, lists and\n * table columns. Blanks and text that is not a number are skipped.\n *\n * An unanswered question reads as blank: arithmetic with a blank is blank\n * (so a total stays empty until its answers are in), and so is dividing by\n * zero. Text that holds a number (\"12\") counts as that number; yes / no\n * counts as 1 / 0.\n */\nimport type { Json } from \"./types\";\n\nexport type FormulaValue = number | string | boolean | null | FormulaValue[];\n\n/** An answer a formula reads: `key`, or `key.column` for one column of a table. */\nexport interface FormulaRef {\n key: string;\n column?: string;\n}\n\ntype BinaryOp = \"+\" | \"-\" | \"*\" | \"/\" | \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\";\n\nexport const FORMULA_FUNCTIONS = [\"sum\", \"avg\", \"min\", \"max\"] as const;\nexport type FormulaFunction = (typeof FORMULA_FUNCTIONS)[number];\n\nexport type FormulaNode =\n | { kind: \"number\"; value: number }\n | { kind: \"text\"; value: string }\n | { kind: \"ref\"; key: string; column?: string; at: number }\n | { kind: \"unary\"; op: \"-\"; arg: FormulaNode }\n | { kind: \"binary\"; op: BinaryOp; left: FormulaNode; right: FormulaNode }\n | { kind: \"if\"; test: FormulaNode; then: FormulaNode; else: FormulaNode }\n | { kind: \"call\"; fn: FormulaFunction; args: FormulaNode[] };\n\nexport type FormulaParseResult =\n | { ok: true; ast: FormulaNode; refs: FormulaRef[] }\n | { ok: false; message: string; /** Character offset of the problem. */ at: number };\n\n/** Longest formula accepted. */\nexport const MAX_FORMULA_LENGTH = 2000;\n/** Deepest nesting of parentheses, function calls, signs and `? :`, each counting one level. */\nconst MAX_DEPTH = 64;\n\ntype Token =\n | { t: \"num\"; v: number; at: number }\n | { t: \"str\"; v: string; at: number }\n | { t: \"id\"; v: string; at: number }\n | { t: \"op\"; v: string; at: number }\n | { t: \"end\"; at: number };\n\nconst OP_ALIASES: Record<string, string> = { \"−\": \"-\", \"×\": \"*\", \"÷\": \"/\", \"≠\": \"!=\", \"≤\": \"<=\", \"≥\": \">=\", \"=\": \"==\" };\nconst TWO_CHAR = new Set([\"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR = new Set([\"+\", \"-\", \"*\", \"/\", \"<\", \">\", \"(\", \")\", \"?\", \":\", \",\", \".\", \"=\", \"−\", \"×\", \"÷\", \"≠\", \"≤\", \"≥\"]);\nconst COMPARISONS = new Set([\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\"]);\n\nclass FormulaError extends Error {\n constructor(\n message: string,\n readonly at: number,\n ) {\n super(message);\n }\n}\n\nconst isIdStart = (c: string) => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\nconst isIdPart = (c: string) => isIdStart(c) || (c >= \"0\" && c <= \"9\");\nconst isDigit = (c: string) => c >= \"0\" && c <= \"9\";\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < source.length) {\n const c = source[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n i++;\n continue;\n }\n const at = i;\n if (isDigit(c) || (c === \".\" && isDigit(source[i + 1] ?? \"\"))) {\n while (isDigit(source[i] ?? \"\")) i++;\n if (source[i] === \".\" && isDigit(source[i + 1] ?? \"\")) {\n i++;\n while (isDigit(source[i] ?? \"\")) i++;\n }\n // `1e6` and `2x` are not numbers here: say so rather than \"expected an operator\".\n if (isIdStart(source[i] ?? \"\")) throw new FormulaError(\"Write a number in digits only, like 1000000.\", at);\n const v = Number(source.slice(at, i));\n if (!Number.isFinite(v)) throw new FormulaError(\"This number is too large.\", at);\n tokens.push({ t: \"num\", v, at });\n continue;\n }\n if (isIdStart(c)) {\n while (isIdPart(source[i] ?? \"\")) i++;\n tokens.push({ t: \"id\", v: source.slice(at, i), at });\n continue;\n }\n if (c === '\"' || c === \"'\" || c === \"“\") {\n const close = c === \"“\" ? \"”\" : c;\n const end = source.indexOf(close, i + 1);\n if (end === -1) throw new FormulaError(\"This text has no closing quote.\", at);\n tokens.push({ t: \"str\", v: source.slice(i + 1, end), at });\n i = end + 1;\n continue;\n }\n const two = source.slice(i, i + 2);\n if (TWO_CHAR.has(two)) {\n tokens.push({ t: \"op\", v: two, at });\n i += 2;\n continue;\n }\n if (ONE_CHAR.has(c)) {\n tokens.push({ t: \"op\", v: OP_ALIASES[c] ?? c, at });\n i++;\n continue;\n }\n throw new FormulaError(`\"${c}\" can't be used in a formula.`, at);\n }\n tokens.push({ t: \"end\", at: source.length });\n return tokens;\n}\n\n/**\n * Parse a formula. Never throws: a mistake comes back as `{ ok: false,\n * message, at }`, with the character offset of the problem.\n */\nexport function parseFormula(source: string): FormulaParseResult {\n if (typeof source !== \"string\" || source.trim() === \"\") return { ok: false, message: \"Write a formula.\", at: 0 };\n if (source.length > MAX_FORMULA_LENGTH) {\n return { ok: false, message: `Keep the formula under ${MAX_FORMULA_LENGTH} characters.`, at: MAX_FORMULA_LENGTH };\n }\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch (e) {\n const err = e as FormulaError;\n return { ok: false, message: err.message, at: err.at };\n }\n let pos = 0;\n const refs: FormulaRef[] = [];\n const peek = () => tokens[pos]!;\n const isOp = (v: string) => {\n const tok = peek();\n return tok.t === \"op\" && tok.v === v;\n };\n const expect = (v: string, message: string) => {\n if (!isOp(v)) throw new FormulaError(message, peek().at);\n pos++;\n };\n const describe = (tok: Token) => (tok.t === \"end\" ? \"the formula ends there\" : `found \"${String(tok.v)}\"`);\n const guard = (depth: number) => {\n if (depth > MAX_DEPTH) throw new FormulaError(\"The formula is nested too deeply.\", peek().at);\n };\n\n const ternary = (depth: number): FormulaNode => {\n guard(depth);\n const test = comparison(depth);\n if (!isOp(\"?\")) return test;\n pos++;\n const then = ternary(depth + 1);\n expect(\":\", \"A `?` needs a `:` and the other value: `test ? a : b`.\");\n const otherwise = ternary(depth + 1);\n return { kind: \"if\", test, then, else: otherwise };\n };\n const comparison = (depth: number): FormulaNode => {\n const left = additive(depth);\n const tok = peek();\n if (tok.t !== \"op\" || !COMPARISONS.has(tok.v)) return left;\n pos++;\n const right = additive(depth);\n const next = peek();\n if (next.t === \"op\" && COMPARISONS.has(next.v)) {\n throw new FormulaError(\"Compare two values at a time; combine comparisons with `? :`.\", next.at);\n }\n return { kind: \"binary\", op: tok.v as BinaryOp, left, right };\n };\n const additive = (depth: number): FormulaNode => {\n let left = multiplicative(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"+\" || tok.v === \"-\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: multiplicative(depth) };\n }\n return left;\n };\n const multiplicative = (depth: number): FormulaNode => {\n let left = unary(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"*\" || tok.v === \"/\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: unary(depth) };\n }\n return left;\n };\n const unary = (depth: number): FormulaNode => {\n guard(depth);\n if (isOp(\"-\")) {\n pos++;\n return { kind: \"unary\", op: \"-\", arg: unary(depth + 1) };\n }\n if (isOp(\"+\")) {\n pos++;\n return unary(depth + 1);\n }\n return primary(depth);\n };\n const primary = (depth: number): FormulaNode => {\n const tok = peek();\n if (tok.t === \"num\") {\n pos++;\n return { kind: \"number\", value: tok.v };\n }\n if (tok.t === \"str\") {\n pos++;\n return { kind: \"text\", value: tok.v };\n }\n if (tok.t === \"op\" && tok.v === \"(\") {\n pos++;\n const inner = ternary(depth + 1);\n expect(\")\", \"A `(` has no matching `)`.\");\n return inner;\n }\n if (tok.t === \"id\") {\n pos++;\n if (isOp(\"(\")) {\n if (!(FORMULA_FUNCTIONS as readonly string[]).includes(tok.v)) {\n throw new FormulaError(`There is no function \"${tok.v}\"; use ${FORMULA_FUNCTIONS.join(\", \")}.`, tok.at);\n }\n pos++;\n const args: FormulaNode[] = [];\n if (!isOp(\")\")) {\n args.push(ternary(depth + 1));\n while (isOp(\",\")) {\n pos++;\n args.push(ternary(depth + 1));\n }\n }\n expect(\")\", `\"${tok.v}(\" has no matching \")\".`);\n if (!args.length) throw new FormulaError(`${tok.v}() needs something to work on.`, tok.at);\n return { kind: \"call\", fn: tok.v as FormulaFunction, args };\n }\n if (isOp(\".\")) {\n pos++;\n const column = peek();\n if (column.t !== \"id\") throw new FormulaError(`Name a column after \"${tok.v}.\".`, column.at);\n pos++;\n refs.push({ key: tok.v, column: column.v });\n return { kind: \"ref\", key: tok.v, column: column.v, at: tok.at };\n }\n refs.push({ key: tok.v });\n return { kind: \"ref\", key: tok.v, at: tok.at };\n }\n throw new FormulaError(`Expected a number, an answer or \"(\", but ${describe(tok)}.`, tok.at);\n };\n\n try {\n const ast = ternary(0);\n const rest = peek();\n if (rest.t !== \"end\") throw new FormulaError(`Expected an operator such as + or *, but ${describe(rest)}.`, rest.at);\n return { ok: true, ast, refs };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, message: e.message, at: e.at };\n return { ok: false, message: \"The formula is nested too deeply.\", at: 0 };\n }\n}\n\n/** The answers a formula names, each once (none when it doesn't parse). */\nexport function formulaRefs(source: string): FormulaRef[] {\n const parsed = parseFormula(source);\n if (!parsed.ok) return [];\n const seen = new Set<string>();\n return parsed.refs.filter((r) => {\n const id = `${r.key}\\u0000${r.column ?? \"\"}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n\n/**\n * The formula with every reference to the answer `from` renamed to `to`.\n * Column names, function names and text are left alone. Returned unchanged\n * when it has a character a formula can't hold.\n */\nexport function renameFormulaKey(source: string, from: string, to: string): string {\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch {\n return source;\n }\n let out = \"\";\n let last = 0;\n tokens.forEach((tok, i) => {\n if (tok.t !== \"id\" || tok.v !== from) return;\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (prev?.t === \"op\" && prev.v === \".\") return;\n if (next?.t === \"op\" && next.v === \"(\") return;\n out += source.slice(last, tok.at) + to;\n last = tok.at + from.length;\n });\n return out + source.slice(last);\n}\n\n// ── Evaluation ───────────────────────────────────────────────────────────────\n\nconst NUMERIC = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\n\n/** A value as a number: numbers, numeric text (\"1,200\" too), yes / no as 1 / 0. Anything else is blank (`null`). */\nexport function formulaNumber(v: FormulaValue | Json | undefined): number | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (typeof v === \"string\") {\n const t = v.trim().replace(/,/g, \"\");\n return t.length <= 64 && NUMERIC.test(t) ? finite(Number(t)) : null;\n }\n return null;\n}\n\nconst finite = (n: number): number | null => (Number.isFinite(n) ? n : null);\n/** A list in arithmetic is blank: add one up with `sum(...)`. */\nconst scalar = (v: FormulaValue): FormulaValue => (Array.isArray(v) ? null : v);\n\nfunction truthy(v: FormulaValue): boolean {\n if (v === null) return false;\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"number\") return v !== 0;\n if (typeof v === \"string\") return v.trim() !== \"\";\n return v.length > 0;\n}\n\nfunction numbersIn(values: FormulaValue[], out: number[] = []): number[] {\n for (const v of values) {\n if (Array.isArray(v)) numbersIn(v, out);\n else {\n const n = formulaNumber(v);\n if (n !== null) out.push(n);\n }\n }\n return out;\n}\n\ninterface Totals {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\n/**\n * Each list's numbers added up once, for the lists this package built and\n * froze itself (the calculator's lists, one per answer and column), so a\n * formula worked out again over an unchanged table doesn't walk it again.\n * Any other list a reader returns may change in place, so it is added up\n * every time.\n */\nconst listTotals = new WeakMap<readonly FormulaValue[], Totals>();\nconst ownLists = new WeakSet<readonly FormulaValue[]>();\n\n/** Mark a frozen list built inside this package as safe to keep totals for (not exported from the package). */\nexport function ownFormulaList(list: FormulaValue[]): readonly FormulaValue[] {\n Object.freeze(list);\n ownLists.add(list);\n return list;\n}\n\nfunction totalsOf(list: readonly FormulaValue[]): Totals {\n const own = ownLists.has(list);\n let t = own ? listTotals.get(list) : undefined;\n if (t) return t;\n const nums = numbersIn(list as FormulaValue[]);\n t = { sum: 0, count: nums.length, min: Infinity, max: -Infinity };\n for (const n of nums) {\n t.sum += n;\n if (n < t.min) t.min = n;\n if (n > t.max) t.max = n;\n }\n if (own) listTotals.set(list, t);\n return t;\n}\n\nfunction compare(op: BinaryOp, a: FormulaValue, b: FormulaValue): boolean {\n const blank = (v: FormulaValue) => v === null || Array.isArray(v) || (typeof v === \"string\" && v.trim() === \"\");\n // A blank equals nothing: `!=` holds and every other comparison fails.\n if (blank(a) || blank(b)) return op === \"!=\";\n const x = formulaNumber(a);\n const y = formulaNumber(b);\n if (x !== null && y !== null) {\n if (op === \"==\") return x === y;\n if (op === \"!=\") return x !== y;\n if (op === \"<\") return x < y;\n if (op === \"<=\") return x <= y;\n if (op === \">\") return x > y;\n return x >= y;\n }\n // Text is equal or not; it has no order.\n if (op === \"==\") return String(a) === String(b);\n if (op === \"!=\") return String(a) !== String(b);\n return false;\n}\n\n/** Reads an answer for `evaluateFormula`: its value, or `null` when unanswered or unknown. */\nexport type FormulaReader = (ref: FormulaRef) => FormulaValue;\n\n/** Evaluate a parsed formula. Never throws; a value it can't work out is `null`. */\nexport function evaluateFormula(ast: FormulaNode, read: FormulaReader): FormulaValue {\n const run = (node: FormulaNode): FormulaValue => {\n switch (node.kind) {\n case \"number\":\n case \"text\":\n return node.value;\n case \"ref\":\n // The node itself: a reader may key on it, and it is never changed.\n return read(node);\n case \"unary\": {\n const n = formulaNumber(scalar(run(node.arg)));\n return n === null ? null : -n;\n }\n case \"if\":\n return truthy(run(node.test)) ? run(node.then) : run(node.else);\n case \"call\": {\n let total = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const arg of node.args) {\n const v = run(arg);\n if (Array.isArray(v)) {\n const t = totalsOf(v);\n total += t.sum;\n count += t.count;\n if (t.min < min) min = t.min;\n if (t.max > max) max = t.max;\n continue;\n }\n const n = formulaNumber(v);\n if (n === null) continue;\n total += n;\n count++;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n if (node.fn === \"sum\") return finite(total);\n if (!count) return null;\n if (node.fn === \"avg\") return finite(total / count);\n return node.fn === \"min\" ? min : max;\n }\n case \"binary\": {\n const a = run(node.left);\n const b = run(node.right);\n if (node.op === \"+\" || node.op === \"-\" || node.op === \"*\" || node.op === \"/\") {\n const x = formulaNumber(scalar(a));\n const y = formulaNumber(scalar(b));\n if (x === null || y === null) return null;\n if (node.op === \"+\") return finite(x + y);\n if (node.op === \"-\") return finite(x - y);\n if (node.op === \"*\") return finite(x * y);\n return y === 0 ? null : finite(x / y);\n }\n return compare(node.op, a, b);\n }\n }\n };\n try {\n return run(ast);\n } catch {\n return null;\n }\n}\n","import type { FieldTypeManifest } from \"./fields\";\nimport { evaluateFormula, formulaNumber, ownFormulaList, parseFormula, type FormulaNode, type FormulaRef, type FormulaValue } from \"./formula\";\nimport type { FieldBlock, FormDefinition, Json, Operator } from \"./types\";\n\n/** The calculated field type's registry key. */\nexport const CALCULATED_TYPE = \"calculated\";\n\n/**\n * Field types the builder offers only to a host that names them in its\n * palette, like `STRUCTURED_FIELD_TYPES`: `calculated` shows a value worked\n * out from other answers, so it is opt-in for hosts that want formulas.\n */\nexport const COMPUTED_FIELD_TYPES = [CALCULATED_TYPE] as const;\n\nexport type CalculatedFormat = \"number\" | \"percent\" | \"text\";\n/** Longest the formulas of one form may be, all together (`parseForm` checks it). */\nexport const MAX_FORM_FORMULA_LENGTH = 20_000;\n/** Most decimal places a calculated value may keep. */\nexport const MAX_CALCULATED_DECIMALS = 10;\n\nexport interface CalculatedProps {\n formula: string;\n format?: CalculatedFormat | undefined;\n decimals?: number | undefined;\n}\n\n/** A calculated field's settings, with anything malformed left out. */\nexport function calculatedProps(field: FieldBlock): CalculatedProps {\n const p = field.props ?? {};\n const out: CalculatedProps = { formula: typeof p.formula === \"string\" ? p.formula : \"\" };\n if (p.format === \"number\" || p.format === \"percent\" || p.format === \"text\") out.format = p.format;\n if (typeof p.decimals === \"number\" && Number.isInteger(p.decimals) && p.decimals >= 0 && p.decimals <= MAX_CALCULATED_DECIMALS) {\n out.decimals = p.decimals;\n }\n return out;\n}\n\nexport const isCalculated = (field: FieldBlock | undefined): boolean => field?.type === CALCULATED_TYPE;\n\nconst round = (n: number, decimals: number | undefined) => {\n if (decimals === undefined) return n;\n const r = Number(n.toFixed(decimals));\n return Object.is(r, -0) ? 0 : r;\n};\n\n/**\n * What a formula's result is stored as. `number` and `percent` keep a number\n * (`0.25` for 25%), rounded to `decimals`; `text` keeps text. Without a\n * format, numbers, text and true / false are kept as they are. A list, and\n * anything the format can't hold, is no value (`undefined`).\n */\nexport function calculatedValue(result: FormulaValue, field: FieldBlock): Json | undefined {\n return valueAs(result, calculatedProps(field));\n}\n\nfunction valueAs(result: FormulaValue, { format, decimals }: CalculatedProps): Json | undefined {\n if (result === null || Array.isArray(result)) return undefined;\n if (format === \"number\" || format === \"percent\") {\n const n = formulaNumber(result);\n return n === null ? undefined : round(n, decimals);\n }\n if (format === \"text\") {\n if (typeof result === \"number\") return decimals === undefined ? String(result) : result.toFixed(decimals);\n return typeof result === \"boolean\" ? (result ? \"Yes\" : \"No\") : result;\n }\n return typeof result === \"number\" ? round(result, decimals) : result;\n}\n\n/** A calculated value as shown: `12.5`, `25%`, the text, Yes / No. Empty when there is none. */\nexport function formatCalculated(value: Json | undefined, field: FieldBlock): string {\n if (value === undefined || value === null) return \"\";\n const { format, decimals } = calculatedProps(field);\n const fixed = (n: number) => (decimals === undefined ? String(Number(n.toFixed(6))) : n.toFixed(decimals));\n if (typeof value === \"number\") return format === \"percent\" ? `${fixed(value * 100)}%` : fixed(value);\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return typeof value === \"string\" ? value : \"\";\n}\n\n/**\n * Most items a formula reads from one answer (a list's items, a table's\n * rows). A longer answer reads as blank, so one oversized value sent to the\n * server can't make every formula over it slow.\n */\nexport const MAX_FORMULA_ITEMS = 10_000;\n\n/**\n * Most list items and table rows all of a form's formulas read in one go\n * (each list or table counted once, however many of its columns are read, in form order). A formula that reads\n * an answer past the limit, or one over `MAX_FORMULA_ITEMS`, has no value\n * (blank, never a partial total), so many big answers can't make working\n * the values out slow either.\n */\nexport const MAX_SETTLE_ITEMS = 50_000;\n\nconst extract = (value: readonly Json[], column: string | undefined): FormulaValue[] =>\n column !== undefined\n ? value.flatMap((row): FormulaValue[] => {\n if (!row || typeof row !== \"object\" || Array.isArray(row)) return [];\n const cell = row[column];\n return typeof cell === \"string\" || typeof cell === \"number\" ? [cell] : [];\n })\n : value.flatMap((v): FormulaValue[] => (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\" ? [v] : []));\n\n\n/**\n * The value a formula reads for an answer: numbers and text as they are, a\n * list's items, one table column's cells. A list or table of more than\n * `MAX_FORMULA_ITEMS` reads as blank. Each call builds a new list.\n */\nexport function formulaInput(value: Json | undefined, column?: string): FormulaValue {\n if (value === undefined || value === null) return null;\n if (Array.isArray(value) && value.length > MAX_FORMULA_ITEMS) return null;\n if (column !== undefined) {\n if (!Array.isArray(value)) return null;\n return extract(value, column);\n }\n if (Array.isArray(value)) return extract(value, undefined);\n return typeof value === \"object\" ? null : value;\n}\n\ninterface Compiled {\n field: FieldBlock;\n /** `formulaSize` of `ast`. */\n size: number;\n props: CalculatedProps;\n ast: FormulaNode | null;\n /** The answers it reads, each (answer, column) once (`id` is `undefined` for a key that is not a field). */\n reads: Read[];\n /** Each `ref` node of the formula, to its index in `reads`. */\n slots: Map<FormulaNode, number>;\n /** The inputs of the last evaluation and its result, reused while they are the same values. */\n last: { inputs: unknown[]; value: Json | undefined } | null;\n}\n\ninterface Read {\n id: string | undefined;\n column: string | undefined;\n /** `id` and `column` as one key, to read each once per formula. */\n key: string;\n}\n\nfunction refNodes(node: FormulaNode, out: Extract<FormulaNode, { kind: \"ref\" }>[] = []) {\n if (node.kind === \"ref\") out.push(node);\n else if (node.kind === \"unary\") refNodes(node.arg, out);\n else if (node.kind === \"binary\") (refNodes(node.left, out), refNodes(node.right, out));\n else if (node.kind === \"if\") (refNodes(node.test, out), refNodes(node.then, out), refNodes(node.else, out));\n else if (node.kind === \"call\") for (const a of node.args) refNodes(a, out);\n return out;\n}\n\n/** How many parts (numbers, answers, operators, calls) a formula has: what working it out once costs. */\nfunction formulaSize(node: FormulaNode): number {\n if (node.kind === \"unary\") return 1 + formulaSize(node.arg);\n if (node.kind === \"binary\") return 1 + formulaSize(node.left) + formulaSize(node.right);\n if (node.kind === \"if\") return 1 + formulaSize(node.test) + formulaSize(node.then) + formulaSize(node.else);\n if (node.kind === \"call\") return node.args.reduce((n, a) => n + formulaSize(a), 1);\n return 1;\n}\n\n/**\n * Work an engine may spend while replaying (see `MAX_REPLAY_WORK` in\n * `server.ts`): `spend` throws `ReplayWorkExceeded` once `used` passes `max`.\n */\nexport interface WorkBudget {\n used: number;\n max: number;\n}\n\n/**\n * Counts of the work calculators and replays did, for tests to check the\n * work stays bounded rather than timing it (not exported from the package).\n * `reset` zeroes them.\n */\nexport const workStats = {\n /** Formulas worked out (a cached result reused is not counted). */\n formulaRuns: 0,\n /** Lists read out of an answer (a list or one table column). */\n listBuilds: 0,\n /** Calls of `withCalculated`. */\n settles: 0,\n /** Copies of the answers made by `withCalculated`: at most one per call. */\n answerCopies: 0,\n /** Units of work the last limited replay used (see `WorkBudget`). */\n lastReplayWork: 0,\n reset() {\n this.formulaRuns = this.listBuilds = this.settles = this.answerCopies = this.lastReplayWork = 0;\n },\n};\n\nexport class ReplayWorkExceeded extends Error {\n constructor(readonly limit: number) {\n super(`Replaying the response would take more than ${limit} steps of work.`);\n }\n}\n\nexport function spend(budget: WorkBudget | undefined, amount: number): void {\n if (!budget) return;\n budget.used += amount;\n if (budget.used > budget.max) throw new ReplayWorkExceeded(budget.max);\n}\n\n/** Stands for an answer that is off the path or unanswered. */\nconst UNREAD = Symbol(\"unread\");\n/** Stands for an answer too big to read: over `MAX_FORMULA_ITEMS`, or past `MAX_SETTLE_ITEMS`. */\nconst OVER = Symbol(\"over\");\n\n/**\n * Works out a form's calculated fields from its answers. `withCalculated`\n * returns `values` itself when nothing changed. Each formula reads the\n * answers on `path` only (an answer logic hides reads as blank) and the\n * calculated fields before it, in form order.\n */\nexport function calculator(definition: FormDefinition, work?: WorkBudget) {\n // Work: 1 for each formula looked at in a settle, plus its size each time\n // it is worked out. Past the budget, `withCalculated` throws.\n const compiled: Compiled[] = [];\n const idByKey = new Map<string, string>();\n for (const block of definition.blocks) {\n if (block.kind !== \"field\") continue;\n idByKey.set(block.key, block.id);\n }\n for (const block of definition.blocks) {\n if (block.kind !== \"field\" || !isCalculated(block)) continue;\n const props = calculatedProps(block);\n const parsed = parseFormula(props.formula);\n const reads: Read[] = [];\n const slots = new Map<FormulaNode, number>();\n const byKey = new Map<string, number>();\n for (const ref of parsed.ok ? refNodes(parsed.ast) : []) {\n const id = idByKey.get(ref.key);\n const key = `${id ?? \"\"}\\u0000${ref.column ?? \"\"}`;\n let slot = byKey.get(key);\n if (slot === undefined) {\n slot = reads.push({ id, column: ref.column, key }) - 1;\n byKey.set(key, slot);\n }\n slots.set(ref, slot);\n }\n compiled.push({ field: block, props, ast: parsed.ok ? parsed.ast : null, size: parsed.ok ? formulaSize(parsed.ast) : 0, reads, slots, last: null });\n }\n /**\n * This calculator's lists, by the answer's array and then the column (`\"\"`\n * for a list's own items), so an unchanged table is walked once. Each\n * engine (and so each `validateSubmission` call) has its own, so a host\n * array changed between two calls is read afresh. Within one engine an\n * answer is not changed in place: the engine never changes a value it\n * holds, and `setValue` with an array it already holds calls `forget`.\n */\n const extracted = new WeakMap<readonly Json[], Map<string, readonly FormulaValue[]>>();\n const cachedList = (value: readonly Json[], column: string | undefined): readonly FormulaValue[] => {\n let byColumn = extracted.get(value);\n if (!byColumn) extracted.set(value, (byColumn = new Map()));\n const key = column ?? \"\";\n let list = byColumn.get(key);\n if (!list) {\n workStats.listBuilds++;\n byColumn.set(key, (list = ownFormulaList(extract(value, column))));\n }\n return list;\n };\n const readAnswer = (value: Json | undefined, column: string | undefined): FormulaValue => {\n if (Array.isArray(value)) return cachedList(value, column) as FormulaValue[];\n return column !== undefined ? null : formulaInput(value);\n };\n /** Drop what was worked out from `value`: it may have been changed in place. */\n const forget = (value: Json | undefined) => {\n if (!value || typeof value !== \"object\") return;\n if (Array.isArray(value)) extracted.delete(value);\n for (const entry of compiled) if (entry.last?.inputs.includes(value)) entry.last = null;\n };\n\n const withCalculated = (values: Record<string, Json | undefined>, path: readonly string[]) => {\n if (!compiled.length) return values;\n workStats.settles++;\n const visible = new Set(path);\n let next = values;\n // `values` is copied once, on the first change, then written into.\n let copied = false;\n // The items every formula may read, together: each list answer and table\n // counts its items or rows once (however many of its columns are read),\n // in form order, and one past the limit reads as blank. It depends on the\n // answers only, so a client and the server agree.\n let budget = MAX_SETTLE_ITEMS;\n const within = new Map<string, boolean>();\n const input = ({ id }: Read): unknown => {\n if (id === undefined || !visible.has(id) || !Object.prototype.hasOwnProperty.call(next, id)) return UNREAD;\n const value = next[id];\n if (!Array.isArray(value)) return value;\n let ok = within.get(id);\n if (ok === undefined) {\n // An answer over the per-answer limit is never read, so it uses none of the allowance.\n ok = value.length <= MAX_FORMULA_ITEMS && value.length <= budget;\n if (ok) budget -= value.length;\n within.set(id, ok);\n }\n return ok ? value : OVER;\n };\n for (const entry of compiled) {\n const { field, ast } = entry;\n // A formula is worked out again only when an answer it reads is a different value:\n // an engine settles on every answer, and most answers are to other questions.\n const { reads } = entry;\n spend(work, 1);\n const inputs: unknown[] = new Array(reads.length);\n let over = false;\n let same = entry.last !== null;\n for (let i = 0; i < reads.length; i++) {\n const v = input(reads[i]!);\n inputs[i] = v;\n if (v === OVER) over = true;\n if (same && entry.last!.inputs[i] !== v) same = false;\n }\n let value: Json | undefined;\n if (same) {\n value = entry.last!.value;\n } else {\n spend(work, entry.size);\n workStats.formulaRuns++;\n const resolved: (FormulaValue | undefined)[] = new Array(inputs.length);\n const read = (ref: FormulaRef): FormulaValue => {\n const slot = entry.slots.get(ref as FormulaNode);\n if (slot === undefined) return null;\n let v = resolved[slot];\n if (v === undefined) {\n const raw = inputs[slot];\n v = resolved[slot] = raw === UNREAD ? null : readAnswer(raw as Json | undefined, reads[slot]!.column);\n }\n return v;\n };\n // An answer too big to read leaves the value blank rather than a partial total.\n value = ast && !over ? valueAs(evaluateFormula(ast, read), entry.props) : undefined;\n entry.last = { inputs, value };\n }\n const current = Object.prototype.hasOwnProperty.call(next, field.id) ? next[field.id] : undefined;\n if (current !== value) {\n if (!copied) {\n workStats.answerCopies++;\n next = { ...next };\n copied = true;\n }\n next[field.id] = value;\n }\n }\n return next;\n };\n return { active: compiled.length > 0, ids: new Set(compiled.map((c) => c.field.id)), withCalculated, forget };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\n\nexport const calculatedFieldType: FieldTypeManifest = {\n type: CALCULATED_TYPE,\n label: \"Calculated\",\n category: \"advanced\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"control\" },\n // The engine works the value out; any number, text or true / false it made is valid.\n validate: (value) => (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\" ? null : \"This value is worked out from other answers.\"),\n summarize: (value, field) => formatCalculated(value, field),\n};\n","import type { FieldTypeManifest } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\ntype JsonObject = { [key: string]: Json };\nconst isObject = (v: unknown): v is JsonObject => !!v && typeof v === \"object\" && !Array.isArray(v);\nfunction intProp(field: FieldBlock, name: string, fallback: number, floor = 1): number {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : fallback;\n}\nfunction optionalIntProp(field: FieldBlock, name: string, floor = 0): number | undefined {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : undefined;\n}\nconst blank = (v: unknown) => typeof v !== \"string\" || v.trim() === \"\";\n/**\n * Unanswered: nothing, or a list whose every entry is a blank one. Anything\n * else (a string, a list with a malformed entry) is an answer, so validation\n * rejects it instead of dropping it silently.\n */\nconst blankText = (v: unknown) => typeof v === \"string\" && v.trim() === \"\";\nconst emptyList = (value: Json | undefined, isBlank: (entry: Json) => boolean) =>\n value === undefined || value === null || (Array.isArray(value) && value.every(isBlank));\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nexport function listLimits(field: FieldBlock) {\n return { min: optionalIntProp(field, \"min\") ?? 0, max: intProp(field, \"max\", 10), itemMaxLength: intProp(field, \"itemMaxLength\", 500) };\n}\nconst listItems = (value: Json | undefined): string[] =>\n Array.isArray(value) ? value.filter((v): v is string => typeof v === \"string\" && v.trim() !== \"\") : [];\n\nexport interface TableColumn { key: string; label: string; long?: boolean }\nexport const MAX_TABLE_COLUMNS = 6;\nexport const MAX_TABLE_CELL_LENGTH = 2000;\nexport function tableColumns(field: FieldBlock): TableColumn[] {\n const raw = field.props?.columns;\n if (!Array.isArray(raw)) return [];\n const seen = new Set<string>();\n const out: TableColumn[] = [];\n for (const c of raw) {\n if (!isObject(c) || typeof c.key !== \"string\" || !c.key || seen.has(c.key)) continue;\n seen.add(c.key);\n const column: TableColumn = { key: c.key, label: typeof c.label === \"string\" ? c.label : c.key };\n if (c.long === true) column.long = true;\n out.push(column);\n }\n return out;\n}\nexport function tableLimits(field: FieldBlock) {\n return { minRows: optionalIntProp(field, \"minRows\") ?? 0, maxRows: intProp(field, \"maxRows\", 3) };\n}\nconst filledRows = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((r): r is JsonObject => isObject(r) && Object.values(r).some((c) => !blank(c))) : [];\n\nexport interface MediaNote { at: number; text: string }\nexport const MAX_TIMESTAMP_SECONDS = 86400;\nexport function formatTimestamp(seconds: number): string {\n const total = Number.isFinite(seconds) && seconds > 0 ? Math.floor(seconds) : 0;\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = String(total % 60).padStart(2, \"0\");\n return h ? `${h}:${String(m).padStart(2, \"0\")}:${s}` : `${m}:${s}`;\n}\nexport function parseTimestamp(text: string): number | null {\n const t = text.trim();\n if (!t) return null;\n const parts = t.split(\":\");\n if (parts.length > 3) return null;\n if (parts.length === 1) {\n if (!/^\\d+(\\.\\d+)?$/.test(t)) return null;\n const n = Number(t);\n return n <= MAX_TIMESTAMP_SECONDS ? n : null;\n }\n const last = parts.length - 1;\n let total = 0;\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i]!;\n const ok = i === 0 ? /^\\d+$/.test(p) : i === last ? /^\\d{2}(\\.\\d+)?$/.test(p) : /^\\d{2}$/.test(p);\n if (!ok) return null;\n const n = Number(p);\n if (i > 0 && n >= 60) return null;\n total = total * 60 + n;\n }\n return total <= MAX_TIMESTAMP_SECONDS ? total : null;\n}\nconst isTimestamp = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v) && v >= 0 && v <= MAX_TIMESTAMP_SECONDS;\nconst notesWithText = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((n): n is JsonObject => isObject(n) && !blank(n.text)) : [];\n\nexport interface Highlight { start: number; end: number; quote: string; note: string }\nexport const MAX_HIGHLIGHT_NOTE_LENGTH = 1000;\n/** The longest passage one highlight may quote; also bounds a quote the server can't check against `props.text`. */\nexport const MAX_HIGHLIGHT_QUOTE_LENGTH = 2000;\nexport const HIGHLIGHT_NOTE_MESSAGE = \"Add a note to each highlight.\";\nconst sourceText = (field: FieldBlock) => (typeof field.props?.text === \"string\" && field.props.text ? field.props.text : undefined);\n\n/**\n * The structured field types, whose answers are lists or records rather than one\n * value:\n * - `list`: several short answers, e.g. goals, action items, three things that went well.\n * - `table`: a small table each answer fills row by row, e.g. an action plan\n * (What / Who / By when), pros and cons.\n * - `media-notes`: notes pinned to times in a video or audio, e.g. lecture notes,\n * a recorded call review.\n * - `text-highlights`: highlight passages of a text and note on each, e.g.\n * annotating an article, a policy or a contract.\n *\n * They are registered like any other, but the builder offers them only to a\n * host that names them in its palette (`FormBuilder palette`), so forms that\n * never had them don't change.\n */\nexport const STRUCTURED_FIELD_TYPES = [\"list\", \"table\", \"media-notes\", \"text-highlights\"] as const;\n\nexport const structuredFieldTypes: FieldTypeManifest[] = [\n {\n type: \"list\", label: \"List\", category: \"text\", value: { json: true },\n // logic.ts `contains` on an array is exact item equality, same as multi-choice, so it is offered.\n operators: [\"contains\", \"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, blankText),\n validate: (value, field) => {\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) return \"Enter a list of answers.\";\n const { min, max, itemMaxLength } = listLimits(field);\n if (value.some((v) => (v as string).trim().length > itemMaxLength)) return `Keep each item under ${itemMaxLength} characters.`;\n const count = listItems(value).length;\n if (count < min) return `Add at least ${plural(min, \"item\")}.`;\n if (count > max) return `Add at most ${plural(max, \"item\")}.`;\n return null;\n },\n normalize: (value) => (Array.isArray(value) ? listItems(value).map((v) => v.trim()) : value),\n summarize: (value) => listItems(value).map((v) => v.trim()).join(\"; \"),\n samples: (field) => {\n const { min, max } = listLimits(field);\n return [Array.from({ length: Math.min(Math.max(1, min), max) }, (_, i) => `Item ${i + 1}`)];\n },\n },\n {\n type: \"table\", label: \"Table\", category: \"advanced\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (r) => isObject(r) && Object.values(r).every(blankText)),\n validate: (value, field) => {\n const columns = tableColumns(field);\n if (!columns.length) return \"This question has no columns.\";\n if (!Array.isArray(value) || !value.every(isObject)) return \"Fill in the rows.\";\n const keys = new Set(columns.map((c) => c.key));\n for (const row of value as JsonObject[]) {\n for (const [key, cell] of Object.entries(row)) {\n if (!keys.has(key)) return \"An answer names a column this question doesn't have.\";\n if (typeof cell !== \"string\") return \"Fill in the rows with text.\";\n if (cell.trim().length > MAX_TABLE_CELL_LENGTH) return `Keep each answer under ${MAX_TABLE_CELL_LENGTH} characters.`;\n }\n }\n const { minRows, maxRows } = tableLimits(field);\n const count = filledRows(value).length;\n if (count < minRows) return `Fill in at least ${plural(minRows, \"row\")}.`;\n if (count > maxRows) return `Fill in at most ${plural(maxRows, \"row\")}.`;\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? filledRows(value).map((row) => {\n const out: JsonObject = {};\n for (const [key, cell] of Object.entries(row)) if (typeof cell === \"string\") out[key] = cell.trim();\n return out;\n })\n : value,\n summarize: (value, field) => {\n const columns = tableColumns(field);\n return filledRows(value)\n .map((row) => columns.filter((c) => !blank(row[c.key])).map((c) => `${c.label}: ${(row[c.key] as string).trim()}`).join(\" · \"))\n .join(\" / \");\n },\n samples: (field) => {\n const columns = tableColumns(field);\n if (!columns.length) return [];\n const { minRows, maxRows } = tableLimits(field);\n const row = Object.fromEntries(columns.map((c) => [c.key, \"sample\"]));\n return [Array.from({ length: Math.min(Math.max(1, minRows), maxRows) }, () => ({ ...row }))];\n },\n },\n {\n type: \"media-notes\", label: \"Notes at moments\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (n) => isObject(n) && blankText(n.text)),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Add notes.\";\n const textMaxLength = intProp(field, \"textMaxLength\", 1000);\n for (const note of value) {\n if (!isObject(note) || typeof note.text !== \"string\") return \"Add notes.\";\n if (!isTimestamp(note.at)) return \"Each note needs a time.\";\n if (note.text.trim().length > textMaxLength) return `Keep each note under ${textMaxLength} characters.`;\n }\n const maxNotes = intProp(field, \"maxNotes\", 20);\n return notesWithText(value).length > maxNotes ? `Add at most ${plural(maxNotes, \"note\")}.` : null;\n },\n normalize: (value) => Array.isArray(value)\n ? notesWithText(value).map((n) => ({ at: n.at as number, text: (n.text as string).trim() })).sort((a, b) => a.at - b.at)\n : value,\n summarize: (value) => notesWithText(value)\n .map((n) => ({ at: typeof n.at === \"number\" ? n.at : 0, text: (n.text as string).trim() }))\n .sort((a, b) => a.at - b.at)\n .map((n) => `${formatTimestamp(n.at)} ${n.text}`)\n .join(\"; \"),\n samples: () => [[{ at: 0, text: \"sample\" }]],\n },\n {\n type: \"text-highlights\", label: \"Highlights\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, () => false),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Highlight a passage.\";\n const maxHighlights = intProp(field, \"maxHighlights\", 20);\n if (value.length > maxHighlights) return `Add at most ${plural(maxHighlights, \"highlight\")}.`;\n const text = sourceText(field);\n for (const h of value) {\n if (!isObject(h) || !Number.isInteger(h.start) || !Number.isInteger(h.end) || typeof h.quote !== \"string\" || typeof h.note !== \"string\") {\n return \"Highlight a passage of the text.\";\n }\n const start = h.start as number;\n const end = h.end as number;\n if (start < 0 || end <= start || h.quote.length !== end - start) return \"Highlight a passage of the text.\";\n if (end - start > MAX_HIGHLIGHT_QUOTE_LENGTH) return `Highlight under ${MAX_HIGHLIGHT_QUOTE_LENGTH} characters at a time.`;\n if (text !== undefined && (end > text.length || text.slice(start, end) !== h.quote)) return \"A highlight doesn't match the text.\";\n if (h.note.trim() === \"\") return HIGHLIGHT_NOTE_MESSAGE;\n if (h.note.trim().length > MAX_HIGHLIGHT_NOTE_LENGTH) return `Keep each note under ${MAX_HIGHLIGHT_NOTE_LENGTH} characters.`;\n }\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? value.filter(isObject)\n .map((h) => ({ start: h.start as number, end: h.end as number, quote: h.quote as string, note: String(h.note).trim() }))\n .sort((a, b) => a.start - b.start || a.end - b.end)\n : value,\n summarize: (value) => Array.isArray(value)\n ? value.filter(isObject).map((h) => `\"${String(h.quote)}\" — ${String(h.note).trim()}`).join(\"; \")\n : \"\",\n samples: (field) => {\n const text = sourceText(field);\n if (text === undefined) return [[{ start: 0, end: 6, quote: \"sample\", note: \"sample\" }]];\n const end = Math.min(text.length, 20);\n return [[{ start: 0, end, quote: text.slice(0, end), note: \"sample\" }]];\n },\n },\n];\n","import type { Block, FieldBlock, Json, Operator } from \"./types\";\nimport { calculatedFieldType } from \"./calculated\";\nimport { structuredFieldTypes } from \"./structured\";\n\n/**\n * A field type, without any UI. Renderers are registered separately per\n * platform (`genesis-forms-react`), so a manifest runs anywhere.\n */\nexport interface FieldTypeManifest {\n type: string;\n label: string;\n category: \"text\" | \"choice\" | \"scale\" | \"date\" | \"media\" | \"advanced\";\n /** `json: false` types must convert, so drafts and server replay never lose an answer. */\n value:\n | { json: true }\n | { json: false; serialize: (value: unknown) => Json; deserialize: (json: Json) => unknown };\n operators: Operator[];\n a11y: {\n semantics: \"control\" | \"group\";\n /** The HTML `autocomplete` token, such as `\"email\"` or `\"tel\"`. */\n autocomplete?: string;\n /** The HTML `inputmode` hint for on-screen keyboards, such as `\"email\"` or `\"tel\"`. */\n inputMode?: \"text\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\" | \"url\" | \"search\";\n };\n isEmpty?: (value: Json | undefined) => boolean;\n /** Return an error message, or null when the (non-empty) value is valid. */\n validate?: (value: Json, field: FieldBlock) => string | null;\n /** Plain text for recall, exports and emails. */\n summarize?: (value: Json, field: FieldBlock) => string;\n /**\n * The form a (valid, non-empty) value is stored in, such as an email\n * without surrounding spaces. Applied by `engine.answers()` and the server.\n */\n normalize?: (value: Json, field: FieldBlock) => Json;\n /** Valid example answers, used by `coverage()` and other test tools to explore a path. */\n samples?: (field: FieldBlock) => Json[];\n}\n\n// One registry per process, shared by every entry point (index, server,\n// testing are bundled separately), so a plugin registered once is seen by all.\nconst REGISTRY = Symbol.for(\"@marktiderman/genesis-forms/field-types\");\nconst globalScope = globalThis as typeof globalThis & { [REGISTRY]?: Map<string, FieldTypeManifest> };\nconst registry: Map<string, FieldTypeManifest> = (globalScope[REGISTRY] ??= new Map());\n\nexport function registerFieldType(manifest: FieldTypeManifest): void {\n if (!manifest.type) throw new Error(\"registerFieldType: a field type needs a `type`.\");\n const value = manifest.value as { json: boolean; serialize?: unknown; deserialize?: unknown };\n if (\n !value.json &&\n (typeof value.serialize !== \"function\" || typeof value.deserialize !== \"function\")\n ) {\n throw new Error(\n `registerFieldType: \"${manifest.type}\" stores a non-JSON value, so it must provide both serialize and deserialize.`,\n );\n }\n registry.set(manifest.type, manifest);\n}\n\nexport function getFieldType(type: string): FieldTypeManifest | undefined {\n return registry.get(type);\n}\n\nexport function listFieldTypes(): FieldTypeManifest[] {\n return [...registry.values()];\n}\n\nexport function isEmptyValue(value: Json | undefined, field?: FieldBlock): boolean {\n const manifest = field ? registry.get(field.type) : undefined;\n if (manifest?.isEmpty) return manifest.isEmpty(value);\n if (value === undefined || value === null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/** A value in its stored form (see `FieldTypeManifest.normalize`). */\nexport function normalizeValue(value: Json, field: FieldBlock): Json {\n const manifest = registry.get(field.type);\n return manifest?.normalize ? manifest.normalize(value, field) : value;\n}\n\n/** Whether a block holds personal or secret data: `sensitive: true`, or the `props.sensitive: true` alias. */\nexport function isSensitive(block: Block): boolean {\n return block.kind === \"field\" && (block.sensitive === true || block.props?.sensitive === true);\n}\n\nexport function summarizeValue(value: Json | undefined, field: FieldBlock): string {\n if (isEmptyValue(value, field)) return \"\";\n const manifest = registry.get(field.type);\n if (manifest?.summarize) return manifest.summarize(value as Json, field);\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n\n// ── Built-in types (R1) ──────────────────────────────────────────────────────\n\nexport interface ChoiceOption {\n value: string;\n label?: string;\n}\n\nexport function choiceOptions(field: FieldBlock): ChoiceOption[] {\n const raw = field.props?.options;\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((o) =>\n o && typeof o === \"object\" && !Array.isArray(o) && typeof o.value === \"string\"\n ? [{ value: o.value, label: typeof o.label === \"string\" ? o.label : undefined }]\n : [],\n );\n}\n\nfunction optionLabel(field: FieldBlock, value: string): string {\n const option = choiceOptions(field).find((o) => o.value === value);\n return option?.label ?? value;\n}\n\nfunction intRange(field: FieldBlock, min: number, maxDefault: number) {\n const max = typeof field.props?.max === \"number\" ? field.props.max : maxDefault;\n return { min, max };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\nconst textOps: Operator[] = [\"eq\", \"neq\", \"contains\", \"answered\", \"empty\"];\n\nfunction maxLength(field: FieldBlock, fallback: number): number {\n return typeof field.props?.maxLength === \"number\" ? field.props.maxLength : fallback;\n}\n\nfunction textValidate(fallback: number) {\n return (value: Json, field: FieldBlock) => {\n if (typeof value !== \"string\") return \"Enter text.\";\n const limit = maxLength(field, fallback);\n return value.length > limit ? `Keep it under ${limit} characters.` : null;\n };\n}\n\n/** The longest address SMTP allows (RFC 5321). */\nconst MAX_EMAIL_LENGTH = 254;\n\n/**\n * `local@domain.tld`: no spaces, exactly one `@`, and a dot inside the domain.\n * A linear scan rather than a regex, so a hostile value cannot backtrack.\n */\nexport function isEmailAddress(value: string): boolean {\n if (value.length > MAX_EMAIL_LENGTH || /\\s/.test(value)) return false;\n const at = value.indexOf(\"@\");\n if (at < 1 || value.indexOf(\"@\", at + 1) !== -1) return false;\n const domain = value.slice(at + 1);\n // A dot with at least one character on each side.\n return domain.slice(1, -1).includes(\".\");\n}\n\n/** Longest phone number accepted, separators included. */\nconst MAX_PHONE_LENGTH = 32;\n\n/**\n * Digits with optional separators (spaces, `-`, `(`, `)`, `.`) and an\n * optional leading `+`; 7 to 15 digits (E.164 allows at most 15). One linear scan.\n */\nfunction isPhoneNumber(value: string): boolean {\n if (value.length > MAX_PHONE_LENGTH) return false;\n let digits = 0;\n for (let i = 0; i < value.length; i++) {\n const c = value[i]!;\n if (c >= \"0\" && c <= \"9\") digits++;\n else if (c === \"+\") {\n if (i !== 0) return false;\n } else if (c !== \" \" && c !== \"-\" && c !== \"(\" && c !== \")\" && c !== \".\") return false;\n }\n return digits >= 7 && digits <= 15;\n}\n\nconst builtins: FieldTypeManifest[] = [\n {\n type: \"short-text\",\n label: \"Short text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(500),\n },\n {\n type: \"long-text\",\n label: \"Long text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(5000),\n },\n {\n type: \"email\",\n label: \"Email\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\", autocomplete: \"email\", inputMode: \"email\" },\n validate: (value) =>\n typeof value === \"string\" && isEmailAddress(value.trim())\n ? null\n : \"Enter an email address like name@example.com.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n },\n {\n type: \"phone\",\n label: \"Phone\",\n category: \"text\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\", autocomplete: \"tel\", inputMode: \"tel\" },\n validate: (value) =>\n typeof value === \"string\" && isPhoneNumber(value.trim())\n ? null\n : \"Enter a phone number with 7 to 15 digits.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n summarize: (value) => String(value),\n },\n {\n type: \"rating\",\n label: \"Rating\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const { min, max } = intRange(field, 1, 5);\n return Number.isInteger(value) && (value as number) >= min && (value as number) <= max\n ? null\n : `Choose a rating from ${min} to ${max}.`;\n },\n summarize: (value, field) => {\n const { max } = intRange(field, 1, 5);\n const end = scaleEndLabel(field, value as number, 1, max);\n return end ? `${value}/${max} (${end})` : `${value}/${max}`;\n },\n },\n {\n type: \"nps\",\n label: \"Net Promoter Score\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value) =>\n Number.isInteger(value) && (value as number) >= 0 && (value as number) <= 10\n ? null\n : \"Choose a score from 0 to 10.\",\n summarize: (value, field) => {\n const end = scaleEndLabel(field, value as number, 0, 10);\n return end ? `${value}/10 (${end})` : `${value}/10`;\n },\n },\n {\n type: \"single-choice\",\n label: \"Single choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) =>\n typeof value === \"string\" && choiceOptions(field).some((o) => o.value === value)\n ? null\n : \"Choose one of the options.\",\n summarize: (value, field) => optionLabel(field, String(value)),\n },\n {\n type: \"multi-choice\",\n label: \"Multiple choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"contains\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const allowed = new Set(choiceOptions(field).map((o) => o.value));\n // Each option at most once, so a value is never longer than the option list.\n return Array.isArray(value) &&\n value.length <= allowed.size &&\n new Set(value).size === value.length &&\n value.every((v) => typeof v === \"string\" && allowed.has(v))\n ? null\n : \"Choose from the options.\";\n },\n summarize: (value, field) =>\n Array.isArray(value) ? value.map((v) => optionLabel(field, String(v))).join(\", \") : String(value),\n },\n {\n type: \"yes-no\",\n label: \"Yes / no\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value) => (typeof value === \"boolean\" ? null : \"Choose yes or no.\"),\n summarize: (value) => (value ? \"Yes\" : \"No\"),\n },\n {\n type: \"dropdown\",\n label: \"Dropdown\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\" },\n validate: (value, field) =>\n typeof value === \"string\" && choiceOptions(field).some((o) => o.value === value)\n ? null\n : \"Choose one of the options.\",\n summarize: (value, field) => optionLabel(field, String(value)),\n },\n {\n type: \"number\",\n label: \"Number\",\n category: \"text\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"control\", inputMode: \"decimal\" },\n validate: (value, field) => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"Enter a number.\";\n const { min, max, step } = numberLimits(field);\n if (min !== undefined && max !== undefined && (value < min || value > max)) {\n return `Enter a number from ${min} to ${max}.`;\n }\n if (min !== undefined && value < min) return `Enter ${min} or more.`;\n if (max !== undefined && value > max) return `Enter ${max} or less.`;\n if (step !== undefined && !onStep(value, min ?? 0, step)) {\n return step === 1 && Number.isInteger(min ?? 0)\n ? \"Enter a whole number.\"\n : `Enter a number in steps of ${step}.`;\n }\n return null;\n },\n summarize: (value) => String(value),\n samples: (field) => {\n const { min, max } = numberLimits(field);\n return [min, max, 0, 1].filter((v): v is number => v !== undefined);\n },\n },\n {\n type: \"date\",\n label: \"Date\",\n category: \"date\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\" },\n validate: (value, field) => {\n if (typeof value !== \"string\" || !isIsoDate(value.trim())) return \"Enter a date like 2026-10-22.\";\n const date = value.trim();\n const { min, max } = dateLimits(field);\n if (min && max && (date < min || date > max)) return `Choose a date from ${min} to ${max}.`;\n if (min && date < min) return `Choose ${min} or later.`;\n if (max && date > max) return `Choose ${max} or earlier.`;\n return null;\n },\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n samples: (field) => {\n const { min, max } = dateLimits(field);\n return [min ?? max ?? \"2000-01-01\"];\n },\n },\n {\n type: \"consent\",\n label: \"Consent checkbox\",\n category: \"choice\",\n value: { json: true },\n operators: [\"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n // Unchecked is unanswered, so a required consent must be checked.\n isEmpty: (value) => value === undefined || value === null || value === false,\n validate: (value) => (value === true ? null : \"Check the box to agree.\"),\n summarize: () => \"Agreed\",\n samples: () => [true],\n },\n];\n\n/** The optional words under the ends of a rating or NPS scale (\"Poor\", \"Great\"). */\nexport function scaleLabels(field: FieldBlock): { low?: string; high?: string } {\n const out: { low?: string; high?: string } = {};\n const low = field.props?.lowLabel;\n const high = field.props?.highLabel;\n if (typeof low === \"string\" && low.trim()) out.low = low.trim();\n if (typeof high === \"string\" && high.trim()) out.high = high.trim();\n return out;\n}\n\n/** How a rating is drawn: `\"numbers\"` (default) or `\"stars\"`. */\nexport function ratingDisplay(field: FieldBlock): \"numbers\" | \"stars\" {\n return field.props?.display === \"stars\" ? \"stars\" : \"numbers\";\n}\n\nfunction scaleEndLabel(field: FieldBlock, value: number, min: number, max: number): string | undefined {\n const { low, high } = scaleLabels(field);\n return value === min ? low : value === max ? high : undefined;\n}\n\nconst finite = (v: Json | undefined): number | undefined =>\n typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n\n/** A `number` field's limits: `min`, `max` and `step` (each optional; `step` is above 0). */\nexport function numberLimits(field: FieldBlock): { min?: number; max?: number; step?: number } {\n const out: { min?: number; max?: number; step?: number } = {};\n const min = finite(field.props?.min);\n const max = finite(field.props?.max);\n const step = finite(field.props?.step);\n if (min !== undefined) out.min = min;\n if (max !== undefined) out.max = max;\n if (step !== undefined && step > 0) out.step = step;\n return out;\n}\n\n/** Whether `value` is `base` plus a whole number of `step`s, allowing for floating-point error. */\nfunction onStep(value: number, base: number, step: number): boolean {\n const n = (value - base) / step;\n return Math.abs(n - Math.round(n)) < 1e-9 * Math.max(1, Math.abs(n));\n}\n\n/** `YYYY-MM-DD`, a real calendar day (no 2026-02-30), years 0001 to 9999. */\nexport function isIsoDate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const [y, m, d] = value.split(\"-\").map(Number) as [number, number, number];\n if (y < 1 || m < 1 || m > 12 || d < 1) return false;\n const days = [31, y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n return d <= days[m - 1]!;\n}\n\n/** A `date` field's earliest and latest days (`YYYY-MM-DD`), when set. */\nexport function dateLimits(field: FieldBlock): { min?: string; max?: string } {\n const out: { min?: string; max?: string } = {};\n const min = field.props?.min;\n const max = field.props?.max;\n if (typeof min === \"string\" && isIsoDate(min)) out.min = min;\n if (typeof max === \"string\" && isIsoDate(max)) out.max = max;\n return out;\n}\n\nfor (const manifest of [...builtins, ...structuredFieldTypes, calculatedFieldType]) registerFieldType(manifest);\n","/** Guards and helpers for event logs and other untrusted JSON. No dependencies. */\nimport type { FormEvent, Json } from \"./types\";\n\n/** A plain object: `{}` or `Object.create(null)`, not an array, a class instance or null. */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Whether a value is JSON: strings, finite numbers, booleans, null, arrays and\n * plain objects, nested to any depth. Iterative, so a deeply nested value\n * cannot overflow the stack.\n */\nexport function isJson(value: unknown): value is Json {\n const stack: unknown[] = [value];\n while (stack.length) {\n const v = stack.pop();\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") continue;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return false;\n continue;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) stack.push(v[i]);\n continue;\n }\n if (!isPlainObject(v)) return false;\n for (const key of Object.keys(v)) stack.push(v[key]);\n }\n return true;\n}\n\nconst EVENT_TYPES = new Set([\"answer\", \"next\", \"back\", \"submit\"]);\n\n/** Whether `value` is a well-formed `FormEvent` of a known type. */\nexport function isFormEvent(value: unknown): value is FormEvent {\n if (!isPlainObject(value) || typeof value.type !== \"string\" || !EVENT_TYPES.has(value.type)) return false;\n if (value.at !== undefined && !(typeof value.at === \"number\" && Number.isFinite(value.at))) return false;\n if (value.type !== \"answer\") return true;\n return (\n typeof value.field === \"string\" &&\n (value.value === undefined || isJson(value.value)) &&\n (value.source === undefined || value.source === \"prefill\")\n );\n}\n\n/**\n * An event of a type this version does not know, such as one a newer client\n * logs. Replays ignore these, so they are dropped rather than rejected.\n */\nexport function isUnknownEvent(value: unknown): boolean {\n return isPlainObject(value) && typeof value.type === \"string\" && !EVENT_TYPES.has(value.type);\n}\n\n/**\n * Merge consecutive answer events to the same field, keeping the last value.\n * Text inputs log one event per keystroke; the merged log replays to the same\n * state, because the path is derived from values alone.\n */\nexport function compactEvents(events: FormEvent[]): FormEvent[] {\n const out: FormEvent[] = [];\n for (const event of events) {\n const last = out[out.length - 1];\n if (event.type === \"answer\" && last?.type === \"answer\" && last.field === event.field) {\n out[out.length - 1] = event;\n } else out.push(event);\n }\n return out;\n}\n","/** Typing hidden inputs. Shared by the engine and the server, so both type them identically. */\nimport { isPlainObject } from \"./events\";\nimport type { FormDefinition, HiddenInput, Json } from \"./types\";\n\n/** Longest string a hidden input accepts. Longer values are dropped. */\nexport const MAX_HIDDEN_STRING_LENGTH = 1000;\n\n/** A plain decimal: an optional `-`, digits, and an optional fraction. */\nconst DECIMAL = /^-?\\d+(\\.\\d+)?$/;\n\nexport interface CoerceHiddenOptions {\n /** Coerce only inputs with these sources; the rest are reported in `ignored`. Default: all. */\n sources?: readonly HiddenInput[\"source\"][];\n}\n\nexport interface CoercedHidden {\n /** Declared inputs, typed. */\n values: Record<string, Json>;\n /** Names dropped: undeclared, from another source, or not convertible to the declared type. */\n ignored: string[];\n}\n\n/**\n * Convert one raw value to a hidden input's declared type, or `undefined` when\n * it cannot be. Only string, number and boolean primitives are accepted.\n * - `string`: a string (at most 1000 characters), or a number or boolean as text.\n * - `number`: a finite number, or a plain decimal string such as `\"12\"`, `\"-3\"`\n * or `\"2.5\"`. No spaces, hex, exponents or `\"\"`.\n * - `boolean`: `true`/`false`, or the strings `\"true\"`/`\"false\"`.\n */\nexport function coerceHiddenValue(value: unknown, type: HiddenInput[\"type\"]): Json | undefined {\n if (typeof value === \"string\" && value.length > MAX_HIDDEN_STRING_LENGTH) return undefined;\n if (type === \"string\") {\n if (typeof value === \"string\") return value;\n if (typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) return String(value);\n return undefined;\n }\n if (type === \"number\") {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value !== \"string\" || !DECIMAL.test(value)) return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n }\n if (typeof value === \"boolean\") return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\n/**\n * Type raw hidden inputs (from a query string, the host app or the server)\n * by the definition's declarations. `undefined` values are skipped silently.\n */\nexport function coerceHidden(\n definition: FormDefinition,\n raw: Record<string, unknown> | undefined,\n options: CoerceHiddenOptions = {},\n): CoercedHidden {\n const declared = new Map((definition.hidden ?? []).map((h) => [h.name, h]));\n const values: Record<string, Json> = {};\n const ignored: string[] = [];\n if (!isPlainObject(raw)) return { values, ignored };\n for (const name of Object.keys(raw)) {\n const value = raw[name];\n if (value === undefined) continue;\n const spec = declared.get(name);\n if (!spec || (options.sources && !options.sources.includes(spec.source))) {\n ignored.push(name);\n continue;\n }\n const coerced = coerceHiddenValue(value, spec.type);\n if (coerced === undefined) ignored.push(name);\n else Object.defineProperty(values, name, { value: coerced, enumerable: true, writable: true, configurable: true });\n }\n return { values, ignored };\n}\n","import { isEmptyValue } from \"./fields\";\nimport type { Block, Condition, FieldBlock, FormDefinition, Json, LogicRule, Operand } from \"./types\";\n\nexport interface EvalScope {\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n fields: Map<string, FieldBlock>;\n}\n\n/** `record[key]` if it is the record's own property: `values.constructor` is not an answer. */\nexport function own<T>(record: Record<string, T>, key: string): T | undefined {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction resolve(operand: Operand, scope: EvalScope): Json | undefined {\n if (\"field\" in operand) return own(scope.values, operand.field);\n if (\"hidden\" in operand) return own(scope.hidden, operand.hidden);\n return operand.value;\n}\n\nfunction deepEqual(a: Json | undefined, b: Json | undefined): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n return false;\n}\n\n/**\n * Evaluate a condition. Never throws. An empty value (unanswered, `null`,\n * blank text, an empty list: see `isEmptyValue`) is unanswered: it fails\n * every comparison, including `eq`, `in` and `contains`, and passes `neq`.\n */\nexport function evaluate(condition: Condition, scope: EvalScope): boolean {\n if (\"all\" in condition) return condition.all.every((c) => evaluate(c, scope));\n if (\"any\" in condition) return condition.any.some((c) => evaluate(c, scope));\n if (\"not\" in condition) return !evaluate(condition.not, scope);\n\n const left = resolve(condition.left, scope);\n const right = condition.right ? resolve(condition.right, scope) : undefined;\n const field = \"field\" in condition.left ? scope.fields.get(condition.left.field) : undefined;\n const unanswered = isEmptyValue(left, field);\n\n switch (condition.op) {\n case \"answered\":\n return !unanswered;\n case \"empty\":\n return unanswered;\n case \"eq\":\n return !unanswered && deepEqual(left, right);\n case \"neq\":\n // An unanswered field is \"not\" any value.\n return unanswered || !deepEqual(left, right);\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n if (typeof left !== \"number\" || typeof right !== \"number\") return false;\n if (condition.op === \"lt\") return left < right;\n if (condition.op === \"lte\") return left <= right;\n if (condition.op === \"gt\") return left > right;\n return left >= right;\n }\n case \"in\":\n return !unanswered && Array.isArray(right) && right.some((r) => deepEqual(r, left));\n case \"contains\":\n if (unanswered) return false;\n if (Array.isArray(left)) return left.some((l) => deepEqual(l, right));\n return (\n typeof left === \"string\" &&\n typeof right === \"string\" &&\n left.toLowerCase().includes(right.toLowerCase())\n );\n }\n}\n\n/** Blocks a respondent steps through: fields and content, in order. */\nexport function steps(def: FormDefinition): Block[] {\n return def.blocks.filter((b) => b.kind !== \"page-break\");\n}\n\nfunction visibilityRules(def: FormDefinition, blockId: string) {\n return (def.logic ?? []).filter(\n (r): r is Extract<LogicRule, { target: string }> =>\n (r.effect === \"show\" || r.effect === \"hide\") && r.target === blockId,\n );\n}\n\n/** Whether a field is withheld because the form is anonymous and the field identifies the respondent. */\nexport function withheld(def: FormDefinition, field: FieldBlock | undefined): boolean {\n return def.settings?.anonymous === true && field?.identifying === true;\n}\n\n/** Show/hide rules against a scope as given. A matching `hide` wins; any `show` must match. */\nfunction rulesAllow(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n if (withheld(def, scope.fields.get(blockId))) return false;\n const rules = visibilityRules(def, blockId);\n if (rules.some((r) => r.effect === \"hide\" && evaluate(r.when, scope))) return false;\n const shows = rules.filter((r) => r.effect === \"show\");\n return shows.length === 0 || shows.some((r) => evaluate(r.when, scope));\n}\n\nexport interface PathResult {\n /** Block ids the respondent will step through, given the answers on the path. */\n path: string[];\n /** The ending reached by a jump, or the default ending. */\n ending: string | null;\n}\n\nexport interface PathWalk extends PathResult {\n /**\n * The scope logic sees at a block: the values of the fields on the path\n * before it (and of the block itself, with `inclusive`), nothing else.\n */\n scopeAt(blockId: string, inclusive?: boolean): EvalScope;\n}\n\n/** One forward pass over the blocks. See `computePath`. */\nexport function walkPath(def: FormDefinition, scope: EvalScope): PathWalk {\n const list = steps(def);\n // Built only when needed: an engine walks the path on every step.\n let index: Map<string, number> | undefined;\n let position: Map<string, number> | undefined;\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 index ??= new Map(list.map((b, at) => [b.id, at]));\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 position ??= new Map(def.blocks.map((b, i) => [b.id, i]));\n const at = position.get(blockId) ?? -1;\n const values = Object.create(null) as Record<string, Json | undefined>;\n for (const id of path) {\n const p = position!.get(id)!;\n if (p > at || (p === at && !inclusive)) break;\n if (id in placed) values[id] = placed[id];\n }\n return { values, hidden: scope.hidden, fields: scope.fields };\n };\n return { path, ending, scopeAt };\n}\n\n/**\n * The respondent's path, derived from the answers on the path, so the client,\n * the server and a replay always agree. It is built in one forward pass: a\n * block's show/hide rules, and the jumps from it, see only the fields already\n * on the path before it (and, for a jump, the block itself). A field that is\n * hidden, jumped over or later in the form reads as unanswered, whatever\n * value it holds.\n *\n * A block jumped over is off the path and counts as hidden: it is not\n * validated and its value is cleared on submit. A jump never revisits a block;\n * a jump to an earlier block is ignored (the checker in `parseForm` reports it).\n */\nexport function computePath(def: FormDefinition, scope: EvalScope): PathResult {\n const { path, ending } = walkPath(def, scope);\n return { path, ending };\n}\n\n/**\n * Whether a block's show/hide rules let it be shown, ignoring jumps. The rules\n * read the answers on the path before the block, as in `computePath`. A block\n * with any `show` rule is hidden until one matches; a matching `hide` rule\n * always wins.\n */\nexport function ruleVisible(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n return rulesAllow(def, blockId, walkPath(def, scope).scopeAt(blockId));\n}\n\nexport function fieldMap(def: FormDefinition): Map<string, FieldBlock> {\n const map = new Map<string, FieldBlock>();\n for (const block of def.blocks) if (block.kind === \"field\") map.set(block.id, block);\n return map;\n}\n","import { summarizeValue } from \"./fields\";\nimport { own } from \"./logic\";\nimport type { FieldBlock, Json } from \"./types\";\n\nconst TOKEN = /\\{\\{\\s*(field|hidden):([A-Za-z0-9_-]+)\\s*(?:\\|([^}]*))?\\}\\}/g;\n\nexport interface RecallScope {\n /** Fields by key. */\n fieldsByKey: Map<string, FieldBlock>;\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n}\n\n/**\n * Replace `{{field:key|fallback}}` and `{{hidden:name|fallback}}` tokens.\n * An unanswered value renders its fallback (default empty); the text is\n * never dropped.\n */\nexport function recall(text: string, scope: RecallScope): string {\n return text.replace(TOKEN, (_match, kind: string, name: string, fallback?: string) => {\n if (kind === \"field\") {\n const field = scope.fieldsByKey.get(name);\n const out = field ? summarizeValue(own(scope.values, field.id), field) : \"\";\n return out || (fallback ?? \"\").trim();\n }\n const value = own(scope.hidden, name);\n const out = value === undefined || value === null ? \"\" : String(value);\n return out || (fallback ?? \"\").trim();\n });\n}\n\n/** The keys a text recalls, for the checker. */\nexport function recallRefs(text: string): { kind: \"field\" | \"hidden\"; name: string }[] {\n return [...text.matchAll(TOKEN)].map((m) => ({ kind: m[1] as \"field\" | \"hidden\", name: m[2]! }));\n}\n","import { CALCULATED_TYPE } from \"./calculated\";\nimport { getFieldType, isEmptyValue } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\n/** The Standard Schema interface (standardschema.dev), as far as validation needs it. */\nexport interface StandardSchemaV1<T = unknown> {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) =>\n | { value: T; issues?: undefined }\n | { issues: ReadonlyArray<{ message: string }> }\n | Promise<unknown>;\n };\n}\n\n/** A custom check for one field: a function, or any Standard Schema (Zod, Valibot, ArkType…). */\nexport type FieldValidator = ((value: Json) => string | null) | StandardSchemaV1;\n\nexport const REQUIRED_MESSAGE = \"This question needs an answer.\";\n\nfunction runCustom(validator: FieldValidator, value: Json): string | null {\n if (typeof validator === \"function\") return validator(value);\n const result = validator[\"~standard\"].validate(value);\n if (result instanceof Promise) {\n throw new Error(\"Async validators are not supported in the engine yet; run them on the server.\");\n }\n const issues = (result as { issues?: ReadonlyArray<{ message: string }> }).issues;\n return issues?.length ? issues[0]!.message : null;\n}\n\n/**\n * Validate one field's value. `requireAnswers: false` (drafts) checks the\n * format of what was answered without requiring the rest.\n */\nexport function validateField(\n field: FieldBlock,\n value: Json | undefined,\n options: { requireAnswers?: boolean; custom?: FieldValidator } = {},\n): string | null {\n if (isEmptyValue(value, field)) {\n // A calculated field is worked out, not answered, so it is never required.\n return field.required && field.type !== CALCULATED_TYPE && options.requireAnswers !== false ? REQUIRED_MESSAGE : null;\n }\n const manifest = getFieldType(field.type);\n // A type with no manifest cannot say what a valid answer is, so none is accepted.\n if (!manifest) return `Unknown field type \"${field.type}\".`;\n const builtIn = manifest.validate?.(value as Json, field) ?? null;\n if (builtIn) return builtIn;\n return options.custom ? runCustom(options.custom, value as Json) : null;\n}\n","import { calculator, isCalculated, spend, workStats, type WorkBudget } from \"./calculated\";\nimport { isEmptyValue, normalizeValue } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { computePath, fieldMap, own, type EvalScope } from \"./logic\";\nimport { recall } from \"./recall\";\nimport type { Block, FieldBlock, FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface FormState {\n /** Answers keyed by block id. */\n values: Record<string, Json | undefined>;\n /** URL and host inputs (untrusted) and server-resolved inputs, by name. */\n hidden: Record<string, Json | undefined>;\n /** Block ids the respondent steps through, given the answers so far. */\n path: string[];\n /** The block on screen in focus layout. */\n current: string | null;\n /** Visited blocks, for Back. */\n history: string[];\n errors: Record<string, string>;\n status: \"in_progress\" | \"completed\";\n /** The ending reached once completed. */\n ending: string | null;\n events: FormEvent[];\n}\n\nexport interface CreateFormOptions {\n /** Prefilled answers by field id. Logged as leading `answer` events with `source: \"prefill\"`. */\n initialValues?: Record<string, Json> | undefined;\n /** Hidden inputs by name. Declared ones are typed with `coerceHidden`, as the server types them. */\n hidden?: Record<string, Json | undefined> | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /** Timestamps on events. Pass `() => undefined` to record none (anonymous forms). */\n clock?: (() => number | undefined) | undefined;\n}\n\nexport interface FormEngine {\n readonly definition: FormDefinition;\n getState(): FormState;\n subscribe(listener: () => void): () => void;\n /** A field's id, from its key. */\n idOf(key: string): string;\n field(id: string): FieldBlock | undefined;\n block(id: string): Block | undefined;\n isVisible(id: string): boolean;\n /**\n * Set an answer. Like `next`, `back` and `submit`, it does nothing once the\n * response is completed: a completed response is final, so its stored\n * answers are the ones that were validated. It does nothing for a\n * `calculated` field either: the engine works that value out.\n */\n setValue(id: string, value: Json | undefined): void;\n /** Validate the current step and move on. Returns false if it has errors. */\n next(): boolean;\n back(): void;\n /** Validate every visible field and complete. Returns false if it has errors or is already completed. */\n submit(): boolean;\n /** Text with `{{recall}}` tokens resolved. */\n text(template: string): string;\n /** Visible, non-empty field values only, keyed by id: what a submit stores. */\n answers(): Record<string, Json>;\n}\n\n/** Whether any `field` operand under `node` (logic rules) names one of `ids`. */\nfunction readsAny(node: unknown, ids: ReadonlySet<string>): boolean {\n if (Array.isArray(node)) return node.some((n) => readsAny(n, ids));\n if (!node || typeof node !== \"object\") return false;\n for (const [k, v] of Object.entries(node)) {\n if (k === \"field\" && typeof v === \"string\" && ids.has(v)) return true;\n if (typeof v === \"object\" && readsAny(v, ids)) return true;\n }\n return false;\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, budget?: WorkBudget): Built {\n const fields = fieldMap(definition);\n const byKey = new Map([...fields.values()].map((f) => [f.key, f]));\n const blocks = new Map(definition.blocks.map((b) => [b.id, b]));\n // An anonymous form records no timestamps, whatever clock is passed.\n const clock = definition.settings?.anonymous === true ? () => undefined : (options.clock ?? (() => Date.now()));\n const listeners = new Set<() => void>();\n // While replaying, events are pushed onto one array instead of copied per\n // event, so a long log replays in linear time.\n let batch = replaying;\n\n const scopeOf = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]): EvalScope => ({\n values,\n hidden,\n fields,\n });\n\n // Declared inputs are typed exactly as the server types them; undeclared\n // names pass through (logic and recall cannot reference them).\n const declared = new Set((definition.hidden ?? []).map((h) => h.name));\n const initialHidden: FormState[\"hidden\"] = {};\n for (const [name, value] of Object.entries(options.hidden ?? {})) {\n if (!declared.has(name)) initialHidden[name] = value;\n }\n Object.assign(initialHidden, coerceHidden(definition, options.hidden).values);\n\n // Calculated fields are worked out from the answers on the path, and logic\n // may read them, so the two settle together (a few rounds at most).\n const calc = calculator(definition, budget);\n // Each walk of the path costs one unit per block, against the same budget.\n const pathOf = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]) => {\n spend(budget, definition.blocks.length);\n return computePath(definition, scopeOf(values, hidden));\n };\n // When no rule reads a calculated field, the path doesn't depend on the\n // calculated values, so one round is enough.\n const logicReadsCalculated = calc.active && readsAny(definition.logic, calc.ids);\n const settle = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]) => {\n let { path } = pathOf(values, hidden);\n if (!calc.active) return { values, path };\n if (!logicReadsCalculated) return { values: calc.withCalculated(values, path), path };\n for (let round = 0; round < 4; round++) {\n const next = calc.withCalculated(values, path);\n if (next === values) break;\n values = next;\n const again = pathOf(values, hidden).path;\n // The same path: the values just worked out read the same answers, so they stand.\n const same = again.length === path.length && again.every((id, i) => id === path[i]);\n path = again;\n if (same) break;\n }\n return { values, path };\n };\n\n const first = settle({}, initialHidden);\n let state: FormState = {\n values: first.values,\n hidden: initialHidden,\n path: first.path,\n current: first.path[0] ?? null,\n history: [],\n errors: {},\n status: \"in_progress\",\n ending: null,\n events: [],\n };\n\n const emit = (next: FormState) => {\n state = next;\n if (batch) return;\n for (const l of listeners) l();\n };\n const log = (event: FormEvent): FormEvent[] => {\n if (!batch) return [...state.events, event];\n state.events.push(event);\n return state.events;\n };\n const stamp = <E extends FormEvent>(event: E): E => {\n const at = clock();\n return at === undefined ? event : { ...event, at };\n };\n\n // Every block on the path is visible: the path only takes blocks whose\n // rules allow them, given the answers before them.\n const isVisibleIn = (s: FormState, id: string) => s.path.includes(id);\n\n const errorsFor = (s: FormState, ids: string[]) => {\n const errors: Record<string, string> = {};\n for (const id of ids) {\n const field = fields.get(id);\n if (!field || !isVisibleIn(s, id)) continue;\n const message = validateField(field, own(s.values, id), { custom: options.validators?.[id] });\n if (message) errors[id] = message;\n }\n return errors;\n };\n\n // While replaying, answers only record the value: the path and calculated\n // fields are settled once, before the next step that reads them\n // (`next`, `back`, `submit`, or the end of the replay), not once per event.\n // When no rule reads a calculated field, a step needs only the path, so the\n // formulas wait for a step that reads their values (`submit`, the end, or\n // `next` on a calculated field) and run once there.\n let unsettled = false;\n let formulasStale = false;\n const settleNow = (needValues = true) => {\n if (unsettled && calc.active && !logicReadsCalculated && !needValues) {\n unsettled = false;\n formulasStale = true;\n state = { ...state, path: pathOf(state.values, state.hidden).path };\n return;\n }\n if (unsettled) {\n unsettled = false;\n formulasStale = false;\n const { values, path } = settle(state.values, state.hidden);\n state = { ...state, values, path };\n } else if (formulasStale && needValues) {\n formulasStale = false;\n state = { ...state, values: calc.withCalculated(state.values, state.path) };\n }\n };\n\n const answer = (id: string, value: Json | undefined, event: FormEvent) => {\n if (state.status === \"completed\" || isCalculated(fields.get(id))) return;\n if (own(state.values, id) === value) {\n // The same list or table again may have been changed in place: work it out afresh.\n if (value === null || typeof value !== \"object\") return;\n calc.forget(value);\n }\n const errors = { ...state.errors };\n delete errors[id];\n if (batch) {\n // `state` is not seen by anyone until the replay ends, so it is updated in place.\n state.values = { ...state.values, [id]: value };\n state.errors = errors;\n log(event);\n unsettled = true;\n return;\n }\n const { values, path } = settle({ ...state.values, [id]: value }, state.hidden);\n emit({ ...state, values, path, errors, events: log(event) });\n };\n\n const engine: FormEngine = {\n definition,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n idOf(key) {\n const field = byKey.get(key);\n if (!field) throw new Error(`No field with key \"${key}\".`);\n return field.id;\n },\n field: (id) => fields.get(id),\n block: (id) => blocks.get(id),\n isVisible: (id) => isVisibleIn(state, id),\n\n setValue(id, value) {\n if (!fields.has(id)) throw new Error(`No field \"${id}\".`);\n answer(id, value, stamp({ type: \"answer\", field: id, value }));\n },\n\n next() {\n if (!state.current || state.status === \"completed\") return false;\n const errors = errorsFor(state, [state.current]);\n // A failed attempt is logged too, so a replay shows the same errors.\n const events = log(stamp({ type: \"next\" as const }));\n if (Object.keys(errors).length) {\n emit({ ...state, errors: { ...state.errors, ...errors }, events });\n return false;\n }\n const at = state.path.indexOf(state.current);\n const target = state.path[at + 1];\n if (!target) {\n emit({ ...state, events });\n return true;\n }\n emit({ ...state, current: target, history: [...state.history, state.current], events });\n return true;\n },\n\n back() {\n if (state.status === \"completed\") return;\n const history = [...state.history];\n let previous = history.pop();\n while (previous && !state.path.includes(previous)) previous = history.pop();\n if (!previous) return;\n emit({ ...state, current: previous, history, events: log(stamp({ type: \"back\" as const })) });\n },\n\n submit() {\n if (state.status === \"completed\") return false;\n const errors = errorsFor(state, state.path);\n const events = log(stamp({ type: \"submit\" as const }));\n if (Object.keys(errors).length) {\n const firstError = state.path.find((id) => own(errors, id)) ?? state.current;\n emit({ ...state, errors, current: firstError, events });\n return false;\n }\n const { ending } = pathOf(state.values, state.hidden);\n emit({ ...state, errors: {}, status: \"completed\", ending, events });\n return true;\n },\n\n text: (template) =>\n recall(template, { fieldsByKey: byKey, values: state.values, hidden: state.hidden }),\n\n answers() {\n const out: Record<string, Json> = {};\n for (const id of state.path) {\n const field = fields.get(id);\n const value = own(state.values, id);\n // An empty answer (`\"\"`, blank text, `[]`) is stored as no answer.\n if (field && !isEmptyValue(value, field)) out[id] = normalizeValue(value as Json, field);\n }\n return out;\n },\n };\n\n // Prefilled answers are logged as leading `answer` events, so a replay of\n // the log, and the server, see them too. They settle once, like a replay.\n if (options.initialValues) {\n const wasBatch = batch;\n batch = true;\n for (const [id, value] of Object.entries(options.initialValues)) {\n if (!fields.has(id) || value === undefined) continue;\n answer(id, value, stamp({ type: \"answer\", field: id, value, source: \"prefill\" }));\n }\n settleNow();\n batch = wasBatch;\n }\n\n const apply = (event: FormEvent) => {\n if (event.type === \"answer\") {\n if (fields.has(event.field)) {\n const { at: _at, ...logged } = event;\n answer(event.field, event.value, logged);\n }\n } else if (event.type === \"next\") {\n settleNow(false);\n if (formulasStale && isCalculated(fields.get(state.current ?? \"\"))) settleNow(true);\n engine.next();\n } else if (event.type === \"back\") {\n settleNow(false);\n engine.back();\n } else if (event.type === \"submit\") {\n settleNow();\n engine.submit();\n }\n // Unknown event types are ignored.\n };\n const finish = () => {\n settleNow();\n batch = false;\n state = { ...state, events: [...state.events] };\n };\n return { engine, apply, finish };\n}\n\n/** Rebuild a form's state from its event log. Timestamps are ignored. */\nexport function replay(\n definition: FormDefinition,\n events: FormEvent[],\n options: Omit<CreateFormOptions, \"clock\" | \"initialValues\"> = {},\n): FormEngine {\n return replayWithin(definition, events, options);\n}\n\n/**\n * `replay`, throwing `ReplayWorkExceeded` once walking the path and working\n * out the calculated fields take more than `maxWork` (for\n * `validateSubmission`; not exported from the package).\n */\nexport function replayWithin(\n definition: FormDefinition,\n events: FormEvent[],\n options: Omit<CreateFormOptions, \"clock\" | \"initialValues\">,\n maxWork?: number,\n): FormEngine {\n const budget = maxWork === undefined ? undefined : { used: 0, max: maxWork };\n const { engine, apply, finish } = build(definition, { ...options, initialValues: undefined, clock: () => undefined }, true, budget);\n try {\n for (const event of events) apply(event);\n finish();\n } finally {\n if (budget) workStats.lastReplayWork = budget.used;\n }\n // The limit is on the replay. What follows (a submit, `answers()`) settles\n // at most once, so it is not counted and never throws.\n if (budget) budget.max = Infinity;\n return engine;\n}\n","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","/**\n * Symbolic path coverage. Each field gets a small finite domain (its valid\n * values, \"unanswered\" when allowed, and boundary values pulled from the\n * conditions); a depth-first search answers the fields in path order, so only\n * combinations a respondent could actually produce are explored.\n */\nimport { CALCULATED_TYPE } from \"./calculated\";\nimport { canonicalJson } from \"./hash\";\nimport { choiceOptions, getFieldType, isEmptyValue } from \"./fields\";\nimport { evaluate, fieldMap, steps, walkPath, type EvalScope, type PathWalk } from \"./logic\";\nimport type { Condition, FieldBlock, FormDefinition, Json } from \"./types\";\nimport { validateField } from \"./validate\";\n\nexport interface CoverageOptions {\n /** Stop after this many explored states and report `truncated`. Default 5000. */\n maxStates?: number;\n /** Fix the hidden inputs instead of enumerating the values the logic compares them with. */\n hidden?: Record<string, Json>;\n /** Most options of a multi-choice field to try one by one. Default 12. */\n maxOptions?: number;\n}\n\nexport interface EndingCoverage {\n reached: boolean;\n /** Answers (by key) of one completed response that reaches this ending. */\n witness?: Record<string, Json>;\n /** Hidden inputs that witness needs, when the logic reads any. */\n witnessHidden?: Record<string, Json>;\n /**\n * Set when coverage found this ending only on paths through required fields\n * with no sample value (a plugin type without `samples`), so it could not\n * build a completed response: the keys of those fields. `reached` stays false.\n */\n needsSamples?: string[];\n}\n\nexport interface CoverageReport {\n endings: Record<string, EndingCoverage>;\n /** Keys (or block ids, for content) of blocks no completed response steps through. */\n unreachableBlocks: string[];\n /** Rules whose condition never held in a completed response (a jump also needs its `from` on the path). */\n rulesNeverFired: string[];\n /** Keys of fields coverage had no valid answer for: give their type `samples`. */\n unsampledFields: string[];\n /** Completed responses explored. */\n pathsExplored: number;\n truncated: boolean;\n}\n\ntype Value = Json | undefined;\n\n/**\n * One value to try for a field. `placeholder` marks a stand-in for a required\n * answer with no known valid value: it steers the logic down each branch, but\n * a path through it is not a response anyone could submit.\n */\ninterface Candidate {\n value: Value;\n placeholder?: true;\n}\n\n/** A non-empty stand-in answer, so `answered` branches are explored too. */\nconst SOME_ANSWER: Json = { \"genesis-forms/unsampled\": true };\n\n/** Values each field or hidden input is compared with, anywhere in the logic. */\nfunction boundaries(def: FormDefinition) {\n const fields = new Map<string, Value[]>();\n const hidden = new Map<string, Value[]>();\n const add = (map: Map<string, Value[]>, name: string, values: Value[]) =>\n map.set(name, [...(map.get(name) ?? []), ...values]);\n const visit = (c: Condition) => {\n if (\"all\" in c) return c.all.forEach(visit);\n if (\"any\" in c) return c.any.forEach(visit);\n if (\"not\" in c) return visit(c.not);\n const right = c.right && \"value\" in c.right ? c.right.value : undefined;\n let values: Value[] = [];\n if (typeof right === \"number\") values = [right - 1, right, right + 1];\n else if (Array.isArray(right) && c.op === \"in\") values = right;\n else if (right !== undefined) values = [right];\n if (\"field\" in c.left) add(fields, c.left.field, values);\n else if (\"hidden\" in c.left) add(hidden, c.left.hidden, [undefined, ...values]);\n };\n for (const rule of def.logic ?? []) visit(rule.when);\n return { fields, hidden };\n}\n\nfunction dedupe(values: Value[]): Value[] {\n const seen = new Set<string>();\n return values.filter((v) => {\n const k = v === undefined ? \"\\u0000undefined\" : canonicalJson(v);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\nfunction domainOf(field: FieldBlock, extra: Value[], maxOptions: number): Candidate[] {\n // A calculated value is worked out, not answered: blank, or any value the\n // logic compares it with (assuming the answers before it can produce that).\n if (field.type === CALCULATED_TYPE) return dedupe([undefined, ...extra]).map((value) => ({ value }));\n const options = choiceOptions(field).map((o) => o.value);\n let base: Value[];\n switch (field.type) {\n case \"rating\": {\n const max = typeof field.props?.max === \"number\" ? field.props.max : 5;\n base = Array.from({ length: max }, (_, i) => i + 1);\n break;\n }\n case \"nps\":\n base = Array.from({ length: 11 }, (_, i) => i);\n break;\n case \"yes-no\":\n base = [true, false];\n break;\n case \"single-choice\":\n case \"dropdown\":\n base = options;\n break;\n case \"multi-choice\": {\n const singles = options.slice(0, maxOptions).map((o) => [o]);\n base = [...singles, options];\n // `contains` compares with a single option: try each as a one-item answer.\n extra = extra.map((v) => (typeof v === \"string\" ? [v] : v));\n break;\n }\n case \"list\":\n base = getFieldType(field.type)?.samples?.(field) ?? [];\n // `contains` compares with one item: try each as a one-item list.\n extra = extra.map((v) => (typeof v === \"string\" ? [v] : v));\n break;\n case \"email\":\n base = [\"ada@example.com\"];\n break;\n case \"phone\":\n base = [\"+1 555 010 0199\"];\n break;\n case \"short-text\":\n case \"long-text\":\n base = [\"sample\"];\n break;\n default:\n base = getFieldType(field.type)?.samples?.(field) ?? [];\n }\n // Unanswered first, so witnesses stay as short as possible.\n const candidates = dedupe([undefined, ...base, ...extra]);\n const valid = candidates.filter((v) => validateField(field, v) === null);\n const domain: Candidate[] = valid.map((value) => ({ value }));\n if (valid.some((v) => !isEmptyValue(v, field))) return domain;\n // A type with no known valid answer (a plugin without samples) must neither\n // dead-end the search nor hide the branches an answer would take: also try\n // the values the logic compares it with and some answer, as placeholders.\n const invalid = dedupe([...candidates, SOME_ANSWER]).filter((v) => !valid.includes(v));\n return [...domain, ...invalid.map((value): Candidate => ({ value, placeholder: true }))];\n}\n\nexport function coverage(form: FormDefinition | { definition: FormDefinition }, opts: CoverageOptions = {}): CoverageReport {\n const def = \"definition\" in form ? form.definition : form;\n const maxStates = opts.maxStates ?? 5000;\n const fields = fieldMap(def);\n const bounds = boundaries(def);\n const domains = new Map([...fields.values()].map((f) => [f.id, domainOf(f, bounds.fields.get(f.id) ?? [], opts.maxOptions ?? 12)]));\n const stepIds = steps(def).map((b) => b.id);\n\n const endings: Record<string, EndingCoverage> = {};\n for (const e of def.endings ?? []) endings[e.id] = { reached: false };\n const reachedBlocks = new Set<string>();\n const fired = new Set<string>();\n let states = 0;\n let paths = 0;\n let truncated = false;\n\n const keyOf = (id: string) => fields.get(id)?.key ?? id;\n const unsampled = new Set<string>();\n\n const terminal = (scope: EvalScope, walk: PathWalk, placeholders: Set<string>) => {\n const { path, ending } = walk;\n // Placeholders try every branch the logic can take on them, so blocks\n // and rules count as reachable, assuming a valid answer takes that branch.\n for (const id of path) reachedBlocks.add(id);\n for (const rule of def.logic ?? []) {\n if (fired.has(rule.id)) continue;\n if (rule.effect === \"jump\" && !path.includes(rule.from)) continue;\n // Each rule sees the answers on the path before the block it applies to.\n const at = rule.effect === \"jump\" ? walk.scopeAt(rule.from, true) : walk.scopeAt(rule.target);\n if (evaluate(rule.when, at)) fired.add(rule.id);\n }\n // A path through a placeholder is not a response anyone could submit.\n const missing = path.filter((id) => placeholders.has(id)).map(keyOf);\n if (missing.length) {\n for (const key of missing) unsampled.add(key);\n if (ending !== null && !endings[ending]?.reached) (endings[ending] ??= { reached: false }).needsSamples ??= missing;\n return;\n }\n paths++;\n if (ending === null) return;\n const entry = (endings[ending] ??= { reached: false });\n if (entry.reached) return;\n entry.reached = true;\n delete entry.needsSamples;\n const witness: Record<string, Json> = {};\n for (const id of path) {\n const v = scope.values[id];\n if (fields.has(id) && v !== undefined) witness[keyOf(id)] = v;\n }\n entry.witness = witness;\n const hidden = Object.fromEntries(\n Object.entries(scope.hidden).filter((e): e is [string, Json] => e[1] !== undefined),\n );\n if (Object.keys(hidden).length) entry.witnessHidden = hidden;\n };\n\n const explore = (\n values: Record<string, Value>,\n assigned: Set<string>,\n hidden: Record<string, Value>,\n placeholders: Set<string>,\n ) => {\n if (truncated) return;\n if (++states > maxStates) {\n truncated = true;\n return;\n }\n const scope: EvalScope = { values, hidden, fields };\n const walk = walkPath(def, scope);\n const next = walk.path.find((id) => fields.has(id) && !assigned.has(id));\n if (next === undefined) return terminal(scope, walk, placeholders);\n const nextAssigned = new Set(assigned).add(next);\n for (const { value, placeholder } of domains.get(next) ?? [{ value: undefined }]) {\n explore({ ...values, [next]: value }, nextAssigned, hidden, placeholder ? new Set(placeholders).add(next) : placeholders);\n if (truncated) return;\n }\n };\n\n // Hidden inputs the logic reads: fixed by the caller, or enumerated up front.\n const hiddenNames = [...bounds.hidden.keys()];\n const enumerateHidden = (i: number, hidden: Record<string, Value>) => {\n if (truncated) return;\n if (opts.hidden || i === hiddenNames.length) return explore({}, new Set(), opts.hidden ?? hidden, new Set());\n const name = hiddenNames[i]!;\n for (const v of dedupe(bounds.hidden.get(name)!)) enumerateHidden(i + 1, { ...hidden, [name]: v });\n };\n enumerateHidden(0, {});\n\n return {\n endings,\n unreachableBlocks: stepIds.filter((id) => !reachedBlocks.has(id)).map(keyOf),\n rulesNeverFired: (def.logic ?? []).filter((r) => !fired.has(r.id)).map((r) => r.id),\n unsampledFields: [...unsampled],\n pathsExplored: paths,\n truncated,\n };\n}\n","import { CALCULATED_TYPE, MAX_CALCULATED_DECIMALS, MAX_FORM_FORMULA_LENGTH } from \"./calculated\";\nimport { isJson } from \"./events\";\nimport { getFieldType, isIsoDate } from \"./fields\";\nimport { parseFormula } from \"./formula\";\nimport { recallRefs } from \"./recall\";\nimport { MAX_TABLE_COLUMNS } from \"./structured\";\nimport type { Condition, FormDefinition, Operator } from \"./types\";\n\n/** A value for a message. Never throws: parseForm accepts any input, including BigInts, cycles and deep nesting. */\nfunction shown(v: unknown): string {\n let text: string | undefined;\n try {\n text = JSON.stringify(v);\n } catch {\n text = undefined;\n }\n text ??= typeof v === \"bigint\" ? `${v}n` : typeof v;\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\nexport interface FormIssue {\n path: string;\n message: string;\n}\n\nexport type ParseResult =\n | { ok: true; form: FormDefinition; warnings: FormIssue[] }\n | { ok: false; issues: FormIssue[]; warnings: FormIssue[] };\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst isInt = (v: unknown): v is number => typeof v === \"number\" && Number.isInteger(v);\n\n/** The JSON type a comparison operand must have to match a built-in field type's value. */\nconst LITERAL_TYPE: Readonly<Record<string, \"string\" | \"number\" | \"boolean\">> = {\n \"short-text\": \"string\",\n \"long-text\": \"string\",\n email: \"string\",\n phone: \"string\",\n rating: \"number\",\n nps: \"number\",\n \"single-choice\": \"string\",\n \"multi-choice\": \"string\",\n \"yes-no\": \"boolean\",\n list: \"string\",\n dropdown: \"string\",\n number: \"number\",\n date: \"string\",\n consent: \"boolean\",\n // A calculated field holds a number unless its format says text; see `literalType`.\n calculated: \"number\",\n};\n\n/** Field types whose answer is one of `props.options`. */\nconst CHOICE_TYPES: ReadonlySet<string> = new Set([\"single-choice\", \"multi-choice\", \"dropdown\"]);\n\nconst ORDERING: ReadonlySet<string> = new Set<Operator>([\"lt\", \"lte\", \"gt\", \"gte\"]);\n\nconst OPERATORS: ReadonlySet<string> = new Set<Operator>([\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"in\",\n \"contains\",\n \"answered\",\n \"empty\",\n]);\n\n/**\n * Names an id, key or hidden input may not take: they collide with\n * `Object.prototype` (`__proto__`, `constructor`, `toString`…) when used as a\n * record key.\n */\nconst RESERVED: ReadonlySet<string> = new Set(Object.getOwnPropertyNames(Object.prototype));\n\n/** Deepest nesting of `all` / `any` / `not` a condition may have. */\nconst MAX_CONDITION_DEPTH = 32;\n\n/**\n * Check a definition before it is stored or rendered: structure, the types of\n * text fields, unique ids and keys, known field types, references that\n * resolve, operators that fit the field type. Warnings flag things that work\n * but are probably mistakes. Never throws, whatever the input.\n */\nexport function parseForm(input: unknown): ParseResult {\n const issues: FormIssue[] = [];\n const warnings: FormIssue[] = [];\n const fail = () => ({ ok: false as const, issues, warnings });\n const issue = (path: string, message: string) => void issues.push({ path, message });\n\n /** A required string (non-empty with `nonEmpty`). */\n const text = (v: unknown, path: string, nonEmpty = false) => {\n if (typeof v !== \"string\" || (nonEmpty && !v)) issue(path, nonEmpty ? \"Required.\" : \"Required text.\");\n };\n /** An optional string. */\n const optionalText = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"string\") issue(path, \"Must be text.\");\n };\n const optionalBoolean = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"boolean\") issue(path, \"Must be true or false.\");\n };\n /** An identifier: a non-empty string that is not an `Object.prototype` name. */\n const name = (v: unknown, path: string, what: string): v is string => {\n if (typeof v !== \"string\" || !v) {\n issue(path, `${what} must be a non-empty string.`);\n return false;\n }\n if (RESERVED.has(v)) {\n issue(path, `\"${v}\" is reserved and cannot be used as ${what.toLowerCase()}.`);\n return false;\n }\n return true;\n };\n\n /** An optional whole number of at least `floor`. */\n const optionalInt = (v: unknown, path: string, floor: number) => {\n if (v !== undefined && !(isInt(v) && v >= floor)) issue(path, `Must be a whole number of ${floor} or more.`);\n };\n /** `low` may not exceed `high` when both are whole numbers. */\n const ordered = (low: unknown, high: unknown, path: string, what: string) => {\n if (isInt(low) && isInt(high) && low > high) issue(path, `Can't be more than the ${what}.`);\n };\n /** The props of the structured types (list, table, media-notes, text-highlights). */\n const structuredProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"list\") {\n optionalInt(props.min, `${path}.min`, 0);\n optionalInt(props.max, `${path}.max`, 1);\n optionalInt(props.itemMaxLength, `${path}.itemMaxLength`, 1);\n optionalText(props.placeholder, `${path}.placeholder`);\n ordered(props.min, props.max ?? 10, `${path}.min`, \"most items\");\n } else if (type === \"table\") {\n const columns = props.columns;\n if (!Array.isArray(columns) || columns.length < 1 || columns.length > MAX_TABLE_COLUMNS) {\n issue(`${path}.columns`, `Must be a list of 1 to ${MAX_TABLE_COLUMNS} columns.`);\n } else {\n const seen = new Set<string>();\n columns.forEach((c, j) => {\n const at = `${path}.columns[${j}]`;\n if (!isObject(c)) return issue(at, \"Each column needs a key and a label.\");\n if (name(c.key, `${at}.key`, \"A column key\")) {\n if (seen.has(c.key)) issue(`${at}.key`, `Duplicate column key \"${c.key}\".`);\n seen.add(c.key);\n }\n text(c.label, `${at}.label`);\n optionalBoolean(c.long, `${at}.long`);\n });\n }\n optionalInt(props.minRows, `${path}.minRows`, 0);\n optionalInt(props.maxRows, `${path}.maxRows`, 1);\n ordered(props.minRows, props.maxRows ?? 3, `${path}.minRows`, \"most rows\");\n } else if (type === \"media-notes\") {\n optionalInt(props.maxNotes, `${path}.maxNotes`, 1);\n optionalInt(props.textMaxLength, `${path}.textMaxLength`, 1);\n } else if (type === \"text-highlights\") {\n optionalText(props.text, `${path}.text`);\n optionalInt(props.maxHighlights, `${path}.maxHighlights`, 1);\n } else if (type === CALCULATED_TYPE) {\n // The formula itself is checked once every key is known, below.\n if (props.format !== undefined && props.format !== \"number\" && props.format !== \"percent\" && props.format !== \"text\") {\n issue(`${path}.format`, \"Must be number, percent or text.\");\n }\n if (props.decimals !== undefined && !(isInt(props.decimals) && props.decimals >= 0 && props.decimals <= MAX_CALCULATED_DECIMALS)) {\n issue(`${path}.decimals`, `Must be a whole number from 0 to ${MAX_CALCULATED_DECIMALS}.`);\n }\n }\n };\n\n const isFiniteNumber = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\n /** The props of the scale, number, date and consent types. */\n const fieldProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"rating\" || type === \"nps\") {\n optionalText(props.lowLabel, `${path}.lowLabel`);\n optionalText(props.highLabel, `${path}.highLabel`);\n }\n if (type === \"rating\" && props.display !== undefined && props.display !== \"numbers\" && props.display !== \"stars\") {\n issue(`${path}.display`, \"Must be numbers or stars.\");\n }\n if (type === \"number\") {\n for (const k of [\"min\", \"max\", \"step\"] as const) {\n if (props[k] !== undefined && !isFiniteNumber(props[k])) issue(`${path}.${k}`, \"Must be a number.\");\n }\n if (isFiniteNumber(props.step) && props.step <= 0) issue(`${path}.step`, \"Must be above 0.\");\n if (isFiniteNumber(props.min) && isFiniteNumber(props.max) && props.min > props.max) {\n issue(`${path}.min`, \"Can't be more than the largest number.\");\n }\n }\n if (type === \"date\") {\n for (const k of [\"min\", \"max\"] as const) {\n if (props[k] !== undefined && !(typeof props[k] === \"string\" && isIsoDate(props[k]))) {\n issue(`${path}.${k}`, \"Must be a date like 2026-10-22.\");\n }\n }\n if (typeof props.min === \"string\" && typeof props.max === \"string\" && isIsoDate(props.min) && isIsoDate(props.max) && props.min > props.max) {\n issue(`${path}.min`, \"Can't be after the latest date.\");\n }\n }\n if (type === \"consent\") optionalText(props.text, `${path}.text`);\n };\n\n if (!isObject(input)) {\n issue(\"\", \"A form definition must be an object.\");\n return fail();\n }\n if (input.schemaVersion !== 1) issue(\"schemaVersion\", \"Unsupported schemaVersion; expected 1.\");\n text(input.id, \"id\", true);\n text(input.title, \"title\");\n optionalText(input.description, \"description\");\n // Settings change privacy behaviour (anonymous, clearHiddenValues), so a\n // mistyped one is an issue, not a silent default.\n if (input.layout !== undefined) {\n if (!isObject(input.layout)) issue(\"layout\", \"Must be an object.\");\n else if (input.layout.mode !== \"focus\" && input.layout.mode !== \"classic\") {\n issue(\"layout.mode\", \"Must be focus or classic.\");\n }\n }\n if (input.settings !== undefined) {\n if (!isObject(input.settings)) issue(\"settings\", \"Must be an object.\");\n else {\n optionalBoolean(input.settings.anonymous, \"settings.anonymous\");\n optionalBoolean(input.settings.clearHiddenValues, \"settings.clearHiddenValues\");\n }\n }\n if (input.meta !== undefined && (!isObject(input.meta) || !isJson(input.meta))) {\n issue(\"meta\", \"Must be a JSON object.\");\n }\n if (!Array.isArray(input.blocks)) {\n issue(\"blocks\", \"Must be an array.\");\n return fail();\n }\n\n const ids = new Set<string>();\n const pageBreaks = new Set<string>();\n const keys = new Map<string, string>();\n const fieldTypes = new Map<string, string>();\n const order = new Map<string, number>();\n /** Column keys of table fields, for formulas. */\n const tableColumnKeys = new Map<string, Set<string>>();\n /** Option values of fields with `props.options`, for the operand check. */\n const choices = new Map<string, Set<string>>();\n /** Calculated fields that don't hold a number: `format: \"text\"` holds text, no format can hold either. */\n const calculatedLiteral = new Map<string, \"string\" | undefined>();\n\n input.blocks.forEach((block: unknown, i) => {\n const path = `blocks[${i}]`;\n if (!isObject(block) || typeof block.id !== \"string\" || !block.id) {\n issue(path, \"Every block needs a string id.\");\n return;\n }\n if (!name(block.id, `${path}.id`, \"A block id\")) return;\n if (ids.has(block.id)) issue(`${path}.id`, `Duplicate id \"${block.id}\".`);\n ids.add(block.id);\n if (block.kind === \"page-break\") pageBreaks.add(block.id);\n order.set(block.id, i);\n if (block.kind === \"field\") {\n text(block.label, `${path}.label`);\n optionalText(block.description, `${path}.description`);\n optionalText(block.placeholder, `${path}.placeholder`);\n optionalBoolean(block.required, `${path}.required`);\n optionalBoolean(block.sensitive, `${path}.sensitive`);\n optionalBoolean(block.identifying, `${path}.identifying`);\n const validKey = name(block.key, `${path}.key`, \"A field key\");\n if (typeof block.type !== \"string\" || !getFieldType(block.type)) {\n issue(`${path}.type`, `Unknown field type \"${String(block.type)}\".`);\n }\n if (block.props !== undefined) {\n if (!isObject(block.props) || !isJson(block.props)) issue(`${path}.props`, \"Must be a JSON object.\");\n else if (block.props.options !== undefined) {\n const options = block.props.options;\n if (!Array.isArray(options)) issue(`${path}.props.options`, \"Must be an array.\");\n else {\n options.forEach((o, j) => {\n const at = `${path}.props.options[${j}]`;\n if (!isObject(o) || typeof o.value !== \"string\") issue(at, \"Each option needs a string value.\");\n else optionalText(o.label, `${at}.label`);\n });\n choices.set(\n block.id,\n new Set(options.flatMap((o) => (isObject(o) && typeof o.value === \"string\" ? [o.value] : []))),\n );\n }\n }\n // Renderers draw one button per point, so the scale is bounded.\n const { max, maxLength } = isObject(block.props) ? block.props : {};\n if (block.type === \"rating\" && max !== undefined && !(isInt(max) && max >= 2 && max <= 10)) {\n issue(`${path}.props.max`, \"Must be a whole number from 2 to 10.\");\n }\n if (maxLength !== undefined && !(isInt(maxLength) && maxLength > 0)) {\n issue(`${path}.props.maxLength`, \"Must be a whole number above 0.\");\n }\n }\n // Checked with or without props: a table with no columns would block every submission.\n if (typeof block.type === \"string\" && (block.props === undefined || isObject(block.props))) {\n structuredProps(block.type, block.props ?? {}, `${path}.props`);\n fieldProps(block.type, block.props ?? {}, `${path}.props`);\n }\n if (validKey) {\n if (keys.has(block.key as string)) issue(`${path}.key`, `Duplicate key \"${String(block.key)}\".`);\n keys.set(block.key as string, block.id);\n }\n fieldTypes.set(block.id, typeof block.type === \"string\" ? block.type : \"\");\n if (block.type === CALCULATED_TYPE) {\n const format = isObject(block.props) ? block.props.format : undefined;\n if (format === \"text\") calculatedLiteral.set(block.id, \"string\");\n else if (format !== \"number\" && format !== \"percent\") calculatedLiteral.set(block.id, undefined);\n }\n if (block.type === \"table\" && isObject(block.props) && Array.isArray(block.props.columns)) {\n tableColumnKeys.set(\n block.id,\n new Set(block.props.columns.flatMap((c) => (isObject(c) && typeof c.key === \"string\" ? [c.key] : []))),\n );\n }\n } else if (block.kind === \"content\") {\n if (block.type !== \"heading\" && block.type !== \"text\") issue(`${path}.type`, \"Must be heading or text.\");\n text(block.text, `${path}.text`);\n } else if (block.kind === \"page-break\") {\n optionalText(block.title, `${path}.title`);\n } else {\n issue(`${path}.kind`, \"Unknown block kind.\");\n }\n });\n\n // Calculated fields: the formula parses, and every answer it names is a\n // question of this form (a table by one of its columns), and a calculated\n // one only when it comes earlier, so values never go round in a circle.\n // The formulas are worked out again on each step that changes an answer\n // they read, so all of them together are capped too.\n let formulaChars = 0;\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block) || block.kind !== \"field\" || block.type !== CALCULATED_TYPE) return;\n const path = `blocks[${i}].props.formula`;\n const source = isObject(block.props) && typeof block.props.formula === \"string\" ? block.props.formula : \"\";\n formulaChars += source.length;\n if (formulaChars > MAX_FORM_FORMULA_LENGTH && formulaChars - source.length <= MAX_FORM_FORMULA_LENGTH) {\n issue(path, `The form's formulas together are over ${MAX_FORM_FORMULA_LENGTH} characters; shorten some, or work part out once in an earlier calculated field.`);\n }\n if (block.required === true) {\n warnings.push({ path: `blocks[${i}].required`, message: \"A calculated field is worked out, not answered, so it is never required.\" });\n }\n const formula = isObject(block.props) ? block.props.formula : undefined;\n if (typeof formula !== \"string\" || !formula.trim()) return issue(path, \"A calculated field needs a formula.\");\n const parsed = parseFormula(formula);\n if (!parsed.ok) return issue(path, `${parsed.message} (at character ${parsed.at + 1})`);\n const reported = new Set<string>();\n for (const ref of parsed.refs) {\n const name = ref.column === undefined ? ref.key : `${ref.key}.${ref.column}`;\n if (reported.has(name)) continue;\n reported.add(name);\n const target = keys.get(ref.key);\n const targetType = target === undefined ? undefined : fieldTypes.get(target);\n const at = target === undefined ? undefined : order.get(target);\n if (target === undefined || targetType === undefined) issue(path, `The formula uses \"${ref.key}\", which is not the answer name of a question in this form.`);\n else if (target === block.id) issue(path, \"The formula uses this field's own value.\");\n else if (targetType === CALCULATED_TYPE && (at ?? 0) > i) {\n issue(path, `The formula uses \"${ref.key}\", a calculated field that comes after this one; move it earlier.`);\n } else if (targetType === \"table\") {\n const columns = tableColumnKeys.get(target);\n if (ref.column === undefined) issue(path, `\"${ref.key}\" is a table: name one of its columns, like ${ref.key}.${[...(columns ?? [])][0] ?? \"column\"}.`);\n else if (columns && !columns.has(ref.column)) issue(path, `The table \"${ref.key}\" has no column \"${ref.column}\".`);\n } else if (ref.column !== undefined) issue(path, `\"${ref.key}\" is not a table, so it has no column \"${ref.column}\".`);\n else if (targetType === \"media-notes\" || targetType === \"text-highlights\") {\n warnings.push({ path, message: `\"${ref.key}\" holds notes, not numbers; the formula reads it as blank.` });\n }\n }\n });\n\n const hiddenNames = new Set<string>();\n const hiddenTypes = new Map<string, string>();\n if (input.hidden !== undefined && !Array.isArray(input.hidden)) issue(\"hidden\", \"Must be an array.\");\n (Array.isArray(input.hidden) ? input.hidden : []).forEach((h: unknown, i) => {\n if (!isObject(h) || typeof h.name !== \"string\" || !h.name) {\n issue(`hidden[${i}]`, \"Each hidden input needs a name.\");\n return;\n }\n if (!name(h.name, `hidden[${i}].name`, \"A hidden input name\")) return;\n if (hiddenNames.has(h.name)) issue(`hidden[${i}].name`, `Duplicate hidden input \"${h.name}\".`);\n if (typeof h.source !== \"string\" || ![\"url\", \"host\", \"server\"].includes(h.source)) {\n issue(`hidden[${i}].source`, \"Must be url, host or server.\");\n }\n if (typeof h.type !== \"string\" || ![\"string\", \"number\", \"boolean\"].includes(h.type)) {\n issue(`hidden[${i}].type`, \"Must be string, number or boolean.\");\n }\n optionalBoolean(h.sensitive, `hidden[${i}].sensitive`);\n optionalBoolean(h.identifying, `hidden[${i}].identifying`);\n hiddenNames.add(h.name);\n if (typeof h.type === \"string\") hiddenTypes.set(h.name, h.type);\n });\n\n const endingIds = new Set<string>();\n if (input.endings !== undefined && !Array.isArray(input.endings)) issue(\"endings\", \"Must be an array.\");\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n const path = `endings[${i}]`;\n if (!isObject(e)) {\n issue(path, \"Each ending must be an object with an id and a title.\");\n return;\n }\n text(e.title, `${path}.title`);\n optionalText(e.description, `${path}.description`);\n if (!name(e.id, `${path}.id`, \"An ending id\")) return;\n if (endingIds.has(e.id)) issue(`${path}.id`, `Duplicate ending id \"${e.id}\".`);\n endingIds.add(e.id);\n });\n\n /** Field ids a condition reads, for the order check. */\n const checkOperand = (o: unknown, path: string, reads: string[]) => {\n if (o === undefined) return;\n if (!isObject(o)) return issue(path, \"An operand must be an object.\");\n if (\"field\" in o) {\n if (typeof o.field !== \"string\" || !fieldTypes.has(o.field)) return issue(path, `No field \"${String(o.field)}\".`);\n reads.push(o.field);\n } else if (\"hidden\" in o) {\n if (typeof o.hidden !== \"string\" || !hiddenNames.has(o.hidden)) {\n issue(path, `No hidden input \"${String(o.hidden)}\".`);\n }\n } else if (!(\"value\" in o) || !isJson(o.value)) {\n issue(path, \"An operand needs a `field`, a `hidden` input or a JSON `value`.\");\n }\n };\n const checkCondition = (c: unknown, path: string, reads: string[], depth = 0): void => {\n if (!isObject(c)) return issue(path, \"A condition must be an object.\");\n if (depth > MAX_CONDITION_DEPTH) return issue(path, \"The condition is nested too deeply.\");\n if (\"all\" in c || \"any\" in c) {\n const group = \"all\" in c ? \"all\" : \"any\";\n const list = c[group];\n if (!Array.isArray(list)) return issue(path, `\\`${group}\\` must be an array.`);\n return list.forEach((x, i) => checkCondition(x, `${path}.${group}[${i}]`, reads, depth + 1));\n }\n if (\"not\" in c) return checkCondition(c.not, `${path}.not`, reads, depth + 1);\n if (typeof c.op !== \"string\" || !isObject(c.left)) {\n return issue(path, \"A comparison needs an `op` and a `left` operand.\");\n }\n if (!OPERATORS.has(c.op)) issue(`${path}.op`, `Unknown operator \"${c.op}\".`);\n checkOperand(c.left, `${path}.left`, reads);\n checkOperand(c.right, `${path}.right`, reads);\n if (typeof c.left.field === \"string\") {\n const manifest = getFieldType(fieldTypes.get(c.left.field) ?? \"\");\n if (manifest && OPERATORS.has(c.op) && !manifest.operators.includes(c.op as Operator)) {\n // Already wrong; a literal warning on top would only repeat it.\n return issue(`${path}.op`, `\"${c.op}\" does not apply to a ${manifest.type} field.`);\n }\n }\n checkLiterals(c.op, c.left, c.right, path);\n };\n /** Warn when a literal `value` can never match what the left side holds: wrong type, or not an option. */\n const checkLiterals = (op: string, left: Record<string, unknown>, right: unknown, path: string) => {\n if (op === \"answered\" || op === \"empty\" || !OPERATORS.has(op)) return;\n const literal = isObject(right) && \"value\" in right;\n // A `field` or `hidden` operand on the right is only known when the form runs.\n if (right !== undefined && !literal) return;\n let what = \"the left side\";\n let type: string | undefined;\n let options: Set<string> | undefined;\n if (typeof left.field === \"string\" && fieldTypes.has(left.field)) {\n const fieldType = fieldTypes.get(left.field)!;\n what = `\"${keyOf(left.field)}\"`;\n type = calculatedLiteral.has(left.field) ? calculatedLiteral.get(left.field) : LITERAL_TYPE[fieldType];\n if (CHOICE_TYPES.has(fieldType)) options = choices.get(left.field);\n } else if (typeof left.hidden === \"string\" && hiddenTypes.has(left.hidden)) {\n what = `hidden input \"${left.hidden}\"`;\n type = hiddenTypes.get(left.hidden);\n }\n const outcome = op === \"neq\" ? \"always true\" : \"never true\";\n let values: unknown[];\n if (op === \"in\") {\n if (!literal || !Array.isArray(right.value)) {\n return void warnings.push({ path: `${path}.right`, message: \"`in` needs a list of values; it never matches.\" });\n }\n values = right.value;\n } else if (!literal) return;\n else values = [right.value];\n if (ORDERING.has(op)) {\n if (type !== undefined && type !== \"number\") {\n return void warnings.push({ path: `${path}.op`, message: `\"${op}\" compares numbers, but ${what} holds a ${type}; it is never true.` });\n }\n type = \"number\";\n }\n for (const v of values) {\n const message =\n type !== undefined && typeof v !== type\n ? `${what} holds a ${type}, but ${shown(v)} is not one; this comparison is ${outcome}.`\n : options && typeof v === \"string\" && !options.has(v)\n ? `${shown(v)} is not an option of ${what}; this comparison is ${outcome}.`\n : null;\n if (message) warnings.push({ path: `${path}.right`, message });\n }\n };\n const keyOf = (id: string) => [...keys].find(([, v]) => v === id)?.[0] ?? id;\n\n const ruleIds = new Set<string>();\n if (input.logic !== undefined && !Array.isArray(input.logic)) issue(\"logic\", \"Must be an array.\");\n (Array.isArray(input.logic) ? input.logic : []).forEach((rule: unknown, i) => {\n const path = `logic[${i}]`;\n if (!isObject(rule) || typeof rule.id !== \"string\" || !isObject(rule.when)) {\n issue(path, \"Each rule needs an id and a `when` condition.\");\n return;\n }\n if (ruleIds.has(rule.id)) issue(`${path}.id`, `Duplicate rule id \"${rule.id}\".`);\n ruleIds.add(rule.id);\n const reads: string[] = [];\n checkCondition(rule.when, `${path}.when`, reads);\n\n // The block whose position the condition is read at, for the order check.\n let at: string | undefined;\n let inclusive = false;\n if (rule.effect === \"jump\") {\n if (typeof rule.from !== \"string\" || !ids.has(rule.from)) {\n issue(`${path}.from`, `No block \"${String(rule.from)}\".`);\n } else if (pageBreaks.has(rule.from)) {\n issue(`${path}.from`, \"A jump can't start at a page break; use the block before it.\");\n } else {\n at = rule.from;\n inclusive = true;\n }\n if (isObject(rule.to)) {\n if (typeof rule.to.ending !== \"string\" || !endingIds.has(rule.to.ending)) {\n issue(`${path}.to`, `No ending \"${String(rule.to.ending)}\".`);\n }\n } else if (typeof rule.to !== \"string\" || !ids.has(rule.to)) {\n issue(`${path}.to`, `No block \"${String(rule.to)}\".`);\n } else if (pageBreaks.has(rule.to)) {\n issue(`${path}.to`, \"A jump can't land on a page break; jump to the first block after it.\");\n } else if (at !== undefined && (order.get(rule.to) ?? 0) <= (order.get(at) ?? 0)) {\n warnings.push({ path: `${path}.to`, message: \"Jumps only go forward; this one is ignored.\" });\n }\n } else if (rule.effect === \"show\" || rule.effect === \"hide\") {\n if (typeof rule.target !== \"string\" || !ids.has(rule.target)) {\n issue(`${path}.target`, `No block \"${String(rule.target)}\".`);\n } else at = rule.target;\n } else {\n issue(`${path}.effect`, \"Must be show, hide or jump.\");\n }\n\n // Logic reads only the answers on the path before the block it applies to.\n if (at !== undefined) {\n const limit = order.get(at) ?? 0;\n for (const field of new Set(reads)) {\n const p = order.get(field) ?? 0;\n if (p > limit || (p === limit && !inclusive)) {\n warnings.push({\n path: `${path}.when`,\n message: `Reads \"${keyOf(field)}\", which does not come before \"${keyOf(at)}\"; it always reads as unanswered.`,\n });\n }\n }\n }\n });\n\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block)) return;\n const raw =\n block.kind === \"field\" ? [block.label, block.description] : block.kind === \"content\" ? [block.text] : [];\n const texts = raw.filter((t): t is string => typeof t === \"string\");\n for (const t of texts) {\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" && !hiddenNames.has(ref.name)) {\n issue(`blocks[${i}]`, `Recalls unknown hidden input \"${ref.name}\".`);\n }\n if (ref.kind === \"field\") {\n const target = keys.get(ref.name);\n if (!target) issue(`blocks[${i}]`, `Recalls unknown field \"${ref.name}\".`);\n else if ((order.get(target) ?? 0) >= i) {\n warnings.push({ path: `blocks[${i}]`, message: `Recalls \"${ref.name}\", which comes later.` });\n }\n }\n }\n }\n });\n\n // Endings and the introduction recall too. Only warnings: a stale token here shows as\n // its fallback text, and earlier releases accepted these definitions.\n const extra: [string, unknown][] = [[\"description\", input.description]];\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n if (isObject(e)) extra.push([`endings[${i}]`, e.title], [`endings[${i}]`, e.description]);\n });\n for (const [path, t] of extra) {\n if (typeof t !== \"string\") continue;\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" ? !hiddenNames.has(ref.name) : !keys.has(ref.name)) {\n warnings.push({ path, message: `Recalls unknown ${ref.kind === \"hidden\" ? \"hidden input\" : \"field\"} \"${ref.name}\"; it shows its fallback text.` });\n }\n }\n }\n\n return issues.length ? fail() : { ok: true, form: input as unknown as FormDefinition, warnings };\n}\n","/**\n * Server-side checking. No IO: the app loads the published definition,\n * resolves its server inputs, calls `validateSubmission`, and stores what\n * comes back.\n */\nimport { isCalculated, ReplayWorkExceeded } from \"./calculated\";\nimport { createForm, replayWithin, type FormEngine } from \"./engine\";\nimport { compactEvents, isFormEvent, isJson, isPlainObject, isUnknownEvent } from \"./events\";\nimport { isEmptyValue, normalizeValue } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { fieldMap, own, withheld } from \"./logic\";\nimport { parseForm } from \"./parse\";\nimport type { FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface SubmissionInput {\n /** Answers keyed by field id. Ignored when `events` is given. */\n answers?: Record<string, Json> | undefined;\n /** The respondent's event log. Replayed instead of trusting `answers`. */\n events?: FormEvent[] | undefined;\n /** URL and host inputs sent by the client. Server inputs here are ignored. */\n hidden?: Record<string, Json> | undefined;\n}\n\nexport interface SubmissionOptions {\n /** Values for `source: \"server\"` inputs, resolved by the server (account id, location, user id…). */\n context?: Record<string, Json> | undefined;\n /** `false` checks a draft: formats only, nothing required. Default true. */\n complete?: boolean | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /**\n * Most events accepted, counted after `compactEvents`. Default `MAX_EVENTS`\n * (10,000). At most `RAW_EVENTS_PER_EVENT` (10) times as many may be sent.\n */\n maxEvents?: number | undefined;\n /**\n * Most JSON values in the answers, answer events and hidden inputs\n * together (each number, text, true / false, list item, row and cell\n * counts one; a run of answers to one field, as typing in a table sends,\n * counts its last only). Default `MAX_SUBMISSION_VALUES` (200,000).\n */\n maxValues?: number | undefined;\n /**\n * Most work replaying the events may take: one unit per block each time\n * the path is walked, one per calculated field each time the answers\n * settle, and a formula's size (its numbers, answers and operators) each\n * time it is worked out. Default `MAX_REPLAY_WORK` (1,000,000). Only the\n * replay counts: the submit that follows it does not.\n */\n maxReplayWork?: number | undefined;\n}\n\nexport interface CheckedSubmission {\n status: \"draft\" | \"completed\";\n /**\n * Visible answers only, keyed by field id (kept hidden answers too, with\n * `clearHiddenValues: false`). Calculated fields hold the value worked out\n * here from these answers.\n */\n answers: Record<string, Json>;\n /** Untrusted URL and host inputs, coerced to their declared types. Identifying ones are left out on anonymous forms. */\n hidden: Record<string, Json>;\n /** Trusted server inputs. Identifying ones are left out on anonymous forms. */\n context: Record<string, Json>;\n ending: string | null;\n /** Client-sent keys that were dropped, each once: unknown fields, server inputs, undeclared or withheld hidden names. */\n ignored: string[];\n}\n\nexport type SubmissionResult =\n | { ok: true; submission: CheckedSubmission }\n | { ok: false; errors: Record<string, string> };\n\n/** Default for `SubmissionOptions.maxEvents`. */\nexport const MAX_EVENTS = 10_000;\n/** Default for `SubmissionOptions.maxValues`. */\nexport const MAX_SUBMISSION_VALUES = 200_000;\n/** Default for `SubmissionOptions.maxReplayWork`. */\nexport const MAX_REPLAY_WORK = 1_000_000;\n/**\n * Most events sent, before compaction, as a multiple of `maxEvents`: a\n * keystroke log compacts to far fewer, but every event sent is looked at.\n */\nexport const RAW_EVENTS_PER_EVENT = 10;\n\n/** How many JSON values `value` holds (itself, and every item, row and cell inside), counting no further than `limit + 1`. */\nfunction countValues(value: unknown, limit: number): number {\n let count = 0;\n const stack: unknown[] = [value];\n while (stack.length && count <= limit) {\n const v = stack.pop();\n if (v === undefined) continue;\n count++;\n if (Array.isArray(v)) for (const item of v) stack.push(item);\n else if (v !== null && typeof v === \"object\") for (const k in v) stack.push((v as Record<string, unknown>)[k]);\n }\n return count;\n}\n\nconst answerTo = (e: unknown): string | undefined =>\n isPlainObject(e) && e.type === \"answer\" && typeof e.field === \"string\" ? e.field : undefined;\n\n/**\n * Events as `compactEvents` keeps them, before they are checked: of a run of\n * answers to one field (a table sends itself on every keystroke), only the\n * last. Looks only at each event's `type` and `field`, so it is cheap.\n */\nfunction leanEvents(events: unknown[]): unknown[] {\n const out: unknown[] = [];\n for (let i = 0; i < events.length; i++) {\n const field = answerTo(events[i]);\n if (field !== undefined && answerTo(events[i + 1]) === field) continue;\n out.push(events[i]);\n }\n return out;\n}\n\n/** The values a submission carries, as `countValues` counts them: its answers (each run of answers to a field once) and hidden inputs. */\nfunction submissionValues(input: Record<string, unknown>, limit: number): number {\n let count = countValues(input.hidden, limit);\n if (Array.isArray(input.events)) {\n for (const e of input.events) {\n if (count > limit) break;\n if (answerTo(e) !== undefined) count += countValues((e as Record<string, unknown>).value, limit - count);\n }\n } else count += countValues(input.answers, limit - count);\n return count;\n}\n\nconst MALFORMED: SubmissionResult = { ok: false, errors: { \"\": \"Malformed submission.\" } };\n\n// Definitions that parsed cleanly. Failures are not cached: registering a\n// missing field type later can fix them.\nconst parsedDefinitions = new WeakMap<object, true>();\n\nfunction checkDefinition(definition: FormDefinition): string | null {\n if (typeof definition === \"object\" && definition !== null && parsedDefinitions.has(definition)) return null;\n const parsed = parseForm(definition);\n if (!parsed.ok) {\n const list = parsed.issues.map((i) => (i.path ? `${i.path}: ${i.message}` : i.message)).join(\"; \");\n return `Invalid form definition: ${list}`;\n }\n parsedDefinitions.set(definition, true);\n return null;\n}\n\n/** The input as a well-formed submission, or null. Unknown event types are dropped. */\nfunction wellFormed(input: unknown): SubmissionInput | null {\n if (!isPlainObject(input)) return null;\n const { answers, events, hidden } = input;\n const record = (v: unknown) =>\n v === undefined ||\n (isPlainObject(v) && Object.keys(v).every((k) => v[k] === undefined || isJson(v[k])));\n if (!record(answers) || !record(hidden)) return null;\n if (events === undefined) return { answers: answers as SubmissionInput[\"answers\"], hidden: hidden as SubmissionInput[\"hidden\"] };\n if (!Array.isArray(events)) return null;\n const known: FormEvent[] = [];\n for (const e of events as unknown[]) {\n if (isFormEvent(e)) known.push(e);\n else if (!isUnknownEvent(e)) return null;\n }\n return { answers: answers as SubmissionInput[\"answers\"], events: known, hidden: hidden as SubmissionInput[\"hidden\"] };\n}\n\n/**\n * Check a submission against the published definition. Never throws on a\n * malformed submission: it returns `{ ok: false, errors: { \"\": … } }`.\n */\nexport function validateSubmission(\n definition: FormDefinition,\n submission: SubmissionInput,\n options: SubmissionOptions = {},\n): SubmissionResult {\n const invalid = checkDefinition(definition);\n if (invalid) return { ok: false, errors: { \"\": invalid } };\n if (!isPlainObject(submission)) return MALFORMED;\n const maxEvents = options.maxEvents ?? MAX_EVENTS;\n let sent: Record<string, unknown> = submission;\n if (Array.isArray(submission.events)) {\n // Bounded before anything walks the events or their values.\n const maxRaw = maxEvents * RAW_EVENTS_PER_EVENT;\n if (submission.events.length > maxRaw) {\n return { ok: false, errors: { \"\": `Too many events: ${submission.events.length} sent; the limit is ${maxRaw} before compaction.` } };\n }\n sent = { ...submission, events: leanEvents(submission.events) };\n }\n // Counted on what the replay keeps, so a table typed into is counted once,\n // and before the values are checked, so counting stops at the limit.\n const maxValues = options.maxValues ?? MAX_SUBMISSION_VALUES;\n if (submissionValues(sent, maxValues) > maxValues) {\n return {\n ok: false,\n errors: { \"\": `Too much data: the answers hold more than ${maxValues} values (items, rows and cells); the limit is ${maxValues}.` },\n };\n }\n const input = wellFormed(sent);\n if (!input) return MALFORMED;\n\n // A Set: a key sent many times (one answer event per keystroke) is reported once.\n const ignored = new Set<string>();\n const client = coerceHidden(definition, input.hidden, { sources: [\"url\", \"host\"] });\n for (const name of client.ignored) ignored.add(`hidden.${name}`);\n const hidden = client.values;\n const context = coerceHidden(definition, options.context, { sources: [\"server\"] }).values;\n\n const fields = fieldMap(definition);\n // Anonymous forms never store identifying fields: client values are dropped.\n /** `true`: store it; `false`: withheld; `undefined`: not a field. Both of the latter are reported in `ignored`. */\n const accept = (id: string): boolean | undefined => {\n if (!fields.has(id)) return void ignored.add(id);\n // Calculated values are worked out again here, never taken from the client\n // (whose `engine.answers()` holds them), so they are dropped without a report.\n if (isCalculated(fields.get(id))) return false;\n if (!withheld(definition, fields.get(id))) return true;\n ignored.add(id);\n return false;\n };\n const engineHidden = { ...hidden, ...context };\n let engine: FormEngine;\n if (input.events) {\n const events = compactEvents(input.events);\n if (events.length > maxEvents) {\n return { ok: false, errors: { \"\": `Too many events: ${events.length} after compaction; the limit is ${maxEvents}.` } };\n }\n // Unknown fields stay in the log (replay ignores them); withheld ones are removed.\n const kept = events.filter((e) => e.type !== \"answer\" || accept(e.field) !== false);\n const maxWork = options.maxReplayWork ?? MAX_REPLAY_WORK;\n try {\n engine = replayWithin(definition, kept, { hidden: engineHidden, validators: options.validators }, maxWork);\n } catch (e) {\n if (!(e instanceof ReplayWorkExceeded)) throw e;\n return {\n ok: false,\n errors: { \"\": `Too much work: replaying these events (the path and calculated fields) would take more than ${maxWork} steps; the limit is ${maxWork}.` },\n };\n }\n } else {\n const answers: Record<string, Json> = {};\n for (const id of Object.keys(input.answers ?? {})) {\n const value = own(input.answers!, id);\n if (accept(id) && value !== undefined) answers[id] = value;\n }\n engine = createForm(definition, {\n initialValues: answers,\n hidden: engineHidden,\n validators: options.validators,\n clock: () => undefined,\n });\n }\n\n const complete = options.complete !== false;\n if (complete) {\n // A replay only reaches \"completed\" through a submit that validated, and a\n // completed response is final: answers after the submit event are ignored.\n if (engine.getState().status !== \"completed\" && !engine.submit()) {\n return { ok: false, errors: engine.getState().errors };\n }\n } else {\n const errors: Record<string, string> = {};\n for (const [id, value] of Object.entries(engine.answers())) {\n const message = validateField(fields.get(id)!, value, {\n requireAnswers: false,\n custom: options.validators?.[id],\n });\n if (message) errors[id] = message;\n }\n if (Object.keys(errors).length) return { ok: false, errors };\n }\n\n const state = engine.getState();\n const answers = engine.answers();\n if (definition.settings?.clearHiddenValues === false) {\n // Values of fields off the path were never validated. Keep one only if\n // its format is valid; drop the rest, so nothing stored is unchecked.\n for (const [id, field] of fields) {\n if (withheld(definition, field)) continue;\n const value = own(state.values, id);\n if (own(answers, id) !== undefined || value === undefined || isEmptyValue(value, field)) continue;\n const message = validateField(field, value, { requireAnswers: false, custom: options.validators?.[id] });\n if (message === null) answers[id] = normalizeValue(value, field);\n }\n }\n\n // Anonymous forms never store identifying hidden inputs either. Logic above\n // still read them, so the path matches the client's.\n const store = (values: Record<string, Json>, report: boolean) => {\n if (definition.settings?.anonymous !== true) return values;\n const identifying = new Set((definition.hidden ?? []).filter((h) => h.identifying === true).map((h) => h.name));\n const kept: Record<string, Json> = {};\n for (const [name, value] of Object.entries(values)) {\n if (!identifying.has(name)) kept[name] = value;\n else if (report) ignored.add(`hidden.${name}`);\n }\n return kept;\n };\n\n return {\n ok: true,\n submission: {\n status: complete ? \"completed\" : \"draft\",\n answers,\n hidden: store(hidden, true),\n context: store(context, false),\n ending: complete ? state.ending : null,\n ignored: [...ignored],\n },\n };\n}\n\n/**\n * The definition as respondents may see it. R1 forms hold nothing secret;\n * assessment answer keys (R4) will be stripped here.\n */\nexport function publicDefinition(definition: FormDefinition): FormDefinition {\n return JSON.parse(JSON.stringify(definition)) as FormDefinition;\n}\n","/**\n * Scenarios: a definition, an event log and the expected outcome, as one JSON\n * file. The same file runs in this package's tests, in an app's CI and in the\n * playground, so every runtime is held to the same behaviour.\n */\nimport { replay, type FormEngine, type FormState } from \"./engine\";\nimport { compactEvents } from \"./events\";\nimport { canonicalJson } from \"./hash\";\nimport { fieldMap } from \"./logic\";\nimport { validateSubmission } from \"./server\";\nimport type { FormDefinition, FormEvent, Json } from \"./types\";\n\nexport { compactEvents };\n\nexport interface ScenarioExpectation {\n /** Keys (block ids for content) on the respondent's path. */\n path?: string[];\n /** Keys of the visible fields, in path order. */\n visible?: string[];\n /** Key of the block in focus (focus layout). */\n current?: string | null;\n status?: \"in_progress\" | \"completed\";\n ending?: string | null;\n /** `engine.answers()`, by key. */\n answers?: Record<string, Json>;\n /** Keys of the fields with an error on the client after the last event. */\n errors?: string[];\n /** What `validateSubmission(definition, { events, hidden }, { context })` returns. */\n server?: {\n ok: boolean;\n /** Stored answers, by key. */\n answers?: Record<string, Json>;\n context?: Record<string, Json>;\n /** Keys of the fields the server rejected. */\n errors?: string[];\n /** `submission.ignored`: dropped field ids and `hidden.<name>` entries. */\n ignored?: string[];\n /** Check as a completed response. Default: whether the replay completed. */\n complete?: boolean;\n };\n}\n\nexport interface Scenario {\n /** Version of the scenario format. */\n scenarioVersion: 1;\n name: string;\n description?: string;\n tags?: string[];\n definition: FormDefinition;\n /** URL and host inputs, as the client sends them. */\n hidden?: Record<string, Json>;\n /** Server inputs, resolved by the server (and given to the client when the form loads). */\n context?: Record<string, Json>;\n /** The respondent's event log. Answer events name fields by id. */\n events: FormEvent[];\n expect: ScenarioExpectation;\n}\n\nexport interface ScenarioResult {\n pass: boolean;\n failures: string[];\n state: FormState;\n}\n\nfunction keyed(def: FormDefinition) {\n const fields = fieldMap(def);\n const keyOf = (id: string) => fields.get(id)?.key ?? id;\n const byKey = (record: Record<string, Json>) =>\n Object.fromEntries(Object.entries(record).map(([id, v]) => [keyOf(id), v]));\n return { fields, keyOf, byKey };\n}\n\nfunction snapshot(engine: FormEngine) {\n const { keyOf, byKey } = keyed(engine.definition);\n const state = engine.getState();\n return {\n path: state.path.map(keyOf),\n visible: state.path.filter((id) => engine.field(id) && engine.isVisible(id)).map(keyOf),\n current: state.current === null ? null : keyOf(state.current),\n status: state.status,\n ending: state.ending,\n answers: byKey(engine.answers()),\n errors: Object.keys(state.errors).map(keyOf),\n };\n}\n\nconst same = (a: unknown, b: unknown) => canonicalJson(a) === canonicalJson(b);\nconst sorted = (xs: string[]) => [...xs].sort();\n\n/** Replay a scenario's events (no clock) and compare against its expectations. */\nexport function runScenario(scenario: Scenario): ScenarioResult {\n const failures: string[] = [];\n if (scenario.scenarioVersion !== 1) {\n failures.push(`scenarioVersion ${String(scenario.scenarioVersion)} is not supported (expected 1).`);\n }\n const { definition, expect } = scenario;\n const engine = replay(definition, scenario.events, {\n hidden: { ...(scenario.hidden ?? {}), ...(scenario.context ?? {}) },\n });\n const actual = snapshot(engine);\n const check = (label: string, expected: unknown, got: unknown) => {\n if (expected !== undefined && !same(expected, got)) {\n failures.push(`${label}: expected ${canonicalJson(expected)}, got ${canonicalJson(got)}`);\n }\n };\n check(\"path\", expect.path, actual.path);\n check(\"visible\", expect.visible, actual.visible);\n check(\"current\", expect.current, actual.current);\n check(\"status\", expect.status, actual.status);\n check(\"ending\", expect.ending, actual.ending);\n check(\"answers\", expect.answers, actual.answers);\n if (expect.errors) check(\"errors\", sorted(expect.errors), sorted(actual.errors));\n\n if (expect.server) {\n const { keyOf, byKey } = keyed(definition);\n const complete = expect.server.complete ?? actual.status === \"completed\";\n const result = validateSubmission(\n definition,\n { events: scenario.events, hidden: scenario.hidden },\n { context: scenario.context, complete },\n );\n check(\"server.ok\", expect.server.ok, result.ok);\n if (result.ok) {\n check(\"server.answers\", expect.server.answers, byKey(result.submission.answers));\n check(\"server.context\", expect.server.context, result.submission.context);\n if (expect.server.ignored) {\n check(\"server.ignored\", sorted(expect.server.ignored), sorted(result.submission.ignored));\n } } else if (expect.server.errors) {\n check(\"server.errors\", sorted(expect.server.errors), sorted(Object.keys(result.errors).map(keyOf)));\n }\n }\n return { pass: failures.length === 0, failures, state: engine.getState() };\n}\n\nexport interface RecordScenarioOptions {\n description?: string;\n tags?: string[];\n /** URL and host inputs. Default: the engine's non-server hidden values. */\n hidden?: Record<string, Json>;\n /** Server inputs. Default: the engine's values for `source: \"server\"` inputs. */\n context?: Record<string, Json>;\n /** Record the server's verdict too. Default true. */\n server?: boolean;\n /** Merge keystroke-level answer events with `compactEvents`. Default true. */\n compact?: boolean;\n}\n\n/** Freeze a live engine as a scenario, with expectations filled from its current state. */\nexport function recordScenario(engine: FormEngine, name: string, opts: RecordScenarioOptions = {}): Scenario {\n const definition = JSON.parse(JSON.stringify(engine.definition)) as FormDefinition;\n const state = engine.getState();\n const sources = new Map((definition.hidden ?? []).map((h) => [h.name, h.source]));\n const split = (server: boolean) =>\n Object.fromEntries(\n Object.entries(state.hidden).filter(\n (e): e is [string, Json] => e[1] !== undefined && (sources.get(e[0]) === \"server\") === server,\n ),\n );\n const hidden = opts.hidden ?? split(false);\n const context = opts.context ?? split(true);\n\n const raw = opts.compact === false ? state.events : compactEvents(state.events);\n // No timestamps: scenarios replay with the clock off and must diff cleanly.\n const events = raw.map(({ at: _at, ...e }) => JSON.parse(JSON.stringify(e)) as FormEvent);\n\n const actual = snapshot(engine);\n const scenario: Scenario = {\n scenarioVersion: 1,\n name,\n ...(opts.description ? { description: opts.description } : {}),\n ...(opts.tags ? { tags: opts.tags } : {}),\n definition,\n ...(Object.keys(hidden).length ? { hidden } : {}),\n ...(Object.keys(context).length ? { context } : {}),\n events,\n expect: {\n path: actual.path,\n visible: actual.visible,\n current: actual.current,\n status: actual.status,\n ending: actual.ending,\n answers: actual.answers,\n ...(actual.errors.length ? { errors: actual.errors } : {}),\n },\n };\n\n if (opts.server !== false) {\n const { keyOf, byKey } = keyed(definition);\n const result = validateSubmission(\n definition,\n { events, hidden },\n { context, complete: actual.status === \"completed\" },\n );\n scenario.expect.server = result.ok\n ? {\n ok: true,\n answers: byKey(result.submission.answers),\n context: result.submission.context,\n ...(result.submission.ignored.length ? { ignored: result.submission.ignored } : {}),\n }\n : { ok: false, errors: Object.keys(result.errors).map(keyOf) };\n }\n return scenario;\n}\n","/** Walk a form the way a respondent would, by field key. */\nimport { createForm, type CreateFormOptions, type FormEngine } from \"./engine\";\nimport type { FormDefinition, Json } from \"./types\";\n\nexport { coverage, type CoverageOptions, type CoverageReport, type EndingCoverage } from \"./coverage\";\nexport {\n compactEvents,\n recordScenario,\n runScenario,\n type RecordScenarioOptions,\n type Scenario,\n type ScenarioExpectation,\n type ScenarioResult,\n} from \"./scenario\";\n\nexport interface Simulation {\n engine: FormEngine;\n /** Answer by key: `answer({ overall: 2 })`. */\n answer(values: Record<string, Json | undefined>): Simulation;\n /** Keys of the fields currently visible, in path order. */\n visibleKeys(): string[];\n /** Keys on the respondent's path, fields and content. */\n pathKeys(): string[];\n /** Submit; returns the ending reached, or throws with the errors by key. */\n submit(): string | null;\n}\n\nexport function simulate(\n form: FormDefinition | { definition: FormDefinition },\n options: CreateFormOptions = {},\n): Simulation {\n const definition = \"definition\" in form ? form.definition : form;\n const engine = createForm(definition, { clock: () => undefined, ...options });\n const keyOf = (id: string) => engine.field(id)?.key ?? id;\n\n const sim: Simulation = {\n engine,\n answer(values) {\n for (const [key, value] of Object.entries(values)) engine.setValue(engine.idOf(key), value);\n return sim;\n },\n visibleKeys: () =>\n engine\n .getState()\n .path.filter((id) => engine.field(id) && engine.isVisible(id))\n .map(keyOf),\n pathKeys: () => engine.getState().path.map(keyOf),\n submit() {\n if (!engine.submit()) {\n const errors = Object.fromEntries(Object.entries(engine.getState().errors).map(([id, m]) => [keyOf(id), m]));\n throw new Error(`Form has errors: ${JSON.stringify(errors)}`);\n }\n return engine.getState().ending;\n },\n };\n return sim;\n}\n"]}
1
+ {"version":3,"sources":["../src/formula.ts","../src/calculated.ts","../src/structured.ts","../src/photo.ts","../src/fields.ts","../src/events.ts","../src/hidden.ts","../src/logic.ts","../src/options.ts","../src/recall.ts","../src/validate.ts","../src/engine.ts","../src/hash.ts","../src/coverage.ts","../src/parse.ts","../src/server.ts","../src/scenario.ts","../src/testing.ts"],"names":["own","blank","same","plural","numberOps","finite","i","shown","out","round","isObject","name","maxLength","answers"],"mappings":"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","file":"testing.cjs","sourcesContent":["/**\n * A small, safe formula language for `calculated` fields. It is parsed and\n * evaluated here, never with `eval` or `Function`, and it can only read the\n * answers it names.\n *\n * - Numbers: `12`, `0.5`. Text: `\"High\"` or `'High'`.\n * - Answers by key: `hours`, and one column of a table: `plan.cost`.\n * - Arithmetic: `+ - * /` (also `− × ÷`), unary minus, parentheses.\n * - Comparisons: `== != < <= > >=` (also `= ≠ ≤ ≥`), giving true or false.\n * - A choice: `cond ? a : b`.\n * - `sum(...)`, `avg(...)`, `min(...)`, `max(...)` over numbers, lists and\n * table columns. Blanks and text that is not a number are skipped.\n *\n * An unanswered question reads as blank: arithmetic with a blank is blank\n * (so a total stays empty until its answers are in), and so is dividing by\n * zero. Text that holds a number (\"12\") counts as that number; yes / no\n * counts as 1 / 0.\n */\nimport type { Json } from \"./types\";\n\nexport type FormulaValue = number | string | boolean | null | FormulaValue[];\n\n/** An answer a formula reads: `key`, or `key.column` for one column of a table. */\nexport interface FormulaRef {\n key: string;\n column?: string;\n}\n\ntype BinaryOp = \"+\" | \"-\" | \"*\" | \"/\" | \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\";\n\nexport const FORMULA_FUNCTIONS = [\"sum\", \"avg\", \"min\", \"max\"] as const;\nexport type FormulaFunction = (typeof FORMULA_FUNCTIONS)[number];\n\nexport type FormulaNode =\n | { kind: \"number\"; value: number }\n | { kind: \"text\"; value: string }\n | { kind: \"ref\"; key: string; column?: string; at: number }\n | { kind: \"unary\"; op: \"-\"; arg: FormulaNode }\n | { kind: \"binary\"; op: BinaryOp; left: FormulaNode; right: FormulaNode }\n | { kind: \"if\"; test: FormulaNode; then: FormulaNode; else: FormulaNode }\n | { kind: \"call\"; fn: FormulaFunction; args: FormulaNode[] };\n\nexport type FormulaParseResult =\n | { ok: true; ast: FormulaNode; refs: FormulaRef[] }\n | { ok: false; message: string; /** Character offset of the problem. */ at: number };\n\n/** Longest formula accepted. */\nexport const MAX_FORMULA_LENGTH = 2000;\n/** Deepest nesting of parentheses, function calls, signs and `? :`, each counting one level. */\nconst MAX_DEPTH = 64;\n\ntype Token =\n | { t: \"num\"; v: number; at: number }\n | { t: \"str\"; v: string; at: number }\n | { t: \"id\"; v: string; at: number }\n | { t: \"op\"; v: string; at: number }\n | { t: \"end\"; at: number };\n\nconst OP_ALIASES: Record<string, string> = { \"−\": \"-\", \"×\": \"*\", \"÷\": \"/\", \"≠\": \"!=\", \"≤\": \"<=\", \"≥\": \">=\", \"=\": \"==\" };\nconst TWO_CHAR = new Set([\"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR = new Set([\"+\", \"-\", \"*\", \"/\", \"<\", \">\", \"(\", \")\", \"?\", \":\", \",\", \".\", \"=\", \"−\", \"×\", \"÷\", \"≠\", \"≤\", \"≥\"]);\nconst COMPARISONS = new Set([\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\"]);\n\nclass FormulaError extends Error {\n constructor(\n message: string,\n readonly at: number,\n ) {\n super(message);\n }\n}\n\nconst isIdStart = (c: string) => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\nconst isIdPart = (c: string) => isIdStart(c) || (c >= \"0\" && c <= \"9\");\nconst isDigit = (c: string) => c >= \"0\" && c <= \"9\";\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < source.length) {\n const c = source[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n i++;\n continue;\n }\n const at = i;\n if (isDigit(c) || (c === \".\" && isDigit(source[i + 1] ?? \"\"))) {\n while (isDigit(source[i] ?? \"\")) i++;\n if (source[i] === \".\" && isDigit(source[i + 1] ?? \"\")) {\n i++;\n while (isDigit(source[i] ?? \"\")) i++;\n }\n // `1e6` and `2x` are not numbers here: say so rather than \"expected an operator\".\n if (isIdStart(source[i] ?? \"\")) throw new FormulaError(\"Write a number in digits only, like 1000000.\", at);\n const v = Number(source.slice(at, i));\n if (!Number.isFinite(v)) throw new FormulaError(\"This number is too large.\", at);\n tokens.push({ t: \"num\", v, at });\n continue;\n }\n if (isIdStart(c)) {\n while (isIdPart(source[i] ?? \"\")) i++;\n tokens.push({ t: \"id\", v: source.slice(at, i), at });\n continue;\n }\n if (c === '\"' || c === \"'\" || c === \"“\") {\n const close = c === \"“\" ? \"”\" : c;\n const end = source.indexOf(close, i + 1);\n if (end === -1) throw new FormulaError(\"This text has no closing quote.\", at);\n tokens.push({ t: \"str\", v: source.slice(i + 1, end), at });\n i = end + 1;\n continue;\n }\n const two = source.slice(i, i + 2);\n if (TWO_CHAR.has(two)) {\n tokens.push({ t: \"op\", v: two, at });\n i += 2;\n continue;\n }\n if (ONE_CHAR.has(c)) {\n tokens.push({ t: \"op\", v: OP_ALIASES[c] ?? c, at });\n i++;\n continue;\n }\n throw new FormulaError(`\"${c}\" can't be used in a formula.`, at);\n }\n tokens.push({ t: \"end\", at: source.length });\n return tokens;\n}\n\n/**\n * Parse a formula. Never throws: a mistake comes back as `{ ok: false,\n * message, at }`, with the character offset of the problem.\n */\nexport function parseFormula(source: string): FormulaParseResult {\n if (typeof source !== \"string\" || source.trim() === \"\") return { ok: false, message: \"Write a formula.\", at: 0 };\n if (source.length > MAX_FORMULA_LENGTH) {\n return { ok: false, message: `Keep the formula under ${MAX_FORMULA_LENGTH} characters.`, at: MAX_FORMULA_LENGTH };\n }\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch (e) {\n const err = e as FormulaError;\n return { ok: false, message: err.message, at: err.at };\n }\n let pos = 0;\n const refs: FormulaRef[] = [];\n const peek = () => tokens[pos]!;\n const isOp = (v: string) => {\n const tok = peek();\n return tok.t === \"op\" && tok.v === v;\n };\n const expect = (v: string, message: string) => {\n if (!isOp(v)) throw new FormulaError(message, peek().at);\n pos++;\n };\n const describe = (tok: Token) => (tok.t === \"end\" ? \"the formula ends there\" : `found \"${String(tok.v)}\"`);\n const guard = (depth: number) => {\n if (depth > MAX_DEPTH) throw new FormulaError(\"The formula is nested too deeply.\", peek().at);\n };\n\n const ternary = (depth: number): FormulaNode => {\n guard(depth);\n const test = comparison(depth);\n if (!isOp(\"?\")) return test;\n pos++;\n const then = ternary(depth + 1);\n expect(\":\", \"A `?` needs a `:` and the other value: `test ? a : b`.\");\n const otherwise = ternary(depth + 1);\n return { kind: \"if\", test, then, else: otherwise };\n };\n const comparison = (depth: number): FormulaNode => {\n const left = additive(depth);\n const tok = peek();\n if (tok.t !== \"op\" || !COMPARISONS.has(tok.v)) return left;\n pos++;\n const right = additive(depth);\n const next = peek();\n if (next.t === \"op\" && COMPARISONS.has(next.v)) {\n throw new FormulaError(\"Compare two values at a time; combine comparisons with `? :`.\", next.at);\n }\n return { kind: \"binary\", op: tok.v as BinaryOp, left, right };\n };\n const additive = (depth: number): FormulaNode => {\n let left = multiplicative(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"+\" || tok.v === \"-\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: multiplicative(depth) };\n }\n return left;\n };\n const multiplicative = (depth: number): FormulaNode => {\n let left = unary(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"*\" || tok.v === \"/\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: unary(depth) };\n }\n return left;\n };\n const unary = (depth: number): FormulaNode => {\n guard(depth);\n if (isOp(\"-\")) {\n pos++;\n return { kind: \"unary\", op: \"-\", arg: unary(depth + 1) };\n }\n if (isOp(\"+\")) {\n pos++;\n return unary(depth + 1);\n }\n return primary(depth);\n };\n const primary = (depth: number): FormulaNode => {\n const tok = peek();\n if (tok.t === \"num\") {\n pos++;\n return { kind: \"number\", value: tok.v };\n }\n if (tok.t === \"str\") {\n pos++;\n return { kind: \"text\", value: tok.v };\n }\n if (tok.t === \"op\" && tok.v === \"(\") {\n pos++;\n const inner = ternary(depth + 1);\n expect(\")\", \"A `(` has no matching `)`.\");\n return inner;\n }\n if (tok.t === \"id\") {\n pos++;\n if (isOp(\"(\")) {\n if (!(FORMULA_FUNCTIONS as readonly string[]).includes(tok.v)) {\n throw new FormulaError(`There is no function \"${tok.v}\"; use ${FORMULA_FUNCTIONS.join(\", \")}.`, tok.at);\n }\n pos++;\n const args: FormulaNode[] = [];\n if (!isOp(\")\")) {\n args.push(ternary(depth + 1));\n while (isOp(\",\")) {\n pos++;\n args.push(ternary(depth + 1));\n }\n }\n expect(\")\", `\"${tok.v}(\" has no matching \")\".`);\n if (!args.length) throw new FormulaError(`${tok.v}() needs something to work on.`, tok.at);\n return { kind: \"call\", fn: tok.v as FormulaFunction, args };\n }\n if (isOp(\".\")) {\n pos++;\n const column = peek();\n if (column.t !== \"id\") throw new FormulaError(`Name a column after \"${tok.v}.\".`, column.at);\n pos++;\n refs.push({ key: tok.v, column: column.v });\n return { kind: \"ref\", key: tok.v, column: column.v, at: tok.at };\n }\n refs.push({ key: tok.v });\n return { kind: \"ref\", key: tok.v, at: tok.at };\n }\n throw new FormulaError(`Expected a number, an answer or \"(\", but ${describe(tok)}.`, tok.at);\n };\n\n try {\n const ast = ternary(0);\n const rest = peek();\n if (rest.t !== \"end\") throw new FormulaError(`Expected an operator such as + or *, but ${describe(rest)}.`, rest.at);\n return { ok: true, ast, refs };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, message: e.message, at: e.at };\n return { ok: false, message: \"The formula is nested too deeply.\", at: 0 };\n }\n}\n\n/** The answers a formula names, each once (none when it doesn't parse). */\nexport function formulaRefs(source: string): FormulaRef[] {\n const parsed = parseFormula(source);\n if (!parsed.ok) return [];\n const seen = new Set<string>();\n return parsed.refs.filter((r) => {\n const id = `${r.key}\\u0000${r.column ?? \"\"}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n\n/**\n * The formula with every reference to the answer `from` renamed to `to`.\n * Column names, function names and text are left alone. Returned unchanged\n * when it has a character a formula can't hold.\n */\nexport function renameFormulaKey(source: string, from: string, to: string): string {\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch {\n return source;\n }\n let out = \"\";\n let last = 0;\n tokens.forEach((tok, i) => {\n if (tok.t !== \"id\" || tok.v !== from) return;\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (prev?.t === \"op\" && prev.v === \".\") return;\n if (next?.t === \"op\" && next.v === \"(\") return;\n out += source.slice(last, tok.at) + to;\n last = tok.at + from.length;\n });\n return out + source.slice(last);\n}\n\n// ── Evaluation ───────────────────────────────────────────────────────────────\n\nconst NUMERIC = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\n\n/** A value as a number: numbers, numeric text (\"1,200\" too), yes / no as 1 / 0. Anything else is blank (`null`). */\nexport function formulaNumber(v: FormulaValue | Json | undefined): number | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (typeof v === \"string\") {\n const t = v.trim().replace(/,/g, \"\");\n return t.length <= 64 && NUMERIC.test(t) ? finite(Number(t)) : null;\n }\n return null;\n}\n\nconst finite = (n: number): number | null => (Number.isFinite(n) ? n : null);\n/** A list in arithmetic is blank: add one up with `sum(...)`. */\nconst scalar = (v: FormulaValue): FormulaValue => (Array.isArray(v) ? null : v);\n\nfunction truthy(v: FormulaValue): boolean {\n if (v === null) return false;\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"number\") return v !== 0;\n if (typeof v === \"string\") return v.trim() !== \"\";\n return v.length > 0;\n}\n\nfunction numbersIn(values: FormulaValue[], out: number[] = []): number[] {\n for (const v of values) {\n if (Array.isArray(v)) numbersIn(v, out);\n else {\n const n = formulaNumber(v);\n if (n !== null) out.push(n);\n }\n }\n return out;\n}\n\ninterface Totals {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\n/**\n * Each list's numbers added up once, for the lists this package built and\n * froze itself (the calculator's lists, one per answer and column), so a\n * formula worked out again over an unchanged table doesn't walk it again.\n * Any other list a reader returns may change in place, so it is added up\n * every time.\n */\nconst listTotals = new WeakMap<readonly FormulaValue[], Totals>();\nconst ownLists = new WeakSet<readonly FormulaValue[]>();\n\n/** Mark a frozen list built inside this package as safe to keep totals for (not exported from the package). */\nexport function ownFormulaList(list: FormulaValue[]): readonly FormulaValue[] {\n Object.freeze(list);\n ownLists.add(list);\n return list;\n}\n\nfunction totalsOf(list: readonly FormulaValue[]): Totals {\n const own = ownLists.has(list);\n let t = own ? listTotals.get(list) : undefined;\n if (t) return t;\n const nums = numbersIn(list as FormulaValue[]);\n t = { sum: 0, count: nums.length, min: Infinity, max: -Infinity };\n for (const n of nums) {\n t.sum += n;\n if (n < t.min) t.min = n;\n if (n > t.max) t.max = n;\n }\n if (own) listTotals.set(list, t);\n return t;\n}\n\nfunction compare(op: BinaryOp, a: FormulaValue, b: FormulaValue): boolean {\n const blank = (v: FormulaValue) => v === null || Array.isArray(v) || (typeof v === \"string\" && v.trim() === \"\");\n // A blank equals nothing: `!=` holds and every other comparison fails.\n if (blank(a) || blank(b)) return op === \"!=\";\n const x = formulaNumber(a);\n const y = formulaNumber(b);\n if (x !== null && y !== null) {\n if (op === \"==\") return x === y;\n if (op === \"!=\") return x !== y;\n if (op === \"<\") return x < y;\n if (op === \"<=\") return x <= y;\n if (op === \">\") return x > y;\n return x >= y;\n }\n // Text is equal or not; it has no order.\n if (op === \"==\") return String(a) === String(b);\n if (op === \"!=\") return String(a) !== String(b);\n return false;\n}\n\n/** Reads an answer for `evaluateFormula`: its value, or `null` when unanswered or unknown. */\nexport type FormulaReader = (ref: FormulaRef) => FormulaValue;\n\n/** Evaluate a parsed formula. Never throws; a value it can't work out is `null`. */\nexport function evaluateFormula(ast: FormulaNode, read: FormulaReader): FormulaValue {\n const run = (node: FormulaNode): FormulaValue => {\n switch (node.kind) {\n case \"number\":\n case \"text\":\n return node.value;\n case \"ref\":\n // The node itself: a reader may key on it, and it is never changed.\n return read(node);\n case \"unary\": {\n const n = formulaNumber(scalar(run(node.arg)));\n return n === null ? null : -n;\n }\n case \"if\":\n return truthy(run(node.test)) ? run(node.then) : run(node.else);\n case \"call\": {\n let total = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const arg of node.args) {\n const v = run(arg);\n if (Array.isArray(v)) {\n const t = totalsOf(v);\n total += t.sum;\n count += t.count;\n if (t.min < min) min = t.min;\n if (t.max > max) max = t.max;\n continue;\n }\n const n = formulaNumber(v);\n if (n === null) continue;\n total += n;\n count++;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n if (node.fn === \"sum\") return finite(total);\n if (!count) return null;\n if (node.fn === \"avg\") return finite(total / count);\n return node.fn === \"min\" ? min : max;\n }\n case \"binary\": {\n const a = run(node.left);\n const b = run(node.right);\n if (node.op === \"+\" || node.op === \"-\" || node.op === \"*\" || node.op === \"/\") {\n const x = formulaNumber(scalar(a));\n const y = formulaNumber(scalar(b));\n if (x === null || y === null) return null;\n if (node.op === \"+\") return finite(x + y);\n if (node.op === \"-\") return finite(x - y);\n if (node.op === \"*\") return finite(x * y);\n return y === 0 ? null : finite(x / y);\n }\n return compare(node.op, a, b);\n }\n }\n };\n try {\n return run(ast);\n } catch {\n return null;\n }\n}\n","import type { FieldTypeManifest } from \"./fields\";\nimport { evaluateFormula, formulaNumber, ownFormulaList, parseFormula, type FormulaNode, type FormulaRef, type FormulaValue } from \"./formula\";\nimport type { FieldBlock, FormDefinition, Json, Operator } from \"./types\";\n\n/** The calculated field type's registry key. */\nexport const CALCULATED_TYPE = \"calculated\";\n\n/**\n * Field types the builder offers only to a host that names them in its\n * palette, like `STRUCTURED_FIELD_TYPES`: `calculated` shows a value worked\n * out from other answers, so it is opt-in for hosts that want formulas.\n */\nexport const COMPUTED_FIELD_TYPES = [CALCULATED_TYPE] as const;\n\nexport type CalculatedFormat = \"number\" | \"percent\" | \"text\";\n/** Longest the formulas of one form may be, all together (`parseForm` checks it). */\nexport const MAX_FORM_FORMULA_LENGTH = 20_000;\n/** Most decimal places a calculated value may keep. */\nexport const MAX_CALCULATED_DECIMALS = 10;\n\nexport interface CalculatedProps {\n formula: string;\n format?: CalculatedFormat | undefined;\n decimals?: number | undefined;\n}\n\n/** A calculated field's settings, with anything malformed left out. */\nexport function calculatedProps(field: FieldBlock): CalculatedProps {\n const p = field.props ?? {};\n const out: CalculatedProps = { formula: typeof p.formula === \"string\" ? p.formula : \"\" };\n if (p.format === \"number\" || p.format === \"percent\" || p.format === \"text\") out.format = p.format;\n if (typeof p.decimals === \"number\" && Number.isInteger(p.decimals) && p.decimals >= 0 && p.decimals <= MAX_CALCULATED_DECIMALS) {\n out.decimals = p.decimals;\n }\n return out;\n}\n\nexport const isCalculated = (field: FieldBlock | undefined): boolean => field?.type === CALCULATED_TYPE;\n\nconst round = (n: number, decimals: number | undefined) => {\n if (decimals === undefined) return n;\n const r = Number(n.toFixed(decimals));\n return Object.is(r, -0) ? 0 : r;\n};\n\n/**\n * What a formula's result is stored as. `number` and `percent` keep a number\n * (`0.25` for 25%), rounded to `decimals`; `text` keeps text. Without a\n * format, numbers, text and true / false are kept as they are. A list, and\n * anything the format can't hold, is no value (`undefined`).\n */\nexport function calculatedValue(result: FormulaValue, field: FieldBlock): Json | undefined {\n return valueAs(result, calculatedProps(field));\n}\n\nfunction valueAs(result: FormulaValue, { format, decimals }: CalculatedProps): Json | undefined {\n if (result === null || Array.isArray(result)) return undefined;\n if (format === \"number\" || format === \"percent\") {\n const n = formulaNumber(result);\n return n === null ? undefined : round(n, decimals);\n }\n if (format === \"text\") {\n if (typeof result === \"number\") return decimals === undefined ? String(result) : result.toFixed(decimals);\n return typeof result === \"boolean\" ? (result ? \"Yes\" : \"No\") : result;\n }\n return typeof result === \"number\" ? round(result, decimals) : result;\n}\n\n/** A calculated value as shown: `12.5`, `25%`, the text, Yes / No. Empty when there is none. */\nexport function formatCalculated(value: Json | undefined, field: FieldBlock): string {\n if (value === undefined || value === null) return \"\";\n const { format, decimals } = calculatedProps(field);\n const fixed = (n: number) => (decimals === undefined ? String(Number(n.toFixed(6))) : n.toFixed(decimals));\n if (typeof value === \"number\") return format === \"percent\" ? `${fixed(value * 100)}%` : fixed(value);\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return typeof value === \"string\" ? value : \"\";\n}\n\n/**\n * Most items a formula reads from one answer (a list's items, a table's\n * rows). A longer answer reads as blank, so one oversized value sent to the\n * server can't make every formula over it slow.\n */\nexport const MAX_FORMULA_ITEMS = 10_000;\n\n/**\n * Most list items and table rows all of a form's formulas read in one go\n * (each list or table counted once, however many of its columns are read, in form order). A formula that reads\n * an answer past the limit, or one over `MAX_FORMULA_ITEMS`, has no value\n * (blank, never a partial total), so many big answers can't make working\n * the values out slow either.\n */\nexport const MAX_SETTLE_ITEMS = 50_000;\n\nconst extract = (value: readonly Json[], column: string | undefined): FormulaValue[] =>\n column !== undefined\n ? value.flatMap((row): FormulaValue[] => {\n if (!row || typeof row !== \"object\" || Array.isArray(row)) return [];\n const cell = row[column];\n return typeof cell === \"string\" || typeof cell === \"number\" ? [cell] : [];\n })\n : value.flatMap((v): FormulaValue[] => (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\" ? [v] : []));\n\n\n/**\n * The value a formula reads for an answer: numbers and text as they are, a\n * list's items, one table column's cells. A list or table of more than\n * `MAX_FORMULA_ITEMS` reads as blank. Each call builds a new list.\n */\nexport function formulaInput(value: Json | undefined, column?: string): FormulaValue {\n if (value === undefined || value === null) return null;\n if (Array.isArray(value) && value.length > MAX_FORMULA_ITEMS) return null;\n if (column !== undefined) {\n if (!Array.isArray(value)) return null;\n return extract(value, column);\n }\n if (Array.isArray(value)) return extract(value, undefined);\n return typeof value === \"object\" ? null : value;\n}\n\ninterface Compiled {\n field: FieldBlock;\n /** `formulaSize` of `ast`. */\n size: number;\n props: CalculatedProps;\n ast: FormulaNode | null;\n /** The answers it reads, each (answer, column) once (`id` is `undefined` for a key that is not a field). */\n reads: Read[];\n /** Each `ref` node of the formula, to its index in `reads`. */\n slots: Map<FormulaNode, number>;\n /** The inputs of the last evaluation and its result, reused while they are the same values. */\n last: { inputs: unknown[]; value: Json | undefined } | null;\n}\n\ninterface Read {\n id: string | undefined;\n column: string | undefined;\n /** `id` and `column` as one key, to read each once per formula. */\n key: string;\n}\n\nfunction refNodes(node: FormulaNode, out: Extract<FormulaNode, { kind: \"ref\" }>[] = []) {\n if (node.kind === \"ref\") out.push(node);\n else if (node.kind === \"unary\") refNodes(node.arg, out);\n else if (node.kind === \"binary\") (refNodes(node.left, out), refNodes(node.right, out));\n else if (node.kind === \"if\") (refNodes(node.test, out), refNodes(node.then, out), refNodes(node.else, out));\n else if (node.kind === \"call\") for (const a of node.args) refNodes(a, out);\n return out;\n}\n\n/** How many parts (numbers, answers, operators, calls) a formula has: what working it out once costs. */\nfunction formulaSize(node: FormulaNode): number {\n if (node.kind === \"unary\") return 1 + formulaSize(node.arg);\n if (node.kind === \"binary\") return 1 + formulaSize(node.left) + formulaSize(node.right);\n if (node.kind === \"if\") return 1 + formulaSize(node.test) + formulaSize(node.then) + formulaSize(node.else);\n if (node.kind === \"call\") return node.args.reduce((n, a) => n + formulaSize(a), 1);\n return 1;\n}\n\n/**\n * Work an engine may spend while replaying (see `MAX_REPLAY_WORK` in\n * `server.ts`): `spend` throws `ReplayWorkExceeded` once `used` passes `max`.\n */\nexport interface WorkBudget {\n used: number;\n max: number;\n}\n\n/**\n * Counts of the work calculators and replays did, for tests to check the\n * work stays bounded rather than timing it (not exported from the package).\n * `reset` zeroes them.\n */\nexport const workStats = {\n /** Formulas worked out (a cached result reused is not counted). */\n formulaRuns: 0,\n /** Lists read out of an answer (a list or one table column). */\n listBuilds: 0,\n /** Calls of `withCalculated`. */\n settles: 0,\n /** Copies of the answers made by `withCalculated`: at most one per call. */\n answerCopies: 0,\n /** Units of work the last limited replay used (see `WorkBudget`). */\n lastReplayWork: 0,\n reset() {\n this.formulaRuns = this.listBuilds = this.settles = this.answerCopies = this.lastReplayWork = 0;\n },\n};\n\nexport class ReplayWorkExceeded extends Error {\n constructor(readonly limit: number) {\n super(`Replaying the response would take more than ${limit} steps of work.`);\n }\n}\n\nexport function spend(budget: WorkBudget | undefined, amount: number): void {\n if (!budget) return;\n budget.used += amount;\n if (budget.used > budget.max) throw new ReplayWorkExceeded(budget.max);\n}\n\n/** Stands for an answer that is off the path or unanswered. */\nconst UNREAD = Symbol(\"unread\");\n/** Stands for an answer too big to read: over `MAX_FORMULA_ITEMS`, or past `MAX_SETTLE_ITEMS`. */\nconst OVER = Symbol(\"over\");\n\n/**\n * Works out a form's calculated fields from its answers. `withCalculated`\n * returns `values` itself when nothing changed. Each formula reads the\n * answers on `path` only (an answer logic hides reads as blank) and the\n * calculated fields before it, in form order.\n */\nexport function calculator(definition: FormDefinition, work?: WorkBudget) {\n // Work: 1 for each formula looked at in a settle, plus its size each time\n // it is worked out. Past the budget, `withCalculated` throws.\n const compiled: Compiled[] = [];\n const idByKey = new Map<string, string>();\n for (const block of definition.blocks) {\n if (block.kind !== \"field\") continue;\n idByKey.set(block.key, block.id);\n }\n for (const block of definition.blocks) {\n if (block.kind !== \"field\" || !isCalculated(block)) continue;\n const props = calculatedProps(block);\n const parsed = parseFormula(props.formula);\n const reads: Read[] = [];\n const slots = new Map<FormulaNode, number>();\n const byKey = new Map<string, number>();\n for (const ref of parsed.ok ? refNodes(parsed.ast) : []) {\n const id = idByKey.get(ref.key);\n const key = `${id ?? \"\"}\\u0000${ref.column ?? \"\"}`;\n let slot = byKey.get(key);\n if (slot === undefined) {\n slot = reads.push({ id, column: ref.column, key }) - 1;\n byKey.set(key, slot);\n }\n slots.set(ref, slot);\n }\n compiled.push({ field: block, props, ast: parsed.ok ? parsed.ast : null, size: parsed.ok ? formulaSize(parsed.ast) : 0, reads, slots, last: null });\n }\n /**\n * This calculator's lists, by the answer's array and then the column (`\"\"`\n * for a list's own items), so an unchanged table is walked once. Each\n * engine (and so each `validateSubmission` call) has its own, so a host\n * array changed between two calls is read afresh. Within one engine an\n * answer is not changed in place: the engine never changes a value it\n * holds, and `setValue` with an array it already holds calls `forget`.\n */\n const extracted = new WeakMap<readonly Json[], Map<string, readonly FormulaValue[]>>();\n const cachedList = (value: readonly Json[], column: string | undefined): readonly FormulaValue[] => {\n let byColumn = extracted.get(value);\n if (!byColumn) extracted.set(value, (byColumn = new Map()));\n const key = column ?? \"\";\n let list = byColumn.get(key);\n if (!list) {\n workStats.listBuilds++;\n byColumn.set(key, (list = ownFormulaList(extract(value, column))));\n }\n return list;\n };\n const readAnswer = (value: Json | undefined, column: string | undefined): FormulaValue => {\n if (Array.isArray(value)) return cachedList(value, column) as FormulaValue[];\n return column !== undefined ? null : formulaInput(value);\n };\n /** Drop what was worked out from `value`: it may have been changed in place. */\n const forget = (value: Json | undefined) => {\n if (!value || typeof value !== \"object\") return;\n if (Array.isArray(value)) extracted.delete(value);\n for (const entry of compiled) if (entry.last?.inputs.includes(value)) entry.last = null;\n };\n\n const withCalculated = (values: Record<string, Json | undefined>, path: readonly string[]) => {\n if (!compiled.length) return values;\n workStats.settles++;\n const visible = new Set(path);\n let next = values;\n // `values` is copied once, on the first change, then written into.\n let copied = false;\n // The items every formula may read, together: each list answer and table\n // counts its items or rows once (however many of its columns are read),\n // in form order, and one past the limit reads as blank. It depends on the\n // answers only, so a client and the server agree.\n let budget = MAX_SETTLE_ITEMS;\n const within = new Map<string, boolean>();\n const input = ({ id }: Read): unknown => {\n if (id === undefined || !visible.has(id) || !Object.prototype.hasOwnProperty.call(next, id)) return UNREAD;\n const value = next[id];\n if (!Array.isArray(value)) return value;\n let ok = within.get(id);\n if (ok === undefined) {\n // An answer over the per-answer limit is never read, so it uses none of the allowance.\n ok = value.length <= MAX_FORMULA_ITEMS && value.length <= budget;\n if (ok) budget -= value.length;\n within.set(id, ok);\n }\n return ok ? value : OVER;\n };\n for (const entry of compiled) {\n const { field, ast } = entry;\n // A formula is worked out again only when an answer it reads is a different value:\n // an engine settles on every answer, and most answers are to other questions.\n const { reads } = entry;\n spend(work, 1);\n const inputs: unknown[] = new Array(reads.length);\n let over = false;\n let same = entry.last !== null;\n for (let i = 0; i < reads.length; i++) {\n const v = input(reads[i]!);\n inputs[i] = v;\n if (v === OVER) over = true;\n if (same && entry.last!.inputs[i] !== v) same = false;\n }\n let value: Json | undefined;\n if (same) {\n value = entry.last!.value;\n } else {\n spend(work, entry.size);\n workStats.formulaRuns++;\n const resolved: (FormulaValue | undefined)[] = new Array(inputs.length);\n const read = (ref: FormulaRef): FormulaValue => {\n const slot = entry.slots.get(ref as FormulaNode);\n if (slot === undefined) return null;\n let v = resolved[slot];\n if (v === undefined) {\n const raw = inputs[slot];\n v = resolved[slot] = raw === UNREAD ? null : readAnswer(raw as Json | undefined, reads[slot]!.column);\n }\n return v;\n };\n // An answer too big to read leaves the value blank rather than a partial total.\n value = ast && !over ? valueAs(evaluateFormula(ast, read), entry.props) : undefined;\n entry.last = { inputs, value };\n }\n const current = Object.prototype.hasOwnProperty.call(next, field.id) ? next[field.id] : undefined;\n if (current !== value) {\n if (!copied) {\n workStats.answerCopies++;\n next = { ...next };\n copied = true;\n }\n next[field.id] = value;\n }\n }\n return next;\n };\n return { active: compiled.length > 0, ids: new Set(compiled.map((c) => c.field.id)), withCalculated, forget };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\n\nexport const calculatedFieldType: FieldTypeManifest = {\n type: CALCULATED_TYPE,\n label: \"Calculated\",\n category: \"advanced\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"control\" },\n // The engine works the value out; any number, text or true / false it made is valid.\n validate: (value) => (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\" ? null : \"This value is worked out from other answers.\"),\n summarize: (value, field) => formatCalculated(value, field),\n};\n","import type { FieldTypeManifest } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\ntype JsonObject = { [key: string]: Json };\nconst isObject = (v: unknown): v is JsonObject => !!v && typeof v === \"object\" && !Array.isArray(v);\nfunction intProp(field: FieldBlock, name: string, fallback: number, floor = 1): number {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : fallback;\n}\nfunction optionalIntProp(field: FieldBlock, name: string, floor = 0): number | undefined {\n const v = field.props?.[name];\n return typeof v === \"number\" && Number.isInteger(v) && v >= floor ? v : undefined;\n}\nconst blank = (v: unknown) => typeof v !== \"string\" || v.trim() === \"\";\n/**\n * Unanswered: nothing, or a list whose every entry is a blank one. Anything\n * else (a string, a list with a malformed entry) is an answer, so validation\n * rejects it instead of dropping it silently.\n */\nconst blankText = (v: unknown) => typeof v === \"string\" && v.trim() === \"\";\nconst emptyList = (value: Json | undefined, isBlank: (entry: Json) => boolean) =>\n value === undefined || value === null || (Array.isArray(value) && value.every(isBlank));\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nexport function listLimits(field: FieldBlock) {\n return { min: optionalIntProp(field, \"min\") ?? 0, max: intProp(field, \"max\", 10), itemMaxLength: intProp(field, \"itemMaxLength\", 500) };\n}\nconst listItems = (value: Json | undefined): string[] =>\n Array.isArray(value) ? value.filter((v): v is string => typeof v === \"string\" && v.trim() !== \"\") : [];\n\nexport interface TableColumn { key: string; label: string; long?: boolean }\nexport const MAX_TABLE_COLUMNS = 6;\nexport const MAX_TABLE_CELL_LENGTH = 2000;\nexport function tableColumns(field: FieldBlock): TableColumn[] {\n const raw = field.props?.columns;\n if (!Array.isArray(raw)) return [];\n const seen = new Set<string>();\n const out: TableColumn[] = [];\n for (const c of raw) {\n if (!isObject(c) || typeof c.key !== \"string\" || !c.key || seen.has(c.key)) continue;\n seen.add(c.key);\n const column: TableColumn = { key: c.key, label: typeof c.label === \"string\" ? c.label : c.key };\n if (c.long === true) column.long = true;\n out.push(column);\n }\n return out;\n}\nexport function tableLimits(field: FieldBlock) {\n return { minRows: optionalIntProp(field, \"minRows\") ?? 0, maxRows: intProp(field, \"maxRows\", 3) };\n}\nconst filledRows = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((r): r is JsonObject => isObject(r) && Object.values(r).some((c) => !blank(c))) : [];\n\nexport interface MediaNote { at: number; text: string }\nexport const MAX_TIMESTAMP_SECONDS = 86400;\nexport function formatTimestamp(seconds: number): string {\n const total = Number.isFinite(seconds) && seconds > 0 ? Math.floor(seconds) : 0;\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = String(total % 60).padStart(2, \"0\");\n return h ? `${h}:${String(m).padStart(2, \"0\")}:${s}` : `${m}:${s}`;\n}\nexport function parseTimestamp(text: string): number | null {\n const t = text.trim();\n if (!t) return null;\n const parts = t.split(\":\");\n if (parts.length > 3) return null;\n if (parts.length === 1) {\n if (!/^\\d+(\\.\\d+)?$/.test(t)) return null;\n const n = Number(t);\n return n <= MAX_TIMESTAMP_SECONDS ? n : null;\n }\n const last = parts.length - 1;\n let total = 0;\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i]!;\n const ok = i === 0 ? /^\\d+$/.test(p) : i === last ? /^\\d{2}(\\.\\d+)?$/.test(p) : /^\\d{2}$/.test(p);\n if (!ok) return null;\n const n = Number(p);\n if (i > 0 && n >= 60) return null;\n total = total * 60 + n;\n }\n return total <= MAX_TIMESTAMP_SECONDS ? total : null;\n}\nconst isTimestamp = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v) && v >= 0 && v <= MAX_TIMESTAMP_SECONDS;\nconst notesWithText = (value: Json | undefined): JsonObject[] =>\n Array.isArray(value) ? value.filter((n): n is JsonObject => isObject(n) && !blank(n.text)) : [];\n\nexport interface Highlight { start: number; end: number; quote: string; note: string }\nexport const MAX_HIGHLIGHT_NOTE_LENGTH = 1000;\n/** The longest passage one highlight may quote; also bounds a quote the server can't check against `props.text`. */\nexport const MAX_HIGHLIGHT_QUOTE_LENGTH = 2000;\nexport const HIGHLIGHT_NOTE_MESSAGE = \"Add a note to each highlight.\";\nconst sourceText = (field: FieldBlock) => (typeof field.props?.text === \"string\" && field.props.text ? field.props.text : undefined);\n\n/**\n * The structured field types, whose answers are lists or records rather than one\n * value:\n * - `list`: several short answers, e.g. goals, action items, three things that went well.\n * - `table`: a small table each answer fills row by row, e.g. an action plan\n * (What / Who / By when), pros and cons.\n * - `media-notes`: notes pinned to times in a video or audio, e.g. lecture notes,\n * a recorded call review.\n * - `text-highlights`: highlight passages of a text and note on each, e.g.\n * annotating an article, a policy or a contract.\n *\n * They are registered like any other, but the builder offers them only to a\n * host that names them in its palette (`FormBuilder palette`), so forms that\n * never had them don't change.\n */\nexport const STRUCTURED_FIELD_TYPES = [\"list\", \"table\", \"media-notes\", \"text-highlights\"] as const;\n\nexport const structuredFieldTypes: FieldTypeManifest[] = [\n {\n type: \"list\", label: \"List\", category: \"text\", value: { json: true },\n // logic.ts `contains` on an array is exact item equality, same as multi-choice, so it is offered.\n operators: [\"contains\", \"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, blankText),\n validate: (value, field) => {\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) return \"Enter a list of answers.\";\n const { min, max, itemMaxLength } = listLimits(field);\n if (value.some((v) => (v as string).trim().length > itemMaxLength)) return `Keep each item under ${itemMaxLength} characters.`;\n const count = listItems(value).length;\n if (count < min) return `Add at least ${plural(min, \"item\")}.`;\n if (count > max) return `Add at most ${plural(max, \"item\")}.`;\n return null;\n },\n normalize: (value) => (Array.isArray(value) ? listItems(value).map((v) => v.trim()) : value),\n summarize: (value) => listItems(value).map((v) => v.trim()).join(\"; \"),\n samples: (field) => {\n const { min, max } = listLimits(field);\n return [Array.from({ length: Math.min(Math.max(1, min), max) }, (_, i) => `Item ${i + 1}`)];\n },\n },\n {\n type: \"table\", label: \"Table\", category: \"advanced\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (r) => isObject(r) && Object.values(r).every(blankText)),\n validate: (value, field) => {\n const columns = tableColumns(field);\n if (!columns.length) return \"This question has no columns.\";\n if (!Array.isArray(value) || !value.every(isObject)) return \"Fill in the rows.\";\n const keys = new Set(columns.map((c) => c.key));\n for (const row of value as JsonObject[]) {\n for (const [key, cell] of Object.entries(row)) {\n if (!keys.has(key)) return \"An answer names a column this question doesn't have.\";\n if (typeof cell !== \"string\") return \"Fill in the rows with text.\";\n if (cell.trim().length > MAX_TABLE_CELL_LENGTH) return `Keep each answer under ${MAX_TABLE_CELL_LENGTH} characters.`;\n }\n }\n const { minRows, maxRows } = tableLimits(field);\n const count = filledRows(value).length;\n if (count < minRows) return `Fill in at least ${plural(minRows, \"row\")}.`;\n if (count > maxRows) return `Fill in at most ${plural(maxRows, \"row\")}.`;\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? filledRows(value).map((row) => {\n const out: JsonObject = {};\n for (const [key, cell] of Object.entries(row)) if (typeof cell === \"string\") out[key] = cell.trim();\n return out;\n })\n : value,\n summarize: (value, field) => {\n const columns = tableColumns(field);\n return filledRows(value)\n .map((row) => columns.filter((c) => !blank(row[c.key])).map((c) => `${c.label}: ${(row[c.key] as string).trim()}`).join(\" · \"))\n .join(\" / \");\n },\n samples: (field) => {\n const columns = tableColumns(field);\n if (!columns.length) return [];\n const { minRows, maxRows } = tableLimits(field);\n const row = Object.fromEntries(columns.map((c) => [c.key, \"sample\"]));\n return [Array.from({ length: Math.min(Math.max(1, minRows), maxRows) }, () => ({ ...row }))];\n },\n },\n {\n type: \"media-notes\", label: \"Notes at moments\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, (n) => isObject(n) && blankText(n.text)),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Add notes.\";\n const textMaxLength = intProp(field, \"textMaxLength\", 1000);\n for (const note of value) {\n if (!isObject(note) || typeof note.text !== \"string\") return \"Add notes.\";\n if (!isTimestamp(note.at)) return \"Each note needs a time.\";\n if (note.text.trim().length > textMaxLength) return `Keep each note under ${textMaxLength} characters.`;\n }\n const maxNotes = intProp(field, \"maxNotes\", 20);\n return notesWithText(value).length > maxNotes ? `Add at most ${plural(maxNotes, \"note\")}.` : null;\n },\n normalize: (value) => Array.isArray(value)\n ? notesWithText(value).map((n) => ({ at: n.at as number, text: (n.text as string).trim() })).sort((a, b) => a.at - b.at)\n : value,\n summarize: (value) => notesWithText(value)\n .map((n) => ({ at: typeof n.at === \"number\" ? n.at : 0, text: (n.text as string).trim() }))\n .sort((a, b) => a.at - b.at)\n .map((n) => `${formatTimestamp(n.at)} ${n.text}`)\n .join(\"; \"),\n samples: () => [[{ at: 0, text: \"sample\" }]],\n },\n {\n type: \"text-highlights\", label: \"Highlights\", category: \"media\", value: { json: true },\n operators: [\"answered\", \"empty\"], a11y: { semantics: \"group\" },\n isEmpty: (value) => emptyList(value, () => false),\n validate: (value, field) => {\n if (!Array.isArray(value)) return \"Highlight a passage.\";\n const maxHighlights = intProp(field, \"maxHighlights\", 20);\n if (value.length > maxHighlights) return `Add at most ${plural(maxHighlights, \"highlight\")}.`;\n const text = sourceText(field);\n for (const h of value) {\n if (!isObject(h) || !Number.isInteger(h.start) || !Number.isInteger(h.end) || typeof h.quote !== \"string\" || typeof h.note !== \"string\") {\n return \"Highlight a passage of the text.\";\n }\n const start = h.start as number;\n const end = h.end as number;\n if (start < 0 || end <= start || h.quote.length !== end - start) return \"Highlight a passage of the text.\";\n if (end - start > MAX_HIGHLIGHT_QUOTE_LENGTH) return `Highlight under ${MAX_HIGHLIGHT_QUOTE_LENGTH} characters at a time.`;\n if (text !== undefined && (end > text.length || text.slice(start, end) !== h.quote)) return \"A highlight doesn't match the text.\";\n if (h.note.trim() === \"\") return HIGHLIGHT_NOTE_MESSAGE;\n if (h.note.trim().length > MAX_HIGHLIGHT_NOTE_LENGTH) return `Keep each note under ${MAX_HIGHLIGHT_NOTE_LENGTH} characters.`;\n }\n return null;\n },\n normalize: (value) => Array.isArray(value)\n ? value.filter(isObject)\n .map((h) => ({ start: h.start as number, end: h.end as number, quote: h.quote as string, note: String(h.note).trim() }))\n .sort((a, b) => a.start - b.start || a.end - b.end)\n : value,\n summarize: (value) => Array.isArray(value)\n ? value.filter(isObject).map((h) => `\"${String(h.quote)}\" — ${String(h.note).trim()}`).join(\"; \")\n : \"\",\n samples: (field) => {\n const text = sourceText(field);\n if (text === undefined) return [[{ start: 0, end: 6, quote: \"sample\", note: \"sample\" }]];\n const end = Math.min(text.length, 20);\n return [[{ start: 0, end, quote: text.slice(0, end), note: \"sample\" }]];\n },\n },\n];\n","import type { FieldTypeManifest } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\n/**\n * The `photo` field type: a respondent attaches up to a few photos, such as a\n * picture of broken equipment. The answer holds references the host's storage\n * handed back (`PhotoRef`), never the bytes: the renderer uploads through the\n * host (`onUpload` on genesis-forms-web's `Form`), so the engine and the\n * server stay storage-agnostic. A host's server should check that each\n * reference is a file it stored for this respondent before saving.\n *\n * Opt-in in a builder palette (`UPLOAD_FIELD_TYPES`), since a host must be\n * able to store the files.\n */\nexport const PHOTO_TYPE = \"photo\";\n\n/** Field types that need the host to store files; a builder offers them only when the host names them. */\nexport const UPLOAD_FIELD_TYPES = [PHOTO_TYPE] as const;\n\n/** One stored photo, as the host's upload returned it. */\nexport type PhotoRef = {\n /** The host's id for the stored file. */\n id: string;\n /** The file's name on the respondent's device. */\n name: string;\n /** Its MIME type, such as `image/jpeg`. */\n type: string;\n /** Bytes. */\n size: number;\n};\n\nexport type PhotoFormat = \"jpeg\" | \"png\" | \"heic\" | \"webp\";\n\n/** The MIME types each format covers. */\nexport const PHOTO_FORMATS: Record<PhotoFormat, readonly string[]> = {\n jpeg: [\"image/jpeg\"],\n png: [\"image/png\"],\n heic: [\"image/heic\", \"image/heif\"],\n webp: [\"image/webp\"],\n};\n\nconst FORMAT_NAMES: Record<PhotoFormat, string> = { jpeg: \"JPEG\", png: \"PNG\", heic: \"HEIC\", webp: \"WebP\" };\nconst ALL_FORMATS = Object.keys(PHOTO_FORMATS) as PhotoFormat[];\n\nexport const DEFAULT_PHOTO_FILES = 3;\nexport const MAX_PHOTO_FILES = 5;\nexport const DEFAULT_PHOTO_SIZE_MB = 10;\nexport const MAX_PHOTO_SIZE_MB = 25;\n/** The longest reference id and file name a photo answer may carry. */\nexport const MAX_PHOTO_ID_LENGTH = 200;\nexport const MAX_PHOTO_NAME_LENGTH = 255;\n\nexport const isPhotoFormat = (v: unknown): v is PhotoFormat =>\n typeof v === \"string\" && Object.prototype.hasOwnProperty.call(PHOTO_FORMATS, v);\n\nconst wholeIn = (v: unknown, min: number, max: number): v is number =>\n typeof v === \"number\" && Number.isInteger(v) && v >= min && v <= max;\n\nexport interface PhotoLimits {\n maxFiles: number;\n maxSizeMb: number;\n maxBytes: number;\n formats: PhotoFormat[];\n /** Every MIME type the formats cover. */\n mimeTypes: string[];\n}\n\n/** A photo field's limits; a prop that is missing or out of range uses its default. */\nexport function photoLimits(field: FieldBlock): PhotoLimits {\n const maxFiles = wholeIn(field.props?.maxFiles, 1, MAX_PHOTO_FILES) ? field.props.maxFiles : DEFAULT_PHOTO_FILES;\n const maxSizeMb = wholeIn(field.props?.maxSizeMb, 1, MAX_PHOTO_SIZE_MB) ? field.props.maxSizeMb : DEFAULT_PHOTO_SIZE_MB;\n const raw = field.props?.formats;\n const picked = Array.isArray(raw) ? ALL_FORMATS.filter((f) => raw.includes(f)) : [];\n const formats = picked.length ? picked : [...ALL_FORMATS];\n return {\n maxFiles,\n maxSizeMb,\n maxBytes: maxSizeMb * 1024 * 1024,\n formats,\n mimeTypes: formats.flatMap((f) => PHOTO_FORMATS[f]),\n };\n}\n\n/** Whether `v` has a photo reference's shape (any type and size). */\nexport function isPhotoRef(v: unknown): v is PhotoRef {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return false;\n const r = v as Record<string, unknown>;\n return (\n typeof r.id === \"string\" &&\n r.id.length > 0 &&\n r.id.length <= MAX_PHOTO_ID_LENGTH &&\n typeof r.name === \"string\" &&\n r.name.length <= MAX_PHOTO_NAME_LENGTH &&\n typeof r.type === \"string\" &&\n typeof r.size === \"number\" &&\n Number.isInteger(r.size) &&\n r.size > 0\n );\n}\n\n/** The well-formed references in a photo answer, as `{ id, name, type, size }` only. */\nexport function photoRefs(value: Json | undefined): PhotoRef[] {\n if (!Array.isArray(value)) return [];\n const refs: PhotoRef[] = [];\n for (const r of value as unknown[]) if (isPhotoRef(r)) refs.push({ id: r.id, name: r.name, type: r.type, size: r.size });\n return refs;\n}\n\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\n/** \"JPEG, PNG or WebP\". */\nexport function photoFormatList(formats: readonly PhotoFormat[]): string {\n const names = formats.map((f) => FORMAT_NAMES[f]);\n return names.length > 1 ? `${names.slice(0, -1).join(\", \")} or ${names[names.length - 1]}` : (names[0] ?? \"\");\n}\n\n/** The message for a file of a type the field doesn't take. */\nexport const photoTypeMessage = (field: FieldBlock) => `Use a ${photoFormatList(photoLimits(field).formats)} photo.`;\n/** The message for a file over the field's size limit. */\nexport const photoSizeMessage = (field: FieldBlock) => `Each photo must be ${photoLimits(field).maxSizeMb} MB or smaller.`;\n/** The message for more photos than the field takes. */\nexport const photoCountMessage = (field: FieldBlock) => `Add at most ${plural(photoLimits(field).maxFiles, \"photo\")}.`;\n\nexport const photoFieldType: FieldTypeManifest = {\n type: PHOTO_TYPE,\n label: \"Photo\",\n category: \"media\",\n value: { json: true },\n operators: [\"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n isEmpty: (value) => value === undefined || value === null || (Array.isArray(value) && value.length === 0),\n validate: (value, field) => {\n if (!Array.isArray(value) || !value.every(isPhotoRef)) return \"Add a photo.\";\n const limits = photoLimits(field);\n if (value.length > limits.maxFiles) return photoCountMessage(field);\n const refs = value as unknown as PhotoRef[];\n if (new Set(refs.map((r) => r.id)).size !== refs.length) return \"Each photo can be added once.\";\n if (refs.some((r) => !limits.mimeTypes.includes(r.type.toLowerCase()))) return photoTypeMessage(field);\n if (refs.some((r) => r.size > limits.maxBytes)) return photoSizeMessage(field);\n return null;\n },\n normalize: (value) => (Array.isArray(value) && value.every(isPhotoRef) ? photoRefs(value) : value),\n summarize: (value) => photoRefs(value).map((r) => r.name || \"Photo\").join(\", \"),\n samples: () => [[{ id: \"sample-photo\", name: \"photo.jpg\", type: \"image/jpeg\", size: 1024 }]],\n};\n","import type { Block, FieldBlock, FormDefinition, Json, Operator, OptionsSource } from \"./types\";\nimport { calculatedFieldType } from \"./calculated\";\nimport { structuredFieldTypes } from \"./structured\";\nimport { photoFieldType } from \"./photo\";\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 /** A muted line under the label, such as a location's address. At most `OPTION_LIMITS.description` characters. */\n description?: string;\n /** A small picture beside the label: an `https://` URL, at most `OPTION_LIMITS.image` characters. */\n image?: string;\n /**\n * Facts about the option for filtering and recall, such as `{ location: [\"cff\", \"cornerstone\"] }`\n * for a coach who works at two locations (see `props.optionsFrom.filter`). Names and values are\n * text; a value is one text or a list of them.\n */\n attributes?: Record<string, string | string[]>;\n}\n\n/** Bounds on an option's extra details. A longer or malformed detail is dropped when options are read. */\nexport const OPTION_LIMITS = {\n /** Characters in a description. */\n description: 500,\n /** Characters in an image URL. */\n image: 2048,\n /** Attributes on one option. */\n attributes: 20,\n /** Characters in an attribute's name. */\n attributeName: 64,\n /** Characters in one attribute value. */\n attributeValue: 200,\n /** Values in one attribute's list. */\n attributeItems: 50,\n} as const;\n\n/**\n * Whether `url` is an `https://` link with a host and no spaces or control characters, within\n * `OPTION_LIMITS.image`. A pattern rather than `new URL`, so it behaves the same in React Native.\n */\nexport function isHttpsUrl(url: unknown): url is string {\n return (\n typeof url === \"string\" &&\n url.length <= OPTION_LIMITS.image &&\n /^https:\\/\\/[^\\s/?#@\\\\]+(?:[/?#][^\\s]*)?$/i.test(url) &&\n // No control characters anywhere (a line break would end a CSV row or an HTML attribute).\n ![...url].some((c) => c.charCodeAt(0) < 32 || c.charCodeAt(0) === 127)\n );\n}\n\n/** A well-formed attribute name: text, not blank, not an `Object.prototype` name, within the limit. */\nfunction attributeName(name: string): boolean {\n return name.trim() !== \"\" && name.length <= OPTION_LIMITS.attributeName && !(name in Object.prototype);\n}\n\n/** The attributes of a raw option that are well formed, or undefined when none are. */\nfunction readAttributes(raw: unknown): Record<string, string | string[]> | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const out: Record<string, string | string[]> = {};\n let count = 0;\n for (const name of Object.keys(raw)) {\n if (count >= OPTION_LIMITS.attributes) break;\n if (!attributeName(name)) continue;\n const v = (raw as Record<string, unknown>)[name];\n const fits = (x: unknown): x is string => typeof x === \"string\" && x.length <= OPTION_LIMITS.attributeValue;\n if (fits(v)) out[name] = v;\n else if (Array.isArray(v) && v.length <= OPTION_LIMITS.attributeItems && v.every(fits)) out[name] = [...v];\n else continue;\n count++;\n }\n return count ? out : undefined;\n}\n\n/**\n * An option from untrusted JSON (a definition, the host's list): its string `value`, and its\n * `label`, `description`, `image` and `attributes` when each is well formed and within\n * `OPTION_LIMITS`; anything else is left out. Null when there is no string value.\n */\nexport function readOption(raw: unknown): ChoiceOption | null {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return null;\n const o = raw as Record<string, unknown>;\n if (typeof o.value !== \"string\") return null;\n const out: ChoiceOption = { value: o.value };\n if (typeof o.label === \"string\") out.label = o.label;\n if (typeof o.description === \"string\" && o.description.trim() && o.description.length <= OPTION_LIMITS.description) {\n out.description = o.description;\n }\n if (isHttpsUrl(o.image)) out.image = o.image;\n const attributes = readAttributes(o.attributes);\n if (attributes) out.attributes = attributes;\n return out;\n}\n\n/** An option as JSON, with only the details it has. */\nexport function optionJson(option: ChoiceOption): Json {\n const out: Record<string, Json> = { value: option.value };\n if (option.label !== undefined) out.label = option.label;\n if (option.description !== undefined) out.description = option.description;\n if (option.image !== undefined) out.image = option.image;\n if (option.attributes !== undefined) out.attributes = { ...option.attributes } as Record<string, Json>;\n return out;\n}\n\n/** The longest answer an \"Other\" option takes. */\nexport const OTHER_MAX_LENGTH = 200;\n\n/**\n * A choice question's \"Other\" option (`props.other: true` or `{ label }`): the respondent types\n * their own answer, stored as the answer's value itself (single choice, dropdown) or as one more\n * item (multiple choice). Null when the question has none.\n */\nexport function otherOption(field: FieldBlock): { label: string } | null {\n const other = field.props?.other;\n if (other === true) return { label: \"Other\" };\n if (other && typeof other === \"object\" && !Array.isArray(other)) {\n const label = typeof other.label === \"string\" && other.label.trim() ? other.label.trim() : \"Other\";\n return { label };\n }\n return null;\n}\n\n/** Whether a value is a typed \"Other\" answer: text that isn't one of the question's options. */\nexport function isOtherValue(field: FieldBlock, value: unknown): value is string {\n return (\n otherOption(field) !== null &&\n typeof value === \"string\" &&\n !choiceOptions(field).some((o) => o.value === value)\n );\n}\n\nconst typedOther = (field: FieldBlock, value: unknown) =>\n isOtherValue(field, value) && value.trim() !== \"\" && value.length <= OTHER_MAX_LENGTH;\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 const option = readOption(o);\n return option ? [option] : [];\n });\n}\n\n/**\n * Option lists the app showing a form supplies, by key (`OptionsSource.key`):\n * `{ coaches: [{ value: \"8c1…\", label: \"Ada Lovelace\" }] }`.\n */\nexport type HostOptions = Readonly<Record<string, readonly ChoiceOption[]>>;\n\n/**\n * A choice field's `props.optionsFrom`, when it is a well-formed `{ source: \"host\", key }`, with its\n * `filter` when that is well formed too (`{ attribute, field }`, both non-empty text).\n */\nexport function optionsSource(field: FieldBlock): OptionsSource | undefined {\n const raw = field.props?.optionsFrom;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n if (raw.source !== \"host\" || typeof raw.key !== \"string\" || !raw.key) return undefined;\n const out: OptionsSource = { source: \"host\", key: raw.key };\n const filter = raw.filter;\n if (\n filter &&\n typeof filter === \"object\" &&\n !Array.isArray(filter) &&\n typeof filter.attribute === \"string\" &&\n filter.attribute &&\n typeof filter.field === \"string\" &&\n filter.field\n ) {\n out.filter = { attribute: filter.attribute, field: filter.field };\n }\n return out;\n}\n\n/** The host's list for `key`, as options: string values only, each value once, labels when they are text. */\nfunction hostList(hostOptions: HostOptions | undefined, key: string): ChoiceOption[] {\n if (!hostOptions || !Object.prototype.hasOwnProperty.call(hostOptions, key)) return [];\n const list = hostOptions[key];\n if (!Array.isArray(list)) return [];\n const seen = new Set<string>();\n const out: ChoiceOption[] = [];\n for (const o of list as unknown[]) {\n const option = readOption(o);\n if (!option || !option.value || seen.has(option.value)) continue;\n seen.add(option.value);\n out.push(option);\n }\n return out;\n}\n\n/**\n * The definition with each `optionsFrom: { source: \"host\" }` field's options\n * filled in from `hostOptions`: its own `props.options` first, then the host's\n * list for its key (a value the field already has is not added twice). A key\n * the host does not supply adds nothing, so the field offers its own options\n * only. `createForm` and `validateSubmission` call it with their `hostOptions`,\n * so a respondent sees, and a submit accepts, exactly these. Returns\n * `definition` itself when no field takes options from the host.\n */\nexport function withHostOptions(definition: FormDefinition, hostOptions: HostOptions | undefined): FormDefinition {\n let changed = false;\n const blocks = definition.blocks.map((block) => {\n if (block.kind !== \"field\") return block;\n const from = optionsSource(block);\n if (!from) return block;\n const own = choiceOptions(block);\n const taken = new Set(own.map((o) => o.value));\n const added = hostList(hostOptions, from.key).filter((o) => !taken.has(o.value));\n if (!added.length) return block;\n changed = true;\n const options = [...own, ...added].map(optionJson);\n return { ...block, props: { ...block.props, options } };\n });\n return changed ? { ...definition, blocks } : definition;\n}\n\nfunction optionLabel(field: FieldBlock, value: string): string {\n const option = choiceOptions(field).find((o) => o.value === value);\n return option?.label ?? value;\n}\n\nfunction intRange(field: FieldBlock, min: number, maxDefault: number) {\n const max = typeof field.props?.max === \"number\" ? field.props.max : maxDefault;\n return { min, max };\n}\n\nconst numberOps: Operator[] = [\"eq\", \"neq\", \"lt\", \"lte\", \"gt\", \"gte\", \"in\", \"answered\", \"empty\"];\nconst textOps: Operator[] = [\"eq\", \"neq\", \"contains\", \"answered\", \"empty\"];\n\nfunction maxLength(field: FieldBlock, fallback: number): number {\n return typeof field.props?.maxLength === \"number\" ? field.props.maxLength : fallback;\n}\n\nfunction textValidate(fallback: number) {\n return (value: Json, field: FieldBlock) => {\n if (typeof value !== \"string\") return \"Enter text.\";\n const limit = maxLength(field, fallback);\n return value.length > limit ? `Keep it under ${limit} characters.` : null;\n };\n}\n\n/** The longest address SMTP allows (RFC 5321). */\nconst MAX_EMAIL_LENGTH = 254;\n\n/**\n * `local@domain.tld`: no spaces, exactly one `@`, and a dot inside the domain.\n * A linear scan rather than a regex, so a hostile value cannot backtrack.\n */\nexport function isEmailAddress(value: string): boolean {\n if (value.length > MAX_EMAIL_LENGTH || /\\s/.test(value)) return false;\n const at = value.indexOf(\"@\");\n if (at < 1 || value.indexOf(\"@\", at + 1) !== -1) return false;\n const domain = value.slice(at + 1);\n // A dot with at least one character on each side.\n return domain.slice(1, -1).includes(\".\");\n}\n\n/** Longest phone number accepted, separators included. */\nconst MAX_PHONE_LENGTH = 32;\n\n/**\n * Digits with optional separators (spaces, `-`, `(`, `)`, `.`) and an\n * optional leading `+`; 7 to 15 digits (E.164 allows at most 15). One linear scan.\n */\nfunction isPhoneNumber(value: string): boolean {\n if (value.length > MAX_PHONE_LENGTH) return false;\n let digits = 0;\n for (let i = 0; i < value.length; i++) {\n const c = value[i]!;\n if (c >= \"0\" && c <= \"9\") digits++;\n else if (c === \"+\") {\n if (i !== 0) return false;\n } else if (c !== \" \" && c !== \"-\" && c !== \"(\" && c !== \")\" && c !== \".\") return false;\n }\n return digits >= 7 && digits <= 15;\n}\n\nconst builtins: FieldTypeManifest[] = [\n {\n type: \"short-text\",\n label: \"Short text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(500),\n },\n {\n type: \"long-text\",\n label: \"Long text\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\" },\n validate: textValidate(5000),\n },\n {\n type: \"email\",\n label: \"Email\",\n category: \"text\",\n value: { json: true },\n operators: textOps,\n a11y: { semantics: \"control\", autocomplete: \"email\", inputMode: \"email\" },\n validate: (value) =>\n typeof value === \"string\" && isEmailAddress(value.trim())\n ? null\n : \"Enter an email address like name@example.com.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n },\n {\n type: \"phone\",\n label: \"Phone\",\n category: \"text\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\", autocomplete: \"tel\", inputMode: \"tel\" },\n validate: (value) =>\n typeof value === \"string\" && isPhoneNumber(value.trim())\n ? null\n : \"Enter a phone number with 7 to 15 digits.\",\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n summarize: (value) => String(value),\n },\n {\n type: \"rating\",\n label: \"Rating\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value, field) => {\n const { min, max } = intRange(field, 1, 5);\n return Number.isInteger(value) && (value as number) >= min && (value as number) <= max\n ? null\n : `Choose a rating from ${min} to ${max}.`;\n },\n summarize: (value, field) => {\n const { max } = intRange(field, 1, 5);\n const end = scaleEndLabel(field, value as number, 1, max);\n return end ? `${value}/${max} (${end})` : `${value}/${max}`;\n },\n },\n {\n type: \"nps\",\n label: \"Net Promoter Score\",\n category: \"scale\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"group\" },\n validate: (value) =>\n Number.isInteger(value) && (value as number) >= 0 && (value as number) <= 10\n ? null\n : \"Choose a score from 0 to 10.\",\n summarize: (value, field) => {\n const end = scaleEndLabel(field, value as number, 0, 10);\n return end ? `${value}/10 (${end})` : `${value}/10`;\n },\n },\n {\n type: \"single-choice\",\n label: \"Single choice\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value, field) =>\n typeof value === \"string\" && (choiceOptions(field).some((o) => o.value === value) || typedOther(field, 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, plus at most one typed \"Other\" answer, so a value is never\n // longer than the option list and one.\n const others = Array.isArray(value) ? value.filter((v) => typeof v === \"string\" && !allowed.has(v)) : [];\n return Array.isArray(value) &&\n new Set(value).size === value.length &&\n value.every((v) => typeof v === \"string\") &&\n (others.length === 0 || (others.length === 1 && typedOther(field, others[0])))\n ? null\n : \"Choose from the options.\";\n },\n summarize: (value, field) =>\n Array.isArray(value) ? value.map((v) => optionLabel(field, String(v))).join(\", \") : String(value),\n },\n {\n type: \"yes-no\",\n label: \"Yes / no\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n validate: (value) => (typeof value === \"boolean\" ? null : \"Choose yes or no.\"),\n summarize: (value) => (value ? \"Yes\" : \"No\"),\n },\n {\n type: \"dropdown\",\n label: \"Dropdown\",\n category: \"choice\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"in\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\" },\n validate: (value, field) =>\n typeof value === \"string\" && (choiceOptions(field).some((o) => o.value === value) || typedOther(field, value))\n ? null\n : \"Choose one of the options.\",\n summarize: (value, field) => optionLabel(field, String(value)),\n },\n {\n type: \"number\",\n label: \"Number\",\n category: \"text\",\n value: { json: true },\n operators: numberOps,\n a11y: { semantics: \"control\", inputMode: \"decimal\" },\n validate: (value, field) => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"Enter a number.\";\n const { min, max, step } = numberLimits(field);\n if (min !== undefined && max !== undefined && (value < min || value > max)) {\n return `Enter a number from ${min} to ${max}.`;\n }\n if (min !== undefined && value < min) return `Enter ${min} or more.`;\n if (max !== undefined && value > max) return `Enter ${max} or less.`;\n if (step !== undefined && !onStep(value, min ?? 0, step)) {\n return step === 1 && Number.isInteger(min ?? 0)\n ? \"Enter a whole number.\"\n : `Enter a number in steps of ${step}.`;\n }\n return null;\n },\n summarize: (value) => String(value),\n samples: (field) => {\n const { min, max } = numberLimits(field);\n return [min, max, 0, 1].filter((v): v is number => v !== undefined);\n },\n },\n {\n type: \"date\",\n label: \"Date\",\n category: \"date\",\n value: { json: true },\n operators: [\"eq\", \"neq\", \"answered\", \"empty\"],\n a11y: { semantics: \"control\" },\n validate: (value, field) => {\n if (typeof value !== \"string\" || !isIsoDate(value.trim())) return \"Enter a date like 2026-10-22.\";\n const date = value.trim();\n const { min, max } = dateLimits(field);\n if (min && max && (date < min || date > max)) return `Choose a date from ${min} to ${max}.`;\n if (min && date < min) return `Choose ${min} or later.`;\n if (max && date > max) return `Choose ${max} or earlier.`;\n return null;\n },\n normalize: (value) => (typeof value === \"string\" ? value.trim() : value),\n samples: (field) => {\n const { min, max } = dateLimits(field);\n return [min ?? max ?? \"2000-01-01\"];\n },\n },\n {\n type: \"consent\",\n label: \"Consent checkbox\",\n category: \"choice\",\n value: { json: true },\n operators: [\"answered\", \"empty\"],\n a11y: { semantics: \"group\" },\n // Unchecked is unanswered, so a required consent must be checked.\n isEmpty: (value) => value === undefined || value === null || value === false,\n validate: (value) => (value === true ? null : \"Check the box to agree.\"),\n summarize: () => \"Agreed\",\n samples: () => [true],\n },\n];\n\n/** The optional words under the ends of a rating or NPS scale (\"Poor\", \"Great\"). */\nexport function scaleLabels(field: FieldBlock): { low?: string; high?: string } {\n const out: { low?: string; high?: string } = {};\n const low = field.props?.lowLabel;\n const high = field.props?.highLabel;\n if (typeof low === \"string\" && low.trim()) out.low = low.trim();\n if (typeof high === \"string\" && high.trim()) out.high = high.trim();\n return out;\n}\n\n/** How a rating is drawn: `\"numbers\"` (default) or `\"stars\"`. */\nexport function ratingDisplay(field: FieldBlock): \"numbers\" | \"stars\" {\n return field.props?.display === \"stars\" ? \"stars\" : \"numbers\";\n}\n\nfunction scaleEndLabel(field: FieldBlock, value: number, min: number, max: number): string | undefined {\n const { low, high } = scaleLabels(field);\n return value === min ? low : value === max ? high : undefined;\n}\n\nconst finite = (v: Json | undefined): number | undefined =>\n typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n\n/** A `number` field's limits: `min`, `max` and `step` (each optional; `step` is above 0). */\nexport function numberLimits(field: FieldBlock): { min?: number; max?: number; step?: number } {\n const out: { min?: number; max?: number; step?: number } = {};\n const min = finite(field.props?.min);\n const max = finite(field.props?.max);\n const step = finite(field.props?.step);\n if (min !== undefined) out.min = min;\n if (max !== undefined) out.max = max;\n if (step !== undefined && step > 0) out.step = step;\n return out;\n}\n\n/** Whether `value` is `base` plus a whole number of `step`s, allowing for floating-point error. */\nfunction onStep(value: number, base: number, step: number): boolean {\n const n = (value - base) / step;\n return Math.abs(n - Math.round(n)) < 1e-9 * Math.max(1, Math.abs(n));\n}\n\n/** `YYYY-MM-DD`, a real calendar day (no 2026-02-30), years 0001 to 9999. */\nexport function isIsoDate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const [y, m, d] = value.split(\"-\").map(Number) as [number, number, number];\n if (y < 1 || m < 1 || m > 12 || d < 1) return false;\n const days = [31, y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n return d <= days[m - 1]!;\n}\n\n/** A `date` field's earliest and latest days (`YYYY-MM-DD`), when set. */\nexport function dateLimits(field: FieldBlock): { min?: string; max?: string } {\n const out: { min?: string; max?: string } = {};\n const min = field.props?.min;\n const max = field.props?.max;\n if (typeof min === \"string\" && isIsoDate(min)) out.min = min;\n if (typeof max === \"string\" && isIsoDate(max)) out.max = max;\n return out;\n}\n\nfor (const manifest of [...builtins, ...structuredFieldTypes, calculatedFieldType, photoFieldType]) registerFieldType(manifest);\n","/** Guards and helpers for event logs and other untrusted JSON. No dependencies. */\nimport type { FormEvent, Json } from \"./types\";\n\n/** A plain object: `{}` or `Object.create(null)`, not an array, a class instance or null. */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Whether a value is JSON: strings, finite numbers, booleans, null, arrays and\n * plain objects, nested to any depth. Iterative, so a deeply nested value\n * cannot overflow the stack.\n */\nexport function isJson(value: unknown): value is Json {\n const stack: unknown[] = [value];\n while (stack.length) {\n const v = stack.pop();\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") continue;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return false;\n continue;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) stack.push(v[i]);\n continue;\n }\n if (!isPlainObject(v)) return false;\n for (const key of Object.keys(v)) stack.push(v[key]);\n }\n return true;\n}\n\nconst EVENT_TYPES = new Set([\"answer\", \"next\", \"back\", \"submit\"]);\n\n/** Whether `value` is a well-formed `FormEvent` of a known type. */\nexport function isFormEvent(value: unknown): value is FormEvent {\n if (!isPlainObject(value) || typeof value.type !== \"string\" || !EVENT_TYPES.has(value.type)) return false;\n if (value.at !== undefined && !(typeof value.at === \"number\" && Number.isFinite(value.at))) return false;\n if (value.type !== \"answer\") return true;\n return (\n typeof value.field === \"string\" &&\n (value.value === undefined || isJson(value.value)) &&\n (value.source === undefined || value.source === \"prefill\")\n );\n}\n\n/**\n * An event of a type this version does not know, such as one a newer client\n * logs. Replays ignore these, so they are dropped rather than rejected.\n */\nexport function isUnknownEvent(value: unknown): boolean {\n return isPlainObject(value) && typeof value.type === \"string\" && !EVENT_TYPES.has(value.type);\n}\n\n/**\n * Merge consecutive answer events to the same field, keeping the last value.\n * Text inputs log one event per keystroke; the merged log replays to the same\n * state, because the path is derived from values alone.\n */\nexport function compactEvents(events: FormEvent[]): FormEvent[] {\n const out: FormEvent[] = [];\n for (const event of events) {\n const last = out[out.length - 1];\n if (event.type === \"answer\" && last?.type === \"answer\" && last.field === event.field) {\n out[out.length - 1] = event;\n } else out.push(event);\n }\n return out;\n}\n","/** Typing hidden inputs. Shared by the engine and the server, so both type them identically. */\nimport { isPlainObject } from \"./events\";\nimport type { FormDefinition, HiddenInput, Json } from \"./types\";\n\n/** Longest string a hidden input accepts. Longer values are dropped. */\nexport const MAX_HIDDEN_STRING_LENGTH = 1000;\n\n/** A plain decimal: an optional `-`, digits, and an optional fraction. */\nconst DECIMAL = /^-?\\d+(\\.\\d+)?$/;\n\nexport interface CoerceHiddenOptions {\n /** Coerce only inputs with these sources; the rest are reported in `ignored`. Default: all. */\n sources?: readonly HiddenInput[\"source\"][];\n}\n\nexport interface CoercedHidden {\n /** Declared inputs, typed. */\n values: Record<string, Json>;\n /** Names dropped: undeclared, from another source, or not convertible to the declared type. */\n ignored: string[];\n}\n\n/**\n * Convert one raw value to a hidden input's declared type, or `undefined` when\n * it cannot be. Only string, number and boolean primitives are accepted.\n * - `string`: a string (at most 1000 characters), or a number or boolean as text.\n * - `number`: a finite number, or a plain decimal string such as `\"12\"`, `\"-3\"`\n * or `\"2.5\"`. No spaces, hex, exponents or `\"\"`.\n * - `boolean`: `true`/`false`, or the strings `\"true\"`/`\"false\"`.\n */\nexport function coerceHiddenValue(value: unknown, type: HiddenInput[\"type\"]): Json | undefined {\n if (typeof value === \"string\" && value.length > MAX_HIDDEN_STRING_LENGTH) return undefined;\n if (type === \"string\") {\n if (typeof value === \"string\") return value;\n if (typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) return String(value);\n return undefined;\n }\n if (type === \"number\") {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value !== \"string\" || !DECIMAL.test(value)) return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n }\n if (typeof value === \"boolean\") return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\n/**\n * Type raw hidden inputs (from a query string, the host app or the server)\n * by the definition's declarations. `undefined` values are skipped silently.\n */\nexport function coerceHidden(\n definition: FormDefinition,\n raw: Record<string, unknown> | undefined,\n options: CoerceHiddenOptions = {},\n): CoercedHidden {\n const declared = new Map((definition.hidden ?? []).map((h) => [h.name, h]));\n const values: Record<string, Json> = {};\n const ignored: string[] = [];\n if (!isPlainObject(raw)) return { values, ignored };\n for (const name of Object.keys(raw)) {\n const value = raw[name];\n if (value === undefined) continue;\n const spec = declared.get(name);\n if (!spec || (options.sources && !options.sources.includes(spec.source))) {\n ignored.push(name);\n continue;\n }\n const coerced = coerceHiddenValue(value, spec.type);\n if (coerced === undefined) ignored.push(name);\n else Object.defineProperty(values, name, { value: coerced, enumerable: true, writable: true, configurable: true });\n }\n return { values, ignored };\n}\n","import { isEmptyValue } from \"./fields\";\nimport type { Block, Condition, FieldBlock, FormDefinition, Json, LogicRule, Operand } from \"./types\";\n\nexport interface EvalScope {\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n fields: Map<string, FieldBlock>;\n}\n\n/** `record[key]` if it is the record's own property: `values.constructor` is not an answer. */\nexport function own<T>(record: Record<string, T>, key: string): T | undefined {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction resolve(operand: Operand, scope: EvalScope): Json | undefined {\n if (\"field\" in operand) return own(scope.values, operand.field);\n if (\"hidden\" in operand) return own(scope.hidden, operand.hidden);\n return operand.value;\n}\n\nfunction deepEqual(a: Json | undefined, b: Json | undefined): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n return false;\n}\n\n/**\n * Evaluate a condition. Never throws. An empty value (unanswered, `null`,\n * blank text, an empty list: see `isEmptyValue`) is unanswered: it fails\n * every comparison, including `eq`, `in` and `contains`, and passes `neq`.\n */\nexport function evaluate(condition: Condition, scope: EvalScope): boolean {\n if (\"all\" in condition) return condition.all.every((c) => evaluate(c, scope));\n if (\"any\" in condition) return condition.any.some((c) => evaluate(c, scope));\n if (\"not\" in condition) return !evaluate(condition.not, scope);\n\n const left = resolve(condition.left, scope);\n const right = condition.right ? resolve(condition.right, scope) : undefined;\n const field = \"field\" in condition.left ? scope.fields.get(condition.left.field) : undefined;\n const unanswered = isEmptyValue(left, field);\n\n switch (condition.op) {\n case \"answered\":\n return !unanswered;\n case \"empty\":\n return unanswered;\n case \"eq\":\n return !unanswered && deepEqual(left, right);\n case \"neq\":\n // An unanswered field is \"not\" any value.\n return unanswered || !deepEqual(left, right);\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n if (typeof left !== \"number\" || typeof right !== \"number\") return false;\n if (condition.op === \"lt\") return left < right;\n if (condition.op === \"lte\") return left <= right;\n if (condition.op === \"gt\") return left > right;\n return left >= right;\n }\n case \"in\":\n return !unanswered && Array.isArray(right) && right.some((r) => deepEqual(r, left));\n case \"contains\":\n if (unanswered) return false;\n if (Array.isArray(left)) return left.some((l) => deepEqual(l, right));\n return (\n typeof left === \"string\" &&\n typeof right === \"string\" &&\n left.toLowerCase().includes(right.toLowerCase())\n );\n }\n}\n\n/** Blocks a respondent steps through: fields and content, in order. */\nexport function steps(def: FormDefinition): Block[] {\n return def.blocks.filter((b) => b.kind !== \"page-break\");\n}\n\nfunction visibilityRules(def: FormDefinition, blockId: string) {\n return (def.logic ?? []).filter(\n (r): r is Extract<LogicRule, { target: string }> =>\n (r.effect === \"show\" || r.effect === \"hide\") && r.target === blockId,\n );\n}\n\n/** Whether a field is withheld because the form is anonymous and the field identifies the respondent. */\nexport function withheld(def: FormDefinition, field: FieldBlock | undefined): boolean {\n return def.settings?.anonymous === true && field?.identifying === true;\n}\n\n/** Show/hide rules against a scope as given. A matching `hide` wins; any `show` must match. */\nfunction rulesAllow(def: FormDefinition, blockId: string, scope: EvalScope): boolean {\n if (withheld(def, scope.fields.get(blockId))) return false;\n const rules = visibilityRules(def, blockId);\n if (rules.some((r) => r.effect === \"hide\" && evaluate(r.when, scope))) return false;\n const shows = rules.filter((r) => r.effect === \"show\");\n return shows.length === 0 || shows.some((r) => evaluate(r.when, scope));\n}\n\nexport interface PathResult {\n /** Block ids the respondent will step through, given the answers on the path. */\n path: string[];\n /** The ending reached by a jump, or the default ending. */\n ending: string | null;\n}\n\nexport interface PathWalk extends PathResult {\n /**\n * The scope logic sees at a block: the values of the fields on the path\n * before it (and of the block itself, with `inclusive`), nothing else.\n */\n scopeAt(blockId: string, inclusive?: boolean): EvalScope;\n}\n\n/** One forward pass over the blocks. See `computePath`. */\nexport function walkPath(def: FormDefinition, scope: EvalScope): PathWalk {\n const list = steps(def);\n // Built only when needed: an engine walks the path on every step.\n let index: Map<string, number> | undefined;\n let position: Map<string, number> | undefined;\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 index ??= new Map(list.map((b, at) => [b.id, at]));\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 position ??= new Map(def.blocks.map((b, i) => [b.id, i]));\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","/**\n * Which options a choice question shows, and how they are picked: lists filtered by another\n * answer, search for long lists, preselecting from a link, and snapshots of what was picked.\n * Pure and renderer-agnostic, so the engine, the server and every renderer (web and native)\n * decide the same way.\n */\nimport { choiceOptions, isEmptyValue, optionsSource, readOption, type ChoiceOption } from \"./fields\";\nimport { MAX_HIDDEN_STRING_LENGTH } from \"./hidden\";\nimport { own } from \"./logic\";\nimport type { FieldBlock, FormDefinition, FormEvent, Json } from \"./types\";\n\n/** Field types whose answer is one or more of their options. */\nexport const CHOICE_FIELD_TYPES: ReadonlySet<string> = new Set([\"single-choice\", \"multi-choice\", \"dropdown\"]);\n\nconst isChoice = (block: unknown): block is FieldBlock =>\n !!block && (block as FieldBlock).kind === \"field\" && CHOICE_FIELD_TYPES.has((block as FieldBlock).type);\n\n/** Set `record[key]` as an own property, so a key such as `__proto__` is data, not a prototype. */\nfunction put<T>(record: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(record, key, { value, enumerable: true, writable: true, configurable: true });\n}\n\n// ── Filtered by another answer ───────────────────────────────────────────────\n\n/** A choice field's `props.optionsFrom.filter` (`{ attribute, field }`), when it is well formed. */\nexport function optionFilter(field: FieldBlock): { attribute: string; field: string } | undefined {\n return optionsSource(field)?.filter;\n}\n\n/** The answer's values as text: one text, each text in a list, a number or true/false as text. */\nfunction answerValues(answer: Json | undefined): string[] {\n const one = (v: Json): string[] =>\n typeof v === \"string\" ? [v] : typeof v === \"number\" || typeof v === \"boolean\" ? [String(v)] : [];\n if (answer === undefined || answer === null) return [];\n return Array.isArray(answer) ? answer.flatMap(one) : one(answer);\n}\n\n/**\n * Whether an option matches an answer on one attribute: its `attributes[attribute]` (a text or a\n * list) shares a value with the answer (a text, or a list from a multiple choice). An option\n * without the attribute matches nothing.\n */\nexport function optionMatches(option: ChoiceOption, attribute: string, answer: Json | undefined): boolean {\n const have =\n option.attributes && Object.prototype.hasOwnProperty.call(option.attributes, attribute)\n ? option.attributes[attribute]\n : undefined;\n if (have === undefined) return false;\n const wanted = answerValues(answer);\n return (Array.isArray(have) ? have : [have]).some((v) => wanted.includes(v));\n}\n\n/** The field a filter reads, by key. */\nfunction filterSource(definition: FormDefinition, key: string): FieldBlock | undefined {\n return definition.blocks.find((b): b is FieldBlock => b.kind === \"field\" && b.key === key);\n}\n\n/**\n * The options a choice question shows given the answers so far (`values`, keyed by field id, as\n * in `FormState.values`): all of `choiceOptions(field)`, or, with `props.optionsFrom.filter`,\n * only those matching the filtered-by question's answer (`optionMatches`). While that question is\n * unanswered (or isn't in the form) every option shows. Pass the definition with the host's lists\n * filled in (`engine.definition`, or `withHostOptions`).\n */\nexport function visibleOptions(\n definition: FormDefinition,\n field: FieldBlock,\n values: Readonly<Record<string, Json | undefined>>,\n): ChoiceOption[] {\n const options = choiceOptions(field);\n const filter = optionFilter(field);\n if (!filter) return options;\n const source = filterSource(definition, filter.field);\n if (!source || source.id === field.id) return options;\n const answer = own(values as Record<string, Json | undefined>, source.id);\n if (isEmptyValue(answer, source)) return options;\n return options.filter((o) => optionMatches(o, filter.attribute, answer));\n}\n\n/**\n * The answers on the respondent's path, by field id: what a filter reads. An answer to a question\n * off the path (hidden by logic, jumped over) counts as none, as it does for logic. Pass these to\n * `visibleOptions` from a renderer, so it shows exactly what the engine accepts.\n */\nexport function answersOnPath(state: {\n path: readonly string[];\n values: Readonly<Record<string, Json | undefined>>;\n}): Record<string, Json | undefined> {\n const out = Object.create(null) as Record<string, Json | undefined>;\n for (const id of state.path) out[id] = own(state.values as Record<string, Json | undefined>, id);\n return out;\n}\n\n/** The message a choice outside the filtered list gets, the same as any choice outside the options. */\nconst OUTSIDE_FILTER = \"Choose one of the options.\";\n\n/**\n * Null, or the error for a (non-empty) choice answer that is one of the question's options but\n * not one it shows now because of its filter (`visibleOptions`). A typed \"Other\" answer is left\n * to the field type's own check. The engine and `validateSubmission` both call it, so a value\n * outside the filtered list is refused on the server too.\n */\nexport function filteredChoiceError(\n definition: FormDefinition,\n field: FieldBlock,\n value: Json | undefined,\n values: Readonly<Record<string, Json | undefined>>,\n): string | null {\n if (!optionFilter(field) || isEmptyValue(value, field)) return null;\n const all = new Set(choiceOptions(field).map((o) => o.value));\n const shown = new Set(visibleOptions(definition, field, values).map((o) => o.value));\n const picked = answerValues(value as Json);\n return picked.some((v) => all.has(v) && !shown.has(v)) ? OUTSIDE_FILTER : null;\n}\n\n/** Whether any choice question in the definition filters its options by another answer. */\nexport function hasOptionFilters(definition: FormDefinition): boolean {\n return definition.blocks.some((b) => isChoice(b) && optionFilter(b) !== undefined);\n}\n\n/**\n * `values` after the answer to `changedId` changed, with every choice its filter no longer\n * shows taken out: a single choice or dropdown is cleared, a multiple choice keeps the options\n * that still show (and a typed \"Other\" answer). It follows on: clearing one question clears what\n * was filtered by it. Returns `values` itself when nothing is cleared. The engine calls it on\n * every answer, so a pick never outlives the answer it depended on.\n */\nexport function clearFilteredAnswers(\n definition: FormDefinition,\n values: Record<string, Json | undefined>,\n changedId: string,\n): Record<string, Json | undefined> {\n const changed = definition.blocks.find((b): b is FieldBlock => b.kind === \"field\" && b.id === changedId);\n if (!changed) return values;\n const keys = new Set([changed.key]);\n let out = values;\n // In form order: `parseForm` requires a filtered-by question to come earlier, so one pass\n // reaches everything that follows on.\n for (const block of definition.blocks) {\n if (!isChoice(block)) continue;\n const filter = optionFilter(block);\n if (!filter || !keys.has(filter.field)) continue;\n const value = own(out, block.id);\n if (value === undefined || isEmptyValue(value, block)) continue;\n const all = new Set(choiceOptions(block).map((o) => o.value));\n const shown = new Set(visibleOptions(definition, block, out).map((o) => o.value));\n const keep = (v: Json) => typeof v !== \"string\" || !all.has(v) || shown.has(v);\n let next: Json | undefined = value;\n if (Array.isArray(value)) {\n const kept = value.filter(keep);\n if (kept.length !== value.length) next = kept.length ? kept : undefined;\n } else if (!keep(value)) next = undefined;\n if (next === value) continue;\n if (out === values) out = { ...values };\n put(out, block.id, next);\n keys.add(block.key);\n }\n return out;\n}\n\n// ── Search ───────────────────────────────────────────────────────────────────\n\n/** A choice question with more options than this gets a search box, unless `props.searchable` says otherwise. */\nexport const SEARCHABLE_OPTION_COUNT = 10;\n\n/**\n * Whether a choice question shows a search box over its options: `props.searchable` when it is\n * true or false, otherwise when it has more than `SEARCHABLE_OPTION_COUNT` options. The default\n * counts all its options (`choiceOptions(field)`, with the host's lists filled in), so a list a\n * filter narrows keeps its search box while the respondent answers.\n */\nexport function isSearchable(field: FieldBlock, optionCount: number = choiceOptions(field).length): boolean {\n const setting = field.props?.searchable;\n if (setting === true || setting === false) return setting;\n return optionCount > SEARCHABLE_OPTION_COUNT;\n}\n\n/** Lower case without accents, so \"Zoe\" finds \"Zoë\". */\nfunction fold(text: string): string {\n return text.normalize(\"NFD\").replace(/[̀-ͯ]/g, \"\").toLowerCase();\n}\n\n/**\n * The options that match what the respondent typed, in their order: every word of `query` is\n * found (ignoring case and accents) in the option's label, value or description. A blank query\n * matches every option.\n */\nexport function searchOptions(options: readonly ChoiceOption[], query: string): ChoiceOption[] {\n const words = fold(query).split(/\\s+/).filter(Boolean);\n if (!words.length) return [...options];\n return options.filter((o) => {\n const text = fold([o.label ?? \"\", o.value, o.description ?? \"\"].join(\" \"));\n return words.every((w) => text.includes(w));\n });\n}\n\n// ── Preselect from a link ────────────────────────────────────────────────────\n\n/** Characters in a link parameter's name. */\nexport const MAX_PREFILL_PARAM_LENGTH = 64;\n\n/** A choice question's `props.prefill`: the link parameter that preselects it, and whether it is then hidden. */\nexport interface PrefillSetting {\n /** The query parameter, as in `?location=cornerstone`. */\n param: string;\n /** Skip the question while the link has filled it in. */\n hideWhenPrefilled: boolean;\n}\n\n/** A well-formed parameter name: letters, digits, `_`, `-` and `.`, at most `MAX_PREFILL_PARAM_LENGTH`. */\nexport function isPrefillParam(param: unknown): param is string {\n return typeof param === \"string\" && param.length <= MAX_PREFILL_PARAM_LENGTH && /^[A-Za-z0-9_.-]+$/.test(param);\n}\n\n/** A choice field's `props.prefill` (`{ param, hideWhenPrefilled? }`), when it is well formed. */\nexport function prefillSetting(field: FieldBlock): PrefillSetting | undefined {\n if (!CHOICE_FIELD_TYPES.has(field.type)) return undefined;\n const raw = field.props?.prefill;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw) || !isPrefillParam(raw.param)) return undefined;\n return { param: raw.param, hideWhenPrefilled: raw.hideWhenPrefilled === true };\n}\n\n/**\n * A link's query parameters: a `URLSearchParams` (or anything with `getAll`), or a plain record\n * of a text or a list of texts per name.\n */\nexport type LinkParams =\n | { getAll(name: string): string[] }\n | Readonly<Record<string, string | readonly string[] | undefined>>;\n\nfunction paramValues(params: LinkParams, name: string): string[] {\n let raw: unknown;\n if (typeof (params as { getAll?: unknown }).getAll === \"function\") {\n raw = (params as { getAll(name: string): string[] }).getAll(name);\n } else if (Object.prototype.hasOwnProperty.call(params, name)) {\n raw = (params as Record<string, unknown>)[name];\n }\n const list: unknown[] = Array.isArray(raw) ? raw : raw === undefined ? [] : [raw];\n return list.filter((v): v is string => typeof v === \"string\" && v !== \"\" && v.length <= MAX_HIDDEN_STRING_LENGTH);\n}\n\n/**\n * Answers a link preselects, by field id, for `createForm`'s `initialValues` (its `linkParams`\n * option calls this). Each choice question with `props.prefill: { param }` takes the parameter's\n * value when it is one of the options the question shows (`visibleOptions`, so a filtered list is\n * respected); anything else is ignored. A multiple choice takes every matching value, from\n * repeated parameters (`?coach=a&coach=b`) or one comma-separated value. Questions are filled in\n * form order, so a filtered question sees what the link picked before it. A question `values`\n * already answers (the host's own prefill) is left alone. The server checks these like any answer.\n */\nexport function prefillFromLink(\n definition: FormDefinition,\n params: LinkParams | undefined,\n values: Readonly<Record<string, Json | undefined>> = {},\n): Record<string, Json> {\n const out: Record<string, Json> = {};\n if (!params || typeof params !== \"object\") return out;\n const seen: Record<string, Json | undefined> = {};\n for (const id of Object.keys(values)) put(seen, id, values[id]);\n for (const block of definition.blocks) {\n if (!isChoice(block)) continue;\n const setting = prefillSetting(block);\n if (!setting || own(seen, block.id) !== undefined) continue;\n const raw = paramValues(params, setting.param);\n if (!raw.length) continue;\n const shown = new Set(visibleOptions(definition, block, seen).map((o) => o.value));\n let value: Json | undefined;\n if (block.type === \"multi-choice\") {\n const picked: string[] = [];\n for (const r of raw) {\n for (const v of shown.has(r) ? [r] : r.split(\",\").map((s) => s.trim())) {\n if (shown.has(v) && !picked.includes(v)) picked.push(v);\n }\n }\n if (picked.length) value = picked;\n } else value = raw.find((v) => shown.has(v));\n if (value === undefined) continue;\n put(out, block.id, value);\n put(seen, block.id, value);\n }\n return out;\n}\n\n/** The parts of a form's state `hiddenByPrefill` reads (a `FormState` has them all). */\nexport interface PrefillState {\n path: readonly string[];\n values: Readonly<Record<string, Json | undefined>>;\n errors: Readonly<Record<string, string>>;\n events: readonly FormEvent[];\n}\n\n/**\n * Questions on the path the respondent skips because a prefill answered them: those with\n * `props.prefill.hideWhenPrefilled` whose answer is still the prefilled one (the last answer\n * event for them came from `initialValues` or a link) and has no error. The engine steps over\n * them and renderers leave them out; their answers are stored like any other. A question shows\n * again once its answer is cleared or changed (by a filter, say).\n */\nexport function hiddenByPrefill(definition: FormDefinition, state: PrefillState): string[] {\n const hideable = new Set<string>();\n for (const b of definition.blocks) {\n if (isChoice(b) && prefillSetting(b)?.hideWhenPrefilled) hideable.add(b.id);\n }\n if (!hideable.size) return [];\n const prefilled = new Set<string>();\n for (const e of state.events) {\n if (e.type !== \"answer\" || !hideable.has(e.field)) continue;\n if (e.source === \"prefill\") prefilled.add(e.field);\n else prefilled.delete(e.field);\n }\n if (!prefilled.size) return [];\n const fields = new Map(definition.blocks.map((b) => [b.id, b]));\n return state.path.filter((id) => {\n if (!prefilled.has(id) || own(state.errors as Record<string, string>, id) !== undefined) return false;\n const field = fields.get(id) as FieldBlock;\n return !isEmptyValue(own(state.values as Record<string, Json | undefined>, id), field);\n });\n}\n\n/** The blocks the respondent steps through: the path without the questions a prefill hides (`hiddenByPrefill`). */\nexport function respondentPath(definition: FormDefinition, state: PrefillState): string[] {\n const hidden = hiddenByPrefill(definition, state);\n if (!hidden.length) return [...state.path];\n const skip = new Set(hidden);\n return state.path.filter((id) => !skip.has(id));\n}\n\n// ── Answer snapshots ─────────────────────────────────────────────────────────\n\n/** One picked option as it was when the response was stored: its value (an id) and its label then. */\nexport interface OptionSnapshot {\n value: string;\n label: string;\n /** A typed \"Other\" answer rather than one of the options. */\n other?: true;\n}\n\n/** A choice answer's snapshot: one pick (single choice, dropdown) or a list (multiple choice). */\nexport type AnswerSnapshot = OptionSnapshot | OptionSnapshot[];\n\nfunction snapshotOf(byValue: Map<string, ChoiceOption>, value: string): OptionSnapshot {\n const option = byValue.get(value);\n if (option) return { value, label: option.label ?? value };\n return { value, label: value, other: true };\n}\n\n/**\n * Each answer to a choice question that takes options from the app (`props.optionsFrom`), as\n * `{ value, label }` pairs as of now, by field id: store them beside the answers so reports\n * group by the value (an id) while history keeps the name it had then. Pass the definition with\n * the host's lists filled in (`withHostOptions`, or `engine.definition`) and the checked\n * answers (`validateSubmission`'s `submission.answers`). A value that isn't one of the options\n * keeps itself as its label, marked `other` (a typed \"Other\" answer).\n */\nexport function answerSnapshots(\n definition: FormDefinition,\n answers: Readonly<Record<string, Json | undefined>>,\n): Record<string, AnswerSnapshot> {\n const out: Record<string, AnswerSnapshot> = {};\n for (const block of definition.blocks) {\n if (!isChoice(block) || !optionsSource(block)) continue;\n const value = own(answers as Record<string, Json | undefined>, block.id);\n if (isEmptyValue(value, block)) continue;\n const byValue = new Map(choiceOptions(block).map((o) => [o.value, o]));\n let snapshot: AnswerSnapshot | undefined;\n if (Array.isArray(value)) {\n const items = value.filter((v): v is string => typeof v === \"string\").map((v) => snapshotOf(byValue, v));\n if (items.length) snapshot = items;\n } else if (typeof value === \"string\") snapshot = snapshotOf(byValue, value);\n if (snapshot) put(out, block.id, snapshot);\n }\n return out;\n}\n\n/** What `answersFromSnapshots` found again. */\nexport interface RestoredAnswers {\n /** Answers by field id, for `initialValues`: each pick's current value. */\n answers: Record<string, Json>;\n /** Picks no longer offered, by field id: the option was removed and no option has its label now. */\n missing: Record<string, OptionSnapshot[]>;\n}\n\n/**\n * The reverse of `answerSnapshots`, for an edit link: the answers to prefill from stored\n * snapshots. A pick whose value is still an option keeps it; otherwise an option with the same\n * label (ignoring case and accents) stands in, such as a location deleted and added again; a\n * typed \"Other\" answer stays one when the question still allows it. Anything else is reported\n * in `missing` and left out. Pass the definition with the host's current lists filled in.\n */\nexport function answersFromSnapshots(\n definition: FormDefinition,\n snapshots: Readonly<Record<string, unknown>>,\n): RestoredAnswers {\n const answers: Record<string, Json> = {};\n const missing: Record<string, OptionSnapshot[]> = {};\n for (const block of definition.blocks) {\n if (!isChoice(block)) continue;\n const raw = own(snapshots as Record<string, unknown>, block.id);\n const list = (Array.isArray(raw) ? raw : raw === undefined ? [] : [raw]).flatMap((s): OptionSnapshot[] => {\n const o = readOption(s);\n if (!o) return [];\n const label = o.label ?? o.value;\n return [(s as { other?: unknown }).other === true ? { value: o.value, label, other: true } : { value: o.value, label }];\n });\n if (!list.length) continue;\n const options = choiceOptions(block);\n const byValue = new Set(options.map((o) => o.value));\n const allowsOther = block.props?.other !== undefined && block.props?.other !== false;\n const found: string[] = [];\n const lost: OptionSnapshot[] = [];\n for (const s of list) {\n let value: string | undefined;\n if (byValue.has(s.value)) value = s.value;\n else if (s.other) value = allowsOther ? s.value : undefined;\n else value = options.find((o) => fold(o.label ?? o.value) === fold(s.label))?.value;\n if (value === undefined) lost.push(s);\n else if (!found.includes(value)) found.push(value);\n }\n if (found.length) put(answers, block.id, block.type === \"multi-choice\" ? (found as Json) : found[0]!);\n if (lost.length) put(missing, block.id, lost);\n }\n return { answers, missing };\n}\n","import { summarizeValue } from \"./fields\";\nimport { own } from \"./logic\";\nimport type { FieldBlock, Json } from \"./types\";\n\nconst TOKEN = /\\{\\{\\s*(field|hidden):([A-Za-z0-9_-]+)\\s*(?:\\|([^}]*))?\\}\\}/g;\n\nexport interface RecallScope {\n /** Fields by key. */\n fieldsByKey: Map<string, FieldBlock>;\n values: Record<string, Json | undefined>;\n hidden: Record<string, Json | undefined>;\n}\n\n/**\n * Replace `{{field:key|fallback}}` and `{{hidden:name|fallback}}` tokens.\n * An unanswered value renders its fallback (default empty); the text is\n * never dropped.\n */\nexport function recall(text: string, scope: RecallScope): string {\n return text.replace(TOKEN, (_match, kind: string, name: string, fallback?: string) => {\n if (kind === \"field\") {\n const field = scope.fieldsByKey.get(name);\n const out = field ? summarizeValue(own(scope.values, field.id), field) : \"\";\n return out || (fallback ?? \"\").trim();\n }\n const value = own(scope.hidden, name);\n const out = value === undefined || value === null ? \"\" : String(value);\n return out || (fallback ?? \"\").trim();\n });\n}\n\n/** The keys a text recalls, for the checker. */\nexport function recallRefs(text: string): { kind: \"field\" | \"hidden\"; name: string }[] {\n return [...text.matchAll(TOKEN)].map((m) => ({ kind: m[1] as \"field\" | \"hidden\", name: m[2]! }));\n}\n","import { CALCULATED_TYPE } from \"./calculated\";\nimport { getFieldType, isEmptyValue } from \"./fields\";\nimport type { FieldBlock, Json } from \"./types\";\n\n/** The Standard Schema interface (standardschema.dev), as far as validation needs it. */\nexport interface StandardSchemaV1<T = unknown> {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) =>\n | { value: T; issues?: undefined }\n | { issues: ReadonlyArray<{ message: string }> }\n | Promise<unknown>;\n };\n}\n\n/** A custom check for one field: a function, or any Standard Schema (Zod, Valibot, ArkType…). */\nexport type FieldValidator = ((value: Json) => string | null) | StandardSchemaV1;\n\nexport const REQUIRED_MESSAGE = \"This question needs an answer.\";\n\nfunction runCustom(validator: FieldValidator, value: Json): string | null {\n if (typeof validator === \"function\") return validator(value);\n const result = validator[\"~standard\"].validate(value);\n if (result instanceof Promise) {\n throw new Error(\"Async validators are not supported in the engine yet; run them on the server.\");\n }\n const issues = (result as { issues?: ReadonlyArray<{ message: string }> }).issues;\n return issues?.length ? issues[0]!.message : null;\n}\n\n/**\n * Validate one field's value. `requireAnswers: false` (drafts) checks the\n * format of what was answered without requiring the rest.\n */\nexport function validateField(\n field: FieldBlock,\n value: Json | undefined,\n options: { requireAnswers?: boolean; custom?: FieldValidator } = {},\n): string | null {\n if (isEmptyValue(value, field)) {\n // A calculated field is worked out, not answered, so it is never required.\n return field.required && field.type !== CALCULATED_TYPE && options.requireAnswers !== false ? REQUIRED_MESSAGE : null;\n }\n const manifest = getFieldType(field.type);\n // A type with no manifest cannot say what a valid answer is, so none is accepted.\n if (!manifest) return `Unknown field type \"${field.type}\".`;\n const builtIn = manifest.validate?.(value as Json, field) ?? null;\n if (builtIn) return builtIn;\n return options.custom ? runCustom(options.custom, value as Json) : null;\n}\n","import { calculator, isCalculated, spend, workStats, type WorkBudget } from \"./calculated\";\nimport { isEmptyValue, normalizeValue, withHostOptions, type HostOptions } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { computePath, fieldMap, own, type EvalScope } from \"./logic\";\nimport {\n answersOnPath,\n clearFilteredAnswers,\n filteredChoiceError,\n hasOptionFilters,\n hiddenByPrefill,\n prefillFromLink,\n type LinkParams,\n} from \"./options\";\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 /**\n * The furthest block reached by moving on (`next`), kept after going back;\n * the first block until then. `formProgress` reads it.\n */\n furthest: string | null;\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 * Pick up where the respondent was (with `initialValues` holding their saved\n * answers): a block id, usually `formProgress`'s `fieldId` from an earlier\n * visit. The form moves on from the first block with Next, as they did, until\n * it reaches this one, so Back still walks their path; it stops early at a\n * step that no longer passes (a question since made required), and does\n * nothing when the block isn't on the path.\n */\n resumeAt?: string | null | undefined;\n /**\n * The option lists this app supplies, by key, for choice fields with\n * `props.optionsFrom: { source: \"host\", key }` (see `withHostOptions`).\n * `engine.definition` is the definition with them filled in, so renderers\n * show them and validation accepts only them (and the field's own options).\n * Pass the same lists to `validateSubmission` on the server.\n */\n hostOptions?: HostOptions | undefined;\n /**\n * The query parameters of the link the form was opened from (a `URLSearchParams` or a record).\n * Choice questions with `props.prefill: { param }` take their parameter's value when it is one\n * of their options (`prefillFromLink`); `initialValues` win over the link. A question with\n * `props.prefill.hideWhenPrefilled` is then stepped over (`hiddenByPrefill`).\n */\n linkParams?: LinkParams | undefined;\n}\n\nexport interface FormEngine {\n /** The definition being filled in, with `hostOptions` filled in (`withHostOptions`). */\n readonly definition: FormDefinition;\n getState(): FormState;\n subscribe(listener: () => void): () => void;\n /** A field's id, from its key. */\n idOf(key: string): string;\n field(id: string): FieldBlock | undefined;\n block(id: string): Block | undefined;\n isVisible(id: string): boolean;\n /**\n * Set an answer. Like `next`, `back` and `submit`, it does nothing once the\n * response is completed: a completed response is final, so its stored\n * answers are the ones that were validated. It does nothing for a\n * `calculated` field either: the engine works that value out.\n */\n setValue(id: string, value: Json | undefined): void;\n /** Validate the current step and move on. Returns false if it has errors. */\n next(): boolean;\n back(): void;\n /** Validate every visible field and complete. Returns false if it has errors or is already completed. */\n submit(): boolean;\n /** Text with `{{recall}}` tokens resolved. */\n text(template: string): string;\n /** Visible, non-empty field values only, keyed by id: what a submit stores. */\n answers(): Record<string, Json>;\n}\n\n/** Whether any `field` operand under `node` (logic rules) names one of `ids`. */\nfunction readsAny(node: unknown, ids: ReadonlySet<string>): boolean {\n if (Array.isArray(node)) return node.some((n) => readsAny(n, ids));\n if (!node || typeof node !== \"object\") return false;\n for (const [k, v] of Object.entries(node)) {\n if (k === \"field\" && typeof v === \"string\" && ids.has(v)) return true;\n if (typeof v === \"object\" && readsAny(v, ids)) return true;\n }\n return false;\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(given: FormDefinition, options: CreateFormOptions, replaying = false, budget?: WorkBudget): Built {\n const definition = withHostOptions(given, options.hostOptions);\n const fields = fieldMap(definition);\n const byKey = new Map([...fields.values()].map((f) => [f.key, f]));\n const blocks = new Map(definition.blocks.map((b) => [b.id, b]));\n // An anonymous form records no timestamps, whatever clock is passed.\n const clock = definition.settings?.anonymous === true ? () => undefined : (options.clock ?? (() => Date.now()));\n const listeners = new Set<() => void>();\n // While replaying, events are pushed onto one array instead of copied per\n // event, so a long log replays in linear time.\n let batch = replaying;\n\n const scopeOf = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]): EvalScope => ({\n values,\n hidden,\n fields,\n });\n\n // Declared inputs are typed exactly as the server types them; undeclared\n // names pass through (logic and recall cannot reference them).\n const declared = new Set((definition.hidden ?? []).map((h) => h.name));\n const initialHidden: FormState[\"hidden\"] = {};\n for (const [name, value] of Object.entries(options.hidden ?? {})) {\n if (!declared.has(name)) initialHidden[name] = value;\n }\n Object.assign(initialHidden, coerceHidden(definition, options.hidden).values);\n\n // Calculated fields are worked out from the answers on the path, and logic\n // may read them, so the two settle together (a few rounds at most).\n const calc = calculator(definition, budget);\n // Each walk of the path costs one unit per block, against the same budget.\n const pathOf = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]) => {\n spend(budget, definition.blocks.length);\n return computePath(definition, scopeOf(values, hidden));\n };\n // When no rule reads a calculated field, the path doesn't depend on the\n // calculated values, so one round is enough.\n const logicReadsCalculated = calc.active && readsAny(definition.logic, calc.ids);\n const settle = (values: FormState[\"values\"], hidden: FormState[\"hidden\"]) => {\n let { path } = pathOf(values, hidden);\n if (!calc.active) return { values, path };\n if (!logicReadsCalculated) return { values: calc.withCalculated(values, path), path };\n for (let round = 0; round < 4; round++) {\n const next = calc.withCalculated(values, path);\n if (next === values) break;\n values = next;\n const again = pathOf(values, hidden).path;\n // The same path: the values just worked out read the same answers, so they stand.\n const same = again.length === path.length && again.every((id, i) => id === path[i]);\n path = again;\n if (same) break;\n }\n return { values, path };\n };\n\n const first = settle({}, initialHidden);\n let state: FormState = {\n values: first.values,\n hidden: initialHidden,\n path: first.path,\n current: first.path[0] ?? null,\n history: [],\n furthest: first.path[0] ?? null,\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 // Lists filtered by another answer: a choice the filter no longer shows is cleared when that\n // answer changes, and refused if it is set anyway.\n const filters = hasOptionFilters(definition);\n const clearFiltered = (values: FormState[\"values\"], id: string) =>\n filters ? clearFilteredAnswers(definition, values, id) : values;\n\n const errorsFor = (s: FormState, ids: string[]) => {\n const errors: Record<string, string> = {};\n let shown: FormState[\"values\"] | undefined;\n for (const id of ids) {\n const field = fields.get(id);\n if (!field || !isVisibleIn(s, id)) continue;\n const value = own(s.values, id);\n let message = validateField(field, value, { custom: options.validators?.[id] });\n if (!message && filters) message = filteredChoiceError(definition, field, value, (shown ??= answersOnPath(s)));\n if (message) errors[id] = message;\n }\n return errors;\n };\n\n // Questions a prefill answered and hides are stepped over, not shown.\n const skipped = (s: FormState) => new Set(hiddenByPrefill(definition, s));\n /** The first block on the path from `from` (inclusive) the respondent sees, or undefined. */\n const shownFrom = (s: FormState, from: number, skip: Set<string>) => {\n for (let i = from; i < s.path.length; i++) if (!skip.has(s.path[i]!)) return s.path[i];\n return undefined;\n };\n /** Move off a block a prefill hides, onto the next one shown (no event: it follows from the prefill). */\n const showCurrent = () => {\n if (!state.current) return;\n const skip = skipped(state);\n if (!skip.has(state.current)) return;\n const at = state.path.indexOf(state.current);\n const shown = at < 0 ? undefined : shownFrom(state, at, skip);\n if (shown) state = { ...state, current: shown, furthest: state.furthest === state.current ? shown : state.furthest };\n };\n\n // While replaying, answers only record the value: the path and calculated\n // fields are settled once, before the next step that reads them\n // (`next`, `back`, `submit`, or the end of the replay), not once per event.\n // When no rule reads a calculated field, a step needs only the path, so the\n // formulas wait for a step that reads their values (`submit`, the end, or\n // `next` on a calculated field) and run once there.\n let unsettled = false;\n let formulasStale = false;\n const settleNow = (needValues = true) => {\n if (unsettled && calc.active && !logicReadsCalculated && !needValues) {\n unsettled = false;\n formulasStale = true;\n state = { ...state, path: pathOf(state.values, state.hidden).path };\n return;\n }\n if (unsettled) {\n unsettled = false;\n formulasStale = false;\n const { values, path } = settle(state.values, state.hidden);\n state = { ...state, values, path };\n } else if (formulasStale && needValues) {\n formulasStale = false;\n state = { ...state, values: calc.withCalculated(state.values, state.path) };\n }\n };\n\n const answer = (id: string, value: Json | undefined, event: FormEvent) => {\n if (state.status === \"completed\" || isCalculated(fields.get(id))) return;\n if (own(state.values, id) === value) {\n // The same list or table again may have been changed in place: work it out afresh.\n if (value === null || typeof value !== \"object\") return;\n calc.forget(value);\n }\n const errors = { ...state.errors };\n delete errors[id];\n if (batch) {\n // `state` is not seen by anyone until the replay ends, so it is updated in place.\n state.values = clearFiltered({ ...state.values, [id]: value }, id);\n state.errors = errors;\n log(event);\n unsettled = true;\n return;\n }\n const { values, path } = settle(clearFiltered({ ...state.values, [id]: value }, id), state.hidden);\n emit({ ...state, values, path, errors, events: log(event) });\n };\n\n const engine: FormEngine = {\n definition,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n idOf(key) {\n const field = byKey.get(key);\n if (!field) throw new Error(`No field with key \"${key}\".`);\n return field.id;\n },\n field: (id) => fields.get(id),\n block: (id) => blocks.get(id),\n isVisible: (id) => isVisibleIn(state, id),\n\n setValue(id, value) {\n if (!fields.has(id)) throw new Error(`No field \"${id}\".`);\n answer(id, value, stamp({ type: \"answer\", field: id, value }));\n },\n\n next() {\n if (!state.current || state.status === \"completed\") return false;\n const errors = errorsFor(state, [state.current]);\n // A failed attempt is logged too, so a replay shows the same errors.\n const events = log(stamp({ type: \"next\" as const }));\n if (Object.keys(errors).length) {\n emit({ ...state, errors: { ...state.errors, ...errors }, events });\n return false;\n }\n const at = state.path.indexOf(state.current);\n const target = shownFrom(state, at + 1, skipped(state));\n if (!target) {\n emit({ ...state, events });\n return true;\n }\n const furthest =\n state.furthest && state.path.indexOf(state.furthest) >= state.path.indexOf(target) ? state.furthest : target;\n emit({ ...state, current: target, history: [...state.history, state.current], furthest, events });\n return true;\n },\n\n back() {\n if (state.status === \"completed\") return;\n const history = [...state.history];\n const skip = skipped(state);\n let previous = history.pop();\n while (previous && (!state.path.includes(previous) || skip.has(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 } = pathOf(state.values, state.hidden);\n emit({ ...state, errors: {}, status: \"completed\", ending, events });\n return true;\n },\n\n text: (template) =>\n recall(template, { fieldsByKey: byKey, values: state.values, hidden: state.hidden }),\n\n answers() {\n const out: Record<string, Json> = {};\n for (const id of state.path) {\n const field = fields.get(id);\n const value = own(state.values, id);\n // An empty answer (`\"\"`, blank text, `[]`) is stored as no answer.\n if (field && !isEmptyValue(value, field)) out[id] = normalizeValue(value as Json, field);\n }\n return out;\n },\n };\n\n // Prefilled answers are logged as leading `answer` events, so a replay of\n // the log, and the server, see them too. They settle once, like a replay.\n // A link's preselections come first; the host's own `initialValues` win over them.\n const fromLink = options.linkParams ? prefillFromLink(definition, options.linkParams, options.initialValues) : {};\n const initialValues = Object.keys(fromLink).length ? { ...fromLink, ...options.initialValues } : options.initialValues;\n if (initialValues) {\n const wasBatch = batch;\n batch = true;\n for (const [id, value] of Object.entries(initialValues)) {\n if (!fields.has(id) || value === undefined) continue;\n answer(id, value, stamp({ type: \"answer\", field: id, value, source: \"prefill\" }));\n }\n settleNow();\n batch = wasBatch;\n showCurrent();\n }\n\n // Resuming: Next from the first block to the saved one, at most once per block.\n const resumeAt = options.resumeAt;\n if (resumeAt && !replaying && state.path.includes(resumeAt)) {\n for (let i = 0; i < state.path.length && state.current !== resumeAt; i++) {\n if (!engine.next()) {\n // The step that stopped it is on screen without its errors: nothing was typed yet.\n state = { ...state, errors: {} };\n break;\n }\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\") {\n settleNow(false);\n showCurrent();\n if (formulasStale && isCalculated(fields.get(state.current ?? \"\"))) settleNow(true);\n engine.next();\n } else if (event.type === \"back\") {\n settleNow(false);\n showCurrent();\n engine.back();\n } else if (event.type === \"submit\") {\n settleNow();\n showCurrent();\n engine.submit();\n }\n // Unknown event types are ignored.\n };\n const finish = () => {\n settleNow();\n showCurrent();\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\" | \"linkParams\"> = {},\n): FormEngine {\n return replayWithin(definition, events, options);\n}\n\n/**\n * `replay`, throwing `ReplayWorkExceeded` once walking the path and working\n * out the calculated fields take more than `maxWork` (for\n * `validateSubmission`; not exported from the package).\n */\nexport function replayWithin(\n definition: FormDefinition,\n events: FormEvent[],\n options: Omit<CreateFormOptions, \"clock\" | \"initialValues\" | \"linkParams\">,\n maxWork?: number,\n): FormEngine {\n const budget = maxWork === undefined ? undefined : { used: 0, max: maxWork };\n const { engine, apply, finish } = build(\n definition,\n { ...options, initialValues: undefined, linkParams: undefined, clock: () => undefined },\n true,\n budget,\n );\n try {\n for (const event of events) apply(event);\n finish();\n } finally {\n if (budget) workStats.lastReplayWork = budget.used;\n }\n // The limit is on the replay. What follows (a submit, `answers()`) settles\n // at most once, so it is not counted and never throws.\n if (budget) budget.max = Infinity;\n return engine;\n}\n","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","/**\n * Symbolic path coverage. Each field gets a small finite domain (its valid\n * values, \"unanswered\" when allowed, and boundary values pulled from the\n * conditions); a depth-first search answers the fields in path order, so only\n * combinations a respondent could actually produce are explored.\n */\nimport { CALCULATED_TYPE } from \"./calculated\";\nimport { canonicalJson } from \"./hash\";\nimport { choiceOptions, getFieldType, isEmptyValue } from \"./fields\";\nimport { evaluate, fieldMap, steps, walkPath, type EvalScope, type PathWalk } from \"./logic\";\nimport type { Condition, FieldBlock, FormDefinition, Json } from \"./types\";\nimport { validateField } from \"./validate\";\n\nexport interface CoverageOptions {\n /** Stop after this many explored states and report `truncated`. Default 5000. */\n maxStates?: number;\n /** Fix the hidden inputs instead of enumerating the values the logic compares them with. */\n hidden?: Record<string, Json>;\n /** Most options of a multi-choice field to try one by one. Default 12. */\n maxOptions?: number;\n}\n\nexport interface EndingCoverage {\n reached: boolean;\n /** Answers (by key) of one completed response that reaches this ending. */\n witness?: Record<string, Json>;\n /** Hidden inputs that witness needs, when the logic reads any. */\n witnessHidden?: Record<string, Json>;\n /**\n * Set when coverage found this ending only on paths through required fields\n * with no sample value (a plugin type without `samples`), so it could not\n * build a completed response: the keys of those fields. `reached` stays false.\n */\n needsSamples?: string[];\n}\n\nexport interface CoverageReport {\n endings: Record<string, EndingCoverage>;\n /** Keys (or block ids, for content) of blocks no completed response steps through. */\n unreachableBlocks: string[];\n /** Rules whose condition never held in a completed response (a jump also needs its `from` on the path). */\n rulesNeverFired: string[];\n /** Keys of fields coverage had no valid answer for: give their type `samples`. */\n unsampledFields: string[];\n /** Completed responses explored. */\n pathsExplored: number;\n truncated: boolean;\n}\n\ntype Value = Json | undefined;\n\n/**\n * One value to try for a field. `placeholder` marks a stand-in for a required\n * answer with no known valid value: it steers the logic down each branch, but\n * a path through it is not a response anyone could submit.\n */\ninterface Candidate {\n value: Value;\n placeholder?: true;\n}\n\n/** A non-empty stand-in answer, so `answered` branches are explored too. */\nconst SOME_ANSWER: Json = { \"genesis-forms/unsampled\": true };\n\n/** Values each field or hidden input is compared with, anywhere in the logic. */\nfunction boundaries(def: FormDefinition) {\n const fields = new Map<string, Value[]>();\n const hidden = new Map<string, Value[]>();\n const add = (map: Map<string, Value[]>, name: string, values: Value[]) =>\n map.set(name, [...(map.get(name) ?? []), ...values]);\n const visit = (c: Condition) => {\n if (\"all\" in c) return c.all.forEach(visit);\n if (\"any\" in c) return c.any.forEach(visit);\n if (\"not\" in c) return visit(c.not);\n const right = c.right && \"value\" in c.right ? c.right.value : undefined;\n let values: Value[] = [];\n if (typeof right === \"number\") values = [right - 1, right, right + 1];\n else if (Array.isArray(right) && c.op === \"in\") values = right;\n else if (right !== undefined) values = [right];\n if (\"field\" in c.left) add(fields, c.left.field, values);\n else if (\"hidden\" in c.left) add(hidden, c.left.hidden, [undefined, ...values]);\n };\n for (const rule of def.logic ?? []) visit(rule.when);\n return { fields, hidden };\n}\n\nfunction dedupe(values: Value[]): Value[] {\n const seen = new Set<string>();\n return values.filter((v) => {\n const k = v === undefined ? \"\\u0000undefined\" : canonicalJson(v);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\nfunction domainOf(field: FieldBlock, extra: Value[], maxOptions: number): Candidate[] {\n // A calculated value is worked out, not answered: blank, or any value the\n // logic compares it with (assuming the answers before it can produce that).\n if (field.type === CALCULATED_TYPE) return dedupe([undefined, ...extra]).map((value) => ({ value }));\n const options = choiceOptions(field).map((o) => o.value);\n let base: Value[];\n switch (field.type) {\n case \"rating\": {\n const max = typeof field.props?.max === \"number\" ? field.props.max : 5;\n base = Array.from({ length: max }, (_, i) => i + 1);\n break;\n }\n case \"nps\":\n base = Array.from({ length: 11 }, (_, i) => i);\n break;\n case \"yes-no\":\n base = [true, false];\n break;\n case \"single-choice\":\n case \"dropdown\":\n base = options;\n break;\n case \"multi-choice\": {\n const singles = options.slice(0, maxOptions).map((o) => [o]);\n base = [...singles, options];\n // `contains` compares with a single option: try each as a one-item answer.\n extra = extra.map((v) => (typeof v === \"string\" ? [v] : v));\n break;\n }\n case \"list\":\n base = getFieldType(field.type)?.samples?.(field) ?? [];\n // `contains` compares with one item: try each as a one-item list.\n extra = extra.map((v) => (typeof v === \"string\" ? [v] : v));\n break;\n case \"email\":\n base = [\"ada@example.com\"];\n break;\n case \"phone\":\n base = [\"+1 555 010 0199\"];\n break;\n case \"short-text\":\n case \"long-text\":\n base = [\"sample\"];\n break;\n default:\n base = getFieldType(field.type)?.samples?.(field) ?? [];\n }\n // Unanswered first, so witnesses stay as short as possible.\n const candidates = dedupe([undefined, ...base, ...extra]);\n const valid = candidates.filter((v) => validateField(field, v) === null);\n const domain: Candidate[] = valid.map((value) => ({ value }));\n if (valid.some((v) => !isEmptyValue(v, field))) return domain;\n // A type with no known valid answer (a plugin without samples) must neither\n // dead-end the search nor hide the branches an answer would take: also try\n // the values the logic compares it with and some answer, as placeholders.\n const invalid = dedupe([...candidates, SOME_ANSWER]).filter((v) => !valid.includes(v));\n return [...domain, ...invalid.map((value): Candidate => ({ value, placeholder: true }))];\n}\n\nexport function coverage(form: FormDefinition | { definition: FormDefinition }, opts: CoverageOptions = {}): CoverageReport {\n const def = \"definition\" in form ? form.definition : form;\n const maxStates = opts.maxStates ?? 5000;\n const fields = fieldMap(def);\n const bounds = boundaries(def);\n const domains = new Map([...fields.values()].map((f) => [f.id, domainOf(f, bounds.fields.get(f.id) ?? [], opts.maxOptions ?? 12)]));\n const stepIds = steps(def).map((b) => b.id);\n\n const endings: Record<string, EndingCoverage> = {};\n for (const e of def.endings ?? []) endings[e.id] = { reached: false };\n const reachedBlocks = new Set<string>();\n const fired = new Set<string>();\n let states = 0;\n let paths = 0;\n let truncated = false;\n\n const keyOf = (id: string) => fields.get(id)?.key ?? id;\n const unsampled = new Set<string>();\n\n const terminal = (scope: EvalScope, walk: PathWalk, placeholders: Set<string>) => {\n const { path, ending } = walk;\n // Placeholders try every branch the logic can take on them, so blocks\n // and rules count as reachable, assuming a valid answer takes that branch.\n for (const id of path) reachedBlocks.add(id);\n for (const rule of def.logic ?? []) {\n if (fired.has(rule.id)) continue;\n if (rule.effect === \"jump\" && !path.includes(rule.from)) continue;\n // Each rule sees the answers on the path before the block it applies to.\n const at = rule.effect === \"jump\" ? walk.scopeAt(rule.from, true) : walk.scopeAt(rule.target);\n if (evaluate(rule.when, at)) fired.add(rule.id);\n }\n // A path through a placeholder is not a response anyone could submit.\n const missing = path.filter((id) => placeholders.has(id)).map(keyOf);\n if (missing.length) {\n for (const key of missing) unsampled.add(key);\n if (ending !== null && !endings[ending]?.reached) (endings[ending] ??= { reached: false }).needsSamples ??= missing;\n return;\n }\n paths++;\n if (ending === null) return;\n const entry = (endings[ending] ??= { reached: false });\n if (entry.reached) return;\n entry.reached = true;\n delete entry.needsSamples;\n const witness: Record<string, Json> = {};\n for (const id of path) {\n const v = scope.values[id];\n if (fields.has(id) && v !== undefined) witness[keyOf(id)] = v;\n }\n entry.witness = witness;\n const hidden = Object.fromEntries(\n Object.entries(scope.hidden).filter((e): e is [string, Json] => e[1] !== undefined),\n );\n if (Object.keys(hidden).length) entry.witnessHidden = hidden;\n };\n\n const explore = (\n values: Record<string, Value>,\n assigned: Set<string>,\n hidden: Record<string, Value>,\n placeholders: Set<string>,\n ) => {\n if (truncated) return;\n if (++states > maxStates) {\n truncated = true;\n return;\n }\n const scope: EvalScope = { values, hidden, fields };\n const walk = walkPath(def, scope);\n const next = walk.path.find((id) => fields.has(id) && !assigned.has(id));\n if (next === undefined) return terminal(scope, walk, placeholders);\n const nextAssigned = new Set(assigned).add(next);\n for (const { value, placeholder } of domains.get(next) ?? [{ value: undefined }]) {\n explore({ ...values, [next]: value }, nextAssigned, hidden, placeholder ? new Set(placeholders).add(next) : placeholders);\n if (truncated) return;\n }\n };\n\n // Hidden inputs the logic reads: fixed by the caller, or enumerated up front.\n const hiddenNames = [...bounds.hidden.keys()];\n const enumerateHidden = (i: number, hidden: Record<string, Value>) => {\n if (truncated) return;\n if (opts.hidden || i === hiddenNames.length) return explore({}, new Set(), opts.hidden ?? hidden, new Set());\n const name = hiddenNames[i]!;\n for (const v of dedupe(bounds.hidden.get(name)!)) enumerateHidden(i + 1, { ...hidden, [name]: v });\n };\n enumerateHidden(0, {});\n\n return {\n endings,\n unreachableBlocks: stepIds.filter((id) => !reachedBlocks.has(id)).map(keyOf),\n rulesNeverFired: (def.logic ?? []).filter((r) => !fired.has(r.id)).map((r) => r.id),\n unsampledFields: [...unsampled],\n pathsExplored: paths,\n truncated,\n };\n}\n","import { CALCULATED_TYPE, MAX_CALCULATED_DECIMALS, MAX_FORM_FORMULA_LENGTH } from \"./calculated\";\nimport { isJson } from \"./events\";\nimport { getFieldType, isHttpsUrl, isIsoDate, OPTION_LIMITS } from \"./fields\";\nimport { isPrefillParam, MAX_PREFILL_PARAM_LENGTH } from \"./options\";\nimport { parseFormula } from \"./formula\";\nimport { recallRefs } from \"./recall\";\nimport { isPhotoFormat, MAX_PHOTO_FILES, MAX_PHOTO_SIZE_MB, PHOTO_TYPE } from \"./photo\";\nimport { MAX_TABLE_COLUMNS } from \"./structured\";\nimport type { Condition, FormDefinition, Operator } from \"./types\";\n\n/** A value for a message. Never throws: parseForm accepts any input, including BigInts, cycles and deep nesting. */\nfunction shown(v: unknown): string {\n let text: string | undefined;\n try {\n text = JSON.stringify(v);\n } catch {\n text = undefined;\n }\n text ??= typeof v === \"bigint\" ? `${v}n` : typeof v;\n return text.length > 60 ? `${text.slice(0, 57)}...` : text;\n}\n\nexport interface FormIssue {\n path: string;\n message: string;\n}\n\nexport type ParseResult =\n | { ok: true; form: FormDefinition; warnings: FormIssue[] }\n | { ok: false; issues: FormIssue[]; warnings: FormIssue[] };\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === \"object\" && !Array.isArray(v);\n\nconst isInt = (v: unknown): v is number => typeof v === \"number\" && Number.isInteger(v);\n\n/** The JSON type a comparison operand must have to match a built-in field type's value. */\nconst LITERAL_TYPE: Readonly<Record<string, \"string\" | \"number\" | \"boolean\">> = {\n \"short-text\": \"string\",\n \"long-text\": \"string\",\n email: \"string\",\n phone: \"string\",\n rating: \"number\",\n nps: \"number\",\n \"single-choice\": \"string\",\n \"multi-choice\": \"string\",\n \"yes-no\": \"boolean\",\n list: \"string\",\n dropdown: \"string\",\n number: \"number\",\n date: \"string\",\n consent: \"boolean\",\n // A calculated field holds a number unless its format says text; see `literalType`.\n calculated: \"number\",\n};\n\n/** Field types whose answer is one of `props.options`. */\nconst CHOICE_TYPES: ReadonlySet<string> = new Set([\"single-choice\", \"multi-choice\", \"dropdown\"]);\n\nconst ORDERING: ReadonlySet<string> = new Set<Operator>([\"lt\", \"lte\", \"gt\", \"gte\"]);\n\nconst OPERATORS: ReadonlySet<string> = new Set<Operator>([\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"in\",\n \"contains\",\n \"answered\",\n \"empty\",\n]);\n\n/**\n * Names an id, key or hidden input may not take: they collide with\n * `Object.prototype` (`__proto__`, `constructor`, `toString`…) when used as a\n * record key.\n */\nconst RESERVED: ReadonlySet<string> = new Set(Object.getOwnPropertyNames(Object.prototype));\n\n/** Deepest nesting of `all` / `any` / `not` a condition may have. */\nconst MAX_CONDITION_DEPTH = 32;\n\n/**\n * Check a definition before it is stored or rendered: structure, the types of\n * text fields, unique ids and keys, known field types, references that\n * resolve, operators that fit the field type. Warnings flag things that work\n * but are probably mistakes. Never throws, whatever the input.\n */\nexport function parseForm(input: unknown): ParseResult {\n const issues: FormIssue[] = [];\n const warnings: FormIssue[] = [];\n const fail = () => ({ ok: false as const, issues, warnings });\n const issue = (path: string, message: string) => void issues.push({ path, message });\n\n /** A required string (non-empty with `nonEmpty`). */\n const text = (v: unknown, path: string, nonEmpty = false) => {\n if (typeof v !== \"string\" || (nonEmpty && !v)) issue(path, nonEmpty ? \"Required.\" : \"Required text.\");\n };\n /** An optional string. */\n const optionalText = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"string\") issue(path, \"Must be text.\");\n };\n const optionalBoolean = (v: unknown, path: string) => {\n if (v !== undefined && typeof v !== \"boolean\") issue(path, \"Must be true or false.\");\n };\n /** An option's description, image and attributes, each within `OPTION_LIMITS`. */\n const optionDetails = (o: Record<string, unknown>, at: string) => {\n if (o.description !== undefined && (typeof o.description !== \"string\" || o.description.length > OPTION_LIMITS.description)) {\n issue(`${at}.description`, `Must be text of at most ${OPTION_LIMITS.description} characters.`);\n }\n if (o.image !== undefined && !isHttpsUrl(o.image)) {\n issue(`${at}.image`, `Must be an https:// link of at most ${OPTION_LIMITS.image} characters.`);\n }\n if (o.attributes === undefined) return;\n const attributes = o.attributes;\n if (!isObject(attributes) || Object.keys(attributes).length > OPTION_LIMITS.attributes) {\n issue(`${at}.attributes`, `Must be an object of at most ${OPTION_LIMITS.attributes} attributes.`);\n return;\n }\n const fits = (x: unknown) => typeof x === \"string\" && x.length <= OPTION_LIMITS.attributeValue;\n for (const [name, v] of Object.entries(attributes)) {\n if (!name.trim() || name.length > OPTION_LIMITS.attributeName || RESERVED.has(name)) {\n issue(`${at}.attributes`, `${shown(name)} isn't a usable attribute name (at most ${OPTION_LIMITS.attributeName} characters).`);\n } else if (!fits(v) && !(Array.isArray(v) && v.length <= OPTION_LIMITS.attributeItems && v.every(fits))) {\n issue(\n `${at}.attributes.${name}`,\n `Must be text, or a list of at most ${OPTION_LIMITS.attributeItems} texts, each at most ${OPTION_LIMITS.attributeValue} characters.`,\n );\n }\n }\n };\n\n /** An identifier: a non-empty string that is not an `Object.prototype` name. */\n const name = (v: unknown, path: string, what: string): v is string => {\n if (typeof v !== \"string\" || !v) {\n issue(path, `${what} must be a non-empty string.`);\n return false;\n }\n if (RESERVED.has(v)) {\n issue(path, `\"${v}\" is reserved and cannot be used as ${what.toLowerCase()}.`);\n return false;\n }\n return true;\n };\n\n /** An optional whole number of at least `floor`. */\n const optionalInt = (v: unknown, path: string, floor: number) => {\n if (v !== undefined && !(isInt(v) && v >= floor)) issue(path, `Must be a whole number of ${floor} or more.`);\n };\n /** `low` may not exceed `high` when both are whole numbers. */\n const ordered = (low: unknown, high: unknown, path: string, what: string) => {\n if (isInt(low) && isInt(high) && low > high) issue(path, `Can't be more than the ${what}.`);\n };\n /** The props of the structured types (list, table, media-notes, text-highlights). */\n const structuredProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"list\") {\n optionalInt(props.min, `${path}.min`, 0);\n optionalInt(props.max, `${path}.max`, 1);\n optionalInt(props.itemMaxLength, `${path}.itemMaxLength`, 1);\n optionalText(props.placeholder, `${path}.placeholder`);\n ordered(props.min, props.max ?? 10, `${path}.min`, \"most items\");\n } else if (type === \"table\") {\n const columns = props.columns;\n if (!Array.isArray(columns) || columns.length < 1 || columns.length > MAX_TABLE_COLUMNS) {\n issue(`${path}.columns`, `Must be a list of 1 to ${MAX_TABLE_COLUMNS} columns.`);\n } else {\n const seen = new Set<string>();\n columns.forEach((c, j) => {\n const at = `${path}.columns[${j}]`;\n if (!isObject(c)) return issue(at, \"Each column needs a key and a label.\");\n if (name(c.key, `${at}.key`, \"A column key\")) {\n if (seen.has(c.key)) issue(`${at}.key`, `Duplicate column key \"${c.key}\".`);\n seen.add(c.key);\n }\n text(c.label, `${at}.label`);\n optionalBoolean(c.long, `${at}.long`);\n });\n }\n optionalInt(props.minRows, `${path}.minRows`, 0);\n optionalInt(props.maxRows, `${path}.maxRows`, 1);\n ordered(props.minRows, props.maxRows ?? 3, `${path}.minRows`, \"most rows\");\n } else if (type === \"media-notes\") {\n optionalInt(props.maxNotes, `${path}.maxNotes`, 1);\n optionalInt(props.textMaxLength, `${path}.textMaxLength`, 1);\n } else if (type === \"text-highlights\") {\n optionalText(props.text, `${path}.text`);\n optionalInt(props.maxHighlights, `${path}.maxHighlights`, 1);\n } else if (type === CALCULATED_TYPE) {\n // The formula itself is checked once every key is known, below.\n if (props.format !== undefined && props.format !== \"number\" && props.format !== \"percent\" && props.format !== \"text\") {\n issue(`${path}.format`, \"Must be number, percent or text.\");\n }\n if (props.decimals !== undefined && !(isInt(props.decimals) && props.decimals >= 0 && props.decimals <= MAX_CALCULATED_DECIMALS)) {\n issue(`${path}.decimals`, `Must be a whole number from 0 to ${MAX_CALCULATED_DECIMALS}.`);\n }\n }\n };\n\n const isFiniteNumber = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\n /** The props of the scale, number, date and consent types. */\n const fieldProps = (type: string, props: Record<string, unknown>, path: string) => {\n if (type === \"rating\" || type === \"nps\") {\n optionalText(props.lowLabel, `${path}.lowLabel`);\n optionalText(props.highLabel, `${path}.highLabel`);\n }\n if (type === \"rating\" && props.display !== undefined && props.display !== \"numbers\" && props.display !== \"stars\") {\n issue(`${path}.display`, \"Must be numbers or stars.\");\n }\n if (type === \"number\") {\n for (const k of [\"min\", \"max\", \"step\"] as const) {\n if (props[k] !== undefined && !isFiniteNumber(props[k])) issue(`${path}.${k}`, \"Must be a number.\");\n }\n if (isFiniteNumber(props.step) && props.step <= 0) issue(`${path}.step`, \"Must be above 0.\");\n if (isFiniteNumber(props.min) && isFiniteNumber(props.max) && props.min > props.max) {\n issue(`${path}.min`, \"Can't be more than the largest number.\");\n }\n }\n if (type === \"date\") {\n for (const k of [\"min\", \"max\"] as const) {\n if (props[k] !== undefined && !(typeof props[k] === \"string\" && isIsoDate(props[k]))) {\n issue(`${path}.${k}`, \"Must be a date like 2026-10-22.\");\n }\n }\n if (typeof props.min === \"string\" && typeof props.max === \"string\" && isIsoDate(props.min) && isIsoDate(props.max) && props.min > props.max) {\n issue(`${path}.min`, \"Can't be after the latest date.\");\n }\n }\n if (type === \"consent\") optionalText(props.text, `${path}.text`);\n if (type === PHOTO_TYPE) {\n if (props.maxFiles !== undefined && !(isInt(props.maxFiles) && props.maxFiles >= 1 && props.maxFiles <= MAX_PHOTO_FILES)) {\n issue(`${path}.maxFiles`, `Must be a whole number from 1 to ${MAX_PHOTO_FILES}.`);\n }\n if (props.maxSizeMb !== undefined && !(isInt(props.maxSizeMb) && props.maxSizeMb >= 1 && props.maxSizeMb <= MAX_PHOTO_SIZE_MB)) {\n issue(`${path}.maxSizeMb`, `Must be a whole number from 1 to ${MAX_PHOTO_SIZE_MB}.`);\n }\n if (props.formats !== undefined) {\n const formats = props.formats;\n if (!Array.isArray(formats) || formats.length === 0 || !formats.every(isPhotoFormat)) {\n issue(`${path}.formats`, \"Must be a list of one or more of jpeg, png, heic and webp.\");\n } else if (new Set(formats).size !== formats.length) {\n issue(`${path}.formats`, \"Name each format once.\");\n }\n }\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 optionalBoolean(input.settings.saveProgress, \"settings.saveProgress\");\n }\n }\n if (input.meta !== undefined && (!isObject(input.meta) || !isJson(input.meta))) {\n issue(\"meta\", \"Must be a JSON object.\");\n }\n if (!Array.isArray(input.blocks)) {\n issue(\"blocks\", \"Must be an array.\");\n return fail();\n }\n\n const ids = new Set<string>();\n const pageBreaks = new Set<string>();\n const keys = new Map<string, string>();\n const fieldTypes = new Map<string, string>();\n const order = new Map<string, number>();\n /** Column keys of table fields, for formulas. */\n const tableColumnKeys = new Map<string, Set<string>>();\n /** Option values of fields with `props.options`, for the operand check. */\n const choices = new Map<string, Set<string>>();\n /** Calculated fields that don't hold a number: `format: \"text\"` holds text, no format can hold either. */\n const calculatedLiteral = new Map<string, \"string\" | undefined>();\n\n input.blocks.forEach((block: unknown, i) => {\n const path = `blocks[${i}]`;\n if (!isObject(block) || typeof block.id !== \"string\" || !block.id) {\n issue(path, \"Every block needs a string id.\");\n return;\n }\n if (!name(block.id, `${path}.id`, \"A block id\")) return;\n if (ids.has(block.id)) issue(`${path}.id`, `Duplicate id \"${block.id}\".`);\n ids.add(block.id);\n if (block.kind === \"page-break\") pageBreaks.add(block.id);\n order.set(block.id, i);\n if (block.kind === \"field\") {\n text(block.label, `${path}.label`);\n optionalText(block.description, `${path}.description`);\n optionalText(block.placeholder, `${path}.placeholder`);\n optionalBoolean(block.required, `${path}.required`);\n optionalBoolean(block.sensitive, `${path}.sensitive`);\n optionalBoolean(block.identifying, `${path}.identifying`);\n const validKey = name(block.key, `${path}.key`, \"A field key\");\n if (typeof block.type !== \"string\" || !getFieldType(block.type)) {\n issue(`${path}.type`, `Unknown field type \"${String(block.type)}\".`);\n }\n if (block.props !== undefined) {\n const from = isObject(block.props) ? block.props.optionsFrom : undefined;\n if (from !== undefined) {\n if (!isObject(from) || from.source !== \"host\" || typeof from.key !== \"string\" || !from.key) {\n issue(`${path}.props.optionsFrom`, 'Must be { source: \"host\", key } with a non-empty key.');\n } else if (typeof block.type === \"string\" && !CHOICE_TYPES.has(block.type)) {\n warnings.push({ path: `${path}.props.optionsFrom`, message: \"Only single choice, multiple choice and dropdown questions take options from the app.\" });\n }\n const filter = isObject(from) ? from.filter : undefined;\n if (filter !== undefined) {\n const at = `${path}.props.optionsFrom.filter`;\n if (\n !isObject(filter) ||\n typeof filter.attribute !== \"string\" ||\n !filter.attribute ||\n filter.attribute.length > OPTION_LIMITS.attributeName ||\n typeof filter.field !== \"string\" ||\n !filter.field\n ) {\n issue(at, `Must be { attribute, field }: an attribute name (at most ${OPTION_LIMITS.attributeName} characters) and an earlier question's key.`);\n } else if (!keys.has(filter.field)) {\n // Keys are recorded block by block, so only earlier questions are known here.\n issue(`${at}.field`, `\"${filter.field}\" must be the key of an earlier question.`);\n }\n }\n }\n const prefill = isObject(block.props) ? block.props.prefill : undefined;\n if (prefill !== undefined) {\n if (!isObject(prefill) || !isPrefillParam(prefill.param)) {\n issue(\n `${path}.props.prefill`,\n `Must be { param, hideWhenPrefilled? }: a link parameter of letters, digits, \"_\", \"-\" or \".\" (at most ${MAX_PREFILL_PARAM_LENGTH} characters).`,\n );\n } else {\n optionalBoolean(prefill.hideWhenPrefilled, `${path}.props.prefill.hideWhenPrefilled`);\n if (typeof block.type === \"string\" && !CHOICE_TYPES.has(block.type)) {\n warnings.push({ path: `${path}.props.prefill`, message: \"Only single choice, multiple choice and dropdown questions are filled in from a link.\" });\n }\n }\n }\n if (isObject(block.props)) optionalBoolean(block.props.searchable, `${path}.props.searchable`);\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 {\n optionalText(o.label, `${at}.label`);\n optionDetails(o, at);\n }\n });\n // With options from the app, any value may be one of them: literals aren't checked against these.\n if (from === undefined) {\n choices.set(\n block.id,\n new Set(options.flatMap((o) => (isObject(o) && typeof o.value === \"string\" ? [o.value] : []))),\n );\n }\n }\n }\n const other = isObject(block.props) ? block.props.other : undefined;\n if (other !== undefined) {\n if (other !== true && other !== false && !(isObject(other) && (other.label === undefined || typeof other.label === \"string\"))) {\n issue(`${path}.props.other`, \"Must be true, false or { label }.\");\n } else if (other !== false && typeof block.type === \"string\" && !CHOICE_TYPES.has(block.type)) {\n warnings.push({ path: `${path}.props.other`, message: \"Only single choice, multiple choice and dropdown questions take an \\\"Other\\\" answer.\" });\n }\n }\n // Renderers draw one button per point, so the scale is bounded.\n const { max, maxLength } = isObject(block.props) ? block.props : {};\n if (block.type === \"rating\" && max !== undefined && !(isInt(max) && max >= 2 && max <= 10)) {\n issue(`${path}.props.max`, \"Must be a whole number from 2 to 10.\");\n }\n if (maxLength !== undefined && !(isInt(maxLength) && maxLength > 0)) {\n issue(`${path}.props.maxLength`, \"Must be a whole number above 0.\");\n }\n }\n // Checked with or without props: a table with no columns would block every submission.\n if (typeof block.type === \"string\" && (block.props === undefined || isObject(block.props))) {\n structuredProps(block.type, block.props ?? {}, `${path}.props`);\n fieldProps(block.type, block.props ?? {}, `${path}.props`);\n }\n if (validKey) {\n if (keys.has(block.key as string)) issue(`${path}.key`, `Duplicate key \"${String(block.key)}\".`);\n keys.set(block.key as string, block.id);\n }\n fieldTypes.set(block.id, typeof block.type === \"string\" ? block.type : \"\");\n if (block.type === CALCULATED_TYPE) {\n const format = isObject(block.props) ? block.props.format : undefined;\n if (format === \"text\") calculatedLiteral.set(block.id, \"string\");\n else if (format !== \"number\" && format !== \"percent\") calculatedLiteral.set(block.id, undefined);\n }\n if (block.type === \"table\" && isObject(block.props) && Array.isArray(block.props.columns)) {\n tableColumnKeys.set(\n block.id,\n new Set(block.props.columns.flatMap((c) => (isObject(c) && typeof c.key === \"string\" ? [c.key] : []))),\n );\n }\n } else if (block.kind === \"content\") {\n if (block.type !== \"heading\" && block.type !== \"text\") issue(`${path}.type`, \"Must be heading or text.\");\n text(block.text, `${path}.text`);\n } else if (block.kind === \"page-break\") {\n optionalText(block.title, `${path}.title`);\n } else {\n issue(`${path}.kind`, \"Unknown block kind.\");\n }\n });\n\n // Calculated fields: the formula parses, and every answer it names is a\n // question of this form (a table by one of its columns), and a calculated\n // one only when it comes earlier, so values never go round in a circle.\n // The formulas are worked out again on each step that changes an answer\n // they read, so all of them together are capped too.\n let formulaChars = 0;\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block) || block.kind !== \"field\" || block.type !== CALCULATED_TYPE) return;\n const path = `blocks[${i}].props.formula`;\n const source = isObject(block.props) && typeof block.props.formula === \"string\" ? block.props.formula : \"\";\n formulaChars += source.length;\n if (formulaChars > MAX_FORM_FORMULA_LENGTH && formulaChars - source.length <= MAX_FORM_FORMULA_LENGTH) {\n issue(path, `The form's formulas together are over ${MAX_FORM_FORMULA_LENGTH} characters; shorten some, or work part out once in an earlier calculated field.`);\n }\n if (block.required === true) {\n warnings.push({ path: `blocks[${i}].required`, message: \"A calculated field is worked out, not answered, so it is never required.\" });\n }\n const formula = isObject(block.props) ? block.props.formula : undefined;\n if (typeof formula !== \"string\" || !formula.trim()) return issue(path, \"A calculated field needs a formula.\");\n const parsed = parseFormula(formula);\n if (!parsed.ok) return issue(path, `${parsed.message} (at character ${parsed.at + 1})`);\n const reported = new Set<string>();\n for (const ref of parsed.refs) {\n const name = ref.column === undefined ? ref.key : `${ref.key}.${ref.column}`;\n if (reported.has(name)) continue;\n reported.add(name);\n const target = keys.get(ref.key);\n const targetType = target === undefined ? undefined : fieldTypes.get(target);\n const at = target === undefined ? undefined : order.get(target);\n if (target === undefined || targetType === undefined) issue(path, `The formula uses \"${ref.key}\", which is not the answer name of a question in this form.`);\n else if (target === block.id) issue(path, \"The formula uses this field's own value.\");\n else if (targetType === CALCULATED_TYPE && (at ?? 0) > i) {\n issue(path, `The formula uses \"${ref.key}\", a calculated field that comes after this one; move it earlier.`);\n } else if (targetType === \"table\") {\n const columns = tableColumnKeys.get(target);\n if (ref.column === undefined) issue(path, `\"${ref.key}\" is a table: name one of its columns, like ${ref.key}.${[...(columns ?? [])][0] ?? \"column\"}.`);\n else if (columns && !columns.has(ref.column)) issue(path, `The table \"${ref.key}\" has no column \"${ref.column}\".`);\n } else if (ref.column !== undefined) issue(path, `\"${ref.key}\" is not a table, so it has no column \"${ref.column}\".`);\n else if (targetType === \"media-notes\" || targetType === \"text-highlights\") {\n warnings.push({ path, message: `\"${ref.key}\" holds notes, not numbers; the formula reads it as blank.` });\n } else if (targetType === PHOTO_TYPE) {\n warnings.push({ path, message: `\"${ref.key}\" holds photos, not numbers; the formula reads it as blank.` });\n }\n }\n });\n\n const hiddenNames = new Set<string>();\n const hiddenTypes = new Map<string, string>();\n if (input.hidden !== undefined && !Array.isArray(input.hidden)) issue(\"hidden\", \"Must be an array.\");\n (Array.isArray(input.hidden) ? input.hidden : []).forEach((h: unknown, i) => {\n if (!isObject(h) || typeof h.name !== \"string\" || !h.name) {\n issue(`hidden[${i}]`, \"Each hidden input needs a name.\");\n return;\n }\n if (!name(h.name, `hidden[${i}].name`, \"A hidden input name\")) return;\n if (hiddenNames.has(h.name)) issue(`hidden[${i}].name`, `Duplicate hidden input \"${h.name}\".`);\n if (typeof h.source !== \"string\" || ![\"url\", \"host\", \"server\"].includes(h.source)) {\n issue(`hidden[${i}].source`, \"Must be url, host or server.\");\n }\n if (typeof h.type !== \"string\" || ![\"string\", \"number\", \"boolean\"].includes(h.type)) {\n issue(`hidden[${i}].type`, \"Must be string, number or boolean.\");\n }\n optionalBoolean(h.sensitive, `hidden[${i}].sensitive`);\n optionalBoolean(h.identifying, `hidden[${i}].identifying`);\n hiddenNames.add(h.name);\n if (typeof h.type === \"string\") hiddenTypes.set(h.name, h.type);\n });\n\n const endingIds = new Set<string>();\n if (input.endings !== undefined && !Array.isArray(input.endings)) issue(\"endings\", \"Must be an array.\");\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n const path = `endings[${i}]`;\n if (!isObject(e)) {\n issue(path, \"Each ending must be an object with an id and a title.\");\n return;\n }\n text(e.title, `${path}.title`);\n optionalText(e.description, `${path}.description`);\n if (!name(e.id, `${path}.id`, \"An ending id\")) return;\n if (endingIds.has(e.id)) issue(`${path}.id`, `Duplicate ending id \"${e.id}\".`);\n endingIds.add(e.id);\n });\n\n /** Field ids a condition reads, for the order check. */\n const checkOperand = (o: unknown, path: string, reads: string[]) => {\n if (o === undefined) return;\n if (!isObject(o)) return issue(path, \"An operand must be an object.\");\n if (\"field\" in o) {\n if (typeof o.field !== \"string\" || !fieldTypes.has(o.field)) return issue(path, `No field \"${String(o.field)}\".`);\n reads.push(o.field);\n } else if (\"hidden\" in o) {\n if (typeof o.hidden !== \"string\" || !hiddenNames.has(o.hidden)) {\n issue(path, `No hidden input \"${String(o.hidden)}\".`);\n }\n } else if (!(\"value\" in o) || !isJson(o.value)) {\n issue(path, \"An operand needs a `field`, a `hidden` input or a JSON `value`.\");\n }\n };\n const checkCondition = (c: unknown, path: string, reads: string[], depth = 0): void => {\n if (!isObject(c)) return issue(path, \"A condition must be an object.\");\n if (depth > MAX_CONDITION_DEPTH) return issue(path, \"The condition is nested too deeply.\");\n if (\"all\" in c || \"any\" in c) {\n const group = \"all\" in c ? \"all\" : \"any\";\n const list = c[group];\n if (!Array.isArray(list)) return issue(path, `\\`${group}\\` must be an array.`);\n return list.forEach((x, i) => checkCondition(x, `${path}.${group}[${i}]`, reads, depth + 1));\n }\n if (\"not\" in c) return checkCondition(c.not, `${path}.not`, reads, depth + 1);\n if (typeof c.op !== \"string\" || !isObject(c.left)) {\n return issue(path, \"A comparison needs an `op` and a `left` operand.\");\n }\n if (!OPERATORS.has(c.op)) issue(`${path}.op`, `Unknown operator \"${c.op}\".`);\n checkOperand(c.left, `${path}.left`, reads);\n checkOperand(c.right, `${path}.right`, reads);\n if (typeof c.left.field === \"string\") {\n const manifest = getFieldType(fieldTypes.get(c.left.field) ?? \"\");\n if (manifest && OPERATORS.has(c.op) && !manifest.operators.includes(c.op as Operator)) {\n // Already wrong; a literal warning on top would only repeat it.\n return issue(`${path}.op`, `\"${c.op}\" does not apply to a ${manifest.type} field.`);\n }\n }\n checkLiterals(c.op, c.left, c.right, path);\n };\n /** Warn when a literal `value` can never match what the left side holds: wrong type, or not an option. */\n const checkLiterals = (op: string, left: Record<string, unknown>, right: unknown, path: string) => {\n if (op === \"answered\" || op === \"empty\" || !OPERATORS.has(op)) return;\n const literal = isObject(right) && \"value\" in right;\n // A `field` or `hidden` operand on the right is only known when the form runs.\n if (right !== undefined && !literal) return;\n let what = \"the left side\";\n let type: string | undefined;\n let options: Set<string> | undefined;\n if (typeof left.field === \"string\" && fieldTypes.has(left.field)) {\n const fieldType = fieldTypes.get(left.field)!;\n what = `\"${keyOf(left.field)}\"`;\n type = calculatedLiteral.has(left.field) ? calculatedLiteral.get(left.field) : LITERAL_TYPE[fieldType];\n if (CHOICE_TYPES.has(fieldType)) options = choices.get(left.field);\n } else if (typeof left.hidden === \"string\" && hiddenTypes.has(left.hidden)) {\n what = `hidden input \"${left.hidden}\"`;\n type = hiddenTypes.get(left.hidden);\n }\n const outcome = op === \"neq\" ? \"always true\" : \"never true\";\n let values: unknown[];\n if (op === \"in\") {\n if (!literal || !Array.isArray(right.value)) {\n return void warnings.push({ path: `${path}.right`, message: \"`in` needs a list of values; it never matches.\" });\n }\n values = right.value;\n } else if (!literal) return;\n else values = [right.value];\n if (ORDERING.has(op)) {\n if (type !== undefined && type !== \"number\") {\n return void warnings.push({ path: `${path}.op`, message: `\"${op}\" compares numbers, but ${what} holds a ${type}; it is never true.` });\n }\n type = \"number\";\n }\n for (const v of values) {\n const message =\n type !== undefined && typeof v !== type\n ? `${what} holds a ${type}, but ${shown(v)} is not one; this comparison is ${outcome}.`\n : options && typeof v === \"string\" && !options.has(v)\n ? `${shown(v)} is not an option of ${what}; this comparison is ${outcome}.`\n : null;\n if (message) warnings.push({ path: `${path}.right`, message });\n }\n };\n const keyOf = (id: string) => [...keys].find(([, v]) => v === id)?.[0] ?? id;\n\n const ruleIds = new Set<string>();\n if (input.logic !== undefined && !Array.isArray(input.logic)) issue(\"logic\", \"Must be an array.\");\n (Array.isArray(input.logic) ? input.logic : []).forEach((rule: unknown, i) => {\n const path = `logic[${i}]`;\n if (!isObject(rule) || typeof rule.id !== \"string\" || !isObject(rule.when)) {\n issue(path, \"Each rule needs an id and a `when` condition.\");\n return;\n }\n if (ruleIds.has(rule.id)) issue(`${path}.id`, `Duplicate rule id \"${rule.id}\".`);\n ruleIds.add(rule.id);\n const reads: string[] = [];\n checkCondition(rule.when, `${path}.when`, reads);\n\n // The block whose position the condition is read at, for the order check.\n let at: string | undefined;\n let inclusive = false;\n if (rule.effect === \"jump\") {\n if (typeof rule.from !== \"string\" || !ids.has(rule.from)) {\n issue(`${path}.from`, `No block \"${String(rule.from)}\".`);\n } else if (pageBreaks.has(rule.from)) {\n issue(`${path}.from`, \"A jump can't start at a page break; use the block before it.\");\n } else {\n at = rule.from;\n inclusive = true;\n }\n if (isObject(rule.to)) {\n if (typeof rule.to.ending !== \"string\" || !endingIds.has(rule.to.ending)) {\n issue(`${path}.to`, `No ending \"${String(rule.to.ending)}\".`);\n }\n } else if (typeof rule.to !== \"string\" || !ids.has(rule.to)) {\n issue(`${path}.to`, `No block \"${String(rule.to)}\".`);\n } else if (pageBreaks.has(rule.to)) {\n issue(`${path}.to`, \"A jump can't land on a page break; jump to the first block after it.\");\n } else if (at !== undefined && (order.get(rule.to) ?? 0) <= (order.get(at) ?? 0)) {\n warnings.push({ path: `${path}.to`, message: \"Jumps only go forward; this one is ignored.\" });\n }\n } else if (rule.effect === \"show\" || rule.effect === \"hide\") {\n if (typeof rule.target !== \"string\" || !ids.has(rule.target)) {\n issue(`${path}.target`, `No block \"${String(rule.target)}\".`);\n } else at = rule.target;\n } else {\n issue(`${path}.effect`, \"Must be show, hide or jump.\");\n }\n\n // Logic reads only the answers on the path before the block it applies to.\n if (at !== undefined) {\n const limit = order.get(at) ?? 0;\n for (const field of new Set(reads)) {\n const p = order.get(field) ?? 0;\n if (p > limit || (p === limit && !inclusive)) {\n warnings.push({\n path: `${path}.when`,\n message: `Reads \"${keyOf(field)}\", which does not come before \"${keyOf(at)}\"; it always reads as unanswered.`,\n });\n }\n }\n }\n });\n\n input.blocks.forEach((block: unknown, i) => {\n if (!isObject(block)) return;\n const raw =\n block.kind === \"field\" ? [block.label, block.description] : block.kind === \"content\" ? [block.text] : [];\n const texts = raw.filter((t): t is string => typeof t === \"string\");\n for (const t of texts) {\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" && !hiddenNames.has(ref.name)) {\n issue(`blocks[${i}]`, `Recalls unknown hidden input \"${ref.name}\".`);\n }\n if (ref.kind === \"field\") {\n const target = keys.get(ref.name);\n if (!target) issue(`blocks[${i}]`, `Recalls unknown field \"${ref.name}\".`);\n else if ((order.get(target) ?? 0) >= i) {\n warnings.push({ path: `blocks[${i}]`, message: `Recalls \"${ref.name}\", which comes later.` });\n }\n }\n }\n }\n });\n\n // Endings and the introduction recall too. Only warnings: a stale token here shows as\n // its fallback text, and earlier releases accepted these definitions.\n const extra: [string, unknown][] = [[\"description\", input.description]];\n (Array.isArray(input.endings) ? input.endings : []).forEach((e: unknown, i) => {\n if (isObject(e)) extra.push([`endings[${i}]`, e.title], [`endings[${i}]`, e.description]);\n });\n for (const [path, t] of extra) {\n if (typeof t !== \"string\") continue;\n for (const ref of recallRefs(t)) {\n if (ref.kind === \"hidden\" ? !hiddenNames.has(ref.name) : !keys.has(ref.name)) {\n warnings.push({ path, message: `Recalls unknown ${ref.kind === \"hidden\" ? \"hidden input\" : \"field\"} \"${ref.name}\"; it shows its fallback text.` });\n }\n }\n }\n\n return issues.length ? fail() : { ok: true, form: input as unknown as FormDefinition, warnings };\n}\n","/**\n * Server-side checking. No IO: the app loads the published definition,\n * resolves its server inputs, calls `validateSubmission`, and stores what\n * comes back.\n */\nimport { isCalculated, ReplayWorkExceeded } from \"./calculated\";\nimport { createForm, replayWithin, type FormEngine } from \"./engine\";\nimport { compactEvents, isFormEvent, isJson, isPlainObject, isUnknownEvent } from \"./events\";\nimport { isEmptyValue, normalizeValue, withHostOptions, type HostOptions } from \"./fields\";\nimport { coerceHidden } from \"./hidden\";\nimport { fieldMap, own, withheld } from \"./logic\";\nimport { filteredChoiceError } from \"./options\";\nimport { parseForm } from \"./parse\";\nimport type { FormDefinition, FormEvent, Json } from \"./types\";\nimport { validateField, type FieldValidator } from \"./validate\";\n\nexport interface SubmissionInput {\n /** Answers keyed by field id. Ignored when `events` is given. */\n answers?: Record<string, Json> | undefined;\n /** The respondent's event log. Replayed instead of trusting `answers`. */\n events?: FormEvent[] | undefined;\n /** URL and host inputs sent by the client. Server inputs here are ignored. */\n hidden?: Record<string, Json> | undefined;\n}\n\nexport interface SubmissionOptions {\n /** Values for `source: \"server\"` inputs, resolved by the server (account id, location, user id…). */\n context?: Record<string, Json> | undefined;\n /** `false` checks a draft: formats only, nothing required. Default true. */\n complete?: boolean | undefined;\n validators?: Record<string, FieldValidator> | undefined;\n /**\n * Most events accepted, counted after `compactEvents`. Default `MAX_EVENTS`\n * (10,000). At most `RAW_EVENTS_PER_EVENT` (10) times as many may be sent.\n */\n maxEvents?: number | undefined;\n /**\n * Most JSON values in the answers, answer events and hidden inputs\n * together (each number, text, true / false, list item, row and cell\n * counts one; a run of answers to one field, as typing in a table sends,\n * counts its last only). Default `MAX_SUBMISSION_VALUES` (200,000).\n */\n maxValues?: number | undefined;\n /**\n * Most work replaying the events may take: one unit per block each time\n * the path is walked, one per calculated field each time the answers\n * settle, and a formula's size (its numbers, answers and operators) each\n * time it is worked out. Default `MAX_REPLAY_WORK` (1,000,000). Only the\n * replay counts: the submit that follows it does not.\n */\n maxReplayWork?: number | undefined;\n /**\n * The option lists the app supplies for `optionsFrom: { source: \"host\" }`\n * choice fields, loaded here on the server (never taken from the client):\n * an answer must be one of the field's own options or of these. Pass what\n * the form was shown with, loaded afresh, such as the current staff.\n */\n hostOptions?: HostOptions | undefined;\n}\n\nexport interface CheckedSubmission {\n status: \"draft\" | \"completed\";\n /**\n * Visible answers only, keyed by field id (kept hidden answers too, with\n * `clearHiddenValues: false`). Calculated fields hold the value worked out\n * here from these answers.\n */\n answers: Record<string, Json>;\n /** Untrusted URL and host inputs, coerced to their declared types. Identifying ones are left out on anonymous forms. */\n hidden: Record<string, Json>;\n /** Trusted server inputs. Identifying ones are left out on anonymous forms. */\n context: Record<string, Json>;\n ending: string | null;\n /** Client-sent keys that were dropped, each once: unknown fields, server inputs, undeclared or withheld hidden names. */\n ignored: string[];\n}\n\nexport type SubmissionResult =\n | { ok: true; submission: CheckedSubmission }\n | { ok: false; errors: Record<string, string> };\n\n/** Default for `SubmissionOptions.maxEvents`. */\nexport const MAX_EVENTS = 10_000;\n/** Default for `SubmissionOptions.maxValues`. */\nexport const MAX_SUBMISSION_VALUES = 200_000;\n/** Default for `SubmissionOptions.maxReplayWork`. */\nexport const MAX_REPLAY_WORK = 1_000_000;\n/**\n * Most events sent, before compaction, as a multiple of `maxEvents`: a\n * keystroke log compacts to far fewer, but every event sent is looked at.\n */\nexport const RAW_EVENTS_PER_EVENT = 10;\n\n/** How many JSON values `value` holds (itself, and every item, row and cell inside), counting no further than `limit + 1`. */\nfunction countValues(value: unknown, limit: number): number {\n let count = 0;\n const stack: unknown[] = [value];\n while (stack.length && count <= limit) {\n const v = stack.pop();\n if (v === undefined) continue;\n count++;\n if (Array.isArray(v)) for (const item of v) stack.push(item);\n else if (v !== null && typeof v === \"object\") for (const k in v) stack.push((v as Record<string, unknown>)[k]);\n }\n return count;\n}\n\nconst answerTo = (e: unknown): string | undefined =>\n isPlainObject(e) && e.type === \"answer\" && typeof e.field === \"string\" ? e.field : undefined;\n\n/**\n * Events as `compactEvents` keeps them, before they are checked: of a run of\n * answers to one field (a table sends itself on every keystroke), only the\n * last. Looks only at each event's `type` and `field`, so it is cheap.\n */\nfunction leanEvents(events: unknown[]): unknown[] {\n const out: unknown[] = [];\n for (let i = 0; i < events.length; i++) {\n const field = answerTo(events[i]);\n if (field !== undefined && answerTo(events[i + 1]) === field) continue;\n out.push(events[i]);\n }\n return out;\n}\n\n/** The values a submission carries, as `countValues` counts them: its answers (each run of answers to a field once) and hidden inputs. */\nfunction submissionValues(input: Record<string, unknown>, limit: number): number {\n let count = countValues(input.hidden, limit);\n if (Array.isArray(input.events)) {\n for (const e of input.events) {\n if (count > limit) break;\n if (answerTo(e) !== undefined) count += countValues((e as Record<string, unknown>).value, limit - count);\n }\n } else count += countValues(input.answers, limit - count);\n return count;\n}\n\nconst MALFORMED: SubmissionResult = { ok: false, errors: { \"\": \"Malformed submission.\" } };\n\n// Definitions that parsed cleanly. Failures are not cached: registering a\n// missing field type later can fix them.\nconst parsedDefinitions = new WeakMap<object, true>();\n\nfunction checkDefinition(definition: FormDefinition): string | null {\n if (typeof definition === \"object\" && definition !== null && parsedDefinitions.has(definition)) return null;\n const parsed = parseForm(definition);\n if (!parsed.ok) {\n const list = parsed.issues.map((i) => (i.path ? `${i.path}: ${i.message}` : i.message)).join(\"; \");\n return `Invalid form definition: ${list}`;\n }\n parsedDefinitions.set(definition, true);\n return null;\n}\n\n/** The input as a well-formed submission, or null. Unknown event types are dropped. */\nfunction wellFormed(input: unknown): SubmissionInput | null {\n if (!isPlainObject(input)) return null;\n const { answers, events, hidden } = input;\n const record = (v: unknown) =>\n v === undefined ||\n (isPlainObject(v) && Object.keys(v).every((k) => v[k] === undefined || isJson(v[k])));\n if (!record(answers) || !record(hidden)) return null;\n if (events === undefined) return { answers: answers as SubmissionInput[\"answers\"], hidden: hidden as SubmissionInput[\"hidden\"] };\n if (!Array.isArray(events)) return null;\n const known: FormEvent[] = [];\n for (const e of events as unknown[]) {\n if (isFormEvent(e)) known.push(e);\n else if (!isUnknownEvent(e)) return null;\n }\n return { answers: answers as SubmissionInput[\"answers\"], events: known, hidden: hidden as SubmissionInput[\"hidden\"] };\n}\n\n/**\n * Check a submission against the published definition. Never throws on a\n * malformed submission: it returns `{ ok: false, errors: { \"\": … } }`.\n */\nexport function validateSubmission(\n published: FormDefinition,\n submission: SubmissionInput,\n options: SubmissionOptions = {},\n): SubmissionResult {\n const invalid = checkDefinition(published);\n if (invalid) return { ok: false, errors: { \"\": invalid } };\n // Host-supplied options, filled in as the respondent's engine filled them, so\n // a choice is accepted only when it is one the server offers now.\n const definition = withHostOptions(published, options.hostOptions);\n if (!isPlainObject(submission)) return MALFORMED;\n const maxEvents = options.maxEvents ?? MAX_EVENTS;\n let sent: Record<string, unknown> = submission;\n if (Array.isArray(submission.events)) {\n // Bounded before anything walks the events or their values.\n const maxRaw = maxEvents * RAW_EVENTS_PER_EVENT;\n if (submission.events.length > maxRaw) {\n return { ok: false, errors: { \"\": `Too many events: ${submission.events.length} sent; the limit is ${maxRaw} before compaction.` } };\n }\n sent = { ...submission, events: leanEvents(submission.events) };\n }\n // Counted on what the replay keeps, so a table typed into is counted once,\n // and before the values are checked, so counting stops at the limit.\n const maxValues = options.maxValues ?? MAX_SUBMISSION_VALUES;\n if (submissionValues(sent, maxValues) > maxValues) {\n return {\n ok: false,\n errors: { \"\": `Too much data: the answers hold more than ${maxValues} values (items, rows and cells); the limit is ${maxValues}.` },\n };\n }\n const input = wellFormed(sent);\n if (!input) return MALFORMED;\n\n // A Set: a key sent many times (one answer event per keystroke) is reported once.\n const ignored = new Set<string>();\n const client = coerceHidden(definition, input.hidden, { sources: [\"url\", \"host\"] });\n for (const name of client.ignored) ignored.add(`hidden.${name}`);\n const hidden = client.values;\n const context = coerceHidden(definition, options.context, { sources: [\"server\"] }).values;\n\n const fields = fieldMap(definition);\n // Anonymous forms never store identifying fields: client values are dropped.\n /** `true`: store it; `false`: withheld; `undefined`: not a field. Both of the latter are reported in `ignored`. */\n const accept = (id: string): boolean | undefined => {\n if (!fields.has(id)) return void ignored.add(id);\n // Calculated values are worked out again here, never taken from the client\n // (whose `engine.answers()` holds them), so they are dropped without a report.\n if (isCalculated(fields.get(id))) return false;\n if (!withheld(definition, fields.get(id))) return true;\n ignored.add(id);\n return false;\n };\n const engineHidden = { ...hidden, ...context };\n let engine: FormEngine;\n if (input.events) {\n const events = compactEvents(input.events);\n if (events.length > maxEvents) {\n return { ok: false, errors: { \"\": `Too many events: ${events.length} after compaction; the limit is ${maxEvents}.` } };\n }\n // Unknown fields stay in the log (replay ignores them); withheld ones are removed.\n const kept = events.filter((e) => e.type !== \"answer\" || accept(e.field) !== false);\n const maxWork = options.maxReplayWork ?? MAX_REPLAY_WORK;\n try {\n engine = replayWithin(definition, kept, { hidden: engineHidden, validators: options.validators }, maxWork);\n } catch (e) {\n if (!(e instanceof ReplayWorkExceeded)) throw e;\n return {\n ok: false,\n errors: { \"\": `Too much work: replaying these events (the path and calculated fields) would take more than ${maxWork} steps; the limit is ${maxWork}.` },\n };\n }\n } else {\n const answers: Record<string, Json> = {};\n for (const id of Object.keys(input.answers ?? {})) {\n const value = own(input.answers!, id);\n if (accept(id) && value !== undefined) answers[id] = value;\n }\n engine = createForm(definition, {\n initialValues: answers,\n hidden: engineHidden,\n validators: options.validators,\n clock: () => undefined,\n });\n }\n\n const complete = options.complete !== false;\n if (complete) {\n // A replay only reaches \"completed\" through a submit that validated, and a\n // completed response is final: answers after the submit event are ignored.\n if (engine.getState().status !== \"completed\" && !engine.submit()) {\n return { ok: false, errors: engine.getState().errors };\n }\n } else {\n const errors: Record<string, string> = {};\n const kept = engine.answers();\n for (const [id, value] of Object.entries(kept)) {\n const message =\n validateField(fields.get(id)!, value, {\n requireAnswers: false,\n custom: options.validators?.[id],\n }) ?? filteredChoiceError(definition, fields.get(id)!, value, kept);\n if (message) errors[id] = message;\n }\n if (Object.keys(errors).length) return { ok: false, errors };\n }\n\n const state = engine.getState();\n const answers = engine.answers();\n if (definition.settings?.clearHiddenValues === false) {\n // Values of fields off the path were never validated. Keep one only if\n // its format is valid; drop the rest, so nothing stored is unchecked.\n for (const [id, field] of fields) {\n if (withheld(definition, field)) continue;\n const value = own(state.values, id);\n if (own(answers, id) !== undefined || value === undefined || isEmptyValue(value, field)) continue;\n const message = validateField(field, value, { requireAnswers: false, custom: options.validators?.[id] });\n if (message === null) answers[id] = normalizeValue(value, field);\n }\n }\n\n // Anonymous forms never store identifying hidden inputs either. Logic above\n // still read them, so the path matches the client's.\n const store = (values: Record<string, Json>, report: boolean) => {\n if (definition.settings?.anonymous !== true) return values;\n const identifying = new Set((definition.hidden ?? []).filter((h) => h.identifying === true).map((h) => h.name));\n const kept: Record<string, Json> = {};\n for (const [name, value] of Object.entries(values)) {\n if (!identifying.has(name)) kept[name] = value;\n else if (report) ignored.add(`hidden.${name}`);\n }\n return kept;\n };\n\n return {\n ok: true,\n submission: {\n status: complete ? \"completed\" : \"draft\",\n answers,\n hidden: store(hidden, true),\n context: store(context, false),\n ending: complete ? state.ending : null,\n ignored: [...ignored],\n },\n };\n}\n\n/**\n * The definition as respondents may see it. R1 forms hold nothing secret;\n * assessment answer keys (R4) will be stripped here.\n */\nexport function publicDefinition(definition: FormDefinition): FormDefinition {\n return JSON.parse(JSON.stringify(definition)) as FormDefinition;\n}\n\nexport {\n answerSnapshots,\n answersFromSnapshots,\n type AnswerSnapshot,\n type OptionSnapshot,\n type RestoredAnswers,\n} from \"./options\";\nexport { withHostOptions, type HostOptions } from \"./fields\";\nexport {\n EDIT_LINK_TTL_SECONDS,\n MIN_EDIT_SECRET_BYTES,\n EDIT_LINK_PARAM,\n isUsableEditSecret,\n signEditToken,\n verifyEditToken,\n withEditToken,\n editLinkUrl,\n createEditSecretReader,\n isEditLinkRequest,\n withEditLinkHeaders,\n type EditLinkClaims,\n type EditLinkOptions,\n type EditLinkUrlOptions,\n type EditLinkRequestOptions,\n type EditSecretLog,\n type EditSecretReader,\n} from \"./edit-link\";\nexport {\n DEFAULT_TRUSTED_IP_HEADERS,\n RATE_LIMIT_DEFAULTS,\n clientIp,\n addressPrefix,\n rateLimitKey,\n allow,\n type RateLimitStore,\n} from \"./rate-limit\";\n","/**\n * Scenarios: a definition, an event log and the expected outcome, as one JSON\n * file. The same file runs in this package's tests, in an app's CI and in the\n * playground, so every runtime is held to the same behaviour.\n */\nimport { replay, type FormEngine, type FormState } from \"./engine\";\nimport { compactEvents } from \"./events\";\nimport { canonicalJson } from \"./hash\";\nimport { fieldMap } from \"./logic\";\nimport { validateSubmission } from \"./server\";\nimport type { FormDefinition, FormEvent, Json } from \"./types\";\n\nexport { compactEvents };\n\nexport interface ScenarioExpectation {\n /** Keys (block ids for content) on the respondent's path. */\n path?: string[];\n /** Keys of the visible fields, in path order. */\n visible?: string[];\n /** Key of the block in focus (focus layout). */\n current?: string | null;\n status?: \"in_progress\" | \"completed\";\n ending?: string | null;\n /** `engine.answers()`, by key. */\n answers?: Record<string, Json>;\n /** Keys of the fields with an error on the client after the last event. */\n errors?: string[];\n /** What `validateSubmission(definition, { events, hidden }, { context })` returns. */\n server?: {\n ok: boolean;\n /** Stored answers, by key. */\n answers?: Record<string, Json>;\n context?: Record<string, Json>;\n /** Keys of the fields the server rejected. */\n errors?: string[];\n /** `submission.ignored`: dropped field ids and `hidden.<name>` entries. */\n ignored?: string[];\n /** Check as a completed response. Default: whether the replay completed. */\n complete?: boolean;\n };\n}\n\nexport interface Scenario {\n /** Version of the scenario format. */\n scenarioVersion: 1;\n name: string;\n description?: string;\n tags?: string[];\n definition: FormDefinition;\n /** URL and host inputs, as the client sends them. */\n hidden?: Record<string, Json>;\n /** Server inputs, resolved by the server (and given to the client when the form loads). */\n context?: Record<string, Json>;\n /** The respondent's event log. Answer events name fields by id. */\n events: FormEvent[];\n expect: ScenarioExpectation;\n}\n\nexport interface ScenarioResult {\n pass: boolean;\n failures: string[];\n state: FormState;\n}\n\nfunction keyed(def: FormDefinition) {\n const fields = fieldMap(def);\n const keyOf = (id: string) => fields.get(id)?.key ?? id;\n const byKey = (record: Record<string, Json>) =>\n Object.fromEntries(Object.entries(record).map(([id, v]) => [keyOf(id), v]));\n return { fields, keyOf, byKey };\n}\n\nfunction snapshot(engine: FormEngine) {\n const { keyOf, byKey } = keyed(engine.definition);\n const state = engine.getState();\n return {\n path: state.path.map(keyOf),\n visible: state.path.filter((id) => engine.field(id) && engine.isVisible(id)).map(keyOf),\n current: state.current === null ? null : keyOf(state.current),\n status: state.status,\n ending: state.ending,\n answers: byKey(engine.answers()),\n errors: Object.keys(state.errors).map(keyOf),\n };\n}\n\nconst same = (a: unknown, b: unknown) => canonicalJson(a) === canonicalJson(b);\nconst sorted = (xs: string[]) => [...xs].sort();\n\n/** Replay a scenario's events (no clock) and compare against its expectations. */\nexport function runScenario(scenario: Scenario): ScenarioResult {\n const failures: string[] = [];\n if (scenario.scenarioVersion !== 1) {\n failures.push(`scenarioVersion ${String(scenario.scenarioVersion)} is not supported (expected 1).`);\n }\n const { definition, expect } = scenario;\n const engine = replay(definition, scenario.events, {\n hidden: { ...(scenario.hidden ?? {}), ...(scenario.context ?? {}) },\n });\n const actual = snapshot(engine);\n const check = (label: string, expected: unknown, got: unknown) => {\n if (expected !== undefined && !same(expected, got)) {\n failures.push(`${label}: expected ${canonicalJson(expected)}, got ${canonicalJson(got)}`);\n }\n };\n check(\"path\", expect.path, actual.path);\n check(\"visible\", expect.visible, actual.visible);\n check(\"current\", expect.current, actual.current);\n check(\"status\", expect.status, actual.status);\n check(\"ending\", expect.ending, actual.ending);\n check(\"answers\", expect.answers, actual.answers);\n if (expect.errors) check(\"errors\", sorted(expect.errors), sorted(actual.errors));\n\n if (expect.server) {\n const { keyOf, byKey } = keyed(definition);\n const complete = expect.server.complete ?? actual.status === \"completed\";\n const result = validateSubmission(\n definition,\n { events: scenario.events, hidden: scenario.hidden },\n { context: scenario.context, complete },\n );\n check(\"server.ok\", expect.server.ok, result.ok);\n if (result.ok) {\n check(\"server.answers\", expect.server.answers, byKey(result.submission.answers));\n check(\"server.context\", expect.server.context, result.submission.context);\n if (expect.server.ignored) {\n check(\"server.ignored\", sorted(expect.server.ignored), sorted(result.submission.ignored));\n } } else if (expect.server.errors) {\n check(\"server.errors\", sorted(expect.server.errors), sorted(Object.keys(result.errors).map(keyOf)));\n }\n }\n return { pass: failures.length === 0, failures, state: engine.getState() };\n}\n\nexport interface RecordScenarioOptions {\n description?: string;\n tags?: string[];\n /** URL and host inputs. Default: the engine's non-server hidden values. */\n hidden?: Record<string, Json>;\n /** Server inputs. Default: the engine's values for `source: \"server\"` inputs. */\n context?: Record<string, Json>;\n /** Record the server's verdict too. Default true. */\n server?: boolean;\n /** Merge keystroke-level answer events with `compactEvents`. Default true. */\n compact?: boolean;\n}\n\n/** Freeze a live engine as a scenario, with expectations filled from its current state. */\nexport function recordScenario(engine: FormEngine, name: string, opts: RecordScenarioOptions = {}): Scenario {\n const definition = JSON.parse(JSON.stringify(engine.definition)) as FormDefinition;\n const state = engine.getState();\n const sources = new Map((definition.hidden ?? []).map((h) => [h.name, h.source]));\n const split = (server: boolean) =>\n Object.fromEntries(\n Object.entries(state.hidden).filter(\n (e): e is [string, Json] => e[1] !== undefined && (sources.get(e[0]) === \"server\") === server,\n ),\n );\n const hidden = opts.hidden ?? split(false);\n const context = opts.context ?? split(true);\n\n const raw = opts.compact === false ? state.events : compactEvents(state.events);\n // No timestamps: scenarios replay with the clock off and must diff cleanly.\n const events = raw.map(({ at: _at, ...e }) => JSON.parse(JSON.stringify(e)) as FormEvent);\n\n const actual = snapshot(engine);\n const scenario: Scenario = {\n scenarioVersion: 1,\n name,\n ...(opts.description ? { description: opts.description } : {}),\n ...(opts.tags ? { tags: opts.tags } : {}),\n definition,\n ...(Object.keys(hidden).length ? { hidden } : {}),\n ...(Object.keys(context).length ? { context } : {}),\n events,\n expect: {\n path: actual.path,\n visible: actual.visible,\n current: actual.current,\n status: actual.status,\n ending: actual.ending,\n answers: actual.answers,\n ...(actual.errors.length ? { errors: actual.errors } : {}),\n },\n };\n\n if (opts.server !== false) {\n const { keyOf, byKey } = keyed(definition);\n const result = validateSubmission(\n definition,\n { events, hidden },\n { context, complete: actual.status === \"completed\" },\n );\n scenario.expect.server = result.ok\n ? {\n ok: true,\n answers: byKey(result.submission.answers),\n context: result.submission.context,\n ...(result.submission.ignored.length ? { ignored: result.submission.ignored } : {}),\n }\n : { ok: false, errors: Object.keys(result.errors).map(keyOf) };\n }\n return scenario;\n}\n","/** Walk a form the way a respondent would, by field key. */\nimport { createForm, type CreateFormOptions, type FormEngine } from \"./engine\";\nimport type { FormDefinition, Json } from \"./types\";\n\nexport { coverage, type CoverageOptions, type CoverageReport, type EndingCoverage } from \"./coverage\";\nexport {\n compactEvents,\n recordScenario,\n runScenario,\n type RecordScenarioOptions,\n type Scenario,\n type ScenarioExpectation,\n type ScenarioResult,\n} from \"./scenario\";\n\nexport interface Simulation {\n engine: FormEngine;\n /** Answer by key: `answer({ overall: 2 })`. */\n answer(values: Record<string, Json | undefined>): Simulation;\n /** Keys of the fields currently visible, in path order. */\n visibleKeys(): string[];\n /** Keys on the respondent's path, fields and content. */\n pathKeys(): string[];\n /** Submit; returns the ending reached, or throws with the errors by key. */\n submit(): string | null;\n}\n\nexport function simulate(\n form: FormDefinition | { definition: FormDefinition },\n options: CreateFormOptions = {},\n): Simulation {\n const definition = \"definition\" in form ? form.definition : form;\n const engine = createForm(definition, { clock: () => undefined, ...options });\n const keyOf = (id: string) => engine.field(id)?.key ?? id;\n\n const sim: Simulation = {\n engine,\n answer(values) {\n for (const [key, value] of Object.entries(values)) engine.setValue(engine.idOf(key), value);\n return sim;\n },\n visibleKeys: () =>\n engine\n .getState()\n .path.filter((id) => engine.field(id) && engine.isVisible(id))\n .map(keyOf),\n pathKeys: () => engine.getState().path.map(keyOf),\n submit() {\n if (!engine.submit()) {\n const errors = Object.fromEntries(Object.entries(engine.getState().errors).map(([id, m]) => [keyOf(id), m]));\n throw new Error(`Form has errors: ${JSON.stringify(errors)}`);\n }\n return engine.getState().ending;\n },\n };\n return sim;\n}\n"]}