@longsightgroup/qti3-core 0.9.1 → 0.9.3

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.
Files changed (244) hide show
  1. package/README.md +59 -3
  2. package/dist/adaptive-turn-materializer.d.ts +14 -0
  3. package/dist/adaptive-turn-materializer.d.ts.map +1 -0
  4. package/dist/adaptive-turn-materializer.js +56 -0
  5. package/dist/adaptive-turn-materializer.js.map +1 -0
  6. package/dist/adaptive-turn.d.ts +23 -0
  7. package/dist/adaptive-turn.d.ts.map +1 -0
  8. package/dist/adaptive-turn.js +60 -0
  9. package/dist/adaptive-turn.js.map +1 -0
  10. package/dist/assert-never.d.ts +3 -0
  11. package/dist/assert-never.d.ts.map +1 -0
  12. package/dist/assert-never.js +5 -0
  13. package/dist/assert-never.js.map +1 -0
  14. package/dist/attempt-state-constants.d.ts +6 -0
  15. package/dist/attempt-state-constants.d.ts.map +1 -0
  16. package/dist/attempt-state-constants.js +6 -0
  17. package/dist/attempt-state-constants.js.map +1 -0
  18. package/dist/attempt-state.d.ts +5 -0
  19. package/dist/attempt-state.d.ts.map +1 -0
  20. package/dist/attempt-state.js +190 -0
  21. package/dist/attempt-state.js.map +1 -0
  22. package/dist/catalog.js +1 -1
  23. package/dist/catalog.js.map +1 -1
  24. package/dist/content-text.d.ts.map +1 -1
  25. package/dist/content-text.js +3 -0
  26. package/dist/content-text.js.map +1 -1
  27. package/dist/custom-operators.d.ts +13 -0
  28. package/dist/custom-operators.d.ts.map +1 -0
  29. package/dist/custom-operators.js +2 -0
  30. package/dist/custom-operators.js.map +1 -0
  31. package/dist/delivery-redaction.d.ts +50 -0
  32. package/dist/delivery-redaction.d.ts.map +1 -0
  33. package/dist/delivery-redaction.js +176 -0
  34. package/dist/delivery-redaction.js.map +1 -0
  35. package/dist/delivery-security.d.ts +3 -18
  36. package/dist/delivery-security.d.ts.map +1 -1
  37. package/dist/delivery-security.js +35 -189
  38. package/dist/delivery-security.js.map +1 -1
  39. package/dist/index.d.ts +4 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/parser-custom-interactions.js +1 -1
  44. package/dist/parser-custom-interactions.js.map +1 -1
  45. package/dist/parser-declarations.d.ts.map +1 -1
  46. package/dist/parser-declarations.js +4 -4
  47. package/dist/parser-declarations.js.map +1 -1
  48. package/dist/parser-item-metadata.d.ts.map +1 -1
  49. package/dist/parser-item-metadata.js +8 -7
  50. package/dist/parser-item-metadata.js.map +1 -1
  51. package/dist/parser-processing.js +2 -2
  52. package/dist/parser-processing.js.map +1 -1
  53. package/dist/parser-values.d.ts +5 -1
  54. package/dist/parser-values.d.ts.map +1 -1
  55. package/dist/parser-values.js +33 -0
  56. package/dist/parser-values.js.map +1 -1
  57. package/dist/processing-evaluator-boolean.d.ts +8 -0
  58. package/dist/processing-evaluator-boolean.d.ts.map +1 -0
  59. package/dist/processing-evaluator-boolean.js +47 -0
  60. package/dist/processing-evaluator-boolean.js.map +1 -0
  61. package/dist/processing-evaluator-collection.d.ts +12 -0
  62. package/dist/processing-evaluator-collection.d.ts.map +1 -0
  63. package/dist/processing-evaluator-collection.js +35 -0
  64. package/dist/processing-evaluator-collection.js.map +1 -0
  65. package/dist/processing-evaluator-comparison.d.ts +8 -0
  66. package/dist/processing-evaluator-comparison.d.ts.map +1 -0
  67. package/dist/processing-evaluator-comparison.js +88 -0
  68. package/dist/processing-evaluator-comparison.js.map +1 -0
  69. package/dist/processing-evaluator-custom.d.ts +8 -0
  70. package/dist/processing-evaluator-custom.d.ts.map +1 -0
  71. package/dist/processing-evaluator-custom.js +14 -0
  72. package/dist/processing-evaluator-custom.js.map +1 -0
  73. package/dist/processing-evaluator-geometry.d.ts +8 -0
  74. package/dist/processing-evaluator-geometry.d.ts.map +1 -0
  75. package/dist/processing-evaluator-geometry.js +21 -0
  76. package/dist/processing-evaluator-geometry.js.map +1 -0
  77. package/dist/processing-evaluator-numeric.d.ts +8 -0
  78. package/dist/processing-evaluator-numeric.d.ts.map +1 -0
  79. package/dist/processing-evaluator-numeric.js +112 -0
  80. package/dist/processing-evaluator-numeric.js.map +1 -0
  81. package/dist/processing-evaluator-string.d.ts +8 -0
  82. package/dist/processing-evaluator-string.d.ts.map +1 -0
  83. package/dist/processing-evaluator-string.js +33 -0
  84. package/dist/processing-evaluator-string.js.map +1 -0
  85. package/dist/processing-evaluator-variable.d.ts +8 -0
  86. package/dist/processing-evaluator-variable.d.ts.map +1 -0
  87. package/dist/processing-evaluator-variable.js +39 -0
  88. package/dist/processing-evaluator-variable.js.map +1 -0
  89. package/dist/processing-evaluator.d.ts +22 -0
  90. package/dist/processing-evaluator.d.ts.map +1 -0
  91. package/dist/processing-evaluator.js +137 -0
  92. package/dist/processing-evaluator.js.map +1 -0
  93. package/dist/processing-expression-children.d.ts +3 -0
  94. package/dist/processing-expression-children.d.ts.map +1 -0
  95. package/dist/processing-expression-children.js +68 -0
  96. package/dist/processing-expression-children.js.map +1 -0
  97. package/dist/processing-mapping.d.ts +13 -0
  98. package/dist/processing-mapping.d.ts.map +1 -0
  99. package/dist/processing-mapping.js +120 -0
  100. package/dist/processing-mapping.js.map +1 -0
  101. package/dist/processing-operators.d.ts +11 -0
  102. package/dist/processing-operators.d.ts.map +1 -0
  103. package/dist/processing-operators.js +178 -0
  104. package/dist/processing-operators.js.map +1 -0
  105. package/dist/processing-random.d.ts +2 -0
  106. package/dist/processing-random.d.ts.map +1 -0
  107. package/dist/processing-random.js +16 -0
  108. package/dist/processing-random.js.map +1 -0
  109. package/dist/processing-state.d.ts +8 -0
  110. package/dist/processing-state.d.ts.map +1 -0
  111. package/dist/processing-state.js +44 -0
  112. package/dist/processing-state.js.map +1 -0
  113. package/dist/processing-templates.d.ts +3 -0
  114. package/dist/processing-templates.d.ts.map +1 -0
  115. package/dist/processing-templates.js +12 -0
  116. package/dist/processing-templates.js.map +1 -0
  117. package/dist/processing-values.d.ts +15 -0
  118. package/dist/processing-values.d.ts.map +1 -0
  119. package/dist/processing-values.js +150 -0
  120. package/dist/processing-values.js.map +1 -0
  121. package/dist/processing-variables.d.ts +7 -0
  122. package/dist/processing-variables.d.ts.map +1 -0
  123. package/dist/processing-variables.js +40 -0
  124. package/dist/processing-variables.js.map +1 -0
  125. package/dist/serializer-processing-expressions.d.ts.map +1 -1
  126. package/dist/serializer-processing-expressions.js +2 -8
  127. package/dist/serializer-processing-expressions.js.map +1 -1
  128. package/dist/serializer-processing-xml.js +2 -2
  129. package/dist/serializer-processing-xml.js.map +1 -1
  130. package/dist/serializer-processing.d.ts.map +1 -1
  131. package/dist/serializer-processing.js +3 -0
  132. package/dist/serializer-processing.js.map +1 -1
  133. package/dist/server-scoring.d.ts +4 -14
  134. package/dist/server-scoring.d.ts.map +1 -1
  135. package/dist/server-scoring.js +19 -157
  136. package/dist/server-scoring.js.map +1 -1
  137. package/dist/session.d.ts +5 -14
  138. package/dist/session.d.ts.map +1 -1
  139. package/dist/session.js +76 -1158
  140. package/dist/session.js.map +1 -1
  141. package/dist/shared-vocabulary-coverage-policy.js +1 -1
  142. package/dist/shared-vocabulary-coverage-policy.js.map +1 -1
  143. package/dist/shared-vocabulary-generated-families.js +1 -1
  144. package/dist/shared-vocabulary-generated-families.js.map +1 -1
  145. package/dist/shared-vocabulary-support.js +3 -3
  146. package/dist/shared-vocabulary-support.js.map +1 -1
  147. package/dist/shared-vocabulary.d.ts.map +1 -1
  148. package/dist/shared-vocabulary.js +4 -3
  149. package/dist/shared-vocabulary.js.map +1 -1
  150. package/dist/support-evidence.d.ts +22 -0
  151. package/dist/support-evidence.d.ts.map +1 -0
  152. package/dist/support-evidence.js +93 -0
  153. package/dist/support-evidence.js.map +1 -0
  154. package/dist/support.d.ts.map +1 -1
  155. package/dist/support.js +38 -47
  156. package/dist/support.js.map +1 -1
  157. package/dist/trusted-item-session.d.ts +49 -0
  158. package/dist/trusted-item-session.d.ts.map +1 -0
  159. package/dist/trusted-item-session.js +261 -0
  160. package/dist/trusted-item-session.js.map +1 -0
  161. package/dist/tts.d.ts.map +1 -1
  162. package/dist/tts.js +16 -2
  163. package/dist/tts.js.map +1 -1
  164. package/dist/validation-geometry.d.ts +8 -0
  165. package/dist/validation-geometry.d.ts.map +1 -0
  166. package/dist/validation-geometry.js +187 -0
  167. package/dist/validation-geometry.js.map +1 -0
  168. package/dist/validation-interactions.d.ts +3 -0
  169. package/dist/validation-interactions.d.ts.map +1 -0
  170. package/dist/validation-interactions.js +644 -0
  171. package/dist/validation-interactions.js.map +1 -0
  172. package/dist/validation-primitives.d.ts +11 -0
  173. package/dist/validation-primitives.d.ts.map +1 -0
  174. package/dist/validation-primitives.js +48 -0
  175. package/dist/validation-primitives.js.map +1 -0
  176. package/dist/validation-processing.d.ts +4 -0
  177. package/dist/validation-processing.d.ts.map +1 -0
  178. package/dist/validation-processing.js +569 -0
  179. package/dist/validation-processing.js.map +1 -0
  180. package/dist/validation-shared-vocabulary-layout.d.ts +10 -0
  181. package/dist/validation-shared-vocabulary-layout.d.ts.map +1 -0
  182. package/dist/validation-shared-vocabulary-layout.js +102 -0
  183. package/dist/validation-shared-vocabulary-layout.js.map +1 -0
  184. package/dist/validation.d.ts.map +1 -1
  185. package/dist/validation.js +27 -1641
  186. package/dist/validation.js.map +1 -1
  187. package/dist/xml.js +1 -1
  188. package/dist/xml.js.map +1 -1
  189. package/package.json +4 -2
  190. package/src/adaptive-turn-materializer.ts +85 -0
  191. package/src/adaptive-turn.ts +109 -0
  192. package/src/assert-never.ts +4 -0
  193. package/src/attempt-state-constants.ts +5 -0
  194. package/src/attempt-state.ts +245 -0
  195. package/src/catalog.ts +1 -1
  196. package/src/content-text.ts +3 -0
  197. package/src/custom-operators.ts +12 -0
  198. package/src/delivery-redaction.ts +268 -0
  199. package/src/delivery-security.ts +59 -245
  200. package/src/index.ts +9 -0
  201. package/src/parser-custom-interactions.ts +1 -1
  202. package/src/parser-declarations.ts +4 -3
  203. package/src/parser-item-metadata.ts +8 -7
  204. package/src/parser-processing.ts +2 -2
  205. package/src/parser-values.ts +36 -0
  206. package/src/processing-evaluator-boolean.ts +48 -0
  207. package/src/processing-evaluator-collection.ts +50 -0
  208. package/src/processing-evaluator-comparison.ts +106 -0
  209. package/src/processing-evaluator-custom.ts +20 -0
  210. package/src/processing-evaluator-geometry.ts +26 -0
  211. package/src/processing-evaluator-numeric.ts +155 -0
  212. package/src/processing-evaluator-string.ts +60 -0
  213. package/src/processing-evaluator-variable.ts +81 -0
  214. package/src/processing-evaluator.ts +173 -0
  215. package/src/processing-expression-children.ts +69 -0
  216. package/src/processing-mapping.ts +153 -0
  217. package/src/processing-operators.ts +184 -0
  218. package/src/processing-random.ts +16 -0
  219. package/src/processing-state.ts +69 -0
  220. package/src/processing-templates.ts +12 -0
  221. package/src/processing-values.ts +162 -0
  222. package/src/processing-variables.ts +83 -0
  223. package/src/serializer-processing-expressions.ts +2 -12
  224. package/src/serializer-processing-xml.ts +2 -2
  225. package/src/serializer-processing.ts +3 -0
  226. package/src/server-scoring.ts +30 -226
  227. package/src/session.ts +128 -2006
  228. package/src/shared-vocabulary-coverage-policy.ts +1 -1
  229. package/src/shared-vocabulary-generated-families.ts +1 -1
  230. package/src/shared-vocabulary-support.ts +3 -3
  231. package/src/shared-vocabulary.ts +3 -2
  232. package/src/support-evidence.ts +107 -0
  233. package/src/support.ts +68 -54
  234. package/src/trusted-item-session.ts +429 -0
  235. package/src/tts.ts +29 -15
  236. package/src/validation-geometry.ts +204 -0
  237. package/src/validation-interactions.ts +831 -0
  238. package/src/validation-primitives.ts +63 -0
  239. package/src/validation-processing.ts +785 -0
  240. package/src/validation-shared-vocabulary-layout.ts +117 -0
  241. package/src/validation.ts +44 -2077
  242. package/src/xml.ts +1 -1
  243. package/src/interaction-test-fixtures.ts +0 -44
  244. package/src/serializer-processing.fixtures.ts +0 -469
package/README.md CHANGED
@@ -34,6 +34,24 @@ console.log(result.outcomes);
34
34
  console.log(result.state);
35
35
  ```
36
36
 
37
+ ### Randomized template items
38
+
39
+ QTI template processing can generate deterministic item variants with expressions such
40
+ as `qti-random-integer`, printed variables, and `qti-set-correct-response`:
41
+
42
+ ```ts
43
+ const session = createItemSession(parsed.document, undefined, { randomSeed: "attempt-123" });
44
+ const state = session.serialize();
45
+
46
+ store(state);
47
+
48
+ const resumed = createItemSession(parsed.document, state, { randomSeed: "different-seed" });
49
+ ```
50
+
51
+ Persist the returned `qti3.attempt-state.v1` state for resume. Once an attempt exists,
52
+ saved `templateValues` are authoritative; they are restored before generated correct
53
+ responses are derived, so resuming does not depend on the original seed.
54
+
37
55
  ### Candidate-safe delivery XML
38
56
 
39
57
  High-stakes delivery systems can redact answer-bearing item XML before sending it to
@@ -105,9 +123,47 @@ then runs response processing. It does not run candidate response-validation pol
105
123
  as required interactions, cardinality limits, or min/max response counts; delivery hosts
106
124
  should enforce that policy before accepting a submission or finalizing an attempt.
107
125
 
108
- The delivery redaction and server-scoring APIs are library APIs in `0.5.x`. CLI commands
109
- for delivery-safe XML generation and server-style scoring are not part of this release
110
- line yet.
126
+ Delivery redaction, server-style scoring, and secure adaptive turn handling are library
127
+ APIs. Dedicated CLI commands for those operations are planned separately.
128
+
129
+ ### Secure adaptive turns
130
+
131
+ Adaptive item delivery should run each submitted turn against authoritative XML on the
132
+ server, preserving prior `qti3.attempt-state.v1` between turns:
133
+
134
+ ```ts
135
+ import { processQtiAdaptiveItemTurn } from "@longsightgroup/qti3-core";
136
+
137
+ const turn = processQtiAdaptiveItemTurn({
138
+ itemXml: authoritativeItemXml,
139
+ priorState: savedAttemptState,
140
+ trustedResponses: { RESPONSE: "A" },
141
+ });
142
+
143
+ if (!turn.ok) {
144
+ throw new Error(turn.diagnostics.map((item) => item.message).join("; "));
145
+ }
146
+
147
+ store(turn.state);
148
+ sendToCandidate(turn.candidateSafeXml, turn.state);
149
+ ```
150
+
151
+ Deliver both artifacts to the player on each adaptive turn:
152
+
153
+ - `candidateSafeXml` — server-materialized presentation for the current turn (outcome-visible feedback, secrets stripped)
154
+ - `state` — authoritative `qti3.attempt-state.v1` with trusted responses, outcomes, and interaction state
155
+
156
+ ```ts
157
+ await player.loadXml(turn.candidateSafeXml);
158
+ player.restore(turn.state);
159
+ ```
160
+
161
+ Refresh turns with no new submission still return updated materialized XML derived from restored outcomes, so a resume flow should load both values again even when the candidate does not submit a new response.
162
+
163
+ The static delivery redactor still fails closed for adaptive response processing. Use
164
+ `processQtiAdaptiveItemTurn()` when a host needs a server-materialized candidate view
165
+ and updated authoritative outcomes for the next adaptive turn. The low-level adaptive-turn
166
+ redactor is internal to the core package; hosts should not call it directly.
111
167
 
112
168
  ## Scope
113
169
 
@@ -0,0 +1,14 @@
1
+ import { type QtiDeliverySecurityAnalysis } from "./delivery-redaction.js";
2
+ import type { QtiDiagnostic, QtiValue } from "./types.js";
3
+ export interface QtiAdaptiveCandidateMaterializationInput {
4
+ itemXml: string;
5
+ outcomes: Record<string, QtiValue>;
6
+ }
7
+ export interface QtiAdaptiveCandidateMaterializationResult {
8
+ ok: boolean;
9
+ diagnostics: QtiDiagnostic[];
10
+ analysis: QtiDeliverySecurityAnalysis;
11
+ xml?: string | undefined;
12
+ }
13
+ export declare function materializeAdaptiveCandidateView(input: QtiAdaptiveCandidateMaterializationInput): QtiAdaptiveCandidateMaterializationResult;
14
+ //# sourceMappingURL=adaptive-turn-materializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-turn-materializer.d.ts","sourceRoot":"","sources":["../src/adaptive-turn-materializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,2BAA2B,EAEjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW1D,MAAM,WAAW,wCAAwC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,yCAAyC;IACxD,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE,2BAA2B,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,wCAAwC,GAC9C,yCAAyC,CAE3C"}
@@ -0,0 +1,56 @@
1
+ import { FORBIDDEN_DELIVERY_SECRET_ELEMENT_NAMES, isDeclarationDefaultValue, redactDeliveryXml, } from "./delivery-redaction.js";
2
+ import { qtiValueToString } from "./value-format.js";
3
+ const UNSUPPORTED_MATERIALIZATION_ELEMENT_NAMES = new Set([
4
+ "template-processing",
5
+ "set-correct-response",
6
+ ]);
7
+ const FEEDBACK_ELEMENT_NAMES = new Set(["feedback-inline", "feedback-block", "modal-feedback"]);
8
+ export function materializeAdaptiveCandidateView(input) {
9
+ return redactDeliveryXml(input.itemXml, adaptiveMaterializationPolicy(input.outcomes));
10
+ }
11
+ function shouldPreserveFeedback(node, outcomes) {
12
+ if (node.attributes["show-hide"] === "hide")
13
+ return false;
14
+ const identifier = node.attributes.identifier;
15
+ const outcomeIdentifier = node.attributes["outcome-identifier"];
16
+ if (!identifier || !outcomeIdentifier)
17
+ return false;
18
+ const outcome = outcomes[outcomeIdentifier] ?? null;
19
+ if (Array.isArray(outcome))
20
+ return outcome.includes(identifier);
21
+ return qtiValueToString(outcome) === identifier;
22
+ }
23
+ function isFeedbackElement(normalizedName) {
24
+ return FEEDBACK_ELEMENT_NAMES.has(normalizedName);
25
+ }
26
+ function adaptiveMaterializationPolicy(outcomes) {
27
+ return {
28
+ isForbiddenElement(node, normalizedName) {
29
+ if (isFeedbackElement(normalizedName))
30
+ return !shouldPreserveFeedback(node, outcomes);
31
+ return (FORBIDDEN_DELIVERY_SECRET_ELEMENT_NAMES.has(normalizedName) ||
32
+ isDeclarationDefaultValue(node, normalizedName));
33
+ },
34
+ unsupportedFinding(node, normalizedName) {
35
+ if (!UNSUPPORTED_MATERIALIZATION_ELEMENT_NAMES.has(normalizedName))
36
+ return null;
37
+ return {
38
+ kind: "unsupported-secure-delivery-element",
39
+ qtiName: node.name,
40
+ localName: node.localName,
41
+ message: `${node.name} is not supported by adaptive candidate materialization v1.`,
42
+ source: node.source,
43
+ };
44
+ },
45
+ diagnosticCodeForFinding,
46
+ forbiddenElementMessage(node) {
47
+ return `${node.name} exposes answer keys, scoring, mapping, feedback, or solution information during adaptive delivery.`;
48
+ },
49
+ };
50
+ }
51
+ function diagnosticCodeForFinding(kind) {
52
+ return kind === "unsupported-secure-delivery-element"
53
+ ? "adaptiveTurn.materialization.unsupported"
54
+ : "adaptiveTurn.materialization.forbiddenElement";
55
+ }
56
+ //# sourceMappingURL=adaptive-turn-materializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-turn-materializer.js","sourceRoot":"","sources":["../src/adaptive-turn-materializer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uCAAuC,EACvC,yBAAyB,EACzB,iBAAiB,GAIlB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,yCAAyC,GAAG,IAAI,GAAG,CAAC;IACxD,qBAAqB;IACrB,sBAAsB;CACvB,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAchG,MAAM,UAAU,gCAAgC,CAC9C,KAA+C;IAE/C,OAAO,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAa,EAAE,QAAkC;IAC/E,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,IAAI,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAEpD,MAAM,OAAO,GAAG,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAC,cAAsB;IAC/C,OAAO,sBAAsB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,6BAA6B,CACpC,QAAkC;IAElC,OAAO;QACL,kBAAkB,CAAC,IAAI,EAAE,cAAc;YACrC,IAAI,iBAAiB,CAAC,cAAc,CAAC;gBAAE,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtF,OAAO,CACL,uCAAuC,CAAC,GAAG,CAAC,cAAc,CAAC;gBAC3D,yBAAyB,CAAC,IAAI,EAAE,cAAc,CAAC,CAChD,CAAC;QACJ,CAAC;QACD,kBAAkB,CAAC,IAAI,EAAE,cAAc;YACrC,IAAI,CAAC,yCAAyC,CAAC,GAAG,CAAC,cAAc,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChF,OAAO;gBACL,IAAI,EAAE,qCAAqC;gBAC3C,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,6DAA6D;gBAClF,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;QACJ,CAAC;QACD,wBAAwB;QACxB,uBAAuB,CAAC,IAAI;YAC1B,OAAO,GAAG,IAAI,CAAC,IAAI,qGAAqG,CAAC;QAC3H,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAoC;IACpE,OAAO,IAAI,KAAK,qCAAqC;QACnD,CAAC,CAAC,0CAA0C;QAC5C,CAAC,CAAC,+CAA+C,CAAC;AACtD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { QtiAttemptStateV1, QtiDiagnostic, QtiValue } from "./types.js";
2
+ import { type QtiTrustedItemParseOptions, type QtiTrustedResponseApplication, type QtiTrustedResponseInput } from "./trusted-item-session.js";
3
+ export type QtiAdaptiveTurnResponseInput = QtiTrustedResponseInput;
4
+ export interface QtiAdaptiveTurnInput extends QtiTrustedItemParseOptions, QtiTrustedResponseApplication {
5
+ itemXml: string;
6
+ /**
7
+ * Prior attempt state from a previous adaptive turn. Non-conforming values produce
8
+ * `adaptiveTurn.state.value` diagnostics instead of being silently accepted.
9
+ */
10
+ priorState?: unknown;
11
+ }
12
+ export interface QtiAdaptiveTurnResult {
13
+ ok: boolean;
14
+ diagnostics: QtiDiagnostic[];
15
+ state: QtiAttemptStateV1 | null;
16
+ responses: Record<string, QtiValue>;
17
+ outcomes: Record<string, QtiValue>;
18
+ score: number | null;
19
+ completionStatus: QtiValue;
20
+ candidateSafeXml?: string | undefined;
21
+ }
22
+ export declare function processQtiAdaptiveItemTurn(input: QtiAdaptiveTurnInput): QtiAdaptiveTurnResult;
23
+ //# sourceMappingURL=adaptive-turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-turn.d.ts","sourceRoot":"","sources":["../src/adaptive-turn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAGL,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC7B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,4BAA4B,GAAG,uBAAuB,CAAC;AAEnE,MAAM,WAAW,oBACf,SAAQ,0BAA0B,EAAE,6BAA6B;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CA0D7F"}
@@ -0,0 +1,60 @@
1
+ import { materializeAdaptiveCandidateView } from "./adaptive-turn-materializer.js";
2
+ import { readPriorAttemptState, runTrustedItemSession, } from "./trusted-item-session.js";
3
+ export function processQtiAdaptiveItemTurn(input) {
4
+ const priorStateResult = readPriorAttemptState(input.priorState, "adaptiveTurn");
5
+ if (priorStateResult.diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
6
+ return failed(priorStateResult.diagnostics);
7
+ }
8
+ const sessionResult = runTrustedItemSession({
9
+ itemXml: input.itemXml,
10
+ diagnosticPrefix: "adaptiveTurn",
11
+ allowedUndeclaredResponseIdentifiers: input.allowedUndeclaredResponseIdentifiers,
12
+ priorState: priorStateResult.state,
13
+ submission: {
14
+ trustedResponses: input.trustedResponses,
15
+ trustedInteractionStates: input.trustedInteractionStates,
16
+ },
17
+ scoring: "onSubmission",
18
+ requireNumericScore: true,
19
+ });
20
+ if (!sessionResult.ok) {
21
+ return failed(sessionResult.diagnostics, sessionResult.state, sessionResult.outcomes, sessionResult.score);
22
+ }
23
+ const delivery = materializeAdaptiveCandidateView({
24
+ itemXml: input.itemXml,
25
+ outcomes: sessionResult.outcomes,
26
+ });
27
+ const deliveryDiagnostics = [...sessionResult.diagnostics, ...delivery.diagnostics];
28
+ if (!delivery.ok || !delivery.xml) {
29
+ return failed([
30
+ ...deliveryDiagnostics,
31
+ {
32
+ code: "adaptiveTurn.delivery.materialization",
33
+ severity: "error",
34
+ message: "Adaptive turn did not produce candidate-safe item XML.",
35
+ },
36
+ ], sessionResult.state, sessionResult.outcomes, sessionResult.score);
37
+ }
38
+ return {
39
+ ok: true,
40
+ diagnostics: deliveryDiagnostics,
41
+ state: sessionResult.state,
42
+ responses: sessionResult.responses,
43
+ outcomes: sessionResult.outcomes,
44
+ score: sessionResult.score,
45
+ completionStatus: sessionResult.outcomes.completionStatus ?? null,
46
+ candidateSafeXml: delivery.xml,
47
+ };
48
+ }
49
+ function failed(diagnostics, state = null, outcomes = {}, score = null) {
50
+ return {
51
+ ok: false,
52
+ diagnostics,
53
+ state,
54
+ responses: state?.responses ?? {},
55
+ outcomes,
56
+ score,
57
+ completionStatus: outcomes.completionStatus ?? null,
58
+ };
59
+ }
60
+ //# sourceMappingURL=adaptive-turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-turn.js","sourceRoot":"","sources":["../src/adaptive-turn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GAItB,MAAM,2BAA2B,CAAC;AAyBnC,MAAM,UAAU,0BAA0B,CAAC,KAA2B;IACpE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACjF,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QACvF,OAAO,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,aAAa,GAAG,qBAAqB,CAAC;QAC1C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,cAAc;QAChC,oCAAoC,EAAE,KAAK,CAAC,oCAAoC;QAChF,UAAU,EAAE,gBAAgB,CAAC,KAAK;QAClC,UAAU,EAAE;YACV,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;SACzD;QACD,OAAO,EAAE,cAAc;QACvB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IACH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,OAAO,MAAM,CACX,aAAa,CAAC,WAAW,EACzB,aAAa,CAAC,KAAK,EACnB,aAAa,CAAC,QAAQ,EACtB,aAAa,CAAC,KAAK,CACpB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,gCAAgC,CAAC;QAChD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,aAAa,CAAC,QAAQ;KACjC,CAAC,CAAC;IACH,MAAM,mBAAmB,GAAG,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAClC,OAAO,MAAM,CACX;YACE,GAAG,mBAAmB;YACtB;gBACE,IAAI,EAAE,uCAAuC;gBAC7C,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,wDAAwD;aAClE;SACF,EACD,aAAa,CAAC,KAAK,EACnB,aAAa,CAAC,QAAQ,EACtB,aAAa,CAAC,KAAK,CACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,mBAAmB;QAChC,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,gBAAgB,IAAI,IAAI;QACjE,gBAAgB,EAAE,QAAQ,CAAC,GAAG;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CACb,WAA4B,EAC5B,QAAkC,IAAI,EACtC,WAAqC,EAAE,EACvC,QAAuB,IAAI;IAE3B,OAAO;QACL,EAAE,EAAE,KAAK;QACT,WAAW;QACX,KAAK;QACL,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE;QACjC,QAAQ;QACR,KAAK;QACL,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,IAAI,IAAI;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Fail loudly when a value should be unreachable after exhaustive union handling. */
2
+ export declare function assertNever(value: never, message?: string): never;
3
+ //# sourceMappingURL=assert-never.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-never.d.ts","sourceRoot":"","sources":["../src/assert-never.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEjE"}
@@ -0,0 +1,5 @@
1
+ /** Fail loudly when a value should be unreachable after exhaustive union handling. */
2
+ export function assertNever(value, message) {
3
+ throw new Error(message ?? `Unexpected value: ${String(value)}`);
4
+ }
5
+ //# sourceMappingURL=assert-never.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-never.js","sourceRoot":"","sources":["../src/assert-never.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,OAAgB;IACxD,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,qBAAqB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const ATTEMPT_STATE_SCHEMA = "qti3.attempt-state.v1";
2
+ export declare const COMPLETION_STATUS = "completionStatus";
3
+ export declare const COMPLETION_NOT_ATTEMPTED = "not_attempted";
4
+ export declare const COMPLETION_UNKNOWN = "unknown";
5
+ export declare const COMPLETION_COMPLETED = "completed";
6
+ //# sourceMappingURL=attempt-state-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-state-constants.d.ts","sourceRoot":"","sources":["../src/attempt-state-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAC5D,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AACpD,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AACxD,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAC5C,eAAO,MAAM,oBAAoB,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const ATTEMPT_STATE_SCHEMA = "qti3.attempt-state.v1";
2
+ export const COMPLETION_STATUS = "completionStatus";
3
+ export const COMPLETION_NOT_ATTEMPTED = "not_attempted";
4
+ export const COMPLETION_UNKNOWN = "unknown";
5
+ export const COMPLETION_COMPLETED = "completed";
6
+ //# sourceMappingURL=attempt-state-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-state-constants.js","sourceRoot":"","sources":["../src/attempt-state-constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AACpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { QtiAttemptStateV1, QtiDocument } from "./types.js";
2
+ export declare function isQtiAttemptStateV1(value: unknown): value is QtiAttemptStateV1;
3
+ export declare function assertQtiAttemptStateV1(value: unknown): asserts value is QtiAttemptStateV1;
4
+ export declare function assertCompatiblePriorState(document: QtiDocument, priorState: QtiAttemptStateV1 | undefined): void;
5
+ //# sourceMappingURL=attempt-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-state.d.ts","sourceRoot":"","sources":["../src/attempt-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAGjB,WAAW,EAKZ,MAAM,YAAY,CAAC;AAYpB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAG1F;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,iBAAiB,GAAG,SAAS,GACxC,IAAI,CAyDN"}
@@ -0,0 +1,190 @@
1
+ import { ATTEMPT_STATE_SCHEMA, COMPLETION_COMPLETED, COMPLETION_NOT_ATTEMPTED, COMPLETION_STATUS, COMPLETION_UNKNOWN, } from "./attempt-state-constants.js";
2
+ import { isQtiPortableCustomStateValue, isQtiValue, qtiValueToString } from "./value-format.js";
3
+ import { isRecordValue } from "./processing-values.js";
4
+ import { isPair, isPoint } from "./validation-primitives.js";
5
+ export function isQtiAttemptStateV1(value) {
6
+ return attemptStateErrors(value).length === 0;
7
+ }
8
+ export function assertQtiAttemptStateV1(value) {
9
+ const [firstError] = attemptStateErrors(value);
10
+ if (firstError)
11
+ throw new Error(firstError);
12
+ }
13
+ export function assertCompatiblePriorState(document, priorState) {
14
+ if (!priorState)
15
+ return;
16
+ assertQtiAttemptStateV1(priorState);
17
+ if (priorState.itemIdentifier !== document.item.identifier) {
18
+ throw new Error(`Cannot restore state for ${priorState.itemIdentifier} into ${document.item.identifier}.`);
19
+ }
20
+ const responseIdentifiers = new Set(document.item.responseDeclarations.map((declaration) => declaration.identifier));
21
+ const outcomeIdentifiers = new Set([
22
+ ...document.item.outcomeDeclarations.map((declaration) => declaration.identifier),
23
+ COMPLETION_STATUS,
24
+ ]);
25
+ const templateIdentifiers = new Set(document.item.templateDeclarations.map((declaration) => declaration.identifier));
26
+ const interactionStateIdentifiers = new Set(document.item.interactions
27
+ .filter((interaction) => interaction.type === "portableCustom")
28
+ .map((interaction) => interaction.responseIdentifier)
29
+ .filter((identifier) => Boolean(identifier)));
30
+ assertKnownStateIdentifiers("response", priorState.responses, responseIdentifiers);
31
+ assertKnownStateIdentifiers("outcome", priorState.outcomes, outcomeIdentifiers);
32
+ assertKnownStateIdentifiers("template", priorState.templateValues ?? {}, templateIdentifiers);
33
+ assertKnownPortableCustomStateIdentifiers(priorState.interactionStates ?? {}, interactionStateIdentifiers);
34
+ for (const message of priorState.validationMessages) {
35
+ if (message.path && !responseIdentifiers.has(message.path)) {
36
+ throw new Error(`Cannot restore validation message for unknown response ${message.path}.`);
37
+ }
38
+ }
39
+ for (const declaration of document.item.responseDeclarations) {
40
+ assertRestoredValueMatchesDeclaration("response", declaration, priorState.responses);
41
+ }
42
+ for (const declaration of document.item.outcomeDeclarations) {
43
+ assertRestoredValueMatchesDeclaration("outcome", declaration, priorState.outcomes);
44
+ }
45
+ for (const declaration of document.item.templateDeclarations) {
46
+ assertRestoredValueMatchesDeclaration("template", declaration, priorState.templateValues ?? {});
47
+ }
48
+ const completionStatus = priorState.outcomes[COMPLETION_STATUS];
49
+ if (completionStatus !== undefined &&
50
+ completionStatus !== COMPLETION_NOT_ATTEMPTED &&
51
+ completionStatus !== COMPLETION_UNKNOWN &&
52
+ completionStatus !== COMPLETION_COMPLETED &&
53
+ completionStatus !== "incomplete") {
54
+ throw new Error(`Cannot restore unsupported completionStatus ${qtiValueToString(completionStatus)}.`);
55
+ }
56
+ }
57
+ function assertKnownStateIdentifiers(kind, record, allowed) {
58
+ const unknown = Object.keys(record).find((identifier) => !allowed.has(identifier));
59
+ if (unknown)
60
+ throw new Error(`Cannot restore unknown ${kind} identifier ${unknown}.`);
61
+ }
62
+ function assertKnownPortableCustomStateIdentifiers(record, allowed) {
63
+ const unknown = Object.keys(record).find((identifier) => !allowed.has(identifier));
64
+ if (unknown)
65
+ throw new Error(`Cannot restore unknown interaction state identifier ${unknown}.`);
66
+ }
67
+ function assertRestoredValueMatchesDeclaration(kind, declaration, record) {
68
+ if (!(declaration.identifier in record))
69
+ return;
70
+ const value = record[declaration.identifier] ?? null;
71
+ const error = restoredValueError(declaration, value);
72
+ if (error)
73
+ throw new Error(`Cannot restore ${kind} ${declaration.identifier}: ${error}.`);
74
+ }
75
+ function restoredValueError(declaration, value) {
76
+ if (value === null)
77
+ return undefined;
78
+ if (declaration.cardinality === "record") {
79
+ return isRecordValue(value) ? undefined : "expected record value";
80
+ }
81
+ if (isRecordValue(value))
82
+ return "expected scalar value";
83
+ if (declaration.cardinality === "single" && Array.isArray(value)) {
84
+ return "expected single value";
85
+ }
86
+ if ((declaration.cardinality === "multiple" || declaration.cardinality === "ordered") &&
87
+ !Array.isArray(value)) {
88
+ return `expected ${declaration.cardinality} value container`;
89
+ }
90
+ if (!declaration.baseType)
91
+ return undefined;
92
+ for (const entry of restoredValueEntries(value)) {
93
+ if (!restoredScalarMatchesBaseType(entry, declaration.baseType)) {
94
+ return `value ${String(entry)} is not valid for base-type ${declaration.baseType}`;
95
+ }
96
+ }
97
+ return undefined;
98
+ }
99
+ function restoredValueEntries(value) {
100
+ if (value === null || isRecordValue(value))
101
+ return [];
102
+ return Array.isArray(value) ? value : [value];
103
+ }
104
+ function restoredScalarMatchesBaseType(value, baseType) {
105
+ if (!baseType)
106
+ return true;
107
+ if (baseType === "integer") {
108
+ return typeof value === "number" ? Number.isInteger(value) : /^-?\d+$/.test(String(value));
109
+ }
110
+ if (baseType === "float") {
111
+ return typeof value === "number" ? Number.isFinite(value) : Number.isFinite(Number(value));
112
+ }
113
+ if (baseType === "boolean")
114
+ return typeof value === "boolean" || value === "true" || value === "false";
115
+ if (baseType === "point")
116
+ return isPoint(String(value));
117
+ if (baseType === "pair" || baseType === "directedPair")
118
+ return isPair(String(value));
119
+ if (baseType === "identifier")
120
+ return typeof value === "string" && value.trim().length > 0 && !/\s/.test(value);
121
+ return typeof value === "string";
122
+ }
123
+ function isAttemptStatus(value) {
124
+ return (value === "initialized" ||
125
+ value === "interacting" ||
126
+ value === "suspended" ||
127
+ value === "completed");
128
+ }
129
+ function attemptStateErrors(value) {
130
+ if (!isRecord(value))
131
+ return ["QTI attempt state must be an object."];
132
+ const schema = value.schema;
133
+ if (schema !== ATTEMPT_STATE_SCHEMA) {
134
+ return [`Unsupported QTI attempt state schema ${String(schema)}.`];
135
+ }
136
+ const errors = [];
137
+ if (typeof value.itemIdentifier !== "string" || value.itemIdentifier.length === 0) {
138
+ errors.push("QTI attempt state itemIdentifier must be a non-empty string.");
139
+ }
140
+ if (typeof value.status !== "string" || !isAttemptStatus(value.status)) {
141
+ errors.push(`QTI attempt state status ${String(value.status)} is not supported.`);
142
+ }
143
+ if (!isQtiValueRecord(value.responses)) {
144
+ errors.push("QTI attempt state responses must be a record of QTI values.");
145
+ }
146
+ if (!isQtiValueRecord(value.outcomes)) {
147
+ errors.push("QTI attempt state outcomes must be a record of QTI values.");
148
+ }
149
+ if (value.templateValues !== undefined && !isQtiValueRecord(value.templateValues)) {
150
+ errors.push("QTI attempt state templateValues must be a record of QTI values.");
151
+ }
152
+ if (value.interactionStates !== undefined &&
153
+ !isPortableCustomStateRecord(value.interactionStates)) {
154
+ errors.push("QTI attempt state interactionStates must be a record of JSON values.");
155
+ }
156
+ if (!isDiagnosticArray(value.validationMessages)) {
157
+ errors.push("QTI attempt state validationMessages must be an array of diagnostics.");
158
+ }
159
+ return errors;
160
+ }
161
+ function isQtiValueRecord(value) {
162
+ if (!isRecord(value))
163
+ return false;
164
+ return Object.values(value).every(isQtiValue);
165
+ }
166
+ function isPortableCustomStateRecord(value) {
167
+ if (!isRecord(value))
168
+ return false;
169
+ return Object.values(value).every(isQtiPortableCustomStateValue);
170
+ }
171
+ function isDiagnosticArray(value) {
172
+ if (!Array.isArray(value))
173
+ return false;
174
+ return value.every((item) => {
175
+ if (!isRecord(item))
176
+ return false;
177
+ if (typeof item.code !== "string" || item.code.length === 0)
178
+ return false;
179
+ if (item.severity !== "info" && item.severity !== "warning" && item.severity !== "error") {
180
+ return false;
181
+ }
182
+ if (typeof item.message !== "string" || item.message.length === 0)
183
+ return false;
184
+ return item.path === undefined || typeof item.path === "string";
185
+ });
186
+ }
187
+ function isRecord(value) {
188
+ return typeof value === "object" && value !== null && !Array.isArray(value);
189
+ }
190
+ //# sourceMappingURL=attempt-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-state.js","sourceRoot":"","sources":["../src/attempt-state.ts"],"names":[],"mappings":"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"}
package/dist/catalog.js CHANGED
@@ -39,7 +39,7 @@ function selectedCandidates(card, languages, options) {
39
39
  rank: languageMatchRank(candidate.language, languages),
40
40
  }))
41
41
  .filter((entry) => Number.isInteger(entry.rank))
42
- .sort((a, b) => a.rank - b.rank || a.index - b.index);
42
+ .toSorted((a, b) => a.rank - b.rank || a.index - b.index);
43
43
  if (languageMatches.length > 0)
44
44
  return languageMatches.map((entry) => entry.candidate);
45
45
  if (options.includeDefaultFallback === false)
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAsDA,MAAM,UAAU,8BAA8B,CAC5C,KAAsC,EACtC,UAA8C,EAAE;IAEhD,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAU,CAAC,IAAI,EAAE,CAClF,CAAC;IAEF,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,UAAU;QAC/B,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACnD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAgC;gBAC5C,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;aAC5F,CAAC;YACF,IAAI,OAAO;gBAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;YACxC,IAAI,SAAS,CAAC,MAAM;gBAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YACzD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAmB,EACnB,aAAsC,EACtC,SAAmB,EACnB,OAA2C;IAE3C,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;QAC/E,OAAO,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACpE,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CACpC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAoB,EACpB,SAAmB,EACnB,OAA2C;IAE3C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACrD,CAAC;IAED,MAAM,eAAe,GAAG,UAAU;SAC/B,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1B,SAAS;QACT,KAAK;QACL,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC;KACvD,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,KAAK,EAAkE,EAAE,CAChF,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAC7B;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,sBAAsB,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAoB;IAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO;QACL;YACE,IAAI;YACJ,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB,EAAE,KAA0B;IACtE,MAAM,SAAS,GAAc;QAC3B,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IACF,IAAI,KAAK,CAAC,QAAQ;QAAE,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACxD,IAAI,KAAK,CAAC,WAAW;QAAE,SAAS,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAClD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,OAAmB,EAAE,SAAoB;IAChE,MAAM,QAAQ,GAA8B;QAC1C,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO;QAC/B,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;QACzC,iBAAiB,EAAE,OAAO,CAAC,UAAU;KACtC,CAAC;IACF,IAAI,SAAS,CAAC,QAAQ;QAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IAC/D,IAAI,SAAS,CAAC,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACzD,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM;QAAE,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM;QAAE,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CACxB,QAA4B,EAC5B,kBAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC/E,KAAK,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,IAAI,kBAAkB,KAAK,iBAAiB;YAAE,OAAO,KAAK,GAAG,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC;QAC9E,IAAI,eAAe,KAAK,gBAAgB;YAAE,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,KAA6C;IACjE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAA6C;IAC/D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-text.d.ts","sourceRoot":"","sources":["../src/content-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,IAAI,CAGN;AAOD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAKR;AA+BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAQR"}
1
+ {"version":3,"file":"content-text.d.ts","sourceRoot":"","sources":["../src/content-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/E,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,IAAI,CAGN;AAOD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAKR;AAiCD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAQR"}
@@ -1,3 +1,4 @@
1
+ import { assertNever } from "./assert-never.js";
1
2
  export function normalizeFlatText(text) {
2
3
  return text.replace(/\s+/g, " ").trim();
3
4
  }
@@ -45,6 +46,8 @@ function flatTextFromContentNode(node, excludeAnnotations) {
45
46
  case "interaction":
46
47
  case "printedVariable":
47
48
  return "";
49
+ default:
50
+ return assertNever(node);
48
51
  }
49
52
  }
50
53
  export function choiceAccessibleLabel(choice, fallbackIdentifier) {
@@ -1 +1 @@
1
- {"version":3,"file":"content-text.js","sourceRoot":"","sources":["../src/content-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-text.js","sourceRoot":"","sources":["../src/content-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { QtiProcessingExpression, QtiValue } from "./types.js";
2
+ export interface QtiCustomOperatorContext {
3
+ definition?: string | undefined;
4
+ className?: string | undefined;
5
+ attributes: Record<string, string>;
6
+ values: QtiValue[];
7
+ expression: Extract<QtiProcessingExpression, {
8
+ type: "customOperator";
9
+ }>;
10
+ }
11
+ export type QtiCustomOperatorHandler = (context: QtiCustomOperatorContext) => QtiValue;
12
+ export type QtiCustomOperatorRegistry = Record<string, QtiCustomOperatorHandler>;
13
+ //# sourceMappingURL=custom-operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-operators.d.ts","sourceRoot":"","sources":["../src/custom-operators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC,uBAAuB,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAC;CAC1E;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,QAAQ,CAAC;AACvF,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=custom-operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-operators.js","sourceRoot":"","sources":["../src/custom-operators.ts"],"names":[],"mappings":""}