@nativesquare/soma 0.7.2 → 0.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 (133) hide show
  1. package/dist/client/index.d.ts +83 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +131 -0
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/component/_generated/component.d.ts +159 -0
  6. package/dist/component/_generated/component.d.ts.map +1 -1
  7. package/dist/component/garmin.d.ts +190 -6
  8. package/dist/component/garmin.d.ts.map +1 -1
  9. package/dist/component/garmin.js +829 -63
  10. package/dist/component/garmin.js.map +1 -1
  11. package/dist/component/private.d.ts +18 -0
  12. package/dist/component/private.d.ts.map +1 -1
  13. package/dist/component/private.js +18 -0
  14. package/dist/component/private.js.map +1 -1
  15. package/dist/component/public.d.ts +88 -42
  16. package/dist/component/public.d.ts.map +1 -1
  17. package/dist/component/public.js +12 -2
  18. package/dist/component/public.js.map +1 -1
  19. package/dist/component/schema.d.ts +87 -32
  20. package/dist/component/schema.d.ts.map +1 -1
  21. package/dist/component/schema.js +2 -1
  22. package/dist/component/schema.js.map +1 -1
  23. package/dist/component/validators/connection.d.ts +1 -0
  24. package/dist/component/validators/connection.d.ts.map +1 -1
  25. package/dist/component/validators/connection.js +2 -0
  26. package/dist/component/validators/connection.js.map +1 -1
  27. package/dist/component/validators/daily.d.ts +40 -5
  28. package/dist/component/validators/daily.d.ts.map +1 -1
  29. package/dist/component/validators/daily.js +10 -1
  30. package/dist/component/validators/daily.js.map +1 -1
  31. package/dist/component/validators/plannedWorkout.d.ts +5 -1
  32. package/dist/component/validators/plannedWorkout.d.ts.map +1 -1
  33. package/dist/component/validators/plannedWorkout.js +4 -0
  34. package/dist/component/validators/plannedWorkout.js.map +1 -1
  35. package/dist/component/validators/sleep.d.ts +8 -8
  36. package/dist/garmin/activity.d.ts +7 -16
  37. package/dist/garmin/activity.d.ts.map +1 -1
  38. package/dist/garmin/activity.js +17 -23
  39. package/dist/garmin/activity.js.map +1 -1
  40. package/dist/garmin/bloodPressure.d.ts +28 -0
  41. package/dist/garmin/bloodPressure.d.ts.map +1 -0
  42. package/dist/garmin/bloodPressure.js +34 -0
  43. package/dist/garmin/bloodPressure.js.map +1 -0
  44. package/dist/garmin/body.js +1 -1
  45. package/dist/garmin/body.js.map +1 -1
  46. package/dist/garmin/client.d.ts +117 -17
  47. package/dist/garmin/client.d.ts.map +1 -1
  48. package/dist/garmin/client.js +337 -43
  49. package/dist/garmin/client.js.map +1 -1
  50. package/dist/garmin/daily.d.ts.map +1 -1
  51. package/dist/garmin/daily.js +3 -3
  52. package/dist/garmin/daily.js.map +1 -1
  53. package/dist/garmin/hrv.d.ts +30 -0
  54. package/dist/garmin/hrv.d.ts.map +1 -0
  55. package/dist/garmin/hrv.js +45 -0
  56. package/dist/garmin/hrv.js.map +1 -0
  57. package/dist/garmin/index.d.ts +16 -2
  58. package/dist/garmin/index.d.ts.map +1 -1
  59. package/dist/garmin/index.js +8 -1
  60. package/dist/garmin/index.js.map +1 -1
  61. package/dist/garmin/maps/activity-type.d.ts +1 -2
  62. package/dist/garmin/maps/activity-type.d.ts.map +1 -1
  63. package/dist/garmin/maps/activity-type.js +1 -0
  64. package/dist/garmin/maps/activity-type.js.map +1 -1
  65. package/dist/garmin/menstruation.d.ts +6 -4
  66. package/dist/garmin/menstruation.d.ts.map +1 -1
  67. package/dist/garmin/menstruation.js +12 -8
  68. package/dist/garmin/menstruation.js.map +1 -1
  69. package/dist/garmin/pulseOx.d.ts +24 -0
  70. package/dist/garmin/pulseOx.d.ts.map +1 -0
  71. package/dist/garmin/pulseOx.js +33 -0
  72. package/dist/garmin/pulseOx.js.map +1 -0
  73. package/dist/garmin/respiration.d.ts +29 -0
  74. package/dist/garmin/respiration.d.ts.map +1 -0
  75. package/dist/garmin/respiration.js +42 -0
  76. package/dist/garmin/respiration.js.map +1 -0
  77. package/dist/garmin/skinTemp.d.ts +27 -0
  78. package/dist/garmin/skinTemp.d.ts.map +1 -0
  79. package/dist/garmin/skinTemp.js +35 -0
  80. package/dist/garmin/skinTemp.js.map +1 -0
  81. package/dist/garmin/sleep.d.ts +4 -4
  82. package/dist/garmin/sleep.d.ts.map +1 -1
  83. package/dist/garmin/sleep.js +15 -9
  84. package/dist/garmin/sleep.js.map +1 -1
  85. package/dist/garmin/stressDetails.d.ts +30 -0
  86. package/dist/garmin/stressDetails.d.ts.map +1 -0
  87. package/dist/garmin/stressDetails.js +49 -0
  88. package/dist/garmin/stressDetails.js.map +1 -0
  89. package/dist/garmin/sync.d.ts +14 -0
  90. package/dist/garmin/sync.d.ts.map +1 -1
  91. package/dist/garmin/sync.js +287 -5
  92. package/dist/garmin/sync.js.map +1 -1
  93. package/dist/garmin/types.d.ts +77 -186
  94. package/dist/garmin/types.d.ts.map +1 -1
  95. package/dist/garmin/types.js +4 -2
  96. package/dist/garmin/types.js.map +1 -1
  97. package/dist/garmin/userMetrics.d.ts +23 -0
  98. package/dist/garmin/userMetrics.d.ts.map +1 -0
  99. package/dist/garmin/userMetrics.js +41 -0
  100. package/dist/garmin/userMetrics.js.map +1 -0
  101. package/dist/validators.d.ts +107 -28
  102. package/dist/validators.d.ts.map +1 -1
  103. package/package.json +133 -124
  104. package/src/client/index.ts +199 -0
  105. package/src/component/_generated/component.ts +161 -2
  106. package/src/component/garmin.ts +923 -73
  107. package/src/component/private.ts +21 -0
  108. package/src/component/public.ts +11 -2
  109. package/src/component/schema.ts +2 -1
  110. package/src/component/validators/connection.ts +2 -0
  111. package/src/component/validators/daily.ts +15 -0
  112. package/src/component/validators/plannedWorkout.ts +4 -0
  113. package/src/garmin/activity.test.ts +13 -21
  114. package/src/garmin/activity.ts +38 -45
  115. package/src/garmin/bloodPressure.ts +41 -0
  116. package/src/garmin/body.ts +1 -1
  117. package/src/garmin/client.ts +550 -71
  118. package/src/garmin/daily.ts +8 -4
  119. package/src/garmin/hrv.ts +57 -0
  120. package/src/garmin/index.ts +77 -7
  121. package/src/garmin/maps/activity-type.ts +2 -2
  122. package/src/garmin/menstruation.ts +14 -12
  123. package/src/garmin/pulseOx.ts +45 -0
  124. package/src/garmin/respiration.ts +55 -0
  125. package/src/garmin/skinTemp.ts +42 -0
  126. package/src/garmin/sleep.test.ts +5 -6
  127. package/src/garmin/sleep.ts +22 -16
  128. package/src/garmin/spec/wellness-api.json +1 -0
  129. package/src/garmin/stressDetails.ts +71 -0
  130. package/src/garmin/sync.ts +348 -5
  131. package/src/garmin/types.ts +88 -300
  132. package/src/garmin/userMetrics.ts +50 -0
  133. package/src/garmin/wellness-api.d.ts +5637 -0
@@ -1,9 +1,13 @@
1
1
  // ─── Garmin Health API Client ────────────────────────────────────────────────
2
- // Lightweight, fetch-based client for the Garmin Health API.
3
- // Authenticates requests with an OAuth 2.0 Bearer token.
2
+ // Uses openapi-fetch for type-safe Wellness API calls and manual fetch for
3
+ // Training API endpoints that are not covered by the OpenAPI spec.
4
+ import createClient from "openapi-fetch";
4
5
  const DEFAULT_BASE_URL = "https://apis.garmin.com";
5
6
  /**
6
- * A lightweight client for the Garmin Health API.
7
+ * A client for the Garmin Health API.
8
+ *
9
+ * Wellness API endpoints use openapi-fetch for type safety. Training API
10
+ * endpoints use manual fetch since they are not part of the Wellness API spec.
7
11
  *
8
12
  * All requests are authenticated with a Bearer token. Time-range parameters
9
13
  * use Unix epoch seconds for `uploadStartTimeInSeconds` and
@@ -24,36 +28,130 @@ const DEFAULT_BASE_URL = "https://apis.garmin.com";
24
28
  export class GarminClient {
25
29
  accessToken;
26
30
  baseUrl;
31
+ wellness;
27
32
  constructor(opts) {
28
33
  this.accessToken = opts.accessToken;
29
34
  this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
35
+ const authMiddleware = {
36
+ async onRequest({ request }) {
37
+ request.headers.set("Authorization", `Bearer ${opts.accessToken}`);
38
+ request.headers.set("Accept", "application/json");
39
+ return request;
40
+ },
41
+ };
42
+ this.wellness = createClient({
43
+ baseUrl: `${this.baseUrl}/wellness-api`,
44
+ });
45
+ this.wellness.use(authMiddleware);
46
+ }
47
+ // ─── User Identity ──────────────────────────────────────────────────────
48
+ /**
49
+ * Resolve the Garmin user ID for the authenticated user.
50
+ *
51
+ * Garmin API: `GET /wellness-api/rest/user/id`
52
+ */
53
+ async getUserId() {
54
+ const { data, error, response } = await this.wellness.GET("/rest/user/id");
55
+ if (error) {
56
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
57
+ }
58
+ return data?.userId ?? null;
59
+ }
60
+ // ─── User Permissions ─────────────────────────────────────────────────
61
+ /**
62
+ * Check which permissions the user has granted.
63
+ *
64
+ * Garmin API: `GET /wellness-api/rest/user/permissions`
65
+ */
66
+ async getUserPermissions() {
67
+ const { data, error, response } = await this.wellness.GET("/rest/user/permissions");
68
+ if (error) {
69
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
70
+ }
71
+ return data?.permissions ?? [];
30
72
  }
31
- // ─── Daily Summaries ────────────────────────────────────────────────────
73
+ // ─── Daily Summaries ──────────────────────────────────────────────────
32
74
  /**
33
75
  * Get daily wellness summaries.
34
76
  *
35
77
  * Garmin API: `GET /wellness-api/rest/dailies`
36
78
  */
37
79
  async getDailies(params) {
38
- return this.get("/wellness-api/rest/dailies", timeRangeQuery(params));
80
+ const { data, error, response } = await this.wellness.GET("/rest/dailies", {
81
+ params: { query: timeRangeQuery(params, this.accessToken) },
82
+ });
83
+ if (error) {
84
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
85
+ }
86
+ console.log("[getDailies] raw response:", JSON.stringify(data?.[0], null, 2));
87
+ return (data ?? []);
39
88
  }
40
- // ─── Activities ─────────────────────────────────────────────────────────
89
+ // ─── Activities ───────────────────────────────────────────────────────
41
90
  /**
42
91
  * Get activity summaries.
43
92
  *
44
93
  * Garmin API: `GET /wellness-api/rest/activities`
45
94
  */
46
95
  async getActivities(params) {
47
- return this.get("/wellness-api/rest/activities", timeRangeQuery(params));
96
+ const { data, error, response } = await this.wellness.GET("/rest/activities", {
97
+ params: { query: timeRangeQuery(params, this.accessToken) },
98
+ });
99
+ if (error) {
100
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
101
+ }
102
+ return (data ?? []);
103
+ }
104
+ // ─── Activity Details ─────────────────────────────────────────────────
105
+ /**
106
+ * Get detailed activity summaries including GPS, heart rate, and sensor data.
107
+ *
108
+ * Garmin API: `GET /wellness-api/rest/activityDetails`
109
+ */
110
+ async getActivityDetails(params) {
111
+ const { data, error, response } = await this.wellness.GET("/rest/activityDetails", {
112
+ params: { query: timeRangeQuery(params, this.accessToken) },
113
+ });
114
+ if (error) {
115
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
116
+ }
117
+ return (data ?? []);
118
+ }
119
+ // ─── Activity File ────────────────────────────────────────────────────
120
+ /**
121
+ * Download a raw activity file (FIT, TCX, or GPX).
122
+ *
123
+ * Garmin API: `GET /wellness-api/rest/activityFile`
124
+ *
125
+ * @returns The raw file as an ArrayBuffer.
126
+ */
127
+ async getActivityFile(id) {
128
+ const url = `${this.baseUrl}/wellness-api/rest/activityFile?id=${encodeURIComponent(id)}`;
129
+ const response = await fetch(url, {
130
+ method: "GET",
131
+ headers: {
132
+ Authorization: `Bearer ${this.accessToken}`,
133
+ },
134
+ });
135
+ if (!response.ok) {
136
+ const body = await response.text().catch(() => "");
137
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, body);
138
+ }
139
+ return response.arrayBuffer();
48
140
  }
49
- // ─── Sleep ──────────────────────────────────────────────────────────────
141
+ // ─── Sleep ────────────────────────────────────────────────────────────
50
142
  /**
51
143
  * Get sleep summaries.
52
144
  *
53
145
  * Garmin API: `GET /wellness-api/rest/sleeps`
54
146
  */
55
147
  async getSleeps(params) {
56
- return this.get("/wellness-api/rest/sleeps", timeRangeQuery(params));
148
+ const { data, error, response } = await this.wellness.GET("/rest/sleeps", {
149
+ params: { query: timeRangeQuery(params, this.accessToken) },
150
+ });
151
+ if (error) {
152
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
153
+ }
154
+ return (data ?? []);
57
155
  }
58
156
  // ─── Body Composition ─────────────────────────────────────────────────
59
157
  /**
@@ -62,16 +160,208 @@ export class GarminClient {
62
160
  * Garmin API: `GET /wellness-api/rest/bodyComps`
63
161
  */
64
162
  async getBodyCompositions(params) {
65
- return this.get("/wellness-api/rest/bodyComps", timeRangeQuery(params));
163
+ const { data, error, response } = await this.wellness.GET("/rest/bodyComps", {
164
+ params: { query: timeRangeQuery(params, this.accessToken) },
165
+ });
166
+ if (error) {
167
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
168
+ }
169
+ return (data ?? []);
66
170
  }
67
171
  // ─── Menstrual Cycle ──────────────────────────────────────────────────
68
172
  /**
69
- * Get menstrual cycle data.
173
+ * Get menstrual cycle tracking data.
70
174
  *
71
- * Garmin API: `GET /wellness-api/rest/menstrualCycleData`
175
+ * Garmin API: `GET /wellness-api/rest/mct`
72
176
  */
73
177
  async getMenstrualCycleData(params) {
74
- return this.get("/wellness-api/rest/menstrualCycleData", timeRangeQuery(params));
178
+ const { data, error, response } = await this.wellness.GET("/rest/mct", {
179
+ params: { query: timeRangeQuery(params, this.accessToken) },
180
+ });
181
+ if (error) {
182
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
183
+ }
184
+ return (data ?? []);
185
+ }
186
+ // ─── User Metrics ─────────────────────────────────────────────────────
187
+ /**
188
+ * Get user metrics (VO2 max, fitness age, etc.).
189
+ *
190
+ * Garmin API: `GET /wellness-api/rest/userMetrics`
191
+ */
192
+ async getUserMetrics(params) {
193
+ const { data, error, response } = await this.wellness.GET("/rest/userMetrics", {
194
+ params: { query: timeRangeQuery(params, this.accessToken) },
195
+ });
196
+ if (error) {
197
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
198
+ }
199
+ return (data ?? []);
200
+ }
201
+ // ─── Stress Details ───────────────────────────────────────────────────
202
+ /**
203
+ * Get stress detail summaries.
204
+ *
205
+ * Garmin API: `GET /wellness-api/rest/stressDetails`
206
+ */
207
+ async getStressDetails(params) {
208
+ const { data, error, response } = await this.wellness.GET("/rest/stressDetails", {
209
+ params: { query: timeRangeQuery(params, this.accessToken) },
210
+ });
211
+ if (error) {
212
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
213
+ }
214
+ return (data ?? []);
215
+ }
216
+ // ─── Skin Temperature ─────────────────────────────────────────────────
217
+ /**
218
+ * Get skin temperature summaries.
219
+ *
220
+ * Garmin API: `GET /wellness-api/rest/skinTemp`
221
+ */
222
+ async getSkinTemperature(params) {
223
+ const { data, error, response } = await this.wellness.GET("/rest/skinTemp", {
224
+ params: { query: timeRangeQuery(params, this.accessToken) },
225
+ });
226
+ if (error) {
227
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
228
+ }
229
+ return (data ?? []);
230
+ }
231
+ // ─── Respiration ──────────────────────────────────────────────────────
232
+ /**
233
+ * Get respiration summaries.
234
+ *
235
+ * Garmin API: `GET /wellness-api/rest/respiration`
236
+ */
237
+ async getRespiration(params) {
238
+ const { data, error, response } = await this.wellness.GET("/rest/respiration", {
239
+ params: { query: timeRangeQuery(params, this.accessToken) },
240
+ });
241
+ if (error) {
242
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
243
+ }
244
+ return (data ?? []);
245
+ }
246
+ // ─── Pulse Ox ─────────────────────────────────────────────────────────
247
+ /**
248
+ * Get pulse oximetry (SpO2) summaries.
249
+ *
250
+ * Garmin API: `GET /wellness-api/rest/pulseOx`
251
+ */
252
+ async getPulseOx(params) {
253
+ const { data, error, response } = await this.wellness.GET("/rest/pulseOx", {
254
+ params: { query: timeRangeQuery(params, this.accessToken) },
255
+ });
256
+ if (error) {
257
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
258
+ }
259
+ return (data ?? []);
260
+ }
261
+ // ─── Move IQ ──────────────────────────────────────────────────────────
262
+ /**
263
+ * Get Move IQ auto-detected activity events.
264
+ *
265
+ * Garmin API: `GET /wellness-api/rest/moveiq`
266
+ */
267
+ async getMoveIQ(params) {
268
+ const { data, error, response } = await this.wellness.GET("/rest/moveiq", {
269
+ params: { query: timeRangeQuery(params, this.accessToken) },
270
+ });
271
+ if (error) {
272
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
273
+ }
274
+ return (data ?? []);
275
+ }
276
+ // ─── HRV ──────────────────────────────────────────────────────────────
277
+ /**
278
+ * Get heart rate variability (HRV) summaries.
279
+ *
280
+ * Garmin API: `GET /wellness-api/rest/hrv`
281
+ */
282
+ async getHRV(params) {
283
+ const { data, error, response } = await this.wellness.GET("/rest/hrv", {
284
+ params: { query: timeRangeQuery(params, this.accessToken) },
285
+ });
286
+ if (error) {
287
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
288
+ }
289
+ return (data ?? []);
290
+ }
291
+ // ─── Health Snapshot ──────────────────────────────────────────────────
292
+ /**
293
+ * Get health snapshot summaries.
294
+ *
295
+ * Garmin API: `GET /wellness-api/rest/healthSnapshot`
296
+ */
297
+ async getHealthSnapshot(params) {
298
+ const { data, error, response } = await this.wellness.GET("/rest/healthSnapshot", {
299
+ params: { query: timeRangeQuery(params, this.accessToken) },
300
+ });
301
+ if (error) {
302
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
303
+ }
304
+ return (data ?? []);
305
+ }
306
+ // ─── Epochs ───────────────────────────────────────────────────────────
307
+ /**
308
+ * Get epoch (15-minute interval) summaries.
309
+ *
310
+ * Garmin API: `GET /wellness-api/rest/epochs`
311
+ */
312
+ async getEpochs(params) {
313
+ const { data, error, response } = await this.wellness.GET("/rest/epochs", {
314
+ params: { query: timeRangeQuery(params, this.accessToken) },
315
+ });
316
+ if (error) {
317
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
318
+ }
319
+ return (data ?? []);
320
+ }
321
+ // ─── Blood Pressure ───────────────────────────────────────────────────
322
+ /**
323
+ * Get blood pressure summaries.
324
+ *
325
+ * Garmin API: `GET /wellness-api/rest/bloodPressures`
326
+ */
327
+ async getBloodPressures(params) {
328
+ const { data, error, response } = await this.wellness.GET("/rest/bloodPressures", {
329
+ params: { query: timeRangeQuery(params, this.accessToken) },
330
+ });
331
+ if (error) {
332
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
333
+ }
334
+ return (data ?? []);
335
+ }
336
+ // ─── Manually Updated Activities ──────────────────────────────────────
337
+ /**
338
+ * Get manually created or edited activities.
339
+ *
340
+ * Garmin API: `GET /wellness-api/rest/manuallyUpdatedActivities`
341
+ */
342
+ async getManuallyUpdatedActivities(params) {
343
+ const { data, error, response } = await this.wellness.GET("/rest/manuallyUpdatedActivities", {
344
+ params: { query: timeRangeQuery(params, this.accessToken) },
345
+ });
346
+ if (error) {
347
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
348
+ }
349
+ return (data ?? []);
350
+ }
351
+ // ─── Solar Intensity ──────────────────────────────────────────────────
352
+ /**
353
+ * Get solar intensity summaries.
354
+ *
355
+ * Garmin API: `GET /wellness-api/rest/solarIntensity`
356
+ */
357
+ async getSolarIntensity(params) {
358
+ const { data, error, response } = await this.wellness.GET("/rest/solarIntensity", {
359
+ params: { query: timeRangeQuery(params, this.accessToken) },
360
+ });
361
+ if (error) {
362
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
363
+ }
364
+ return (data ?? []);
75
365
  }
76
366
  // ─── Backfill ─────────────────────────────────────────────────────────
77
367
  /**
@@ -80,22 +370,45 @@ export class GarminClient {
80
370
  * Garmin processes backfill requests asynchronously and delivers data
81
371
  * via the configured webhook endpoint. Maximum range: 90 days per request.
82
372
  *
373
+ * Uses manual fetch because the spec defines individual backfill paths
374
+ * (e.g. `/rest/backfill/dailies`) but this method accepts a dynamic
375
+ * summaryType string.
376
+ *
83
377
  * @param summaryType - The data type to backfill (e.g., "dailies", "activities", "sleeps", "bodyComps")
84
378
  * @param params - Time range for the backfill
85
379
  */
86
380
  async requestBackfill(summaryType, params) {
87
- const query = timeRangeQuery(params);
88
- await this.get(`/wellness-api/rest/backfill/${summaryType}`, query);
381
+ const query = timeRangeQuery(params, this.accessToken);
382
+ const qs = new URLSearchParams(query).toString();
383
+ const url = `${this.baseUrl}/wellness-api/rest/backfill/${summaryType}?${qs}`;
384
+ const response = await fetch(url, {
385
+ method: "GET",
386
+ headers: {
387
+ Authorization: `Bearer ${this.accessToken}`,
388
+ Accept: "application/json",
389
+ },
390
+ });
391
+ if (!response.ok) {
392
+ const body = await response.text().catch(() => "");
393
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, body);
394
+ }
89
395
  }
90
- // ─── Training API V2 ────────────────────────────────────────────────
396
+ // ─── User Deregistration ──────────────────────────────────────────────
91
397
  /**
92
- * Check which permissions the user has granted.
398
+ * Delete the user's registration with Garmin.
93
399
  *
94
- * Garmin OAuth 2.0 PKCE spec: `GET /wellness-api/rest/user/permissions`
400
+ * Must be called when the user disconnects or deletes their account
401
+ * to comply with Garmin's API requirements.
95
402
  */
96
- async getUserPermissions() {
97
- return this.get("/wellness-api/rest/user/permissions");
403
+ async deleteUserRegistration() {
404
+ const { error, response } = await this.wellness.DELETE("/rest/user/registration");
405
+ if (error) {
406
+ throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
407
+ }
98
408
  }
409
+ // ─── Training API V2 ─────────────────────────────────────────────────
410
+ // These endpoints are NOT part of the Wellness API spec, so they use
411
+ // manual fetch.
99
412
  /**
100
413
  * Create a workout in Garmin Connect.
101
414
  *
@@ -159,27 +472,7 @@ export class GarminClient {
159
472
  async deleteSchedule(scheduleId) {
160
473
  await this.del(`/training-api/schedule/${scheduleId}`);
161
474
  }
162
- // ─── User Deregistration ──────────────────────────────────────────────
163
- /**
164
- * Delete the user's registration with Garmin.
165
- *
166
- * Must be called when the user disconnects or deletes their account
167
- * to comply with Garmin's API requirements.
168
- */
169
- async deleteUserRegistration() {
170
- const url = `${this.baseUrl}/wellness-api/rest/user/registration`;
171
- const response = await fetch(url, {
172
- method: "DELETE",
173
- headers: {
174
- Authorization: `Bearer ${this.accessToken}`,
175
- },
176
- });
177
- if (!response.ok) {
178
- const body = await response.text().catch(() => "");
179
- throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, body);
180
- }
181
- }
182
- // ─── Internal ─────────────────────────────────────────────────────────
475
+ // ─── Internal (Training API helpers) ──────────────────────────────────
183
476
  async get(path, queryParams) {
184
477
  const fullUrl = `${this.baseUrl}${path}`;
185
478
  const qs = queryParams
@@ -252,10 +545,11 @@ export class GarminClient {
252
545
  }
253
546
  }
254
547
  }
255
- function timeRangeQuery(params) {
548
+ function timeRangeQuery(params, token) {
256
549
  return {
257
550
  uploadStartTimeInSeconds: String(params.uploadStartTimeInSeconds),
258
551
  uploadEndTimeInSeconds: String(params.uploadEndTimeInSeconds),
552
+ ...(token ? { token } : {}),
259
553
  };
260
554
  }
261
555
  // ─── Error ────────────────────────────────────────────────────────────────────
@@ -263,7 +557,7 @@ export class GarminApiError extends Error {
263
557
  status;
264
558
  body;
265
559
  constructor(message, status, body) {
266
- super(message);
560
+ super(`${message} — ${body}`);
267
561
  this.status = status;
268
562
  this.body = body;
269
563
  this.name = "GarminApiError";
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/garmin/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/garmin/client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"daily.d.ts","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA8LlC,MAAM;;;;;;;;;uBAAN,MAAM;;;;;;;;;;;;;;;uBAAN,MAAM;;;;;uBAAN,MAAM;;;;;EAvK3B"}
1
+ {"version":3,"file":"daily.d.ts","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMrD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA8LlC,MAAM;;;;;;;;;uBAAN,MAAM;;;;;;;;;;;;;;;uBAAN,MAAM;;;;;uBAAN,MAAM;;;;;EAvK3B"}
@@ -7,8 +7,8 @@
7
7
  * @returns Soma Daily fields (without connectionId/userId)
8
8
  */
9
9
  export function transformDaily(daily) {
10
- const startMs = daily.startTimeInSeconds * 1000;
11
- const endMs = startMs + daily.durationInSeconds * 1000;
10
+ const startMs = (daily.startTimeInSeconds ?? 0) * 1000;
11
+ const endMs = startMs + (daily.durationInSeconds ?? 0) * 1000;
12
12
  return {
13
13
  metadata: {
14
14
  start_time: new Date(startMs).toISOString(),
@@ -136,7 +136,7 @@ function buildStressData(daily) {
136
136
  */
137
137
  function buildTimeOffsetSamples(startTimeInSeconds, offsets, mapValue) {
138
138
  return Object.entries(offsets).map(([offset, value]) => ({
139
- timestamp: new Date((startTimeInSeconds + parseInt(offset, 10)) * 1000).toISOString(),
139
+ timestamp: new Date(((startTimeInSeconds ?? 0) + parseInt(offset, 10)) * 1000).toISOString(),
140
140
  ...mapValue(value),
141
141
  }));
142
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"daily.js","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daily.js","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { GarminHRVSummary } from "./types.js";
2
+ export type HRVData = ReturnType<typeof transformHRV>;
3
+ /**
4
+ * Transform a Garmin HRV summary into heart rate data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param hrv - The Garmin HRV summary from the Health API
10
+ * @returns Partial Soma Daily heart_rate_data fields
11
+ */
12
+ export declare function transformHRV(hrv: GarminHRVSummary): {
13
+ calendar_date: string | undefined;
14
+ heart_rate_data: undefined;
15
+ } | {
16
+ calendar_date: string | undefined;
17
+ heart_rate_data: {
18
+ summary: {
19
+ avg_hrv_rmssd: number | undefined;
20
+ max_hrv_rmssd: number | undefined;
21
+ } | undefined;
22
+ detailed: {
23
+ hrv_samples_rmssd: {
24
+ timestamp: string;
25
+ hrv_rmssd: number;
26
+ }[];
27
+ } | undefined;
28
+ };
29
+ };
30
+ //# sourceMappingURL=hrv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hrv.d.ts","sourceRoot":"","sources":["../../src/garmin/hrv.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB;;;;;;;;;;;;;;;;;EAwCjD"}
@@ -0,0 +1,45 @@
1
+ // ─── HRV Transformer ─────────────────────────────────────────────────────────
2
+ // Transforms Garmin HRV summary data into fields that enrich a Soma Daily record.
3
+ /**
4
+ * Transform a Garmin HRV summary into heart rate data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param hrv - The Garmin HRV summary from the Health API
10
+ * @returns Partial Soma Daily heart_rate_data fields
11
+ */
12
+ export function transformHRV(hrv) {
13
+ const startMs = (hrv.startTimeInSeconds ?? 0) * 1000;
14
+ const endMs = startMs + (hrv.durationInSeconds ?? 0) * 1000;
15
+ const hasSummary = hrv.lastNightAvg != null || hrv.lastNight5MinHigh != null;
16
+ const hasSamples = hrv.hrvValues != null && Object.keys(hrv.hrvValues).length > 0;
17
+ if (!hasSummary && !hasSamples) {
18
+ return {
19
+ calendar_date: hrv.calendarDate,
20
+ heart_rate_data: undefined,
21
+ };
22
+ }
23
+ const startTime = hrv.startTimeInSeconds ?? 0;
24
+ const hrvSamples = hasSamples
25
+ ? Object.entries(hrv.hrvValues).map(([offset, rmssd]) => ({
26
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
27
+ hrv_rmssd: rmssd,
28
+ }))
29
+ : undefined;
30
+ return {
31
+ calendar_date: hrv.calendarDate,
32
+ heart_rate_data: {
33
+ summary: hasSummary
34
+ ? {
35
+ avg_hrv_rmssd: hrv.lastNightAvg,
36
+ max_hrv_rmssd: hrv.lastNight5MinHigh,
37
+ }
38
+ : undefined,
39
+ detailed: hrvSamples && hrvSamples.length > 0
40
+ ? { hrv_samples_rmssd: hrvSamples }
41
+ : undefined,
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=hrv.js.map