@sports-alliance/sports-lib 7.1.2 → 7.2.2

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 (62) hide show
  1. package/lib/cjs/data/data-ground-contact-time-balance-left.d.ts +4 -0
  2. package/lib/cjs/data/data-ground-contact-time-balance-left.js +8 -0
  3. package/lib/cjs/data/data-ground-contact-time-balance-right.d.ts +4 -0
  4. package/lib/cjs/data/data-ground-contact-time-balance-right.js +8 -0
  5. package/lib/cjs/data/data-ground-contact-time-balance.d.ts +3 -0
  6. package/lib/cjs/data/data-ground-contact-time-balance.js +7 -0
  7. package/lib/cjs/data/data-stance-time-balance-left.d.ts +1 -0
  8. package/lib/cjs/data/data-stance-time-balance-left.js +1 -0
  9. package/lib/cjs/data/data-stance-time-balance-right.d.ts +1 -0
  10. package/lib/cjs/data/data-stance-time-balance-right.js +1 -0
  11. package/lib/cjs/data/data-stance-time-balance.d.ts +1 -0
  12. package/lib/cjs/data/data-stance-time-balance.js +1 -0
  13. package/lib/cjs/data/data.depth-max.d.ts +5 -0
  14. package/lib/cjs/data/data.depth-max.js +9 -0
  15. package/lib/cjs/data/data.depth.d.ts +5 -0
  16. package/lib/cjs/data/data.depth.js +9 -0
  17. package/lib/cjs/data/data.fitness-age.d.ts +5 -0
  18. package/lib/cjs/data/data.fitness-age.js +9 -0
  19. package/lib/cjs/data/data.ground-contact-time-avg.d.ts +5 -0
  20. package/lib/cjs/data/data.ground-contact-time-avg.js +9 -0
  21. package/lib/cjs/data/data.ground-contact-time-max.d.ts +5 -0
  22. package/lib/cjs/data/data.ground-contact-time-max.js +9 -0
  23. package/lib/cjs/data/data.ground-contact-time-min.d.ts +5 -0
  24. package/lib/cjs/data/data.ground-contact-time-min.js +9 -0
  25. package/lib/cjs/data/data.ground-contact-time.d.ts +5 -0
  26. package/lib/cjs/data/data.ground-contact-time.js +9 -0
  27. package/lib/cjs/data/data.max-hr-setting.d.ts +5 -0
  28. package/lib/cjs/data/data.max-hr-setting.js +9 -0
  29. package/lib/cjs/data/data.stance-time.d.ts +1 -0
  30. package/lib/cjs/data/data.stance-time.js +1 -0
  31. package/lib/cjs/data/data.store.js +39 -1
  32. package/lib/cjs/data/data.vertical-oscillation-avg.d.ts +5 -0
  33. package/lib/cjs/data/data.vertical-oscillation-avg.js +9 -0
  34. package/lib/cjs/data/data.vertical-oscillation-max.d.ts +5 -0
  35. package/lib/cjs/data/data.vertical-oscillation-max.js +9 -0
  36. package/lib/cjs/data/data.vertical-oscillation-min.d.ts +5 -0
  37. package/lib/cjs/data/data.vertical-oscillation-min.js +9 -0
  38. package/lib/cjs/events/adapters/importers/fit/importer.fit.js +5 -0
  39. package/lib/cjs/events/adapters/importers/fit/importer.fit.mapper.js +23 -0
  40. package/lib/cjs/events/adapters/importers/suunto/importer.suunto.integration.spec.js +87 -3
  41. package/lib/cjs/events/adapters/importers/suunto/importer.suunto.json.js +86 -6
  42. package/lib/cjs/events/utilities/activity.utilities.js +38 -2
  43. package/lib/esm/data/data-ground-contact-time-balance-left.d.ts +4 -0
  44. package/lib/esm/data/data-ground-contact-time-balance-right.d.ts +4 -0
  45. package/lib/esm/data/data-ground-contact-time-balance.d.ts +3 -0
  46. package/lib/esm/data/data-stance-time-balance-left.d.ts +1 -0
  47. package/lib/esm/data/data-stance-time-balance-right.d.ts +1 -0
  48. package/lib/esm/data/data-stance-time-balance.d.ts +1 -0
  49. package/lib/esm/data/data.depth-max.d.ts +5 -0
  50. package/lib/esm/data/data.depth.d.ts +5 -0
  51. package/lib/esm/data/data.fitness-age.d.ts +5 -0
  52. package/lib/esm/data/data.ground-contact-time-avg.d.ts +5 -0
  53. package/lib/esm/data/data.ground-contact-time-max.d.ts +5 -0
  54. package/lib/esm/data/data.ground-contact-time-min.d.ts +5 -0
  55. package/lib/esm/data/data.ground-contact-time.d.ts +5 -0
  56. package/lib/esm/data/data.max-hr-setting.d.ts +5 -0
  57. package/lib/esm/data/data.stance-time.d.ts +1 -0
  58. package/lib/esm/data/data.vertical-oscillation-avg.d.ts +5 -0
  59. package/lib/esm/data/data.vertical-oscillation-max.d.ts +5 -0
  60. package/lib/esm/data/data.vertical-oscillation-min.d.ts +5 -0
  61. package/lib/esm/index.js +258 -5
  62. package/package.json +2 -2
package/lib/esm/index.js CHANGED
@@ -3046,6 +3046,17 @@ var DataStanceTimeBalanceLeft = class extends DataStanceTimeBalance {
3046
3046
  }
3047
3047
  };
3048
3048
 
3049
+ // src/data/data-ground-contact-time-balance.ts
3050
+ var DataGroundContactTimeBalance = class extends DataPercent {
3051
+ };
3052
+
3053
+ // src/data/data-ground-contact-time-balance-left.ts
3054
+ var DataGroundContactTimeBalanceLeft = class extends DataGroundContactTimeBalance {
3055
+ static {
3056
+ this.type = "Ground Contact Time Balance Left";
3057
+ }
3058
+ };
3059
+
3049
3060
  // src/data/data.step-length.ts
3050
3061
  var DataStepLength = class extends DataDistance {
3051
3062
  static {
@@ -3669,6 +3680,13 @@ var DataStanceTimeBalanceRight = class extends DataStanceTimeBalance {
3669
3680
  }
3670
3681
  };
3671
3682
 
3683
+ // src/data/data-ground-contact-time-balance-right.ts
3684
+ var DataGroundContactTimeBalanceRight = class extends DataGroundContactTimeBalance {
3685
+ static {
3686
+ this.type = "Ground Contact Time Balance Right";
3687
+ }
3688
+ };
3689
+
3672
3690
  // src/data/data.rider-position-change-event.ts
3673
3691
  var DataRiderPositionChangeEvent = class extends DataEvent {
3674
3692
  static {
@@ -4014,6 +4032,116 @@ var DataTrainingLoadPeak = class extends DataNumber {
4014
4032
  }
4015
4033
  };
4016
4034
 
4035
+ // src/data/data.ground-contact-time.ts
4036
+ var DataGroundContactTime = class extends DataNumber {
4037
+ static {
4038
+ this.type = "Ground Contact Time";
4039
+ }
4040
+ static {
4041
+ this.unit = "ms";
4042
+ }
4043
+ };
4044
+
4045
+ // src/data/data.ground-contact-time-avg.ts
4046
+ var DataGroundContactTimeAvg = class extends DataNumber {
4047
+ static {
4048
+ this.type = "Ground Contact Time Avg";
4049
+ }
4050
+ static {
4051
+ this.unit = "ms";
4052
+ }
4053
+ };
4054
+
4055
+ // src/data/data.ground-contact-time-max.ts
4056
+ var DataGroundContactTimeMax = class extends DataNumber {
4057
+ static {
4058
+ this.type = "Ground Contact Time Max";
4059
+ }
4060
+ static {
4061
+ this.unit = "ms";
4062
+ }
4063
+ };
4064
+
4065
+ // src/data/data.ground-contact-time-min.ts
4066
+ var DataGroundContactTimeMin = class extends DataNumber {
4067
+ static {
4068
+ this.type = "Ground Contact Time Min";
4069
+ }
4070
+ static {
4071
+ this.unit = "ms";
4072
+ }
4073
+ };
4074
+
4075
+ // src/data/data.vertical-oscillation-avg.ts
4076
+ var DataVerticalOscillationAvg = class extends DataNumber {
4077
+ static {
4078
+ this.type = "Average Vertical Oscillation";
4079
+ }
4080
+ static {
4081
+ this.unit = "mm";
4082
+ }
4083
+ };
4084
+
4085
+ // src/data/data.vertical-oscillation-max.ts
4086
+ var DataVerticalOscillationMax = class extends DataNumber {
4087
+ static {
4088
+ this.type = "Maximum Vertical Oscillation";
4089
+ }
4090
+ static {
4091
+ this.unit = "mm";
4092
+ }
4093
+ };
4094
+
4095
+ // src/data/data.vertical-oscillation-min.ts
4096
+ var DataVerticalOscillationMin = class extends DataNumber {
4097
+ static {
4098
+ this.type = "Minimum Vertical Oscillation";
4099
+ }
4100
+ static {
4101
+ this.unit = "mm";
4102
+ }
4103
+ };
4104
+
4105
+ // src/data/data.fitness-age.ts
4106
+ var DataFitnessAge = class extends DataNumber {
4107
+ static {
4108
+ this.type = "Fitness Age";
4109
+ }
4110
+ static {
4111
+ this.unit = "years";
4112
+ }
4113
+ };
4114
+
4115
+ // src/data/data.max-hr-setting.ts
4116
+ var DataMaxHRSetting = class extends DataNumber {
4117
+ static {
4118
+ this.type = "Max HR Setting";
4119
+ }
4120
+ static {
4121
+ this.unit = "bpm";
4122
+ }
4123
+ };
4124
+
4125
+ // src/data/data.depth.ts
4126
+ var DataDepth = class extends DataNumber {
4127
+ static {
4128
+ this.type = "Depth";
4129
+ }
4130
+ static {
4131
+ this.unit = "m";
4132
+ }
4133
+ };
4134
+
4135
+ // src/data/data.depth-max.ts
4136
+ var DataDepthMax = class extends DataNumber {
4137
+ static {
4138
+ this.type = "Maximum Depth";
4139
+ }
4140
+ static {
4141
+ this.unit = "m";
4142
+ }
4143
+ };
4144
+
4017
4145
  // src/data/data.store.ts
4018
4146
  var DataTotalTrainingEffectLegacy = class extends DataAerobicTrainingEffect {
4019
4147
  static {
@@ -4309,7 +4437,21 @@ var DataStore = {
4309
4437
  DataRightTorqueEffectiveness,
4310
4438
  DataTotalFlow,
4311
4439
  DataTotalGrit,
4312
- DataTrainingLoadPeak
4440
+ DataTrainingLoadPeak,
4441
+ DataGroundContactTime,
4442
+ DataGroundContactTimeAvg,
4443
+ DataGroundContactTimeMax,
4444
+ DataGroundContactTimeMin,
4445
+ DataGroundContactTimeBalance,
4446
+ DataGroundContactTimeBalanceLeft,
4447
+ DataGroundContactTimeBalanceRight,
4448
+ DataVerticalOscillationAvg,
4449
+ DataVerticalOscillationMax,
4450
+ DataVerticalOscillationMin,
4451
+ DataFitnessAge,
4452
+ DataMaxHRSetting,
4453
+ DataDepth,
4454
+ DataDepthMax
4313
4455
  };
4314
4456
  var DynamicDataLoader = class _DynamicDataLoader {
4315
4457
  static {
@@ -4540,6 +4682,13 @@ var DynamicDataLoader = class _DynamicDataLoader {
4540
4682
  ];
4541
4683
  }
4542
4684
  static getDataInstanceFromDataType(dataType, opts) {
4685
+ if (dataType === DataStanceTime.type) {
4686
+ dataType = DataGroundContactTime.type;
4687
+ } else if (dataType === DataStanceTimeBalanceLeft.type) {
4688
+ dataType = DataGroundContactTimeBalanceLeft.type;
4689
+ } else if (dataType === DataStanceTimeBalanceRight.type) {
4690
+ dataType = DataGroundContactTimeBalanceRight.type;
4691
+ }
4543
4692
  const className = Object.keys(DataStore).find((dataClass) => {
4544
4693
  return DataStore[dataClass] && DataStore[dataClass].type && DataStore[dataClass].type === dataType;
4545
4694
  });
@@ -6463,11 +6612,34 @@ var ActivityUtilities = class _ActivityUtilities {
6463
6612
  activity.addStat(new DataRightBalance(avgRightBalance));
6464
6613
  activity.addStat(new DataLeftBalance(100 - avgRightBalance));
6465
6614
  }
6615
+ if (!activity.getStat(DataGroundContactTimeBalanceLeft.type) && activity.hasStreamData(DataGroundContactTimeBalanceLeft.type)) {
6616
+ const avgStanceTimeLeftBalance = this.round(this.getDataTypeAvg(activity, DataGroundContactTimeBalanceLeft.type), 2);
6617
+ activity.addStat(new DataGroundContactTimeBalanceLeft(avgStanceTimeLeftBalance));
6618
+ activity.addStat(new DataGroundContactTimeBalanceRight(100 - avgStanceTimeLeftBalance));
6619
+ }
6466
6620
  if (!activity.getStat(DataStanceTimeBalanceLeft.type) && activity.hasStreamData(DataStanceTimeBalanceLeft.type)) {
6467
6621
  const avgStanceTimeLeftBalance = this.round(this.getDataTypeAvg(activity, DataStanceTimeBalanceLeft.type), 2);
6468
6622
  activity.addStat(new DataStanceTimeBalanceLeft(avgStanceTimeLeftBalance));
6469
6623
  activity.addStat(new DataStanceTimeBalanceRight(100 - avgStanceTimeLeftBalance));
6470
6624
  }
6625
+ if (!activity.getStat(DataGroundContactTimeMax.type) && activity.hasStreamData(DataGroundContactTime.type)) {
6626
+ activity.addStat(new DataGroundContactTimeMax(this.getDataTypeMax(activity, DataGroundContactTime.type)));
6627
+ }
6628
+ if (!activity.getStat(DataGroundContactTimeMin.type) && activity.hasStreamData(DataGroundContactTime.type)) {
6629
+ activity.addStat(new DataGroundContactTimeMin(this.getDataTypeMin(activity, DataGroundContactTime.type)));
6630
+ }
6631
+ if (!activity.getStat(DataGroundContactTimeAvg.type) && activity.hasStreamData(DataGroundContactTime.type)) {
6632
+ activity.addStat(new DataGroundContactTimeAvg(this.getDataTypeAvg(activity, DataGroundContactTime.type)));
6633
+ }
6634
+ if (!activity.getStat(DataVerticalOscillationMax.type) && activity.hasStreamData(DataVerticalOscillation.type)) {
6635
+ activity.addStat(new DataVerticalOscillationMax(this.getDataTypeMax(activity, DataVerticalOscillation.type)));
6636
+ }
6637
+ if (!activity.getStat(DataVerticalOscillationMin.type) && activity.hasStreamData(DataVerticalOscillation.type)) {
6638
+ activity.addStat(new DataVerticalOscillationMin(this.getDataTypeMin(activity, DataVerticalOscillation.type)));
6639
+ }
6640
+ if (!activity.getStat(DataVerticalOscillationAvg.type) && activity.hasStreamData(DataVerticalOscillation.type)) {
6641
+ activity.addStat(new DataVerticalOscillationAvg(this.getDataTypeAvg(activity, DataVerticalOscillation.type)));
6642
+ }
6471
6643
  }
6472
6644
  static generateMissingSpeedDerivedStatsForActivity(activity) {
6473
6645
  const speedMax = activity.getStat(DataSpeedMax.type);
@@ -9601,12 +9773,32 @@ var FITSampleMapper = [
9601
9773
  return sample.left_right_balance.right === false ? sample.left_right_balance.value : 100 - sample.left_right_balance.value;
9602
9774
  }
9603
9775
  },
9776
+ {
9777
+ dataType: DataGroundContactTime.type,
9778
+ getSampleValue: (sample) => {
9779
+ return sample.stance_time;
9780
+ }
9781
+ },
9782
+ // Keep DataStanceTime for backward compatibility
9604
9783
  {
9605
9784
  dataType: DataStanceTime.type,
9606
9785
  getSampleValue: (sample) => {
9607
9786
  return sample.stance_time;
9608
9787
  }
9609
9788
  },
9789
+ {
9790
+ dataType: DataGroundContactTimeBalanceLeft.type,
9791
+ getSampleValue: (sample) => {
9792
+ return sample.stance_time_balance;
9793
+ }
9794
+ },
9795
+ {
9796
+ dataType: DataGroundContactTimeBalanceRight.type,
9797
+ getSampleValue: (sample) => {
9798
+ return isNumber(sample.stance_time_balance) ? 100 - sample.stance_time_balance : null;
9799
+ }
9800
+ },
9801
+ // Keep DataStanceTimeBalanceLeft for backward compatibility
9610
9802
  {
9611
9803
  dataType: DataStanceTimeBalanceLeft.type,
9612
9804
  getSampleValue: (sample) => {
@@ -10542,6 +10734,7 @@ var EventImporterFIT = class {
10542
10734
  stats.push(new DataCyclingSeatedTime(seatedTime));
10543
10735
  }
10544
10736
  if (Number.isFinite(object.avg_stance_time)) {
10737
+ stats.push(new DataGroundContactTimeAvg(object.avg_stance_time));
10545
10738
  stats.push(new DataStanceTime(object.avg_stance_time));
10546
10739
  }
10547
10740
  if (Number.isFinite(object.avg_vertical_oscillation)) {
@@ -11051,9 +11244,11 @@ var EventImporterSuuntoJSON = class {
11051
11244
  }).map((lapWindow) => lapWindow.Window) : [];
11052
11245
  const activities = activityStartEventSamples.map(
11053
11246
  (activityStartEventSample, index) => {
11247
+ const lastSampleTime = eventJSONObject.DeviceLog.Samples[eventJSONObject.DeviceLog.Samples.length - 1].TimeISO8601;
11248
+ const fallbackEndTime = stopEventSample ? stopEventSample.TimeISO8601 : lastSampleTime;
11054
11249
  const activity = new Activity(
11055
11250
  new Date(activityStartEventSample.TimeISO8601),
11056
- activityStartEventSamples.length - 1 === index ? new Date(stopEventSample ? stopEventSample.TimeISO8601 : eventJSONObject.DeviceLog.Header.TimeISO8601 || eventJSONObject.DeviceLog.Header.DateTime) : new Date(activityStartEventSamples[index + 1].TimeISO8601),
11251
+ activityStartEventSamples.length - 1 === index ? new Date(fallbackEndTime) : new Date(activityStartEventSamples[index + 1].TimeISO8601),
11057
11252
  ActivityTypes[ImporterSuuntoActivityIds[activityStartEventSample.Events[0].Activity.ActivityType]],
11058
11253
  creator,
11059
11254
  options
@@ -11174,9 +11369,6 @@ var EventImporterSuuntoJSON = class {
11174
11369
  }
11175
11370
  const event = new Event("", activities[0].startDate, activities[activities.length - 1].endDate, "suunto" /* SUUNTO */);
11176
11371
  activities.forEach((activity) => event.addActivity(activity));
11177
- this.getStats(eventJSONObject.DeviceLog.Header).forEach((stat) => {
11178
- event.addStat(stat);
11179
- });
11180
11372
  if (eventJSONObject.DeviceLog.Header.Settings) {
11181
11373
  this.getSettings(eventJSONObject.DeviceLog.Header.Settings).forEach((stat) => {
11182
11374
  event.getActivities().forEach((activity) => activity.addStat(stat));
@@ -11189,6 +11381,9 @@ var EventImporterSuuntoJSON = class {
11189
11381
  stats.forEach((stat) => activities[0].addStat(stat));
11190
11382
  }
11191
11383
  EventUtilities.generateStatsForAll(event);
11384
+ this.getStats(eventJSONObject.DeviceLog.Header).forEach((stat) => {
11385
+ event.addStat(stat);
11386
+ });
11192
11387
  resolve(event);
11193
11388
  });
11194
11389
  }
@@ -11427,6 +11622,47 @@ var EventImporterSuuntoJSON = class {
11427
11622
  }
11428
11623
  }
11429
11624
  }
11625
+ if (object.hasOwnProperty("GroundContactTime")) {
11626
+ if (Array.isArray(object.GroundContactTime)) {
11627
+ if (isNumber(object.GroundContactTime[0].Avg)) {
11628
+ stats.push(new DataGroundContactTimeAvg(object.GroundContactTime[0].Avg * 1e3));
11629
+ }
11630
+ if (isNumber(object.GroundContactTime[0].Max)) {
11631
+ stats.push(new DataGroundContactTimeMax(object.GroundContactTime[0].Max * 1e3));
11632
+ }
11633
+ if (isNumber(object.GroundContactTime[0].Min)) {
11634
+ stats.push(new DataGroundContactTimeMin(object.GroundContactTime[0].Min * 1e3));
11635
+ }
11636
+ }
11637
+ }
11638
+ if (object.hasOwnProperty("VerticalOscillation")) {
11639
+ if (Array.isArray(object.VerticalOscillation)) {
11640
+ if (isNumber(object.VerticalOscillation[0].Avg)) {
11641
+ stats.push(new DataVerticalOscillationAvg(object.VerticalOscillation[0].Avg * 1e3));
11642
+ }
11643
+ if (isNumber(object.VerticalOscillation[0].Max)) {
11644
+ stats.push(new DataVerticalOscillationMax(object.VerticalOscillation[0].Max * 1e3));
11645
+ }
11646
+ if (isNumber(object.VerticalOscillation[0].Min)) {
11647
+ stats.push(new DataVerticalOscillationMin(object.VerticalOscillation[0].Min * 1e3));
11648
+ }
11649
+ }
11650
+ }
11651
+ if (isNumber(object.FitnessAge)) {
11652
+ stats.push(new DataFitnessAge(object.FitnessAge));
11653
+ }
11654
+ if (object.Personal && isNumber(object.Personal.MaxHR)) {
11655
+ stats.push(new DataMaxHRSetting(object.Personal.MaxHR * 60));
11656
+ }
11657
+ if (object.hasOwnProperty("Depth")) {
11658
+ if (Array.isArray(object.Depth)) {
11659
+ if (isNumber(object.Depth[0].Max) && object.Depth[0].Max > 0) {
11660
+ stats.push(new DataDepthMax(object.Depth[0].Max));
11661
+ }
11662
+ } else if (isNumber(object.Depth.Max) && object.Depth.Max > 0) {
11663
+ stats.push(new DataDepthMax(object.Depth.Max));
11664
+ }
11665
+ }
11430
11666
  return stats;
11431
11667
  }
11432
11668
  };
@@ -11618,6 +11854,23 @@ var SuuntoSampleMapper = [
11618
11854
  dataType: DataBatteryVoltage.type,
11619
11855
  sampleField: "BatteryVoltage",
11620
11856
  convertSampleValue: (value) => Number(value)
11857
+ },
11858
+ {
11859
+ dataType: DataVerticalOscillation.type,
11860
+ sampleField: "VerticalOscillation",
11861
+ convertSampleValue: (value) => Number(value * 1e3)
11862
+ // Convert m to mm
11863
+ },
11864
+ {
11865
+ dataType: DataGroundContactTime.type,
11866
+ sampleField: "GroundContactTime",
11867
+ convertSampleValue: (value) => Number(value * 1e3)
11868
+ // Convert s to ms
11869
+ },
11870
+ {
11871
+ dataType: DataDepth.type,
11872
+ sampleField: "Depth",
11873
+ convertSampleValue: (value) => Number(value)
11621
11874
  }
11622
11875
  ];
11623
11876
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sports-alliance/sports-lib",
3
- "version": "7.1.2",
3
+ "version": "7.2.2",
4
4
  "description": "A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc",
5
5
  "keywords": [
6
6
  "gpx",
@@ -54,7 +54,7 @@
54
54
  "license": "SEE LICENSE IN LICENSE.md",
55
55
  "dependencies": {
56
56
  "fast-xml-parser": "^5.3.3",
57
- "fit-file-parser": "2.2.2",
57
+ "fit-file-parser": "2.2.4",
58
58
  "geolib": "^3.3.4",
59
59
  "gpx-builder": "^3.7.8",
60
60
  "kalmanjs": "^1.1.0",