@contractspec/module.learning-journey 1.57.0 → 1.58.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 (140) hide show
  1. package/dist/browser/contracts/index.js +578 -0
  2. package/dist/browser/contracts/models.js +193 -0
  3. package/dist/browser/contracts/onboarding.js +417 -0
  4. package/dist/browser/contracts/operations.js +326 -0
  5. package/dist/browser/contracts/shared.js +5 -0
  6. package/dist/browser/docs/index.js +124 -0
  7. package/dist/browser/docs/learning-journey.docblock.js +124 -0
  8. package/dist/browser/engines/index.js +526 -0
  9. package/dist/browser/engines/srs.js +198 -0
  10. package/dist/browser/engines/streak.js +159 -0
  11. package/dist/browser/engines/xp.js +171 -0
  12. package/dist/browser/entities/ai.js +343 -0
  13. package/dist/browser/entities/course.js +276 -0
  14. package/dist/browser/entities/flashcard.js +222 -0
  15. package/dist/browser/entities/gamification.js +340 -0
  16. package/dist/browser/entities/index.js +2136 -0
  17. package/dist/browser/entities/learner.js +329 -0
  18. package/dist/browser/entities/onboarding.js +301 -0
  19. package/dist/browser/entities/quiz.js +304 -0
  20. package/dist/browser/events.js +423 -0
  21. package/dist/browser/index.js +3833 -0
  22. package/dist/browser/learning-journey.capability.js +40 -0
  23. package/dist/browser/learning-journey.feature.js +56 -0
  24. package/dist/browser/track-spec.js +0 -0
  25. package/dist/contracts/index.d.ts +5 -5
  26. package/dist/contracts/index.d.ts.map +1 -0
  27. package/dist/contracts/index.js +578 -5
  28. package/dist/contracts/models.d.ts +426 -431
  29. package/dist/contracts/models.d.ts.map +1 -1
  30. package/dist/contracts/models.js +178 -372
  31. package/dist/contracts/onboarding.d.ts +621 -627
  32. package/dist/contracts/onboarding.d.ts.map +1 -1
  33. package/dist/contracts/onboarding.js +404 -388
  34. package/dist/contracts/operations.d.ts +243 -249
  35. package/dist/contracts/operations.d.ts.map +1 -1
  36. package/dist/contracts/operations.js +324 -148
  37. package/dist/contracts/shared.d.ts +1 -4
  38. package/dist/contracts/shared.d.ts.map +1 -1
  39. package/dist/contracts/shared.js +6 -6
  40. package/dist/docs/index.d.ts +2 -1
  41. package/dist/docs/index.d.ts.map +1 -0
  42. package/dist/docs/index.js +125 -1
  43. package/dist/docs/learning-journey.docblock.d.ts +2 -1
  44. package/dist/docs/learning-journey.docblock.d.ts.map +1 -0
  45. package/dist/docs/learning-journey.docblock.js +47 -58
  46. package/dist/engines/index.d.ts +4 -4
  47. package/dist/engines/index.d.ts.map +1 -0
  48. package/dist/engines/index.js +526 -4
  49. package/dist/engines/srs.d.ts +89 -92
  50. package/dist/engines/srs.d.ts.map +1 -1
  51. package/dist/engines/srs.js +197 -217
  52. package/dist/engines/streak.d.ts +84 -87
  53. package/dist/engines/streak.d.ts.map +1 -1
  54. package/dist/engines/streak.js +158 -192
  55. package/dist/engines/xp.d.ts +80 -83
  56. package/dist/engines/xp.d.ts.map +1 -1
  57. package/dist/engines/xp.js +170 -211
  58. package/dist/entities/ai.d.ts +199 -204
  59. package/dist/entities/ai.d.ts.map +1 -1
  60. package/dist/entities/ai.js +336 -368
  61. package/dist/entities/course.d.ts +149 -154
  62. package/dist/entities/course.d.ts.map +1 -1
  63. package/dist/entities/course.js +267 -306
  64. package/dist/entities/flashcard.d.ts +144 -149
  65. package/dist/entities/flashcard.d.ts.map +1 -1
  66. package/dist/entities/flashcard.js +217 -243
  67. package/dist/entities/gamification.d.ts +197 -202
  68. package/dist/entities/gamification.d.ts.map +1 -1
  69. package/dist/entities/gamification.js +331 -382
  70. package/dist/entities/index.d.ts +613 -618
  71. package/dist/entities/index.d.ts.map +1 -1
  72. package/dist/entities/index.js +2135 -43
  73. package/dist/entities/learner.d.ts +191 -196
  74. package/dist/entities/learner.d.ts.map +1 -1
  75. package/dist/entities/learner.js +322 -357
  76. package/dist/entities/onboarding.d.ts +164 -169
  77. package/dist/entities/onboarding.d.ts.map +1 -1
  78. package/dist/entities/onboarding.js +296 -301
  79. package/dist/entities/quiz.d.ts +184 -189
  80. package/dist/entities/quiz.d.ts.map +1 -1
  81. package/dist/entities/quiz.js +296 -361
  82. package/dist/events.d.ts +608 -614
  83. package/dist/events.d.ts.map +1 -1
  84. package/dist/events.js +421 -687
  85. package/dist/index.d.ts +8 -20
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +3834 -22
  88. package/dist/learning-journey.capability.d.ts +3 -8
  89. package/dist/learning-journey.capability.d.ts.map +1 -1
  90. package/dist/learning-journey.capability.js +41 -46
  91. package/dist/learning-journey.feature.d.ts +1 -6
  92. package/dist/learning-journey.feature.d.ts.map +1 -1
  93. package/dist/learning-journey.feature.js +55 -155
  94. package/dist/node/contracts/index.js +578 -0
  95. package/dist/node/contracts/models.js +193 -0
  96. package/dist/node/contracts/onboarding.js +417 -0
  97. package/dist/node/contracts/operations.js +326 -0
  98. package/dist/node/contracts/shared.js +5 -0
  99. package/dist/node/docs/index.js +124 -0
  100. package/dist/node/docs/learning-journey.docblock.js +124 -0
  101. package/dist/node/engines/index.js +526 -0
  102. package/dist/node/engines/srs.js +198 -0
  103. package/dist/node/engines/streak.js +159 -0
  104. package/dist/node/engines/xp.js +171 -0
  105. package/dist/node/entities/ai.js +343 -0
  106. package/dist/node/entities/course.js +276 -0
  107. package/dist/node/entities/flashcard.js +222 -0
  108. package/dist/node/entities/gamification.js +340 -0
  109. package/dist/node/entities/index.js +2136 -0
  110. package/dist/node/entities/learner.js +329 -0
  111. package/dist/node/entities/onboarding.js +301 -0
  112. package/dist/node/entities/quiz.js +304 -0
  113. package/dist/node/events.js +423 -0
  114. package/dist/node/index.js +3833 -0
  115. package/dist/node/learning-journey.capability.js +40 -0
  116. package/dist/node/learning-journey.feature.js +56 -0
  117. package/dist/node/track-spec.js +0 -0
  118. package/dist/track-spec.d.ts +115 -118
  119. package/dist/track-spec.d.ts.map +1 -1
  120. package/dist/track-spec.js +1 -0
  121. package/package.json +237 -60
  122. package/dist/contracts/models.js.map +0 -1
  123. package/dist/contracts/onboarding.js.map +0 -1
  124. package/dist/contracts/operations.js.map +0 -1
  125. package/dist/contracts/shared.js.map +0 -1
  126. package/dist/docs/learning-journey.docblock.js.map +0 -1
  127. package/dist/engines/srs.js.map +0 -1
  128. package/dist/engines/streak.js.map +0 -1
  129. package/dist/engines/xp.js.map +0 -1
  130. package/dist/entities/ai.js.map +0 -1
  131. package/dist/entities/course.js.map +0 -1
  132. package/dist/entities/flashcard.js.map +0 -1
  133. package/dist/entities/gamification.js.map +0 -1
  134. package/dist/entities/index.js.map +0 -1
  135. package/dist/entities/learner.js.map +0 -1
  136. package/dist/entities/onboarding.js.map +0 -1
  137. package/dist/entities/quiz.js.map +0 -1
  138. package/dist/events.js.map +0 -1
  139. package/dist/learning-journey.capability.js.map +0 -1
  140. package/dist/learning-journey.feature.js.map +0 -1
@@ -1,365 +1,330 @@
1
- import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
2
-
3
- //#region src/entities/learner.ts
4
- /**
5
- * Enrollment status enum.
6
- */
7
- const EnrollmentStatusEnum = defineEntityEnum({
8
- name: "EnrollmentStatus",
9
- values: [
10
- "ENROLLED",
11
- "IN_PROGRESS",
12
- "COMPLETED",
13
- "DROPPED",
14
- "EXPIRED"
15
- ],
16
- schema: "lssm_learning",
17
- description: "Status of a course enrollment."
1
+ // @bun
2
+ // src/entities/learner.ts
3
+ import {
4
+ defineEntity,
5
+ defineEntityEnum,
6
+ field,
7
+ index
8
+ } from "@contractspec/lib.schema";
9
+ var EnrollmentStatusEnum = defineEntityEnum({
10
+ name: "EnrollmentStatus",
11
+ values: [
12
+ "ENROLLED",
13
+ "IN_PROGRESS",
14
+ "COMPLETED",
15
+ "DROPPED",
16
+ "EXPIRED"
17
+ ],
18
+ schema: "lssm_learning",
19
+ description: "Status of a course enrollment."
18
20
  });
19
- /**
20
- * Progress status enum.
21
- */
22
- const ProgressStatusEnum = defineEntityEnum({
23
- name: "ProgressStatus",
24
- values: [
25
- "NOT_STARTED",
26
- "IN_PROGRESS",
27
- "COMPLETED",
28
- "SKIPPED"
29
- ],
30
- schema: "lssm_learning",
31
- description: "Status of lesson progress."
21
+ var ProgressStatusEnum = defineEntityEnum({
22
+ name: "ProgressStatus",
23
+ values: ["NOT_STARTED", "IN_PROGRESS", "COMPLETED", "SKIPPED"],
24
+ schema: "lssm_learning",
25
+ description: "Status of lesson progress."
32
26
  });
33
- /**
34
- * Learner entity - learning profile.
35
- */
36
- const LearnerEntity = defineEntity({
37
- name: "Learner",
38
- description: "A learner profile.",
39
- schema: "lssm_learning",
40
- map: "learner",
41
- fields: {
42
- id: field.id({ description: "Unique learner identifier" }),
43
- userId: field.string({
44
- isUnique: true,
45
- description: "Associated user ID"
46
- }),
47
- displayName: field.string({
48
- isOptional: true,
49
- description: "Display name"
50
- }),
51
- avatarUrl: field.string({
52
- isOptional: true,
53
- description: "Avatar URL"
54
- }),
55
- bio: field.string({
56
- isOptional: true,
57
- description: "Short bio"
58
- }),
59
- level: field.int({
60
- default: 1,
61
- description: "Current level"
62
- }),
63
- totalXp: field.int({
64
- default: 0,
65
- description: "Total XP earned"
66
- }),
67
- currentStreak: field.int({
68
- default: 0,
69
- description: "Current streak days"
70
- }),
71
- longestStreak: field.int({
72
- default: 0,
73
- description: "Longest streak ever"
74
- }),
75
- lastActivityAt: field.dateTime({
76
- isOptional: true,
77
- description: "Last learning activity"
78
- }),
79
- timezone: field.string({
80
- default: "\"UTC\"",
81
- description: "Learner timezone"
82
- }),
83
- dailyGoalXp: field.int({
84
- default: 50,
85
- description: "Daily XP goal"
86
- }),
87
- reminderEnabled: field.boolean({
88
- default: true,
89
- description: "Enable reminders"
90
- }),
91
- reminderTime: field.string({
92
- isOptional: true,
93
- description: "Preferred reminder time"
94
- }),
95
- orgId: field.string({
96
- isOptional: true,
97
- description: "Organization scope"
98
- }),
99
- metadata: field.json({
100
- isOptional: true,
101
- description: "Additional metadata"
102
- }),
103
- createdAt: field.createdAt(),
104
- updatedAt: field.updatedAt(),
105
- enrollments: field.hasMany("Enrollment"),
106
- lessonProgress: field.hasMany("LessonProgress"),
107
- achievements: field.hasMany("LearnerAchievement"),
108
- decks: field.hasMany("Deck"),
109
- profile: field.hasOne("LearnerProfile")
110
- },
111
- indexes: [
112
- index.on(["orgId"]),
113
- index.on(["totalXp"]),
114
- index.on(["level"]),
115
- index.on(["currentStreak"])
116
- ]
27
+ var LearnerEntity = defineEntity({
28
+ name: "Learner",
29
+ description: "A learner profile.",
30
+ schema: "lssm_learning",
31
+ map: "learner",
32
+ fields: {
33
+ id: field.id({ description: "Unique learner identifier" }),
34
+ userId: field.string({ isUnique: true, description: "Associated user ID" }),
35
+ displayName: field.string({
36
+ isOptional: true,
37
+ description: "Display name"
38
+ }),
39
+ avatarUrl: field.string({ isOptional: true, description: "Avatar URL" }),
40
+ bio: field.string({ isOptional: true, description: "Short bio" }),
41
+ level: field.int({ default: 1, description: "Current level" }),
42
+ totalXp: field.int({ default: 0, description: "Total XP earned" }),
43
+ currentStreak: field.int({
44
+ default: 0,
45
+ description: "Current streak days"
46
+ }),
47
+ longestStreak: field.int({
48
+ default: 0,
49
+ description: "Longest streak ever"
50
+ }),
51
+ lastActivityAt: field.dateTime({
52
+ isOptional: true,
53
+ description: "Last learning activity"
54
+ }),
55
+ timezone: field.string({
56
+ default: '"UTC"',
57
+ description: "Learner timezone"
58
+ }),
59
+ dailyGoalXp: field.int({ default: 50, description: "Daily XP goal" }),
60
+ reminderEnabled: field.boolean({
61
+ default: true,
62
+ description: "Enable reminders"
63
+ }),
64
+ reminderTime: field.string({
65
+ isOptional: true,
66
+ description: "Preferred reminder time"
67
+ }),
68
+ orgId: field.string({
69
+ isOptional: true,
70
+ description: "Organization scope"
71
+ }),
72
+ metadata: field.json({
73
+ isOptional: true,
74
+ description: "Additional metadata"
75
+ }),
76
+ createdAt: field.createdAt(),
77
+ updatedAt: field.updatedAt(),
78
+ enrollments: field.hasMany("Enrollment"),
79
+ lessonProgress: field.hasMany("LessonProgress"),
80
+ achievements: field.hasMany("LearnerAchievement"),
81
+ decks: field.hasMany("Deck"),
82
+ profile: field.hasOne("LearnerProfile")
83
+ },
84
+ indexes: [
85
+ index.on(["orgId"]),
86
+ index.on(["totalXp"]),
87
+ index.on(["level"]),
88
+ index.on(["currentStreak"])
89
+ ]
117
90
  });
118
- /**
119
- * Enrollment entity - course enrollment.
120
- */
121
- const EnrollmentEntity = defineEntity({
122
- name: "Enrollment",
123
- description: "A learner enrollment in a course.",
124
- schema: "lssm_learning",
125
- map: "enrollment",
126
- fields: {
127
- id: field.id({ description: "Unique enrollment identifier" }),
128
- learnerId: field.foreignKey({ description: "Enrolled learner" }),
129
- courseId: field.foreignKey({ description: "Enrolled course" }),
130
- status: field.enum("EnrollmentStatus", {
131
- default: "ENROLLED",
132
- description: "Enrollment status"
133
- }),
134
- progress: field.int({
135
- default: 0,
136
- description: "Completion percentage (0-100)"
137
- }),
138
- completedLessons: field.int({
139
- default: 0,
140
- description: "Number of completed lessons"
141
- }),
142
- totalLessons: field.int({
143
- default: 0,
144
- description: "Total lessons in course"
145
- }),
146
- xpEarned: field.int({
147
- default: 0,
148
- description: "XP earned in this course"
149
- }),
150
- startedAt: field.dateTime({
151
- isOptional: true,
152
- description: "When learner started"
153
- }),
154
- completedAt: field.dateTime({
155
- isOptional: true,
156
- description: "When learner completed"
157
- }),
158
- lastAccessedAt: field.dateTime({
159
- isOptional: true,
160
- description: "Last access time"
161
- }),
162
- certificateId: field.string({
163
- isOptional: true,
164
- description: "Issued certificate ID"
165
- }),
166
- metadata: field.json({
167
- isOptional: true,
168
- description: "Additional metadata"
169
- }),
170
- createdAt: field.createdAt(),
171
- updatedAt: field.updatedAt(),
172
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
173
- course: field.belongsTo("Course", ["courseId"], ["id"], { onDelete: "Cascade" })
174
- },
175
- indexes: [
176
- index.unique(["learnerId", "courseId"], { name: "enrollment_unique" }),
177
- index.on(["learnerId", "status"]),
178
- index.on(["courseId", "status"])
179
- ],
180
- enums: [EnrollmentStatusEnum]
91
+ var EnrollmentEntity = defineEntity({
92
+ name: "Enrollment",
93
+ description: "A learner enrollment in a course.",
94
+ schema: "lssm_learning",
95
+ map: "enrollment",
96
+ fields: {
97
+ id: field.id({ description: "Unique enrollment identifier" }),
98
+ learnerId: field.foreignKey({ description: "Enrolled learner" }),
99
+ courseId: field.foreignKey({ description: "Enrolled course" }),
100
+ status: field.enum("EnrollmentStatus", {
101
+ default: "ENROLLED",
102
+ description: "Enrollment status"
103
+ }),
104
+ progress: field.int({
105
+ default: 0,
106
+ description: "Completion percentage (0-100)"
107
+ }),
108
+ completedLessons: field.int({
109
+ default: 0,
110
+ description: "Number of completed lessons"
111
+ }),
112
+ totalLessons: field.int({
113
+ default: 0,
114
+ description: "Total lessons in course"
115
+ }),
116
+ xpEarned: field.int({
117
+ default: 0,
118
+ description: "XP earned in this course"
119
+ }),
120
+ startedAt: field.dateTime({
121
+ isOptional: true,
122
+ description: "When learner started"
123
+ }),
124
+ completedAt: field.dateTime({
125
+ isOptional: true,
126
+ description: "When learner completed"
127
+ }),
128
+ lastAccessedAt: field.dateTime({
129
+ isOptional: true,
130
+ description: "Last access time"
131
+ }),
132
+ certificateId: field.string({
133
+ isOptional: true,
134
+ description: "Issued certificate ID"
135
+ }),
136
+ metadata: field.json({
137
+ isOptional: true,
138
+ description: "Additional metadata"
139
+ }),
140
+ createdAt: field.createdAt(),
141
+ updatedAt: field.updatedAt(),
142
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
143
+ onDelete: "Cascade"
144
+ }),
145
+ course: field.belongsTo("Course", ["courseId"], ["id"], {
146
+ onDelete: "Cascade"
147
+ })
148
+ },
149
+ indexes: [
150
+ index.unique(["learnerId", "courseId"], { name: "enrollment_unique" }),
151
+ index.on(["learnerId", "status"]),
152
+ index.on(["courseId", "status"])
153
+ ],
154
+ enums: [EnrollmentStatusEnum]
181
155
  });
182
- /**
183
- * LessonProgress entity - tracks individual lesson progress.
184
- */
185
- const LessonProgressEntity = defineEntity({
186
- name: "LessonProgress",
187
- description: "Progress tracking for a lesson.",
188
- schema: "lssm_learning",
189
- map: "lesson_progress",
190
- fields: {
191
- id: field.id({ description: "Unique progress identifier" }),
192
- learnerId: field.foreignKey({ description: "Learner" }),
193
- lessonId: field.foreignKey({ description: "Lesson" }),
194
- status: field.enum("ProgressStatus", {
195
- default: "NOT_STARTED",
196
- description: "Progress status"
197
- }),
198
- progress: field.int({
199
- default: 0,
200
- description: "Completion percentage (0-100)"
201
- }),
202
- score: field.int({
203
- isOptional: true,
204
- description: "Score achieved (for quizzes)"
205
- }),
206
- attempts: field.int({
207
- default: 0,
208
- description: "Number of attempts"
209
- }),
210
- bestScore: field.int({
211
- isOptional: true,
212
- description: "Best score across attempts"
213
- }),
214
- timeSpent: field.int({
215
- default: 0,
216
- description: "Time spent in seconds"
217
- }),
218
- xpEarned: field.int({
219
- default: 0,
220
- description: "XP earned from this lesson"
221
- }),
222
- startedAt: field.dateTime({
223
- isOptional: true,
224
- description: "When started"
225
- }),
226
- completedAt: field.dateTime({
227
- isOptional: true,
228
- description: "When completed"
229
- }),
230
- lastAccessedAt: field.dateTime({
231
- isOptional: true,
232
- description: "Last access time"
233
- }),
234
- bookmarks: field.json({
235
- isOptional: true,
236
- description: "Content bookmarks"
237
- }),
238
- notes: field.string({
239
- isOptional: true,
240
- description: "Learner notes"
241
- }),
242
- createdAt: field.createdAt(),
243
- updatedAt: field.updatedAt(),
244
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
245
- lesson: field.belongsTo("Lesson", ["lessonId"], ["id"], { onDelete: "Cascade" })
246
- },
247
- indexes: [
248
- index.unique(["learnerId", "lessonId"], { name: "lesson_progress_unique" }),
249
- index.on(["learnerId", "status"]),
250
- index.on(["lessonId"])
251
- ],
252
- enums: [ProgressStatusEnum]
156
+ var LessonProgressEntity = defineEntity({
157
+ name: "LessonProgress",
158
+ description: "Progress tracking for a lesson.",
159
+ schema: "lssm_learning",
160
+ map: "lesson_progress",
161
+ fields: {
162
+ id: field.id({ description: "Unique progress identifier" }),
163
+ learnerId: field.foreignKey({ description: "Learner" }),
164
+ lessonId: field.foreignKey({ description: "Lesson" }),
165
+ status: field.enum("ProgressStatus", {
166
+ default: "NOT_STARTED",
167
+ description: "Progress status"
168
+ }),
169
+ progress: field.int({
170
+ default: 0,
171
+ description: "Completion percentage (0-100)"
172
+ }),
173
+ score: field.int({
174
+ isOptional: true,
175
+ description: "Score achieved (for quizzes)"
176
+ }),
177
+ attempts: field.int({ default: 0, description: "Number of attempts" }),
178
+ bestScore: field.int({
179
+ isOptional: true,
180
+ description: "Best score across attempts"
181
+ }),
182
+ timeSpent: field.int({ default: 0, description: "Time spent in seconds" }),
183
+ xpEarned: field.int({
184
+ default: 0,
185
+ description: "XP earned from this lesson"
186
+ }),
187
+ startedAt: field.dateTime({
188
+ isOptional: true,
189
+ description: "When started"
190
+ }),
191
+ completedAt: field.dateTime({
192
+ isOptional: true,
193
+ description: "When completed"
194
+ }),
195
+ lastAccessedAt: field.dateTime({
196
+ isOptional: true,
197
+ description: "Last access time"
198
+ }),
199
+ bookmarks: field.json({
200
+ isOptional: true,
201
+ description: "Content bookmarks"
202
+ }),
203
+ notes: field.string({ isOptional: true, description: "Learner notes" }),
204
+ createdAt: field.createdAt(),
205
+ updatedAt: field.updatedAt(),
206
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
207
+ onDelete: "Cascade"
208
+ }),
209
+ lesson: field.belongsTo("Lesson", ["lessonId"], ["id"], {
210
+ onDelete: "Cascade"
211
+ })
212
+ },
213
+ indexes: [
214
+ index.unique(["learnerId", "lessonId"], { name: "lesson_progress_unique" }),
215
+ index.on(["learnerId", "status"]),
216
+ index.on(["lessonId"])
217
+ ],
218
+ enums: [ProgressStatusEnum]
253
219
  });
254
- /**
255
- * ModuleCompletion entity - tracks module completion.
256
- */
257
- const ModuleCompletionEntity = defineEntity({
258
- name: "ModuleCompletion",
259
- description: "Module completion record.",
260
- schema: "lssm_learning",
261
- map: "module_completion",
262
- fields: {
263
- id: field.id({ description: "Unique completion identifier" }),
264
- learnerId: field.foreignKey({ description: "Learner" }),
265
- moduleId: field.foreignKey({ description: "Module" }),
266
- score: field.int({
267
- isOptional: true,
268
- description: "Average score"
269
- }),
270
- xpEarned: field.int({
271
- default: 0,
272
- description: "XP earned"
273
- }),
274
- timeSpent: field.int({
275
- default: 0,
276
- description: "Time spent in seconds"
277
- }),
278
- completedAt: field.dateTime({ description: "When completed" }),
279
- createdAt: field.createdAt(),
280
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
281
- module: field.belongsTo("CourseModule", ["moduleId"], ["id"], { onDelete: "Cascade" })
282
- },
283
- indexes: [index.unique(["learnerId", "moduleId"], { name: "module_completion_unique" }), index.on(["learnerId", "completedAt"])]
220
+ var ModuleCompletionEntity = defineEntity({
221
+ name: "ModuleCompletion",
222
+ description: "Module completion record.",
223
+ schema: "lssm_learning",
224
+ map: "module_completion",
225
+ fields: {
226
+ id: field.id({ description: "Unique completion identifier" }),
227
+ learnerId: field.foreignKey({ description: "Learner" }),
228
+ moduleId: field.foreignKey({ description: "Module" }),
229
+ score: field.int({ isOptional: true, description: "Average score" }),
230
+ xpEarned: field.int({ default: 0, description: "XP earned" }),
231
+ timeSpent: field.int({ default: 0, description: "Time spent in seconds" }),
232
+ completedAt: field.dateTime({ description: "When completed" }),
233
+ createdAt: field.createdAt(),
234
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
235
+ onDelete: "Cascade"
236
+ }),
237
+ module: field.belongsTo("CourseModule", ["moduleId"], ["id"], {
238
+ onDelete: "Cascade"
239
+ })
240
+ },
241
+ indexes: [
242
+ index.unique(["learnerId", "moduleId"], {
243
+ name: "module_completion_unique"
244
+ }),
245
+ index.on(["learnerId", "completedAt"])
246
+ ]
284
247
  });
285
- /**
286
- * Certificate entity - course completion certificate.
287
- */
288
- const CertificateEntity = defineEntity({
289
- name: "Certificate",
290
- description: "Course completion certificate.",
291
- schema: "lssm_learning",
292
- map: "certificate",
293
- fields: {
294
- id: field.id({ description: "Unique certificate identifier" }),
295
- learnerId: field.foreignKey({ description: "Certificate holder" }),
296
- courseId: field.foreignKey({ description: "Completed course" }),
297
- enrollmentId: field.foreignKey({ description: "Associated enrollment" }),
298
- certificateNumber: field.string({
299
- isUnique: true,
300
- description: "Unique certificate number"
301
- }),
302
- title: field.string({ description: "Certificate title" }),
303
- description: field.string({
304
- isOptional: true,
305
- description: "Certificate description"
306
- }),
307
- score: field.int({
308
- isOptional: true,
309
- description: "Final score"
310
- }),
311
- grade: field.string({
312
- isOptional: true,
313
- description: "Grade awarded"
314
- }),
315
- issuedAt: field.dateTime({ description: "When issued" }),
316
- validUntil: field.dateTime({
317
- isOptional: true,
318
- description: "Expiration date"
319
- }),
320
- verificationUrl: field.string({
321
- isOptional: true,
322
- description: "Verification URL"
323
- }),
324
- credentialHash: field.string({
325
- isOptional: true,
326
- description: "Credential hash for verification"
327
- }),
328
- isRevoked: field.boolean({
329
- default: false,
330
- description: "Whether certificate is revoked"
331
- }),
332
- revokedAt: field.dateTime({
333
- isOptional: true,
334
- description: "When revoked"
335
- }),
336
- revokedReason: field.string({
337
- isOptional: true,
338
- description: "Revocation reason"
339
- }),
340
- metadata: field.json({
341
- isOptional: true,
342
- description: "Additional metadata"
343
- }),
344
- createdAt: field.createdAt(),
345
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], { onDelete: "Cascade" }),
346
- course: field.belongsTo("Course", ["courseId"], ["id"], { onDelete: "Cascade" })
347
- },
348
- indexes: [
349
- index.on(["learnerId"]),
350
- index.on(["courseId"]),
351
- index.on(["issuedAt"])
352
- ]
248
+ var CertificateEntity = defineEntity({
249
+ name: "Certificate",
250
+ description: "Course completion certificate.",
251
+ schema: "lssm_learning",
252
+ map: "certificate",
253
+ fields: {
254
+ id: field.id({ description: "Unique certificate identifier" }),
255
+ learnerId: field.foreignKey({ description: "Certificate holder" }),
256
+ courseId: field.foreignKey({ description: "Completed course" }),
257
+ enrollmentId: field.foreignKey({ description: "Associated enrollment" }),
258
+ certificateNumber: field.string({
259
+ isUnique: true,
260
+ description: "Unique certificate number"
261
+ }),
262
+ title: field.string({ description: "Certificate title" }),
263
+ description: field.string({
264
+ isOptional: true,
265
+ description: "Certificate description"
266
+ }),
267
+ score: field.int({ isOptional: true, description: "Final score" }),
268
+ grade: field.string({ isOptional: true, description: "Grade awarded" }),
269
+ issuedAt: field.dateTime({ description: "When issued" }),
270
+ validUntil: field.dateTime({
271
+ isOptional: true,
272
+ description: "Expiration date"
273
+ }),
274
+ verificationUrl: field.string({
275
+ isOptional: true,
276
+ description: "Verification URL"
277
+ }),
278
+ credentialHash: field.string({
279
+ isOptional: true,
280
+ description: "Credential hash for verification"
281
+ }),
282
+ isRevoked: field.boolean({
283
+ default: false,
284
+ description: "Whether certificate is revoked"
285
+ }),
286
+ revokedAt: field.dateTime({
287
+ isOptional: true,
288
+ description: "When revoked"
289
+ }),
290
+ revokedReason: field.string({
291
+ isOptional: true,
292
+ description: "Revocation reason"
293
+ }),
294
+ metadata: field.json({
295
+ isOptional: true,
296
+ description: "Additional metadata"
297
+ }),
298
+ createdAt: field.createdAt(),
299
+ learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
300
+ onDelete: "Cascade"
301
+ }),
302
+ course: field.belongsTo("Course", ["courseId"], ["id"], {
303
+ onDelete: "Cascade"
304
+ })
305
+ },
306
+ indexes: [
307
+ index.on(["learnerId"]),
308
+ index.on(["courseId"]),
309
+ index.on(["issuedAt"])
310
+ ]
353
311
  });
354
- const learnerEntities = [
355
- LearnerEntity,
356
- EnrollmentEntity,
357
- LessonProgressEntity,
358
- ModuleCompletionEntity,
359
- CertificateEntity
312
+ var learnerEntities = [
313
+ LearnerEntity,
314
+ EnrollmentEntity,
315
+ LessonProgressEntity,
316
+ ModuleCompletionEntity,
317
+ CertificateEntity
360
318
  ];
361
- const learnerEnums = [EnrollmentStatusEnum, ProgressStatusEnum];
362
-
363
- //#endregion
364
- export { CertificateEntity, EnrollmentEntity, EnrollmentStatusEnum, LearnerEntity, LessonProgressEntity, ModuleCompletionEntity, ProgressStatusEnum, learnerEntities, learnerEnums };
365
- //# sourceMappingURL=learner.js.map
319
+ var learnerEnums = [EnrollmentStatusEnum, ProgressStatusEnum];
320
+ export {
321
+ learnerEnums,
322
+ learnerEntities,
323
+ ProgressStatusEnum,
324
+ ModuleCompletionEntity,
325
+ LessonProgressEntity,
326
+ LearnerEntity,
327
+ EnrollmentStatusEnum,
328
+ EnrollmentEntity,
329
+ CertificateEntity
330
+ };