@gooin/garmin-connect 1.7.6 → 1.8.1

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 (132) hide show
  1. package/dist/common/FileMFASessionStorage.js +1 -247
  2. package/dist/common/HttpClient copy.js +1 -361
  3. package/dist/common/HttpClient.d.ts +1 -0
  4. package/dist/common/HttpClient.js +1 -612
  5. package/dist/common/HttpClient.js.map +1 -1
  6. package/dist/common/HttpClientOLD.js +1 -361
  7. package/dist/common/HttpClientOLDV1.js +1 -361
  8. package/dist/common/HttpClientV1.js +1 -577
  9. package/dist/common/MFAManager.js +1 -126
  10. package/dist/common/MFASessionStorage.js +1 -3
  11. package/dist/common/RedisMFASessionStorage.js +1 -281
  12. package/dist/common/RedisMFASessionStorage.js.map +1 -1
  13. package/dist/garmin/GarminConnect.d.ts +243 -66
  14. package/dist/garmin/GarminConnect.js +1 -592
  15. package/dist/garmin/GarminConnect.js.map +1 -1
  16. package/dist/garmin/UrlClass.d.ts +21 -0
  17. package/dist/garmin/UrlClass.js +1 -149
  18. package/dist/garmin/UrlClass.js.map +1 -1
  19. package/dist/garmin/common/DateUtils.d.ts +1 -0
  20. package/dist/garmin/common/DateUtils.js +1 -38
  21. package/dist/garmin/common/DateUtils.js.map +1 -1
  22. package/dist/garmin/common/HydrationUtils.js +1 -16
  23. package/dist/garmin/common/WeightUtils.js +1 -9
  24. package/dist/garmin/modules/activity/base.d.ts +39 -0
  25. package/dist/garmin/modules/activity/base.js +1 -0
  26. package/dist/garmin/modules/activity/base.js.map +1 -0
  27. package/dist/garmin/modules/activity/cycling.d.ts +16 -0
  28. package/dist/garmin/modules/activity/cycling.js +1 -0
  29. package/dist/garmin/modules/activity/cycling.js.map +1 -0
  30. package/dist/garmin/modules/activity/running.d.ts +15 -0
  31. package/dist/garmin/modules/activity/running.js +1 -0
  32. package/dist/garmin/modules/activity/running.js.map +1 -0
  33. package/dist/garmin/modules/activity/training-status.d.ts +13 -0
  34. package/dist/garmin/modules/activity/training-status.js +1 -0
  35. package/dist/garmin/modules/activity/training-status.js.map +1 -0
  36. package/dist/garmin/modules/coach/activity-summary.d.ts +20 -0
  37. package/dist/garmin/modules/coach/activity-summary.js +1 -0
  38. package/dist/garmin/modules/coach/activity-summary.js.map +1 -0
  39. package/dist/garmin/modules/coach/helpers.d.ts +157 -0
  40. package/dist/garmin/modules/coach/helpers.js +1 -0
  41. package/dist/garmin/modules/coach/helpers.js.map +1 -0
  42. package/dist/garmin/modules/coach/training-overview.d.ts +5 -0
  43. package/dist/garmin/modules/coach/training-overview.js +1 -0
  44. package/dist/garmin/modules/coach/training-overview.js.map +1 -0
  45. package/dist/garmin/modules/coach/wellness-overview.d.ts +5 -0
  46. package/dist/garmin/modules/coach/wellness-overview.js +1 -0
  47. package/dist/garmin/modules/coach/wellness-overview.js.map +1 -0
  48. package/dist/garmin/modules/coach/wellness-summary.d.ts +4 -0
  49. package/dist/garmin/modules/coach/wellness-summary.js +1 -0
  50. package/dist/garmin/modules/coach/wellness-summary.js.map +1 -0
  51. package/dist/garmin/modules/coach.d.ts +60 -0
  52. package/dist/garmin/modules/coach.js +1 -0
  53. package/dist/garmin/modules/coach.js.map +1 -0
  54. package/dist/garmin/modules/course.d.ts +27 -0
  55. package/dist/garmin/modules/course.js +1 -0
  56. package/dist/garmin/modules/course.js.map +1 -0
  57. package/dist/garmin/modules/device.d.ts +11 -0
  58. package/dist/garmin/modules/device.js +1 -0
  59. package/dist/garmin/modules/device.js.map +1 -0
  60. package/dist/garmin/modules/misc.d.ts +18 -0
  61. package/dist/garmin/modules/misc.js +1 -0
  62. package/dist/garmin/modules/misc.js.map +1 -0
  63. package/dist/garmin/modules/types.d.ts +10 -0
  64. package/dist/garmin/modules/types.js +1 -0
  65. package/dist/garmin/modules/types.js.map +1 -0
  66. package/dist/garmin/modules/user.d.ts +18 -0
  67. package/dist/garmin/modules/user.js +1 -0
  68. package/dist/garmin/modules/user.js.map +1 -0
  69. package/dist/garmin/modules/wellness/body-battery.d.ts +11 -0
  70. package/dist/garmin/modules/wellness/body-battery.js +1 -0
  71. package/dist/garmin/modules/wellness/body-battery.js.map +1 -0
  72. package/dist/garmin/modules/wellness/heart-rate.d.ts +11 -0
  73. package/dist/garmin/modules/wellness/heart-rate.js +1 -0
  74. package/dist/garmin/modules/wellness/heart-rate.js.map +1 -0
  75. package/dist/garmin/modules/wellness/hrv.d.ts +12 -0
  76. package/dist/garmin/modules/wellness/hrv.js +1 -0
  77. package/dist/garmin/modules/wellness/hrv.js.map +1 -0
  78. package/dist/garmin/modules/wellness/hydration.d.ts +12 -0
  79. package/dist/garmin/modules/wellness/hydration.js +1 -0
  80. package/dist/garmin/modules/wellness/hydration.js.map +1 -0
  81. package/dist/garmin/modules/wellness/sleep.d.ts +16 -0
  82. package/dist/garmin/modules/wellness/sleep.js +1 -0
  83. package/dist/garmin/modules/wellness/sleep.js.map +1 -0
  84. package/dist/garmin/modules/wellness/weight.d.ts +20 -0
  85. package/dist/garmin/modules/wellness/weight.js +1 -0
  86. package/dist/garmin/modules/wellness/weight.js.map +1 -0
  87. package/dist/garmin/modules/workout.d.ts +23 -0
  88. package/dist/garmin/modules/workout.js +1 -0
  89. package/dist/garmin/modules/workout.js.map +1 -0
  90. package/dist/garmin/types/activity-stats.d.ts +21 -0
  91. package/dist/garmin/types/activity-stats.js +1 -0
  92. package/dist/garmin/types/activity-stats.js.map +1 -0
  93. package/dist/garmin/types/activity.js +1 -27
  94. package/dist/garmin/types/body-battery.d.ts +7 -0
  95. package/dist/garmin/types/body-battery.js +1 -0
  96. package/dist/garmin/types/body-battery.js.map +1 -0
  97. package/dist/garmin/types/coach.d.ts +533 -0
  98. package/dist/garmin/types/coach.js +1 -0
  99. package/dist/garmin/types/coach.js.map +1 -0
  100. package/dist/garmin/types/course.d.ts +3 -11
  101. package/dist/garmin/types/course.js +1 -3
  102. package/dist/garmin/types/cycling.d.ts +70 -0
  103. package/dist/garmin/types/cycling.js +1 -0
  104. package/dist/garmin/types/cycling.js.map +1 -0
  105. package/dist/garmin/types/device.d.ts +32 -0
  106. package/dist/garmin/types/device.js +1 -0
  107. package/dist/garmin/types/device.js.map +1 -0
  108. package/dist/garmin/types/golf.d.ts +4 -4
  109. package/dist/garmin/types/golf.js +1 -3
  110. package/dist/garmin/types/golf.js.map +1 -1
  111. package/dist/garmin/types/heartrate.d.ts +3 -3
  112. package/dist/garmin/types/heartrate.js +1 -2
  113. package/dist/garmin/types/hrv.d.ts +3 -0
  114. package/dist/garmin/types/hrv.js +1 -3
  115. package/dist/garmin/types/hydration.d.ts +3 -3
  116. package/dist/garmin/types/hydration.js +1 -2
  117. package/dist/garmin/types/index.d.ts +15 -0
  118. package/dist/garmin/types/index.js +1 -36
  119. package/dist/garmin/types/index.js.map +1 -1
  120. package/dist/garmin/types/personal-info.js +1 -3
  121. package/dist/garmin/types/race-prediction.d.ts +50 -0
  122. package/dist/garmin/types/race-prediction.js +1 -0
  123. package/dist/garmin/types/race-prediction.js.map +1 -0
  124. package/dist/garmin/types/sleep.js +1 -3
  125. package/dist/garmin/types/training-status.js +1 -3
  126. package/dist/garmin/types/weight.d.ts +46 -4
  127. package/dist/garmin/types/weight.js +1 -3
  128. package/dist/garmin/workouts/Running.js +1 -47
  129. package/dist/garmin/workouts/templates/RunningTemplate.js +1 -78
  130. package/dist/index.js +1 -11
  131. package/dist/utils.js +1 -37
  132. package/package.json +4 -3
@@ -0,0 +1,21 @@
1
+ export type ActivityStatsType = 'running' | 'cycling' | string;
2
+ export interface ActivityStatsOptions {
3
+ startDate: Date | string;
4
+ endDate: Date | string;
5
+ activityType?: ActivityStatsType;
6
+ metrics?: string[];
7
+ }
8
+ export interface ActivityStatsMetricSummary {
9
+ count: number;
10
+ min: number | null;
11
+ max: number | null;
12
+ avg: number | null;
13
+ sum: number;
14
+ }
15
+ export interface ActivityStatsEntry {
16
+ date: string;
17
+ countOfActivities: number;
18
+ stats: {
19
+ all: Record<string, ActivityStatsMetricSummary | Record<string, any>>;
20
+ };
21
+ }
@@ -0,0 +1 @@
1
+ 'use strict';var a36_0x31c7c5=a36_0x2f18;(function(_0x1d3a09,_0x3bdfd0){var _0x1f450b=a36_0x2f18,_0x43720f=_0x1d3a09();while(!![]){try{var _0x33992a=-parseInt(_0x1f450b(0x1ab))/0x1*(-parseInt(_0x1f450b(0x1af))/0x2)+-parseInt(_0x1f450b(0x1a7))/0x3*(parseInt(_0x1f450b(0x1a8))/0x4)+parseInt(_0x1f450b(0x1b2))/0x5*(parseInt(_0x1f450b(0x1b1))/0x6)+parseInt(_0x1f450b(0x1ac))/0x7*(parseInt(_0x1f450b(0x1a9))/0x8)+-parseInt(_0x1f450b(0x1aa))/0x9+-parseInt(_0x1f450b(0x1a6))/0xa*(parseInt(_0x1f450b(0x1ae))/0xb)+parseInt(_0x1f450b(0x1ad))/0xc;if(_0x33992a===_0x3bdfd0)break;else _0x43720f['push'](_0x43720f['shift']());}catch(_0x471a95){_0x43720f['push'](_0x43720f['shift']());}}}(a36_0x3ec1,0x32e7d));function a36_0x2f18(_0x59c67e,_0x2cd76b){_0x59c67e=_0x59c67e-0x1a6;var _0x3ec1d1=a36_0x3ec1();var _0x2f1802=_0x3ec1d1[_0x59c67e];return _0x2f1802;}Object[a36_0x31c7c5(0x1b0)](exports,'__esModule',{'value':!![]});function a36_0x3ec1(){var _0x5e66f5=['1984374vNZpUA','53eppBpR','1199751cFbhXO','7477692ELMMvq','2461118pmhToW','1894cIujUc','defineProperty','58242HcysPK','70bACerI','10npaQyA','30QSMnUx','131156xabyVT','8sCCpdH'];a36_0x3ec1=function(){return _0x5e66f5;};return a36_0x3ec1();}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-stats.js","sourceRoot":"","sources":["../../../src/garmin/types/activity-stats.ts"],"names":[],"mappings":""}
@@ -1,27 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ActivitySubType = exports.ActivityType = void 0;
4
- var ActivityType;
5
- (function (ActivityType) {
6
- ActivityType["Cycling"] = "cycling";
7
- ActivityType["FitnessEquipment"] = "fitness_equipment";
8
- ActivityType["Walking"] = "walking";
9
- ActivityType["Hiking"] = "hiking";
10
- ActivityType["Other"] = "other";
11
- ActivityType["WaterSport"] = "water_sports";
12
- ActivityType["Running"] = "street_running";
13
- })(ActivityType = exports.ActivityType || (exports.ActivityType = {}));
14
- var ActivitySubType;
15
- (function (ActivitySubType) {
16
- ActivitySubType["IndoorCardio"] = "indoor_cardio";
17
- ActivitySubType["StrengthTraining"] = "strength_training";
18
- ActivitySubType["HIIT"] = "hiit";
19
- ActivitySubType["Yoga"] = "yoga";
20
- ActivitySubType["IndoorCycling"] = "indoor_cycling";
21
- ActivitySubType["Breathwork"] = "breathwork";
22
- ActivitySubType["Surfing"] = "surfing";
23
- ActivitySubType["StreetRunning"] = "street_running";
24
- ActivitySubType["TrailRunning"] = "trail_running";
25
- ActivitySubType["IndoorRunning"] = "indoor_running"; // Maps to Running
26
- })(ActivitySubType = exports.ActivitySubType || (exports.ActivitySubType = {}));
27
- //# sourceMappingURL=activity.js.map
1
+ 'use strict';function a37_0x98ed(_0x1272c2,_0x3a313d){_0x1272c2=_0x1272c2-0x180;var _0x4eb8cb=a37_0x4eb8();var _0x98ed88=_0x4eb8cb[_0x1272c2];return _0x98ed88;}var a37_0x22aea2=a37_0x98ed;(function(_0x4bff97,_0x325f96){var _0x17b5fd=a37_0x98ed,_0x851744=_0x4bff97();while(!![]){try{var _0x1f8dba=-parseInt(_0x17b5fd(0x185))/0x1+-parseInt(_0x17b5fd(0x180))/0x2*(parseInt(_0x17b5fd(0x195))/0x3)+-parseInt(_0x17b5fd(0x197))/0x4*(parseInt(_0x17b5fd(0x19f))/0x5)+-parseInt(_0x17b5fd(0x1a0))/0x6*(-parseInt(_0x17b5fd(0x18c))/0x7)+parseInt(_0x17b5fd(0x187))/0x8*(parseInt(_0x17b5fd(0x1a2))/0x9)+-parseInt(_0x17b5fd(0x199))/0xa*(-parseInt(_0x17b5fd(0x186))/0xb)+-parseInt(_0x17b5fd(0x183))/0xc*(-parseInt(_0x17b5fd(0x194))/0xd);if(_0x1f8dba===_0x325f96)break;else _0x851744['push'](_0x851744['shift']());}catch(_0x26d7da){_0x851744['push'](_0x851744['shift']());}}}(a37_0x4eb8,0xb7afd));Object[a37_0x22aea2(0x1a5)](exports,'__esModule',{'value':!![]}),exports['ActivitySubType']=exports[a37_0x22aea2(0x1a6)]=void 0x0;var ActivityType;function a37_0x4eb8(){var _0x44e24a=['water_sports','118153vNlInv','other','ActivitySubType','breathwork','fitness_equipment','street_running','cycling','Breathwork','13UFGUHF','108xYUXXM','Hiking','71692uOkxGM','hiit','7311820JSjcjm','walking','indoor_cardio','IndoorCycling','trail_running','Yoga','280giSlqB','162wbSpBy','IndoorRunning','427590WWLZhp','yoga','hiking','defineProperty','ActivityType','StreetRunning','IndoorCardio','Walking','StrengthTraining','37892PUNhlw','FitnessEquipment','WaterSport','1926492WJkMYq','Running','1065813UFpbMt','22nRtUxy','240MhusKj','Surfing','TrailRunning','surfing'];a37_0x4eb8=function(){return _0x44e24a;};return a37_0x4eb8();}(function(_0x5ecbf3){var _0x5ba260=a37_0x22aea2;_0x5ecbf3['Cycling']=_0x5ba260(0x192),_0x5ecbf3[_0x5ba260(0x181)]=_0x5ba260(0x190),_0x5ecbf3[_0x5ba260(0x1a9)]=_0x5ba260(0x19a),_0x5ecbf3[_0x5ba260(0x196)]=_0x5ba260(0x1a4),_0x5ecbf3['Other']=_0x5ba260(0x18d),_0x5ecbf3[_0x5ba260(0x182)]=_0x5ba260(0x18b),_0x5ecbf3[_0x5ba260(0x184)]=_0x5ba260(0x191);}(ActivityType=exports['ActivityType']||(exports[a37_0x22aea2(0x1a6)]={})));var ActivitySubType;(function(_0x2006e2){var _0x308b93=a37_0x22aea2;_0x2006e2[_0x308b93(0x1a8)]=_0x308b93(0x19b),_0x2006e2[_0x308b93(0x1aa)]='strength_training',_0x2006e2['HIIT']=_0x308b93(0x198),_0x2006e2[_0x308b93(0x19e)]=_0x308b93(0x1a3),_0x2006e2[_0x308b93(0x19c)]='indoor_cycling',_0x2006e2[_0x308b93(0x193)]=_0x308b93(0x18f),_0x2006e2[_0x308b93(0x188)]=_0x308b93(0x18a),_0x2006e2[_0x308b93(0x1a7)]=_0x308b93(0x191),_0x2006e2[_0x308b93(0x189)]=_0x308b93(0x19d),_0x2006e2[_0x308b93(0x1a1)]='indoor_running';}(ActivitySubType=exports[a37_0x22aea2(0x18e)]||(exports[a37_0x22aea2(0x18e)]={})));
@@ -0,0 +1,7 @@
1
+ export interface BodyBatteryDailyEntry {
2
+ calendarDate: string;
3
+ values: {
4
+ lowBodyBattery: number;
5
+ highBodyBattery: number;
6
+ };
7
+ }
@@ -0,0 +1 @@
1
+ 'use strict';var a38_0x57f97e=a38_0x1a7c;function a38_0x1a7c(_0x405d67,_0x192f98){_0x405d67=_0x405d67-0xf1;var _0x524b82=a38_0x524b();var _0x1a7c3d=_0x524b82[_0x405d67];return _0x1a7c3d;}(function(_0x2f75c7,_0x454d58){var _0x2f2cbb=a38_0x1a7c,_0x5c274b=_0x2f75c7();while(!![]){try{var _0x5705d5=-parseInt(_0x2f2cbb(0xf6))/0x1+parseInt(_0x2f2cbb(0xf8))/0x2*(-parseInt(_0x2f2cbb(0xf4))/0x3)+parseInt(_0x2f2cbb(0xfa))/0x4+-parseInt(_0x2f2cbb(0xf7))/0x5*(parseInt(_0x2f2cbb(0xf9))/0x6)+-parseInt(_0x2f2cbb(0xf1))/0x7+parseInt(_0x2f2cbb(0xf5))/0x8+-parseInt(_0x2f2cbb(0xfb))/0x9*(-parseInt(_0x2f2cbb(0xf2))/0xa);if(_0x5705d5===_0x454d58)break;else _0x5c274b['push'](_0x5c274b['shift']());}catch(_0x2f02e2){_0x5c274b['push'](_0x5c274b['shift']());}}}(a38_0x524b,0x8ec35));Object['defineProperty'](exports,a38_0x57f97e(0xf3),{'value':!![]});function a38_0x524b(){var _0x42cefa=['27RIjbwK','3952584hBSOHJ','1047609GELNEC','395CbKJZk','182926YSHDaT','45012VTRAYY','197212ZQUFVZ','14633109usegMF','5228909LgCfxM','20kLFnej','__esModule'];a38_0x524b=function(){return _0x42cefa;};return a38_0x524b();}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-battery.js","sourceRoot":"","sources":["../../../src/garmin/types/body-battery.ts"],"names":[],"mappings":";AAAA,yBAAyB"}
@@ -0,0 +1,533 @@
1
+ export interface CoachDateRangeOptions {
2
+ date?: Date | string;
3
+ startDate?: Date | string;
4
+ endDate?: Date | string;
5
+ recentDays?: number;
6
+ }
7
+ export interface WellnessOverviewOptions extends CoachDateRangeOptions {
8
+ rangeDays?: number;
9
+ }
10
+ export interface TrainingOverviewOptions extends CoachDateRangeOptions {
11
+ rangeDays?: number;
12
+ trendDays?: number;
13
+ }
14
+ export interface ActivitiesSummaryOptions {
15
+ start?: number;
16
+ limit?: number;
17
+ activityType?: string;
18
+ subActivityType?: string;
19
+ }
20
+ export interface ActivityDetailSummaryOptions {
21
+ activityId: number;
22
+ }
23
+ export type WellnessMetricAvailability = 'available' | 'partial' | 'no_data';
24
+ export interface CompactTrainingEffect {
25
+ aerobic: number | null;
26
+ anaerobic: number | null;
27
+ label: string;
28
+ }
29
+ export interface CompactActivity {
30
+ id: number;
31
+ date: string | null;
32
+ time: string | null;
33
+ sport: string | null;
34
+ subSport: string | null;
35
+ name: string | null;
36
+ summary: {
37
+ distanceKm: number | null;
38
+ durationMin: number | null;
39
+ pace: string | null;
40
+ avgHr: number | null;
41
+ maxHr: number | null;
42
+ elevGainM: number | null;
43
+ };
44
+ impact: {
45
+ label: string;
46
+ load: number | null;
47
+ aerobicTE: number | null;
48
+ anaerobicTE: number | null;
49
+ bodyBatteryDelta: number | null;
50
+ };
51
+ intensity: {
52
+ hrZonesSec: number[];
53
+ };
54
+ workout?: {
55
+ structured: boolean;
56
+ workoutId: number | null;
57
+ type: string | null;
58
+ /** 说明 segments 数组每个索引对应的字段名 */
59
+ segmentSchema: string[];
60
+ segments: Array<[
61
+ string,
62
+ number,
63
+ number | null,
64
+ number | null,
65
+ string | null
66
+ ]>;
67
+ };
68
+ flags: string[];
69
+ }
70
+ export interface ActivitiesSummary {
71
+ schema: 'activities_summary_v1';
72
+ summary: {
73
+ activities: number;
74
+ sports: Record<string, {
75
+ count: number;
76
+ distanceKm?: number;
77
+ durationMin: number;
78
+ elevGainM?: number;
79
+ load: number;
80
+ }>;
81
+ totalLoad: number;
82
+ totalDurationMin: number;
83
+ hardSessions: number;
84
+ easySessions: number;
85
+ otherSessions: number;
86
+ };
87
+ activities: CompactActivity[];
88
+ aiHints: string[];
89
+ }
90
+ export interface ActivityDetailSummary {
91
+ schema: 'activity_detail_v1';
92
+ id: number;
93
+ date: string | null;
94
+ startTime: string | null;
95
+ sport: string | null;
96
+ subSport: string | null;
97
+ name: string | null;
98
+ location: string | null;
99
+ isStructuredWorkout: boolean;
100
+ workoutId: number | null;
101
+ summary: {
102
+ distanceKm: number | null;
103
+ durationMin: number | null;
104
+ movingMin: number | null;
105
+ elapsedMin: number | null;
106
+ pace: string | null;
107
+ gapPace: string | null;
108
+ avgHr: number | null;
109
+ maxHr: number | null;
110
+ calories: number | null;
111
+ elevGainM: number | null;
112
+ elevLossM: number | null;
113
+ avgTempC: number | null;
114
+ };
115
+ trainingImpact: {
116
+ label: string;
117
+ load: number | null;
118
+ aerobicTE: number | null;
119
+ anaerobicTE: number | null;
120
+ aerobicMessage: string | null;
121
+ anaerobicMessage: string | null;
122
+ bodyBatteryDelta: number | null;
123
+ recoveryHr: number | null;
124
+ };
125
+ intensity: {
126
+ moderateMin: number | null;
127
+ vigorousMin: number | null;
128
+ };
129
+ runForm?: {
130
+ cadence: number | null;
131
+ maxCadence: number | null;
132
+ strideCm: number | null;
133
+ gctMs: number | null;
134
+ gctBalanceLeft: number | null;
135
+ verticalOscCm: number | null;
136
+ verticalRatio: number | null;
137
+ };
138
+ stamina?: {
139
+ begin: number | null;
140
+ end: number | null;
141
+ minAvailable: number | null;
142
+ };
143
+ subjective?: {
144
+ feel: number | null;
145
+ rpe: number | null;
146
+ complianceScore: number | null;
147
+ };
148
+ laps?: {
149
+ /** 说明 laps 数组每个索引对应的字段名 */
150
+ schema: string[];
151
+ /** 按顺序的每圈真实数据 */
152
+ data: Array<[
153
+ string,
154
+ number,
155
+ number,
156
+ string,
157
+ number | null,
158
+ number | null,
159
+ number | null,
160
+ number | null,
161
+ number | null,
162
+ number | null,
163
+ number | null,
164
+ number | null,
165
+ number | null,
166
+ number | null
167
+ ]>;
168
+ };
169
+ /** 课表计划(仅结构化训练有),与 laps 搭配对照计划vs实际 */
170
+ workout?: {
171
+ name: string | null;
172
+ /** steps 各字段含义:intensity, durationType, durationValue, targetType, targetLow, targetHigh */
173
+ schema: string[];
174
+ /**
175
+ * 按顺序的课表步骤(REPEAT 已展开)
176
+ * durationType: time(秒)/distance(米)/hr/calories/lap_button/repeat_until_steps_cmplt
177
+ * targetType: power(w)/heart_rate(bpm)/pace/ speed/cadence/null
178
+ */
179
+ steps: Array<[
180
+ string,
181
+ string,
182
+ number,
183
+ string | null,
184
+ number | null,
185
+ number | null
186
+ ]>;
187
+ };
188
+ movementBreakdown?: Record<string, {
189
+ distanceKm: number | null;
190
+ durationMin?: number | null;
191
+ durationSec?: number | null;
192
+ avgHr: number | null;
193
+ }>;
194
+ weather?: {
195
+ tempC: number | null;
196
+ apparentTempC: number | null;
197
+ dewPointC: number | null;
198
+ relativeHumidity: number | null;
199
+ windDirection: number | null;
200
+ windDirectionCompass: string | null;
201
+ windSpeed: number | null;
202
+ condition: string | null;
203
+ };
204
+ aiHints: string[];
205
+ }
206
+ /** 活动 lap 原始数据 */
207
+ export interface ActivityLap {
208
+ startTimeGMT: string;
209
+ distance: number;
210
+ duration: number;
211
+ movingDuration: number;
212
+ elapsedDuration: number;
213
+ elevationGain: number;
214
+ averageSpeed: number;
215
+ maxSpeed: number;
216
+ calories: number;
217
+ averageHR: number;
218
+ maxHR: number;
219
+ averageRunCadence: number;
220
+ maxRunCadence: number;
221
+ averageTemperature: number;
222
+ groundContactTime: number;
223
+ groundContactBalanceLeft: number;
224
+ strideLength: number;
225
+ verticalOscillation: number;
226
+ verticalRatio: number;
227
+ avgGradeAdjustedSpeed: number;
228
+ lapIndex: number;
229
+ wktStepIndex?: number;
230
+ intensityType: string;
231
+ messageIndex: number;
232
+ }
233
+ /** 活动课表步骤原始数据 */
234
+ export interface ActivityWorkoutStep {
235
+ stepIndex: number;
236
+ name: string | null;
237
+ intensity: string | null;
238
+ durationType: string;
239
+ durationValue: number;
240
+ targetType: string | null;
241
+ targetValue: number | null;
242
+ targetValueLow: number | null;
243
+ targetValueHigh: number | null;
244
+ notes: string | null;
245
+ }
246
+ /** 活动课表原始数据 */
247
+ export interface ActivityWorkout {
248
+ index: number;
249
+ workoutName: string;
250
+ timeCreated: string;
251
+ sport: string;
252
+ manufacturer: string;
253
+ steps: ActivityWorkoutStep[];
254
+ }
255
+ /** 活动天气原始数据(温度单位:华氏度) */
256
+ export interface ActivityWeather {
257
+ issueDate: string;
258
+ temp: number;
259
+ apparentTemp: number;
260
+ dewPoint: number;
261
+ relativeHumidity: number;
262
+ windDirection: number;
263
+ windDirectionCompassPoint: string;
264
+ windSpeed: number;
265
+ windGust: number | null;
266
+ latitude: number;
267
+ longitude: number;
268
+ weatherStationDTO: {
269
+ id: string;
270
+ name: string;
271
+ };
272
+ weatherTypeDTO: {
273
+ weatherTypePk: number | null;
274
+ desc: string;
275
+ image: string | null;
276
+ };
277
+ }
278
+ export interface WellnessOverview {
279
+ schema: 'wellness_overview_v1';
280
+ snapshotDate: string;
281
+ rangeDays: number;
282
+ source: {
283
+ provider: 'garmin';
284
+ includedMetrics: string[];
285
+ unavailableMetrics: string[];
286
+ };
287
+ availability: {
288
+ hrv: WellnessMetricAvailability;
289
+ sleep: WellnessMetricAvailability;
290
+ bodyBattery: WellnessMetricAvailability;
291
+ restingHeartRate: WellnessMetricAvailability;
292
+ respiration: WellnessMetricAvailability;
293
+ spo2: WellnessMetricAvailability;
294
+ skinTemp: WellnessMetricAvailability;
295
+ };
296
+ today: {
297
+ date: string;
298
+ hrv: {
299
+ status: string | null;
300
+ lastNightAvg: number | null;
301
+ weeklyAvg: number | null;
302
+ baseline: [number | null, number | null];
303
+ readings: number;
304
+ };
305
+ sleep: {
306
+ score: number | null;
307
+ quality: string | null;
308
+ durationMin: number | null;
309
+ needMin: number | null;
310
+ deepMin: number | null;
311
+ lightMin: number | null;
312
+ remMin: number | null;
313
+ awakeMin: number | null;
314
+ bodyBatteryChange: number | null;
315
+ restingHr: number | null;
316
+ avgHr: number | null;
317
+ avgStress: number | null;
318
+ respiration: number | null;
319
+ };
320
+ bodyBattery: {
321
+ low: number | null;
322
+ high: number | null;
323
+ changeDuringSleep: number | null;
324
+ };
325
+ };
326
+ recent7d: {
327
+ hrv: {
328
+ statusDays: Record<string, number>;
329
+ avgLastNight: number | null;
330
+ minLastNight: number | null;
331
+ maxLastNight: number | null;
332
+ trend: string | null;
333
+ };
334
+ sleep: {
335
+ avgScore: number | null;
336
+ avgDurationMin: number | null;
337
+ avgNeedMin: number | null;
338
+ avgBodyBatteryChange: number | null;
339
+ avgRestingHr: number | null;
340
+ avgRespiration: number | null;
341
+ lowScoreDays: Array<[string, number]>;
342
+ trend: string | null;
343
+ };
344
+ bodyBattery: {
345
+ avgLow: number | null;
346
+ avgHigh: number | null;
347
+ minLow: number | null;
348
+ maxHigh: number | null;
349
+ trend: string | null;
350
+ };
351
+ };
352
+ readiness: {
353
+ status: string;
354
+ confidence: 'low' | 'medium' | 'high';
355
+ positiveSignals: string[];
356
+ cautionSignals: string[];
357
+ };
358
+ aiHints: string[];
359
+ }
360
+ export type OverviewMetricStatus = 'low' | 'ok' | 'high' | null;
361
+ export interface TrainingOverviewSportYear {
362
+ activities: number;
363
+ distanceKm: number | null;
364
+ durationH: number | null;
365
+ elevGainM: number | null;
366
+ avgHr: number | null;
367
+ maxHr: number | null;
368
+ }
369
+ export interface TrainingOverview {
370
+ schema: 'training_overview_v1';
371
+ snapshotDate: string;
372
+ rangeDays: number;
373
+ source: {
374
+ provider: 'garmin';
375
+ endpointType: 'training_overview';
376
+ includedSports: Array<'running' | 'cycling'>;
377
+ excludedSports: Array<{
378
+ sport: string;
379
+ reason: string;
380
+ }>;
381
+ };
382
+ athlete: {
383
+ age: number | null;
384
+ gender: string | null;
385
+ heightCm: number | null;
386
+ weightKg: number | null;
387
+ type: string | null;
388
+ observedSports: string[];
389
+ };
390
+ state: {
391
+ status: string | null;
392
+ trend: string | null;
393
+ statusSport: string | null;
394
+ fitnessTrendSport: string | null;
395
+ acuteLoad: number | null;
396
+ chronicLoad: number | null;
397
+ acwr: number | null;
398
+ acwrStatus: string | null;
399
+ };
400
+ loadBalance: {
401
+ lowAerobic: [
402
+ number | null,
403
+ number | null,
404
+ number | null,
405
+ OverviewMetricStatus
406
+ ];
407
+ highAerobic: [
408
+ number | null,
409
+ number | null,
410
+ number | null,
411
+ OverviewMetricStatus
412
+ ];
413
+ anaerobic: [
414
+ number | null,
415
+ number | null,
416
+ number | null,
417
+ OverviewMetricStatus
418
+ ];
419
+ feedback: string | null;
420
+ };
421
+ sports: {
422
+ running: {
423
+ available: boolean;
424
+ vo2Max: number | null;
425
+ threshold: {
426
+ pace: string | null;
427
+ hr: number | null;
428
+ };
429
+ power: {
430
+ ftp: number | null;
431
+ wkg: number | null;
432
+ stale: boolean | null;
433
+ };
434
+ year: TrainingOverviewSportYear;
435
+ form: {
436
+ cadence: number | null;
437
+ strideCm: number | null;
438
+ gctMs: number | null;
439
+ voCm: number | null;
440
+ };
441
+ prediction: {
442
+ '5k': string | null;
443
+ '10k': string | null;
444
+ hm: string | null;
445
+ fm: string | null;
446
+ };
447
+ };
448
+ cycling: {
449
+ available: boolean;
450
+ vo2Max: number | null;
451
+ power: {
452
+ ftp: number | null;
453
+ wkg: number | null;
454
+ stale: boolean | null;
455
+ };
456
+ year: TrainingOverviewSportYear;
457
+ form: {
458
+ avgPower: number | null;
459
+ cadence: number | null;
460
+ };
461
+ ability: {
462
+ type: string | null;
463
+ aerobicEndurance: number | null;
464
+ aerobicCapacity: number | null;
465
+ anaerobicCapacity: number | null;
466
+ };
467
+ };
468
+ };
469
+ multiSport: {
470
+ isMultiSport: boolean;
471
+ observedSports: string[];
472
+ durationShare: Record<string, number>;
473
+ dominantByDuration: string | null;
474
+ note: string;
475
+ };
476
+ trend90d: {
477
+ statusDays: Record<string, number>;
478
+ load: {
479
+ chronicStart: number | null;
480
+ chronicEnd: number | null;
481
+ maxAcute: number | null;
482
+ maxAcwr: number | null;
483
+ };
484
+ };
485
+ dataCompleteness: {
486
+ profile: boolean;
487
+ trainingStatus: boolean;
488
+ loadBalance: boolean;
489
+ runningStats: boolean;
490
+ cyclingStats: boolean;
491
+ swimmingStats: 'not_supported_by_source';
492
+ recovery: boolean;
493
+ recentActivities: boolean;
494
+ subjectiveFeedback: boolean;
495
+ personalRecords: boolean;
496
+ };
497
+ /** 个人记录,只包含已达成(maxValue>0)的项目 */
498
+ personalRecords?: PersonalRecordSummary[];
499
+ aiHints: string[];
500
+ }
501
+ /** Garmin PR 类型定义 API 原始响应项 */
502
+ export interface PersonalRecordType {
503
+ id: number;
504
+ key: string;
505
+ visible: boolean;
506
+ sport: string;
507
+ minValue: number;
508
+ maxValue: number;
509
+ }
510
+ /** Garmin PR 实际记录 API 原始响应项 */
511
+ export interface PersonalRecord {
512
+ id: number;
513
+ typeId: number;
514
+ status: string;
515
+ activityId: number;
516
+ activityName: string | null;
517
+ activityType: string | null;
518
+ activityStartDateTimeInGMT: number | null;
519
+ activityStartDateTimeLocalFormatted: string | null;
520
+ value: number;
521
+ prStartTimeGmtFormatted: string | null;
522
+ prStartTimeLocalFormatted: string | null;
523
+ }
524
+ /** 精简的个人记录摘要(含格式化值和日期) */
525
+ export interface PersonalRecordSummary {
526
+ type: string;
527
+ sport: string;
528
+ /** 格式化的值:时间类为 "mm:ss" 或 "h:mm:ss",距离/步数等为数字 */
529
+ value: string;
530
+ unit: string;
531
+ /** 达成日期 YYYY-MM-DD */
532
+ date: string | null;
533
+ }
@@ -0,0 +1 @@
1
+ 'use strict';function a39_0x2772(_0x474058,_0x3866fb){_0x474058=_0x474058-0x1e9;var _0x4c5ed3=a39_0x4c5e();var _0x27721f=_0x4c5ed3[_0x474058];return _0x27721f;}var a39_0x409d96=a39_0x2772;(function(_0x5808e4,_0x2940c8){var _0x2d0f28=a39_0x2772,_0x44aecd=_0x5808e4();while(!![]){try{var _0x48a006=parseInt(_0x2d0f28(0x1f0))/0x1+-parseInt(_0x2d0f28(0x1ed))/0x2+parseInt(_0x2d0f28(0x1eb))/0x3+parseInt(_0x2d0f28(0x1ee))/0x4+-parseInt(_0x2d0f28(0x1ec))/0x5*(parseInt(_0x2d0f28(0x1ea))/0x6)+-parseInt(_0x2d0f28(0x1e9))/0x7+parseInt(_0x2d0f28(0x1ef))/0x8;if(_0x48a006===_0x2940c8)break;else _0x44aecd['push'](_0x44aecd['shift']());}catch(_0x49e029){_0x44aecd['push'](_0x44aecd['shift']());}}}(a39_0x4c5e,0x3839e));function a39_0x4c5e(){var _0xc761dd=['3330456lyzHuO','335338HCDxis','defineProperty','__esModule','2655429jsWLHS','384036arTuDa','328125nIjkCb','5mctIBv','904892yLtQwo','1060324xwHuxO'];a39_0x4c5e=function(){return _0xc761dd;};return a39_0x4c5e();}Object[a39_0x409d96(0x1f1)](exports,a39_0x409d96(0x1f2),{'value':!![]});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coach.js","sourceRoot":"","sources":["../../../src/garmin/types/coach.ts"],"names":[],"mappings":""}
@@ -7,7 +7,7 @@ export interface ICourse {
7
7
  displayName: string;
8
8
  userGroupId: any;
9
9
  geoRoutePk: any;
10
- activityType: ActivityType;
10
+ activityType: CourseActivityType;
11
11
  courseName: string;
12
12
  courseDescription: any;
13
13
  createdDate: number;
@@ -35,13 +35,13 @@ export interface ICourse {
35
35
  createdDateFormatted: string;
36
36
  updatedDateFormatted: string;
37
37
  public: boolean;
38
- activityTypeId: ActivityTypeId;
38
+ activityTypeId: CourseActivityType;
39
39
  applicationName?: string;
40
40
  companyName?: string;
41
41
  companyWebsite?: string;
42
42
  imageURL?: string;
43
43
  }
44
- export interface ActivityType {
44
+ export interface CourseActivityType {
45
45
  typeId: number;
46
46
  typeKey: string;
47
47
  parentTypeId: number;
@@ -53,14 +53,6 @@ export interface PrivacyRule {
53
53
  typeId: number;
54
54
  typeKey: string;
55
55
  }
56
- export interface ActivityTypeId {
57
- typeId: number;
58
- typeKey: string;
59
- parentTypeId: number;
60
- isHidden: boolean;
61
- restricted: boolean;
62
- trimmable: boolean;
63
- }
64
56
  export interface ICourseDetail {
65
57
  courseId: number;
66
58
  courseName: string;
@@ -1,3 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=course.js.map
1
+ 'use strict';var a40_0x15fff8=a40_0x3129;(function(_0x5b7348,_0x478969){var _0x5add3c=a40_0x3129,_0x27c5bd=_0x5b7348();while(!![]){try{var _0x21f4b1=-parseInt(_0x5add3c(0xa1))/0x1*(parseInt(_0x5add3c(0xa0))/0x2)+-parseInt(_0x5add3c(0xa4))/0x3+parseInt(_0x5add3c(0x9f))/0x4+-parseInt(_0x5add3c(0x9a))/0x5+parseInt(_0x5add3c(0x9e))/0x6*(-parseInt(_0x5add3c(0xa3))/0x7)+-parseInt(_0x5add3c(0x9c))/0x8+-parseInt(_0x5add3c(0x99))/0x9*(-parseInt(_0x5add3c(0x9b))/0xa);if(_0x21f4b1===_0x478969)break;else _0x27c5bd['push'](_0x27c5bd['shift']());}catch(_0x183de5){_0x27c5bd['push'](_0x27c5bd['shift']());}}}(a40_0x69e2,0xb38a7));function a40_0x3129(_0x2aee17,_0x3b5b8a){_0x2aee17=_0x2aee17-0x99;var _0x69e224=a40_0x69e2();var _0x312974=_0x69e224[_0x2aee17];return _0x312974;}function a40_0x69e2(){var _0x112861=['__esModule','6APxXZw','3287452lprBxs','2119342JFeVHy','1MgsoSx','defineProperty','7552433WeXVYo','2548077CaKoCy','13505841qmXfrw','5901055dMpUqA','30DclGhs','3362008aSiZpP'];a40_0x69e2=function(){return _0x112861;};return a40_0x69e2();}Object[a40_0x15fff8(0xa2)](exports,a40_0x15fff8(0x9d),{'value':!![]});