@nativesquare/soma 0.7.3 → 0.9.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 (390) hide show
  1. package/dist/client/index.d.ts +17 -55
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +63 -13
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/component/_generated/api.d.ts +80 -4
  6. package/dist/component/_generated/api.d.ts.map +1 -1
  7. package/dist/component/_generated/api.js.map +1 -1
  8. package/dist/component/_generated/component.d.ts +153 -120
  9. package/dist/component/_generated/component.d.ts.map +1 -1
  10. package/dist/component/garmin/private.d.ts +475 -0
  11. package/dist/component/garmin/private.d.ts.map +1 -0
  12. package/dist/component/garmin/private.js +1614 -0
  13. package/dist/component/garmin/private.js.map +1 -0
  14. package/dist/component/{garmin.d.ts → garmin/public.d.ts} +25 -52
  15. package/dist/component/garmin/public.d.ts.map +1 -0
  16. package/dist/component/{garmin.js → garmin/public.js} +301 -215
  17. package/dist/component/garmin/public.js.map +1 -0
  18. package/dist/component/garmin/schemas/activity.d.ts +94 -0
  19. package/dist/component/garmin/schemas/activity.d.ts.map +1 -0
  20. package/dist/component/garmin/schemas/activity.js +27 -0
  21. package/dist/component/garmin/schemas/activity.js.map +1 -0
  22. package/dist/component/garmin/schemas/activityDetails.d.ts +146 -0
  23. package/dist/component/garmin/schemas/activityDetails.d.ts.map +1 -0
  24. package/dist/component/garmin/schemas/activityDetails.js +27 -0
  25. package/dist/component/garmin/schemas/activityDetails.js.map +1 -0
  26. package/dist/component/garmin/schemas/bloodPressure.d.ts +38 -0
  27. package/dist/component/garmin/schemas/bloodPressure.d.ts.map +1 -0
  28. package/dist/component/garmin/schemas/bloodPressure.js +27 -0
  29. package/dist/component/garmin/schemas/bloodPressure.js.map +1 -0
  30. package/dist/component/garmin/schemas/bodyCompositions.d.ts +42 -0
  31. package/dist/component/garmin/schemas/bodyCompositions.d.ts.map +1 -0
  32. package/dist/component/garmin/schemas/bodyCompositions.js +27 -0
  33. package/dist/component/garmin/schemas/bodyCompositions.js.map +1 -0
  34. package/dist/component/garmin/schemas/dailies.d.ts +98 -0
  35. package/dist/component/garmin/schemas/dailies.d.ts.map +1 -0
  36. package/dist/component/garmin/schemas/dailies.js +27 -0
  37. package/dist/component/garmin/schemas/dailies.js.map +1 -0
  38. package/dist/component/garmin/schemas/epochs.d.ts +54 -0
  39. package/dist/component/garmin/schemas/epochs.d.ts.map +1 -0
  40. package/dist/component/garmin/schemas/epochs.js +27 -0
  41. package/dist/component/garmin/schemas/epochs.js.map +1 -0
  42. package/dist/component/garmin/schemas/healthSnapshot.d.ts +48 -0
  43. package/dist/component/garmin/schemas/healthSnapshot.d.ts.map +1 -0
  44. package/dist/component/garmin/schemas/healthSnapshot.js +27 -0
  45. package/dist/component/garmin/schemas/healthSnapshot.js.map +1 -0
  46. package/dist/component/garmin/schemas/hrvSummary.d.ts +40 -0
  47. package/dist/component/garmin/schemas/hrvSummary.d.ts.map +1 -0
  48. package/dist/component/garmin/schemas/hrvSummary.js +27 -0
  49. package/dist/component/garmin/schemas/hrvSummary.js.map +1 -0
  50. package/dist/component/garmin/schemas/manuallyUpdatedActivities.d.ts +94 -0
  51. package/dist/component/garmin/schemas/manuallyUpdatedActivities.d.ts.map +1 -0
  52. package/dist/component/garmin/schemas/manuallyUpdatedActivities.js +27 -0
  53. package/dist/component/garmin/schemas/manuallyUpdatedActivities.js.map +1 -0
  54. package/dist/component/garmin/schemas/menstrualCycleTracking.d.ts +100 -0
  55. package/dist/component/garmin/schemas/menstrualCycleTracking.d.ts.map +1 -0
  56. package/dist/component/garmin/schemas/menstrualCycleTracking.js +28 -0
  57. package/dist/component/garmin/schemas/menstrualCycleTracking.js.map +1 -0
  58. package/dist/component/garmin/schemas/moveIQ.d.ts +40 -0
  59. package/dist/component/garmin/schemas/moveIQ.d.ts.map +1 -0
  60. package/dist/component/garmin/schemas/moveIQ.js +27 -0
  61. package/dist/component/garmin/schemas/moveIQ.js.map +1 -0
  62. package/dist/component/garmin/schemas/pulseOx.d.ts +38 -0
  63. package/dist/component/garmin/schemas/pulseOx.d.ts.map +1 -0
  64. package/dist/component/garmin/schemas/pulseOx.js +28 -0
  65. package/dist/component/garmin/schemas/pulseOx.js.map +1 -0
  66. package/dist/component/garmin/schemas/respiration.d.ts +34 -0
  67. package/dist/component/garmin/schemas/respiration.d.ts.map +1 -0
  68. package/dist/component/garmin/schemas/respiration.js +28 -0
  69. package/dist/component/garmin/schemas/respiration.js.map +1 -0
  70. package/dist/component/garmin/schemas/skinTemperature.d.ts +36 -0
  71. package/dist/component/garmin/schemas/skinTemperature.d.ts.map +1 -0
  72. package/dist/component/garmin/schemas/skinTemperature.js +28 -0
  73. package/dist/component/garmin/schemas/skinTemperature.js.map +1 -0
  74. package/dist/component/garmin/schemas/sleeps.d.ts +88 -0
  75. package/dist/component/garmin/schemas/sleeps.d.ts.map +1 -0
  76. package/dist/component/garmin/schemas/sleeps.js +27 -0
  77. package/dist/component/garmin/schemas/sleeps.js.map +1 -0
  78. package/dist/component/garmin/schemas/stress.d.ts +70 -0
  79. package/dist/component/garmin/schemas/stress.d.ts.map +1 -0
  80. package/dist/component/garmin/schemas/stress.js +28 -0
  81. package/dist/component/garmin/schemas/stress.js.map +1 -0
  82. package/dist/component/garmin/schemas/userMetrics.d.ts +36 -0
  83. package/dist/component/garmin/schemas/userMetrics.d.ts.map +1 -0
  84. package/dist/component/garmin/schemas/userMetrics.js +28 -0
  85. package/dist/component/garmin/schemas/userMetrics.js.map +1 -0
  86. package/dist/component/garmin/transform/activity.d.ts +13 -0
  87. package/dist/component/garmin/transform/activity.d.ts.map +1 -0
  88. package/dist/component/garmin/transform/activity.js +111 -0
  89. package/dist/component/garmin/transform/activity.js.map +1 -0
  90. package/dist/component/garmin/transform/activityDetails.d.ts +13 -0
  91. package/dist/component/garmin/transform/activityDetails.d.ts.map +1 -0
  92. package/dist/component/garmin/transform/activityDetails.js +173 -0
  93. package/dist/component/garmin/transform/activityDetails.js.map +1 -0
  94. package/dist/component/garmin/transform/bloodPressure.d.ts +12 -0
  95. package/dist/component/garmin/transform/bloodPressure.d.ts.map +1 -0
  96. package/dist/component/garmin/transform/bloodPressure.js +33 -0
  97. package/dist/component/garmin/transform/bloodPressure.js.map +1 -0
  98. package/dist/component/garmin/transform/bodyCompositions.d.ts +12 -0
  99. package/dist/component/garmin/transform/bodyCompositions.d.ts.map +1 -0
  100. package/dist/component/garmin/transform/bodyCompositions.js +42 -0
  101. package/dist/component/garmin/transform/bodyCompositions.js.map +1 -0
  102. package/dist/component/garmin/transform/dailies.d.ts +12 -0
  103. package/dist/component/garmin/transform/dailies.d.ts.map +1 -0
  104. package/dist/component/garmin/transform/dailies.js +132 -0
  105. package/dist/component/garmin/transform/dailies.js.map +1 -0
  106. package/dist/component/garmin/transform/epochs.d.ts +13 -0
  107. package/dist/component/garmin/transform/epochs.d.ts.map +1 -0
  108. package/dist/component/garmin/transform/epochs.js +76 -0
  109. package/dist/component/garmin/transform/epochs.js.map +1 -0
  110. package/dist/component/garmin/transform/healthSnapshot.d.ts +12 -0
  111. package/dist/component/garmin/transform/healthSnapshot.d.ts.map +1 -0
  112. package/dist/component/garmin/transform/healthSnapshot.js +111 -0
  113. package/dist/component/garmin/transform/healthSnapshot.js.map +1 -0
  114. package/dist/component/garmin/transform/hrvSummary.d.ts +12 -0
  115. package/dist/component/garmin/transform/hrvSummary.d.ts.map +1 -0
  116. package/dist/component/garmin/transform/hrvSummary.js +45 -0
  117. package/dist/component/garmin/transform/hrvSummary.js.map +1 -0
  118. package/dist/component/garmin/transform/manuallyUpdatedActivities.d.ts +11 -0
  119. package/dist/component/garmin/transform/manuallyUpdatedActivities.d.ts.map +1 -0
  120. package/dist/component/garmin/transform/manuallyUpdatedActivities.js +20 -0
  121. package/dist/component/garmin/transform/manuallyUpdatedActivities.js.map +1 -0
  122. package/dist/component/garmin/transform/menstrualCycleTracking.d.ts +10 -0
  123. package/dist/component/garmin/transform/menstrualCycleTracking.d.ts.map +1 -0
  124. package/dist/component/garmin/transform/menstrualCycleTracking.js +43 -0
  125. package/dist/component/garmin/transform/menstrualCycleTracking.js.map +1 -0
  126. package/dist/component/garmin/transform/moveIQ.d.ts +17 -0
  127. package/dist/component/garmin/transform/moveIQ.d.ts.map +1 -0
  128. package/dist/component/garmin/transform/moveIQ.js +41 -0
  129. package/dist/component/garmin/transform/moveIQ.js.map +1 -0
  130. package/dist/component/garmin/transform/pulseOx.d.ts +12 -0
  131. package/dist/component/garmin/transform/pulseOx.d.ts.map +1 -0
  132. package/dist/component/garmin/transform/pulseOx.js +46 -0
  133. package/dist/component/garmin/transform/pulseOx.js.map +1 -0
  134. package/dist/component/garmin/transform/respiration.d.ts +12 -0
  135. package/dist/component/garmin/transform/respiration.d.ts.map +1 -0
  136. package/dist/component/garmin/transform/respiration.js +54 -0
  137. package/dist/component/garmin/transform/respiration.js.map +1 -0
  138. package/dist/component/garmin/transform/skinTemperature.d.ts +12 -0
  139. package/dist/component/garmin/transform/skinTemperature.d.ts.map +1 -0
  140. package/dist/component/garmin/transform/skinTemperature.js +38 -0
  141. package/dist/component/garmin/transform/skinTemperature.js.map +1 -0
  142. package/dist/component/garmin/transform/sleeps.d.ts +55 -0
  143. package/dist/component/garmin/transform/sleeps.d.ts.map +1 -0
  144. package/dist/component/garmin/transform/sleeps.js +120 -0
  145. package/dist/component/garmin/transform/sleeps.js.map +1 -0
  146. package/dist/component/garmin/transform/stress.d.ts +12 -0
  147. package/dist/component/garmin/transform/stress.d.ts.map +1 -0
  148. package/dist/component/garmin/transform/stress.js +56 -0
  149. package/dist/component/garmin/transform/stress.js.map +1 -0
  150. package/dist/component/garmin/transform/userMetrics.d.ts +12 -0
  151. package/dist/component/garmin/transform/userMetrics.d.ts.map +1 -0
  152. package/dist/component/garmin/transform/userMetrics.js +48 -0
  153. package/dist/component/garmin/transform/userMetrics.js.map +1 -0
  154. package/dist/component/garmin/types/garmin.d.ts +21 -0
  155. package/dist/component/garmin/types/garmin.d.ts.map +1 -0
  156. package/dist/component/garmin/types/garmin.js +6 -0
  157. package/dist/component/garmin/types/garmin.js.map +1 -0
  158. package/dist/component/garmin/types/zod/zod.gen.d.ts +1319 -0
  159. package/dist/component/garmin/types/zod/zod.gen.d.ts.map +1 -0
  160. package/dist/component/garmin/types/zod/zod.gen.js +784 -0
  161. package/dist/component/garmin/types/zod/zod.gen.js.map +1 -0
  162. package/dist/component/garmin/webhooks.d.ts +141 -0
  163. package/dist/component/garmin/webhooks.d.ts.map +1 -0
  164. package/dist/component/garmin/webhooks.js +766 -0
  165. package/dist/component/garmin/webhooks.js.map +1 -0
  166. package/dist/component/private.d.ts +20 -2
  167. package/dist/component/private.d.ts.map +1 -1
  168. package/dist/component/private.js +18 -0
  169. package/dist/component/private.js.map +1 -1
  170. package/dist/component/public.d.ts +433 -387
  171. package/dist/component/public.d.ts.map +1 -1
  172. package/dist/component/public.js +12 -2
  173. package/dist/component/public.js.map +1 -1
  174. package/dist/component/schema.d.ts +217 -162
  175. package/dist/component/schema.d.ts.map +1 -1
  176. package/dist/component/schema.js +2 -1
  177. package/dist/component/schema.js.map +1 -1
  178. package/dist/component/strava/private.d.ts +30 -0
  179. package/dist/component/strava/private.d.ts.map +1 -0
  180. package/dist/component/strava/private.js +71 -0
  181. package/dist/component/strava/private.js.map +1 -0
  182. package/dist/component/{strava.d.ts → strava/public.d.ts} +3 -31
  183. package/dist/component/strava/public.d.ts.map +1 -0
  184. package/dist/component/{strava.js → strava/public.js} +22 -101
  185. package/dist/component/strava/public.js.map +1 -0
  186. package/dist/component/validators/activity.d.ts +6 -0
  187. package/dist/component/validators/activity.d.ts.map +1 -1
  188. package/dist/component/validators/activity.js.map +1 -1
  189. package/dist/component/validators/body.d.ts +20 -14
  190. package/dist/component/validators/body.d.ts.map +1 -1
  191. package/dist/component/validators/body.js.map +1 -1
  192. package/dist/component/validators/connection.d.ts +1 -0
  193. package/dist/component/validators/connection.d.ts.map +1 -1
  194. package/dist/component/validators/connection.js +2 -0
  195. package/dist/component/validators/connection.js.map +1 -1
  196. package/dist/component/validators/daily.d.ts +46 -5
  197. package/dist/component/validators/daily.d.ts.map +1 -1
  198. package/dist/component/validators/daily.js +10 -1
  199. package/dist/component/validators/daily.js.map +1 -1
  200. package/dist/component/validators/enums.d.ts +2 -2
  201. package/dist/component/validators/menstruation.d.ts +5 -0
  202. package/dist/component/validators/menstruation.d.ts.map +1 -1
  203. package/dist/component/validators/menstruation.js.map +1 -1
  204. package/dist/component/validators/plannedWorkout.d.ts +5 -1
  205. package/dist/component/validators/plannedWorkout.d.ts.map +1 -1
  206. package/dist/component/validators/plannedWorkout.js +4 -0
  207. package/dist/component/validators/plannedWorkout.js.map +1 -1
  208. package/dist/component/validators/sleep.d.ts +8 -8
  209. package/dist/garmin/bloodPressure.d.ts +28 -0
  210. package/dist/garmin/bloodPressure.d.ts.map +1 -0
  211. package/dist/garmin/bloodPressure.js +34 -0
  212. package/dist/garmin/bloodPressure.js.map +1 -0
  213. package/dist/garmin/body.js +1 -1
  214. package/dist/garmin/body.js.map +1 -1
  215. package/dist/garmin/client.d.ts +117 -17
  216. package/dist/garmin/client.d.ts.map +1 -1
  217. package/dist/garmin/client.js +337 -43
  218. package/dist/garmin/client.js.map +1 -1
  219. package/dist/garmin/daily.d.ts.map +1 -1
  220. package/dist/garmin/daily.js +3 -3
  221. package/dist/garmin/daily.js.map +1 -1
  222. package/dist/garmin/hrv.d.ts +30 -0
  223. package/dist/garmin/hrv.d.ts.map +1 -0
  224. package/dist/garmin/hrv.js +45 -0
  225. package/dist/garmin/hrv.js.map +1 -0
  226. package/dist/garmin/index.d.ts +16 -4
  227. package/dist/garmin/index.d.ts.map +1 -1
  228. package/dist/garmin/index.js +8 -2
  229. package/dist/garmin/index.js.map +1 -1
  230. package/dist/garmin/maps/activity-type.d.ts +1 -2
  231. package/dist/garmin/maps/activity-type.d.ts.map +1 -1
  232. package/dist/garmin/maps/activity-type.js +1 -0
  233. package/dist/garmin/maps/activity-type.js.map +1 -1
  234. package/dist/garmin/menstruation.d.ts +6 -4
  235. package/dist/garmin/menstruation.d.ts.map +1 -1
  236. package/dist/garmin/menstruation.js +12 -8
  237. package/dist/garmin/menstruation.js.map +1 -1
  238. package/dist/garmin/pulseOx.d.ts +24 -0
  239. package/dist/garmin/pulseOx.d.ts.map +1 -0
  240. package/dist/garmin/pulseOx.js +33 -0
  241. package/dist/garmin/pulseOx.js.map +1 -0
  242. package/dist/garmin/respiration.d.ts +29 -0
  243. package/dist/garmin/respiration.d.ts.map +1 -0
  244. package/dist/garmin/respiration.js +42 -0
  245. package/dist/garmin/respiration.js.map +1 -0
  246. package/dist/garmin/skinTemp.d.ts +27 -0
  247. package/dist/garmin/skinTemp.d.ts.map +1 -0
  248. package/dist/garmin/skinTemp.js +35 -0
  249. package/dist/garmin/skinTemp.js.map +1 -0
  250. package/dist/garmin/sleep.d.ts +4 -4
  251. package/dist/garmin/sleep.d.ts.map +1 -1
  252. package/dist/garmin/sleep.js +15 -9
  253. package/dist/garmin/sleep.js.map +1 -1
  254. package/dist/garmin/stressDetails.d.ts +30 -0
  255. package/dist/garmin/stressDetails.d.ts.map +1 -0
  256. package/dist/garmin/stressDetails.js +49 -0
  257. package/dist/garmin/stressDetails.js.map +1 -0
  258. package/dist/garmin/sync.d.ts +14 -0
  259. package/dist/garmin/sync.d.ts.map +1 -1
  260. package/dist/garmin/sync.js +290 -7
  261. package/dist/garmin/sync.js.map +1 -1
  262. package/dist/garmin/types.d.ts +77 -186
  263. package/dist/garmin/types.d.ts.map +1 -1
  264. package/dist/garmin/types.js +4 -2
  265. package/dist/garmin/types.js.map +1 -1
  266. package/dist/garmin/userMetrics.d.ts +23 -0
  267. package/dist/garmin/userMetrics.d.ts.map +1 -0
  268. package/dist/garmin/userMetrics.js +41 -0
  269. package/dist/garmin/userMetrics.js.map +1 -0
  270. package/dist/validators.d.ts +138 -56
  271. package/dist/validators.d.ts.map +1 -1
  272. package/dist/validators.js +2 -2
  273. package/dist/validators.js.map +1 -1
  274. package/package.json +130 -124
  275. package/src/client/index.ts +86 -18
  276. package/src/component/_generated/api.ts +96 -4
  277. package/src/component/_generated/component.ts +271 -144
  278. package/src/{garmin → component/garmin}/auth.ts +8 -1
  279. package/src/component/garmin/client.ts +39 -0
  280. package/src/component/garmin/private.ts +1798 -0
  281. package/src/component/garmin/public.ts +938 -0
  282. package/src/component/garmin/schemas/activity.ts +40 -0
  283. package/src/component/garmin/schemas/activityDetails.ts +45 -0
  284. package/src/component/garmin/schemas/bloodPressure.ts +38 -0
  285. package/src/component/garmin/schemas/bodyCompositions.ts +38 -0
  286. package/src/component/garmin/schemas/dailies.ts +38 -0
  287. package/src/component/garmin/schemas/epochs.ts +38 -0
  288. package/src/component/garmin/schemas/healthSnapshot.ts +38 -0
  289. package/src/component/garmin/schemas/hrvSummary.ts +38 -0
  290. package/src/component/garmin/schemas/manuallyUpdatedActivities.ts +49 -0
  291. package/src/component/garmin/schemas/menstrualCycleTracking.ts +39 -0
  292. package/src/component/garmin/schemas/moveIQ.ts +38 -0
  293. package/src/component/garmin/schemas/pulseOx.ts +39 -0
  294. package/src/component/garmin/schemas/respiration.ts +39 -0
  295. package/src/component/garmin/schemas/skinTemperature.ts +39 -0
  296. package/src/component/garmin/schemas/sleeps.ts +38 -0
  297. package/src/component/garmin/schemas/stress.ts +43 -0
  298. package/src/component/garmin/schemas/userMetrics.ts +39 -0
  299. package/src/component/garmin/transform/activity.ts +143 -0
  300. package/src/component/garmin/transform/activityDetails.ts +236 -0
  301. package/src/component/garmin/transform/bloodPressure.ts +39 -0
  302. package/src/component/garmin/transform/bodyCompositions.ts +51 -0
  303. package/src/component/garmin/transform/dailies.ts +179 -0
  304. package/src/component/garmin/transform/epochs.ts +94 -0
  305. package/src/component/garmin/transform/healthSnapshot.ts +152 -0
  306. package/src/component/garmin/transform/hrvSummary.ts +56 -0
  307. package/src/component/garmin/transform/manuallyUpdatedActivities.ts +27 -0
  308. package/src/{garmin/maps/activity-type.ts → component/garmin/transform/maps/activityType.ts} +116 -116
  309. package/src/{garmin/maps/sleep-level.ts → component/garmin/transform/maps/sleepLevel.ts} +22 -22
  310. package/src/component/garmin/transform/menstrualCycleTracking.ts +48 -0
  311. package/src/component/garmin/transform/moveIQ.ts +48 -0
  312. package/src/{garmin → component/garmin/transform}/plannedWorkout.ts +328 -333
  313. package/src/component/garmin/transform/pulseOx.ts +64 -0
  314. package/src/component/garmin/transform/respiration.ts +73 -0
  315. package/src/component/garmin/transform/skinTemperature.ts +44 -0
  316. package/src/component/garmin/transform/sleeps.ts +159 -0
  317. package/src/component/garmin/transform/stress.ts +78 -0
  318. package/src/component/garmin/transform/userMetrics.ts +56 -0
  319. package/src/component/garmin/types/specs/training-api-workouts.json +699 -0
  320. package/src/component/garmin/types/specs/wellness-api.json +1 -0
  321. package/src/component/garmin/types/trainingApiWorkouts/client/client.gen.ts +290 -0
  322. package/src/component/garmin/types/trainingApiWorkouts/client/index.ts +25 -0
  323. package/src/component/garmin/types/trainingApiWorkouts/client/types.gen.ts +214 -0
  324. package/src/component/garmin/types/trainingApiWorkouts/client/utils.gen.ts +316 -0
  325. package/src/component/garmin/types/trainingApiWorkouts/client.gen.ts +16 -0
  326. package/src/component/garmin/types/trainingApiWorkouts/core/auth.gen.ts +41 -0
  327. package/src/component/garmin/types/trainingApiWorkouts/core/bodySerializer.gen.ts +82 -0
  328. package/src/component/garmin/types/trainingApiWorkouts/core/params.gen.ts +169 -0
  329. package/src/component/garmin/types/trainingApiWorkouts/core/pathSerializer.gen.ts +171 -0
  330. package/src/component/garmin/types/trainingApiWorkouts/core/queryKeySerializer.gen.ts +117 -0
  331. package/src/component/garmin/types/trainingApiWorkouts/core/serverSentEvents.gen.ts +243 -0
  332. package/src/component/garmin/types/trainingApiWorkouts/core/types.gen.ts +104 -0
  333. package/src/component/garmin/types/trainingApiWorkouts/core/utils.gen.ts +140 -0
  334. package/src/component/garmin/types/trainingApiWorkouts/index.ts +4 -0
  335. package/src/component/garmin/types/trainingApiWorkouts/sdk.gen.ts +126 -0
  336. package/src/component/garmin/types/trainingApiWorkouts/types.gen.ts +387 -0
  337. package/src/component/garmin/types/trainingApiWorkouts/zod.gen.ts +423 -0
  338. package/src/component/garmin/types/wellnessApi/client/client.gen.ts +290 -0
  339. package/src/component/garmin/types/wellnessApi/client/index.ts +25 -0
  340. package/src/component/garmin/types/wellnessApi/client/types.gen.ts +214 -0
  341. package/src/component/garmin/types/wellnessApi/client/utils.gen.ts +316 -0
  342. package/src/component/garmin/types/wellnessApi/client.gen.ts +16 -0
  343. package/src/component/garmin/types/wellnessApi/core/auth.gen.ts +41 -0
  344. package/src/component/garmin/types/wellnessApi/core/bodySerializer.gen.ts +82 -0
  345. package/src/component/garmin/types/wellnessApi/core/params.gen.ts +169 -0
  346. package/src/component/garmin/types/wellnessApi/core/pathSerializer.gen.ts +171 -0
  347. package/src/component/garmin/types/wellnessApi/core/queryKeySerializer.gen.ts +117 -0
  348. package/src/component/garmin/types/wellnessApi/core/serverSentEvents.gen.ts +243 -0
  349. package/src/component/garmin/types/wellnessApi/core/types.gen.ts +104 -0
  350. package/src/component/garmin/types/wellnessApi/core/utils.gen.ts +140 -0
  351. package/src/component/garmin/types/wellnessApi/index.ts +4 -0
  352. package/src/component/garmin/types/wellnessApi/sdk.gen.ts +207 -0
  353. package/src/component/garmin/types/wellnessApi/types.gen.ts +2942 -0
  354. package/src/component/garmin/types/wellnessApi/zod.gen.ts +878 -0
  355. package/src/component/garmin/utils.ts +25 -0
  356. package/src/component/garmin/webhooks.ts +852 -0
  357. package/src/component/private.ts +21 -0
  358. package/src/component/public.ts +11 -2
  359. package/src/component/schema.ts +2 -1
  360. package/src/component/strava/private.ts +89 -0
  361. package/src/component/{strava.ts → strava/public.ts} +341 -404
  362. package/src/component/validators/activity.ts +5 -0
  363. package/src/component/validators/body.ts +5 -0
  364. package/src/component/validators/connection.ts +2 -0
  365. package/src/component/validators/daily.ts +20 -0
  366. package/src/component/validators/menstruation.ts +5 -1
  367. package/src/component/validators/plannedWorkout.ts +9 -0
  368. package/src/validators.ts +12 -2
  369. package/dist/component/garmin.d.ts.map +0 -1
  370. package/dist/component/garmin.js.map +0 -1
  371. package/dist/component/strava.d.ts.map +0 -1
  372. package/dist/component/strava.js.map +0 -1
  373. package/dist/garmin/activity.d.ts +0 -101
  374. package/dist/garmin/activity.d.ts.map +0 -1
  375. package/dist/garmin/activity.js +0 -207
  376. package/dist/garmin/activity.js.map +0 -1
  377. package/src/component/garmin.ts +0 -850
  378. package/src/garmin/activity.test.ts +0 -178
  379. package/src/garmin/activity.ts +0 -272
  380. package/src/garmin/auth.test.ts +0 -103
  381. package/src/garmin/body.ts +0 -59
  382. package/src/garmin/client.ts +0 -407
  383. package/src/garmin/daily.ts +0 -211
  384. package/src/garmin/index.ts +0 -75
  385. package/src/garmin/maps/activity-type.test.ts +0 -78
  386. package/src/garmin/menstruation.ts +0 -42
  387. package/src/garmin/sleep.test.ts +0 -110
  388. package/src/garmin/sleep.ts +0 -170
  389. package/src/garmin/sync.ts +0 -223
  390. package/src/garmin/types.ts +0 -480
@@ -1,407 +0,0 @@
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.
4
-
5
- import type {
6
- GarminActivity,
7
- GarminDailySummary,
8
- GarminSleep,
9
- GarminBodyComposition,
10
- GarminMenstrualCycleData,
11
- GarminWorkout,
12
- GarminWorkoutSchedule,
13
- } from "./types.js";
14
-
15
- const DEFAULT_BASE_URL = "https://apis.garmin.com";
16
-
17
- export interface GarminClientOptions {
18
- /** The user's OAuth 2.0 access token. */
19
- accessToken: string;
20
- /**
21
- * Base URL of the Garmin Health API.
22
- * @default "https://apis.garmin.com"
23
- */
24
- baseUrl?: string;
25
- }
26
-
27
- /**
28
- * A lightweight client for the Garmin Health API.
29
- *
30
- * All requests are authenticated with a Bearer token. Time-range parameters
31
- * use Unix epoch seconds for `uploadStartTimeInSeconds` and
32
- * `uploadEndTimeInSeconds`.
33
- *
34
- * @example
35
- * ```ts
36
- * const client = new GarminClient({
37
- * accessToken: "user_access_token",
38
- * });
39
- *
40
- * const dailies = await client.getDailies({
41
- * uploadStartTimeInSeconds: startEpoch,
42
- * uploadEndTimeInSeconds: endEpoch,
43
- * });
44
- * ```
45
- */
46
- export class GarminClient {
47
- private readonly accessToken: string;
48
- private readonly baseUrl: string;
49
-
50
- constructor(opts: GarminClientOptions) {
51
- this.accessToken = opts.accessToken;
52
- this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
53
- }
54
-
55
- // ─── Daily Summaries ────────────────────────────────────────────────────
56
-
57
- /**
58
- * Get daily wellness summaries.
59
- *
60
- * Garmin API: `GET /wellness-api/rest/dailies`
61
- */
62
- async getDailies(params: TimeRangeParams): Promise<GarminDailySummary[]> {
63
- return this.get<GarminDailySummary[]>(
64
- "/wellness-api/rest/dailies",
65
- timeRangeQuery(params),
66
- );
67
- }
68
-
69
- // ─── Activities ─────────────────────────────────────────────────────────
70
-
71
- /**
72
- * Get activity summaries.
73
- *
74
- * Garmin API: `GET /wellness-api/rest/activities`
75
- */
76
- async getActivities(params: TimeRangeParams): Promise<GarminActivity[]> {
77
- return this.get<GarminActivity[]>(
78
- "/wellness-api/rest/activities",
79
- timeRangeQuery(params),
80
- );
81
- }
82
-
83
- // ─── Sleep ──────────────────────────────────────────────────────────────
84
-
85
- /**
86
- * Get sleep summaries.
87
- *
88
- * Garmin API: `GET /wellness-api/rest/sleeps`
89
- */
90
- async getSleeps(params: TimeRangeParams): Promise<GarminSleep[]> {
91
- return this.get<GarminSleep[]>(
92
- "/wellness-api/rest/sleeps",
93
- timeRangeQuery(params),
94
- );
95
- }
96
-
97
- // ─── Body Composition ─────────────────────────────────────────────────
98
-
99
- /**
100
- * Get body composition summaries.
101
- *
102
- * Garmin API: `GET /wellness-api/rest/bodyComps`
103
- */
104
- async getBodyCompositions(
105
- params: TimeRangeParams,
106
- ): Promise<GarminBodyComposition[]> {
107
- return this.get<GarminBodyComposition[]>(
108
- "/wellness-api/rest/bodyComps",
109
- timeRangeQuery(params),
110
- );
111
- }
112
-
113
- // ─── Menstrual Cycle ──────────────────────────────────────────────────
114
-
115
- /**
116
- * Get menstrual cycle data.
117
- *
118
- * Garmin API: `GET /wellness-api/rest/menstrualCycleData`
119
- */
120
- async getMenstrualCycleData(
121
- params: TimeRangeParams,
122
- ): Promise<GarminMenstrualCycleData[]> {
123
- return this.get<GarminMenstrualCycleData[]>(
124
- "/wellness-api/rest/menstrualCycleData",
125
- timeRangeQuery(params),
126
- );
127
- }
128
-
129
- // ─── Backfill ─────────────────────────────────────────────────────────
130
-
131
- /**
132
- * Request historical data backfill from Garmin.
133
- *
134
- * Garmin processes backfill requests asynchronously and delivers data
135
- * via the configured webhook endpoint. Maximum range: 90 days per request.
136
- *
137
- * @param summaryType - The data type to backfill (e.g., "dailies", "activities", "sleeps", "bodyComps")
138
- * @param params - Time range for the backfill
139
- */
140
- async requestBackfill(
141
- summaryType: string,
142
- params: TimeRangeParams,
143
- ): Promise<void> {
144
- const query = timeRangeQuery(params);
145
- await this.get(
146
- `/wellness-api/rest/backfill/${summaryType}`,
147
- query,
148
- );
149
- }
150
-
151
- // ─── Training API V2 ────────────────────────────────────────────────
152
-
153
- /**
154
- * Check which permissions the user has granted.
155
- *
156
- * Garmin OAuth 2.0 PKCE spec: `GET /wellness-api/rest/user/permissions`
157
- */
158
- async getUserPermissions(): Promise<string[]> {
159
- return this.get<string[]>("/wellness-api/rest/user/permissions");
160
- }
161
-
162
- /**
163
- * Create a workout in Garmin Connect.
164
- *
165
- * Garmin API: `POST /workoutportal/workout/v2`
166
- * Note: uses a different base path than other Training API endpoints.
167
- */
168
- async createWorkout(workout: GarminWorkout): Promise<GarminWorkout> {
169
- return this.post<GarminWorkout>("/workoutportal/workout/v2", workout);
170
- }
171
-
172
- /**
173
- * Retrieve a workout by ID.
174
- *
175
- * Garmin API: `GET /training-api/workout/v2/{workoutId}`
176
- */
177
- async getWorkout(workoutId: number): Promise<GarminWorkout> {
178
- return this.get<GarminWorkout>(
179
- `/training-api/workout/v2/${workoutId}`,
180
- );
181
- }
182
-
183
- /**
184
- * Update a workout by ID.
185
- *
186
- * Garmin API: `PUT /training-api/workout/v2/{workoutId}`
187
- */
188
- async updateWorkout(
189
- workoutId: number,
190
- workout: GarminWorkout,
191
- ): Promise<GarminWorkout> {
192
- return this.put<GarminWorkout>(
193
- `/training-api/workout/v2/${workoutId}`,
194
- workout,
195
- );
196
- }
197
-
198
- /**
199
- * Delete a workout by ID.
200
- *
201
- * Garmin API: `DELETE /training-api/workout/v2/{workoutId}`
202
- */
203
- async deleteWorkout(workoutId: number): Promise<void> {
204
- await this.del(`/training-api/workout/v2/${workoutId}`);
205
- }
206
-
207
- /**
208
- * Schedule a workout to a specific date on the user's calendar.
209
- *
210
- * Garmin API: `POST /training-api/schedule/`
211
- */
212
- async createSchedule(
213
- workoutId: number,
214
- date: string,
215
- ): Promise<GarminWorkoutSchedule> {
216
- return this.post<GarminWorkoutSchedule>("/training-api/schedule/", {
217
- workoutId,
218
- date,
219
- });
220
- }
221
-
222
- /**
223
- * Retrieve workout schedules for a date range.
224
- *
225
- * Garmin API: `GET /training-api/schedule?startDate=...&endDate=...`
226
- */
227
- async getSchedulesByDate(
228
- startDate: string,
229
- endDate: string,
230
- ): Promise<GarminWorkoutSchedule[]> {
231
- return this.get<GarminWorkoutSchedule[]>("/training-api/schedule", {
232
- startDate,
233
- endDate,
234
- });
235
- }
236
-
237
- /**
238
- * Delete a workout schedule by ID.
239
- *
240
- * Garmin API: `DELETE /training-api/schedule/{scheduleId}`
241
- */
242
- async deleteSchedule(scheduleId: number): Promise<void> {
243
- await this.del(`/training-api/schedule/${scheduleId}`);
244
- }
245
-
246
- // ─── User Deregistration ──────────────────────────────────────────────
247
-
248
- /**
249
- * Delete the user's registration with Garmin.
250
- *
251
- * Must be called when the user disconnects or deletes their account
252
- * to comply with Garmin's API requirements.
253
- */
254
- async deleteUserRegistration(): Promise<void> {
255
- const url = `${this.baseUrl}/wellness-api/rest/user/registration`;
256
- const response = await fetch(url, {
257
- method: "DELETE",
258
- headers: {
259
- Authorization: `Bearer ${this.accessToken}`,
260
- },
261
- });
262
-
263
- if (!response.ok) {
264
- const body = await response.text().catch(() => "");
265
- throw new GarminApiError(
266
- `Garmin API error: ${response.status} ${response.statusText}`,
267
- response.status,
268
- body,
269
- );
270
- }
271
- }
272
-
273
- // ─── Internal ─────────────────────────────────────────────────────────
274
-
275
- private async get<T>(
276
- path: string,
277
- queryParams?: Record<string, string>,
278
- ): Promise<T> {
279
- const fullUrl = `${this.baseUrl}${path}`;
280
- const qs = queryParams
281
- ? `?${new URLSearchParams(queryParams).toString()}`
282
- : "";
283
- const requestUrl = `${fullUrl}${qs}`;
284
-
285
- const response = await fetch(requestUrl, {
286
- method: "GET",
287
- headers: {
288
- Authorization: `Bearer ${this.accessToken}`,
289
- Accept: "application/json",
290
- },
291
- });
292
-
293
- if (!response.ok) {
294
- const body = await response.text().catch(() => "");
295
- throw new GarminApiError(
296
- `Garmin API error: ${response.status} ${response.statusText}`,
297
- response.status,
298
- body,
299
- );
300
- }
301
-
302
- return (await response.json()) as T;
303
- }
304
-
305
- private async post<T>(path: string, body: unknown): Promise<T> {
306
- const url = `${this.baseUrl}${path}`;
307
- const response = await fetch(url, {
308
- method: "POST",
309
- headers: {
310
- Authorization: `Bearer ${this.accessToken}`,
311
- "Content-Type": "application/json",
312
- Accept: "application/json",
313
- },
314
- body: JSON.stringify(body),
315
- });
316
-
317
- if (!response.ok) {
318
- const text = await response.text().catch(() => "");
319
- const isTrainingApi =
320
- path.includes("/workoutportal/") || path.includes("/training-api/");
321
- const hint =
322
- isTrainingApi && response.status === 401
323
- ? " — Ensure the Garmin app is registered for the Training API program " +
324
- "and the user has WORKOUT_IMPORT permission."
325
- : "";
326
- throw new GarminApiError(
327
- `Garmin API error: ${response.status} ${response.statusText}${hint}`,
328
- response.status,
329
- text,
330
- );
331
- }
332
-
333
- return (await response.json()) as T;
334
- }
335
-
336
- private async put<T>(path: string, body: unknown): Promise<T> {
337
- const url = `${this.baseUrl}${path}`;
338
- const response = await fetch(url, {
339
- method: "PUT",
340
- headers: {
341
- Authorization: `Bearer ${this.accessToken}`,
342
- "Content-Type": "application/json",
343
- Accept: "application/json",
344
- },
345
- body: JSON.stringify(body),
346
- });
347
-
348
- if (!response.ok) {
349
- const text = await response.text().catch(() => "");
350
- throw new GarminApiError(
351
- `Garmin API error: ${response.status} ${response.statusText}`,
352
- response.status,
353
- text,
354
- );
355
- }
356
-
357
- return (await response.json()) as T;
358
- }
359
-
360
- private async del(path: string): Promise<void> {
361
- const url = `${this.baseUrl}${path}`;
362
- const response = await fetch(url, {
363
- method: "DELETE",
364
- headers: {
365
- Authorization: `Bearer ${this.accessToken}`,
366
- },
367
- });
368
-
369
- if (!response.ok) {
370
- const text = await response.text().catch(() => "");
371
- throw new GarminApiError(
372
- `Garmin API error: ${response.status} ${response.statusText}`,
373
- response.status,
374
- text,
375
- );
376
- }
377
- }
378
- }
379
-
380
- // ─── Helpers ──────────────────────────────────────────────────────────────────
381
-
382
- export interface TimeRangeParams {
383
- /** Start of the time range as Unix epoch seconds. */
384
- uploadStartTimeInSeconds: number;
385
- /** End of the time range as Unix epoch seconds. */
386
- uploadEndTimeInSeconds: number;
387
- }
388
-
389
- function timeRangeQuery(params: TimeRangeParams): Record<string, string> {
390
- return {
391
- uploadStartTimeInSeconds: String(params.uploadStartTimeInSeconds),
392
- uploadEndTimeInSeconds: String(params.uploadEndTimeInSeconds),
393
- };
394
- }
395
-
396
- // ─── Error ────────────────────────────────────────────────────────────────────
397
-
398
- export class GarminApiError extends Error {
399
- constructor(
400
- message: string,
401
- public readonly status: number,
402
- public readonly body: string,
403
- ) {
404
- super(message);
405
- this.name = "GarminApiError";
406
- }
407
- }
@@ -1,211 +0,0 @@
1
- // ─── Daily Transformer ───────────────────────────────────────────────────────
2
- // Transforms a Garmin daily wellness summary into the Soma Daily schema shape.
3
-
4
- import type { GarminDailySummary } from "./types.js";
5
-
6
- export type DailyData = ReturnType<typeof transformDaily>;
7
-
8
- /**
9
- * Transform a Garmin daily summary into a Soma Daily document shape.
10
- *
11
- * @param daily - The Garmin daily summary from the Health API
12
- * @returns Soma Daily fields (without connectionId/userId)
13
- */
14
- export function transformDaily(daily: GarminDailySummary) {
15
- const startMs = daily.startTimeInSeconds * 1000;
16
- const endMs = startMs + daily.durationInSeconds * 1000;
17
-
18
- return {
19
- metadata: {
20
- start_time: new Date(startMs).toISOString(),
21
- end_time: new Date(endMs).toISOString(),
22
- upload_type: 1, // Automatic
23
- },
24
-
25
- active_durations_data: buildActiveDurationsData(daily),
26
-
27
- calories_data: buildCaloriesData(daily),
28
-
29
- distance_data: buildDistanceData(daily),
30
-
31
- heart_rate_data: buildHeartRateData(daily),
32
-
33
- oxygen_data: buildOxygenData(daily),
34
-
35
- stress_data: buildStressData(daily),
36
- };
37
- }
38
-
39
- // ─── Helpers ──────────────────────────────────────────────────────────────────
40
-
41
- function buildActiveDurationsData(daily: GarminDailySummary) {
42
- if (
43
- daily.activeTimeInSeconds == null &&
44
- daily.moderateIntensityDurationInSeconds == null &&
45
- daily.vigorousIntensityDurationInSeconds == null
46
- ) {
47
- return undefined;
48
- }
49
-
50
- return {
51
- activity_seconds: daily.activeTimeInSeconds,
52
- moderate_intensity_seconds: daily.moderateIntensityDurationInSeconds,
53
- vigorous_intensity_seconds: daily.vigorousIntensityDurationInSeconds,
54
- };
55
- }
56
-
57
- function buildCaloriesData(daily: GarminDailySummary) {
58
- if (daily.activeKilocalories == null && daily.bmrKilocalories == null) {
59
- return undefined;
60
- }
61
-
62
- const total =
63
- (daily.activeKilocalories ?? 0) + (daily.bmrKilocalories ?? 0);
64
-
65
- return {
66
- net_activity_calories: daily.activeKilocalories,
67
- BMR_calories: daily.bmrKilocalories,
68
- total_burned_calories: total || undefined,
69
- };
70
- }
71
-
72
- function buildDistanceData(daily: GarminDailySummary) {
73
- if (
74
- daily.distanceInMeters == null &&
75
- daily.steps == null &&
76
- daily.floorsClimbed == null
77
- ) {
78
- return undefined;
79
- }
80
-
81
- return {
82
- distance_meters: daily.distanceInMeters,
83
- steps: daily.steps,
84
- floors_climbed: daily.floorsClimbed,
85
- };
86
- }
87
-
88
- function buildHeartRateData(daily: GarminDailySummary) {
89
- const hasSummary =
90
- daily.averageHeartRateInBeatsPerMinute != null ||
91
- daily.maxHeartRateInBeatsPerMinute != null ||
92
- daily.restingHeartRateInBeatsPerMinute != null;
93
- const hasSamples =
94
- daily.timeOffsetHeartRateSamples != null &&
95
- Object.keys(daily.timeOffsetHeartRateSamples).length > 0;
96
-
97
- if (!hasSummary && !hasSamples) return undefined;
98
-
99
- const hrSamples = hasSamples
100
- ? buildTimeOffsetSamples(
101
- daily.startTimeInSeconds,
102
- daily.timeOffsetHeartRateSamples!,
103
- (bpm) => ({ bpm }),
104
- )
105
- : undefined;
106
-
107
- return {
108
- summary: hasSummary
109
- ? {
110
- avg_hr_bpm: daily.averageHeartRateInBeatsPerMinute,
111
- max_hr_bpm: daily.maxHeartRateInBeatsPerMinute,
112
- min_hr_bpm: daily.minHeartRateInBeatsPerMinute,
113
- resting_hr_bpm: daily.restingHeartRateInBeatsPerMinute,
114
- }
115
- : undefined,
116
- detailed:
117
- hrSamples && hrSamples.length > 0
118
- ? { hr_samples: hrSamples }
119
- : undefined,
120
- };
121
- }
122
-
123
- function buildOxygenData(daily: GarminDailySummary) {
124
- if (daily.averageSpo2Value == null && daily.timeOffsetSpo2Values == null) {
125
- return undefined;
126
- }
127
-
128
- const samples =
129
- daily.timeOffsetSpo2Values != null
130
- ? buildTimeOffsetSamples(
131
- daily.startTimeInSeconds,
132
- daily.timeOffsetSpo2Values,
133
- (pct) => ({ percentage: pct }),
134
- )
135
- : undefined;
136
-
137
- return {
138
- avg_saturation_percentage: daily.averageSpo2Value,
139
- saturation_samples:
140
- samples && samples.length > 0 ? samples : undefined,
141
- };
142
- }
143
-
144
- function buildStressData(daily: GarminDailySummary) {
145
- const hasStress =
146
- daily.averageStressLevel != null ||
147
- daily.maxStressLevel != null ||
148
- daily.stressDurationInSeconds != null;
149
- const hasStressSamples =
150
- daily.timeOffsetStressLevelValues != null &&
151
- Object.keys(daily.timeOffsetStressLevelValues).length > 0;
152
- const hasBodyBatterySamples =
153
- daily.timeOffsetBodyBatteryValues != null &&
154
- Object.keys(daily.timeOffsetBodyBatteryValues).length > 0;
155
-
156
- if (!hasStress && !hasStressSamples && !hasBodyBatterySamples) {
157
- return undefined;
158
- }
159
-
160
- const stressSamples = hasStressSamples
161
- ? buildTimeOffsetSamples(
162
- daily.startTimeInSeconds,
163
- daily.timeOffsetStressLevelValues!,
164
- (level) => ({ level }),
165
- )
166
- : undefined;
167
-
168
- const bodyBatterySamples = hasBodyBatterySamples
169
- ? buildTimeOffsetSamples(
170
- daily.startTimeInSeconds,
171
- daily.timeOffsetBodyBatteryValues!,
172
- (level) => ({ level }),
173
- )
174
- : undefined;
175
-
176
- return {
177
- avg_stress_level: daily.averageStressLevel,
178
- max_stress_level: daily.maxStressLevel,
179
- stress_duration_seconds: daily.stressDurationInSeconds,
180
- rest_stress_duration_seconds: daily.restStressDurationInSeconds,
181
- activity_stress_duration_seconds: daily.activityStressDurationInSeconds,
182
- low_stress_duration_seconds: daily.lowStressDurationInSeconds,
183
- medium_stress_duration_seconds: daily.mediumStressDurationInSeconds,
184
- high_stress_duration_seconds: daily.highStressDurationInSeconds,
185
- samples:
186
- stressSamples && stressSamples.length > 0 ? stressSamples : undefined,
187
- body_battery_samples:
188
- bodyBatterySamples && bodyBatterySamples.length > 0
189
- ? bodyBatterySamples
190
- : undefined,
191
- };
192
- }
193
-
194
- /**
195
- * Convert Garmin offset-keyed time-series data into timestamped samples.
196
- *
197
- * Garmin sends time-series as `{ [offsetSeconds]: value }` maps.
198
- * This converts to `{ timestamp: ISO-8601, ...fields }[]`.
199
- */
200
- function buildTimeOffsetSamples<T extends Record<string, unknown>>(
201
- startTimeInSeconds: number,
202
- offsets: Record<string, number>,
203
- mapValue: (value: number) => T,
204
- ): Array<{ timestamp: string } & T> {
205
- return Object.entries(offsets).map(([offset, value]) => ({
206
- timestamp: new Date(
207
- (startTimeInSeconds + parseInt(offset, 10)) * 1000,
208
- ).toISOString(),
209
- ...mapValue(value),
210
- }));
211
- }
@@ -1,75 +0,0 @@
1
- // ─── @nativesquare/soma/garmin ───────────────────────────────────────────────
2
- // Garmin Health API → Soma schema transformers, API client, OAuth 2.0 PKCE helpers, and sync.
3
- //
4
- // Uses the Web Crypto API for PKCE code challenge generation.
5
- // Compatible with both the Convex V8 runtime and Node.js environments.
6
-
7
- // ── Transformers ─────────────────────────────────────────────────────────────
8
- export { transformActivity } from "./activity.js";
9
- export type { ActivityData } from "./activity.js";
10
-
11
- export { transformDaily } from "./daily.js";
12
- export type { DailyData } from "./daily.js";
13
-
14
- export { transformSleep } from "./sleep.js";
15
- export type { SleepData } from "./sleep.js";
16
-
17
- export { transformBody } from "./body.js";
18
- export type { BodyData } from "./body.js";
19
-
20
- export { transformMenstruation } from "./menstruation.js";
21
- export type { MenstruationData } from "./menstruation.js";
22
-
23
- // ── Enum Maps ────────────────────────────────────────────────────────────────
24
- export { mapActivityType } from "./maps/activity-type.js";
25
- export { mapSleepLevel } from "./maps/sleep-level.js";
26
-
27
- // ── API Client ───────────────────────────────────────────────────────────────
28
- export { GarminClient, GarminApiError } from "./client.js";
29
- export type { GarminClientOptions, TimeRangeParams } from "./client.js";
30
-
31
- // ── OAuth 2.0 PKCE Helpers ───────────────────────────────────────────────────
32
- export {
33
- generateCodeVerifier,
34
- generateCodeChallenge,
35
- generateState,
36
- buildAuthUrl,
37
- exchangeCode,
38
- refreshToken,
39
- } from "./auth.js";
40
- export type {
41
- BuildAuthUrlOptions,
42
- ExchangeCodeOptions,
43
- RefreshTokenOptions,
44
- } from "./auth.js";
45
-
46
- // ── Sync Helpers ─────────────────────────────────────────────────────────────
47
- export {
48
- syncAll,
49
- syncActivities,
50
- syncDailies,
51
- syncSleep,
52
- syncBody,
53
- syncMenstruation,
54
- } from "./sync.js";
55
- export type {
56
- SyncOptions,
57
- SyncResult,
58
- SyncAllResult,
59
- } from "./sync.js";
60
-
61
- // ── Types ────────────────────────────────────────────────────────────────────
62
- export type {
63
- GarminActivity,
64
- GarminActivityLap,
65
- GarminActivitySample,
66
- GarminDailySummary,
67
- GarminSleep,
68
- GarminSleepLevel,
69
- GarminBodyComposition,
70
- GarminMenstrualCycleData,
71
- GarminUserProfile,
72
- GarminActivityType,
73
- GarminOAuth2TokenResponse,
74
- GarminWebhookPayload,
75
- } from "./types.js";