scorm-again 2.6.2 → 2.6.4

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 (70) hide show
  1. package/dist/aicc.js +41 -25
  2. package/dist/aicc.js.map +1 -1
  3. package/dist/aicc.min.js +1 -1
  4. package/dist/aicc.min.js.map +1 -1
  5. package/dist/esm/aicc.js +41 -25
  6. package/dist/esm/aicc.js.map +1 -1
  7. package/dist/esm/aicc.min.js +1 -1
  8. package/dist/esm/aicc.min.js.map +1 -1
  9. package/dist/esm/scorm-again.js +70 -45
  10. package/dist/esm/scorm-again.js.map +1 -1
  11. package/dist/esm/scorm-again.min.js +1 -1
  12. package/dist/esm/scorm-again.min.js.map +1 -1
  13. package/dist/esm/scorm12.js +38 -23
  14. package/dist/esm/scorm12.js.map +1 -1
  15. package/dist/esm/scorm12.min.js +1 -1
  16. package/dist/esm/scorm12.min.js.map +1 -1
  17. package/dist/esm/scorm2004.js +60 -39
  18. package/dist/esm/scorm2004.js.map +1 -1
  19. package/dist/esm/scorm2004.min.js +1 -1
  20. package/dist/esm/scorm2004.min.js.map +1 -1
  21. package/dist/scorm-again.js +70 -45
  22. package/dist/scorm-again.js.map +1 -1
  23. package/dist/scorm-again.min.js +1 -1
  24. package/dist/scorm-again.min.js.map +1 -1
  25. package/dist/scorm12.js +38 -23
  26. package/dist/scorm12.js.map +1 -1
  27. package/dist/scorm12.min.js +1 -1
  28. package/dist/scorm12.min.js.map +1 -1
  29. package/dist/scorm2004.js +60 -39
  30. package/dist/scorm2004.js.map +1 -1
  31. package/dist/scorm2004.min.js +1 -1
  32. package/dist/scorm2004.min.js.map +1 -1
  33. package/index.d.ts +24 -3
  34. package/package.json +1 -1
  35. package/src/BaseAPI.ts +57 -35
  36. package/src/Scorm12API.ts +3 -2
  37. package/src/Scorm2004API.ts +31 -24
  38. package/src/cmi/aicc/attempts.ts +3 -3
  39. package/src/cmi/aicc/core.ts +30 -12
  40. package/src/cmi/aicc/evaluation.ts +1 -1
  41. package/src/cmi/aicc/student_data.ts +1 -1
  42. package/src/cmi/aicc/student_demographics.ts +13 -13
  43. package/src/cmi/aicc/student_preferences.ts +1 -1
  44. package/src/cmi/aicc/tries.ts +3 -3
  45. package/src/cmi/aicc/validation.ts +1 -1
  46. package/src/cmi/common/array.ts +1 -1
  47. package/src/cmi/common/score.ts +3 -3
  48. package/src/cmi/common/validation.ts +2 -2
  49. package/src/cmi/scorm12/cmi.ts +12 -4
  50. package/src/cmi/scorm12/interactions.ts +27 -11
  51. package/src/cmi/scorm12/objectives.ts +4 -4
  52. package/src/cmi/scorm12/student_data.ts +12 -4
  53. package/src/cmi/scorm12/student_preference.ts +3 -1
  54. package/src/cmi/scorm12/validation.ts +5 -3
  55. package/src/cmi/scorm2004/adl.ts +21 -7
  56. package/src/cmi/scorm2004/cmi.ts +45 -15
  57. package/src/cmi/scorm2004/comments.ts +11 -5
  58. package/src/cmi/scorm2004/interactions.ts +25 -23
  59. package/src/cmi/scorm2004/learner_preference.ts +3 -1
  60. package/src/cmi/scorm2004/objectives.ts +5 -5
  61. package/src/cmi/scorm2004/score.ts +3 -3
  62. package/src/cmi/scorm2004/validation.ts +2 -2
  63. package/src/constants/regex.ts +8 -1
  64. package/src/exceptions/aicc_exceptions.ts +4 -4
  65. package/src/exceptions/scorm12_exceptions.ts +4 -4
  66. package/src/exceptions/scorm2004_exceptions.ts +4 -4
  67. package/src/utilities.ts +3 -3
  68. package/test/Scorm12API.spec.ts +45 -0
  69. package/test/Scorm2004API.spec.ts +43 -0
  70. 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;
@@ -794,7 +805,7 @@ var BaseAPI = (function () {
794
805
  }];
795
806
  }
796
807
  process = function (url, params, settings) { return (0,tslib_es6.__awaiter)(_this, void 0, void 0, function () {
797
- var response, e_1;
808
+ var response, e_1, message;
798
809
  return (0,tslib_es6.__generator)(this, function (_a) {
799
810
  switch (_a.label) {
800
811
  case 0:
@@ -806,7 +817,8 @@ var BaseAPI = (function () {
806
817
  return [2, this.transformResponse(response)];
807
818
  case 2:
808
819
  e_1 = _a.sent();
809
- this.apiLog("processHttpRequest", e_1, enums.LogLevelEnum.ERROR);
820
+ message = e_1 instanceof Error ? e_1.message : String(e_1);
821
+ this.apiLog("processHttpRequest", message, enums.LogLevelEnum.ERROR);
810
822
  api.processListeners("CommitError");
811
823
  return [2, genericError];
812
824
  case 3: return [2];
@@ -1179,8 +1191,8 @@ function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmpty
1179
1191
  function checkValidRange(value, rangePattern, errorCode, errorClass) {
1180
1192
  var ranges = rangePattern.split("#");
1181
1193
  value = value * 1.0;
1182
- if (value >= ranges[0]) {
1183
- if (ranges[1] === "*" || value <= ranges[1]) {
1194
+ if (ranges[0] && value >= ranges[0]) {
1195
+ if (ranges[1] && (ranges[1] === "*" || value <= ranges[1])) {
1184
1196
  return true;
1185
1197
  }
1186
1198
  else {
@@ -1513,7 +1525,7 @@ var scorm12_regex = {
1513
1525
  CMISInteger: "^-?([0-9]+)$",
1514
1526
  CMIDecimal: "^-?([0-9]{0,3})(.[0-9]*)?$",
1515
1527
  CMIIdentifier: "^[\\u0021-\\u007E\\s]{0,255}$",
1516
- CMIFeedback: "^.{0,255}$",
1528
+ CMIFeedback: "^.*$",
1517
1529
  CMIIndex: "[._](\\d+).",
1518
1530
  CMIStatus: "^(passed|completed|failed|incomplete|browsed)$",
1519
1531
  CMIStatus2: "^(passed|completed|failed|incomplete|browsed|not attempted)$",
@@ -1690,7 +1702,7 @@ function getSecondsAsISODuration(seconds) {
1690
1702
  var duration = "P";
1691
1703
  var remainder = seconds;
1692
1704
  for (var designationsKey in designations) {
1693
- var current_seconds = designations[designationsKey];
1705
+ var current_seconds = designations[designationsKey] || 1;
1694
1706
  var value = Math.floor(remainder / current_seconds);
1695
1707
  remainder = remainder % current_seconds;
1696
1708
  if (countDecimals(remainder) > 2) {
@@ -1797,7 +1809,7 @@ function unflatten(data) {
1797
1809
  var m = regex.exec(p);
1798
1810
  while (m) {
1799
1811
  cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
1800
- prop = m[2] || m[1];
1812
+ prop = m[2] || m[1] || "";
1801
1813
  m = regex.exec(p);
1802
1814
  }
1803
1815
  cur[prop] = data[p];
@@ -1809,7 +1821,7 @@ function countDecimals(num) {
1809
1821
  if (Math.floor(num) === num || String(num).indexOf(".") < 0)
1810
1822
  return 0;
1811
1823
  var parts = num.toString().split(".")[1];
1812
- return parts.length || 0;
1824
+ return (parts === null || parts === void 0 ? void 0 : parts.length) || 0;
1813
1825
  }
1814
1826
  function formatMessage(functionName, message, CMIElement) {
1815
1827
  var baseLength = 20;
@@ -2345,11 +2357,12 @@ var Scorm2004ValidationError = (function (_super) {
2345
2357
  (0,tslib_es6.__extends)(Scorm2004ValidationError, _super);
2346
2358
  function Scorm2004ValidationError(errorCode) {
2347
2359
  var _this = this;
2360
+ var _a, _b, _c, _d;
2348
2361
  if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {
2349
- _this = _super.call(this, errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage) || this;
2362
+ _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;
2350
2363
  }
2351
2364
  else {
2352
- _this = _super.call(this, 101, scorm2004_errors["101"].basicMessage, scorm2004_errors["101"].detailMessage) || this;
2365
+ _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;
2353
2366
  }
2354
2367
  return _this;
2355
2368
  }
@@ -2765,6 +2778,7 @@ var CMIInteractionsObject = (function (_super) {
2765
2778
  return this._learner_response;
2766
2779
  },
2767
2780
  set: function (learner_response) {
2781
+ var _a, _b, _c, _d;
2768
2782
  if (this.initialized && (this._type === "" || this._id === "")) {
2769
2783
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED);
2770
2784
  }
@@ -2782,14 +2796,14 @@ var CMIInteractionsObject = (function (_super) {
2782
2796
  var formatRegex = new RegExp(response_type.format);
2783
2797
  for (var i = 0; i < nodes.length; i++) {
2784
2798
  if (response_type === null || response_type === void 0 ? void 0 : response_type.delimiter2) {
2785
- var values = nodes[i].split(response_type.delimiter2);
2786
- if (values.length === 2) {
2787
- if (!values[0].match(formatRegex)) {
2799
+ var values = (_a = nodes[i]) === null || _a === void 0 ? void 0 : _a.split(response_type.delimiter2);
2800
+ if ((values === null || values === void 0 ? void 0 : values.length) === 2) {
2801
+ if (!((_b = values[0]) === null || _b === void 0 ? void 0 : _b.match(formatRegex))) {
2788
2802
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.TYPE_MISMATCH);
2789
2803
  }
2790
2804
  else {
2791
2805
  if (!response_type.format2 ||
2792
- !values[1].match(new RegExp(response_type.format2))) {
2806
+ !((_c = values[1]) === null || _c === void 0 ? void 0 : _c.match(new RegExp(response_type.format2)))) {
2793
2807
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.TYPE_MISMATCH);
2794
2808
  }
2795
2809
  }
@@ -2799,7 +2813,7 @@ var CMIInteractionsObject = (function (_super) {
2799
2813
  }
2800
2814
  }
2801
2815
  else {
2802
- if (!nodes[i].match(formatRegex)) {
2816
+ if (!((_d = nodes[i]) === null || _d === void 0 ? void 0 : _d.match(formatRegex))) {
2803
2817
  throw new Scorm2004ValidationError(error_codes.scorm2004_errors.TYPE_MISMATCH);
2804
2818
  }
2805
2819
  else {
@@ -4277,7 +4291,8 @@ var ADLNavRequestValid = (function (_super) {
4277
4291
  }
4278
4292
  for (var key in choice) {
4279
4293
  if ({}.hasOwnProperty.call(choice, key)) {
4280
- if (check2004ValidFormat(choice[key], regex.scorm2004_regex.NAVBoolean) &&
4294
+ if (choice[key] !== undefined &&
4295
+ check2004ValidFormat(choice[key], regex.scorm2004_regex.NAVBoolean) &&
4281
4296
  check2004ValidFormat(key, regex.scorm2004_regex.NAVTarget)) {
4282
4297
  this._choice[key] =
4283
4298
  enums.NAVBoolean[choice[key]];
@@ -4301,7 +4316,8 @@ var ADLNavRequestValid = (function (_super) {
4301
4316
  }
4302
4317
  for (var key in jump) {
4303
4318
  if ({}.hasOwnProperty.call(jump, key)) {
4304
- if (check2004ValidFormat(jump[key], regex.scorm2004_regex.NAVBoolean) &&
4319
+ if (jump[key] !== undefined &&
4320
+ check2004ValidFormat(jump[key], regex.scorm2004_regex.NAVBoolean) &&
4305
4321
  check2004ValidFormat(key, regex.scorm2004_regex.NAVTarget)) {
4306
4322
  this._jump[key] = enums.NAVBoolean[jump[key]];
4307
4323
  }
@@ -4454,19 +4470,19 @@ var Scorm2004Impl = (function (_super) {
4454
4470
  });
4455
4471
  };
4456
4472
  Scorm2004Impl.prototype.lmsGetValue = function (CMIElement) {
4457
- var _a;
4473
+ var _a, _b;
4458
4474
  var adlNavRequestRegex = "^adl\\.nav\\.request_valid\\.(choice|jump)\\.{target=\\S{0,}([a-zA-Z0-9-_]+)}$";
4459
4475
  if ((0,utilities.stringMatches)(CMIElement, adlNavRequestRegex)) {
4460
4476
  var matches = CMIElement.match(adlNavRequestRegex);
4461
4477
  if (matches) {
4462
4478
  var request = matches[1];
4463
- var target = matches[2].replace("{target=", "").replace("}", "");
4464
- if (request === "choice" || request === "jump") {
4479
+ var target = (_a = matches[2]) === null || _a === void 0 ? void 0 : _a.replace("{target=", "").replace("}", "");
4480
+ if (target && (request === "choice" || request === "jump")) {
4465
4481
  if (this.settings.scoItemIdValidator) {
4466
4482
  return String(this.settings.scoItemIdValidator(target));
4467
4483
  }
4468
4484
  if (this.settings.scoItemIds) {
4469
- return String((_a = this.settings.scoItemIds) === null || _a === void 0 ? void 0 : _a.includes(target));
4485
+ return String((_b = this.settings.scoItemIds) === null || _b === void 0 ? void 0 : _b.includes(target));
4470
4486
  }
4471
4487
  return String(request);
4472
4488
  }
@@ -4620,8 +4636,9 @@ var Scorm2004Impl = (function (_super) {
4620
4636
  var interaction_count = interaction.correct_responses._count;
4621
4637
  this.checkDuplicateChoiceResponse(interaction, value);
4622
4638
  var response_type = CorrectResponses[interaction.type];
4623
- if (typeof response_type.limit === "undefined" ||
4624
- interaction_count <= response_type.limit) {
4639
+ if (typeof response_type !== "undefined" &&
4640
+ (typeof response_type.limit === "undefined" ||
4641
+ interaction_count <= response_type.limit)) {
4625
4642
  this.checkValidResponseType(response_type, value, interaction.type);
4626
4643
  if ((this.lastErrorCode === "0" &&
4627
4644
  (!response_type.duplicate ||
@@ -4642,14 +4659,17 @@ var Scorm2004Impl = (function (_super) {
4642
4659
  return this._commonGetCMIValue("GetValue", true, CMIElement);
4643
4660
  };
4644
4661
  Scorm2004Impl.prototype.getLmsErrorMessageDetails = function (errorNumber, detail) {
4662
+ var _a, _b;
4645
4663
  var basicMessage = "";
4646
4664
  var detailMessage = "";
4647
4665
  errorNumber = String(errorNumber);
4648
4666
  if (api_constants.scorm2004_constants.error_descriptions[errorNumber]) {
4649
4667
  basicMessage =
4650
- api_constants.scorm2004_constants.error_descriptions[errorNumber].basicMessage;
4668
+ ((_a = api_constants.scorm2004_constants.error_descriptions[errorNumber]) === null || _a === void 0 ? void 0 : _a.basicMessage) ||
4669
+ "Unknown Error";
4651
4670
  detailMessage =
4652
- api_constants.scorm2004_constants.error_descriptions[errorNumber].detailMessage;
4671
+ ((_b = api_constants.scorm2004_constants.error_descriptions[errorNumber]) === null || _b === void 0 ? void 0 : _b.detailMessage) ||
4672
+ "";
4653
4673
  }
4654
4674
  return detail ? detailMessage : basicMessage;
4655
4675
  };
@@ -4665,7 +4685,7 @@ var Scorm2004Impl = (function (_super) {
4665
4685
  };
4666
4686
  Scorm2004Impl.prototype.checkCorrectResponseValue = function (interaction_type, nodes, value) {
4667
4687
  var response = CorrectResponses[interaction_type];
4668
- var formatRegex = new RegExp(response.format);
4688
+ var formatRegex = new RegExp((response === null || response === void 0 ? void 0 : response.format) || ".*");
4669
4689
  for (var i = 0; i < nodes.length && this.lastErrorCode === "0"; i++) {
4670
4690
  if (interaction_type.match("^(fill-in|long-fill-in|matching|performance|sequencing)$")) {
4671
4691
  nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);
@@ -4701,7 +4721,7 @@ var Scorm2004Impl = (function (_super) {
4701
4721
  }
4702
4722
  }
4703
4723
  else {
4704
- if (nodes[i] !== "" && response.unique) {
4724
+ if (nodes[i] !== "" && (response === null || response === void 0 ? void 0 : response.unique)) {
4705
4725
  for (var j = 0; j < i && this.lastErrorCode === "0"; j++) {
4706
4726
  if (nodes[i] === nodes[j]) {
4707
4727
  this.throwSCORMError(error_codes.scorm2004_errors.TYPE_MISMATCH);
@@ -4714,6 +4734,7 @@ var Scorm2004Impl = (function (_super) {
4714
4734
  }
4715
4735
  };
4716
4736
  Scorm2004Impl.prototype.removeCorrectResponsePrefixes = function (node) {
4737
+ var _a;
4717
4738
  var seenOrder = false;
4718
4739
  var seenCase = false;
4719
4740
  var seenLang = false;
@@ -4751,7 +4772,7 @@ var Scorm2004Impl = (function (_super) {
4751
4772
  seenOrder = true;
4752
4773
  break;
4753
4774
  }
4754
- node = node.substring(matches[1].length);
4775
+ node = node.substring(((_a = matches[1]) === null || _a === void 0 ? void 0 : _a.length) || 0);
4755
4776
  matches = node.match(prefixRegex);
4756
4777
  }
4757
4778
  return node;