@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
@@ -0,0 +1,76 @@
1
+ // ─── Epochs Transformer ──────────────────────────────────────────────────────
2
+ // Transforms a Garmin epoch summary push item into the Soma Daily schema shape.
3
+ // Epoch summaries are 15-minute wellness monitoring records with per-activity-type
4
+ // granularity (steps, distance, calories, MET). They are ingested into the daily
5
+ // table just like daily summaries.
6
+ /**
7
+ * Transform a Garmin epoch summary push item into a Soma Daily document shape.
8
+ *
9
+ * Epoch summaries represent 15-minute time slices of wellness monitoring data.
10
+ * They are ingested into the `daily` table via `ingestDaily`,
11
+ * keyed by `metadata.start_time + metadata.end_time`.
12
+ *
13
+ * Returns `null` when no meaningful data is present.
14
+ */
15
+ export function transformEpoch(epoch) {
16
+ const startMs = (epoch.startTimeInSeconds ?? 0) * 1000;
17
+ const endMs = startMs + (epoch.durationInSeconds ?? 0) * 1000;
18
+ const activeDurations = buildActiveDurationsData(epoch);
19
+ const calories = buildCaloriesData(epoch);
20
+ const distance = buildDistanceData(epoch);
21
+ const met = buildMETData(epoch);
22
+ // Skip if there's no meaningful data at all
23
+ if (activeDurations == null &&
24
+ calories == null &&
25
+ distance == null &&
26
+ met == null) {
27
+ return null;
28
+ }
29
+ return {
30
+ metadata: {
31
+ start_time: new Date(startMs).toISOString(),
32
+ end_time: new Date(endMs).toISOString(),
33
+ upload_type: 1, // Automatic
34
+ },
35
+ active_durations_data: activeDurations,
36
+ calories_data: calories,
37
+ distance_data: distance,
38
+ MET_data: met,
39
+ };
40
+ }
41
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
42
+ function buildActiveDurationsData(epoch) {
43
+ if (epoch.activeTimeInSeconds == null) {
44
+ return undefined;
45
+ }
46
+ return {
47
+ activity_seconds: epoch.activeTimeInSeconds,
48
+ };
49
+ }
50
+ function buildCaloriesData(epoch) {
51
+ if (epoch.activeKilocalories == null) {
52
+ return undefined;
53
+ }
54
+ return {
55
+ net_activity_calories: epoch.activeKilocalories,
56
+ total_burned_calories: epoch.activeKilocalories,
57
+ };
58
+ }
59
+ function buildDistanceData(epoch) {
60
+ if (epoch.distanceInMeters == null && epoch.steps == null) {
61
+ return undefined;
62
+ }
63
+ return {
64
+ distance_meters: epoch.distanceInMeters,
65
+ steps: epoch.steps,
66
+ };
67
+ }
68
+ function buildMETData(epoch) {
69
+ if (epoch.met == null) {
70
+ return undefined;
71
+ }
72
+ return {
73
+ avg_level: epoch.met,
74
+ };
75
+ }
76
+ //# sourceMappingURL=epochs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epochs.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/epochs.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,mFAAmF;AACnF,iFAAiF;AACjF,mCAAmC;AAKnC;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAE9D,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEhC,4CAA4C;IAC5C,IACE,eAAe,IAAI,IAAI;QACvB,QAAQ,IAAI,IAAI;QAChB,QAAQ,IAAI,IAAI;QAChB,GAAG,IAAI,IAAI,EACX,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAC3C,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,CAAC,EAAE,YAAY;SAC7B;QAED,qBAAqB,EAAE,eAAe;QACtC,aAAa,EAAE,QAAQ;QACvB,aAAa,EAAE,QAAQ;QACvB,QAAQ,EAAE,GAAG;KACd,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,wBAAwB,CAAC,KAAkB;IAClD,IAAI,KAAK,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,mBAAmB;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB;IAC3C,IAAI,KAAK,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,qBAAqB,EAAE,KAAK,CAAC,kBAAkB;QAC/C,qBAAqB,EAAE,KAAK,CAAC,kBAAkB;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB;IAC3C,IAAI,KAAK,CAAC,gBAAgB,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,eAAe,EAAE,KAAK,CAAC,gBAAgB;QACvC,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,GAAG;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SomaDaily } from "../../validators/daily.js";
2
+ import type { GarminHealthSnapshot } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin Health Snapshot push item into a Soma Daily document shape.
5
+ *
6
+ * Health Snapshot summaries contain epoch-level readings for heart rate, stress,
7
+ * SpO2, respiration, and HRV over a ~2-minute window.
8
+ *
9
+ * Returns `null` when no meaningful data is present.
10
+ */
11
+ export declare function transformHealthSnapshot(snapshot: GarminHealthSnapshot): SomaDaily | null;
12
+ //# sourceMappingURL=healthSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthSnapshot.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/healthSnapshot.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,oBAAoB,GAC7B,SAAS,GAAG,IAAI,CAkClB"}
@@ -0,0 +1,111 @@
1
+ // ─── Health Snapshot Transformer ─────────────────────────────────────────────
2
+ // Transforms a Garmin Health Snapshot push item into the Soma Daily schema shape.
3
+ //
4
+ // Health Snapshots are 2-minute sessions containing heart rate, stress, SpO2,
5
+ // respiration, and HRV data. We map these into the Daily model since the data
6
+ // types (HR, stress, oxygen, respiration) align with Daily's sub-fields.
7
+ /**
8
+ * Transform a Garmin Health Snapshot push item into a Soma Daily document shape.
9
+ *
10
+ * Health Snapshot summaries contain epoch-level readings for heart rate, stress,
11
+ * SpO2, respiration, and HRV over a ~2-minute window.
12
+ *
13
+ * Returns `null` when no meaningful data is present.
14
+ */
15
+ export function transformHealthSnapshot(snapshot) {
16
+ const startMs = (snapshot.startTimeInSeconds ?? 0) * 1000;
17
+ const endMs = startMs + (snapshot.durationInSeconds ?? 0) * 1000;
18
+ const summaries = snapshot.summaries;
19
+ if (!summaries || summaries.length === 0)
20
+ return null;
21
+ const heartRate = buildHeartRateData(snapshot);
22
+ const stress = buildStressData(snapshot);
23
+ const oxygen = buildOxygenData(snapshot);
24
+ const respiration = buildRespirationData(snapshot);
25
+ // Skip if there's no meaningful data at all
26
+ if (heartRate == null &&
27
+ stress == null &&
28
+ oxygen == null &&
29
+ respiration == null) {
30
+ return null;
31
+ }
32
+ return {
33
+ metadata: {
34
+ start_time: new Date(startMs).toISOString(),
35
+ end_time: new Date(endMs).toISOString(),
36
+ upload_type: 1, // Automatic
37
+ },
38
+ heart_rate_data: heartRate,
39
+ stress_data: stress,
40
+ oxygen_data: oxygen,
41
+ respiration_data: respiration,
42
+ };
43
+ }
44
+ function findSummary(snapshot, type) {
45
+ return snapshot.summaries?.find((s) => s.summaryType === type);
46
+ }
47
+ function buildHeartRateData(snapshot) {
48
+ const hr = findSummary(snapshot, "heart_rate");
49
+ const rmssd = findSummary(snapshot, "rmssd_hrv");
50
+ const sdrr = findSummary(snapshot, "sdrr_hrv");
51
+ if (!hr && !rmssd && !sdrr)
52
+ return undefined;
53
+ const hasSummary = hr?.avgValue != null || hr?.maxValue != null || hr?.minValue != null;
54
+ const hasHrvSummary = rmssd?.avgValue != null || sdrr?.avgValue != null;
55
+ const hrSamples = hr?.epochSummaries && Object.keys(hr.epochSummaries).length > 0
56
+ ? buildEpochSamples(snapshot.startTimeInSeconds, hr.epochSummaries, (bpm) => ({ bpm }))
57
+ : undefined;
58
+ return {
59
+ summary: hasSummary || hasHrvSummary
60
+ ? {
61
+ avg_hr_bpm: hr?.avgValue,
62
+ max_hr_bpm: hr?.maxValue,
63
+ min_hr_bpm: hr?.minValue,
64
+ avg_hrv_rmssd: rmssd?.avgValue,
65
+ avg_hrv_sdnn: sdrr?.avgValue,
66
+ }
67
+ : undefined,
68
+ detailed: hrSamples && hrSamples.length > 0
69
+ ? { hr_samples: hrSamples }
70
+ : undefined,
71
+ };
72
+ }
73
+ function buildStressData(snapshot) {
74
+ const stress = findSummary(snapshot, "stress");
75
+ if (!stress)
76
+ return undefined;
77
+ return {
78
+ avg_stress_level: stress.avgValue,
79
+ max_stress_level: stress.maxValue,
80
+ };
81
+ }
82
+ function buildOxygenData(snapshot) {
83
+ const spo2 = findSummary(snapshot, "spo2");
84
+ if (!spo2)
85
+ return undefined;
86
+ return {
87
+ avg_saturation_percentage: spo2.avgValue,
88
+ };
89
+ }
90
+ function buildRespirationData(snapshot) {
91
+ const resp = findSummary(snapshot, "respiration");
92
+ if (!resp)
93
+ return undefined;
94
+ return {
95
+ breaths_data: {
96
+ avg_breaths_per_min: resp.avgValue,
97
+ max_breaths_per_min: resp.maxValue,
98
+ min_breaths_per_min: resp.minValue,
99
+ },
100
+ };
101
+ }
102
+ /**
103
+ * Convert Garmin epoch-keyed summaries into timestamped samples.
104
+ */
105
+ function buildEpochSamples(startTimeInSeconds, epochs, mapValue) {
106
+ return Object.entries(epochs).map(([offset, value]) => ({
107
+ timestamp: new Date(((startTimeInSeconds ?? 0) + parseInt(offset, 10)) * 1000).toISOString(),
108
+ ...mapValue(value),
109
+ }));
110
+ }
111
+ //# sourceMappingURL=healthSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthSnapshot.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/healthSnapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SomaDaily } from "../../validators/daily.js";
2
+ import type { GarminHRVSummary } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin HRV summary push item into a partial Soma Daily shape.
5
+ *
6
+ * HRV summaries are ingested into the `daily` table via `ingestDaily`,
7
+ * enriching the daily record with HRV-specific heart rate data.
8
+ *
9
+ * Returns `null` when no meaningful HRV data is present.
10
+ */
11
+ export declare function transformHRVSummary(hrv: GarminHRVSummary): SomaDaily | null;
12
+ //# sourceMappingURL=hrvSummary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hrvSummary.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/hrvSummary.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAwC3E"}
@@ -0,0 +1,45 @@
1
+ // ─── HRV Summary Transformer ─────────────────────────────────────────────────
2
+ // Transforms a Garmin HRV summary push item into a partial Soma Daily schema
3
+ // shape. HRV data enriches daily records with heart_rate_data (HRV fields).
4
+ /**
5
+ * Transform a Garmin HRV summary push item into a partial Soma Daily shape.
6
+ *
7
+ * HRV summaries are ingested into the `daily` table via `ingestDaily`,
8
+ * enriching the daily record with HRV-specific heart rate data.
9
+ *
10
+ * Returns `null` when no meaningful HRV data is present.
11
+ */
12
+ export function transformHRVSummary(hrv) {
13
+ const startMs = (hrv.startTimeInSeconds ?? 0) * 1000;
14
+ const endMs = startMs + (hrv.durationInSeconds ?? 0) * 1000;
15
+ const hasSummary = hrv.lastNightAvg != null || hrv.lastNight5MinHigh != null;
16
+ const hasSamples = hrv.hrvValues != null && Object.keys(hrv.hrvValues).length > 0;
17
+ if (!hasSummary && !hasSamples) {
18
+ return null;
19
+ }
20
+ const startTime = hrv.startTimeInSeconds ?? 0;
21
+ const hrvSamples = hasSamples
22
+ ? Object.entries(hrv.hrvValues).map(([offset, rmssd]) => ({
23
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
24
+ hrv_rmssd: rmssd,
25
+ }))
26
+ : undefined;
27
+ return {
28
+ metadata: {
29
+ start_time: new Date(startMs).toISOString(),
30
+ end_time: new Date(endMs).toISOString(),
31
+ upload_type: 1, // Automatic
32
+ },
33
+ heart_rate_data: {
34
+ summary: hasSummary
35
+ ? {
36
+ avg_hrv_rmssd: hrv.lastNightAvg,
37
+ }
38
+ : undefined,
39
+ detailed: hrvSamples && hrvSamples.length > 0
40
+ ? { hrv_samples_rmssd: hrvSamples }
41
+ : undefined,
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=hrvSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hrvSummary.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/hrvSummary.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,6EAA6E;AAC7E,4EAA4E;AAK5E;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAE5D,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,IAAI,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC;IAC7E,MAAM,UAAU,GACd,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjE,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,SAAS,EAAE,IAAI,IAAI,CACjB,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC,WAAW,EAAE;YACf,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACL,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAC3C,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,CAAC,EAAE,YAAY;SAC7B;QACD,eAAe,EAAE;YACf,OAAO,EAAE,UAAU;gBACjB,CAAC,CAAC;oBACE,aAAa,EAAE,GAAG,CAAC,YAAY;iBAChC;gBACH,CAAC,CAAC,SAAS;YACb,QAAQ,EACN,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBACjC,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE;gBACnC,CAAC,CAAC,SAAS;SAChB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SomaActivity } from "../../validators/activity.js";
2
+ import type { GarminActivity } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin manually updated activity into a Soma Activity shape.
5
+ *
6
+ * Per the Garmin API, manually updated activities always have `manual: true`.
7
+ * We enforce `upload_type: 2` regardless, since these items are by definition
8
+ * manual edits from Garmin Connect.
9
+ */
10
+ export declare function transformManuallyUpdatedActivity(activity: GarminActivity): SomaActivity;
11
+ //# sourceMappingURL=manuallyUpdatedActivities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manuallyUpdatedActivities.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/manuallyUpdatedActivities.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,cAAc,GACvB,YAAY,CAOd"}
@@ -0,0 +1,20 @@
1
+ // ─── Manually Updated Activity Transformer ───────────────────────────────────
2
+ // Transforms a Garmin manually updated activity into the Soma Activity schema.
3
+ //
4
+ // Manually updated activities share the same data model as regular activities,
5
+ // so we delegate to transformActivity but force upload_type = 2 (manual).
6
+ import { transformActivity } from "./activity.js";
7
+ /**
8
+ * Transform a Garmin manually updated activity into a Soma Activity shape.
9
+ *
10
+ * Per the Garmin API, manually updated activities always have `manual: true`.
11
+ * We enforce `upload_type: 2` regardless, since these items are by definition
12
+ * manual edits from Garmin Connect.
13
+ */
14
+ export function transformManuallyUpdatedActivity(activity) {
15
+ const result = transformActivity(activity);
16
+ // Force manual upload type — these are always user-edited on Garmin Connect
17
+ result.metadata.upload_type = 2;
18
+ return result;
19
+ }
20
+ //# sourceMappingURL=manuallyUpdatedActivities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manuallyUpdatedActivities.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/manuallyUpdatedActivities.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAI1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAAwB;IAExB,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE3C,4EAA4E;IAC5E,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { SomaMenstruation } from "../../validators/menstruation.js";
2
+ import type { GarminMenstrualCycleTracking } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin MCT push item into a Soma Menstruation document shape.
5
+ *
6
+ * MCT records are ingested into the `menstruation` table via
7
+ * `ingestMenstruation`, keyed by `metadata.start_time + metadata.end_time`.
8
+ */
9
+ export declare function transformMenstrualCycleTracking(data: GarminMenstrualCycleTracking): SomaMenstruation;
10
+ //# sourceMappingURL=menstrualCycleTracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menstrualCycleTracking.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/menstrualCycleTracking.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,4BAA4B,GAAG,gBAAgB,CA8BpG"}
@@ -0,0 +1,43 @@
1
+ // ─── Menstrual Cycle Tracking Transformer ────────────────────────────────────
2
+ // Transforms a Garmin MCT (Women's Health API) push item into the Soma
3
+ // Menstruation schema shape.
4
+ //
5
+ // MCT summaries contain cycle schedule data (phase, length, fertile window,
6
+ // pregnancy snapshot). We map these into the Menstruation model's
7
+ // menstruation_data fields.
8
+ /**
9
+ * Transform a Garmin MCT push item into a Soma Menstruation document shape.
10
+ *
11
+ * MCT records are ingested into the `menstruation` table via
12
+ * `ingestMenstruation`, keyed by `metadata.start_time + metadata.end_time`.
13
+ */
14
+ export function transformMenstrualCycleTracking(data) {
15
+ const dateStr = data.periodStartDate;
16
+ const startTime = dateStr
17
+ ? `${dateStr}T00:00:00.000Z`
18
+ : new Date(0).toISOString();
19
+ const endTime = dateStr
20
+ ? `${dateStr}T23:59:59.999Z`
21
+ : new Date(0).toISOString();
22
+ return {
23
+ metadata: {
24
+ start_time: startTime,
25
+ end_time: endTime,
26
+ },
27
+ menstruation_data: {
28
+ day_in_cycle: data.dayInCycle,
29
+ current_phase: data.currentPhaseType?.toLowerCase(),
30
+ length_of_current_phase_days: data.lengthOfCurrentPhase,
31
+ days_until_next_phase: data.daysUntilNextPhase,
32
+ period_length_days: data.periodLength,
33
+ predicted_cycle_length_days: data.predictedCycleLength,
34
+ cycle_length_days: data.cycleLength != null
35
+ ? String(data.cycleLength)
36
+ : undefined,
37
+ is_predicted_cycle: data.isPredictedCycle != null
38
+ ? String(data.isPredictedCycle)
39
+ : undefined,
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=menstrualCycleTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menstrualCycleTracking.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/menstrualCycleTracking.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,uEAAuE;AACvE,6BAA6B;AAC7B,EAAE;AACF,4EAA4E;AAC5E,kEAAkE;AAClE,4BAA4B;AAK5B;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAAkC;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO;QACvB,CAAC,CAAC,GAAG,OAAO,gBAAgB;QAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,GAAG,OAAO,gBAAgB;QAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9B,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;SAClB;QAED,iBAAiB,EAAE;YACjB,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE;YACnD,4BAA4B,EAAE,IAAI,CAAC,oBAAoB;YACvD,qBAAqB,EAAE,IAAI,CAAC,kBAAkB;YAC9C,kBAAkB,EAAE,IAAI,CAAC,YAAY;YACrC,2BAA2B,EAAE,IAAI,CAAC,oBAAoB;YACtD,iBAAiB,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;gBACzC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC1B,CAAC,CAAC,SAAS;YACb,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAC/C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC/B,CAAC,CAAC,SAAS;SACd;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { z } from "zod";
2
+ import type { zClientAutoActivityMoveIq } from "../types/zod/zod.gen.js";
3
+ import type { SomaActivity } from "../../validators/activity.js";
4
+ type GarminMoveIQEvent = z.infer<typeof zClientAutoActivityMoveIq>;
5
+ /**
6
+ * Transform a Garmin Move IQ event into a Soma Activity document shape.
7
+ *
8
+ * Move IQ activityType values are lowercase (e.g. "running", "cycling"),
9
+ * unlike regular activities which use uppercase. We normalise to uppercase
10
+ * before mapping.
11
+ *
12
+ * The returned object is ready to be spread into an `ingestActivity` call
13
+ * alongside `connectionId` and `userId`.
14
+ */
15
+ export declare function transformMoveIQ(event: GarminMoveIQEvent): SomaActivity;
16
+ export {};
17
+ //# sourceMappingURL=moveIQ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moveIQ.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/moveIQ.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,KAAK,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEnE;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CA0BtE"}
@@ -0,0 +1,41 @@
1
+ // ─── Move IQ Transformer ─────────────────────────────────────────────────────
2
+ // Transforms a Garmin Move IQ event into the Soma Activity schema shape.
3
+ //
4
+ // Move IQ events are auto-detected activities (e.g. walking, running, cycling)
5
+ // recognised by the Garmin device without user interaction. They are lightweight
6
+ // — no GPS, heart rate, or calorie data — just type, duration, and device.
7
+ import { mapActivityType } from "../../../garmin/maps/activity-type.js";
8
+ /**
9
+ * Transform a Garmin Move IQ event into a Soma Activity document shape.
10
+ *
11
+ * Move IQ activityType values are lowercase (e.g. "running", "cycling"),
12
+ * unlike regular activities which use uppercase. We normalise to uppercase
13
+ * before mapping.
14
+ *
15
+ * The returned object is ready to be spread into an `ingestActivity` call
16
+ * alongside `connectionId` and `userId`.
17
+ */
18
+ export function transformMoveIQ(event) {
19
+ const startMs = (event.startTimeInSeconds ?? 0) * 1000;
20
+ const endMs = startMs + (event.durationInSeconds ?? 0) * 1000;
21
+ const startDate = new Date(startMs).toISOString();
22
+ const endDate = new Date(endMs).toISOString();
23
+ // Move IQ activityType is lowercase; mapActivityType expects uppercase
24
+ const activityType = (event.activityType ?? "OTHER").toUpperCase();
25
+ return {
26
+ metadata: {
27
+ summary_id: event.summaryId ?? `moveiq-${event.startTimeInSeconds}`,
28
+ start_time: startDate,
29
+ end_time: endDate,
30
+ type: mapActivityType(activityType),
31
+ upload_type: 1, // device-detected
32
+ },
33
+ active_durations_data: {
34
+ activity_seconds: event.durationInSeconds,
35
+ },
36
+ device_data: event.deviceName
37
+ ? { name: event.deviceName }
38
+ : undefined,
39
+ };
40
+ }
41
+ //# sourceMappingURL=moveIQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moveIQ.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/moveIQ.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,yEAAyE;AACzE,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,2EAA2E;AAI3E,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAKxE;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9C,uEAAuE;IACvE,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAEnE,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,UAAU,KAAK,CAAC,kBAAkB,EAAE;YACnE,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,eAAe,CAAC,YAAY,CAAC;YACnC,WAAW,EAAE,CAAC,EAAE,kBAAkB;SACnC;QAED,qBAAqB,EAAE;YACrB,gBAAgB,EAAE,KAAK,CAAC,iBAAiB;SAC1C;QAED,WAAW,EAAE,KAAK,CAAC,UAAU;YAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;YAC5B,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SomaDaily } from "../../validators/daily.js";
2
+ import type { GarminPulseOx } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin Pulse Ox push item into a Soma Daily document shape.
5
+ *
6
+ * Pulse Ox summaries are ingested into the `daily` table via `ingestDaily`,
7
+ * keyed by `metadata.start_time + metadata.end_time`.
8
+ *
9
+ * Returns `null` when no meaningful data is present.
10
+ */
11
+ export declare function transformPulseOx(pulseOx: GarminPulseOx): SomaDaily | null;
12
+ //# sourceMappingURL=pulseOx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulseOx.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/pulseOx.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAoBzE"}
@@ -0,0 +1,46 @@
1
+ // ─── Pulse Ox Transformer ────────────────────────────────────────────────────
2
+ // Transforms a Garmin Pulse Ox push item into the Soma Daily schema shape.
3
+ //
4
+ // Pulse Ox summaries contain SpO2 (blood oxygen saturation) readings
5
+ // throughout the day. We map these into the Daily model's oxygen_data field.
6
+ /**
7
+ * Transform a Garmin Pulse Ox push item into a Soma Daily document shape.
8
+ *
9
+ * Pulse Ox summaries are ingested into the `daily` table via `ingestDaily`,
10
+ * keyed by `metadata.start_time + metadata.end_time`.
11
+ *
12
+ * Returns `null` when no meaningful data is present.
13
+ */
14
+ export function transformPulseOx(pulseOx) {
15
+ const startMs = (pulseOx.startTimeInSeconds ?? 0) * 1000;
16
+ const endMs = startMs + (pulseOx.durationInSeconds ?? 0) * 1000;
17
+ const oxygenData = buildOxygenData(pulseOx);
18
+ if (oxygenData == null) {
19
+ return null;
20
+ }
21
+ return {
22
+ metadata: {
23
+ start_time: new Date(startMs).toISOString(),
24
+ end_time: new Date(endMs).toISOString(),
25
+ upload_type: 1, // Automatic
26
+ },
27
+ oxygen_data: oxygenData,
28
+ };
29
+ }
30
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
31
+ function buildOxygenData(pulseOx) {
32
+ const hasSamples = pulseOx.timeOffsetSpo2Values != null &&
33
+ Object.keys(pulseOx.timeOffsetSpo2Values).length > 0;
34
+ if (!hasSamples) {
35
+ return undefined;
36
+ }
37
+ const startTime = pulseOx.startTimeInSeconds ?? 0;
38
+ const samples = Object.entries(pulseOx.timeOffsetSpo2Values).map(([offset, percentage]) => ({
39
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
40
+ percentage,
41
+ }));
42
+ return {
43
+ saturation_samples: samples.length > 0 ? samples : undefined,
44
+ };
45
+ }
46
+ //# sourceMappingURL=pulseOx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulseOx.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/pulseOx.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,2EAA2E;AAC3E,EAAE;AACF,qEAAqE;AACrE,6EAA6E;AAK7E;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACzD,MAAM,KAAK,GACT,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAEpD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAC3C,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,CAAC,EAAE,YAAY;SAC7B;QAED,WAAW,EAAE,UAAU;KACxB,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe,CAAC,OAAsB;IAC7C,MAAM,UAAU,GACd,OAAO,CAAC,oBAAoB,IAAI,IAAI;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAqB,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,SAAS,EAAE,IAAI,IAAI,CACjB,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC,WAAW,EAAE;QACf,UAAU;KACX,CAAC,CACH,CAAC;IAEF,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SomaDaily } from "../../validators/daily.js";
2
+ import type { GarminRespiration } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin Respiration push item into a Soma Daily document shape.
5
+ *
6
+ * Respiration summaries are ingested into the `daily` table via `ingestDaily`,
7
+ * keyed by `metadata.start_time + metadata.end_time`.
8
+ *
9
+ * Returns `null` when no meaningful data is present.
10
+ */
11
+ export declare function transformRespiration(resp: GarminRespiration): SomaDaily | null;
12
+ //# sourceMappingURL=respiration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respiration.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/respiration.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAoB9E"}
@@ -0,0 +1,54 @@
1
+ // ─── Respiration Transformer ─────────────────────────────────────────────────
2
+ // Transforms a Garmin Respiration push item into the Soma Daily schema shape.
3
+ //
4
+ // Respiration summaries contain breathing rate readings throughout the day.
5
+ // We map these into the Daily model's respiration_data field.
6
+ /**
7
+ * Transform a Garmin Respiration push item into a Soma Daily document shape.
8
+ *
9
+ * Respiration summaries are ingested into the `daily` table via `ingestDaily`,
10
+ * keyed by `metadata.start_time + metadata.end_time`.
11
+ *
12
+ * Returns `null` when no meaningful data is present.
13
+ */
14
+ export function transformRespiration(resp) {
15
+ const startMs = (resp.startTimeInSeconds ?? 0) * 1000;
16
+ const endMs = startMs + (resp.durationInSeconds ?? 0) * 1000;
17
+ const respirationData = buildRespirationData(resp);
18
+ if (respirationData == null) {
19
+ return null;
20
+ }
21
+ return {
22
+ metadata: {
23
+ start_time: new Date(startMs).toISOString(),
24
+ end_time: new Date(endMs).toISOString(),
25
+ upload_type: 1, // Automatic
26
+ },
27
+ respiration_data: respirationData,
28
+ };
29
+ }
30
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
31
+ function buildRespirationData(resp) {
32
+ const hasSamples = resp.timeOffsetEpochToBreaths != null &&
33
+ Object.keys(resp.timeOffsetEpochToBreaths).length > 0;
34
+ if (!hasSamples) {
35
+ return undefined;
36
+ }
37
+ const startTime = resp.startTimeInSeconds ?? 0;
38
+ const samples = Object.entries(resp.timeOffsetEpochToBreaths).map(([offset, breaths_per_min]) => ({
39
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
40
+ breaths_per_min,
41
+ }));
42
+ // Compute summary stats from samples
43
+ const values = samples.map((s) => s.breaths_per_min);
44
+ const avg = values.reduce((sum, v) => sum + v, 0) / values.length;
45
+ return {
46
+ breaths_data: {
47
+ avg_breaths_per_min: Math.round(avg * 10) / 10,
48
+ min_breaths_per_min: Math.min(...values),
49
+ max_breaths_per_min: Math.max(...values),
50
+ samples: samples.length > 0 ? samples : undefined,
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=respiration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respiration.js","sourceRoot":"","sources":["../../../../src/component/garmin/transform/respiration.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,8DAA8D;AAK9D;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,KAAK,GACT,OAAO,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAEjD,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAEnD,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAC3C,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,CAAC,EAAE,YAAY;SAC7B;QAED,gBAAgB,EAAE,eAAe;KAClC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,oBAAoB,CAAC,IAAuB;IACnD,MAAM,UAAU,GACd,IAAI,CAAC,wBAAwB,IAAI,IAAI;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAExD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAyB,CAAC,CAAC,GAAG,CAChE,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,SAAS,EAAE,IAAI,IAAI,CACjB,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC,WAAW,EAAE;QACf,eAAe;KAChB,CAAC,CACH,CAAC;IAEF,qCAAqC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAElE,OAAO;QACL,YAAY,EAAE;YACZ,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE;YAC9C,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACxC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAClD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SomaBody } from "../../validators/body.js";
2
+ import type { GarminSkinTemperature } from "../types/garmin.js";
3
+ /**
4
+ * Transform a Garmin Skin Temperature push item into a Soma Body document shape.
5
+ *
6
+ * Skin temperature records are ingested into the `body` table via `ingestBody`,
7
+ * keyed by `metadata.start_time + metadata.end_time`.
8
+ *
9
+ * Returns `null` when no meaningful temperature data is present.
10
+ */
11
+ export declare function transformSkinTemperature(skinTemp: GarminSkinTemperature): SomaBody | null;
12
+ //# sourceMappingURL=skinTemperature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skinTemperature.d.ts","sourceRoot":"","sources":["../../../../src/component/garmin/transform/skinTemperature.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,QAAQ,GAAG,IAAI,CAyBzF"}