garmin-connect-obsidian 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "garmin-connect-obsidian",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Makes it simple to interface with Garmin Connect to get or set any data point",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "git+https://github.com/Pythe1337N/garmin-connect.git"
21
+ "url": "git+https://github.com/axgd-code/garmin-connect.git"
22
22
  },
23
23
  "keywords": [
24
24
  "garmin",
@@ -46,14 +46,17 @@
46
46
  "@types/node": "^18.11.15",
47
47
  "@types/qs": "^6.9.7",
48
48
  "@types/request-promise": "^4.1.48",
49
- "pre-commit": "^1.2.2",
49
+ "pre-commit": "^2.0.0",
50
50
  "prettier": "^2.8.1",
51
51
  "pretty-quick": "^3.1.3",
52
52
  "typescript": "^4.9.4"
53
53
  },
54
- "homepage": "https://github.com/Pythe1337N/garmin-connect#readme",
54
+ "homepage": "https://github.com/axgd-code/garmin-connect#readme",
55
55
  "bugs": {
56
- "url": "https://github.com/Pythe1337N/garmin-connect/issues"
56
+ "url": "https://github.com/axgd-code/garmin-connect/issues"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public"
57
60
  },
58
61
  "runkitExampleFilename": "./examples/example.js",
59
62
  "dependencies": {
@@ -1,79 +0,0 @@
1
- import OAuth from 'oauth-1.0a';
2
- import { RequestUrlResponse } from 'obsidian';
3
- import { UrlClass } from '../garmin/UrlClass';
4
- import { IOauth1, IOauth1Consumer, IOauth1Token, IOauth2Token } from '../garmin/types';
5
- export interface HttpClientConfig {
6
- /** Maximum number of retry attempts for 429 rate limit errors (default: 5) */
7
- maxRetries?: number;
8
- /** Path to persist OAuth tokens (default: garmin.tokens.json in app root) */
9
- tokenFilePath?: string;
10
- }
11
- export declare class HttpClient {
12
- url: UrlClass;
13
- oauth1Token: IOauth1Token | undefined;
14
- oauth2Token: IOauth2Token | undefined;
15
- OAUTH_CONSUMER: IOauth1Consumer | undefined;
16
- private commonHeaders;
17
- private cookieJar;
18
- private maxRetries;
19
- private customTokenFilePath;
20
- constructor(url: UrlClass, config?: HttpClientConfig);
21
- /**
22
- * Helper to safely access response.json in Obsidian
23
- * because response.json is a getter that can throw an exception
24
- */
25
- private safeGetJson;
26
- private extractCookies;
27
- private getCookieHeader;
28
- /**
29
- * Execute an HTTP request using requestUrl and implement manual
30
- * interceptor logic (auth token and refresh token).
31
- */
32
- private _request;
33
- private getTokenFilePath;
34
- private loadTokensFromFile;
35
- private saveTokensToFile;
36
- /**
37
- * Clear persisted OAuth tokens from disk
38
- * Useful for testing or when you want to force a fresh login
39
- */
40
- clearPersistedTokens(): void;
41
- get<T>(url: string, options?: {
42
- params?: Record<string, any>;
43
- headers?: Record<string, string>;
44
- responseType?: 'arraybuffer';
45
- }): Promise<T>;
46
- post<T>(url: string, data: any, options?: {
47
- params?: Record<string, any>;
48
- headers?: Record<string, string>;
49
- }): Promise<T>;
50
- put<T>(url: string, data: any, options?: {
51
- params?: Record<string, any>;
52
- headers?: Record<string, string>;
53
- }): Promise<T>;
54
- delete<T>(url: string, options?: {
55
- params?: Record<string, any>;
56
- headers?: Record<string, string>;
57
- }): Promise<T>;
58
- setCommonHeader(headers: Record<string, string>): void;
59
- handleError(response: RequestUrlResponse): void;
60
- handleHttpError(response: RequestUrlResponse): void;
61
- fetchOauthConsumer(): Promise<void>;
62
- checkTokenVaild(): Promise<void>;
63
- /**
64
- * Login to Garmin Connect
65
- * @param username
66
- * @param password
67
- * @returns {Promise<HttpClient>}
68
- */
69
- login(username: string, password: string): Promise<HttpClient>;
70
- private getLoginTicket;
71
- handleMFA(htmlStr: string): void;
72
- handlePageTitle(htmlStr: string): void;
73
- handleAccountLocked(htmlStr: string): void;
74
- refreshOauth2Token(): Promise<void>;
75
- getOauth1Token(ticket: string): Promise<IOauth1>;
76
- getOauthClient(consumer: IOauth1Consumer): OAuth;
77
- exchange(oauth1: IOauth1): Promise<void>;
78
- setOauth2TokenExpiresAt(token: IOauth2Token): IOauth2Token;
79
- }
@@ -1,78 +0,0 @@
1
- import { App } from 'obsidian';
2
- import { HttpClientConfig } from '../common/HttpClient';
3
- import { ExportFileTypeValue, GarminDomain, ICountActivities, IGarminTokens, IOauth1Token, IOauth2Token, ISocialProfile, IUserSettings, IWorkout, IWorkoutDetail, UploadFileTypeTypeValue } from './types';
4
- import Running from './workouts/Running';
5
- import { SleepData } from './types/sleep';
6
- import { ActivitySubType, ActivityType, GCActivityId, IActivity } from './types/activity';
7
- export type EventCallback<T> = (data: T) => void;
8
- export interface GCCredentials {
9
- username: string;
10
- password: string;
11
- }
12
- export interface GarminConnectConfig {
13
- /** HTTP client configuration (maxRetries, tokenFilePath, etc.) */
14
- httpClientConfig?: HttpClientConfig;
15
- }
16
- export interface Listeners {
17
- [event: string]: EventCallback<any>[];
18
- }
19
- export declare enum Event {
20
- sessionChange = "sessionChange"
21
- }
22
- export interface Session {
23
- }
24
- export default class GarminConnect {
25
- private readonly client;
26
- private _userHash;
27
- private credentials;
28
- private readonly listeners;
29
- private readonly url;
30
- constructor(credentials?: GCCredentials | undefined, domain?: GarminDomain, gcConfig?: GarminConnectConfig);
31
- login(username?: string, password?: string): Promise<this>;
32
- exportTokenToFile(app: App, dirPath: string): Promise<void>;
33
- loadTokenByFile(app: App, dirPath: string): Promise<void>;
34
- private loadTokenFile;
35
- exportToken(): IGarminTokens;
36
- loadToken(oauth1: IOauth1Token, oauth2: IOauth2Token): void;
37
- getUserSettings(): Promise<IUserSettings>;
38
- getUserProfile(): Promise<ISocialProfile>;
39
- getActivities(start?: number, limit?: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>;
40
- getActivity(activity: {
41
- activityId: GCActivityId;
42
- }): Promise<IActivity>;
43
- countActivities(): Promise<ICountActivities>;
44
- downloadOriginalActivityData(activity: {
45
- activityId: GCActivityId;
46
- }, dir: string, type?: ExportFileTypeValue): Promise<void>;
47
- private getActivityFileBuffer;
48
- uploadActivity(file: string, format?: UploadFileTypeTypeValue): Promise<unknown>;
49
- deleteActivity(activity: {
50
- activityId: GCActivityId;
51
- }): Promise<void>;
52
- getWorkouts(start: number, limit: number): Promise<IWorkout[]>;
53
- getWorkoutDetail(workout: {
54
- workoutId: string;
55
- }): Promise<IWorkoutDetail>;
56
- addWorkout(workout: IWorkoutDetail | Running): Promise<IWorkoutDetail>;
57
- addRunningWorkout(name: string, meters: number, description: string): Promise<IWorkoutDetail>;
58
- deleteWorkout(workout: {
59
- workoutId: string;
60
- }): Promise<void>;
61
- getSteps(date?: Date): Promise<number>;
62
- getSleepData(date?: Date): Promise<SleepData>;
63
- getSleepDuration(date?: Date): Promise<{
64
- hours: number;
65
- minutes: number;
66
- }>;
67
- getDailyWeightData(date?: Date): Promise<WeightData>;
68
- getDailyWeightInPounds(date?: Date): Promise<number>;
69
- getDailyHydration(date?: Date): Promise<number>;
70
- updateWeight(date: Date | undefined, lbs: number, timezone: string): Promise<UpdateWeight>;
71
- updateHydrationLogOunces(date: Date | undefined, valueInOz: number): Promise<WaterIntake>;
72
- getGolfSummary(): Promise<GolfSummary>;
73
- getGolfScorecard(scorecardId: number): Promise<GolfScorecard>;
74
- getHeartRate(date?: Date): Promise<HeartRate>;
75
- get<T>(url: string, data?: any): Promise<T>;
76
- post<T>(url: string, data: any): Promise<T>;
77
- put<T>(url: string, data: any): Promise<T>;
78
- }
@@ -1,36 +0,0 @@
1
- import { GCWorkoutId, GarminDomain } from './types';
2
- export declare class UrlClass {
3
- private domain;
4
- GC_MODERN: string;
5
- GARMIN_SSO_ORIGIN: string;
6
- GC_API: string;
7
- constructor(domain?: GarminDomain);
8
- get GARMIN_SSO(): string;
9
- get GARMIN_SSO_EMBED(): string;
10
- get BASE_URL(): string;
11
- get SIGNIN_URL(): string;
12
- get LOGIN_URL(): string;
13
- get OAUTH_URL(): string;
14
- get USER_SETTINGS(): string;
15
- get USER_PROFILE(): string;
16
- get ACTIVITIES(): string;
17
- get ACTIVITY(): string;
18
- get STAT_ACTIVITIES(): string;
19
- get DOWNLOAD_ZIP(): string;
20
- get DOWNLOAD_GPX(): string;
21
- get DOWNLOAD_TCX(): string;
22
- get DOWNLOAD_KML(): string;
23
- get UPLOAD(): string;
24
- get IMPORT_DATA(): string;
25
- get DAILY_STEPS(): string;
26
- get DAILY_SLEEP(): string;
27
- get DAILY_WEIGHT(): string;
28
- get UPDATE_WEIGHT(): string;
29
- get DAILY_HYDRATION(): string;
30
- get HYDRATION_LOG(): string;
31
- get GOLF_SCORECARD_SUMMARY(): string;
32
- get GOLF_SCORECARD_DETAIL(): string;
33
- get DAILY_HEART_RATE(): string;
34
- WORKOUT(id?: GCWorkoutId): string;
35
- get WORKOUTS(): string;
36
- }
@@ -1,6 +0,0 @@
1
- export declare function toDateString(date: Date): string;
2
- export declare function calculateTimeDifference(sleepStartTimestampGMT: number, sleepEndTimestampGMT: number): {
3
- hours: number;
4
- minutes: number;
5
- };
6
- export declare function getLocalTimestamp(date: Date, timezone: string): string;
@@ -1,2 +0,0 @@
1
- export declare function convertMLToOunces(valueInML: number): number;
2
- export declare function convertOuncesToML(ounces: number): number;
@@ -1 +0,0 @@
1
- export declare function gramsToPounds(weightInGrams: number): number;
@@ -1,408 +0,0 @@
1
- export type GCActivityId = number;
2
- export declare enum ActivityType {
3
- Cycling = "cycling",
4
- FitnessEquipment = "fitness_equipment",
5
- Walking = "walking",
6
- Hiking = "hiking",
7
- Other = "other",
8
- WaterSport = "water_sports",
9
- Running = "street_running"
10
- }
11
- export declare enum ActivitySubType {
12
- IndoorCardio = "indoor_cardio",
13
- StrengthTraining = "strength_training",
14
- HIIT = "hiit",
15
- Yoga = "yoga",
16
- IndoorCycling = "indoor_cycling",
17
- Breathwork = "breathwork",
18
- Surfing = "surfing",
19
- StreetRunning = "street_running",
20
- TrailRunning = "trail_running",
21
- IndoorRunning = "indoor_running"
22
- }
23
- export interface IActivity {
24
- activityId: GCActivityId;
25
- activityName: string;
26
- description: unknown;
27
- startTimeLocal: string;
28
- startTimeGMT: string;
29
- activityType: {
30
- typeId: number;
31
- typeKey: string;
32
- parentTypeId: number;
33
- isHidden: boolean;
34
- sortOrder: unknown;
35
- trimmable: boolean;
36
- restricted: boolean;
37
- };
38
- eventType: {
39
- typeId: number;
40
- typeKey: string;
41
- sortOrder: number;
42
- };
43
- comments: unknown;
44
- parentId: unknown;
45
- distance: number;
46
- duration: number;
47
- elapsedDuration: number;
48
- movingDuration: number;
49
- elevationGain: number;
50
- elevationLoss: number;
51
- averageSpeed: number;
52
- maxSpeed: number;
53
- startLatitude: number;
54
- startLongitude: number;
55
- hasPolyline: boolean;
56
- ownerId: number;
57
- ownerDisplayName: string;
58
- ownerFullName: string;
59
- ownerProfileImageUrlSmall: string;
60
- ownerProfileImageUrlMedium: string;
61
- ownerProfileImageUrlLarge: string;
62
- calories: number;
63
- averageHR: number;
64
- maxHR: number;
65
- averageRunningCadenceInStepsPerMinute: number;
66
- maxRunningCadenceInStepsPerMinute: number;
67
- averageBikingCadenceInRevPerMinute: unknown;
68
- maxBikingCadenceInRevPerMinute: unknown;
69
- averageSwimCadenceInStrokesPerMinute: unknown;
70
- maxSwimCadenceInStrokesPerMinute: unknown;
71
- averageSwolf: unknown;
72
- activeLengths: unknown;
73
- steps: number;
74
- conversationUuid: unknown;
75
- conversationPk: unknown;
76
- numberOfActivityLikes: unknown;
77
- numberOfActivityComments: unknown;
78
- likedByUser: unknown;
79
- commentedByUser: unknown;
80
- activityLikeDisplayNames: unknown;
81
- activityLikeFullNames: unknown;
82
- activityLikeProfileImageUrls: unknown;
83
- requestorRelationship: unknown;
84
- userRoles: string[];
85
- privacy: {
86
- typeId: number;
87
- typeKey: string;
88
- };
89
- userPro: boolean;
90
- courseId: unknown;
91
- poolLength: unknown;
92
- unitOfPoolLength: unknown;
93
- hasVideo: boolean;
94
- videoUrl: unknown;
95
- timeZoneId: number;
96
- beginTimestamp: number;
97
- sportTypeId: number;
98
- avgPower: unknown;
99
- maxPower: unknown;
100
- aerobicTrainingEffect: unknown;
101
- anaerobicTrainingEffect: unknown;
102
- strokes: unknown;
103
- normPower: unknown;
104
- leftBalance: unknown;
105
- rightBalance: unknown;
106
- avgLeftBalance: unknown;
107
- max20MinPower: unknown;
108
- avgVerticalOscillation: unknown;
109
- avgGroundContactTime: unknown;
110
- avgStrideLength: number;
111
- avgFractionalCadence: unknown;
112
- maxFractionalCadence: unknown;
113
- trainingStressScore: unknown;
114
- intensityFactor: unknown;
115
- vO2MaxValue: number;
116
- avgVerticalRatio: unknown;
117
- avgGroundContactBalance: unknown;
118
- lactateThresholdBpm: unknown;
119
- lactateThresholdSpeed: unknown;
120
- maxFtp: unknown;
121
- avgStrokeDistance: unknown;
122
- avgStrokeCadence: unknown;
123
- maxStrokeCadence: unknown;
124
- workoutId: unknown;
125
- avgStrokes: unknown;
126
- minStrokes: unknown;
127
- deviceId: number;
128
- minTemperature: unknown;
129
- maxTemperature: unknown;
130
- minElevation: number;
131
- maxElevation: number;
132
- avgDoubleCadence: unknown;
133
- maxDoubleCadence: number;
134
- summarizedExerciseSets: unknown;
135
- maxDepth: unknown;
136
- avgDepth: unknown;
137
- surfaceInterval: unknown;
138
- startN2: unknown;
139
- endN2: unknown;
140
- startCns: unknown;
141
- endCns: unknown;
142
- summarizedDiveInfo: {
143
- weight: unknown;
144
- weightUnit: unknown;
145
- visibility: unknown;
146
- visibilityUnit: unknown;
147
- surfaceCondition: unknown;
148
- current: unknown;
149
- waterType: unknown;
150
- waterDensity: unknown;
151
- summarizedDiveGases: [];
152
- totalSurfaceTime: unknown;
153
- };
154
- activityLikeAuthors: unknown;
155
- avgVerticalSpeed: unknown;
156
- maxVerticalSpeed: number;
157
- floorsClimbed: unknown;
158
- floorsDescended: unknown;
159
- manufacturer: string;
160
- diveNumber: unknown;
161
- locationName: string;
162
- bottomTime: unknown;
163
- lapCount: number;
164
- endLatitude: number;
165
- endLongitude: number;
166
- minAirSpeed: unknown;
167
- maxAirSpeed: unknown;
168
- avgAirSpeed: unknown;
169
- avgWindYawAngle: unknown;
170
- minCda: unknown;
171
- maxCda: unknown;
172
- avgCda: unknown;
173
- avgWattsPerCda: unknown;
174
- flow: unknown;
175
- grit: unknown;
176
- jumpCount: unknown;
177
- caloriesEstimated: unknown;
178
- caloriesConsumed: unknown;
179
- waterEstimated: unknown;
180
- waterConsumed: unknown;
181
- maxAvgPower_1: unknown;
182
- maxAvgPower_2: unknown;
183
- maxAvgPower_5: unknown;
184
- maxAvgPower_10: unknown;
185
- maxAvgPower_20: unknown;
186
- maxAvgPower_30: unknown;
187
- maxAvgPower_60: unknown;
188
- maxAvgPower_120: unknown;
189
- maxAvgPower_300: unknown;
190
- maxAvgPower_600: unknown;
191
- maxAvgPower_1200: unknown;
192
- maxAvgPower_1800: unknown;
193
- maxAvgPower_3600: unknown;
194
- maxAvgPower_7200: unknown;
195
- maxAvgPower_18000: unknown;
196
- excludeFromPowerCurveReports: unknown;
197
- totalSets: unknown;
198
- activeSets: unknown;
199
- totalReps: unknown;
200
- minRespirationRate: unknown;
201
- maxRespirationRate: unknown;
202
- avgRespirationRate: unknown;
203
- trainingEffectLabel: unknown;
204
- activityTrainingLoad: unknown;
205
- avgFlow: unknown;
206
- avgGrit: unknown;
207
- minActivityLapDuration: number;
208
- avgStress: unknown;
209
- startStress: unknown;
210
- endStress: unknown;
211
- differenceStress: unknown;
212
- maxStress: unknown;
213
- aerobicTrainingEffectMessage: unknown;
214
- anaerobicTrainingEffectMessage: unknown;
215
- splitSummaries: [];
216
- hasSplits: boolean;
217
- maxBottomTime: unknown;
218
- hasSeedFirstbeatProfile: unknown;
219
- calendarEventId: unknown;
220
- calendarEventUuid: unknown;
221
- avgGradeAdjustedSpeed: unknown;
222
- avgWheelchairCadence: unknown;
223
- maxWheelchairCadence: unknown;
224
- purposeful: boolean;
225
- manualActivity: boolean;
226
- autoCalcCalories: boolean;
227
- elevationCorrected: boolean;
228
- atpActivity: boolean;
229
- favorite: boolean;
230
- decoDive: unknown;
231
- pr: boolean;
232
- parent: boolean;
233
- }
234
- export interface IActivityDetails {
235
- activityId: number;
236
- activityUUID: {
237
- uuid: string;
238
- };
239
- activityName: string;
240
- userProfileId: number;
241
- isMultiSportParent: boolean;
242
- activityTypeDTO: {
243
- typeId: number;
244
- typeKey: string;
245
- parentTypeId: number;
246
- isHidden: boolean;
247
- restricted: boolean;
248
- trimmable: boolean;
249
- };
250
- eventTypeDTO: {
251
- typeId: number;
252
- typeKey: string;
253
- sortOrder: number;
254
- };
255
- accessControlRuleDTO: {
256
- typeId: number;
257
- typeKey: string;
258
- };
259
- timeZoneUnitDTO: {
260
- unitId: number;
261
- unitKey: string;
262
- factor: number;
263
- timeZone: string;
264
- };
265
- metadataDTO: {
266
- isOriginal: boolean;
267
- deviceApplicationInstallationId: number;
268
- agentApplicationInstallationId?: null;
269
- agentString?: null;
270
- fileFormat: {
271
- formatId: number;
272
- formatKey: string;
273
- };
274
- associatedCourseId?: null;
275
- lastUpdateDate: string;
276
- uploadedDate: string;
277
- videoUrl?: null;
278
- hasPolyline: boolean;
279
- hasChartData: boolean;
280
- hasHrTimeInZones: boolean;
281
- hasPowerTimeInZones: boolean;
282
- userInfoDto: {
283
- userProfilePk: number;
284
- displayname: string;
285
- fullname: string;
286
- profileImageUrlLarge?: null;
287
- profileImageUrlMedium: string;
288
- profileImageUrlSmall: string;
289
- userPro: boolean;
290
- };
291
- childIds?: null[] | null;
292
- childActivityTypes?: null[] | null;
293
- sensors?: {
294
- manufacturer: string;
295
- serialNumber: number;
296
- sku: string;
297
- fitProductNumber: number;
298
- sourceType: string;
299
- antplusDeviceType: string;
300
- softwareVersion: number;
301
- batteryStatus: string;
302
- }[] | null;
303
- activityImages?: {
304
- imageId: string;
305
- url: string;
306
- smallUrl: string;
307
- mediumUrl: string;
308
- expirationTimestamp?: null;
309
- latitude?: null;
310
- longitude?: null;
311
- photoDate?: null;
312
- }[] | null;
313
- manufacturer: string;
314
- diveNumber?: null;
315
- lapCount: number;
316
- associatedWorkoutId: number;
317
- isAtpActivity?: null;
318
- deviceMetaDataDTO: {
319
- deviceId: string;
320
- deviceTypePk: number;
321
- deviceVersionPk: number;
322
- };
323
- hasIntensityIntervals: boolean;
324
- hasSplits: boolean;
325
- eBikeMaxAssistModes?: null;
326
- eBikeBatteryUsage?: null;
327
- eBikeBatteryRemaining?: null;
328
- eBikeAssistModeInfoDTOList?: null;
329
- calendarEventInfo?: null;
330
- personalRecord: boolean;
331
- gcj02: boolean;
332
- runPowerWindDataEnabled?: null;
333
- autoCalcCalories: boolean;
334
- favorite: boolean;
335
- manualActivity: boolean;
336
- trimmed: boolean;
337
- elevationCorrected: boolean;
338
- };
339
- summaryDTO: {
340
- startTimeLocal: string;
341
- startTimeGMT: string;
342
- startLatitude: number;
343
- startLongitude: number;
344
- distance: number;
345
- duration: number;
346
- movingDuration: number;
347
- elapsedDuration: number;
348
- elevationGain: number;
349
- elevationLoss: number;
350
- maxElevation: number;
351
- minElevation: number;
352
- averageSpeed: number;
353
- averageMovingSpeed: number;
354
- maxSpeed: number;
355
- calories: number;
356
- averageHR: number;
357
- maxHR: number;
358
- averageRunCadence: number;
359
- maxRunCadence: number;
360
- averageTemperature: number;
361
- maxTemperature: number;
362
- minTemperature: number;
363
- groundContactTime: number;
364
- groundContactBalanceLeft: number;
365
- strideLength: number;
366
- verticalOscillation: number;
367
- trainingEffect: number;
368
- anaerobicTrainingEffect: number;
369
- aerobicTrainingEffectMessage: string;
370
- anaerobicTrainingEffectMessage: string;
371
- verticalRatio: number;
372
- endLatitude: number;
373
- endLongitude: number;
374
- maxVerticalSpeed: number;
375
- minActivityLapDuration: number;
376
- };
377
- locationName: string;
378
- splitSummaries?: {
379
- distance: number;
380
- duration: number;
381
- movingDuration: number;
382
- elapsedDuration: number;
383
- elevationGain: number;
384
- elevationLoss: number;
385
- averageSpeed: number;
386
- averageMovingSpeed: number;
387
- maxSpeed: number;
388
- calories: number;
389
- averageHR: number;
390
- maxHR: number;
391
- averageRunCadence: number;
392
- maxRunCadence: number;
393
- averageTemperature: number;
394
- maxTemperature: number;
395
- minTemperature: number;
396
- groundContactTime: number;
397
- groundContactBalanceLeft: number;
398
- strideLength: number;
399
- verticalOscillation: number;
400
- verticalRatio: number;
401
- totalExerciseReps: number;
402
- splitType: string;
403
- noOfSplits: number;
404
- maxElevationGain: number;
405
- averageElevationGain: number;
406
- maxDistance: number;
407
- }[] | null;
408
- }