@lxpack/runtime 0.2.0 → 0.2.1

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 (45) hide show
  1. package/dist/client.js +1582 -1341
  2. package/dist/core/completion-evaluator.d.ts +13 -0
  3. package/dist/core/completion-evaluator.d.ts.map +1 -0
  4. package/dist/core/progress-state.d.ts +20 -0
  5. package/dist/core/progress-state.d.ts.map +1 -0
  6. package/dist/flow-conditions.d.ts +4 -0
  7. package/dist/flow-conditions.d.ts.map +1 -0
  8. package/dist/flow.d.ts +2 -2
  9. package/dist/flow.d.ts.map +1 -1
  10. package/dist/lms/bridge.d.ts +11 -0
  11. package/dist/lms/bridge.d.ts.map +1 -0
  12. package/dist/lms/completion-state.d.ts +10 -0
  13. package/dist/lms/completion-state.d.ts.map +1 -0
  14. package/dist/lms/factory.d.ts +5 -0
  15. package/dist/lms/factory.d.ts.map +1 -0
  16. package/dist/lms/local-bridge.d.ts +15 -0
  17. package/dist/lms/local-bridge.d.ts.map +1 -0
  18. package/dist/lms/scorm12-bridge.d.ts +15 -0
  19. package/dist/lms/scorm12-bridge.d.ts.map +1 -0
  20. package/dist/lms/scorm2004-bridge.d.ts +15 -0
  21. package/dist/lms/scorm2004-bridge.d.ts.map +1 -0
  22. package/dist/{progress-persist.d.ts → progress/codec.d.ts} +2 -3
  23. package/dist/progress/codec.d.ts.map +1 -0
  24. package/dist/progress/constants.d.ts +3 -0
  25. package/dist/progress/constants.d.ts.map +1 -0
  26. package/dist/progress/size-policy.d.ts +4 -0
  27. package/dist/progress/size-policy.d.ts.map +1 -0
  28. package/dist/quiz/host.d.ts +9 -0
  29. package/dist/quiz/host.d.ts.map +1 -0
  30. package/dist/quiz/score.d.ts +6 -0
  31. package/dist/quiz/score.d.ts.map +1 -0
  32. package/dist/runtime.d.ts +10 -14
  33. package/dist/runtime.d.ts.map +1 -1
  34. package/dist/runtime.js +276 -562
  35. package/dist/scorm-api.d.ts +1 -1
  36. package/dist/scorm-api.d.ts.map +1 -1
  37. package/dist/scorm12-DpGWvsHb.js +375 -0
  38. package/dist/scorm12.d.ts +3 -0
  39. package/dist/scorm12.d.ts.map +1 -0
  40. package/dist/scorm12.js +11 -0
  41. package/dist/scorm2004.d.ts +2 -0
  42. package/dist/scorm2004.d.ts.map +1 -0
  43. package/dist/scorm2004.js +153 -0
  44. package/package.json +11 -3
  45. package/dist/progress-persist.d.ts.map +0 -1
@@ -23,7 +23,7 @@ export interface ScormApiLike {
23
23
  LMSGetErrorString(errorCode?: string): string;
24
24
  LMSGetDiagnostic(errorCode?: string): string;
25
25
  }
26
- declare const SCORM_SUSPEND_DATA_MAX = 4096;
26
+ import { SCORM_SUSPEND_DATA_MAX } from "./progress/constants.js";
27
27
  export declare function findLmsApi(maxDepth?: number): ScormApiLike | null;
28
28
  export declare class Scorm12Adapter implements ScormApiLike {
29
29
  private api;
@@ -1 +1 @@
1
- {"version":3,"file":"scorm-api.d.ts","sourceRoot":"","sources":["../src/scorm-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scorm-api.d.ts","sourceRoot":"","sources":["../src/scorm-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,375 @@
1
+ var p = Object.defineProperty;
2
+ var L = (e, t, s) => t in e ? p(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
+ var a = (e, t, s) => L(e, typeof t != "symbol" ? t + "" : t, s);
4
+ const A = 4096;
5
+ function u(e) {
6
+ var s;
7
+ const t = {
8
+ c: e.currentLessonId,
9
+ l: e.completedLessons,
10
+ a: e.assessmentScores,
11
+ s: e.suspendData
12
+ };
13
+ return (s = t.l) != null && s.length || delete t.l, (!t.a || !Object.keys(t.a).length) && delete t.a, (!t.s || !Object.keys(t.s).length) && delete t.s, t;
14
+ }
15
+ function g(e, t) {
16
+ return {
17
+ currentLessonId: e.c ?? t.currentLessonId,
18
+ completedLessons: Array.isArray(e.l) ? e.l : t.completedLessons,
19
+ assessmentScores: e.a && typeof e.a == "object" ? e.a : t.assessmentScores,
20
+ suspendData: e.s && typeof e.s == "object" ? e.s : t.suspendData
21
+ };
22
+ }
23
+ function M(e) {
24
+ if (!e || typeof e != "object") return !1;
25
+ const t = e;
26
+ return "currentLessonId" in t || "completedLessons" in t || "assessmentScores" in t;
27
+ }
28
+ function E(e, t) {
29
+ return {
30
+ currentLessonId: e.currentLessonId ?? t.currentLessonId,
31
+ completedLessons: Array.isArray(e.completedLessons) ? e.completedLessons : t.completedLessons,
32
+ assessmentScores: e.assessmentScores && typeof e.assessmentScores == "object" ? e.assessmentScores : t.assessmentScores,
33
+ suspendData: e.suspendData && typeof e.suspendData == "object" ? e.suspendData : t.suspendData
34
+ };
35
+ }
36
+ function y(e, t) {
37
+ try {
38
+ const s = JSON.parse(e);
39
+ return M(s) ? {
40
+ progress: E(s, t),
41
+ parsed: !0
42
+ } : { progress: g(s, t), parsed: !0 };
43
+ } catch {
44
+ return { progress: t, parsed: !1 };
45
+ }
46
+ }
47
+ function c(e, t) {
48
+ return JSON.stringify(u(e)).length <= t;
49
+ }
50
+ function _(e, t) {
51
+ const s = { ...e.suspendData }, i = Object.keys(s).filter((l) => l.startsWith("interaction_")).sort();
52
+ for (const l of i) {
53
+ delete s[l];
54
+ const r = { ...e, suspendData: s };
55
+ if (c(r, t))
56
+ return r;
57
+ }
58
+ return { ...e, suspendData: s };
59
+ }
60
+ function D(e, t) {
61
+ const s = { ...e.suspendData }, i = Object.keys(s).filter((r) => !r.startsWith("interaction_") && !r.startsWith("v:")).sort();
62
+ for (const r of i) {
63
+ delete s[r];
64
+ const d = { ...e, suspendData: s };
65
+ if (c(d, t))
66
+ return d;
67
+ }
68
+ const l = Object.keys(s).filter((r) => r.startsWith("v:")).sort();
69
+ for (const r of l) {
70
+ delete s[r];
71
+ const d = { ...e, suspendData: s };
72
+ if (c(d, t))
73
+ return d;
74
+ }
75
+ return { ...e, suspendData: s };
76
+ }
77
+ function O(e, t) {
78
+ let s = {
79
+ currentLessonId: e.currentLessonId,
80
+ completedLessons: [...e.completedLessons],
81
+ assessmentScores: { ...e.assessmentScores },
82
+ suspendData: {}
83
+ };
84
+ if (c(s, t))
85
+ return JSON.stringify(u(s));
86
+ for (; s.completedLessons.length > 0; )
87
+ if (s.completedLessons.pop(), c(s, t))
88
+ return JSON.stringify(u(s));
89
+ const i = Object.keys(s.assessmentScores);
90
+ for (; i.length > 0; )
91
+ if (delete s.assessmentScores[i.pop()], c(s, t))
92
+ return JSON.stringify(u(s));
93
+ s = {
94
+ currentLessonId: e.currentLessonId,
95
+ completedLessons: [],
96
+ assessmentScores: {},
97
+ suspendData: {}
98
+ };
99
+ const l = JSON.stringify(u(s));
100
+ if (l.length <= t)
101
+ return l;
102
+ const r = JSON.stringify({
103
+ c: e.currentLessonId.slice(0, Math.max(0, t - 20))
104
+ });
105
+ return r.length <= t ? r : JSON.stringify({ c: "" });
106
+ }
107
+ function I(e, t = 4096) {
108
+ if (c(e, t))
109
+ return JSON.stringify(u(e));
110
+ let s = _(e, t);
111
+ return c(s, t) || (s = D(s, t), c(s, t)) ? JSON.stringify(u(s)) : (console.warn(
112
+ `[lxpack] suspend_data exceeds ${t} chars; using minimal progress snapshot`
113
+ ), O(e, t));
114
+ }
115
+ function w(e, t = 4096) {
116
+ if (e.length <= t) return e;
117
+ console.warn(
118
+ `[lxpack] suspend_data exceeds ${t} chars; using minimal progress snapshot`
119
+ );
120
+ try {
121
+ const s = {
122
+ currentLessonId: "",
123
+ completedLessons: [],
124
+ assessmentScores: {},
125
+ suspendData: {}
126
+ }, { progress: i } = y(e, s);
127
+ return I(i, t);
128
+ } catch {
129
+ return JSON.stringify({ c: "" });
130
+ }
131
+ }
132
+ const n = "0", o = "301", S = "302", m = "lxpack_scorm12_preview";
133
+ function N(e = 500) {
134
+ let t = window, s = 0;
135
+ for (; t && s < e; ) {
136
+ try {
137
+ const i = t.API;
138
+ if (i && typeof i.LMSInitialize == "function")
139
+ return i;
140
+ } catch {
141
+ }
142
+ try {
143
+ if (t.parent && t.parent !== t)
144
+ t = t.parent;
145
+ else if (t.opener && !t.opener.closed)
146
+ t = t.opener;
147
+ else
148
+ break;
149
+ } catch {
150
+ break;
151
+ }
152
+ s++;
153
+ }
154
+ return null;
155
+ }
156
+ class b {
157
+ constructor(t) {
158
+ a(this, "api");
159
+ a(this, "initialized", !1);
160
+ a(this, "terminated", !1);
161
+ a(this, "lastError", n);
162
+ this.api = t;
163
+ }
164
+ LMSInitialize() {
165
+ if (this.initialized)
166
+ return this.lastError = o, "false";
167
+ const t = this.api.LMSInitialize("");
168
+ return t === "true" && (this.initialized = !0, this.terminated = !1, this.lastError = n), t;
169
+ }
170
+ LMSFinish() {
171
+ if (!this.initialized || this.terminated)
172
+ return this.lastError = S, "false";
173
+ const t = this.api.LMSFinish("");
174
+ return t === "true" && (this.terminated = !0, this.lastError = n), t;
175
+ }
176
+ LMSGetValue(t) {
177
+ return !this.initialized || this.terminated ? (this.lastError = o, "") : (this.lastError = n, this.api.LMSGetValue(t));
178
+ }
179
+ LMSSetValue(t, s) {
180
+ return !this.initialized || this.terminated ? (this.lastError = o, "false") : (this.lastError = n, this.api.LMSSetValue(t, s));
181
+ }
182
+ LMSCommit() {
183
+ return !this.initialized || this.terminated ? (this.lastError = o, "false") : (this.lastError = n, this.api.LMSCommit(""));
184
+ }
185
+ LMSGetLastError() {
186
+ return this.lastError;
187
+ }
188
+ LMSGetErrorString(t) {
189
+ const s = t ?? this.lastError;
190
+ return s === o ? "Not initialized" : s === S ? "Already terminated" : this.api.LMSGetErrorString(s);
191
+ }
192
+ LMSGetDiagnostic(t) {
193
+ return this.api.LMSGetDiagnostic(t ?? this.lastError);
194
+ }
195
+ setLessonStatus(t) {
196
+ this.LMSSetValue("cmi.core.lesson_status", t);
197
+ }
198
+ setScore(t, s = 100) {
199
+ this.LMSSetValue("cmi.core.score.raw", String(t)), this.LMSSetValue("cmi.core.score.max", String(s)), this.LMSSetValue("cmi.core.score.min", "0");
200
+ }
201
+ setSuspendData(t) {
202
+ const s = f(t);
203
+ this.LMSSetValue("cmi.suspend_data", s);
204
+ }
205
+ setLessonLocation(t) {
206
+ this.LMSSetValue("cmi.core.lesson_location", t);
207
+ }
208
+ }
209
+ class h {
210
+ constructor(t = {}) {
211
+ a(this, "data", {
212
+ lessonStatus: "not attempted",
213
+ scoreRaw: 0,
214
+ scoreMin: 0,
215
+ scoreMax: 100,
216
+ suspendData: "",
217
+ lessonLocation: "",
218
+ entry: "ab-initio",
219
+ exit: "",
220
+ sessionTime: "00:00:00"
221
+ });
222
+ a(this, "initialized", !1);
223
+ a(this, "terminated", !1);
224
+ a(this, "lastError", n);
225
+ a(this, "persistToStorage");
226
+ this.persistToStorage = t.persistToStorage ?? !1, t.initialData && (this.data = { ...this.data, ...t.initialData }), this.persistToStorage && this.loadFromStorage();
227
+ }
228
+ LMSInitialize() {
229
+ return this.initialized ? (this.lastError = o, "false") : (this.initialized = !0, this.terminated = !1, this.lastError = n, "true");
230
+ }
231
+ LMSFinish() {
232
+ return !this.initialized || this.terminated ? (this.lastError = S, "false") : (this.data.exit = "suspend", this.terminated = !0, this.saveToStorage(), this.lastError = n, "true");
233
+ }
234
+ LMSGetValue(t) {
235
+ if (!this.initialized || this.terminated)
236
+ return this.lastError = o, "";
237
+ switch (this.lastError = n, t) {
238
+ case "cmi.core.lesson_status":
239
+ return this.data.lessonStatus;
240
+ case "cmi.core.score.raw":
241
+ return String(this.data.scoreRaw);
242
+ case "cmi.core.score.min":
243
+ return String(this.data.scoreMin);
244
+ case "cmi.core.score.max":
245
+ return String(this.data.scoreMax);
246
+ case "cmi.suspend_data":
247
+ return this.data.suspendData;
248
+ case "cmi.core.lesson_location":
249
+ return this.data.lessonLocation;
250
+ case "cmi.core.student_id":
251
+ return "lxpack-learner";
252
+ case "cmi.core.student_name":
253
+ return "LXPack Learner";
254
+ case "cmi.core.entry":
255
+ return this.data.entry;
256
+ case "cmi.core.exit":
257
+ return this.data.exit;
258
+ case "cmi.core.session_time":
259
+ return this.data.sessionTime;
260
+ default:
261
+ return "";
262
+ }
263
+ }
264
+ LMSSetValue(t, s) {
265
+ if (!this.initialized || this.terminated)
266
+ return this.lastError = o, "false";
267
+ switch (this.lastError = n, t) {
268
+ case "cmi.core.lesson_status":
269
+ this.data.lessonStatus = s;
270
+ break;
271
+ case "cmi.core.score.raw":
272
+ this.data.scoreRaw = Number(s);
273
+ break;
274
+ case "cmi.core.score.min":
275
+ this.data.scoreMin = Number(s);
276
+ break;
277
+ case "cmi.core.score.max":
278
+ this.data.scoreMax = Number(s);
279
+ break;
280
+ case "cmi.suspend_data":
281
+ this.data.suspendData = f(s);
282
+ break;
283
+ case "cmi.core.lesson_location":
284
+ this.data.lessonLocation = s;
285
+ break;
286
+ case "cmi.core.exit":
287
+ this.data.exit = s;
288
+ break;
289
+ case "cmi.core.session_time":
290
+ this.data.sessionTime = s;
291
+ break;
292
+ default:
293
+ return "false";
294
+ }
295
+ return this.saveToStorage(), "true";
296
+ }
297
+ LMSCommit() {
298
+ return !this.initialized || this.terminated ? (this.lastError = o, "false") : (this.saveToStorage(), this.lastError = n, "true");
299
+ }
300
+ LMSGetLastError() {
301
+ return this.lastError;
302
+ }
303
+ LMSGetErrorString(t) {
304
+ const s = t ?? this.lastError;
305
+ return s === o ? "Not initialized" : s === S ? "Already terminated" : "No error";
306
+ }
307
+ LMSGetDiagnostic() {
308
+ return "";
309
+ }
310
+ setLessonStatus(t) {
311
+ this.data.lessonStatus = t, this.saveToStorage();
312
+ }
313
+ setScore(t, s = 100) {
314
+ this.data.scoreRaw = t, this.data.scoreMax = s, this.data.scoreMin = 0, this.saveToStorage();
315
+ }
316
+ setSuspendData(t) {
317
+ this.data.suspendData = f(t), this.saveToStorage();
318
+ }
319
+ setLessonLocation(t) {
320
+ this.data.lessonLocation = t, this.saveToStorage();
321
+ }
322
+ loadFromStorage() {
323
+ try {
324
+ const t = localStorage.getItem(m);
325
+ t && (this.data = { ...this.data, ...JSON.parse(t) });
326
+ } catch {
327
+ }
328
+ }
329
+ saveToStorage() {
330
+ if (this.persistToStorage)
331
+ try {
332
+ localStorage.setItem(m, JSON.stringify(this.data));
333
+ } catch {
334
+ }
335
+ }
336
+ }
337
+ class z extends h {
338
+ constructor() {
339
+ super({ persistToStorage: !0 });
340
+ }
341
+ }
342
+ function f(e) {
343
+ return w(e);
344
+ }
345
+ function T(e) {
346
+ if (e === "preview")
347
+ return new h({ persistToStorage: !0 });
348
+ if (e === "scorm12") {
349
+ const t = N();
350
+ return t ? new b(t) : (console.warn(
351
+ "[lxpack] No LMS SCORM API found; using in-memory simulator (progress will not persist to LMS)"
352
+ ), new h({ persistToStorage: !1 }));
353
+ }
354
+ return new h({ persistToStorage: !1 });
355
+ }
356
+ function R(e = "preview") {
357
+ const t = T(e);
358
+ if (e === "preview") {
359
+ const s = window;
360
+ s.API = t;
361
+ }
362
+ return t;
363
+ }
364
+ export {
365
+ A as S,
366
+ z as a,
367
+ b,
368
+ h as c,
369
+ T as d,
370
+ N as f,
371
+ R as i,
372
+ y as p,
373
+ I as s,
374
+ f as t
375
+ };
@@ -0,0 +1,3 @@
1
+ export { createScormConnection, findLmsApi, Scorm12Adapter, Scorm12Simulator, Scorm12API, installScormAPI, trimSuspendData, } from "./scorm-api.js";
2
+ export { SCORM_SUSPEND_DATA_MAX } from "./progress/constants.js";
3
+ //# sourceMappingURL=scorm12.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorm12.d.ts","sourceRoot":"","sources":["../src/scorm12.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { S as s, a as S, b as o, c as m, d as t, f as c, i, t as A } from "./scorm12-DpGWvsHb.js";
2
+ export {
3
+ s as SCORM_SUSPEND_DATA_MAX,
4
+ S as Scorm12API,
5
+ o as Scorm12Adapter,
6
+ m as Scorm12Simulator,
7
+ t as createScormConnection,
8
+ c as findLmsApi,
9
+ i as installScormAPI,
10
+ A as trimSuspendData
11
+ };
@@ -0,0 +1,2 @@
1
+ export { createScorm2004Connection, findScorm2004Api, Scorm2004Adapter, Scorm2004Simulator, type Scorm2004ApiLike, type Scorm2004Connection, } from "./scorm2004-api.js";
2
+ //# sourceMappingURL=scorm2004.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorm2004.d.ts","sourceRoot":"","sources":["../src/scorm2004.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,153 @@
1
+ var o = Object.defineProperty;
2
+ var c = (i, t, e) => t in i ? o(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
3
+ var a = (i, t, e) => c(i, typeof t != "symbol" ? t + "" : t, e);
4
+ const s = "lxpack_scorm2004_preview";
5
+ function u(i = 500) {
6
+ let t = window, e = 0;
7
+ for (; t && e < i; ) {
8
+ try {
9
+ const r = t.API_1484_11;
10
+ if (r && typeof r.Initialize == "function")
11
+ return r;
12
+ } catch {
13
+ }
14
+ try {
15
+ if (t.parent && t.parent !== t)
16
+ t = t.parent;
17
+ else if (t.opener && !t.opener.closed)
18
+ t = t.opener;
19
+ else
20
+ break;
21
+ } catch {
22
+ break;
23
+ }
24
+ e++;
25
+ }
26
+ return null;
27
+ }
28
+ class n {
29
+ constructor(t) {
30
+ a(this, "initialized", !1);
31
+ a(this, "terminated", !1);
32
+ a(this, "data", {
33
+ "cmi.completion_status": "unknown",
34
+ "cmi.success_status": "unknown",
35
+ "cmi.score.scaled": "",
36
+ "cmi.suspend_data": "",
37
+ "cmi.location": "",
38
+ "cmi.entry": "ab-initio"
39
+ });
40
+ a(this, "persistToStorage");
41
+ if (this.persistToStorage = (t == null ? void 0 : t.persistToStorage) ?? !1, this.persistToStorage)
42
+ try {
43
+ const e = localStorage.getItem(s);
44
+ e && (this.data = { ...this.data, ...JSON.parse(e) });
45
+ } catch {
46
+ }
47
+ }
48
+ save() {
49
+ if (this.persistToStorage)
50
+ try {
51
+ localStorage.setItem(s, JSON.stringify(this.data));
52
+ } catch {
53
+ }
54
+ }
55
+ Initialize() {
56
+ return this.initialized ? "false" : (this.initialized = !0, this.terminated = !1, "true");
57
+ }
58
+ Terminate() {
59
+ return !this.initialized || this.terminated ? "false" : (this.terminated = !0, this.save(), "true");
60
+ }
61
+ GetValue(t) {
62
+ return !this.initialized || this.terminated ? "" : this.data[t] ?? "";
63
+ }
64
+ SetValue(t, e) {
65
+ return !this.initialized || this.terminated ? "false" : (this.data[t] = e, this.save(), "true");
66
+ }
67
+ Commit() {
68
+ return !this.initialized || this.terminated ? "false" : (this.save(), "true");
69
+ }
70
+ GetLastError() {
71
+ return "0";
72
+ }
73
+ GetErrorString() {
74
+ return "No error";
75
+ }
76
+ GetDiagnostic() {
77
+ return "";
78
+ }
79
+ setSuspendData(t) {
80
+ this.data["cmi.suspend_data"] = t;
81
+ }
82
+ setLocation(t) {
83
+ this.data["cmi.location"] = t;
84
+ }
85
+ setCompletionStatus(t) {
86
+ this.data["cmi.completion_status"] = t;
87
+ }
88
+ setSuccessStatus(t) {
89
+ this.data["cmi.success_status"] = t;
90
+ }
91
+ setScoreScaled(t) {
92
+ this.data["cmi.score.scaled"] = String(Math.max(0, Math.min(1, t)));
93
+ }
94
+ }
95
+ class l {
96
+ constructor(t) {
97
+ a(this, "api");
98
+ this.api = t;
99
+ }
100
+ Initialize() {
101
+ return this.api.Initialize("");
102
+ }
103
+ Terminate() {
104
+ return this.api.Terminate("");
105
+ }
106
+ GetValue(t) {
107
+ return this.api.GetValue(t);
108
+ }
109
+ SetValue(t, e) {
110
+ return this.api.SetValue(t, e);
111
+ }
112
+ Commit() {
113
+ return this.api.Commit("");
114
+ }
115
+ GetLastError() {
116
+ return this.api.GetLastError();
117
+ }
118
+ GetErrorString(t) {
119
+ return this.api.GetErrorString(t);
120
+ }
121
+ GetDiagnostic(t) {
122
+ return this.api.GetDiagnostic(t);
123
+ }
124
+ setSuspendData(t) {
125
+ this.api.SetValue("cmi.suspend_data", t);
126
+ }
127
+ setLocation(t) {
128
+ this.api.SetValue("cmi.location", t);
129
+ }
130
+ setCompletionStatus(t) {
131
+ this.api.SetValue("cmi.completion_status", t);
132
+ }
133
+ setSuccessStatus(t) {
134
+ this.api.SetValue("cmi.success_status", t);
135
+ }
136
+ setScoreScaled(t) {
137
+ this.api.SetValue("cmi.score.scaled", String(Math.max(0, Math.min(1, t))));
138
+ }
139
+ }
140
+ function h(i) {
141
+ if (i === "preview")
142
+ return new n({ persistToStorage: !0 });
143
+ const t = u();
144
+ return t ? new l(t) : (console.warn(
145
+ "[lxpack] No SCORM 2004 API found; using in-memory simulator"
146
+ ), new n({ persistToStorage: !1 }));
147
+ }
148
+ export {
149
+ l as Scorm2004Adapter,
150
+ n as Scorm2004Simulator,
151
+ h as createScorm2004Connection,
152
+ u as findScorm2004Api
153
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lxpack/runtime",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Web-native course runtime for LXPack",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -31,7 +31,15 @@
31
31
  "types": "./dist/runtime.d.ts",
32
32
  "import": "./dist/runtime.js"
33
33
  },
34
- "./client": "./dist/client.js"
34
+ "./client": "./dist/client.js",
35
+ "./scorm12": {
36
+ "types": "./dist/scorm12.d.ts",
37
+ "import": "./dist/scorm12.js"
38
+ },
39
+ "./scorm2004": {
40
+ "types": "./dist/scorm2004.d.ts",
41
+ "import": "./dist/scorm2004.js"
42
+ }
35
43
  },
36
44
  "files": [
37
45
  "dist"
@@ -39,7 +47,7 @@
39
47
  "dependencies": {
40
48
  "marked": "^15.0.7",
41
49
  "yaml": "^2.7.0",
42
- "@lxpack/validators": "0.2.0"
50
+ "@lxpack/validators": "0.2.1"
43
51
  },
44
52
  "devDependencies": {
45
53
  "@types/node": "^22.13.10",
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress-persist.d.ts","sourceRoot":"","sources":["../src/progress-persist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,UAAU,eAAe;IACvB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,CAWzE;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,GACvB,cAAc,CAahB;AAqBD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAkB5E;AAYD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,EAC9B,QAAQ,EAAE,cAAc,GACvB,cAAc,CAehB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,GACvB;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAa/C"}