@contractspec/module.learning-journey 3.7.15 → 3.7.17

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 (94) hide show
  1. package/dist/browser/contracts/index.js +1 -578
  2. package/dist/browser/contracts/models.js +1 -193
  3. package/dist/browser/contracts/onboarding.js +1 -417
  4. package/dist/browser/contracts/operations.js +1 -326
  5. package/dist/browser/contracts/shared.js +1 -5
  6. package/dist/browser/docs/index.js +7 -51
  7. package/dist/browser/docs/learning-journey.docblock.js +7 -51
  8. package/dist/browser/engines/index.js +1 -675
  9. package/dist/browser/engines/srs.js +1 -198
  10. package/dist/browser/engines/streak.js +1 -159
  11. package/dist/browser/engines/xp.js +1 -320
  12. package/dist/browser/entities/ai.js +1 -343
  13. package/dist/browser/entities/course.js +1 -276
  14. package/dist/browser/entities/flashcard.js +1 -222
  15. package/dist/browser/entities/gamification.js +1 -340
  16. package/dist/browser/entities/index.js +1 -2140
  17. package/dist/browser/entities/learner.js +1 -333
  18. package/dist/browser/entities/onboarding.js +1 -301
  19. package/dist/browser/entities/quiz.js +1 -304
  20. package/dist/browser/events.js +1 -423
  21. package/dist/browser/i18n/catalogs/en.js +1 -43
  22. package/dist/browser/i18n/catalogs/es.js +1 -43
  23. package/dist/browser/i18n/catalogs/fr.js +1 -43
  24. package/dist/browser/i18n/catalogs/index.js +1 -127
  25. package/dist/browser/i18n/index.js +1 -169
  26. package/dist/browser/i18n/keys.js +1 -16
  27. package/dist/browser/i18n/locale.js +1 -13
  28. package/dist/browser/i18n/messages.js +1 -139
  29. package/dist/browser/index.js +7 -3914
  30. package/dist/browser/learning-journey.capability.js +1 -43
  31. package/dist/browser/learning-journey.feature.js +1 -56
  32. package/dist/contracts/index.js +1 -578
  33. package/dist/contracts/models.js +1 -193
  34. package/dist/contracts/onboarding.js +1 -417
  35. package/dist/contracts/operations.js +1 -326
  36. package/dist/contracts/shared.js +1 -5
  37. package/dist/docs/index.js +7 -51
  38. package/dist/docs/learning-journey.docblock.js +7 -51
  39. package/dist/engines/index.js +1 -675
  40. package/dist/engines/srs.js +1 -198
  41. package/dist/engines/streak.js +1 -159
  42. package/dist/engines/xp.js +1 -320
  43. package/dist/entities/ai.js +1 -343
  44. package/dist/entities/course.js +1 -276
  45. package/dist/entities/flashcard.js +1 -222
  46. package/dist/entities/gamification.js +1 -340
  47. package/dist/entities/index.js +1 -2140
  48. package/dist/entities/learner.js +1 -333
  49. package/dist/entities/onboarding.js +1 -301
  50. package/dist/entities/quiz.js +1 -304
  51. package/dist/events.js +1 -423
  52. package/dist/i18n/catalogs/en.js +1 -43
  53. package/dist/i18n/catalogs/es.js +1 -43
  54. package/dist/i18n/catalogs/fr.js +1 -43
  55. package/dist/i18n/catalogs/index.js +1 -127
  56. package/dist/i18n/index.js +1 -169
  57. package/dist/i18n/keys.js +1 -16
  58. package/dist/i18n/locale.js +1 -13
  59. package/dist/i18n/messages.js +1 -139
  60. package/dist/index.js +7 -3914
  61. package/dist/learning-journey.capability.js +1 -43
  62. package/dist/learning-journey.feature.js +1 -56
  63. package/dist/node/contracts/index.js +1 -578
  64. package/dist/node/contracts/models.js +1 -193
  65. package/dist/node/contracts/onboarding.js +1 -417
  66. package/dist/node/contracts/operations.js +1 -326
  67. package/dist/node/contracts/shared.js +1 -5
  68. package/dist/node/docs/index.js +7 -51
  69. package/dist/node/docs/learning-journey.docblock.js +7 -51
  70. package/dist/node/engines/index.js +1 -675
  71. package/dist/node/engines/srs.js +1 -198
  72. package/dist/node/engines/streak.js +1 -159
  73. package/dist/node/engines/xp.js +1 -320
  74. package/dist/node/entities/ai.js +1 -343
  75. package/dist/node/entities/course.js +1 -276
  76. package/dist/node/entities/flashcard.js +1 -222
  77. package/dist/node/entities/gamification.js +1 -340
  78. package/dist/node/entities/index.js +1 -2140
  79. package/dist/node/entities/learner.js +1 -333
  80. package/dist/node/entities/onboarding.js +1 -301
  81. package/dist/node/entities/quiz.js +1 -304
  82. package/dist/node/events.js +1 -423
  83. package/dist/node/i18n/catalogs/en.js +1 -43
  84. package/dist/node/i18n/catalogs/es.js +1 -43
  85. package/dist/node/i18n/catalogs/fr.js +1 -43
  86. package/dist/node/i18n/catalogs/index.js +1 -127
  87. package/dist/node/i18n/index.js +1 -169
  88. package/dist/node/i18n/keys.js +1 -16
  89. package/dist/node/i18n/locale.js +1 -13
  90. package/dist/node/i18n/messages.js +1 -139
  91. package/dist/node/index.js +7 -3914
  92. package/dist/node/learning-journey.capability.js +1 -43
  93. package/dist/node/learning-journey.feature.js +1 -56
  94. package/package.json +7 -7
@@ -1,305 +1,2 @@
1
1
  // @bun
2
- // src/entities/quiz.ts
3
- import {
4
- defineEntity,
5
- defineEntityEnum,
6
- field,
7
- index
8
- } from "@contractspec/lib.schema";
9
- var QuestionTypeEnum = defineEntityEnum({
10
- name: "QuestionType",
11
- values: [
12
- "MULTIPLE_CHOICE",
13
- "TRUE_FALSE",
14
- "FILL_BLANK",
15
- "MATCHING",
16
- "SHORT_ANSWER",
17
- "CODE"
18
- ],
19
- schema: "lssm_learning",
20
- description: "Type of quiz question."
21
- });
22
- var QuizStatusEnum = defineEntityEnum({
23
- name: "QuizStatus",
24
- values: ["DRAFT", "PUBLISHED", "ARCHIVED"],
25
- schema: "lssm_learning",
26
- description: "Publication status of a quiz."
27
- });
28
- var AttemptStatusEnum = defineEntityEnum({
29
- name: "AttemptStatus",
30
- values: ["IN_PROGRESS", "COMPLETED", "TIMED_OUT", "ABANDONED"],
31
- schema: "lssm_learning",
32
- description: "Status of a quiz attempt."
33
- });
34
- var QuizEntity = defineEntity({
35
- name: "Quiz",
36
- description: "A quiz assessment.",
37
- schema: "lssm_learning",
38
- map: "quiz",
39
- fields: {
40
- id: field.id({ description: "Unique quiz identifier" }),
41
- lessonId: field.foreignKey({
42
- isOptional: true,
43
- description: "Associated lesson"
44
- }),
45
- title: field.string({ description: "Quiz title" }),
46
- description: field.string({
47
- isOptional: true,
48
- description: "Quiz description"
49
- }),
50
- instructions: field.string({
51
- isOptional: true,
52
- description: "Quiz instructions"
53
- }),
54
- passingScore: field.int({
55
- default: 70,
56
- description: "Passing score percentage"
57
- }),
58
- timeLimit: field.int({
59
- isOptional: true,
60
- description: "Time limit in seconds"
61
- }),
62
- maxAttempts: field.int({
63
- isOptional: true,
64
- description: "Maximum attempts allowed"
65
- }),
66
- shuffleQuestions: field.boolean({
67
- default: false,
68
- description: "Shuffle question order"
69
- }),
70
- shuffleOptions: field.boolean({
71
- default: false,
72
- description: "Shuffle answer options"
73
- }),
74
- showCorrectAnswers: field.boolean({
75
- default: true,
76
- description: "Show correct answers after"
77
- }),
78
- showExplanations: field.boolean({
79
- default: true,
80
- description: "Show explanations after"
81
- }),
82
- status: field.enum("QuizStatus", {
83
- default: "DRAFT",
84
- description: "Publication status"
85
- }),
86
- totalPoints: field.int({
87
- default: 0,
88
- description: "Total points available"
89
- }),
90
- xpReward: field.int({ default: 20, description: "XP for passing" }),
91
- orgId: field.string({
92
- isOptional: true,
93
- description: "Organization scope"
94
- }),
95
- metadata: field.json({
96
- isOptional: true,
97
- description: "Additional metadata"
98
- }),
99
- createdAt: field.createdAt(),
100
- updatedAt: field.updatedAt(),
101
- lesson: field.belongsTo("Lesson", ["lessonId"], ["id"], {
102
- onDelete: "Cascade"
103
- }),
104
- questions: field.hasMany("Question"),
105
- attempts: field.hasMany("QuizAttempt")
106
- },
107
- indexes: [index.on(["lessonId"]), index.on(["status"]), index.on(["orgId"])],
108
- enums: [QuizStatusEnum]
109
- });
110
- var QuestionEntity = defineEntity({
111
- name: "Question",
112
- description: "A quiz question.",
113
- schema: "lssm_learning",
114
- map: "question",
115
- fields: {
116
- id: field.id({ description: "Unique question identifier" }),
117
- quizId: field.foreignKey({ description: "Parent quiz" }),
118
- type: field.enum("QuestionType", { description: "Question type" }),
119
- content: field.string({ description: "Question text" }),
120
- mediaUrl: field.string({ isOptional: true, description: "Question media" }),
121
- points: field.int({ default: 1, description: "Points for correct answer" }),
122
- codeLanguage: field.string({
123
- isOptional: true,
124
- description: "Programming language"
125
- }),
126
- codeTemplate: field.string({
127
- isOptional: true,
128
- description: "Starter code template"
129
- }),
130
- testCases: field.json({
131
- isOptional: true,
132
- description: "Test cases for code validation"
133
- }),
134
- explanation: field.string({
135
- isOptional: true,
136
- description: "Explanation of correct answer"
137
- }),
138
- hint: field.string({
139
- isOptional: true,
140
- description: "Hint for the question"
141
- }),
142
- order: field.int({ default: 0, description: "Display order" }),
143
- skillId: field.string({
144
- isOptional: true,
145
- description: "Associated skill"
146
- }),
147
- metadata: field.json({
148
- isOptional: true,
149
- description: "Additional metadata"
150
- }),
151
- createdAt: field.createdAt(),
152
- updatedAt: field.updatedAt(),
153
- quiz: field.belongsTo("Quiz", ["quizId"], ["id"], { onDelete: "Cascade" }),
154
- options: field.hasMany("QuestionOption")
155
- },
156
- indexes: [
157
- index.on(["quizId", "order"]),
158
- index.on(["type"]),
159
- index.on(["skillId"])
160
- ],
161
- enums: [QuestionTypeEnum]
162
- });
163
- var QuestionOptionEntity = defineEntity({
164
- name: "QuestionOption",
165
- description: "An answer option for a question.",
166
- schema: "lssm_learning",
167
- map: "question_option",
168
- fields: {
169
- id: field.id({ description: "Unique option identifier" }),
170
- questionId: field.foreignKey({ description: "Parent question" }),
171
- content: field.string({ description: "Option text" }),
172
- matchContent: field.string({
173
- isOptional: true,
174
- description: "Match pair content"
175
- }),
176
- isCorrect: field.boolean({
177
- default: false,
178
- description: "Whether option is correct"
179
- }),
180
- feedback: field.string({
181
- isOptional: true,
182
- description: "Feedback when selected"
183
- }),
184
- order: field.int({ default: 0, description: "Display order" }),
185
- metadata: field.json({
186
- isOptional: true,
187
- description: "Additional metadata"
188
- }),
189
- createdAt: field.createdAt(),
190
- updatedAt: field.updatedAt(),
191
- question: field.belongsTo("Question", ["questionId"], ["id"], {
192
- onDelete: "Cascade"
193
- })
194
- },
195
- indexes: [index.on(["questionId", "order"])]
196
- });
197
- var QuizAttemptEntity = defineEntity({
198
- name: "QuizAttempt",
199
- description: "A learner quiz attempt.",
200
- schema: "lssm_learning",
201
- map: "quiz_attempt",
202
- fields: {
203
- id: field.id({ description: "Unique attempt identifier" }),
204
- learnerId: field.foreignKey({ description: "Learner" }),
205
- quizId: field.foreignKey({ description: "Quiz" }),
206
- status: field.enum("AttemptStatus", {
207
- default: "IN_PROGRESS",
208
- description: "Attempt status"
209
- }),
210
- score: field.int({ isOptional: true, description: "Score achieved" }),
211
- percentageScore: field.int({
212
- isOptional: true,
213
- description: "Percentage score"
214
- }),
215
- passed: field.boolean({ isOptional: true, description: "Whether passed" }),
216
- totalQuestions: field.int({ default: 0, description: "Total questions" }),
217
- answeredQuestions: field.int({
218
- default: 0,
219
- description: "Questions answered"
220
- }),
221
- correctAnswers: field.int({ default: 0, description: "Correct answers" }),
222
- answers: field.json({ isOptional: true, description: "Submitted answers" }),
223
- xpEarned: field.int({ default: 0, description: "XP earned" }),
224
- timeSpent: field.int({ default: 0, description: "Time spent in seconds" }),
225
- startedAt: field.dateTime({ description: "When started" }),
226
- completedAt: field.dateTime({
227
- isOptional: true,
228
- description: "When completed"
229
- }),
230
- attemptNumber: field.int({
231
- default: 1,
232
- description: "Which attempt this is"
233
- }),
234
- metadata: field.json({
235
- isOptional: true,
236
- description: "Additional metadata"
237
- }),
238
- createdAt: field.createdAt(),
239
- updatedAt: field.updatedAt(),
240
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
241
- onDelete: "Cascade"
242
- }),
243
- quiz: field.belongsTo("Quiz", ["quizId"], ["id"], { onDelete: "Cascade" })
244
- },
245
- indexes: [
246
- index.on(["learnerId", "quizId"]),
247
- index.on(["learnerId", "status"]),
248
- index.on(["quizId", "status"])
249
- ],
250
- enums: [AttemptStatusEnum]
251
- });
252
- var SkillAssessmentEntity = defineEntity({
253
- name: "SkillAssessment",
254
- description: "Assessment of a skill based on quiz performance.",
255
- schema: "lssm_learning",
256
- map: "skill_assessment",
257
- fields: {
258
- id: field.id({ description: "Unique assessment identifier" }),
259
- learnerId: field.foreignKey({ description: "Learner" }),
260
- skillId: field.string({ description: "Skill identifier" }),
261
- skillName: field.string({ description: "Skill name" }),
262
- level: field.int({ default: 1, description: "Proficiency level (1-5)" }),
263
- score: field.int({ default: 0, description: "Assessment score (0-100)" }),
264
- confidence: field.decimal({
265
- default: 0.5,
266
- description: "Confidence in assessment"
267
- }),
268
- questionsAnswered: field.int({
269
- default: 0,
270
- description: "Total questions answered"
271
- }),
272
- questionsCorrect: field.int({ default: 0, description: "Total correct" }),
273
- assessedAt: field.dateTime({ description: "Last assessment time" }),
274
- createdAt: field.createdAt(),
275
- updatedAt: field.updatedAt(),
276
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
277
- onDelete: "Cascade"
278
- })
279
- },
280
- indexes: [
281
- index.unique(["learnerId", "skillId"], { name: "skill_assessment_unique" }),
282
- index.on(["learnerId", "level"]),
283
- index.on(["skillId"])
284
- ]
285
- });
286
- var quizEntities = [
287
- QuizEntity,
288
- QuestionEntity,
289
- QuestionOptionEntity,
290
- QuizAttemptEntity,
291
- SkillAssessmentEntity
292
- ];
293
- var quizEnums = [QuestionTypeEnum, QuizStatusEnum, AttemptStatusEnum];
294
- export {
295
- quizEnums,
296
- quizEntities,
297
- SkillAssessmentEntity,
298
- QuizStatusEnum,
299
- QuizEntity,
300
- QuizAttemptEntity,
301
- QuestionTypeEnum,
302
- QuestionOptionEntity,
303
- QuestionEntity,
304
- AttemptStatusEnum
305
- };
2
+ import{defineEntity as v,defineEntityEnum as w,field as g,index as j}from"@contractspec/lib.schema";var B=w({name:"QuestionType",values:["MULTIPLE_CHOICE","TRUE_FALSE","FILL_BLANK","MATCHING","SHORT_ANSWER","CODE"],schema:"lssm_learning",description:"Type of quiz question."}),C=w({name:"QuizStatus",values:["DRAFT","PUBLISHED","ARCHIVED"],schema:"lssm_learning",description:"Publication status of a quiz."}),D=w({name:"AttemptStatus",values:["IN_PROGRESS","COMPLETED","TIMED_OUT","ABANDONED"],schema:"lssm_learning",description:"Status of a quiz attempt."}),F=v({name:"Quiz",description:"A quiz assessment.",schema:"lssm_learning",map:"quiz",fields:{id:g.id({description:"Unique quiz identifier"}),lessonId:g.foreignKey({isOptional:!0,description:"Associated lesson"}),title:g.string({description:"Quiz title"}),description:g.string({isOptional:!0,description:"Quiz description"}),instructions:g.string({isOptional:!0,description:"Quiz instructions"}),passingScore:g.int({default:70,description:"Passing score percentage"}),timeLimit:g.int({isOptional:!0,description:"Time limit in seconds"}),maxAttempts:g.int({isOptional:!0,description:"Maximum attempts allowed"}),shuffleQuestions:g.boolean({default:!1,description:"Shuffle question order"}),shuffleOptions:g.boolean({default:!1,description:"Shuffle answer options"}),showCorrectAnswers:g.boolean({default:!0,description:"Show correct answers after"}),showExplanations:g.boolean({default:!0,description:"Show explanations after"}),status:g.enum("QuizStatus",{default:"DRAFT",description:"Publication status"}),totalPoints:g.int({default:0,description:"Total points available"}),xpReward:g.int({default:20,description:"XP for passing"}),orgId:g.string({isOptional:!0,description:"Organization scope"}),metadata:g.json({isOptional:!0,description:"Additional metadata"}),createdAt:g.createdAt(),updatedAt:g.updatedAt(),lesson:g.belongsTo("Lesson",["lessonId"],["id"],{onDelete:"Cascade"}),questions:g.hasMany("Question"),attempts:g.hasMany("QuizAttempt")},indexes:[j.on(["lessonId"]),j.on(["status"]),j.on(["orgId"])],enums:[C]}),G=v({name:"Question",description:"A quiz question.",schema:"lssm_learning",map:"question",fields:{id:g.id({description:"Unique question identifier"}),quizId:g.foreignKey({description:"Parent quiz"}),type:g.enum("QuestionType",{description:"Question type"}),content:g.string({description:"Question text"}),mediaUrl:g.string({isOptional:!0,description:"Question media"}),points:g.int({default:1,description:"Points for correct answer"}),codeLanguage:g.string({isOptional:!0,description:"Programming language"}),codeTemplate:g.string({isOptional:!0,description:"Starter code template"}),testCases:g.json({isOptional:!0,description:"Test cases for code validation"}),explanation:g.string({isOptional:!0,description:"Explanation of correct answer"}),hint:g.string({isOptional:!0,description:"Hint for the question"}),order:g.int({default:0,description:"Display order"}),skillId:g.string({isOptional:!0,description:"Associated skill"}),metadata:g.json({isOptional:!0,description:"Additional metadata"}),createdAt:g.createdAt(),updatedAt:g.updatedAt(),quiz:g.belongsTo("Quiz",["quizId"],["id"],{onDelete:"Cascade"}),options:g.hasMany("QuestionOption")},indexes:[j.on(["quizId","order"]),j.on(["type"]),j.on(["skillId"])],enums:[B]}),H=v({name:"QuestionOption",description:"An answer option for a question.",schema:"lssm_learning",map:"question_option",fields:{id:g.id({description:"Unique option identifier"}),questionId:g.foreignKey({description:"Parent question"}),content:g.string({description:"Option text"}),matchContent:g.string({isOptional:!0,description:"Match pair content"}),isCorrect:g.boolean({default:!1,description:"Whether option is correct"}),feedback:g.string({isOptional:!0,description:"Feedback when selected"}),order:g.int({default:0,description:"Display order"}),metadata:g.json({isOptional:!0,description:"Additional metadata"}),createdAt:g.createdAt(),updatedAt:g.updatedAt(),question:g.belongsTo("Question",["questionId"],["id"],{onDelete:"Cascade"})},indexes:[j.on(["questionId","order"])]}),I=v({name:"QuizAttempt",description:"A learner quiz attempt.",schema:"lssm_learning",map:"quiz_attempt",fields:{id:g.id({description:"Unique attempt identifier"}),learnerId:g.foreignKey({description:"Learner"}),quizId:g.foreignKey({description:"Quiz"}),status:g.enum("AttemptStatus",{default:"IN_PROGRESS",description:"Attempt status"}),score:g.int({isOptional:!0,description:"Score achieved"}),percentageScore:g.int({isOptional:!0,description:"Percentage score"}),passed:g.boolean({isOptional:!0,description:"Whether passed"}),totalQuestions:g.int({default:0,description:"Total questions"}),answeredQuestions:g.int({default:0,description:"Questions answered"}),correctAnswers:g.int({default:0,description:"Correct answers"}),answers:g.json({isOptional:!0,description:"Submitted answers"}),xpEarned:g.int({default:0,description:"XP earned"}),timeSpent:g.int({default:0,description:"Time spent in seconds"}),startedAt:g.dateTime({description:"When started"}),completedAt:g.dateTime({isOptional:!0,description:"When completed"}),attemptNumber:g.int({default:1,description:"Which attempt this is"}),metadata:g.json({isOptional:!0,description:"Additional metadata"}),createdAt:g.createdAt(),updatedAt:g.updatedAt(),learner:g.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"}),quiz:g.belongsTo("Quiz",["quizId"],["id"],{onDelete:"Cascade"})},indexes:[j.on(["learnerId","quizId"]),j.on(["learnerId","status"]),j.on(["quizId","status"])],enums:[D]}),J=v({name:"SkillAssessment",description:"Assessment of a skill based on quiz performance.",schema:"lssm_learning",map:"skill_assessment",fields:{id:g.id({description:"Unique assessment identifier"}),learnerId:g.foreignKey({description:"Learner"}),skillId:g.string({description:"Skill identifier"}),skillName:g.string({description:"Skill name"}),level:g.int({default:1,description:"Proficiency level (1-5)"}),score:g.int({default:0,description:"Assessment score (0-100)"}),confidence:g.decimal({default:0.5,description:"Confidence in assessment"}),questionsAnswered:g.int({default:0,description:"Total questions answered"}),questionsCorrect:g.int({default:0,description:"Total correct"}),assessedAt:g.dateTime({description:"Last assessment time"}),createdAt:g.createdAt(),updatedAt:g.updatedAt(),learner:g.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"})},indexes:[j.unique(["learnerId","skillId"],{name:"skill_assessment_unique"}),j.on(["learnerId","level"]),j.on(["skillId"])]}),L=[F,G,H,I,J],M=[B,C,D];export{M as quizEnums,L as quizEntities,J as SkillAssessmentEntity,C as QuizStatusEnum,F as QuizEntity,I as QuizAttemptEntity,B as QuestionTypeEnum,H as QuestionOptionEntity,G as QuestionEntity,D as AttemptStatusEnum};