@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,334 +1,2 @@
1
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."
20
- });
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."
26
- });
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
- locale: field.string({
56
- isOptional: true,
57
- description: 'Preferred locale for learning content (e.g. "en", "fr", "es")'
58
- }),
59
- timezone: field.string({
60
- default: '"UTC"',
61
- description: "Learner timezone"
62
- }),
63
- dailyGoalXp: field.int({ default: 50, description: "Daily XP goal" }),
64
- reminderEnabled: field.boolean({
65
- default: true,
66
- description: "Enable reminders"
67
- }),
68
- reminderTime: field.string({
69
- isOptional: true,
70
- description: "Preferred reminder time"
71
- }),
72
- orgId: field.string({
73
- isOptional: true,
74
- description: "Organization scope"
75
- }),
76
- metadata: field.json({
77
- isOptional: true,
78
- description: "Additional metadata"
79
- }),
80
- createdAt: field.createdAt(),
81
- updatedAt: field.updatedAt(),
82
- enrollments: field.hasMany("Enrollment"),
83
- lessonProgress: field.hasMany("LessonProgress"),
84
- achievements: field.hasMany("LearnerAchievement"),
85
- decks: field.hasMany("Deck"),
86
- profile: field.hasOne("LearnerProfile")
87
- },
88
- indexes: [
89
- index.on(["orgId"]),
90
- index.on(["totalXp"]),
91
- index.on(["level"]),
92
- index.on(["currentStreak"])
93
- ]
94
- });
95
- var EnrollmentEntity = defineEntity({
96
- name: "Enrollment",
97
- description: "A learner enrollment in a course.",
98
- schema: "lssm_learning",
99
- map: "enrollment",
100
- fields: {
101
- id: field.id({ description: "Unique enrollment identifier" }),
102
- learnerId: field.foreignKey({ description: "Enrolled learner" }),
103
- courseId: field.foreignKey({ description: "Enrolled course" }),
104
- status: field.enum("EnrollmentStatus", {
105
- default: "ENROLLED",
106
- description: "Enrollment status"
107
- }),
108
- progress: field.int({
109
- default: 0,
110
- description: "Completion percentage (0-100)"
111
- }),
112
- completedLessons: field.int({
113
- default: 0,
114
- description: "Number of completed lessons"
115
- }),
116
- totalLessons: field.int({
117
- default: 0,
118
- description: "Total lessons in course"
119
- }),
120
- xpEarned: field.int({
121
- default: 0,
122
- description: "XP earned in this course"
123
- }),
124
- startedAt: field.dateTime({
125
- isOptional: true,
126
- description: "When learner started"
127
- }),
128
- completedAt: field.dateTime({
129
- isOptional: true,
130
- description: "When learner completed"
131
- }),
132
- lastAccessedAt: field.dateTime({
133
- isOptional: true,
134
- description: "Last access time"
135
- }),
136
- certificateId: field.string({
137
- isOptional: true,
138
- description: "Issued certificate ID"
139
- }),
140
- metadata: field.json({
141
- isOptional: true,
142
- description: "Additional metadata"
143
- }),
144
- createdAt: field.createdAt(),
145
- updatedAt: field.updatedAt(),
146
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
147
- onDelete: "Cascade"
148
- }),
149
- course: field.belongsTo("Course", ["courseId"], ["id"], {
150
- onDelete: "Cascade"
151
- })
152
- },
153
- indexes: [
154
- index.unique(["learnerId", "courseId"], { name: "enrollment_unique" }),
155
- index.on(["learnerId", "status"]),
156
- index.on(["courseId", "status"])
157
- ],
158
- enums: [EnrollmentStatusEnum]
159
- });
160
- var LessonProgressEntity = defineEntity({
161
- name: "LessonProgress",
162
- description: "Progress tracking for a lesson.",
163
- schema: "lssm_learning",
164
- map: "lesson_progress",
165
- fields: {
166
- id: field.id({ description: "Unique progress identifier" }),
167
- learnerId: field.foreignKey({ description: "Learner" }),
168
- lessonId: field.foreignKey({ description: "Lesson" }),
169
- status: field.enum("ProgressStatus", {
170
- default: "NOT_STARTED",
171
- description: "Progress status"
172
- }),
173
- progress: field.int({
174
- default: 0,
175
- description: "Completion percentage (0-100)"
176
- }),
177
- score: field.int({
178
- isOptional: true,
179
- description: "Score achieved (for quizzes)"
180
- }),
181
- attempts: field.int({ default: 0, description: "Number of attempts" }),
182
- bestScore: field.int({
183
- isOptional: true,
184
- description: "Best score across attempts"
185
- }),
186
- timeSpent: field.int({ default: 0, description: "Time spent in seconds" }),
187
- xpEarned: field.int({
188
- default: 0,
189
- description: "XP earned from this lesson"
190
- }),
191
- startedAt: field.dateTime({
192
- isOptional: true,
193
- description: "When started"
194
- }),
195
- completedAt: field.dateTime({
196
- isOptional: true,
197
- description: "When completed"
198
- }),
199
- lastAccessedAt: field.dateTime({
200
- isOptional: true,
201
- description: "Last access time"
202
- }),
203
- bookmarks: field.json({
204
- isOptional: true,
205
- description: "Content bookmarks"
206
- }),
207
- notes: field.string({ isOptional: true, description: "Learner notes" }),
208
- createdAt: field.createdAt(),
209
- updatedAt: field.updatedAt(),
210
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
211
- onDelete: "Cascade"
212
- }),
213
- lesson: field.belongsTo("Lesson", ["lessonId"], ["id"], {
214
- onDelete: "Cascade"
215
- })
216
- },
217
- indexes: [
218
- index.unique(["learnerId", "lessonId"], { name: "lesson_progress_unique" }),
219
- index.on(["learnerId", "status"]),
220
- index.on(["lessonId"])
221
- ],
222
- enums: [ProgressStatusEnum]
223
- });
224
- var ModuleCompletionEntity = defineEntity({
225
- name: "ModuleCompletion",
226
- description: "Module completion record.",
227
- schema: "lssm_learning",
228
- map: "module_completion",
229
- fields: {
230
- id: field.id({ description: "Unique completion identifier" }),
231
- learnerId: field.foreignKey({ description: "Learner" }),
232
- moduleId: field.foreignKey({ description: "Module" }),
233
- score: field.int({ isOptional: true, description: "Average score" }),
234
- xpEarned: field.int({ default: 0, description: "XP earned" }),
235
- timeSpent: field.int({ default: 0, description: "Time spent in seconds" }),
236
- completedAt: field.dateTime({ description: "When completed" }),
237
- createdAt: field.createdAt(),
238
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
239
- onDelete: "Cascade"
240
- }),
241
- module: field.belongsTo("CourseModule", ["moduleId"], ["id"], {
242
- onDelete: "Cascade"
243
- })
244
- },
245
- indexes: [
246
- index.unique(["learnerId", "moduleId"], {
247
- name: "module_completion_unique"
248
- }),
249
- index.on(["learnerId", "completedAt"])
250
- ]
251
- });
252
- var CertificateEntity = defineEntity({
253
- name: "Certificate",
254
- description: "Course completion certificate.",
255
- schema: "lssm_learning",
256
- map: "certificate",
257
- fields: {
258
- id: field.id({ description: "Unique certificate identifier" }),
259
- learnerId: field.foreignKey({ description: "Certificate holder" }),
260
- courseId: field.foreignKey({ description: "Completed course" }),
261
- enrollmentId: field.foreignKey({ description: "Associated enrollment" }),
262
- certificateNumber: field.string({
263
- isUnique: true,
264
- description: "Unique certificate number"
265
- }),
266
- title: field.string({ description: "Certificate title" }),
267
- description: field.string({
268
- isOptional: true,
269
- description: "Certificate description"
270
- }),
271
- score: field.int({ isOptional: true, description: "Final score" }),
272
- grade: field.string({ isOptional: true, description: "Grade awarded" }),
273
- issuedAt: field.dateTime({ description: "When issued" }),
274
- validUntil: field.dateTime({
275
- isOptional: true,
276
- description: "Expiration date"
277
- }),
278
- verificationUrl: field.string({
279
- isOptional: true,
280
- description: "Verification URL"
281
- }),
282
- credentialHash: field.string({
283
- isOptional: true,
284
- description: "Credential hash for verification"
285
- }),
286
- isRevoked: field.boolean({
287
- default: false,
288
- description: "Whether certificate is revoked"
289
- }),
290
- revokedAt: field.dateTime({
291
- isOptional: true,
292
- description: "When revoked"
293
- }),
294
- revokedReason: field.string({
295
- isOptional: true,
296
- description: "Revocation reason"
297
- }),
298
- metadata: field.json({
299
- isOptional: true,
300
- description: "Additional metadata"
301
- }),
302
- createdAt: field.createdAt(),
303
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
304
- onDelete: "Cascade"
305
- }),
306
- course: field.belongsTo("Course", ["courseId"], ["id"], {
307
- onDelete: "Cascade"
308
- })
309
- },
310
- indexes: [
311
- index.on(["learnerId"]),
312
- index.on(["courseId"]),
313
- index.on(["issuedAt"])
314
- ]
315
- });
316
- var learnerEntities = [
317
- LearnerEntity,
318
- EnrollmentEntity,
319
- LessonProgressEntity,
320
- ModuleCompletionEntity,
321
- CertificateEntity
322
- ];
323
- var learnerEnums = [EnrollmentStatusEnum, ProgressStatusEnum];
324
- export {
325
- learnerEnums,
326
- learnerEntities,
327
- ProgressStatusEnum,
328
- ModuleCompletionEntity,
329
- LessonProgressEntity,
330
- LearnerEntity,
331
- EnrollmentStatusEnum,
332
- EnrollmentEntity,
333
- CertificateEntity
334
- };
2
+ import{defineEntity as q,defineEntityEnum as v,field as j,index as k}from"@contractspec/lib.schema";var w=v({name:"EnrollmentStatus",values:["ENROLLED","IN_PROGRESS","COMPLETED","DROPPED","EXPIRED"],schema:"lssm_learning",description:"Status of a course enrollment."}),z=v({name:"ProgressStatus",values:["NOT_STARTED","IN_PROGRESS","COMPLETED","SKIPPED"],schema:"lssm_learning",description:"Status of lesson progress."}),A=q({name:"Learner",description:"A learner profile.",schema:"lssm_learning",map:"learner",fields:{id:j.id({description:"Unique learner identifier"}),userId:j.string({isUnique:!0,description:"Associated user ID"}),displayName:j.string({isOptional:!0,description:"Display name"}),avatarUrl:j.string({isOptional:!0,description:"Avatar URL"}),bio:j.string({isOptional:!0,description:"Short bio"}),level:j.int({default:1,description:"Current level"}),totalXp:j.int({default:0,description:"Total XP earned"}),currentStreak:j.int({default:0,description:"Current streak days"}),longestStreak:j.int({default:0,description:"Longest streak ever"}),lastActivityAt:j.dateTime({isOptional:!0,description:"Last learning activity"}),locale:j.string({isOptional:!0,description:'Preferred locale for learning content (e.g. "en", "fr", "es")'}),timezone:j.string({default:'"UTC"',description:"Learner timezone"}),dailyGoalXp:j.int({default:50,description:"Daily XP goal"}),reminderEnabled:j.boolean({default:!0,description:"Enable reminders"}),reminderTime:j.string({isOptional:!0,description:"Preferred reminder time"}),orgId:j.string({isOptional:!0,description:"Organization scope"}),metadata:j.json({isOptional:!0,description:"Additional metadata"}),createdAt:j.createdAt(),updatedAt:j.updatedAt(),enrollments:j.hasMany("Enrollment"),lessonProgress:j.hasMany("LessonProgress"),achievements:j.hasMany("LearnerAchievement"),decks:j.hasMany("Deck"),profile:j.hasOne("LearnerProfile")},indexes:[k.on(["orgId"]),k.on(["totalXp"]),k.on(["level"]),k.on(["currentStreak"])]}),B=q({name:"Enrollment",description:"A learner enrollment in a course.",schema:"lssm_learning",map:"enrollment",fields:{id:j.id({description:"Unique enrollment identifier"}),learnerId:j.foreignKey({description:"Enrolled learner"}),courseId:j.foreignKey({description:"Enrolled course"}),status:j.enum("EnrollmentStatus",{default:"ENROLLED",description:"Enrollment status"}),progress:j.int({default:0,description:"Completion percentage (0-100)"}),completedLessons:j.int({default:0,description:"Number of completed lessons"}),totalLessons:j.int({default:0,description:"Total lessons in course"}),xpEarned:j.int({default:0,description:"XP earned in this course"}),startedAt:j.dateTime({isOptional:!0,description:"When learner started"}),completedAt:j.dateTime({isOptional:!0,description:"When learner completed"}),lastAccessedAt:j.dateTime({isOptional:!0,description:"Last access time"}),certificateId:j.string({isOptional:!0,description:"Issued certificate ID"}),metadata:j.json({isOptional:!0,description:"Additional metadata"}),createdAt:j.createdAt(),updatedAt:j.updatedAt(),learner:j.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"}),course:j.belongsTo("Course",["courseId"],["id"],{onDelete:"Cascade"})},indexes:[k.unique(["learnerId","courseId"],{name:"enrollment_unique"}),k.on(["learnerId","status"]),k.on(["courseId","status"])],enums:[w]}),D=q({name:"LessonProgress",description:"Progress tracking for a lesson.",schema:"lssm_learning",map:"lesson_progress",fields:{id:j.id({description:"Unique progress identifier"}),learnerId:j.foreignKey({description:"Learner"}),lessonId:j.foreignKey({description:"Lesson"}),status:j.enum("ProgressStatus",{default:"NOT_STARTED",description:"Progress status"}),progress:j.int({default:0,description:"Completion percentage (0-100)"}),score:j.int({isOptional:!0,description:"Score achieved (for quizzes)"}),attempts:j.int({default:0,description:"Number of attempts"}),bestScore:j.int({isOptional:!0,description:"Best score across attempts"}),timeSpent:j.int({default:0,description:"Time spent in seconds"}),xpEarned:j.int({default:0,description:"XP earned from this lesson"}),startedAt:j.dateTime({isOptional:!0,description:"When started"}),completedAt:j.dateTime({isOptional:!0,description:"When completed"}),lastAccessedAt:j.dateTime({isOptional:!0,description:"Last access time"}),bookmarks:j.json({isOptional:!0,description:"Content bookmarks"}),notes:j.string({isOptional:!0,description:"Learner notes"}),createdAt:j.createdAt(),updatedAt:j.updatedAt(),learner:j.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"}),lesson:j.belongsTo("Lesson",["lessonId"],["id"],{onDelete:"Cascade"})},indexes:[k.unique(["learnerId","lessonId"],{name:"lesson_progress_unique"}),k.on(["learnerId","status"]),k.on(["lessonId"])],enums:[z]}),F=q({name:"ModuleCompletion",description:"Module completion record.",schema:"lssm_learning",map:"module_completion",fields:{id:j.id({description:"Unique completion identifier"}),learnerId:j.foreignKey({description:"Learner"}),moduleId:j.foreignKey({description:"Module"}),score:j.int({isOptional:!0,description:"Average score"}),xpEarned:j.int({default:0,description:"XP earned"}),timeSpent:j.int({default:0,description:"Time spent in seconds"}),completedAt:j.dateTime({description:"When completed"}),createdAt:j.createdAt(),learner:j.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"}),module:j.belongsTo("CourseModule",["moduleId"],["id"],{onDelete:"Cascade"})},indexes:[k.unique(["learnerId","moduleId"],{name:"module_completion_unique"}),k.on(["learnerId","completedAt"])]}),G=q({name:"Certificate",description:"Course completion certificate.",schema:"lssm_learning",map:"certificate",fields:{id:j.id({description:"Unique certificate identifier"}),learnerId:j.foreignKey({description:"Certificate holder"}),courseId:j.foreignKey({description:"Completed course"}),enrollmentId:j.foreignKey({description:"Associated enrollment"}),certificateNumber:j.string({isUnique:!0,description:"Unique certificate number"}),title:j.string({description:"Certificate title"}),description:j.string({isOptional:!0,description:"Certificate description"}),score:j.int({isOptional:!0,description:"Final score"}),grade:j.string({isOptional:!0,description:"Grade awarded"}),issuedAt:j.dateTime({description:"When issued"}),validUntil:j.dateTime({isOptional:!0,description:"Expiration date"}),verificationUrl:j.string({isOptional:!0,description:"Verification URL"}),credentialHash:j.string({isOptional:!0,description:"Credential hash for verification"}),isRevoked:j.boolean({default:!1,description:"Whether certificate is revoked"}),revokedAt:j.dateTime({isOptional:!0,description:"When revoked"}),revokedReason:j.string({isOptional:!0,description:"Revocation reason"}),metadata:j.json({isOptional:!0,description:"Additional metadata"}),createdAt:j.createdAt(),learner:j.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"}),course:j.belongsTo("Course",["courseId"],["id"],{onDelete:"Cascade"})},indexes:[k.on(["learnerId"]),k.on(["courseId"]),k.on(["issuedAt"])]}),I=[A,B,D,F,G],J=[w,z];export{J as learnerEnums,I as learnerEntities,z as ProgressStatusEnum,F as ModuleCompletionEntity,D as LessonProgressEntity,A as LearnerEntity,w as EnrollmentStatusEnum,B as EnrollmentEntity,G as CertificateEntity};
@@ -1,302 +1,2 @@
1
1
  // @bun
2
- // src/entities/onboarding.ts
3
- import {
4
- defineEntity,
5
- defineEntityEnum,
6
- field,
7
- index
8
- } from "@contractspec/lib.schema";
9
- var OnboardingStepStatusEnum = defineEntityEnum({
10
- name: "OnboardingStepStatus",
11
- values: ["PENDING", "IN_PROGRESS", "COMPLETED", "SKIPPED"],
12
- schema: "lssm_learning",
13
- description: "Status of an onboarding step."
14
- });
15
- var OnboardingTrackEntity = defineEntity({
16
- name: "OnboardingTrack",
17
- description: "An onboarding track for a product.",
18
- schema: "lssm_learning",
19
- map: "onboarding_track",
20
- fields: {
21
- id: field.id({ description: "Unique track identifier" }),
22
- productId: field.string({ description: "Product this track is for" }),
23
- name: field.string({ description: "Track name" }),
24
- description: field.string({
25
- isOptional: true,
26
- description: "Track description"
27
- }),
28
- targetUserSegment: field.string({
29
- isOptional: true,
30
- description: "Target user segment"
31
- }),
32
- targetRole: field.string({
33
- isOptional: true,
34
- description: "Target user role"
35
- }),
36
- welcomeTitle: field.string({
37
- isOptional: true,
38
- description: "Welcome message title"
39
- }),
40
- welcomeMessage: field.string({
41
- isOptional: true,
42
- description: "Welcome message"
43
- }),
44
- completionTitle: field.string({
45
- isOptional: true,
46
- description: "Completion message title"
47
- }),
48
- completionMessage: field.string({
49
- isOptional: true,
50
- description: "Completion message"
51
- }),
52
- isActive: field.boolean({
53
- default: true,
54
- description: "Whether track is active"
55
- }),
56
- isRequired: field.boolean({
57
- default: false,
58
- description: "Whether track is required"
59
- }),
60
- canSkip: field.boolean({
61
- default: true,
62
- description: "Whether steps can be skipped"
63
- }),
64
- totalXp: field.int({
65
- default: 100,
66
- description: "Total XP for completing track"
67
- }),
68
- completionXpBonus: field.int({
69
- isOptional: true,
70
- description: "Bonus XP for completing track"
71
- }),
72
- completionBadgeKey: field.string({
73
- isOptional: true,
74
- description: "Badge awarded on completion"
75
- }),
76
- streakHoursWindow: field.int({
77
- isOptional: true,
78
- description: "Hours window to finish for streak bonus"
79
- }),
80
- streakBonusXp: field.int({
81
- isOptional: true,
82
- description: "Bonus XP if completed within streak window"
83
- }),
84
- orgId: field.string({
85
- isOptional: true,
86
- description: "Organization scope"
87
- }),
88
- metadata: field.json({
89
- isOptional: true,
90
- description: "Additional metadata"
91
- }),
92
- createdAt: field.createdAt(),
93
- updatedAt: field.updatedAt(),
94
- steps: field.hasMany("OnboardingStep"),
95
- progress: field.hasMany("OnboardingProgress")
96
- },
97
- indexes: [
98
- index.on(["productId", "isActive"]),
99
- index.on(["orgId"]),
100
- index.unique(["productId", "targetUserSegment", "targetRole"], {
101
- name: "onboarding_track_target"
102
- })
103
- ]
104
- });
105
- var OnboardingStepEntity = defineEntity({
106
- name: "OnboardingStep",
107
- description: "A step in an onboarding track.",
108
- schema: "lssm_learning",
109
- map: "onboarding_step",
110
- fields: {
111
- id: field.id({ description: "Unique step identifier" }),
112
- trackId: field.foreignKey({ description: "Parent track" }),
113
- title: field.string({ description: "Step title" }),
114
- description: field.string({
115
- isOptional: true,
116
- description: "Step description"
117
- }),
118
- instructions: field.string({
119
- isOptional: true,
120
- description: "How to complete the step"
121
- }),
122
- helpUrl: field.string({
123
- isOptional: true,
124
- description: "Link to help documentation"
125
- }),
126
- order: field.int({ default: 0, description: "Display order" }),
127
- triggerEvent: field.string({
128
- isOptional: true,
129
- description: "Event that triggers step start"
130
- }),
131
- completionEvent: field.string({
132
- description: "Event that completes the step"
133
- }),
134
- completionEventVersion: field.int({
135
- isOptional: true,
136
- description: "Version of the completion event"
137
- }),
138
- completionSourceModule: field.string({
139
- isOptional: true,
140
- description: "Module emitting the completion event"
141
- }),
142
- completionEventFilter: field.json({
143
- isOptional: true,
144
- description: "Filter for completion event"
145
- }),
146
- actionUrl: field.string({
147
- isOptional: true,
148
- description: "URL to navigate to complete"
149
- }),
150
- actionLabel: field.string({
151
- isOptional: true,
152
- description: "Action button label"
153
- }),
154
- highlightSelector: field.string({
155
- isOptional: true,
156
- description: "CSS selector to highlight"
157
- }),
158
- tooltipPosition: field.string({
159
- isOptional: true,
160
- description: "Tooltip position"
161
- }),
162
- xpReward: field.int({ default: 10, description: "XP for completing step" }),
163
- isRequired: field.boolean({
164
- default: true,
165
- description: "Whether step is required"
166
- }),
167
- canSkip: field.boolean({
168
- default: true,
169
- description: "Whether step can be skipped"
170
- }),
171
- metadata: field.json({
172
- isOptional: true,
173
- description: "Additional metadata"
174
- }),
175
- createdAt: field.createdAt(),
176
- updatedAt: field.updatedAt(),
177
- track: field.belongsTo("OnboardingTrack", ["trackId"], ["id"], {
178
- onDelete: "Cascade"
179
- })
180
- },
181
- indexes: [index.on(["trackId", "order"]), index.on(["completionEvent"])]
182
- });
183
- var OnboardingProgressEntity = defineEntity({
184
- name: "OnboardingProgress",
185
- description: "Tracks user progress through an onboarding track.",
186
- schema: "lssm_learning",
187
- map: "onboarding_progress",
188
- fields: {
189
- id: field.id({ description: "Unique progress identifier" }),
190
- learnerId: field.foreignKey({ description: "Learner" }),
191
- trackId: field.foreignKey({ description: "Onboarding track" }),
192
- currentStepId: field.string({
193
- isOptional: true,
194
- description: "Current step ID"
195
- }),
196
- completedSteps: field.json({
197
- default: "[]",
198
- description: "Array of completed step IDs"
199
- }),
200
- skippedSteps: field.json({
201
- default: "[]",
202
- description: "Array of skipped step IDs"
203
- }),
204
- progress: field.int({
205
- default: 0,
206
- description: "Completion percentage (0-100)"
207
- }),
208
- isCompleted: field.boolean({
209
- default: false,
210
- description: "Whether track is completed"
211
- }),
212
- xpEarned: field.int({ default: 0, description: "XP earned from track" }),
213
- startedAt: field.dateTime({ description: "When user started" }),
214
- completedAt: field.dateTime({
215
- isOptional: true,
216
- description: "When user completed"
217
- }),
218
- lastActivityAt: field.dateTime({
219
- isOptional: true,
220
- description: "Last activity"
221
- }),
222
- isDismissed: field.boolean({
223
- default: false,
224
- description: "Whether user dismissed onboarding"
225
- }),
226
- dismissedAt: field.dateTime({
227
- isOptional: true,
228
- description: "When dismissed"
229
- }),
230
- metadata: field.json({
231
- isOptional: true,
232
- description: "Additional metadata"
233
- }),
234
- createdAt: field.createdAt(),
235
- updatedAt: field.updatedAt(),
236
- learner: field.belongsTo("Learner", ["learnerId"], ["id"], {
237
- onDelete: "Cascade"
238
- }),
239
- track: field.belongsTo("OnboardingTrack", ["trackId"], ["id"], {
240
- onDelete: "Cascade"
241
- })
242
- },
243
- indexes: [
244
- index.unique(["learnerId", "trackId"], {
245
- name: "onboarding_progress_unique"
246
- }),
247
- index.on(["learnerId", "isCompleted"]),
248
- index.on(["trackId"])
249
- ],
250
- enums: [OnboardingStepStatusEnum]
251
- });
252
- var OnboardingStepCompletionEntity = defineEntity({
253
- name: "OnboardingStepCompletion",
254
- description: "Individual step completion record.",
255
- schema: "lssm_learning",
256
- map: "onboarding_step_completion",
257
- fields: {
258
- id: field.id({ description: "Unique completion identifier" }),
259
- progressId: field.foreignKey({ description: "Parent progress record" }),
260
- stepId: field.foreignKey({ description: "Completed step" }),
261
- status: field.enum("OnboardingStepStatus", {
262
- description: "Completion status"
263
- }),
264
- xpEarned: field.int({ default: 0, description: "XP earned" }),
265
- triggeringEvent: field.string({
266
- isOptional: true,
267
- description: "Event that triggered completion"
268
- }),
269
- eventPayload: field.json({
270
- isOptional: true,
271
- description: "Event payload"
272
- }),
273
- completedAt: field.dateTime({ description: "When completed" }),
274
- createdAt: field.createdAt(),
275
- progress: field.belongsTo("OnboardingProgress", ["progressId"], ["id"], {
276
- onDelete: "Cascade"
277
- }),
278
- step: field.belongsTo("OnboardingStep", ["stepId"], ["id"], {
279
- onDelete: "Cascade"
280
- })
281
- },
282
- indexes: [
283
- index.unique(["progressId", "stepId"], { name: "step_completion_unique" }),
284
- index.on(["completedAt"])
285
- ]
286
- });
287
- var onboardingEntities = [
288
- OnboardingTrackEntity,
289
- OnboardingStepEntity,
290
- OnboardingProgressEntity,
291
- OnboardingStepCompletionEntity
292
- ];
293
- var onboardingEnums = [OnboardingStepStatusEnum];
294
- export {
295
- onboardingEnums,
296
- onboardingEntities,
297
- OnboardingTrackEntity,
298
- OnboardingStepStatusEnum,
299
- OnboardingStepEntity,
300
- OnboardingStepCompletionEntity,
301
- OnboardingProgressEntity
302
- };
2
+ import{defineEntity as w,defineEntityEnum as A,field as j,index as q}from"@contractspec/lib.schema";var z=A({name:"OnboardingStepStatus",values:["PENDING","IN_PROGRESS","COMPLETED","SKIPPED"],schema:"lssm_learning",description:"Status of an onboarding step."}),B=w({name:"OnboardingTrack",description:"An onboarding track for a product.",schema:"lssm_learning",map:"onboarding_track",fields:{id:j.id({description:"Unique track identifier"}),productId:j.string({description:"Product this track is for"}),name:j.string({description:"Track name"}),description:j.string({isOptional:!0,description:"Track description"}),targetUserSegment:j.string({isOptional:!0,description:"Target user segment"}),targetRole:j.string({isOptional:!0,description:"Target user role"}),welcomeTitle:j.string({isOptional:!0,description:"Welcome message title"}),welcomeMessage:j.string({isOptional:!0,description:"Welcome message"}),completionTitle:j.string({isOptional:!0,description:"Completion message title"}),completionMessage:j.string({isOptional:!0,description:"Completion message"}),isActive:j.boolean({default:!0,description:"Whether track is active"}),isRequired:j.boolean({default:!1,description:"Whether track is required"}),canSkip:j.boolean({default:!0,description:"Whether steps can be skipped"}),totalXp:j.int({default:100,description:"Total XP for completing track"}),completionXpBonus:j.int({isOptional:!0,description:"Bonus XP for completing track"}),completionBadgeKey:j.string({isOptional:!0,description:"Badge awarded on completion"}),streakHoursWindow:j.int({isOptional:!0,description:"Hours window to finish for streak bonus"}),streakBonusXp:j.int({isOptional:!0,description:"Bonus XP if completed within streak window"}),orgId:j.string({isOptional:!0,description:"Organization scope"}),metadata:j.json({isOptional:!0,description:"Additional metadata"}),createdAt:j.createdAt(),updatedAt:j.updatedAt(),steps:j.hasMany("OnboardingStep"),progress:j.hasMany("OnboardingProgress")},indexes:[q.on(["productId","isActive"]),q.on(["orgId"]),q.unique(["productId","targetUserSegment","targetRole"],{name:"onboarding_track_target"})]}),D=w({name:"OnboardingStep",description:"A step in an onboarding track.",schema:"lssm_learning",map:"onboarding_step",fields:{id:j.id({description:"Unique step identifier"}),trackId:j.foreignKey({description:"Parent track"}),title:j.string({description:"Step title"}),description:j.string({isOptional:!0,description:"Step description"}),instructions:j.string({isOptional:!0,description:"How to complete the step"}),helpUrl:j.string({isOptional:!0,description:"Link to help documentation"}),order:j.int({default:0,description:"Display order"}),triggerEvent:j.string({isOptional:!0,description:"Event that triggers step start"}),completionEvent:j.string({description:"Event that completes the step"}),completionEventVersion:j.int({isOptional:!0,description:"Version of the completion event"}),completionSourceModule:j.string({isOptional:!0,description:"Module emitting the completion event"}),completionEventFilter:j.json({isOptional:!0,description:"Filter for completion event"}),actionUrl:j.string({isOptional:!0,description:"URL to navigate to complete"}),actionLabel:j.string({isOptional:!0,description:"Action button label"}),highlightSelector:j.string({isOptional:!0,description:"CSS selector to highlight"}),tooltipPosition:j.string({isOptional:!0,description:"Tooltip position"}),xpReward:j.int({default:10,description:"XP for completing step"}),isRequired:j.boolean({default:!0,description:"Whether step is required"}),canSkip:j.boolean({default:!0,description:"Whether step can be skipped"}),metadata:j.json({isOptional:!0,description:"Additional metadata"}),createdAt:j.createdAt(),updatedAt:j.updatedAt(),track:j.belongsTo("OnboardingTrack",["trackId"],["id"],{onDelete:"Cascade"})},indexes:[q.on(["trackId","order"]),q.on(["completionEvent"])]}),F=w({name:"OnboardingProgress",description:"Tracks user progress through an onboarding track.",schema:"lssm_learning",map:"onboarding_progress",fields:{id:j.id({description:"Unique progress identifier"}),learnerId:j.foreignKey({description:"Learner"}),trackId:j.foreignKey({description:"Onboarding track"}),currentStepId:j.string({isOptional:!0,description:"Current step ID"}),completedSteps:j.json({default:"[]",description:"Array of completed step IDs"}),skippedSteps:j.json({default:"[]",description:"Array of skipped step IDs"}),progress:j.int({default:0,description:"Completion percentage (0-100)"}),isCompleted:j.boolean({default:!1,description:"Whether track is completed"}),xpEarned:j.int({default:0,description:"XP earned from track"}),startedAt:j.dateTime({description:"When user started"}),completedAt:j.dateTime({isOptional:!0,description:"When user completed"}),lastActivityAt:j.dateTime({isOptional:!0,description:"Last activity"}),isDismissed:j.boolean({default:!1,description:"Whether user dismissed onboarding"}),dismissedAt:j.dateTime({isOptional:!0,description:"When dismissed"}),metadata:j.json({isOptional:!0,description:"Additional metadata"}),createdAt:j.createdAt(),updatedAt:j.updatedAt(),learner:j.belongsTo("Learner",["learnerId"],["id"],{onDelete:"Cascade"}),track:j.belongsTo("OnboardingTrack",["trackId"],["id"],{onDelete:"Cascade"})},indexes:[q.unique(["learnerId","trackId"],{name:"onboarding_progress_unique"}),q.on(["learnerId","isCompleted"]),q.on(["trackId"])],enums:[z]}),G=w({name:"OnboardingStepCompletion",description:"Individual step completion record.",schema:"lssm_learning",map:"onboarding_step_completion",fields:{id:j.id({description:"Unique completion identifier"}),progressId:j.foreignKey({description:"Parent progress record"}),stepId:j.foreignKey({description:"Completed step"}),status:j.enum("OnboardingStepStatus",{description:"Completion status"}),xpEarned:j.int({default:0,description:"XP earned"}),triggeringEvent:j.string({isOptional:!0,description:"Event that triggered completion"}),eventPayload:j.json({isOptional:!0,description:"Event payload"}),completedAt:j.dateTime({description:"When completed"}),createdAt:j.createdAt(),progress:j.belongsTo("OnboardingProgress",["progressId"],["id"],{onDelete:"Cascade"}),step:j.belongsTo("OnboardingStep",["stepId"],["id"],{onDelete:"Cascade"})},indexes:[q.unique(["progressId","stepId"],{name:"step_completion_unique"}),q.on(["completedAt"])]}),I=[B,D,F,G],J=[z];export{J as onboardingEnums,I as onboardingEntities,B as OnboardingTrackEntity,z as OnboardingStepStatusEnum,D as OnboardingStepEntity,G as OnboardingStepCompletionEntity,F as OnboardingProgressEntity};