@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.
- package/dist/client/index.d.ts +17 -55
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +63 -13
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +80 -4
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +153 -120
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/garmin/private.d.ts +475 -0
- package/dist/component/garmin/private.d.ts.map +1 -0
- package/dist/component/garmin/private.js +1614 -0
- package/dist/component/garmin/private.js.map +1 -0
- package/dist/component/{garmin.d.ts → garmin/public.d.ts} +25 -52
- package/dist/component/garmin/public.d.ts.map +1 -0
- package/dist/component/{garmin.js → garmin/public.js} +301 -215
- package/dist/component/garmin/public.js.map +1 -0
- package/dist/component/garmin/schemas/activity.d.ts +94 -0
- package/dist/component/garmin/schemas/activity.d.ts.map +1 -0
- package/dist/component/garmin/schemas/activity.js +27 -0
- package/dist/component/garmin/schemas/activity.js.map +1 -0
- package/dist/component/garmin/schemas/activityDetails.d.ts +146 -0
- package/dist/component/garmin/schemas/activityDetails.d.ts.map +1 -0
- package/dist/component/garmin/schemas/activityDetails.js +27 -0
- package/dist/component/garmin/schemas/activityDetails.js.map +1 -0
- package/dist/component/garmin/schemas/bloodPressure.d.ts +38 -0
- package/dist/component/garmin/schemas/bloodPressure.d.ts.map +1 -0
- package/dist/component/garmin/schemas/bloodPressure.js +27 -0
- package/dist/component/garmin/schemas/bloodPressure.js.map +1 -0
- package/dist/component/garmin/schemas/bodyCompositions.d.ts +42 -0
- package/dist/component/garmin/schemas/bodyCompositions.d.ts.map +1 -0
- package/dist/component/garmin/schemas/bodyCompositions.js +27 -0
- package/dist/component/garmin/schemas/bodyCompositions.js.map +1 -0
- package/dist/component/garmin/schemas/dailies.d.ts +98 -0
- package/dist/component/garmin/schemas/dailies.d.ts.map +1 -0
- package/dist/component/garmin/schemas/dailies.js +27 -0
- package/dist/component/garmin/schemas/dailies.js.map +1 -0
- package/dist/component/garmin/schemas/epochs.d.ts +54 -0
- package/dist/component/garmin/schemas/epochs.d.ts.map +1 -0
- package/dist/component/garmin/schemas/epochs.js +27 -0
- package/dist/component/garmin/schemas/epochs.js.map +1 -0
- package/dist/component/garmin/schemas/healthSnapshot.d.ts +48 -0
- package/dist/component/garmin/schemas/healthSnapshot.d.ts.map +1 -0
- package/dist/component/garmin/schemas/healthSnapshot.js +27 -0
- package/dist/component/garmin/schemas/healthSnapshot.js.map +1 -0
- package/dist/component/garmin/schemas/hrvSummary.d.ts +40 -0
- package/dist/component/garmin/schemas/hrvSummary.d.ts.map +1 -0
- package/dist/component/garmin/schemas/hrvSummary.js +27 -0
- package/dist/component/garmin/schemas/hrvSummary.js.map +1 -0
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.d.ts +94 -0
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.d.ts.map +1 -0
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.js +27 -0
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.js.map +1 -0
- package/dist/component/garmin/schemas/menstrualCycleTracking.d.ts +100 -0
- package/dist/component/garmin/schemas/menstrualCycleTracking.d.ts.map +1 -0
- package/dist/component/garmin/schemas/menstrualCycleTracking.js +28 -0
- package/dist/component/garmin/schemas/menstrualCycleTracking.js.map +1 -0
- package/dist/component/garmin/schemas/moveIQ.d.ts +40 -0
- package/dist/component/garmin/schemas/moveIQ.d.ts.map +1 -0
- package/dist/component/garmin/schemas/moveIQ.js +27 -0
- package/dist/component/garmin/schemas/moveIQ.js.map +1 -0
- package/dist/component/garmin/schemas/pulseOx.d.ts +38 -0
- package/dist/component/garmin/schemas/pulseOx.d.ts.map +1 -0
- package/dist/component/garmin/schemas/pulseOx.js +28 -0
- package/dist/component/garmin/schemas/pulseOx.js.map +1 -0
- package/dist/component/garmin/schemas/respiration.d.ts +34 -0
- package/dist/component/garmin/schemas/respiration.d.ts.map +1 -0
- package/dist/component/garmin/schemas/respiration.js +28 -0
- package/dist/component/garmin/schemas/respiration.js.map +1 -0
- package/dist/component/garmin/schemas/skinTemperature.d.ts +36 -0
- package/dist/component/garmin/schemas/skinTemperature.d.ts.map +1 -0
- package/dist/component/garmin/schemas/skinTemperature.js +28 -0
- package/dist/component/garmin/schemas/skinTemperature.js.map +1 -0
- package/dist/component/garmin/schemas/sleeps.d.ts +88 -0
- package/dist/component/garmin/schemas/sleeps.d.ts.map +1 -0
- package/dist/component/garmin/schemas/sleeps.js +27 -0
- package/dist/component/garmin/schemas/sleeps.js.map +1 -0
- package/dist/component/garmin/schemas/stress.d.ts +70 -0
- package/dist/component/garmin/schemas/stress.d.ts.map +1 -0
- package/dist/component/garmin/schemas/stress.js +28 -0
- package/dist/component/garmin/schemas/stress.js.map +1 -0
- package/dist/component/garmin/schemas/userMetrics.d.ts +36 -0
- package/dist/component/garmin/schemas/userMetrics.d.ts.map +1 -0
- package/dist/component/garmin/schemas/userMetrics.js +28 -0
- package/dist/component/garmin/schemas/userMetrics.js.map +1 -0
- package/dist/component/garmin/transform/activity.d.ts +13 -0
- package/dist/component/garmin/transform/activity.d.ts.map +1 -0
- package/dist/component/garmin/transform/activity.js +111 -0
- package/dist/component/garmin/transform/activity.js.map +1 -0
- package/dist/component/garmin/transform/activityDetails.d.ts +13 -0
- package/dist/component/garmin/transform/activityDetails.d.ts.map +1 -0
- package/dist/component/garmin/transform/activityDetails.js +173 -0
- package/dist/component/garmin/transform/activityDetails.js.map +1 -0
- package/dist/component/garmin/transform/bloodPressure.d.ts +12 -0
- package/dist/component/garmin/transform/bloodPressure.d.ts.map +1 -0
- package/dist/component/garmin/transform/bloodPressure.js +33 -0
- package/dist/component/garmin/transform/bloodPressure.js.map +1 -0
- package/dist/component/garmin/transform/bodyCompositions.d.ts +12 -0
- package/dist/component/garmin/transform/bodyCompositions.d.ts.map +1 -0
- package/dist/component/garmin/transform/bodyCompositions.js +42 -0
- package/dist/component/garmin/transform/bodyCompositions.js.map +1 -0
- package/dist/component/garmin/transform/dailies.d.ts +12 -0
- package/dist/component/garmin/transform/dailies.d.ts.map +1 -0
- package/dist/component/garmin/transform/dailies.js +132 -0
- package/dist/component/garmin/transform/dailies.js.map +1 -0
- package/dist/component/garmin/transform/epochs.d.ts +13 -0
- package/dist/component/garmin/transform/epochs.d.ts.map +1 -0
- package/dist/component/garmin/transform/epochs.js +76 -0
- package/dist/component/garmin/transform/epochs.js.map +1 -0
- package/dist/component/garmin/transform/healthSnapshot.d.ts +12 -0
- package/dist/component/garmin/transform/healthSnapshot.d.ts.map +1 -0
- package/dist/component/garmin/transform/healthSnapshot.js +111 -0
- package/dist/component/garmin/transform/healthSnapshot.js.map +1 -0
- package/dist/component/garmin/transform/hrvSummary.d.ts +12 -0
- package/dist/component/garmin/transform/hrvSummary.d.ts.map +1 -0
- package/dist/component/garmin/transform/hrvSummary.js +45 -0
- package/dist/component/garmin/transform/hrvSummary.js.map +1 -0
- package/dist/component/garmin/transform/manuallyUpdatedActivities.d.ts +11 -0
- package/dist/component/garmin/transform/manuallyUpdatedActivities.d.ts.map +1 -0
- package/dist/component/garmin/transform/manuallyUpdatedActivities.js +20 -0
- package/dist/component/garmin/transform/manuallyUpdatedActivities.js.map +1 -0
- package/dist/component/garmin/transform/menstrualCycleTracking.d.ts +10 -0
- package/dist/component/garmin/transform/menstrualCycleTracking.d.ts.map +1 -0
- package/dist/component/garmin/transform/menstrualCycleTracking.js +43 -0
- package/dist/component/garmin/transform/menstrualCycleTracking.js.map +1 -0
- package/dist/component/garmin/transform/moveIQ.d.ts +17 -0
- package/dist/component/garmin/transform/moveIQ.d.ts.map +1 -0
- package/dist/component/garmin/transform/moveIQ.js +41 -0
- package/dist/component/garmin/transform/moveIQ.js.map +1 -0
- package/dist/component/garmin/transform/pulseOx.d.ts +12 -0
- package/dist/component/garmin/transform/pulseOx.d.ts.map +1 -0
- package/dist/component/garmin/transform/pulseOx.js +46 -0
- package/dist/component/garmin/transform/pulseOx.js.map +1 -0
- package/dist/component/garmin/transform/respiration.d.ts +12 -0
- package/dist/component/garmin/transform/respiration.d.ts.map +1 -0
- package/dist/component/garmin/transform/respiration.js +54 -0
- package/dist/component/garmin/transform/respiration.js.map +1 -0
- package/dist/component/garmin/transform/skinTemperature.d.ts +12 -0
- package/dist/component/garmin/transform/skinTemperature.d.ts.map +1 -0
- package/dist/component/garmin/transform/skinTemperature.js +38 -0
- package/dist/component/garmin/transform/skinTemperature.js.map +1 -0
- package/dist/component/garmin/transform/sleeps.d.ts +55 -0
- package/dist/component/garmin/transform/sleeps.d.ts.map +1 -0
- package/dist/component/garmin/transform/sleeps.js +120 -0
- package/dist/component/garmin/transform/sleeps.js.map +1 -0
- package/dist/component/garmin/transform/stress.d.ts +12 -0
- package/dist/component/garmin/transform/stress.d.ts.map +1 -0
- package/dist/component/garmin/transform/stress.js +56 -0
- package/dist/component/garmin/transform/stress.js.map +1 -0
- package/dist/component/garmin/transform/userMetrics.d.ts +12 -0
- package/dist/component/garmin/transform/userMetrics.d.ts.map +1 -0
- package/dist/component/garmin/transform/userMetrics.js +48 -0
- package/dist/component/garmin/transform/userMetrics.js.map +1 -0
- package/dist/component/garmin/types/garmin.d.ts +21 -0
- package/dist/component/garmin/types/garmin.d.ts.map +1 -0
- package/dist/component/garmin/types/garmin.js +6 -0
- package/dist/component/garmin/types/garmin.js.map +1 -0
- package/dist/component/garmin/types/zod/zod.gen.d.ts +1319 -0
- package/dist/component/garmin/types/zod/zod.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/zod/zod.gen.js +784 -0
- package/dist/component/garmin/types/zod/zod.gen.js.map +1 -0
- package/dist/component/garmin/webhooks.d.ts +141 -0
- package/dist/component/garmin/webhooks.d.ts.map +1 -0
- package/dist/component/garmin/webhooks.js +766 -0
- package/dist/component/garmin/webhooks.js.map +1 -0
- package/dist/component/private.d.ts +20 -2
- package/dist/component/private.d.ts.map +1 -1
- package/dist/component/private.js +18 -0
- package/dist/component/private.js.map +1 -1
- package/dist/component/public.d.ts +433 -387
- package/dist/component/public.d.ts.map +1 -1
- package/dist/component/public.js +12 -2
- package/dist/component/public.js.map +1 -1
- package/dist/component/schema.d.ts +217 -162
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +2 -1
- package/dist/component/schema.js.map +1 -1
- package/dist/component/strava/private.d.ts +30 -0
- package/dist/component/strava/private.d.ts.map +1 -0
- package/dist/component/strava/private.js +71 -0
- package/dist/component/strava/private.js.map +1 -0
- package/dist/component/{strava.d.ts → strava/public.d.ts} +3 -31
- package/dist/component/strava/public.d.ts.map +1 -0
- package/dist/component/{strava.js → strava/public.js} +22 -101
- package/dist/component/strava/public.js.map +1 -0
- package/dist/component/validators/activity.d.ts +6 -0
- package/dist/component/validators/activity.d.ts.map +1 -1
- package/dist/component/validators/activity.js.map +1 -1
- package/dist/component/validators/body.d.ts +20 -14
- package/dist/component/validators/body.d.ts.map +1 -1
- package/dist/component/validators/body.js.map +1 -1
- package/dist/component/validators/connection.d.ts +1 -0
- package/dist/component/validators/connection.d.ts.map +1 -1
- package/dist/component/validators/connection.js +2 -0
- package/dist/component/validators/connection.js.map +1 -1
- package/dist/component/validators/daily.d.ts +46 -5
- package/dist/component/validators/daily.d.ts.map +1 -1
- package/dist/component/validators/daily.js +10 -1
- package/dist/component/validators/daily.js.map +1 -1
- package/dist/component/validators/enums.d.ts +2 -2
- package/dist/component/validators/menstruation.d.ts +5 -0
- package/dist/component/validators/menstruation.d.ts.map +1 -1
- package/dist/component/validators/menstruation.js.map +1 -1
- package/dist/component/validators/plannedWorkout.d.ts +5 -1
- package/dist/component/validators/plannedWorkout.d.ts.map +1 -1
- package/dist/component/validators/plannedWorkout.js +4 -0
- package/dist/component/validators/plannedWorkout.js.map +1 -1
- package/dist/component/validators/sleep.d.ts +8 -8
- package/dist/garmin/bloodPressure.d.ts +28 -0
- package/dist/garmin/bloodPressure.d.ts.map +1 -0
- package/dist/garmin/bloodPressure.js +34 -0
- package/dist/garmin/bloodPressure.js.map +1 -0
- package/dist/garmin/body.js +1 -1
- package/dist/garmin/body.js.map +1 -1
- package/dist/garmin/client.d.ts +117 -17
- package/dist/garmin/client.d.ts.map +1 -1
- package/dist/garmin/client.js +337 -43
- package/dist/garmin/client.js.map +1 -1
- package/dist/garmin/daily.d.ts.map +1 -1
- package/dist/garmin/daily.js +3 -3
- package/dist/garmin/daily.js.map +1 -1
- package/dist/garmin/hrv.d.ts +30 -0
- package/dist/garmin/hrv.d.ts.map +1 -0
- package/dist/garmin/hrv.js +45 -0
- package/dist/garmin/hrv.js.map +1 -0
- package/dist/garmin/index.d.ts +16 -4
- package/dist/garmin/index.d.ts.map +1 -1
- package/dist/garmin/index.js +8 -2
- package/dist/garmin/index.js.map +1 -1
- package/dist/garmin/maps/activity-type.d.ts +1 -2
- package/dist/garmin/maps/activity-type.d.ts.map +1 -1
- package/dist/garmin/maps/activity-type.js +1 -0
- package/dist/garmin/maps/activity-type.js.map +1 -1
- package/dist/garmin/menstruation.d.ts +6 -4
- package/dist/garmin/menstruation.d.ts.map +1 -1
- package/dist/garmin/menstruation.js +12 -8
- package/dist/garmin/menstruation.js.map +1 -1
- package/dist/garmin/pulseOx.d.ts +24 -0
- package/dist/garmin/pulseOx.d.ts.map +1 -0
- package/dist/garmin/pulseOx.js +33 -0
- package/dist/garmin/pulseOx.js.map +1 -0
- package/dist/garmin/respiration.d.ts +29 -0
- package/dist/garmin/respiration.d.ts.map +1 -0
- package/dist/garmin/respiration.js +42 -0
- package/dist/garmin/respiration.js.map +1 -0
- package/dist/garmin/skinTemp.d.ts +27 -0
- package/dist/garmin/skinTemp.d.ts.map +1 -0
- package/dist/garmin/skinTemp.js +35 -0
- package/dist/garmin/skinTemp.js.map +1 -0
- package/dist/garmin/sleep.d.ts +4 -4
- package/dist/garmin/sleep.d.ts.map +1 -1
- package/dist/garmin/sleep.js +15 -9
- package/dist/garmin/sleep.js.map +1 -1
- package/dist/garmin/stressDetails.d.ts +30 -0
- package/dist/garmin/stressDetails.d.ts.map +1 -0
- package/dist/garmin/stressDetails.js +49 -0
- package/dist/garmin/stressDetails.js.map +1 -0
- package/dist/garmin/sync.d.ts +14 -0
- package/dist/garmin/sync.d.ts.map +1 -1
- package/dist/garmin/sync.js +290 -7
- package/dist/garmin/sync.js.map +1 -1
- package/dist/garmin/types.d.ts +77 -186
- package/dist/garmin/types.d.ts.map +1 -1
- package/dist/garmin/types.js +4 -2
- package/dist/garmin/types.js.map +1 -1
- package/dist/garmin/userMetrics.d.ts +23 -0
- package/dist/garmin/userMetrics.d.ts.map +1 -0
- package/dist/garmin/userMetrics.js +41 -0
- package/dist/garmin/userMetrics.js.map +1 -0
- package/dist/validators.d.ts +138 -56
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +2 -2
- package/dist/validators.js.map +1 -1
- package/package.json +130 -124
- package/src/client/index.ts +86 -18
- package/src/component/_generated/api.ts +96 -4
- package/src/component/_generated/component.ts +271 -144
- package/src/{garmin → component/garmin}/auth.ts +8 -1
- package/src/component/garmin/client.ts +39 -0
- package/src/component/garmin/private.ts +1798 -0
- package/src/component/garmin/public.ts +938 -0
- package/src/component/garmin/schemas/activity.ts +40 -0
- package/src/component/garmin/schemas/activityDetails.ts +45 -0
- package/src/component/garmin/schemas/bloodPressure.ts +38 -0
- package/src/component/garmin/schemas/bodyCompositions.ts +38 -0
- package/src/component/garmin/schemas/dailies.ts +38 -0
- package/src/component/garmin/schemas/epochs.ts +38 -0
- package/src/component/garmin/schemas/healthSnapshot.ts +38 -0
- package/src/component/garmin/schemas/hrvSummary.ts +38 -0
- package/src/component/garmin/schemas/manuallyUpdatedActivities.ts +49 -0
- package/src/component/garmin/schemas/menstrualCycleTracking.ts +39 -0
- package/src/component/garmin/schemas/moveIQ.ts +38 -0
- package/src/component/garmin/schemas/pulseOx.ts +39 -0
- package/src/component/garmin/schemas/respiration.ts +39 -0
- package/src/component/garmin/schemas/skinTemperature.ts +39 -0
- package/src/component/garmin/schemas/sleeps.ts +38 -0
- package/src/component/garmin/schemas/stress.ts +43 -0
- package/src/component/garmin/schemas/userMetrics.ts +39 -0
- package/src/component/garmin/transform/activity.ts +143 -0
- package/src/component/garmin/transform/activityDetails.ts +236 -0
- package/src/component/garmin/transform/bloodPressure.ts +39 -0
- package/src/component/garmin/transform/bodyCompositions.ts +51 -0
- package/src/component/garmin/transform/dailies.ts +179 -0
- package/src/component/garmin/transform/epochs.ts +94 -0
- package/src/component/garmin/transform/healthSnapshot.ts +152 -0
- package/src/component/garmin/transform/hrvSummary.ts +56 -0
- package/src/component/garmin/transform/manuallyUpdatedActivities.ts +27 -0
- package/src/{garmin/maps/activity-type.ts → component/garmin/transform/maps/activityType.ts} +116 -116
- package/src/{garmin/maps/sleep-level.ts → component/garmin/transform/maps/sleepLevel.ts} +22 -22
- package/src/component/garmin/transform/menstrualCycleTracking.ts +48 -0
- package/src/component/garmin/transform/moveIQ.ts +48 -0
- package/src/{garmin → component/garmin/transform}/plannedWorkout.ts +328 -333
- package/src/component/garmin/transform/pulseOx.ts +64 -0
- package/src/component/garmin/transform/respiration.ts +73 -0
- package/src/component/garmin/transform/skinTemperature.ts +44 -0
- package/src/component/garmin/transform/sleeps.ts +159 -0
- package/src/component/garmin/transform/stress.ts +78 -0
- package/src/component/garmin/transform/userMetrics.ts +56 -0
- package/src/component/garmin/types/specs/training-api-workouts.json +699 -0
- package/src/component/garmin/types/specs/wellness-api.json +1 -0
- package/src/component/garmin/types/trainingApiWorkouts/client/client.gen.ts +290 -0
- package/src/component/garmin/types/trainingApiWorkouts/client/index.ts +25 -0
- package/src/component/garmin/types/trainingApiWorkouts/client/types.gen.ts +214 -0
- package/src/component/garmin/types/trainingApiWorkouts/client/utils.gen.ts +316 -0
- package/src/component/garmin/types/trainingApiWorkouts/client.gen.ts +16 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/auth.gen.ts +41 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/bodySerializer.gen.ts +82 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/params.gen.ts +169 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/pathSerializer.gen.ts +171 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/queryKeySerializer.gen.ts +117 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/serverSentEvents.gen.ts +243 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/types.gen.ts +104 -0
- package/src/component/garmin/types/trainingApiWorkouts/core/utils.gen.ts +140 -0
- package/src/component/garmin/types/trainingApiWorkouts/index.ts +4 -0
- package/src/component/garmin/types/trainingApiWorkouts/sdk.gen.ts +126 -0
- package/src/component/garmin/types/trainingApiWorkouts/types.gen.ts +387 -0
- package/src/component/garmin/types/trainingApiWorkouts/zod.gen.ts +423 -0
- package/src/component/garmin/types/wellnessApi/client/client.gen.ts +290 -0
- package/src/component/garmin/types/wellnessApi/client/index.ts +25 -0
- package/src/component/garmin/types/wellnessApi/client/types.gen.ts +214 -0
- package/src/component/garmin/types/wellnessApi/client/utils.gen.ts +316 -0
- package/src/component/garmin/types/wellnessApi/client.gen.ts +16 -0
- package/src/component/garmin/types/wellnessApi/core/auth.gen.ts +41 -0
- package/src/component/garmin/types/wellnessApi/core/bodySerializer.gen.ts +82 -0
- package/src/component/garmin/types/wellnessApi/core/params.gen.ts +169 -0
- package/src/component/garmin/types/wellnessApi/core/pathSerializer.gen.ts +171 -0
- package/src/component/garmin/types/wellnessApi/core/queryKeySerializer.gen.ts +117 -0
- package/src/component/garmin/types/wellnessApi/core/serverSentEvents.gen.ts +243 -0
- package/src/component/garmin/types/wellnessApi/core/types.gen.ts +104 -0
- package/src/component/garmin/types/wellnessApi/core/utils.gen.ts +140 -0
- package/src/component/garmin/types/wellnessApi/index.ts +4 -0
- package/src/component/garmin/types/wellnessApi/sdk.gen.ts +207 -0
- package/src/component/garmin/types/wellnessApi/types.gen.ts +2942 -0
- package/src/component/garmin/types/wellnessApi/zod.gen.ts +878 -0
- package/src/component/garmin/utils.ts +25 -0
- package/src/component/garmin/webhooks.ts +852 -0
- package/src/component/private.ts +21 -0
- package/src/component/public.ts +11 -2
- package/src/component/schema.ts +2 -1
- package/src/component/strava/private.ts +89 -0
- package/src/component/{strava.ts → strava/public.ts} +341 -404
- package/src/component/validators/activity.ts +5 -0
- package/src/component/validators/body.ts +5 -0
- package/src/component/validators/connection.ts +2 -0
- package/src/component/validators/daily.ts +20 -0
- package/src/component/validators/menstruation.ts +5 -1
- package/src/component/validators/plannedWorkout.ts +9 -0
- package/src/validators.ts +12 -2
- package/dist/component/garmin.d.ts.map +0 -1
- package/dist/component/garmin.js.map +0 -1
- package/dist/component/strava.d.ts.map +0 -1
- package/dist/component/strava.js.map +0 -1
- package/dist/garmin/activity.d.ts +0 -101
- package/dist/garmin/activity.d.ts.map +0 -1
- package/dist/garmin/activity.js +0 -207
- package/dist/garmin/activity.js.map +0 -1
- package/src/component/garmin.ts +0 -850
- package/src/garmin/activity.test.ts +0 -178
- package/src/garmin/activity.ts +0 -272
- package/src/garmin/auth.test.ts +0 -103
- package/src/garmin/body.ts +0 -59
- package/src/garmin/client.ts +0 -407
- package/src/garmin/daily.ts +0 -211
- package/src/garmin/index.ts +0 -75
- package/src/garmin/maps/activity-type.test.ts +0 -78
- package/src/garmin/menstruation.ts +0 -42
- package/src/garmin/sleep.test.ts +0 -110
- package/src/garmin/sleep.ts +0 -170
- package/src/garmin/sync.ts +0 -223
- 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"}
|