@marktiderman/genesis-forms 0.6.0 → 0.7.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/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/parse.ts","../src/edit-link.ts","../src/rate-limit.ts","../src/server.ts"],"names":["own","blank","plural","numberOps","finite","i","shown","out","round","isObject","name","maxLength","encoder","answers"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * A small, safe formula language for `calculated` fields. It is parsed and\n * evaluated here, never with `eval` or `Function`, and it can only read the\n * answers it names.\n *\n * - Numbers: `12`, `0.5`. Text: `\"High\"` or `'High'`.\n * - Answers by key: `hours`, and one column of a table: `plan.cost`.\n * - Arithmetic: `+ - * /` (also `− × ÷`), unary minus, parentheses.\n * - Comparisons: `== != < <= > >=` (also `= ≠ ≤ ≥`), giving true or false.\n * - A choice: `cond ? a : b`.\n * - `sum(...)`, `avg(...)`, `min(...)`, `max(...)` over numbers, lists and\n * table columns. Blanks and text that is not a number are skipped.\n *\n * An unanswered question reads as blank: arithmetic with a blank is blank\n * (so a total stays empty until its answers are in), and so is dividing by\n * zero. Text that holds a number (\"12\") counts as that number; yes / no\n * counts as 1 / 0.\n */\nimport type { Json } from \"./types\";\n\nexport type FormulaValue = number | string | boolean | null | FormulaValue[];\n\n/** An answer a formula reads: `key`, or `key.column` for one column of a table. */\nexport interface FormulaRef {\n key: string;\n column?: string;\n}\n\ntype BinaryOp = \"+\" | \"-\" | \"*\" | \"/\" | \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\";\n\nexport const FORMULA_FUNCTIONS = [\"sum\", \"avg\", \"min\", \"max\"] as const;\nexport type FormulaFunction = (typeof FORMULA_FUNCTIONS)[number];\n\nexport type FormulaNode =\n | { kind: \"number\"; value: number }\n | { kind: \"text\"; value: string }\n | { kind: \"ref\"; key: string; column?: string; at: number }\n | { kind: \"unary\"; op: \"-\"; arg: FormulaNode }\n | { kind: \"binary\"; op: BinaryOp; left: FormulaNode; right: FormulaNode }\n | { kind: \"if\"; test: FormulaNode; then: FormulaNode; else: FormulaNode }\n | { kind: \"call\"; fn: FormulaFunction; args: FormulaNode[] };\n\nexport type FormulaParseResult =\n | { ok: true; ast: FormulaNode; refs: FormulaRef[] }\n | { ok: false; message: string; /** Character offset of the problem. */ at: number };\n\n/** Longest formula accepted. */\nexport const MAX_FORMULA_LENGTH = 2000;\n/** Deepest nesting of parentheses, function calls, signs and `? :`, each counting one level. */\nconst MAX_DEPTH = 64;\n\ntype Token =\n | { t: \"num\"; v: number; at: number }\n | { t: \"str\"; v: string; at: number }\n | { t: \"id\"; v: string; at: number }\n | { t: \"op\"; v: string; at: number }\n | { t: \"end\"; at: number };\n\nconst OP_ALIASES: Record<string, string> = { \"−\": \"-\", \"×\": \"*\", \"÷\": \"/\", \"≠\": \"!=\", \"≤\": \"<=\", \"≥\": \">=\", \"=\": \"==\" };\nconst TWO_CHAR = new Set([\"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR = new Set([\"+\", \"-\", \"*\", \"/\", \"<\", \">\", \"(\", \")\", \"?\", \":\", \",\", \".\", \"=\", \"−\", \"×\", \"÷\", \"≠\", \"≤\", \"≥\"]);\nconst COMPARISONS = new Set([\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\"]);\n\nclass FormulaError extends Error {\n constructor(\n message: string,\n readonly at: number,\n ) {\n super(message);\n }\n}\n\nconst isIdStart = (c: string) => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\nconst isIdPart = (c: string) => isIdStart(c) || (c >= \"0\" && c <= \"9\");\nconst isDigit = (c: string) => c >= \"0\" && c <= \"9\";\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < source.length) {\n const c = source[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n i++;\n continue;\n }\n const at = i;\n if (isDigit(c) || (c === \".\" && isDigit(source[i + 1] ?? \"\"))) {\n while (isDigit(source[i] ?? \"\")) i++;\n if (source[i] === \".\" && isDigit(source[i + 1] ?? \"\")) {\n i++;\n while (isDigit(source[i] ?? \"\")) i++;\n }\n // `1e6` and `2x` are not numbers here: say so rather than \"expected an operator\".\n if (isIdStart(source[i] ?? \"\")) throw new FormulaError(\"Write a number in digits only, like 1000000.\", at);\n const v = Number(source.slice(at, i));\n if (!Number.isFinite(v)) throw new FormulaError(\"This number is too large.\", at);\n tokens.push({ t: \"num\", v, at });\n continue;\n }\n if (isIdStart(c)) {\n while (isIdPart(source[i] ?? \"\")) i++;\n tokens.push({ t: \"id\", v: source.slice(at, i), at });\n continue;\n }\n if (c === '\"' || c === \"'\" || c === \"“\") {\n const close = c === \"“\" ? \"”\" : c;\n const end = source.indexOf(close, i + 1);\n if (end === -1) throw new FormulaError(\"This text has no closing quote.\", at);\n tokens.push({ t: \"str\", v: source.slice(i + 1, end), at });\n i = end + 1;\n continue;\n }\n const two = source.slice(i, i + 2);\n if (TWO_CHAR.has(two)) {\n tokens.push({ t: \"op\", v: two, at });\n i += 2;\n continue;\n }\n if (ONE_CHAR.has(c)) {\n tokens.push({ t: \"op\", v: OP_ALIASES[c] ?? c, at });\n i++;\n continue;\n }\n throw new FormulaError(`\"${c}\" can't be used in a formula.`, at);\n }\n tokens.push({ t: \"end\", at: source.length });\n return tokens;\n}\n\n/**\n * Parse a formula. Never throws: a mistake comes back as `{ ok: false,\n * message, at }`, with the character offset of the problem.\n */\nexport function parseFormula(source: string): FormulaParseResult {\n if (typeof source !== \"string\" || source.trim() === \"\") return { ok: false, message: \"Write a formula.\", at: 0 };\n if (source.length > MAX_FORMULA_LENGTH) {\n return { ok: false, message: `Keep the formula under ${MAX_FORMULA_LENGTH} characters.`, at: MAX_FORMULA_LENGTH };\n }\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch (e) {\n const err = e as FormulaError;\n return { ok: false, message: err.message, at: err.at };\n }\n let pos = 0;\n const refs: FormulaRef[] = [];\n const peek = () => tokens[pos]!;\n const isOp = (v: string) => {\n const tok = peek();\n return tok.t === \"op\" && tok.v === v;\n };\n const expect = (v: string, message: string) => {\n if (!isOp(v)) throw new FormulaError(message, peek().at);\n pos++;\n };\n const describe = (tok: Token) => (tok.t === \"end\" ? \"the formula ends there\" : `found \"${String(tok.v)}\"`);\n const guard = (depth: number) => {\n if (depth > MAX_DEPTH) throw new FormulaError(\"The formula is nested too deeply.\", peek().at);\n };\n\n const ternary = (depth: number): FormulaNode => {\n guard(depth);\n const test = comparison(depth);\n if (!isOp(\"?\")) return test;\n pos++;\n const then = ternary(depth + 1);\n expect(\":\", \"A `?` needs a `:` and the other value: `test ? a : b`.\");\n const otherwise = ternary(depth + 1);\n return { kind: \"if\", test, then, else: otherwise };\n };\n const comparison = (depth: number): FormulaNode => {\n const left = additive(depth);\n const tok = peek();\n if (tok.t !== \"op\" || !COMPARISONS.has(tok.v)) return left;\n pos++;\n const right = additive(depth);\n const next = peek();\n if (next.t === \"op\" && COMPARISONS.has(next.v)) {\n throw new FormulaError(\"Compare two values at a time; combine comparisons with `? :`.\", next.at);\n }\n return { kind: \"binary\", op: tok.v as BinaryOp, left, right };\n };\n const additive = (depth: number): FormulaNode => {\n let left = multiplicative(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"+\" || tok.v === \"-\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: multiplicative(depth) };\n }\n return left;\n };\n const multiplicative = (depth: number): FormulaNode => {\n let left = unary(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"*\" || tok.v === \"/\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: unary(depth) };\n }\n return left;\n };\n const unary = (depth: number): FormulaNode => {\n guard(depth);\n if (isOp(\"-\")) {\n pos++;\n return { kind: \"unary\", op: \"-\", arg: unary(depth + 1) };\n }\n if (isOp(\"+\")) {\n pos++;\n return unary(depth + 1);\n }\n return primary(depth);\n };\n const primary = (depth: number): FormulaNode => {\n const tok = peek();\n if (tok.t === \"num\") {\n pos++;\n return { kind: \"number\", value: tok.v };\n }\n if (tok.t === \"str\") {\n pos++;\n return { kind: \"text\", value: tok.v };\n }\n if (tok.t === \"op\" && tok.v === \"(\") {\n pos++;\n const inner = ternary(depth + 1);\n expect(\")\", \"A `(` has no matching `)`.\");\n return inner;\n }\n if (tok.t === \"id\") {\n pos++;\n if (isOp(\"(\")) {\n if (!(FORMULA_FUNCTIONS as readonly string[]).includes(tok.v)) {\n throw new FormulaError(`There is no function \"${tok.v}\"; use ${FORMULA_FUNCTIONS.join(\", \")}.`, tok.at);\n }\n pos++;\n const args: FormulaNode[] = [];\n if (!isOp(\")\")) {\n args.push(ternary(depth + 1));\n while (isOp(\",\")) {\n pos++;\n args.push(ternary(depth + 1));\n }\n }\n expect(\")\", `\"${tok.v}(\" has no matching \")\".`);\n if (!args.length) throw new FormulaError(`${tok.v}() needs something to work on.`, tok.at);\n return { kind: \"call\", fn: tok.v as FormulaFunction, args };\n }\n if (isOp(\".\")) {\n pos++;\n const column = peek();\n if (column.t !== \"id\") throw new FormulaError(`Name a column after \"${tok.v}.\".`, column.at);\n pos++;\n refs.push({ key: tok.v, column: column.v });\n return { kind: \"ref\", key: tok.v, column: column.v, at: tok.at };\n }\n refs.push({ key: tok.v });\n return { kind: \"ref\", key: tok.v, at: tok.at };\n }\n throw new FormulaError(`Expected a number, an answer or \"(\", but ${describe(tok)}.`, tok.at);\n };\n\n try {\n const ast = ternary(0);\n const rest = peek();\n if (rest.t !== \"end\") throw new FormulaError(`Expected an operator such as + or *, but ${describe(rest)}.`, rest.at);\n return { ok: true, ast, refs };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, message: e.message, at: e.at };\n return { ok: false, message: \"The formula is nested too deeply.\", at: 0 };\n }\n}\n\n/** The answers a formula names, each once (none when it doesn't parse). */\nexport function formulaRefs(source: string): FormulaRef[] {\n const parsed = parseFormula(source);\n if (!parsed.ok) return [];\n const seen = new Set<string>();\n return parsed.refs.filter((r) => {\n const id = `${r.key}\\u0000${r.column ?? \"\"}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n\n/**\n * The formula with every reference to the answer `from` renamed to `to`.\n * Column names, function names and text are left alone. Returned unchanged\n * when it has a character a formula can't hold.\n */\nexport function renameFormulaKey(source: string, from: string, to: string): string {\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch {\n return source;\n }\n let out = \"\";\n let last = 0;\n tokens.forEach((tok, i) => {\n if (tok.t !== \"id\" || tok.v !== from) return;\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (prev?.t === \"op\" && prev.v === \".\") return;\n if (next?.t === \"op\" && next.v === \"(\") return;\n out += source.slice(last, tok.at) + to;\n last = tok.at + from.length;\n });\n return out + source.slice(last);\n}\n\n// ── Evaluation ───────────────────────────────────────────────────────────────\n\nconst NUMERIC = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\n\n/** A value as a number: numbers, numeric text (\"1,200\" too), yes / no as 1 / 0. Anything else is blank (`null`). */\nexport function formulaNumber(v: FormulaValue | Json | undefined): number | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (typeof v === \"string\") {\n const t = v.trim().replace(/,/g, \"\");\n return t.length <= 64 && NUMERIC.test(t) ? finite(Number(t)) : null;\n }\n return null;\n}\n\nconst finite = (n: number): number | null => (Number.isFinite(n) ? n : null);\n/** A list in arithmetic is blank: add one up with `sum(...)`. */\nconst scalar = (v: FormulaValue): FormulaValue => (Array.isArray(v) ? null : v);\n\nfunction truthy(v: FormulaValue): boolean {\n if (v === null) return false;\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"number\") return v !== 0;\n if (typeof v === \"string\") return v.trim() !== \"\";\n return v.length > 0;\n}\n\nfunction numbersIn(values: FormulaValue[], out: number[] = []): number[] {\n for (const v of values) {\n if (Array.isArray(v)) numbersIn(v, out);\n else {\n const n = formulaNumber(v);\n if (n !== null) out.push(n);\n }\n }\n return out;\n}\n\ninterface Totals {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\n/**\n * Each list's numbers added up once, for the lists this package built and\n * froze itself (the calculator's lists, one per answer and column), so a\n * formula worked out again over an unchanged table doesn't walk it again.\n * Any other list a reader returns may change in place, so it is added up\n * every time.\n */\nconst listTotals = new WeakMap<readonly FormulaValue[], Totals>();\nconst ownLists = new WeakSet<readonly FormulaValue[]>();\n\n/** Mark a frozen list built inside this package as safe to keep totals for (not exported from the package). */\nexport function ownFormulaList(list: FormulaValue[]): readonly FormulaValue[] {\n Object.freeze(list);\n ownLists.add(list);\n return list;\n}\n\nfunction totalsOf(list: readonly FormulaValue[]): Totals {\n const own = ownLists.has(list);\n let t = own ? listTotals.get(list) : undefined;\n if (t) return t;\n const nums = numbersIn(list as FormulaValue[]);\n t = { sum: 0, count: nums.length, min: Infinity, max: -Infinity };\n for (const n of nums) {\n t.sum += n;\n if (n < t.min) t.min = n;\n if (n > t.max) t.max = n;\n }\n if (own) listTotals.set(list, t);\n return t;\n}\n\nfunction compare(op: BinaryOp, a: FormulaValue, b: FormulaValue): boolean {\n const blank = (v: FormulaValue) => v === null || Array.isArray(v) || (typeof v === \"string\" && v.trim() === \"\");\n // A blank equals nothing: `!=` holds and every other comparison fails.\n if (blank(a) || blank(b)) return op === \"!=\";\n const x = formulaNumber(a);\n const y = formulaNumber(b);\n if (x !== null && y !== null) {\n if (op === \"==\") return x === y;\n if (op === \"!=\") return x !== y;\n if (op === \"<\") return x < y;\n if (op === \"<=\") return x <= y;\n if (op === \">\") return x > y;\n return x >= y;\n }\n // Text is equal or not; it has no order.\n if (op === \"==\") return String(a) === String(b);\n if (op === \"!=\") return String(a) !== String(b);\n return false;\n}\n\n/** Reads an answer for `evaluateFormula`: its value, or `null` when unanswered or unknown. */\nexport type FormulaReader = (ref: FormulaRef) => FormulaValue;\n\n/** Evaluate a parsed formula. Never throws; a value it can't work out is `null`. */\nexport function evaluateFormula(ast: FormulaNode, read: FormulaReader): FormulaValue {\n const run = (node: FormulaNode): FormulaValue => {\n switch (node.kind) {\n case \"number\":\n case \"text\":\n return node.value;\n case \"ref\":\n // The node itself: a reader may key on it, and it is never changed.\n return read(node);\n case \"unary\": {\n const n = formulaNumber(scalar(run(node.arg)));\n return n === null ? null : -n;\n }\n case \"if\":\n return truthy(run(node.test)) ? run(node.then) : run(node.else);\n case \"call\": {\n let total = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const arg of node.args) {\n const v = run(arg);\n if (Array.isArray(v)) {\n const t = totalsOf(v);\n total += t.sum;\n count += t.count;\n if (t.min < min) min = t.min;\n if (t.max > max) max = t.max;\n continue;\n }\n const n = formulaNumber(v);\n if (n === null) continue;\n total += n;\n count++;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n if (node.fn === \"sum\") return finite(total);\n if (!count) return null;\n if (node.fn === \"avg\") return finite(total / count);\n return node.fn === \"min\" ? min : max;\n }\n case \"binary\": {\n const a = run(node.left);\n const b = run(node.right);\n if (node.op === \"+\" || node.op === \"-\" || node.op === \"*\" || node.op === \"/\") {\n const x = formulaNumber(scalar(a));\n const y = formulaNumber(scalar(b));\n if (x === null || y === null) return null;\n if (node.op === \"+\") return finite(x + y);\n if (node.op === \"-\") return finite(x - y);\n if (node.op === \"*\") return finite(x * y);\n return y === 0 ? null : finite(x / y);\n }\n return compare(node.op, a, b);\n }\n }\n };\n try {\n return run(ast);\n } catch {\n return null;\n }\n}\n","import type { FieldTypeManifest } from \"./fields\";\nimport { evaluateFormula, formulaNumber, ownFormulaList, parseFormula, type FormulaNode, type FormulaRef, type FormulaValue } from \"./formula\";\nimport type { FieldBlock, FormDefinition, Json, Operator } from \"./types\";\n\n/** The calculated field type's registry key. */\nexport const CALCULATED_TYPE = \"calculated\";\n\n/**\n * Field types the builder offers only to a host that names them in its\n * palette, like `STRUCTURED_FIELD_TYPES`: `calculated` shows a value worked\n * out from other answers, so it is opt-in for hosts that want formulas.\n */\nexport const COMPUTED_FIELD_TYPES = [CALCULATED_TYPE] as const;\n\nexport type CalculatedFormat = \"number\" | \"percent\" | \"text\";\n/** Longest the formulas of one form may be, all together (`parseForm` checks it). */\nexport const MAX_FORM_FORMULA_LENGTH = 20_000;\n/** Most decimal places a calculated value may keep. */\nexport const MAX_CALCULATED_DECIMALS = 10;\n\nexport interface CalculatedProps {\n formula: string;\n format?: CalculatedFormat | undefined;\n decimals?: number | undefined;\n}\n\n/** A calculated field's settings, with anything malformed left out. */\nexport function calculatedProps(field: FieldBlock): CalculatedProps {\n const p = field.props ?? {};\n const out: CalculatedProps = { formula: typeof p.formula === \"string\" ? p.formula : \"\" };\n if (p.format === \"number\" || p.format === \"percent\" || p.format === \"text\") out.format = p.format;\n if (typeof p.decimals === \"number\" && Number.isInteger(p.decimals) && p.decimals >= 0 && p.decimals <= MAX_CALCULATED_DECIMALS) {\n out.decimals = p.decimals;\n }\n return out;\n}\n\nexport const isCalculated = (field: FieldBlock | undefined): boolean => field?.type === CALCULATED_TYPE;\n\nconst round = (n: number, decimals: number | undefined) => {\n if (decimals === undefined) return n;\n const r = Number(n.toFixed(decimals));\n return Object.is(r, -0) ? 0 : r;\n};\n\n/**\n * What a formula's result is stored as. `number` and `percent` keep a number\n * (`0.25` for 25%), rounded to `decimals`; `text` keeps text. Without a\n * format, numbers, text and true / false are kept as they are. A list, and\n * anything the format can't hold, is no value (`undefined`).\n */\nexport function calculatedValue(result: FormulaValue, field: FieldBlock): Json | undefined {\n 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 { 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 * Edit links for a sent response: `<id>.<nonce>.<expires>.<sig>`, where sig is the\n * base64url HMAC-SHA256 of `edit-link:v2:<id>.<nonce>.<expires>` under a server-only\n * secret of at least 32 bytes.\n *\n * - id: the response's uuid.\n * - nonce: the response's current edit nonce, kept by the app. The app refuses a link\n * whose nonce is no longer the response's, so changing the nonce revokes every link\n * made before (change it after each edit: only the newest link works).\n * - expires: when the link stops working, in Unix seconds, about 30 days after it was\n * made (`EDIT_LINK_TTL_SECONDS`).\n *\n * Without a usable secret (missing, or shorter than `MIN_EDIT_SECRET_BYTES`) there are no\n * edit links: signing returns null and every token fails to verify.\n *\n * Web Crypto only, no storage: the app keeps the nonce and checks it. Moved up from\n * Breakthrough's src/lib/forms/edit-link.ts unchanged, so links it signed still verify.\n */\n\n/** How long a new edit link works: 30 days. */\nexport const EDIT_LINK_TTL_SECONDS = 30 * 24 * 60 * 60;\n/** The shortest secret edit links are signed with: 32 bytes (UTF-8), as long as the HMAC. */\nexport const MIN_EDIT_SECRET_BYTES = 32;\n/** The query parameter an edit link's token travels in: `?edit=<token>`. */\nexport const EDIT_LINK_PARAM = \"edit\";\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n// A uuid, or any other url-safe random string of 16 to 64 characters.\nconst NONCE = /^[A-Za-z0-9_-]{16,64}$/;\nconst EXPIRES = /^[1-9][0-9]{0,11}$/;\nconst SIG = /^[A-Za-z0-9_-]{43}$/; // 32 bytes, base64url without padding\nconst DOMAIN = \"edit-link:v2:\";\n/** The longest token looked at: a uuid, a 64-character nonce, 12 digits and a signature fit well within it. */\nconst MAX_TOKEN_LENGTH = 300;\n\nconst encoder = new TextEncoder();\n\nfunction toBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction fromBase64Url(text: string): Uint8Array<ArrayBuffer> {\n const binary = atob(text.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Whether `secret` can sign edit links: a string of at least `MIN_EDIT_SECRET_BYTES` bytes. */\nexport function isUsableEditSecret(secret: string | null | undefined): secret is string {\n return (\n typeof secret === \"string\" &&\n secret.trim().length > 0 &&\n encoder.encode(secret).length >= MIN_EDIT_SECRET_BYTES\n );\n}\n\nfunction hmacKey(secret: string, usage: \"sign\" | \"verify\") {\n return crypto.subtle.importKey(\"raw\", encoder.encode(secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [usage]);\n}\n\n/** What an edit link says: the response, its nonce when the link was made, and when it stops working. */\nexport interface EditLinkClaims {\n /** The response's id, in lower case. */\n id: string;\n nonce: string;\n /** Unix seconds. */\n expiresAt: number;\n}\n\nexport interface EditLinkOptions {\n /** The current time in milliseconds (tests); `Date.now()` by default. */\n now?: number | undefined;\n /** How long the link works, in seconds; `EDIT_LINK_TTL_SECONDS` by default. */\n ttlSeconds?: number | undefined;\n}\n\nconst payload = (id: string, nonce: string, expiresAt: number) =>\n encoder.encode(`${DOMAIN}${id}.${nonce}.${expiresAt}`);\n\n/**\n * The edit token for a response and its current nonce, working for `ttlSeconds` from\n * now; null when there is no usable secret (no edit links) or the id or nonce is malformed.\n */\nexport async function signEditToken(\n link: { id: string; nonce: string },\n secret: string | null | undefined,\n options: EditLinkOptions = {},\n): Promise<string | null> {\n if (!isUsableEditSecret(secret) || !UUID.test(link.id) || !NONCE.test(link.nonce)) return null;\n const ttl = options.ttlSeconds ?? EDIT_LINK_TTL_SECONDS;\n if (!Number.isFinite(ttl) || ttl <= 0) return null;\n const id = link.id.toLowerCase();\n const expiresAt = Math.floor((options.now ?? Date.now()) / 1000) + Math.floor(ttl);\n const sig = await crypto.subtle.sign(\"HMAC\", await hmacKey(secret, \"sign\"), payload(id, link.nonce, expiresAt));\n return `${id}.${link.nonce}.${expiresAt}.${toBase64Url(new Uint8Array(sig))}`;\n}\n\n/**\n * What a token says, or null when it is malformed, its signature does not match, it has\n * expired (or claims to last longer than `ttlSeconds` from now), or there is no usable\n * secret. Whether the nonce is still the response's is the caller's check. The\n * comparison is Web Crypto's HMAC verify, which runs in constant time.\n */\nexport async function verifyEditToken(\n token: string | null | undefined,\n secret: string | null | undefined,\n options: EditLinkOptions = {},\n): Promise<EditLinkClaims | null> {\n if (!isUsableEditSecret(secret) || typeof token !== \"string\" || token.length > MAX_TOKEN_LENGTH) return null;\n const parts = token.split(\".\");\n if (parts.length !== 4) return null;\n const [id, nonce, expires, sig] = parts as [string, string, string, string];\n if (!UUID.test(id) || id !== id.toLowerCase() || !NONCE.test(nonce) || !EXPIRES.test(expires)) return null;\n if (!SIG.test(sig)) return null;\n const expiresAt = Number(expires);\n const now = Math.floor((options.now ?? Date.now()) / 1000);\n const ttl = options.ttlSeconds ?? EDIT_LINK_TTL_SECONDS;\n if (expiresAt <= now || expiresAt > now + ttl) return null;\n let bytes: Uint8Array<ArrayBuffer>;\n try {\n bytes = fromBase64Url(sig);\n } catch {\n return null;\n }\n const ok = await crypto.subtle.verify(\"HMAC\", await hmacKey(secret, \"verify\"), bytes, payload(id, nonce, expiresAt));\n return ok ? { id, nonce, expiresAt } : null;\n}\n\n/**\n * A form link with the edit token added: `<formUrl>?edit=<token>` (or `&edit=` when it\n * has a query). `param` names the parameter; `EDIT_LINK_PARAM` by default.\n */\nexport function withEditToken(formUrl: string, token: string, param: string = EDIT_LINK_PARAM): string {\n return `${formUrl}${formUrl.includes(\"?\") ? \"&\" : \"?\"}${param}=${encodeURIComponent(token)}`;\n}\n\nexport interface EditLinkUrlOptions extends EditLinkOptions {\n /** The query parameter; `EDIT_LINK_PARAM` by default. */\n param?: string | undefined;\n}\n\n/**\n * The link that reopens a response for editing: `formUrl` (the page that shows the form,\n * with any query it needs) plus a token signed for the response's current nonce. Null\n * when there are no edit links (no usable secret) or the id or nonce is malformed.\n */\nexport async function editLinkUrl(\n formUrl: string,\n link: { id: string; nonce: string },\n secret: string | null | undefined,\n options: EditLinkUrlOptions = {},\n): Promise<string | null> {\n const token = await signEditToken(link, secret, options);\n return token ? withEditToken(formUrl, token, options.param) : null;\n}\n\n/** Where the edit-secret reader reports a missing or short secret. */\nexport type EditSecretLog = (message: string) => void;\n\n/** Reads the edit-link secret from an environment, warning once when there is none. */\nexport interface EditSecretReader {\n /** The secret, or null (no edit links) when it is missing or too short; warns once, never with the secret. */\n (env: Record<string, string | undefined>, log?: EditSecretLog): string | null;\n /** Tests only: warn again. */\n reset(): void;\n}\n\n/**\n * A reader for the environment variable that holds the edit-link secret (such as\n * `FEEDBACK_EDIT_SECRET`). Without one of at least `MIN_EDIT_SECRET_BYTES` bytes there are\n * no edit links, and the first read says so through `log` (the call's, else the\n * reader's, else `console.warn`); later reads stay quiet until `reset()`.\n */\nexport function createEditSecretReader(options: { variable: string; log?: EditSecretLog | undefined }): EditSecretReader {\n const { variable } = options;\n let warned = false;\n const read = (env: Record<string, string | undefined>, log?: EditSecretLog): string | null => {\n const secret = env[variable];\n if (isUsableEditSecret(secret)) return secret;\n if (!warned) {\n warned = true;\n (log ?? options.log ?? ((m: string) => console.warn(m)))(\n `${variable} is ${secret ? `shorter than ${MIN_EDIT_SECRET_BYTES} bytes` : \"not set\"}: edit links are off.`,\n );\n }\n return null;\n };\n return Object.assign(read, {\n reset: () => {\n warned = false;\n },\n });\n}\n\nexport interface EditLinkRequestOptions {\n /** The query parameter; `EDIT_LINK_PARAM` by default. */\n param?: string | undefined;\n /**\n * Whether the URL is a page that shows a form (an edit link is only honoured there,\n * such as `/f/<slug>`). Every URL by default.\n */\n isFormPage?: ((url: URL) => boolean) | undefined;\n}\n\n/** Whether this request is a form page opened with an edit link (the parameter present, even empty). */\nexport function isEditLinkRequest(url: URL, options: EditLinkRequestOptions = {}): boolean {\n const isFormPage = options.isFormPage ?? (() => true);\n return isFormPage(url) && url.searchParams.has(options.param ?? EDIT_LINK_PARAM);\n}\n\n/**\n * The response, with `Referrer-Policy: no-referrer` and `Cache-Control: private, no-store`\n * added when the request carried an edit link; otherwise the same response, untouched.\n * The link is a credential, so it never leaves in a Referer header (an HTTP header, not\n * only the page's meta tag, so it holds before the page has parsed and for every request\n * the page makes), and the page, prefilled with the response, is never cached.\n */\nexport function withEditLinkHeaders(request: Request, response: Response, options: EditLinkRequestOptions = {}): Response {\n let url: URL;\n try {\n url = new URL(request.url);\n } catch {\n return response;\n }\n if (!isEditLinkRequest(url, options)) return response;\n const headers = new Headers(response.headers);\n headers.set(\"referrer-policy\", \"no-referrer\");\n headers.set(\"cache-control\", \"private, no-store\");\n return new Response(response.body, { status: response.status, statusText: response.statusText, headers });\n}\n","/**\n * The pieces of a submit endpoint's rate limit that aren't storage: the client's\n * address, the part of it that names one client, a key that never holds the address,\n * and a check that fails open. The counter itself is the app's (`RateLimitStore`), so\n * every server instance can share it (a row in Postgres, a key in Redis).\n *\n * Web Crypto only. Moved up from Breakthrough's src/lib/feedback/rate-limit.server.ts;\n * keys made here equal the ones it made, so a deploy doesn't reset anyone's count.\n */\n\n/**\n * The headers a proxy reports the client's address in, most trusted first. Trust only\n * headers your proxy sets (and overwrites): a client can send any of them itself.\n */\nexport const DEFAULT_TRUSTED_IP_HEADERS: readonly string[] = [\"x-vercel-forwarded-for\", \"x-forwarded-for\", \"x-real-ip\"];\n\n/**\n * How many submits, saves as they go and photo uploads one client may make per scope\n * (a practice, an account) in a window.\n *\n * - submit: 60 responses per 10 minutes: a class at one gym's Wi-Fi fits.\n * - progress: saving answers as they go. A visit counts once, against `submit`, at its\n * first save; its later saves (each Next, the send, a reload picking up where it was)\n * count here, in the same window: 60 people answering 10 questions each on one Wi-Fi fit.\n * - upload: 120 photos per 10 minutes: that class, a couple of photos each.\n */\nexport const RATE_LIMIT_DEFAULTS = {\n submit: { limit: 60, windowSeconds: 600 },\n progress: { limit: 900, windowSeconds: 600 },\n upload: { limit: 120, windowSeconds: 600 },\n} as const satisfies Record<string, { limit: number; windowSeconds: number }>;\n\n/**\n * The client's address as the proxy reports it, used only as a rate-limit key: the first\n * entry of the first of `trusted` that is set, trimmed, else `\"unknown\"`.\n */\nexport function clientIp(headers: Pick<Headers, \"get\">, trusted: readonly string[] = DEFAULT_TRUSTED_IP_HEADERS): string {\n for (const name of trusted) {\n const first = headers.get(name)?.split(\",\")[0]?.trim();\n if (first) return first;\n }\n return \"unknown\";\n}\n\n/** The part of an address that names one client: an IPv4 address whole, an IPv6 address by its /64. */\nexport function addressPrefix(ip: string): string {\n const bare = ip\n .replace(/^\\[|\\](:\\d+)?$/g, \"\")\n .split(\"%\")[0]!\n .toLowerCase();\n if (!bare.includes(\":\")) return bare;\n const mapped = /^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/.exec(bare);\n if (mapped) return mapped[1]!;\n const [head = \"\", tail = \"\"] = bare.split(\"::\");\n const left = head ? head.split(\":\") : [];\n const right = bare.includes(\"::\") && tail ? tail.split(\":\") : [];\n const groups = bare.includes(\"::\")\n ? [...left, ...Array<string>(Math.max(0, 8 - left.length - right.length)).fill(\"0\"), ...right]\n : left;\n return `${groups\n .slice(0, 4)\n .map((g) => (g || \"0\").replace(/^0+(?=.)/, \"\"))\n .join(\":\")}::/64`;\n}\n\n/**\n * The stored key, `<kind>:<scope>:<hex HMAC-SHA256 of the address prefix>`: what is\n * counted (such as `submit`, `progress`, `upload`), whose count it is (a practice id),\n * and the client, which is never stored as its address. `secret` is a server secret.\n */\nexport async function rateLimitKey(input: { kind: string; scope: string; ip: string; secret: string }): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(input.secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n \"sign\",\n ]);\n const mac = new Uint8Array(await crypto.subtle.sign(\"HMAC\", key, encoder.encode(addressPrefix(input.ip))));\n let hex = \"\";\n for (const b of mac) hex += b.toString(16).padStart(2, \"0\");\n return `${input.kind}:${input.scope}:${hex}`;\n}\n\n/** The app's shared counter. */\nexport interface RateLimitStore {\n /**\n * Count one hit on `key` in its current `windowSeconds` window: true while the count is\n * within `limit`, false past it, null when it could not count.\n */\n hit(key: string, limit: number, windowSeconds: number): Promise<boolean | null>;\n}\n\n/**\n * True when the request may go on. Fails open: when the store can't count (it answers\n * null or throws) the request goes on and `log` says so with `message`.\n */\nexport async function allow(\n store: RateLimitStore,\n check: { key: string; limit: number; windowSeconds: number },\n options: { log?: ((message: string) => void) | undefined; message?: string | undefined } = {},\n): Promise<boolean> {\n let allowed: boolean | null;\n try {\n allowed = await store.hit(check.key, check.limit, check.windowSeconds);\n } catch {\n allowed = null;\n }\n if (allowed !== null) return allowed;\n (options.log ?? ((m: string) => console.warn(m)))(\n options.message ?? \"The rate limit could not be checked; letting the request through.\",\n );\n return true;\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"]}
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/parse.ts","../src/edit-link.ts","../src/rate-limit.ts","../src/uploads.ts","../src/upload-protocol.ts","../src/upload-handler.ts","../src/server.ts"],"names":["own","blank","plural","numberOps","finite","i","shown","out","round","isObject","name","maxLength","encoder","UUID","answers"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * A small, safe formula language for `calculated` fields. It is parsed and\n * evaluated here, never with `eval` or `Function`, and it can only read the\n * answers it names.\n *\n * - Numbers: `12`, `0.5`. Text: `\"High\"` or `'High'`.\n * - Answers by key: `hours`, and one column of a table: `plan.cost`.\n * - Arithmetic: `+ - * /` (also `− × ÷`), unary minus, parentheses.\n * - Comparisons: `== != < <= > >=` (also `= ≠ ≤ ≥`), giving true or false.\n * - A choice: `cond ? a : b`.\n * - `sum(...)`, `avg(...)`, `min(...)`, `max(...)` over numbers, lists and\n * table columns. Blanks and text that is not a number are skipped.\n *\n * An unanswered question reads as blank: arithmetic with a blank is blank\n * (so a total stays empty until its answers are in), and so is dividing by\n * zero. Text that holds a number (\"12\") counts as that number; yes / no\n * counts as 1 / 0.\n */\nimport type { Json } from \"./types\";\n\nexport type FormulaValue = number | string | boolean | null | FormulaValue[];\n\n/** An answer a formula reads: `key`, or `key.column` for one column of a table. */\nexport interface FormulaRef {\n key: string;\n column?: string;\n}\n\ntype BinaryOp = \"+\" | \"-\" | \"*\" | \"/\" | \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\";\n\nexport const FORMULA_FUNCTIONS = [\"sum\", \"avg\", \"min\", \"max\"] as const;\nexport type FormulaFunction = (typeof FORMULA_FUNCTIONS)[number];\n\nexport type FormulaNode =\n | { kind: \"number\"; value: number }\n | { kind: \"text\"; value: string }\n | { kind: \"ref\"; key: string; column?: string; at: number }\n | { kind: \"unary\"; op: \"-\"; arg: FormulaNode }\n | { kind: \"binary\"; op: BinaryOp; left: FormulaNode; right: FormulaNode }\n | { kind: \"if\"; test: FormulaNode; then: FormulaNode; else: FormulaNode }\n | { kind: \"call\"; fn: FormulaFunction; args: FormulaNode[] };\n\nexport type FormulaParseResult =\n | { ok: true; ast: FormulaNode; refs: FormulaRef[] }\n | { ok: false; message: string; /** Character offset of the problem. */ at: number };\n\n/** Longest formula accepted. */\nexport const MAX_FORMULA_LENGTH = 2000;\n/** Deepest nesting of parentheses, function calls, signs and `? :`, each counting one level. */\nconst MAX_DEPTH = 64;\n\ntype Token =\n | { t: \"num\"; v: number; at: number }\n | { t: \"str\"; v: string; at: number }\n | { t: \"id\"; v: string; at: number }\n | { t: \"op\"; v: string; at: number }\n | { t: \"end\"; at: number };\n\nconst OP_ALIASES: Record<string, string> = { \"−\": \"-\", \"×\": \"*\", \"÷\": \"/\", \"≠\": \"!=\", \"≤\": \"<=\", \"≥\": \">=\", \"=\": \"==\" };\nconst TWO_CHAR = new Set([\"==\", \"!=\", \"<=\", \">=\"]);\nconst ONE_CHAR = new Set([\"+\", \"-\", \"*\", \"/\", \"<\", \">\", \"(\", \")\", \"?\", \":\", \",\", \".\", \"=\", \"−\", \"×\", \"÷\", \"≠\", \"≤\", \"≥\"]);\nconst COMPARISONS = new Set([\"==\", \"!=\", \"<\", \"<=\", \">\", \">=\"]);\n\nclass FormulaError extends Error {\n constructor(\n message: string,\n readonly at: number,\n ) {\n super(message);\n }\n}\n\nconst isIdStart = (c: string) => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\nconst isIdPart = (c: string) => isIdStart(c) || (c >= \"0\" && c <= \"9\");\nconst isDigit = (c: string) => c >= \"0\" && c <= \"9\";\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < source.length) {\n const c = source[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n i++;\n continue;\n }\n const at = i;\n if (isDigit(c) || (c === \".\" && isDigit(source[i + 1] ?? \"\"))) {\n while (isDigit(source[i] ?? \"\")) i++;\n if (source[i] === \".\" && isDigit(source[i + 1] ?? \"\")) {\n i++;\n while (isDigit(source[i] ?? \"\")) i++;\n }\n // `1e6` and `2x` are not numbers here: say so rather than \"expected an operator\".\n if (isIdStart(source[i] ?? \"\")) throw new FormulaError(\"Write a number in digits only, like 1000000.\", at);\n const v = Number(source.slice(at, i));\n if (!Number.isFinite(v)) throw new FormulaError(\"This number is too large.\", at);\n tokens.push({ t: \"num\", v, at });\n continue;\n }\n if (isIdStart(c)) {\n while (isIdPart(source[i] ?? \"\")) i++;\n tokens.push({ t: \"id\", v: source.slice(at, i), at });\n continue;\n }\n if (c === '\"' || c === \"'\" || c === \"“\") {\n const close = c === \"“\" ? \"”\" : c;\n const end = source.indexOf(close, i + 1);\n if (end === -1) throw new FormulaError(\"This text has no closing quote.\", at);\n tokens.push({ t: \"str\", v: source.slice(i + 1, end), at });\n i = end + 1;\n continue;\n }\n const two = source.slice(i, i + 2);\n if (TWO_CHAR.has(two)) {\n tokens.push({ t: \"op\", v: two, at });\n i += 2;\n continue;\n }\n if (ONE_CHAR.has(c)) {\n tokens.push({ t: \"op\", v: OP_ALIASES[c] ?? c, at });\n i++;\n continue;\n }\n throw new FormulaError(`\"${c}\" can't be used in a formula.`, at);\n }\n tokens.push({ t: \"end\", at: source.length });\n return tokens;\n}\n\n/**\n * Parse a formula. Never throws: a mistake comes back as `{ ok: false,\n * message, at }`, with the character offset of the problem.\n */\nexport function parseFormula(source: string): FormulaParseResult {\n if (typeof source !== \"string\" || source.trim() === \"\") return { ok: false, message: \"Write a formula.\", at: 0 };\n if (source.length > MAX_FORMULA_LENGTH) {\n return { ok: false, message: `Keep the formula under ${MAX_FORMULA_LENGTH} characters.`, at: MAX_FORMULA_LENGTH };\n }\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch (e) {\n const err = e as FormulaError;\n return { ok: false, message: err.message, at: err.at };\n }\n let pos = 0;\n const refs: FormulaRef[] = [];\n const peek = () => tokens[pos]!;\n const isOp = (v: string) => {\n const tok = peek();\n return tok.t === \"op\" && tok.v === v;\n };\n const expect = (v: string, message: string) => {\n if (!isOp(v)) throw new FormulaError(message, peek().at);\n pos++;\n };\n const describe = (tok: Token) => (tok.t === \"end\" ? \"the formula ends there\" : `found \"${String(tok.v)}\"`);\n const guard = (depth: number) => {\n if (depth > MAX_DEPTH) throw new FormulaError(\"The formula is nested too deeply.\", peek().at);\n };\n\n const ternary = (depth: number): FormulaNode => {\n guard(depth);\n const test = comparison(depth);\n if (!isOp(\"?\")) return test;\n pos++;\n const then = ternary(depth + 1);\n expect(\":\", \"A `?` needs a `:` and the other value: `test ? a : b`.\");\n const otherwise = ternary(depth + 1);\n return { kind: \"if\", test, then, else: otherwise };\n };\n const comparison = (depth: number): FormulaNode => {\n const left = additive(depth);\n const tok = peek();\n if (tok.t !== \"op\" || !COMPARISONS.has(tok.v)) return left;\n pos++;\n const right = additive(depth);\n const next = peek();\n if (next.t === \"op\" && COMPARISONS.has(next.v)) {\n throw new FormulaError(\"Compare two values at a time; combine comparisons with `? :`.\", next.at);\n }\n return { kind: \"binary\", op: tok.v as BinaryOp, left, right };\n };\n const additive = (depth: number): FormulaNode => {\n let left = multiplicative(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"+\" || tok.v === \"-\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: multiplicative(depth) };\n }\n return left;\n };\n const multiplicative = (depth: number): FormulaNode => {\n let left = unary(depth);\n for (let tok = peek(); tok.t === \"op\" && (tok.v === \"*\" || tok.v === \"/\"); tok = peek()) {\n pos++;\n left = { kind: \"binary\", op: tok.v as BinaryOp, left, right: unary(depth) };\n }\n return left;\n };\n const unary = (depth: number): FormulaNode => {\n guard(depth);\n if (isOp(\"-\")) {\n pos++;\n return { kind: \"unary\", op: \"-\", arg: unary(depth + 1) };\n }\n if (isOp(\"+\")) {\n pos++;\n return unary(depth + 1);\n }\n return primary(depth);\n };\n const primary = (depth: number): FormulaNode => {\n const tok = peek();\n if (tok.t === \"num\") {\n pos++;\n return { kind: \"number\", value: tok.v };\n }\n if (tok.t === \"str\") {\n pos++;\n return { kind: \"text\", value: tok.v };\n }\n if (tok.t === \"op\" && tok.v === \"(\") {\n pos++;\n const inner = ternary(depth + 1);\n expect(\")\", \"A `(` has no matching `)`.\");\n return inner;\n }\n if (tok.t === \"id\") {\n pos++;\n if (isOp(\"(\")) {\n if (!(FORMULA_FUNCTIONS as readonly string[]).includes(tok.v)) {\n throw new FormulaError(`There is no function \"${tok.v}\"; use ${FORMULA_FUNCTIONS.join(\", \")}.`, tok.at);\n }\n pos++;\n const args: FormulaNode[] = [];\n if (!isOp(\")\")) {\n args.push(ternary(depth + 1));\n while (isOp(\",\")) {\n pos++;\n args.push(ternary(depth + 1));\n }\n }\n expect(\")\", `\"${tok.v}(\" has no matching \")\".`);\n if (!args.length) throw new FormulaError(`${tok.v}() needs something to work on.`, tok.at);\n return { kind: \"call\", fn: tok.v as FormulaFunction, args };\n }\n if (isOp(\".\")) {\n pos++;\n const column = peek();\n if (column.t !== \"id\") throw new FormulaError(`Name a column after \"${tok.v}.\".`, column.at);\n pos++;\n refs.push({ key: tok.v, column: column.v });\n return { kind: \"ref\", key: tok.v, column: column.v, at: tok.at };\n }\n refs.push({ key: tok.v });\n return { kind: \"ref\", key: tok.v, at: tok.at };\n }\n throw new FormulaError(`Expected a number, an answer or \"(\", but ${describe(tok)}.`, tok.at);\n };\n\n try {\n const ast = ternary(0);\n const rest = peek();\n if (rest.t !== \"end\") throw new FormulaError(`Expected an operator such as + or *, but ${describe(rest)}.`, rest.at);\n return { ok: true, ast, refs };\n } catch (e) {\n if (e instanceof FormulaError) return { ok: false, message: e.message, at: e.at };\n return { ok: false, message: \"The formula is nested too deeply.\", at: 0 };\n }\n}\n\n/** The answers a formula names, each once (none when it doesn't parse). */\nexport function formulaRefs(source: string): FormulaRef[] {\n const parsed = parseFormula(source);\n if (!parsed.ok) return [];\n const seen = new Set<string>();\n return parsed.refs.filter((r) => {\n const id = `${r.key}\\u0000${r.column ?? \"\"}`;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n });\n}\n\n/**\n * The formula with every reference to the answer `from` renamed to `to`.\n * Column names, function names and text are left alone. Returned unchanged\n * when it has a character a formula can't hold.\n */\nexport function renameFormulaKey(source: string, from: string, to: string): string {\n let tokens: Token[];\n try {\n tokens = tokenize(source);\n } catch {\n return source;\n }\n let out = \"\";\n let last = 0;\n tokens.forEach((tok, i) => {\n if (tok.t !== \"id\" || tok.v !== from) return;\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (prev?.t === \"op\" && prev.v === \".\") return;\n if (next?.t === \"op\" && next.v === \"(\") return;\n out += source.slice(last, tok.at) + to;\n last = tok.at + from.length;\n });\n return out + source.slice(last);\n}\n\n// ── Evaluation ───────────────────────────────────────────────────────────────\n\nconst NUMERIC = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\n\n/** A value as a number: numbers, numeric text (\"1,200\" too), yes / no as 1 / 0. Anything else is blank (`null`). */\nexport function formulaNumber(v: FormulaValue | Json | undefined): number | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (typeof v === \"string\") {\n const t = v.trim().replace(/,/g, \"\");\n return t.length <= 64 && NUMERIC.test(t) ? finite(Number(t)) : null;\n }\n return null;\n}\n\nconst finite = (n: number): number | null => (Number.isFinite(n) ? n : null);\n/** A list in arithmetic is blank: add one up with `sum(...)`. */\nconst scalar = (v: FormulaValue): FormulaValue => (Array.isArray(v) ? null : v);\n\nfunction truthy(v: FormulaValue): boolean {\n if (v === null) return false;\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"number\") return v !== 0;\n if (typeof v === \"string\") return v.trim() !== \"\";\n return v.length > 0;\n}\n\nfunction numbersIn(values: FormulaValue[], out: number[] = []): number[] {\n for (const v of values) {\n if (Array.isArray(v)) numbersIn(v, out);\n else {\n const n = formulaNumber(v);\n if (n !== null) out.push(n);\n }\n }\n return out;\n}\n\ninterface Totals {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\n/**\n * Each list's numbers added up once, for the lists this package built and\n * froze itself (the calculator's lists, one per answer and column), so a\n * formula worked out again over an unchanged table doesn't walk it again.\n * Any other list a reader returns may change in place, so it is added up\n * every time.\n */\nconst listTotals = new WeakMap<readonly FormulaValue[], Totals>();\nconst ownLists = new WeakSet<readonly FormulaValue[]>();\n\n/** Mark a frozen list built inside this package as safe to keep totals for (not exported from the package). */\nexport function ownFormulaList(list: FormulaValue[]): readonly FormulaValue[] {\n Object.freeze(list);\n ownLists.add(list);\n return list;\n}\n\nfunction totalsOf(list: readonly FormulaValue[]): Totals {\n const own = ownLists.has(list);\n let t = own ? listTotals.get(list) : undefined;\n if (t) return t;\n const nums = numbersIn(list as FormulaValue[]);\n t = { sum: 0, count: nums.length, min: Infinity, max: -Infinity };\n for (const n of nums) {\n t.sum += n;\n if (n < t.min) t.min = n;\n if (n > t.max) t.max = n;\n }\n if (own) listTotals.set(list, t);\n return t;\n}\n\nfunction compare(op: BinaryOp, a: FormulaValue, b: FormulaValue): boolean {\n const blank = (v: FormulaValue) => v === null || Array.isArray(v) || (typeof v === \"string\" && v.trim() === \"\");\n // A blank equals nothing: `!=` holds and every other comparison fails.\n if (blank(a) || blank(b)) return op === \"!=\";\n const x = formulaNumber(a);\n const y = formulaNumber(b);\n if (x !== null && y !== null) {\n if (op === \"==\") return x === y;\n if (op === \"!=\") return x !== y;\n if (op === \"<\") return x < y;\n if (op === \"<=\") return x <= y;\n if (op === \">\") return x > y;\n return x >= y;\n }\n // Text is equal or not; it has no order.\n if (op === \"==\") return String(a) === String(b);\n if (op === \"!=\") return String(a) !== String(b);\n return false;\n}\n\n/** Reads an answer for `evaluateFormula`: its value, or `null` when unanswered or unknown. */\nexport type FormulaReader = (ref: FormulaRef) => FormulaValue;\n\n/** Evaluate a parsed formula. Never throws; a value it can't work out is `null`. */\nexport function evaluateFormula(ast: FormulaNode, read: FormulaReader): FormulaValue {\n const run = (node: FormulaNode): FormulaValue => {\n switch (node.kind) {\n case \"number\":\n case \"text\":\n return node.value;\n case \"ref\":\n // The node itself: a reader may key on it, and it is never changed.\n return read(node);\n case \"unary\": {\n const n = formulaNumber(scalar(run(node.arg)));\n return n === null ? null : -n;\n }\n case \"if\":\n return truthy(run(node.test)) ? run(node.then) : run(node.else);\n case \"call\": {\n let total = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const arg of node.args) {\n const v = run(arg);\n if (Array.isArray(v)) {\n const t = totalsOf(v);\n total += t.sum;\n count += t.count;\n if (t.min < min) min = t.min;\n if (t.max > max) max = t.max;\n continue;\n }\n const n = formulaNumber(v);\n if (n === null) continue;\n total += n;\n count++;\n if (n < min) min = n;\n if (n > max) max = n;\n }\n if (node.fn === \"sum\") return finite(total);\n if (!count) return null;\n if (node.fn === \"avg\") return finite(total / count);\n return node.fn === \"min\" ? min : max;\n }\n case \"binary\": {\n const a = run(node.left);\n const b = run(node.right);\n if (node.op === \"+\" || node.op === \"-\" || node.op === \"*\" || node.op === \"/\") {\n const x = formulaNumber(scalar(a));\n const y = formulaNumber(scalar(b));\n if (x === null || y === null) return null;\n if (node.op === \"+\") return finite(x + y);\n if (node.op === \"-\") return finite(x - y);\n if (node.op === \"*\") return finite(x * y);\n return y === 0 ? null : finite(x / y);\n }\n return compare(node.op, a, b);\n }\n }\n };\n try {\n return run(ast);\n } catch {\n return null;\n }\n}\n","import type { FieldTypeManifest } from \"./fields\";\nimport { evaluateFormula, formulaNumber, ownFormulaList, parseFormula, type FormulaNode, type FormulaRef, type FormulaValue } from \"./formula\";\nimport type { FieldBlock, FormDefinition, Json, Operator } from \"./types\";\n\n/** The calculated field type's registry key. */\nexport const CALCULATED_TYPE = \"calculated\";\n\n/**\n * Field types the builder offers only to a host that names them in its\n * palette, like `STRUCTURED_FIELD_TYPES`: `calculated` shows a value worked\n * out from other answers, so it is opt-in for hosts that want formulas.\n */\nexport const COMPUTED_FIELD_TYPES = [CALCULATED_TYPE] as const;\n\nexport type CalculatedFormat = \"number\" | \"percent\" | \"text\";\n/** Longest the formulas of one form may be, all together (`parseForm` checks it). */\nexport const MAX_FORM_FORMULA_LENGTH = 20_000;\n/** Most decimal places a calculated value may keep. */\nexport const MAX_CALCULATED_DECIMALS = 10;\n\nexport interface CalculatedProps {\n formula: string;\n format?: CalculatedFormat | undefined;\n decimals?: number | undefined;\n}\n\n/** A calculated field's settings, with anything malformed left out. */\nexport function calculatedProps(field: FieldBlock): CalculatedProps {\n const p = field.props ?? {};\n const out: CalculatedProps = { formula: typeof p.formula === \"string\" ? p.formula : \"\" };\n if (p.format === \"number\" || p.format === \"percent\" || p.format === \"text\") out.format = p.format;\n if (typeof p.decimals === \"number\" && Number.isInteger(p.decimals) && p.decimals >= 0 && p.decimals <= MAX_CALCULATED_DECIMALS) {\n out.decimals = p.decimals;\n }\n return out;\n}\n\nexport const isCalculated = (field: FieldBlock | undefined): boolean => field?.type === CALCULATED_TYPE;\n\nconst round = (n: number, decimals: number | undefined) => {\n if (decimals === undefined) return n;\n const r = Number(n.toFixed(decimals));\n return Object.is(r, -0) ? 0 : r;\n};\n\n/**\n * What a formula's result is stored as. `number` and `percent` keep a number\n * (`0.25` for 25%), rounded to `decimals`; `text` keeps text. Without a\n * format, numbers, text and true / false are kept as they are. A list, and\n * anything the format can't hold, is no value (`undefined`).\n */\nexport function calculatedValue(result: FormulaValue, field: FieldBlock): Json | undefined {\n 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: [\"riverside\", \"hilltop\"] }`\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=hilltop`. */\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 { 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 * Edit links for a sent response: `<id>.<nonce>.<expires>.<sig>`, where sig is the\n * base64url HMAC-SHA256 of `edit-link:v2:<id>.<nonce>.<expires>` under a server-only\n * secret of at least 32 bytes.\n *\n * - id: the response's uuid.\n * - nonce: the response's current edit nonce, kept by the app. The app refuses a link\n * whose nonce is no longer the response's, so changing the nonce revokes every link\n * made before (change it after each edit: only the newest link works).\n * - expires: when the link stops working, in Unix seconds, about 30 days after it was\n * made (`EDIT_LINK_TTL_SECONDS`).\n *\n * Without a usable secret (missing, or shorter than `MIN_EDIT_SECRET_BYTES`) there are no\n * edit links: signing returns null and every token fails to verify.\n *\n * Web Crypto only, no storage: the app keeps the nonce and checks it. Moved up from\n * The host app's src/lib/forms/edit-link.ts unchanged, so links it signed still verify.\n */\n\n/** How long a new edit link works: 30 days. */\nexport const EDIT_LINK_TTL_SECONDS = 30 * 24 * 60 * 60;\n/** The shortest secret edit links are signed with: 32 bytes (UTF-8), as long as the HMAC. */\nexport const MIN_EDIT_SECRET_BYTES = 32;\n/** The query parameter an edit link's token travels in: `?edit=<token>`. */\nexport const EDIT_LINK_PARAM = \"edit\";\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n// A uuid, or any other url-safe random string of 16 to 64 characters.\nconst NONCE = /^[A-Za-z0-9_-]{16,64}$/;\nconst EXPIRES = /^[1-9][0-9]{0,11}$/;\nconst SIG = /^[A-Za-z0-9_-]{43}$/; // 32 bytes, base64url without padding\nconst DOMAIN = \"edit-link:v2:\";\n/** The longest token looked at: a uuid, a 64-character nonce, 12 digits and a signature fit well within it. */\nconst MAX_TOKEN_LENGTH = 300;\n\nconst encoder = new TextEncoder();\n\nfunction toBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction fromBase64Url(text: string): Uint8Array<ArrayBuffer> {\n const binary = atob(text.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Whether `secret` can sign edit links: a string of at least `MIN_EDIT_SECRET_BYTES` bytes. */\nexport function isUsableEditSecret(secret: string | null | undefined): secret is string {\n return (\n typeof secret === \"string\" &&\n secret.trim().length > 0 &&\n encoder.encode(secret).length >= MIN_EDIT_SECRET_BYTES\n );\n}\n\nfunction hmacKey(secret: string, usage: \"sign\" | \"verify\") {\n return crypto.subtle.importKey(\"raw\", encoder.encode(secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [usage]);\n}\n\n/** What an edit link says: the response, its nonce when the link was made, and when it stops working. */\nexport interface EditLinkClaims {\n /** The response's id, in lower case. */\n id: string;\n nonce: string;\n /** Unix seconds. */\n expiresAt: number;\n}\n\nexport interface EditLinkOptions {\n /** The current time in milliseconds (tests); `Date.now()` by default. */\n now?: number | undefined;\n /** How long the link works, in seconds; `EDIT_LINK_TTL_SECONDS` by default. */\n ttlSeconds?: number | undefined;\n}\n\nconst payload = (id: string, nonce: string, expiresAt: number) =>\n encoder.encode(`${DOMAIN}${id}.${nonce}.${expiresAt}`);\n\n/**\n * The edit token for a response and its current nonce, working for `ttlSeconds` from\n * now; null when there is no usable secret (no edit links) or the id or nonce is malformed.\n */\nexport async function signEditToken(\n link: { id: string; nonce: string },\n secret: string | null | undefined,\n options: EditLinkOptions = {},\n): Promise<string | null> {\n if (!isUsableEditSecret(secret) || !UUID.test(link.id) || !NONCE.test(link.nonce)) return null;\n const ttl = options.ttlSeconds ?? EDIT_LINK_TTL_SECONDS;\n if (!Number.isFinite(ttl) || ttl <= 0) return null;\n const id = link.id.toLowerCase();\n const expiresAt = Math.floor((options.now ?? Date.now()) / 1000) + Math.floor(ttl);\n const sig = await crypto.subtle.sign(\"HMAC\", await hmacKey(secret, \"sign\"), payload(id, link.nonce, expiresAt));\n return `${id}.${link.nonce}.${expiresAt}.${toBase64Url(new Uint8Array(sig))}`;\n}\n\n/**\n * What a token says, or null when it is malformed, its signature does not match, it has\n * expired (or claims to last longer than `ttlSeconds` from now), or there is no usable\n * secret. Whether the nonce is still the response's is the caller's check. The\n * comparison is Web Crypto's HMAC verify, which runs in constant time.\n */\nexport async function verifyEditToken(\n token: string | null | undefined,\n secret: string | null | undefined,\n options: EditLinkOptions = {},\n): Promise<EditLinkClaims | null> {\n if (!isUsableEditSecret(secret) || typeof token !== \"string\" || token.length > MAX_TOKEN_LENGTH) return null;\n const parts = token.split(\".\");\n if (parts.length !== 4) return null;\n const [id, nonce, expires, sig] = parts as [string, string, string, string];\n if (!UUID.test(id) || id !== id.toLowerCase() || !NONCE.test(nonce) || !EXPIRES.test(expires)) return null;\n if (!SIG.test(sig)) return null;\n const expiresAt = Number(expires);\n const now = Math.floor((options.now ?? Date.now()) / 1000);\n const ttl = options.ttlSeconds ?? EDIT_LINK_TTL_SECONDS;\n if (expiresAt <= now || expiresAt > now + ttl) return null;\n let bytes: Uint8Array<ArrayBuffer>;\n try {\n bytes = fromBase64Url(sig);\n } catch {\n return null;\n }\n const ok = await crypto.subtle.verify(\"HMAC\", await hmacKey(secret, \"verify\"), bytes, payload(id, nonce, expiresAt));\n return ok ? { id, nonce, expiresAt } : null;\n}\n\n/**\n * A form link with the edit token added: `<formUrl>?edit=<token>` (or `&edit=` when it\n * has a query). `param` names the parameter; `EDIT_LINK_PARAM` by default.\n */\nexport function withEditToken(formUrl: string, token: string, param: string = EDIT_LINK_PARAM): string {\n return `${formUrl}${formUrl.includes(\"?\") ? \"&\" : \"?\"}${param}=${encodeURIComponent(token)}`;\n}\n\nexport interface EditLinkUrlOptions extends EditLinkOptions {\n /** The query parameter; `EDIT_LINK_PARAM` by default. */\n param?: string | undefined;\n}\n\n/**\n * The link that reopens a response for editing: `formUrl` (the page that shows the form,\n * with any query it needs) plus a token signed for the response's current nonce. Null\n * when there are no edit links (no usable secret) or the id or nonce is malformed.\n */\nexport async function editLinkUrl(\n formUrl: string,\n link: { id: string; nonce: string },\n secret: string | null | undefined,\n options: EditLinkUrlOptions = {},\n): Promise<string | null> {\n const token = await signEditToken(link, secret, options);\n return token ? withEditToken(formUrl, token, options.param) : null;\n}\n\n/** Where the edit-secret reader reports a missing or short secret. */\nexport type EditSecretLog = (message: string) => void;\n\n/** Reads the edit-link secret from an environment, warning once when there is none. */\nexport interface EditSecretReader {\n /** The secret, or null (no edit links) when it is missing or too short; warns once, never with the secret. */\n (env: Record<string, string | undefined>, log?: EditSecretLog): string | null;\n /** Tests only: warn again. */\n reset(): void;\n}\n\n/**\n * A reader for the environment variable that holds the edit-link secret (such as\n * `FEEDBACK_EDIT_SECRET`). Without one of at least `MIN_EDIT_SECRET_BYTES` bytes there are\n * no edit links, and the first read says so through `log` (the call's, else the\n * reader's, else `console.warn`); later reads stay quiet until `reset()`.\n */\nexport function createEditSecretReader(options: { variable: string; log?: EditSecretLog | undefined }): EditSecretReader {\n const { variable } = options;\n let warned = false;\n const read = (env: Record<string, string | undefined>, log?: EditSecretLog): string | null => {\n const secret = env[variable];\n if (isUsableEditSecret(secret)) return secret;\n if (!warned) {\n warned = true;\n (log ?? options.log ?? ((m: string) => console.warn(m)))(\n `${variable} is ${secret ? `shorter than ${MIN_EDIT_SECRET_BYTES} bytes` : \"not set\"}: edit links are off.`,\n );\n }\n return null;\n };\n return Object.assign(read, {\n reset: () => {\n warned = false;\n },\n });\n}\n\nexport interface EditLinkRequestOptions {\n /** The query parameter; `EDIT_LINK_PARAM` by default. */\n param?: string | undefined;\n /**\n * Whether the URL is a page that shows a form (an edit link is only honoured there,\n * such as `/f/<slug>`). Every URL by default.\n */\n isFormPage?: ((url: URL) => boolean) | undefined;\n}\n\n/** Whether this request is a form page opened with an edit link (the parameter present, even empty). */\nexport function isEditLinkRequest(url: URL, options: EditLinkRequestOptions = {}): boolean {\n const isFormPage = options.isFormPage ?? (() => true);\n return isFormPage(url) && url.searchParams.has(options.param ?? EDIT_LINK_PARAM);\n}\n\n/**\n * The response, with `Referrer-Policy: no-referrer` and `Cache-Control: private, no-store`\n * added when the request carried an edit link; otherwise the same response, untouched.\n * The link is a credential, so it never leaves in a Referer header (an HTTP header, not\n * only the page's meta tag, so it holds before the page has parsed and for every request\n * the page makes), and the page, prefilled with the response, is never cached.\n */\nexport function withEditLinkHeaders(request: Request, response: Response, options: EditLinkRequestOptions = {}): Response {\n let url: URL;\n try {\n url = new URL(request.url);\n } catch {\n return response;\n }\n if (!isEditLinkRequest(url, options)) return response;\n const headers = new Headers(response.headers);\n headers.set(\"referrer-policy\", \"no-referrer\");\n headers.set(\"cache-control\", \"private, no-store\");\n return new Response(response.body, { status: response.status, statusText: response.statusText, headers });\n}\n","/**\n * The pieces of a submit endpoint's rate limit that aren't storage: the client's\n * address, the part of it that names one client, a key that never holds the address,\n * and a check that fails open. The counter itself is the app's (`RateLimitStore`), so\n * every server instance can share it (a row in Postgres, a key in Redis).\n *\n * Web Crypto only. Moved up from the host app's src/lib/feedback/rate-limit.server.ts;\n * keys made here equal the ones it made, so a deploy doesn't reset anyone's count.\n */\n\n/**\n * The headers a proxy reports the client's address in, most trusted first. Trust only\n * headers your proxy sets (and overwrites): a client can send any of them itself.\n */\nexport const DEFAULT_TRUSTED_IP_HEADERS: readonly string[] = [\"x-vercel-forwarded-for\", \"x-forwarded-for\", \"x-real-ip\"];\n\n/**\n * How many submits, saves as they go and photo uploads one client may make per scope\n * (a practice, an account) in a window.\n *\n * - submit: 60 responses per 10 minutes: a class at one gym's Wi-Fi fits.\n * - progress: saving answers as they go. A visit counts once, against `submit`, at its\n * first save; its later saves (each Next, the send, a reload picking up where it was)\n * count here, in the same window: 60 people answering 10 questions each on one Wi-Fi fit.\n * - upload: 120 photos per 10 minutes: that class, a couple of photos each.\n */\nexport const RATE_LIMIT_DEFAULTS = {\n submit: { limit: 60, windowSeconds: 600 },\n progress: { limit: 900, windowSeconds: 600 },\n upload: { limit: 120, windowSeconds: 600 },\n} as const satisfies Record<string, { limit: number; windowSeconds: number }>;\n\n/**\n * The client's address as the proxy reports it, used only as a rate-limit key: the first\n * entry of the first of `trusted` that is set, trimmed, else `\"unknown\"`.\n */\nexport function clientIp(headers: Pick<Headers, \"get\">, trusted: readonly string[] = DEFAULT_TRUSTED_IP_HEADERS): string {\n for (const name of trusted) {\n const first = headers.get(name)?.split(\",\")[0]?.trim();\n if (first) return first;\n }\n return \"unknown\";\n}\n\n/** The part of an address that names one client: an IPv4 address whole, an IPv6 address by its /64. */\nexport function addressPrefix(ip: string): string {\n const bare = ip\n .replace(/^\\[|\\](:\\d+)?$/g, \"\")\n .split(\"%\")[0]!\n .toLowerCase();\n if (!bare.includes(\":\")) return bare;\n const mapped = /^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/.exec(bare);\n if (mapped) return mapped[1]!;\n const [head = \"\", tail = \"\"] = bare.split(\"::\");\n const left = head ? head.split(\":\") : [];\n const right = bare.includes(\"::\") && tail ? tail.split(\":\") : [];\n const groups = bare.includes(\"::\")\n ? [...left, ...Array<string>(Math.max(0, 8 - left.length - right.length)).fill(\"0\"), ...right]\n : left;\n return `${groups\n .slice(0, 4)\n .map((g) => (g || \"0\").replace(/^0+(?=.)/, \"\"))\n .join(\":\")}::/64`;\n}\n\n/**\n * The stored key, `<kind>:<scope>:<hex HMAC-SHA256 of the address prefix>`: what is\n * counted (such as `submit`, `progress`, `upload`), whose count it is (a practice id),\n * and the client, which is never stored as its address. `secret` is a server secret.\n */\nexport async function rateLimitKey(input: { kind: string; scope: string; ip: string; secret: string }): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(input.secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n \"sign\",\n ]);\n const mac = new Uint8Array(await crypto.subtle.sign(\"HMAC\", key, encoder.encode(addressPrefix(input.ip))));\n let hex = \"\";\n for (const b of mac) hex += b.toString(16).padStart(2, \"0\");\n return `${input.kind}:${input.scope}:${hex}`;\n}\n\n/** The app's shared counter. */\nexport interface RateLimitStore {\n /**\n * Count one hit on `key` in its current `windowSeconds` window: true while the count is\n * within `limit`, false past it, null when it could not count.\n */\n hit(key: string, limit: number, windowSeconds: number): Promise<boolean | null>;\n}\n\n/**\n * True when the request may go on. Fails open: when the store can't count (it answers\n * null or throws) the request goes on and `log` says so with `message`.\n */\nexport async function allow(\n store: RateLimitStore,\n check: { key: string; limit: number; windowSeconds: number },\n options: { log?: ((message: string) => void) | undefined; message?: string | undefined } = {},\n): Promise<boolean> {\n let allowed: boolean | null;\n try {\n allowed = await store.hit(check.key, check.limit, check.windowSeconds);\n } catch {\n allowed = null;\n }\n if (allowed !== null) return allowed;\n (options.log ?? ((m: string) => console.warn(m)))(\n options.message ?? \"The rate limit could not be checked; letting the request through.\",\n );\n return true;\n}\n","/**\n * Upload fields on the server: what the app's store keeps for each upload, and\n * the check a submit runs before it saves answers that name uploaded files\n * (`checkUploads`). Pure: it works on any `UploadStore`, so tests run it on a\n * fake, and the handshake that records uploads is `createUploadHandler`\n * (upload-handler.ts).\n *\n * Moved up from the host app's src/lib/feedback/uploads.ts (`checkPhotoAnswers`).\n * Written for every upload field type (`UPLOAD_FIELD_TYPES`); `photo` is the only one.\n */\nimport {\n PHOTO_TYPE,\n photoCountMessage,\n photoLimits,\n photoRefs,\n photoSizeMessage,\n photoTypeMessage,\n UPLOAD_FIELD_TYPES,\n type PhotoRef,\n} from \"./photo\";\nimport type { SignedUpload } from \"./upload-protocol\";\nimport type { FieldBlock, FormDefinition, Json } from \"./types\";\n\n/** What the store records when an upload begins. */\nexport interface BeginUploadInput {\n formId: string;\n fieldId: string;\n name: string;\n contentType: string;\n size: number;\n /** A new response's attempt (`attemptHash` of its attempt id), or… */\n attemptHash: string | null;\n /** …the id of the sent response an edit link is changing. Exactly one of the two. */\n editOf: string | null;\n}\n\n/** One upload as the store reads it back, with what storage holds for it. */\nexport interface StoredUpload {\n id: string;\n fieldId: string;\n attemptHash: string | null;\n editOf: string | null;\n /** The response that took it, once one did. */\n responseId: string | null;\n name: string;\n contentType: string;\n size: number;\n /** Whether the file is in storage (the respondent's browser finished sending it). */\n stored: boolean;\n /** The type and size storage holds, which are trusted over what the browser said. */\n storedType: string | null;\n storedSize: number | null;\n}\n\n/** What uploads need from the app's database and storage; the app's service-role client, say. */\nexport interface UploadStore {\n /**\n * Records one upload and names its object in storage; `{ tooMany: true }` once the\n * attempt or edit has as many as the app allows (the host app: 20).\n */\n beginUpload(input: BeginUploadInput): Promise<{ id: string; objectName: string } | { tooMany: true }>;\n /** Signs an upload of that object, sent to the browser as `upload` (`SignedUpload`). */\n signUpload(objectName: string): Promise<SignedUpload>;\n /** This form's uploads with these ids; others are left out. */\n uploadRefs(formId: string, ids: string[]): Promise<StoredUpload[]>;\n}\n\n/** Who may use an upload: a new response's attempt, or an edit of a sent response. */\nexport type UploadOwner = { attemptHash: string } | { responseId: string };\n\n/** The form's upload fields (`UPLOAD_FIELD_TYPES`: photo). */\nexport function uploadFields(definition: FormDefinition): FieldBlock[] {\n return definition.blocks.filter(\n (b): b is FieldBlock => b.kind === \"field\" && (UPLOAD_FIELD_TYPES as readonly string[]).includes(b.type),\n );\n}\n\n/** An upload field type's limits and its words for a file it doesn't take. */\nexport interface UploadRules {\n maxFiles: number;\n maxBytes: number;\n mimeTypes: readonly string[];\n typeMessage: string;\n sizeMessage: string;\n countMessage: string;\n}\n\n/** The rules for an upload field, or null when the field doesn't take files. */\nexport function uploadRules(field: FieldBlock): UploadRules | null {\n if (field.type !== PHOTO_TYPE) return null;\n const limits = photoLimits(field);\n return {\n maxFiles: limits.maxFiles,\n maxBytes: limits.maxBytes,\n mimeTypes: limits.mimeTypes,\n typeMessage: photoTypeMessage(field),\n sizeMessage: photoSizeMessage(field),\n countMessage: photoCountMessage(field),\n };\n}\n\n/** Said when a reference isn't a file this respondent finished uploading here. */\nexport const NOT_UPLOADED_MESSAGE = \"A photo didn't finish uploading. Remove it and add it again.\";\n\nfunction owns(upload: StoredUpload, owner: UploadOwner): boolean {\n if (\"attemptHash\" in owner) return upload.responseId === null && upload.attemptHash === owner.attemptHash;\n // An edit keeps the response's own files and may add ones uploaded for it.\n return upload.responseId === owner.responseId || (upload.responseId === null && upload.editOf === owner.responseId);\n}\n\nexport interface CheckUploadsOptions {\n /** The form's id, as the store keys its uploads. */\n formId: string;\n owner: UploadOwner;\n /** Needed only when the answers name a file. */\n store?: Pick<UploadStore, \"uploadRefs\"> | undefined;\n}\n\nexport type CheckedUploads =\n | { ok: true; answers: Record<string, Json> }\n | { ok: false; errors: Record<string, string> };\n\n/**\n * Checks every file the answers name: uploaded by this attempt (or for this edit) to this\n * form's field, in storage, of a type and size the field takes, and no more files than it\n * takes. The stored name, type and size replace what the browser sent. Answers without\n * files are returned as they are, without asking the store. Errors are keyed by field id;\n * a store that throws throws (answer 503: nothing can be checked).\n */\nexport async function checkUploads(\n definition: FormDefinition,\n answers: Record<string, Json>,\n options: CheckUploadsOptions,\n): Promise<CheckedUploads> {\n const asked = uploadFields(definition).filter((f) => photoRefs(answers[f.id]).length > 0);\n if (!asked.length) return { ok: true, answers };\n const { store, formId, owner } = options;\n if (!store) throw new Error(\"Answers that name uploaded files need an upload store.\");\n\n const ids = asked.flatMap((f) => photoRefs(answers[f.id]).map((r) => r.id));\n const stored = new Map((await store.uploadRefs(formId, ids)).map((u) => [u.id, u]));\n const out: Record<string, Json> = { ...answers };\n const errors: Record<string, string> = {};\n for (const field of asked) {\n const rules = uploadRules(field)!;\n const refs = photoRefs(answers[field.id]);\n if (refs.length > rules.maxFiles) {\n errors[field.id] = rules.countMessage;\n continue;\n }\n const checked: PhotoRef[] = [];\n for (const ref of refs) {\n const upload = stored.get(ref.id);\n if (!upload || upload.fieldId !== field.id || !owns(upload, owner) || !upload.stored) {\n errors[field.id] = NOT_UPLOADED_MESSAGE;\n break;\n }\n const type = (upload.storedType ?? \"\").toLowerCase();\n const size = upload.storedSize ?? 0;\n if (!rules.mimeTypes.includes(type)) {\n errors[field.id] = rules.typeMessage;\n break;\n }\n if (size < 1 || size > rules.maxBytes) {\n errors[field.id] = rules.sizeMessage;\n break;\n }\n checked.push({ id: upload.id, name: upload.name, type, size });\n }\n out[field.id] = checked;\n }\n return Object.keys(errors).length ? { ok: false, errors } : { ok: true, answers: out };\n}\n\n/**\n * The stored hash of a visit's attempt id: hex SHA-256 (Web Crypto). It equals\n * The host app's `resumeTokenHash`, so uploads recorded before the move still match.\n */\nexport async function attemptHash(attemptId: string): Promise<string> {\n const digest = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(attemptId)));\n let hex = \"\";\n for (const b of digest) hex += b.toString(16).padStart(2, \"0\");\n return hex;\n}\n","/**\n * The upload handshake's JSON, shared by the server (`createUploadHandler` in\n * `/server`) and the browser (genesis-forms-web's `signedUploadHost`). A\n * respondent's browser asks the app's server for one signed upload per file,\n * then sends the bytes straight to storage with it; the answer keeps only the\n * reference the server handed back.\n *\n * Moved up from the host app's feedback photo uploads; the field names and\n * status codes are the ones it used, so its browsers and server keep talking.\n */\nimport type { PhotoRef } from \"./photo\";\n\n/**\n * What the browser POSTs (`content-type: application/json`, at most\n * `MAX_UPLOAD_REQUEST_BYTES`). Exactly one of `attemptId` (a new response: the\n * visit's attempt id, a UUID) and `edit` (an edit link's token, while changing\n * a sent response).\n */\nexport interface UploadRequest {\n /** The upload field's id. */\n fieldId: string;\n /** The file's name on the respondent's device. */\n name: string;\n /** Its MIME type. */\n type: string;\n /** Bytes. */\n size: number;\n attemptId?: string | undefined;\n edit?: string | undefined;\n}\n\n/**\n * Where the browser sends the bytes, as the app's storage signed it. Supabase\n * Storage hands back `path` and `token` (with `bucket`, for\n * `uploadToSignedUrl`); a store that signs a plain URL sets `url`, which\n * `signedUploadHost` PUTs the file to when no `send` is given.\n */\nexport interface SignedUpload {\n path: string;\n token: string;\n bucket?: string | undefined;\n url?: string | undefined;\n}\n\n/** 200: the reference the answer keeps, and where to send the bytes. */\nexport interface UploadGrant {\n ref: PhotoRef;\n upload: SignedUpload;\n}\n\n/**\n * Any other status: words to show the respondent, and for some a `code`:\n * `closed` (409, an edit while the form takes no changes), `bad_link` (403, an\n * edit link that doesn't check out) or `too_many_photos` (429, the attempt or\n * edit has as many uploads as the store allows; the name the host app's\n * browsers already know, kept for every upload field type).\n */\nexport interface UploadRefusal {\n error: string;\n code?: string | undefined;\n}\n\n/** The longest upload request body: a few fields of JSON. */\nexport const MAX_UPLOAD_REQUEST_BYTES = 4_000;\n","/**\n * The upload handshake's server half: `createUploadHandler` answers the browser's\n * request for one signed upload (`UploadRequest`). It checks the form takes responses,\n * the field takes files, the file's type and size, the visit's attempt id (or the edit\n * link) and the rate limit, records the upload and signs it. The browser then sends the\n * bytes straight to storage; on submit, `checkUploads` checks each reference again.\n *\n * Moved up from the host app's src/lib/feedback/uploads.server.ts (`handleFeedbackUpload`):\n * the same checks in the same order, the same JSON and status codes. What is the app's\n * own is passed in: finding the form, the store, the edit link's response, the counter.\n * Web APIs only (Request, Response, Web Crypto).\n */\nimport { verifyEditToken } from \"./edit-link\";\nimport { allow, clientIp, DEFAULT_TRUSTED_IP_HEADERS, RATE_LIMIT_DEFAULTS, rateLimitKey, type RateLimitStore } from \"./rate-limit\";\nimport { MAX_UPLOAD_REQUEST_BYTES } from \"./upload-protocol\";\nimport { attemptHash, uploadRules, type UploadStore } from \"./uploads\";\nimport type { FieldBlock, FormDefinition } from \"./types\";\n\n/** The form an upload is for, as the app found it from the request. */\nexport interface UploadForm {\n /** The form's id, as the store keys uploads. */\n id: string;\n /** The published definition respondents answer. */\n definition: FormDefinition;\n /** Whether it takes responses now (not paused, closed, full…). */\n open: boolean;\n /** Whose rate-limit count this is: a practice, an account. */\n scope: string;\n /** Whether its edit links work. Default false: no uploads for an edit. */\n allowsEdits?: boolean | undefined;\n /** Names the form in logs, such as its slug. */\n label?: string | undefined;\n}\n\n/** A sent response an edit link may change, as the app loads it. */\nexport interface EditableResponse {\n id: string;\n /** The response's current nonce: only a link made with it works. */\n editNonce: string;\n}\n\n/** The handler's words; each default is what the host app said. */\nexport interface UploadMessages {\n /** 415 / 400: not a JSON object. */\n notJson: string;\n /** 413: past `maxRequestBytes`. */\n tooLong: string;\n /** 400: no attempt id, or not a UUID. */\n reload: string;\n /** 404: `resolveForm` found no form. */\n unavailable: string;\n /** 409: the form isn't open. */\n notOpen: string;\n /** 409 (`code: \"closed\"`): an edit while the form isn't open. */\n notTakingChanges: string;\n /** 403 (`code: \"bad_link\"`): an edit link that doesn't check out, or a form without edits. */\n badEditLink: string;\n /** 400: the field isn't an upload field of this form. */\n notUploadField: string;\n /** 429: the rate limit. */\n rateLimited: string;\n /** 429 (`code: \"too_many_photos\"`): the store has as many uploads for this attempt or edit as it allows. */\n tooMany: string;\n /** 503 / 500: something failed on the server; nothing more is said. */\n failed: string;\n}\n\nexport const UPLOAD_MESSAGES: UploadMessages = {\n notJson: \"Send the request as JSON.\",\n tooLong: \"That request is too long.\",\n reload: \"Reload the page and try again.\",\n unavailable: \"This form isn't available.\",\n notOpen: \"This form isn't open right now.\",\n notTakingChanges: \"This form isn't taking changes now.\",\n badEditLink:\n \"This edit link doesn't work any more. Use the newest one: from your latest confirmation email, or the one shown after your last change.\",\n notUploadField: \"This question doesn't take photos.\",\n rateLimited: \"Too many photos from here. Try again in a few minutes.\",\n tooMany: \"That's as many photos as one response can take.\",\n failed: \"That photo couldn't be added. Please try again.\",\n};\n\ntype Secret = string | null | undefined;\n\nexport interface UploadHandlerOptions<P = void> {\n /**\n * The form the request is for (from its host, path or `params`), or null (404). A throw\n * answers 503 and logs the error's message.\n */\n resolveForm(request: Request, params: P): Promise<UploadForm | null>;\n store: UploadStore;\n /**\n * Uploads for an edit link (`edit` in the request). Without it, or without a usable\n * secret, every edit link is refused (403).\n */\n edit?:\n | {\n /** The edit-link secret, or a reader of it (`createEditSecretReader`). */\n secret: Secret | (() => Secret);\n /**\n * The sent response with this id, of this form (and its scope), or null (403).\n * A throw answers 503.\n */\n response(id: string, form: UploadForm): Promise<EditableResponse | null>;\n }\n | undefined;\n /** Counted per scope and client address, as `kind: \"upload\"`. Without it, nothing is counted. */\n rateLimit?:\n | {\n store: RateLimitStore;\n /** The server secret the address is hashed with (`rateLimitKey`). */\n secret: string;\n /** Default `RATE_LIMIT_DEFAULTS.upload`: 120 per 600 seconds. */\n limit?: number | undefined;\n windowSeconds?: number | undefined;\n /** Default `DEFAULT_TRUSTED_IP_HEADERS`. */\n trustedIpHeaders?: readonly string[] | undefined;\n }\n | undefined;\n /** The stored hash of an attempt id. Default `attemptHash` (hex SHA-256). */\n hashAttempt?: ((attemptId: string) => string | Promise<string>) | undefined;\n /** Default `MAX_UPLOAD_REQUEST_BYTES` (4,000). */\n maxRequestBytes?: number | undefined;\n /** The current time (tests): edit links expire. */\n now?: (() => Date) | undefined;\n /** Where failures are said; `console.error` with an `[upload]` prefix by default. Never sent to the browser. */\n log?: ((message: string) => void) | undefined;\n messages?: Partial<UploadMessages> | undefined;\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst json = (body: unknown, status = 200) => Response.json(body, { status, headers: { \"cache-control\": \"no-store\" } });\n\n/**\n * The body as text, or null once it is over `max` bytes: read as it streams in and\n * abandoned at the cap, so a body without (or lying in) Content-Length is never\n * buffered whole.\n */\nasync function readCapped(request: Request, max: number): Promise<string | null> {\n if (!request.body) return \"\";\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > max) {\n await reader.cancel().catch(() => {});\n return null;\n }\n chunks.push(value);\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * The upload endpoint: `(request, params) => Response`, for a POST route. `params` is\n * whatever the route has (a form slug, say), passed to `resolveForm`. See the README's\n * \"Uploads\" for the JSON and every status.\n */\nexport function createUploadHandler<P = void>(\n options: UploadHandlerOptions<P>,\n): (request: Request, params: P) => Promise<Response> {\n const say: UploadMessages = { ...UPLOAD_MESSAGES, ...options.messages };\n const log = options.log ?? ((m: string) => console.error(`[upload] ${m}`));\n const hash = options.hashAttempt ?? attemptHash;\n const maxBytes = options.maxRequestBytes ?? MAX_UPLOAD_REQUEST_BYTES;\n\n return async (request, params) => {\n const contentType = (request.headers.get(\"content-type\") ?? \"\").split(\";\")[0]!.trim().toLowerCase();\n if (contentType !== \"application/json\") return json({ error: say.notJson }, 415);\n const text = await readCapped(request, maxBytes);\n if (text === null) return json({ error: say.tooLong }, 413);\n let body: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(text);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error(\"not an object\");\n body = parsed as Record<string, unknown>;\n } catch {\n return json({ error: say.notJson }, 400);\n }\n const fieldId = typeof body[\"fieldId\"] === \"string\" ? body[\"fieldId\"] : \"\";\n const name = typeof body[\"name\"] === \"string\" ? body[\"name\"].trim().slice(0, 255) : \"\";\n const type = typeof body[\"type\"] === \"string\" ? body[\"type\"].trim().toLowerCase() : \"\";\n const size = body[\"size\"];\n const editing = body[\"edit\"] !== undefined;\n const attemptId = body[\"attemptId\"];\n if (!editing && (typeof attemptId !== \"string\" || !UUID.test(attemptId))) {\n return json({ error: say.reload }, 400);\n }\n\n let form: UploadForm | null;\n try {\n form = await options.resolveForm(request, params);\n } catch (error) {\n log(error instanceof Error ? error.message : \"Loading the form failed.\");\n return json({ error: say.failed }, 503);\n }\n if (!form) return json({ error: say.unavailable }, 404);\n if (!form.open) {\n return editing ? json({ error: say.notTakingChanges, code: \"closed\" }, 409) : json({ error: say.notOpen }, 409);\n }\n\n const block = form.definition.blocks.find((b) => b.kind === \"field\" && b.id === fieldId);\n const field = block?.kind === \"field\" ? (block as FieldBlock) : null;\n const rules = field ? uploadRules(field) : null;\n if (!field || !rules) return json({ error: say.notUploadField }, 400);\n if (!rules.mimeTypes.includes(type)) return json({ error: rules.typeMessage }, 415);\n if (typeof size !== \"number\" || !Number.isInteger(size) || size < 1 || size > rules.maxBytes) {\n return json({ error: rules.sizeMessage }, 413);\n }\n\n // From an edit link: only its newest link, for a sent response of this form, while\n // the form allows changes (the same checks as saving the change).\n let editOf: string | null = null;\n if (editing) {\n const secret = typeof options.edit?.secret === \"function\" ? options.edit.secret() : options.edit?.secret;\n const claims = options.edit\n ? await verifyEditToken(\n typeof body[\"edit\"] === \"string\" ? body[\"edit\"] : null,\n secret,\n options.now ? { now: options.now().getTime() } : {},\n )\n : null;\n if (!claims || form.allowsEdits !== true) return json({ error: say.badEditLink, code: \"bad_link\" }, 403);\n let stored: EditableResponse | null;\n try {\n stored = await options.edit!.response(claims.id, form);\n } catch {\n log(`Loading response ${claims.id} for an upload failed.`);\n return json({ error: say.failed }, 503);\n }\n if (!stored || stored.editNonce !== claims.nonce) return json({ error: say.badEditLink, code: \"bad_link\" }, 403);\n editOf = stored.id;\n }\n\n if (options.rateLimit) {\n const limit = options.rateLimit;\n const key = await rateLimitKey({\n kind: \"upload\",\n scope: form.scope,\n ip: clientIp(request.headers, limit.trustedIpHeaders ?? DEFAULT_TRUSTED_IP_HEADERS),\n secret: limit.secret,\n });\n const allowed = await allow(\n limit.store,\n {\n key,\n limit: limit.limit ?? RATE_LIMIT_DEFAULTS.upload.limit,\n windowSeconds: limit.windowSeconds ?? RATE_LIMIT_DEFAULTS.upload.windowSeconds,\n },\n { log, message: \"The upload rate limit could not be checked; letting the upload through.\" },\n );\n if (!allowed) return json({ error: say.rateLimited }, 429);\n }\n\n const fileName = name || \"photo\";\n try {\n const begun = await options.store.beginUpload({\n formId: form.id,\n fieldId: field.id,\n name: fileName,\n contentType: type,\n size,\n attemptHash: editOf ? null : await hash(attemptId as string),\n editOf,\n });\n if (\"tooMany\" in begun) return json({ error: say.tooMany, code: \"too_many_photos\" }, 429);\n const signed = await options.store.signUpload(begun.objectName);\n return json({ ref: { id: begun.id, name: fileName, type, size }, upload: signed });\n } catch (error) {\n log(\n `Starting an upload on ${form.label ?? form.id} for ${form.scope} failed: ${error instanceof Error ? error.message : \"unexpected error\"}`,\n );\n return json({ error: say.failed }, 500);\n }\n };\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\";\nexport {\n attemptHash,\n checkUploads,\n NOT_UPLOADED_MESSAGE,\n uploadFields,\n uploadRules,\n type BeginUploadInput,\n type CheckedUploads,\n type CheckUploadsOptions,\n type StoredUpload,\n type UploadOwner,\n type UploadRules,\n type UploadStore,\n} from \"./uploads\";\nexport {\n createUploadHandler,\n UPLOAD_MESSAGES,\n type EditableResponse,\n type UploadForm,\n type UploadHandlerOptions,\n type UploadMessages,\n} from \"./upload-handler\";\nexport {\n MAX_UPLOAD_REQUEST_BYTES,\n type SignedUpload,\n type UploadGrant,\n type UploadRefusal,\n type UploadRequest,\n} from \"./upload-protocol\";\n"]}