@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
@@ -0,0 +1,569 @@
1
+ import { expressionChildren } from "./processing-expression-children.js";
2
+ import { MATH_OPERATOR_NAMES, STATS_OPERATOR_NAMES } from "./processing-operators.js";
3
+ import { responseProcessingTemplateKind, } from "./processing-templates.js";
4
+ import { isBaseType, isFiniteNumber, isInteger } from "./validation-primitives.js";
5
+ import { COMPLETION_STATUS } from "./attempt-state-constants.js";
6
+ export function validateResponseProcessingTemplate(item, diagnostics) {
7
+ const template = item.responseProcessing?.template;
8
+ if (!template)
9
+ return;
10
+ const templateKind = responseProcessingTemplateKind(template);
11
+ if (templateKind) {
12
+ validateBuiltInResponseProcessingTemplate(item, templateKind, diagnostics);
13
+ return;
14
+ }
15
+ diagnostics.push({
16
+ code: "processing.template.unsupported",
17
+ severity: "error",
18
+ message: `qti-response-processing template ${template} is not currently supported.`,
19
+ path: item.source?.path,
20
+ source: item.source,
21
+ });
22
+ }
23
+ function validateBuiltInResponseProcessingTemplate(item, templateKind, diagnostics) {
24
+ const response = item.responseDeclarations.find((declaration) => declaration.identifier === "RESPONSE");
25
+ const score = item.outcomeDeclarations.find((declaration) => declaration.identifier === "SCORE");
26
+ if (!response) {
27
+ diagnostics.push({
28
+ code: "processing.template.responseIdentifier",
29
+ severity: "error",
30
+ message: "Built-in response-processing templates require a response declaration named RESPONSE.",
31
+ path: item.source?.path,
32
+ source: item.source,
33
+ });
34
+ }
35
+ if (!score) {
36
+ diagnostics.push({
37
+ code: "processing.template.scoreIdentifier",
38
+ severity: "error",
39
+ message: "Built-in response-processing templates require an outcome declaration named SCORE.",
40
+ path: item.source?.path,
41
+ source: item.source,
42
+ });
43
+ }
44
+ else if (score.cardinality !== "single" || score.baseType !== "float") {
45
+ diagnostics.push({
46
+ code: "processing.template.scoreDeclaration",
47
+ severity: "error",
48
+ message: "Built-in response-processing templates require SCORE to be single cardinality with base-type float.",
49
+ path: score.source?.path,
50
+ source: score.source,
51
+ });
52
+ }
53
+ const responseInteractions = item.interactions.filter((interaction) => interaction.responseIdentifier === "RESPONSE");
54
+ if (responseInteractions.length !== 1 || item.interactions.length !== 1) {
55
+ diagnostics.push({
56
+ code: "processing.template.singleInteraction",
57
+ severity: "error",
58
+ message: "Built-in response-processing templates require a single interaction bound to RESPONSE.",
59
+ path: item.source?.path,
60
+ source: item.source,
61
+ });
62
+ }
63
+ if (templateKind === "mapResponse" && response && !response.mapping) {
64
+ diagnostics.push({
65
+ code: "processing.template.mapping",
66
+ severity: "error",
67
+ message: "The map_response template requires RESPONSE to define qti-mapping.",
68
+ path: response.source?.path,
69
+ source: response.source,
70
+ });
71
+ }
72
+ if (templateKind === "mapResponsePoint" && response && !response.areaMapping) {
73
+ diagnostics.push({
74
+ code: "processing.template.areaMapping",
75
+ severity: "error",
76
+ message: "The map_response_point template requires RESPONSE to define qti-area-mapping.",
77
+ path: response.source?.path,
78
+ source: response.source,
79
+ });
80
+ }
81
+ }
82
+ export function validateProcessingReferences(item, diagnostics) {
83
+ const responses = new Set(item.responseDeclarations.map((declaration) => declaration.identifier));
84
+ const outcomes = new Set(item.outcomeDeclarations.map((declaration) => declaration.identifier));
85
+ outcomes.add(COMPLETION_STATUS);
86
+ const templates = new Set(item.templateDeclarations.map((declaration) => declaration.identifier));
87
+ const variables = new Set([...responses, ...outcomes, ...templates]);
88
+ for (const rule of item.templateProcessing?.rules ?? []) {
89
+ validateTemplateRule(rule, responses, outcomes, templates, variables, diagnostics);
90
+ }
91
+ for (const rule of item.responseProcessing?.rules ?? []) {
92
+ validateResponseRule(rule, outcomes, responses, variables, diagnostics);
93
+ }
94
+ }
95
+ function validateResponseCondition(condition, outcomes, responses, variables, diagnostics) {
96
+ validateExpressionReferences(condition.ifExpression, responses, variables, diagnostics);
97
+ for (const rule of condition.thenRules) {
98
+ validateResponseRule(rule, outcomes, responses, variables, diagnostics);
99
+ }
100
+ for (const branch of condition.elseIfs) {
101
+ validateExpressionReferences(branch.expression, responses, variables, diagnostics);
102
+ for (const rule of branch.rules) {
103
+ validateResponseRule(rule, outcomes, responses, variables, diagnostics);
104
+ }
105
+ }
106
+ for (const rule of condition.elseRules) {
107
+ validateResponseRule(rule, outcomes, responses, variables, diagnostics);
108
+ }
109
+ }
110
+ function validateTemplateRule(rule, responses, outcomes, templates, variables, diagnostics) {
111
+ if (rule.type === "exitTemplate")
112
+ return;
113
+ if (rule.type === "templateConstraint") {
114
+ validateExpressionReferences(rule.expression, responses, variables, diagnostics);
115
+ return;
116
+ }
117
+ if (rule.type === "templateCondition") {
118
+ validateExpressionReferences(rule.ifExpression, responses, variables, diagnostics);
119
+ for (const branchRule of rule.thenRules) {
120
+ validateTemplateRule(branchRule, responses, outcomes, templates, variables, diagnostics);
121
+ }
122
+ for (const branch of rule.elseIfs) {
123
+ validateExpressionReferences(branch.expression, responses, variables, diagnostics);
124
+ for (const branchRule of branch.rules) {
125
+ validateTemplateRule(branchRule, responses, outcomes, templates, variables, diagnostics);
126
+ }
127
+ }
128
+ for (const branchRule of rule.elseRules) {
129
+ validateTemplateRule(branchRule, responses, outcomes, templates, variables, diagnostics);
130
+ }
131
+ return;
132
+ }
133
+ if (rule.type === "setTemplateValue") {
134
+ validateProcessingIdentifier(rule.identifier, "processing.templateTarget", rule.source, diagnostics);
135
+ if (rule.identifier && !templates.has(rule.identifier)) {
136
+ diagnostics.push({
137
+ code: "processing.templateTarget.reference",
138
+ severity: "error",
139
+ message: `qti-set-template-value references missing template declaration ${rule.identifier}.`,
140
+ path: rule.source?.path,
141
+ source: rule.source,
142
+ });
143
+ }
144
+ }
145
+ if (rule.type === "setDefaultValue") {
146
+ validateProcessingIdentifier(rule.identifier, "processing.defaultTarget", rule.source, diagnostics);
147
+ if (rule.identifier && !responses.has(rule.identifier) && !outcomes.has(rule.identifier)) {
148
+ diagnostics.push({
149
+ code: "processing.defaultTarget.reference",
150
+ severity: "error",
151
+ message: `qti-set-default-value references missing response or outcome declaration ${rule.identifier}.`,
152
+ path: rule.source?.path,
153
+ source: rule.source,
154
+ });
155
+ }
156
+ }
157
+ if (rule.type === "setCorrectResponse") {
158
+ validateProcessingIdentifier(rule.identifier, "processing.correctResponse", rule.source, diagnostics);
159
+ if (rule.identifier && !responses.has(rule.identifier)) {
160
+ diagnostics.push({
161
+ code: "processing.correctResponse.reference",
162
+ severity: "error",
163
+ message: `qti-set-correct-response references missing response declaration ${rule.identifier}.`,
164
+ path: rule.source?.path,
165
+ source: rule.source,
166
+ });
167
+ }
168
+ }
169
+ validateExpressionReferences(rule.expression, responses, variables, diagnostics);
170
+ }
171
+ function validateResponseRule(rule, outcomes, responses, variables, diagnostics) {
172
+ if (rule.type === "exitResponse")
173
+ return;
174
+ if (rule.type === "responseCondition") {
175
+ validateResponseCondition(rule.condition, outcomes, responses, variables, diagnostics);
176
+ return;
177
+ }
178
+ if (rule.type === "responseProcessingFragment") {
179
+ for (const childRule of rule.rules) {
180
+ validateResponseRule(childRule, outcomes, responses, variables, diagnostics);
181
+ }
182
+ return;
183
+ }
184
+ if (rule.type === "lookupOutcomeValue") {
185
+ validateLookupOutcomeRule(rule, outcomes, responses, variables, diagnostics);
186
+ return;
187
+ }
188
+ validateSetOutcomeRule(rule, outcomes, responses, variables, diagnostics);
189
+ }
190
+ function validateLookupOutcomeRule(rule, outcomes, responses, variables, diagnostics) {
191
+ validateProcessingIdentifier(rule.identifier, "processing.lookupOutcomeTarget", rule.source, diagnostics);
192
+ if (rule.identifier && !outcomes.has(rule.identifier)) {
193
+ diagnostics.push({
194
+ code: "processing.lookupOutcomeTarget.reference",
195
+ severity: "error",
196
+ message: `qti-lookup-outcome-value references missing outcome declaration ${rule.identifier}.`,
197
+ path: rule.source?.path,
198
+ source: rule.source,
199
+ });
200
+ }
201
+ validateExpressionReferences(rule.expression, responses, variables, diagnostics);
202
+ }
203
+ function validateSetOutcomeRule(rule, outcomes, responses, variables, diagnostics) {
204
+ validateProcessingIdentifier(rule.identifier, "processing.outcomeTarget", rule.source, diagnostics);
205
+ if (rule.identifier && !outcomes.has(rule.identifier)) {
206
+ diagnostics.push({
207
+ code: "processing.outcomeTarget.reference",
208
+ severity: "error",
209
+ message: `qti-set-outcome-value references missing outcome declaration ${rule.identifier}.`,
210
+ path: rule.source?.path,
211
+ source: rule.source,
212
+ });
213
+ }
214
+ validateExpressionReferences(rule.expression, responses, variables, diagnostics);
215
+ }
216
+ function validateExpressionReferences(expression, responses, variables, diagnostics) {
217
+ if (!expression)
218
+ return;
219
+ if (expression.type === "variable" || expression.type === "isNull") {
220
+ validateProcessingIdentifier(expression.identifier, "processing.variable", expression.source, diagnostics);
221
+ if (expression.identifier && !variables.has(expression.identifier)) {
222
+ diagnostics.push({
223
+ code: "processing.variable.reference",
224
+ severity: "error",
225
+ message: `Processing expression references missing variable ${expression.identifier}.`,
226
+ path: expression.source?.path,
227
+ source: expression.source,
228
+ });
229
+ }
230
+ }
231
+ if (expression.type === "matchCorrect") {
232
+ validateProcessingIdentifier(expression.identifier, "processing.response", expression.source, diagnostics);
233
+ if (expression.identifier && !responses.has(expression.identifier)) {
234
+ diagnostics.push({
235
+ code: "processing.response.reference",
236
+ severity: "error",
237
+ message: `Processing expression references missing response declaration ${expression.identifier}.`,
238
+ path: expression.source?.path,
239
+ source: expression.source,
240
+ });
241
+ }
242
+ validateProcessingIdentifier(expression.correctIdentifier, "processing.correct", expression.source, diagnostics);
243
+ if (expression.correctIdentifier && !responses.has(expression.correctIdentifier)) {
244
+ diagnostics.push({
245
+ code: "processing.correct.reference",
246
+ severity: "error",
247
+ message: `Processing expression references missing correct response declaration ${expression.correctIdentifier}.`,
248
+ path: expression.source?.path,
249
+ source: expression.source,
250
+ });
251
+ }
252
+ }
253
+ if (expression.type === "mapResponse" || expression.type === "mapResponsePoint") {
254
+ validateProcessingIdentifier(expression.identifier, "processing.response", expression.source, diagnostics);
255
+ if (expression.identifier && !responses.has(expression.identifier)) {
256
+ diagnostics.push({
257
+ code: "processing.response.reference",
258
+ severity: "error",
259
+ message: `Processing expression references missing response declaration ${expression.identifier}.`,
260
+ path: expression.source?.path,
261
+ source: expression.source,
262
+ });
263
+ }
264
+ }
265
+ if (expression.type === "correct") {
266
+ validateProcessingIdentifier(expression.identifier, "processing.correct", expression.source, diagnostics);
267
+ if (expression.identifier && !responses.has(expression.identifier)) {
268
+ diagnostics.push({
269
+ code: "processing.correct.reference",
270
+ severity: "error",
271
+ message: `Processing expression references missing correct response declaration ${expression.identifier}.`,
272
+ path: expression.source?.path,
273
+ source: expression.source,
274
+ });
275
+ }
276
+ }
277
+ if (expression.type === "default") {
278
+ validateProcessingIdentifier(expression.identifier, "processing.variable", expression.source, diagnostics);
279
+ if (expression.identifier && !variables.has(expression.identifier)) {
280
+ diagnostics.push({
281
+ code: "processing.variable.reference",
282
+ severity: "error",
283
+ message: `Processing expression references missing variable ${expression.identifier}.`,
284
+ path: expression.source?.path,
285
+ source: expression.source,
286
+ });
287
+ }
288
+ }
289
+ if (expression.type === "randomInteger") {
290
+ validateRandomIntegerExpression(expression, diagnostics);
291
+ }
292
+ if (expression.type === "randomFloat") {
293
+ validateRandomFloatExpression(expression, diagnostics);
294
+ }
295
+ if (expression.type === "baseValue") {
296
+ validateBaseValueExpression(expression, diagnostics);
297
+ }
298
+ if (expression.type === "equalRounded") {
299
+ validateRounding("qti-equal-rounded", expression.roundingMode, expression.figures, diagnostics, expression.source);
300
+ }
301
+ if (expression.type === "mathConstant" && !mathConstantNames.has(expression.name)) {
302
+ diagnostics.push({
303
+ code: "processing.mathConstant.name",
304
+ severity: "error",
305
+ message: `qti-math-constant has unsupported name ${expression.name}.`,
306
+ path: expression.source?.path,
307
+ source: expression.source,
308
+ });
309
+ }
310
+ if (expression.type === "mathOperator" && !mathOperatorNames.has(expression.name)) {
311
+ diagnostics.push({
312
+ code: "processing.mathOperator.name",
313
+ severity: "error",
314
+ message: `qti-math-operator has unsupported name ${expression.name}.`,
315
+ path: expression.source?.path,
316
+ source: expression.source,
317
+ });
318
+ }
319
+ if (expression.type === "statsOperator" && !statsOperatorNames.has(expression.name)) {
320
+ diagnostics.push({
321
+ code: "processing.statsOperator.name",
322
+ severity: "error",
323
+ message: `qti-stats-operator has unsupported name ${expression.name}.`,
324
+ path: expression.source?.path,
325
+ source: expression.source,
326
+ });
327
+ }
328
+ if (expression.type === "repeat") {
329
+ validateRepeatExpression(expression, variables, diagnostics);
330
+ }
331
+ if (expression.type === "inside") {
332
+ validateInsideExpression(expression, diagnostics);
333
+ }
334
+ if (expression.type === "fieldValue") {
335
+ validateProcessingIdentifier(expression.fieldIdentifier, "processing.fieldValue.fieldIdentifier", expression.source, diagnostics);
336
+ }
337
+ for (const child of expressionChildren(expression)) {
338
+ validateExpressionReferences(child, responses, variables, diagnostics);
339
+ }
340
+ }
341
+ const mathConstantNames = new Set(["pi", "e"]);
342
+ const mathOperatorNames = new Set(MATH_OPERATOR_NAMES);
343
+ const statsOperatorNames = new Set(STATS_OPERATOR_NAMES);
344
+ function validateRounding(qtiName, roundingMode, figures, diagnostics, source) {
345
+ if (roundingMode !== "decimalPlaces" && roundingMode !== "significantFigures") {
346
+ diagnostics.push({
347
+ code: "processing.roundingMode",
348
+ severity: "error",
349
+ message: `${qtiName} requires rounding-mode decimalPlaces or significantFigures.`,
350
+ path: source?.path,
351
+ source,
352
+ });
353
+ }
354
+ const validFigures = Number.isInteger(figures) && (roundingMode === "decimalPlaces" ? figures >= 0 : figures > 0);
355
+ if (!validFigures) {
356
+ diagnostics.push({
357
+ code: "processing.roundingFigures",
358
+ severity: "error",
359
+ message: `${qtiName} requires valid figures for its rounding mode.`,
360
+ path: source?.path,
361
+ source,
362
+ });
363
+ }
364
+ }
365
+ function validateRepeatExpression(expression, variables, diagnostics) {
366
+ if (isInteger(expression.numberRepeats))
367
+ return;
368
+ validateProcessingIdentifier(expression.numberRepeats, "processing.repeat.numberRepeats", expression.source, diagnostics);
369
+ if (expression.numberRepeats && !variables.has(expression.numberRepeats)) {
370
+ diagnostics.push({
371
+ code: "processing.repeat.numberRepeats.reference",
372
+ severity: "error",
373
+ message: `qti-repeat references missing template or outcome variable ${expression.numberRepeats}.`,
374
+ path: expression.source?.path,
375
+ source: expression.source,
376
+ });
377
+ }
378
+ }
379
+ function validateInsideExpression(expression, diagnostics) {
380
+ const rawShape = expression.attributes.shape;
381
+ if (rawShape === undefined) {
382
+ diagnostics.push({
383
+ code: "processing.inside.shape.required",
384
+ severity: "error",
385
+ message: "qti-inside requires shape.",
386
+ path: expression.source?.path,
387
+ source: expression.source,
388
+ });
389
+ }
390
+ else if (rawShape !== "circle" &&
391
+ rawShape !== "rect" &&
392
+ rawShape !== "poly" &&
393
+ rawShape !== "default") {
394
+ diagnostics.push({
395
+ code: "processing.inside.shape",
396
+ severity: "error",
397
+ message: `qti-inside has unsupported shape ${rawShape}.`,
398
+ path: expression.source?.path,
399
+ source: expression.source,
400
+ });
401
+ }
402
+ const expectedCoordCount = rawShape === "circle" ? 3 : rawShape === "rect" ? 4 : rawShape === "default" ? 0 : undefined;
403
+ if (expectedCoordCount !== undefined && expression.coords.length !== expectedCoordCount) {
404
+ diagnostics.push({
405
+ code: "processing.inside.coords",
406
+ severity: "error",
407
+ message: `qti-inside shape ${rawShape} requires ${expectedCoordCount} coordinates.`,
408
+ path: expression.source?.path,
409
+ source: expression.source,
410
+ });
411
+ }
412
+ if (rawShape === "poly" && (expression.coords.length < 6 || expression.coords.length % 2 !== 0)) {
413
+ diagnostics.push({
414
+ code: "processing.inside.coords",
415
+ severity: "error",
416
+ message: "qti-inside poly requires an even number of at least 6 coordinates.",
417
+ path: expression.source?.path,
418
+ source: expression.source,
419
+ });
420
+ }
421
+ }
422
+ function validateBaseValueExpression(expression, diagnostics) {
423
+ if (!expression.baseType) {
424
+ diagnostics.push({
425
+ code: "processing.baseValue.baseType.required",
426
+ severity: "error",
427
+ message: "qti-base-value requires base-type.",
428
+ path: expression.source?.path,
429
+ source: expression.source,
430
+ });
431
+ return;
432
+ }
433
+ if (!isBaseType(expression.baseType)) {
434
+ diagnostics.push({
435
+ code: "processing.baseValue.baseType",
436
+ severity: "error",
437
+ message: `qti-base-value has unsupported base-type ${expression.baseType}.`,
438
+ path: expression.source?.path,
439
+ source: expression.source,
440
+ });
441
+ return;
442
+ }
443
+ const value = expression.rawValue ?? "";
444
+ if ((expression.baseType === "integer" && !isInteger(value)) ||
445
+ (expression.baseType === "float" && !isFiniteNumber(value))) {
446
+ diagnostics.push({
447
+ code: "processing.baseValue.numeric",
448
+ severity: "error",
449
+ message: `qti-base-value requires ${expression.baseType} content, got ${value}.`,
450
+ path: expression.source?.path,
451
+ source: expression.source,
452
+ });
453
+ }
454
+ if (expression.baseType === "boolean" && value !== "true" && value !== "false") {
455
+ diagnostics.push({
456
+ code: "processing.baseValue.boolean",
457
+ severity: "error",
458
+ message: `qti-base-value requires boolean content, got ${value}.`,
459
+ path: expression.source?.path,
460
+ source: expression.source,
461
+ });
462
+ }
463
+ }
464
+ function validateRandomIntegerExpression(expression, diagnostics) {
465
+ validateRandomIntegerAttribute(expression, "min", diagnostics);
466
+ validateRandomIntegerAttribute(expression, "max", diagnostics);
467
+ if (expression.attributes.step !== undefined) {
468
+ validateRandomIntegerAttribute(expression, "step", diagnostics);
469
+ if (isInteger(expression.attributes.step) && Number(expression.attributes.step) <= 0) {
470
+ diagnostics.push({
471
+ code: "processing.randomInteger.step",
472
+ severity: "error",
473
+ message: "qti-random-integer requires step to be greater than 0.",
474
+ path: expression.source?.path,
475
+ source: expression.source,
476
+ });
477
+ }
478
+ }
479
+ const min = expression.attributes.min;
480
+ const max = expression.attributes.max;
481
+ if (min !== undefined &&
482
+ max !== undefined &&
483
+ isInteger(min) &&
484
+ isInteger(max) &&
485
+ Number(min) > Number(max)) {
486
+ diagnostics.push({
487
+ code: "processing.randomInteger.bounds",
488
+ severity: "error",
489
+ message: "qti-random-integer requires min to be less than or equal to max.",
490
+ path: expression.source?.path,
491
+ source: expression.source,
492
+ });
493
+ }
494
+ }
495
+ function validateRandomIntegerAttribute(expression, attribute, diagnostics) {
496
+ const value = expression.attributes[attribute];
497
+ if (value === undefined) {
498
+ diagnostics.push({
499
+ code: "processing.randomInteger.attribute",
500
+ severity: "error",
501
+ message: `qti-random-integer requires ${attribute}.`,
502
+ path: expression.source?.path,
503
+ source: expression.source,
504
+ });
505
+ return;
506
+ }
507
+ if (isInteger(value))
508
+ return;
509
+ diagnostics.push({
510
+ code: "processing.randomInteger.integer",
511
+ severity: "error",
512
+ message: `qti-random-integer requires integer ${attribute}, got ${value}.`,
513
+ path: expression.source?.path,
514
+ source: expression.source,
515
+ });
516
+ }
517
+ function validateRandomFloatExpression(expression, diagnostics) {
518
+ validateRandomFloatAttribute(expression, "max", diagnostics);
519
+ if (expression.attributes.min !== undefined)
520
+ validateRandomFloatAttribute(expression, "min", diagnostics);
521
+ const min = expression.attributes.min ?? "0";
522
+ const max = expression.attributes.max;
523
+ if (max !== undefined &&
524
+ isFiniteNumber(min) &&
525
+ isFiniteNumber(max) &&
526
+ Number(min) > Number(max)) {
527
+ diagnostics.push({
528
+ code: "processing.randomFloat.bounds",
529
+ severity: "error",
530
+ message: "qti-random-float requires min to be less than or equal to max.",
531
+ path: expression.source?.path,
532
+ source: expression.source,
533
+ });
534
+ }
535
+ }
536
+ function validateRandomFloatAttribute(expression, attribute, diagnostics) {
537
+ const value = expression.attributes[attribute];
538
+ if (value === undefined) {
539
+ diagnostics.push({
540
+ code: "processing.randomFloat.attribute",
541
+ severity: "error",
542
+ message: `qti-random-float requires ${attribute}.`,
543
+ path: expression.source?.path,
544
+ source: expression.source,
545
+ });
546
+ return;
547
+ }
548
+ if (isFiniteNumber(value))
549
+ return;
550
+ diagnostics.push({
551
+ code: "processing.randomFloat.numeric",
552
+ severity: "error",
553
+ message: `qti-random-float requires numeric ${attribute}, got ${value}.`,
554
+ path: expression.source?.path,
555
+ source: expression.source,
556
+ });
557
+ }
558
+ function validateProcessingIdentifier(identifier, code, source, diagnostics) {
559
+ if (identifier.trim().length > 0)
560
+ return;
561
+ diagnostics.push({
562
+ code,
563
+ severity: "error",
564
+ message: "Processing rule requires a non-empty identifier.",
565
+ path: source?.path,
566
+ source,
567
+ });
568
+ }
569
+ //# sourceMappingURL=validation-processing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-processing.js","sourceRoot":"","sources":["../src/validation-processing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { QtiAssessmentItem, QtiDiagnostic } from "./types.js";
2
+ export declare function sharedClassNames(attributes: Record<string, string>): string[];
3
+ export declare function isLayoutColumnClassName(className: string): boolean;
4
+ export declare function layoutColumnValue(className: string): number | undefined;
5
+ export declare function firstLayoutColumnValue(classNames: string[]): number | undefined;
6
+ export declare function isLayoutOffsetClassName(className: string): boolean;
7
+ export declare function layoutOffsetValue(className: string): number | undefined;
8
+ export declare function firstLayoutOffsetValue(classNames: string[]): number | undefined;
9
+ export declare function validateItemBodySharedVocabulary(item: QtiAssessmentItem, diagnostics: QtiDiagnostic[]): void;
10
+ //# sourceMappingURL=validation-shared-vocabulary-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-shared-vocabulary-layout.d.ts","sourceRoot":"","sources":["../src/validation-shared-vocabulary-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAE7E;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMvE;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMvE;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,iBAAiB,EACvB,WAAW,EAAE,aAAa,EAAE,GAC3B,IAAI,CAEN"}