@case-framework/survey-core 0.8.0 → 0.9.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.
- package/README.md +126 -244
- package/build/answer-types-DH0gv0Ea.d.mts +20 -0
- package/build/answer-types-DH0gv0Ea.d.mts.map +1 -0
- package/build/answer-types-Dtm6MqZQ.mjs +19 -0
- package/build/answer-types-Dtm6MqZQ.mjs.map +1 -0
- package/build/editor/colors.d.mts +11 -2
- package/build/editor/colors.d.mts.map +1 -0
- package/build/editor.d.mts +72913 -266
- package/build/editor.d.mts.map +1 -1
- package/build/editor.mjs +1268 -1001
- package/build/editor.mjs.map +1 -1
- package/build/index.d.mts +2 -3
- package/build/index.mjs +1620 -824
- package/build/index.mjs.map +1 -1
- package/build/keyed-object-D1yh_W5v.mjs +45 -0
- package/build/keyed-object-D1yh_W5v.mjs.map +1 -0
- package/build/localization-1lzNpyFX.mjs +1373 -0
- package/build/localization-1lzNpyFX.mjs.map +1 -0
- package/build/package.json +9 -3
- package/build/projection-DrLPFroE.mjs +2344 -0
- package/build/projection-DrLPFroE.mjs.map +1 -0
- package/build/registry-BOXcyWfX.d.mts +54292 -0
- package/build/registry-BOXcyWfX.d.mts.map +1 -0
- package/build/schema.d.mts +3 -0
- package/build/schema.mjs +4 -0
- package/package.json +9 -3
- package/build/index-SDbZ5WQM.d.mts +0 -2208
- package/build/index-SDbZ5WQM.d.mts.map +0 -1
- package/build/item-colors-DgoJeSCQ.d.mts +0 -12
- package/build/item-colors-DgoJeSCQ.d.mts.map +0 -1
- package/build/projection-Bl6qCinx.mjs +0 -3930
- package/build/projection-Bl6qCinx.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-DrLPFroE.mjs","names":[],"sources":["../src/utils.ts","../src/expressions/function-signatures.ts","../src/survey/responses/value-domain.ts","../src/expressions/type-inference.ts","../src/expressions/validation.ts","../src/expressions/evaluator.ts","../src/survey/responses/variable-naming.ts","../src/survey/responses/slot-registry.ts","../src/survey/item-display-name.ts","../src/survey/composition/document.ts","../src/engine/survey-state-graph.ts","../src/survey/responses/response-meta.ts","../src/survey/responses/survey-response.ts","../src/response-exporter/types.ts","../src/response-exporter/column-id.ts","../src/response-exporter/slot-formatter.ts","../src/response-exporter/projection.ts"],"sourcesContent":["function hashString(seed: string): number {\n let hash = 2166136261;\n\n for (let i = 0; i < seed.length; i++) {\n hash ^= seed.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n\n return hash >>> 0;\n}\n\nexport function createSeededRandom(seed: string): () => number {\n let state = hashString(seed);\n\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let next = state;\n next = Math.imul(next ^ (next >>> 15), next | 1);\n next ^= next + Math.imul(next ^ (next >>> 7), next | 61);\n return ((next ^ (next >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function shuffleArray<T>(values: readonly T[], random: () => number = Math.random): T[] {\n const shuffledValues = [...values];\n\n for (let i = shuffledValues.length - 1; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n [shuffledValues[i], shuffledValues[j]] = [shuffledValues[j], shuffledValues[i]];\n }\n\n return shuffledValues;\n}\n\n/**\n * Shuffles an array of indices using the Fisher-Yates shuffle algorithm\n * @param length - The length of the array to create indices for\n * @returns A shuffled array of indices from 0 to length-1\n */\nexport function shuffleIndices(length: number, random: () => number = Math.random): number[] {\n return shuffleArray(\n Array.from({ length }, (_, i) => i),\n random,\n );\n}\n\nexport function structuredCloneMethod<T>(obj: T): T {\n if (obj === undefined) return obj;\n if (typeof structuredClone !== \"undefined\") {\n return structuredClone(obj);\n }\n // Fallback to JSON method\n return JSON.parse(JSON.stringify(obj));\n}\n\nconst ID_ALPHABET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nexport function generateId(): string {\n const length = 10;\n const timestamp = Date.now();\n let encodedTimestamp = \"\";\n let t = timestamp;\n const base = ID_ALPHABET.length;\n\n while (t > 0) {\n encodedTimestamp = ID_ALPHABET.charAt(t % base) + encodedTimestamp;\n t = Math.floor(t / base);\n }\n\n let randomPart = \"\";\n for (let i = 0; i < length; i++) {\n randomPart += ID_ALPHABET.charAt(Math.floor(Math.random() * base));\n }\n return randomPart + encodedTimestamp;\n}\n\n/** Alphanumeric chars without ambiguous ones (0/O, 1/I) for human-readable coding keys. */\nconst CODING_KEY_ALPHABET = \"23456789ABCDEFGHJKLMNPQRSTUVWXYZ\";\n\n/**\n * Generates a short random coding key suitable for item keys in exports/codebooks.\n * @param length - Key length (default 4)\n * @returns A random string of the specified length.\n */\nexport function generateCodingKey(length: number = 4): string {\n const base = CODING_KEY_ALPHABET.length;\n let key = \"\";\n for (let i = 0; i < length; i++) {\n key += CODING_KEY_ALPHABET.charAt(Math.floor(Math.random() * base));\n }\n return key;\n}\n\n/** Resolve a sibling key using the editor's stable numeric suffix convention. */\nexport function resolveUniqueItemKey(key: string, siblingKeys: ReadonlySet<string>): string {\n let candidate = key;\n let suffix = 1;\n while (siblingKeys.has(candidate)) candidate = `${key}_${suffix++}`;\n return candidate;\n}\n","/** Function call contracts shared by validation, return type inference, and evaluation. */\n\nimport type { ValueType } from \"../survey/responses/value-types\";\nimport type { ExpressionOf, FunctionName } from \"./schema\";\n\n/**\n * Argument count, required positions, gap policy, and result type of a function. A result\n * type given as argument positions is the first known type among those arguments.\n */\nexport type FunctionSignature = {\n min: number;\n max?: number;\n required: readonly number[];\n variadicGaps?: boolean;\n returns: ValueType | { fromArguments: readonly number[] };\n};\nconst comparison = { min: 2, max: 2, required: [0, 1], returns: \"boolean\" } as const;\nconst numericAggregate = { min: 1, required: [], variadicGaps: true, returns: \"number\" } as const;\nconst dateAdd = { min: 2, max: 2, required: [0, 1], returns: \"date\" } as const;\n\n/** The exhaustive signature table for every serialized function name. */\nexport const FUNCTION_SIGNATURES = {\n and: { min: 0, required: [], variadicGaps: true, returns: \"boolean\" },\n or: { min: 0, required: [], variadicGaps: true, returns: \"boolean\" },\n not: { min: 1, max: 1, required: [0], returns: \"boolean\" },\n list_contains: comparison,\n list_count: { min: 1, max: 2, required: [0], returns: \"number\" },\n if: { min: 2, max: 3, required: [0, 1], returns: { fromArguments: [1, 2] } },\n eq: comparison,\n str_eq: comparison,\n gt: comparison,\n gte: comparison,\n lt: comparison,\n lte: comparison,\n in_range: { min: 4, max: 4, required: [0, 1, 2], returns: \"boolean\" },\n sum: numericAggregate,\n min: numericAggregate,\n max: numericAggregate,\n date_eq: comparison,\n date_gt: comparison,\n date_gte: comparison,\n date_lt: comparison,\n date_lte: comparison,\n date_add_days: dateAdd,\n date_add_months: dateAdd,\n date_add_years: dateAdd,\n date_diff: { min: 3, max: 3, required: [0, 1, 2], returns: \"number\" },\n date_min: { min: 1, required: [0], returns: \"date\" },\n date_max: { min: 1, required: [0], returns: \"date\" },\n} satisfies Record<FunctionName, FunctionSignature>;\n\n/** Return a diagnostic message when a function has too few or too many arguments. */\nexport function arityIssue(expression: ExpressionOf<\"function\">): string | undefined {\n const signature: FunctionSignature = FUNCTION_SIGNATURES[expression.functionName];\n if (\n expression.arguments.length < signature.min ||\n (signature.max !== undefined && expression.arguments.length > signature.max)\n )\n return `${expression.functionName} expects ${\n signature.max === signature.min\n ? signature.min\n : signature.max === undefined\n ? `at least ${signature.min}`\n : `${signature.min} to ${signature.max}`\n } arguments`;\n return undefined;\n}\n","import { isResponseValue, type ResponseValue, type ValueType } from \"./value-types\";\n\n/** Finite domains describe individual selectable values, including for array slots. */\nexport function responseValueElements(value: ResponseValue): ResponseValue[] {\n if (!Array.isArray(value.value)) return [value];\n const type = value.type.slice(0, -2) as ValueType;\n return value.value.map((entry) => ({ ...value, type, value: entry }) as ResponseValue);\n}\n\nexport function responseValuesEqual(left: ResponseValue, right: ResponseValue): boolean {\n return (\n left.type === right.type &&\n JSON.stringify(left.value) === JSON.stringify(right.value) &&\n (!(\"unit\" in left) || (\"unit\" in right && left.unit === right.unit))\n );\n}\n\n/** No coercion: an export code or label is never a categorical option identity. */\nexport function invalidResponseDomainValues(\n value: ResponseValue,\n allowedValues: readonly ResponseValue[],\n): ResponseValue[] {\n const domain = allowedValues.flatMap(responseValueElements);\n return responseValueElements(value).filter(\n (entry) => !domain.some((allowed) => responseValuesEqual(entry, allowed)),\n );\n}\n\nexport function validateResponseSlotValue(\n slot: { slotId: string; valueType: ValueType; allowedValues?: readonly ResponseValue[] },\n value: unknown,\n): string[] {\n if (!isResponseValue(value)) return [`Slot \"${slot.slotId}\" has an invalid typed value.`];\n if (value.type !== slot.valueType)\n return [`Slot \"${slot.slotId}\" requires ${slot.valueType}, received ${value.type}.`];\n if (!slot.allowedValues) return [];\n return invalidResponseDomainValues(value, slot.allowedValues).map(\n (entry) =>\n `Slot \"${slot.slotId}\" contains invalid value ${JSON.stringify(entry)}. Allowed values: ${JSON.stringify(slot.allowedValues)}.`,\n );\n}\n","/** Infer expression result types from node shape and the survey's response slot types. */\nimport { FUNCTION_SIGNATURES, type FunctionSignature } from \"./function-signatures\";\nimport type { JsonExpression } from \"./schema\";\nimport { operand, visitExpression } from \"./tree\";\nimport type { ValueType } from \"../survey/responses/value-types\";\nimport { ownValue } from \"../schema/string-record\";\n\n/** Stable slot IDs, never variable names or serialized reference strings. */\nexport type ResponseSlotTypeLookup = Record<string, ValueType | undefined>;\n\n/** Infer a node's result type without evaluating it; unknown slot or context types remain undefined. */\nexport const inferExpressionReturnType = (\n expression: JsonExpression | undefined,\n responseSlotTypes: ResponseSlotTypeLookup,\n): ValueType | undefined =>\n expression &&\n visitExpression<ValueType | undefined>(expression, {\n const: (node) => node.value?.type,\n responseVariable: (node) =>\n node.variableRef.method === \"isDefined\"\n ? \"boolean\"\n : ownValue(responseSlotTypes, node.variableRef.slotId),\n ownerState: () => \"boolean\",\n contextVariable: (node) =>\n node.contextType === \"locale\"\n ? \"string\"\n : node.contextType === \"currentDate\"\n ? \"date\"\n : node.contextType === \"participantFlag\"\n ? (node.asType ?? \"string\")\n : node.asType,\n function: (node) => {\n const { returns }: FunctionSignature = FUNCTION_SIGNATURES[node.functionName];\n if (typeof returns === \"string\") return returns;\n for (const index of returns.fromArguments) {\n const type = inferExpressionReturnType(operand(node.arguments, index), responseSlotTypes);\n if (type) return type;\n }\n return undefined;\n },\n });\n","/** Report structural and type problems in authored expressions before graph execution. */\n\nimport { CALENDAR_DATE_UNITS, isCalendarDateUnit } from \"../calendar-date\";\nimport { invalidResponseDomainValues } from \"../survey/responses/value-domain\";\nimport type { ResponseValue, ValueType } from \"../survey/responses/value-types\";\nimport type { ExpressionOf, JsonExpression } from \"./schema\";\nimport { FUNCTION_SIGNATURES, arityIssue, type FunctionSignature } from \"./function-signatures\";\nimport { inferExpressionReturnType, type ResponseSlotTypeLookup } from \"./type-inference\";\nimport { operand, transformExpression, unreachable } from \"./tree\";\n\n/** Describe operand type mismatches for one function call using known response slot types. */\nexport function functionTypeIssues(\n node: ExpressionOf<\"function\">,\n types: ResponseSlotTypeLookup,\n): string[] {\n const args = Array.from(node.arguments, (_, index) =>\n inferExpressionReturnType(operand(node.arguments, index), types),\n );\n const messages: string[] = [];\n const requireType = (index: number, expected: ValueType) => {\n const actual = args[index];\n if (actual && actual !== expected)\n messages.push(\n `${node.functionName} argument ${index + 1} must be ${expected}, got ${actual}.`,\n );\n };\n const all = (expected: ValueType) => args.forEach((_, index) => requireType(index, expected));\n const same = () => {\n if (args[0] && args[1] && args[0] !== args[1])\n messages.push(\n `${node.functionName} arguments must have the same type, got ${args[0]} and ${args[1]}.`,\n );\n };\n\n // Arity and optional operands come from the shared function signatures. This\n // exhaustive dispatch retains the assistant's more specific type guidance.\n const name = node.functionName;\n switch (name) {\n case \"and\":\n case \"or\":\n case \"not\":\n all(\"boolean\");\n break;\n case \"eq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n same();\n break;\n case \"str_eq\":\n all(\"string\");\n break;\n case \"sum\":\n case \"min\":\n case \"max\":\n all(\"number\");\n break;\n case \"in_range\":\n [0, 1, 2].forEach((index) => requireType(index, \"number\"));\n requireType(3, \"boolean\");\n break;\n case \"date_eq\":\n case \"date_gt\":\n case \"date_gte\":\n case \"date_lt\":\n case \"date_lte\":\n case \"date_min\":\n case \"date_max\":\n all(\"date\");\n break;\n case \"date_diff\": {\n requireType(0, \"date\");\n requireType(1, \"date\");\n requireType(2, \"string\");\n const unit = operand(node.arguments, 2);\n if (\n unit?.type === \"const\" &&\n unit.value?.type === \"string\" &&\n !isCalendarDateUnit(unit.value.value)\n )\n messages.push(\n `date_diff argument 3 must be one of ${CALENDAR_DATE_UNITS.join(\", \")}, got ${JSON.stringify(unit.value.value)}.`,\n );\n break;\n }\n case \"date_add_days\":\n case \"date_add_months\":\n case \"date_add_years\":\n requireType(0, \"date\");\n requireType(1, \"number\");\n break;\n case \"list_contains\":\n if (args[0] && args[0] !== \"string[]\" && args[0] !== \"reference[]\")\n messages.push(\n `list_contains argument 1 must be string[] or reference[], got ${args[0]}. Use eq for single-choice reference responses.`,\n );\n if (args[0] === \"string[]\") requireType(1, \"string\");\n if (args[0] === \"reference[]\") requireType(1, \"reference\");\n break;\n case \"list_count\":\n if (args[0] && !args[0].endsWith(\"[]\"))\n messages.push(`list_count argument 1 must be a list, got ${args[0]}.`);\n if (args[1] && !args[1].endsWith(\"[]\"))\n messages.push(`list_count argument 2 must be a list, got ${args[1]}.`);\n else if (args[0]?.endsWith(\"[]\")) requireType(1, args[0]);\n break;\n case \"if\":\n requireType(0, \"boolean\");\n if (args[1] && args[2] && args[1] !== args[2])\n messages.push(`if branches must have the same type, got ${args[1]} and ${args[2]}.`);\n break;\n default:\n unreachable(name);\n }\n return messages;\n}\n\n/** Locate malformed function calls and unfinished required operands in an expression tree. */\nexport function expressionIssues(expression: JsonExpression) {\n const issues: { path: readonly (string | number)[]; message: string }[] = [];\n transformExpression(expression, {\n const: (node) => node,\n responseVariable: (node) => node,\n ownerState: (node) => node,\n contextVariable: (node) => node,\n function: (node, path) => {\n const signature: FunctionSignature = FUNCTION_SIGNATURES[node.functionName];\n const arity = arityIssue(node);\n if (arity) issues.push({ path, message: arity });\n for (let index = 0; index < node.arguments.length; index++)\n if (\n !operand(node.arguments, index) &&\n (signature.required.includes(index) ||\n (!signature.variadicGaps && signature.max === undefined))\n )\n issues.push({\n path: [...path, \"arguments\", index],\n message: `Operand ${index + 1} of ${node.functionName} is unfinished`,\n });\n return node;\n },\n });\n return issues;\n}\n\n/**\n * Locate result, operand, and context key type errors. When option domains are supplied,\n * also flag comparisons with option identities outside the response slot's domain.\n */\nexport function expressionTypeIssues(\n expression: JsonExpression,\n types: ResponseSlotTypeLookup,\n expectedReturnType?: ValueType,\n domains?: ReadonlyMap<string, readonly ResponseValue[]>,\n) {\n // `kind: \"reference\"` marks a comparison with an option that no longer exists in the domain.\n const issues: { path: readonly (string | number)[]; message: string; kind?: \"reference\" }[] = [];\n transformExpression(expression, {\n const: (node) => node,\n responseVariable: (node) => node,\n ownerState: (node) => node,\n contextVariable: (node, path) => {\n const keyType = inferExpressionReturnType(node.key, types);\n if (keyType && keyType !== \"string\")\n issues.push({\n path: [...path, \"key\"],\n message: `Context keys must be string, got ${keyType}.`,\n });\n return node;\n },\n function: (node, path) => {\n for (const message of functionTypeIssues(node, types)) issues.push({ path, message });\n if ([\"eq\", \"list_contains\", \"list_count\"].includes(node.functionName)) {\n const pairs = [\n [0, 1],\n [1, 0],\n ];\n for (const [sourceIndex, valueIndex] of pairs) {\n const source = operand(node.arguments, sourceIndex),\n value = operand(node.arguments, valueIndex);\n if (\n source?.type !== \"responseVariable\" ||\n source.variableRef.method !== \"get\" ||\n value?.type !== \"const\" ||\n !value.value\n )\n continue;\n const allowed = domains?.get(source.variableRef.slotId);\n // Report each offending value separately. Before/after diagnostic comparisons must\n // distinguish an existing broken option from another one removed by a later edit.\n for (const invalid of allowed ? invalidResponseDomainValues(value.value, allowed) : [])\n issues.push({\n path: [...path, \"arguments\", valueIndex],\n message: `Slot '${source.variableRef.slotId}' comparison contains an invalid value ${JSON.stringify(invalid.value)}; use a declared option identity, not an export code.`,\n kind: \"reference\",\n });\n }\n }\n return node;\n },\n });\n const actual = inferExpressionReturnType(expression, types);\n if (expectedReturnType && actual && actual !== expectedReturnType)\n issues.push({\n path: [],\n message: `Must return ${expectedReturnType}, but this expression returns ${actual}.`,\n });\n return issues;\n}\n","/** Evaluate canonical expressions against current answers, owner state, and session context. */\nimport { ownValue } from \"../schema/string-record\";\nimport {\n addCalendarDate,\n CALENDAR_DATE_UNITS,\n compareCalendarDates,\n differenceCalendarDates,\n isCalendarDate,\n isCalendarDateUnit,\n type CalendarDate,\n} from \"../calendar-date\";\nimport type { ResponseValue } from \"../survey/responses/value-types\";\nimport { responseValueElements, responseValuesEqual } from \"../survey/responses/value-domain\";\nimport type { ExpressionOf, JsonExpression } from \"./schema\";\nimport { arityIssue } from \"./function-signatures\";\nimport { operand, unreachable, visitExpression } from \"./tree\";\n\n/** Raised when evaluation encounters an invalid function call or incompatible runtime value. */\nexport class ExpressionEvaluationError extends Error {}\n\n/** Values supplied by the session or graph when an expression is evaluated. */\nexport interface EvaluationContext {\n answer(slotId: string): ResponseValue | undefined;\n disabled(ownerId: string): boolean;\n locale?: string;\n /** Participant-local day chosen by the host, usually frozen when the session starts. */\n currentDate?: CalendarDate;\n participantFlags?: Readonly<Record<string, string>>;\n customValues?: Readonly<Record<string, ResponseValue>>;\n}\nconst boolean = (value: boolean): ResponseValue => ({ type: \"boolean\", value });\nconst number = (value: number): ResponseValue => ({ type: \"number\", value });\n\nfunction evaluatedDates(values: (ResponseValue | undefined)[]): string[] | undefined {\n const dates: string[] = [];\n for (const value of values) {\n if (value?.type !== \"date\" || !isCalendarDate(value.value)) return undefined;\n dates.push(value.value);\n }\n return dates.length ? dates : undefined;\n}\n\nfunction comparableDates(values: (ResponseValue | undefined)[]): string[] | undefined {\n const dates = evaluatedDates(values);\n if (!dates || dates.some((date) => date.length !== dates[0].length)) return undefined;\n return dates;\n}\n\n/** Evaluate the canonical tree; missing data returns undefined, while invalid calls can throw. */\nexport function evaluateExpression(\n node: JsonExpression | undefined,\n context: EvaluationContext,\n): ResponseValue | undefined {\n if (!node) return undefined;\n const evaluate = (child: JsonExpression | undefined) => evaluateExpression(child, context);\n return visitExpression<ResponseValue | undefined>(node, {\n const: (expression) => expression.value,\n responseVariable: (expression) => {\n const answer = context.answer(expression.variableRef.slotId);\n return expression.variableRef.method === \"get\" ? answer : boolean(answer !== undefined);\n },\n ownerState: (expression) => boolean(context.disabled(expression.targetRef.ownerId)),\n contextVariable: (expression) => {\n if (expression.contextType === \"locale\")\n return context.locale === undefined ? undefined : { type: \"string\", value: context.locale };\n if (expression.contextType === \"currentDate\")\n return context.currentDate === undefined\n ? undefined\n : { type: \"date\", value: context.currentDate };\n const key = evaluate(expression.key);\n\n if (key?.type !== \"string\") return undefined;\n if (expression.contextType === \"participantFlag\") {\n const value = ownValue(context.participantFlags, key.value);\n if (expression.asType === \"boolean\") return boolean(value !== undefined);\n if (value === undefined) return undefined;\n if (expression.asType === \"number\")\n return Number.isNaN(parseFloat(value)) ? undefined : number(parseFloat(value));\n if (expression.asType === \"date\")\n return isCalendarDate(value) ? { type: \"date\", value } : undefined;\n return { type: \"string\", value };\n }\n\n const value = ownValue(context.customValues, key.value);\n if (value && expression.asType && value.type !== expression.asType)\n throw new ExpressionEvaluationError(\n `Context value '${key.value}' does not have expected type ${expression.asType}`,\n );\n return value;\n },\n function: (expression) => evaluateFunction(expression, evaluate),\n });\n}\n\nfunction evaluateFunction(\n expression: ExpressionOf<\"function\">,\n evaluate: (node: JsonExpression | undefined) => ResponseValue | undefined,\n): ResponseValue | undefined {\n // Shared with compilation: direct editor/preview evaluation must also reject malformed calls.\n const arity = arityIssue(expression);\n if (arity) throw new ExpressionEvaluationError(arity);\n const arg = (index: number) => evaluate(operand(expression.arguments, index));\n const all = () => Array.from(expression.arguments, (_, index) => arg(index));\n const name = expression.functionName;\n\n switch (name) {\n case \"and\":\n return boolean(expression.arguments.every((_, index) => arg(index)?.value === true));\n case \"or\":\n return boolean(expression.arguments.some((_, index) => arg(index)?.value === true));\n case \"not\": {\n const value = arg(0);\n if (value === undefined) return undefined;\n if (value.type !== \"boolean\")\n throw new ExpressionEvaluationError(\"not expects a boolean operand\");\n return boolean(!value.value);\n }\n case \"list_contains\": {\n const list = arg(0),\n value = arg(1);\n if (!list || !value) return boolean(false);\n if (\n (list.type !== \"reference[]\" && list.type !== \"string[]\") ||\n (value.type !== \"reference\" && value.type !== \"string\")\n )\n throw new ExpressionEvaluationError(\n \"list_contains expects a string/reference array and a string/reference value\",\n );\n return boolean(list.value.includes(value.value));\n }\n case \"list_count\": {\n const list = arg(0);\n if (!list) return number(0);\n if (!Array.isArray(list.value))\n throw new ExpressionEvaluationError(\"list_count expects a list operand\");\n if (!operand(expression.arguments, 1)) return number(list.value.length);\n const filter = arg(1);\n if (!filter) return number(0);\n if (filter.type !== list.type)\n throw new ExpressionEvaluationError(\"list_count expects a filter of the list's type\");\n const allowed = responseValueElements(filter);\n return number(\n responseValueElements(list).filter((entry) =>\n allowed.some((value) => responseValuesEqual(entry, value)),\n ).length,\n );\n }\n case \"if\": {\n // Only the chosen branch is evaluated; a missing condition selects neither.\n const condition = arg(0);\n if (condition === undefined) return undefined;\n if (condition.type !== \"boolean\")\n throw new ExpressionEvaluationError(\"if expects a boolean condition\");\n return arg(condition.value ? 1 : 2);\n }\n case \"eq\": {\n const left = arg(0),\n right = arg(1);\n if (!left || !right) return boolean(false);\n if (left.type !== right.type)\n throw new ExpressionEvaluationError(\"eq expects matching operand types\");\n return boolean(left.value === right.value);\n }\n case \"str_eq\": {\n const left = arg(0),\n right = arg(1);\n if (!left || !right) return boolean(false);\n if (left.type !== right.type)\n throw new ExpressionEvaluationError(\"str_eq expects matching operand types\");\n if (left.type !== \"string\")\n throw new ExpressionEvaluationError(\"str_eq expects string operands\");\n return boolean(left.value === right.value);\n }\n case \"gt\": {\n const left = arg(0),\n right = arg(1);\n if (!left || !right) return boolean(false);\n if (left.type !== right.type)\n throw new ExpressionEvaluationError(\"gt expects matching operand types\");\n return boolean(left.value > right.value);\n }\n case \"gte\": {\n const left = arg(0),\n right = arg(1);\n if (!left || !right) return boolean(false);\n if (left.type !== right.type)\n throw new ExpressionEvaluationError(\"gte expects matching operand types\");\n return boolean(left.value >= right.value);\n }\n case \"lt\": {\n const left = arg(0),\n right = arg(1);\n if (!left || !right) return boolean(false);\n if (left.type !== right.type)\n throw new ExpressionEvaluationError(\"lt expects matching operand types\");\n return boolean(left.value < right.value);\n }\n case \"lte\": {\n const left = arg(0),\n right = arg(1);\n if (!left || !right) return boolean(false);\n if (left.type !== right.type)\n throw new ExpressionEvaluationError(\"lte expects matching operand types\");\n return boolean(left.value <= right.value);\n }\n case \"in_range\": {\n const value = arg(0),\n min = arg(1),\n max = arg(2),\n inclusive = arg(3)?.value === true;\n if (!value || !min || !max) return boolean(false);\n if (value.type !== \"number\" || min.type !== \"number\" || max.type !== \"number\")\n throw new ExpressionEvaluationError(\"in_range expects numeric bounds and value\");\n return boolean(\n inclusive\n ? value.value >= min.value && value.value <= max.value\n : value.value > min.value && value.value < max.value,\n );\n }\n case \"sum\": {\n let result = 0;\n for (const value of all()) {\n if (!value) continue;\n if (value.type !== \"number\")\n throw new ExpressionEvaluationError(\"sum expects numeric operands\");\n result += value.value;\n }\n return number(result);\n }\n case \"min\": {\n let result = Infinity;\n for (const value of all()) {\n if (!value) continue;\n if (value.type !== \"number\")\n throw new ExpressionEvaluationError(\"min expects numeric operands\");\n result = Math.min(result, value.value);\n }\n return number(result);\n }\n case \"max\": {\n let result = -Infinity;\n for (const value of all()) {\n if (!value) continue;\n if (value.type !== \"number\")\n throw new ExpressionEvaluationError(\"max expects numeric operands\");\n result = Math.max(result, value.value);\n }\n return number(result);\n }\n case \"date_add_days\": {\n const date = arg(0),\n amount = arg(1);\n if (date?.type !== \"date\" || amount?.type !== \"number\") return undefined;\n const value = addCalendarDate(date.value, amount.value, \"days\");\n return value === undefined ? undefined : { type: \"date\", value };\n }\n case \"date_add_months\": {\n const date = arg(0),\n amount = arg(1);\n if (date?.type !== \"date\" || amount?.type !== \"number\") return undefined;\n const value = addCalendarDate(date.value, amount.value, \"months\");\n return value === undefined ? undefined : { type: \"date\", value };\n }\n case \"date_add_years\": {\n const date = arg(0),\n amount = arg(1);\n if (date?.type !== \"date\" || amount?.type !== \"number\") return undefined;\n const value = addCalendarDate(date.value, amount.value, \"years\");\n return value === undefined ? undefined : { type: \"date\", value };\n }\n case \"date_diff\": {\n const a = arg(0),\n b = arg(1),\n unit = arg(2);\n if (unit === undefined) return undefined;\n if (unit.type !== \"string\" || !isCalendarDateUnit(unit.value))\n throw new ExpressionEvaluationError(\n `date_diff unit must be one of ${CALENDAR_DATE_UNITS.join(\", \")}`,\n );\n if (a?.type !== \"date\" || b?.type !== \"date\") return undefined;\n const value = differenceCalendarDates(a.value, b.value, unit.value);\n return value === undefined ? undefined : number(value);\n }\n case \"date_eq\": {\n const dates = evaluatedDates(all());\n if (!dates) return undefined;\n return boolean(dates[0] === dates[1]);\n }\n case \"date_gt\": {\n const dates = comparableDates(all());\n if (!dates) return undefined;\n const comparison = compareCalendarDates(dates[0], dates[1]);\n return comparison === undefined ? undefined : boolean(comparison > 0);\n }\n case \"date_gte\": {\n const dates = comparableDates(all());\n if (!dates) return undefined;\n const comparison = compareCalendarDates(dates[0], dates[1]);\n return comparison === undefined ? undefined : boolean(comparison >= 0);\n }\n case \"date_lt\": {\n const dates = comparableDates(all());\n if (!dates) return undefined;\n const comparison = compareCalendarDates(dates[0], dates[1]);\n return comparison === undefined ? undefined : boolean(comparison < 0);\n }\n case \"date_lte\": {\n const dates = comparableDates(all());\n if (!dates) return undefined;\n const comparison = compareCalendarDates(dates[0], dates[1]);\n return comparison === undefined ? undefined : boolean(comparison <= 0);\n }\n case \"date_min\": {\n const dates = comparableDates(all());\n if (!dates) return undefined;\n return { type: \"date\", value: dates.reduce((a, b) => (a < b ? a : b)) };\n }\n case \"date_max\": {\n const dates = comparableDates(all());\n if (!dates) return undefined;\n return { type: \"date\", value: dates.reduce((a, b) => (a > b ? a : b)) };\n }\n default:\n return unreachable(name);\n }\n}\n","export const RESPONSE_VARIABLE_NAME_MAX_LENGTH = 32;\nexport const isValidResponseVariableName = (name: string): boolean =>\n name.length <= RESPONSE_VARIABLE_NAME_MAX_LENGTH && /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/.test(name);\n\n/** Generate an initial suggestion; explicit rename operations validate instead of coercing. */\nexport function suggestResponseVariableName(text: string, fallback = \"response\"): string {\n const normalized = text\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n const value = /^[a-z]/.test(normalized) ? normalized : `${fallback}_${normalized}`;\n return (value || fallback).slice(0, RESPONSE_VARIABLE_NAME_MAX_LENGTH).replace(/_+$/g, \"\");\n}\n\nexport function allocateResponseVariableName(\n base: string,\n used: ReadonlySet<string>,\n maxLength = RESPONSE_VARIABLE_NAME_MAX_LENGTH,\n): string {\n if (!isValidResponseVariableName(base))\n throw new Error(\n `Invalid response variable name \"${base}\"; use lowercase snake_case, starting with a letter, at most 32 characters`,\n );\n if (base.length <= maxLength && !used.has(base)) return base;\n const indexed = /^(.*)_([1-9][0-9]*)$/.exec(base);\n const stemBase = indexed ? indexed[1] : base;\n const start = indexed ? BigInt(indexed[2]) + 1n : 2n;\n for (let n = start; ; n++) {\n const suffix = `_${n}`;\n const stem = stemBase.slice(0, Math.max(0, maxLength - suffix.length)).replace(/_+$/g, \"\");\n if (!stem) throw new Error(\"The variable naming suffix leaves no room for a name\");\n const name = `${stem}${suffix}`;\n if (!used.has(name)) return name;\n }\n}\n\n/** Paths are derived from the current declaration, never used as persistent answer identities. */\nexport type ResponseNamingSource =\n | { kind: \"variable\"; path: (string | number)[] }\n | {\n kind: \"matrix\";\n prefixPath: (string | number)[];\n rowPath?: (string | number)[];\n columnPath?: (string | number)[];\n suffix?: string;\n };\n","import { isValidResponseVariableName } from \"./variable-naming\";\nimport type { ResponseSlotDefinition } from \"./slot-definition\";\nimport { isResponseValue, ValueType, type ResponseValue } from \"./value-types\";\nimport { responseValueElements, validateResponseSlotValue } from \"./value-domain\";\n\nexport interface OwnedResponseSlotDefinition extends ResponseSlotDefinition {\n itemId: string;\n elementId: string;\n}\n\nexport interface ResponseSlotDiagnostic {\n code:\n | \"duplicate-slot-id\"\n | \"invalid-slot\"\n | \"invalid-domain\"\n | \"invalid-variable-name\"\n | \"duplicate-variable-name\"\n | \"unknown-dependency\"\n | \"computed-cycle\"\n | \"unknown-slot\"\n | \"invalid-answer\";\n slotId: string;\n itemId?: string;\n message: string;\n}\n\n// Response values are domain leaves shared with the engine's value APIs; they stay shallowly readonly.\ntype DeepReadonly<T> = T extends (...args: never[]) => unknown\n ? T\n : T extends ResponseValue\n ? Readonly<T>\n : T extends readonly (infer U)[]\n ? readonly DeepReadonly<U>[]\n : T extends object\n ? { readonly [K in keyof T]: DeepReadonly<T[K]> }\n : T;\n\n/** Registry definitions are deeply frozen and shared between reads. */\nexport type ReadonlyResponseSlotDefinition = DeepReadonly<OwnedResponseSlotDefinition>;\n\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n Object.freeze(value);\n Object.values(value).forEach(deepFreeze);\n }\n return value;\n}\n\n/** A detached, derived index. Ambiguous identities never resolve to an arbitrary owner. */\nexport class ResponseSlotRegistry {\n private readonly slots = new Map<string, OwnedResponseSlotDefinition>();\n private frozenDefinitions?: readonly OwnedResponseSlotDefinition[];\n readonly diagnostics: ResponseSlotDiagnostic[] = [];\n\n constructor(\n declarations: readonly {\n itemId: string;\n elementId: string;\n slots: readonly ResponseSlotDefinition[];\n }[],\n ) {\n const seen = new Set<string>();\n for (const declaration of declarations) {\n for (const definition of declaration.slots) {\n const slot: OwnedResponseSlotDefinition = deepFreeze(\n structuredClone({\n ...definition,\n itemId: declaration.itemId,\n elementId: declaration.elementId,\n }),\n );\n if (\n !slot.slotId.trim() ||\n !slot.elementId.trim() ||\n !slot.itemId.trim() ||\n !Object.values(ValueType).includes(slot.valueType)\n ) {\n this.diagnostics.push({\n code: \"invalid-slot\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: \"Response slots require nonempty identities and a supported value type.\",\n });\n continue;\n }\n if (seen.has(slot.slotId)) {\n this.slots.delete(slot.slotId);\n this.diagnostics.push({\n code: \"duplicate-slot-id\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: `Slot \"${slot.slotId}\" is declared more than once. Allocate unique persistent identities before using this schema.`,\n });\n continue;\n }\n seen.add(slot.slotId);\n this.slots.set(slot.slotId, slot);\n const elementType = slot.valueType.endsWith(\"[]\")\n ? slot.valueType.slice(0, -2)\n : slot.valueType;\n if (\n slot.allowedValues?.some(\n (value) =>\n !isResponseValue(value) ||\n responseValueElements(value).some((entry) => entry.type !== elementType),\n )\n ) {\n this.diagnostics.push({\n code: \"invalid-domain\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: `The allowed values for slot \"${slot.slotId}\" must have type ${elementType}.`,\n });\n }\n if (\n slot.referenceValueScores &&\n ((slot.valueType !== ValueType.reference &&\n slot.valueType !== ValueType.referenceArray) ||\n Object.entries(slot.referenceValueScores).some(\n ([id, score]) =>\n !Number.isFinite(score) ||\n (slot.allowedValues &&\n !slot.allowedValues.some(\n (value) => value.type === ValueType.reference && value.value === id,\n )),\n ))\n ) {\n this.diagnostics.push({\n code: \"invalid-domain\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: `Scores for slot \"${slot.slotId}\" must map allowed option IDs to finite numbers.`,\n });\n }\n }\n }\n const names = new Map<string, string>();\n for (const slot of this.slots.values()) {\n if (typeof slot.variableName !== \"string\" || !isValidResponseVariableName(slot.variableName))\n this.diagnostics.push({\n code: \"invalid-variable-name\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: `Variable \"${slot.variableName}\" must use lowercase snake_case, start with a letter and contain at most 32 characters.`,\n });\n const previous = names.get(slot.variableName);\n if (previous)\n this.diagnostics.push({\n code: \"duplicate-variable-name\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: `Variable name \"${slot.variableName}\" is already used by slot \"${previous}\".`,\n });\n names.set(slot.variableName, slot.slotId);\n }\n for (const slot of this.slots.values()) {\n for (const dependency of slot.computed?.sourceSlotIds ?? []) {\n if (!this.slots.has(dependency))\n this.diagnostics.push({\n code: \"unknown-dependency\",\n slotId: slot.slotId,\n itemId: slot.itemId,\n message: `Computed slot \"${slot.slotId}\" depends on unknown or ambiguous slot \"${dependency}\".`,\n });\n }\n }\n const active = new Set<string>();\n const visited = new Set<string>();\n const visit = (id: string) => {\n if (active.has(id)) {\n this.diagnostics.push({\n code: \"computed-cycle\",\n slotId: id,\n message: `Computed slot \"${id}\" participates in a dependency cycle.`,\n });\n return;\n }\n if (visited.has(id)) return;\n active.add(id);\n for (const dependency of this.slots.get(id)?.computed?.sourceSlotIds ?? []) visit(dependency);\n active.delete(id);\n visited.add(id);\n };\n for (const id of this.slots.keys()) visit(id);\n }\n\n /** Slots are deeply frozen and shared; copy one before deriving a changed definition. */\n get(slotId: string): ReadonlyResponseSlotDefinition | undefined {\n return this.slots.get(slotId);\n }\n\n get definitions(): readonly ReadonlyResponseSlotDefinition[] {\n return (this.frozenDefinitions ??= Object.freeze([...this.slots.values()]));\n }\n\n assertValid(): void {\n if (this.diagnostics.length)\n throw new Error(this.diagnostics.map((entry) => entry.message).join(\"\\n\"));\n }\n\n validateAnswers(answers: Readonly<Record<string, unknown>>): ResponseSlotDiagnostic[] {\n const diagnostics = [...this.diagnostics];\n for (const [slotId, value] of Object.entries(answers))\n diagnostics.push(...this.validateAnswer(slotId, value));\n return diagnostics;\n }\n\n /** Value diagnostics only; unrelated registry errors belong to the document. */\n validateAnswer(slotId: string, value: unknown): ResponseSlotDiagnostic[] {\n const diagnostics: ResponseSlotDiagnostic[] = [];\n const slot = this.slots.get(slotId);\n if (!slot) {\n diagnostics.push({\n code: \"unknown-slot\",\n slotId,\n message: `Answer references unknown or ambiguous slot \"${slotId}\".`,\n });\n return diagnostics;\n }\n const issues = slot.computed\n ? [`Computed slot \"${slotId}\" cannot contain a stored answer.`]\n : validateResponseSlotValue(slot, value);\n if (\n isResponseValue(value) &&\n value.type === \"reference[]\" &&\n new Set(value.value).size !== value.value.length\n )\n issues.push(\"A selection cannot contain duplicate options\");\n for (const message of issues)\n diagnostics.push({ code: \"invalid-answer\", slotId, itemId: slot.itemId, message });\n return diagnostics;\n }\n}\n","export interface ItemDisplayPath {\n itemId: string;\n name: string;\n path: string[];\n namePath: string[];\n breadcrumb: string;\n parentBreadcrumb: string;\n}\n\nexport function getCompositionLabel(\n types: readonly string[],\n locale: string,\n elementLabels: ReadonlyMap<string, Readonly<Record<string, string>>> = new Map(),\n): string {\n const language = locale.split(\"-\")[0];\n const labels: Record<string, Record<string, string>> = {\n en: {\n group: \"Group\",\n \"page-break\": \"Page break\",\n empty: \"Empty item\",\n },\n nl: {\n group: \"Groep\",\n \"page-break\": \"Pagina-einde\",\n empty: \"Leeg item\",\n },\n de: {\n group: \"Gruppe\",\n \"page-break\": \"Seitenumbruch\",\n empty: \"Leeres Element\",\n },\n };\n const dictionary = labels[language] ?? labels.en;\n return (\n [...new Set(types)]\n .map((type) => {\n const labels = elementLabels.get(type);\n return labels?.[locale] ?? labels?.[language] ?? labels?.en ?? dictionary[type] ?? type;\n })\n .filter(Boolean)\n .join(\" + \") || dictionary.empty\n );\n}\n","import {\n annotatedReferences,\n inspectAnnotated,\n type ContentRole,\n type IdentityKind,\n type SchemaPath,\n} from \"../../schema/annotations\";\nimport { expressionSchema, type JsonExpression } from \"../../expressions/schema\";\nimport { ResponseSlotRegistry } from \"../responses/slot-registry\";\nimport type {\n ElementFacts,\n ElementRegistry,\n CompositionSurvey,\n FlowItem,\n FlowGroup,\n RuntimeElement,\n} from \"./registry\";\nimport { surveyContentSchema } from \"./content-schema\";\nimport {\n getAssetUsagesFromContent,\n getContentPlainText,\n type Content,\n type ContentAssetUsage,\n} from \"../utils/content\";\nimport {\n SURVEY_LOCALIZATION_SURFACES,\n readLocalizationContent,\n validateLocalizationRef,\n type LocalizationRef,\n} from \"../utils/localization\";\nimport { getCompositionLabel, type ItemDisplayPath } from \"../item-display-name\";\nimport {\n CURRENT_SURVEY_SCHEMA,\n CURRENT_SURVEY_SCHEMA_VERSION,\n itemEditorMetadataSchema,\n} from \"./schema\";\nimport type { ValueType } from \"../responses/value-types\";\nimport { generateId } from \"../../utils\";\nimport { ownValue, setOwnValue } from \"../../schema/string-record\";\n\nexport type DefinitionDiagnostic = {\n code: string;\n path: SchemaPath;\n message: string;\n severity: \"error\" | \"warning\";\n /**\n * `reference`: a dangling reference to an answer, state target, option or content owner.\n * Editor drafts admit these as blocking diagnostics; execution, submission and release refuse them.\n */\n kind?: \"reference\";\n};\n/**\n * `strict` (default) refuses every error. `draft` additionally admits dangling references, so\n * authors can finish restructuring before repairing them. Structural errors are always fatal.\n */\nexport type SurveyAdmission = \"strict\" | \"draft\";\nexport const isAdmissibleInDraft = (diagnostic: DefinitionDiagnostic) =>\n diagnostic.severity !== \"error\" || diagnostic.kind === \"reference\";\nconst blockingFor = (diagnostics: readonly DefinitionDiagnostic[], admission: SurveyAdmission) =>\n diagnostics.filter((diagnostic) =>\n admission === \"draft\" ? !isAdmissibleInDraft(diagnostic) : diagnostic.severity === \"error\",\n );\nexport type SurveyAssetUsage = ContentAssetUsage & {\n ref: LocalizationRef;\n locale: string;\n itemId: string;\n};\n/**\n * The survey's languages with the default first, so fallbacks never depend on JSON key order.\n * Hosts that hold unparsed survey JSON use this to pick the same language as the runtime.\n */\nexport function surveyLocales(survey: {\n translations?: Record<string, unknown>;\n defaultLocale?: string;\n}): string[] {\n const locales = Object.keys(survey.translations ?? {});\n const defaultLocale = survey.defaultLocale;\n return defaultLocale && locales.includes(defaultLocale)\n ? [defaultLocale, ...locales.filter((locale) => locale !== defaultLocale)]\n : locales;\n}\nexport class DefinitionError extends Error {\n constructor(readonly diagnostics: readonly DefinitionDiagnostic[]) {\n super(\n diagnostics\n .map((diagnostic) => `${JSON.stringify(diagnostic.path)}: ${diagnostic.message}`)\n .join(\"\\n\"),\n );\n }\n}\nexport interface ContentOwner {\n id: string;\n kind: IdentityKind;\n parentId?: string;\n itemId: string;\n elementId?: string;\n path: SchemaPath;\n roles: readonly ContentRole[];\n visibility?: JsonExpression;\n disabled?: JsonExpression;\n followUpTriggerId?: string;\n}\nexport type IdentityDeclaration = {\n id: string;\n kind: IdentityKind;\n ownerId?: string;\n path: SchemaPath;\n slotAlias?: boolean;\n};\nexport type BodyLocation = { ownerId: string; path: SchemaPath; followUp: boolean };\nexport type CompiledElement = {\n node: RuntimeElement;\n itemId: string;\n path: SchemaPath;\n facts: ElementFacts;\n};\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst key = (path: SchemaPath) => JSON.stringify(path);\nconst prefix = (parent: SchemaPath, child: SchemaPath) =>\n parent.length <= child.length && parent.every((part, i) => part === child[i]);\n\ntype ReportDiagnostic = (\n code: string,\n path: SchemaPath,\n message: string,\n severity?: DefinitionDiagnostic[\"severity\"],\n kind?: DefinitionDiagnostic[\"kind\"],\n) => void;\n/** Flow membership and assets stay structural; other references may dangle in a draft. */\nconst DRAFT_REFERENCE_TARGETS = new Set<string>([\"slot\", \"state\", \"option\", \"owner\", \"item\"]);\nconst isFlowMembership = (path: SchemaPath) =>\n path[0] === \"surveyItems\" && path[2] === \"config\" && path[3] === \"items\";\ntype ReferenceIndex = Pick<SurveyStructure, \"identities\" | \"owners\" | \"slots\">;\ntype DefinitionReference = ReturnType<typeof annotatedReferences>[number];\n\nfunction validateReferences(\n references: readonly DefinitionReference[],\n index: ReferenceIndex,\n report: ReportDiagnostic,\n) {\n for (const reference of references) {\n const identity = index.identities.get(reference.id);\n const valid =\n reference.target === \"slot\"\n ? !!index.slots.get(reference.id)\n : reference.target === \"state\"\n ? [\"item\", \"section\", \"element\", \"component\"].includes(\n index.owners.get(reference.id)?.kind ?? \"\",\n )\n : reference.target === \"owner\"\n ? index.owners.has(reference.id)\n : reference.target === \"option\"\n ? identity?.kind === \"component\"\n : identity?.kind === reference.target;\n if (!valid)\n report(\n \"invalid-reference\",\n reference.path,\n `Unknown ${reference.target} reference '${reference.id}'`,\n \"error\",\n DRAFT_REFERENCE_TARGETS.has(reference.target) && !isFlowMembership(reference.path)\n ? \"reference\"\n : undefined,\n );\n }\n}\n\nfunction validateLocalization(\n data: CompositionSurvey,\n index: ReferenceIndex,\n report: ReportDiagnostic,\n) {\n const defaultLocale = data.defaultLocale;\n if (defaultLocale !== undefined && !Object.hasOwn(data.translations ?? {}, defaultLocale))\n report(\n \"default-locale\",\n [\"defaultLocale\"],\n `Default locale '${defaultLocale}' has no translations`,\n );\n // Parsed localized content references owners by dictionary key and assets through\n // the shared content usage collector. Template keys and extension attrs are opaque.\n const references: DefinitionReference[] = [];\n const collectAssets = (content: Content | undefined, path: SchemaPath) => {\n for (const usage of getAssetUsagesFromContent(content))\n references.push({\n target: \"asset\",\n id: usage.assetId,\n path: [...path, \"doc\", \"blocks\", usage.blockIndex, \"source\", \"assetId\"],\n });\n };\n for (const [locale, translation] of Object.entries(data.translations ?? {})) {\n const path = [\"translations\", locale];\n for (const surface of SURVEY_LOCALIZATION_SURFACES)\n for (const [key, content] of Object.entries(translation[surface] ?? {}))\n collectAssets(content, [...path, surface, key]);\n for (const [id, roles] of Object.entries(translation.content)) {\n references.push({ target: \"owner\", id, path: [...path, \"content\", id] });\n for (const [role, content] of Object.entries(roles))\n collectAssets(content, [...path, \"content\", id, role]);\n }\n }\n validateReferences(references, index, report);\n for (const [locale, translation] of Object.entries(data.translations ?? {})) {\n for (const [id, roles] of Object.entries(translation.content)) {\n const owner = index.owners.get(id);\n for (const role of Object.keys(roles))\n if (!owner?.roles.some((entry) => entry.role === role))\n report(\n \"content-role\",\n [\"translations\", locale, \"content\", id, role],\n `Owner '${id}' does not declare content role '${role}'`,\n );\n }\n }\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) || Array.isArray(right))\n return (\n Array.isArray(left) &&\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((entry, index) => sameJson(entry, right[index]))\n );\n if (!isRecord(left) || !isRecord(right)) return false;\n // Non-JSON custom values cannot prove structural equality by their enumerable fields.\n if (\n ![Object.prototype, null].includes(Object.getPrototypeOf(left)) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(right))\n )\n return false;\n const keys = Object.keys(left).filter((key) => left[key] !== undefined);\n return (\n keys.length === Object.keys(right).filter((key) => right[key] !== undefined).length &&\n keys.every((key) => Object.hasOwn(right, key) && sameJson(left[key], right[key]))\n );\n}\n\nfunction canReuseStructureIndexes(left: CompositionSurvey, right: CompositionSurvey): boolean {\n // Languages (translations and the default language) never affect structural indexes.\n const {\n translations: _leftTranslations,\n defaultLocale: _leftDefault,\n surveyItems: leftItems,\n ...leftFields\n } = left;\n const {\n translations: _rightTranslations,\n defaultLocale: _rightDefault,\n surveyItems: rightItems,\n ...rightFields\n } = right;\n return (\n sameJson(leftFields, rightFields) &&\n leftItems.length === rightItems.length &&\n leftItems.every((item, index) => {\n const { editorMetadata: _leftMetadata, ...leftItem } = item;\n const { editorMetadata: _rightMetadata, ...rightItem } = rightItems[index];\n return sameJson(leftItem, rightItem);\n })\n );\n}\n\n/** Fail before recursive parsers encounter cyclic input or exceed the common import budget. */\nexport function checkDocumentBudget(input: unknown, maxNodes = 100_000, maxDepth = 128) {\n const ancestors = new Set<object>();\n const stack: { value: unknown; depth: number; exit?: boolean }[] = [{ value: input, depth: 0 }];\n let nodes = 0;\n while (stack.length) {\n const entry = stack.pop()!;\n if (typeof entry.value !== \"object\" || entry.value === null) continue;\n if (entry.exit) {\n ancestors.delete(entry.value);\n continue;\n }\n if (++nodes > maxNodes || entry.depth > maxDepth)\n throw new Error(\"Survey exceeds the document node/depth budget\");\n if (ancestors.has(entry.value)) throw new Error(\"Survey input contains an object cycle\");\n ancestors.add(entry.value);\n stack.push({ ...entry, exit: true });\n for (const value of Object.values(entry.value)) stack.push({ value, depth: entry.depth + 1 });\n }\n}\n\n/** One parsed revision, one owner/identity index, and the existing shared response catalog. */\nclass SurveyStructure {\n readonly data: CompositionSurvey;\n readonly owners = new Map<string, ContentOwner>();\n readonly identities = new Map<string, IdentityDeclaration>();\n readonly elements = new Map<string, CompiledElement>();\n readonly bodies = new Map<string, BodyLocation>();\n readonly expressions: {\n expression: JsonExpression;\n path: SchemaPath;\n expectedReturnType?: ValueType;\n }[] = [];\n readonly diagnostics: DefinitionDiagnostic[] = [];\n readonly slots: ResponseSlotRegistry;\n readonly rootId: string;\n readonly flowItems: ReadonlyMap<string, FlowItem>;\n private readonly ownerPaths = new Map<string, ContentOwner>();\n\n constructor(\n data: CompositionSurvey,\n readonly registry: ElementRegistry,\n admission: SurveyAdmission,\n ) {\n this.data = data;\n const report: ReportDiagnostic = (code, path, message, severity = \"error\", kind) =>\n this.diagnostics.push({ code, path, message, severity, ...(kind ? { kind } : {}) });\n const nearestOwner = (path: SchemaPath): ContentOwner | undefined => {\n for (let length = path.length; length >= 0; length--) {\n const owner = this.ownerPaths.get(key(path.slice(0, length)));\n if (owner) return owner;\n }\n };\n const visits = inspectAnnotated(registry.surveySchema, this.data);\n const bodies: { path: SchemaPath; followUp: boolean; triggerId?: string }[] = [];\n for (const visit of visits) {\n const { annotation, value, path } = visit;\n if (annotation.kind === \"expression\")\n this.expressions.push({\n expression: expressionSchema.parse(value),\n path,\n ...(annotation.expectedReturnType\n ? { expectedReturnType: annotation.expectedReturnType }\n : {}),\n });\n if (annotation.kind === \"owner\") {\n if (!isRecord(value) || typeof value.id !== \"string\")\n throw new Error(\"Content owners require an annotated id\");\n const parent = nearestOwner(path.slice(0, -1));\n const owner: ContentOwner = {\n id: value.id,\n kind: \"component\",\n path,\n roles: annotation.roles,\n parentId: parent?.id,\n itemId: parent?.itemId ?? value.id,\n elementId: value.kind === \"element\" ? value.id : parent?.elementId,\n visibility:\n value.visibility === undefined ? undefined : expressionSchema.parse(value.visibility),\n disabled:\n value.disabled === undefined ? undefined : expressionSchema.parse(value.disabled),\n };\n if (!this.owners.has(owner.id)) this.owners.set(owner.id, owner);\n this.ownerPaths.set(key(path), owner);\n }\n if (annotation.kind === \"identity\") {\n if (typeof value !== \"string\")\n throw new Error(\"Identity annotations require string values\");\n const owner = nearestOwner(path);\n if (owner && path.length === owner.path.length + 1 && path.at(-1) === \"id\")\n owner.kind = annotation.identity;\n const identity = {\n id: value,\n kind: annotation.identity,\n ownerId: owner?.id,\n path,\n slotAlias: annotation.slotAlias,\n };\n if (this.identities.has(value))\n report(\"duplicate-identity\", path, `Identity '${value}' is declared more than once`);\n else this.identities.set(value, identity);\n }\n if (annotation.kind === \"body\") {\n const owner = nearestOwner(path);\n if (!owner) report(\"body-owner\", path, \"A body requires a declared content owner\");\n else if (this.bodies.has(owner.id)) {\n if (key(this.bodies.get(owner.id)!.path) !== key(path))\n report(\"body-owner\", path, \"A content owner can own only one body\");\n else if (annotation.followUp)\n this.bodies.set(owner.id, { ownerId: owner.id, path, followUp: true });\n } else\n this.bodies.set(owner.id, { ownerId: owner.id, path, followUp: annotation.followUp });\n bodies.push({\n path,\n followUp: annotation.followUp,\n triggerId: annotation.followUp ? owner?.id : undefined,\n });\n }\n }\n for (const owner of this.owners.values()) {\n let sections = owner.kind === \"section\" ? 1 : 0;\n let parent = owner.parentId && this.owners.get(owner.parentId);\n const seen = new Set<string>([owner.id]);\n while (parent) {\n if (seen.has(parent.id)) break; // Duplicate IDs are already diagnosed; never recurse through ambiguity.\n seen.add(parent.id);\n if (parent.kind === \"section\") sections++;\n parent = parent.parentId && this.owners.get(parent.parentId);\n }\n if (sections > 1)\n report(\n \"section-depth\",\n owner.path,\n \"Only one semantic section is allowed along an ownership path\",\n );\n const followUps = bodies.filter((body) => body.followUp && prefix(body.path, owner.path));\n owner.followUpTriggerId = followUps.at(-1)?.triggerId;\n }\n for (const body of bodies.filter((candidate) => candidate.followUp)) {\n if (\n bodies.some(\n (parent) => parent.followUp && parent !== body && prefix(parent.path, body.path),\n )\n )\n report(\n \"follow-up-depth\",\n body.path,\n \"Follow-ups cannot contain another follow-up, including an empty body\",\n );\n const trigger = body.triggerId && this.owners.get(body.triggerId);\n if (!trigger || trigger.kind !== \"component\")\n report(\n \"follow-up-trigger\",\n body.path,\n \"A follow-up must belong to a declared trigger component\",\n );\n if (\n bodies.some(\n (other) => other !== body && other.followUp && other.triggerId === body.triggerId,\n )\n )\n report(\"follow-up-trigger\", body.path, \"A trigger can own only one follow-up body\");\n }\n const declarations = [];\n for (const item of this.data.surveyItems) {\n if (item.itemType !== \"content\") continue;\n for (const owner of this.owners.values()) {\n if (owner.itemId !== item.id || owner.kind !== \"element\") continue;\n let raw: unknown = this.data;\n for (const segment of owner.path) {\n if (Array.isArray(raw) && typeof segment === \"number\") raw = raw[segment];\n else if (isRecord(raw)) raw = ownValue(raw, String(segment));\n else throw new Error(\"Invalid derived element path\");\n }\n const node = registry.elementSchema.parse(raw);\n const facts = registry.get(node.elementType).inspect(node);\n this.elements.set(node.id, { node, facts, itemId: item.id, path: owner.path });\n declarations.push({\n itemId: item.id,\n elementId: node.id,\n slots: facts.slots.map((slot) => ({\n ...slot,\n exportSettings: ownValue(node.exportSettings, slot.slotId),\n })),\n });\n for (const slot of facts.slots) {\n const identity = this.identities.get(slot.slotId);\n const slotOwner = identity?.ownerId ? this.owners.get(identity.ownerId) : undefined;\n if (\n !identity ||\n (identity.kind !== \"slot\" && !(identity.kind === \"component\" && identity.slotAlias)) ||\n slotOwner?.elementId !== node.id\n )\n report(\n \"slot-identity\",\n owner.path,\n `Slot '${slot.slotId}' must be declared by its element schema (or explicitly alias its own component)`,\n );\n }\n const ownComponent = (id: string) => this.owners.get(id)?.elementId === node.id;\n const storedSlots = facts.slots.filter((slot) => !slot.computed);\n const boundSlots = new Set<string>();\n for (const binding of facts.bindings) {\n if (\n !storedSlots.some((slot) => slot.slotId === binding.slotId) ||\n boundSlots.has(binding.slotId)\n )\n report(\n \"slot-binding\",\n owner.path,\n `Invalid or duplicate input binding '${binding.slotId}'`,\n );\n boundSlots.add(binding.slotId);\n for (const id of [\n binding.controlId,\n ...(binding.visibilityIds ?? []),\n ...(binding.selection?.options ?? []),\n ])\n if (!ownComponent(id))\n report(\n \"component-binding\",\n owner.path,\n `Component '${id}' does not belong to element '${node.id}'`,\n );\n if (binding.labelRefs) {\n if (!binding.labelRefs.length)\n report(\"control-label\", owner.path, \"Declared control labels must not be empty\");\n for (const ref of binding.labelRefs)\n if (\n !ownComponent(ref.ownerId) ||\n !this.owners.get(ref.ownerId)?.roles.some(({ role }) => role === ref.role)\n )\n report(\n \"control-label\",\n owner.path,\n `Control label ${ref.ownerId}.${ref.role} is not an owned content role`,\n );\n }\n if (\n binding.selection &&\n new Set(binding.selection.options).size !== binding.selection.options.length\n )\n report(\"component-binding\", owner.path, \"Selection options must be unique\");\n }\n for (const slot of storedSlots)\n if (!boundSlots.has(slot.slotId))\n report(\n \"slot-binding\",\n owner.path,\n `Stored slot '${slot.slotId}' requires a control binding`,\n );\n for (const [child, parents] of Object.entries(facts.componentParents))\n if (!ownComponent(child) || parents.some((id) => !ownComponent(id)))\n report(\n \"component-binding\",\n owner.path,\n \"Component inheritance must stay within its declaring element\",\n );\n for (const binding of facts.followUps) {\n if (!ownComponent(binding.triggerId))\n report(\n \"follow-up-activation\",\n owner.path,\n \"Follow-up trigger must belong to its declaring element\",\n );\n if (\n \"selectionSlotId\" in binding &&\n !facts.bindings.some(\n (input) =>\n input.slotId === binding.selectionSlotId &&\n input.selection?.options.includes(binding.triggerId),\n )\n )\n report(\n \"follow-up-activation\",\n owner.path,\n \"Selection activation requires an option of its declared input\",\n );\n }\n for (const id of Object.keys(node.exportSettings ?? {}))\n if (!facts.slots.some((slot) => slot.slotId === id))\n report(\n \"slot-settings-owner\",\n owner.path,\n `Settings target '${id}' is not owned by this element`,\n );\n for (const id of Object.keys(node.prefills ?? {}))\n if (!facts.slots.some((slot) => slot.slotId === id && !slot.computed))\n report(\n \"prefill-owner\",\n owner.path,\n `Prefill target '${id}' is not a writable slot owned by this element`,\n );\n for (const body of bodies.filter(\n (body) =>\n body.followUp &&\n body.triggerId &&\n this.owners.get(body.triggerId)?.elementId === node.id,\n )) {\n if (!facts.fullWidth)\n report(\"follow-up-width\", body.path, \"Follow-up presentations require a full row\");\n if (!facts.followUps.some((binding) => binding.triggerId === body.triggerId))\n report(\n \"follow-up-activation\",\n body.path,\n \"Follow-up activation must be declared by its element domain\",\n );\n }\n for (const binding of facts.followUps)\n if (!bodies.some((body) => body.followUp && body.triggerId === binding.triggerId))\n report(\n \"follow-up-activation\",\n owner.path,\n \"Activation references a trigger without a follow-up body\",\n );\n }\n }\n this.slots = new ResponseSlotRegistry(declarations);\n for (const diagnostic of this.slots.diagnostics)\n report(diagnostic.code, [], diagnostic.message);\n for (const element of this.elements.values())\n for (const [slotId, candidates] of Object.entries(element.node.prefills ?? {}))\n candidates.forEach((candidate, index) => {\n const path = [...element.path, \"prefills\", slotId, index, \"source\"];\n if (candidate.source.type === \"static\")\n for (const issue of this.slots.validateAnswer(slotId, candidate.source.value))\n report(\"prefill-domain\", [...path, \"value\"], issue.message);\n if (\n candidate.source.type === \"templateValue\" &&\n !ownValue(this.data.templateValues, candidate.source.key)\n )\n report(\n \"prefill-template\",\n [...path, \"key\"],\n `Unknown prefill template '${candidate.source.key}'`,\n );\n });\n validateReferences(\n annotatedReferences(visits).filter((reference) => reference.path[0] !== \"translations\"),\n this,\n report,\n );\n validateLocalization(this.data, this, report);\n const items = new Map(this.data.surveyItems.map((item) => [item.id, item]));\n this.flowItems = items;\n const roots = this.data.surveyItems.filter(\n (item) => item.itemType === \"group\" && item.config.isRoot,\n );\n this.rootId = roots[0]?.id ?? \"\";\n if (roots.length !== 1)\n report(\"flow-root\", [\"surveyItems\"], \"The survey must contain exactly one root group\");\n const parents = new Map<string, string>();\n for (const item of items.values())\n if (item.itemType === \"group\") {\n for (const child of item.config.items) {\n if (parents.has(child))\n report(\"flow-parent\", [], `Flow item '${child}' has more than one parent`);\n parents.set(child, item.id);\n const owner = this.owners.get(child);\n if (owner) owner.parentId = item.id;\n }\n }\n for (const item of items.values()) {\n const chain = new Set<string>();\n let id: string | undefined = item.id;\n while (id) {\n if (chain.has(id)) {\n report(\"flow-cycle\", [], `Flow cycle through '${id}'`);\n break;\n }\n chain.add(id);\n id = parents.get(id);\n }\n if (item.id === this.rootId && parents.has(item.id))\n report(\"flow-root\", [], \"The root group cannot have a parent\");\n if (item.id !== this.rootId && !parents.has(item.id))\n report(\"flow-orphan\", [], `Flow item '${item.id}' has no parent`);\n if (item.itemType === \"content\")\n for (const rule of item.config.validationRules ?? []) {\n for (const slotId of rule.targets) {\n const target = this.slots.get(slotId);\n // A missing target is a dangling reference, already reported at its exact path.\n if (target && target.itemId !== item.id)\n report(\"rule-scope\", [], `Rule '${rule.id}' targets a slot outside its content item`);\n }\n }\n }\n if (blockingFor(this.diagnostics, admission).length)\n throw new DefinitionError(this.diagnostics);\n for (const value of this.owners.values()) freezeDocument(value);\n for (const value of this.identities.values()) freezeDocument(value);\n for (const value of this.elements.values()) freezeDocument(value);\n for (const value of this.bodies.values()) freezeDocument(value);\n freezeDocument(this.expressions);\n }\n}\n\nfunction freezeDocument<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n Object.freeze(value);\n Object.values(value).forEach(freezeDocument);\n }\n return value;\n}\n\n/** A detached revision. Translation publication shares immutable structural indexes. */\nexport class Survey {\n private constructor(\n readonly data: CompositionSurvey,\n readonly registry: ElementRegistry,\n private readonly structure: SurveyStructure,\n private readonly itemIndex: ReadonlyMap<string, FlowItem> = structure.flowItems,\n private readonly definitionDiagnostics: readonly DefinitionDiagnostic[] = structure.diagnostics,\n ) {\n freezeDocument(data);\n }\n /**\n * Parse and index one revision. `previous` lets an unchanged structure share its indexes.\n * Editors, history, editor files and assistant drafts use `admission: \"draft\"`; everything that\n * executes, submits or releases a survey keeps the strict default.\n */\n static parse(\n input: unknown,\n registry: ElementRegistry,\n options: { previous?: Survey; admission?: SurveyAdmission } = {},\n ): Survey {\n const { previous, admission = \"strict\" } = options;\n checkDocumentBudget(input);\n const data = registry.surveySchema.parse(input);\n checkDocumentBudget(data);\n if (previous?.registry === registry && canReuseStructureIndexes(data, previous.data)) {\n // Localization is the only part a structure-sharing revision can change.\n const diagnostics = previous.structure.diagnostics.filter(\n (diagnostic) =>\n !diagnostic.path.length ||\n (diagnostic.path[0] !== \"translations\" && diagnostic.path[0] !== \"defaultLocale\"),\n );\n const report: ReportDiagnostic = (code, path, message, severity = \"error\", kind) =>\n diagnostics.push({ code, path, message, severity, ...(kind ? { kind } : {}) });\n validateLocalization(data, previous.structure, report);\n if (blockingFor(diagnostics, admission).length) throw new DefinitionError(diagnostics);\n return new Survey(\n data,\n registry,\n previous.structure,\n new Map(data.surveyItems.map((item) => [item.id, item])),\n diagnostics,\n );\n }\n const structure = new SurveyStructure(data, registry, admission);\n return new Survey(structure.data, registry, structure);\n }\n static blank(registry: ElementRegistry): Survey {\n return Survey.parse(\n {\n $schema: CURRENT_SURVEY_SCHEMA,\n schemaVersion: CURRENT_SURVEY_SCHEMA_VERSION,\n surveyItems: [{ id: generateId(), itemType: \"group\", config: { isRoot: true, items: [] } }],\n },\n registry,\n );\n }\n get rootId() {\n return this.structure.rootId;\n }\n get locales(): string[] {\n return surveyLocales(this.data);\n }\n get defaultLocale(): string | undefined {\n return this.locales[0];\n }\n get surveyKey(): string | undefined {\n return this.data.metadata?.surveyKey;\n }\n get metadata() {\n return this.data.metadata;\n }\n get maxItemsPerPage() {\n return this.data.maxItemsPerPage;\n }\n get rootItem(): FlowGroup {\n const root = this.getItem(this.rootId);\n if (root?.itemType !== \"group\") throw new Error(\"Validated survey is missing its root group\");\n return root;\n }\n getItemPath(itemId: string): string[] {\n if (!this.getItem(itemId)) throw new Error(`Item ${itemId} not found`);\n const path: string[] = [];\n let parent = this.getParentItem(itemId);\n while (parent) {\n path.unshift(parent.id);\n parent = this.getParentItem(parent.id);\n }\n return path;\n }\n getChildrenItems(parentId: string): FlowItem[] {\n const parent = this.getItem(parentId);\n return parent?.itemType === \"group\" ? parent.config.items.map((id) => this.getItem(id)!) : [];\n }\n getSiblings(itemId: string): FlowItem[] {\n const parent = this.getParentItem(itemId);\n return parent ? this.getChildrenItems(parent.id) : [];\n }\n resolveItemEditorName(itemId: string, locale = this.locales[0] ?? \"en\"): string {\n const item = this.getItem(itemId);\n if (!item) return getCompositionLabel([], locale);\n const explicit = item.metadata?.itemLabel?.trim();\n if (explicit) return explicit;\n const content = ownValue(this.data.translations, locale)?.content;\n const summary = (value?: Content) => getContentPlainText(value).replace(/\\s+/g, \" \").trim();\n const title = summary(ownValue(content, itemId)?.title);\n if (title) return title;\n const elements = [...this.elements.values()].filter((element) => element.itemId === itemId);\n for (const element of elements) {\n const roles = ownValue(content, element.node.id);\n const wording = summary(roles?.label) || summary(roles?.body);\n if (wording) return wording;\n }\n return getCompositionLabel(\n item.itemType === \"content\" ? elements.map(({ node }) => node.elementType) : [item.itemType],\n locale,\n this.registry.labels,\n );\n }\n getItemDisplayPath(\n itemId: string,\n locale = this.locales[0] ?? \"en\",\n ): ItemDisplayPath | undefined {\n if (!this.getItem(itemId)) return undefined;\n const path = this.getItemPath(itemId),\n name = this.resolveItemEditorName(itemId, locale);\n const namePath = path.map((id) => this.resolveItemEditorName(id, locale));\n return {\n itemId,\n name,\n path,\n namePath,\n breadcrumb: [...namePath, name].join(\" / \"),\n parentBreadcrumb: namePath.join(\" / \"),\n };\n }\n getItemEditorBreadcrumb(itemId: string, locale = this.locales[0] ?? \"en\"): string | undefined {\n const path = this.getItemDisplayPath(itemId, locale);\n if (!path) return undefined;\n return [...path.namePath.slice(path.path[0] === this.rootId ? 1 : 0), path.name].join(\" / \");\n }\n get itemOutline(): ItemDisplayPath[] {\n const result: ItemDisplayPath[] = [];\n const visit = (item: FlowItem) => {\n result.push(this.getItemDisplayPath(item.id)!);\n this.getChildrenItems(item.id).forEach(visit);\n };\n visit(this.rootItem);\n return result;\n }\n getTemplateValue(key: string) {\n return ownValue(this.data.templateValues, key);\n }\n getTemplateValueKeys(): string[] {\n return Object.keys(this.data.templateValues ?? {});\n }\n getAsset(assetId: string) {\n return ownValue(this.data.assets, assetId);\n }\n getAssets() {\n return new Map(Object.entries(this.data.assets ?? {}));\n }\n getAssetIds(): string[] {\n return Object.keys(this.data.assets ?? {});\n }\n hasAsset(assetId: string): boolean {\n return Object.hasOwn(this.data.assets ?? {}, assetId);\n }\n getAssetUsages(filterAssetId?: string): SurveyAssetUsage[] {\n const usages: SurveyAssetUsage[] = [];\n const collect = (content: Content | undefined, ref: LocalizationRef, locale: string) => {\n for (const usage of getAssetUsagesFromContent(content)) {\n if (filterAssetId && usage.assetId !== filterAssetId) continue;\n const itemId = ref.scope === \"content\" ? this.owners.get(ref.ownerId)!.itemId : this.rootId;\n usages.push({ ...usage, ref, locale, itemId });\n }\n };\n // Asset usage includes image-only content and every locale, regardless of text coverage.\n for (const [locale, translation] of Object.entries(this.data.translations ?? {})) {\n for (const surface of SURVEY_LOCALIZATION_SURFACES)\n for (const [contentKey, content] of Object.entries(translation[surface] ?? {}))\n collect(content, { scope: \"survey\", surface, contentKey }, locale);\n for (const [ownerId, roles] of Object.entries(translation.content))\n for (const [role, content] of Object.entries(roles))\n collect(content, { scope: \"content\", ownerId, role }, locale);\n }\n return usages;\n }\n get flowItems(): ReadonlyMap<string, FlowItem> {\n return this.itemIndex;\n }\n get owners(): ReadonlyMap<string, ContentOwner> {\n return this.structure.owners;\n }\n get identities(): ReadonlyMap<string, IdentityDeclaration> {\n return this.structure.identities;\n }\n get elements(): ReadonlyMap<string, CompiledElement> {\n return this.structure.elements;\n }\n get expressions() {\n return this.structure.expressions;\n }\n get bodies(): ReadonlyMap<string, BodyLocation> {\n return this.structure.bodies;\n }\n get slots() {\n return this.structure.slots;\n }\n get diagnostics(): readonly DefinitionDiagnostic[] {\n return this.definitionDiagnostics;\n }\n /**\n * Document-index errors that prevent running, submitting or releasing this revision. Graph\n * compilation can add more; use getBrokenReferences for the complete set of broken references.\n */\n get blockingDiagnostics(): readonly DefinitionDiagnostic[] {\n return this.definitionDiagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n }\n getItem(itemId: string): FlowItem | undefined {\n return this.itemIndex.get(itemId);\n }\n getParentItem(itemId: string): FlowGroup | undefined {\n if (!this.getItem(itemId)) return undefined;\n const parentId = this.owners.get(itemId)?.parentId;\n const parent = parentId ? this.getItem(parentId) : undefined;\n return parent?.itemType === \"group\" ? parent : undefined;\n }\n /** Inclusive ancestry, as used by the outline's subtree/drop guards. */\n isDescendantOf(itemId: string, ancestorId: string): boolean {\n let item = this.getItem(itemId);\n while (item) {\n if (item.id === ancestorId) return true;\n item = this.getParentItem(item.id);\n }\n return false;\n }\n serialize(): CompositionSurvey {\n return structuredClone(this.data);\n }\n\n /** Editor timestamps cannot affect identity, conditions or responses; share their indexes. */\n withItemEditorMetadata(\n updates: ReadonlyMap<string, NonNullable<FlowItem[\"editorMetadata\"]>>,\n ): Survey {\n if (!updates.size) return this;\n const items = new Map(this.itemIndex);\n for (const [id, metadata] of updates) {\n const item = items.get(id);\n if (!item) throw new Error(`Unknown item '${id}'`);\n items.set(id, { ...item, editorMetadata: itemEditorMetadataSchema.parse(metadata) });\n }\n const data = {\n ...this.data,\n surveyItems: this.data.surveyItems.map((item) => items.get(item.id)!),\n };\n checkDocumentBudget(data);\n return new Survey(data, this.registry, this.structure, items, this.definitionDiagnostics);\n }\n\n /** Sets the default language without rebuilding structural indexes. */\n withDefaultLocale(locale: string): Survey {\n if (!Object.hasOwn(this.data.translations ?? {}, locale))\n throw new Error(`Default locale '${locale}' has no translations`);\n return new Survey(\n { ...this.data, defaultLocale: locale },\n this.registry,\n this.structure,\n this.itemIndex,\n this.definitionDiagnostics,\n );\n }\n withLocalizationContent(\n ref: LocalizationRef,\n locale: string,\n content: Content | undefined,\n ): Survey {\n validateLocalizationRef(this, ref);\n if (!locale.trim()) throw new Error(\"A locale is required\");\n if (content === undefined && readLocalizationContent(this, ref, locale) === undefined)\n return this;\n const translations = { ...this.data.translations };\n const old = ownValue(translations, locale) ?? { content: {} };\n const translation = { ...old, content: { ...old.content } };\n let fields: Record<string, Content>;\n if (ref.scope === \"content\") {\n fields = { ...ownValue(translation.content, ref.ownerId) };\n if (content === undefined) delete fields[ref.role];\n else setOwnValue(fields, ref.role, content);\n if (Object.keys(fields).length) setOwnValue(translation.content, ref.ownerId, fields);\n else delete translation.content[ref.ownerId];\n } else {\n fields = { ...translation[ref.surface] };\n if (content === undefined) delete fields[ref.contentKey];\n else setOwnValue(fields, ref.contentKey, content);\n translation[ref.surface] = fields;\n }\n setOwnValue(translations, locale, translation);\n const data = { ...this.data, translations };\n // Check the complete candidate before recursive content parsing, just as imports do.\n checkDocumentBudget(data);\n if (content !== undefined) {\n const parsed = surveyContentSchema.parse(content);\n for (const asset of getAssetUsagesFromContent(parsed))\n if (!ownValue(this.data.assets, asset.assetId))\n throw new Error(`Unknown content asset '${asset.assetId}'`);\n setOwnValue(fields, ref.scope === \"content\" ? ref.role : ref.contentKey, parsed);\n }\n return new Survey(\n data,\n this.registry,\n this.structure,\n this.itemIndex,\n this.definitionDiagnostics,\n );\n }\n}\n","import { ownValue } from \"../schema/string-record\";\nimport { collectExpressionDependencies } from \"../expressions/references\";\nimport type { JsonExpression } from \"../expressions/schema\";\nimport { expressionIssues, expressionTypeIssues } from \"../expressions/validation\";\nimport {\n evaluateExpression,\n ExpressionEvaluationError,\n type EvaluationContext,\n} from \"../expressions/evaluator\";\nimport {\n DefinitionError,\n type DefinitionDiagnostic,\n type Survey,\n type SurveyAdmission,\n} from \"../survey/composition/document\";\nimport type { SlotBinding } from \"../survey/composition/registry\";\nimport type { ResponseValue } from \"../survey/responses/value-types\";\nimport { validateResponseSlotValue } from \"../survey/responses/value-domain\";\n\ntype NodeType = \"visibility\" | \"disabled\" | \"answer\" | \"storedAnswer\" | \"followUpActive\";\ntype NodeValue = ResponseValue | boolean | undefined;\ntype Edge = { key: string; reason: string };\ntype GraphNode = {\n key: string;\n dependencies: Edge[];\n evaluate: (\n read: (key: string) => NodeValue,\n input: StateEvaluationInput,\n diagnostics: DefinitionDiagnostic[],\n ) => NodeValue;\n};\nconst stateNodeKey = (type: NodeType, id: string) => JSON.stringify([type, id]);\nexport type RecordedContext = Omit<EvaluationContext, \"answer\" | \"disabled\">;\nexport type StateEvaluationInput = {\n answers: Readonly<Record<string, ResponseValue>>;\n context: RecordedContext;\n};\n\n/** Compiled dependencies for one survey definition; evaluate against current answers and context. */\nexport class SurveyStateGraph {\n private readonly nodes = new Map<string, GraphNode>();\n readonly bindings = new Map<string, SlotBinding>();\n readonly initializationOrder: readonly string[];\n /**\n * Draft-only problems that did not prevent compilation: dangling references (which evaluate as\n * missing) and unfinished expressions. Always empty for a strict graph.\n */\n readonly admittedDiagnostics: readonly DefinitionDiagnostic[];\n /**\n * `strict` (default) compiles only executable definitions. `draft` serves editors and editor\n * previews: unfinished expressions and dangling references are admitted, and a missing answer or\n * state target reads as missing (unanswered, not disabled, not visible).\n */\n constructor(\n readonly document: Survey,\n options: { admission?: SurveyAdmission } = {},\n ) {\n const draft = options.admission === \"draft\";\n if (!draft && document.blockingDiagnostics.length)\n throw new DefinitionError(document.blockingDiagnostics);\n const diagnostics: DefinitionDiagnostic[] = [];\n const admitted: DefinitionDiagnostic[] = [];\n const types = Object.fromEntries(\n document.slots.definitions.map((slot) => [slot.slotId, slot.valueType]),\n );\n const domains = new Map(\n document.slots.definitions.flatMap((slot) =>\n slot.allowedValues ? [[slot.slotId, slot.allowedValues] as const] : [],\n ),\n );\n for (const { expression, path, expectedReturnType } of document.expressions)\n for (const issue of expressionTypeIssues(expression, types, expectedReturnType, domains))\n diagnostics.push({\n ...issue,\n path: [...path, ...issue.path],\n code: \"expression-type\",\n severity: \"error\",\n });\n for (const element of document.elements.values())\n for (const [slotId, candidates] of Object.entries(element.node.prefills ?? {}))\n candidates.forEach((candidate, index) => {\n const target = document.slots.get(slotId)!;\n const path = [...element.path, \"prefills\", slotId, index];\n const check = (\n expression: JsonExpression,\n expected: typeof target.valueType,\n at: typeof path,\n ) => {\n for (const issue of expressionTypeIssues(expression, types, expected, domains))\n diagnostics.push({\n ...issue,\n path: [...at, ...issue.path],\n code: \"prefill-type\",\n severity: \"error\",\n });\n };\n if (candidate.when) check(candidate.when, \"boolean\", [...path, \"when\"]);\n if (candidate.source.type === \"expression\")\n check(candidate.source.expression, target.valueType, [...path, \"source\", \"expression\"]);\n if (candidate.source.type === \"templateValue\") {\n // Survey admission verifies that every prefill template exists.\n const template = ownValue(document.data.templateValues, candidate.source.key)!;\n if (template.returnType !== target.valueType)\n diagnostics.push({\n code: \"prefill-type\",\n severity: \"error\",\n path: [...path, \"source\"],\n message: `Prefill template produces ${template.returnType}, but '${slotId}' requires ${target.valueType}`,\n });\n if (template.expression)\n check(\n template.expression,\n template.type === \"formatDate\" ? \"date\" : template.returnType,\n [\"templateValues\", candidate.source.key, \"expression\"],\n );\n }\n });\n for (const { expression, path } of document.expressions)\n for (const issue of expressionIssues(expression))\n (draft ? admitted : diagnostics).push({\n ...issue,\n path: [...path, ...issue.path],\n code: \"invalid-expression\",\n severity: \"error\",\n });\n const nodePaths = new Map<string, DefinitionDiagnostic[\"path\"]>();\n const slotOwners = new Map(\n document.slots.definitions.map((slot) => [slot.slotId, slot.elementId]),\n );\n\n const add = (\n type: NodeType,\n id: string,\n dependencies: Edge[],\n evaluate: GraphNode[\"evaluate\"],\n ) => {\n const key = stateNodeKey(type, id);\n if (this.nodes.has(key)) throw new Error(`Duplicate graph node ${key}`);\n this.nodes.set(key, { key, dependencies, evaluate });\n const owner = document.owners.get(id) ?? document.owners.get(slotOwners.get(id) ?? \"\");\n if (owner) nodePaths.set(key, owner.path);\n };\n\n const edge = (type: NodeType, id: string, reason: string): Edge => ({\n key: stateNodeKey(type, id),\n reason,\n });\n\n const dependencies = (expression: JsonExpression | undefined): Edge[] => {\n if (!expression) return [];\n return collectExpressionDependencies(expression).map((dependency) =>\n dependency.kind === \"answer\"\n ? edge(\"answer\", dependency.slotId, \"authored answer reference\")\n : edge(\"disabled\", dependency.targetRef.ownerId, \"authored state reference\"),\n );\n };\n\n const evaluate = (\n expression: JsonExpression,\n read: (key: string) => NodeValue,\n input: StateEvaluationInput,\n issues: DefinitionDiagnostic[],\n path: readonly (string | number)[],\n ) => {\n try {\n return evaluateExpression(expression, {\n ...input.context,\n answer: (id) => {\n const value = read(stateNodeKey(\"answer\", id));\n return typeof value === \"boolean\" ? undefined : value;\n },\n disabled: (id) => read(stateNodeKey(\"disabled\", id)) === true,\n });\n } catch (error) {\n if (!(error instanceof ExpressionEvaluationError)) throw error;\n issues.push({\n code: \"condition-evaluation\",\n path,\n message: error.message,\n severity: \"warning\",\n });\n return undefined;\n }\n };\n for (const owner of document.owners.values()) {\n const domainParents = owner.elementId\n ? (ownValue(document.elements.get(owner.elementId)?.facts.componentParents, owner.id) ?? [])\n : [];\n const parents = [...(owner.parentId ? [owner.parentId] : []), ...domainParents];\n const inheritedVisibility = parents.map((id) =>\n edge(\"visibility\", id, \"visibility inheritance\"),\n );\n const followUp = owner.followUpTriggerId\n ? [edge(\"followUpActive\", owner.followUpTriggerId, \"follow-up activation\")]\n : [];\n add(\n \"visibility\",\n owner.id,\n [...inheritedVisibility, ...followUp, ...dependencies(owner.visibility)],\n (read, input, issues) => {\n if (\n [...inheritedVisibility, ...followUp].some(\n (dependency) => read(dependency.key) !== true,\n )\n )\n return false;\n if (!owner.visibility) return true;\n const result = evaluate(owner.visibility, read, input, issues, [\n ...owner.path,\n \"visibility\",\n ]);\n if (result && result.type !== \"boolean\")\n issues.push({\n code: \"condition-type\",\n path: [...owner.path, \"visibility\"],\n message: \"Visibility must return a boolean\",\n severity: \"warning\",\n });\n return result?.type === \"boolean\" && result.value;\n },\n );\n const inheritedDisabled = parents.map((id) => edge(\"disabled\", id, \"disabled inheritance\"));\n add(\n \"disabled\",\n owner.id,\n [...inheritedDisabled, ...dependencies(owner.disabled)],\n (read, input, issues) => {\n const inherited = inheritedDisabled.some((dependency) => read(dependency.key) === true);\n if (!owner.disabled) return inherited;\n const result = evaluate(owner.disabled, read, input, issues, [...owner.path, \"disabled\"]);\n if (!result || result.type !== \"boolean\")\n issues.push({\n code: \"condition-type\",\n path: [...owner.path, \"disabled\"],\n message: \"Disabled condition did not return a boolean; local disabling is false\",\n severity: \"warning\",\n });\n return inherited || (result?.type === \"boolean\" && result.value);\n },\n );\n }\n for (const element of document.elements.values()) {\n for (const binding of element.facts.bindings) {\n if (this.bindings.has(binding.slotId))\n throw new Error(`Duplicate control binding for ${binding.slotId}`);\n this.bindings.set(binding.slotId, binding);\n }\n for (const slot of element.facts.slots) {\n const storedKey = stateNodeKey(\"storedAnswer\", slot.slotId);\n if (!slot.computed)\n add(\"storedAnswer\", slot.slotId, [], (_read, input, issues) => {\n const answer = ownValue(input.answers, slot.slotId);\n if (answer === undefined) return undefined;\n const errors = validateResponseSlotValue(slot, answer);\n if (errors.length) {\n issues.push({\n code: \"invalid-answer\",\n path: [\"answers\", slot.slotId],\n message: errors.join(\"; \"),\n severity: \"error\",\n });\n return undefined;\n }\n return answer;\n });\n const binding = this.bindings.get(slot.slotId);\n const visibility = [\n binding?.controlId ?? element.node.id,\n ...(binding?.visibilityIds ?? []),\n ];\n const options = binding?.selection?.options ?? [];\n const sources = slot.computed?.sourceSlotIds ?? [];\n add(\n \"answer\",\n slot.slotId,\n [\n ...visibility.map((id) => edge(\"visibility\", id, \"control applicability\")),\n ...options.map((id) => edge(\"visibility\", id, \"option projection\")),\n ...(slot.computed\n ? sources.map((id) => edge(\"answer\", id, \"computed source\"))\n : [{ key: storedKey, reason: \"retained source\" }]),\n ],\n (read) => {\n if (visibility.some((id) => read(stateNodeKey(\"visibility\", id)) !== true))\n return undefined;\n if (slot.computed)\n return document.registry\n .get(element.node.elementType)\n .compute(element.node, slot.slotId, (id) => {\n const value = read(stateNodeKey(\"answer\", id));\n return typeof value === \"boolean\" ? undefined : value;\n });\n const value = read(storedKey);\n if (typeof value === \"boolean\" || !value) return undefined;\n if (!binding?.selection) return value;\n if (value.type === \"reference\")\n return read(stateNodeKey(\"visibility\", value.value)) === true ? value : undefined;\n if (value.type === \"reference[]\") {\n const active = value.value.filter(\n (id) => read(stateNodeKey(\"visibility\", id)) === true,\n );\n // An intentionally answered empty selection differs from an entirely hidden selection.\n return active.length || value.value.length === 0\n ? { ...value, value: active }\n : undefined;\n }\n return undefined;\n },\n );\n }\n for (const followUp of element.facts.followUps) {\n const trigger = edge(\"visibility\", followUp.triggerId, \"trigger visibility\");\n if (\"selectionSlotId\" in followUp) {\n const selected = edge(\n \"storedAnswer\",\n followUp.selectionSlotId,\n \"per-option checked stored selection\",\n );\n add(\"followUpActive\", followUp.triggerId, [trigger, selected], (read) => {\n if (read(trigger.key) !== true) return false;\n const value = read(selected.key);\n return (\n typeof value !== \"boolean\" &&\n (value?.type === \"reference\"\n ? value.value === followUp.triggerId\n : value?.type === \"reference[]\" && value.value.includes(followUp.triggerId))\n );\n });\n } else\n add(\n \"followUpActive\",\n followUp.triggerId,\n [trigger, ...dependencies(followUp.expression)],\n (read, input, issues) => {\n if (read(trigger.key) !== true) return false;\n const result = evaluate(followUp.expression, read, input, issues, element.path);\n if (result && result.type !== \"boolean\")\n issues.push({\n code: \"condition-type\",\n path: element.path,\n message: \"Follow-up activation must return a boolean\",\n severity: \"warning\",\n });\n return result?.type === \"boolean\" && result.value;\n },\n );\n }\n }\n if (draft) {\n // Dangling references compile to constant missing nodes, so previews and diagnostics keep\n // working. Every authored expression is covered, including rules evaluated outside nodes.\n const missing = new Set<string>();\n for (const node of this.nodes.values())\n for (const dependency of node.dependencies)\n if (!this.nodes.has(dependency.key)) missing.add(dependency.key);\n for (const { expression } of document.expressions)\n for (const dependency of dependencies(expression))\n if (!this.nodes.has(dependency.key)) missing.add(dependency.key);\n for (const key of missing) {\n const [type]: [NodeType, string] = JSON.parse(key);\n const value = type === \"answer\" || type === \"storedAnswer\" ? undefined : false;\n this.nodes.set(key, { key, dependencies: [], evaluate: () => value });\n }\n }\n const visited = new Set<string>();\n const visiting: { key: string; reason: string }[] = [];\n const visit = (key: string, reason: string) => {\n if (visited.has(key)) return;\n const cycle = visiting.findIndex((node) => node.key === key);\n if (cycle >= 0) {\n diagnostics.push({\n code: \"dependency-cycle\",\n path: nodePaths.get(key) ?? [],\n message:\n \"Dependency cycle: \" +\n [...visiting.slice(cycle), { key, reason }]\n .map((node) => `${node.key} (${node.reason})`)\n .join(\" → \"),\n severity: \"error\",\n });\n return;\n }\n const node = this.nodes.get(key);\n if (!node) {\n diagnostics.push({\n code: \"unknown-dependency\",\n path: [],\n message: `Unknown dependency ${key} (${reason})`,\n severity: \"error\",\n });\n return;\n }\n visiting.push({ key, reason });\n for (const dependency of node.dependencies) visit(dependency.key, dependency.reason);\n visiting.pop();\n visited.add(key);\n };\n for (const key of this.nodes.keys()) visit(key, \"root\");\n if (draft)\n for (const diagnostic of diagnostics.splice(0))\n (diagnostic.kind === \"reference\" ? admitted : diagnostics).push(diagnostic);\n // Keep admitted draft problems in the report, so diagnostics views still show them.\n if (diagnostics.length) throw new DefinitionError([...diagnostics, ...admitted]);\n this.admittedDiagnostics = Object.freeze(admitted);\n const prefills = new Map(\n [...document.elements.values()].flatMap((element) =>\n Object.entries(element.node.prefills ?? {}),\n ),\n );\n const initialization: string[] = [],\n initialized = new Set<string>(),\n initializing = new Set<string>();\n const initialize = (id: string) => {\n if (initialized.has(id)) return;\n if (initializing.has(id))\n throw new DefinitionError([\n {\n code: \"prefill-cycle\",\n severity: \"error\",\n path: [],\n message: `Prefill dependency cycle through '${id}'`,\n },\n ]);\n initializing.add(id);\n for (const candidate of prefills.get(id) ?? []) {\n const expressions = [\n candidate.when,\n candidate.source.type === \"expression\"\n ? candidate.source.expression\n : candidate.source.type === \"templateValue\"\n ? ownValue(document.data.templateValues, candidate.source.key)?.expression\n : undefined,\n ];\n for (const expression of expressions)\n if (expression)\n for (const dependency of this.storedDependencies(expression))\n if (prefills.has(dependency)) initialize(dependency);\n }\n initializing.delete(id);\n initialized.add(id);\n initialization.push(id);\n };\n prefills.forEach((_, id) => initialize(id));\n this.initializationOrder = Object.freeze(initialization);\n }\n\n evaluate(input: StateEvaluationInput) {\n const cache = new Map<string, NodeValue>();\n const diagnostics: DefinitionDiagnostic[] = [];\n const read = (key: string): NodeValue => {\n if (cache.has(key)) return cache.get(key);\n const node = this.nodes.get(key);\n if (!node) throw new Error(`Unknown response graph node ${key}`);\n const result = node.evaluate(\n (dependency) => {\n if (!node.dependencies.some((edge) => edge.key === dependency))\n throw new Error(`Undeclared domain dependency ${key} → ${dependency}`);\n return read(dependency);\n },\n input,\n diagnostics,\n );\n cache.set(key, result);\n return result;\n };\n const answer = (id: string) => {\n const value = read(stateNodeKey(\"answer\", id));\n return typeof value === \"boolean\" ? undefined : value;\n };\n return {\n answer,\n stored: (id: string) => {\n const value = read(stateNodeKey(\"storedAnswer\", id));\n return typeof value === \"boolean\" ? undefined : value;\n },\n visible: (id: string) => read(stateNodeKey(\"visibility\", id)) === true,\n disabled: (id: string) => read(stateNodeKey(\"disabled\", id)) === true,\n followUpActive: (id: string) => read(stateNodeKey(\"followUpActive\", id)) === true,\n activeAnswers: () =>\n Object.fromEntries(\n this.document.slots.definitions.flatMap((slot) => {\n const value = answer(slot.slotId);\n return value === undefined || slot.computed ? [] : [[slot.slotId, value]];\n }),\n ),\n get diagnostics(): readonly Readonly<DefinitionDiagnostic>[] {\n return diagnostics.map((issue) => ({ ...issue, path: [...issue.path] }));\n },\n };\n }\n\n storedDependencies(expression: JsonExpression): Set<string> {\n const result = new Set<string>();\n const visited = new Set<string>();\n const visit = (key: string) => {\n if (visited.has(key)) return;\n visited.add(key);\n const [type, id]: [NodeType, string] = JSON.parse(key);\n if (type === \"storedAnswer\") result.add(id);\n const node = this.nodes.get(key);\n if (!node) throw new Error(`Unknown dependency ${key}`);\n node.dependencies.forEach((edge) => visit(edge.key));\n };\n collectExpressionDependencies(expression).forEach((ref) =>\n visit(\n ref.kind === \"answer\"\n ? stateNodeKey(\"answer\", ref.slotId)\n : stateNodeKey(\"disabled\", ref.targetRef.ownerId),\n ),\n );\n return result;\n }\n}\n\nexport type EvaluatedSurveyState = ReturnType<SurveyStateGraph[\"evaluate\"]>;\n\n/** The same mechanical permissions power controls, batch writes, and validation eligibility. */\nexport function canWriteSelection(\n binding: SlotBinding,\n before: ResponseValue | undefined,\n after: ResponseValue | undefined,\n snapshot: EvaluatedSurveyState,\n): boolean {\n if (\n !snapshot.visible(binding.controlId) ||\n snapshot.disabled(binding.controlId) ||\n binding.visibilityIds?.some((id) => !snapshot.visible(id) || snapshot.disabled(id))\n )\n return false;\n const selection = binding.selection;\n if (!selection) return true;\n const optionEnabled = (id: string) =>\n selection.options.includes(id) && snapshot.visible(id) && !snapshot.disabled(id);\n if (!selection.multiple) {\n if (after?.type === \"reference\")\n return (\n after.value === (before?.type === \"reference\" ? before.value : undefined) ||\n optionEnabled(after.value)\n );\n return (\n after === undefined &&\n selection.allowClear !== false &&\n (before?.type !== \"reference\" || optionEnabled(before.value))\n );\n }\n if (after !== undefined && after.type !== \"reference[]\") return false;\n const oldValues = before?.type === \"reference[]\" ? before.value : [];\n const values = after?.type === \"reference[]\" ? after.value : [];\n const activeCount = values.filter((id) => snapshot.visible(id)).length;\n const previousActiveCount = oldValues.filter((id) => snapshot.visible(id)).length;\n if (\n selection.maxSelection != null &&\n activeCount > selection.maxSelection &&\n activeCount >= previousActiveCount\n )\n return false;\n return [\n ...oldValues.filter((id) => !values.includes(id)),\n ...values.filter((id) => !oldValues.includes(id)),\n ].every(optionEnabled);\n}\n\nexport function hasPermittedChange(binding: SlotBinding, snapshot: EvaluatedSurveyState): boolean {\n if (\n !snapshot.visible(binding.controlId) ||\n snapshot.disabled(binding.controlId) ||\n binding.visibilityIds?.some((id) => !snapshot.visible(id) || snapshot.disabled(id))\n )\n return false;\n if (!binding.selection) return true;\n const current = snapshot.stored(binding.slotId);\n const selection = binding.selection;\n if (!selection.multiple) {\n if (current !== undefined && canWriteSelection(binding, current, undefined, snapshot))\n return true;\n return selection.options.some(\n (id) =>\n (current?.type !== \"reference\" || current.value !== id) &&\n canWriteSelection(binding, current, { type: \"reference\", value: id }, snapshot),\n );\n }\n const values = current?.type === \"reference[]\" ? current.value : [];\n return selection.options.some((id) =>\n canWriteSelection(\n binding,\n current,\n {\n type: \"reference[]\",\n value: values.includes(id) ? values.filter((value) => value !== id) : [...values, id],\n },\n snapshot,\n ),\n );\n}\n","import { stringRecord } from \"../../schema/string-record\";\nimport { z } from \"zod\";\n\nexport interface ItemResponseMeta {\n position: number;\n}\n\nexport const SurveyEventTypes = {\n openSurvey: \"openSurvey\",\n pageChanged: \"pageChanged\",\n responseChanged: \"responseChanged\",\n languageChanged: \"languageChanged\",\n} as const;\n\nexport type SurveyEventTypes = (typeof SurveyEventTypes)[keyof typeof SurveyEventTypes];\n\nexport interface SurveyEventBase<TEventType extends SurveyEventTypes = SurveyEventTypes> {\n type: TEventType;\n /** Unix seconds, matching the submitted response timestamp. */\n timestamp: number;\n}\n\nexport interface OpenSurveyEvent extends SurveyEventBase<typeof SurveyEventTypes.openSurvey> {\n value: string; // locale code\n}\n\nexport interface PageChangedEvent extends SurveyEventBase<typeof SurveyEventTypes.pageChanged> {\n value: number;\n}\n\nexport interface ResponseChangedEvent extends SurveyEventBase<\n typeof SurveyEventTypes.responseChanged\n> {\n slotId: string;\n operation: \"set\" | \"clear\";\n}\n\nexport interface LanguageChangedEvent extends SurveyEventBase<\n typeof SurveyEventTypes.languageChanged\n> {\n value: string;\n}\n\nexport type SurveyEvent =\n | OpenSurveyEvent\n | PageChangedEvent\n | ResponseChangedEvent\n | LanguageChangedEvent;\n\nexport const surveyEventSchema = z.discriminatedUnion(\"type\", [\n z.strictObject({\n type: z.literal(\"openSurvey\"),\n timestamp: z.number().finite(),\n value: z.string(),\n }),\n z.strictObject({\n type: z.literal(\"pageChanged\"),\n timestamp: z.number().finite(),\n value: z.number().int().nonnegative(),\n }),\n z.strictObject({\n type: z.literal(\"languageChanged\"),\n timestamp: z.number().finite(),\n value: z.string(),\n }),\n z.strictObject({\n type: z.literal(\"responseChanged\"),\n timestamp: z.number().finite(),\n slotId: z.string().min(1),\n operation: z.enum([\"set\", \"clear\"]),\n }),\n]);\nexport const itemResponseMetadataSchema = stringRecord(\n z.string().min(1),\n z.strictObject({ position: z.number().int().nonnegative() }),\n);\n","import { stringRecord } from \"../../schema/string-record\";\nimport { z } from \"zod\";\nimport { responseValueSchema } from \"./value-schema\";\nimport {\n surveyEventSchema,\n itemResponseMetadataSchema,\n type ItemResponseMeta,\n type SurveyEvent,\n} from \"./response-meta\";\nimport { type ResponseValue } from \"./value-types\";\nimport { calendarDaySchema, type CalendarDate } from \"../../calendar-date\";\n\nexport const SURVEY_RESPONSE_SCHEMA_VERSION = 2;\nexport interface ResponseEvaluationContext {\n locale: string;\n /** The day expressions used as the current date while the participant answered. */\n currentDate?: CalendarDate;\n participantFlags?: Record<string, string>;\n}\n\nexport type SurveyResponseContext = Record<string, ResponseValue>;\n\nexport const surveyResponseSchema = z.strictObject({\n schemaVersion: z.literal(SURVEY_RESPONSE_SCHEMA_VERSION),\n responseId: z.string().min(1),\n /** The exact definition the answers were given against; slot and option IDs are only meaningful with it. */\n definitionId: z.string().min(1),\n participantId: z.string().optional(),\n submittedAt: z.number().finite().optional(),\n answers: stringRecord(z.string().min(1), responseValueSchema),\n itemMetadata: itemResponseMetadataSchema.optional(),\n events: z.array(surveyEventSchema),\n /** Host-provided values stored and exported with the response, e.g. a tracking ID. */\n customValues: stringRecord(z.string().min(1), responseValueSchema).optional(),\n evaluationContext: z\n .strictObject({\n locale: z.string().min(1),\n currentDate: calendarDaySchema.optional(),\n participantFlags: stringRecord(z.string(), z.string()).optional(),\n })\n .optional(),\n /** Reproduces item and option shuffles. */\n randomization: z.strictObject({ seed: z.string().min(1) }).optional(),\n});\n\n/** Publication and schema association belong to the host, never to an answer address. */\nexport class SurveyResponse {\n responseId: string;\n definitionId: string;\n participantId?: string;\n submittedAt?: number;\n answers: Record<string, ResponseValue> = Object.create(null);\n itemMetadata: Record<string, ItemResponseMeta> = Object.create(null);\n events: SurveyEvent[] = [];\n customValues?: SurveyResponseContext;\n evaluationContext?: ResponseEvaluationContext;\n randomization?: { seed: string };\n\n constructor(responseId: string, definitionId: string) {\n this.responseId = responseId;\n this.definitionId = definitionId;\n }\n\n serialize(): JsonSurveyResponse {\n return structuredClone({\n schemaVersion: SURVEY_RESPONSE_SCHEMA_VERSION,\n responseId: this.responseId,\n definitionId: this.definitionId,\n participantId: this.participantId,\n submittedAt: this.submittedAt,\n answers: this.answers,\n itemMetadata: this.itemMetadata,\n events: this.events,\n customValues: this.customValues,\n evaluationContext: this.evaluationContext,\n randomization: this.randomization,\n });\n }\n\n static deserialize(input: unknown): SurveyResponse {\n const json = surveyResponseSchema.parse(input);\n const response = new SurveyResponse(json.responseId, json.definitionId);\n response.answers = json.answers;\n response.participantId = json.participantId;\n response.submittedAt = json.submittedAt;\n response.itemMetadata = json.itemMetadata ?? {};\n response.events = json.events;\n response.customValues = json.customValues;\n response.evaluationContext = json.evaluationContext;\n response.randomization = json.randomization;\n return response;\n }\n}\n\nexport type JsonSurveyResponse = z.infer<typeof surveyResponseSchema>;\n","import type { ResponseValue, ValueType } from \"../survey/responses/value-types\";\nimport type { Survey } from \"../survey/composition/document\";\n\n/** Meta column keys in fixed order (common attributes first). */\nexport const META_COLUMN_ORDER = [\n \"submittedAt\",\n \"participantId\",\n \"responseId\",\n \"sourceId\",\n] as const;\n\nexport type MetaColumnKey = (typeof META_COLUMN_ORDER)[number];\n\n/** Built-in transform modes for slot export. */\nexport const SlotTransformMode = {\n default: \"default\",\n mask: \"mask\",\n dateFormat: \"dateFormat\",\n} as const;\n\nexport type SlotTransformMode = (typeof SlotTransformMode)[keyof typeof SlotTransformMode];\n\n/** Slot identifier for profile overrides. */\nexport interface SlotRef {\n slotId: string;\n}\n\n/** Configuration for dateFormat transform. Uses date-fns format pattern. */\nexport interface DateFormatConfig {\n pattern: string;\n}\n\n/** Slot-level override in exporter profile. */\nexport interface SlotTransformConfig {\n include?: boolean;\n categorical?: \"codes\" | \"labels\" | \"ids\";\n multiple?: \"json\" | \"delimited\" | \"indicators\";\n delimiter?: string;\n locale?: string;\n optionCodes?: Record<string, string>;\n optionLabels?: Record<string, string>;\n booleanValues?: { true: string; false: string };\n precision?: number;\n durationUnit?: import(\"../survey/responses/value-types\").DurationUnit;\n /** Built-in mode or custom formatter key. */\n mode: SlotTransformMode | string;\n /** For dateFormat: date-fns format pattern (e.g. 'yyyy-MM-dd'). */\n dateFormat?: DateFormatConfig;\n /** For mask: replacement string (default '***'). */\n maskText?: string;\n}\n\nexport const EXPORTER_PROFILE_SCHEMA_VERSION = 1;\n\n/** Versioned export settings, associated explicitly with a supplied schema. */\nexport interface ExporterProfile {\n schemaVersion: typeof EXPORTER_PROFILE_SCHEMA_VERSION;\n /** Slot-level overrides. Key: exact opaque slot ID. Profile overrides always win over defaults. */\n slotOverrides?: Record<string, SlotTransformConfig>;\n /** Header overrides keyed by stable column id. */\n columnHeaders?: Record<string, string>;\n /** Overrides for context keys. Key = context key name. */\n contextOverrides?: Record<string, SlotTransformConfig>;\n /** Ordered list of response column ids. Columns in this list appear in this order; others follow alphabetically. */\n responseColumnOrder?: string[];\n /** Ordered list of context column keys. If omitted, context columns are alphabetical. */\n contextColumnOrder?: string[];\n}\n\n/** The host supplies the exact definition used to collect these submissions. */\nexport interface ExportBatch {\n schema: Survey;\n responses: import(\"../survey/responses/survey-response\").SurveyResponse[];\n profile?: ExporterProfile;\n sourceId?: string;\n}\n\nexport interface CombinedExportOptions {\n profile?: ExporterProfile;\n codingPolicy?: \"original\" | \"harmonized\";\n}\n\n/** Source of an export column. */\nexport const ExportColumnSource = {\n meta: \"meta\",\n context: \"context\",\n response: \"response\",\n} as const;\ntype ExportColumnSource = (typeof ExportColumnSource)[keyof typeof ExportColumnSource];\n\n/** Single export column. */\nexport interface ExportColumn {\n /** Stable internal identifier used for ordering/deduplication. */\n id: string;\n /** Exported column header written to CSV. */\n header: string;\n source: ExportColumnSource;\n /** For meta: the meta field name. */\n metaField?: MetaColumnKey;\n /** For context: the context key. */\n contextKey?: string;\n /** For response: item/slot ids and value type. */\n itemId?: string;\n slotId?: string;\n valueType?: ValueType;\n optionId?: string;\n}\n\n/** Single export row: key -> string value. */\nexport type ExportRow = Record<string, string>;\n\n/** CSV export options. */\nexport interface CsvExportOptions {\n /** Cell separator (default ','). */\n separator?: string;\n /** Line ending (default '\\n'). */\n lineEnding?: string;\n /** Include header row (default true). */\n includeHeader?: boolean;\n}\n\n/** Parameters for single-slot export (unit-testable). */\nexport interface ExportSingleSlotParams {\n /** Optional categorical codes for reference values. Missing or blank mappings are errors. */\n referenceValueKeys?: Record<string, string>;\n value: ResponseValue | undefined;\n valueType: ValueType;\n /** Resolved formatter config (default or profile override). */\n transformConfig: SlotTransformConfig;\n}\n","/** One opaque codec shared by export projections, profiles and codebooks. */\nexport type ExportColumnIdentity =\n | readonly [\"response\", string, \"value\"]\n | readonly [\"response\", string, \"option\", string]\n | readonly [\"meta\", string]\n | readonly [\"context\", string];\n\nexport function encodeExportColumnId(identity: ExportColumnIdentity): string {\n return JSON.stringify(identity);\n}\n\nexport function decodeExportColumnId(value: string): ExportColumnIdentity {\n const tuple: unknown = JSON.parse(value);\n if (\n !Array.isArray(tuple) ||\n tuple.some((part) => typeof part !== \"string\") ||\n !(\n (tuple.length === 2 && (tuple[0] === \"meta\" || tuple[0] === \"context\")) ||\n (tuple[0] === \"response\" &&\n ((tuple.length === 3 && tuple[2] === \"value\") ||\n (tuple.length === 4 && tuple[2] === \"option\")))\n )\n )\n throw new Error(`Invalid export column ID: ${value}`);\n if (JSON.stringify(tuple) !== value)\n throw new Error(\"Export column IDs must use the canonical JSON tuple encoding\");\n return tuple as unknown as ExportColumnIdentity;\n}\n","import { formatCalendarDate } from \"../calendar-date\";\nimport { type ResponseValue, ValueType, NumberPrecision } from \"../survey/responses/value-types\";\nimport { SlotTransformMode, type ExportSingleSlotParams, type SlotTransformConfig } from \"./types\";\n\n/** Default transform config when no profile override. */\nexport const DEFAULT_TRANSFORM: SlotTransformConfig = {\n mode: SlotTransformMode.default,\n};\n\n/**\n * Export a single response slot to a string. Pure function for unit testing.\n * Uses default formatting by ValueType unless overridden by transformConfig.\n */\nexport function exportSingleResponseSlot(params: ExportSingleSlotParams): string {\n const { value, valueType, transformConfig } = params;\n\n if (value === undefined || value === null) {\n return \"\";\n }\n\n const mode = transformConfig.mode;\n\n if (mode === SlotTransformMode.mask) {\n return maskValue(value, transformConfig.maskText ?? \"***\");\n }\n\n if (\n mode === SlotTransformMode.dateFormat &&\n (valueType === ValueType.date || valueType === ValueType.dateArray)\n ) {\n return formatDateValue(value, transformConfig.dateFormat?.pattern ?? \"yyyy-MM-dd\");\n }\n\n if (value.type === ValueType.reference || value.type === ValueType.referenceArray) {\n const keys =\n transformConfig.categorical === \"labels\"\n ? transformConfig.optionLabels\n : (transformConfig.optionCodes ?? params.referenceValueKeys);\n const exportReference = (id: string) => {\n if (transformConfig.categorical === \"ids\") return id;\n const key = keys && Object.hasOwn(keys, id) ? keys[id] : undefined;\n if (typeof key !== \"string\" || !key.trim())\n throw new Error(`Missing categorical export mapping for option \"${id}\"`);\n return key.trim();\n };\n return value.type === ValueType.reference\n ? exportReference(value.value)\n : JSON.stringify(value.value.map(exportReference));\n }\n return formatDefault(value);\n}\n\nexport const BooleanExportValues = {\n TRUE: \"TRUE\",\n FALSE: \"FALSE\",\n} as const;\nexport type BooleanExportValues = (typeof BooleanExportValues)[keyof typeof BooleanExportValues];\n\nfunction formatDefault(value: ResponseValue): string {\n switch (value.type) {\n case ValueType.string:\n return String(value.value);\n case ValueType.reference:\n return String(value.value);\n case ValueType.boolean:\n return value.value ? BooleanExportValues.TRUE : BooleanExportValues.FALSE;\n case ValueType.number: {\n const p = (value as { precision?: NumberPrecision }).precision;\n return p === NumberPrecision.int ? String(Math.floor(value.value)) : String(value.value);\n }\n case ValueType.date:\n return value.value;\n case ValueType.duration: {\n const d = value as { value: number; unit: string; precision?: NumberPrecision };\n const num = d.precision === NumberPrecision.int ? Math.floor(d.value) : d.value;\n return `${num} ${d.unit}`;\n }\n case ValueType.stringArray:\n return (value as { value: string[] }).value.join(\"; \");\n case ValueType.referenceArray:\n return (value as { value: string[] }).value.join(\"; \");\n case ValueType.numberArray: {\n const arr = (value as { value: number[]; precision?: NumberPrecision }).value;\n const prec = (value as { precision?: NumberPrecision }).precision;\n const fmt = (n: number) => (prec === NumberPrecision.int ? Math.floor(n) : n);\n return arr.map(fmt).join(\"; \");\n }\n case ValueType.dateArray: {\n return value.value.join(\"; \");\n }\n case ValueType.durationArray: {\n const d = value as { value: number[]; unit: string; precision?: NumberPrecision };\n const prec = d.precision === NumberPrecision.int;\n const fmt = (n: number) => (prec ? Math.floor(n) : n);\n return d.value.map((v) => `${fmt(v)} ${d.unit}`).join(\"; \");\n }\n default:\n return String((value as { value?: unknown }).value ?? \"\");\n }\n}\n\nfunction formatDateValue(value: ResponseValue, pattern: string): string {\n if (value.type === ValueType.date) {\n return formatCalendarDate(value.value, pattern);\n }\n if (value.type === ValueType.dateArray) {\n return value.value.map((date) => formatCalendarDate(date, pattern)).join(\"; \");\n }\n return formatDefault(value);\n}\n\nfunction maskValue(value: ResponseValue, maskText: string): string {\n const str = valueToString(value);\n return str ? maskText : \"\";\n}\n\nfunction valueToString(value: ResponseValue): string {\n switch (value.type) {\n case ValueType.string:\n case ValueType.reference:\n return String(value.value);\n case ValueType.stringArray:\n case ValueType.referenceArray:\n return (value as { value: string[] }).value.join(\" \");\n default:\n return String((value as { value?: unknown }).value ?? \"\");\n }\n}\n","import { ownValue } from \"../schema/string-record\";\nimport { readLocalizationContent } from \"../survey/utils/localization\";\nimport { getContentPlainText } from \"../survey/utils/content\";\nimport type { Survey } from \"../survey/composition/document\";\nimport { formatCalendarDate } from \"../calendar-date\";\nimport type { ReadonlyResponseSlotDefinition, ResponseValue } from \"../survey/responses\";\nimport { DurationUnits, ValueType } from \"../survey/responses/value-types\";\nimport { encodeExportColumnId } from \"./column-id\";\nimport { exportSingleResponseSlot } from \"./slot-formatter\";\nimport type { ExportColumn, SlotTransformConfig } from \"./types\";\n\nexport function optionIds(slot: ReadonlyResponseSlotDefinition): string[] {\n return [\n ...new Set(\n (slot.allowedValues ?? []).flatMap((value) =>\n value.type === ValueType.reference\n ? [value.value]\n : value.type === ValueType.referenceArray\n ? value.value\n : [],\n ),\n ),\n ];\n}\nexport function optionMapping(\n slot: ReadonlyResponseSlotDefinition,\n config: SlotTransformConfig,\n): Record<string, string> {\n const ids = optionIds(slot);\n const encoding = config.categorical ?? \"codes\";\n const mapping =\n encoding === \"ids\"\n ? Object.fromEntries(ids.map((id) => [id, id]))\n : encoding === \"labels\"\n ? (config.optionLabels ?? ownValue(slot.referenceValueLabels, config.locale ?? \"en\") ?? {})\n : (config.optionCodes ?? slot.referenceValueKeys ?? {});\n const used = new Set<string>();\n for (const id of ids) {\n if (typeof mapping[id] !== \"string\" || !mapping[id].trim())\n throw new Error(\n `Variable \"${slot.variableName}\" has no ${encoding} mapping for option \"${id}\"`,\n );\n if (used.has(mapping[id]))\n throw new Error(\n `Variable \"${slot.variableName}\" has ambiguous ${encoding} mapping \"${mapping[id]}\"`,\n );\n used.add(mapping[id]);\n }\n for (const id of [\n ...Object.keys(config.optionCodes ?? {}),\n ...Object.keys(config.optionLabels ?? {}),\n ])\n if (!ids.includes(id))\n throw new Error(`Mapping for \"${slot.variableName}\" contains unknown option \"${id}\"`);\n return mapping;\n}\n\n/** Compile every declared role before applying inclusion settings. */\nexport function projectSlot(\n slot: ReadonlyResponseSlotDefinition,\n config: SlotTransformConfig,\n allRoles = false,\n): ExportColumn[] {\n if (![\"default\", \"mask\", \"dateFormat\"].includes(config.mode))\n throw new Error(`Unsupported export transform \"${config.mode}\"`);\n if (config.categorical && ![\"codes\", \"labels\", \"ids\"].includes(config.categorical))\n throw new Error(\"Unsupported categorical encoding\");\n if (config.multiple && ![\"json\", \"delimited\", \"indicators\"].includes(config.multiple))\n throw new Error(\"Unsupported multiple-selection encoding\");\n if (config.mode === \"dateFormat\" && slot.valueType !== \"date\" && slot.valueType !== \"date[]\")\n throw new Error(\"Date formatting requires a date variable\");\n if (config.mode === \"dateFormat\") {\n const pattern = config.dateFormat?.pattern ?? \"yyyy-MM-dd\";\n if (!pattern.trim()) throw new Error(\"Date export pattern cannot be empty\");\n formatCalendarDate(\"2026-01-15\", pattern);\n }\n if (\n config.durationUnit &&\n (!Object.values(DurationUnits).includes(config.durationUnit) ||\n !slot.valueType.startsWith(\"duration\"))\n )\n throw new Error(\"Duration units require a duration variable and a supported unit\");\n if (\n config.booleanValues &&\n (!config.booleanValues.true ||\n !config.booleanValues.false ||\n config.booleanValues.true === config.booleanValues.false)\n )\n throw new Error(\"Boolean export values must be distinct and nonempty\");\n const categorical =\n slot.valueType === ValueType.reference || slot.valueType === ValueType.referenceArray;\n if (config.multiple && slot.valueType !== ValueType.referenceArray)\n throw new Error(\n `Multiple-selection encoding requires a reference[] variable: ${slot.variableName}`,\n );\n if ((config.categorical || config.optionCodes || config.optionLabels) && !categorical)\n throw new Error(`Categorical encoding requires a categorical variable: ${slot.variableName}`);\n if (config.booleanValues && slot.valueType !== ValueType.boolean)\n throw new Error(`Boolean encoding requires a boolean variable: ${slot.variableName}`);\n if (\n config.precision !== undefined &&\n ![\"number\", \"number[]\", \"duration\", \"duration[]\"].includes(slot.valueType)\n )\n throw new Error(\"Precision requires a numeric or duration variable\");\n if (\n config.precision !== undefined &&\n (!Number.isInteger(config.precision) || config.precision < 0 || config.precision > 15)\n )\n throw new Error(\"Precision must be an integer between 0 and 15\");\n if (\n config.multiple === \"delimited\" &&\n (!config.delimiter || config.delimiter.includes('\"') || /[\\r\\n]/.test(config.delimiter))\n )\n throw new Error(\n \"Delimited selection export requires an explicit delimiter without quotes or line breaks\",\n );\n if (!allRoles && (config.include === false || (slot.computed && config.include !== true)))\n return [];\n const mapping = categorical && !allRoles ? optionMapping(slot, config) : {};\n const base = {\n source: \"response\" as const,\n itemId: slot.itemId,\n slotId: slot.slotId,\n valueType: slot.valueType,\n };\n const scalar = {\n ...base,\n id: encodeExportColumnId([\"response\", slot.slotId, \"value\"]),\n header: slot.variableName,\n };\n const indicators = () =>\n optionIds(slot).map((optionId) => ({\n ...base,\n id: encodeExportColumnId([\"response\", slot.slotId, \"option\", optionId]),\n header: `${slot.variableName}_${mapping[optionId] ?? optionId}`,\n optionId,\n }));\n return allRoles\n ? [scalar, ...(slot.valueType === ValueType.referenceArray ? indicators() : [])]\n : config.multiple === \"indicators\"\n ? indicators()\n : [scalar];\n}\n\nexport function formatProjectedValue(\n slot: ReadonlyResponseSlotDefinition,\n column: ExportColumn,\n value: ResponseValue | undefined,\n config: SlotTransformConfig,\n): string {\n if (value === undefined) return \"\";\n if (config.mode === \"mask\") return config.maskText ?? \"***\";\n if (value.type === ValueType.reference || value.type === ValueType.referenceArray) {\n const mapping = optionMapping(slot, config);\n const values = value.type === ValueType.reference ? [value.value] : value.value;\n if (values.some((id) => !Object.hasOwn(mapping, id)))\n throw new Error(`Unmapped option in \"${slot.variableName}\"`);\n if (column.optionId) return values.includes(column.optionId) ? \"1\" : \"0\";\n const encoded = values.map((id) => mapping[id]);\n if (value.type === ValueType.reference) return encoded[0];\n if (config.multiple === \"delimited\")\n return encoded.map((entry) => `\"${entry.replaceAll('\"', '\"\"')}\"`).join(config.delimiter!);\n return JSON.stringify(encoded);\n }\n if (value.type === ValueType.boolean) {\n const values = config.booleanValues ?? { true: \"TRUE\", false: \"FALSE\" };\n if (!values.true || !values.false || values.true === values.false)\n throw new Error(\"Boolean export values must be distinct and nonempty\");\n return value.value ? values.true : values.false;\n }\n if (value.type === ValueType.duration || value.type === ValueType.durationArray) {\n const unit = config.durationUnit ?? \"seconds\";\n const seconds: Record<string, number> = {\n seconds: 1,\n minutes: 60,\n hours: 3600,\n days: 86400,\n weeks: 604800,\n };\n if (unit !== value.unit && (!seconds[unit] || !seconds[value.unit]))\n throw new Error(\"Calendar months and years cannot be converted to fixed durations\");\n const convert = (number: number) => {\n const n = number * (unit === value.unit ? 1 : seconds[value.unit] / seconds[unit]);\n return config.precision === undefined ? String(n) : n.toFixed(config.precision);\n };\n return Array.isArray(value.value)\n ? JSON.stringify(value.value.map(convert))\n : convert(value.value);\n }\n if (value.type === ValueType.number && config.precision !== undefined)\n return value.value.toFixed(config.precision);\n if (value.type === ValueType.numberArray && config.precision !== undefined)\n return `[${value.value.map((number) => number.toFixed(config.precision)).join(\",\")}]`;\n if (Array.isArray(value.value) && config.mode !== \"dateFormat\")\n return JSON.stringify(value.value);\n return exportSingleResponseSlot({ value, valueType: slot.valueType, transformConfig: config });\n}\n\ntype ProjectionDiagnostic =\n | { code: \"duplicate-header\"; header: string; message: string }\n | { code: \"invalid-projection\"; slotId: string; message: string };\n\n/** Internal typed diagnostics let authoring distinguish conflicts from unfinished mappings. */\nexport function getDefaultProjectionDiagnostics(survey: Survey): ProjectionDiagnostic[] {\n const issues: ProjectionDiagnostic[] = [];\n const headers = new Set<string>([\"submittedAt\", \"participantId\", \"responseId\", \"sourceId\"]);\n const definitions = survey.slots.definitions;\n const slots = definitions.some((slot) => slot.exportSettings?.categorical === \"labels\")\n ? localizeExportSlots(survey, definitions)\n : definitions;\n for (const slot of slots) {\n try {\n for (const column of projectSlot(slot, { mode: \"default\", ...slot.exportSettings })) {\n if (headers.has(column.header))\n issues.push({\n code: \"duplicate-header\",\n header: column.header,\n message: `Duplicate export column header '${column.header}'`,\n });\n headers.add(column.header);\n }\n } catch (error) {\n issues.push({\n code: \"invalid-projection\",\n slotId: slot.slotId,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return issues;\n}\n\n/** Collect draft diagnostics without stopping at the first unfinished variable. */\nexport function getDefaultProjectionIssues(survey: Survey): string[] {\n return getDefaultProjectionDiagnostics(survey).map((issue) => issue.message);\n}\n\n/** Fully resolved output semantics, shared by compatibility checks and codebooks. */\nexport function resolvedSlotEncoding(\n slot: ReadonlyResponseSlotDefinition,\n config: SlotTransformConfig,\n): SlotTransformConfig {\n const encoding: SlotTransformConfig = {\n mode: config.mode,\n include: config.include ?? !slot.computed,\n };\n if (config.mode === \"mask\") return { ...encoding, maskText: config.maskText ?? \"***\" };\n if (config.mode === \"dateFormat\")\n encoding.dateFormat = { pattern: config.dateFormat?.pattern ?? \"yyyy-MM-dd\" };\n if (slot.valueType === \"reference\" || slot.valueType === \"reference[]\") {\n encoding.categorical = config.categorical ?? \"codes\";\n if (encoding.categorical === \"labels\") {\n encoding.locale = config.locale ?? \"en\";\n encoding.optionLabels = optionMapping(slot, config);\n } else if (encoding.categorical === \"codes\") encoding.optionCodes = optionMapping(slot, config);\n if (slot.valueType === \"reference[]\") {\n encoding.multiple = config.multiple ?? \"json\";\n if (encoding.multiple === \"delimited\") encoding.delimiter = config.delimiter;\n }\n }\n if (slot.valueType === \"boolean\")\n encoding.booleanValues = config.booleanValues ?? { true: \"TRUE\", false: \"FALSE\" };\n if (slot.valueType.startsWith(\"duration\"))\n encoding.durationUnit = config.durationUnit ?? \"seconds\";\n if (config.precision !== undefined) encoding.precision = config.precision;\n return structuredClone(encoding);\n}\n\n/** Localization is projected from this exact revision, never cached in structural slot identities. */\nexport function localizedExportSlots(survey: Survey): ReadonlyResponseSlotDefinition[] {\n return localizeExportSlots(survey, survey.slots.definitions);\n}\n\nfunction localizeExportSlots(\n survey: Survey,\n definitions: readonly ReadonlyResponseSlotDefinition[],\n): ReadonlyResponseSlotDefinition[] {\n const fallbackLocale = survey.locales[0];\n return definitions.map((slot) => ({\n ...slot,\n referenceValueLabels: Object.fromEntries(\n [...new Set([...survey.locales, ...Object.keys(slot.referenceValueLabels ?? {})])].map(\n (locale) => [\n locale,\n Object.fromEntries(\n optionIds(slot).flatMap((id) => {\n const authored = survey.owners.get(id)?.roles.some((role) => role.role === \"label\");\n const label = authored\n ? getContentPlainText(\n readLocalizationContent(\n survey,\n { scope: \"content\", ownerId: id, role: \"label\" },\n locale,\n ) ??\n // Export falls back only for absent wording; authored blanks remain invalid.\n (fallbackLocale\n ? readLocalizationContent(\n survey,\n { scope: \"content\", ownerId: id, role: \"label\" },\n fallbackLocale,\n )\n : undefined),\n ).trim()\n : ownValue(ownValue(slot.referenceValueLabels, locale), id);\n return label ? [[id, label]] : [];\n }),\n ),\n ],\n ),\n ),\n }));\n}\n"],"mappings":"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"}
|