@intellectif/lk-core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +70 -0
  2. package/dist/activity-zdcAMtFB.d.cts +626 -0
  3. package/dist/activity-zdcAMtFB.d.ts +626 -0
  4. package/dist/chunk-3YAVDV5F.js +47 -0
  5. package/dist/chunk-3YAVDV5F.js.map +1 -0
  6. package/dist/chunk-55O4M45K.js +57 -0
  7. package/dist/chunk-55O4M45K.js.map +1 -0
  8. package/dist/chunk-5GJJHGY5.js +576 -0
  9. package/dist/chunk-5GJJHGY5.js.map +1 -0
  10. package/dist/{chunk-ZHOX6TO4.js → chunk-HS7BYCGE.js} +65 -7
  11. package/dist/chunk-HS7BYCGE.js.map +1 -0
  12. package/dist/chunk-PIMX4B4D.cjs +47 -0
  13. package/dist/chunk-PIMX4B4D.cjs.map +1 -0
  14. package/dist/chunk-QOAORTA4.cjs +576 -0
  15. package/dist/chunk-QOAORTA4.cjs.map +1 -0
  16. package/dist/chunk-QSVBYTNM.js +94 -0
  17. package/dist/chunk-QSVBYTNM.js.map +1 -0
  18. package/dist/{chunk-PJFDAP54.cjs → chunk-RUGIOQZY.cjs} +66 -8
  19. package/dist/chunk-RUGIOQZY.cjs.map +1 -0
  20. package/dist/chunk-THSZMZND.cjs +94 -0
  21. package/dist/chunk-THSZMZND.cjs.map +1 -0
  22. package/dist/chunk-YNTYWHZI.cjs +57 -0
  23. package/dist/chunk-YNTYWHZI.cjs.map +1 -0
  24. package/dist/index.cjs +185 -6
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +253 -7
  27. package/dist/index.d.ts +253 -7
  28. package/dist/index.js +188 -9
  29. package/dist/index.js.map +1 -1
  30. package/dist/schemas.cjs +29 -2
  31. package/dist/schemas.cjs.map +1 -1
  32. package/dist/schemas.d.cts +312 -31
  33. package/dist/schemas.d.ts +312 -31
  34. package/dist/schemas.js +32 -5
  35. package/dist/scoring.cjs +13 -3
  36. package/dist/scoring.cjs.map +1 -1
  37. package/dist/scoring.d.cts +29 -5
  38. package/dist/scoring.d.ts +29 -5
  39. package/dist/scoring.js +12 -2
  40. package/dist/xapi.cjs +3 -3
  41. package/dist/xapi.cjs.map +1 -1
  42. package/dist/xapi.d.cts +40 -2
  43. package/dist/xapi.d.ts +40 -2
  44. package/dist/xapi.js +2 -2
  45. package/package.json +12 -2
  46. package/dist/activity-D5tqgx8A.d.cts +0 -330
  47. package/dist/activity-D5tqgx8A.d.ts +0 -330
  48. package/dist/chunk-2T3IL7VL.js +0 -147
  49. package/dist/chunk-2T3IL7VL.js.map +0 -1
  50. package/dist/chunk-3JMLUUFS.cjs +0 -124
  51. package/dist/chunk-3JMLUUFS.cjs.map +0 -1
  52. package/dist/chunk-6VOCV4EX.js +0 -25
  53. package/dist/chunk-6VOCV4EX.js.map +0 -1
  54. package/dist/chunk-DCDOTQNH.cjs +0 -147
  55. package/dist/chunk-DCDOTQNH.cjs.map +0 -1
  56. package/dist/chunk-DV466SBJ.cjs +0 -25
  57. package/dist/chunk-DV466SBJ.cjs.map +0 -1
  58. package/dist/chunk-GZ73G2TS.js +0 -124
  59. package/dist/chunk-GZ73G2TS.js.map +0 -1
  60. package/dist/chunk-PJFDAP54.cjs.map +0 -1
  61. package/dist/chunk-ZHOX6TO4.js.map +0 -1
@@ -1,147 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/schemas/fill-in-the-blanks.ts
2
- var _v4 = require('zod/v4');
3
-
4
- // src/schemas/feedback.ts
5
-
6
- var FeedbackSchema = _v4.z.object({
7
- correct: _v4.z.string().min(1).optional(),
8
- incorrect: _v4.z.string().min(1).optional()
9
- });
10
-
11
- // src/schemas/media.ts
12
-
13
- var MediaSchema = _v4.z.object({
14
- type: _v4.z.enum(["image", "audio", "video", "embed"]),
15
- url: _v4.z.url(),
16
- alt: _v4.z.string().min(1).optional(),
17
- captionsUrl: _v4.z.url().optional()
18
- }).refine(
19
- (m) => m.type !== "image" && m.type !== "embed" || typeof m.alt === "string" && m.alt.length > 0,
20
- {
21
- error: "image and embed media require non-empty alt text (WCAG 1.1.1 / 4.1.2).",
22
- path: ["alt"]
23
- }
24
- );
25
-
26
- // src/schemas/fill-in-the-blanks.ts
27
- var PLACEHOLDER_RE = /\{\{\s*([^{}]+?)\s*\}\}/g;
28
- var BlankConfigSchema = _v4.z.object({
29
- id: _v4.z.string().min(1),
30
- acceptedAnswers: _v4.z.array(_v4.z.string().min(1)).min(1),
31
- caseSensitive: _v4.z.boolean().optional(),
32
- trimWhitespace: _v4.z.boolean().optional(),
33
- hint: _v4.z.string().optional(),
34
- feedback: _v4.z.string().optional()
35
- });
36
- var FillInTheBlanksDataSchema = _v4.z.object({
37
- schemaVersion: _v4.z.literal("1.0"),
38
- type: _v4.z.literal("fill-in-the-blanks"),
39
- id: _v4.z.string().min(1),
40
- title: _v4.z.string().min(1),
41
- passage: _v4.z.string().min(1),
42
- blanks: _v4.z.array(BlankConfigSchema).min(1),
43
- scoringStrategy: _v4.z.enum(["all-or-nothing", "partial"]),
44
- media: MediaSchema.optional(),
45
- feedback: FeedbackSchema.optional(),
46
- passThreshold: _v4.z.number().min(0).max(1).optional(),
47
- locale: _v4.z.string().optional(),
48
- learningObjectives: _v4.z.array(_v4.z.string()).optional(),
49
- difficultyLevel: _v4.z.literal([1, 2, 3, 4, 5]).optional()
50
- }).refine(
51
- (data) => {
52
- const placeholderIds = new Set(
53
- [...data.passage.matchAll(PLACEHOLDER_RE)].map((match) => match[1])
54
- );
55
- const blankIds = new Set(data.blanks.map((blank) => blank.id));
56
- if (placeholderIds.size !== blankIds.size) {
57
- return false;
58
- }
59
- for (const id of blankIds) {
60
- if (!placeholderIds.has(id)) {
61
- return false;
62
- }
63
- }
64
- return true;
65
- },
66
- {
67
- error: "Each blank id must have exactly one matching {{id}} placeholder in the passage, and vice versa.",
68
- path: ["passage"]
69
- }
70
- );
71
-
72
- // src/schemas/multiple-choice.ts
73
-
74
- var MultipleChoiceOptionSchema = _v4.z.object({
75
- id: _v4.z.string().min(1),
76
- text: _v4.z.string().min(1),
77
- isCorrect: _v4.z.boolean(),
78
- feedback: _v4.z.string().optional()
79
- });
80
- var MultipleChoiceDataSchema = _v4.z.object({
81
- schemaVersion: _v4.z.literal("1.0"),
82
- type: _v4.z.literal("multiple-choice"),
83
- id: _v4.z.string().min(1),
84
- title: _v4.z.string().min(1),
85
- question: _v4.z.string().min(1),
86
- mode: _v4.z.enum(["single", "multi"]),
87
- options: _v4.z.array(MultipleChoiceOptionSchema).min(2).max(10),
88
- scoringStrategy: _v4.z.enum(["all-or-nothing", "partial"]),
89
- media: MediaSchema.optional(),
90
- feedback: FeedbackSchema.optional(),
91
- passThreshold: _v4.z.number().min(0).max(1).optional(),
92
- shuffle: _v4.z.boolean().optional(),
93
- locale: _v4.z.string().optional(),
94
- learningObjectives: _v4.z.array(_v4.z.string()).optional(),
95
- difficultyLevel: _v4.z.literal([1, 2, 3, 4, 5]).optional()
96
- }).refine((data) => data.options.some((option) => option.isCorrect), {
97
- error: "At least one option must be marked correct.",
98
- path: ["options"]
99
- }).refine(
100
- (data) => data.mode !== "single" || data.options.filter((option) => option.isCorrect).length === 1,
101
- {
102
- error: 'Single-select activities (mode: "single") must have exactly one correct option.',
103
- path: ["options"]
104
- }
105
- );
106
-
107
- // src/schemas/json-schema.ts
108
-
109
- var multipleChoiceJsonSchema = _v4.z.toJSONSchema(MultipleChoiceDataSchema, {
110
- target: "draft-7"
111
- });
112
- var fillInTheBlanksJsonSchema = _v4.z.toJSONSchema(FillInTheBlanksDataSchema, {
113
- target: "draft-7"
114
- });
115
-
116
- // src/schemas/index.ts
117
- var schemaMap = {
118
- "multiple-choice": MultipleChoiceDataSchema,
119
- "fill-in-the-blanks": FillInTheBlanksDataSchema
120
- };
121
- function validateActivity(type, data) {
122
- const result = schemaMap[type].safeParse(data);
123
- if (result.success) {
124
- return { success: true, data: result.data };
125
- }
126
- return {
127
- success: false,
128
- errors: result.error.issues.map((issue) => ({
129
- path: issue.path.map(String),
130
- message: issue.message,
131
- code: issue.code
132
- }))
133
- };
134
- }
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
- exports.FeedbackSchema = FeedbackSchema; exports.MediaSchema = MediaSchema; exports.BlankConfigSchema = BlankConfigSchema; exports.FillInTheBlanksDataSchema = FillInTheBlanksDataSchema; exports.MultipleChoiceOptionSchema = MultipleChoiceOptionSchema; exports.MultipleChoiceDataSchema = MultipleChoiceDataSchema; exports.multipleChoiceJsonSchema = multipleChoiceJsonSchema; exports.fillInTheBlanksJsonSchema = fillInTheBlanksJsonSchema; exports.validateActivity = validateActivity;
147
- //# sourceMappingURL=chunk-DCDOTQNH.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["c:\\Users\\onecu\\Documents\\Intellectif\\IT-for-Intellectif\\learning-kit\\packages\\lk-core\\dist\\chunk-DCDOTQNH.cjs"],"names":[],"mappings":"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","file":"C:\\Users\\onecu\\Documents\\Intellectif\\IT-for-Intellectif\\learning-kit\\packages\\lk-core\\dist\\chunk-DCDOTQNH.cjs","sourcesContent":[null]}
@@ -1,25 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/errors.ts
2
- var ActivitySchemaError = class extends Error {
3
- constructor(activityType, errors) {
4
- super(`Invalid activity data for type "${activityType}"`);
5
- this.activityType = activityType;
6
- this.errors = errors;
7
- this.name = "ActivitySchemaError";
8
- }
9
-
10
-
11
- };
12
- var UnknownActivityTypeError = class extends Error {
13
- constructor(activityType) {
14
- super(`Activity type "${activityType}" is not registered`);
15
- this.activityType = activityType;
16
- this.name = "UnknownActivityTypeError";
17
- }
18
-
19
- };
20
-
21
-
22
-
23
-
24
- exports.ActivitySchemaError = ActivitySchemaError; exports.UnknownActivityTypeError = UnknownActivityTypeError;
25
- //# sourceMappingURL=chunk-DV466SBJ.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["c:\\Users\\onecu\\Documents\\Intellectif\\IT-for-Intellectif\\learning-kit\\packages\\lk-core\\dist\\chunk-DV466SBJ.cjs"],"names":[],"mappings":"AAAA;AACA,IAAI,oBAAoB,EAAE,MAAM,QAAQ,MAAM;AAC9C,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE;AACpC,IAAI,KAAK,CAAC,CAAC,gCAAgC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAC7D,IAAI,IAAI,CAAC,aAAa,EAAE,YAAY;AACpC,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM;AACxB,IAAI,IAAI,CAAC,KAAK,EAAE,qBAAqB;AACrC,EAAE;AACF,EAAE;AACF,EAAE;AACF,CAAC;AACD,IAAI,yBAAyB,EAAE,MAAM,QAAQ,MAAM;AACnD,EAAE,WAAW,CAAC,YAAY,EAAE;AAC5B,IAAI,KAAK,CAAC,CAAC,eAAe,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAC9D,IAAI,IAAI,CAAC,aAAa,EAAE,YAAY;AACpC,IAAI,IAAI,CAAC,KAAK,EAAE,0BAA0B;AAC1C,EAAE;AACF,EAAE;AACF,CAAC;AACD;AACA;AACE;AACA;AACF,+GAAC","file":"C:\\Users\\onecu\\Documents\\Intellectif\\IT-for-Intellectif\\learning-kit\\packages\\lk-core\\dist\\chunk-DV466SBJ.cjs","sourcesContent":[null]}
@@ -1,124 +0,0 @@
1
- import {
2
- UnknownActivityTypeError
3
- } from "./chunk-6VOCV4EX.js";
4
-
5
- // src/scoring/strategies/all-or-nothing.ts
6
- function allOrNothingStrategy(correctItems) {
7
- return correctItems.every((isCorrect) => isCorrect) ? 1 : 0;
8
- }
9
-
10
- // src/scoring/strategies/partial.ts
11
- function partialStrategy(correctSelected, incorrectSelected, totalCorrect, totalIncorrect) {
12
- const reward = correctSelected / totalCorrect;
13
- const penalty = totalIncorrect === 0 ? 0 : incorrectSelected / totalIncorrect;
14
- return Math.max(0, reward - penalty);
15
- }
16
- function partialBlankStrategy(correctBlanks, totalBlanks) {
17
- return correctBlanks / totalBlanks;
18
- }
19
-
20
- // src/scoring/activity-scorers/fill-in-the-blanks.ts
21
- function normalize(value, blank) {
22
- let result = value;
23
- if (blank.trimWhitespace !== false) {
24
- result = result.trim();
25
- }
26
- if (blank.caseSensitive !== true) {
27
- result = result.toLowerCase();
28
- }
29
- return result;
30
- }
31
- function scoreFillInTheBlanks(data, response) {
32
- const details = [];
33
- const perBlankCorrect = [];
34
- for (const blank of data.blanks) {
35
- const rawInput = response.answers[blank.id];
36
- const input = typeof rawInput === "string" ? rawInput : "";
37
- const normalizedInput = normalize(input, blank);
38
- const matched = blank.acceptedAnswers.some(
39
- (accepted) => normalize(accepted, blank) === normalizedInput
40
- );
41
- perBlankCorrect.push(matched);
42
- details.push({
43
- itemId: blank.id,
44
- correct: matched,
45
- learnerResponse: [input],
46
- correctResponse: [...blank.acceptedAnswers]
47
- });
48
- }
49
- const correctBlanks = perBlankCorrect.filter(Boolean).length;
50
- const scoreValue = data.scoringStrategy === "all-or-nothing" ? allOrNothingStrategy(perBlankCorrect) : partialBlankStrategy(correctBlanks, data.blanks.length);
51
- return { score: scoreValue, maxScore: 1, feedback: null, details };
52
- }
53
-
54
- // src/scoring/activity-scorers/multiple-choice.ts
55
- function scoreMultipleChoice(data, response) {
56
- const optionById = new Map(data.options.map((option) => [option.id, option]));
57
- const selected = new Set(response.selectedOptionIds);
58
- const totalCorrect = data.options.filter((option) => option.isCorrect).length;
59
- const totalIncorrect = data.options.length - totalCorrect;
60
- let scoreValue;
61
- if (data.scoringStrategy === "all-or-nothing") {
62
- if (data.mode === "single") {
63
- scoreValue = response.selectedOptionIds.length === 1 && optionById.get(response.selectedOptionIds[0])?.isCorrect === true ? 1 : 0;
64
- } else {
65
- const correctIds = data.options.filter((o) => o.isCorrect).map((o) => o.id);
66
- const allCorrectSelected = correctIds.every((id) => selected.has(id));
67
- scoreValue = selected.size === correctIds.length && allCorrectSelected ? 1 : 0;
68
- }
69
- } else {
70
- let correctSelected = 0;
71
- let incorrectSelected = 0;
72
- for (const id of selected) {
73
- const option = optionById.get(id);
74
- if (option?.isCorrect) {
75
- correctSelected += 1;
76
- } else {
77
- incorrectSelected += 1;
78
- }
79
- }
80
- scoreValue = partialStrategy(correctSelected, incorrectSelected, totalCorrect, totalIncorrect);
81
- }
82
- const details = data.options.map((option) => {
83
- const wasSelected = selected.has(option.id);
84
- return {
85
- itemId: option.id,
86
- correct: wasSelected === option.isCorrect,
87
- learnerResponse: [wasSelected ? "selected" : "not-selected"],
88
- correctResponse: [option.isCorrect ? "selected" : "not-selected"]
89
- };
90
- });
91
- return { score: scoreValue, maxScore: 1, feedback: null, details };
92
- }
93
-
94
- // src/scoring/index.ts
95
- var DEFAULT_PASS_THRESHOLD = 0.7;
96
- function computePassThreshold(activityData, score2) {
97
- return score2 >= (activityData.passThreshold ?? DEFAULT_PASS_THRESHOLD);
98
- }
99
- function score(activityType, activityData, learnerResponse) {
100
- let result;
101
- switch (activityType) {
102
- case "multiple-choice":
103
- result = scoreMultipleChoice(
104
- activityData,
105
- learnerResponse
106
- );
107
- break;
108
- case "fill-in-the-blanks":
109
- result = scoreFillInTheBlanks(
110
- activityData,
111
- learnerResponse
112
- );
113
- break;
114
- default:
115
- throw new UnknownActivityTypeError(String(activityType));
116
- }
117
- return { ...result, passed: computePassThreshold(activityData, result.score) };
118
- }
119
-
120
- export {
121
- computePassThreshold,
122
- score
123
- };
124
- //# sourceMappingURL=chunk-GZ73G2TS.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/scoring/strategies/all-or-nothing.ts","../src/scoring/strategies/partial.ts","../src/scoring/activity-scorers/fill-in-the-blanks.ts","../src/scoring/activity-scorers/multiple-choice.ts","../src/scoring/index.ts"],"sourcesContent":["/**\n * All-or-nothing scoring: full credit only when every item is correct.\n *\n * @param correctItems - per-item correctness flags for the relevant items\n * @returns `1` if every item is correct (or the list is empty), otherwise `0`\n */\nexport function allOrNothingStrategy(correctItems: boolean[]): number {\n return correctItems.every((isCorrect) => isCorrect) ? 1 : 0;\n}\n","/**\n * Partial-credit scoring for Multiple Choice — balanced/symmetric scheme.\n *\n * Reward and penalty are each normalised by their own pool: the fraction of\n * correct options found, minus the fraction of distractors wrongly chosen.\n * This is fairer than normalising the penalty by the correct-option count —\n * under that older form a single wrong pick could zero an otherwise-correct\n * response when there was only one correct answer.\n *\n * Result is always in [0, 1]: `reward ∈ [0,1]` and `penalty ∈ [0,1]`, so\n * `reward - penalty ∈ [-1,1]` and `max(0, …)` floors it at 0. Selecting every\n * option yields `1 - 1 = 0`; selecting exactly the correct set yields `1`.\n *\n * @param correctSelected - number of selected options that are correct\n * @param incorrectSelected - number of selected options that are incorrect\n * @param totalCorrect - total correct options; the `MultipleChoiceDataSchema`\n * \"≥1 correct\" guard guarantees this is ≥ 1, so the reward term cannot\n * divide by zero for schema-validated data\n * @param totalIncorrect - total incorrect options (distractors); when `0`\n * (every option is correct) the penalty term is defined as `0`\n */\nexport function partialStrategy(\n correctSelected: number,\n incorrectSelected: number,\n totalCorrect: number,\n totalIncorrect: number,\n): number {\n const reward = correctSelected / totalCorrect;\n const penalty = totalIncorrect === 0 ? 0 : incorrectSelected / totalIncorrect;\n return Math.max(0, reward - penalty);\n}\n\n/**\n * Partial-credit scoring for Fill-in-the-Blanks: fraction of blanks answered\n * correctly. Each blank is independently right or wrong, so a plain proportion\n * is already fair — no penalty term applies.\n *\n * @param correctBlanks - number of blanks answered correctly\n * @param totalBlanks - total number of blanks; the `FillInTheBlanksDataSchema`\n * `blanks.min(1)` constraint guarantees this is ≥ 1, so division by zero\n * cannot occur for schema-validated data\n */\nexport function partialBlankStrategy(correctBlanks: number, totalBlanks: number): number {\n return correctBlanks / totalBlanks;\n}\n","import type {\n BlankConfig,\n FillInTheBlanksData,\n FillInTheBlanksLearnerResponse,\n ScoringDetail,\n} from '../../types/activity.js';\nimport { allOrNothingStrategy } from '../strategies/all-or-nothing.js';\nimport { partialBlankStrategy } from '../strategies/partial.js';\nimport type { PartialScoringResult } from './multiple-choice.js';\n\n/**\n * Normalises a value for comparison per the blank's rules.\n * Defaults: `trimWhitespace` true, `caseSensitive` false (case-insensitive\n * unless the author explicitly opts in).\n */\nfunction normalize(value: string, blank: BlankConfig): string {\n let result = value;\n if (blank.trimWhitespace !== false) {\n result = result.trim();\n }\n if (blank.caseSensitive !== true) {\n result = result.toLowerCase();\n }\n return result;\n}\n\n/**\n * Scores a Fill-in-the-Blanks response. Each blank is evaluated independently;\n * a missing answer key is treated as empty input and scored incorrect.\n */\nexport function scoreFillInTheBlanks(\n data: FillInTheBlanksData,\n response: FillInTheBlanksLearnerResponse,\n): PartialScoringResult {\n const details: ScoringDetail[] = [];\n const perBlankCorrect: boolean[] = [];\n\n for (const blank of data.blanks) {\n const rawInput = response.answers[blank.id];\n const input = typeof rawInput === 'string' ? rawInput : '';\n const normalizedInput = normalize(input, blank);\n const matched = blank.acceptedAnswers.some(\n (accepted) => normalize(accepted, blank) === normalizedInput,\n );\n\n perBlankCorrect.push(matched);\n details.push({\n itemId: blank.id,\n correct: matched,\n learnerResponse: [input],\n correctResponse: [...blank.acceptedAnswers],\n });\n }\n\n const correctBlanks = perBlankCorrect.filter(Boolean).length;\n const scoreValue =\n data.scoringStrategy === 'all-or-nothing'\n ? allOrNothingStrategy(perBlankCorrect)\n : partialBlankStrategy(correctBlanks, data.blanks.length);\n\n return { score: scoreValue, maxScore: 1, feedback: null, details };\n}\n","import type {\n MultipleChoiceData,\n MultipleChoiceLearnerResponse,\n ScoringDetail,\n ScoringResult,\n} from '../../types/activity.js';\nimport { partialStrategy } from '../strategies/partial.js';\n\n/** ScoringResult without `passed` — the public `score()` fills that in. */\nexport type PartialScoringResult = Omit<ScoringResult, 'passed'>;\n\n/**\n * Scores a Multiple Choice response. Pure; trusts its typed inputs (validation\n * is the component boundary's job). Options are looked up by id; an unknown\n * selected id is treated as an incorrect selection.\n */\nexport function scoreMultipleChoice(\n data: MultipleChoiceData,\n response: MultipleChoiceLearnerResponse,\n): PartialScoringResult {\n const optionById = new Map(data.options.map((option) => [option.id, option]));\n const selected = new Set(response.selectedOptionIds);\n\n const totalCorrect = data.options.filter((option) => option.isCorrect).length;\n const totalIncorrect = data.options.length - totalCorrect;\n\n let scoreValue: number;\n\n if (data.scoringStrategy === 'all-or-nothing') {\n if (data.mode === 'single') {\n scoreValue =\n response.selectedOptionIds.length === 1 &&\n optionById.get(response.selectedOptionIds[0])?.isCorrect === true\n ? 1\n : 0;\n } else {\n const correctIds = data.options.filter((o) => o.isCorrect).map((o) => o.id);\n const allCorrectSelected = correctIds.every((id) => selected.has(id));\n scoreValue = selected.size === correctIds.length && allCorrectSelected ? 1 : 0;\n }\n } else {\n let correctSelected = 0;\n let incorrectSelected = 0;\n for (const id of selected) {\n const option = optionById.get(id);\n if (option?.isCorrect) {\n correctSelected += 1;\n } else {\n incorrectSelected += 1;\n }\n }\n scoreValue = partialStrategy(correctSelected, incorrectSelected, totalCorrect, totalIncorrect);\n }\n\n const details: ScoringDetail[] = data.options.map((option) => {\n const wasSelected = selected.has(option.id);\n return {\n itemId: option.id,\n correct: wasSelected === option.isCorrect,\n learnerResponse: [wasSelected ? 'selected' : 'not-selected'],\n correctResponse: [option.isCorrect ? 'selected' : 'not-selected'],\n };\n });\n\n return { score: scoreValue, maxScore: 1, feedback: null, details };\n}\n","import { UnknownActivityTypeError } from '../errors.js';\nimport type {\n ActivityData,\n ActivityType,\n FillInTheBlanksData,\n FillInTheBlanksLearnerResponse,\n LearnerResponse,\n MultipleChoiceData,\n MultipleChoiceLearnerResponse,\n ScoringResult,\n} from '../types/activity.js';\nimport { scoreFillInTheBlanks } from './activity-scorers/fill-in-the-blanks.js';\nimport { scoreMultipleChoice } from './activity-scorers/multiple-choice.js';\n\n/** Default minimum scaled score required to pass when `passThreshold` is absent. */\nconst DEFAULT_PASS_THRESHOLD = 0.7;\n\n/**\n * Returns `true` iff `score` meets or exceeds the activity's `passThreshold`,\n * defaulting to {@link DEFAULT_PASS_THRESHOLD} when the field is absent.\n */\nexport function computePassThreshold(activityData: ActivityData, score: number): boolean {\n return score >= (activityData.passThreshold ?? DEFAULT_PASS_THRESHOLD);\n}\n\n/**\n * Scores a learner response against activity data and returns a full\n * {@link ScoringResult}.\n *\n * Pure and deterministic with no side effects. It does **not** re-validate\n * `activityData` — schema validation is the component boundary's\n * responsibility; this is a low-level scoring primitive that trusts its typed\n * inputs. Dispatches on `activityType`; an unrecognised type throws\n * {@link UnknownActivityTypeError}.\n */\nexport function score(\n activityType: ActivityType,\n activityData: ActivityData,\n learnerResponse: LearnerResponse,\n): ScoringResult {\n let result: Omit<ScoringResult, 'passed'>;\n\n switch (activityType) {\n case 'multiple-choice':\n result = scoreMultipleChoice(\n activityData as MultipleChoiceData,\n learnerResponse as MultipleChoiceLearnerResponse,\n );\n break;\n case 'fill-in-the-blanks':\n result = scoreFillInTheBlanks(\n activityData as FillInTheBlanksData,\n learnerResponse as FillInTheBlanksLearnerResponse,\n );\n break;\n default:\n throw new UnknownActivityTypeError(String(activityType));\n }\n\n return { ...result, passed: computePassThreshold(activityData, result.score) };\n}\n"],"mappings":"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","names":["score"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["c:\\Users\\onecu\\Documents\\Intellectif\\IT-for-Intellectif\\learning-kit\\packages\\lk-core\\dist\\chunk-PJFDAP54.cjs"],"names":[],"mappings":"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","file":"C:\\Users\\onecu\\Documents\\Intellectif\\IT-for-Intellectif\\learning-kit\\packages\\lk-core\\dist\\chunk-PJFDAP54.cjs","sourcesContent":[null]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/xapi/validators.ts","../src/xapi/verbs.ts","../src/xapi/builder.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { ActivitySchemaError } from '../errors.js';\nimport type { ValidationError } from '../types/activity.js';\nimport type { XAPIStatement } from '../types/xapi.js';\n\nconst UUID_V4 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n// Minimal IRI/URI check: a scheme followed by ':'.\nconst IRI = /^[a-z][a-z0-9+.-]*:/i;\n\nconst langMap = z.record(z.string(), z.string());\nconst extensions = z.record(z.string(), z.unknown());\n\nconst actorSchema = z\n .object({\n objectType: z.literal('Agent'),\n name: z.string().optional(),\n mbox: z\n .string()\n .regex(/^mailto:/, 'mbox must be a mailto IRI')\n .optional(),\n account: z.object({ homePage: z.string(), name: z.string() }).optional(),\n })\n .refine((actor) => actor.mbox !== undefined || actor.account !== undefined, {\n error: 'actor must be identified by an mbox or an account',\n });\n\nconst statementSchema = z.object({\n id: z.string().regex(UUID_V4, 'id must be a UUID v4'),\n actor: actorSchema,\n verb: z.object({\n id: z.string().regex(IRI, 'verb.id must be an IRI'),\n display: langMap,\n }),\n object: z.object({\n objectType: z.literal('Activity'),\n id: z.string().regex(IRI, 'object.id must be an IRI'),\n definition: z\n .object({\n name: langMap.optional(),\n description: langMap.optional(),\n type: z.string().optional(),\n extensions: extensions.optional(),\n })\n .optional(),\n }),\n result: z\n .object({\n // xAPI 1.0.3 permits scaled in [-1, 1]; the SDK only emits [0, 1].\n score: z\n .object({\n scaled: z.number().min(-1).max(1),\n raw: z.number().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n })\n .optional(),\n success: z.boolean().optional(),\n completion: z.boolean().optional(),\n duration: z.string().regex(/^P/, 'duration must be an ISO 8601 duration').optional(),\n response: z.string().optional(),\n extensions: extensions.optional(),\n })\n .optional(),\n context: z\n .object({\n platform: z.string().optional(),\n language: z.string().optional(),\n extensions: extensions.optional(),\n })\n .optional(),\n timestamp: z\n .string()\n .refine((value) => !Number.isNaN(Date.parse(value)), 'timestamp must be ISO 8601'),\n version: z.literal('1.0.3'),\n});\n\n/** True when running under `NODE_ENV=production`, safe in any environment. */\nfunction isProduction(): boolean {\n const g = globalThis as { process?: { env?: Record<string, string | undefined> } };\n return g.process?.env?.NODE_ENV === 'production';\n}\n\n/**\n * Validates a constructed {@link XAPIStatement} against the xAPI 1.0.3\n * structural contract.\n *\n * In development a structural failure throws (caught early); in production it\n * logs a warning and returns (the statement is still sent — see the design's\n * Error Handling table). Uses a `zod/v4` schema rather than `ajv` + an\n * external JSON Schema to keep `lk-core` dependency-free.\n *\n * NOTE: `ActivitySchemaError` is reused here per the task spec; its\n * `activityType` field carries the sentinel `'xAPIStatement'`. A dedicated\n * `XAPIValidationError` would be semantically cleaner — flagged for review.\n */\nexport function validateXAPIStatement(statement: XAPIStatement): void {\n const result = statementSchema.safeParse(statement);\n if (result.success) {\n return;\n }\n\n const errors: ValidationError[] = result.error.issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n code: issue.code,\n }));\n\n if (isProduction()) {\n console.warn('[learning-kit] Invalid xAPI statement (sent anyway):', errors);\n return;\n }\n\n throw new ActivitySchemaError('xAPIStatement', errors);\n}\n","/**\n * The set of xAPI verbs emitted by SDK activities, keyed by a stable\n * identifier mapped to its canonical xAPI verb IRI (xAPI 1.0.3 / ADL registry).\n */\nexport const XAPIVerb = {\n ANSWERED: 'http://adlnet.gov/expapi/verbs/answered',\n COMPLETED: 'http://adlnet.gov/expapi/verbs/completed',\n EXPERIENCED: 'http://adlnet.gov/expapi/verbs/experienced',\n INTERACTED: 'http://adlnet.gov/expapi/verbs/interacted',\n ATTEMPTED: 'http://adlnet.gov/expapi/verbs/attempted',\n PASSED: 'http://adlnet.gov/expapi/verbs/passed',\n FAILED: 'http://adlnet.gov/expapi/verbs/failed',\n WATCHED: 'https://w3id.org/xapi/video/verbs/watched',\n} as const;\n\n/** Union of the valid `XAPIVerb` keys. */\nexport type XAPIVerbKey = keyof typeof XAPIVerb;\n\n/**\n * Default `en-US` display label for each verb, used to populate\n * `XAPIVerbObject.display` when the builder resolves a verb key.\n */\nexport const XAPI_VERB_DISPLAY: Record<XAPIVerbKey, Record<string, string>> = {\n ANSWERED: { 'en-US': 'answered' },\n COMPLETED: { 'en-US': 'completed' },\n EXPERIENCED: { 'en-US': 'experienced' },\n INTERACTED: { 'en-US': 'interacted' },\n ATTEMPTED: { 'en-US': 'attempted' },\n PASSED: { 'en-US': 'passed' },\n FAILED: { 'en-US': 'failed' },\n WATCHED: { 'en-US': 'watched' },\n};\n","import type { ScoringResult } from '../types/activity.js';\nimport type {\n XAPIActor,\n XAPIContext,\n XAPIObject,\n XAPIResult,\n XAPIStatement,\n} from '../types/xapi.js';\nimport { validateXAPIStatement } from './validators.js';\nimport { XAPI_VERB_DISPLAY, XAPIVerb, type XAPIVerbKey } from './verbs.js';\n\n/** Caller-supplied activity object descriptor (mapped to an xAPI Activity). */\nexport interface XAPIObjectParams {\n /** Activity IRI. */\n id: string;\n name?: Record<string, string>;\n description?: Record<string, string>;\n /** Activity type IRI. */\n type?: string;\n}\n\n/** Parameters for the generic {@link xAPIBuilder.buildStatement}. */\nexport interface XAPIStatementParams {\n actor: XAPIActor;\n verb: XAPIVerbKey;\n object: XAPIObjectParams;\n result?: XAPIResult;\n context?: XAPIContext;\n}\n\n/** Parameters for {@link xAPIBuilder.buildAnsweredStatement} (verb = ANSWERED). */\nexport interface AnsweredStatementParams {\n actor: XAPIActor;\n object: XAPIObjectParams;\n scoringResult: ScoringResult;\n timeSpentMs: number;\n /** Serialized learner response string. */\n response?: string;\n context?: XAPIContext;\n resultExtensions?: Record<string, unknown>;\n}\n\n/** Parameters for {@link xAPIBuilder.buildCompletedStatement} (verb = COMPLETED). */\nexport interface CompletedStatementParams {\n actor: XAPIActor;\n object: XAPIObjectParams;\n scoringResult?: ScoringResult;\n timeSpentMs: number;\n context?: XAPIContext;\n resultExtensions?: Record<string, unknown>;\n}\n\n/** Converts a millisecond duration to an ISO 8601 `PT<seconds>S` string. */\nfunction msToIsoDuration(ms: number): string {\n return `PT${Math.round(ms / 1000)}S`;\n}\n\n/** Builds the xAPI Activity object, including `definition` only when populated. */\nfunction buildObject(params: XAPIObjectParams): XAPIObject {\n const definition: NonNullable<XAPIObject['definition']> = {\n ...(params.name !== undefined ? { name: params.name } : {}),\n ...(params.description !== undefined ? { description: params.description } : {}),\n ...(params.type !== undefined ? { type: params.type } : {}),\n };\n return {\n objectType: 'Activity',\n id: params.id,\n ...(Object.keys(definition).length > 0 ? { definition } : {}),\n };\n}\n\n/**\n * Maps a {@link ScoringResult} + timing to an {@link XAPIResult} per the\n * normative mapping in the design document.\n */\nfunction buildResult(\n timeSpentMs: number,\n scoringResult: ScoringResult | undefined,\n resultExtensions: Record<string, unknown> | undefined,\n response: string | undefined,\n): XAPIResult {\n return {\n completion: true,\n duration: msToIsoDuration(timeSpentMs),\n ...(scoringResult !== undefined\n ? {\n score: {\n scaled: scoringResult.score,\n raw: scoringResult.score,\n min: 0,\n max: scoringResult.maxScore,\n },\n success: scoringResult.passed,\n }\n : {}),\n ...(response !== undefined ? { response } : {}),\n ...(resultExtensions !== undefined ? { extensions: resultExtensions } : {}),\n };\n}\n\n/**\n * Constructs xAPI 1.0.3 Statements. Every call stamps a fresh UUID v4 `id`,\n * an ISO 8601 `timestamp`, and `version: '1.0.3'`. Not pure by design —\n * statements are unique events.\n */\nexport const xAPIBuilder = {\n buildStatement(params: XAPIStatementParams): XAPIStatement {\n const statement: XAPIStatement = {\n id: crypto.randomUUID(),\n actor: params.actor,\n verb: {\n id: XAPIVerb[params.verb],\n display: XAPI_VERB_DISPLAY[params.verb],\n },\n object: buildObject(params.object),\n ...(params.result !== undefined ? { result: params.result } : {}),\n ...(params.context !== undefined ? { context: params.context } : {}),\n timestamp: new Date().toISOString(),\n version: '1.0.3',\n };\n // Design xAPIBuilder step 4: validate every statement (throws in dev,\n // warns in prod). All build*Statement helpers route through here.\n validateXAPIStatement(statement);\n return statement;\n },\n\n buildAnsweredStatement(params: AnsweredStatementParams): XAPIStatement {\n return this.buildStatement({\n actor: params.actor,\n verb: 'ANSWERED',\n object: params.object,\n result: buildResult(\n params.timeSpentMs,\n params.scoringResult,\n params.resultExtensions,\n params.response,\n ),\n ...(params.context !== undefined ? { context: params.context } : {}),\n });\n },\n\n buildCompletedStatement(params: CompletedStatementParams): XAPIStatement {\n return this.buildStatement({\n actor: params.actor,\n verb: 'COMPLETED',\n object: params.object,\n result: buildResult(\n params.timeSpentMs,\n params.scoringResult,\n params.resultExtensions,\n undefined,\n ),\n ...(params.context !== undefined ? { context: params.context } : {}),\n });\n },\n};\n"],"mappings":"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","names":[]}