@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
package/package.json CHANGED
@@ -1,124 +1,130 @@
1
- {
2
- "name": "@nativesquare/soma",
3
- "description": "A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.",
4
- "repository": "github:NativeSquare/soma",
5
- "homepage": "https://github.com/NativeSquare/soma#readme",
6
- "bugs": {
7
- "url": "https://github.com/NativeSquare/soma/issues"
8
- },
9
- "version": "0.7.3",
10
- "license": "Apache-2.0",
11
- "keywords": [
12
- "convex",
13
- "component"
14
- ],
15
- "type": "module",
16
- "scripts": {
17
- "dev": "run-p -r dev:*",
18
- "dev:backend": "convex dev --typecheck-components",
19
- "dev:frontend": "cd example && vite --clearScreen false",
20
- "dev:build": "chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial",
21
- "predev": "path-exists .env.local dist || (npm run build && convex dev --once)",
22
- "build": "tsc --project ./tsconfig.build.json",
23
- "build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
24
- "build:clean": "npx rimraf dist *.tsbuildinfo && npm run build:codegen",
25
- "typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
26
- "lint": "eslint .",
27
- "all": "run-p -r dev:* test:watch",
28
- "test": "vitest run --typecheck",
29
- "test:watch": "vitest --typecheck --clearScreen false",
30
- "test:debug": "vitest --inspect-brk --no-file-parallelism",
31
- "test:coverage": "vitest run --coverage --coverage.reporter=text",
32
- "preversion": "npm ci && npm run build:clean && run-p test lint typecheck",
33
- "prepublishOnly": "npm whoami || npm login",
34
- "alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
35
- "release": "npm version patch && npm publish && git push --follow-tags",
36
- "version": "vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
37
- },
38
- "files": [
39
- "dist",
40
- "src"
41
- ],
42
- "exports": {
43
- "./package.json": "./package.json",
44
- ".": {
45
- "types": "./dist/client/index.d.ts",
46
- "default": "./dist/client/index.js"
47
- },
48
- "./react": {
49
- "types": "./dist/react/index.d.ts",
50
- "default": "./dist/react/index.js"
51
- },
52
- "./healthkit": {
53
- "types": "./dist/healthkit/index.d.ts",
54
- "default": "./dist/healthkit/index.js"
55
- },
56
- "./strava": {
57
- "types": "./dist/strava/index.d.ts",
58
- "default": "./dist/strava/index.js"
59
- },
60
- "./garmin": {
61
- "types": "./dist/garmin/index.d.ts",
62
- "default": "./dist/garmin/index.js"
63
- },
64
- "./validators": {
65
- "types": "./dist/validators.d.ts",
66
- "default": "./dist/validators.js"
67
- },
68
- "./test": "./src/test.ts",
69
- "./_generated/component.js": {
70
- "types": "./dist/component/_generated/component.d.ts"
71
- },
72
- "./_generated/component": {
73
- "types": "./dist/component/_generated/component.d.ts"
74
- },
75
- "./convex.config.js": {
76
- "types": "./dist/component/convex.config.d.ts",
77
- "default": "./dist/component/convex.config.js"
78
- },
79
- "./convex.config": {
80
- "types": "./dist/component/convex.config.d.ts",
81
- "default": "./dist/component/convex.config.js"
82
- }
83
- },
84
- "peerDependencies": {
85
- "convex": "^1.31.7",
86
- "react": "^18.3.1 || ^19.0.0"
87
- },
88
- "devDependencies": {
89
- "@convex-dev/eslint-plugin": "^1.1.1",
90
- "@edge-runtime/vm": "^5.0.0",
91
- "@eslint/eslintrc": "^3.3.3",
92
- "@eslint/js": "9.39.2",
93
- "@types/node": "^24.10.11",
94
- "@types/react": "^19.2.13",
95
- "@types/react-dom": "^19.2.3",
96
- "@vitejs/plugin-react": "^5.1.3",
97
- "chokidar-cli": "3.0.0",
98
- "convex": "1.31.7",
99
- "convex-test": "0.0.41",
100
- "eslint": "9.39.2",
101
- "eslint-plugin-react": "^7.37.5",
102
- "eslint-plugin-react-hooks": "^7.0.1",
103
- "eslint-plugin-react-refresh": "^0.5.0",
104
- "globals": "^17.3.0",
105
- "npm-run-all2": "8.0.4",
106
- "path-exists-cli": "2.0.0",
107
- "pkg-pr-new": "^0.0.63",
108
- "prettier": "3.8.1",
109
- "react": "^19.2.4",
110
- "react-dom": "^19.2.4",
111
- "typescript": "5.9.3",
112
- "typescript-eslint": "8.54.0",
113
- "vite": "7.3.1",
114
- "vitest": "4.0.18"
115
- },
116
- "types": "./dist/client/index.d.ts",
117
- "module": "./dist/client/index.js",
118
- "pnpm": {
119
- "onlyBuiltDependencies": [
120
- "esbuild",
121
- "@tailwindcss/oxide"
122
- ]
123
- }
124
- }
1
+ {
2
+ "name": "@nativesquare/soma",
3
+ "description": "A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.",
4
+ "repository": "github:NativeSquare/soma",
5
+ "homepage": "https://github.com/NativeSquare/soma#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/NativeSquare/soma/issues"
8
+ },
9
+ "version": "0.9.0",
10
+ "license": "Apache-2.0",
11
+ "keywords": [
12
+ "convex",
13
+ "component"
14
+ ],
15
+ "type": "module",
16
+ "scripts": {
17
+ "dev": "run-p -r dev:*",
18
+ "dev:backend": "convex dev --typecheck-components",
19
+ "dev:frontend": "cd example && vite --clearScreen false",
20
+ "dev:build": "chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial",
21
+ "predev": "path-exists .env.local dist || (npm run build && convex dev --once)",
22
+ "build": "tsc --project ./tsconfig.build.json",
23
+ "build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
24
+ "build:clean": "npx rimraf dist *.tsbuildinfo && npm run build:codegen",
25
+ "generate:garmin": "openapi-ts",
26
+ "typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
27
+ "lint": "eslint .",
28
+ "all": "run-p -r dev:* test:watch",
29
+ "test": "vitest run --typecheck",
30
+ "test:watch": "vitest --typecheck --clearScreen false",
31
+ "test:debug": "vitest --inspect-brk --no-file-parallelism",
32
+ "test:coverage": "vitest run --coverage --coverage.reporter=text",
33
+ "webhook:push": "tsx scripts/test-garmin-webhooks.ts push",
34
+ "webhook:ping": "tsx scripts/test-garmin-webhooks.ts ping",
35
+ "webhook:backfill": "tsx scripts/test-garmin-webhooks.ts backfill",
36
+ "webhook:all": "tsx scripts/test-garmin-webhooks.ts all _",
37
+ "preversion": "npm ci && npm run build:clean && run-p test lint typecheck",
38
+ "prepublishOnly": "npm whoami || npm login",
39
+ "alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
40
+ "release": "npm version patch && npm publish && git push --follow-tags",
41
+ "version": "vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
42
+ },
43
+ "files": [
44
+ "dist",
45
+ "src"
46
+ ],
47
+ "exports": {
48
+ "./package.json": "./package.json",
49
+ ".": {
50
+ "types": "./dist/client/index.d.ts",
51
+ "default": "./dist/client/index.js"
52
+ },
53
+ "./react": {
54
+ "types": "./dist/react/index.d.ts",
55
+ "default": "./dist/react/index.js"
56
+ },
57
+ "./healthkit": {
58
+ "types": "./dist/healthkit/index.d.ts",
59
+ "default": "./dist/healthkit/index.js"
60
+ },
61
+ "./strava": {
62
+ "types": "./dist/strava/index.d.ts",
63
+ "default": "./dist/strava/index.js"
64
+ },
65
+ "./validators": {
66
+ "types": "./dist/validators.d.ts",
67
+ "default": "./dist/validators.js"
68
+ },
69
+ "./test": "./src/test.ts",
70
+ "./_generated/component.js": {
71
+ "types": "./dist/component/_generated/component.d.ts"
72
+ },
73
+ "./_generated/component": {
74
+ "types": "./dist/component/_generated/component.d.ts"
75
+ },
76
+ "./convex.config.js": {
77
+ "types": "./dist/component/convex.config.d.ts",
78
+ "default": "./dist/component/convex.config.js"
79
+ },
80
+ "./convex.config": {
81
+ "types": "./dist/component/convex.config.d.ts",
82
+ "default": "./dist/component/convex.config.js"
83
+ }
84
+ },
85
+ "peerDependencies": {
86
+ "convex": "^1.31.7",
87
+ "react": "^18.3.1 || ^19.0.0"
88
+ },
89
+ "devDependencies": {
90
+ "@convex-dev/eslint-plugin": "^1.1.1",
91
+ "@edge-runtime/vm": "^5.0.0",
92
+ "@eslint/eslintrc": "^3.3.3",
93
+ "@eslint/js": "9.39.2",
94
+ "@hey-api/openapi-ts": "^0.94.5",
95
+ "@types/node": "^24.10.11",
96
+ "@types/react": "^19.2.13",
97
+ "@types/react-dom": "^19.2.3",
98
+ "@vitejs/plugin-react": "^5.1.3",
99
+ "chokidar-cli": "3.0.0",
100
+ "convex": "1.31.7",
101
+ "convex-test": "0.0.41",
102
+ "eslint": "9.39.2",
103
+ "eslint-plugin-react": "^7.37.5",
104
+ "eslint-plugin-react-hooks": "^7.0.1",
105
+ "eslint-plugin-react-refresh": "^0.5.0",
106
+ "globals": "^17.3.0",
107
+ "npm-run-all2": "8.0.4",
108
+ "openapi-typescript": "^7.13.0",
109
+ "path-exists-cli": "2.0.0",
110
+ "pkg-pr-new": "^0.0.63",
111
+ "prettier": "3.8.1",
112
+ "react": "^19.2.4",
113
+ "react-dom": "^19.2.4",
114
+ "typescript": "5.9.3",
115
+ "typescript-eslint": "8.54.0",
116
+ "vite": "7.3.1",
117
+ "vitest": "4.0.18"
118
+ },
119
+ "types": "./dist/client/index.d.ts",
120
+ "module": "./dist/client/index.js",
121
+ "pnpm": {
122
+ "onlyBuiltDependencies": [
123
+ "esbuild",
124
+ "@tailwindcss/oxide"
125
+ ]
126
+ },
127
+ "dependencies": {
128
+ "zod": "^4.3.6"
129
+ }
130
+ }
@@ -1,6 +1,6 @@
1
1
  import type { ComponentApi } from "../component/_generated/component.js";
2
2
  import type { ActionCtx, MutationCtx, QueryCtx } from "./types.js";
3
- import { httpActionGeneric, type HttpRouter } from "convex/server";
3
+ import { httpActionGeneric, type FunctionReference, type HttpRouter } from "convex/server";
4
4
  import { buildAuthUrl } from "../strava/auth.js";
5
5
 
6
6
  export type SomaComponent = ComponentApi;
@@ -9,7 +9,8 @@ export type SomaComponent = ComponentApi;
9
9
  // Used by `registerRoutes` as defaults. Override per-provider in the opts.
10
10
 
11
11
  export const STRAVA_CALLBACK_PATH = "/api/strava/callback";
12
- export const GARMIN_CALLBACK_PATH = "/api/garmin/callback";
12
+ export const GARMIN_OAUTH_CALLBACK_PATH = "/api/garmin/callback";
13
+ export const GARMIN_WEBHOOK_BASE_PATH = "/api/garmin/webhook";
13
14
 
14
15
  /**
15
16
  * Configuration for the Strava integration.
@@ -865,7 +866,7 @@ export class Soma {
865
866
  },
866
867
  ) {
867
868
  const config = this.requireGarminConfig();
868
- return await ctx.runAction(this.component.garmin.pushPlannedWorkout, {
869
+ return await ctx.runAction(this.component.garmin.public.pushPlannedWorkout, {
869
870
  ...args,
870
871
  clientId: config.clientId,
871
872
  clientSecret: config.clientSecret,
@@ -941,7 +942,7 @@ export class Soma {
941
942
  args: { userId: string; code: string; includeStreams?: boolean },
942
943
  ) {
943
944
  const config = this.requireStravaConfig();
944
- return await ctx.runAction(this.component.strava.connectStrava, {
945
+ return await ctx.runAction(this.component.strava.public.connectStrava, {
945
946
  ...args,
946
947
  clientId: config.clientId,
947
948
  clientSecret: config.clientSecret,
@@ -976,7 +977,7 @@ export class Soma {
976
977
  args: { userId: string; includeStreams?: boolean; after?: number },
977
978
  ) {
978
979
  const config = this.requireStravaConfig();
979
- return await ctx.runAction(this.component.strava.syncStrava, {
980
+ return await ctx.runAction(this.component.strava.public.syncStrava, {
980
981
  ...args,
981
982
  clientId: config.clientId,
982
983
  clientSecret: config.clientSecret,
@@ -1008,7 +1009,7 @@ export class Soma {
1008
1009
  args: { userId: string },
1009
1010
  ) {
1010
1011
  const config = this.requireStravaConfig();
1011
- return await ctx.runAction(this.component.strava.disconnectStrava, {
1012
+ return await ctx.runAction(this.component.strava.public.disconnectStrava, {
1012
1013
  ...args,
1013
1014
  clientId: config.clientId,
1014
1015
  clientSecret: config.clientSecret,
@@ -1054,7 +1055,7 @@ export class Soma {
1054
1055
  opts: { redirectUri?: string; userId?: string },
1055
1056
  ) {
1056
1057
  const config = this.requireGarminConfig();
1057
- return await ctx.runAction(this.component.garmin.getGarminAuthUrl, {
1058
+ return await ctx.runAction(this.component.garmin.public.getGarminAuthUrl, {
1058
1059
  clientId: config.clientId,
1059
1060
  redirectUri: opts.redirectUri,
1060
1061
  userId: opts.userId,
@@ -1102,7 +1103,7 @@ export class Soma {
1102
1103
  },
1103
1104
  ) {
1104
1105
  const config = this.requireGarminConfig();
1105
- return await ctx.runAction(this.component.garmin.connectGarmin, {
1106
+ return await ctx.runAction(this.component.garmin.public.connectGarmin, {
1106
1107
  ...args,
1107
1108
  clientId: config.clientId,
1108
1109
  clientSecret: config.clientSecret,
@@ -1127,7 +1128,7 @@ export class Soma {
1127
1128
  args: { code: string; state: string; redirectUri?: string },
1128
1129
  ) {
1129
1130
  const config = this.requireGarminConfig();
1130
- return await ctx.runAction(this.component.garmin.completeGarminOAuth, {
1131
+ return await ctx.runAction(this.component.garmin.public.completeGarminOAuth, {
1131
1132
  ...args,
1132
1133
  clientId: config.clientId,
1133
1134
  clientSecret: config.clientSecret,
@@ -1166,7 +1167,7 @@ export class Soma {
1166
1167
  },
1167
1168
  ) {
1168
1169
  const config = this.requireGarminConfig();
1169
- return await ctx.runAction(this.component.garmin.syncGarmin, {
1170
+ return await ctx.runAction(this.component.garmin.public.syncGarmin, {
1170
1171
  ...args,
1171
1172
  clientId: config.clientId,
1172
1173
  clientSecret: config.clientSecret,
@@ -1196,7 +1197,7 @@ export class Soma {
1196
1197
  ctx: ActionCtx,
1197
1198
  args: { userId: string },
1198
1199
  ) {
1199
- return await ctx.runAction(this.component.garmin.disconnectGarmin, args);
1200
+ return await ctx.runAction(this.component.garmin.public.disconnectGarmin, args);
1200
1201
  }
1201
1202
  }
1202
1203
 
@@ -1259,6 +1260,11 @@ export interface StravaRouteOptions {
1259
1260
  onSuccess?: string;
1260
1261
  }
1261
1262
 
1263
+ export interface GarminWebhookRouteOptions {
1264
+ /** Base path prefix for all webhook routes. @default "/api/garmin/webhook" */
1265
+ basePath?: string;
1266
+ }
1267
+
1262
1268
  export interface GarminRouteOptions {
1263
1269
  /** HTTP path for the OAuth callback. @default "/api/garmin/callback" */
1264
1270
  path?: string;
@@ -1268,6 +1274,8 @@ export interface GarminRouteOptions {
1268
1274
  clientSecret?: string;
1269
1275
  /** URL to redirect the user to after a successful connection. */
1270
1276
  onSuccess?: string;
1277
+ /** Webhook route configuration. Set to `false` to skip webhook registration. */
1278
+ webhook?: GarminWebhookRouteOptions | false;
1271
1279
  }
1272
1280
 
1273
1281
  export interface RegisterRoutesOptions {
@@ -1343,7 +1351,7 @@ export function registerRoutes(
1343
1351
  if (!userId) {
1344
1352
  return new Response(
1345
1353
  "Missing state parameter (userId). Pass the userId as the state " +
1346
- "parameter when building the Strava auth URL.",
1354
+ "parameter when building the Strava auth URL.",
1347
1355
  { status: 400 },
1348
1356
  );
1349
1357
  }
@@ -1356,13 +1364,13 @@ export function registerRoutes(
1356
1364
  if (!clientId || !clientSecret) {
1357
1365
  return new Response(
1358
1366
  "Strava credentials not configured. Set STRAVA_CLIENT_ID and " +
1359
- "STRAVA_CLIENT_SECRET environment variables, or pass them to registerRoutes.",
1367
+ "STRAVA_CLIENT_SECRET environment variables, or pass them to registerRoutes.",
1360
1368
  { status: 500 },
1361
1369
  );
1362
1370
  }
1363
1371
 
1364
1372
  try {
1365
- await ctx.runAction(component.strava.connectStrava, {
1373
+ await ctx.runAction(component.strava.public.connectStrava, {
1366
1374
  userId,
1367
1375
  code,
1368
1376
  clientId,
@@ -1393,7 +1401,7 @@ export function registerRoutes(
1393
1401
 
1394
1402
  if (registerAll || opts?.garmin) {
1395
1403
  const garmin = opts?.garmin ?? {};
1396
- const path = garmin.path ?? GARMIN_CALLBACK_PATH;
1404
+ const path = garmin.path ?? GARMIN_OAUTH_CALLBACK_PATH;
1397
1405
 
1398
1406
  http.route({
1399
1407
  path,
@@ -1411,7 +1419,7 @@ export function registerRoutes(
1411
1419
  if (!state) {
1412
1420
  return new Response(
1413
1421
  "Missing state parameter. Ensure the state was included " +
1414
- "when building the Garmin auth URL.",
1422
+ "when building the Garmin auth URL.",
1415
1423
  { status: 400 },
1416
1424
  );
1417
1425
  }
@@ -1424,13 +1432,13 @@ export function registerRoutes(
1424
1432
  if (!clientId || !clientSecret) {
1425
1433
  return new Response(
1426
1434
  "Garmin credentials not configured. Set GARMIN_CLIENT_ID and " +
1427
- "GARMIN_CLIENT_SECRET environment variables, or pass them to registerRoutes.",
1435
+ "GARMIN_CLIENT_SECRET environment variables, or pass them to registerRoutes.",
1428
1436
  { status: 500 },
1429
1437
  );
1430
1438
  }
1431
1439
 
1432
1440
  try {
1433
- await ctx.runAction(component.garmin.completeGarminOAuth, {
1441
+ await ctx.runAction(component.garmin.public.completeGarminOAuth, {
1434
1442
  code,
1435
1443
  state,
1436
1444
  clientId,
@@ -1456,5 +1464,65 @@ export function registerRoutes(
1456
1464
  });
1457
1465
  }),
1458
1466
  });
1467
+
1468
+ // ── Garmin Webhook Routes ──────────────────────────────────
1469
+ if (garmin.webhook !== false) {
1470
+ const webhookBase =
1471
+ (garmin.webhook && garmin.webhook.basePath) ?? GARMIN_WEBHOOK_BASE_PATH;
1472
+
1473
+ const webhookRoutes: Array<{
1474
+ suffix: string;
1475
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1476
+ action: FunctionReference<"action", "internal", { payload: any }>;
1477
+ }> = [
1478
+ // ACTIVITY category
1479
+ { suffix: "/activities", action: component.garmin.webhooks.handleGarminWebhookActivities },
1480
+ { suffix: "/activity-details", action: component.garmin.webhooks.handleGarminWebhookActivityDetails },
1481
+ { suffix: "/manually-updated-activities", action: component.garmin.webhooks.handleGarminWebhookManuallyUpdatedActivities },
1482
+ { suffix: "/move-iq", action: component.garmin.webhooks.handleGarminWebhookMoveIQ },
1483
+ // HEALTH category
1484
+ { suffix: "/blood-pressures", action: component.garmin.webhooks.handleGarminWebhookBloodPressures },
1485
+ { suffix: "/body-compositions", action: component.garmin.webhooks.handleGarminWebhookBodyCompositions },
1486
+ { suffix: "/dailies", action: component.garmin.webhooks.handleGarminWebhookDailies },
1487
+ { suffix: "/epochs", action: component.garmin.webhooks.handleGarminWebhookEpochs },
1488
+ { suffix: "/health-snapshot", action: component.garmin.webhooks.handleGarminWebhookHealthSnapshot },
1489
+ { suffix: "/sleeps", action: component.garmin.webhooks.handleGarminWebhookSleeps },
1490
+ { suffix: "/hrv", action: component.garmin.webhooks.handleGarminWebhookHRVSummary },
1491
+ { suffix: "/stress", action: component.garmin.webhooks.handleGarminWebhookStress },
1492
+ { suffix: "/pulse-ox", action: component.garmin.webhooks.handleGarminWebhookPulseOx },
1493
+ { suffix: "/respiration", action: component.garmin.webhooks.handleGarminWebhookRespiration },
1494
+ { suffix: "/skin-temp", action: component.garmin.webhooks.handleGarminWebhookSkinTemp },
1495
+ { suffix: "/user-metrics", action: component.garmin.webhooks.handleGarminWebhookUserMetrics },
1496
+ // WOMEN_HEALTH category
1497
+ { suffix: "/menstrual-cycle-tracking", action: component.garmin.webhooks.handleGarminWebhookMenstrualCycleTracking },
1498
+ ];
1499
+
1500
+ for (const route of webhookRoutes) {
1501
+ http.route({
1502
+ path: `${webhookBase}${route.suffix}`,
1503
+ method: "POST",
1504
+ handler: httpActionGeneric(async (ctx, request) => {
1505
+ let payload: unknown;
1506
+ try {
1507
+ payload = await request.json();
1508
+ } catch {
1509
+ return new Response("Invalid JSON body", { status: 400 });
1510
+ }
1511
+
1512
+ try {
1513
+ await ctx.runAction(route.action, { payload });
1514
+ } catch (error) {
1515
+ // Log but return 200 to prevent Garmin from retrying
1516
+ console.error(
1517
+ `Garmin webhook error (${route.suffix}):`,
1518
+ error instanceof Error ? error.message : error,
1519
+ );
1520
+ }
1521
+
1522
+ return new Response("OK", { status: 200 });
1523
+ }),
1524
+ });
1525
+ }
1526
+ }
1459
1527
  }
1460
1528
  }
@@ -8,10 +8,56 @@
8
8
  * @module
9
9
  */
10
10
 
11
- import type * as garmin from "../garmin.js";
11
+ import type * as garmin_auth from "../garmin/auth.js";
12
+ import type * as garmin_client from "../garmin/client.js";
13
+ import type * as garmin_private from "../garmin/private.js";
14
+ import type * as garmin_public from "../garmin/public.js";
15
+ import type * as garmin_schemas_activity from "../garmin/schemas/activity.js";
16
+ import type * as garmin_schemas_activityDetails from "../garmin/schemas/activityDetails.js";
17
+ import type * as garmin_schemas_bloodPressure from "../garmin/schemas/bloodPressure.js";
18
+ import type * as garmin_schemas_bodyCompositions from "../garmin/schemas/bodyCompositions.js";
19
+ import type * as garmin_schemas_dailies from "../garmin/schemas/dailies.js";
20
+ import type * as garmin_schemas_epochs from "../garmin/schemas/epochs.js";
21
+ import type * as garmin_schemas_healthSnapshot from "../garmin/schemas/healthSnapshot.js";
22
+ import type * as garmin_schemas_hrvSummary from "../garmin/schemas/hrvSummary.js";
23
+ import type * as garmin_schemas_manuallyUpdatedActivities from "../garmin/schemas/manuallyUpdatedActivities.js";
24
+ import type * as garmin_schemas_menstrualCycleTracking from "../garmin/schemas/menstrualCycleTracking.js";
25
+ import type * as garmin_schemas_moveIQ from "../garmin/schemas/moveIQ.js";
26
+ import type * as garmin_schemas_pulseOx from "../garmin/schemas/pulseOx.js";
27
+ import type * as garmin_schemas_respiration from "../garmin/schemas/respiration.js";
28
+ import type * as garmin_schemas_skinTemperature from "../garmin/schemas/skinTemperature.js";
29
+ import type * as garmin_schemas_sleeps from "../garmin/schemas/sleeps.js";
30
+ import type * as garmin_schemas_stress from "../garmin/schemas/stress.js";
31
+ import type * as garmin_schemas_userMetrics from "../garmin/schemas/userMetrics.js";
32
+ import type * as garmin_transform_activity from "../garmin/transform/activity.js";
33
+ import type * as garmin_transform_activityDetails from "../garmin/transform/activityDetails.js";
34
+ import type * as garmin_transform_bloodPressure from "../garmin/transform/bloodPressure.js";
35
+ import type * as garmin_transform_bodyCompositions from "../garmin/transform/bodyCompositions.js";
36
+ import type * as garmin_transform_dailies from "../garmin/transform/dailies.js";
37
+ import type * as garmin_transform_epochs from "../garmin/transform/epochs.js";
38
+ import type * as garmin_transform_healthSnapshot from "../garmin/transform/healthSnapshot.js";
39
+ import type * as garmin_transform_hrvSummary from "../garmin/transform/hrvSummary.js";
40
+ import type * as garmin_transform_manuallyUpdatedActivities from "../garmin/transform/manuallyUpdatedActivities.js";
41
+ import type * as garmin_transform_maps_activityType from "../garmin/transform/maps/activityType.js";
42
+ import type * as garmin_transform_maps_sleepLevel from "../garmin/transform/maps/sleepLevel.js";
43
+ import type * as garmin_transform_menstrualCycleTracking from "../garmin/transform/menstrualCycleTracking.js";
44
+ import type * as garmin_transform_moveIQ from "../garmin/transform/moveIQ.js";
45
+ import type * as garmin_transform_plannedWorkout from "../garmin/transform/plannedWorkout.js";
46
+ import type * as garmin_transform_pulseOx from "../garmin/transform/pulseOx.js";
47
+ import type * as garmin_transform_respiration from "../garmin/transform/respiration.js";
48
+ import type * as garmin_transform_skinTemperature from "../garmin/transform/skinTemperature.js";
49
+ import type * as garmin_transform_sleeps from "../garmin/transform/sleeps.js";
50
+ import type * as garmin_transform_stress from "../garmin/transform/stress.js";
51
+ import type * as garmin_transform_userMetrics from "../garmin/transform/userMetrics.js";
52
+ import type * as garmin_types_trainingApiWorkouts_client_index from "../garmin/types/trainingApiWorkouts/client/index.js";
53
+ import type * as garmin_types_trainingApiWorkouts_index from "../garmin/types/trainingApiWorkouts/index.js";
54
+ import type * as garmin_types_wellnessApi_client_index from "../garmin/types/wellnessApi/client/index.js";
55
+ import type * as garmin_types_wellnessApi_index from "../garmin/types/wellnessApi/index.js";
56
+ import type * as garmin_webhooks from "../garmin/webhooks.js";
12
57
  import type * as private_ from "../private.js";
13
58
  import type * as public_ from "../public.js";
14
- import type * as strava from "../strava.js";
59
+ import type * as strava_private from "../strava/private.js";
60
+ import type * as strava_public from "../strava/public.js";
15
61
  import type * as validators_activity from "../validators/activity.js";
16
62
  import type * as validators_athlete from "../validators/athlete.js";
17
63
  import type * as validators_body from "../validators/body.js";
@@ -34,10 +80,56 @@ import type {
34
80
  import { anyApi, componentsGeneric } from "convex/server";
35
81
 
36
82
  const fullApi: ApiFromModules<{
37
- garmin: typeof garmin;
83
+ "garmin/auth": typeof garmin_auth;
84
+ "garmin/client": typeof garmin_client;
85
+ "garmin/private": typeof garmin_private;
86
+ "garmin/public": typeof garmin_public;
87
+ "garmin/schemas/activity": typeof garmin_schemas_activity;
88
+ "garmin/schemas/activityDetails": typeof garmin_schemas_activityDetails;
89
+ "garmin/schemas/bloodPressure": typeof garmin_schemas_bloodPressure;
90
+ "garmin/schemas/bodyCompositions": typeof garmin_schemas_bodyCompositions;
91
+ "garmin/schemas/dailies": typeof garmin_schemas_dailies;
92
+ "garmin/schemas/epochs": typeof garmin_schemas_epochs;
93
+ "garmin/schemas/healthSnapshot": typeof garmin_schemas_healthSnapshot;
94
+ "garmin/schemas/hrvSummary": typeof garmin_schemas_hrvSummary;
95
+ "garmin/schemas/manuallyUpdatedActivities": typeof garmin_schemas_manuallyUpdatedActivities;
96
+ "garmin/schemas/menstrualCycleTracking": typeof garmin_schemas_menstrualCycleTracking;
97
+ "garmin/schemas/moveIQ": typeof garmin_schemas_moveIQ;
98
+ "garmin/schemas/pulseOx": typeof garmin_schemas_pulseOx;
99
+ "garmin/schemas/respiration": typeof garmin_schemas_respiration;
100
+ "garmin/schemas/skinTemperature": typeof garmin_schemas_skinTemperature;
101
+ "garmin/schemas/sleeps": typeof garmin_schemas_sleeps;
102
+ "garmin/schemas/stress": typeof garmin_schemas_stress;
103
+ "garmin/schemas/userMetrics": typeof garmin_schemas_userMetrics;
104
+ "garmin/transform/activity": typeof garmin_transform_activity;
105
+ "garmin/transform/activityDetails": typeof garmin_transform_activityDetails;
106
+ "garmin/transform/bloodPressure": typeof garmin_transform_bloodPressure;
107
+ "garmin/transform/bodyCompositions": typeof garmin_transform_bodyCompositions;
108
+ "garmin/transform/dailies": typeof garmin_transform_dailies;
109
+ "garmin/transform/epochs": typeof garmin_transform_epochs;
110
+ "garmin/transform/healthSnapshot": typeof garmin_transform_healthSnapshot;
111
+ "garmin/transform/hrvSummary": typeof garmin_transform_hrvSummary;
112
+ "garmin/transform/manuallyUpdatedActivities": typeof garmin_transform_manuallyUpdatedActivities;
113
+ "garmin/transform/maps/activityType": typeof garmin_transform_maps_activityType;
114
+ "garmin/transform/maps/sleepLevel": typeof garmin_transform_maps_sleepLevel;
115
+ "garmin/transform/menstrualCycleTracking": typeof garmin_transform_menstrualCycleTracking;
116
+ "garmin/transform/moveIQ": typeof garmin_transform_moveIQ;
117
+ "garmin/transform/plannedWorkout": typeof garmin_transform_plannedWorkout;
118
+ "garmin/transform/pulseOx": typeof garmin_transform_pulseOx;
119
+ "garmin/transform/respiration": typeof garmin_transform_respiration;
120
+ "garmin/transform/skinTemperature": typeof garmin_transform_skinTemperature;
121
+ "garmin/transform/sleeps": typeof garmin_transform_sleeps;
122
+ "garmin/transform/stress": typeof garmin_transform_stress;
123
+ "garmin/transform/userMetrics": typeof garmin_transform_userMetrics;
124
+ "garmin/types/trainingApiWorkouts/client/index": typeof garmin_types_trainingApiWorkouts_client_index;
125
+ "garmin/types/trainingApiWorkouts/index": typeof garmin_types_trainingApiWorkouts_index;
126
+ "garmin/types/wellnessApi/client/index": typeof garmin_types_wellnessApi_client_index;
127
+ "garmin/types/wellnessApi/index": typeof garmin_types_wellnessApi_index;
128
+ "garmin/webhooks": typeof garmin_webhooks;
38
129
  private: typeof private_;
39
130
  public: typeof public_;
40
- strava: typeof strava;
131
+ "strava/private": typeof strava_private;
132
+ "strava/public": typeof strava_public;
41
133
  "validators/activity": typeof validators_activity;
42
134
  "validators/athlete": typeof validators_athlete;
43
135
  "validators/body": typeof validators_body;