@nativesquare/soma 0.11.0 → 0.13.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 (60) hide show
  1. package/dist/client/garmin.d.ts +291 -0
  2. package/dist/client/garmin.d.ts.map +1 -0
  3. package/dist/client/garmin.js +493 -0
  4. package/dist/client/garmin.js.map +1 -0
  5. package/dist/client/index.d.ts +29 -394
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/index.js +30 -520
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/strava.d.ts +97 -0
  10. package/dist/client/strava.d.ts.map +1 -0
  11. package/dist/client/strava.js +160 -0
  12. package/dist/client/strava.js.map +1 -0
  13. package/dist/client/types.d.ts +238 -0
  14. package/dist/client/types.d.ts.map +1 -1
  15. package/dist/component/_generated/component.d.ts +24 -12
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/garmin/private.d.ts +53 -68
  18. package/dist/component/garmin/private.d.ts.map +1 -1
  19. package/dist/component/garmin/private.js +87 -85
  20. package/dist/component/garmin/private.js.map +1 -1
  21. package/dist/component/garmin/public.d.ts +97 -53
  22. package/dist/component/garmin/public.d.ts.map +1 -1
  23. package/dist/component/garmin/public.js +75 -148
  24. package/dist/component/garmin/public.js.map +1 -1
  25. package/dist/component/garmin/webhooks.d.ts +22 -20
  26. package/dist/component/garmin/webhooks.d.ts.map +1 -1
  27. package/dist/component/garmin/webhooks.js +115 -76
  28. package/dist/component/garmin/webhooks.js.map +1 -1
  29. package/dist/component/public.d.ts +15 -15
  30. package/dist/component/schema.d.ts +25 -25
  31. package/dist/component/strava/public.d.ts +12 -8
  32. package/dist/component/strava/public.d.ts.map +1 -1
  33. package/dist/component/strava/public.js +7 -7
  34. package/dist/component/strava/public.js.map +1 -1
  35. package/dist/component/validators/activity.d.ts +4 -4
  36. package/dist/component/validators/body.d.ts +4 -4
  37. package/dist/component/validators/daily.d.ts +4 -4
  38. package/dist/component/validators/nutrition.d.ts +3 -3
  39. package/dist/component/validators/samples.d.ts +4 -4
  40. package/dist/component/validators/shared.d.ts +13 -4
  41. package/dist/component/validators/shared.d.ts.map +1 -1
  42. package/dist/component/validators/shared.js +7 -0
  43. package/dist/component/validators/shared.js.map +1 -1
  44. package/dist/component/validators/sleep.d.ts +5 -5
  45. package/dist/validators.d.ts +41 -40
  46. package/dist/validators.d.ts.map +1 -1
  47. package/dist/validators.js +1 -0
  48. package/dist/validators.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/client/garmin.ts +692 -0
  51. package/src/client/index.ts +68 -933
  52. package/src/client/strava.ts +199 -0
  53. package/src/client/types.ts +285 -0
  54. package/src/component/_generated/component.ts +19 -32
  55. package/src/component/garmin/private.ts +1872 -1870
  56. package/src/component/garmin/public.ts +1073 -1184
  57. package/src/component/garmin/webhooks.ts +898 -857
  58. package/src/component/strava/public.ts +393 -393
  59. package/src/component/validators/shared.ts +9 -0
  60. package/src/validators.ts +1 -0
@@ -0,0 +1,493 @@
1
+ import { httpActionGeneric, } from "convex/server";
2
+ export const GARMIN_OAUTH_CALLBACK_PATH = "/api/garmin/callback";
3
+ export const GARMIN_WEBHOOK_BASE_PATH = "/api/garmin/webhook";
4
+ export class SomaGarmin {
5
+ component;
6
+ requireConfig;
7
+ constructor(component, requireConfig) {
8
+ this.component = component;
9
+ this.requireConfig = requireConfig;
10
+ }
11
+ /**
12
+ * Generate a Garmin OAuth 2.0 authorization URL with PKCE.
13
+ *
14
+ * The state and code verifier are stored inside the component automatically,
15
+ * and the callback handler registered by `registerRoutes` completes
16
+ * the flow without further host-app intervention.
17
+ *
18
+ * @param ctx - Action context from the host app
19
+ * @param opts.userId - The host app's user identifier
20
+ * @param opts.redirectUri - Optional override for the OAuth callback URL
21
+ * @returns `{ authUrl, state }`
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const { authUrl } = await soma.garmin.getAuthUrl(ctx, {
26
+ * userId: "user_123",
27
+ * redirectUri: "https://your-app.convex.site/api/garmin/callback",
28
+ * });
29
+ * // Redirect user to authUrl — the callback is handled automatically
30
+ * ```
31
+ */
32
+ async getAuthUrl(ctx, opts) {
33
+ const config = this.requireConfig();
34
+ return await ctx.runAction(this.component.garmin.public.getGarminAuthUrl, {
35
+ clientId: config.clientId,
36
+ redirectUri: opts.redirectUri,
37
+ userId: opts.userId,
38
+ });
39
+ }
40
+ /**
41
+ * Disconnect a user from Garmin.
42
+ *
43
+ * Deregisters the user at Garmin (best-effort), deletes stored tokens,
44
+ * and sets the connection to inactive.
45
+ *
46
+ * @param ctx - Action context from the host app
47
+ * @param args.userId - The host app's user identifier
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * await soma.garmin.disconnect(ctx, { userId: "user_123" });
52
+ * ```
53
+ */
54
+ async disconnect(ctx, args) {
55
+ return await ctx.runAction(this.component.garmin.public.disconnectGarmin, args);
56
+ }
57
+ /**
58
+ * Pull activity summaries from Garmin.
59
+ *
60
+ * Fetches activities, transforms them into the normalized Soma schema,
61
+ * and ingests them with automatic deduplication.
62
+ *
63
+ * @param ctx - Action context from the host app
64
+ * @param args.userId - The host app's user identifier
65
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
66
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
67
+ */
68
+ async pullActivities(ctx, args) {
69
+ const config = this.requireConfig();
70
+ return await ctx.runAction(this.component.garmin.public.pullActivities, {
71
+ ...args,
72
+ clientId: config.clientId,
73
+ clientSecret: config.clientSecret,
74
+ });
75
+ }
76
+ /**
77
+ * Pull daily wellness summaries from Garmin.
78
+ *
79
+ * @param ctx - Action context from the host app
80
+ * @param args.userId - The host app's user identifier
81
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
82
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
83
+ */
84
+ async pullDailies(ctx, args) {
85
+ const config = this.requireConfig();
86
+ return await ctx.runAction(this.component.garmin.public.pullDailies, {
87
+ ...args,
88
+ clientId: config.clientId,
89
+ clientSecret: config.clientSecret,
90
+ });
91
+ }
92
+ /**
93
+ * Pull sleep summaries from Garmin.
94
+ *
95
+ * @param ctx - Action context from the host app
96
+ * @param args.userId - The host app's user identifier
97
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
98
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
99
+ */
100
+ async pullSleep(ctx, args) {
101
+ const config = this.requireConfig();
102
+ return await ctx.runAction(this.component.garmin.public.pullSleep, {
103
+ ...args,
104
+ clientId: config.clientId,
105
+ clientSecret: config.clientSecret,
106
+ });
107
+ }
108
+ /**
109
+ * Pull body composition data from Garmin.
110
+ *
111
+ * @param ctx - Action context from the host app
112
+ * @param args.userId - The host app's user identifier
113
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
114
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
115
+ */
116
+ async pullBody(ctx, args) {
117
+ const config = this.requireConfig();
118
+ return await ctx.runAction(this.component.garmin.public.pullBody, {
119
+ ...args,
120
+ clientId: config.clientId,
121
+ clientSecret: config.clientSecret,
122
+ });
123
+ }
124
+ /**
125
+ * Pull menstrual cycle tracking data from Garmin.
126
+ *
127
+ * @param ctx - Action context from the host app
128
+ * @param args.userId - The host app's user identifier
129
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
130
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
131
+ */
132
+ async pullMenstruation(ctx, args) {
133
+ const config = this.requireConfig();
134
+ return await ctx.runAction(this.component.garmin.public.pullMenstruation, {
135
+ ...args,
136
+ clientId: config.clientId,
137
+ clientSecret: config.clientSecret,
138
+ });
139
+ }
140
+ /**
141
+ * Pull blood pressure readings from Garmin.
142
+ *
143
+ * @param ctx - Action context from the host app
144
+ * @param args.userId - The host app's user identifier
145
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
146
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
147
+ */
148
+ async pullBloodPressures(ctx, args) {
149
+ const config = this.requireConfig();
150
+ return await ctx.runAction(this.component.garmin.public.pullBloodPressures, {
151
+ ...args,
152
+ clientId: config.clientId,
153
+ clientSecret: config.clientSecret,
154
+ });
155
+ }
156
+ /**
157
+ * Pull skin temperature data from Garmin.
158
+ *
159
+ * @param ctx - Action context from the host app
160
+ * @param args.userId - The host app's user identifier
161
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
162
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
163
+ */
164
+ async pullSkinTemperature(ctx, args) {
165
+ const config = this.requireConfig();
166
+ return await ctx.runAction(this.component.garmin.public.pullSkinTemperature, {
167
+ ...args,
168
+ clientId: config.clientId,
169
+ clientSecret: config.clientSecret,
170
+ });
171
+ }
172
+ /**
173
+ * Pull user metrics (VO2 max, fitness age, etc.) from Garmin.
174
+ *
175
+ * @param ctx - Action context from the host app
176
+ * @param args.userId - The host app's user identifier
177
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
178
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
179
+ */
180
+ async pullUserMetrics(ctx, args) {
181
+ const config = this.requireConfig();
182
+ return await ctx.runAction(this.component.garmin.public.pullUserMetrics, {
183
+ ...args,
184
+ clientId: config.clientId,
185
+ clientSecret: config.clientSecret,
186
+ });
187
+ }
188
+ /**
189
+ * Pull heart rate variability (HRV) summaries from Garmin.
190
+ *
191
+ * @param ctx - Action context from the host app
192
+ * @param args.userId - The host app's user identifier
193
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
194
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
195
+ */
196
+ async pullHRV(ctx, args) {
197
+ const config = this.requireConfig();
198
+ return await ctx.runAction(this.component.garmin.public.pullHRV, {
199
+ ...args,
200
+ clientId: config.clientId,
201
+ clientSecret: config.clientSecret,
202
+ });
203
+ }
204
+ /**
205
+ * Pull stress detail data from Garmin.
206
+ *
207
+ * @param ctx - Action context from the host app
208
+ * @param args.userId - The host app's user identifier
209
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
210
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
211
+ */
212
+ async pullStressDetails(ctx, args) {
213
+ const config = this.requireConfig();
214
+ return await ctx.runAction(this.component.garmin.public.pullStressDetails, {
215
+ ...args,
216
+ clientId: config.clientId,
217
+ clientSecret: config.clientSecret,
218
+ });
219
+ }
220
+ /**
221
+ * Pull pulse oximetry (SpO2) data from Garmin.
222
+ *
223
+ * @param ctx - Action context from the host app
224
+ * @param args.userId - The host app's user identifier
225
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
226
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
227
+ */
228
+ async pullPulseOx(ctx, args) {
229
+ const config = this.requireConfig();
230
+ return await ctx.runAction(this.component.garmin.public.pullPulseOx, {
231
+ ...args,
232
+ clientId: config.clientId,
233
+ clientSecret: config.clientSecret,
234
+ });
235
+ }
236
+ /**
237
+ * Pull respiration (breathing rate) data from Garmin.
238
+ *
239
+ * @param ctx - Action context from the host app
240
+ * @param args.userId - The host app's user identifier
241
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
242
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
243
+ */
244
+ async pullRespiration(ctx, args) {
245
+ const config = this.requireConfig();
246
+ return await ctx.runAction(this.component.garmin.public.pullRespiration, {
247
+ ...args,
248
+ clientId: config.clientId,
249
+ clientSecret: config.clientSecret,
250
+ });
251
+ }
252
+ /**
253
+ * Pull all supported data types from Garmin in a single call.
254
+ *
255
+ * Equivalent to calling every individual `pull*` method. Automatically
256
+ * refreshes the access token if expired.
257
+ *
258
+ * @param ctx - Action context from the host app
259
+ * @param args.userId - The host app's user identifier
260
+ * @param args.startTimeInSeconds - Optional Unix epoch lower bound
261
+ * @param args.endTimeInSeconds - Optional Unix epoch upper bound
262
+ *
263
+ * @example
264
+ * ```ts
265
+ * await soma.garmin.pullAll(ctx, { userId: "user_123" });
266
+ * ```
267
+ */
268
+ async pullAll(ctx, args) {
269
+ const config = this.requireConfig();
270
+ return await ctx.runAction(this.component.garmin.public.pullAll, {
271
+ ...args,
272
+ clientId: config.clientId,
273
+ clientSecret: config.clientSecret,
274
+ });
275
+ }
276
+ /**
277
+ * Push a planned workout to Garmin Connect.
278
+ *
279
+ * Creates the workout on the user's Garmin account from a planned
280
+ * workout stored in Soma.
281
+ *
282
+ * @param ctx - Action context from the host app
283
+ * @param args.userId - The host app's user identifier
284
+ * @param args.plannedWorkoutId - The Soma planned workout document ID
285
+ * @param args.workoutProvider - Optional provider identifier for the workout source
286
+ */
287
+ async pushWorkout(ctx, args) {
288
+ const config = this.requireConfig();
289
+ return await ctx.runAction(this.component.garmin.public.pushWorkout, {
290
+ ...args,
291
+ clientId: config.clientId,
292
+ clientSecret: config.clientSecret,
293
+ });
294
+ }
295
+ /**
296
+ * Schedule a planned workout on the user's Garmin calendar.
297
+ *
298
+ * The workout must already exist on Garmin (via `pushWorkout`).
299
+ *
300
+ * @param ctx - Action context from the host app
301
+ * @param args.userId - The host app's user identifier
302
+ * @param args.plannedWorkoutId - The Soma planned workout document ID
303
+ * @param args.date - Optional target date (YYYY-MM-DD); defaults to the workout's planned_date
304
+ */
305
+ async pushSchedule(ctx, args) {
306
+ const config = this.requireConfig();
307
+ return await ctx.runAction(this.component.garmin.public.pushSchedule, {
308
+ ...args,
309
+ clientId: config.clientId,
310
+ clientSecret: config.clientSecret,
311
+ });
312
+ }
313
+ /**
314
+ * Delete a planned workout from Garmin Connect.
315
+ *
316
+ * Removes the workout from the user's Garmin account.
317
+ *
318
+ * @param ctx - Action context from the host app
319
+ * @param args.userId - The host app's user identifier
320
+ * @param args.plannedWorkoutId - The Soma planned workout document ID
321
+ */
322
+ async deleteWorkout(ctx, args) {
323
+ const config = this.requireConfig();
324
+ return await ctx.runAction(this.component.garmin.public.deleteWorkout, {
325
+ ...args,
326
+ clientId: config.clientId,
327
+ clientSecret: config.clientSecret,
328
+ });
329
+ }
330
+ /**
331
+ * Remove a scheduled workout from the user's Garmin calendar.
332
+ *
333
+ * Unschedules the workout without deleting the workout itself.
334
+ *
335
+ * @param ctx - Action context from the host app
336
+ * @param args.userId - The host app's user identifier
337
+ * @param args.plannedWorkoutId - The Soma planned workout document ID
338
+ */
339
+ async deleteSchedule(ctx, args) {
340
+ const config = this.requireConfig();
341
+ return await ctx.runAction(this.component.garmin.public.deleteSchedule, {
342
+ ...args,
343
+ clientId: config.clientId,
344
+ clientSecret: config.clientSecret,
345
+ });
346
+ }
347
+ static registerRoutes(http, component, opts) {
348
+ const oauth = opts?.oauth ?? {};
349
+ const path = oauth.path ?? GARMIN_OAUTH_CALLBACK_PATH;
350
+ http.route({
351
+ path,
352
+ method: "GET",
353
+ handler: httpActionGeneric(async (ctx, request) => {
354
+ const url = new URL(request.url);
355
+ const code = url.searchParams.get("code");
356
+ const state = url.searchParams.get("state");
357
+ if (!code) {
358
+ return new Response("Missing authorization code", {
359
+ status: 400,
360
+ });
361
+ }
362
+ if (!state) {
363
+ return new Response("Missing state parameter. Ensure the state was included " +
364
+ "when building the Garmin auth URL.", { status: 400 });
365
+ }
366
+ const clientId = opts?.clientId ?? process.env.GARMIN_CLIENT_ID;
367
+ const clientSecret = opts?.clientSecret ?? process.env.GARMIN_CLIENT_SECRET;
368
+ if (!clientId || !clientSecret) {
369
+ return new Response("Garmin credentials not configured. Set GARMIN_CLIENT_ID and " +
370
+ "GARMIN_CLIENT_SECRET environment variables, or pass them to registerRoutes.", { status: 500 });
371
+ }
372
+ let result;
373
+ try {
374
+ result = await ctx.runAction(component.garmin.public.completeGarminOAuth, {
375
+ code,
376
+ state,
377
+ clientId,
378
+ clientSecret,
379
+ });
380
+ }
381
+ catch (error) {
382
+ const message = error instanceof Error ? error.message : "Unknown error";
383
+ return new Response(`Garmin OAuth callback failed: ${message}`, {
384
+ status: 500,
385
+ });
386
+ }
387
+ if (oauth.onComplete) {
388
+ try {
389
+ await oauth.onComplete(ctx, {
390
+ provider: "GARMIN",
391
+ userId: result.userId,
392
+ connectionId: result.connectionId,
393
+ });
394
+ }
395
+ catch (callbackError) {
396
+ console.error("[soma] garmin oauth.onComplete callback error:", callbackError instanceof Error ? callbackError.message : callbackError);
397
+ }
398
+ }
399
+ if (oauth.redirectTo) {
400
+ return new Response(null, {
401
+ status: 302,
402
+ headers: { Location: oauth.redirectTo },
403
+ });
404
+ }
405
+ return new Response("Successfully connected to Garmin!", {
406
+ status: 200,
407
+ });
408
+ }),
409
+ });
410
+ // ── Garmin Webhook Routes ──────────────────────────────────
411
+ const webhookCfg = typeof opts?.webhook === "object" ? opts.webhook : undefined;
412
+ if (webhookCfg?.events) {
413
+ const webhookBase = webhookCfg.basePath ?? GARMIN_WEBHOOK_BASE_PATH;
414
+ const autoIngest = webhookCfg.autoIngest ?? true;
415
+ const webhookRoutes = [
416
+ // ACTIVITY category
417
+ { dataType: "activities", action: component.garmin.webhooks.handleGarminWebhookActivities },
418
+ { dataType: "activity-details", action: component.garmin.webhooks.handleGarminWebhookActivityDetails },
419
+ { dataType: "manually-updated-activities", action: component.garmin.webhooks.handleGarminWebhookManuallyUpdatedActivities },
420
+ { dataType: "move-iq", action: component.garmin.webhooks.handleGarminWebhookMoveIQ },
421
+ // HEALTH category
422
+ { dataType: "blood-pressures", action: component.garmin.webhooks.handleGarminWebhookBloodPressures },
423
+ { dataType: "body-compositions", action: component.garmin.webhooks.handleGarminWebhookBodyCompositions },
424
+ { dataType: "dailies", action: component.garmin.webhooks.handleGarminWebhookDailies },
425
+ { dataType: "epochs", action: component.garmin.webhooks.handleGarminWebhookEpochs },
426
+ { dataType: "health-snapshot", action: component.garmin.webhooks.handleGarminWebhookHealthSnapshot },
427
+ { dataType: "sleeps", action: component.garmin.webhooks.handleGarminWebhookSleeps },
428
+ { dataType: "hrv", action: component.garmin.webhooks.handleGarminWebhookHRVSummary },
429
+ { dataType: "stress", action: component.garmin.webhooks.handleGarminWebhookStress },
430
+ { dataType: "pulse-ox", action: component.garmin.webhooks.handleGarminWebhookPulseOx },
431
+ { dataType: "respiration", action: component.garmin.webhooks.handleGarminWebhookRespiration },
432
+ { dataType: "skin-temp", action: component.garmin.webhooks.handleGarminWebhookSkinTemp },
433
+ { dataType: "user-metrics", action: component.garmin.webhooks.handleGarminWebhookUserMetrics },
434
+ // WOMEN_HEALTH category
435
+ { dataType: "menstrual-cycle-tracking", action: component.garmin.webhooks.handleGarminWebhookMenstrualCycleTracking },
436
+ ];
437
+ for (const route of webhookRoutes) {
438
+ const { dataType } = route;
439
+ // Only register routes the host app explicitly opted into
440
+ if (!webhookCfg.events?.[dataType])
441
+ continue;
442
+ http.route({
443
+ path: `${webhookBase}/${dataType}`,
444
+ method: "POST",
445
+ handler: httpActionGeneric(async (ctx, request) => {
446
+ let payload;
447
+ try {
448
+ payload = await request.json();
449
+ }
450
+ catch {
451
+ return new Response("Invalid JSON body", { status: 400 });
452
+ }
453
+ let result;
454
+ try {
455
+ result = await ctx.runAction(route.action, { payload, autoIngest });
456
+ }
457
+ catch (error) {
458
+ // Log but return 200 to prevent Garmin from retrying
459
+ console.error(`Garmin webhook error (${dataType}):`, error instanceof Error ? error.message : error);
460
+ }
461
+ if (result) {
462
+ const event = {
463
+ dataType,
464
+ errors: result.errors,
465
+ rawPayload: payload,
466
+ items: result.items,
467
+ };
468
+ const specificHandler = webhookCfg.events?.[dataType];
469
+ if (typeof specificHandler === "function") {
470
+ try {
471
+ await specificHandler(ctx, event);
472
+ }
473
+ catch (callbackError) {
474
+ console.error(`[soma] garmin webhook events["${dataType}"] callback error:`, callbackError instanceof Error ? callbackError.message : callbackError);
475
+ }
476
+ }
477
+ if (webhookCfg.onEvent) {
478
+ try {
479
+ await webhookCfg.onEvent(ctx, event);
480
+ }
481
+ catch (callbackError) {
482
+ console.error(`[soma] garmin webhook onEvent callback error:`, callbackError instanceof Error ? callbackError.message : callbackError);
483
+ }
484
+ }
485
+ }
486
+ return new Response("OK", { status: 200 });
487
+ }),
488
+ });
489
+ }
490
+ }
491
+ }
492
+ }
493
+ //# sourceMappingURL=garmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garmin.js","sourceRoot":"","sources":["../../src/client/garmin.ts"],"names":[],"mappings":"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"}