@gooin/garmin-connect 1.7.6 → 1.8.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.
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 +15 -78
  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_0x507c93=a36_0x311e;function a36_0x311e(_0x56ebb9,_0x1c40d3){_0x56ebb9=_0x56ebb9-0x17d;var _0x3f3217=a36_0x3f32();var _0x311e0b=_0x3f3217[_0x56ebb9];return _0x311e0b;}(function(_0x15464e,_0x4f4632){var _0x7f7d40=a36_0x311e,_0x266e2e=_0x15464e();while(!![]){try{var _0x292958=parseInt(_0x7f7d40(0x17d))/0x1+parseInt(_0x7f7d40(0x17e))/0x2+-parseInt(_0x7f7d40(0x184))/0x3*(parseInt(_0x7f7d40(0x181))/0x4)+parseInt(_0x7f7d40(0x180))/0x5+parseInt(_0x7f7d40(0x183))/0x6*(-parseInt(_0x7f7d40(0x182))/0x7)+-parseInt(_0x7f7d40(0x185))/0x8*(parseInt(_0x7f7d40(0x186))/0x9)+parseInt(_0x7f7d40(0x17f))/0xa;if(_0x292958===_0x4f4632)break;else _0x266e2e['push'](_0x266e2e['shift']());}catch(_0x18045b){_0x266e2e['push'](_0x266e2e['shift']());}}}(a36_0x3f32,0x88852));Object['defineProperty'](exports,a36_0x507c93(0x187),{'value':!![]});function a36_0x3f32(){var _0x5c8488=['3084350SGftPu','3714800xhvndJ','5636ySIgPB','14LSZBcB','1498086JjiMCs','801IpdkFS','2664PLjbQP','28467vXQZHQ','__esModule','966667ZCxLSZ','939936DVyQjD'];a36_0x3f32=function(){return _0x5c8488;};return a36_0x3f32();}
@@ -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';var a37_0x50ac84=a37_0xcefd;(function(_0x1dac27,_0x326340){var _0x5bb5a6=a37_0xcefd,_0x1604e6=_0x1dac27();while(!![]){try{var _0x4af8ca=-parseInt(_0x5bb5a6(0x164))/0x1*(-parseInt(_0x5bb5a6(0x169))/0x2)+parseInt(_0x5bb5a6(0x185))/0x3+-parseInt(_0x5bb5a6(0x184))/0x4+parseInt(_0x5bb5a6(0x183))/0x5+parseInt(_0x5bb5a6(0x16c))/0x6*(-parseInt(_0x5bb5a6(0x177))/0x7)+-parseInt(_0x5bb5a6(0x16f))/0x8+parseInt(_0x5bb5a6(0x179))/0x9*(parseInt(_0x5bb5a6(0x17c))/0xa);if(_0x4af8ca===_0x326340)break;else _0x1604e6['push'](_0x1604e6['shift']());}catch(_0x1f0e7d){_0x1604e6['push'](_0x1604e6['shift']());}}}(a37_0x5185,0x86946));Object[a37_0x50ac84(0x17d)](exports,'__esModule',{'value':!![]}),exports[a37_0x50ac84(0x17e)]=exports[a37_0x50ac84(0x16d)]=void 0x0;var ActivityType;(function(_0x530e5e){var _0xb466a=a37_0x50ac84;_0x530e5e['Cycling']=_0xb466a(0x173),_0x530e5e['FitnessEquipment']='fitness_equipment',_0x530e5e[_0xb466a(0x168)]=_0xb466a(0x180),_0x530e5e['Hiking']=_0xb466a(0x167),_0x530e5e[_0xb466a(0x171)]='other',_0x530e5e['WaterSport']='water_sports',_0x530e5e[_0xb466a(0x165)]=_0xb466a(0x17a);}(ActivityType=exports[a37_0x50ac84(0x16d)]||(exports[a37_0x50ac84(0x16d)]={})));function a37_0x5185(){var _0x3d31dd=['Breathwork','cycling','breathwork','StreetRunning','indoor_running','7AyqYNL','StrengthTraining','1179CEzuwb','street_running','indoor_cardio','20110PdyaqT','defineProperty','ActivitySubType','hiit','walking','HIIT','IndoorCycling','2638350cUftXW','3069684HbVlyq','877392nAUvjr','29roNnNj','Running','surfing','hiking','Walking','73918COsGEt','IndoorRunning','IndoorCardio','12756ppDCOq','ActivityType','strength_training','6676808NlyZKu','trail_running','Other'];a37_0x5185=function(){return _0x3d31dd;};return a37_0x5185();}function a37_0xcefd(_0xe80183,_0x2d969b){_0xe80183=_0xe80183-0x164;var _0x5185cc=a37_0x5185();var _0xcefd0b=_0x5185cc[_0xe80183];return _0xcefd0b;}var ActivitySubType;(function(_0xf545b3){var _0x4e5505=a37_0x50ac84;_0xf545b3[_0x4e5505(0x16b)]=_0x4e5505(0x17b),_0xf545b3[_0x4e5505(0x178)]=_0x4e5505(0x16e),_0xf545b3[_0x4e5505(0x181)]=_0x4e5505(0x17f),_0xf545b3['Yoga']='yoga',_0xf545b3[_0x4e5505(0x182)]='indoor_cycling',_0xf545b3[_0x4e5505(0x172)]=_0x4e5505(0x174),_0xf545b3['Surfing']=_0x4e5505(0x166),_0xf545b3[_0x4e5505(0x175)]=_0x4e5505(0x17a),_0xf545b3['TrailRunning']=_0x4e5505(0x170),_0xf545b3[_0x4e5505(0x16a)]=_0x4e5505(0x176);}(ActivitySubType=exports[a37_0x50ac84(0x17e)]||(exports[a37_0x50ac84(0x17e)]={})));
@@ -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';(function(_0x37eced,_0x11b029){var _0xd4eda8=a38_0x5363,_0x578c7e=_0x37eced();while(!![]){try{var _0xf6d824=-parseInt(_0xd4eda8(0x162))/0x1+parseInt(_0xd4eda8(0x15e))/0x2*(-parseInt(_0xd4eda8(0x164))/0x3)+parseInt(_0xd4eda8(0x15b))/0x4*(-parseInt(_0xd4eda8(0x161))/0x5)+parseInt(_0xd4eda8(0x163))/0x6*(-parseInt(_0xd4eda8(0x160))/0x7)+-parseInt(_0xd4eda8(0x15f))/0x8+-parseInt(_0xd4eda8(0x15d))/0x9*(-parseInt(_0xd4eda8(0x15c))/0xa)+parseInt(_0xd4eda8(0x165))/0xb;if(_0xf6d824===_0x11b029)break;else _0x578c7e['push'](_0x578c7e['shift']());}catch(_0x2aacfd){_0x578c7e['push'](_0x578c7e['shift']());}}}(a38_0x5a78,0x4cb2a));function a38_0x5363(_0x2e352b,_0x57e3ef){_0x2e352b=_0x2e352b-0x15b;var _0x5a78be=a38_0x5a78();var _0x536380=_0x5a78be[_0x2e352b];return _0x536380;}Object['defineProperty'](exports,'__esModule',{'value':!![]});function a38_0x5a78(){var _0x4bbedc=['1437912dIsgsJ','259ZHZbMP','325nktsut','557280ZMaFGo','81330QeymYN','62319dQBEbr','17494444wEZHbj','6428SSPZwK','3030jiUeef','3834UuKzFO','6UluhSC'];a38_0x5a78=function(){return _0x4bbedc;};return a38_0x5a78();}
@@ -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';var a39_0x3e5007=a39_0x500e;(function(_0x52aa3f,_0x594b8d){var _0x468ed3=a39_0x500e,_0x377850=_0x52aa3f();while(!![]){try{var _0x1c1f70=parseInt(_0x468ed3(0x1b6))/0x1+-parseInt(_0x468ed3(0x1bd))/0x2*(parseInt(_0x468ed3(0x1bc))/0x3)+parseInt(_0x468ed3(0x1c1))/0x4*(-parseInt(_0x468ed3(0x1be))/0x5)+parseInt(_0x468ed3(0x1b7))/0x6*(parseInt(_0x468ed3(0x1c0))/0x7)+parseInt(_0x468ed3(0x1b9))/0x8*(-parseInt(_0x468ed3(0x1b5))/0x9)+-parseInt(_0x468ed3(0x1bf))/0xa*(-parseInt(_0x468ed3(0x1b4))/0xb)+-parseInt(_0x468ed3(0x1b3))/0xc*(-parseInt(_0x468ed3(0x1ba))/0xd);if(_0x1c1f70===_0x594b8d)break;else _0x377850['push'](_0x377850['shift']());}catch(_0x33785f){_0x377850['push'](_0x377850['shift']());}}}(a39_0x5ef7,0x6e6ae));function a39_0x500e(_0x436e74,_0x10af73){_0x436e74=_0x436e74-0x1b3;var _0x5ef7d3=a39_0x5ef7();var _0x500e78=_0x5ef7d3[_0x436e74];return _0x500e78;}Object[a39_0x3e5007(0x1bb)](exports,a39_0x3e5007(0x1b8),{'value':!![]});function a39_0x5ef7(){var _0x4b6014=['defineProperty','59319vYACNk','44CcghDm','20470isOpDo','13930jcYGwr','530579azOAKw','288UzcgsE','4251804WnfUve','5555eXswYt','189GueZlu','613845kNdceF','24LKIWSi','__esModule','302008eClcoP','13FoZqFy'];a39_0x5ef7=function(){return _0x4b6014;};return a39_0x5ef7();}
@@ -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';(function(_0x3f651f,_0x4d9cd5){var _0x5071ef=a40_0x5add,_0xf2ff56=_0x3f651f();while(!![]){try{var _0x30d630=parseInt(_0x5071ef(0x179))/0x1+-parseInt(_0x5071ef(0x17b))/0x2*(-parseInt(_0x5071ef(0x174))/0x3)+-parseInt(_0x5071ef(0x176))/0x4*(parseInt(_0x5071ef(0x177))/0x5)+parseInt(_0x5071ef(0x17c))/0x6*(-parseInt(_0x5071ef(0x175))/0x7)+-parseInt(_0x5071ef(0x17a))/0x8+-parseInt(_0x5071ef(0x173))/0x9+parseInt(_0x5071ef(0x178))/0xa;if(_0x30d630===_0x4d9cd5)break;else _0xf2ff56['push'](_0xf2ff56['shift']());}catch(_0xd37f0c){_0xf2ff56['push'](_0xf2ff56['shift']());}}}(a40_0x313c,0x3f2d2));function a40_0x313c(){var _0x3b364c=['50997qAojrZ','456673vJWyHF','112036OKCQRP','5dRuqDe','6927000sximdM','157639QHhuXT','2631832QAIzDk','24GbRyYC','12wvwFrz','2772819zKBijs'];a40_0x313c=function(){return _0x3b364c;};return a40_0x313c();}function a40_0x5add(_0x40af43,_0x4d4ded){_0x40af43=_0x40af43-0x173;var _0x313cae=a40_0x313c();var _0x5add20=_0x313cae[_0x40af43];return _0x5add20;}Object['defineProperty'](exports,'__esModule',{'value':!![]});