@superbuilders/incept-renderer 0.1.3 → 0.1.4
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/dist/actions/index.js +1 -4
- package/dist/actions/index.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
package/dist/actions/index.js
CHANGED
|
@@ -4,10 +4,7 @@ import * as logger2 from '@superbuilders/slog';
|
|
|
4
4
|
import { XMLParser } from 'fast-xml-parser';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
7
|
-
//
|
|
8
|
-
throw new Error(
|
|
9
|
-
"This module cannot be imported from a Client Component module. It should only be used from a Server Component."
|
|
10
|
-
);
|
|
7
|
+
// src/actions/internal/display.ts
|
|
11
8
|
|
|
12
9
|
// src/html/sanitize.ts
|
|
13
10
|
var DEFAULT_CONFIG = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../node_modules/server-only/index.js","../../src/html/sanitize.ts","../../src/html/serialize.ts","../../src/schema.ts","../../src/parser.ts","../../src/actions/internal/display.ts","../../src/actions/build.ts","../../src/evaluator.ts","../../src/actions/internal/validate.ts","../../src/actions/validate.ts"],"names":["logger","errors2","logger3","errors3","correctSet"],"mappings":"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","file":"index.js","sourcesContent":["throw new Error(\n \"This module cannot be imported from a Client Component module. \" +\n \"It should only be used from a Server Component.\"\n);\n","/**\n * Configuration for HTML sanitization.\n * Defines allowed tags and attributes for safe rendering.\n */\ninterface SanitizeConfig {\n\tallowedTags: Set<string>\n\tallowedAttributes: Record<string, Set<string>>\n\tallowDataAttributes: boolean\n\tallowMathML: boolean\n}\n\n/**\n * Default configuration for QTI content sanitization.\n * Allows common HTML tags and MathML for mathematical expressions.\n */\nconst DEFAULT_CONFIG: SanitizeConfig = {\n\t// HTML content tags\n\tallowedTags: new Set([\n\t\t// Text content\n\t\t\"p\",\n\t\t\"span\",\n\t\t\"div\",\n\t\t\"br\",\n\t\t\"hr\",\n\t\t// Formatting\n\t\t\"b\",\n\t\t\"i\",\n\t\t\"u\",\n\t\t\"strong\",\n\t\t\"em\",\n\t\t\"mark\",\n\t\t\"small\",\n\t\t\"sub\",\n\t\t\"sup\",\n\t\t\"code\",\n\t\t\"pre\",\n\t\t\"kbd\",\n\t\t// Lists\n\t\t\"ul\",\n\t\t\"ol\",\n\t\t\"li\",\n\t\t\"dl\",\n\t\t\"dt\",\n\t\t\"dd\",\n\t\t// Tables\n\t\t\"table\",\n\t\t\"thead\",\n\t\t\"tbody\",\n\t\t\"tfoot\",\n\t\t\"tr\",\n\t\t\"th\",\n\t\t\"td\",\n\t\t\"caption\",\n\t\t\"colgroup\",\n\t\t\"col\",\n\t\t// Media\n\t\t\"img\",\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t// Semantic\n\t\t\"article\",\n\t\t\"section\",\n\t\t\"nav\",\n\t\t\"aside\",\n\t\t\"header\",\n\t\t\"footer\",\n\t\t\"main\",\n\t\t\"figure\",\n\t\t\"figcaption\",\n\t\t\"blockquote\",\n\t\t\"cite\",\n\t\t// Links\n\t\t\"a\",\n\t\t// Forms (for future interactive elements)\n\t\t\"label\",\n\t\t\"button\"\n\t]),\n\n\tallowedAttributes: {\n\t\t// Global attributes\n\t\t\"*\": new Set([\"class\", \"id\", \"lang\", \"dir\", \"title\", \"style\"]),\n\t\t// Specific attributes\n\t\timg: new Set([\"src\", \"alt\", \"width\", \"height\", \"style\"]),\n\t\ta: new Set([\"href\", \"target\", \"rel\"]),\n\t\taudio: new Set([\"src\", \"controls\", \"loop\", \"muted\"]),\n\t\tvideo: new Set([\"src\", \"controls\", \"loop\", \"muted\", \"width\", \"height\", \"poster\"]),\n\t\tsource: new Set([\"src\", \"type\"]),\n\t\ttrack: new Set([\"src\", \"kind\", \"srclang\", \"label\"])\n\t},\n\n\tallowDataAttributes: false,\n\tallowMathML: true\n}\n\n/**\n * MathML elements that are allowed for mathematical expressions.\n * Based on MathML 3.0 specification.\n */\nconst MATHML_TAGS = new Set([\n\t// Root\n\t\"math\",\n\t// Token elements\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"mtext\",\n\t\"mspace\",\n\t\"ms\",\n\t// Layout\n\t\"mrow\",\n\t\"mfrac\",\n\t\"msqrt\",\n\t\"mroot\",\n\t\"mstyle\",\n\t\"merror\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mfenced\",\n\t\"menclose\",\n\t// Scripts and limits\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"munder\",\n\t\"mover\",\n\t\"munderover\",\n\t\"mmultiscripts\",\n\t\"mprescripts\",\n\t\"none\",\n\t// Tables\n\t\"mtable\",\n\t\"mtr\",\n\t\"mtd\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t// Elementary math\n\t\"mstack\",\n\t\"mlongdiv\",\n\t\"msgroup\",\n\t\"msrow\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msline\",\n\t// Semantic\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\"\n])\n\n/**\n * MathML attributes that are allowed.\n */\nconst _MATHML_ATTRIBUTES = new Set([\n\t// Global MathML attributes\n\t\"id\",\n\t\"class\",\n\t\"style\",\n\t\"href\",\n\t\"mathcolor\",\n\t\"mathbackground\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"dir\",\n\t// Display\n\t\"display\",\n\t\"displaystyle\",\n\t\"scriptlevel\",\n\t// Spacing\n\t\"width\",\n\t\"height\",\n\t\"depth\",\n\t\"lspace\",\n\t\"rspace\",\n\t\"voffset\",\n\t// Fractions\n\t\"linethickness\",\n\t\"numalign\",\n\t\"denomalign\",\n\t\"bevelled\",\n\t// Roots\n\t\"index\",\n\t// Tables\n\t\"align\",\n\t\"rowalign\",\n\t\"columnalign\",\n\t\"groupalign\",\n\t\"alignmentscope\",\n\t\"columnwidth\",\n\t\"rowspacing\",\n\t\"columnspacing\",\n\t\"rowlines\",\n\t\"columnlines\",\n\t\"frame\",\n\t// Fences\n\t\"open\",\n\t\"close\",\n\t\"separators\",\n\t// Operators\n\t\"form\",\n\t\"fence\",\n\t\"separator\",\n\t\"stretchy\",\n\t\"symmetric\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"largeop\",\n\t\"movablelimits\",\n\t\"accent\",\n\t// Semantic\n\t\"encoding\",\n\t\"definitionURL\"\n])\n\n/**\n * Sanitizes HTML content to prevent XSS attacks.\n * Preserves MathML for mathematical expressions.\n */\nexport function sanitizeHtml(html: string, config: Partial<SanitizeConfig> = {}): string {\n\tconst cfg = { ...DEFAULT_CONFIG, ...config }\n\n\t// Basic XSS prevention patterns\n\tconst dangerousPatterns = [\n\t\t/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\t\t/javascript:/gi,\n\t\t/on\\w+\\s*=/gi, // Event handlers\n\t\t/<iframe\\b/gi,\n\t\t/<embed\\b/gi,\n\t\t/<object\\b/gi,\n\t\t/data:text\\/html/gi\n\t]\n\n\tlet sanitized = html\n\tfor (const pattern of dangerousPatterns) {\n\t\tsanitized = sanitized.replace(pattern, \"\")\n\t}\n\n\t// Parse and rebuild with allowed tags/attributes\n\tconst cleaned = cleanHtml(sanitized, cfg)\n\n\treturn cleaned\n}\n\n/**\n * Performs deep cleaning of HTML by parsing and rebuilding with only allowed elements.\n * Note: This is a simplified regex-based implementation for Node.js environments.\n * In production with browser support, consider using DOMPurify.\n */\nfunction cleanHtml(html: string, config: SanitizeConfig): string {\n\t// For Node.js environment, we use a regex-based approach\n\t// This is less robust than DOM-based cleaning but works in all environments\n\n\tlet cleaned = html\n\n\t// Remove all tags that aren't in the allowlist\n\tconst tagPattern = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g\n\tcleaned = cleaned.replace(tagPattern, (match, tagName, _attrs) => {\n\t\tconst tag = tagName.toLowerCase()\n\t\tconst isMathML = tag === \"math\" || cleaned.includes(\"<math\")\n\n\t\tif (isMathML && config.allowMathML && MATHML_TAGS.has(tag)) {\n\t\t\treturn match // Keep MathML tags\n\t\t}\n\t\tif (config.allowedTags.has(tag)) {\n\t\t\t// Clean attributes for allowed tags\n\t\t\treturn cleanAttributesString(match, tag, config)\n\t\t}\n\n\t\treturn \"\" // Remove disallowed tags\n\t})\n\n\treturn cleaned\n}\n\n/**\n * Cleans attributes from an HTML tag string.\n */\nfunction cleanAttributesString(tagString: string, tagName: string, config: SanitizeConfig): string {\n\tconst attrPattern = /\\s+([a-zA-Z][a-zA-Z0-9-:]*)(?:=\"([^\"]*)\"|'([^']*)'|=([^\\s>]+)|(?=\\s|>))/g\n\n\tlet cleanedTag = `<${tagString.startsWith(\"</\") ? \"/\" : \"\"}${tagName}`\n\n\tlet match = attrPattern.exec(tagString)\n\twhile (match !== null) {\n\t\tconst attrName = (match[1] || \"\").toLowerCase()\n\t\tconst attrValue = match[2] || match[3] || match[4] || \"\"\n\n\t\t// Check if attribute is allowed\n\t\tconst globalAttrs = config.allowedAttributes[\"*\"] || new Set()\n\t\tconst tagAttrs = config.allowedAttributes[tagName] || new Set()\n\n\t\tlet isAllowed = globalAttrs.has(attrName) || tagAttrs.has(attrName)\n\n\t\t// For <img>, strip size/style attributes to prevent stretched images\n\t\tif (tagName === \"img\" && (attrName === \"width\" || attrName === \"height\" || attrName === \"style\")) {\n\t\t\tisAllowed = false\n\t\t}\n\n\t\t// Check data attributes\n\t\tif (!isAllowed && config.allowDataAttributes && attrName.startsWith(\"data-\")) {\n\t\t\tisAllowed = true\n\t\t}\n\n\t\t// Check for dangerous values\n\t\tif (isAllowed && !isDangerousAttributeValue(attrName, attrValue)) {\n\t\t\tcleanedTag += ` ${attrName}=\"${attrValue.replace(/\"/g, \""\")}\"`\n\t\t}\n\n\t\tmatch = attrPattern.exec(tagString)\n\t}\n\n\tcleanedTag += \">\"\n\treturn cleanedTag\n}\n\n/**\n * Checks if an attribute value contains potentially dangerous content.\n */\nfunction isDangerousAttributeValue(name: string, value: string): boolean {\n\tconst valueLower = value.toLowerCase().trim()\n\n\t// Check for javascript: protocol\n\tif (name === \"href\" || name === \"src\") {\n\t\tif (valueLower.startsWith(\"javascript:\") || valueLower.startsWith(\"data:text/html\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check for event handlers in values (some old XSS techniques)\n\tif (valueLower.includes(\"javascript:\") || valueLower.includes(\"onerror=\")) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Sanitizes HTML for safe display, with automatic MathML detection.\n */\nexport function sanitizeForDisplay(html: string): string {\n\t// Auto-detect if content has MathML\n\tconst hasMathML = html.toLowerCase().includes(\"<math\")\n\n\treturn sanitizeHtml(html, {\n\t\tallowMathML: hasMathML,\n\t\tallowDataAttributes: true\n\t})\n}\n","import type { NormalizedNode } from \"../parser\"\n\n/**\n * Serializes an array of nodes (useful for contentBlocks).\n */\nexport function serializeNodes(nodes: Array<NormalizedNode | string>): string {\n\treturn nodes\n\t\t.map((node) => {\n\t\t\tif (typeof node === \"string\") {\n\t\t\t\treturn escapeHtml(node)\n\t\t\t}\n\t\t\treturn serializeNode(node)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes the inner content of a node (its children) to an HTML string.\n * Preserves MathML and other XML content verbatim.\n */\nexport function serializeInner(node: NormalizedNode): string {\n\treturn node.children\n\t\t.map((child: NormalizedNode | string) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\treturn serializeNode(child)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes a complete node including its tag and attributes.\n * Critical for preserving MathML structure exactly as authored.\n */\nexport function serializeNode(node: NormalizedNode): string {\n\t// Self-closing tags\n\tconst selfClosing = [\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\"]\n\tconst tagName = stripQtiPrefix(node.tagName)\n\n\t// Preserve MathML elements verbatim without QTI processing\n\tif (tagName === \"math\" || isMathMLElement(tagName)) {\n\t\treturn serializeVerbatim(node)\n\t}\n\n\tconst attrs = serializeAttributes(node.attrs)\n\tconst attrString = attrs ? ` ${attrs}` : \"\"\n\n\tif (selfClosing.includes(tagName) && node.children.length === 0) {\n\t\treturn `<${tagName}${attrString} />`\n\t}\n\n\tconst inner = serializeInner(node)\n\treturn `<${tagName}${attrString}>${inner}</${tagName}>`\n}\n\n/**\n * Detects whether content contains MathML elements.\n * Used to determine appropriate rendering and sanitization strategies.\n */\nexport function detectContentType(html: string): \"mathml\" | \"html\" {\n\t// Quick heuristic: check for common MathML elements\n\tconst mathmlIndicators = [\"<math\", \"<mrow\", \"<msup\", \"<msub\", \"<mfrac\", \"<msqrt\", \"<mi>\", \"<mo>\", \"<mn>\", \"<mtext\"]\n\n\tconst normalized = html.toLowerCase()\n\tfor (const indicator of mathmlIndicators) {\n\t\tif (normalized.includes(indicator)) {\n\t\t\treturn \"mathml\"\n\t\t}\n\t}\n\n\treturn \"html\"\n}\n\n/**\n * Strips QTI namespace prefixes from tag names.\n * Converts \"qti-choice-interaction\" to \"div\" or similar HTML equivalent.\n * Preserves MathML and standard HTML tags unchanged.\n */\nfunction stripQtiPrefix(tagName: string): string {\n\t// Map QTI elements to semantic HTML equivalents\n\tconst qtiToHtml: Record<string, string> = {\n\t\t\"qti-item-body\": \"div\",\n\t\t\"qti-choice-interaction\": \"div\",\n\t\t\"qti-simple-choice\": \"div\",\n\t\t\"qti-feedback-block\": \"div\",\n\t\t\"qti-content-body\": \"div\",\n\t\t\"qti-prompt\": \"div\",\n\t\t\"qti-value\": \"span\",\n\t\t\"qti-variable\": \"span\",\n\t\t\"qti-correct-response\": \"div\"\n\t}\n\n\tif (qtiToHtml[tagName]) {\n\t\treturn qtiToHtml[tagName]\n\t}\n\n\t// Strip \"qti-\" prefix for unknown QTI elements\n\tif (tagName.startsWith(\"qti-\")) {\n\t\treturn tagName.slice(4)\n\t}\n\n\t// Preserve MathML and HTML tags as-is\n\treturn tagName\n}\n\n/**\n * Serializes node attributes to an HTML attribute string.\n * Filters out QTI-specific attributes that shouldn't appear in rendered HTML.\n */\nfunction serializeAttributes(attrs: Record<string, unknown>): string {\n\t// Attributes to exclude from HTML output\n\tconst excludeAttrs = [\n\t\t\"identifier\",\n\t\t\"response-identifier\",\n\t\t\"shuffle\",\n\t\t\"max-choices\",\n\t\t\"min-choices\",\n\t\t\"cardinality\",\n\t\t\"base-type\",\n\t\t\"outcome-identifier\",\n\t\t\"show-hide\",\n\t\t\"time-dependent\",\n\t\t\"adaptive\",\n\t\t\"xml-lang\"\n\t]\n\n\tconst parts: string[] = []\n\n\tfor (const [key, value] of Object.entries(attrs)) {\n\t\tif (excludeAttrs.includes(key)) continue\n\t\tif (value == null) continue\n\n\t\t// Convert kebab-case QTI attrs to camelCase where appropriate\n\t\tconst htmlKey = key === \"xml:lang\" ? \"lang\" : key\n\t\tconst escapedValue = escapeHtml(String(value))\n\t\tparts.push(`${htmlKey}=\"${escapedValue}\"`)\n\t}\n\n\treturn parts.join(\" \")\n}\n\n/**\n * Escapes HTML special characters to prevent XSS.\n * Used for text content, not for preserving markup.\n */\nfunction escapeHtml(text: string): string {\n\tconst escapeMap: Record<string, string> = {\n\t\t\"&\": \"&\",\n\t\t\"<\": \"<\",\n\t\t\">\": \">\",\n\t\t'\"': \""\",\n\t\t\"'\": \"'\"\n\t}\n\n\treturn text.replace(/[&<>\"']/g, (char) => escapeMap[char] || char)\n}\n\n/**\n * Checks if a tag name is a MathML element.\n */\nfunction isMathMLElement(tagName: string): boolean {\n\tconst mathMLTags = [\n\t\t\"mi\",\n\t\t\"mn\",\n\t\t\"mo\",\n\t\t\"mtext\",\n\t\t\"mspace\",\n\t\t\"ms\",\n\t\t\"mrow\",\n\t\t\"mfrac\",\n\t\t\"msqrt\",\n\t\t\"mroot\",\n\t\t\"mstyle\",\n\t\t\"msub\",\n\t\t\"msup\",\n\t\t\"msubsup\",\n\t\t\"munder\",\n\t\t\"mover\",\n\t\t\"munderover\",\n\t\t\"mtable\",\n\t\t\"mtr\",\n\t\t\"mtd\"\n\t]\n\treturn mathMLTags.includes(tagName)\n}\n\n/**\n * Serializes MathML nodes verbatim to preserve exact structure.\n * Does not apply QTI transformations or attribute filtering.\n */\nfunction serializeVerbatim(node: NormalizedNode): string {\n\tconst attrs = Object.entries(node.attrs)\n\t\t.map(([key, value]) => {\n\t\t\tif (value == null) return \"\"\n\t\t\treturn ` ${key}=\"${String(value).replace(/\"/g, \""\")}\"`\n\t\t})\n\t\t.join(\"\")\n\n\tif (node.children.length === 0) {\n\t\treturn `<${node.tagName}${attrs} />`\n\t}\n\n\tconst inner = node.children\n\t\t.map((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\t// Recursively serialize MathML children verbatim\n\t\t\treturn serializeVerbatim(child)\n\t\t})\n\t\t.join(\"\")\n\n\treturn `<${node.tagName}${attrs}>${inner}</${node.tagName}>`\n}\n","import { z } from \"zod\"\n\n// Basic enums derived from the XML\nexport const QtiCardinalitySchema = z.enum([\"single\", \"multiple\", \"ordered\"]) // seen: single, multiple, ordered\nexport const QtiBaseTypeSchema = z.enum([\"identifier\", \"string\", \"float\", \"integer\", \"boolean\", \"directedPair\", \"pair\"]) // seen: identifier, float, directedPair\n\n// SimpleChoice: <qti-simple-choice identifier=\"A\"> ... inner XHTML/MathML ... </qti-simple-choice>\nexport const SimpleChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(), // Allows \"\" for empty or image-only content\n\tinlineFeedbackHtml: z.string().optional() // Optional per-choice feedback (qti-feedback-inline)\n})\nexport type SimpleChoice = z.infer<typeof SimpleChoiceSchema>\n\n// InlineChoice: <qti-inline-choice identifier=\"ID\"> ... inner XHTML/MathML ... </qti-inline-choice>\nexport const InlineChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string()\n})\nexport type InlineChoice = z.infer<typeof InlineChoiceSchema>\n\n// ChoiceInteraction: <qti-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" min-choices=\"1\" max-choices=\"1\"> ...\nexport const ChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(1),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\n\n// Extensible discriminated union for interactions\nexport const ChoiceInteractionSchema = ChoiceInteractionCoreSchema.extend({ type: z.literal(\"choiceInteraction\") })\nexport type ChoiceInteraction = z.infer<typeof ChoiceInteractionSchema>\n\n// InlineChoiceInteraction: <qti-inline-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const InlineChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tchoices: z.array(InlineChoiceSchema).min(1)\n})\nexport const InlineChoiceInteractionSchema = InlineChoiceInteractionCoreSchema.extend({\n\ttype: z.literal(\"inlineChoiceInteraction\")\n})\nexport type InlineChoiceInteraction = z.infer<typeof InlineChoiceInteractionSchema>\n\n// TextEntryInteraction: <qti-text-entry-interaction response-identifier=\"RESPONSE\" expected-length=\"15\" ...> ...\nexport const TextEntryInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\texpectedLength: z.number().int().min(0).optional(),\n\tplaceholderText: z.string().optional(),\n\tpatternMask: z.string().optional()\n})\nexport const TextEntryInteractionSchema = TextEntryInteractionCoreSchema.extend({\n\ttype: z.literal(\"textEntryInteraction\")\n})\nexport type TextEntryInteraction = z.infer<typeof TextEntryInteractionSchema>\n\n// OrderInteraction: <qti-order-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" orientation=\"vertical\"> ...\nexport const OrderInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(0).optional(), // 0 or undefined usually means \"all\"\n\torientation: z.enum([\"vertical\", \"horizontal\"]),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\nexport const OrderInteractionSchema = OrderInteractionCoreSchema.extend({\n\ttype: z.literal(\"orderInteraction\")\n})\nexport type OrderInteraction = z.infer<typeof OrderInteractionSchema>\n\n// GapText: <qti-gap-text identifier=\"A\" match-max=\"1\"> ... content ... </qti-gap-text>\nexport const GapTextSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(),\n\tmatchMax: z.number().int().min(0) // 0 = unlimited\n})\nexport type GapText = z.infer<typeof GapTextSchema>\n\n// Gap: <qti-gap identifier=\"G1\" /> - the drop target placeholder\nexport const GapSchema = z.object({\n\tidentifier: z.string().min(1)\n})\nexport type Gap = z.infer<typeof GapSchema>\n\n// GapMatchInteraction: <qti-gap-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const GapMatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tgapTexts: z.array(GapTextSchema).min(1), // Draggable source tokens\n\tgaps: z.array(GapSchema).min(1), // Drop target placeholders\n\tcontentHtml: z.string() // HTML content with gap placeholders\n})\nexport const GapMatchInteractionSchema = GapMatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"gapMatchInteraction\")\n})\nexport type GapMatchInteraction = z.infer<typeof GapMatchInteractionSchema>\n\n// AssociableChoice: <qti-simple-associable-choice identifier=\"A\" match-max=\"1\"> ... </qti-simple-associable-choice>\nexport const AssociableChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tmatchMax: z.number().int().min(0), // 0 = unlimited uses\n\tcontentHtml: z.string()\n})\nexport type AssociableChoice = z.infer<typeof AssociableChoiceSchema>\n\n// MatchInteraction: <qti-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" max-associations=\"4\"> ...\nexport const MatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tmaxAssociations: z.number().int().min(0), // 0 = unlimited total associations\n\tsourceChoices: z.array(AssociableChoiceSchema).min(1), // First <qti-simple-match-set>\n\ttargetChoices: z.array(AssociableChoiceSchema).min(1), // Second <qti-simple-match-set>\n\tpromptHtml: z.string()\n})\nexport const MatchInteractionSchema = MatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"matchInteraction\")\n})\nexport type MatchInteraction = z.infer<typeof MatchInteractionSchema>\n\nexport const AnyInteractionSchema = z.discriminatedUnion(\"type\", [\n\tChoiceInteractionSchema,\n\tInlineChoiceInteractionSchema,\n\tTextEntryInteractionSchema,\n\tOrderInteractionSchema,\n\tGapMatchInteractionSchema,\n\tMatchInteractionSchema\n])\nexport type AnyInteraction = z.infer<typeof AnyInteractionSchema>\n\n// CorrectResponse inside ResponseDeclaration\nexport const CorrectResponseSchema = z.object({\n\tvalues: z.array(z.string().min(1)).min(1)\n})\nexport type CorrectResponse = z.infer<typeof CorrectResponseSchema>\n\n// ResponseDeclaration\nexport const ResponseDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tcorrectResponse: CorrectResponseSchema,\n\t// Optional response mapping for map-response processing (used for summed feedback/score)\n\tmapping: z\n\t\t.object({\n\t\t\tdefaultValue: z.number().default(0),\n\t\t\tlowerBound: z.number().optional(),\n\t\t\tupperBound: z.number().optional(),\n\t\t\tentries: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tkey: z.string().min(1),\n\t\t\t\t\tvalue: z.number()\n\t\t\t\t})\n\t\t\t)\n\t\t})\n\t\t.optional()\n})\nexport type ResponseDeclaration = z.infer<typeof ResponseDeclarationSchema>\n\n// OutcomeDeclaration\nexport const OutcomeDefaultValueSchema = z.object({\n\tvalue: z.string()\n})\nexport type OutcomeDefaultValue = z.infer<typeof OutcomeDefaultValueSchema>\n\nexport const OutcomeDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tdefaultValue: OutcomeDefaultValueSchema.optional()\n})\nexport type OutcomeDeclaration = z.infer<typeof OutcomeDeclarationSchema>\n\n// Feedback blocks\nexport const FeedbackBlockSchema = z.object({\n\toutcomeIdentifier: z.string().min(1),\n\tidentifier: z.string().min(1),\n\tshowHide: z.enum([\"show\", \"hide\"]).default(\"show\"),\n\tcontentHtml: z.string()\n})\nexport type FeedbackBlock = z.infer<typeof FeedbackBlockSchema>\n\n// ItemBody as typed content blocks + feedback blocks\nconst StimulusBlockSchema = z.object({\n\ttype: z.literal(\"stimulus\"),\n\thtml: z.string()\n})\n\n// RichStimulus: HTML with inline embeds map keyed by responseIdentifier\nexport const RichStimulusBlockSchema = z.object({\n\ttype: z.literal(\"richStimulus\"),\n\thtml: z.string(),\n\tinlineEmbeds: z.record(z.string(), InlineChoiceInteractionSchema),\n\ttextEmbeds: z.record(z.string(), TextEntryInteractionSchema)\n})\nexport type RichStimulusBlock = z.infer<typeof RichStimulusBlockSchema>\n\nconst InteractionBlockSchema = z.object({\n\ttype: z.literal(\"interaction\"),\n\tinteraction: AnyInteractionSchema\n})\n\nexport const ItemBodySchema = z.object({\n\tcontentBlocks: z.array(z.union([StimulusBlockSchema, RichStimulusBlockSchema, InteractionBlockSchema])).min(1),\n\tfeedbackBlocks: z.array(FeedbackBlockSchema)\n})\nexport type ItemBody = z.infer<typeof ItemBodySchema>\n\n// Response processing: Define schemas for the Response Processing AST\nconst BaseRuleSchema = z.object({\n\ttype: z.literal(\"setOutcomeValue\"),\n\tidentifier: z.string(),\n\tvalue: z.string()\n})\nexport type BaseRule = z.infer<typeof BaseRuleSchema>\n\nconst MatchConditionSchema = z.object({\n\ttype: z.literal(\"match\"),\n\tvariable: z.string(),\n\tcorrect: z.literal(true) // Match against correct response\n})\nexport type MatchCondition = z.infer<typeof MatchConditionSchema>\n\n// NEW: Schema for matching against a specific value (e.g., <qti-match> with <qti-base-value>)\nconst MatchValueConditionSchema = z.object({\n\ttype: z.literal(\"matchValue\"),\n\tvariable: z.string(), // The response identifier from <qti-variable>\n\tvalue: z.string() // The target value from <qti-base-value>\n})\nexport type MatchValueCondition = z.infer<typeof MatchValueConditionSchema>\n\n// Schema for string matching (text entry with case sensitivity)\nconst StringMatchConditionSchema = z.object({\n\ttype: z.literal(\"stringMatch\"),\n\tvariable: z.string(),\n\tvalue: z.string(),\n\tcaseSensitive: z.boolean()\n})\nexport type StringMatchCondition = z.infer<typeof StringMatchConditionSchema>\n\n// Schema for member checking (multi-select subset logic)\nconst MemberConditionSchema = z.object({\n\ttype: z.literal(\"member\"),\n\tvariable: z.string(),\n\tvalue: z.string()\n})\nexport type MemberCondition = z.infer<typeof MemberConditionSchema>\n\n// Schema for the map-response-equal condition\nconst EqualMapResponseConditionSchema = z.object({\n\ttype: z.literal(\"equalMapResponse\"),\n\tvariable: z.string(), // The response identifier from <qti-map-response>\n\tvalue: z.string() // The target sum value from <qti-base-value>\n})\nexport type EqualMapResponseCondition = z.infer<typeof EqualMapResponseConditionSchema>\n\n// Define types first for recursive schemas\nexport type AndCondition = {\n\ttype: \"and\"\n\tconditions: AnyCondition[]\n}\n\nexport type OrCondition = {\n\ttype: \"or\"\n\tconditions: AnyCondition[]\n}\n\nexport type NotCondition = {\n\ttype: \"not\"\n\tcondition: AnyCondition\n}\n\nexport type AnyCondition =\n\t| MatchCondition\n\t| MatchValueCondition\n\t| StringMatchCondition\n\t| MemberCondition\n\t| AndCondition\n\t| OrCondition\n\t| NotCondition\n\t| EqualMapResponseCondition\n\n// Then define schemas using the types\nconst AndConditionSchema: z.ZodType<AndCondition> = z.object({\n\ttype: z.literal(\"and\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst OrConditionSchema: z.ZodType<OrCondition> = z.object({\n\ttype: z.literal(\"or\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst NotConditionSchema: z.ZodType<NotCondition> = z.object({\n\ttype: z.literal(\"not\"),\n\tcondition: z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema)\n})\n\n// Union of all condition types\nconst AnyConditionSchema: z.ZodType<AnyCondition> = z.union([\n\tMatchConditionSchema,\n\tMatchValueConditionSchema,\n\tStringMatchConditionSchema,\n\tMemberConditionSchema,\n\tz.lazy((): z.ZodType<AndCondition> => AndConditionSchema),\n\tz.lazy((): z.ZodType<OrCondition> => OrConditionSchema),\n\tz.lazy((): z.ZodType<NotCondition> => NotConditionSchema),\n\tEqualMapResponseConditionSchema\n])\n\n// --- NEW STRUCTURE FOR PROCESSING RULES ---\n\n// A single branch (if, else-if, else)\nexport type ConditionBranch = {\n\tcondition?: AnyCondition // undefined for 'else'\n\tactions: BaseRule[]\n\tnestedRules?: ResponseRule[] // Recursive: nested rules inside a branch\n}\n\n// Zod schema for a branch\nexport const ConditionBranchSchema: z.ZodType<ConditionBranch> = z.object({\n\tcondition: AnyConditionSchema.optional(),\n\tactions: z.array(BaseRuleSchema),\n\tnestedRules: z.array(z.lazy((): z.ZodType<ResponseRule> => ResponseRuleSchema)).optional()\n})\n\n// The main ResponseRule type (either a condition block or a direct action)\nexport type ResponseRule = { type: \"condition\"; branches: ConditionBranch[] } | { type: \"action\"; action: BaseRule }\n\n// Zod schema for ResponseRule\nexport const ResponseRuleSchema: z.ZodType<ResponseRule> = z.union([\n\tz.object({\n\t\ttype: z.literal(\"condition\"),\n\t\tbranches: z.array(ConditionBranchSchema)\n\t}),\n\tz.object({\n\t\ttype: z.literal(\"action\"),\n\t\taction: BaseRuleSchema\n\t})\n])\n\n// Response processing: scoring\nexport const ScoringRuleSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tcorrectScore: z.number(),\n\tincorrectScore: z.number()\n})\nexport type ScoringRule = z.infer<typeof ScoringRuleSchema>\n\n// UPDATED: The primary ResponseProcessingSchema now uses the AST directly\nexport const ResponseProcessingSchema = z.object({\n\trules: z.array(ResponseRuleSchema),\n\tscoring: ScoringRuleSchema\n})\nexport type ResponseProcessing = z.infer<typeof ResponseProcessingSchema>\n\n// Root assessment item, extensible for any interaction type\nexport const AssessmentItemSchema = z.object({\n\tidentifier: z.string().min(1),\n\ttitle: z.string().min(1),\n\ttimeDependent: z.boolean(),\n\txmlLang: z.string().min(1),\n\n\tresponseDeclarations: z.array(ResponseDeclarationSchema).min(1),\n\toutcomeDeclarations: z.array(OutcomeDeclarationSchema).min(1),\n\n\titemBody: ItemBodySchema,\n\tresponseProcessing: ResponseProcessingSchema\n})\nexport type AssessmentItem = z.infer<typeof AssessmentItemSchema>\n","import * as errors from \"@superbuilders/errors\"\nimport { XMLBuilder, XMLParser } from \"fast-xml-parser\"\nimport { serializeInner, serializeNode, serializeNodes } from \"./html\"\nimport {\n\ttype AnyCondition,\n\ttype AssessmentItem,\n\tAssessmentItemSchema,\n\ttype BaseRule,\n\ttype ConditionBranch,\n\tQtiBaseTypeSchema,\n\tQtiCardinalitySchema,\n\ttype ResponseProcessing,\n\ttype ResponseRule,\n\ttype ScoringRule\n} from \"./schema\"\n\n// Clean, recursive representation of an XML node\nexport interface NormalizedNode {\n\ttagName: string\n\tattrs: Record<string, unknown>\n\tchildren: Array<NormalizedNode | string>\n}\n\n// --- Core XML & Node Utilities ---\n\nfunction createXmlParser(): XMLParser {\n\treturn new XMLParser({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tallowBooleanAttributes: true,\n\t\tparseAttributeValue: true,\n\t\tparseTagValue: false, // CRITICAL: Preserve \"000\" as string, not convert to number 0\n\t\ttrimValues: false,\n\t\tpreserveOrder: true\n\t})\n}\n\nfunction _createXmlBuilder(): XMLBuilder {\n\treturn new XMLBuilder({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tsuppressEmptyNode: true, // cleaner output for empty tags\n\t\tformat: false\n\t})\n}\n\nfunction coerceString(value: unknown): string {\n\tif (value == null) return \"\"\n\treturn String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction normalizeNode(rawNode: unknown): NormalizedNode | string {\n\tif (rawNode == null) return \"\"\n\tif (!isRecord(rawNode)) return coerceString(rawNode)\n\n\tconst textContent = rawNode[\"#text\"]\n\tif (textContent != null) {\n\t\treturn coerceString(textContent)\n\t}\n\n\tconst tagName = Object.keys(rawNode).find((k) => k !== \":@\")\n\tif (!tagName) return \"\"\n\n\tconst attrsValue = rawNode[\":@\"]\n\tconst attrs = isRecord(attrsValue) ? attrsValue : {}\n\tconst rawChildren = Array.isArray(rawNode[tagName]) ? rawNode[tagName] : [rawNode[tagName]]\n\n\treturn {\n\t\ttagName,\n\t\tattrs,\n\t\tchildren: rawChildren.map(normalizeNode).filter((n) => n !== \"\")\n\t}\n}\n\nfunction nodeToXml(node: NormalizedNode | string): string {\n\t// Use our HTML serializer for better MathML preservation\n\tif (typeof node === \"string\") return node\n\treturn serializeNode(node)\n}\n\nfunction getInnerHtml(node: NormalizedNode): string {\n\t// Use our HTML serializer for inner content\n\treturn serializeInner(node)\n}\n\nfunction findChild(node: NormalizedNode, tagName: string): NormalizedNode | undefined {\n\tconst child = node.children.find((c) => typeof c !== \"string\" && c.tagName === tagName)\n\treturn typeof child === \"string\" ? undefined : child\n}\n\nfunction findChildren(node: NormalizedNode, tagName: string): NormalizedNode[] {\n\treturn node.children.filter((c): c is NormalizedNode => typeof c !== \"string\" && c.tagName === tagName)\n}\n\nfunction getTextContent(node: NormalizedNode | undefined): string {\n\tif (!node) return \"\"\n\tconst firstChild = node.children[0]\n\tif (typeof firstChild === \"string\") return firstChild.trim()\n\treturn \"\"\n}\n\nfunction findInteractionNodes(node: NormalizedNode, out: NormalizedNode[] = []): NormalizedNode[] {\n\tif (node.tagName.includes(\"-interaction\")) {\n\t\tout.push(node)\n\t}\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tfindInteractionNodes(child, out)\n\t\t}\n\t}\n\treturn out\n}\n\nfunction escapeAttr(value: string): string {\n\treturn value.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\")\n}\n\nfunction attrsToString(attrs: Record<string, unknown>): string {\n\tconst parts: string[] = []\n\tfor (const [key, val] of Object.entries(attrs)) {\n\t\tconst str = coerceString(val)\n\t\tif (str === \"\") continue\n\t\tparts.push(`${key}=\"${escapeAttr(str)}\"`)\n\t}\n\treturn parts.length ? ` ${parts.join(\" \")}` : \"\"\n}\n\nfunction serializeWithInlinePlaceholders(\n\tnode: NormalizedNode | string,\n\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>,\n\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n): string {\n\tif (typeof node === \"string\") return node\n\tif (node.tagName === \"qti-inline-choice-interaction\") {\n\t\tconst interaction = extractInlineChoiceInteraction(node)\n\t\tinlineEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-inline=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tif (node.tagName === \"qti-text-entry-interaction\") {\n\t\tconst interaction = extractTextEntryInteraction(node)\n\t\ttextEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-text-entry=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tconst open = `<${node.tagName}${attrsToString(node.attrs)}>`\n\tconst childrenHtml = node.children.map((c) => serializeWithInlinePlaceholders(c, inlineEmbeds, textEmbeds)).join(\"\")\n\tconst close = `</${node.tagName}>`\n\treturn `${open}${childrenHtml}${close}`\n}\n\n// --- QTI Structure Extractors ---\n\nfunction extractChoiceInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Extract optional inline feedback\n\t\tconst inlineFeedbackNode = findChild(choice, \"qti-feedback-inline\")\n\t\tconst inlineFeedbackHtml = inlineFeedbackNode ? getInnerHtml(inlineFeedbackNode) : undefined\n\n\t\t// Build content HTML excluding inline feedback nodes\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\tinlineFeedbackHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"choiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 1),\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractInlineChoiceInteraction(node: NormalizedNode) {\n\tconst choiceNodes = findChildren(node, \"qti-inline-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\tconst contentHtml = serializeInner(choice)\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"inlineChoiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tchoices\n\t}\n}\n\nfunction extractTextEntryInteraction(node: NormalizedNode) {\n\tconst expectedLengthAttr = node.attrs[\"expected-length\"]\n\tconst expectedLength = expectedLengthAttr ? Number(expectedLengthAttr) : undefined\n\n\treturn {\n\t\ttype: \"textEntryInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\texpectedLength: expectedLength !== undefined && !Number.isNaN(expectedLength) ? expectedLength : undefined,\n\t\tplaceholderText: coerceString(node.attrs[\"placeholder-text\"]) || undefined,\n\t\tpatternMask: coerceString(node.attrs[\"pattern-mask\"]) || undefined\n\t}\n}\n\nfunction extractOrderInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Filter out inline feedback nodes from content\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\t// Order interaction rarely displays inline feedback per-item\n\t\t\tinlineFeedbackHtml: undefined\n\t\t}\n\t})\n\n\t// Detect orientation (attribute OR class)\n\tlet orientation: \"vertical\" | \"horizontal\" = \"vertical\"\n\tconst attrOrientation = coerceString(node.attrs.orientation)\n\tconst classAttr = coerceString(node.attrs.class)\n\n\tif (attrOrientation === \"horizontal\" || classAttr.includes(\"qti-orientation-horizontal\")) {\n\t\torientation = \"horizontal\"\n\t}\n\n\treturn {\n\t\ttype: \"orderInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 0) || undefined,\n\t\torientation,\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractGapMatchInteraction(node: NormalizedNode) {\n\t// Extract gap texts (draggable tokens)\n\tconst gapTextNodes = findChildren(node, \"qti-gap-text\")\n\tconst gapTexts = gapTextNodes.map((gt) => ({\n\t\tidentifier: coerceString(gt.attrs.identifier),\n\t\tcontentHtml: serializeInner(gt),\n\t\tmatchMax: Number(gt.attrs[\"match-max\"] ?? 0) // 0 = unlimited\n\t}))\n\n\t// Find all gaps in the content and build content HTML with placeholders\n\tconst gaps: Array<{ identifier: string }> = []\n\n\t// Serialize content with gap placeholders\n\tfunction serializeWithGapPlaceholders(child: NormalizedNode | string): string {\n\t\tif (typeof child === \"string\") return child\n\t\tif (child.tagName === \"qti-gap\") {\n\t\t\tconst gapId = coerceString(child.attrs.identifier)\n\t\t\tgaps.push({ identifier: gapId })\n\t\t\treturn `<span data-qti-gap=\"${gapId}\"></span>`\n\t\t}\n\t\t// Skip gap-text nodes in content serialization (they're in the source pool)\n\t\tif (child.tagName === \"qti-gap-text\") {\n\t\t\treturn \"\"\n\t\t}\n\t\tconst open = `<${child.tagName}${attrsToString(child.attrs)}>`\n\t\tconst childrenHtml = child.children.map((c) => serializeWithGapPlaceholders(c)).join(\"\")\n\t\tconst close = `</${child.tagName}>`\n\t\treturn `${open}${childrenHtml}${close}`\n\t}\n\n\t// Build content HTML from children (excluding gap-text nodes which are sources)\n\tconst contentHtml = node.children\n\t\t.filter((c) => typeof c === \"string\" || c.tagName !== \"qti-gap-text\")\n\t\t.map((c) => serializeWithGapPlaceholders(c))\n\t\t.join(\"\")\n\n\treturn {\n\t\ttype: \"gapMatchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tgapTexts,\n\t\tgaps,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractMatchInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\t// QTI has two <qti-simple-match-set> nodes\n\tconst matchSets = findChildren(node, \"qti-simple-match-set\")\n\n\tconst extractChoices = (setNode: NormalizedNode) => {\n\t\tconst choiceNodes = findChildren(setNode, \"qti-simple-associable-choice\")\n\t\treturn choiceNodes.map((c) => ({\n\t\t\tidentifier: coerceString(c.attrs.identifier),\n\t\t\tmatchMax: Number(c.attrs[\"match-max\"]) || 1,\n\t\t\tcontentHtml: serializeInner(c)\n\t\t}))\n\t}\n\n\t// First set = Sources, Second set = Targets (QTI convention)\n\tconst firstSet = matchSets[0]\n\tconst secondSet = matchSets[1]\n\tconst sourceChoices = firstSet ? extractChoices(firstSet) : []\n\tconst targetChoices = secondSet ? extractChoices(secondSet) : []\n\n\treturn {\n\t\ttype: \"matchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: node.attrs.shuffle === \"true\",\n\t\tmaxAssociations: Number(node.attrs[\"max-associations\"]) || 0,\n\t\tsourceChoices,\n\t\ttargetChoices,\n\t\tpromptHtml\n\t}\n}\n\nfunction extractFeedbackBlock(node: NormalizedNode) {\n\tconst contentBodyNode = findChild(node, \"qti-content-body\")\n\tconst contentHtml = contentBodyNode ? getInnerHtml(contentBodyNode) : \"\"\n\tconst showHide: \"hide\" | \"show\" = coerceString(node.attrs[\"show-hide\"]) === \"hide\" ? \"hide\" : \"show\"\n\n\treturn {\n\t\toutcomeIdentifier: coerceString(node.attrs[\"outcome-identifier\"]),\n\t\tidentifier: coerceString(node.attrs.identifier),\n\t\tshowHide,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractResponseDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-response-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst correctResponseNode = findChild(node, \"qti-correct-response\")\n\t\tconst valueNodes = correctResponseNode ? findChildren(correctResponseNode, \"qti-value\") : []\n\t\tconst values = valueNodes.map(getTextContent)\n\n\t\t// Optional mapping for map-response processing\n\t\tconst mappingNode = findChild(node, \"qti-mapping\")\n\t\tlet mapping:\n\t\t\t| {\n\t\t\t\t\tdefaultValue: number\n\t\t\t\t\tlowerBound?: number\n\t\t\t\t\tupperBound?: number\n\t\t\t\t\tentries: Array<{ key: string; value: number }>\n\t\t\t }\n\t\t\t| undefined\n\t\tif (mappingNode) {\n\t\t\tconst defaultValueRaw = coerceString(mappingNode.attrs[\"default-value\"])\n\t\t\tconst lowerBoundRaw = coerceString(mappingNode.attrs[\"lower-bound\"])\n\t\t\tconst upperBoundRaw = coerceString(mappingNode.attrs[\"upper-bound\"])\n\t\t\tconst entryNodes = findChildren(mappingNode, \"qti-map-entry\")\n\t\t\tconst entries = entryNodes.map((en) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: coerceString(en.attrs[\"map-key\"]),\n\t\t\t\t\tvalue: Number(coerceString(en.attrs[\"mapped-value\"]) || 0)\n\t\t\t\t}\n\t\t\t})\n\t\t\tmapping = {\n\t\t\t\tdefaultValue: Number(defaultValueRaw || 0),\n\t\t\t\tlowerBound: lowerBoundRaw !== \"\" ? Number(lowerBoundRaw) : undefined,\n\t\t\t\tupperBound: upperBoundRaw !== \"\" ? Number(upperBoundRaw) : undefined,\n\t\t\t\tentries\n\t\t\t}\n\t\t}\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in response declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in response declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tcorrectResponse: { values },\n\t\t\tmapping\n\t\t}\n\t})\n}\n\nfunction extractOutcomeDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-outcome-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst defaultValueNode = findChild(node, \"qti-default-value\")\n\t\tconst valueNode = defaultValueNode ? findChild(defaultValueNode, \"qti-value\") : undefined\n\t\tconst defaultValue = valueNode ? { value: getTextContent(valueNode) } : undefined\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in outcome declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in outcome declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tdefaultValue\n\t\t}\n\t})\n}\n\nfunction parseCondition(node: NormalizedNode): AnyCondition | null {\n\t// A. Logical Operators\n\tif (node.tagName === \"qti-and\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"and\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-or\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"or\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-not\") {\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) return { type: \"not\", condition: parsed }\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// B. Variable Extraction (Common logic for comparators)\n\tconst variableNode = findChild(node, \"qti-variable\")\n\tconst baseValueNode = findChild(node, \"qti-base-value\")\n\n\tconst identifier = variableNode ? coerceString(variableNode.attrs.identifier) : undefined\n\tconst value = baseValueNode ? getTextContent(baseValueNode) : undefined\n\n\t// C. Comparators\n\tif (node.tagName === \"qti-match\") {\n\t\t// Match against correct response\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t\t// Match against a specific value\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"matchValue\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// String Match (text entry with case sensitivity)\n\tif (node.tagName === \"qti-string-match\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn {\n\t\t\t\ttype: \"stringMatch\",\n\t\t\t\tvariable: identifier,\n\t\t\t\tvalue,\n\t\t\t\t// QTI spec: case-sensitive defaults to true\n\t\t\t\tcaseSensitive: node.attrs[\"case-sensitive\"] !== \"false\"\n\t\t\t}\n\t\t}\n\t}\n\n\t// Member (set logic for multi-select)\n\tif (node.tagName === \"qti-member\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"member\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// Equal: supports both map-response comparisons and correct response matching\n\tif (node.tagName === \"qti-equal\") {\n\t\t// Pattern 1: Equal with map-response (for summed scores)\n\t\tconst mapResponseNode = findChild(node, \"qti-map-response\")\n\t\tconst equalBaseValueNode = findChild(node, \"qti-base-value\")\n\t\tif (mapResponseNode && equalBaseValueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"equalMapResponse\",\n\t\t\t\tvariable: coerceString(mapResponseNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(equalBaseValueNode)\n\t\t\t}\n\t\t}\n\t\t// Pattern 2: Equal with qti-correct (compare to correct response, like qti-match)\n\t\t// Used by text entry: <qti-equal><qti-variable/><qti-correct/></qti-equal>\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Parse actions (setOutcomeValue) from a branch node\nfunction parseActions(node: NormalizedNode): BaseRule[] {\n\tconst rules: BaseRule[] = []\n\tconst setNodes = findChildren(node, \"qti-set-outcome-value\")\n\tfor (const setNode of setNodes) {\n\t\tconst valueNode = findChild(setNode, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\trules.push({\n\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\tidentifier: coerceString(setNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t})\n\t\t}\n\t}\n\treturn rules\n}\n\n// RECURSIVE: Parse a processing rule (Condition Block OR Direct Action)\nfunction parseResponseRule(node: NormalizedNode): ResponseRule | null {\n\t// Case 1: Direct Action (e.g. <qti-set-outcome-value>)\n\tif (node.tagName === \"qti-set-outcome-value\") {\n\t\tconst valueNode = findChild(node, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"action\",\n\t\t\t\taction: {\n\t\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// Case 2: Response Condition (if/else block)\n\tif (node.tagName === \"qti-response-condition\") {\n\t\tconst branches: ConditionBranch[] = []\n\n\t\t// 1. IF\n\t\tconst ifNode = findChild(node, \"qti-response-if\")\n\t\tif (ifNode) {\n\t\t\tconst condition = findConditionInBranch(ifNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(ifNode),\n\t\t\t\t\tnestedRules: findNestedRules(ifNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 2. ELSE-IFs\n\t\tconst elseIfNodes = findChildren(node, \"qti-response-else-if\")\n\t\tfor (const elseIfNode of elseIfNodes) {\n\t\t\tconst condition = findConditionInBranch(elseIfNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(elseIfNode),\n\t\t\t\t\tnestedRules: findNestedRules(elseIfNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 3. ELSE\n\t\tconst elseNode = findChild(node, \"qti-response-else\")\n\t\tif (elseNode) {\n\t\t\tbranches.push({\n\t\t\t\tcondition: undefined, // Else has no condition\n\t\t\t\tactions: parseActions(elseNode),\n\t\t\t\tnestedRules: findNestedRules(elseNode)\n\t\t\t})\n\t\t}\n\n\t\tif (branches.length > 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"condition\",\n\t\t\t\tbranches\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Helper to find the condition node inside a response-if/else-if block\nfunction findConditionInBranch(node: NormalizedNode): AnyCondition | null {\n\tconst conditionTagNames = [\"qti-match\", \"qti-and\", \"qti-or\", \"qti-not\", \"qti-equal\", \"qti-string-match\", \"qti-member\"]\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\" && conditionTagNames.includes(child.tagName)) {\n\t\t\treturn parseCondition(child)\n\t\t}\n\t}\n\treturn null\n}\n\n// Helper to find nested CONDITION BLOCKS inside a branch\n// Note: We only look for qti-response-condition, NOT qti-set-outcome-value\n// because actions are already captured by parseActions() in the branch's `actions` array\nfunction findNestedRules(node: NormalizedNode): ResponseRule[] {\n\tconst nested: ResponseRule[] = []\n\tfor (const child of node.children) {\n\t\t// Only parse nested response-condition blocks, not standalone actions\n\t\tif (typeof child !== \"string\" && child.tagName === \"qti-response-condition\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) nested.push(rule)\n\t\t}\n\t}\n\treturn nested\n}\n\n// Main processing extractor\nfunction extractResponseProcessing(rootChildren: NormalizedNode[]): ResponseProcessing {\n\tconst processingNode = rootChildren.find((n) => n.tagName === \"qti-response-processing\")\n\tif (!processingNode) {\n\t\treturn { rules: [], scoring: { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 } }\n\t}\n\n\tconst rules: ResponseRule[] = []\n\tfor (const child of processingNode.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) rules.push(rule)\n\t\t}\n\t}\n\n\t// Legacy scoring extraction (unchanged logic for compatibility)\n\tlet scoring: ScoringRule = { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 }\n\tconst conditionNodes = findChildren(processingNode, \"qti-response-condition\")\n\tfor (const conditionNode of conditionNodes) {\n\t\tconst responseIfNode = findChild(conditionNode, \"qti-response-if\")\n\t\tconst responseElseNode = findChild(conditionNode, \"qti-response-else\")\n\n\t\tif (responseIfNode && responseElseNode) {\n\t\t\tconst andNode = findChild(responseIfNode, \"qti-and\")\n\t\t\tif (andNode) {\n\t\t\t\tconst matchNode = findChild(andNode, \"qti-match\")\n\t\t\t\tconst variableNode = matchNode ? findChild(matchNode, \"qti-variable\") : undefined\n\t\t\t\tif (variableNode) {\n\t\t\t\t\tconst ifSetOutcomeNode = findChild(responseIfNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst elseSetOutcomeNode = findChild(responseElseNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst correctValueNode = ifSetOutcomeNode ? findChild(ifSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tconst incorrectValueNode = elseSetOutcomeNode ? findChild(elseSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tscoring = {\n\t\t\t\t\t\tresponseIdentifier: coerceString(variableNode.attrs.identifier),\n\t\t\t\t\t\tcorrectScore: Number(getTextContent(correctValueNode) || 1),\n\t\t\t\t\t\tincorrectScore: Number(getTextContent(incorrectValueNode) || 0)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { rules, scoring }\n}\n\n// --- Main Parser Export ---\n\nexport function parseAssessmentItemXml(xml: string): AssessmentItem {\n\t// Validate input\n\tif (!xml || typeof xml !== \"string\") {\n\t\tthrow errors.new(\"xml input must be a non-empty string\")\n\t}\n\n\tconst parser = createXmlParser()\n\tconst parseResult = errors.trySync(() => {\n\t\t// Parse with preserveOrder flag as second parameter\n\t\treturn parser.parse(xml, true)\n\t})\n\n\tif (parseResult.error) {\n\t\tthrow errors.wrap(parseResult.error, \"xml parse\")\n\t}\n\n\tconst raw = parseResult.data\n\tif (!Array.isArray(raw)) {\n\t\tthrow errors.new(\"expected xml parser to output an array for preserveOrder\")\n\t}\n\n\tconst normalizedTree = raw.map(normalizeNode).filter((n): n is NormalizedNode => typeof n !== \"string\")\n\n\tconst rootNode = normalizedTree.find((n) => n.tagName.endsWith(\"assessment-item\"))\n\tif (!rootNode) {\n\t\tthrow errors.new(\"qti assessment item not found in xml document\")\n\t}\n\n\tconst rootChildren = rootNode.children.filter((c): c is NormalizedNode => typeof c !== \"string\")\n\tconst itemBodyNode = rootChildren.find((n) => n.tagName === \"qti-item-body\")\n\n\ttype InteractionUnion =\n\t\t| ReturnType<typeof extractChoiceInteraction>\n\t\t| ReturnType<typeof extractInlineChoiceInteraction>\n\t\t| ReturnType<typeof extractTextEntryInteraction>\n\t\t| ReturnType<typeof extractOrderInteraction>\n\t\t| ReturnType<typeof extractGapMatchInteraction>\n\t\t| ReturnType<typeof extractMatchInteraction>\n\ttype ContentBlock =\n\t\t| { type: \"stimulus\"; html: string }\n\t\t| {\n\t\t\t\ttype: \"richStimulus\"\n\t\t\t\thtml: string\n\t\t\t\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>\n\t\t\t\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n\t\t }\n\t\t| { type: \"interaction\"; interaction: InteractionUnion }\n\ttype FeedbackBlock = { outcomeIdentifier: string; identifier: string; showHide: \"hide\" | \"show\"; contentHtml: string }\n\n\tconst contentBlocks: ContentBlock[] = []\n\tconst feedbackBlocks: FeedbackBlock[] = []\n\n\tif (itemBodyNode) {\n\t\tfor (const child of itemBodyNode.children) {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\tif (child.trim()) contentBlocks.push({ type: \"stimulus\" as const, html: child })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Collect all interaction nodes within this subtree\n\t\t\tif (child.tagName === \"qti-feedback-block\") {\n\t\t\t\tfeedbackBlocks.push(extractFeedbackBlock(child))\n\t\t\t} else {\n\t\t\t\tconst interactionNodes = findInteractionNodes(child)\n\t\t\t\tconst hasInline = interactionNodes.some(\n\t\t\t\t\t(n) => n.tagName === \"qti-inline-choice-interaction\" || n.tagName === \"qti-text-entry-interaction\"\n\t\t\t\t)\n\t\t\t\tif (hasInline) {\n\t\t\t\t\tconst inlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>> = {}\n\t\t\t\t\tconst textEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>> = {}\n\t\t\t\t\tconst html = serializeWithInlinePlaceholders(child, inlineEmbeds, textEmbeds)\n\t\t\t\t\tcontentBlocks.push({ type: \"richStimulus\" as const, html, inlineEmbeds, textEmbeds })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (interactionNodes.length > 0) {\n\t\t\t\t\tfor (const inode of interactionNodes) {\n\t\t\t\t\t\tif (inode.tagName === \"qti-choice-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractChoiceInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-text-entry-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractTextEntryInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-order-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractOrderInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-gap-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractGapMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Unknown interaction subtype: serialize as stimulus fallback\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(inode) })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(child) })\n\t\t\t}\n\t\t}\n\t}\n\n\tlet normalizedItem = {\n\t\tidentifier: coerceString(rootNode.attrs.identifier),\n\t\ttitle: coerceString(rootNode.attrs.title),\n\t\ttimeDependent: Boolean(rootNode.attrs[\"time-dependent\"]),\n\t\txmlLang: coerceString(rootNode.attrs[\"xml:lang\"]) || coerceString(rootNode.attrs[\"xml-lang\"]) || \"en\",\n\t\tresponseDeclarations: extractResponseDeclarations(rootChildren),\n\t\toutcomeDeclarations: extractOutcomeDeclarations(rootChildren),\n\t\titemBody: { contentBlocks, feedbackBlocks },\n\t\tresponseProcessing: extractResponseProcessing(rootChildren)\n\t}\n\n\t// Fallback: if scoring.responseIdentifier is empty, derive from first response declaration\n\tif (\n\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier === \"\" &&\n\t\tnormalizedItem.responseDeclarations.length > 0\n\t) {\n\t\tconst firstDecl = normalizedItem.responseDeclarations[0]\n\t\tif (firstDecl) {\n\t\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier = firstDecl.identifier\n\t\t}\n\t}\n\n\tconst validation = AssessmentItemSchema.safeParse(normalizedItem)\n\tif (!validation.success) {\n\t\t// Format validation errors for better debugging\n\t\tconst errorDetails = validation.error.issues.map((err) => `${err.path.join(\".\")}: ${err.message}`).join(\"; \")\n\t\tthrow errors.new(`qti item validation: ${errorDetails}`)\n\t}\n\n\treturn validation.data\n}\n","import \"server-only\"\n\nimport { createHash } from \"node:crypto\"\nimport * as errors from \"@superbuilders/errors\"\nimport * as logger from \"@superbuilders/slog\"\n\nimport { sanitizeHtml } from \"../../html\"\nimport { parseAssessmentItemXml } from \"../../parser\"\nimport type {\n\tDisplayAssociableChoice,\n\tDisplayBlock,\n\tDisplayChoice,\n\tDisplayGap,\n\tDisplayGapText,\n\tDisplayInlineEmbed,\n\tDisplayItem,\n\tDisplayTextEmbed,\n\tFormShape\n} from \"../../shared/types\"\n\nfunction shuffleArray<T>(items: T[]): T[] {\n\t// Fisher–Yates shuffle on a shallow copy to keep original immutable\n\tconst arr = items.slice()\n\tfor (let i = arr.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(Math.random() * (i + 1))\n\t\tconst vi = arr[i]\n\t\tconst vj = arr[j]\n\t\t// With noUncheckedIndexedAccess enabled, index access is possibly undefined.\n\t\t// These indices are guaranteed in-bounds by construction; guard to satisfy TS.\n\t\tif (vi === undefined || vj === undefined) {\n\t\t\tcontinue\n\t\t}\n\t\tarr[i] = vj\n\t\tarr[j] = vi\n\t}\n\treturn arr\n}\n\nexport function buildDisplayModelFromXml(qtiXml: string): { itemKey: string; item: DisplayItem; shape: FormShape } {\n\tlogger.debug(\"qti build display model\", {})\n\tconst parseResult = errors.trySync(() => parseAssessmentItemXml(qtiXml))\n\tif (parseResult.error) {\n\t\tlogger.error(\"qti parse failed\", { error: parseResult.error })\n\t\tthrow errors.wrap(parseResult.error, \"qti parse\")\n\t}\n\n\tconst item = parseResult.data\n\tconst shape: FormShape = {}\n\tfor (const rd of item.responseDeclarations) {\n\t\t// Check baseType first for directedPair (gap match uses this)\n\t\tif (rd.baseType === \"directedPair\" || rd.baseType === \"pair\") {\n\t\t\tshape[rd.identifier] = \"directedPair\"\n\t\t} else if (rd.cardinality === \"single\") {\n\t\t\tshape[rd.identifier] = \"single\"\n\t\t} else if (rd.cardinality === \"ordered\") {\n\t\t\tshape[rd.identifier] = \"ordered\"\n\t\t} else {\n\t\t\tshape[rd.identifier] = \"multiple\"\n\t\t}\n\t}\n\n\tconst contentBlocks: DisplayBlock[] = item.itemBody.contentBlocks.map((block) => {\n\t\tif (block.type === \"stimulus\") {\n\t\t\treturn { type: \"stimulus\", html: sanitizeHtml(block.html) }\n\t\t}\n\t\tif (block.type === \"richStimulus\") {\n\t\t\tconst html = sanitizeHtml(block.html, { allowDataAttributes: true })\n\t\t\tconst inlineEmbeds: Record<string, DisplayInlineEmbed> = {}\n\t\t\tfor (const [key, embed] of Object.entries(block.inlineEmbeds)) {\n\t\t\t\tinlineEmbeds[key] = {\n\t\t\t\t\tresponseId: embed.responseIdentifier,\n\t\t\t\t\tshuffle: embed.shuffle,\n\t\t\t\t\tchoices: embed.choices.map((c) => ({\n\t\t\t\t\t\tid: c.identifier,\n\t\t\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml)\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst textEmbeds: Record<string, DisplayTextEmbed> = {}\n\t\t\tfor (const [key, embed] of Object.entries(block.textEmbeds)) {\n\t\t\t\ttextEmbeds[key] = {\n\t\t\t\t\tresponseId: embed.responseIdentifier,\n\t\t\t\t\texpectedLength: embed.expectedLength,\n\t\t\t\t\tplaceholder: embed.placeholderText,\n\t\t\t\t\tpatternMask: embed.patternMask\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { type: \"richStimulus\", html, inlineEmbeds, textEmbeds }\n\t\t}\n\t\tconst interaction = block.interaction\n\t\tif (interaction.type === \"choiceInteraction\") {\n\t\t\tconst promptHtml = sanitizeHtml(interaction.promptHtml)\n\t\t\tlet choices: DisplayChoice[] = interaction.choices.map((c) => ({\n\t\t\t\tid: c.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml),\n\t\t\t\tinlineFeedbackHtml: c.inlineFeedbackHtml ? sanitizeHtml(c.inlineFeedbackHtml) : undefined\n\t\t\t}))\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tchoices = shuffleArray(choices)\n\t\t\t}\n\t\t\t// Choice interactions only use \"single\" or \"multiple\" cardinality\n\t\t\tconst cardinality = shape[interaction.responseIdentifier] === \"multiple\" ? \"multiple\" : \"single\"\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"choice\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tcardinality,\n\t\t\t\t\tpromptHtml,\n\t\t\t\t\tchoices,\n\t\t\t\t\tminChoices: interaction.minChoices,\n\t\t\t\t\tmaxChoices: interaction.maxChoices\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"textEntryInteraction\") {\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\texpectedLength: interaction.expectedLength,\n\t\t\t\t\tplaceholder: interaction.placeholderText,\n\t\t\t\t\tpatternMask: interaction.patternMask\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"orderInteraction\") {\n\t\t\tlet choices: DisplayChoice[] = interaction.choices.map((c) => ({\n\t\t\t\tid: c.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml),\n\t\t\t\tinlineFeedbackHtml: undefined\n\t\t\t}))\n\n\t\t\t// Server-side shuffle for initial state\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tchoices = shuffleArray(choices)\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"order\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tpromptHtml: sanitizeHtml(interaction.promptHtml),\n\t\t\t\t\torientation: interaction.orientation,\n\t\t\t\t\tchoices\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"gapMatchInteraction\") {\n\t\t\tlet gapTexts: DisplayGapText[] = interaction.gapTexts.map((gt) => ({\n\t\t\t\tid: gt.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(gt.contentHtml),\n\t\t\t\tmatchMax: gt.matchMax\n\t\t\t}))\n\n\t\t\t// Server-side shuffle for source tokens\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tgapTexts = shuffleArray(gapTexts)\n\t\t\t}\n\n\t\t\tconst gaps: DisplayGap[] = interaction.gaps.map((g) => ({\n\t\t\t\tid: g.identifier\n\t\t\t}))\n\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"gapMatch\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tgapTexts,\n\t\t\t\t\tgaps,\n\t\t\t\t\tcontentHtml: sanitizeHtml(interaction.contentHtml, { allowDataAttributes: true })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"matchInteraction\") {\n\t\t\tconst mapChoice = (c: {\n\t\t\t\tidentifier: string\n\t\t\t\tmatchMax: number\n\t\t\t\tcontentHtml: string\n\t\t\t}): DisplayAssociableChoice => ({\n\t\t\t\tid: c.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml),\n\t\t\t\tmatchMax: c.matchMax\n\t\t\t})\n\n\t\t\tlet sourceChoices = interaction.sourceChoices.map(mapChoice)\n\t\t\tconst targetChoices = interaction.targetChoices.map(mapChoice)\n\n\t\t\t// Server-side shuffle for sources (targets stay fixed for consistency)\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tsourceChoices = shuffleArray(sourceChoices)\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"match\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tpromptHtml: sanitizeHtml(interaction.promptHtml),\n\t\t\t\t\tmaxAssociations: interaction.maxAssociations,\n\t\t\t\t\tsourceChoices,\n\t\t\t\t\ttargetChoices\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Fallback: unknown interactions emit a stimulus note\n\t\treturn { type: \"stimulus\", html: sanitizeHtml(\"\") }\n\t})\n\n\tconst displayItem: DisplayItem = { title: item.title, contentBlocks }\n\tconst hash = createHash(\"sha256\").update(qtiXml).digest(\"hex\").slice(0, 16)\n\n\treturn { itemKey: hash, item: displayItem, shape }\n}\n","\"use server\"\n\nimport type { DisplayItem, FormShape } from \"../shared/types\"\nimport { buildDisplayModelFromXml } from \"./internal/display\"\n\n/**\n * Parses QTI XML and builds a display model for rendering.\n * This is a server action - call it from the server to keep XML processing secure.\n */\nexport async function buildDisplayModel(qtiXml: string): Promise<{\n\titemKey: string\n\titem: DisplayItem\n\tshape: FormShape\n}> {\n\treturn buildDisplayModelFromXml(qtiXml)\n}\n\n// Re-export the internal function for direct use\nexport { buildDisplayModelFromXml }\n","import * as logger from \"@superbuilders/slog\"\nimport type { AnyCondition, AssessmentItem, BaseRule, ResponseRule } from \"./schema\"\n\n/**\n * Normalizes a string for comparison (trimming and optional case-insensitivity)\n */\nfunction normalizeString(str: string, caseSensitive: boolean): string {\n\tconst s = (str ?? \"\").trim()\n\treturn caseSensitive ? s : s.toLowerCase()\n}\n\n/**\n * Evaluates a condition from the response processing rules against the user's responses.\n */\nfunction checkCondition(\n\tcondition: AnyCondition,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): boolean {\n\t// 1. Recursive Logic (AND / OR / NOT)\n\tif (condition.type === \"and\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst allTrue = results.every((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking AND condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tallTrue\n\t\t})\n\t\treturn allTrue\n\t}\n\n\tif (condition.type === \"or\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst anyTrue = results.some((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking OR condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tanyTrue\n\t\t})\n\t\treturn anyTrue\n\t}\n\n\tif (condition.type === \"not\") {\n\t\tconst result = checkCondition(condition.condition, item, responses, responseResults)\n\t\tlogger.debug(\"qti evaluator: checking NOT condition\", { result, negated: !result })\n\t\treturn !result\n\t}\n\n\t// 2. Standard Match (correctness check)\n\tif (condition.type === \"match\") {\n\t\tconst result = responseResults[condition.variable]\n\t\tlogger.debug(\"qti evaluator: checking match condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\tisCorrect: result,\n\t\t\tmatches: result === true\n\t\t})\n\t\treturn result === true\n\t}\n\n\t// 3. Match Specific Value (hardcoded value check)\n\tif (condition.type === \"matchValue\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking matchValue condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttargetValue: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 4. String Match (text entry with case sensitivity)\n\tif (condition.type === \"stringMatch\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tconst val = Array.isArray(userResponse) ? userResponse[0] : userResponse\n\t\tif (!val) return false\n\n\t\tconst u = normalizeString(String(val), condition.caseSensitive)\n\t\tconst t = normalizeString(condition.value, condition.caseSensitive)\n\t\tconst matches = u === t\n\t\tlogger.debug(\"qti evaluator: checking stringMatch\", {\n\t\t\tvariable: condition.variable,\n\t\t\tcaseSensitive: condition.caseSensitive,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 5. Member (set logic for multi-select checkboxes)\n\tif (condition.type === \"member\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking member\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttarget: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 6. Map Response (scoring logic with epsilon comparison)\n\tif (condition.type === \"equalMapResponse\") {\n\t\tconst responseId = condition.variable\n\t\tconst userResponse = responses[responseId]\n\t\tconst responseDecl = item.responseDeclarations.find((rd) => rd.identifier === responseId)\n\n\t\tif (!userResponse || !responseDecl?.mapping) return false\n\n\t\tconst userValues = Array.isArray(userResponse) ? userResponse : [userResponse]\n\t\tconst valueMap = new Map(responseDecl.mapping.entries.map((e) => [e.key, e.value]))\n\n\t\tlet sum = 0\n\t\tfor (const val of userValues) {\n\t\t\tsum += valueMap.get(val) ?? responseDecl.mapping.defaultValue\n\t\t}\n\n\t\t// Float comparison safety (epsilon check)\n\t\tconst target = Number(condition.value)\n\t\tconst diff = Math.abs(sum - target)\n\t\tconst matches = diff < 0.0001\n\n\t\tlogger.debug(\"qti evaluator: checking equalMapResponse\", {\n\t\t\tresponseId,\n\t\t\tuserValues,\n\t\t\tsum,\n\t\t\ttarget: condition.value,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\treturn false\n}\n\n/**\n * Traverses a single response rule recursively to find matching feedback identifiers\n */\nfunction evaluateRule(\n\trule: ResponseRule,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst feedbackIds: string[] = []\n\n\t// Case 1: Direct Action (unconditional)\n\tif (rule.type === \"action\") {\n\t\tconst action = rule.action\n\t\tif (\n\t\t\taction.type === \"setOutcomeValue\" &&\n\t\t\t(action.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\taction.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\taction.identifier === \"FEEDBACK\")\n\t\t) {\n\t\t\tlogger.debug(\"qti evaluator: executing action\", { id: action.identifier, value: action.value })\n\t\t\tfeedbackIds.push(action.value)\n\t\t}\n\t\treturn feedbackIds\n\t}\n\n\t// Case 2: Condition Block (if/elseif/else)\n\tif (rule.type === \"condition\") {\n\t\t// Iterate through branches and stop at the first match\n\t\tfor (const branch of rule.branches) {\n\t\t\tconst isMatch = branch.condition ? checkCondition(branch.condition, item, responses, responseResults) : true // Else branch (undefined condition) always matches if reached\n\n\t\t\tlogger.debug(\"qti evaluator: evaluating branch\", {\n\t\t\t\thasCondition: !!branch.condition,\n\t\t\t\tisMatch\n\t\t\t})\n\n\t\t\tif (isMatch) {\n\t\t\t\t// Execute actions in this branch\n\t\t\t\tconst feedbackActions = branch.actions.filter(\n\t\t\t\t\t(r: BaseRule) =>\n\t\t\t\t\t\tr.type === \"setOutcomeValue\" &&\n\t\t\t\t\t\t(r.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK\")\n\t\t\t\t)\n\t\t\t\tfor (const action of feedbackActions) {\n\t\t\t\t\tfeedbackIds.push(action.value)\n\t\t\t\t}\n\n\t\t\t\t// Execute nested rules recursively\n\t\t\t\tif (branch.nestedRules) {\n\t\t\t\t\tfor (const nested of branch.nestedRules) {\n\t\t\t\t\t\tconst nestedIds = evaluateRule(nested, item, responses, responseResults)\n\t\t\t\t\t\tfeedbackIds.push(...nestedIds)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CRITICAL: Stop after the first matching branch!\n\t\t\t\t// This prevents 'else' from executing if 'if' matched.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn feedbackIds\n}\n\n/**\n * Traverses the response processing rules to find all matching feedback identifiers.\n */\nexport function evaluateFeedbackIdentifiers(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst processing = item.responseProcessing\n\tif (!processing) {\n\t\tlogger.debug(\"qti evaluator: no response processing found\")\n\t\treturn []\n\t}\n\n\tlogger.debug(\"qti evaluator: starting evaluation\", {\n\t\tnumRules: processing.rules.length,\n\t\tresponseResults\n\t})\n\n\tconst allFeedbackIds: string[] = []\n\n\tfor (const rule of processing.rules) {\n\t\tconst ids = evaluateRule(rule, item, responses, responseResults)\n\t\tallFeedbackIds.push(...ids)\n\t}\n\n\tlogger.debug(\"qti evaluator: selected feedback identifiers\", { feedbackIds: allFeedbackIds })\n\treturn allFeedbackIds\n}\n\n/**\n * Legacy function for backwards compatibility - returns the first matching feedback identifier.\n * @deprecated Use evaluateFeedbackIdentifiers for full feedback support\n */\nexport function evaluateFeedbackIdentifier(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string | undefined {\n\tconst ids = evaluateFeedbackIdentifiers(item, responses, responseResults)\n\treturn ids[0]\n}\n","import \"server-only\"\n\nimport * as errors from \"@superbuilders/errors\"\nimport * as logger from \"@superbuilders/slog\"\n\nimport { evaluateFeedbackIdentifiers } from \"../../evaluator\"\nimport { sanitizeHtml } from \"../../html\"\nimport { parseAssessmentItemXml } from \"../../parser\"\nimport type { ValidateResult } from \"../../shared/types\"\n\nexport function validateResponsesFromXml(qtiXml: string, responses: Record<string, string | string[]>): ValidateResult {\n\tlogger.debug(\"qti validate secure\", {})\n\tconst parseResult = errors.trySync(() => parseAssessmentItemXml(qtiXml))\n\tif (parseResult.error) {\n\t\tlogger.error(\"qti parse failed during validate\", { error: parseResult.error })\n\t\tthrow errors.wrap(parseResult.error, \"qti parse\")\n\t}\n\tconst item = parseResult.data\n\tlogger.debug(\"qti validate: parsed item\", {\n\t\ttitle: item.title,\n\t\tresponseCount: Object.keys(responses).length\n\t})\n\n\tconst perResponse: ValidateResult[\"perResponse\"] = {}\n\tconst selectedChoicesByResponse: ValidateResult[\"selectedChoicesByResponse\"] = {}\n\tconst responseCorrectness: Record<string, boolean> = {} // Track correctness for evaluator\n\n\tlet allCorrect = true\n\tfor (const rd of item.responseDeclarations) {\n\t\tconst respId = rd.identifier\n\t\tconst user = responses[respId]\n\t\tif (user == null) {\n\t\t\tallCorrect = false\n\t\t\tresponseCorrectness[respId] = false // Track as incorrect\n\t\t\tlogger.debug(\"qti validate: missing response\", { responseId: respId })\n\t\t\tcontinue\n\t\t}\n\t\tconst userVals = Array.isArray(user) ? user.filter((v): v is string => typeof v === \"string\") : [user]\n\t\tconst correctVals = rd.correctResponse.values\n\n\t\tlet isCorrect = false\n\n\t\tif (rd.cardinality === \"ordered\") {\n\t\t\t// Strict Array Equality for Order Interaction\n\t\t\t// Both length and specific index positions must match\n\t\t\tisCorrect = userVals.length === correctVals.length && userVals.every((val, index) => val === correctVals[index])\n\t\t\tlogger.debug(\"qti validate: ordered check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVals,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else if (rd.baseType === \"directedPair\" || rd.baseType === \"pair\") {\n\t\t\t// Gap Match Interaction: Set-based comparison of pairs\n\t\t\t// Each pair is \"sourceId gapId\" format - order of pairs doesn't matter\n\t\t\tconst correctSet = new Set(correctVals)\n\t\t\tconst userSet = new Set(userVals)\n\t\t\tisCorrect = userSet.size === correctSet.size && [...userSet].every((v) => correctSet.has(v))\n\t\t\tlogger.debug(\"qti validate: directedPair check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVals,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else if (rd.baseType === \"float\" || rd.baseType === \"integer\") {\n\t\t\t// Numeric comparison: handles \"42\" vs \"42.0\", \"2.62\" vs \"2.620\", etc.\n\t\t\t// This makes System B smarter than System A - we check baseType regardless of XML tag used\n\t\t\tconst userVal = userVals[0]\n\n\t\t\tif (userVal != null) {\n\t\t\t\tconst userNum = Number.parseFloat(userVal)\n\n\t\t\t\tif (!Number.isNaN(userNum)) {\n\t\t\t\t\t// Use epsilon comparison for floats, exact for integers\n\t\t\t\t\tconst epsilon = rd.baseType === \"float\" ? 0.000001 : 0\n\n\t\t\t\t\t// Check if user's answer matches ANY of the correct values\n\t\t\t\t\t// This handles cases like: <qti-value>42</qti-value><qti-value>42.0</qti-value>\n\t\t\t\t\tisCorrect = correctVals.some((correctVal) => {\n\t\t\t\t\t\tconst correctNum = Number.parseFloat(correctVal)\n\t\t\t\t\t\treturn !Number.isNaN(correctNum) && Math.abs(userNum - correctNum) <= epsilon\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.debug(\"qti validate: numeric check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tbaseType: rd.baseType,\n\t\t\t\tuserVal: userVals[0],\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else if (rd.cardinality === \"single\") {\n\t\t\t// Single cardinality with potentially multiple acceptable answers\n\t\t\t// User's single answer must match ANY of the correct values\n\t\t\t// Example: \"USA\", \"U.S.A.\", \"United States\" are all acceptable\n\t\t\tconst userVal = userVals[0]\n\t\t\tisCorrect = userVal != null && correctVals.includes(userVal)\n\n\t\t\tlogger.debug(\"qti validate: single cardinality check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVal,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else {\n\t\t\t// Multiple cardinality: user must select ALL correct values (set equality)\n\t\t\tconst correctSet = new Set(correctVals)\n\t\t\tconst userSet = new Set(userVals)\n\t\t\tisCorrect = userSet.size === correctSet.size && [...userSet].every((v) => correctSet.has(v))\n\n\t\t\tlogger.debug(\"qti validate: multiple cardinality check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVals,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t}\n\n\t\tif (!isCorrect) allCorrect = false\n\t\tresponseCorrectness[respId] = isCorrect // Store for evaluator\n\t\tlogger.debug(\"qti validate: evaluated response\", {\n\t\t\tresponseId: respId,\n\t\t\tselected: userVals,\n\t\t\tisCorrect\n\t\t})\n\n\t\tconst correctSet = new Set(correctVals)\n\t\tselectedChoicesByResponse[respId] = userVals.map((id) => ({ id, isCorrect: correctSet.has(id) }))\n\n\t\t// Per-response feedback is now handled by the overall feedback logic.\n\t\tperResponse[respId] = { isCorrect }\n\t}\n\n\t// Use the evaluator to determine ALL feedback identifiers (FEEDBACK__OVERALL, FEEDBACK__PEDAGOGY, etc.)\n\tconst feedbackIdentifiers = evaluateFeedbackIdentifiers(item, responses, responseCorrectness)\n\tlet overallFeedback: ValidateResult[\"overallFeedback\"]\n\n\tif (feedbackIdentifiers.length > 0) {\n\t\t// Collect all matching feedback blocks and combine their HTML\n\t\tconst feedbackHtmlParts: string[] = []\n\t\tfor (const feedbackId of feedbackIdentifiers) {\n\t\t\tconst feedbackBlock = item.itemBody.feedbackBlocks.find((fb) => fb.identifier === feedbackId)\n\t\t\tif (feedbackBlock) {\n\t\t\t\tfeedbackHtmlParts.push(sanitizeHtml(feedbackBlock.contentHtml))\n\t\t\t}\n\t\t}\n\n\t\tif (feedbackHtmlParts.length > 0) {\n\t\t\toverallFeedback = {\n\t\t\t\tisCorrect: allCorrect,\n\t\t\t\tmessageHtml: feedbackHtmlParts.join(\"\")\n\t\t\t}\n\t\t\tlogger.debug(\"qti validate: overall feedback via response processing rules\", {\n\t\t\t\tisCorrect: allCorrect,\n\t\t\t\tfeedbackIds: feedbackIdentifiers,\n\t\t\t\tnumBlocks: feedbackHtmlParts.length\n\t\t\t})\n\t\t}\n\t} else {\n\t\t// Fallback for simple items without complex processing rules\n\t\tconst targetId = allCorrect ? \"CORRECT\" : \"INCORRECT\"\n\t\tconst fallbackBlock = item.itemBody.feedbackBlocks.find(\n\t\t\t(fb) =>\n\t\t\t\tfb.identifier.toUpperCase() === targetId &&\n\t\t\t\t(fb.outcomeIdentifier === \"FEEDBACK\" || fb.outcomeIdentifier === \"FEEDBACK__OVERALL\")\n\t\t)\n\t\tif (fallbackBlock) {\n\t\t\toverallFeedback = { isCorrect: allCorrect, messageHtml: sanitizeHtml(fallbackBlock.contentHtml) }\n\t\t\tlogger.debug(\"qti validate: overall feedback via fallback block\", {\n\t\t\t\tisCorrect: allCorrect,\n\t\t\t\tblockId: fallbackBlock.identifier\n\t\t\t})\n\t\t}\n\t}\n\n\treturn { overallCorrect: allCorrect, perResponse, selectedChoicesByResponse, overallFeedback }\n}\n","\"use server\"\n\nimport type { ValidateResult } from \"../shared/types\"\nimport { validateResponsesFromXml } from \"./internal/validate\"\n\n/**\n * Validates user responses against the QTI XML.\n * This is a server action - call it from the server to keep correct answers secure.\n */\nexport async function validateResponsesSecure(\n\tqtiXml: string,\n\tresponses: Record<string, string | string[]>\n): Promise<ValidateResult> {\n\treturn validateResponsesFromXml(qtiXml, responses)\n}\n\n// Re-export the internal function for direct use\nexport { validateResponsesFromXml }\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/html/sanitize.ts","../../src/html/serialize.ts","../../src/schema.ts","../../src/parser.ts","../../src/actions/internal/display.ts","../../src/actions/build.ts","../../src/evaluator.ts","../../src/actions/internal/validate.ts","../../src/actions/validate.ts"],"names":["logger","errors2","logger3","errors3","correctSet"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration for HTML sanitization.\n * Defines allowed tags and attributes for safe rendering.\n */\ninterface SanitizeConfig {\n\tallowedTags: Set<string>\n\tallowedAttributes: Record<string, Set<string>>\n\tallowDataAttributes: boolean\n\tallowMathML: boolean\n}\n\n/**\n * Default configuration for QTI content sanitization.\n * Allows common HTML tags and MathML for mathematical expressions.\n */\nconst DEFAULT_CONFIG: SanitizeConfig = {\n\t// HTML content tags\n\tallowedTags: new Set([\n\t\t// Text content\n\t\t\"p\",\n\t\t\"span\",\n\t\t\"div\",\n\t\t\"br\",\n\t\t\"hr\",\n\t\t// Formatting\n\t\t\"b\",\n\t\t\"i\",\n\t\t\"u\",\n\t\t\"strong\",\n\t\t\"em\",\n\t\t\"mark\",\n\t\t\"small\",\n\t\t\"sub\",\n\t\t\"sup\",\n\t\t\"code\",\n\t\t\"pre\",\n\t\t\"kbd\",\n\t\t// Lists\n\t\t\"ul\",\n\t\t\"ol\",\n\t\t\"li\",\n\t\t\"dl\",\n\t\t\"dt\",\n\t\t\"dd\",\n\t\t// Tables\n\t\t\"table\",\n\t\t\"thead\",\n\t\t\"tbody\",\n\t\t\"tfoot\",\n\t\t\"tr\",\n\t\t\"th\",\n\t\t\"td\",\n\t\t\"caption\",\n\t\t\"colgroup\",\n\t\t\"col\",\n\t\t// Media\n\t\t\"img\",\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t// Semantic\n\t\t\"article\",\n\t\t\"section\",\n\t\t\"nav\",\n\t\t\"aside\",\n\t\t\"header\",\n\t\t\"footer\",\n\t\t\"main\",\n\t\t\"figure\",\n\t\t\"figcaption\",\n\t\t\"blockquote\",\n\t\t\"cite\",\n\t\t// Links\n\t\t\"a\",\n\t\t// Forms (for future interactive elements)\n\t\t\"label\",\n\t\t\"button\"\n\t]),\n\n\tallowedAttributes: {\n\t\t// Global attributes\n\t\t\"*\": new Set([\"class\", \"id\", \"lang\", \"dir\", \"title\", \"style\"]),\n\t\t// Specific attributes\n\t\timg: new Set([\"src\", \"alt\", \"width\", \"height\", \"style\"]),\n\t\ta: new Set([\"href\", \"target\", \"rel\"]),\n\t\taudio: new Set([\"src\", \"controls\", \"loop\", \"muted\"]),\n\t\tvideo: new Set([\"src\", \"controls\", \"loop\", \"muted\", \"width\", \"height\", \"poster\"]),\n\t\tsource: new Set([\"src\", \"type\"]),\n\t\ttrack: new Set([\"src\", \"kind\", \"srclang\", \"label\"])\n\t},\n\n\tallowDataAttributes: false,\n\tallowMathML: true\n}\n\n/**\n * MathML elements that are allowed for mathematical expressions.\n * Based on MathML 3.0 specification.\n */\nconst MATHML_TAGS = new Set([\n\t// Root\n\t\"math\",\n\t// Token elements\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"mtext\",\n\t\"mspace\",\n\t\"ms\",\n\t// Layout\n\t\"mrow\",\n\t\"mfrac\",\n\t\"msqrt\",\n\t\"mroot\",\n\t\"mstyle\",\n\t\"merror\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mfenced\",\n\t\"menclose\",\n\t// Scripts and limits\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"munder\",\n\t\"mover\",\n\t\"munderover\",\n\t\"mmultiscripts\",\n\t\"mprescripts\",\n\t\"none\",\n\t// Tables\n\t\"mtable\",\n\t\"mtr\",\n\t\"mtd\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t// Elementary math\n\t\"mstack\",\n\t\"mlongdiv\",\n\t\"msgroup\",\n\t\"msrow\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msline\",\n\t// Semantic\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\"\n])\n\n/**\n * MathML attributes that are allowed.\n */\nconst _MATHML_ATTRIBUTES = new Set([\n\t// Global MathML attributes\n\t\"id\",\n\t\"class\",\n\t\"style\",\n\t\"href\",\n\t\"mathcolor\",\n\t\"mathbackground\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"dir\",\n\t// Display\n\t\"display\",\n\t\"displaystyle\",\n\t\"scriptlevel\",\n\t// Spacing\n\t\"width\",\n\t\"height\",\n\t\"depth\",\n\t\"lspace\",\n\t\"rspace\",\n\t\"voffset\",\n\t// Fractions\n\t\"linethickness\",\n\t\"numalign\",\n\t\"denomalign\",\n\t\"bevelled\",\n\t// Roots\n\t\"index\",\n\t// Tables\n\t\"align\",\n\t\"rowalign\",\n\t\"columnalign\",\n\t\"groupalign\",\n\t\"alignmentscope\",\n\t\"columnwidth\",\n\t\"rowspacing\",\n\t\"columnspacing\",\n\t\"rowlines\",\n\t\"columnlines\",\n\t\"frame\",\n\t// Fences\n\t\"open\",\n\t\"close\",\n\t\"separators\",\n\t// Operators\n\t\"form\",\n\t\"fence\",\n\t\"separator\",\n\t\"stretchy\",\n\t\"symmetric\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"largeop\",\n\t\"movablelimits\",\n\t\"accent\",\n\t// Semantic\n\t\"encoding\",\n\t\"definitionURL\"\n])\n\n/**\n * Sanitizes HTML content to prevent XSS attacks.\n * Preserves MathML for mathematical expressions.\n */\nexport function sanitizeHtml(html: string, config: Partial<SanitizeConfig> = {}): string {\n\tconst cfg = { ...DEFAULT_CONFIG, ...config }\n\n\t// Basic XSS prevention patterns\n\tconst dangerousPatterns = [\n\t\t/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\t\t/javascript:/gi,\n\t\t/on\\w+\\s*=/gi, // Event handlers\n\t\t/<iframe\\b/gi,\n\t\t/<embed\\b/gi,\n\t\t/<object\\b/gi,\n\t\t/data:text\\/html/gi\n\t]\n\n\tlet sanitized = html\n\tfor (const pattern of dangerousPatterns) {\n\t\tsanitized = sanitized.replace(pattern, \"\")\n\t}\n\n\t// Parse and rebuild with allowed tags/attributes\n\tconst cleaned = cleanHtml(sanitized, cfg)\n\n\treturn cleaned\n}\n\n/**\n * Performs deep cleaning of HTML by parsing and rebuilding with only allowed elements.\n * Note: This is a simplified regex-based implementation for Node.js environments.\n * In production with browser support, consider using DOMPurify.\n */\nfunction cleanHtml(html: string, config: SanitizeConfig): string {\n\t// For Node.js environment, we use a regex-based approach\n\t// This is less robust than DOM-based cleaning but works in all environments\n\n\tlet cleaned = html\n\n\t// Remove all tags that aren't in the allowlist\n\tconst tagPattern = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g\n\tcleaned = cleaned.replace(tagPattern, (match, tagName, _attrs) => {\n\t\tconst tag = tagName.toLowerCase()\n\t\tconst isMathML = tag === \"math\" || cleaned.includes(\"<math\")\n\n\t\tif (isMathML && config.allowMathML && MATHML_TAGS.has(tag)) {\n\t\t\treturn match // Keep MathML tags\n\t\t}\n\t\tif (config.allowedTags.has(tag)) {\n\t\t\t// Clean attributes for allowed tags\n\t\t\treturn cleanAttributesString(match, tag, config)\n\t\t}\n\n\t\treturn \"\" // Remove disallowed tags\n\t})\n\n\treturn cleaned\n}\n\n/**\n * Cleans attributes from an HTML tag string.\n */\nfunction cleanAttributesString(tagString: string, tagName: string, config: SanitizeConfig): string {\n\tconst attrPattern = /\\s+([a-zA-Z][a-zA-Z0-9-:]*)(?:=\"([^\"]*)\"|'([^']*)'|=([^\\s>]+)|(?=\\s|>))/g\n\n\tlet cleanedTag = `<${tagString.startsWith(\"</\") ? \"/\" : \"\"}${tagName}`\n\n\tlet match = attrPattern.exec(tagString)\n\twhile (match !== null) {\n\t\tconst attrName = (match[1] || \"\").toLowerCase()\n\t\tconst attrValue = match[2] || match[3] || match[4] || \"\"\n\n\t\t// Check if attribute is allowed\n\t\tconst globalAttrs = config.allowedAttributes[\"*\"] || new Set()\n\t\tconst tagAttrs = config.allowedAttributes[tagName] || new Set()\n\n\t\tlet isAllowed = globalAttrs.has(attrName) || tagAttrs.has(attrName)\n\n\t\t// For <img>, strip size/style attributes to prevent stretched images\n\t\tif (tagName === \"img\" && (attrName === \"width\" || attrName === \"height\" || attrName === \"style\")) {\n\t\t\tisAllowed = false\n\t\t}\n\n\t\t// Check data attributes\n\t\tif (!isAllowed && config.allowDataAttributes && attrName.startsWith(\"data-\")) {\n\t\t\tisAllowed = true\n\t\t}\n\n\t\t// Check for dangerous values\n\t\tif (isAllowed && !isDangerousAttributeValue(attrName, attrValue)) {\n\t\t\tcleanedTag += ` ${attrName}=\"${attrValue.replace(/\"/g, \""\")}\"`\n\t\t}\n\n\t\tmatch = attrPattern.exec(tagString)\n\t}\n\n\tcleanedTag += \">\"\n\treturn cleanedTag\n}\n\n/**\n * Checks if an attribute value contains potentially dangerous content.\n */\nfunction isDangerousAttributeValue(name: string, value: string): boolean {\n\tconst valueLower = value.toLowerCase().trim()\n\n\t// Check for javascript: protocol\n\tif (name === \"href\" || name === \"src\") {\n\t\tif (valueLower.startsWith(\"javascript:\") || valueLower.startsWith(\"data:text/html\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check for event handlers in values (some old XSS techniques)\n\tif (valueLower.includes(\"javascript:\") || valueLower.includes(\"onerror=\")) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Sanitizes HTML for safe display, with automatic MathML detection.\n */\nexport function sanitizeForDisplay(html: string): string {\n\t// Auto-detect if content has MathML\n\tconst hasMathML = html.toLowerCase().includes(\"<math\")\n\n\treturn sanitizeHtml(html, {\n\t\tallowMathML: hasMathML,\n\t\tallowDataAttributes: true\n\t})\n}\n","import type { NormalizedNode } from \"../parser\"\n\n/**\n * Serializes an array of nodes (useful for contentBlocks).\n */\nexport function serializeNodes(nodes: Array<NormalizedNode | string>): string {\n\treturn nodes\n\t\t.map((node) => {\n\t\t\tif (typeof node === \"string\") {\n\t\t\t\treturn escapeHtml(node)\n\t\t\t}\n\t\t\treturn serializeNode(node)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes the inner content of a node (its children) to an HTML string.\n * Preserves MathML and other XML content verbatim.\n */\nexport function serializeInner(node: NormalizedNode): string {\n\treturn node.children\n\t\t.map((child: NormalizedNode | string) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\treturn serializeNode(child)\n\t\t})\n\t\t.join(\"\")\n}\n\n/**\n * Serializes a complete node including its tag and attributes.\n * Critical for preserving MathML structure exactly as authored.\n */\nexport function serializeNode(node: NormalizedNode): string {\n\t// Self-closing tags\n\tconst selfClosing = [\"br\", \"hr\", \"img\", \"input\", \"meta\", \"link\"]\n\tconst tagName = stripQtiPrefix(node.tagName)\n\n\t// Preserve MathML elements verbatim without QTI processing\n\tif (tagName === \"math\" || isMathMLElement(tagName)) {\n\t\treturn serializeVerbatim(node)\n\t}\n\n\tconst attrs = serializeAttributes(node.attrs)\n\tconst attrString = attrs ? ` ${attrs}` : \"\"\n\n\tif (selfClosing.includes(tagName) && node.children.length === 0) {\n\t\treturn `<${tagName}${attrString} />`\n\t}\n\n\tconst inner = serializeInner(node)\n\treturn `<${tagName}${attrString}>${inner}</${tagName}>`\n}\n\n/**\n * Detects whether content contains MathML elements.\n * Used to determine appropriate rendering and sanitization strategies.\n */\nexport function detectContentType(html: string): \"mathml\" | \"html\" {\n\t// Quick heuristic: check for common MathML elements\n\tconst mathmlIndicators = [\"<math\", \"<mrow\", \"<msup\", \"<msub\", \"<mfrac\", \"<msqrt\", \"<mi>\", \"<mo>\", \"<mn>\", \"<mtext\"]\n\n\tconst normalized = html.toLowerCase()\n\tfor (const indicator of mathmlIndicators) {\n\t\tif (normalized.includes(indicator)) {\n\t\t\treturn \"mathml\"\n\t\t}\n\t}\n\n\treturn \"html\"\n}\n\n/**\n * Strips QTI namespace prefixes from tag names.\n * Converts \"qti-choice-interaction\" to \"div\" or similar HTML equivalent.\n * Preserves MathML and standard HTML tags unchanged.\n */\nfunction stripQtiPrefix(tagName: string): string {\n\t// Map QTI elements to semantic HTML equivalents\n\tconst qtiToHtml: Record<string, string> = {\n\t\t\"qti-item-body\": \"div\",\n\t\t\"qti-choice-interaction\": \"div\",\n\t\t\"qti-simple-choice\": \"div\",\n\t\t\"qti-feedback-block\": \"div\",\n\t\t\"qti-content-body\": \"div\",\n\t\t\"qti-prompt\": \"div\",\n\t\t\"qti-value\": \"span\",\n\t\t\"qti-variable\": \"span\",\n\t\t\"qti-correct-response\": \"div\"\n\t}\n\n\tif (qtiToHtml[tagName]) {\n\t\treturn qtiToHtml[tagName]\n\t}\n\n\t// Strip \"qti-\" prefix for unknown QTI elements\n\tif (tagName.startsWith(\"qti-\")) {\n\t\treturn tagName.slice(4)\n\t}\n\n\t// Preserve MathML and HTML tags as-is\n\treturn tagName\n}\n\n/**\n * Serializes node attributes to an HTML attribute string.\n * Filters out QTI-specific attributes that shouldn't appear in rendered HTML.\n */\nfunction serializeAttributes(attrs: Record<string, unknown>): string {\n\t// Attributes to exclude from HTML output\n\tconst excludeAttrs = [\n\t\t\"identifier\",\n\t\t\"response-identifier\",\n\t\t\"shuffle\",\n\t\t\"max-choices\",\n\t\t\"min-choices\",\n\t\t\"cardinality\",\n\t\t\"base-type\",\n\t\t\"outcome-identifier\",\n\t\t\"show-hide\",\n\t\t\"time-dependent\",\n\t\t\"adaptive\",\n\t\t\"xml-lang\"\n\t]\n\n\tconst parts: string[] = []\n\n\tfor (const [key, value] of Object.entries(attrs)) {\n\t\tif (excludeAttrs.includes(key)) continue\n\t\tif (value == null) continue\n\n\t\t// Convert kebab-case QTI attrs to camelCase where appropriate\n\t\tconst htmlKey = key === \"xml:lang\" ? \"lang\" : key\n\t\tconst escapedValue = escapeHtml(String(value))\n\t\tparts.push(`${htmlKey}=\"${escapedValue}\"`)\n\t}\n\n\treturn parts.join(\" \")\n}\n\n/**\n * Escapes HTML special characters to prevent XSS.\n * Used for text content, not for preserving markup.\n */\nfunction escapeHtml(text: string): string {\n\tconst escapeMap: Record<string, string> = {\n\t\t\"&\": \"&\",\n\t\t\"<\": \"<\",\n\t\t\">\": \">\",\n\t\t'\"': \""\",\n\t\t\"'\": \"'\"\n\t}\n\n\treturn text.replace(/[&<>\"']/g, (char) => escapeMap[char] || char)\n}\n\n/**\n * Checks if a tag name is a MathML element.\n */\nfunction isMathMLElement(tagName: string): boolean {\n\tconst mathMLTags = [\n\t\t\"mi\",\n\t\t\"mn\",\n\t\t\"mo\",\n\t\t\"mtext\",\n\t\t\"mspace\",\n\t\t\"ms\",\n\t\t\"mrow\",\n\t\t\"mfrac\",\n\t\t\"msqrt\",\n\t\t\"mroot\",\n\t\t\"mstyle\",\n\t\t\"msub\",\n\t\t\"msup\",\n\t\t\"msubsup\",\n\t\t\"munder\",\n\t\t\"mover\",\n\t\t\"munderover\",\n\t\t\"mtable\",\n\t\t\"mtr\",\n\t\t\"mtd\"\n\t]\n\treturn mathMLTags.includes(tagName)\n}\n\n/**\n * Serializes MathML nodes verbatim to preserve exact structure.\n * Does not apply QTI transformations or attribute filtering.\n */\nfunction serializeVerbatim(node: NormalizedNode): string {\n\tconst attrs = Object.entries(node.attrs)\n\t\t.map(([key, value]) => {\n\t\t\tif (value == null) return \"\"\n\t\t\treturn ` ${key}=\"${String(value).replace(/\"/g, \""\")}\"`\n\t\t})\n\t\t.join(\"\")\n\n\tif (node.children.length === 0) {\n\t\treturn `<${node.tagName}${attrs} />`\n\t}\n\n\tconst inner = node.children\n\t\t.map((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\treturn escapeHtml(child)\n\t\t\t}\n\t\t\t// Recursively serialize MathML children verbatim\n\t\t\treturn serializeVerbatim(child)\n\t\t})\n\t\t.join(\"\")\n\n\treturn `<${node.tagName}${attrs}>${inner}</${node.tagName}>`\n}\n","import { z } from \"zod\"\n\n// Basic enums derived from the XML\nexport const QtiCardinalitySchema = z.enum([\"single\", \"multiple\", \"ordered\"]) // seen: single, multiple, ordered\nexport const QtiBaseTypeSchema = z.enum([\"identifier\", \"string\", \"float\", \"integer\", \"boolean\", \"directedPair\", \"pair\"]) // seen: identifier, float, directedPair\n\n// SimpleChoice: <qti-simple-choice identifier=\"A\"> ... inner XHTML/MathML ... </qti-simple-choice>\nexport const SimpleChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(), // Allows \"\" for empty or image-only content\n\tinlineFeedbackHtml: z.string().optional() // Optional per-choice feedback (qti-feedback-inline)\n})\nexport type SimpleChoice = z.infer<typeof SimpleChoiceSchema>\n\n// InlineChoice: <qti-inline-choice identifier=\"ID\"> ... inner XHTML/MathML ... </qti-inline-choice>\nexport const InlineChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string()\n})\nexport type InlineChoice = z.infer<typeof InlineChoiceSchema>\n\n// ChoiceInteraction: <qti-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" min-choices=\"1\" max-choices=\"1\"> ...\nexport const ChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(1),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\n\n// Extensible discriminated union for interactions\nexport const ChoiceInteractionSchema = ChoiceInteractionCoreSchema.extend({ type: z.literal(\"choiceInteraction\") })\nexport type ChoiceInteraction = z.infer<typeof ChoiceInteractionSchema>\n\n// InlineChoiceInteraction: <qti-inline-choice-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const InlineChoiceInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tchoices: z.array(InlineChoiceSchema).min(1)\n})\nexport const InlineChoiceInteractionSchema = InlineChoiceInteractionCoreSchema.extend({\n\ttype: z.literal(\"inlineChoiceInteraction\")\n})\nexport type InlineChoiceInteraction = z.infer<typeof InlineChoiceInteractionSchema>\n\n// TextEntryInteraction: <qti-text-entry-interaction response-identifier=\"RESPONSE\" expected-length=\"15\" ...> ...\nexport const TextEntryInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\texpectedLength: z.number().int().min(0).optional(),\n\tplaceholderText: z.string().optional(),\n\tpatternMask: z.string().optional()\n})\nexport const TextEntryInteractionSchema = TextEntryInteractionCoreSchema.extend({\n\ttype: z.literal(\"textEntryInteraction\")\n})\nexport type TextEntryInteraction = z.infer<typeof TextEntryInteractionSchema>\n\n// OrderInteraction: <qti-order-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" orientation=\"vertical\"> ...\nexport const OrderInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tminChoices: z.number().int().min(0),\n\tmaxChoices: z.number().int().min(0).optional(), // 0 or undefined usually means \"all\"\n\torientation: z.enum([\"vertical\", \"horizontal\"]),\n\tpromptHtml: z.string(),\n\tchoices: z.array(SimpleChoiceSchema).min(1)\n})\nexport const OrderInteractionSchema = OrderInteractionCoreSchema.extend({\n\ttype: z.literal(\"orderInteraction\")\n})\nexport type OrderInteraction = z.infer<typeof OrderInteractionSchema>\n\n// GapText: <qti-gap-text identifier=\"A\" match-max=\"1\"> ... content ... </qti-gap-text>\nexport const GapTextSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcontentHtml: z.string(),\n\tmatchMax: z.number().int().min(0) // 0 = unlimited\n})\nexport type GapText = z.infer<typeof GapTextSchema>\n\n// Gap: <qti-gap identifier=\"G1\" /> - the drop target placeholder\nexport const GapSchema = z.object({\n\tidentifier: z.string().min(1)\n})\nexport type Gap = z.infer<typeof GapSchema>\n\n// GapMatchInteraction: <qti-gap-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\"> ...\nexport const GapMatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tgapTexts: z.array(GapTextSchema).min(1), // Draggable source tokens\n\tgaps: z.array(GapSchema).min(1), // Drop target placeholders\n\tcontentHtml: z.string() // HTML content with gap placeholders\n})\nexport const GapMatchInteractionSchema = GapMatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"gapMatchInteraction\")\n})\nexport type GapMatchInteraction = z.infer<typeof GapMatchInteractionSchema>\n\n// AssociableChoice: <qti-simple-associable-choice identifier=\"A\" match-max=\"1\"> ... </qti-simple-associable-choice>\nexport const AssociableChoiceSchema = z.object({\n\tidentifier: z.string().min(1),\n\tmatchMax: z.number().int().min(0), // 0 = unlimited uses\n\tcontentHtml: z.string()\n})\nexport type AssociableChoice = z.infer<typeof AssociableChoiceSchema>\n\n// MatchInteraction: <qti-match-interaction response-identifier=\"RESPONSE\" shuffle=\"true\" max-associations=\"4\"> ...\nexport const MatchInteractionCoreSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tshuffle: z.boolean(),\n\tmaxAssociations: z.number().int().min(0), // 0 = unlimited total associations\n\tsourceChoices: z.array(AssociableChoiceSchema).min(1), // First <qti-simple-match-set>\n\ttargetChoices: z.array(AssociableChoiceSchema).min(1), // Second <qti-simple-match-set>\n\tpromptHtml: z.string()\n})\nexport const MatchInteractionSchema = MatchInteractionCoreSchema.extend({\n\ttype: z.literal(\"matchInteraction\")\n})\nexport type MatchInteraction = z.infer<typeof MatchInteractionSchema>\n\nexport const AnyInteractionSchema = z.discriminatedUnion(\"type\", [\n\tChoiceInteractionSchema,\n\tInlineChoiceInteractionSchema,\n\tTextEntryInteractionSchema,\n\tOrderInteractionSchema,\n\tGapMatchInteractionSchema,\n\tMatchInteractionSchema\n])\nexport type AnyInteraction = z.infer<typeof AnyInteractionSchema>\n\n// CorrectResponse inside ResponseDeclaration\nexport const CorrectResponseSchema = z.object({\n\tvalues: z.array(z.string().min(1)).min(1)\n})\nexport type CorrectResponse = z.infer<typeof CorrectResponseSchema>\n\n// ResponseDeclaration\nexport const ResponseDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tcorrectResponse: CorrectResponseSchema,\n\t// Optional response mapping for map-response processing (used for summed feedback/score)\n\tmapping: z\n\t\t.object({\n\t\t\tdefaultValue: z.number().default(0),\n\t\t\tlowerBound: z.number().optional(),\n\t\t\tupperBound: z.number().optional(),\n\t\t\tentries: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tkey: z.string().min(1),\n\t\t\t\t\tvalue: z.number()\n\t\t\t\t})\n\t\t\t)\n\t\t})\n\t\t.optional()\n})\nexport type ResponseDeclaration = z.infer<typeof ResponseDeclarationSchema>\n\n// OutcomeDeclaration\nexport const OutcomeDefaultValueSchema = z.object({\n\tvalue: z.string()\n})\nexport type OutcomeDefaultValue = z.infer<typeof OutcomeDefaultValueSchema>\n\nexport const OutcomeDeclarationSchema = z.object({\n\tidentifier: z.string().min(1),\n\tcardinality: QtiCardinalitySchema,\n\tbaseType: QtiBaseTypeSchema,\n\tdefaultValue: OutcomeDefaultValueSchema.optional()\n})\nexport type OutcomeDeclaration = z.infer<typeof OutcomeDeclarationSchema>\n\n// Feedback blocks\nexport const FeedbackBlockSchema = z.object({\n\toutcomeIdentifier: z.string().min(1),\n\tidentifier: z.string().min(1),\n\tshowHide: z.enum([\"show\", \"hide\"]).default(\"show\"),\n\tcontentHtml: z.string()\n})\nexport type FeedbackBlock = z.infer<typeof FeedbackBlockSchema>\n\n// ItemBody as typed content blocks + feedback blocks\nconst StimulusBlockSchema = z.object({\n\ttype: z.literal(\"stimulus\"),\n\thtml: z.string()\n})\n\n// RichStimulus: HTML with inline embeds map keyed by responseIdentifier\nexport const RichStimulusBlockSchema = z.object({\n\ttype: z.literal(\"richStimulus\"),\n\thtml: z.string(),\n\tinlineEmbeds: z.record(z.string(), InlineChoiceInteractionSchema),\n\ttextEmbeds: z.record(z.string(), TextEntryInteractionSchema)\n})\nexport type RichStimulusBlock = z.infer<typeof RichStimulusBlockSchema>\n\nconst InteractionBlockSchema = z.object({\n\ttype: z.literal(\"interaction\"),\n\tinteraction: AnyInteractionSchema\n})\n\nexport const ItemBodySchema = z.object({\n\tcontentBlocks: z.array(z.union([StimulusBlockSchema, RichStimulusBlockSchema, InteractionBlockSchema])).min(1),\n\tfeedbackBlocks: z.array(FeedbackBlockSchema)\n})\nexport type ItemBody = z.infer<typeof ItemBodySchema>\n\n// Response processing: Define schemas for the Response Processing AST\nconst BaseRuleSchema = z.object({\n\ttype: z.literal(\"setOutcomeValue\"),\n\tidentifier: z.string(),\n\tvalue: z.string()\n})\nexport type BaseRule = z.infer<typeof BaseRuleSchema>\n\nconst MatchConditionSchema = z.object({\n\ttype: z.literal(\"match\"),\n\tvariable: z.string(),\n\tcorrect: z.literal(true) // Match against correct response\n})\nexport type MatchCondition = z.infer<typeof MatchConditionSchema>\n\n// NEW: Schema for matching against a specific value (e.g., <qti-match> with <qti-base-value>)\nconst MatchValueConditionSchema = z.object({\n\ttype: z.literal(\"matchValue\"),\n\tvariable: z.string(), // The response identifier from <qti-variable>\n\tvalue: z.string() // The target value from <qti-base-value>\n})\nexport type MatchValueCondition = z.infer<typeof MatchValueConditionSchema>\n\n// Schema for string matching (text entry with case sensitivity)\nconst StringMatchConditionSchema = z.object({\n\ttype: z.literal(\"stringMatch\"),\n\tvariable: z.string(),\n\tvalue: z.string(),\n\tcaseSensitive: z.boolean()\n})\nexport type StringMatchCondition = z.infer<typeof StringMatchConditionSchema>\n\n// Schema for member checking (multi-select subset logic)\nconst MemberConditionSchema = z.object({\n\ttype: z.literal(\"member\"),\n\tvariable: z.string(),\n\tvalue: z.string()\n})\nexport type MemberCondition = z.infer<typeof MemberConditionSchema>\n\n// Schema for the map-response-equal condition\nconst EqualMapResponseConditionSchema = z.object({\n\ttype: z.literal(\"equalMapResponse\"),\n\tvariable: z.string(), // The response identifier from <qti-map-response>\n\tvalue: z.string() // The target sum value from <qti-base-value>\n})\nexport type EqualMapResponseCondition = z.infer<typeof EqualMapResponseConditionSchema>\n\n// Define types first for recursive schemas\nexport type AndCondition = {\n\ttype: \"and\"\n\tconditions: AnyCondition[]\n}\n\nexport type OrCondition = {\n\ttype: \"or\"\n\tconditions: AnyCondition[]\n}\n\nexport type NotCondition = {\n\ttype: \"not\"\n\tcondition: AnyCondition\n}\n\nexport type AnyCondition =\n\t| MatchCondition\n\t| MatchValueCondition\n\t| StringMatchCondition\n\t| MemberCondition\n\t| AndCondition\n\t| OrCondition\n\t| NotCondition\n\t| EqualMapResponseCondition\n\n// Then define schemas using the types\nconst AndConditionSchema: z.ZodType<AndCondition> = z.object({\n\ttype: z.literal(\"and\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst OrConditionSchema: z.ZodType<OrCondition> = z.object({\n\ttype: z.literal(\"or\"),\n\tconditions: z.array(z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema))\n})\n\nconst NotConditionSchema: z.ZodType<NotCondition> = z.object({\n\ttype: z.literal(\"not\"),\n\tcondition: z.lazy((): z.ZodType<AnyCondition> => AnyConditionSchema)\n})\n\n// Union of all condition types\nconst AnyConditionSchema: z.ZodType<AnyCondition> = z.union([\n\tMatchConditionSchema,\n\tMatchValueConditionSchema,\n\tStringMatchConditionSchema,\n\tMemberConditionSchema,\n\tz.lazy((): z.ZodType<AndCondition> => AndConditionSchema),\n\tz.lazy((): z.ZodType<OrCondition> => OrConditionSchema),\n\tz.lazy((): z.ZodType<NotCondition> => NotConditionSchema),\n\tEqualMapResponseConditionSchema\n])\n\n// --- NEW STRUCTURE FOR PROCESSING RULES ---\n\n// A single branch (if, else-if, else)\nexport type ConditionBranch = {\n\tcondition?: AnyCondition // undefined for 'else'\n\tactions: BaseRule[]\n\tnestedRules?: ResponseRule[] // Recursive: nested rules inside a branch\n}\n\n// Zod schema for a branch\nexport const ConditionBranchSchema: z.ZodType<ConditionBranch> = z.object({\n\tcondition: AnyConditionSchema.optional(),\n\tactions: z.array(BaseRuleSchema),\n\tnestedRules: z.array(z.lazy((): z.ZodType<ResponseRule> => ResponseRuleSchema)).optional()\n})\n\n// The main ResponseRule type (either a condition block or a direct action)\nexport type ResponseRule = { type: \"condition\"; branches: ConditionBranch[] } | { type: \"action\"; action: BaseRule }\n\n// Zod schema for ResponseRule\nexport const ResponseRuleSchema: z.ZodType<ResponseRule> = z.union([\n\tz.object({\n\t\ttype: z.literal(\"condition\"),\n\t\tbranches: z.array(ConditionBranchSchema)\n\t}),\n\tz.object({\n\t\ttype: z.literal(\"action\"),\n\t\taction: BaseRuleSchema\n\t})\n])\n\n// Response processing: scoring\nexport const ScoringRuleSchema = z.object({\n\tresponseIdentifier: z.string().min(1),\n\tcorrectScore: z.number(),\n\tincorrectScore: z.number()\n})\nexport type ScoringRule = z.infer<typeof ScoringRuleSchema>\n\n// UPDATED: The primary ResponseProcessingSchema now uses the AST directly\nexport const ResponseProcessingSchema = z.object({\n\trules: z.array(ResponseRuleSchema),\n\tscoring: ScoringRuleSchema\n})\nexport type ResponseProcessing = z.infer<typeof ResponseProcessingSchema>\n\n// Root assessment item, extensible for any interaction type\nexport const AssessmentItemSchema = z.object({\n\tidentifier: z.string().min(1),\n\ttitle: z.string().min(1),\n\ttimeDependent: z.boolean(),\n\txmlLang: z.string().min(1),\n\n\tresponseDeclarations: z.array(ResponseDeclarationSchema).min(1),\n\toutcomeDeclarations: z.array(OutcomeDeclarationSchema).min(1),\n\n\titemBody: ItemBodySchema,\n\tresponseProcessing: ResponseProcessingSchema\n})\nexport type AssessmentItem = z.infer<typeof AssessmentItemSchema>\n","import * as errors from \"@superbuilders/errors\"\nimport { XMLBuilder, XMLParser } from \"fast-xml-parser\"\nimport { serializeInner, serializeNode, serializeNodes } from \"./html\"\nimport {\n\ttype AnyCondition,\n\ttype AssessmentItem,\n\tAssessmentItemSchema,\n\ttype BaseRule,\n\ttype ConditionBranch,\n\tQtiBaseTypeSchema,\n\tQtiCardinalitySchema,\n\ttype ResponseProcessing,\n\ttype ResponseRule,\n\ttype ScoringRule\n} from \"./schema\"\n\n// Clean, recursive representation of an XML node\nexport interface NormalizedNode {\n\ttagName: string\n\tattrs: Record<string, unknown>\n\tchildren: Array<NormalizedNode | string>\n}\n\n// --- Core XML & Node Utilities ---\n\nfunction createXmlParser(): XMLParser {\n\treturn new XMLParser({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tallowBooleanAttributes: true,\n\t\tparseAttributeValue: true,\n\t\tparseTagValue: false, // CRITICAL: Preserve \"000\" as string, not convert to number 0\n\t\ttrimValues: false,\n\t\tpreserveOrder: true\n\t})\n}\n\nfunction _createXmlBuilder(): XMLBuilder {\n\treturn new XMLBuilder({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"\",\n\t\tsuppressEmptyNode: true, // cleaner output for empty tags\n\t\tformat: false\n\t})\n}\n\nfunction coerceString(value: unknown): string {\n\tif (value == null) return \"\"\n\treturn String(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction normalizeNode(rawNode: unknown): NormalizedNode | string {\n\tif (rawNode == null) return \"\"\n\tif (!isRecord(rawNode)) return coerceString(rawNode)\n\n\tconst textContent = rawNode[\"#text\"]\n\tif (textContent != null) {\n\t\treturn coerceString(textContent)\n\t}\n\n\tconst tagName = Object.keys(rawNode).find((k) => k !== \":@\")\n\tif (!tagName) return \"\"\n\n\tconst attrsValue = rawNode[\":@\"]\n\tconst attrs = isRecord(attrsValue) ? attrsValue : {}\n\tconst rawChildren = Array.isArray(rawNode[tagName]) ? rawNode[tagName] : [rawNode[tagName]]\n\n\treturn {\n\t\ttagName,\n\t\tattrs,\n\t\tchildren: rawChildren.map(normalizeNode).filter((n) => n !== \"\")\n\t}\n}\n\nfunction nodeToXml(node: NormalizedNode | string): string {\n\t// Use our HTML serializer for better MathML preservation\n\tif (typeof node === \"string\") return node\n\treturn serializeNode(node)\n}\n\nfunction getInnerHtml(node: NormalizedNode): string {\n\t// Use our HTML serializer for inner content\n\treturn serializeInner(node)\n}\n\nfunction findChild(node: NormalizedNode, tagName: string): NormalizedNode | undefined {\n\tconst child = node.children.find((c) => typeof c !== \"string\" && c.tagName === tagName)\n\treturn typeof child === \"string\" ? undefined : child\n}\n\nfunction findChildren(node: NormalizedNode, tagName: string): NormalizedNode[] {\n\treturn node.children.filter((c): c is NormalizedNode => typeof c !== \"string\" && c.tagName === tagName)\n}\n\nfunction getTextContent(node: NormalizedNode | undefined): string {\n\tif (!node) return \"\"\n\tconst firstChild = node.children[0]\n\tif (typeof firstChild === \"string\") return firstChild.trim()\n\treturn \"\"\n}\n\nfunction findInteractionNodes(node: NormalizedNode, out: NormalizedNode[] = []): NormalizedNode[] {\n\tif (node.tagName.includes(\"-interaction\")) {\n\t\tout.push(node)\n\t}\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tfindInteractionNodes(child, out)\n\t\t}\n\t}\n\treturn out\n}\n\nfunction escapeAttr(value: string): string {\n\treturn value.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\")\n}\n\nfunction attrsToString(attrs: Record<string, unknown>): string {\n\tconst parts: string[] = []\n\tfor (const [key, val] of Object.entries(attrs)) {\n\t\tconst str = coerceString(val)\n\t\tif (str === \"\") continue\n\t\tparts.push(`${key}=\"${escapeAttr(str)}\"`)\n\t}\n\treturn parts.length ? ` ${parts.join(\" \")}` : \"\"\n}\n\nfunction serializeWithInlinePlaceholders(\n\tnode: NormalizedNode | string,\n\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>,\n\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n): string {\n\tif (typeof node === \"string\") return node\n\tif (node.tagName === \"qti-inline-choice-interaction\") {\n\t\tconst interaction = extractInlineChoiceInteraction(node)\n\t\tinlineEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-inline=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tif (node.tagName === \"qti-text-entry-interaction\") {\n\t\tconst interaction = extractTextEntryInteraction(node)\n\t\ttextEmbeds[interaction.responseIdentifier] = interaction\n\t\treturn `<span data-qti-text-entry=\"${interaction.responseIdentifier}\"></span>`\n\t}\n\tconst open = `<${node.tagName}${attrsToString(node.attrs)}>`\n\tconst childrenHtml = node.children.map((c) => serializeWithInlinePlaceholders(c, inlineEmbeds, textEmbeds)).join(\"\")\n\tconst close = `</${node.tagName}>`\n\treturn `${open}${childrenHtml}${close}`\n}\n\n// --- QTI Structure Extractors ---\n\nfunction extractChoiceInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Extract optional inline feedback\n\t\tconst inlineFeedbackNode = findChild(choice, \"qti-feedback-inline\")\n\t\tconst inlineFeedbackHtml = inlineFeedbackNode ? getInnerHtml(inlineFeedbackNode) : undefined\n\n\t\t// Build content HTML excluding inline feedback nodes\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\tinlineFeedbackHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"choiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 1),\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractInlineChoiceInteraction(node: NormalizedNode) {\n\tconst choiceNodes = findChildren(node, \"qti-inline-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\tconst contentHtml = serializeInner(choice)\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml\n\t\t}\n\t})\n\n\treturn {\n\t\ttype: \"inlineChoiceInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tchoices\n\t}\n}\n\nfunction extractTextEntryInteraction(node: NormalizedNode) {\n\tconst expectedLengthAttr = node.attrs[\"expected-length\"]\n\tconst expectedLength = expectedLengthAttr ? Number(expectedLengthAttr) : undefined\n\n\treturn {\n\t\ttype: \"textEntryInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\texpectedLength: expectedLength !== undefined && !Number.isNaN(expectedLength) ? expectedLength : undefined,\n\t\tplaceholderText: coerceString(node.attrs[\"placeholder-text\"]) || undefined,\n\t\tpatternMask: coerceString(node.attrs[\"pattern-mask\"]) || undefined\n\t}\n}\n\nfunction extractOrderInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\tconst choiceNodes = findChildren(node, \"qti-simple-choice\")\n\tconst choices = choiceNodes.map((choice) => {\n\t\t// Filter out inline feedback nodes from content\n\t\tconst contentChildren = choice.children.filter(\n\t\t\t(c) => !(typeof c !== \"string\" && c.tagName === \"qti-feedback-inline\")\n\t\t)\n\t\tconst contentHtml = serializeNodes(contentChildren)\n\n\t\treturn {\n\t\t\tidentifier: coerceString(choice.attrs.identifier),\n\t\t\tcontentHtml,\n\t\t\t// Order interaction rarely displays inline feedback per-item\n\t\t\tinlineFeedbackHtml: undefined\n\t\t}\n\t})\n\n\t// Detect orientation (attribute OR class)\n\tlet orientation: \"vertical\" | \"horizontal\" = \"vertical\"\n\tconst attrOrientation = coerceString(node.attrs.orientation)\n\tconst classAttr = coerceString(node.attrs.class)\n\n\tif (attrOrientation === \"horizontal\" || classAttr.includes(\"qti-orientation-horizontal\")) {\n\t\torientation = \"horizontal\"\n\t}\n\n\treturn {\n\t\ttype: \"orderInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tminChoices: Number(node.attrs[\"min-choices\"] ?? 0),\n\t\tmaxChoices: Number(node.attrs[\"max-choices\"] ?? 0) || undefined,\n\t\torientation,\n\t\tpromptHtml,\n\t\tchoices\n\t}\n}\n\nfunction extractGapMatchInteraction(node: NormalizedNode) {\n\t// Extract gap texts (draggable tokens)\n\tconst gapTextNodes = findChildren(node, \"qti-gap-text\")\n\tconst gapTexts = gapTextNodes.map((gt) => ({\n\t\tidentifier: coerceString(gt.attrs.identifier),\n\t\tcontentHtml: serializeInner(gt),\n\t\tmatchMax: Number(gt.attrs[\"match-max\"] ?? 0) // 0 = unlimited\n\t}))\n\n\t// Find all gaps in the content and build content HTML with placeholders\n\tconst gaps: Array<{ identifier: string }> = []\n\n\t// Serialize content with gap placeholders\n\tfunction serializeWithGapPlaceholders(child: NormalizedNode | string): string {\n\t\tif (typeof child === \"string\") return child\n\t\tif (child.tagName === \"qti-gap\") {\n\t\t\tconst gapId = coerceString(child.attrs.identifier)\n\t\t\tgaps.push({ identifier: gapId })\n\t\t\treturn `<span data-qti-gap=\"${gapId}\"></span>`\n\t\t}\n\t\t// Skip gap-text nodes in content serialization (they're in the source pool)\n\t\tif (child.tagName === \"qti-gap-text\") {\n\t\t\treturn \"\"\n\t\t}\n\t\tconst open = `<${child.tagName}${attrsToString(child.attrs)}>`\n\t\tconst childrenHtml = child.children.map((c) => serializeWithGapPlaceholders(c)).join(\"\")\n\t\tconst close = `</${child.tagName}>`\n\t\treturn `${open}${childrenHtml}${close}`\n\t}\n\n\t// Build content HTML from children (excluding gap-text nodes which are sources)\n\tconst contentHtml = node.children\n\t\t.filter((c) => typeof c === \"string\" || c.tagName !== \"qti-gap-text\")\n\t\t.map((c) => serializeWithGapPlaceholders(c))\n\t\t.join(\"\")\n\n\treturn {\n\t\ttype: \"gapMatchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: Boolean(node.attrs.shuffle),\n\t\tgapTexts,\n\t\tgaps,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractMatchInteraction(node: NormalizedNode) {\n\tconst promptNode = findChild(node, \"qti-prompt\")\n\tconst promptHtml = promptNode ? getInnerHtml(promptNode) : \"\"\n\n\t// QTI has two <qti-simple-match-set> nodes\n\tconst matchSets = findChildren(node, \"qti-simple-match-set\")\n\n\tconst extractChoices = (setNode: NormalizedNode) => {\n\t\tconst choiceNodes = findChildren(setNode, \"qti-simple-associable-choice\")\n\t\treturn choiceNodes.map((c) => ({\n\t\t\tidentifier: coerceString(c.attrs.identifier),\n\t\t\tmatchMax: Number(c.attrs[\"match-max\"]) || 1,\n\t\t\tcontentHtml: serializeInner(c)\n\t\t}))\n\t}\n\n\t// First set = Sources, Second set = Targets (QTI convention)\n\tconst firstSet = matchSets[0]\n\tconst secondSet = matchSets[1]\n\tconst sourceChoices = firstSet ? extractChoices(firstSet) : []\n\tconst targetChoices = secondSet ? extractChoices(secondSet) : []\n\n\treturn {\n\t\ttype: \"matchInteraction\" as const,\n\t\tresponseIdentifier: coerceString(node.attrs[\"response-identifier\"]),\n\t\tshuffle: node.attrs.shuffle === \"true\",\n\t\tmaxAssociations: Number(node.attrs[\"max-associations\"]) || 0,\n\t\tsourceChoices,\n\t\ttargetChoices,\n\t\tpromptHtml\n\t}\n}\n\nfunction extractFeedbackBlock(node: NormalizedNode) {\n\tconst contentBodyNode = findChild(node, \"qti-content-body\")\n\tconst contentHtml = contentBodyNode ? getInnerHtml(contentBodyNode) : \"\"\n\tconst showHide: \"hide\" | \"show\" = coerceString(node.attrs[\"show-hide\"]) === \"hide\" ? \"hide\" : \"show\"\n\n\treturn {\n\t\toutcomeIdentifier: coerceString(node.attrs[\"outcome-identifier\"]),\n\t\tidentifier: coerceString(node.attrs.identifier),\n\t\tshowHide,\n\t\tcontentHtml\n\t}\n}\n\nfunction extractResponseDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-response-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst correctResponseNode = findChild(node, \"qti-correct-response\")\n\t\tconst valueNodes = correctResponseNode ? findChildren(correctResponseNode, \"qti-value\") : []\n\t\tconst values = valueNodes.map(getTextContent)\n\n\t\t// Optional mapping for map-response processing\n\t\tconst mappingNode = findChild(node, \"qti-mapping\")\n\t\tlet mapping:\n\t\t\t| {\n\t\t\t\t\tdefaultValue: number\n\t\t\t\t\tlowerBound?: number\n\t\t\t\t\tupperBound?: number\n\t\t\t\t\tentries: Array<{ key: string; value: number }>\n\t\t\t }\n\t\t\t| undefined\n\t\tif (mappingNode) {\n\t\t\tconst defaultValueRaw = coerceString(mappingNode.attrs[\"default-value\"])\n\t\t\tconst lowerBoundRaw = coerceString(mappingNode.attrs[\"lower-bound\"])\n\t\t\tconst upperBoundRaw = coerceString(mappingNode.attrs[\"upper-bound\"])\n\t\t\tconst entryNodes = findChildren(mappingNode, \"qti-map-entry\")\n\t\t\tconst entries = entryNodes.map((en) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: coerceString(en.attrs[\"map-key\"]),\n\t\t\t\t\tvalue: Number(coerceString(en.attrs[\"mapped-value\"]) || 0)\n\t\t\t\t}\n\t\t\t})\n\t\t\tmapping = {\n\t\t\t\tdefaultValue: Number(defaultValueRaw || 0),\n\t\t\t\tlowerBound: lowerBoundRaw !== \"\" ? Number(lowerBoundRaw) : undefined,\n\t\t\t\tupperBound: upperBoundRaw !== \"\" ? Number(upperBoundRaw) : undefined,\n\t\t\t\tentries\n\t\t\t}\n\t\t}\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in response declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in response declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tcorrectResponse: { values },\n\t\t\tmapping\n\t\t}\n\t})\n}\n\nfunction extractOutcomeDeclarations(rootChildren: NormalizedNode[]) {\n\tconst declNodes = rootChildren.filter((n) => n.tagName === \"qti-outcome-declaration\")\n\n\treturn declNodes.map((node) => {\n\t\tconst defaultValueNode = findChild(node, \"qti-default-value\")\n\t\tconst valueNode = defaultValueNode ? findChild(defaultValueNode, \"qti-value\") : undefined\n\t\tconst defaultValue = valueNode ? { value: getTextContent(valueNode) } : undefined\n\n\t\tconst cardinalityRaw = coerceString(node.attrs.cardinality)\n\t\tconst cardinalityResult = QtiCardinalitySchema.safeParse(cardinalityRaw)\n\t\tif (!cardinalityResult.success) {\n\t\t\tthrow errors.new(`invalid cardinality '${cardinalityRaw}' in outcome declaration`)\n\t\t}\n\n\t\tconst baseTypeRaw = coerceString(node.attrs[\"base-type\"])\n\t\tconst baseTypeResult = QtiBaseTypeSchema.safeParse(baseTypeRaw)\n\t\tif (!baseTypeResult.success) {\n\t\t\tthrow errors.new(`invalid base-type '${baseTypeRaw}' in outcome declaration`)\n\t\t}\n\n\t\treturn {\n\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\tcardinality: cardinalityResult.data,\n\t\t\tbaseType: baseTypeResult.data,\n\t\t\tdefaultValue\n\t\t}\n\t})\n}\n\nfunction parseCondition(node: NormalizedNode): AnyCondition | null {\n\t// A. Logical Operators\n\tif (node.tagName === \"qti-and\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"and\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-or\") {\n\t\tconst conditions: AnyCondition[] = []\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) conditions.push(parsed)\n\t\t\t}\n\t\t}\n\t\tif (conditions.length === 0) return null\n\t\treturn { type: \"or\", conditions }\n\t}\n\n\tif (node.tagName === \"qti-not\") {\n\t\tfor (const child of node.children) {\n\t\t\tif (typeof child !== \"string\") {\n\t\t\t\tconst parsed = parseCondition(child)\n\t\t\t\tif (parsed) return { type: \"not\", condition: parsed }\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// B. Variable Extraction (Common logic for comparators)\n\tconst variableNode = findChild(node, \"qti-variable\")\n\tconst baseValueNode = findChild(node, \"qti-base-value\")\n\n\tconst identifier = variableNode ? coerceString(variableNode.attrs.identifier) : undefined\n\tconst value = baseValueNode ? getTextContent(baseValueNode) : undefined\n\n\t// C. Comparators\n\tif (node.tagName === \"qti-match\") {\n\t\t// Match against correct response\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t\t// Match against a specific value\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"matchValue\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// String Match (text entry with case sensitivity)\n\tif (node.tagName === \"qti-string-match\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn {\n\t\t\t\ttype: \"stringMatch\",\n\t\t\t\tvariable: identifier,\n\t\t\t\tvalue,\n\t\t\t\t// QTI spec: case-sensitive defaults to true\n\t\t\t\tcaseSensitive: node.attrs[\"case-sensitive\"] !== \"false\"\n\t\t\t}\n\t\t}\n\t}\n\n\t// Member (set logic for multi-select)\n\tif (node.tagName === \"qti-member\") {\n\t\tif (identifier && value !== undefined) {\n\t\t\treturn { type: \"member\", variable: identifier, value }\n\t\t}\n\t}\n\n\t// Equal: supports both map-response comparisons and correct response matching\n\tif (node.tagName === \"qti-equal\") {\n\t\t// Pattern 1: Equal with map-response (for summed scores)\n\t\tconst mapResponseNode = findChild(node, \"qti-map-response\")\n\t\tconst equalBaseValueNode = findChild(node, \"qti-base-value\")\n\t\tif (mapResponseNode && equalBaseValueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"equalMapResponse\",\n\t\t\t\tvariable: coerceString(mapResponseNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(equalBaseValueNode)\n\t\t\t}\n\t\t}\n\t\t// Pattern 2: Equal with qti-correct (compare to correct response, like qti-match)\n\t\t// Used by text entry: <qti-equal><qti-variable/><qti-correct/></qti-equal>\n\t\tif (findChild(node, \"qti-correct\") && identifier) {\n\t\t\treturn { type: \"match\", variable: identifier, correct: true as const }\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Parse actions (setOutcomeValue) from a branch node\nfunction parseActions(node: NormalizedNode): BaseRule[] {\n\tconst rules: BaseRule[] = []\n\tconst setNodes = findChildren(node, \"qti-set-outcome-value\")\n\tfor (const setNode of setNodes) {\n\t\tconst valueNode = findChild(setNode, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\trules.push({\n\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\tidentifier: coerceString(setNode.attrs.identifier),\n\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t})\n\t\t}\n\t}\n\treturn rules\n}\n\n// RECURSIVE: Parse a processing rule (Condition Block OR Direct Action)\nfunction parseResponseRule(node: NormalizedNode): ResponseRule | null {\n\t// Case 1: Direct Action (e.g. <qti-set-outcome-value>)\n\tif (node.tagName === \"qti-set-outcome-value\") {\n\t\tconst valueNode = findChild(node, \"qti-base-value\")\n\t\tif (valueNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"action\",\n\t\t\t\taction: {\n\t\t\t\t\ttype: \"setOutcomeValue\",\n\t\t\t\t\tidentifier: coerceString(node.attrs.identifier),\n\t\t\t\t\tvalue: getTextContent(valueNode)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t// Case 2: Response Condition (if/else block)\n\tif (node.tagName === \"qti-response-condition\") {\n\t\tconst branches: ConditionBranch[] = []\n\n\t\t// 1. IF\n\t\tconst ifNode = findChild(node, \"qti-response-if\")\n\t\tif (ifNode) {\n\t\t\tconst condition = findConditionInBranch(ifNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(ifNode),\n\t\t\t\t\tnestedRules: findNestedRules(ifNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 2. ELSE-IFs\n\t\tconst elseIfNodes = findChildren(node, \"qti-response-else-if\")\n\t\tfor (const elseIfNode of elseIfNodes) {\n\t\t\tconst condition = findConditionInBranch(elseIfNode)\n\t\t\tif (condition) {\n\t\t\t\tbranches.push({\n\t\t\t\t\tcondition,\n\t\t\t\t\tactions: parseActions(elseIfNode),\n\t\t\t\t\tnestedRules: findNestedRules(elseIfNode)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// 3. ELSE\n\t\tconst elseNode = findChild(node, \"qti-response-else\")\n\t\tif (elseNode) {\n\t\t\tbranches.push({\n\t\t\t\tcondition: undefined, // Else has no condition\n\t\t\t\tactions: parseActions(elseNode),\n\t\t\t\tnestedRules: findNestedRules(elseNode)\n\t\t\t})\n\t\t}\n\n\t\tif (branches.length > 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"condition\",\n\t\t\t\tbranches\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\n// Helper to find the condition node inside a response-if/else-if block\nfunction findConditionInBranch(node: NormalizedNode): AnyCondition | null {\n\tconst conditionTagNames = [\"qti-match\", \"qti-and\", \"qti-or\", \"qti-not\", \"qti-equal\", \"qti-string-match\", \"qti-member\"]\n\tfor (const child of node.children) {\n\t\tif (typeof child !== \"string\" && conditionTagNames.includes(child.tagName)) {\n\t\t\treturn parseCondition(child)\n\t\t}\n\t}\n\treturn null\n}\n\n// Helper to find nested CONDITION BLOCKS inside a branch\n// Note: We only look for qti-response-condition, NOT qti-set-outcome-value\n// because actions are already captured by parseActions() in the branch's `actions` array\nfunction findNestedRules(node: NormalizedNode): ResponseRule[] {\n\tconst nested: ResponseRule[] = []\n\tfor (const child of node.children) {\n\t\t// Only parse nested response-condition blocks, not standalone actions\n\t\tif (typeof child !== \"string\" && child.tagName === \"qti-response-condition\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) nested.push(rule)\n\t\t}\n\t}\n\treturn nested\n}\n\n// Main processing extractor\nfunction extractResponseProcessing(rootChildren: NormalizedNode[]): ResponseProcessing {\n\tconst processingNode = rootChildren.find((n) => n.tagName === \"qti-response-processing\")\n\tif (!processingNode) {\n\t\treturn { rules: [], scoring: { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 } }\n\t}\n\n\tconst rules: ResponseRule[] = []\n\tfor (const child of processingNode.children) {\n\t\tif (typeof child !== \"string\") {\n\t\t\tconst rule = parseResponseRule(child)\n\t\t\tif (rule) rules.push(rule)\n\t\t}\n\t}\n\n\t// Legacy scoring extraction (unchanged logic for compatibility)\n\tlet scoring: ScoringRule = { responseIdentifier: \"\", correctScore: 1, incorrectScore: 0 }\n\tconst conditionNodes = findChildren(processingNode, \"qti-response-condition\")\n\tfor (const conditionNode of conditionNodes) {\n\t\tconst responseIfNode = findChild(conditionNode, \"qti-response-if\")\n\t\tconst responseElseNode = findChild(conditionNode, \"qti-response-else\")\n\n\t\tif (responseIfNode && responseElseNode) {\n\t\t\tconst andNode = findChild(responseIfNode, \"qti-and\")\n\t\t\tif (andNode) {\n\t\t\t\tconst matchNode = findChild(andNode, \"qti-match\")\n\t\t\t\tconst variableNode = matchNode ? findChild(matchNode, \"qti-variable\") : undefined\n\t\t\t\tif (variableNode) {\n\t\t\t\t\tconst ifSetOutcomeNode = findChild(responseIfNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst elseSetOutcomeNode = findChild(responseElseNode, \"qti-set-outcome-value\")\n\t\t\t\t\tconst correctValueNode = ifSetOutcomeNode ? findChild(ifSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tconst incorrectValueNode = elseSetOutcomeNode ? findChild(elseSetOutcomeNode, \"qti-base-value\") : undefined\n\t\t\t\t\tscoring = {\n\t\t\t\t\t\tresponseIdentifier: coerceString(variableNode.attrs.identifier),\n\t\t\t\t\t\tcorrectScore: Number(getTextContent(correctValueNode) || 1),\n\t\t\t\t\t\tincorrectScore: Number(getTextContent(incorrectValueNode) || 0)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { rules, scoring }\n}\n\n// --- Main Parser Export ---\n\nexport function parseAssessmentItemXml(xml: string): AssessmentItem {\n\t// Validate input\n\tif (!xml || typeof xml !== \"string\") {\n\t\tthrow errors.new(\"xml input must be a non-empty string\")\n\t}\n\n\tconst parser = createXmlParser()\n\tconst parseResult = errors.trySync(() => {\n\t\t// Parse with preserveOrder flag as second parameter\n\t\treturn parser.parse(xml, true)\n\t})\n\n\tif (parseResult.error) {\n\t\tthrow errors.wrap(parseResult.error, \"xml parse\")\n\t}\n\n\tconst raw = parseResult.data\n\tif (!Array.isArray(raw)) {\n\t\tthrow errors.new(\"expected xml parser to output an array for preserveOrder\")\n\t}\n\n\tconst normalizedTree = raw.map(normalizeNode).filter((n): n is NormalizedNode => typeof n !== \"string\")\n\n\tconst rootNode = normalizedTree.find((n) => n.tagName.endsWith(\"assessment-item\"))\n\tif (!rootNode) {\n\t\tthrow errors.new(\"qti assessment item not found in xml document\")\n\t}\n\n\tconst rootChildren = rootNode.children.filter((c): c is NormalizedNode => typeof c !== \"string\")\n\tconst itemBodyNode = rootChildren.find((n) => n.tagName === \"qti-item-body\")\n\n\ttype InteractionUnion =\n\t\t| ReturnType<typeof extractChoiceInteraction>\n\t\t| ReturnType<typeof extractInlineChoiceInteraction>\n\t\t| ReturnType<typeof extractTextEntryInteraction>\n\t\t| ReturnType<typeof extractOrderInteraction>\n\t\t| ReturnType<typeof extractGapMatchInteraction>\n\t\t| ReturnType<typeof extractMatchInteraction>\n\ttype ContentBlock =\n\t\t| { type: \"stimulus\"; html: string }\n\t\t| {\n\t\t\t\ttype: \"richStimulus\"\n\t\t\t\thtml: string\n\t\t\t\tinlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>>\n\t\t\t\ttextEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>>\n\t\t }\n\t\t| { type: \"interaction\"; interaction: InteractionUnion }\n\ttype FeedbackBlock = { outcomeIdentifier: string; identifier: string; showHide: \"hide\" | \"show\"; contentHtml: string }\n\n\tconst contentBlocks: ContentBlock[] = []\n\tconst feedbackBlocks: FeedbackBlock[] = []\n\n\tif (itemBodyNode) {\n\t\tfor (const child of itemBodyNode.children) {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\tif (child.trim()) contentBlocks.push({ type: \"stimulus\" as const, html: child })\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Collect all interaction nodes within this subtree\n\t\t\tif (child.tagName === \"qti-feedback-block\") {\n\t\t\t\tfeedbackBlocks.push(extractFeedbackBlock(child))\n\t\t\t} else {\n\t\t\t\tconst interactionNodes = findInteractionNodes(child)\n\t\t\t\tconst hasInline = interactionNodes.some(\n\t\t\t\t\t(n) => n.tagName === \"qti-inline-choice-interaction\" || n.tagName === \"qti-text-entry-interaction\"\n\t\t\t\t)\n\t\t\t\tif (hasInline) {\n\t\t\t\t\tconst inlineEmbeds: Record<string, ReturnType<typeof extractInlineChoiceInteraction>> = {}\n\t\t\t\t\tconst textEmbeds: Record<string, ReturnType<typeof extractTextEntryInteraction>> = {}\n\t\t\t\t\tconst html = serializeWithInlinePlaceholders(child, inlineEmbeds, textEmbeds)\n\t\t\t\t\tcontentBlocks.push({ type: \"richStimulus\" as const, html, inlineEmbeds, textEmbeds })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (interactionNodes.length > 0) {\n\t\t\t\t\tfor (const inode of interactionNodes) {\n\t\t\t\t\t\tif (inode.tagName === \"qti-choice-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractChoiceInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-text-entry-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractTextEntryInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-order-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractOrderInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-gap-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractGapMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else if (inode.tagName === \"qti-match-interaction\") {\n\t\t\t\t\t\t\tconst interaction = extractMatchInteraction(inode)\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"interaction\" as const, interaction })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Unknown interaction subtype: serialize as stimulus fallback\n\t\t\t\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(inode) })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcontentBlocks.push({ type: \"stimulus\" as const, html: nodeToXml(child) })\n\t\t\t}\n\t\t}\n\t}\n\n\tlet normalizedItem = {\n\t\tidentifier: coerceString(rootNode.attrs.identifier),\n\t\ttitle: coerceString(rootNode.attrs.title),\n\t\ttimeDependent: Boolean(rootNode.attrs[\"time-dependent\"]),\n\t\txmlLang: coerceString(rootNode.attrs[\"xml:lang\"]) || coerceString(rootNode.attrs[\"xml-lang\"]) || \"en\",\n\t\tresponseDeclarations: extractResponseDeclarations(rootChildren),\n\t\toutcomeDeclarations: extractOutcomeDeclarations(rootChildren),\n\t\titemBody: { contentBlocks, feedbackBlocks },\n\t\tresponseProcessing: extractResponseProcessing(rootChildren)\n\t}\n\n\t// Fallback: if scoring.responseIdentifier is empty, derive from first response declaration\n\tif (\n\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier === \"\" &&\n\t\tnormalizedItem.responseDeclarations.length > 0\n\t) {\n\t\tconst firstDecl = normalizedItem.responseDeclarations[0]\n\t\tif (firstDecl) {\n\t\t\tnormalizedItem.responseProcessing.scoring.responseIdentifier = firstDecl.identifier\n\t\t}\n\t}\n\n\tconst validation = AssessmentItemSchema.safeParse(normalizedItem)\n\tif (!validation.success) {\n\t\t// Format validation errors for better debugging\n\t\tconst errorDetails = validation.error.issues.map((err) => `${err.path.join(\".\")}: ${err.message}`).join(\"; \")\n\t\tthrow errors.new(`qti item validation: ${errorDetails}`)\n\t}\n\n\treturn validation.data\n}\n","import { createHash } from \"node:crypto\"\nimport * as errors from \"@superbuilders/errors\"\nimport * as logger from \"@superbuilders/slog\"\n\nimport { sanitizeHtml } from \"../../html\"\nimport { parseAssessmentItemXml } from \"../../parser\"\nimport type {\n\tDisplayAssociableChoice,\n\tDisplayBlock,\n\tDisplayChoice,\n\tDisplayGap,\n\tDisplayGapText,\n\tDisplayInlineEmbed,\n\tDisplayItem,\n\tDisplayTextEmbed,\n\tFormShape\n} from \"../../shared/types\"\n\nfunction shuffleArray<T>(items: T[]): T[] {\n\t// Fisher–Yates shuffle on a shallow copy to keep original immutable\n\tconst arr = items.slice()\n\tfor (let i = arr.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(Math.random() * (i + 1))\n\t\tconst vi = arr[i]\n\t\tconst vj = arr[j]\n\t\t// With noUncheckedIndexedAccess enabled, index access is possibly undefined.\n\t\t// These indices are guaranteed in-bounds by construction; guard to satisfy TS.\n\t\tif (vi === undefined || vj === undefined) {\n\t\t\tcontinue\n\t\t}\n\t\tarr[i] = vj\n\t\tarr[j] = vi\n\t}\n\treturn arr\n}\n\nexport function buildDisplayModelFromXml(qtiXml: string): { itemKey: string; item: DisplayItem; shape: FormShape } {\n\tlogger.debug(\"qti build display model\", {})\n\tconst parseResult = errors.trySync(() => parseAssessmentItemXml(qtiXml))\n\tif (parseResult.error) {\n\t\tlogger.error(\"qti parse failed\", { error: parseResult.error })\n\t\tthrow errors.wrap(parseResult.error, \"qti parse\")\n\t}\n\n\tconst item = parseResult.data\n\tconst shape: FormShape = {}\n\tfor (const rd of item.responseDeclarations) {\n\t\t// Check baseType first for directedPair (gap match uses this)\n\t\tif (rd.baseType === \"directedPair\" || rd.baseType === \"pair\") {\n\t\t\tshape[rd.identifier] = \"directedPair\"\n\t\t} else if (rd.cardinality === \"single\") {\n\t\t\tshape[rd.identifier] = \"single\"\n\t\t} else if (rd.cardinality === \"ordered\") {\n\t\t\tshape[rd.identifier] = \"ordered\"\n\t\t} else {\n\t\t\tshape[rd.identifier] = \"multiple\"\n\t\t}\n\t}\n\n\tconst contentBlocks: DisplayBlock[] = item.itemBody.contentBlocks.map((block) => {\n\t\tif (block.type === \"stimulus\") {\n\t\t\treturn { type: \"stimulus\", html: sanitizeHtml(block.html) }\n\t\t}\n\t\tif (block.type === \"richStimulus\") {\n\t\t\tconst html = sanitizeHtml(block.html, { allowDataAttributes: true })\n\t\t\tconst inlineEmbeds: Record<string, DisplayInlineEmbed> = {}\n\t\t\tfor (const [key, embed] of Object.entries(block.inlineEmbeds)) {\n\t\t\t\tinlineEmbeds[key] = {\n\t\t\t\t\tresponseId: embed.responseIdentifier,\n\t\t\t\t\tshuffle: embed.shuffle,\n\t\t\t\t\tchoices: embed.choices.map((c) => ({\n\t\t\t\t\t\tid: c.identifier,\n\t\t\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml)\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst textEmbeds: Record<string, DisplayTextEmbed> = {}\n\t\t\tfor (const [key, embed] of Object.entries(block.textEmbeds)) {\n\t\t\t\ttextEmbeds[key] = {\n\t\t\t\t\tresponseId: embed.responseIdentifier,\n\t\t\t\t\texpectedLength: embed.expectedLength,\n\t\t\t\t\tplaceholder: embed.placeholderText,\n\t\t\t\t\tpatternMask: embed.patternMask\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { type: \"richStimulus\", html, inlineEmbeds, textEmbeds }\n\t\t}\n\t\tconst interaction = block.interaction\n\t\tif (interaction.type === \"choiceInteraction\") {\n\t\t\tconst promptHtml = sanitizeHtml(interaction.promptHtml)\n\t\t\tlet choices: DisplayChoice[] = interaction.choices.map((c) => ({\n\t\t\t\tid: c.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml),\n\t\t\t\tinlineFeedbackHtml: c.inlineFeedbackHtml ? sanitizeHtml(c.inlineFeedbackHtml) : undefined\n\t\t\t}))\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tchoices = shuffleArray(choices)\n\t\t\t}\n\t\t\t// Choice interactions only use \"single\" or \"multiple\" cardinality\n\t\t\tconst cardinality = shape[interaction.responseIdentifier] === \"multiple\" ? \"multiple\" : \"single\"\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"choice\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tcardinality,\n\t\t\t\t\tpromptHtml,\n\t\t\t\t\tchoices,\n\t\t\t\t\tminChoices: interaction.minChoices,\n\t\t\t\t\tmaxChoices: interaction.maxChoices\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"textEntryInteraction\") {\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\texpectedLength: interaction.expectedLength,\n\t\t\t\t\tplaceholder: interaction.placeholderText,\n\t\t\t\t\tpatternMask: interaction.patternMask\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"orderInteraction\") {\n\t\t\tlet choices: DisplayChoice[] = interaction.choices.map((c) => ({\n\t\t\t\tid: c.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml),\n\t\t\t\tinlineFeedbackHtml: undefined\n\t\t\t}))\n\n\t\t\t// Server-side shuffle for initial state\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tchoices = shuffleArray(choices)\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"order\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tpromptHtml: sanitizeHtml(interaction.promptHtml),\n\t\t\t\t\torientation: interaction.orientation,\n\t\t\t\t\tchoices\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"gapMatchInteraction\") {\n\t\t\tlet gapTexts: DisplayGapText[] = interaction.gapTexts.map((gt) => ({\n\t\t\t\tid: gt.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(gt.contentHtml),\n\t\t\t\tmatchMax: gt.matchMax\n\t\t\t}))\n\n\t\t\t// Server-side shuffle for source tokens\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tgapTexts = shuffleArray(gapTexts)\n\t\t\t}\n\n\t\t\tconst gaps: DisplayGap[] = interaction.gaps.map((g) => ({\n\t\t\t\tid: g.identifier\n\t\t\t}))\n\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"gapMatch\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tgapTexts,\n\t\t\t\t\tgaps,\n\t\t\t\t\tcontentHtml: sanitizeHtml(interaction.contentHtml, { allowDataAttributes: true })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (interaction.type === \"matchInteraction\") {\n\t\t\tconst mapChoice = (c: {\n\t\t\t\tidentifier: string\n\t\t\t\tmatchMax: number\n\t\t\t\tcontentHtml: string\n\t\t\t}): DisplayAssociableChoice => ({\n\t\t\t\tid: c.identifier,\n\t\t\t\tcontentHtml: sanitizeHtml(c.contentHtml),\n\t\t\t\tmatchMax: c.matchMax\n\t\t\t})\n\n\t\t\tlet sourceChoices = interaction.sourceChoices.map(mapChoice)\n\t\t\tconst targetChoices = interaction.targetChoices.map(mapChoice)\n\n\t\t\t// Server-side shuffle for sources (targets stay fixed for consistency)\n\t\t\tif (interaction.shuffle === true) {\n\t\t\t\tsourceChoices = shuffleArray(sourceChoices)\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"interaction\",\n\t\t\t\tinteraction: {\n\t\t\t\t\ttype: \"match\",\n\t\t\t\t\tresponseId: interaction.responseIdentifier,\n\t\t\t\t\tpromptHtml: sanitizeHtml(interaction.promptHtml),\n\t\t\t\t\tmaxAssociations: interaction.maxAssociations,\n\t\t\t\t\tsourceChoices,\n\t\t\t\t\ttargetChoices\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Fallback: unknown interactions emit a stimulus note\n\t\treturn { type: \"stimulus\", html: sanitizeHtml(\"\") }\n\t})\n\n\tconst displayItem: DisplayItem = { title: item.title, contentBlocks }\n\tconst hash = createHash(\"sha256\").update(qtiXml).digest(\"hex\").slice(0, 16)\n\n\treturn { itemKey: hash, item: displayItem, shape }\n}\n","\"use server\"\n\nimport type { DisplayItem, FormShape } from \"../shared/types\"\nimport { buildDisplayModelFromXml } from \"./internal/display\"\n\n/**\n * Parses QTI XML and builds a display model for rendering.\n * This is a server action - call it from the server to keep XML processing secure.\n */\nexport async function buildDisplayModel(qtiXml: string): Promise<{\n\titemKey: string\n\titem: DisplayItem\n\tshape: FormShape\n}> {\n\treturn buildDisplayModelFromXml(qtiXml)\n}\n\n// Re-export the internal function for direct use\nexport { buildDisplayModelFromXml }\n","import * as logger from \"@superbuilders/slog\"\nimport type { AnyCondition, AssessmentItem, BaseRule, ResponseRule } from \"./schema\"\n\n/**\n * Normalizes a string for comparison (trimming and optional case-insensitivity)\n */\nfunction normalizeString(str: string, caseSensitive: boolean): string {\n\tconst s = (str ?? \"\").trim()\n\treturn caseSensitive ? s : s.toLowerCase()\n}\n\n/**\n * Evaluates a condition from the response processing rules against the user's responses.\n */\nfunction checkCondition(\n\tcondition: AnyCondition,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): boolean {\n\t// 1. Recursive Logic (AND / OR / NOT)\n\tif (condition.type === \"and\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst allTrue = results.every((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking AND condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tallTrue\n\t\t})\n\t\treturn allTrue\n\t}\n\n\tif (condition.type === \"or\") {\n\t\tconst results = condition.conditions.map((c: AnyCondition) => checkCondition(c, item, responses, responseResults))\n\t\tconst anyTrue = results.some((r: boolean) => r === true)\n\t\tlogger.debug(\"qti evaluator: checking OR condition\", {\n\t\t\tnumConditions: condition.conditions.length,\n\t\t\tresults,\n\t\t\tanyTrue\n\t\t})\n\t\treturn anyTrue\n\t}\n\n\tif (condition.type === \"not\") {\n\t\tconst result = checkCondition(condition.condition, item, responses, responseResults)\n\t\tlogger.debug(\"qti evaluator: checking NOT condition\", { result, negated: !result })\n\t\treturn !result\n\t}\n\n\t// 2. Standard Match (correctness check)\n\tif (condition.type === \"match\") {\n\t\tconst result = responseResults[condition.variable]\n\t\tlogger.debug(\"qti evaluator: checking match condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\tisCorrect: result,\n\t\t\tmatches: result === true\n\t\t})\n\t\treturn result === true\n\t}\n\n\t// 3. Match Specific Value (hardcoded value check)\n\tif (condition.type === \"matchValue\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking matchValue condition\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttargetValue: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 4. String Match (text entry with case sensitivity)\n\tif (condition.type === \"stringMatch\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tconst val = Array.isArray(userResponse) ? userResponse[0] : userResponse\n\t\tif (!val) return false\n\n\t\tconst u = normalizeString(String(val), condition.caseSensitive)\n\t\tconst t = normalizeString(condition.value, condition.caseSensitive)\n\t\tconst matches = u === t\n\t\tlogger.debug(\"qti evaluator: checking stringMatch\", {\n\t\t\tvariable: condition.variable,\n\t\t\tcaseSensitive: condition.caseSensitive,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 5. Member (set logic for multi-select checkboxes)\n\tif (condition.type === \"member\") {\n\t\tconst userResponse = responses[condition.variable]\n\t\tlet userValues: string[]\n\t\tif (Array.isArray(userResponse)) {\n\t\t\tuserValues = userResponse\n\t\t} else if (userResponse) {\n\t\t\tuserValues = [userResponse]\n\t\t} else {\n\t\t\tuserValues = []\n\t\t}\n\t\tconst matches = userValues.includes(condition.value)\n\t\tlogger.debug(\"qti evaluator: checking member\", {\n\t\t\tvariable: condition.variable,\n\t\t\ttarget: condition.value,\n\t\t\tuserValues,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\t// 6. Map Response (scoring logic with epsilon comparison)\n\tif (condition.type === \"equalMapResponse\") {\n\t\tconst responseId = condition.variable\n\t\tconst userResponse = responses[responseId]\n\t\tconst responseDecl = item.responseDeclarations.find((rd) => rd.identifier === responseId)\n\n\t\tif (!userResponse || !responseDecl?.mapping) return false\n\n\t\tconst userValues = Array.isArray(userResponse) ? userResponse : [userResponse]\n\t\tconst valueMap = new Map(responseDecl.mapping.entries.map((e) => [e.key, e.value]))\n\n\t\tlet sum = 0\n\t\tfor (const val of userValues) {\n\t\t\tsum += valueMap.get(val) ?? responseDecl.mapping.defaultValue\n\t\t}\n\n\t\t// Float comparison safety (epsilon check)\n\t\tconst target = Number(condition.value)\n\t\tconst diff = Math.abs(sum - target)\n\t\tconst matches = diff < 0.0001\n\n\t\tlogger.debug(\"qti evaluator: checking equalMapResponse\", {\n\t\t\tresponseId,\n\t\t\tuserValues,\n\t\t\tsum,\n\t\t\ttarget: condition.value,\n\t\t\tmatches\n\t\t})\n\t\treturn matches\n\t}\n\n\treturn false\n}\n\n/**\n * Traverses a single response rule recursively to find matching feedback identifiers\n */\nfunction evaluateRule(\n\trule: ResponseRule,\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst feedbackIds: string[] = []\n\n\t// Case 1: Direct Action (unconditional)\n\tif (rule.type === \"action\") {\n\t\tconst action = rule.action\n\t\tif (\n\t\t\taction.type === \"setOutcomeValue\" &&\n\t\t\t(action.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\taction.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\taction.identifier === \"FEEDBACK\")\n\t\t) {\n\t\t\tlogger.debug(\"qti evaluator: executing action\", { id: action.identifier, value: action.value })\n\t\t\tfeedbackIds.push(action.value)\n\t\t}\n\t\treturn feedbackIds\n\t}\n\n\t// Case 2: Condition Block (if/elseif/else)\n\tif (rule.type === \"condition\") {\n\t\t// Iterate through branches and stop at the first match\n\t\tfor (const branch of rule.branches) {\n\t\t\tconst isMatch = branch.condition ? checkCondition(branch.condition, item, responses, responseResults) : true // Else branch (undefined condition) always matches if reached\n\n\t\t\tlogger.debug(\"qti evaluator: evaluating branch\", {\n\t\t\t\thasCondition: !!branch.condition,\n\t\t\t\tisMatch\n\t\t\t})\n\n\t\t\tif (isMatch) {\n\t\t\t\t// Execute actions in this branch\n\t\t\t\tconst feedbackActions = branch.actions.filter(\n\t\t\t\t\t(r: BaseRule) =>\n\t\t\t\t\t\tr.type === \"setOutcomeValue\" &&\n\t\t\t\t\t\t(r.identifier === \"FEEDBACK__OVERALL\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK__PEDAGOGY\" ||\n\t\t\t\t\t\t\tr.identifier === \"FEEDBACK\")\n\t\t\t\t)\n\t\t\t\tfor (const action of feedbackActions) {\n\t\t\t\t\tfeedbackIds.push(action.value)\n\t\t\t\t}\n\n\t\t\t\t// Execute nested rules recursively\n\t\t\t\tif (branch.nestedRules) {\n\t\t\t\t\tfor (const nested of branch.nestedRules) {\n\t\t\t\t\t\tconst nestedIds = evaluateRule(nested, item, responses, responseResults)\n\t\t\t\t\t\tfeedbackIds.push(...nestedIds)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CRITICAL: Stop after the first matching branch!\n\t\t\t\t// This prevents 'else' from executing if 'if' matched.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn feedbackIds\n}\n\n/**\n * Traverses the response processing rules to find all matching feedback identifiers.\n */\nexport function evaluateFeedbackIdentifiers(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string[] {\n\tconst processing = item.responseProcessing\n\tif (!processing) {\n\t\tlogger.debug(\"qti evaluator: no response processing found\")\n\t\treturn []\n\t}\n\n\tlogger.debug(\"qti evaluator: starting evaluation\", {\n\t\tnumRules: processing.rules.length,\n\t\tresponseResults\n\t})\n\n\tconst allFeedbackIds: string[] = []\n\n\tfor (const rule of processing.rules) {\n\t\tconst ids = evaluateRule(rule, item, responses, responseResults)\n\t\tallFeedbackIds.push(...ids)\n\t}\n\n\tlogger.debug(\"qti evaluator: selected feedback identifiers\", { feedbackIds: allFeedbackIds })\n\treturn allFeedbackIds\n}\n\n/**\n * Legacy function for backwards compatibility - returns the first matching feedback identifier.\n * @deprecated Use evaluateFeedbackIdentifiers for full feedback support\n */\nexport function evaluateFeedbackIdentifier(\n\titem: AssessmentItem,\n\tresponses: Record<string, string | string[]>,\n\tresponseResults: Record<string, boolean>\n): string | undefined {\n\tconst ids = evaluateFeedbackIdentifiers(item, responses, responseResults)\n\treturn ids[0]\n}\n","import * as errors from \"@superbuilders/errors\"\nimport * as logger from \"@superbuilders/slog\"\n\nimport { evaluateFeedbackIdentifiers } from \"../../evaluator\"\nimport { sanitizeHtml } from \"../../html\"\nimport { parseAssessmentItemXml } from \"../../parser\"\nimport type { ValidateResult } from \"../../shared/types\"\n\nexport function validateResponsesFromXml(qtiXml: string, responses: Record<string, string | string[]>): ValidateResult {\n\tlogger.debug(\"qti validate secure\", {})\n\tconst parseResult = errors.trySync(() => parseAssessmentItemXml(qtiXml))\n\tif (parseResult.error) {\n\t\tlogger.error(\"qti parse failed during validate\", { error: parseResult.error })\n\t\tthrow errors.wrap(parseResult.error, \"qti parse\")\n\t}\n\tconst item = parseResult.data\n\tlogger.debug(\"qti validate: parsed item\", {\n\t\ttitle: item.title,\n\t\tresponseCount: Object.keys(responses).length\n\t})\n\n\tconst perResponse: ValidateResult[\"perResponse\"] = {}\n\tconst selectedChoicesByResponse: ValidateResult[\"selectedChoicesByResponse\"] = {}\n\tconst responseCorrectness: Record<string, boolean> = {} // Track correctness for evaluator\n\n\tlet allCorrect = true\n\tfor (const rd of item.responseDeclarations) {\n\t\tconst respId = rd.identifier\n\t\tconst user = responses[respId]\n\t\tif (user == null) {\n\t\t\tallCorrect = false\n\t\t\tresponseCorrectness[respId] = false // Track as incorrect\n\t\t\tlogger.debug(\"qti validate: missing response\", { responseId: respId })\n\t\t\tcontinue\n\t\t}\n\t\tconst userVals = Array.isArray(user) ? user.filter((v): v is string => typeof v === \"string\") : [user]\n\t\tconst correctVals = rd.correctResponse.values\n\n\t\tlet isCorrect = false\n\n\t\tif (rd.cardinality === \"ordered\") {\n\t\t\t// Strict Array Equality for Order Interaction\n\t\t\t// Both length and specific index positions must match\n\t\t\tisCorrect = userVals.length === correctVals.length && userVals.every((val, index) => val === correctVals[index])\n\t\t\tlogger.debug(\"qti validate: ordered check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVals,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else if (rd.baseType === \"directedPair\" || rd.baseType === \"pair\") {\n\t\t\t// Gap Match Interaction: Set-based comparison of pairs\n\t\t\t// Each pair is \"sourceId gapId\" format - order of pairs doesn't matter\n\t\t\tconst correctSet = new Set(correctVals)\n\t\t\tconst userSet = new Set(userVals)\n\t\t\tisCorrect = userSet.size === correctSet.size && [...userSet].every((v) => correctSet.has(v))\n\t\t\tlogger.debug(\"qti validate: directedPair check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVals,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else if (rd.baseType === \"float\" || rd.baseType === \"integer\") {\n\t\t\t// Numeric comparison: handles \"42\" vs \"42.0\", \"2.62\" vs \"2.620\", etc.\n\t\t\t// This makes System B smarter than System A - we check baseType regardless of XML tag used\n\t\t\tconst userVal = userVals[0]\n\n\t\t\tif (userVal != null) {\n\t\t\t\tconst userNum = Number.parseFloat(userVal)\n\n\t\t\t\tif (!Number.isNaN(userNum)) {\n\t\t\t\t\t// Use epsilon comparison for floats, exact for integers\n\t\t\t\t\tconst epsilon = rd.baseType === \"float\" ? 0.000001 : 0\n\n\t\t\t\t\t// Check if user's answer matches ANY of the correct values\n\t\t\t\t\t// This handles cases like: <qti-value>42</qti-value><qti-value>42.0</qti-value>\n\t\t\t\t\tisCorrect = correctVals.some((correctVal) => {\n\t\t\t\t\t\tconst correctNum = Number.parseFloat(correctVal)\n\t\t\t\t\t\treturn !Number.isNaN(correctNum) && Math.abs(userNum - correctNum) <= epsilon\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.debug(\"qti validate: numeric check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tbaseType: rd.baseType,\n\t\t\t\tuserVal: userVals[0],\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else if (rd.cardinality === \"single\") {\n\t\t\t// Single cardinality with potentially multiple acceptable answers\n\t\t\t// User's single answer must match ANY of the correct values\n\t\t\t// Example: \"USA\", \"U.S.A.\", \"United States\" are all acceptable\n\t\t\tconst userVal = userVals[0]\n\t\t\tisCorrect = userVal != null && correctVals.includes(userVal)\n\n\t\t\tlogger.debug(\"qti validate: single cardinality check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVal,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t} else {\n\t\t\t// Multiple cardinality: user must select ALL correct values (set equality)\n\t\t\tconst correctSet = new Set(correctVals)\n\t\t\tconst userSet = new Set(userVals)\n\t\t\tisCorrect = userSet.size === correctSet.size && [...userSet].every((v) => correctSet.has(v))\n\n\t\t\tlogger.debug(\"qti validate: multiple cardinality check\", {\n\t\t\t\tresponseId: respId,\n\t\t\t\tuserVals,\n\t\t\t\tcorrectVals,\n\t\t\t\tisCorrect\n\t\t\t})\n\t\t}\n\n\t\tif (!isCorrect) allCorrect = false\n\t\tresponseCorrectness[respId] = isCorrect // Store for evaluator\n\t\tlogger.debug(\"qti validate: evaluated response\", {\n\t\t\tresponseId: respId,\n\t\t\tselected: userVals,\n\t\t\tisCorrect\n\t\t})\n\n\t\tconst correctSet = new Set(correctVals)\n\t\tselectedChoicesByResponse[respId] = userVals.map((id) => ({ id, isCorrect: correctSet.has(id) }))\n\n\t\t// Per-response feedback is now handled by the overall feedback logic.\n\t\tperResponse[respId] = { isCorrect }\n\t}\n\n\t// Use the evaluator to determine ALL feedback identifiers (FEEDBACK__OVERALL, FEEDBACK__PEDAGOGY, etc.)\n\tconst feedbackIdentifiers = evaluateFeedbackIdentifiers(item, responses, responseCorrectness)\n\tlet overallFeedback: ValidateResult[\"overallFeedback\"]\n\n\tif (feedbackIdentifiers.length > 0) {\n\t\t// Collect all matching feedback blocks and combine their HTML\n\t\tconst feedbackHtmlParts: string[] = []\n\t\tfor (const feedbackId of feedbackIdentifiers) {\n\t\t\tconst feedbackBlock = item.itemBody.feedbackBlocks.find((fb) => fb.identifier === feedbackId)\n\t\t\tif (feedbackBlock) {\n\t\t\t\tfeedbackHtmlParts.push(sanitizeHtml(feedbackBlock.contentHtml))\n\t\t\t}\n\t\t}\n\n\t\tif (feedbackHtmlParts.length > 0) {\n\t\t\toverallFeedback = {\n\t\t\t\tisCorrect: allCorrect,\n\t\t\t\tmessageHtml: feedbackHtmlParts.join(\"\")\n\t\t\t}\n\t\t\tlogger.debug(\"qti validate: overall feedback via response processing rules\", {\n\t\t\t\tisCorrect: allCorrect,\n\t\t\t\tfeedbackIds: feedbackIdentifiers,\n\t\t\t\tnumBlocks: feedbackHtmlParts.length\n\t\t\t})\n\t\t}\n\t} else {\n\t\t// Fallback for simple items without complex processing rules\n\t\tconst targetId = allCorrect ? \"CORRECT\" : \"INCORRECT\"\n\t\tconst fallbackBlock = item.itemBody.feedbackBlocks.find(\n\t\t\t(fb) =>\n\t\t\t\tfb.identifier.toUpperCase() === targetId &&\n\t\t\t\t(fb.outcomeIdentifier === \"FEEDBACK\" || fb.outcomeIdentifier === \"FEEDBACK__OVERALL\")\n\t\t)\n\t\tif (fallbackBlock) {\n\t\t\toverallFeedback = { isCorrect: allCorrect, messageHtml: sanitizeHtml(fallbackBlock.contentHtml) }\n\t\t\tlogger.debug(\"qti validate: overall feedback via fallback block\", {\n\t\t\t\tisCorrect: allCorrect,\n\t\t\t\tblockId: fallbackBlock.identifier\n\t\t\t})\n\t\t}\n\t}\n\n\treturn { overallCorrect: allCorrect, perResponse, selectedChoicesByResponse, overallFeedback }\n}\n","\"use server\"\n\nimport type { ValidateResult } from \"../shared/types\"\nimport { validateResponsesFromXml } from \"./internal/validate\"\n\n/**\n * Validates user responses against the QTI XML.\n * This is a server action - call it from the server to keep correct answers secure.\n */\nexport async function validateResponsesSecure(\n\tqtiXml: string,\n\tresponses: Record<string, string | string[]>\n): Promise<ValidateResult> {\n\treturn validateResponsesFromXml(qtiXml, responses)\n}\n\n// Re-export the internal function for direct use\nexport { validateResponsesFromXml }\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { g as DisplayAssociableChoice, D as DisplayBlock, a as DisplayChoice, b as DisplayChoiceInteraction, f as DisplayGap, h as DisplayGapText, d as DisplayInlineEmbed, c as DisplayItem, e as DisplayTextEmbed, F as FormShape, V as ValidateResult } from './types-BqqQtPL8.js';
|
|
2
1
|
export { j as AnyCondition, e as AnyInteraction, A as AssessmentItem, C as ChoiceCorrectness, f as ChoiceInteraction, a as ContentBlockRendererProps, F as FeedbackBlock, G as GapMatchInteraction, I as InlineChoiceInteraction, M as MatchInteraction, O as OrderInteraction, Q as QTIRendererProps, b as QTITheme, g as ResponseDeclaration, R as ResponseFeedback, h as ResponseProcessing, T as TextEntryInteraction } from './schema-C3cRJWrK.js';
|
|
2
|
+
export { g as DisplayAssociableChoice, D as DisplayBlock, a as DisplayChoice, b as DisplayChoiceInteraction, f as DisplayGap, h as DisplayGapText, d as DisplayInlineEmbed, c as DisplayItem, e as DisplayTextEmbed, F as FormShape, V as ValidateResult } from './types-BqqQtPL8.js';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
package/package.json
CHANGED