@citolab/qti-components 7.27.2 → 7.27.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/cdn/index.global.js +1 -1
- package/cdn/index.js +230 -212
- package/custom-elements.json +4214 -1176
- package/dist/base.d.ts +3 -2
- package/dist/base.js +1 -1
- package/dist/{chunk-TZMDZQFG.js → chunk-3HJE3KRM.js} +469 -221
- package/dist/chunk-3HJE3KRM.js.map +1 -0
- package/dist/{chunk-75ME6QG5.js → chunk-424AWLRU.js} +18 -18
- package/dist/{chunk-QUWFDFGZ.js → chunk-FFESMKSD.js} +277 -21
- package/dist/chunk-FFESMKSD.js.map +1 -0
- package/dist/{chunk-G5ZUC3OT.js → chunk-LQZCSHN5.js} +23 -23
- package/dist/chunk-LQZCSHN5.js.map +1 -0
- package/dist/{chunk-DG5TP35K.js → chunk-N7S3GNUP.js} +5 -5
- package/dist/{chunk-DG5TP35K.js.map → chunk-N7S3GNUP.js.map} +1 -1
- package/dist/{chunk-RXRKP6P7.js → chunk-SX63OCDZ.js} +2 -2
- package/dist/{chunk-K7HR6ZAY.js → chunk-UKPCQKPF.js} +2 -2
- package/dist/chunk-UKPCQKPF.js.map +1 -0
- package/dist/{chunk-KY3II5OX.js → chunk-XYTJOQRZ.js} +240 -202
- package/dist/chunk-XYTJOQRZ.js.map +1 -0
- package/dist/{chunk-GG36UR7F.js → chunk-YLIYPNMK.js} +1004 -12
- package/dist/chunk-YLIYPNMK.js.map +1 -0
- package/dist/{chunk-TORB5UN2.js → chunk-Z2SUBRH5.js} +304 -243
- package/dist/chunk-Z2SUBRH5.js.map +1 -0
- package/dist/elements.d.ts +67 -2
- package/dist/elements.js +10 -6
- package/dist/index.d.ts +5 -4
- package/dist/index.js +55 -11
- package/dist/interactions.d.ts +8 -7
- package/dist/interactions.js +3 -3
- package/dist/item.js +4 -4
- package/dist/loader.d.ts +2 -1
- package/dist/loader.js +2 -2
- package/dist/processing.d.ts +374 -17
- package/dist/processing.js +42 -2
- package/dist/qti-components-jsx.d.ts +1183 -126
- package/dist/{qti-rule-base-DGhWN-as.d.ts → qti-condition-expression-B1BYmCcq.d.ts} +1 -14
- package/dist/{qti-feedback-BZjWNyxP.d.ts → qti-feedback-ChmXhZuf.d.ts} +1 -1
- package/dist/qti-rule-base-ajOnfGXY.d.ts +16 -0
- package/dist/test.d.ts +2 -1
- package/dist/test.js +6 -6
- package/dist/transformers.js +1 -1
- package/package.json +11 -11
- package/dist/chunk-G5ZUC3OT.js.map +0 -1
- package/dist/chunk-GG36UR7F.js.map +0 -1
- package/dist/chunk-K7HR6ZAY.js.map +0 -1
- package/dist/chunk-KY3II5OX.js.map +0 -1
- package/dist/chunk-QUWFDFGZ.js.map +0 -1
- package/dist/chunk-TORB5UN2.js.map +0 -1
- package/dist/chunk-TZMDZQFG.js.map +0 -1
- /package/dist/{chunk-75ME6QG5.js.map → chunk-424AWLRU.js.map} +0 -0
- /package/dist/{chunk-RXRKP6P7.js.map → chunk-SX63OCDZ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../qti-processing/src/components/qti-rule/qti-rule.ts","../../qti-processing/src/components/qti-lookup-outcome-value/qti-lookup-outcome-value.ts","../../qti-processing/src/components/qti-response-condition/qti-response-condition.ts","../../qti-processing/src/components/qti-set-outcome-value/qti-set-outcome-value.ts","../../qti-processing/src/components/qti-response-else/qti-response-else.ts","../../qti-processing/src/components/qti-response-if/qti-response-if.ts","../../qti-processing/src/components/qti-response-else-if/qti-response-else-if.ts","../../qti-processing/src/components/qti-and/qti-and.ts","../../qti-processing/src/components/qti-any-n/qti-any-n.ts","../../qti-processing/src/components/qti-basevalue/qti-basevalue.ts","../../qti-processing/src/components/qti-container-size/qti-container-size.ts","../../qti-processing/src/components/qti-contains/qti-contains.ts","../../qti-processing/src/components/qti-correct/qti-correct.ts","../../qti-processing/src/components/qti-default/qti-default.ts","../../qti-processing/src/components/qti-equal-rounded/qti-equal-rounded.ts","../../qti-processing/src/components/qti-round/qti-round.ts","../../qti-processing/src/components/qti-round-to/qti-round-to.ts","../../qti-processing/src/components/qti-equal/qti-equal.ts","../../qti-processing/src/components/qti-divide/qti-divide.ts","../../qti-processing/src/components/qti-duration-gte/qti-duration-gte.ts","../../qti-processing/src/components/qti-duration-lt/qti-duration-lt.ts","../../qti-processing/src/components/qti-gcd/qti.gcd.ts","../../qti-processing/src/components/qti-gt/qti-gt.ts","../../qti-processing/src/components/qti-gte/qti-gte.ts","../../qti-processing/src/components/qti-inside/qti-inside.ts","../../qti-processing/src/components/qti-integer-divide/qti-integer-divide.ts","../../qti-processing/src/components/qti-integer-modulus/qti-integer-modulus.ts","../../qti-processing/src/components/qti-integer-to-float/qti-integer-to-float.ts","../../qti-processing/src/components/qti-lcm/qti-lcm.ts","../../qti-processing/src/components/qti-null/qti-null.ts","../../qti-processing/src/components/qti-is-null/qti-is-null.ts","../../qti-processing/src/components/qti-field-value/qti-field-value.ts","../../qti-processing/src/components/qti-lt/qti-lt.ts","../../qti-processing/src/components/qti-lte/qti-lte.ts","../../qti-processing/src/components/qti-map-response/qti-map-response.ts","../../qti-processing/src/components/qti-map-response-point/qti-map-response-point.ts","../../qti-processing/src/components/qti-math-operator/qti-math-operator.ts","../../qti-processing/src/components/qti-match/qti-match.ts","../../qti-processing/src/components/qti-max/qti-max.ts","../../qti-processing/src/components/qti-member/qti-member.ts","../../qti-processing/src/components/qti-min/qti-min.ts","../../qti-processing/src/components/qti-multiple/qti-multiple.ts","../../qti-processing/src/components/qti-not/qti-not.ts","../../qti-processing/src/components/qti-or/qti-or.ts","../../qti-processing/src/components/qti-ordered/qti-ordered.ts","../../qti-processing/src/components/qti-power/qti-power.ts","../../qti-processing/src/components/qti-pattern-match/qti-pattern-match.ts","../../qti-processing/src/components/qti-printed-variable/qti-printed-variable.ts","../../qti-processing/src/components/qti-product/qti-product.ts","../../qti-processing/src/components/qti-repeat/qti-repeat.ts","../../qti-processing/src/components/qti-set-correct-response/qti-set-correct-response.ts","../../qti-processing/src/components/qti-set-template-value/qti-set-template-value.ts","../../qti-processing/src/components/qti-stats-operator/qti-stats-operator.ts","../../qti-processing/src/components/qti-subtract/qti-subtract.ts","../../qti-processing/src/components/qti-substring/qti-substring.ts","../../qti-processing/src/components/qti-string-match/qti-string-match.ts","../../qti-processing/src/components/qti-sum/qti-sum.ts","../../qti-processing/src/components/qti-truncate/qti-truncate.ts","../../qti-processing/src/components/qti-variable/qti-variable.ts","../../qti-processing/src/components/qti-random-integer/qti-random-integer.ts","../../qti-processing/src/components/qti-random/qti-random.ts","../../qti-processing/src/components/qti-delete/qti-delete.ts","../../qti-processing/src/components/qti-index/qti-index.ts","../../qti-processing/src/components/qti-subtract/index.ts"],"sourcesContent":["import { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\n\nimport type { QtiRuleBase } from '@qti-components/base';\n\n@customElement('qti-rule')\nexport class QtiRule extends LitElement implements QtiRuleBase {\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n throw new Error('Not implemented');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rule': QtiRule;\n }\n}\n","import { property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport { convertNumberToUniversalFormat } from '@qti-components/base';\nimport { itemContext } from '@qti-components/base';\n\nimport { QtiRule } from '../qti-rule/qti-rule';\n\nimport type { QtiExpression } from '@qti-components/base';\nimport type { OutcomeVariable } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\n/**\n * The lookupOutcomeValue rule sets the value of an outcome variable to the value obtained\n * by looking up the value of the associated expression in the lookupTable associated\n * with the outcome's declaration.\n */\nexport class QtiLookupOutcomeValue extends QtiRule {\n @property({ type: String }) identifier: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n get childExpression(): QtiExpression<string> {\n return this.firstElementChild as QtiExpression<string>;\n }\n\n public override process(): number {\n const identifier = this.getAttribute('identifier');\n\n const outcomeVariable: OutcomeVariable | null =\n this.context.variables.find(v => v.identifier === identifier) || null;\n\n let value;\n if (outcomeVariable.interpolationTable) {\n value = outcomeVariable.interpolationTable.get(parseFloat(this.childExpression.calculate()));\n }\n if (value === null || value === undefined) {\n console.warn('lookupOutcomeValue: value is null or undefined');\n return 0;\n }\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier: this.identifier,\n value: convertNumberToUniversalFormat(value)\n }\n })\n );\n return value;\n }\n}\ncustomElements.define('qti-lookup-outcome-value', QtiLookupOutcomeValue);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-lookup-outcome-value': QtiLookupOutcomeValue;\n }\n}\n","import { html } from 'lit';\n\nimport { QtiRule } from '../qti-rule/qti-rule';\n\nimport type { QtiExpression } from '@qti-components/base';\n\nexport class QtiResponseCondition extends QtiRule {\n override render() {\n return html`<slot></slot>`;\n }\n\n public override process() {\n const branches = [...this.children] as QtiExpression<any>[];\n\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i];\n\n if (branch.calculate()) {\n (branch as unknown as QtiRule).process();\n\n return;\n }\n }\n }\n}\n\ncustomElements.define('qti-response-condition', QtiResponseCondition);\n","import { convertNumberToUniversalFormat } from '@qti-components/base';\n\nimport { QtiRule } from '../qti-rule/qti-rule';\n\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { QtiExpression, QtiExpressionBase } from '@qti-components/base';\nimport type { QtiRuleBase } from '@qti-components/base';\n\n/**\n * Web component that processes `setOutcomeValue` in QTI.\n */\nexport class QtiSetOutcomeValue extends QtiRule {\n /**\n * Processes the QTI rule and dispatches a custom event with the computed outcome value.\n */\n public override process(): void {\n const outcomeIdentifier = this.getAttribute('identifier');\n\n if (!outcomeIdentifier) {\n console.warn('QtiSetOutcomeValue: Missing \"identifier\" attribute.');\n return;\n }\n\n const expression = this.firstElementChild as QtiExpression<string | ResponseVariable[]> | null;\n\n if (!expression) {\n console.warn('QtiSetOutcomeValue: No expression found.');\n return;\n }\n\n const rule = new QtiSetOutcomeValueRule<string | ResponseVariable[] | null>(expression);\n const value = rule.process();\n\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] | null }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value: this.#formatValue(value)\n }\n })\n );\n }\n\n /**\n * Formats the computed value before dispatching.\n * Ensures numbers are converted to a universal format.\n */\n #formatValue(value: string | string[] | null): string | string[] | null {\n if (Array.isArray(value)) {\n return value.map(convertNumberToUniversalFormat);\n }\n return value !== null ? convertNumberToUniversalFormat(value) : null;\n }\n}\n\n/**\n * Encapsulates the logic for processing QTI setOutcomeValue expressions.\n */\nexport class QtiSetOutcomeValueRule<T> implements QtiRuleBase {\n constructor(private expression: QtiExpressionBase<T>) {}\n\n /**\n * Evaluates the expression and returns its value.\n */\n process(): string | string[] | null {\n const value = (this.expression.calculate() ?? null) as unknown as string | string[] | null;\n\n if (value === null) {\n console.warn('QtiSetOutcomeValueRule: Evaluated value is null.');\n }\n\n return Array.isArray(value) ? (value as any).map((v: { value: any }) => (v.value ? v.value : v)) : value;\n }\n}\n\n// Define the custom element\ncustomElements.define('qti-set-outcome-value', QtiSetOutcomeValue);\n","import { LitElement, html } from 'lit';\n\nimport type { QtiRule } from '../qti-rule/qti-rule';\n\nexport class QtiResponseElse extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n public calculate() {\n return true;\n }\n\n public getSubRules(): QtiRule[] {\n return [...this.children] as QtiRule[];\n }\n\n public process() {\n const subRules = this.getSubRules();\n for (let i = 0; i < subRules.length; i++) {\n const subRule = subRules[i];\n subRule.process();\n }\n }\n}\n\ncustomElements.define('qti-response-else', QtiResponseElse);\n","import { QtiResponseElse } from '../qti-response-else/qti-response-else';\n\nimport type { QtiExpression } from '@qti-components/base';\nimport type { QtiRule } from '../qti-rule/qti-rule';\n\nexport class QtiResponseIf extends QtiResponseElse {\n public override calculate() {\n const expression = this.firstElementChild as QtiExpression<boolean>;\n const result = expression.calculate() as boolean;\n return result;\n }\n\n public override getSubRules(): QtiRule[] {\n const result = [];\n for (let i = 1; i < this.children.length; i++) {\n result.push(this.children[i] as QtiRule);\n }\n return result;\n }\n}\n\ncustomElements.define('qti-response-if', QtiResponseIf);\n","import { html } from 'lit';\n\nimport { QtiResponseIf } from '../qti-response-if/qti-response-if';\n\nexport class QtiResponseElseIf extends QtiResponseIf {\n override render() {\n return html`${super.render()}`;\n }\n}\n\ncustomElements.define('qti-response-else-if', QtiResponseElseIf);\n","import { customElement } from 'lit/decorators.js';\n\nimport { QtiConditionExpression } from '@qti-components/base';\n\nimport type { QtiExpression } from '@qti-components/base';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n/**\n * @summary The qti-and operator evaluates multiple boolean expressions.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#and\n *\n * Takes 1 or more sub-expressions with base-type boolean and single cardinality.\n * Returns true if all sub-expressions are true, false if any are false.\n * Special cases: Returns NULL if any sub-expression is NULL and all others are true.\n */\n@customElement('qti-and')\nexport class QtiAnd extends qtiAndMixin(QtiConditionExpression as unknown as Constructor<QtiConditionExpression>) {\n public override calculate() {\n return this.calculateChildren(Array.from(this.children as unknown as QtiExpression<any>[]));\n }\n}\n\ntype MockQtiExpression<T> = { calculate: () => T };\ntype MockConstructor = new (...args: any[]) => {};\nexport function qtiAndMixin<TBase extends MockConstructor>(Base: TBase) {\n return class MockQtiAnd extends Base {\n public calculateChildren(children: Array<MockQtiExpression<any>>) {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = children.map(c => {\n const condition = c as MockQtiExpression<any>;\n if (!condition.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = condition.calculate();\n let val = false;\n // convert string value to boolean and return null if not possible\n if (typeof value === 'string') {\n if (value === 'true') {\n val = true;\n } else if (value === 'false') {\n val = false;\n } else {\n console.error('unexpected val in qti-or, expected boolean');\n return null;\n }\n } else {\n if (typeof value === 'boolean') {\n val = value;\n }\n }\n return val;\n });\n return values.every(e => {\n return typeof e === 'boolean' && e;\n });\n }\n };\n}\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-any-N operator checks if a specific range of expressions are true.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#anyN\n *\n * Takes 1 or more sub-expressions with base-type boolean and single cardinality.\n * Attributes 'min' and 'max' define the required range of true values.\n * Returns true if true count is within [min, max], false if outside this range.\n * Special cases: Returns NULL if validity cannot be determined due to NULL arguments.\n */\nexport class QtiAnyN extends QtiExpression<boolean | null> {\n @property({ type: Number }) min = 0;\n\n @property({ type: Number }) max = Infinity;\n\n public override getResult(): boolean | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (!variables || variables.length === 0) {\n console.error('qti-any-n requires at least one child expression');\n return null;\n }\n\n if (this.min < 0 || this.max < this.min) {\n console.error('qti-any-n requires 0 <= min <= max');\n return null;\n }\n\n let trueCount = 0;\n for (const variable of variables) {\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-any-n requires single cardinality boolean expressions');\n return null;\n }\n if (variable.baseType !== 'boolean') {\n console.error('qti-any-n requires boolean base-type');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n if (variable.value === 'true') {\n trueCount++;\n }\n }\n\n return trueCount >= this.min && trueCount <= this.max;\n }\n}\n\ncustomElements.define('qti-any-n', QtiAnyN);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { BaseType } from '@qti-components/base';\n\nexport class QtiBaseValue extends QtiExpression<string> {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType = 'string';\n\n public override getResult(): string {\n const value = this.textContent.trim();\n return value;\n }\n}\n\ncustomElements.define('qti-base-value', QtiBaseValue);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-container-size operator returns the count of items in a container.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#containerSize\n *\n * Takes 1 sub-expression with multiple or ordered cardinality.\n * Returns a single integer representing the number of items.\n * Special cases: Returns 0 if the sub-expression is NULL.\n */\nexport class QtiContainerSize extends QtiExpression<number> {\n public override getResult(): number {\n if (this.children?.length !== 1) {\n console.error('qti-container-size must have exactly one child expression');\n return 0;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n\n if (!variables || variables?.length === 0) {\n return 0;\n }\n\n const variable = variables[0];\n\n // Handle null values - return 0 as per spec\n if (variable.value === null || variable.value === undefined) {\n return 0;\n }\n\n // Check cardinality - must be multiple or ordered\n if (variable.cardinality !== 'multiple' && variable.cardinality !== 'ordered') {\n console.error('qti-container-size requires multiple or ordered cardinality');\n return 0;\n }\n\n // The value should be an array for multiple/ordered cardinality\n if (!Array.isArray(variable.value)) {\n console.error('qti-container-size: expected array value for multiple/ordered cardinality');\n return 0;\n }\n\n // Return the size of the container\n return variable.value.length;\n }\n}\n\ncustomElements.define('qti-container-size', QtiContainerSize);\n","import { QtiConditionExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiContains extends QtiConditionExpression {\n public override getResult() {\n // TODO: implement this for other types than directedPair\n const values = this.getVariables() as ResponseVariable[];\n if (this.children.length === 2) {\n const value1 = values[0];\n const value2 = values[1];\n if (\n value1.baseType === 'directedPair' &&\n value2.baseType === 'directedPair' &&\n value1.cardinality === 'multiple'\n ) {\n const projection1 = value1.value as string[];\n const projection2 = value2.value as string[];\n const enumerable = projection1.filter(x => projection2.includes(x));\n\n const result = enumerable.length > 0;\n return result;\n } else if (\n value1.baseType === 'directedPair' &&\n value2.baseType === 'directedPair' &&\n value1.cardinality === 'single'\n ) {\n const projection1 = value1.value as string;\n const projection2 = value2.value as string[];\n return projection2.includes(projection1);\n } else {\n console.error(\n 'unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported'\n );\n }\n } else {\n console.error('unexpected number of children in qti contains');\n }\n return false;\n }\n}\n\ncustomElements.define('qti-contains', QtiContains);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-correct operator retrieves the defined correct response for a variable.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#correct\n *\n * Looks up the declaration for the identified response variable.\n * Returns the associated correctResponse value(s).\n * Special cases: Returns NULL if no correct response was declared.\n */\nexport class QtiCorrect extends QtiExpression<string | string[]> {\n get interpretation() {\n return this.getAttribute('interpretation') || '';\n }\n\n override getResult() {\n const identifier = this.getAttribute('identifier') || '';\n const responseVariable: ResponseVariable = this.context.variables.find(v => v.identifier === identifier) || null;\n if (responseVariable.cardinality !== 'single') {\n return responseVariable.correctResponse.length > 0 ? responseVariable.correctResponse[0] : '';\n } else {\n return responseVariable.correctResponse;\n }\n }\n}\n\ncustomElements.define('qti-correct', QtiCorrect);\n","import { property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport { QtiExpression } from '@qti-components/base';\nimport { itemContext } from '@qti-components/base';\nimport { testContext } from '@qti-components/base';\n\nimport type { ItemContext } from '@qti-components/base';\nimport type { TestContext } from '@qti-components/base';\n\n/**\n * @summary The qti-default operator retrieves the defined default value for a variable.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#default\n *\n * Looks up the declaration for the identified item variable.\n * Returns the associated defaultValue.\n * Special cases: Returns NULL if no default value was declared.\n */\nexport class QtiDefault extends QtiExpression<any> {\n @property({ type: String }) identifier: string = '';\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected override context?: ItemContext;\n\n @state()\n @consume({ context: testContext, subscribe: true })\n protected _testContext?: TestContext;\n\n public override getResult(): any {\n if (!this.identifier) {\n console.error('qti-default requires an identifier attribute');\n return null;\n }\n\n // Check for item identifier prefixing (format: \"itemId.variableId\")\n const parts = this.identifier.split('.');\n\n let itemId: string | null = null;\n let variableId: string;\n\n if (parts.length === 2) {\n itemId = parts[0];\n variableId = parts[1];\n } else if (parts.length === 1) {\n variableId = parts[0];\n } else {\n console.error('qti-default: invalid identifier format');\n return null;\n }\n\n // If item identifier is specified, look in that specific item\n if (itemId) {\n const itemContext = this._testContext.items.find(item => item.identifier === itemId);\n console.debug(`itemContext: ${JSON.stringify(itemContext)}`);\n if (!this._testContext || !itemContext) {\n console.warn(`qti-default: item \"${itemId}\" not found in test context`);\n return null;\n }\n const variable = this._testContext.items\n .find(item => item.identifier === itemId)\n ?.variables.find(v => v.identifier === variableId);\n if (!variable) {\n console.warn(`qti-default: variable \"${variableId}\" not found in item \"${itemId}\"`);\n return null;\n }\n return variable.defaultValue || null;\n }\n\n // Otherwise, look in the current item context\n if (!this.context?.variables) {\n console.warn('qti-default: no variables found in item context');\n return null;\n }\n const variable = this.context.variables.find(v => v.identifier === variableId);\n if (!variable) {\n console.warn(`qti-default: variable \"${variableId}\" not found in item context`);\n return null;\n }\n return variable.defaultValue || null;\n }\n}\n\ncustomElements.define('qti-default', QtiDefault);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-equal-rounded operator compares two values after rounding.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equalRounded\n *\n * Takes 2 sub-expressions with numerical base-types and single cardinality.\n * Requires 'figures' and 'rounding-mode' (decimalPlaces or significantFigures) attributes.\n * Returns true if equal after specified rounding, false otherwise.\n * Special cases: Returns NULL if either sub-expression is NULL.\n */\nexport class QtiEqualRounded extends QtiExpression<boolean> {\n @property({ type: String }) roundingMode: 'decimalPlaces' | 'significantFigures' = 'significantFigures';\n\n get figures() {\n const attr = this.getAttribute('figures');\n if (!attr) {\n console.error('figures attribute is missing');\n return null;\n }\n const figures = parseInt(this.getAttribute('figures') || '0');\n if (isNaN(figures)) {\n console.error('figures attribute is not a number');\n return null;\n }\n if (figures < 0) {\n console.error('figures attribute is negative');\n return null;\n }\n if (figures < 1 && this.roundingMode === 'significantFigures') {\n console.error('figures cannot be smaller than 1 for RoundingMode significantFigures');\n return null;\n }\n return figures;\n }\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (this.roundingMode === null) {\n return null;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n switch (values[0].baseType) {\n case 'integer':\n case 'float': {\n const float1 = parseFloat(value1.value as string);\n const float2 = parseFloat(value2.value as string);\n\n if (!isNaN(float1) && !isNaN(float2)) {\n if (this.roundingMode === 'significantFigures') {\n return float1.toPrecision(this.figures) === float2.toPrecision(this.figures);\n } else {\n return (\n Math.round(float1 * Math.pow(10, this.figures)) / Math.pow(10, this.figures) ===\n Math.round(float2 * Math.pow(10, this.figures)) / Math.pow(10, this.figures)\n );\n }\n } else {\n console.error(`value cannot be casted to numeric value in equalRounded operator: ${float1}, ${float2}`);\n }\n break;\n }\n default: {\n console.error(`values other than float and int cannot be used in equalRounded operator.`);\n break;\n }\n }\n return false;\n }\n console.error('unexpected number of children in qti-equal-rounded');\n return null;\n }\n}\n\ncustomElements.define('qti-equal-rounded', QtiEqualRounded);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-round operator rounds a numerical value to the nearest integer.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#round\n *\n * Takes 1 numerical sub-expression of single cardinality.\n * Returns integer n for input in range [n-0.5, n+0.5).\n * Special cases: Returns NULL if input is NULL or NaN.\n */\nexport class QtiRound extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length !== 1) {\n console.error('qti-round must have exactly one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n const variable = variables[0];\n\n // Check cardinality\n if (variable.cardinality !== 'single') {\n console.error('qti-round requires single cardinality');\n return null;\n }\n\n // Check if value is array (shouldn't be for single cardinality)\n if (Array.isArray(variable.value)) {\n console.error('qti-round unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Check base type\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-round requires numerical base-type (integer or float)');\n return null;\n }\n\n // Convert to number\n const numericValue = parseFloat(variable.value as string);\n\n // Handle special cases\n if (isNaN(numericValue)) {\n console.warn('qti-round: NaN input results in NULL');\n return null;\n }\n\n if (!isFinite(numericValue)) {\n // Handle infinity cases\n if (numericValue === Infinity) {\n return Infinity;\n }\n if (numericValue === -Infinity) {\n return -Infinity;\n }\n return null;\n }\n\n // Apply QTI rounding rule: result is integer n for all input values in [n-0.5, n+0.5)\n // This means we need to find n such that: n-0.5 <= value < n+0.5\n // Rearranging: n <= value + 0.5 < n + 1\n // So n = floor(value + 0.5)\n return Math.floor(numericValue + 0.5);\n }\n}\n\ncustomElements.define('qti-round', QtiRound);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-round-to operator rounds a numerical value to specified precision.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.round-to\n *\n * Takes one sub-expression with single cardinality and numerical base-type.\n * Returns a single float rounded by the specified method to the specified precision.\n * Supports rounding to decimal places or significant figures.\n */\nexport class QtiRoundTo extends QtiExpression<number | null> {\n @property({ type: String, attribute: 'rounding-mode' })\n roundingMode: 'decimalPlaces' | 'significantFigures' = 'significantFigures';\n\n @property({ type: Number })\n figures: number = 3;\n\n public override getResult(): number | null {\n if (this.children.length !== 1) {\n console.error('qti-round-to must have exactly one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n const variable = variables[0];\n\n // Check cardinality\n if (variable.cardinality !== 'single') {\n console.error('qti-round-to requires single cardinality');\n return null;\n }\n\n // Check if value is array (shouldn't be for single cardinality)\n if (Array.isArray(variable.value)) {\n console.error('qti-round-to unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Check base type\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-round-to requires numerical base-type');\n return null;\n }\n\n // Convert to number\n const numericValue = parseFloat(variable.value as string);\n\n // Handle special cases\n if (isNaN(numericValue)) {\n return null;\n }\n\n if (!isFinite(numericValue)) {\n // Handle infinity cases\n if (numericValue === Infinity) {\n return Infinity;\n }\n if (numericValue === -Infinity) {\n return -Infinity;\n }\n return null;\n }\n\n // Validate figures\n if (this.figures < 0) {\n console.error('qti-round-to: figures must be non-negative');\n return null;\n }\n\n if (this.roundingMode === 'significantFigures' && this.figures < 1) {\n console.error('qti-round-to: figures must be at least 1 for significantFigures mode');\n return null;\n }\n\n // Perform rounding\n if (this.roundingMode === 'decimalPlaces') {\n return this.#roundToDecimalPlaces(numericValue, this.figures);\n } else {\n return this.#roundToSignificantFigures(numericValue, this.figures);\n }\n }\n\n /**\n * Round to specified number of decimal places\n */\n #roundToDecimalPlaces(value: number, decimalPlaces: number): number {\n if (value === 0) {\n return 0;\n }\n\n const multiplier = Math.pow(10, decimalPlaces);\n return Math.round(value * multiplier) / multiplier;\n }\n\n /**\n * Round to specified number of significant figures\n */\n #roundToSignificantFigures(value: number, significantFigures: number): number {\n if (value === 0) {\n return 0;\n }\n\n // Find the order of magnitude of the first non-zero digit\n const magnitude = Math.floor(Math.log10(Math.abs(value)));\n\n // Calculate the multiplier to shift the decimal point\n const multiplier = Math.pow(10, significantFigures - magnitude - 1);\n\n // Round and shift back\n return Math.round(value * multiplier) / multiplier;\n }\n}\n\ncustomElements.define('qti-round-to', QtiRoundTo);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\nimport { ScoringHelper } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-equal operator checks if two numerical expressions are equal.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#equal\n *\n * Takes 2 sub-expressions with numerical base-types and single cardinality.\n * Supports tolerance-mode (exact, absolute, relative) for floating-point comparisons.\n * Returns true if numerically equal within specified tolerance, false otherwise.\n * Special cases: Returns NULL if either sub-expression is NULL.\n */\nexport class QtiEqual extends QtiExpression<boolean> {\n @property({ type: String }) toleranceMode: 'exact' | 'relative' | 'absolute' = 'exact';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n\n if (!value1 || !value2) {\n return null;\n }\n\n if (this.toleranceMode !== 'exact') {\n console.error('toleranceMode is not supported yet');\n return false;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n\n if (value1.value === null || value2.value === null || value1.value === undefined || value2.value === undefined) {\n return null;\n }\n\n return ScoringHelper.compareSingleValues(value1.value as string, value2.value as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-equal');\n return null;\n }\n}\n\ncustomElements.define('qti-equal', QtiEqual);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-divide operator performs numerical division.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#divide\n *\n * Takes exactly 2 sub-expressions with numerical base-types and single cardinality.\n * Returns a single float representing (first / second).\n * Special cases: Returns NULL if either sub-expression is NULL or if divisor is 0.\n */\nexport class QtiDivide extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectNumericValues(this.getVariables() as ResponseVariable[]);\n if (values.length !== 2) {\n console.warn('qti-divide: expected exactly 2 numeric values');\n return null;\n }\n\n if (values[1] === 0) {\n console.warn('qti-divide: division by zero');\n return null;\n }\n\n return values[0] / values[1];\n }\n\n #collectNumericValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (!variable) {\n continue;\n }\n\n const pushValue = (raw: unknown) => {\n if (raw === null || raw === undefined) {\n return;\n }\n const numValue = parseFloat(raw.toString());\n if (Number.isNaN(numValue)) {\n console.warn('qti-divide: non-numeric value encountered');\n return;\n }\n values.push(numValue);\n };\n\n if (Array.isArray(variable.value)) {\n variable.value.forEach(item => pushValue(item));\n continue;\n }\n\n pushValue(variable.value);\n }\n\n return values;\n }\n}\n\ncustomElements.define('qti-divide', QtiDivide);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiDurationGte extends QtiExpression<boolean | null> {\n public override getResult(): boolean | null {\n const values = this.#getDurationValues();\n if (!values) {\n return null;\n }\n\n return values[0] >= values[1];\n }\n\n #getDurationValues(): [number, number] | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 2) {\n console.error('qti-duration-gte requires exactly 2 duration expressions');\n return null;\n }\n\n // TODO: Register the built-in duration variables (`duration` and `sectionId.duration`)\n // from tracked candidate/session time-spent so these operators can resolve them implicitly.\n const values = variables.map(variable => this.#parseDuration(variable));\n if (values.some(value => value === null)) {\n return null;\n }\n\n return values as [number, number];\n }\n\n #parseDuration(variable: ResponseVariable): number | null {\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-duration-gte requires single cardinality');\n return null;\n }\n if (variable.baseType !== 'duration') {\n console.error('qti-duration-gte requires duration base-type');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n const value = Number.parseFloat(variable.value.toString());\n if (Number.isNaN(value)) {\n console.error(\n `qti-duration-gte requires duration values expressed in seconds, got \"${variable.value.toString()}\"`\n );\n return null;\n }\n\n return value;\n }\n}\n\ncustomElements.define('qti-duration-gte', QtiDurationGte);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-duration-lt operator compares two time durations.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#durationLT\n *\n * Takes 2 sub-expressions with base-type duration and single cardinality.\n * Returns true if the first duration is shorter than the second.\n * Special cases: Returns NULL if either argument is NULL; handles variable precision.\n */\nexport class QtiDurationLt extends QtiExpression<boolean | null> {\n public override getResult(): boolean | null {\n const values = this.#getDurationValues();\n if (!values) {\n return null;\n }\n\n return values[0] < values[1];\n }\n\n #getDurationValues(): [number, number] | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 2) {\n console.error('qti-duration-lt requires exactly 2 duration expressions');\n return null;\n }\n\n // TODO: Register the built-in duration variables (`duration` and `sectionId.duration`)\n // from tracked candidate/session time-spent so these operators can resolve them implicitly.\n const values = variables.map(variable => this.#parseDuration(variable));\n if (values.some(value => value === null)) {\n return null;\n }\n\n return values as [number, number];\n }\n\n #parseDuration(variable: ResponseVariable): number | null {\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-duration-lt requires single cardinality');\n return null;\n }\n if (variable.baseType !== 'duration') {\n console.error('qti-duration-lt requires duration base-type');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n const value = Number.parseFloat(variable.value.toString());\n if (Number.isNaN(value)) {\n console.error(`qti-duration-lt requires duration values expressed in seconds, got \"${variable.value.toString()}\"`);\n return null;\n }\n\n return value;\n }\n}\n\ncustomElements.define('qti-duration-lt', QtiDurationLt);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-gcd operator calculates the greatest common divisor of integer values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.gcd\n *\n * Takes 1 or more sub-expressions with base-type integer and any cardinality.\n * Returns a single integer equal to the greatest common divisor of all argument values.\n * Special cases: gcd(0,0)=0, gcd(0,n)=n if n≠0, returns NULL if any argument is NULL or non-numerical.\n */\nexport class QtiGcd extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length === 0) {\n console.error('qti-gcd must have at least one child expression');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n // Collect all integer values from all variables\n const allValues: number[] = [];\n\n for (const variable of variables) {\n // Check base type\n if (variable.baseType !== 'integer') {\n console.error('qti-gcd requires integer base-type');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Handle different cardinalities\n if (variable.cardinality === 'single') {\n if (Array.isArray(variable.value)) {\n console.error('qti-gcd unexpected array value for single cardinality');\n return null;\n }\n const numValue = parseInt(variable.value as string, 10);\n if (isNaN(numValue)) {\n console.error('qti-gcd non-numerical value');\n return null;\n }\n allValues.push(numValue);\n } else if (variable.cardinality === 'multiple' || variable.cardinality === 'ordered') {\n if (!Array.isArray(variable.value)) {\n console.error('qti-gcd expected array value for multiple/ordered cardinality');\n return null;\n }\n for (const value of variable.value) {\n if (value === null || value === undefined) {\n return null;\n }\n const numValue = parseInt(value as string, 10);\n if (isNaN(numValue)) {\n console.error('qti-gcd non-numerical value');\n return null;\n }\n allValues.push(numValue);\n }\n } else {\n console.error('qti-gcd unsupported cardinality');\n return null;\n }\n }\n\n if (allValues.length === 0) {\n return null;\n }\n\n // Calculate GCD of all values\n return this.#calculateGcd(allValues);\n }\n\n /**\n * Calculate the greatest common divisor of an array of integers\n */\n #calculateGcd(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n\n if (values.length === 1) {\n return Math.abs(values[0]);\n }\n\n // Start with the first value\n let result = Math.abs(values[0]);\n\n // Calculate GCD with each subsequent value\n for (let i = 1; i < values.length; i++) {\n result = this.#gcdTwoNumbers(result, Math.abs(values[i]));\n\n // Early termination: if GCD becomes 1, it won't get smaller\n if (result === 1) {\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Calculate GCD of two numbers using Euclidean algorithm\n */\n #gcdTwoNumbers(a: number, b: number): number {\n // Handle special cases according to QTI spec\n if (a === 0 && b === 0) {\n return 0; // gcd(0,0) = 0\n }\n if (a === 0) {\n return b; // gcd(0,n) = n\n }\n if (b === 0) {\n return a; // gcd(n,0) = n\n }\n\n // Euclidean algorithm\n while (b !== 0) {\n const temp = b;\n b = a % b;\n a = temp;\n }\n\n return a;\n }\n}\n\ncustomElements.define('qti-gcd', QtiGcd);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiGt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value > +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gt');\n }\n }\n console.error('unexpected number of children in qt');\n return null;\n }\n}\n\ncustomElements.define('qti-gt', QtiGt);\n","import { QtiConditionExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiGte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value >= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gte');\n return null;\n }\n }\n console.log('unexpected number of children in qte');\n return null;\n }\n}\n\ncustomElements.define('qti-gte', QtiGte);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\ntype Point = { x: number; y: number };\n\nexport class QtiInside extends QtiExpression<boolean | null> {\n @property({ type: String }) shape = '';\n\n @property({ type: String }) coords = '';\n\n public override getResult(): boolean | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 1) {\n console.error('qti-inside requires exactly one point expression');\n return null;\n }\n\n const variable = variables[0];\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-inside requires single cardinality');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n if (!this.shape || !this.coords) {\n console.error('qti-inside requires shape and coords attributes');\n return null;\n }\n\n const point = this.#parsePoint(variable.value.toString());\n const coords = this.#parseCoords(this.coords);\n\n if (!point || coords.length === 0) {\n return null;\n }\n\n switch (this.shape.toLowerCase()) {\n case 'circle':\n return this.#isInsideCircle(point, coords);\n case 'rect':\n return this.#isInsideRect(point, coords);\n case 'ellipse':\n return this.#isInsideEllipse(point, coords);\n case 'poly':\n case 'polygon':\n return this.#isInsidePolygon(point, coords);\n default:\n console.error(`qti-inside does not support shape \"${this.shape}\"`);\n return null;\n }\n }\n\n #parsePoint(value: string): Point | null {\n const tokens = value\n .split(/[,\\s]+/)\n .map(token => token.trim())\n .filter(Boolean);\n\n if (tokens.length !== 2) {\n console.error('qti-inside requires a point value formatted as \"x y\" or \"x,y\"');\n return null;\n }\n\n const x = Number.parseFloat(tokens[0]);\n const y = Number.parseFloat(tokens[1]);\n\n if (Number.isNaN(x) || Number.isNaN(y)) {\n console.error('qti-inside requires numeric point coordinates');\n return null;\n }\n\n return { x, y };\n }\n\n #parseCoords(value: string): number[] {\n const coords = value\n .split(',')\n .map(token => token.trim())\n .filter(Boolean)\n .map(token => Number.parseFloat(token));\n\n if (coords.some(coord => Number.isNaN(coord))) {\n console.error('qti-inside requires numeric coords');\n return [];\n }\n\n return coords;\n }\n\n #isInsideCircle(point: Point, coords: number[]): boolean | null {\n if (coords.length !== 3) {\n console.error('qti-inside circle requires x,y,r');\n return null;\n }\n\n const [centerX, centerY, radius] = coords;\n return (point.x - centerX) ** 2 + (point.y - centerY) ** 2 <= radius ** 2;\n }\n\n #isInsideRect(point: Point, coords: number[]): boolean | null {\n if (coords.length !== 4) {\n console.error('qti-inside rect requires left,top,right,bottom');\n return null;\n }\n\n const [x1, y1, x2, y2] = coords;\n const left = Math.min(x1, x2);\n const right = Math.max(x1, x2);\n const top = Math.min(y1, y2);\n const bottom = Math.max(y1, y2);\n\n return point.x >= left && point.x <= right && point.y >= top && point.y <= bottom;\n }\n\n #isInsideEllipse(point: Point, coords: number[]): boolean | null {\n if (coords.length !== 4) {\n console.error('qti-inside ellipse requires centerX,centerY,radiusX,radiusY');\n return null;\n }\n\n const [centerX, centerY, radiusX, radiusY] = coords;\n if (radiusX === 0 || radiusY === 0) {\n return false;\n }\n\n return ((point.x - centerX) ** 2) / (radiusX ** 2) + ((point.y - centerY) ** 2) / (radiusY ** 2) <= 1;\n }\n\n #isInsidePolygon(point: Point, coords: number[]): boolean | null {\n if (coords.length < 6 || coords.length % 2 !== 0) {\n console.error('qti-inside polygon requires at least 3 coordinate pairs');\n return null;\n }\n\n let inside = false;\n\n for (let current = 0, previous = coords.length - 2; current < coords.length; current += 2) {\n const xi = coords[current];\n const yi = coords[current + 1];\n const xj = coords[previous];\n const yj = coords[previous + 1];\n\n const intersects =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / ((yj - yi) || Number.EPSILON) + xi;\n\n if (intersects) {\n inside = !inside;\n }\n\n previous = current;\n }\n\n return inside;\n }\n}\n\ncustomElements.define('qti-inside', QtiInside);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-integer-divide operator performs integer division rounded down.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#integerDivide\n *\n * Takes 2 sub-expressions with base-type integer and single cardinality.\n * Returns result of (x / y) rounded down toward negative infinity.\n * Special cases: Returns NULL if any argument is NULL or if divisor is 0.\n */\nexport class QtiIntegerDivide extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectIntegerValues(this.getVariables() as ResponseVariable[]);\n\n if (values.length !== 2) {\n console.error('qti-integer-divide requires exactly 2 integer values');\n return null;\n }\n\n if (values[1] === 0) {\n console.error('qti-integer-divide: division by zero');\n return null;\n }\n\n return Math.floor(values[0] / values[1]);\n }\n\n #collectIntegerValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (variable.baseType !== 'integer') {\n console.error('qti-integer-divide requires integer base-type');\n return [];\n }\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-integer-divide requires single cardinality');\n return [];\n }\n if (variable.value === null || variable.value === undefined) {\n return [];\n }\n\n const value = Number.parseInt(variable.value as string, 10);\n if (Number.isNaN(value)) {\n console.error('qti-integer-divide requires integer values');\n return [];\n }\n values.push(value);\n }\n\n return values;\n }\n}\n\ncustomElements.define('qti-integer-divide', QtiIntegerDivide);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-integer-modulus operator returns the remainder of integer division.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#integerModulus\n *\n * Takes 2 sub-expressions with base-type integer and single cardinality.\n * Returns the remainder (x % y).\n * Special cases: Returns NULL if any argument is NULL or if divisor is 0.\n */\nexport class QtiIntegerModulus extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectIntegerValues(this.getVariables() as ResponseVariable[]);\n\n if (values.length !== 2) {\n console.error('qti-integer-modulus requires exactly 2 integer values');\n return null;\n }\n\n if (values[1] === 0) {\n console.error('qti-integer-modulus: division by zero');\n return null;\n }\n\n return values[0] % values[1];\n }\n\n #collectIntegerValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (variable.baseType !== 'integer') {\n console.error('qti-integer-modulus requires integer base-type');\n return [];\n }\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-integer-modulus requires single cardinality');\n return [];\n }\n if (variable.value === null || variable.value === undefined) {\n return [];\n }\n\n const value = Number.parseInt(variable.value as string, 10);\n if (Number.isNaN(value)) {\n console.error('qti-integer-modulus requires integer values');\n return [];\n }\n values.push(value);\n }\n\n return values;\n }\n}\n\ncustomElements.define('qti-integer-modulus', QtiIntegerModulus);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-integer-to-float operator converts an integer to a float.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#integerToFloat\n *\n * Takes 1 sub-expression with base-type integer and single cardinality.\n * Returns a value of base-type float with the same numeric value.\n * Special cases: Returns NULL if sub-expression is NULL.\n */\nexport class QtiIntegerToFloat extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 1) {\n console.error('qti-integer-to-float requires exactly one child expression');\n return null;\n }\n\n const variable = variables[0];\n if (variable.baseType !== 'integer') {\n console.error('qti-integer-to-float requires integer base-type');\n return null;\n }\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-integer-to-float requires single cardinality');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n const value = Number.parseInt(variable.value as string, 10);\n if (Number.isNaN(value)) {\n console.error('qti-integer-to-float requires an integer value');\n return null;\n }\n\n return value;\n }\n}\n\ncustomElements.define('qti-integer-to-float', QtiIntegerToFloat);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiLcm extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectIntegerValues(this.getVariables() as ResponseVariable[]);\n\n if (values.length === 0) {\n console.error('qti-lcm requires at least one integer value');\n return null;\n }\n\n return values.reduce((accumulator, value) => this.#lcm(accumulator, value));\n }\n\n #collectIntegerValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (variable.baseType !== 'integer') {\n console.error('qti-lcm requires integer base-type');\n return [];\n }\n if (variable.value === null || variable.value === undefined) {\n return [];\n }\n\n if (variable.cardinality === 'single') {\n if (Array.isArray(variable.value)) {\n console.error('qti-lcm unexpected array value for single cardinality');\n return [];\n }\n\n const value = Number.parseInt(variable.value as string, 10);\n if (Number.isNaN(value)) {\n console.error('qti-lcm requires integer values');\n return [];\n }\n values.push(value);\n continue;\n }\n\n if (variable.cardinality !== 'multiple' && variable.cardinality !== 'ordered') {\n console.error('qti-lcm unsupported cardinality');\n return [];\n }\n\n if (!Array.isArray(variable.value)) {\n console.error('qti-lcm expected array value for container cardinality');\n return [];\n }\n\n for (const entry of variable.value) {\n const value = Number.parseInt(entry as string, 10);\n if (Number.isNaN(value)) {\n console.error('qti-lcm requires integer values');\n return [];\n }\n values.push(value);\n }\n }\n\n return values;\n }\n\n #gcd(a: number, b: number): number {\n let left = Math.abs(a);\n let right = Math.abs(b);\n\n while (right !== 0) {\n const remainder = left % right;\n left = right;\n right = remainder;\n }\n\n return left;\n }\n\n #lcm(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n\n return Math.abs((a * b) / this.#gcd(a, b));\n }\n}\n\ncustomElements.define('qti-lcm', QtiLcm);\n","import { QtiExpression } from '@qti-components/base';\n\n/**\n * @summary The qti-null expression returns the NULL value.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.null\n *\n * A simple expression that returns the NULL value. The null value is treated\n * as if it is of any desired base-type.\n */\nexport class QtiNull extends QtiExpression<null> {\n public override getResult(): null {\n return null;\n }\n}\n\ncustomElements.define('qti-null', QtiNull);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-is-null operator checks if a variable or expression is missing its value.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#isNull\n *\n * Takes 1 sub-expression with any base-type or cardinality.\n * Returns true if the sub-expression is NULL, false otherwise.\n * Special cases: Empty containers and empty strings are treated as NULL.\n */\nexport class QtiIsNull extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 1) {\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables) {\n return true;\n }\n const value = variables[0].value;\n return value == null || value == undefined || value === '';\n }\n console.error('unexpected number of children in qti Null');\n return null;\n }\n}\n\ncustomElements.define('qti-is-null', QtiIsNull);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-field-value operator retrieves a specific field from a record.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#fieldValue\n *\n * Takes a sub-expression with record cardinality. 'field-identifier' identifies the field.\n * Returns the value of the specified field.\n * Special cases: Returns NULL if sub-expression is NULL or field does not exist.\n */\nexport class QtiFieldValue extends QtiExpression<string | string[]> {\n public override getResult() {\n const fieldIdentifier = this.getAttribute('field-identifier');\n\n if (!fieldIdentifier) {\n throw new Error('field-identifier attribute is required');\n }\n\n // Get the result from the child expression (should be a record)\n const childElements = Array.from(this.children) as QtiExpression<any>[];\n\n if (childElements.length !== 1) {\n throw new Error('qti-field-value must have exactly one child expression');\n }\n\n const variable = (this.getVariables() as ResponseVariable[])[0];\n\n // Check if the result is a record/object\n if (variable.baseType !== 'record' || variable.value === null) {\n throw new Error('qti-field-value child expression must return a record');\n }\n\n // Return the field value\n const fieldValue = (variable.value as Record<string, any>)[fieldIdentifier];\n\n if (fieldValue === undefined) {\n throw new Error(`Field \"${fieldIdentifier}\" not found in record`);\n }\n\n return fieldValue;\n }\n}\n\ncustomElements.define('qti-field-value', QtiFieldValue);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiLt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value < +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti lt');\n }\n }\n console.error('unexpected number of children in lt');\n return null;\n }\n}\n\ncustomElements.define('qti-lt', QtiLt);\n","import { QtiConditionExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiLte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value <= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti lte');\n return null;\n }\n }\n console.log('unexpected number of children in lte');\n return null;\n }\n}\n\ncustomElements.define('qti-lte', QtiLte);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\nimport { ScoringHelper } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-map-response operator applies a mapping to a candidate's response.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#mapResponse\n *\n * Transforms the bound response variable using the declaration's qti-mapping.\n * Returns a single float representing the mapped score (or sum of mapped values).\n * Special cases: Returns 0.0 if response is NULL; counts identical values in containers once.\n */\nexport class QtiMapResponse extends QtiExpression<number> {\n @property({ type: String }) identifier: string;\n\n public override getResult(): number {\n const response: ResponseVariable = this.context.variables.find(r => r.identifier === this.identifier);\n if (!response || !response.mapping) {\n console.error(`Response ${this.identifier} can not be found`);\n return null;\n }\n const mapping = response.mapping;\n const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;\n let result = 0;\n for (const candidateResponse of candidateResponses) {\n const mappedValues = mapping.mapEntries.filter(entry => {\n if (response.baseType === 'string' && !entry.caseSensitive) {\n return ScoringHelper.compareSingleValues(\n entry.mapKey.toLowerCase(),\n candidateResponse.toLowerCase(),\n response.baseType\n );\n } else {\n return ScoringHelper.compareSingleValues(entry.mapKey, candidateResponse, response.baseType);\n }\n });\n // now find the mapped value with the highest value (if there are multiple)\n const mappedValue = mappedValues.reduce(\n (prev, current) => (prev.mappedValue > current.mappedValue ? prev : current),\n mappedValues.length > 0 ? mappedValues[0] : { mapKey: null, mappedValue: null } // Use the first element instead of a manual initial value\n );\n if (!(mappedValue === null || mappedValue.mappedValue == undefined)) {\n result += mappedValue.mappedValue;\n } else {\n result += mapping.defaultValue;\n }\n }\n if (mapping?.lowerBound !== null && mapping?.lowerBound !== undefined) {\n result = Math.max(mapping.lowerBound, result);\n }\n if (mapping?.upperBound !== null && mapping?.upperBound !== undefined) {\n result = Math.min(mapping.upperBound, result);\n }\n return result;\n }\n}\n\ncustomElements.define('qti-map-response', QtiMapResponse);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\nimport { ScoringHelper } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\nimport type { QtiAreaMapping } from '@qti-components/base';\n\nexport class QtiMapResponsePoint extends QtiExpression<number> {\n @property({ type: String }) identifier: string;\n\n public override getResult(): number {\n const response: ResponseVariable = this.context.variables.find(r => r.identifier === this.identifier);\n if (!response) {\n console.warn(`Response ${this.identifier} cannot be found`);\n return null;\n }\n\n const areaMapping: QtiAreaMapping = response.areaMapping;\n if (!areaMapping) {\n console.warn(`Area mapping not found for response ${this.identifier}`);\n return null;\n }\n\n const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;\n if (!candidateResponses || candidateResponses.length === 0) {\n console.warn(`No candidate responses for response ${this.identifier}`);\n return null;\n }\n\n let result = 0;\n\n // Keep track of areas that have already been matched\n const mappedAreas = new Set<string>();\n\n for (const candidateResponse of candidateResponses) {\n for (const entry of areaMapping.areaMapEntries) {\n if (mappedAreas.has(entry.coords)) {\n continue; // Skip areas that have already been mapped\n }\n const isPointInArea = ScoringHelper.isPointInArea(\n candidateResponse,\n `${entry.shape},${entry.coords}`,\n response.baseType\n );\n if (isPointInArea) {\n result += entry.mappedValue ?? 0;\n mappedAreas.add(entry.coords);\n }\n }\n }\n\n // Add default value for unmatched candidate responses\n if (mappedAreas.size < candidateResponses.length) {\n result += areaMapping.defaultValue;\n }\n\n // Apply bounds if defined\n if (areaMapping.lowerBound != null) {\n result = Math.max(areaMapping.lowerBound, result);\n }\n if (areaMapping.upperBound != null) {\n result = Math.min(areaMapping.upperBound, result);\n }\n\n return result;\n }\n}\n\ncustomElements.define('qti-map-response-point', QtiMapResponsePoint);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-math-operator performs mathematical operations on numerical values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.math-operator\n *\n * Takes 1 or more sub-expressions with single cardinality and numerical base-types.\n * The result is a single float, except for signum, floor and ceil which return integers.\n * Returns NULL if any argument is NULL or falls outside the function's natural domain.\n */\nexport class QtiMathOperator extends QtiExpression<number | null> {\n @property({ type: String }) name: string = '';\n\n public override getResult(): number | null {\n if (!this.name) {\n console.error('qti-math-operator requires a name attribute');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length === 0) {\n return null;\n }\n\n // Extract numerical values and validate\n const values: number[] = [];\n for (const variable of variables) {\n // Check cardinality\n if (variable.cardinality !== 'single') {\n console.error('qti-math-operator requires single cardinality');\n return null;\n }\n\n // Check if value is array (shouldn't be for single cardinality)\n if (Array.isArray(variable.value)) {\n console.error('qti-math-operator unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n // Check base type\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-math-operator requires numerical base-type');\n return null;\n }\n\n // Convert to number\n const numValue = parseFloat(variable.value as string);\n if (isNaN(numValue)) {\n console.error('qti-math-operator non-numerical value');\n return null;\n }\n\n values.push(numValue);\n }\n\n // Perform the mathematical operation\n return this.#performOperation(this.name, values);\n }\n\n #performOperation(operation: string, values: number[]): number | null {\n try {\n switch (operation.toLowerCase()) {\n // Single argument functions\n case 'sin':\n if (values.length !== 1) return null;\n return Math.sin(values[0]);\n\n case 'cos':\n if (values.length !== 1) return null;\n return Math.cos(values[0]);\n\n case 'tan':\n if (values.length !== 1) return null;\n return Math.tan(values[0]);\n\n case 'asin':\n if (values.length !== 1) return null;\n if (values[0] < -1 || values[0] > 1) return null; // Outside domain\n return Math.asin(values[0]);\n\n case 'acos':\n if (values.length !== 1) return null;\n if (values[0] < -1 || values[0] > 1) return null; // Outside domain\n return Math.acos(values[0]);\n\n case 'atan':\n if (values.length !== 1) return null;\n return Math.atan(values[0]);\n\n case 'sinh':\n if (values.length !== 1) return null;\n return Math.sinh(values[0]);\n\n case 'cosh':\n if (values.length !== 1) return null;\n return Math.cosh(values[0]);\n\n case 'tanh':\n if (values.length !== 1) return null;\n return Math.tanh(values[0]);\n\n case 'log':\n if (values.length !== 1) return null;\n if (values[0] <= 0) return null; // Outside domain\n return Math.log(values[0]);\n\n case 'ln':\n if (values.length !== 1) return null;\n if (values[0] <= 0) return null; // Outside domain\n return Math.log(values[0]);\n\n case 'log10':\n if (values.length !== 1) return null;\n if (values[0] <= 0) return null; // Outside domain\n return Math.log10(values[0]);\n\n case 'exp':\n if (values.length !== 1) return null;\n return Math.exp(values[0]);\n\n case 'abs':\n if (values.length !== 1) return null;\n return Math.abs(values[0]);\n\n case 'sqrt':\n if (values.length !== 1) return null;\n if (values[0] < 0) return null; // Outside domain\n return Math.sqrt(values[0]);\n\n case 'signum':\n if (values.length !== 1) return null;\n return Math.sign(values[0]); // Returns -1, 0, or 1 (integer)\n\n case 'floor':\n if (values.length !== 1) return null;\n return Math.floor(values[0]); // Returns integer\n\n case 'ceil':\n if (values.length !== 1) return null;\n return Math.ceil(values[0]); // Returns integer\n\n case 'round':\n if (values.length !== 1) return null;\n return Math.round(values[0]);\n\n // Two argument functions\n case 'atan2':\n if (values.length !== 2) return null;\n return Math.atan2(values[0], values[1]);\n\n case 'pow': {\n if (values.length !== 2) {\n return null;\n }\n const base = values[0];\n const exponent = values[1];\n // Check for invalid cases\n if (base === 0 && exponent <= 0) return null;\n if (base < 0 && !Number.isInteger(exponent)) return null;\n return Math.pow(base, exponent);\n }\n case 'log_base': {\n if (values.length !== 2) {\n return null;\n }\n const value = values[0];\n const base = values[1];\n if (value <= 0 || base <= 0 || base === 1) return null; // Outside domain\n return Math.log(value) / Math.log(base);\n }\n case 'mod':\n if (values.length !== 2) return null;\n if (values[1] === 0) return null; // Division by zero\n return values[0] % values[1];\n\n case 'max':\n if (values.length < 1) return null;\n return Math.max(...values);\n\n case 'min':\n if (values.length < 1) return null;\n return Math.min(...values);\n\n default:\n console.error(`qti-math-operator: unknown operation \"${operation}\"`);\n return null;\n }\n } catch (error) {\n console.error(`qti-math-operator: error performing operation \"${operation}\":`, error);\n return null;\n }\n }\n}\n\ncustomElements.define('qti-math-operator', QtiMathOperator);\n","import { ScoringHelper } from '@qti-components/base';\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-match operator compares two expressions for exact value equality.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#match\n *\n * Takes 2 sub-expressions which must have the same base-type and cardinality.\n * Returns true if they represent the same value, false otherwise.\n * Special cases: Must not be used for float or duration types; returns NULL if any argument is NULL.\n */\nexport class QtiMatch extends QtiExpression<boolean> {\n //PK : FIXME.\n // This was a little experiment if we could call the match function as a static function,\n // This can be used for all kind of things, but now especially for use in\n // qti-response-condition-script\n // in which we pass the expressions as pure functions, and hope for the best.\n // SADLY, the getVariables throws roet in de eten.. weet nog niet precies hoe deze werkt.\n // Maar ik ga erin duiken.\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const valueToMap = values[0];\n const correctValueInfo = values[1];\n return QtiMatch.match(valueToMap, correctValueInfo);\n }\n\n console.error('unexpected number of children in match');\n return null;\n }\n\n public static match(valueToMap: ResponseVariable, correctValueInfo: ResponseVariable) {\n if (valueToMap.value === null) return false;\n switch (correctValueInfo.cardinality) {\n case 'single': {\n if (Array.isArray(valueToMap.value) || Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n return ScoringHelper.compareSingleValues(\n valueToMap.value?.toString(),\n correctValueInfo.value.toString(),\n correctValueInfo.baseType\n );\n }\n\n case 'ordered': {\n if (!Array.isArray(valueToMap.value) || !Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n if (valueToMap.value.length !== correctValueInfo.value.length) {\n return false;\n }\n for (let i = 0; i < valueToMap.value.length; i++) {\n const result = ScoringHelper.compareSingleValues(\n correctValueInfo.value[i],\n valueToMap.value[i],\n correctValueInfo.baseType\n );\n if (!result) {\n return false;\n }\n }\n return true;\n }\n\n case 'multiple': {\n if (!Array.isArray(valueToMap.value) || !Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n if (valueToMap.value.length !== correctValueInfo.value.length) {\n return false;\n }\n let answerIndex = 0;\n for (const correctAnswer of correctValueInfo.value) {\n let matchingValue: string | null = null;\n const arr = [...valueToMap.value];\n for (const mv of arr) {\n const result = ScoringHelper.compareSingleValues(correctAnswer, mv, correctValueInfo.baseType);\n if (result) {\n matchingValue = mv;\n break;\n }\n }\n if (matchingValue !== null) {\n (arr as string[]).splice(arr.indexOf(matchingValue), 1);\n } else {\n return false;\n }\n answerIndex++;\n }\n return true;\n }\n\n default:\n console.error('unexpected cardinality in qti match');\n return false;\n }\n }\n}\n\ncustomElements.define('qti-match', QtiMatch);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-max operator finds the largest value in a numerical set.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#max\n *\n * Takes 1 or more numerical sub-expressions of any cardinality.\n * Returns the largest value in the collection.\n * Special cases: Returns NULL if any argument is NULL or non-numerical.\n */\nexport class QtiMax extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectNumericValues(this.getVariables() as ResponseVariable[]);\n if (values.length === 0) {\n console.warn('qti-max: no numeric values provided');\n return null;\n }\n\n return Math.max(...values);\n }\n\n #collectNumericValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (!variable) {\n continue;\n }\n\n const pushValue = (raw: unknown) => {\n if (raw === null || raw === undefined) {\n return;\n }\n const numValue = parseFloat(raw.toString());\n if (Number.isNaN(numValue)) {\n console.warn('qti-max: non-numeric value encountered');\n return;\n }\n values.push(numValue);\n };\n\n if (Array.isArray(variable.value)) {\n variable.value.forEach(item => pushValue(item));\n continue;\n }\n\n pushValue(variable.value);\n }\n\n return values;\n }\n}\n\ncustomElements.define('qti-max', QtiMax);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiMember extends QtiExpression<boolean | null> {\n public override getResult() {\n const values = this.getVariables() as ResponseVariable[];\n\n if (!(this.children.length === 2)) {\n console.warn('The member operator takes two sub-expressions');\n }\n\n const [value1, value2] = values;\n\n if (\n !(\n value1.baseType === value2.baseType ||\n (value1.baseType === 'integer' && value2.baseType === 'float') ||\n (value1.baseType === 'float' && value2.baseType === 'integer')\n )\n ) {\n console.warn('Which must both have the same base-type');\n }\n if (!(value2.cardinality === 'multiple' || value2.cardinality === 'ordered')) {\n console.warn('and the second must be a multiple or ordered container');\n }\n if (value1.baseType === 'float' || value2.baseType === 'float') {\n console.warn('The member operator should not be used on sub-expressions with a base-type of float');\n }\n if (value1.baseType === 'duration' || value2.baseType === 'duration') {\n console.warn('It must not be used on sub-expressions with a base-type of duration');\n }\n\n // If either sub-expression is NULL then the result of the operator is NULL\n if (value1.value === null || value2.value === null) {\n return null;\n }\n\n // The result is a single boolean with a value of 'true' if the value given by the first sub-expression is in the container defined by the second sub-expression.\n const projection1 = value1.value as string;\n const projection2 = value2.value as string[];\n return projection2.includes(projection1);\n }\n}\n\ncustomElements.define('qti-member', QtiMember);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-min operator finds the smallest value in a numerical set.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#min\n *\n * Takes 1 or more numerical sub-expressions of any cardinality.\n * Returns the smallest value in the collection.\n * Special cases: Returns NULL if any argument is NULL or non-numerical.\n */\nexport class QtiMin extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const values = this.#collectNumericValues(this.getVariables() as ResponseVariable[]);\n if (values.length === 0) {\n console.warn('qti-min: no numeric values provided');\n return null;\n }\n\n return Math.min(...values);\n }\n\n #collectNumericValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (!variable) {\n continue;\n }\n\n const pushValue = (raw: unknown) => {\n if (raw === null || raw === undefined) {\n return;\n }\n const numValue = parseFloat(raw.toString());\n if (Number.isNaN(numValue)) {\n console.warn('qti-min: non-numeric value encountered');\n return;\n }\n values.push(numValue);\n };\n\n if (Array.isArray(variable.value)) {\n variable.value.forEach(item => pushValue(item));\n continue;\n }\n\n pushValue(variable.value);\n }\n\n return values;\n }\n}\n\ncustomElements.define('qti-min', QtiMin);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable, VariableDeclaration } from '@qti-components/base';\nexport class QtiMultiple extends QtiExpression<VariableDeclaration<string | string[]>[]> {\n public override getResult(): ResponseVariable[] {\n console.debug('qti-multiple getResult called', this.innerHTML);\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length === 0) {\n console.error('unexpected number of children in qti multiple');\n return null;\n }\n for (const variable of variables) {\n if (variable.cardinality !== 'multiple' && variable.cardinality !== 'single') {\n console.error('unexpected cardinality in qti multiple');\n return [];\n }\n }\n\n // const values = variables.map(v => v.value);\n // console.log(variables);\n // const flattenedArray = values.reduce((acc: string[], value: string | string[]) => {\n // return acc.concat(Array.isArray(value) ? [...value] : value);\n // }, []);\n // return flattenedArray;\n\n return variables;\n }\n}\n\ncustomElements.define('qti-multiple', QtiMultiple);\n","import { html } from 'lit';\n\nimport { QtiExpression } from '@qti-components/base';\n\n/**\n * @summary The qti-not operator performs logical negation.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#not\n *\n * Takes exactly 1 sub-expression with base-type boolean and single cardinality.\n * Returns true if sub-expression is false, and false if sub-expression is true.\n * Special cases: Returns NULL if sub-expression is NULL.\n */\nexport class QtiNot extends QtiExpression<boolean> {\n override render() {\n return html`${super.render()}`;\n }\n\n public override getResult() {\n const expression = this.firstElementChild as QtiExpression<boolean>;\n const result = expression.calculate() as boolean;\n return !result;\n }\n}\n\ncustomElements.define('qti-not', QtiNot);\n","import { QtiConditionExpression } from '@qti-components/base';\n\nimport type { QtiExpression } from '@qti-components/base';\n\n/**\n * @summary The qti-or operator evaluates if any provided boolean expressions are true.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#or\n *\n * Takes 1 or more sub-expressions with base-type boolean and single cardinality.\n * Returns true if at least one sub-expression is true, false if all are false.\n * Special cases: Returns NULL if any sub-expression is NULL and all others are false.\n */\nexport class QtiOr extends QtiConditionExpression {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = Array.from(this.children).map(c => {\n const condition = c as QtiExpression<any>;\n if (!condition.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = condition.calculate();\n let val = false;\n // convert string value to boolean and return null if not possible\n if (typeof value === 'string') {\n if (value === 'true') {\n val = true;\n } else if (value === 'false') {\n val = false;\n } else {\n console.error('unexpected val in qti-or, expected boolean');\n return null;\n }\n } else {\n if (typeof value === 'boolean') {\n val = value;\n }\n }\n return val;\n });\n return values.some(e => {\n return typeof e === 'boolean' && e;\n });\n }\n}\n\ncustomElements.define('qti-or', QtiOr);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\nexport class QtiOrdered extends QtiExpression<ResponseVariable[]> {\n public override getResult(): ResponseVariable[] {\n const variables = this.getVariables() as ResponseVariable[];\n if (variables.length === 0) {\n console.error('unexpected number of children in qti multiple');\n return null;\n }\n for (const variable of variables) {\n if (variable.cardinality !== 'ordered' && variable.cardinality !== 'single') {\n console.error('unexpected cardinality in qti ordered');\n return [];\n }\n }\n return variables;\n }\n}\n\ncustomElements.define('qti-ordered', QtiOrdered);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-power operator raises the first expression to the power of the second.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.power\n *\n * Takes 2 sub-expressions with single cardinality and numerical base-types.\n * Returns a single float corresponding to the first expression raised to the power of the second.\n * Returns NULL if either expression is NULL or if the result is outside the float value set.\n */\nexport class QtiPower extends QtiExpression<number | null> {\n public override getResult(): number | null {\n if (this.children.length !== 2) {\n console.error('qti-power must have exactly two child expressions');\n return null;\n }\n\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables || variables.length !== 2) {\n return null;\n }\n\n const [base, exponent] = variables;\n\n // Check cardinality for both expressions\n if (base.cardinality !== 'single' || exponent.cardinality !== 'single') {\n console.error('qti-power requires single cardinality for both expressions');\n return null;\n }\n\n // Check if values are arrays (shouldn't be for single cardinality)\n if (Array.isArray(base.value) || Array.isArray(exponent.value)) {\n console.error('qti-power unexpected array value for single cardinality');\n return null;\n }\n\n // Handle null values\n if (base.value === null || base.value === undefined || exponent.value === null || exponent.value === undefined) {\n return null;\n }\n\n // Check base types\n if (\n (base.baseType !== 'integer' && base.baseType !== 'float') ||\n (exponent.baseType !== 'integer' && exponent.baseType !== 'float')\n ) {\n console.error('qti-power requires numerical base-types');\n return null;\n }\n\n // Convert to numbers\n const baseValue = parseFloat(base.value as string);\n const exponentValue = parseFloat(exponent.value as string);\n\n // Check for NaN values\n if (isNaN(baseValue) || isNaN(exponentValue)) {\n console.error('qti-power: non-numerical values encountered');\n return null;\n }\n\n // Handle special cases that should return NULL according to mathematical rules\n if (baseValue === 0 && exponentValue <= 0) {\n // 0^0, 0^(-n) are undefined\n return null;\n }\n\n if (baseValue < 0 && !Number.isInteger(exponentValue)) {\n // Negative base with non-integer exponent results in complex number\n return null;\n }\n\n // Calculate the power\n let result: number;\n try {\n result = Math.pow(baseValue, exponentValue);\n } catch (error) {\n console.error('qti-power: error calculating power:', error);\n return null;\n }\n\n // Check if result is within valid float range\n if (isNaN(result)) {\n return null;\n }\n\n // Allow positive and negative infinity as per spec\n if (result === Infinity || result === -Infinity) {\n return result;\n }\n\n // Check if result is within JavaScript's safe number range\n // This is a practical limit for what can be represented as a float\n if (!isFinite(result)) {\n return null;\n }\n\n // Additional check for extremely large or small numbers that might cause issues\n if (Math.abs(result) > Number.MAX_VALUE) {\n return null;\n }\n\n // Check for underflow (extremely small numbers that round to 0)\n if (result !== 0 && Math.abs(result) < Number.MIN_VALUE) {\n return null;\n }\n if (isFinite(result) && result !== 0) {\n // Determine appropriate precision based on the magnitude of the result\n const magnitude = Math.floor(Math.log10(Math.abs(result)));\n const precision = Math.max(0, 14 - magnitude); // Maintain 14 significant digits\n const factor = Math.pow(10, precision);\n result = Math.round(result * factor) / factor;\n }\n\n return result;\n }\n}\n\ncustomElements.define('qti-power', QtiPower);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-pattern-match operator checks a string against a regular expression.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#patternMatch\n *\n * Takes 1 string sub-expression; 'pattern' attribute contains the regex.\n * Returns true if the string matches the pattern, false otherwise.\n * Special cases: Returns NULL if sub-expression is NULL.\n */\nexport class QtiPatternMatch extends QtiExpression<boolean | null> {\n @property({ type: String }) pattern = '';\n\n public override getResult(): boolean | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 1) {\n console.error('qti-pattern-match requires exactly one child expression');\n return null;\n }\n\n if (!this.pattern) {\n console.error('qti-pattern-match requires a pattern attribute');\n return null;\n }\n\n const variable = variables[0];\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-pattern-match requires single cardinality');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n try {\n return new RegExp(this.pattern).test(variable.value.toString());\n } catch (error) {\n console.error('qti-pattern-match requires a valid regular expression', error);\n return null;\n }\n }\n}\n\ncustomElements.define('qti-pattern-match', QtiPatternMatch);\n","import { consume } from '@lit/context';\nimport { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '@qti-components/base';\n\nimport type { VariableDeclaration } from '@qti-components/base';\nimport type { ItemContext } from '@qti-components/base';\n\nexport class QtiPrintedVariable extends LitElement {\n @property({ type: String })\n identifier: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n override render() {\n const value = this.context?.variables.find(v => v.identifier === this.identifier)?.value;\n return value === null ? nothing : html`${JSON.stringify(value, null, 2)}`;\n }\n\n public calculate(): VariableDeclaration<string | string[]> {\n const result = this.context.variables.find(v => v.identifier === this.identifier) || null;\n return result;\n }\n}\n\ncustomElements.define('qti-printed-variable', QtiPrintedVariable);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-product operator calculates the product of multiple numerical values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#product\n *\n * Takes 1 or more sub-expressions with numerical base-types and any cardinality.\n * Returns a single float (or integer if all arguments are integers).\n * Special cases: Returns NULL if any sub-expression is NULL.\n */\nexport class QtiProduct extends QtiExpression<number> {\n public override getResult() {\n const values = this.getVariables() as ResponseVariable[];\n const product = values.reduce((accumulator, currentValue) => {\n if (currentValue.baseType == 'float' || currentValue.baseType == 'integer') {\n try {\n return accumulator * parseFloat(currentValue.value.toString());\n } catch (error) {\n console.warn(`can not convert to number`);\n }\n } else {\n console.warn(`has another baseType ${currentValue.baseType}`);\n }\n return accumulator;\n }, 1);\n return product;\n }\n}\n\ncustomElements.define('qti-product', QtiProduct);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-repeat operator generates a container by repeating an expression.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#repeat\n *\n * Attributes 'number-repeats' determines the count of iterations.\n * Returns an ordered container filled with results of the evaluated sub-expressions.\n * Special cases: Returns NULL if number-repeats < 1; ignores evaluated NULL values.\n */\nexport class QtiRepeat extends QtiExpression<ResponseVariable[]> {\n @property({ type: String, attribute: 'number-repeats' }) numberRepeats: string = '';\n\n public override getResult(): ResponseVariable[] {\n const count = this.#resolveRepeatCount();\n if (count <= 0) {\n return [];\n }\n\n const expression = this.firstElementChild as QtiExpression<unknown> | null;\n if (!expression) {\n console.warn('qti-repeat: missing child expression');\n return [];\n }\n\n const results: ResponseVariable[] = [];\n for (let i = 0; i < count; i++) {\n const value = expression.calculate();\n const variable = this.#toResponseVariable(value);\n if (variable) {\n results.push(variable);\n }\n }\n\n return results;\n }\n\n #resolveRepeatCount(): number {\n if (!this.numberRepeats) {\n console.warn('qti-repeat: missing number-repeats attribute');\n return 0;\n }\n\n const numericCount = parseInt(this.numberRepeats, 10);\n if (!Number.isNaN(numericCount)) {\n return numericCount;\n }\n\n const identifier = this.numberRepeats;\n const variable = this.context?.variables?.find(v => v.identifier === identifier);\n if (!variable) {\n console.warn(`qti-repeat: unknown identifier \"${identifier}\"`);\n return 0;\n }\n\n const rawValue = Array.isArray(variable.value) ? variable.value[0] : variable.value;\n const resolvedCount = parseInt(rawValue?.toString() ?? '', 10);\n\n if (Number.isNaN(resolvedCount)) {\n console.warn(`qti-repeat: invalid repeat count from \"${identifier}\"`);\n return 0;\n }\n\n return resolvedCount;\n }\n\n #toResponseVariable(value: unknown): ResponseVariable | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number') {\n return {\n identifier: '',\n cardinality: 'single',\n baseType: Number.isInteger(value) ? 'integer' : 'float',\n value: value.toString(),\n type: 'response'\n } as ResponseVariable;\n }\n\n if (typeof value === 'string') {\n const numericValue = parseFloat(value);\n if (!Number.isNaN(numericValue)) {\n return {\n identifier: '',\n cardinality: 'single',\n baseType: Number.isInteger(numericValue) ? 'integer' : 'float',\n value: value.toString(),\n type: 'response'\n } as ResponseVariable;\n }\n }\n\n if (value && typeof value === 'object' && 'value' in (value as ResponseVariable)) {\n const responseValue = (value as ResponseVariable).value;\n return {\n identifier: '',\n cardinality: 'single',\n baseType: (value as ResponseVariable).baseType ?? 'string',\n value: responseValue !== null && responseValue !== undefined ? responseValue.toString() : null,\n type: 'response'\n } as ResponseVariable;\n }\n\n return {\n identifier: '',\n cardinality: 'single',\n baseType: 'string',\n value: value.toString(),\n type: 'response'\n } as ResponseVariable;\n }\n}\n\ncustomElements.define('qti-repeat', QtiRepeat);\n","import { convertNumberToUniversalFormat } from '@qti-components/base';\n\nimport { QtiRule } from '../qti-rule/qti-rule';\n\nimport type { QtiExpression, QtiExpressionBase, QtiRuleBase, ResponseVariable } from '@qti-components/base';\n\n/**\n * Web component that processes `setCorrectResponse` in QTI.\n */\nexport class QtiSetCorrectResponse extends QtiRule {\n /**\n * Processes the QTI rule and dispatches a custom event with the computed correct response value.\n */\n public override process(): void {\n const responseIdentifier = this.getAttribute('identifier');\n\n if (!responseIdentifier) {\n console.warn('QtiSetCorrectResponse: Missing \"identifier\" attribute.');\n return;\n }\n\n const expression = this.firstElementChild as QtiExpression<unknown> | null;\n\n if (!expression) {\n console.warn('QtiSetCorrectResponse: No expression found.');\n return;\n }\n\n const rule = new QtiSetCorrectResponseRule<unknown>(expression);\n const value = rule.process();\n\n this.dispatchEvent(\n new CustomEvent<{ responseIdentifier: string; value: string | string[] | null }>('qti-set-correct-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier,\n value: this.#formatValue(value)\n }\n })\n );\n }\n\n #formatValue(value: unknown): string | string[] | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n return value.map(item => convertNumberToUniversalFormat(this.#unwrapValue(item)));\n }\n\n return convertNumberToUniversalFormat(this.#unwrapValue(value));\n }\n\n #unwrapValue(value: unknown): string {\n if (value && typeof value === 'object' && 'value' in (value as ResponseVariable)) {\n const responseValue = (value as ResponseVariable).value;\n return responseValue !== null && responseValue !== undefined ? responseValue.toString() : '';\n }\n\n return value?.toString() ?? '';\n }\n}\n\n/**\n * Encapsulates the logic for processing QTI setCorrectResponse expressions.\n */\nexport class QtiSetCorrectResponseRule<T> implements QtiRuleBase {\n constructor(private expression: QtiExpressionBase<T>) {}\n\n /**\n * Evaluates the expression and returns its value.\n */\n process(): unknown {\n const value = this.expression.calculate() ?? null;\n\n if (value === null) {\n console.warn('QtiSetCorrectResponseRule: Evaluated value is null.');\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.#unwrapResult(item));\n }\n\n return this.#unwrapResult(value);\n }\n\n #unwrapResult(value: unknown): unknown {\n if (value && typeof value === 'object' && 'value' in (value as ResponseVariable)) {\n return (value as ResponseVariable).value;\n }\n\n return value;\n }\n}\n\ncustomElements.define('qti-set-correct-response', QtiSetCorrectResponse);\n","import { convertNumberToUniversalFormat } from '@qti-components/base';\n\nimport { QtiRule } from '../qti-rule/qti-rule';\n\nimport type { QtiExpression, QtiExpressionBase, QtiRuleBase, ResponseVariable } from '@qti-components/base';\n\n/**\n * Web component that processes `setTemplateValue` in QTI.\n */\nexport class QtiSetTemplateValue extends QtiRule {\n /**\n * Processes the QTI rule and dispatches a custom event with the computed template value.\n */\n public override process(): void {\n const templateIdentifier = this.getAttribute('identifier');\n\n if (!templateIdentifier) {\n console.warn('QtiSetTemplateValue: Missing \"identifier\" attribute.');\n return;\n }\n\n const expression = this.firstElementChild as QtiExpression<unknown> | null;\n\n if (!expression) {\n console.warn('QtiSetTemplateValue: No expression found.');\n return;\n }\n\n const rule = new QtiSetTemplateValueRule<unknown>(expression);\n const value = rule.process();\n\n this.dispatchEvent(\n new CustomEvent<{ templateIdentifier: string; value: string | string[] | null }>('qti-set-template-value', {\n bubbles: true,\n composed: true,\n detail: {\n templateIdentifier,\n value: this.#formatValue(value)\n }\n })\n );\n }\n\n /**\n * Formats the computed value before dispatching.\n * Ensures numbers are converted to a universal format.\n */\n #formatValue(value: unknown): string | string[] | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n return value.map(item => convertNumberToUniversalFormat(this.#unwrapValue(item)));\n }\n\n return convertNumberToUniversalFormat(this.#unwrapValue(value));\n }\n\n #unwrapValue(value: unknown): string {\n if (value && typeof value === 'object' && 'value' in (value as ResponseVariable)) {\n const responseValue = (value as ResponseVariable).value;\n return responseValue !== null && responseValue !== undefined ? responseValue.toString() : '';\n }\n\n return value?.toString() ?? '';\n }\n}\n\n/**\n * Encapsulates the logic for processing QTI setTemplateValue expressions.\n */\nexport class QtiSetTemplateValueRule<T> implements QtiRuleBase {\n constructor(private expression: QtiExpressionBase<T>) {}\n\n /**\n * Evaluates the expression and returns its value.\n */\n process(): unknown {\n const value = this.expression.calculate() ?? null;\n\n if (value === null) {\n console.warn('QtiSetTemplateValueRule: Evaluated value is null.');\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.#unwrapResult(item));\n }\n\n return this.#unwrapResult(value);\n }\n\n #unwrapResult(value: unknown): unknown {\n if (value && typeof value === 'object' && 'value' in (value as ResponseVariable)) {\n return (value as ResponseVariable).value;\n }\n\n return value;\n }\n}\n\ncustomElements.define('qti-set-template-value', QtiSetTemplateValue);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-stats-operator performs statistical calculations on a container.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#statsOperator\n *\n * Takes 1 container (multiple/ordered) of numerical base-type.\n * 'name' attribute identifies function (mean, popSD, popVariance, sampleSD, sampleVariance).\n * Returns result as a single float.\n * Special cases: Returns NULL if any values in container are NULL or non-numerical.\n */\nexport class QtiStatsOperator extends QtiExpression<number | null> {\n @property({ type: String }) name: string = '';\n\n public override getResult(): number | null {\n if (!this.name) {\n console.warn('qti-stats-operator: missing name attribute');\n return null;\n }\n\n const values = this.#collectNumericValues(this.getVariables() as ResponseVariable[]);\n if (values.length === 0) {\n console.warn('qti-stats-operator: no numeric values provided');\n return null;\n }\n\n switch (this.name.toLowerCase()) {\n case 'mean':\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n case 'popsd':\n return this.#populationStandardDeviation(values);\n default:\n console.warn(`qti-stats-operator: unsupported operator \"${this.name}\"`);\n return null;\n }\n }\n\n #populationStandardDeviation(values: number[]): number {\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const variance = values.reduce((sum, value) => sum + Math.pow(value - mean, 2), 0) / values.length;\n return Math.sqrt(variance);\n }\n\n #collectNumericValues(variables: ResponseVariable[]): number[] {\n const values: number[] = [];\n\n for (const variable of variables) {\n if (!variable) {\n continue;\n }\n\n const pushValue = (raw: unknown) => {\n if (raw === null || raw === undefined) {\n return;\n }\n const numValue = parseFloat(raw.toString());\n if (Number.isNaN(numValue)) {\n console.warn('qti-stats-operator: non-numeric value encountered');\n return;\n }\n values.push(numValue);\n };\n\n if (Array.isArray(variable.value)) {\n variable.value.forEach(item => pushValue(item));\n continue;\n }\n\n pushValue(variable.value);\n }\n\n return values;\n }\n}\n\ncustomElements.define('qti-stats-operator', QtiStatsOperator);\n","import { QtiExpression } from '@qti-components/base';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n/**\n * @summary The qti-subtract operator performs numerical subtraction.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#subtract\n *\n * Takes exactly 2 sub-expressions with numerical base-types and single cardinality.\n * Returns (first - second) as a float, or integer if both inputs are integers.\n * Special cases: Returns NULL if either sub-expression is NULL.\n */\nexport class QtiSubtract extends qtiSubtractMixin(QtiExpression<any> as unknown as Constructor<QtiExpression<number>>) {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const value = this.calculateChildren(Array.from(this.children as unknown as QtiExpression<any>[]));\n return value;\n }\n}\n\ntype MockQtiExpression<T> = { calculate: () => T };\ntype MockConstructor = new (...args: any[]) => {};\n\nexport function qtiSubtractMixin<TBase extends MockConstructor>(Base: TBase) {\n return class MockQtiSubtract extends Base {\n public calculateChildren(children: Array<MockQtiExpression<any>>) {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = children.map(expression => {\n if (!expression.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = expression.calculate();\n if (Number.isNaN(value)) {\n console.error('Unexpected value in qti-subtract, expected number');\n return null;\n }\n return Number(value);\n });\n if (values.some(value => value === null)) {\n console.error('One or more child expressions returned invalid values');\n return 0;\n }\n // Subtract the two values\n return values[0] - values[1];\n }\n };\n}\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-substring operator checks if one string is contained within another.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#substring\n *\n * Takes 2 sub-expressions with base-type string and single cardinality.\n * Returns true if the first string is a substring of the second.\n * Special cases: Returns NULL if either argument is NULL.\n */\nexport class QtiSubstring extends QtiExpression<boolean | null> {\n @property({ type: String, attribute: 'case-sensitive' }) caseSensitive = 'true';\n\n public override getResult(): boolean | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 2) {\n console.error('qti-substring requires exactly 2 child expressions');\n return null;\n }\n\n const [needle, haystack] = variables;\n if (\n needle.cardinality !== 'single' ||\n haystack.cardinality !== 'single' ||\n Array.isArray(needle.value) ||\n Array.isArray(haystack.value)\n ) {\n console.error('qti-substring requires single cardinality');\n return null;\n }\n if (needle.value === null || haystack.value === null || needle.value === undefined || haystack.value === undefined) {\n return null;\n }\n\n const left = needle.value.toString();\n const right = haystack.value.toString();\n if (this.caseSensitive !== 'true') {\n return right.toLowerCase().includes(left.toLowerCase());\n }\n\n return right.includes(left);\n }\n}\n\ncustomElements.define('qti-substring', QtiSubstring);\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '@qti-components/base';\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\nexport class QtiStringMatch extends QtiExpression<boolean> {\n @property({ type: String, attribute: 'case-sensitive' }) caseSensitive = 'true';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti string-match');\n return false;\n }\n const v1 = this.caseSensitive === 'true' ? value1.value : (value1.value as string).toLowerCase();\n const v2 = this.caseSensitive === 'true' ? value2.value : (value2.value as string).toLowerCase();\n return ScoringHelper.compareSingleValues(v1 as string, v2 as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-string-match');\n return null;\n }\n}\n\ncustomElements.define('qti-string-match', QtiStringMatch);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { QtiExpressionBase } from '@qti-components/base';\n\n/**\n * @summary The qti-sum operator calculates the total of multiple numerical values.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#sum\n *\n * Takes 1 or more sub-expressions with numerical base-types and any cardinality.\n * Returns a single float (or integer if all arguments are integers) representing the total.\n * Special cases: Returns NULL if any sub-expression is NULL.\n */\nexport class QtiSum extends QtiExpression<number> {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const expression = new QtiSumExpression(Array.from(this.children as unknown as QtiExpressionBase<number>[]));\n const value = expression.calculate();\n return value;\n }\n}\n\nexport class QtiSumExpression implements QtiExpressionBase<number> {\n constructor(private expressions: QtiExpressionBase<number>[]) {}\n\n public calculate() {\n const expressions = this.expressions.filter(c => c.calculate !== undefined);\n // check if one expresssion returns null\n if (expressions.some(c => c.calculate() === null)) {\n return null;\n }\n\n const values = this.expressions.map(c => {\n const value = c.calculate();\n if (Number.isNaN(value)) {\n console.error('unexpected value in qti-sum, expected number');\n return null;\n }\n\n return Number(value);\n });\n return values.reduce((a, b) => a + b, 0);\n }\n}\n\ncustomElements.define('qti-sum', QtiSum);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-truncate operator removes fractional parts of a number.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#truncate\n *\n * Takes 1 numerical sub-expression of single cardinality.\n * Returns integer formed by truncating value toward zero.\n * Special cases: Returns NULL if input is NULL or NaN.\n */\nexport class QtiTruncate extends QtiExpression<number | null> {\n public override getResult(): number | null {\n const variables = this.getVariables() as ResponseVariable[];\n\n if (variables.length !== 1) {\n console.error('qti-truncate requires exactly one child expression');\n return null;\n }\n\n const variable = variables[0];\n if (variable.cardinality !== 'single' || Array.isArray(variable.value)) {\n console.error('qti-truncate requires single cardinality');\n return null;\n }\n if (variable.baseType !== 'integer' && variable.baseType !== 'float') {\n console.error('qti-truncate requires numerical base-type');\n return null;\n }\n if (variable.value === null || variable.value === undefined) {\n return null;\n }\n\n const value = Number.parseFloat(variable.value as string);\n if (Number.isNaN(value)) {\n console.error('qti-truncate requires a numerical value');\n return null;\n }\n\n return Math.trunc(value);\n }\n}\n\ncustomElements.define('qti-truncate', QtiTruncate);\n","import { QtiExpression } from '@qti-components/base';\n\nexport class QtiVariable extends QtiExpression<string | string[]> {\n public override getResult() {\n const identifier = this.getAttribute('identifier');\n const result = this.context.variables.find(v => v.identifier === identifier).value;\n return result;\n }\n}\n\ncustomElements.define('qti-variable', QtiVariable);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\n/**\n * @summary The qti-random-integer operator selects a random integer from a specified range.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.random-integer\n *\n * Selects a random integer from the range [min,max] satisfying min + step * n for some integer n.\n * For example, with min=2, max=11 and step=3 the values {2,5,8,11} are possible.\n */\nexport class QtiRandomInteger extends QtiExpression<number> {\n @property({ type: Number }) min: number = 0;\n @property({ type: Number }) max: number = 10;\n @property({ type: Number }) step: number = 1;\n\n public override getResult(): number {\n // Validate attributes\n if (this.min > this.max) {\n console.error('qti-random-integer: min cannot be greater than max');\n return this.min;\n }\n\n if (this.step <= 0) {\n console.error('qti-random-integer: step must be positive');\n return this.min;\n }\n\n // Calculate all possible values in the range\n const possibleValues: number[] = [];\n\n // Generate values using the formula: min + step * n for integer n\n let n = 0;\n while (true) {\n const value = this.min + this.step * n;\n if (value > this.max) {\n break;\n }\n // Only add integer values\n if (Number.isInteger(value)) {\n possibleValues.push(value);\n }\n n++;\n }\n\n // If no valid integer values found, return min (if it's an integer) or floor(min)\n if (possibleValues.length === 0) {\n console.warn('qti-random-integer: no valid integer values in range');\n return Number.isInteger(this.min) ? this.min : Math.floor(this.min);\n }\n\n // Select a random value from the possible values\n const randomIndex = Math.floor(Math.random() * possibleValues.length);\n return possibleValues[randomIndex];\n }\n\n /**\n * Get all possible values for testing purposes\n */\n public getPossibleValues(): number[] {\n const possibleValues: number[] = [];\n\n if (this.min > this.max || this.step <= 0) {\n return [Number.isInteger(this.min) ? this.min : Math.floor(this.min)];\n }\n\n let n = 0;\n while (true) {\n const value = this.min + this.step * n;\n if (value > this.max) {\n break;\n }\n // Only add integer values\n if (Number.isInteger(value)) {\n possibleValues.push(value);\n }\n n++;\n }\n\n return possibleValues.length > 0 ? possibleValues : [Number.isInteger(this.min) ? this.min : Math.floor(this.min)];\n }\n}\n\ncustomElements.define('qti-random-integer', QtiRandomInteger);\n","import { QtiExpression } from '@qti-components/base';\n\nexport class QtiRandom extends QtiExpression<string> {\n public override getResult() {\n const values = this.getVariables();\n // console.log(values);\n\n if (values.length === 1) {\n const value = values[0].value;\n if (Array.isArray(value)) {\n const randomIndex = Math.floor(Math.random() * value.length);\n return value[randomIndex];\n }\n return value;\n }\n console.error('unexpected number of children in match');\n return null;\n }\n}\n\ncustomElements.define('qti-random', QtiRandom);\n","import { QtiExpression } from '@qti-components/base';\n\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-delete operator removes all instances of a value from a container.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#delete\n *\n * Takes a single value (1st) and a container (2nd) of the same base-type.\n * Returns a new container derived from the 2nd with all instances of 1st removed.\n * Special cases: Returns NULL if either argument is NULL.\n */\nexport class QtiDelete extends QtiExpression<string[] | null> {\n override getResult(): string[] | null {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n\n if (value1.cardinality !== 'single' || !Array.isArray(value2.value)) {\n console.error('unexpected cardinality in qti equal');\n return null;\n }\n\n if (values[0].baseType !== values[1].baseType) {\n console.error('The baseType of the two variables is different');\n return null;\n }\n\n const filtered = value2.value.filter(v => !value1.value.includes(v));\n\n return filtered;\n }\n\n return null;\n }\n}\n\ncustomElements.define('qti-delete', QtiDelete);\n","import { customElement, property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '@qti-components/base';\n\nimport type { integer } from '@qti-components/base';\nimport type { ResponseVariable } from '@qti-components/base';\n\n/**\n * @summary The qti-index operator retrieves a specific item from an ordered container.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/info/index.html#index\n *\n * Takes 1 ordered container sub-expression; 'n' attribute specifies 1-based index.\n * Returns the nth value from the container with original base-type and single cardinality.\n * Special cases: Returns NULL if container is NULL or n exceeds container size.\n */\n@customElement('qti-index')\nexport class QtiIndex extends QtiExpression<any> {\n @property({ type: String })\n n!: string; // Required attribute, can be a number or an identifier\n\n public override getResult(): any {\n if (!this.n) {\n console.error('qti-index: missing required attribute \"n\"');\n return null;\n }\n\n // Check if there is exactly one child\n if (this.children.length !== 1) {\n console.error('qti-index: must have exactly one child container element');\n return null;\n }\n\n // Get the container from the child\n const containerVariable = this.getVariables()[0] as ResponseVariable;\n if (!containerVariable) {\n console.error('qti-index: missing container');\n return null;\n }\n\n // Determine the index value - either from n as a direct number or by looking up identifier\n let index: number;\n\n if (!isNaN(Number(this.n))) {\n // n is a direct number\n index = Number(this.n);\n } else {\n // n is an identifier - need to look up its value at runtime\n // This would require access to the QTI runtime context to resolve variables\n const variableValue = this.#lookupVariableValue(this.n);\n if (variableValue === null) {\n console.error(`qti-index: variable \"${this.n}\" is not a valid number`);\n return null;\n }\n index = Number(variableValue);\n }\n\n // Check if index is a positive integer\n if (index <= 0 || !Number.isInteger(index)) {\n console.error('qti-index: index must be a positive integer');\n return null;\n }\n\n // Check if container has ordered values\n if (containerVariable.cardinality === 'ordered') {\n const containerValues = Array.isArray(containerVariable.value)\n ? containerVariable.value\n : [containerVariable.value];\n\n // Index out of bounds or container is NULL\n if (containerVariable.value === null || index > containerValues.length) {\n return null;\n }\n\n // Return the nth value (index is 1-based)\n return containerValues[index - 1];\n } else {\n console.error('qti-index: child must have ordered cardinality');\n return null;\n }\n }\n\n // Helper method to look up a variable value by identifier\n // This would need to be implemented based on your actual QTI runtime environment\n #lookupVariableValue(identifier: string): integer | null {\n const value = this.context.variables.find(v => v.identifier === identifier)?.value;\n // check if value is a number\n if (value === null || isNaN(Number(value))) {\n return null;\n }\n return Number(value) as integer;\n }\n}\n","import { QtiSubtract } from './qti-subtract';\ncustomElements.define('qti-subtract', QtiSubtract);\n\nexport * from './qti-subtract';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-subtract': QtiSubtract;\n }\n}\n"],"mappings":"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","names":["i","i","i","c","itemContext","variable","i","r","r","i","c","i","c","n"]}
|