@sports-alliance/sports-lib 6.1.14 → 7.0.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 (112) hide show
  1. package/.github/workflows/test.yml +2 -2
  2. package/lib/cjs/activities/activity.types.d.ts +6 -3
  3. package/lib/cjs/activities/activity.types.js +9 -4
  4. package/lib/cjs/data/data.cycling-position.js +1 -1
  5. package/lib/cjs/data/data.feeling.js +1 -1
  6. package/lib/cjs/data/data.interface.js +1 -1
  7. package/lib/cjs/data/data.rpe.js +1 -1
  8. package/lib/cjs/data/data.store.export.spec.js +28 -14
  9. package/lib/cjs/data/data.store.js +1 -1
  10. package/lib/cjs/events/adapters/file-type.enum.js +1 -1
  11. package/lib/cjs/events/adapters/importers/fit/importer.fit.coros.device.names.js +2 -1
  12. package/lib/cjs/events/adapters/importers/fit/importer.fit.d.ts +2 -1
  13. package/lib/cjs/events/adapters/importers/fit/importer.fit.garmin.device.names.js +61 -2
  14. package/lib/cjs/events/adapters/importers/fit/importer.fit.garmin.profile.data.js +867 -855
  15. package/lib/cjs/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.spec.js +34 -0
  16. package/lib/cjs/events/adapters/importers/fit/importer.fit.integration.spec.js +22 -8
  17. package/lib/cjs/events/adapters/importers/fit/importer.fit.js +24 -2
  18. package/lib/cjs/events/adapters/importers/fit/importer.fit.suunto.device.names.js +1 -0
  19. package/lib/cjs/events/adapters/importers/fit/importer.fit.wahoo.device.names.js +5 -1
  20. package/lib/cjs/events/adapters/importers/gpx/importer.gpx.integration.spec.js +22 -8
  21. package/lib/cjs/events/adapters/importers/gpx/importer.gpx.js +1 -1
  22. package/lib/cjs/events/adapters/importers/gpx/importer.gpx.spec.js +50 -0
  23. package/lib/cjs/events/adapters/importers/suunto/importer.suunto.activity.ids.js +1 -1
  24. package/lib/cjs/events/adapters/importers/suunto/importer.suunto.device.names.js +1 -0
  25. package/lib/cjs/events/adapters/importers/suunto/importer.suunto.integration.spec.js +22 -8
  26. package/lib/cjs/events/adapters/importers/tcx/importer.tcx.integration.spec.js +22 -8
  27. package/lib/cjs/events/utilities/activity.utilities.js +7 -7
  28. package/lib/cjs/events/utilities/grade-calculator/low-pass-filter.js +3 -3
  29. package/lib/cjs/events/utilities/helpers.d.ts +1 -1
  30. package/lib/cjs/events/utilities/helpers.js +19 -19
  31. package/lib/cjs/index.d.ts +1 -1
  32. package/lib/cjs/index.js +5 -1
  33. package/lib/cjs/laps/lap.types.js +1 -1
  34. package/lib/cjs/meta-data/event-meta-data.interface.d.ts +4 -4
  35. package/lib/cjs/meta-data/event-meta-data.interface.js +2 -2
  36. package/lib/cjs/meta-data/meta-data.d.ts +4 -4
  37. package/lib/cjs/meta-data/meta-data.js +4 -4
  38. package/lib/cjs/meta-data/meta-data.json.interface.d.ts +1 -1
  39. package/lib/cjs/privacy/privacy.class.interface.js +1 -1
  40. package/lib/cjs/specs/activities-parsing.integration.spec.js +75 -61
  41. package/lib/cjs/specs/strava-streams-compliance.spec.js +22 -8
  42. package/lib/cjs/streams/compressed.stream.interface.js +2 -2
  43. package/lib/cjs/tiles/tile.settings.interface.js +5 -5
  44. package/lib/cjs/users/settings/dashboard/user.dashboard.settings.interface.js +1 -1
  45. package/lib/cjs/users/settings/user.app.settings.interface.js +1 -1
  46. package/lib/cjs/users/settings/user.chart.settings.interface.js +3 -3
  47. package/lib/cjs/users/settings/user.map.settings.interface.js +2 -2
  48. package/lib/cjs/users/settings/user.unit.settings.interface.js +9 -9
  49. package/lib/esm/activities/activity.types.d.ts +6 -3
  50. package/lib/esm/activities/activity.types.js +7 -2
  51. package/lib/esm/data/data.store.export.spec.js +6 -6
  52. package/lib/esm/data/data.store.js +1 -1
  53. package/lib/esm/events/adapters/importers/fit/importer.fit.coros.device.names.js +2 -1
  54. package/lib/esm/events/adapters/importers/fit/importer.fit.d.ts +2 -1
  55. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.device.names.js +61 -2
  56. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.data.js +867 -855
  57. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.spec.js +32 -0
  58. package/lib/esm/events/adapters/importers/fit/importer.fit.js +24 -2
  59. package/lib/esm/events/adapters/importers/fit/importer.fit.suunto.device.names.js +1 -0
  60. package/lib/esm/events/adapters/importers/fit/importer.fit.wahoo.device.names.js +5 -1
  61. package/lib/esm/events/adapters/importers/gpx/importer.gpx.js +1 -1
  62. package/lib/esm/events/adapters/importers/gpx/importer.gpx.spec.js +17 -0
  63. package/lib/esm/events/adapters/importers/suunto/importer.suunto.device.names.js +1 -0
  64. package/lib/esm/events/utilities/activity.utilities.js +7 -7
  65. package/lib/esm/events/utilities/grade-calculator/low-pass-filter.js +3 -3
  66. package/lib/esm/events/utilities/helpers.d.ts +1 -1
  67. package/lib/esm/index.d.ts +1 -1
  68. package/lib/esm/meta-data/event-meta-data.interface.d.ts +4 -4
  69. package/lib/esm/meta-data/event-meta-data.interface.js +1 -1
  70. package/lib/esm/meta-data/meta-data.d.ts +4 -4
  71. package/lib/esm/meta-data/meta-data.js +2 -2
  72. package/lib/esm/meta-data/meta-data.json.interface.d.ts +1 -1
  73. package/lib/esm/specs/activities-parsing.integration.spec.js +53 -53
  74. package/package.json +21 -21
  75. package/.editorconfig +0 -14
  76. package/.eslintignore +0 -4
  77. package/.eslintrc.js +0 -9
  78. package/.prettierignore +0 -24
  79. package/.prettierrc.json +0 -12
  80. package/.vscode/launch.json +0 -49
  81. package/.vscode/tasks.json +0 -34
  82. package/CODE_OF_CONDUCT.md +0 -76
  83. package/jest.config.js +0 -23
  84. package/lib/cjs/events/adapters/importers/fit/importer.fit.oom.spec.js +0 -60
  85. package/lib/cjs/package.json +0 -1
  86. package/lib/cjs/specs/fixtures/streams/strava/rides/3171472783.json +0 -52534
  87. package/lib/cjs/specs/fixtures/streams/strava/rides/3171487458.json +0 -78818
  88. package/lib/cjs/specs/fixtures/streams/strava/rides/343080886.json +0 -105090
  89. package/lib/cjs/specs/fixtures/streams/strava/rides/5910143591.json +0 -110711
  90. package/lib/cjs/specs/fixtures/streams/strava/runs/2451375851.json +0 -74846
  91. package/lib/cjs/specs/fixtures/streams/strava/runs/2709634581.json +0 -66817
  92. package/lib/cjs/specs/fixtures/streams/strava/runs/3156040843.json +0 -17594
  93. package/lib/cjs/specs/fixtures/streams/strava/runs/3182900697.json +0 -17322
  94. package/lib/cjs/specs/fixtures/streams/strava/runs/3183465494.json +0 -20463
  95. package/lib/cjs/specs/fixtures/streams/strava/runs/3183490558.json +0 -58202
  96. package/lib/esm/events/adapters/importers/fit/importer.fit.oom.spec.js +0 -39
  97. package/lib/esm/specs/fixtures/streams/strava/rides/3171472783.json +0 -52534
  98. package/lib/esm/specs/fixtures/streams/strava/rides/3171487458.json +0 -78818
  99. package/lib/esm/specs/fixtures/streams/strava/rides/343080886.json +0 -105090
  100. package/lib/esm/specs/fixtures/streams/strava/rides/5910143591.json +0 -110711
  101. package/lib/esm/specs/fixtures/streams/strava/runs/2451375851.json +0 -74846
  102. package/lib/esm/specs/fixtures/streams/strava/runs/2709634581.json +0 -66817
  103. package/lib/esm/specs/fixtures/streams/strava/runs/3156040843.json +0 -17594
  104. package/lib/esm/specs/fixtures/streams/strava/runs/3182900697.json +0 -17322
  105. package/lib/esm/specs/fixtures/streams/strava/runs/3183465494.json +0 -20463
  106. package/lib/esm/specs/fixtures/streams/strava/runs/3183490558.json +0 -58202
  107. package/reproduce_oom.ts +0 -35
  108. package/tsconfig.cjs.json +0 -7
  109. package/tsconfig.esm.json +0 -8
  110. package/tsconfig.lib.json +0 -8
  111. /package/lib/cjs/events/adapters/importers/fit/{importer.fit.oom.spec.d.ts → importer.fit.garmin.profile.mapper.spec.d.ts} +0 -0
  112. /package/lib/esm/events/adapters/importers/fit/{importer.fit.oom.spec.d.ts → importer.fit.garmin.profile.mapper.spec.d.ts} +0 -0
@@ -140,12 +140,12 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
140
140
  expect(activity.hasStreamData(DataCadence.type)).toBeTruthy();
141
141
  expect(activity.hasStreamData(DataDistance.type)).toBeTruthy();
142
142
  SpecUtils.assertNearEqualTime(SpecUtils.speedToSwimPace(activity.getStat(DataSpeedAvg.type).getValue()), '01:50');
143
- SpecUtils.assertNearEqualTime(movingTime, '57:53');
143
+ SpecUtils.assertNearEqualTime(movingTime, '44:06');
144
144
  SpecUtils.assertNearEqualTime(timerTime, '01:06:03');
145
145
  SpecUtils.assertNearEqualTime(elapsedTime, '01:06:23');
146
146
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
147
147
  done();
148
- });
148
+ }).catch((e) => done(e));
149
149
  });
150
150
  it('should parse swimming pool FIT file (2)', done => {
151
151
  // Given FIT Source: https://connect.garmin.com/modern/activity/6021532030 OR https://www.strava.com/activities/5258304128
@@ -176,7 +176,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
176
176
  SpecUtils.assertNearEqualTime(elapsedTime, '23:31');
177
177
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
178
178
  done();
179
- });
179
+ }).catch((e) => done(e));
180
180
  });
181
181
  it('should parse swimming pool FIT file (3)', done => {
182
182
  // Given FIT Source: https://connect.garmin.com/modern/activity/6860712481 OR https://www.strava.com/activities/5376106733
@@ -204,12 +204,12 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
204
204
  const timerTime = activity.getStat(DataTimerTime.type).getValue();
205
205
  const pauseTime = activity.getStat(DataPause.type).getValue();
206
206
  const elapsedTime = activity.getDuration().getValue();
207
- SpecUtils.assertNearEqualTime(movingTime, '39:34');
207
+ SpecUtils.assertNearEqualTime(movingTime, '41:25');
208
208
  SpecUtils.assertNearEqualTime(timerTime, '47:27');
209
209
  SpecUtils.assertNearEqualTime(elapsedTime, '49:43');
210
210
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
211
211
  done();
212
- });
212
+ }).catch((e) => done(e));
213
213
  });
214
214
  it('should parse swimming pool FIT file (4)', done => {
215
215
  // Given FIT Source: https://connect.garmin.com/modern/activity/7617306288 OR https://www.strava.com/activities/6076695527
@@ -225,7 +225,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
225
225
  SpecUtils.assertNearEqualTime(SpecUtils.speedToSwimPace(activity.getStat(DataSpeedAvg.type).getValue()), '01:54');
226
226
  expect(activity.getLaps().length).toEqual(6);
227
227
  done();
228
- });
228
+ }).catch((e) => done(e));
229
229
  });
230
230
  it('should parse swimming open water FIT file (1)', done => {
231
231
  // Given https://connect.garmin.com/modern/activity/6788312639/1 OR https://www.strava.com/activities/5305763421
@@ -256,7 +256,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
256
256
  SpecUtils.assertNearEqualTime(elapsedTime, '31:06');
257
257
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
258
258
  done();
259
- });
259
+ }).catch((e) => done(e));
260
260
  });
261
261
  });
262
262
  describe('TCX', () => {
@@ -290,7 +290,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
290
290
  SpecUtils.assertNearEqualTime(elapsedTime, '01:06:23');
291
291
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime);
292
292
  done();
293
- });
293
+ }).catch((e) => done(e));
294
294
  });
295
295
  it('should parse swimming pool TCX file (2)', done => {
296
296
  // Given TCX Source: https://connect.garmin.com/modern/activity/6861441616 or https://www.strava.com/activities/5378130384
@@ -318,7 +318,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
318
318
  SpecUtils.assertNearEqualTime(elapsedTime, '47:27');
319
319
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
320
320
  done();
321
- });
321
+ }).catch((e) => done(e));
322
322
  });
323
323
  });
324
324
  describe('GPX', () => {
@@ -353,7 +353,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
353
353
  SpecUtils.assertNearEqualTime(elapsedTime, '01:01:29');
354
354
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
355
355
  done();
356
- });
356
+ }).catch((e) => done(e));
357
357
  });
358
358
  it('should parse swimming open water GPX file (2)', done => {
359
359
  // Given GPX Source: https://connect.garmin.com/modern/activity/6867446668 OR https://www.strava.com/activities/5382426315
@@ -382,7 +382,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
382
382
  SpecUtils.assertNearEqualTime(elapsedTime, '01:14:47');
383
383
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
384
384
  done();
385
- });
385
+ }).catch((e) => done(e));
386
386
  });
387
387
  });
388
388
  });
@@ -418,7 +418,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
418
418
  SpecUtils.assertNearEqualTime(elapsedTime, '47:04');
419
419
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
420
420
  done();
421
- });
421
+ }).catch((e) => done(e));
422
422
  });
423
423
  it('should parse running FIT file (2)', done => {
424
424
  // Given FIT Source: https://connect.garmin.com/modern/activity/6782987395 OR https://www.strava.com/activities/2451375851
@@ -451,7 +451,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
451
451
  SpecUtils.assertNearEqualTime(elapsedTime, '01:23:09');
452
452
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
453
453
  done();
454
- });
454
+ }).catch((e) => done(e));
455
455
  });
456
456
  it('should parse running FIT file (Suunto export) (3)', done => {
457
457
  // Given FIT Source (Suunto export): https://connect.garmin.com/modern/activity/6909950168 OR https://www.strava.com/activities/5423646653
@@ -485,7 +485,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
485
485
  SpecUtils.assertNearEqualTime(elapsedTime, '36:36');
486
486
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
487
487
  done();
488
- });
488
+ }).catch((e) => done(e));
489
489
  });
490
490
  it('should parse running FIT file (Suunto export) (4)', done => {
491
491
  // Given FIT Source (Suunto export): https://connect.garmin.com/modern/activity/6910052863 OR https://www.strava.com/activities/5423660493
@@ -517,7 +517,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
517
517
  SpecUtils.assertNearEqualTime(elapsedTime, '02:40:02');
518
518
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
519
519
  done();
520
- });
520
+ }).catch((e) => done(e));
521
521
  });
522
522
  it('should parse running FIT file (Suunto export) (5)', done => {
523
523
  // Given FIT Source (Suunto export): https://connect.garmin.com/modern/activity/6914448270 OR https://www.strava.com/activities/5427988571
@@ -547,7 +547,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
547
547
  SpecUtils.assertNearEqualTime(elapsedTime, '05:40:19');
548
548
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
549
549
  done();
550
- });
550
+ }).catch((e) => done(e));
551
551
  });
552
552
  it('should parse running FIT file (Suunto export) (6)', done => {
553
553
  // Given FIT Source (Suunto export): https://connect.garmin.com/modern/activity/6914538454 OR https://www.strava.com/activities/5428064152
@@ -577,7 +577,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
577
577
  SpecUtils.assertNearEqualTime(elapsedTime, '21:04');
578
578
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
579
579
  done();
580
- });
580
+ }).catch((e) => done(e));
581
581
  });
582
582
  it('should parse running FIT file (Coros export) (7)', done => {
583
583
  // Given FIT Source (Coros export): https://connect.garmin.com/modern/activity/6916663933 OR https://www.strava.com/activities/5429996380
@@ -618,7 +618,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
618
618
  SpecUtils.assertNearEqualTime(elapsedTime, '48:42');
619
619
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
620
620
  done();
621
- });
621
+ }).catch((e) => done(e));
622
622
  });
623
623
  it('should parse running FIT file (Coros export) (8)', done => {
624
624
  // Given FIT Source (Coros export): https://connect.garmin.com/modern/activity/6916728382 OR https://www.strava.com/activities/5430055225
@@ -651,7 +651,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
651
651
  SpecUtils.assertNearEqualTime(elapsedTime, '02:41:39');
652
652
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
653
653
  done();
654
- });
654
+ }).catch((e) => done(e));
655
655
  });
656
656
  it('should parse running treadmill FIT file (1)', done => {
657
657
  // Given FIT Source: https://connect.garmin.com/modern/activity/6860622783 or https://www.strava.com/activities/5375834427
@@ -690,7 +690,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
690
690
  SpecUtils.assertNearEqualTime(elapsedTime, '01:02:44');
691
691
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
692
692
  done();
693
- });
693
+ }).catch((e) => done(e));
694
694
  });
695
695
  });
696
696
  describe('TCX', () => {
@@ -723,7 +723,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
723
723
  SpecUtils.assertNearEqualTime(elapsedTime, '01:07:47');
724
724
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
725
725
  done();
726
- });
726
+ }).catch((e) => done(e));
727
727
  });
728
728
  it('should parse running TCX file (2)', done => {
729
729
  // Given TCX Source: https://connect.garmin.com/modern/activity/6851149716 OR https://www.strava.com/activities/5366592367
@@ -757,7 +757,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
757
757
  SpecUtils.assertNearEqualTime(elapsedTime, '01:23:09');
758
758
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
759
759
  done();
760
- });
760
+ }).catch((e) => done(e));
761
761
  });
762
762
  it('should parse running TCX file (3)', done => {
763
763
  // Given TCX Source: https://connect.garmin.com/modern/activity/6860622916 or https://www.strava.com/activities/5375754773
@@ -789,7 +789,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
789
789
  SpecUtils.assertNearEqualTime(elapsedTime, '01:02:17');
790
790
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
791
791
  done();
792
- });
792
+ }).catch((e) => done(e));
793
793
  });
794
794
  it('should parse running TCX file (4)', done => {
795
795
  // Given TCX Source: (garmin connect upload impossible) or https://www.strava.com/activities/6281425038
@@ -814,7 +814,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
814
814
  SpecUtils.assertNearEqualTime(elapsedTime, '36:02');
815
815
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
816
816
  done();
817
- });
817
+ }).catch((e) => done(e));
818
818
  });
819
819
  it('should parse running treadmill TCX file (3)', done => {
820
820
  // Given FIT Source: https://connect.garmin.com/modern/activity/6860622783 or https://www.strava.com/activities/5375834427
@@ -842,7 +842,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
842
842
  SpecUtils.assertNearEqualTime(elapsedTime, '01:02:44');
843
843
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
844
844
  done();
845
- });
845
+ }).catch((e) => done(e));
846
846
  });
847
847
  });
848
848
  describe('GPX', () => {
@@ -876,7 +876,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
876
876
  SpecUtils.assertNearEqualTime(elapsedTime, '47:04');
877
877
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
878
878
  done();
879
- });
879
+ }).catch((e) => done(e));
880
880
  });
881
881
  it('should parse running GPX file (2)', done => {
882
882
  // Given GPX Source: https://connect.garmin.com/modern/activity/6870566668 OR https://www.strava.com/activities/5385561485
@@ -907,7 +907,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
907
907
  SpecUtils.assertNearEqualTime(elapsedTime, '01:23:09');
908
908
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
909
909
  done();
910
- });
910
+ }).catch((e) => done(e));
911
911
  });
912
912
  it('should parse running GPX file (3)', done => {
913
913
  // Given Recorded with "Strava Android App" => https://connect.garmin.com/modern/activity/1681613317 OR https://www.strava.com/activities/906581465
@@ -939,7 +939,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
939
939
  SpecUtils.assertNearEqualTime(elapsedTime, '32:38');
940
940
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
941
941
  done();
942
- });
942
+ }).catch((e) => done(e));
943
943
  });
944
944
  it('should parse running GPX file (4)', done => {
945
945
  // Given Recorded with "MyTracks" => https://connect.garmin.com/modern/activity/6909258631 OR https://www.strava.com/activities/5422847134
@@ -964,7 +964,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
964
964
  SpecUtils.assertNearEqualTime(elapsedTime, '06:30:22');
965
965
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
966
966
  done();
967
- });
967
+ }).catch((e) => done(e));
968
968
  });
969
969
  it('should parse running GPX file (5)', done => {
970
970
  // Given https://connect.garmin.com/modern/activity/6048438275 OR https://www.strava.com/activities/3497177564
@@ -978,7 +978,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
978
978
  expect(activity.type).toEqual(ActivityTypes.run);
979
979
  expect(activity.hasPowerMeter()).toBeFalsy();
980
980
  expect(activity.isTrainer()).toBeFalsy();
981
- expect(activity.getStat(DataDistance.type).getValue()).toBeCloseTo(16771.3, 0);
981
+ SpecUtils.assertNearEqual(activity.getStat(DataDistance.type).getValue(), 16771.3, 1, 1);
982
982
  expect(activity.getStat(DataAscent.type).getValue()).toBeCloseTo(579, 0);
983
983
  expect(activity.getStat(DataCadenceAvg.type).getValue()).toEqual(86);
984
984
  expect(activity.getStat(DataCadenceMax.type).getValue()).toEqual(123);
@@ -995,7 +995,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
995
995
  SpecUtils.assertNearEqualTime(elapsedTime, '01:22:50');
996
996
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
997
997
  done();
998
- });
998
+ }).catch((e) => done(e));
999
999
  });
1000
1000
  it('should parse running GPX file (6)', done => {
1001
1001
  // Given https://www.strava.com/activities/3632493456 or https://connect.garmin.com/modern/activity/6037744996
@@ -1009,7 +1009,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1009
1009
  expect(activity.type).toEqual(ActivityTypes.run);
1010
1010
  expect(activity.hasPowerMeter()).toBeFalsy();
1011
1011
  expect(activity.isTrainer()).toBeFalsy();
1012
- expect(activity.getStat(DataDistance.type).getValue()).toBeCloseTo(5115.1, 0);
1012
+ SpecUtils.assertNearEqual(activity.getStat(DataDistance.type).getValue(), 5115.1, 1, 1);
1013
1013
  expect(activity.getStat(DataAscent.type).getValue()).toBeCloseTo(516, 0);
1014
1014
  expect(activity.getStat(DataCadenceAvg.type).getValue()).toEqual(68);
1015
1015
  expect(activity.getStat(DataCadenceMax.type).getValue()).toEqual(124);
@@ -1025,7 +1025,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1025
1025
  SpecUtils.assertNearEqualTime(elapsedTime, '01:07:19');
1026
1026
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1027
1027
  done();
1028
- });
1028
+ }).catch((e) => done(e));
1029
1029
  });
1030
1030
  });
1031
1031
  });
@@ -1081,7 +1081,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1081
1081
  SpecUtils.assertNearEqualTime(elapsedTime, '02:04:36');
1082
1082
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1083
1083
  done();
1084
- });
1084
+ }).catch((e) => done(e));
1085
1085
  });
1086
1086
  it('should parse cycling FIT file (2)', done => {
1087
1087
  // Given FIT Source: https://connect.garmin.com/modern/activity/828989227 OR https://www.strava.com/activities/343080886
@@ -1113,7 +1113,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1113
1113
  SpecUtils.assertNearEqualTime(elapsedTime, '06:07:08');
1114
1114
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1115
1115
  done();
1116
- });
1116
+ }).catch((e) => done(e));
1117
1117
  });
1118
1118
  it('should parse cycling FIT file (3)', done => {
1119
1119
  // Given FIT Source: https://connect.garmin.com/modern/activity/614953343 OR https://www.strava.com/activities/208748758
@@ -1135,7 +1135,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1135
1135
  SpecUtils.assertNearEqualTime(elapsedTime, '07:04:31');
1136
1136
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1137
1137
  done();
1138
- });
1138
+ }).catch((e) => done(e));
1139
1139
  });
1140
1140
  it('should parse cycling FIT file (4)', done => {
1141
1141
  // Given FIT Source: https://connect.garmin.com/modern/activity/6783622686 OR https://www.strava.com/activities/5300988022
@@ -1156,7 +1156,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1156
1156
  SpecUtils.assertNearEqualTime(elapsedTime, '07:26:55');
1157
1157
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1158
1158
  done();
1159
- });
1159
+ }).catch((e) => done(e));
1160
1160
  });
1161
1161
  it('should parse cycling FIT file (5)', done => {
1162
1162
  // Given FIT Source: https://connect.garmin.com/modern/activity/7386755164 OR https://www.strava.com/activities/5952147686
@@ -1183,7 +1183,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1183
1183
  SpecUtils.assertNearEqualTime(activity.getStat(DataCyclingStandingTime.type).getValue(), '17:53', 0);
1184
1184
  SpecUtils.assertNearEqualTime(activity.getStat(DataCyclingSeatedTime.type).getValue(), '01:25:02', 0);
1185
1185
  done();
1186
- });
1186
+ }).catch((e) => done(e));
1187
1187
  });
1188
1188
  it('should parse cycling FIT file (6)', done => {
1189
1189
  // Given FIT Source: https://connect.garmin.com/modern/activity/7445393868 OR https://www.strava.com/activities/5921768617
@@ -1207,7 +1207,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1207
1207
  expect(activity.getStat(DataPowerTrainingStressScore.type).getValue()).toEqual(48.3);
1208
1208
  expect(activity.getStat(DataPowerWork.type).getValue()).toEqual(417);
1209
1209
  done();
1210
- });
1210
+ }).catch((e) => done(e));
1211
1211
  });
1212
1212
  it('should parse cycling FIT file (7)', done => {
1213
1213
  // Given FIT Source: https://connect.garmin.com/modern/activity/7432332116 OR https://www.strava.com/activities/5910143591
@@ -1233,7 +1233,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1233
1233
  expect(activity.getSquashedStreamData(DataHeartRate.type).length).toEqual(expectedSamplesLength);
1234
1234
  expect(activity.getSquashedStreamData(DataPower.type).length).toEqual(expectedSamplesLength);
1235
1235
  done();
1236
- });
1236
+ }).catch((e) => done(e));
1237
1237
  });
1238
1238
  it('should parse cycling FIT file (8)', done => {
1239
1239
  // Given FIT Source: https://connect.garmin.com/modern/activity/7739869618 OR https://www.strava.com/activities/2380240532
@@ -1248,7 +1248,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1248
1248
  expect(activity.creator.manufacturer).toEqual('wahoo_fitness');
1249
1249
  expect(activity.creator.isRecognized).toBeTruthy();
1250
1250
  done();
1251
- });
1251
+ }).catch((e) => done(e));
1252
1252
  });
1253
1253
  it('should parse cycling FIT file (9)', done => {
1254
1254
  // Given FIT Source: https://connect.garmin.com/modern/activity/5319808632 OR https://www.strava.com/activities/3849490840
@@ -1262,7 +1262,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1262
1262
  expect(activity.startDate.toISOString()).toEqual('2020-07-26T15:28:41.000Z');
1263
1263
  expect(activity.endDate.toISOString()).toEqual('2020-07-26T16:31:26.063Z');
1264
1264
  done();
1265
- });
1265
+ }).catch((e) => done(e));
1266
1266
  });
1267
1267
  it('should parse virtual cycling FIT file (1)', done => {
1268
1268
  // Given FIT Source: https://connect.garmin.com/modern/activity/971150603 OR https://www.strava.com/activities/442080924
@@ -1311,7 +1311,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1311
1311
  SpecUtils.assertNearEqualTime(elapsedTime, '01:03:42');
1312
1312
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1313
1313
  done();
1314
- });
1314
+ }).catch((e) => done(e));
1315
1315
  });
1316
1316
  });
1317
1317
  describe('TCX', () => {
@@ -1347,7 +1347,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1347
1347
  SpecUtils.assertNearEqualTime(elapsedTime, '02:04:36');
1348
1348
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1349
1349
  done();
1350
- });
1350
+ }).catch((e) => done(e));
1351
1351
  });
1352
1352
  it('should parse cycling TCX file (2)', done => {
1353
1353
  // Given TCX Source: https://connect.garmin.com/modern/activity/6838497277 or https://www.strava.com/activities/5354278524
@@ -1381,7 +1381,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1381
1381
  SpecUtils.assertNearEqualTime(elapsedTime, '02:55:15');
1382
1382
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1383
1383
  done();
1384
- });
1384
+ }).catch((e) => done(e));
1385
1385
  });
1386
1386
  it('should parse cycling TCX file (3)', done => {
1387
1387
  // Given TCX Source: https://connect.garmin.com/modern/activity/7555170032 or https://www.strava.com/activities/6020442882
@@ -1408,7 +1408,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1408
1408
  expect(activity.getSquashedStreamData(DataHeartRate.type).length).toEqual(expectedSamplesLength);
1409
1409
  expect(activity.getSquashedStreamData(DataPower.type).length).toEqual(expectedSamplesLength);
1410
1410
  done();
1411
- });
1411
+ }).catch((e) => done(e));
1412
1412
  });
1413
1413
  it('should parse virtual cycling TCX file (1)', done => {
1414
1414
  // Given https://connect.garmin.com/modern/activity/6823905801 OR https://www.strava.com/activities/5340305665
@@ -1443,7 +1443,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1443
1443
  SpecUtils.assertNearEqualTime(elapsedTime, '01:03:42');
1444
1444
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1445
1445
  done();
1446
- });
1446
+ }).catch((e) => done(e));
1447
1447
  });
1448
1448
  });
1449
1449
  describe('GPX', () => {
@@ -1477,7 +1477,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1477
1477
  SpecUtils.assertNearEqualTime(elapsedTime, '02:04:36');
1478
1478
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1479
1479
  done();
1480
- });
1480
+ }).catch((e) => done(e));
1481
1481
  });
1482
1482
  it('should parse cycling GPX file (2)', done => {
1483
1483
  // Given GPX Source: https://connect.garmin.com/modern/activity/6870692308 OR https://www.strava.com/activities/5385683390
@@ -1508,7 +1508,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1508
1508
  SpecUtils.assertNearEqualTime(elapsedTime, '06:07:13');
1509
1509
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1510
1510
  done();
1511
- });
1511
+ }).catch((e) => done(e));
1512
1512
  });
1513
1513
  it('should parse cycling GPX file (3)', done => {
1514
1514
  // Given GPX Source: https://connect.garmin.com/modern/activity/6905455978 OR https://www.strava.com/activities/5419099678
@@ -1539,7 +1539,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1539
1539
  SpecUtils.assertNearEqualTime(elapsedTime, '01:49:20');
1540
1540
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1541
1541
  done();
1542
- });
1542
+ }).catch((e) => done(e));
1543
1543
  });
1544
1544
  it('should parse cycling GPX file (4)', done => {
1545
1545
  // Given GPX Source: https://connect.garmin.com/modern/activity/7555261629 or https://www.strava.com/activities/6020530554
@@ -1565,7 +1565,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1565
1565
  expect(activity.getSquashedStreamData(DataHeartRate.type).length).toEqual(expectedSamplesLength);
1566
1566
  expect(activity.getSquashedStreamData(DataPower.type).length).toEqual(expectedSamplesLength);
1567
1567
  done();
1568
- });
1568
+ }).catch((e) => done(e));
1569
1569
  });
1570
1570
  it('should parse virtual cycling GPX file (1)', done => {
1571
1571
  // Given GPX Source: https://connect.garmin.com/modern/activity/6909869014 OR https://www.strava.com/activities/5423473093
@@ -1599,7 +1599,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1599
1599
  SpecUtils.assertNearEqualTime(elapsedTime, '01:03:09');
1600
1600
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1601
1601
  done();
1602
- });
1602
+ }).catch((e) => done(e));
1603
1603
  });
1604
1604
  });
1605
1605
  });
@@ -1687,7 +1687,7 @@ describe('FIT/TCX/GPX activity parsing compliance', () => {
1687
1687
  SpecUtils.assertNearEqualTime(elapsedTime, '03:39:01');
1688
1688
  SpecUtils.assertEqual(pauseTime, elapsedTime - movingTime, 1);
1689
1689
  done();
1690
- });
1690
+ }).catch((e) => done(e));
1691
1691
  });
1692
1692
  });
1693
1693
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sports-alliance/sports-lib",
3
- "version": "6.1.14",
3
+ "version": "7.0.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",
@@ -37,7 +37,7 @@
37
37
  "clean": "rimraf ./lib/",
38
38
  "generate:docs": "npm run build && typedoc --out docs --target es6 --theme minimal --mode file src",
39
39
  "lint:fix": "eslint . --ext ts --fix",
40
- "test": "NODE_OPTIONS=--experimental-vm-modules jest",
40
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest --forceExit",
41
41
  "test-coverage": "NODE_OPTIONS=--experimental-vm-modules jest --coverage",
42
42
  "prettier:fix": "prettier --write .",
43
43
  "prepare": "husky install"
@@ -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.1.0",
57
+ "fit-file-parser": "^2.1.1",
58
58
  "geolib": "^3.3.4",
59
59
  "gpx-builder": "^3.7.8",
60
60
  "kalmanjs": "^1.1.0",
@@ -64,26 +64,26 @@
64
64
  "devDependencies": {
65
65
  "@babel/core": "^7.28.5",
66
66
  "@babel/preset-env": "^7.28.5",
67
- "@garmin/fitsdk": "^21.178.0",
68
- "@types/jest": "^27.0.1",
69
- "@types/node": "^14.6.1",
70
- "@types/xmldom": "^0.1.31",
71
- "@typescript-eslint/eslint-plugin": "^4.31.1",
72
- "@typescript-eslint/parser": "^4.31.1",
73
- "@xmldom/xmldom": "^0.7.4",
67
+ "@garmin/fitsdk": "^21.188.0",
68
+ "@types/jest": "^30.0.0",
69
+ "@types/node": "^25.0.5",
70
+ "@types/xmldom": "^0.1.34",
71
+ "@typescript-eslint/eslint-plugin": "^8.52.0",
72
+ "@typescript-eslint/parser": "^8.52.0",
73
+ "@xmldom/xmldom": "^0.8.11",
74
74
  "babel-jest": "^30.2.0",
75
75
  "buffer": "^6.0.3",
76
- "eslint": "^7.32.0",
77
- "eslint-config-prettier": "^8.3.0",
78
- "eslint-plugin-prettier": "^4.0.0",
79
- "husky": "^7.0.2",
80
- "jest": "^27.0.5",
81
- "prettier": "^2.4.0",
82
- "pretty-quick": "^3.1.1",
83
- "rimraf": "^3.0.2",
84
- "ts-jest": "^27.0.3",
85
- "typedoc": "^0.22.3",
86
- "typescript": "^4.4.3"
76
+ "eslint": "^9.39.2",
77
+ "eslint-config-prettier": "^10.1.8",
78
+ "eslint-plugin-prettier": "^5.5.4",
79
+ "husky": "^9.1.7",
80
+ "jest": "^30.2.0",
81
+ "prettier": "^3.7.4",
82
+ "pretty-quick": "^4.2.2",
83
+ "rimraf": "^6.1.2",
84
+ "ts-jest": "^29.4.6",
85
+ "typedoc": "^0.28.15",
86
+ "typescript": "^5.9.3"
87
87
  },
88
88
  "husky": {
89
89
  "hooks": {
package/.editorconfig DELETED
@@ -1,14 +0,0 @@
1
- # Editor configuration, see http://editorconfig.org
2
- root = true
3
-
4
- [*]
5
- charset = utf-8
6
- indent_style = space
7
- indent_size = 2
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
- max_line_length = 120
11
-
12
- [*.md]
13
- max_line_length = off
14
- trim_trailing_whitespace = false
package/.eslintignore DELETED
@@ -1,4 +0,0 @@
1
- # Generated data
2
- docs
3
- lib
4
- node_modules
package/.eslintrc.js DELETED
@@ -1,9 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- parser: '@typescript-eslint/parser',
4
- plugins: ['@typescript-eslint', 'prettier'],
5
- extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'],
6
- rules: {
7
- 'prettier/prettier': 'error'
8
- }
9
- };
package/.prettierignore DELETED
@@ -1,24 +0,0 @@
1
- # Generated data
2
- docs
3
- lib
4
- node_modules
5
-
6
- # OS/IDE
7
- .vscode
8
- .idea
9
- .DS_Store
10
-
11
- # Others
12
- *.json
13
- *.md
14
- *.yml
15
- *.log
16
- .editorconfig
17
- .gitignore
18
- .prettierignore
19
- LICENSE
20
-
21
- # Lib specific
22
- *.gpx
23
- *.tcx
24
- *.fit
package/.prettierrc.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "printWidth": 120,
3
- "singleQuote": true,
4
- "useTabs": false,
5
- "tabWidth": 2,
6
- "semi": true,
7
- "trailingComma": "none",
8
- "bracketSpacing": true,
9
- "arrowParens": "avoid",
10
- "parser": "typescript",
11
- "endOfLine": "auto"
12
- }
@@ -1,49 +0,0 @@
1
- {
2
- "version": "0.2.0",
3
- "configurations": [
4
- {
5
- "name": "Run Watch Mode",
6
- "type": "node",
7
- "request": "launch",
8
- "runtimeExecutable": "npm",
9
- "runtimeArgs": [
10
- "run",
11
- "watch"
12
- ],
13
- "console": "integratedTerminal"
14
- },
15
- {
16
- "type": "pwa-node",
17
- "request": "launch",
18
- "name": "Debug Jest Tests",
19
- "program": "${workspaceFolder}/node_modules/.bin/jest",
20
- "args": [
21
- "--runInBand",
22
- "--watchAll=false"
23
- ],
24
- "console": "integratedTerminal",
25
- "internalConsoleOptions": "neverOpen",
26
- "disableOptimisticBPs": true,
27
- "windows": {
28
- "program": "${workspaceFolder}/node_modules/jest/bin/jest.js"
29
- }
30
- },
31
- {
32
- "type": "pwa-node",
33
- "request": "launch",
34
- "name": "Debug Current Test File",
35
- "program": "${workspaceFolder}/node_modules/.bin/jest",
36
- "args": [
37
- "${fileBasenameNoExtension}",
38
- "--runInBand",
39
- "--watchAll=false"
40
- ],
41
- "console": "integratedTerminal",
42
- "internalConsoleOptions": "neverOpen",
43
- "disableOptimisticBPs": true,
44
- "windows": {
45
- "program": "${workspaceFolder}/node_modules/jest/bin/jest.js"
46
- }
47
- }
48
- ]
49
- }