suunto-api-wrapper 1.2.0 → 1.3.0

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.
package/dist/index.js CHANGED
@@ -24,15 +24,24 @@ __export(index_exports, {
24
24
  GearResource: () => GearResource,
25
25
  HttpClient: () => HttpClient,
26
26
  HttpError: () => HttpError,
27
+ SPORTS_TRACKER_247_API: () => SPORTS_TRACKER_247_API,
27
28
  SPORTS_TRACKER_API: () => SPORTS_TRACKER_API,
29
+ SuuntoActivityType: () => SuuntoActivityType,
28
30
  SuuntoClient: () => SuuntoClient,
29
31
  UsersResource: () => UsersResource,
32
+ WellnessResource: () => WellnessResource,
30
33
  WorkoutsResource: () => WorkoutsResource,
31
34
  generateXtotp: () => generateXtotp,
35
+ getActivityExport: () => getActivityExport,
32
36
  getLatestGear: () => getLatestGear,
33
37
  getOwnWorkouts: () => getOwnWorkouts,
38
+ getRecoveryExport: () => getRecoveryExport,
39
+ getSleepExport: () => getSleepExport,
40
+ getSleepStagesExport: () => getSleepStagesExport,
34
41
  getUserByName: () => getUserByName,
42
+ getWorkoutStats: () => getWorkoutStats,
35
43
  getWorkouts: () => getWorkouts,
44
+ getWorkoutsWithin: () => getWorkoutsWithin,
36
45
  login: () => login,
37
46
  searchUsers: () => searchUsers,
38
47
  secondsUntilRollover: () => secondsUntilRollover,
@@ -178,6 +187,9 @@ async function parseBody(response) {
178
187
  const contentType = response.headers.get("content-type") ?? "";
179
188
  const text = await response.text();
180
189
  if (!text) return void 0;
190
+ if (contentType.includes("application/x-ndjson") || contentType.includes("application/jsonl") || contentType.includes("application/x-jsonlines")) {
191
+ return text.split(/\r?\n/).filter((line) => line.length > 0).map((line) => JSON.parse(line));
192
+ }
181
193
  if (contentType.includes("application/json")) {
182
194
  try {
183
195
  return JSON.parse(text);
@@ -290,6 +302,131 @@ function sessionTokenFrom(response) {
290
302
  return response.sessionkey;
291
303
  }
292
304
 
305
+ // src/workouts/types.ts
306
+ var SuuntoActivityType = /* @__PURE__ */ ((SuuntoActivityType2) => {
307
+ SuuntoActivityType2[SuuntoActivityType2["WALKING"] = 0] = "WALKING";
308
+ SuuntoActivityType2[SuuntoActivityType2["RUNNING"] = 1] = "RUNNING";
309
+ SuuntoActivityType2[SuuntoActivityType2["CYCLING"] = 2] = "CYCLING";
310
+ SuuntoActivityType2[SuuntoActivityType2["CROSS_COUNTRY_SKIING"] = 3] = "CROSS_COUNTRY_SKIING";
311
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_1"] = 4] = "OTHER_1";
312
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_2"] = 5] = "OTHER_2";
313
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_3"] = 6] = "OTHER_3";
314
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_4"] = 7] = "OTHER_4";
315
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_5"] = 8] = "OTHER_5";
316
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_6"] = 9] = "OTHER_6";
317
+ SuuntoActivityType2[SuuntoActivityType2["MOUNTAIN_BIKING"] = 10] = "MOUNTAIN_BIKING";
318
+ SuuntoActivityType2[SuuntoActivityType2["HIKING"] = 11] = "HIKING";
319
+ SuuntoActivityType2[SuuntoActivityType2["ROLLER_SKATING"] = 12] = "ROLLER_SKATING";
320
+ SuuntoActivityType2[SuuntoActivityType2["DOWNHILL_SKIING"] = 13] = "DOWNHILL_SKIING";
321
+ SuuntoActivityType2[SuuntoActivityType2["PADDLING"] = 14] = "PADDLING";
322
+ SuuntoActivityType2[SuuntoActivityType2["ROWING"] = 15] = "ROWING";
323
+ SuuntoActivityType2[SuuntoActivityType2["GOLF"] = 16] = "GOLF";
324
+ SuuntoActivityType2[SuuntoActivityType2["INDOOR"] = 17] = "INDOOR";
325
+ SuuntoActivityType2[SuuntoActivityType2["PARKOUR"] = 18] = "PARKOUR";
326
+ SuuntoActivityType2[SuuntoActivityType2["BALLGAMES"] = 19] = "BALLGAMES";
327
+ SuuntoActivityType2[SuuntoActivityType2["OUTDOOR_GYM"] = 20] = "OUTDOOR_GYM";
328
+ SuuntoActivityType2[SuuntoActivityType2["SWIMMING"] = 21] = "SWIMMING";
329
+ SuuntoActivityType2[SuuntoActivityType2["TRAIL_RUNNING"] = 22] = "TRAIL_RUNNING";
330
+ SuuntoActivityType2[SuuntoActivityType2["GYM"] = 23] = "GYM";
331
+ SuuntoActivityType2[SuuntoActivityType2["NORDIC_WALKING"] = 24] = "NORDIC_WALKING";
332
+ SuuntoActivityType2[SuuntoActivityType2["HORSEBACK_RIDING"] = 25] = "HORSEBACK_RIDING";
333
+ SuuntoActivityType2[SuuntoActivityType2["MOTOR_SPORTS"] = 26] = "MOTOR_SPORTS";
334
+ SuuntoActivityType2[SuuntoActivityType2["SKATEBOARDING"] = 27] = "SKATEBOARDING";
335
+ SuuntoActivityType2[SuuntoActivityType2["WATER_SPORTS"] = 28] = "WATER_SPORTS";
336
+ SuuntoActivityType2[SuuntoActivityType2["CLIMBING"] = 29] = "CLIMBING";
337
+ SuuntoActivityType2[SuuntoActivityType2["SNOWBOARDING"] = 30] = "SNOWBOARDING";
338
+ SuuntoActivityType2[SuuntoActivityType2["SKI_TOURING"] = 31] = "SKI_TOURING";
339
+ SuuntoActivityType2[SuuntoActivityType2["FITNESS_CLASS"] = 32] = "FITNESS_CLASS";
340
+ SuuntoActivityType2[SuuntoActivityType2["SOCCER"] = 33] = "SOCCER";
341
+ SuuntoActivityType2[SuuntoActivityType2["TENNIS"] = 34] = "TENNIS";
342
+ SuuntoActivityType2[SuuntoActivityType2["BASKETBALL"] = 35] = "BASKETBALL";
343
+ SuuntoActivityType2[SuuntoActivityType2["BADMINTON"] = 36] = "BADMINTON";
344
+ SuuntoActivityType2[SuuntoActivityType2["BASEBALL"] = 37] = "BASEBALL";
345
+ SuuntoActivityType2[SuuntoActivityType2["VOLLEYBALL"] = 38] = "VOLLEYBALL";
346
+ SuuntoActivityType2[SuuntoActivityType2["AMERICAN_FOOTBALL"] = 39] = "AMERICAN_FOOTBALL";
347
+ SuuntoActivityType2[SuuntoActivityType2["TABLE_TENNIS"] = 40] = "TABLE_TENNIS";
348
+ SuuntoActivityType2[SuuntoActivityType2["RACQUETBALL"] = 41] = "RACQUETBALL";
349
+ SuuntoActivityType2[SuuntoActivityType2["SQUASH"] = 42] = "SQUASH";
350
+ SuuntoActivityType2[SuuntoActivityType2["FLOORBALL"] = 43] = "FLOORBALL";
351
+ SuuntoActivityType2[SuuntoActivityType2["HANDBALL"] = 44] = "HANDBALL";
352
+ SuuntoActivityType2[SuuntoActivityType2["SOFTBALL"] = 45] = "SOFTBALL";
353
+ SuuntoActivityType2[SuuntoActivityType2["BOWLING"] = 46] = "BOWLING";
354
+ SuuntoActivityType2[SuuntoActivityType2["CRICKET"] = 47] = "CRICKET";
355
+ SuuntoActivityType2[SuuntoActivityType2["RUGBY"] = 48] = "RUGBY";
356
+ SuuntoActivityType2[SuuntoActivityType2["ICE_SKATING"] = 49] = "ICE_SKATING";
357
+ SuuntoActivityType2[SuuntoActivityType2["ICE_HOCKEY"] = 50] = "ICE_HOCKEY";
358
+ SuuntoActivityType2[SuuntoActivityType2["YOGA"] = 51] = "YOGA";
359
+ SuuntoActivityType2[SuuntoActivityType2["INDOOR_CYCLING"] = 52] = "INDOOR_CYCLING";
360
+ SuuntoActivityType2[SuuntoActivityType2["TREADMILL"] = 53] = "TREADMILL";
361
+ SuuntoActivityType2[SuuntoActivityType2["CROSSFIT"] = 54] = "CROSSFIT";
362
+ SuuntoActivityType2[SuuntoActivityType2["CROSSTRAINER"] = 55] = "CROSSTRAINER";
363
+ SuuntoActivityType2[SuuntoActivityType2["ROLLER_SKIING"] = 56] = "ROLLER_SKIING";
364
+ SuuntoActivityType2[SuuntoActivityType2["INDOOR_ROWING"] = 57] = "INDOOR_ROWING";
365
+ SuuntoActivityType2[SuuntoActivityType2["STRETCHING"] = 58] = "STRETCHING";
366
+ SuuntoActivityType2[SuuntoActivityType2["TRACK_AND_FIELD"] = 59] = "TRACK_AND_FIELD";
367
+ SuuntoActivityType2[SuuntoActivityType2["ORIENTEERING"] = 60] = "ORIENTEERING";
368
+ SuuntoActivityType2[SuuntoActivityType2["SUP"] = 61] = "SUP";
369
+ SuuntoActivityType2[SuuntoActivityType2["COMBAT_SPORTS"] = 62] = "COMBAT_SPORTS";
370
+ SuuntoActivityType2[SuuntoActivityType2["KETTLEBELL"] = 63] = "KETTLEBELL";
371
+ SuuntoActivityType2[SuuntoActivityType2["DANCING"] = 64] = "DANCING";
372
+ SuuntoActivityType2[SuuntoActivityType2["SNOWSHOEING"] = 65] = "SNOWSHOEING";
373
+ SuuntoActivityType2[SuuntoActivityType2["FRISBEE_GOLF"] = 66] = "FRISBEE_GOLF";
374
+ SuuntoActivityType2[SuuntoActivityType2["FUTSAL"] = 67] = "FUTSAL";
375
+ SuuntoActivityType2[SuuntoActivityType2["MULTISPORT"] = 68] = "MULTISPORT";
376
+ SuuntoActivityType2[SuuntoActivityType2["AEROBICS"] = 69] = "AEROBICS";
377
+ SuuntoActivityType2[SuuntoActivityType2["TREKKING"] = 70] = "TREKKING";
378
+ SuuntoActivityType2[SuuntoActivityType2["SAILING"] = 71] = "SAILING";
379
+ SuuntoActivityType2[SuuntoActivityType2["KAYAKING"] = 72] = "KAYAKING";
380
+ SuuntoActivityType2[SuuntoActivityType2["CIRCUIT_TRAINING"] = 73] = "CIRCUIT_TRAINING";
381
+ SuuntoActivityType2[SuuntoActivityType2["TRIATHLON"] = 74] = "TRIATHLON";
382
+ SuuntoActivityType2[SuuntoActivityType2["PADEL"] = 75] = "PADEL";
383
+ SuuntoActivityType2[SuuntoActivityType2["CHEERLEADING"] = 76] = "CHEERLEADING";
384
+ SuuntoActivityType2[SuuntoActivityType2["BOXING"] = 77] = "BOXING";
385
+ SuuntoActivityType2[SuuntoActivityType2["SCUBADIVING"] = 78] = "SCUBADIVING";
386
+ SuuntoActivityType2[SuuntoActivityType2["FREEDIVING"] = 79] = "FREEDIVING";
387
+ SuuntoActivityType2[SuuntoActivityType2["ADVENTURE_RACING"] = 80] = "ADVENTURE_RACING";
388
+ SuuntoActivityType2[SuuntoActivityType2["GYMNASTICS"] = 81] = "GYMNASTICS";
389
+ SuuntoActivityType2[SuuntoActivityType2["CANOEING"] = 82] = "CANOEING";
390
+ SuuntoActivityType2[SuuntoActivityType2["MOUNTAINEERING"] = 83] = "MOUNTAINEERING";
391
+ SuuntoActivityType2[SuuntoActivityType2["TELEMARKSKIING"] = 84] = "TELEMARKSKIING";
392
+ SuuntoActivityType2[SuuntoActivityType2["OPENWATER_SWIMMING"] = 85] = "OPENWATER_SWIMMING";
393
+ SuuntoActivityType2[SuuntoActivityType2["WINDSURFING"] = 86] = "WINDSURFING";
394
+ SuuntoActivityType2[SuuntoActivityType2["KITESURFING_KITING"] = 87] = "KITESURFING_KITING";
395
+ SuuntoActivityType2[SuuntoActivityType2["PARAGLIDING"] = 88] = "PARAGLIDING";
396
+ SuuntoActivityType2[SuuntoActivityType2["SNORKELING"] = 90] = "SNORKELING";
397
+ SuuntoActivityType2[SuuntoActivityType2["SURFING"] = 91] = "SURFING";
398
+ SuuntoActivityType2[SuuntoActivityType2["SWIMRUN"] = 92] = "SWIMRUN";
399
+ SuuntoActivityType2[SuuntoActivityType2["DUATHLON"] = 93] = "DUATHLON";
400
+ SuuntoActivityType2[SuuntoActivityType2["AQUATHLON"] = 94] = "AQUATHLON";
401
+ SuuntoActivityType2[SuuntoActivityType2["OBSTACLE_RACING"] = 95] = "OBSTACLE_RACING";
402
+ SuuntoActivityType2[SuuntoActivityType2["FISHING"] = 96] = "FISHING";
403
+ SuuntoActivityType2[SuuntoActivityType2["HUNTING"] = 97] = "HUNTING";
404
+ SuuntoActivityType2[SuuntoActivityType2["GRAVEL_CYCLING"] = 99] = "GRAVEL_CYCLING";
405
+ SuuntoActivityType2[SuuntoActivityType2["MERMAIDING"] = 100] = "MERMAIDING";
406
+ SuuntoActivityType2[SuuntoActivityType2["SPEARFISHING"] = 101] = "SPEARFISHING";
407
+ SuuntoActivityType2[SuuntoActivityType2["JUMP_ROPE"] = 102] = "JUMP_ROPE";
408
+ SuuntoActivityType2[SuuntoActivityType2["TRACK_RUNNING"] = 103] = "TRACK_RUNNING";
409
+ SuuntoActivityType2[SuuntoActivityType2["CALISTHENICS"] = 104] = "CALISTHENICS";
410
+ SuuntoActivityType2[SuuntoActivityType2["E_BIKING"] = 105] = "E_BIKING";
411
+ SuuntoActivityType2[SuuntoActivityType2["E_MTB"] = 106] = "E_MTB";
412
+ SuuntoActivityType2[SuuntoActivityType2["BACKCOUNTRY_SKIING"] = 107] = "BACKCOUNTRY_SKIING";
413
+ SuuntoActivityType2[SuuntoActivityType2["WHEELCHAIR"] = 108] = "WHEELCHAIR";
414
+ SuuntoActivityType2[SuuntoActivityType2["HAND_CYCLING"] = 109] = "HAND_CYCLING";
415
+ SuuntoActivityType2[SuuntoActivityType2["SPLIT_BOARDING"] = 110] = "SPLIT_BOARDING";
416
+ SuuntoActivityType2[SuuntoActivityType2["BIATHLON"] = 111] = "BIATHLON";
417
+ SuuntoActivityType2[SuuntoActivityType2["MEDITATION"] = 112] = "MEDITATION";
418
+ SuuntoActivityType2[SuuntoActivityType2["FIELD_HOCKEY"] = 113] = "FIELD_HOCKEY";
419
+ SuuntoActivityType2[SuuntoActivityType2["CYCLOCROSS"] = 114] = "CYCLOCROSS";
420
+ SuuntoActivityType2[SuuntoActivityType2["VERTICAL_RUN"] = 115] = "VERTICAL_RUN";
421
+ SuuntoActivityType2[SuuntoActivityType2["SKI_MOUNTAINEERING"] = 116] = "SKI_MOUNTAINEERING";
422
+ SuuntoActivityType2[SuuntoActivityType2["SKATE_SKIING"] = 117] = "SKATE_SKIING";
423
+ SuuntoActivityType2[SuuntoActivityType2["CLASSIC_SKIING"] = 118] = "CLASSIC_SKIING";
424
+ SuuntoActivityType2[SuuntoActivityType2["CHORES"] = 119] = "CHORES";
425
+ SuuntoActivityType2[SuuntoActivityType2["PILATES"] = 120] = "PILATES";
426
+ SuuntoActivityType2[SuuntoActivityType2["NEW_YOGA"] = 121] = "NEW_YOGA";
427
+ return SuuntoActivityType2;
428
+ })(SuuntoActivityType || {});
429
+
293
430
  // src/workouts/index.ts
294
431
  var DEFAULT_WORKOUT_EXTENSIONS = [
295
432
  "SummaryExtension" /* Summary */,
@@ -337,6 +474,28 @@ async function getWorkout(client, username, workoutKey, params = {}) {
337
474
  );
338
475
  return res.data;
339
476
  }
477
+ async function getWorkoutsWithin(client, params) {
478
+ const { lowerLat, lowerLng, upperLat, upperLng, limit = 50 } = params;
479
+ const res = await client.get(
480
+ "/apiserver/v1/workouts/public/within",
481
+ {
482
+ query: {
483
+ lowerlat: lowerLat,
484
+ lowerlng: lowerLng,
485
+ upperlat: upperLat,
486
+ upperlng: upperLng,
487
+ limit
488
+ }
489
+ }
490
+ );
491
+ return res.data;
492
+ }
493
+ async function getWorkoutStats(client, username) {
494
+ const res = await client.get(
495
+ `/apiserver/v1/workouts/${encodeURIComponent(username)}/stats`
496
+ );
497
+ return res.data;
498
+ }
340
499
  var WorkoutsResource = class {
341
500
  constructor(client) {
342
501
  this.client = client;
@@ -356,6 +515,17 @@ var WorkoutsResource = class {
356
515
  byKey(username, workoutKey, params) {
357
516
  return getWorkout(this.client, username, workoutKey, params);
358
517
  }
518
+ /**
519
+ * Aggregated workout stats per activity for the given user. Works
520
+ * unauthenticated.
521
+ */
522
+ stats(username) {
523
+ return getWorkoutStats(this.client, username);
524
+ }
525
+ /** Public workouts whose center falls inside a geographic bounding box. */
526
+ within(params) {
527
+ return getWorkoutsWithin(this.client, params);
528
+ }
359
529
  };
360
530
 
361
531
  // src/users/index.ts
@@ -404,6 +574,56 @@ var GearResource = class {
404
574
  }
405
575
  };
406
576
 
577
+ // src/wellness/types.ts
578
+ var SPORTS_TRACKER_247_API = "https://247.sports-tracker.com";
579
+
580
+ // src/wellness/index.ts
581
+ function exportQuery(params) {
582
+ return params.since == null ? void 0 : { since: params.since };
583
+ }
584
+ async function getSleepExport(client, params = {}) {
585
+ const res = await client.get("/v1/sleep/export", {
586
+ query: exportQuery(params)
587
+ });
588
+ return res.data;
589
+ }
590
+ async function getSleepStagesExport(client, params = {}) {
591
+ const res = await client.get(
592
+ "/v1/sleepstages/export",
593
+ { query: exportQuery(params) }
594
+ );
595
+ return res.data;
596
+ }
597
+ async function getRecoveryExport(client, params = {}) {
598
+ const res = await client.get("/v1/recovery/export", {
599
+ query: exportQuery(params)
600
+ });
601
+ return res.data;
602
+ }
603
+ async function getActivityExport(client, params = {}) {
604
+ const res = await client.get("/v1/activity/export", {
605
+ query: exportQuery(params)
606
+ });
607
+ return res.data;
608
+ }
609
+ var WellnessResource = class {
610
+ constructor(client) {
611
+ this.client = client;
612
+ }
613
+ sleep(params) {
614
+ return getSleepExport(this.client, params);
615
+ }
616
+ sleepStages(params) {
617
+ return getSleepStagesExport(this.client, params);
618
+ }
619
+ recovery(params) {
620
+ return getRecoveryExport(this.client, params);
621
+ }
622
+ activity(params) {
623
+ return getActivityExport(this.client, params);
624
+ }
625
+ };
626
+
407
627
  // src/client.ts
408
628
  var SuuntoClient = class _SuuntoClient {
409
629
  constructor(options) {
@@ -412,22 +632,32 @@ var SuuntoClient = class _SuuntoClient {
412
632
  sessionKey,
413
633
  userAgent = DEFAULT_USER_AGENT,
414
634
  baseUrl,
635
+ baseUrl247,
415
636
  headers,
416
637
  ...rest
417
638
  } = options;
418
639
  this.sessionKey = sessionKey;
640
+ const beforeRequest = async (ctx) => {
641
+ if (email) ctx.headers["x-totp"] = await generateXtotp(email);
642
+ if (sessionKey) ctx.headers["sttauthorization"] = sessionKey;
643
+ };
644
+ const sharedHeaders = { "user-agent": userAgent, ...headers };
419
645
  this.http = new HttpClient({
420
646
  baseUrl: baseUrl ?? SPORTS_TRACKER_API,
421
- headers: { "user-agent": userAgent, ...headers },
647
+ headers: sharedHeaders,
422
648
  ...rest,
423
- beforeRequest: async (ctx) => {
424
- if (email) ctx.headers["x-totp"] = await generateXtotp(email);
425
- if (sessionKey) ctx.headers["sttauthorization"] = sessionKey;
426
- }
649
+ beforeRequest
650
+ });
651
+ this.http247 = new HttpClient({
652
+ baseUrl: baseUrl247 ?? SPORTS_TRACKER_247_API,
653
+ headers: sharedHeaders,
654
+ ...rest,
655
+ beforeRequest
427
656
  });
428
657
  this.workouts = new WorkoutsResource(this.http);
429
658
  this.users = new UsersResource(this.http);
430
659
  this.gear = new GearResource(this.http);
660
+ this.wellness = new WellnessResource(this.http247);
431
661
  }
432
662
  /** Log in with email/password and return an authenticated client. */
433
663
  static async login(options) {
@@ -450,15 +680,24 @@ var SuuntoClient = class _SuuntoClient {
450
680
  GearResource,
451
681
  HttpClient,
452
682
  HttpError,
683
+ SPORTS_TRACKER_247_API,
453
684
  SPORTS_TRACKER_API,
685
+ SuuntoActivityType,
454
686
  SuuntoClient,
455
687
  UsersResource,
688
+ WellnessResource,
456
689
  WorkoutsResource,
457
690
  generateXtotp,
691
+ getActivityExport,
458
692
  getLatestGear,
459
693
  getOwnWorkouts,
694
+ getRecoveryExport,
695
+ getSleepExport,
696
+ getSleepStagesExport,
460
697
  getUserByName,
698
+ getWorkoutStats,
461
699
  getWorkouts,
700
+ getWorkoutsWithin,
462
701
  login,
463
702
  searchUsers,
464
703
  secondsUntilRollover,
package/dist/index.mjs CHANGED
@@ -136,6 +136,9 @@ async function parseBody(response) {
136
136
  const contentType = response.headers.get("content-type") ?? "";
137
137
  const text = await response.text();
138
138
  if (!text) return void 0;
139
+ if (contentType.includes("application/x-ndjson") || contentType.includes("application/jsonl") || contentType.includes("application/x-jsonlines")) {
140
+ return text.split(/\r?\n/).filter((line) => line.length > 0).map((line) => JSON.parse(line));
141
+ }
139
142
  if (contentType.includes("application/json")) {
140
143
  try {
141
144
  return JSON.parse(text);
@@ -248,6 +251,131 @@ function sessionTokenFrom(response) {
248
251
  return response.sessionkey;
249
252
  }
250
253
 
254
+ // src/workouts/types.ts
255
+ var SuuntoActivityType = /* @__PURE__ */ ((SuuntoActivityType2) => {
256
+ SuuntoActivityType2[SuuntoActivityType2["WALKING"] = 0] = "WALKING";
257
+ SuuntoActivityType2[SuuntoActivityType2["RUNNING"] = 1] = "RUNNING";
258
+ SuuntoActivityType2[SuuntoActivityType2["CYCLING"] = 2] = "CYCLING";
259
+ SuuntoActivityType2[SuuntoActivityType2["CROSS_COUNTRY_SKIING"] = 3] = "CROSS_COUNTRY_SKIING";
260
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_1"] = 4] = "OTHER_1";
261
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_2"] = 5] = "OTHER_2";
262
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_3"] = 6] = "OTHER_3";
263
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_4"] = 7] = "OTHER_4";
264
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_5"] = 8] = "OTHER_5";
265
+ SuuntoActivityType2[SuuntoActivityType2["OTHER_6"] = 9] = "OTHER_6";
266
+ SuuntoActivityType2[SuuntoActivityType2["MOUNTAIN_BIKING"] = 10] = "MOUNTAIN_BIKING";
267
+ SuuntoActivityType2[SuuntoActivityType2["HIKING"] = 11] = "HIKING";
268
+ SuuntoActivityType2[SuuntoActivityType2["ROLLER_SKATING"] = 12] = "ROLLER_SKATING";
269
+ SuuntoActivityType2[SuuntoActivityType2["DOWNHILL_SKIING"] = 13] = "DOWNHILL_SKIING";
270
+ SuuntoActivityType2[SuuntoActivityType2["PADDLING"] = 14] = "PADDLING";
271
+ SuuntoActivityType2[SuuntoActivityType2["ROWING"] = 15] = "ROWING";
272
+ SuuntoActivityType2[SuuntoActivityType2["GOLF"] = 16] = "GOLF";
273
+ SuuntoActivityType2[SuuntoActivityType2["INDOOR"] = 17] = "INDOOR";
274
+ SuuntoActivityType2[SuuntoActivityType2["PARKOUR"] = 18] = "PARKOUR";
275
+ SuuntoActivityType2[SuuntoActivityType2["BALLGAMES"] = 19] = "BALLGAMES";
276
+ SuuntoActivityType2[SuuntoActivityType2["OUTDOOR_GYM"] = 20] = "OUTDOOR_GYM";
277
+ SuuntoActivityType2[SuuntoActivityType2["SWIMMING"] = 21] = "SWIMMING";
278
+ SuuntoActivityType2[SuuntoActivityType2["TRAIL_RUNNING"] = 22] = "TRAIL_RUNNING";
279
+ SuuntoActivityType2[SuuntoActivityType2["GYM"] = 23] = "GYM";
280
+ SuuntoActivityType2[SuuntoActivityType2["NORDIC_WALKING"] = 24] = "NORDIC_WALKING";
281
+ SuuntoActivityType2[SuuntoActivityType2["HORSEBACK_RIDING"] = 25] = "HORSEBACK_RIDING";
282
+ SuuntoActivityType2[SuuntoActivityType2["MOTOR_SPORTS"] = 26] = "MOTOR_SPORTS";
283
+ SuuntoActivityType2[SuuntoActivityType2["SKATEBOARDING"] = 27] = "SKATEBOARDING";
284
+ SuuntoActivityType2[SuuntoActivityType2["WATER_SPORTS"] = 28] = "WATER_SPORTS";
285
+ SuuntoActivityType2[SuuntoActivityType2["CLIMBING"] = 29] = "CLIMBING";
286
+ SuuntoActivityType2[SuuntoActivityType2["SNOWBOARDING"] = 30] = "SNOWBOARDING";
287
+ SuuntoActivityType2[SuuntoActivityType2["SKI_TOURING"] = 31] = "SKI_TOURING";
288
+ SuuntoActivityType2[SuuntoActivityType2["FITNESS_CLASS"] = 32] = "FITNESS_CLASS";
289
+ SuuntoActivityType2[SuuntoActivityType2["SOCCER"] = 33] = "SOCCER";
290
+ SuuntoActivityType2[SuuntoActivityType2["TENNIS"] = 34] = "TENNIS";
291
+ SuuntoActivityType2[SuuntoActivityType2["BASKETBALL"] = 35] = "BASKETBALL";
292
+ SuuntoActivityType2[SuuntoActivityType2["BADMINTON"] = 36] = "BADMINTON";
293
+ SuuntoActivityType2[SuuntoActivityType2["BASEBALL"] = 37] = "BASEBALL";
294
+ SuuntoActivityType2[SuuntoActivityType2["VOLLEYBALL"] = 38] = "VOLLEYBALL";
295
+ SuuntoActivityType2[SuuntoActivityType2["AMERICAN_FOOTBALL"] = 39] = "AMERICAN_FOOTBALL";
296
+ SuuntoActivityType2[SuuntoActivityType2["TABLE_TENNIS"] = 40] = "TABLE_TENNIS";
297
+ SuuntoActivityType2[SuuntoActivityType2["RACQUETBALL"] = 41] = "RACQUETBALL";
298
+ SuuntoActivityType2[SuuntoActivityType2["SQUASH"] = 42] = "SQUASH";
299
+ SuuntoActivityType2[SuuntoActivityType2["FLOORBALL"] = 43] = "FLOORBALL";
300
+ SuuntoActivityType2[SuuntoActivityType2["HANDBALL"] = 44] = "HANDBALL";
301
+ SuuntoActivityType2[SuuntoActivityType2["SOFTBALL"] = 45] = "SOFTBALL";
302
+ SuuntoActivityType2[SuuntoActivityType2["BOWLING"] = 46] = "BOWLING";
303
+ SuuntoActivityType2[SuuntoActivityType2["CRICKET"] = 47] = "CRICKET";
304
+ SuuntoActivityType2[SuuntoActivityType2["RUGBY"] = 48] = "RUGBY";
305
+ SuuntoActivityType2[SuuntoActivityType2["ICE_SKATING"] = 49] = "ICE_SKATING";
306
+ SuuntoActivityType2[SuuntoActivityType2["ICE_HOCKEY"] = 50] = "ICE_HOCKEY";
307
+ SuuntoActivityType2[SuuntoActivityType2["YOGA"] = 51] = "YOGA";
308
+ SuuntoActivityType2[SuuntoActivityType2["INDOOR_CYCLING"] = 52] = "INDOOR_CYCLING";
309
+ SuuntoActivityType2[SuuntoActivityType2["TREADMILL"] = 53] = "TREADMILL";
310
+ SuuntoActivityType2[SuuntoActivityType2["CROSSFIT"] = 54] = "CROSSFIT";
311
+ SuuntoActivityType2[SuuntoActivityType2["CROSSTRAINER"] = 55] = "CROSSTRAINER";
312
+ SuuntoActivityType2[SuuntoActivityType2["ROLLER_SKIING"] = 56] = "ROLLER_SKIING";
313
+ SuuntoActivityType2[SuuntoActivityType2["INDOOR_ROWING"] = 57] = "INDOOR_ROWING";
314
+ SuuntoActivityType2[SuuntoActivityType2["STRETCHING"] = 58] = "STRETCHING";
315
+ SuuntoActivityType2[SuuntoActivityType2["TRACK_AND_FIELD"] = 59] = "TRACK_AND_FIELD";
316
+ SuuntoActivityType2[SuuntoActivityType2["ORIENTEERING"] = 60] = "ORIENTEERING";
317
+ SuuntoActivityType2[SuuntoActivityType2["SUP"] = 61] = "SUP";
318
+ SuuntoActivityType2[SuuntoActivityType2["COMBAT_SPORTS"] = 62] = "COMBAT_SPORTS";
319
+ SuuntoActivityType2[SuuntoActivityType2["KETTLEBELL"] = 63] = "KETTLEBELL";
320
+ SuuntoActivityType2[SuuntoActivityType2["DANCING"] = 64] = "DANCING";
321
+ SuuntoActivityType2[SuuntoActivityType2["SNOWSHOEING"] = 65] = "SNOWSHOEING";
322
+ SuuntoActivityType2[SuuntoActivityType2["FRISBEE_GOLF"] = 66] = "FRISBEE_GOLF";
323
+ SuuntoActivityType2[SuuntoActivityType2["FUTSAL"] = 67] = "FUTSAL";
324
+ SuuntoActivityType2[SuuntoActivityType2["MULTISPORT"] = 68] = "MULTISPORT";
325
+ SuuntoActivityType2[SuuntoActivityType2["AEROBICS"] = 69] = "AEROBICS";
326
+ SuuntoActivityType2[SuuntoActivityType2["TREKKING"] = 70] = "TREKKING";
327
+ SuuntoActivityType2[SuuntoActivityType2["SAILING"] = 71] = "SAILING";
328
+ SuuntoActivityType2[SuuntoActivityType2["KAYAKING"] = 72] = "KAYAKING";
329
+ SuuntoActivityType2[SuuntoActivityType2["CIRCUIT_TRAINING"] = 73] = "CIRCUIT_TRAINING";
330
+ SuuntoActivityType2[SuuntoActivityType2["TRIATHLON"] = 74] = "TRIATHLON";
331
+ SuuntoActivityType2[SuuntoActivityType2["PADEL"] = 75] = "PADEL";
332
+ SuuntoActivityType2[SuuntoActivityType2["CHEERLEADING"] = 76] = "CHEERLEADING";
333
+ SuuntoActivityType2[SuuntoActivityType2["BOXING"] = 77] = "BOXING";
334
+ SuuntoActivityType2[SuuntoActivityType2["SCUBADIVING"] = 78] = "SCUBADIVING";
335
+ SuuntoActivityType2[SuuntoActivityType2["FREEDIVING"] = 79] = "FREEDIVING";
336
+ SuuntoActivityType2[SuuntoActivityType2["ADVENTURE_RACING"] = 80] = "ADVENTURE_RACING";
337
+ SuuntoActivityType2[SuuntoActivityType2["GYMNASTICS"] = 81] = "GYMNASTICS";
338
+ SuuntoActivityType2[SuuntoActivityType2["CANOEING"] = 82] = "CANOEING";
339
+ SuuntoActivityType2[SuuntoActivityType2["MOUNTAINEERING"] = 83] = "MOUNTAINEERING";
340
+ SuuntoActivityType2[SuuntoActivityType2["TELEMARKSKIING"] = 84] = "TELEMARKSKIING";
341
+ SuuntoActivityType2[SuuntoActivityType2["OPENWATER_SWIMMING"] = 85] = "OPENWATER_SWIMMING";
342
+ SuuntoActivityType2[SuuntoActivityType2["WINDSURFING"] = 86] = "WINDSURFING";
343
+ SuuntoActivityType2[SuuntoActivityType2["KITESURFING_KITING"] = 87] = "KITESURFING_KITING";
344
+ SuuntoActivityType2[SuuntoActivityType2["PARAGLIDING"] = 88] = "PARAGLIDING";
345
+ SuuntoActivityType2[SuuntoActivityType2["SNORKELING"] = 90] = "SNORKELING";
346
+ SuuntoActivityType2[SuuntoActivityType2["SURFING"] = 91] = "SURFING";
347
+ SuuntoActivityType2[SuuntoActivityType2["SWIMRUN"] = 92] = "SWIMRUN";
348
+ SuuntoActivityType2[SuuntoActivityType2["DUATHLON"] = 93] = "DUATHLON";
349
+ SuuntoActivityType2[SuuntoActivityType2["AQUATHLON"] = 94] = "AQUATHLON";
350
+ SuuntoActivityType2[SuuntoActivityType2["OBSTACLE_RACING"] = 95] = "OBSTACLE_RACING";
351
+ SuuntoActivityType2[SuuntoActivityType2["FISHING"] = 96] = "FISHING";
352
+ SuuntoActivityType2[SuuntoActivityType2["HUNTING"] = 97] = "HUNTING";
353
+ SuuntoActivityType2[SuuntoActivityType2["GRAVEL_CYCLING"] = 99] = "GRAVEL_CYCLING";
354
+ SuuntoActivityType2[SuuntoActivityType2["MERMAIDING"] = 100] = "MERMAIDING";
355
+ SuuntoActivityType2[SuuntoActivityType2["SPEARFISHING"] = 101] = "SPEARFISHING";
356
+ SuuntoActivityType2[SuuntoActivityType2["JUMP_ROPE"] = 102] = "JUMP_ROPE";
357
+ SuuntoActivityType2[SuuntoActivityType2["TRACK_RUNNING"] = 103] = "TRACK_RUNNING";
358
+ SuuntoActivityType2[SuuntoActivityType2["CALISTHENICS"] = 104] = "CALISTHENICS";
359
+ SuuntoActivityType2[SuuntoActivityType2["E_BIKING"] = 105] = "E_BIKING";
360
+ SuuntoActivityType2[SuuntoActivityType2["E_MTB"] = 106] = "E_MTB";
361
+ SuuntoActivityType2[SuuntoActivityType2["BACKCOUNTRY_SKIING"] = 107] = "BACKCOUNTRY_SKIING";
362
+ SuuntoActivityType2[SuuntoActivityType2["WHEELCHAIR"] = 108] = "WHEELCHAIR";
363
+ SuuntoActivityType2[SuuntoActivityType2["HAND_CYCLING"] = 109] = "HAND_CYCLING";
364
+ SuuntoActivityType2[SuuntoActivityType2["SPLIT_BOARDING"] = 110] = "SPLIT_BOARDING";
365
+ SuuntoActivityType2[SuuntoActivityType2["BIATHLON"] = 111] = "BIATHLON";
366
+ SuuntoActivityType2[SuuntoActivityType2["MEDITATION"] = 112] = "MEDITATION";
367
+ SuuntoActivityType2[SuuntoActivityType2["FIELD_HOCKEY"] = 113] = "FIELD_HOCKEY";
368
+ SuuntoActivityType2[SuuntoActivityType2["CYCLOCROSS"] = 114] = "CYCLOCROSS";
369
+ SuuntoActivityType2[SuuntoActivityType2["VERTICAL_RUN"] = 115] = "VERTICAL_RUN";
370
+ SuuntoActivityType2[SuuntoActivityType2["SKI_MOUNTAINEERING"] = 116] = "SKI_MOUNTAINEERING";
371
+ SuuntoActivityType2[SuuntoActivityType2["SKATE_SKIING"] = 117] = "SKATE_SKIING";
372
+ SuuntoActivityType2[SuuntoActivityType2["CLASSIC_SKIING"] = 118] = "CLASSIC_SKIING";
373
+ SuuntoActivityType2[SuuntoActivityType2["CHORES"] = 119] = "CHORES";
374
+ SuuntoActivityType2[SuuntoActivityType2["PILATES"] = 120] = "PILATES";
375
+ SuuntoActivityType2[SuuntoActivityType2["NEW_YOGA"] = 121] = "NEW_YOGA";
376
+ return SuuntoActivityType2;
377
+ })(SuuntoActivityType || {});
378
+
251
379
  // src/workouts/index.ts
252
380
  var DEFAULT_WORKOUT_EXTENSIONS = [
253
381
  "SummaryExtension" /* Summary */,
@@ -295,6 +423,28 @@ async function getWorkout(client, username, workoutKey, params = {}) {
295
423
  );
296
424
  return res.data;
297
425
  }
426
+ async function getWorkoutsWithin(client, params) {
427
+ const { lowerLat, lowerLng, upperLat, upperLng, limit = 50 } = params;
428
+ const res = await client.get(
429
+ "/apiserver/v1/workouts/public/within",
430
+ {
431
+ query: {
432
+ lowerlat: lowerLat,
433
+ lowerlng: lowerLng,
434
+ upperlat: upperLat,
435
+ upperlng: upperLng,
436
+ limit
437
+ }
438
+ }
439
+ );
440
+ return res.data;
441
+ }
442
+ async function getWorkoutStats(client, username) {
443
+ const res = await client.get(
444
+ `/apiserver/v1/workouts/${encodeURIComponent(username)}/stats`
445
+ );
446
+ return res.data;
447
+ }
298
448
  var WorkoutsResource = class {
299
449
  constructor(client) {
300
450
  this.client = client;
@@ -314,6 +464,17 @@ var WorkoutsResource = class {
314
464
  byKey(username, workoutKey, params) {
315
465
  return getWorkout(this.client, username, workoutKey, params);
316
466
  }
467
+ /**
468
+ * Aggregated workout stats per activity for the given user. Works
469
+ * unauthenticated.
470
+ */
471
+ stats(username) {
472
+ return getWorkoutStats(this.client, username);
473
+ }
474
+ /** Public workouts whose center falls inside a geographic bounding box. */
475
+ within(params) {
476
+ return getWorkoutsWithin(this.client, params);
477
+ }
317
478
  };
318
479
 
319
480
  // src/users/index.ts
@@ -362,6 +523,56 @@ var GearResource = class {
362
523
  }
363
524
  };
364
525
 
526
+ // src/wellness/types.ts
527
+ var SPORTS_TRACKER_247_API = "https://247.sports-tracker.com";
528
+
529
+ // src/wellness/index.ts
530
+ function exportQuery(params) {
531
+ return params.since == null ? void 0 : { since: params.since };
532
+ }
533
+ async function getSleepExport(client, params = {}) {
534
+ const res = await client.get("/v1/sleep/export", {
535
+ query: exportQuery(params)
536
+ });
537
+ return res.data;
538
+ }
539
+ async function getSleepStagesExport(client, params = {}) {
540
+ const res = await client.get(
541
+ "/v1/sleepstages/export",
542
+ { query: exportQuery(params) }
543
+ );
544
+ return res.data;
545
+ }
546
+ async function getRecoveryExport(client, params = {}) {
547
+ const res = await client.get("/v1/recovery/export", {
548
+ query: exportQuery(params)
549
+ });
550
+ return res.data;
551
+ }
552
+ async function getActivityExport(client, params = {}) {
553
+ const res = await client.get("/v1/activity/export", {
554
+ query: exportQuery(params)
555
+ });
556
+ return res.data;
557
+ }
558
+ var WellnessResource = class {
559
+ constructor(client) {
560
+ this.client = client;
561
+ }
562
+ sleep(params) {
563
+ return getSleepExport(this.client, params);
564
+ }
565
+ sleepStages(params) {
566
+ return getSleepStagesExport(this.client, params);
567
+ }
568
+ recovery(params) {
569
+ return getRecoveryExport(this.client, params);
570
+ }
571
+ activity(params) {
572
+ return getActivityExport(this.client, params);
573
+ }
574
+ };
575
+
365
576
  // src/client.ts
366
577
  var SuuntoClient = class _SuuntoClient {
367
578
  constructor(options) {
@@ -370,22 +581,32 @@ var SuuntoClient = class _SuuntoClient {
370
581
  sessionKey,
371
582
  userAgent = DEFAULT_USER_AGENT,
372
583
  baseUrl,
584
+ baseUrl247,
373
585
  headers,
374
586
  ...rest
375
587
  } = options;
376
588
  this.sessionKey = sessionKey;
589
+ const beforeRequest = async (ctx) => {
590
+ if (email) ctx.headers["x-totp"] = await generateXtotp(email);
591
+ if (sessionKey) ctx.headers["sttauthorization"] = sessionKey;
592
+ };
593
+ const sharedHeaders = { "user-agent": userAgent, ...headers };
377
594
  this.http = new HttpClient({
378
595
  baseUrl: baseUrl ?? SPORTS_TRACKER_API,
379
- headers: { "user-agent": userAgent, ...headers },
596
+ headers: sharedHeaders,
380
597
  ...rest,
381
- beforeRequest: async (ctx) => {
382
- if (email) ctx.headers["x-totp"] = await generateXtotp(email);
383
- if (sessionKey) ctx.headers["sttauthorization"] = sessionKey;
384
- }
598
+ beforeRequest
599
+ });
600
+ this.http247 = new HttpClient({
601
+ baseUrl: baseUrl247 ?? SPORTS_TRACKER_247_API,
602
+ headers: sharedHeaders,
603
+ ...rest,
604
+ beforeRequest
385
605
  });
386
606
  this.workouts = new WorkoutsResource(this.http);
387
607
  this.users = new UsersResource(this.http);
388
608
  this.gear = new GearResource(this.http);
609
+ this.wellness = new WellnessResource(this.http247);
389
610
  }
390
611
  /** Log in with email/password and return an authenticated client. */
391
612
  static async login(options) {
@@ -407,15 +628,24 @@ export {
407
628
  GearResource,
408
629
  HttpClient,
409
630
  HttpError,
631
+ SPORTS_TRACKER_247_API,
410
632
  SPORTS_TRACKER_API,
633
+ SuuntoActivityType,
411
634
  SuuntoClient,
412
635
  UsersResource,
636
+ WellnessResource,
413
637
  WorkoutsResource,
414
638
  generateXtotp,
639
+ getActivityExport,
415
640
  getLatestGear,
416
641
  getOwnWorkouts,
642
+ getRecoveryExport,
643
+ getSleepExport,
644
+ getSleepStagesExport,
417
645
  getUserByName,
646
+ getWorkoutStats,
418
647
  getWorkouts,
648
+ getWorkoutsWithin,
419
649
  login,
420
650
  searchUsers,
421
651
  secondsUntilRollover,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "suunto-api-wrapper",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Unofficial typed TypeScript client for the Suunto app API (Sports Tracker backend). Not affiliated with or endorsed by Suunto or Sports Tracker.",
5
5
  "repository": {
6
6
  "url": "https://github.com/Marius-Ar/suunto-api-wrapper"