@gooin/garmin-connect 1.6.6 → 1.6.7

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 (56) hide show
  1. package/README.md +243 -49
  2. package/dist/common/HttpClient.d.ts +1 -0
  3. package/dist/common/HttpClient.js +4 -0
  4. package/dist/common/HttpClient.js.map +1 -1
  5. package/dist/garmin/GarminConnect copy.d.ts +76 -0
  6. package/dist/garmin/GarminConnect copy.js +397 -0
  7. package/dist/garmin/GarminConnect copy.js.map +1 -0
  8. package/dist/garmin/GarminConnect.d.ts +28 -5
  9. package/dist/garmin/GarminConnect.js +240 -26
  10. package/dist/garmin/GarminConnect.js.map +1 -1
  11. package/dist/garmin/GarminConnect_new.d.ts +76 -0
  12. package/dist/garmin/GarminConnect_new.js +397 -0
  13. package/dist/garmin/GarminConnect_new.js.map +1 -0
  14. package/dist/garmin/GarminConnect_old.d.ts +75 -0
  15. package/dist/garmin/GarminConnect_old.js +386 -0
  16. package/dist/garmin/GarminConnect_old.js.map +1 -0
  17. package/dist/garmin/UrlClass.d.ts +13 -1
  18. package/dist/garmin/UrlClass.js +39 -0
  19. package/dist/garmin/UrlClass.js.map +1 -1
  20. package/dist/garmin/common/DateUtils.d.ts +5 -0
  21. package/dist/garmin/common/DateUtils.js +28 -1
  22. package/dist/garmin/common/DateUtils.js.map +1 -1
  23. package/dist/garmin/common/HydrationUtils.d.ts +2 -0
  24. package/dist/garmin/common/HydrationUtils.js +16 -0
  25. package/dist/garmin/common/HydrationUtils.js.map +1 -0
  26. package/dist/garmin/common/WeightUtils.d.ts +1 -0
  27. package/dist/garmin/common/WeightUtils.js +9 -0
  28. package/dist/garmin/common/WeightUtils.js.map +1 -0
  29. package/dist/garmin/types/activity.d.ts +408 -0
  30. package/dist/garmin/types/activity.js +27 -0
  31. package/dist/garmin/types/activity.js.map +1 -0
  32. package/dist/garmin/types/course.d.ts +146 -0
  33. package/dist/garmin/types/course.js +3 -0
  34. package/dist/garmin/types/course.js.map +1 -0
  35. package/dist/garmin/types/golf.d.ts +67 -0
  36. package/dist/garmin/types/golf.js +3 -0
  37. package/dist/garmin/types/golf.js.map +1 -0
  38. package/dist/garmin/types/heartrate.d.ts +22 -0
  39. package/dist/garmin/types/heartrate.js +2 -0
  40. package/dist/garmin/types/heartrate.js.map +1 -0
  41. package/dist/garmin/types/hydration.d.ts +28 -0
  42. package/dist/garmin/types/hydration.js +2 -0
  43. package/dist/garmin/types/hydration.js.map +1 -0
  44. package/dist/garmin/types/index.d.ts +541 -0
  45. package/dist/garmin/types/index.js +17 -0
  46. package/dist/garmin/types/index.js.map +1 -0
  47. package/dist/garmin/types/sleep.d.ts +120 -0
  48. package/dist/garmin/types/sleep.js +3 -0
  49. package/dist/garmin/types/sleep.js.map +1 -0
  50. package/dist/garmin/types/weight.d.ts +42 -0
  51. package/dist/garmin/types/weight.js +3 -0
  52. package/dist/garmin/types/weight.js.map +1 -0
  53. package/dist/utils.d.ts +3 -3
  54. package/dist/utils.js +27 -16
  55. package/dist/utils.js.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Event = void 0;
7
+ const form_data_1 = __importDefault(require("form-data"));
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const luxon_1 = require("luxon");
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const HttpClient_1 = require("../common/HttpClient");
13
+ const utils_1 = require("../utils");
14
+ const UrlClass_1 = require("./UrlClass");
15
+ const types_1 = require("./types");
16
+ const Running_1 = __importDefault(require("./workouts/Running"));
17
+ const DateUtils_1 = require("./common/DateUtils");
18
+ const WeightUtils_1 = require("./common/WeightUtils");
19
+ const HydrationUtils_1 = require("./common/HydrationUtils");
20
+ var Event;
21
+ (function (Event) {
22
+ Event["sessionChange"] = "sessionChange";
23
+ })(Event = exports.Event || (exports.Event = {}));
24
+ class GarminConnect {
25
+ // private oauth1: OAuth;
26
+ constructor(credentials, domain = 'garmin.com') {
27
+ if (!credentials) {
28
+ throw new Error('Missing credentials');
29
+ }
30
+ this.credentials = credentials;
31
+ this.url = new UrlClass_1.UrlClass(domain);
32
+ this.client = new HttpClient_1.HttpClient(this.url);
33
+ this._userHash = undefined;
34
+ this.listeners = {};
35
+ }
36
+ async login(username, password) {
37
+ if (username && password) {
38
+ this.credentials.username = username;
39
+ this.credentials.password = password;
40
+ }
41
+ await this.client.login(this.credentials.username, this.credentials.password);
42
+ return this;
43
+ }
44
+ async exportTokenToFile(dirPath) {
45
+ const isDir = await (0, utils_1.checkIsDirectory)(dirPath);
46
+ if (!isDir) {
47
+ await (0, utils_1.createDirectory)(dirPath);
48
+ }
49
+ // save oauth1 to json
50
+ if (this.client.oauth1Token) {
51
+ await (0, utils_1.writeToFile)(node_path_1.default.join(dirPath, 'oauth1_token.json'), JSON.stringify(this.client.oauth1Token));
52
+ }
53
+ if (this.client.oauth2Token) {
54
+ await (0, utils_1.writeToFile)(node_path_1.default.join(dirPath, 'oauth2_token.json'), JSON.stringify(this.client.oauth2Token));
55
+ }
56
+ }
57
+ async loadTokenByFile(dirPath) {
58
+ const isDir = await (0, utils_1.checkIsDirectory)(dirPath);
59
+ if (!isDir) {
60
+ throw new Error('loadTokenByFile: Directory not found: ' + dirPath);
61
+ }
62
+ let oauth1Data = await node_fs_1.promises.readFile(node_path_1.default.join(dirPath, 'oauth1_token.json'), 'utf-8');
63
+ // console.log('loadTokenByFile - oauth1Data:', oauth1Data);
64
+ const oauth1 = JSON.parse(oauth1Data);
65
+ // console.log('loadTokenByFile - oauth1:', oauth1);
66
+ this.client.oauth1Token = oauth1;
67
+ let oauth2Data = await node_fs_1.promises.readFile(node_path_1.default.join(dirPath, 'oauth2_token.json'), 'utf-8');
68
+ // console.log('loadTokenByFile - oauth2Data:', oauth2Data);
69
+ const oauth2 = JSON.parse(oauth2Data);
70
+ // console.log('loadTokenByFile - oauth2:', oauth2);
71
+ this.client.oauth2Token = oauth2;
72
+ // console.log('loadTokenByFile - oauth2Token:', this);
73
+ // console.log('loadTokenByFile - oauth2Token:', this.client.oauth2Token);
74
+ }
75
+ exportToken() {
76
+ if (!this.client.oauth1Token || !this.client.oauth2Token) {
77
+ throw new Error('exportToken: Token not found');
78
+ }
79
+ return {
80
+ oauth1: this.client.oauth1Token,
81
+ oauth2: this.client.oauth2Token
82
+ };
83
+ }
84
+ // from db or localstorage etc
85
+ loadToken(oauth1, oauth2) {
86
+ this.client.oauth1Token = oauth1;
87
+ this.client.oauth2Token = oauth2;
88
+ }
89
+ async getUserSettings() {
90
+ return this.client.get(this.url.USER_SETTINGS);
91
+ }
92
+ async getUserProfile() {
93
+ return this.client.get(this.url.USER_PROFILE);
94
+ }
95
+ async getActivities(start, limit, activityType, subActivityType) {
96
+ return this.client.get(this.url.ACTIVITIES, {
97
+ params: { start, limit, activityType, subActivityType }
98
+ });
99
+ }
100
+ async getActivity(activity) {
101
+ if (!activity.activityId)
102
+ throw new Error('Missing activityId');
103
+ return this.client.get(this.url.ACTIVITY + activity.activityId);
104
+ }
105
+ async countActivities() {
106
+ return this.client.get(this.url.STAT_ACTIVITIES, {
107
+ params: {
108
+ aggregation: 'lifetime',
109
+ startDate: '1970-01-01',
110
+ endDate: luxon_1.DateTime.now().toFormat('yyyy-MM-dd'),
111
+ metric: 'duration'
112
+ }
113
+ });
114
+ }
115
+ async downloadWellnessData(date, dir) {
116
+ const dateStr = (0, DateUtils_1.toDateString)(date);
117
+ console.log('downloadWellnessData - dateStr:', dateStr);
118
+ const isDir = await (0, utils_1.checkIsDirectory)(dir);
119
+ if (!isDir) {
120
+ await (0, utils_1.createDirectory)(dir);
121
+ }
122
+ let fileBuffer = await this.client.get(this.url.DOWNLOAD_WELLNESS + dateStr, {
123
+ responseType: 'arraybuffer'
124
+ });
125
+ await (0, utils_1.writeToFile)(node_path_1.default.join(dir, `${dateStr}.zip`), fileBuffer);
126
+ }
127
+ async downloadOriginalActivityData(activity, dir, type = 'zip') {
128
+ if (!activity.activityId)
129
+ throw new Error('Missing activityId');
130
+ const isDir = await (0, utils_1.checkIsDirectory)(dir);
131
+ if (!isDir) {
132
+ await (0, utils_1.createDirectory)(dir);
133
+ }
134
+ let fileBuffer;
135
+ if (type === 'tcx') {
136
+ fileBuffer = await this.client.get(this.url.DOWNLOAD_TCX + activity.activityId);
137
+ }
138
+ else if (type === 'gpx') {
139
+ fileBuffer = await this.client.get(this.url.DOWNLOAD_GPX + activity.activityId);
140
+ }
141
+ else if (type === 'kml') {
142
+ fileBuffer = await this.client.get(this.url.DOWNLOAD_KML + activity.activityId);
143
+ }
144
+ else if (type === 'zip') {
145
+ fileBuffer = await this.client.get(this.url.DOWNLOAD_ZIP + activity.activityId, {
146
+ responseType: 'arraybuffer'
147
+ });
148
+ }
149
+ else {
150
+ throw new Error('downloadOriginalActivityData - Invalid type: ' + type);
151
+ }
152
+ await (0, utils_1.writeToFile)(node_path_1.default.join(dir, `${activity.activityId}.${type}`), fileBuffer);
153
+ }
154
+ async uploadActivity(file, format = 'fit') {
155
+ var _a;
156
+ const detectedFormat = (_a = (format || node_path_1.default.extname(file))) === null || _a === void 0 ? void 0 : _a.toLowerCase();
157
+ if (!lodash_1.default.includes(types_1.UploadFileType, detectedFormat)) {
158
+ throw new Error('uploadActivity - Invalid format: ' + format);
159
+ }
160
+ // const fh = await fs.open(file);
161
+ const fileBuffer = (0, node_fs_1.createReadStream)(file);
162
+ // console.log('fileBuffer:', fileBuffer);
163
+ const form = new form_data_1.default();
164
+ form.append('userfile', fileBuffer);
165
+ const response = await this.client.post(this.url.UPLOAD + '.' + format, form, {
166
+ headers: {
167
+ 'Content-Type': form.getHeaders()['content-type']
168
+ }
169
+ });
170
+ return response;
171
+ }
172
+ async deleteActivity(activity) {
173
+ if (!activity.activityId)
174
+ throw new Error('Missing activityId');
175
+ await this.client.delete(this.url.ACTIVITY + activity.activityId);
176
+ }
177
+ async getWorkouts(start, limit) {
178
+ return this.client.get(this.url.WORKOUTS, {
179
+ params: {
180
+ start,
181
+ limit
182
+ }
183
+ });
184
+ }
185
+ async getWorkoutDetail(workout) {
186
+ if (!workout.workoutId)
187
+ throw new Error('Missing workoutId');
188
+ return this.client.get(this.url.WORKOUT(workout.workoutId));
189
+ }
190
+ async addWorkout(workout) {
191
+ if (!workout)
192
+ throw new Error('Missing workout');
193
+ if (workout instanceof Running_1.default) {
194
+ if (workout.isValid()) {
195
+ const data = { ...workout.toJson() };
196
+ if (!data.description) {
197
+ data.description = 'Added by garmin-connect for Node.js';
198
+ }
199
+ return this.client.post(this.url.WORKOUT(), data);
200
+ }
201
+ }
202
+ if (!workout.workoutSegments)
203
+ throw new Error('Missing workoutSegments, please use WorkoutDetail, not Workout.');
204
+ const newWorkout = lodash_1.default.omit(workout, [
205
+ 'workoutId',
206
+ 'ownerId',
207
+ 'updatedDate',
208
+ 'createdDate',
209
+ 'author'
210
+ ]);
211
+ if (!newWorkout.description) {
212
+ newWorkout.description = 'Added by garmin-connect for Node.js';
213
+ }
214
+ // console.log('addWorkout - newWorkout:', newWorkout)
215
+ return this.client.post(this.url.WORKOUT(), newWorkout);
216
+ }
217
+ async addRunningWorkout(name, meters, description) {
218
+ const running = new Running_1.default();
219
+ running.name = name;
220
+ running.distance = meters;
221
+ running.description = description;
222
+ return this.addWorkout(running);
223
+ }
224
+ async deleteWorkout(workout) {
225
+ if (!workout.workoutId)
226
+ throw new Error('Missing workout');
227
+ return this.client.delete(this.url.WORKOUT(workout.workoutId));
228
+ }
229
+ async scheduleWorkout(workout, date = new Date()) {
230
+ if (!workout.workoutId)
231
+ throw new Error('Missing workoutId');
232
+ const formatedDate = luxon_1.DateTime.fromJSDate(date).toFormat('yyyy-MM-dd');
233
+ return this.client.post(`${this.url.SCHEDULE_WORKOUTS}${workout.workoutId}`, {
234
+ date: formatedDate
235
+ });
236
+ }
237
+ // Garmin use month 0-11, not real month.
238
+ async getCalendar(year = new Date().getFullYear(), month = new Date().getMonth()) {
239
+ return this.client.get(this.url.CALENDAR(year, month));
240
+ }
241
+ async getSteps(date = new Date()) {
242
+ const dateString = (0, DateUtils_1.toDateString)(date);
243
+ const days = await this.client.get(`${this.url.DAILY_STEPS}${dateString}/${dateString}`);
244
+ const dayStats = days.find(({ calendarDate }) => calendarDate === dateString);
245
+ if (!dayStats) {
246
+ throw new Error("Can't find daily steps for this date.");
247
+ }
248
+ return dayStats.totalSteps;
249
+ }
250
+ async getSleepData(date = new Date()) {
251
+ try {
252
+ const dateString = (0, DateUtils_1.toDateString)(date);
253
+ const sleepData = await this.client.get(`${this.url.DAILY_SLEEP}`, { params: { date: dateString } });
254
+ if (!sleepData) {
255
+ throw new Error('Invalid or empty sleep data response.');
256
+ }
257
+ return sleepData;
258
+ }
259
+ catch (error) {
260
+ throw new Error(`Error in getSleepData: ${error.message}`);
261
+ }
262
+ }
263
+ async getSleepDuration(date = new Date()) {
264
+ try {
265
+ const sleepData = await this.getSleepData(date);
266
+ if (!sleepData ||
267
+ !sleepData.dailySleepDTO ||
268
+ sleepData.dailySleepDTO.sleepStartTimestampGMT === undefined ||
269
+ sleepData.dailySleepDTO.sleepEndTimestampGMT === undefined) {
270
+ throw new Error('Invalid or missing sleep data for the specified date.');
271
+ }
272
+ const sleepStartTimestampGMT = sleepData.dailySleepDTO.sleepStartTimestampGMT;
273
+ const sleepEndTimestampGMT = sleepData.dailySleepDTO.sleepEndTimestampGMT;
274
+ const { hours, minutes } = (0, DateUtils_1.calculateTimeDifference)(sleepStartTimestampGMT, sleepEndTimestampGMT);
275
+ return {
276
+ hours,
277
+ minutes
278
+ };
279
+ }
280
+ catch (error) {
281
+ throw new Error(`Error in getSleepDuration: ${error.message}`);
282
+ }
283
+ }
284
+ async getDailyWeightData(date = new Date()) {
285
+ try {
286
+ const dateString = (0, DateUtils_1.toDateString)(date);
287
+ const weightData = await this.client.get(`${this.url.DAILY_WEIGHT}/${dateString}`);
288
+ if (!weightData) {
289
+ throw new Error('Invalid or empty weight data response.');
290
+ }
291
+ return weightData;
292
+ }
293
+ catch (error) {
294
+ throw new Error(`Error in getDailyWeightData: ${error.message}`);
295
+ }
296
+ }
297
+ async getDailyWeightInPounds(date = new Date()) {
298
+ const weightData = await this.getDailyWeightData(date);
299
+ if (weightData.totalAverage &&
300
+ typeof weightData.totalAverage.weight === 'number') {
301
+ return (0, WeightUtils_1.gramsToPounds)(weightData.totalAverage.weight);
302
+ }
303
+ else {
304
+ throw new Error("Can't find valid daily weight for this date.");
305
+ }
306
+ }
307
+ async getDailyHydration(date = new Date()) {
308
+ try {
309
+ const dateString = (0, DateUtils_1.toDateString)(date);
310
+ const hydrationData = await this.client.get(`${this.url.DAILY_HYDRATION}/${dateString}`);
311
+ if (!hydrationData || !hydrationData.valueInML) {
312
+ throw new Error('Invalid or empty hydration data response.');
313
+ }
314
+ return (0, HydrationUtils_1.convertMLToOunces)(hydrationData.valueInML);
315
+ }
316
+ catch (error) {
317
+ throw new Error(`Error in getDailyHydration: ${error.message}`);
318
+ }
319
+ }
320
+ async updateWeight(date = new Date(), lbs, timezone) {
321
+ try {
322
+ const weightData = await this.client.post(`${this.url.UPDATE_WEIGHT}`, {
323
+ dateTimestamp: (0, DateUtils_1.getLocalTimestamp)(date, timezone),
324
+ gmtTimestamp: date.toISOString().substring(0, 23),
325
+ unitKey: 'lbs',
326
+ value: lbs
327
+ });
328
+ return weightData;
329
+ }
330
+ catch (error) {
331
+ throw new Error(`Error in updateWeight: ${error.message}`);
332
+ }
333
+ }
334
+ async updateHydrationLogOunces(date = new Date(), valueInOz) {
335
+ try {
336
+ const dateString = (0, DateUtils_1.toDateString)(date);
337
+ const hydrationData = await this.client.put(`${this.url.HYDRATION_LOG}`, {
338
+ calendarDate: dateString,
339
+ valueInML: (0, HydrationUtils_1.convertOuncesToML)(valueInOz),
340
+ userProfileId: (await this.getUserProfile()).profileId,
341
+ timestampLocal: date.toISOString().substring(0, 23)
342
+ });
343
+ return hydrationData;
344
+ }
345
+ catch (error) {
346
+ throw new Error(`Error in updateHydrationLogOunces: ${error.message}`);
347
+ }
348
+ }
349
+ async getGolfSummary() {
350
+ try {
351
+ const golfSummary = await this.client.get(`${this.url.GOLF_SCORECARD_SUMMARY}`);
352
+ if (!golfSummary) {
353
+ throw new Error('Invalid or empty golf summary data response.');
354
+ }
355
+ return golfSummary;
356
+ }
357
+ catch (error) {
358
+ throw new Error(`Error in getGolfSummary: ${error.message}`);
359
+ }
360
+ }
361
+ async getGolfScorecard(scorecardId) {
362
+ try {
363
+ const golfScorecard = await this.client.get(`${this.url.GOLF_SCORECARD_DETAIL}`, { params: { 'scorecard-ids': scorecardId } });
364
+ if (!golfScorecard) {
365
+ throw new Error('Invalid or empty golf scorecard data response.');
366
+ }
367
+ return golfScorecard;
368
+ }
369
+ catch (error) {
370
+ throw new Error(`Error in getGolfScorecard: ${error.message}`);
371
+ }
372
+ }
373
+ async getHeartRate(date = new Date()) {
374
+ try {
375
+ const dateString = (0, DateUtils_1.toDateString)(date);
376
+ const heartRate = await this.client.get(`${this.url.DAILY_HEART_RATE}`, { params: { date: dateString } });
377
+ return heartRate;
378
+ }
379
+ catch (error) {
380
+ throw new Error(`Error in getHeartRate: ${error.message}`);
381
+ }
382
+ }
383
+ async get(url, data) {
384
+ const response = await this.client.get(url, data);
385
+ return response;
386
+ }
387
+ async post(url, data) {
388
+ const response = await this.client.post(url, data, {});
389
+ return response;
390
+ }
391
+ async put(url, data) {
392
+ const response = await this.client.put(url, data, {});
393
+ return response;
394
+ }
395
+ }
396
+ exports.default = GarminConnect;
397
+ //# sourceMappingURL=GarminConnect_new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GarminConnect_new.js","sourceRoot":"","sources":["../../src/garmin/GarminConnect_new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { HttpClient } from '../common/HttpClient';
2
+ import { ExportFileTypeValue, GarminDomain, ICalendar, ICountActivities, IGarminTokens, IOauth1Token, IOauth2Token, IScheduleWorkout, ISocialProfile, IUserSettings, IWorkout, IWorkoutDetail, UploadFileTypeTypeValue } from './types';
3
+ import Running from './workouts/Running';
4
+ import { SleepData } from './types/sleep';
5
+ import { ActivitySubType, ActivityType, GCActivityId, IActivity } from './types/activity';
6
+ export type EventCallback<T> = (data: T) => void;
7
+ export interface GCCredentials {
8
+ username: string;
9
+ password: string;
10
+ }
11
+ export interface Listeners {
12
+ [event: string]: EventCallback<any>[];
13
+ }
14
+ export declare enum Event {
15
+ sessionChange = "sessionChange"
16
+ }
17
+ export interface Session {
18
+ }
19
+ export default class GarminConnect {
20
+ client: HttpClient;
21
+ private _userHash;
22
+ private credentials;
23
+ private listeners;
24
+ private url;
25
+ constructor(credentials?: GCCredentials | undefined, domain?: GarminDomain);
26
+ login(username?: string, password?: string): Promise<GarminConnect>;
27
+ exportTokenToFile(dirPath: string): void;
28
+ loadTokenByFile(dirPath: string): void;
29
+ exportToken(): IGarminTokens;
30
+ loadToken(oauth1: IOauth1Token, oauth2: IOauth2Token): void;
31
+ getUserSettings(): Promise<IUserSettings>;
32
+ getUserProfile(): Promise<ISocialProfile>;
33
+ getActivities(start?: number, limit?: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>;
34
+ getActivity(activity: {
35
+ activityId: GCActivityId;
36
+ }): Promise<IActivity>;
37
+ countActivities(): Promise<ICountActivities>;
38
+ downloadOriginalActivityData(activity: {
39
+ activityId: GCActivityId;
40
+ }, dir: string, type?: ExportFileTypeValue): Promise<void>;
41
+ uploadActivity(file: string, format?: UploadFileTypeTypeValue): Promise<unknown>;
42
+ deleteActivity(activity: {
43
+ activityId: GCActivityId;
44
+ }): Promise<void>;
45
+ getWorkouts(start: number, limit: number): Promise<IWorkout[]>;
46
+ getWorkoutDetail(workout: {
47
+ workoutId: string;
48
+ }): Promise<IWorkoutDetail>;
49
+ addWorkout(workout: IWorkoutDetail | Running): Promise<IWorkoutDetail>;
50
+ addRunningWorkout(name: string, meters: number, description: string): Promise<IWorkoutDetail>;
51
+ deleteWorkout(workout: {
52
+ workoutId: string;
53
+ }): Promise<unknown>;
54
+ scheduleWorkout(workout: {
55
+ workoutId: string;
56
+ }, date?: Date): Promise<IScheduleWorkout>;
57
+ getCalendar(year?: number, month?: number): Promise<ICalendar>;
58
+ getSteps(date?: Date): Promise<number>;
59
+ getSleepData(date?: Date): Promise<SleepData>;
60
+ getSleepDuration(date?: Date): Promise<{
61
+ hours: number;
62
+ minutes: number;
63
+ }>;
64
+ getDailyWeightData(date?: Date): Promise<WeightData>;
65
+ getDailyWeightInPounds(date?: Date): Promise<number>;
66
+ getDailyHydration(date?: Date): Promise<number>;
67
+ updateWeight(date: Date | undefined, lbs: number, timezone: string): Promise<UpdateWeight>;
68
+ updateHydrationLogOunces(date: Date | undefined, valueInOz: number): Promise<WaterIntake>;
69
+ getGolfSummary(): Promise<GolfSummary>;
70
+ getGolfScorecard(scorecardId: number): Promise<GolfScorecard>;
71
+ getHeartRate(date?: Date): Promise<HeartRate>;
72
+ get<T>(url: string, data?: any): Promise<T>;
73
+ post<T>(url: string, data: any): Promise<T>;
74
+ put<T>(url: string, data: any): Promise<T>;
75
+ }