scorm-again 2.6.3 → 2.6.5

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 (73) hide show
  1. package/.claude/.claude/settings.local.json +13 -0
  2. package/.claude/settings.local.json +33 -0
  3. package/dist/aicc.js +38 -22
  4. package/dist/aicc.js.map +1 -1
  5. package/dist/aicc.min.js +1 -1
  6. package/dist/aicc.min.js.map +1 -1
  7. package/dist/esm/aicc.js +38 -22
  8. package/dist/esm/aicc.js.map +1 -1
  9. package/dist/esm/aicc.min.js +1 -1
  10. package/dist/esm/aicc.min.js.map +1 -1
  11. package/dist/esm/scorm-again.js +79 -47
  12. package/dist/esm/scorm-again.js.map +1 -1
  13. package/dist/esm/scorm-again.min.js +1 -1
  14. package/dist/esm/scorm-again.min.js.map +1 -1
  15. package/dist/esm/scorm12.js +35 -20
  16. package/dist/esm/scorm12.js.map +1 -1
  17. package/dist/esm/scorm12.min.js +1 -1
  18. package/dist/esm/scorm12.min.js.map +1 -1
  19. package/dist/esm/scorm2004.js +69 -41
  20. package/dist/esm/scorm2004.js.map +1 -1
  21. package/dist/esm/scorm2004.min.js +1 -1
  22. package/dist/esm/scorm2004.min.js.map +1 -1
  23. package/dist/scorm-again.js +79 -47
  24. package/dist/scorm-again.js.map +1 -1
  25. package/dist/scorm-again.min.js +1 -1
  26. package/dist/scorm-again.min.js.map +1 -1
  27. package/dist/scorm12.js +35 -20
  28. package/dist/scorm12.js.map +1 -1
  29. package/dist/scorm12.min.js +1 -1
  30. package/dist/scorm12.min.js.map +1 -1
  31. package/dist/scorm2004.js +69 -41
  32. package/dist/scorm2004.js.map +1 -1
  33. package/dist/scorm2004.min.js +1 -1
  34. package/dist/scorm2004.min.js.map +1 -1
  35. package/dist/types/cmi/scorm2004/adl.d.ts +8 -2
  36. package/dist/types/cmi/scorm2004/cmi.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/src/BaseAPI.ts +56 -33
  39. package/src/Scorm12API.ts +3 -2
  40. package/src/Scorm2004API.ts +31 -24
  41. package/src/cmi/aicc/attempts.ts +3 -3
  42. package/src/cmi/aicc/core.ts +30 -12
  43. package/src/cmi/aicc/evaluation.ts +1 -1
  44. package/src/cmi/aicc/student_data.ts +1 -1
  45. package/src/cmi/aicc/student_demographics.ts +13 -13
  46. package/src/cmi/aicc/student_preferences.ts +1 -1
  47. package/src/cmi/aicc/tries.ts +3 -3
  48. package/src/cmi/aicc/validation.ts +1 -1
  49. package/src/cmi/common/array.ts +1 -1
  50. package/src/cmi/common/score.ts +3 -3
  51. package/src/cmi/common/validation.ts +2 -2
  52. package/src/cmi/scorm12/cmi.ts +12 -4
  53. package/src/cmi/scorm12/interactions.ts +27 -11
  54. package/src/cmi/scorm12/objectives.ts +4 -4
  55. package/src/cmi/scorm12/student_data.ts +12 -4
  56. package/src/cmi/scorm12/student_preference.ts +3 -1
  57. package/src/cmi/scorm12/validation.ts +5 -3
  58. package/src/cmi/scorm2004/adl.ts +39 -22
  59. package/src/cmi/scorm2004/cmi.ts +47 -17
  60. package/src/cmi/scorm2004/comments.ts +11 -5
  61. package/src/cmi/scorm2004/interactions.ts +25 -23
  62. package/src/cmi/scorm2004/learner_preference.ts +3 -1
  63. package/src/cmi/scorm2004/objectives.ts +5 -5
  64. package/src/cmi/scorm2004/score.ts +3 -3
  65. package/src/cmi/scorm2004/validation.ts +2 -2
  66. package/src/exceptions/aicc_exceptions.ts +4 -4
  67. package/src/exceptions/scorm12_exceptions.ts +4 -4
  68. package/src/exceptions/scorm2004_exceptions.ts +4 -4
  69. package/src/utilities.ts +3 -3
  70. package/test/BaseAPI.requestHandler.spec.ts +126 -0
  71. package/test/Scorm12API.spec.ts +45 -0
  72. package/test/Scorm2004API.spec.ts +43 -0
  73. package/tsconfig.json +1 -0
@@ -415,6 +415,10 @@ var BaseAPI = (function () {
415
415
  : this._error_codes.GENERAL;
416
416
  for (var idx = 0; idx < structure.length; idx++) {
417
417
  var attribute = structure[idx];
418
+ if (!attribute) {
419
+ this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
420
+ return api_constants.global_constants.SCORM_FALSE;
421
+ }
418
422
  if (idx === structure.length - 1) {
419
423
  if (scorm2004 && attribute.substring(0, 8) === "{target=") {
420
424
  if (this.isInitialized()) {
@@ -445,7 +449,7 @@ var BaseAPI = (function () {
445
449
  break;
446
450
  }
447
451
  if (refObject instanceof array.CMIArray) {
448
- var index = parseInt(structure[idx + 1], 10);
452
+ var index = parseInt(structure[idx + 1] || "0", 10);
449
453
  if (!isNaN(index)) {
450
454
  var item = refObject.childArray[index];
451
455
  if (item) {
@@ -489,6 +493,10 @@ var BaseAPI = (function () {
489
493
  : this._error_codes.GENERAL;
490
494
  for (var idx = 0; idx < structure.length; idx++) {
491
495
  attribute = structure[idx];
496
+ if (!attribute) {
497
+ this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
498
+ return;
499
+ }
492
500
  if (!scorm2004) {
493
501
  if (idx === structure.length - 1) {
494
502
  if (!this._checkObjectHasProperty(refObject, attribute)) {
@@ -514,7 +522,7 @@ var BaseAPI = (function () {
514
522
  break;
515
523
  }
516
524
  if (refObject instanceof array.CMIArray) {
517
- var index = parseInt(structure[idx + 1], 10);
525
+ var index = parseInt(structure[idx + 1] || "", 10);
518
526
  if (!isNaN(index)) {
519
527
  var item = refObject.childArray[index];
520
528
  if (item) {
@@ -552,17 +560,18 @@ var BaseAPI = (function () {
552
560
  return this.currentState === api_constants.global_constants.STATE_TERMINATED;
553
561
  };
554
562
  BaseAPI.prototype.on = function (listenerName, callback) {
563
+ var _a, _c;
555
564
  if (!callback)
556
565
  return;
557
566
  var listenerFunctions = listenerName.split(" ");
558
567
  for (var i = 0; i < listenerFunctions.length; i++) {
559
- var listenerSplit = listenerFunctions[i].split(".");
560
- if (listenerSplit.length === 0)
568
+ var listenerSplit = (_a = listenerFunctions[i]) === null || _a === void 0 ? void 0 : _a.split(".");
569
+ if (!listenerSplit || listenerSplit.length === 0)
561
570
  return;
562
571
  var functionName = listenerSplit[0];
563
572
  var CMIElement = null;
564
573
  if (listenerSplit.length > 1) {
565
- CMIElement = listenerName.replace(functionName + ".", "");
574
+ CMIElement = (_c = listenerFunctions[i]) === null || _c === void 0 ? void 0 : _c.replace(functionName + ".", "");
566
575
  }
567
576
  this.listenerArray.push({
568
577
  functionName: functionName,
@@ -573,17 +582,18 @@ var BaseAPI = (function () {
573
582
  }
574
583
  };
575
584
  BaseAPI.prototype.off = function (listenerName, callback) {
585
+ var _a, _c;
576
586
  if (!callback)
577
587
  return;
578
588
  var listenerFunctions = listenerName.split(" ");
579
589
  var _loop_1 = function (i) {
580
- var listenerSplit = listenerFunctions[i].split(".");
581
- if (listenerSplit.length === 0)
590
+ var listenerSplit = (_a = listenerFunctions[i]) === null || _a === void 0 ? void 0 : _a.split(".");
591
+ if (!listenerSplit || listenerSplit.length === 0)
582
592
  return { value: void 0 };
583
593
  var functionName = listenerSplit[0];
584
594
  var CMIElement = null;
585
595
  if (listenerSplit.length > 1) {
586
- CMIElement = listenerName.replace(functionName + ".", "");
596
+ CMIElement = (_c = listenerFunctions[i]) === null || _c === void 0 ? void 0 : _c.replace(functionName + ".", "");
587
597
  }
588
598
  var removeIndex = this_1.listenerArray.findIndex(function (obj) {
589
599
  return obj.functionName === functionName &&
@@ -603,15 +613,16 @@ var BaseAPI = (function () {
603
613
  }
604
614
  };
605
615
  BaseAPI.prototype.clear = function (listenerName) {
616
+ var _a, _c;
606
617
  var listenerFunctions = listenerName.split(" ");
607
618
  var _loop_2 = function (i) {
608
- var listenerSplit = listenerFunctions[i].split(".");
609
- if (listenerSplit.length === 0)
619
+ var listenerSplit = (_a = listenerFunctions[i]) === null || _a === void 0 ? void 0 : _a.split(".");
620
+ if (!listenerSplit || (listenerSplit === null || listenerSplit === void 0 ? void 0 : listenerSplit.length) === 0)
610
621
  return { value: void 0 };
611
622
  var functionName = listenerSplit[0];
612
623
  var CMIElement = null;
613
624
  if (listenerSplit.length > 1) {
614
- CMIElement = listenerName.replace(functionName + ".", "");
625
+ CMIElement = (_c = listenerFunctions[i]) === null || _c === void 0 ? void 0 : _c.replace(functionName + ".", "");
615
626
  }
616
627
  this_2.listenerArray = this_2.listenerArray.filter(function (obj) {
617
628
  return obj.functionName !== functionName && obj.CMIElement !== CMIElement;
@@ -778,6 +789,7 @@ var BaseAPI = (function () {
778
789
  errorCode: this.error_codes.GENERAL,
779
790
  };
780
791
  if (immediate) {
792
+ params = this.settings.requestHandler(params);
781
793
  this.performFetch(url, params).then(function (response) { return (0,tslib_es6.__awaiter)(_this, void 0, void 0, function () {
782
794
  return (0,tslib_es6.__generator)(this, function (_a) {
783
795
  switch (_a.label) {
@@ -1180,8 +1192,8 @@ function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmpty
1180
1192
  function checkValidRange(value, rangePattern, errorCode, errorClass) {
1181
1193
  var ranges = rangePattern.split("#");
1182
1194
  value = value * 1.0;
1183
- if (value >= ranges[0]) {
1184
- if (ranges[1] === "*" || value <= ranges[1]) {
1195
+ if (ranges[0] && value >= ranges[0]) {
1196
+ if (ranges[1] && (ranges[1] === "*" || value <= ranges[1])) {
1185
1197
  return true;
1186
1198
  }
1187
1199
  else {
@@ -1691,7 +1703,7 @@ function getSecondsAsISODuration(seconds) {
1691
1703
  var duration = "P";
1692
1704
  var remainder = seconds;
1693
1705
  for (var designationsKey in designations) {
1694
- var current_seconds = designations[designationsKey];
1706
+ var current_seconds = designations[designationsKey] || 1;
1695
1707
  var value = Math.floor(remainder / current_seconds);
1696
1708
  remainder = remainder % current_seconds;
1697
1709
  if (countDecimals(remainder) > 2) {
@@ -1798,7 +1810,7 @@ function unflatten(data) {
1798
1810
  var m = regex.exec(p);
1799
1811
  while (m) {
1800
1812
  cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
1801
- prop = m[2] || m[1];
1813
+ prop = m[2] || m[1] || "";
1802
1814
  m = regex.exec(p);
1803
1815
  }
1804
1816
  cur[prop] = data[p];
@@ -1810,7 +1822,7 @@ function countDecimals(num) {
1810
1822
  if (Math.floor(num) === num || String(num).indexOf(".") < 0)
1811
1823
  return 0;
1812
1824
  var parts = num.toString().split(".")[1];
1813
- return parts.length || 0;
1825
+ return (parts === null || parts === void 0 ? void 0 : parts.length) || 0;
1814
1826
  }
1815
1827
  function formatMessage(functionName, message, CMIElement) {
1816
1828
  var baseLength = 20;
@@ -2346,11 +2358,12 @@ var Scorm2004ValidationError = (function (_super) {
2346
2358
  (0,tslib_es6.__extends)(Scorm2004ValidationError, _super);
2347
2359
  function Scorm2004ValidationError(errorCode) {
2348
2360
  var _this = this;
2361
+ var _a, _b, _c, _d;
2349
2362
  if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {
2350
- _this = _super.call(this, errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage) || this;
2363
+ _this = _super.call(this, errorCode, ((_a = scorm2004_errors[String(errorCode)]) === null || _a === void 0 ? void 0 : _a.basicMessage) || "Unknown error", (_b = scorm2004_errors[String(errorCode)]) === null || _b === void 0 ? void 0 : _b.detailMessage) || this;
2351
2364
  }
2352
2365
  else {
2353
- _this = _super.call(this, 101, scorm2004_errors["101"].basicMessage, scorm2004_errors["101"].detailMessage) || this;
2366
+ _this = _super.call(this, 101, ((_c = scorm2004_errors["101"]) === null || _c === void 0 ? void 0 : _c.basicMessage) || "General error", (_d = scorm2004_errors["101"]) === null || _d === void 0 ? void 0 : _d.detailMessage) || this;
2354
2367
  }
2355
2368
  return _this;
2356
2369
  }
@@ -2766,6 +2779,7 @@ var CMIInteractionsObject = (function (_super) {
2766
2779
  return this._learner_response;
2767
2780
  },
2768
2781
  set: function (learner_response) {
2782
+ var _a, _b, _c, _d;
2769
2783
  if (this.initialized && (this._type === "" || this._id === "")) {
2770
2784
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED);
2771
2785
  }
@@ -2783,14 +2797,14 @@ var CMIInteractionsObject = (function (_super) {
2783
2797
  var formatRegex = new RegExp(response_type.format);
2784
2798
  for (var i = 0; i < nodes.length; i++) {
2785
2799
  if (response_type === null || response_type === void 0 ? void 0 : response_type.delimiter2) {
2786
- var values = nodes[i].split(response_type.delimiter2);
2787
- if (values.length === 2) {
2788
- if (!values[0].match(formatRegex)) {
2800
+ var values = (_a = nodes[i]) === null || _a === void 0 ? void 0 : _a.split(response_type.delimiter2);
2801
+ if ((values === null || values === void 0 ? void 0 : values.length) === 2) {
2802
+ if (!((_b = values[0]) === null || _b === void 0 ? void 0 : _b.match(formatRegex))) {
2789
2803
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.TYPE_MISMATCH);
2790
2804
  }
2791
2805
  else {
2792
2806
  if (!response_type.format2 ||
2793
- !values[1].match(new RegExp(response_type.format2))) {
2807
+ !((_c = values[1]) === null || _c === void 0 ? void 0 : _c.match(new RegExp(response_type.format2)))) {
2794
2808
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.TYPE_MISMATCH);
2795
2809
  }
2796
2810
  }
@@ -2800,7 +2814,7 @@ var CMIInteractionsObject = (function (_super) {
2800
2814
  }
2801
2815
  }
2802
2816
  else {
2803
- if (!nodes[i].match(formatRegex)) {
2817
+ if (!((_d = nodes[i]) === null || _d === void 0 ? void 0 : _d.match(formatRegex))) {
2804
2818
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.TYPE_MISMATCH);
2805
2819
  }
2806
2820
  else {
@@ -4278,10 +4292,14 @@ var ADLNavRequestValid = (function (_super) {
4278
4292
  }
4279
4293
  for (var key in choice) {
4280
4294
  if ({}.hasOwnProperty.call(choice, key)) {
4281
- if (check2004ValidFormat(choice[key], regex.scorm2004_regex.NAVBoolean) &&
4282
- check2004ValidFormat(key, regex.scorm2004_regex.NAVTarget)) {
4283
- this._choice[key] =
4284
- enums.NAVBoolean[choice[key]];
4295
+ if (choice[key] !== undefined && check2004ValidFormat(key, regex.scorm2004_regex.NAVTarget)) {
4296
+ var value = choice[key];
4297
+ if (typeof value === 'string' && check2004ValidFormat(value, regex.scorm2004_regex.NAVBoolean)) {
4298
+ this._choice[key] = enums.NAVBoolean[value];
4299
+ }
4300
+ else if (Object.values(enums.NAVBoolean).includes(value)) {
4301
+ this._choice[key] = value;
4302
+ }
4285
4303
  }
4286
4304
  }
4287
4305
  }
@@ -4302,9 +4320,14 @@ var ADLNavRequestValid = (function (_super) {
4302
4320
  }
4303
4321
  for (var key in jump) {
4304
4322
  if ({}.hasOwnProperty.call(jump, key)) {
4305
- if (check2004ValidFormat(jump[key], regex.scorm2004_regex.NAVBoolean) &&
4306
- check2004ValidFormat(key, regex.scorm2004_regex.NAVTarget)) {
4307
- this._jump[key] = enums.NAVBoolean[jump[key]];
4323
+ if (jump[key] !== undefined && check2004ValidFormat(key, regex.scorm2004_regex.NAVTarget)) {
4324
+ var value = jump[key];
4325
+ if (typeof value === 'string' && check2004ValidFormat(value, regex.scorm2004_regex.NAVBoolean)) {
4326
+ this._jump[key] = enums.NAVBoolean[value];
4327
+ }
4328
+ else if (Object.values(enums.NAVBoolean).includes(value)) {
4329
+ this._jump[key] = value;
4330
+ }
4308
4331
  }
4309
4332
  }
4310
4333
  }
@@ -4455,19 +4478,19 @@ var Scorm2004Impl = (function (_super) {
4455
4478
  });
4456
4479
  };
4457
4480
  Scorm2004Impl.prototype.lmsGetValue = function (CMIElement) {
4458
- var _a;
4481
+ var _a, _b;
4459
4482
  var adlNavRequestRegex = "^adl\\.nav\\.request_valid\\.(choice|jump)\\.{target=\\S{0,}([a-zA-Z0-9-_]+)}$";
4460
4483
  if ((0,utilities.stringMatches)(CMIElement, adlNavRequestRegex)) {
4461
4484
  var matches = CMIElement.match(adlNavRequestRegex);
4462
4485
  if (matches) {
4463
4486
  var request = matches[1];
4464
- var target = matches[2].replace("{target=", "").replace("}", "");
4465
- if (request === "choice" || request === "jump") {
4487
+ var target = (_a = matches[2]) === null || _a === void 0 ? void 0 : _a.replace("{target=", "").replace("}", "");
4488
+ if (target && (request === "choice" || request === "jump")) {
4466
4489
  if (this.settings.scoItemIdValidator) {
4467
4490
  return String(this.settings.scoItemIdValidator(target));
4468
4491
  }
4469
4492
  if (this.settings.scoItemIds) {
4470
- return String((_a = this.settings.scoItemIds) === null || _a === void 0 ? void 0 : _a.includes(target));
4493
+ return String((_b = this.settings.scoItemIds) === null || _b === void 0 ? void 0 : _b.includes(target));
4471
4494
  }
4472
4495
  return String(request);
4473
4496
  }
@@ -4621,8 +4644,9 @@ var Scorm2004Impl = (function (_super) {
4621
4644
  var interaction_count = interaction.correct_responses._count;
4622
4645
  this.checkDuplicateChoiceResponse(interaction, value);
4623
4646
  var response_type = CorrectResponses[interaction.type];
4624
- if (typeof response_type.limit === "undefined" ||
4625
- interaction_count <= response_type.limit) {
4647
+ if (typeof response_type !== "undefined" &&
4648
+ (typeof response_type.limit === "undefined" ||
4649
+ interaction_count <= response_type.limit)) {
4626
4650
  this.checkValidResponseType(response_type, value, interaction.type);
4627
4651
  if ((this.lastErrorCode === "0" &&
4628
4652
  (!response_type.duplicate ||
@@ -4643,14 +4667,17 @@ var Scorm2004Impl = (function (_super) {
4643
4667
  return this._commonGetCMIValue("GetValue", true, CMIElement);
4644
4668
  };
4645
4669
  Scorm2004Impl.prototype.getLmsErrorMessageDetails = function (errorNumber, detail) {
4670
+ var _a, _b;
4646
4671
  var basicMessage = "";
4647
4672
  var detailMessage = "";
4648
4673
  errorNumber = String(errorNumber);
4649
4674
  if (api_constants.scorm2004_constants.error_descriptions[errorNumber]) {
4650
4675
  basicMessage =
4651
- api_constants.scorm2004_constants.error_descriptions[errorNumber].basicMessage;
4676
+ ((_a = api_constants.scorm2004_constants.error_descriptions[errorNumber]) === null || _a === void 0 ? void 0 : _a.basicMessage) ||
4677
+ "Unknown Error";
4652
4678
  detailMessage =
4653
- api_constants.scorm2004_constants.error_descriptions[errorNumber].detailMessage;
4679
+ ((_b = api_constants.scorm2004_constants.error_descriptions[errorNumber]) === null || _b === void 0 ? void 0 : _b.detailMessage) ||
4680
+ "";
4654
4681
  }
4655
4682
  return detail ? detailMessage : basicMessage;
4656
4683
  };
@@ -4666,7 +4693,7 @@ var Scorm2004Impl = (function (_super) {
4666
4693
  };
4667
4694
  Scorm2004Impl.prototype.checkCorrectResponseValue = function (interaction_type, nodes, value) {
4668
4695
  var response = CorrectResponses[interaction_type];
4669
- var formatRegex = new RegExp(response.format);
4696
+ var formatRegex = new RegExp((response === null || response === void 0 ? void 0 : response.format) || ".*");
4670
4697
  for (var i = 0; i < nodes.length && this.lastErrorCode === "0"; i++) {
4671
4698
  if (interaction_type.match("^(fill-in|long-fill-in|matching|performance|sequencing)$")) {
4672
4699
  nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);
@@ -4702,7 +4729,7 @@ var Scorm2004Impl = (function (_super) {
4702
4729
  }
4703
4730
  }
4704
4731
  else {
4705
- if (nodes[i] !== "" && response.unique) {
4732
+ if (nodes[i] !== "" && (response === null || response === void 0 ? void 0 : response.unique)) {
4706
4733
  for (var j = 0; j < i && this.lastErrorCode === "0"; j++) {
4707
4734
  if (nodes[i] === nodes[j]) {
4708
4735
  this.throwSCORMError(error_codes.scorm2004_errors.TYPE_MISMATCH);
@@ -4715,6 +4742,7 @@ var Scorm2004Impl = (function (_super) {
4715
4742
  }
4716
4743
  };
4717
4744
  Scorm2004Impl.prototype.removeCorrectResponsePrefixes = function (node) {
4745
+ var _a;
4718
4746
  var seenOrder = false;
4719
4747
  var seenCase = false;
4720
4748
  var seenLang = false;
@@ -4752,7 +4780,7 @@ var Scorm2004Impl = (function (_super) {
4752
4780
  seenOrder = true;
4753
4781
  break;
4754
4782
  }
4755
- node = node.substring(matches[1].length);
4783
+ node = node.substring(((_a = matches[1]) === null || _a === void 0 ? void 0 : _a.length) || 0);
4756
4784
  matches = node.match(prefixRegex);
4757
4785
  }
4758
4786
  return node;