@nativesquare/soma 0.9.0 → 0.9.1
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/component/_generated/api.d.ts +20 -2
- 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 +7 -6
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/{garmin → component/garmin}/auth.d.ts +8 -1
- package/dist/component/garmin/auth.d.ts.map +1 -0
- package/dist/component/garmin/auth.js.map +1 -0
- package/dist/component/garmin/client.d.ts +15 -0
- package/dist/component/garmin/client.d.ts.map +1 -0
- package/dist/component/garmin/client.js +32 -0
- package/dist/component/garmin/client.js.map +1 -0
- package/dist/component/garmin/private.d.ts +85 -17
- package/dist/component/garmin/private.d.ts.map +1 -1
- package/dist/component/garmin/private.js +52 -205
- package/dist/component/garmin/private.js.map +1 -1
- package/dist/component/garmin/public.d.ts +42 -48
- package/dist/component/garmin/public.d.ts.map +1 -1
- package/dist/component/garmin/public.js +404 -368
- package/dist/component/garmin/public.js.map +1 -1
- package/dist/component/garmin/schemas/activity.d.ts +2 -2
- package/dist/component/garmin/schemas/activity.d.ts.map +1 -1
- package/dist/component/garmin/schemas/activity.js +3 -1
- package/dist/component/garmin/schemas/activity.js.map +1 -1
- package/dist/component/garmin/schemas/activityDetails.d.ts +50 -50
- package/dist/component/garmin/schemas/activityDetails.d.ts.map +1 -1
- package/dist/component/garmin/schemas/activityDetails.js +4 -1
- package/dist/component/garmin/schemas/activityDetails.js.map +1 -1
- package/dist/component/garmin/schemas/bloodPressure.js +1 -1
- package/dist/component/garmin/schemas/bloodPressure.js.map +1 -1
- package/dist/component/garmin/schemas/bodyCompositions.js +1 -1
- package/dist/component/garmin/schemas/bodyCompositions.js.map +1 -1
- package/dist/component/garmin/schemas/dailies.js +1 -1
- package/dist/component/garmin/schemas/dailies.js.map +1 -1
- package/dist/component/garmin/schemas/epochs.js +1 -1
- package/dist/component/garmin/schemas/epochs.js.map +1 -1
- package/dist/component/garmin/schemas/healthSnapshot.js +1 -1
- package/dist/component/garmin/schemas/healthSnapshot.js.map +1 -1
- package/dist/component/garmin/schemas/hrvSummary.js +1 -1
- package/dist/component/garmin/schemas/hrvSummary.js.map +1 -1
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.d.ts +2 -2
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.d.ts.map +1 -1
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.js +3 -1
- package/dist/component/garmin/schemas/manuallyUpdatedActivities.js.map +1 -1
- package/dist/component/garmin/schemas/menstrualCycleTracking.js +1 -1
- package/dist/component/garmin/schemas/menstrualCycleTracking.js.map +1 -1
- package/dist/component/garmin/schemas/moveIQ.js +1 -1
- package/dist/component/garmin/schemas/moveIQ.js.map +1 -1
- package/dist/component/garmin/schemas/pulseOx.js +1 -1
- package/dist/component/garmin/schemas/pulseOx.js.map +1 -1
- package/dist/component/garmin/schemas/respiration.js +1 -1
- package/dist/component/garmin/schemas/respiration.js.map +1 -1
- package/dist/component/garmin/schemas/skinTemperature.js +1 -1
- package/dist/component/garmin/schemas/skinTemperature.js.map +1 -1
- package/dist/component/garmin/schemas/sleeps.js +1 -1
- package/dist/component/garmin/schemas/sleeps.js.map +1 -1
- package/dist/component/garmin/schemas/stress.d.ts +6 -6
- package/dist/component/garmin/schemas/stress.d.ts.map +1 -1
- package/dist/component/garmin/schemas/stress.js +3 -1
- package/dist/component/garmin/schemas/stress.js.map +1 -1
- package/dist/component/garmin/schemas/userMetrics.js +1 -1
- package/dist/component/garmin/schemas/userMetrics.js.map +1 -1
- package/dist/component/garmin/transform/activity.d.ts +2 -2
- package/dist/component/garmin/transform/activity.d.ts.map +1 -1
- package/dist/component/garmin/transform/activity.js +1 -1
- package/dist/component/garmin/transform/activity.js.map +1 -1
- package/dist/component/garmin/transform/activityDetails.d.ts +2 -2
- package/dist/component/garmin/transform/activityDetails.d.ts.map +1 -1
- package/dist/component/garmin/transform/activityDetails.js.map +1 -1
- package/dist/component/garmin/transform/bloodPressure.d.ts +2 -2
- package/dist/component/garmin/transform/bloodPressure.d.ts.map +1 -1
- package/dist/component/garmin/transform/bodyCompositions.d.ts +2 -2
- package/dist/component/garmin/transform/bodyCompositions.d.ts.map +1 -1
- package/dist/component/garmin/transform/bodyCompositions.js.map +1 -1
- package/dist/component/garmin/transform/dailies.d.ts +2 -2
- package/dist/component/garmin/transform/dailies.d.ts.map +1 -1
- package/dist/component/garmin/transform/dailies.js +1 -1
- package/dist/component/garmin/transform/dailies.js.map +1 -1
- package/dist/component/garmin/transform/epochs.d.ts +2 -2
- package/dist/component/garmin/transform/epochs.d.ts.map +1 -1
- package/dist/component/garmin/transform/healthSnapshot.d.ts +2 -2
- package/dist/component/garmin/transform/healthSnapshot.d.ts.map +1 -1
- package/dist/component/garmin/transform/healthSnapshot.js.map +1 -1
- package/dist/component/garmin/transform/hrvSummary.d.ts +2 -2
- package/dist/component/garmin/transform/hrvSummary.d.ts.map +1 -1
- package/dist/component/garmin/transform/hrvSummary.js +1 -1
- package/dist/component/garmin/transform/hrvSummary.js.map +1 -1
- package/dist/component/garmin/transform/manuallyUpdatedActivities.d.ts +2 -2
- package/dist/component/garmin/transform/manuallyUpdatedActivities.d.ts.map +1 -1
- package/dist/{garmin/maps/activity-type.d.ts → component/garmin/transform/maps/activityType.d.ts} +1 -1
- package/dist/component/garmin/transform/maps/activityType.d.ts.map +1 -0
- package/dist/{garmin/maps/activity-type.js → component/garmin/transform/maps/activityType.js} +1 -1
- package/dist/component/garmin/transform/maps/activityType.js.map +1 -0
- package/dist/{garmin/maps/sleep-level.d.ts → component/garmin/transform/maps/sleepLevel.d.ts} +1 -1
- package/dist/component/garmin/transform/maps/sleepLevel.d.ts.map +1 -0
- package/dist/{garmin/maps/sleep-level.js → component/garmin/transform/maps/sleepLevel.js} +1 -1
- package/dist/component/garmin/transform/maps/sleepLevel.js.map +1 -0
- package/dist/component/garmin/transform/menstrualCycleTracking.d.ts +2 -2
- package/dist/component/garmin/transform/menstrualCycleTracking.d.ts.map +1 -1
- package/dist/component/garmin/transform/menstrualCycleTracking.js.map +1 -1
- package/dist/component/garmin/transform/moveIQ.d.ts +2 -5
- package/dist/component/garmin/transform/moveIQ.d.ts.map +1 -1
- package/dist/component/garmin/transform/moveIQ.js +1 -1
- package/dist/component/garmin/transform/moveIQ.js.map +1 -1
- package/dist/{garmin → component/garmin/transform}/plannedWorkout.d.ts +3 -4
- package/dist/component/garmin/transform/plannedWorkout.d.ts.map +1 -0
- package/dist/{garmin → component/garmin/transform}/plannedWorkout.js +61 -70
- package/dist/component/garmin/transform/plannedWorkout.js.map +1 -0
- package/dist/component/garmin/transform/pulseOx.d.ts +2 -2
- package/dist/component/garmin/transform/pulseOx.d.ts.map +1 -1
- package/dist/component/garmin/transform/pulseOx.js +1 -1
- package/dist/component/garmin/transform/pulseOx.js.map +1 -1
- package/dist/component/garmin/transform/respiration.d.ts +2 -2
- package/dist/component/garmin/transform/respiration.d.ts.map +1 -1
- package/dist/component/garmin/transform/respiration.js +1 -1
- package/dist/component/garmin/transform/respiration.js.map +1 -1
- package/dist/component/garmin/transform/skinTemperature.d.ts +2 -2
- package/dist/component/garmin/transform/skinTemperature.d.ts.map +1 -1
- package/dist/component/garmin/transform/skinTemperature.js.map +1 -1
- package/dist/component/garmin/transform/sleeps.d.ts +2 -2
- package/dist/component/garmin/transform/sleeps.d.ts.map +1 -1
- package/dist/component/garmin/transform/sleeps.js +3 -3
- package/dist/component/garmin/transform/sleeps.js.map +1 -1
- package/dist/component/garmin/transform/stress.d.ts +2 -2
- package/dist/component/garmin/transform/stress.d.ts.map +1 -1
- package/dist/component/garmin/transform/stress.js +2 -2
- package/dist/component/garmin/transform/stress.js.map +1 -1
- package/dist/component/garmin/transform/userMetrics.d.ts +2 -2
- package/dist/component/garmin/transform/userMetrics.d.ts.map +1 -1
- package/dist/component/garmin/transform/userMetrics.js.map +1 -1
- package/dist/component/garmin/types/trainingApiWorkouts/client/client.gen.d.ts +3 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/client.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/client.gen.js +236 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/client.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/index.d.ts +9 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/index.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/index.js +7 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/index.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/types.gen.d.ts +118 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/types.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/types.gen.js +3 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/types.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/utils.gen.d.ts +34 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/utils.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/utils.gen.js +229 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client/utils.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client.gen.d.ts +13 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client.gen.js +4 -0
- package/dist/component/garmin/types/trainingApiWorkouts/client.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/auth.gen.d.ts +19 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/auth.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/auth.gen.js +15 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/auth.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/bodySerializer.gen.d.ts +26 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/bodySerializer.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/bodySerializer.gen.js +58 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/bodySerializer.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/params.gen.d.ts +44 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/params.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/params.gen.js +101 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/params.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/pathSerializer.gen.d.ts +34 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/pathSerializer.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/pathSerializer.gen.js +107 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/pathSerializer.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/queryKeySerializer.gen.d.ts +19 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/queryKeySerializer.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/queryKeySerializer.gen.js +93 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/queryKeySerializer.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/serverSentEvents.gen.d.ts +72 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/serverSentEvents.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/serverSentEvents.gen.js +134 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/serverSentEvents.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/types.gen.d.ts +79 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/types.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/types.gen.js +3 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/types.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/utils.gen.d.ts +20 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/utils.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/utils.gen.js +88 -0
- package/dist/component/garmin/types/trainingApiWorkouts/core/utils.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/index.d.ts +3 -0
- package/dist/component/garmin/types/trainingApiWorkouts/index.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/index.js +3 -0
- package/dist/component/garmin/types/trainingApiWorkouts/index.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/sdk.gen.d.ts +68 -0
- package/dist/component/garmin/types/trainingApiWorkouts/sdk.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/sdk.gen.js +97 -0
- package/dist/component/garmin/types/trainingApiWorkouts/sdk.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/types.gen.d.ts +330 -0
- package/dist/component/garmin/types/trainingApiWorkouts/types.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/types.gen.js +3 -0
- package/dist/component/garmin/types/trainingApiWorkouts/types.gen.js.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/zod.gen.d.ts +2463 -0
- package/dist/component/garmin/types/trainingApiWorkouts/zod.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/trainingApiWorkouts/zod.gen.js +388 -0
- package/dist/component/garmin/types/trainingApiWorkouts/zod.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/client.gen.d.ts +3 -0
- package/dist/component/garmin/types/wellnessApi/client/client.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/client.gen.js +236 -0
- package/dist/component/garmin/types/wellnessApi/client/client.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/index.d.ts +9 -0
- package/dist/component/garmin/types/wellnessApi/client/index.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/index.js +7 -0
- package/dist/component/garmin/types/wellnessApi/client/index.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/types.gen.d.ts +118 -0
- package/dist/component/garmin/types/wellnessApi/client/types.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/types.gen.js +3 -0
- package/dist/component/garmin/types/wellnessApi/client/types.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/utils.gen.d.ts +34 -0
- package/dist/component/garmin/types/wellnessApi/client/utils.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client/utils.gen.js +229 -0
- package/dist/component/garmin/types/wellnessApi/client/utils.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client.gen.d.ts +13 -0
- package/dist/component/garmin/types/wellnessApi/client.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/client.gen.js +4 -0
- package/dist/component/garmin/types/wellnessApi/client.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/auth.gen.d.ts +19 -0
- package/dist/component/garmin/types/wellnessApi/core/auth.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/auth.gen.js +15 -0
- package/dist/component/garmin/types/wellnessApi/core/auth.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/bodySerializer.gen.d.ts +26 -0
- package/dist/component/garmin/types/wellnessApi/core/bodySerializer.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/bodySerializer.gen.js +58 -0
- package/dist/component/garmin/types/wellnessApi/core/bodySerializer.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/params.gen.d.ts +44 -0
- package/dist/component/garmin/types/wellnessApi/core/params.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/params.gen.js +101 -0
- package/dist/component/garmin/types/wellnessApi/core/params.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/pathSerializer.gen.d.ts +34 -0
- package/dist/component/garmin/types/wellnessApi/core/pathSerializer.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/pathSerializer.gen.js +107 -0
- package/dist/component/garmin/types/wellnessApi/core/pathSerializer.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/queryKeySerializer.gen.d.ts +19 -0
- package/dist/component/garmin/types/wellnessApi/core/queryKeySerializer.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/queryKeySerializer.gen.js +93 -0
- package/dist/component/garmin/types/wellnessApi/core/queryKeySerializer.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/serverSentEvents.gen.d.ts +72 -0
- package/dist/component/garmin/types/wellnessApi/core/serverSentEvents.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/serverSentEvents.gen.js +134 -0
- package/dist/component/garmin/types/wellnessApi/core/serverSentEvents.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/types.gen.d.ts +79 -0
- package/dist/component/garmin/types/wellnessApi/core/types.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/types.gen.js +3 -0
- package/dist/component/garmin/types/wellnessApi/core/types.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/utils.gen.d.ts +20 -0
- package/dist/component/garmin/types/wellnessApi/core/utils.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/core/utils.gen.js +88 -0
- package/dist/component/garmin/types/wellnessApi/core/utils.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/index.d.ts +3 -0
- package/dist/component/garmin/types/wellnessApi/index.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/index.js +3 -0
- package/dist/component/garmin/types/wellnessApi/index.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/sdk.gen.d.ts +166 -0
- package/dist/component/garmin/types/wellnessApi/sdk.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/sdk.gen.js +153 -0
- package/dist/component/garmin/types/wellnessApi/sdk.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/types.gen.d.ts +2733 -0
- package/dist/component/garmin/types/wellnessApi/types.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/types.gen.js +3 -0
- package/dist/component/garmin/types/wellnessApi/types.gen.js.map +1 -0
- package/dist/component/garmin/types/wellnessApi/zod.gen.d.ts.map +1 -0
- package/dist/component/garmin/types/wellnessApi/zod.gen.js.map +1 -0
- package/dist/component/garmin/utils.d.ts +16 -0
- package/dist/component/garmin/utils.d.ts.map +1 -0
- package/dist/component/garmin/utils.js +17 -0
- package/dist/component/garmin/utils.js.map +1 -0
- package/dist/component/garmin/webhooks.d.ts +8 -21
- package/dist/component/garmin/webhooks.d.ts.map +1 -1
- package/dist/component/garmin/webhooks.js +71 -306
- package/dist/component/garmin/webhooks.js.map +1 -1
- package/dist/component/validators/plannedWorkout.d.ts +6 -0
- package/dist/component/validators/plannedWorkout.d.ts.map +1 -1
- package/dist/component/validators/plannedWorkout.js.map +1 -1
- package/package.json +1 -1
- package/src/component/_generated/api.ts +2 -0
- package/dist/component/garmin/types/garmin.d.ts +0 -21
- package/dist/component/garmin/types/garmin.d.ts.map +0 -1
- package/dist/component/garmin/types/garmin.js +0 -6
- package/dist/component/garmin/types/garmin.js.map +0 -1
- package/dist/component/garmin/types/zod/zod.gen.d.ts.map +0 -1
- package/dist/component/garmin/types/zod/zod.gen.js.map +0 -1
- package/dist/garmin/auth.d.ts.map +0 -1
- package/dist/garmin/auth.js.map +0 -1
- package/dist/garmin/bloodPressure.d.ts +0 -28
- package/dist/garmin/bloodPressure.d.ts.map +0 -1
- package/dist/garmin/bloodPressure.js +0 -34
- package/dist/garmin/bloodPressure.js.map +0 -1
- package/dist/garmin/body.d.ts +0 -26
- package/dist/garmin/body.d.ts.map +0 -1
- package/dist/garmin/body.js +0 -44
- package/dist/garmin/body.js.map +0 -1
- package/dist/garmin/client.d.ts +0 -246
- package/dist/garmin/client.d.ts.map +0 -1
- package/dist/garmin/client.js +0 -566
- package/dist/garmin/client.js.map +0 -1
- package/dist/garmin/daily.d.ts +0 -74
- package/dist/garmin/daily.d.ts.map +0 -1
- package/dist/garmin/daily.js +0 -143
- package/dist/garmin/daily.js.map +0 -1
- package/dist/garmin/hrv.d.ts +0 -30
- package/dist/garmin/hrv.d.ts.map +0 -1
- package/dist/garmin/hrv.js +0 -45
- package/dist/garmin/hrv.js.map +0 -1
- package/dist/garmin/index.d.ts +0 -32
- package/dist/garmin/index.d.ts.map +0 -1
- package/dist/garmin/index.js +0 -27
- package/dist/garmin/index.js.map +0 -1
- package/dist/garmin/maps/activity-type.d.ts.map +0 -1
- package/dist/garmin/maps/activity-type.js.map +0 -1
- package/dist/garmin/maps/sleep-level.d.ts.map +0 -1
- package/dist/garmin/maps/sleep-level.js.map +0 -1
- package/dist/garmin/menstruation.d.ts +0 -25
- package/dist/garmin/menstruation.d.ts.map +0 -1
- package/dist/garmin/menstruation.js +0 -38
- package/dist/garmin/menstruation.js.map +0 -1
- package/dist/garmin/plannedWorkout.d.ts.map +0 -1
- package/dist/garmin/plannedWorkout.js.map +0 -1
- package/dist/garmin/pulseOx.d.ts +0 -24
- package/dist/garmin/pulseOx.d.ts.map +0 -1
- package/dist/garmin/pulseOx.js +0 -33
- package/dist/garmin/pulseOx.js.map +0 -1
- package/dist/garmin/respiration.d.ts +0 -29
- package/dist/garmin/respiration.d.ts.map +0 -1
- package/dist/garmin/respiration.js +0 -42
- package/dist/garmin/respiration.js.map +0 -1
- package/dist/garmin/skinTemp.d.ts +0 -27
- package/dist/garmin/skinTemp.d.ts.map +0 -1
- package/dist/garmin/skinTemp.js +0 -35
- package/dist/garmin/skinTemp.js.map +0 -1
- package/dist/garmin/sleep.d.ts +0 -62
- package/dist/garmin/sleep.d.ts.map +0 -1
- package/dist/garmin/sleep.js +0 -131
- package/dist/garmin/sleep.js.map +0 -1
- package/dist/garmin/stressDetails.d.ts +0 -30
- package/dist/garmin/stressDetails.d.ts.map +0 -1
- package/dist/garmin/stressDetails.js +0 -49
- package/dist/garmin/stressDetails.js.map +0 -1
- package/dist/garmin/sync.d.ts +0 -53
- package/dist/garmin/sync.d.ts.map +0 -1
- package/dist/garmin/sync.js +0 -458
- package/dist/garmin/sync.js.map +0 -1
- package/dist/garmin/types.d.ts +0 -175
- package/dist/garmin/types.d.ts.map +0 -1
- package/dist/garmin/types.js +0 -10
- package/dist/garmin/types.js.map +0 -1
- package/dist/garmin/userMetrics.d.ts +0 -23
- package/dist/garmin/userMetrics.d.ts.map +0 -1
- package/dist/garmin/userMetrics.js +0 -41
- package/dist/garmin/userMetrics.js.map +0 -1
- /package/dist/{garmin → component/garmin}/auth.js +0 -0
- /package/dist/component/garmin/types/{zod → wellnessApi}/zod.gen.d.ts +0 -0
- /package/dist/component/garmin/types/{zod → wellnessApi}/zod.gen.js +0 -0
|
@@ -4,40 +4,27 @@
|
|
|
4
4
|
// credentials automatically from env vars or constructor config.
|
|
5
5
|
import { v } from "convex/values";
|
|
6
6
|
import { action } from "../_generated/server";
|
|
7
|
-
import { generateCodeVerifier, generateCodeChallenge, generateState, buildAuthUrl, exchangeCode, refreshToken, } from "
|
|
8
|
-
import {
|
|
7
|
+
import { generateCodeVerifier, generateCodeChallenge, generateState, buildAuthUrl, exchangeCode, refreshToken, } from "./auth.js";
|
|
8
|
+
import { createWellnessClient, createTrainingClient, } from "./client.js";
|
|
9
|
+
import { timeRangeQuery } from "./utils.js";
|
|
10
|
+
import { createWorkoutV2 as sdkCreateWorkoutV2, createWorkoutSchedule as sdkCreateWorkoutSchedule, } from "./types/trainingApiWorkouts/sdk.gen";
|
|
11
|
+
import { userId as sdkUserId, dereg as sdkDereg, getActivities, getDailies, getSleeps, getBodyComps, getMct, getBloodPressures, getSkinTemp, getUserMetrics, getHrv, getStressDetails, getPulseox, getRespiration, } from "./types/wellnessApi/sdk.gen";
|
|
9
12
|
import { transformActivity } from "./transform/activity.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { transformBloodPressure } from "
|
|
15
|
-
import {
|
|
16
|
-
import { transformUserMetrics } from "
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { transformPulseOx } from "
|
|
20
|
-
import { transformRespiration } from "
|
|
21
|
-
import { transformPlannedWorkoutToGarmin } from "
|
|
13
|
+
import { transformDailies } from "./transform/dailies.js";
|
|
14
|
+
import { transformSleeps } from "./transform/sleeps.js";
|
|
15
|
+
import { transformBodyComposition } from "./transform/bodyCompositions.js";
|
|
16
|
+
import { transformMenstrualCycleTracking } from "./transform/menstrualCycleTracking.js";
|
|
17
|
+
import { transformBloodPressure } from "./transform/bloodPressure.js";
|
|
18
|
+
import { transformSkinTemperature } from "./transform/skinTemperature.js";
|
|
19
|
+
import { transformUserMetrics } from "./transform/userMetrics.js";
|
|
20
|
+
import { transformHRVSummary } from "./transform/hrvSummary.js";
|
|
21
|
+
import { transformStress } from "./transform/stress.js";
|
|
22
|
+
import { transformPulseOx } from "./transform/pulseOx.js";
|
|
23
|
+
import { transformRespiration } from "./transform/respiration.js";
|
|
24
|
+
import { transformPlannedWorkoutToGarmin } from "./transform/plannedWorkout.js";
|
|
22
25
|
import { api, internal } from "../_generated/api";
|
|
23
|
-
import { zClientActivity } from "./types/zod/zod.gen";
|
|
24
26
|
// Default sync window: last 30 days
|
|
25
27
|
const DEFAULT_SYNC_DAYS = 30;
|
|
26
|
-
// Shared synced counter validator for all sync actions
|
|
27
|
-
const syncedValidator = v.object({
|
|
28
|
-
activities: v.number(),
|
|
29
|
-
dailies: v.number(),
|
|
30
|
-
sleep: v.number(),
|
|
31
|
-
body: v.number(),
|
|
32
|
-
menstruation: v.number(),
|
|
33
|
-
bloodPressures: v.number(),
|
|
34
|
-
skinTemp: v.number(),
|
|
35
|
-
userMetrics: v.number(),
|
|
36
|
-
hrv: v.number(),
|
|
37
|
-
stressDetails: v.number(),
|
|
38
|
-
pulseOx: v.number(),
|
|
39
|
-
respiration: v.number(),
|
|
40
|
-
});
|
|
41
28
|
// Refresh buffer: refresh tokens 10 minutes before expiry
|
|
42
29
|
const REFRESH_BUFFER_SECONDS = 600;
|
|
43
30
|
// ─── Public Actions ──────────────────────────────────────────────────────────
|
|
@@ -113,11 +100,10 @@ export const connectGarmin = action({
|
|
|
113
100
|
refreshToken: tokenResult.refresh_token,
|
|
114
101
|
expiresAt,
|
|
115
102
|
});
|
|
116
|
-
const client = new GarminClient({
|
|
117
|
-
accessToken: tokenResult.access_token,
|
|
118
|
-
});
|
|
119
103
|
// Best-effort: resolve Garmin user ID for webhook mapping
|
|
120
|
-
const
|
|
104
|
+
const wellnessClient = createWellnessClient(tokenResult.access_token);
|
|
105
|
+
const { data: userIdData } = await sdkUserId({ client: wellnessClient });
|
|
106
|
+
const garminUserId = userIdData?.userId ?? null;
|
|
121
107
|
if (garminUserId) {
|
|
122
108
|
const _updated = await ctx.runMutation(api.public.updateConnection, {
|
|
123
109
|
connectionId,
|
|
@@ -130,10 +116,12 @@ export const connectGarmin = action({
|
|
|
130
116
|
uploadStartTimeInSeconds: thirtyDaysAgo,
|
|
131
117
|
uploadEndTimeInSeconds: now,
|
|
132
118
|
};
|
|
133
|
-
const result = await syncAllTypes
|
|
119
|
+
const result = await ctx.runAction(api.garmin.public.syncAllTypes, {
|
|
120
|
+
accessToken: tokenResult.access_token,
|
|
134
121
|
connectionId,
|
|
135
122
|
userId: args.userId,
|
|
136
|
-
timeRange,
|
|
123
|
+
uploadStartTimeInSeconds: timeRange.uploadStartTimeInSeconds,
|
|
124
|
+
uploadEndTimeInSeconds: timeRange.uploadEndTimeInSeconds,
|
|
137
125
|
});
|
|
138
126
|
const _updated = await ctx.runMutation(api.public.updateConnection, {
|
|
139
127
|
connectionId,
|
|
@@ -192,11 +180,10 @@ export const completeGarminOAuth = action({
|
|
|
192
180
|
refreshToken: tokenResult.refresh_token,
|
|
193
181
|
expiresAt,
|
|
194
182
|
});
|
|
195
|
-
const client = new GarminClient({
|
|
196
|
-
accessToken: tokenResult.access_token,
|
|
197
|
-
});
|
|
198
183
|
// Best-effort: resolve Garmin user ID for webhook mapping
|
|
199
|
-
const
|
|
184
|
+
const wellnessClient = createWellnessClient(tokenResult.access_token);
|
|
185
|
+
const { data: userIdData } = await sdkUserId({ client: wellnessClient });
|
|
186
|
+
const garminUserId = userIdData?.userId ?? null;
|
|
200
187
|
if (garminUserId) {
|
|
201
188
|
const _updated = await ctx.runMutation(api.public.updateConnection, {
|
|
202
189
|
connectionId,
|
|
@@ -209,10 +196,12 @@ export const completeGarminOAuth = action({
|
|
|
209
196
|
uploadStartTimeInSeconds: thirtyDaysAgo,
|
|
210
197
|
uploadEndTimeInSeconds: now,
|
|
211
198
|
};
|
|
212
|
-
const result = await syncAllTypes
|
|
199
|
+
const result = await ctx.runAction(api.garmin.public.syncAllTypes, {
|
|
200
|
+
accessToken: tokenResult.access_token,
|
|
213
201
|
connectionId,
|
|
214
202
|
userId: pending.userId,
|
|
215
|
-
timeRange,
|
|
203
|
+
uploadStartTimeInSeconds: timeRange.uploadStartTimeInSeconds,
|
|
204
|
+
uploadEndTimeInSeconds: timeRange.uploadEndTimeInSeconds,
|
|
216
205
|
});
|
|
217
206
|
const _updated = await ctx.runMutation(api.public.updateConnection, {
|
|
218
207
|
connectionId,
|
|
@@ -276,10 +265,11 @@ export const syncGarmin = action({
|
|
|
276
265
|
expiresAt: newExpiresAt,
|
|
277
266
|
});
|
|
278
267
|
}
|
|
279
|
-
const client = new GarminClient({ accessToken });
|
|
280
268
|
// Lazy backfill: resolve Garmin user ID if missing (for webhook mapping)
|
|
281
269
|
if (!connection.providerUserId) {
|
|
282
|
-
const
|
|
270
|
+
const wellnessClient = createWellnessClient(accessToken);
|
|
271
|
+
const { data: userIdData } = await sdkUserId({ client: wellnessClient });
|
|
272
|
+
const garminUserId = userIdData?.userId ?? null;
|
|
283
273
|
if (garminUserId) {
|
|
284
274
|
const _updated = await ctx.runMutation(api.public.updateConnection, {
|
|
285
275
|
connectionId,
|
|
@@ -292,10 +282,12 @@ export const syncGarmin = action({
|
|
|
292
282
|
uploadStartTimeInSeconds: args.startTimeInSeconds ?? now - DEFAULT_SYNC_DAYS * 86400,
|
|
293
283
|
uploadEndTimeInSeconds: args.endTimeInSeconds ?? now,
|
|
294
284
|
};
|
|
295
|
-
const result = await syncAllTypes
|
|
285
|
+
const result = await ctx.runAction(api.garmin.public.syncAllTypes, {
|
|
286
|
+
accessToken,
|
|
296
287
|
connectionId,
|
|
297
288
|
userId: args.userId,
|
|
298
|
-
timeRange,
|
|
289
|
+
uploadStartTimeInSeconds: timeRange.uploadStartTimeInSeconds,
|
|
290
|
+
uploadEndTimeInSeconds: timeRange.uploadEndTimeInSeconds,
|
|
299
291
|
});
|
|
300
292
|
const _updated = await ctx.runMutation(api.public.updateConnection, {
|
|
301
293
|
connectionId,
|
|
@@ -326,8 +318,8 @@ export const disconnectGarmin = action({
|
|
|
326
318
|
});
|
|
327
319
|
if (tokenDoc) {
|
|
328
320
|
try {
|
|
329
|
-
const
|
|
330
|
-
await client
|
|
321
|
+
const wellnessClient = createWellnessClient(tokenDoc.accessToken);
|
|
322
|
+
await sdkDereg({ client: wellnessClient });
|
|
331
323
|
}
|
|
332
324
|
catch {
|
|
333
325
|
// Deregistration is best-effort; proceed with local cleanup
|
|
@@ -407,16 +399,28 @@ export const pushPlannedWorkout = action({
|
|
|
407
399
|
}
|
|
408
400
|
const providerName = args.workoutProvider ?? "Soma";
|
|
409
401
|
const garminWorkout = transformPlannedWorkoutToGarmin(plannedWorkout, providerName);
|
|
410
|
-
const
|
|
411
|
-
const created = await
|
|
402
|
+
const trainingClient = createTrainingClient(accessToken);
|
|
403
|
+
const { data: created, error: createError } = await sdkCreateWorkoutV2({
|
|
404
|
+
client: trainingClient,
|
|
405
|
+
body: garminWorkout,
|
|
406
|
+
});
|
|
407
|
+
if (createError || !created) {
|
|
408
|
+
throw new Error(`Garmin API error creating workout: ${createError ? JSON.stringify(createError) : "No data"}`);
|
|
409
|
+
}
|
|
412
410
|
if (!created.workoutId) {
|
|
413
411
|
throw new Error("Garmin API did not return a workoutId after creation.");
|
|
414
412
|
}
|
|
415
413
|
let garminScheduleId = null;
|
|
416
414
|
const plannedDate = plannedWorkout.metadata?.planned_date;
|
|
417
415
|
if (plannedDate) {
|
|
418
|
-
const
|
|
419
|
-
|
|
416
|
+
const { data: scheduleId, error: scheduleError } = await sdkCreateWorkoutSchedule({
|
|
417
|
+
client: trainingClient,
|
|
418
|
+
body: { workoutId: Number(created.workoutId), date: plannedDate },
|
|
419
|
+
});
|
|
420
|
+
if (scheduleError) {
|
|
421
|
+
throw new Error(`Garmin API error creating schedule: ${JSON.stringify(scheduleError)}`);
|
|
422
|
+
}
|
|
423
|
+
garminScheduleId = scheduleId ?? null;
|
|
420
424
|
}
|
|
421
425
|
// Store the Garmin workout/schedule IDs back on the planned workout
|
|
422
426
|
// so the host app can match completed activities to planned sessions.
|
|
@@ -436,352 +440,384 @@ export const pushPlannedWorkout = action({
|
|
|
436
440
|
};
|
|
437
441
|
},
|
|
438
442
|
});
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
443
|
+
// ─── Sync Engine ────────────────────────────────────────────────────────────
|
|
444
|
+
/**
|
|
445
|
+
* Fetch and ingest all Garmin wellness data types for a time range.
|
|
446
|
+
*
|
|
447
|
+
* Called by the public actions (connectGarmin, completeGarminOAuth, syncGarmin)
|
|
448
|
+
* after obtaining a valid access token.
|
|
449
|
+
*/
|
|
450
|
+
export const syncAllTypes = action({
|
|
451
|
+
args: {
|
|
452
|
+
accessToken: v.string(),
|
|
453
|
+
connectionId: v.id("connections"),
|
|
454
|
+
userId: v.string(),
|
|
455
|
+
uploadStartTimeInSeconds: v.number(),
|
|
456
|
+
uploadEndTimeInSeconds: v.number(),
|
|
457
|
+
},
|
|
458
|
+
handler: async (ctx, args) => {
|
|
459
|
+
const { accessToken, connectionId, userId } = args;
|
|
460
|
+
const timeRange = {
|
|
461
|
+
uploadStartTimeInSeconds: args.uploadStartTimeInSeconds,
|
|
462
|
+
uploadEndTimeInSeconds: args.uploadEndTimeInSeconds,
|
|
463
|
+
};
|
|
464
|
+
const wellnessClient = createWellnessClient(accessToken);
|
|
465
|
+
const query = timeRangeQuery(timeRange, accessToken);
|
|
466
|
+
const synced = {
|
|
467
|
+
activities: 0, dailies: 0, sleep: 0, body: 0, menstruation: 0,
|
|
468
|
+
bloodPressures: 0, skinTemp: 0, userMetrics: 0,
|
|
469
|
+
hrv: 0, stressDetails: 0, pulseOx: 0, respiration: 0,
|
|
470
|
+
};
|
|
471
|
+
const errors = [];
|
|
472
|
+
// ── Activities ──────────────────────────────────────────────────────────
|
|
473
|
+
try {
|
|
474
|
+
const { data: activities, error } = await getActivities({ client: wellnessClient, query });
|
|
475
|
+
if (error || !activities)
|
|
476
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
477
|
+
for (const activity of activities) {
|
|
478
|
+
try {
|
|
479
|
+
const data = transformActivity(activity);
|
|
480
|
+
await ctx.runMutation(api.public.ingestActivity, {
|
|
481
|
+
connectionId,
|
|
482
|
+
userId,
|
|
483
|
+
...data,
|
|
484
|
+
});
|
|
485
|
+
synced.activities++;
|
|
486
|
+
}
|
|
487
|
+
catch (err) {
|
|
488
|
+
errors.push({
|
|
489
|
+
type: "activity",
|
|
490
|
+
id: activity.summaryId ?? String(activity.activityId),
|
|
491
|
+
error: err instanceof Error ? err.message : String(err),
|
|
492
|
+
});
|
|
493
|
+
}
|
|
466
494
|
}
|
|
467
495
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
});
|
|
475
|
-
}
|
|
476
|
-
// ── Dailies ─────────────────────────────────────────────────────────────
|
|
477
|
-
try {
|
|
478
|
-
const dailies = await client.getDailies(timeRange);
|
|
479
|
-
for (const daily of dailies) {
|
|
480
|
-
try {
|
|
481
|
-
const data = transformDaily(daily);
|
|
482
|
-
await ctx.runMutation(api.public.ingestDaily, {
|
|
483
|
-
connectionId,
|
|
484
|
-
userId,
|
|
485
|
-
...data,
|
|
486
|
-
});
|
|
487
|
-
synced.dailies++;
|
|
488
|
-
}
|
|
489
|
-
catch (err) {
|
|
490
|
-
errors.push({
|
|
491
|
-
type: "daily",
|
|
492
|
-
id: daily.summaryId ?? daily.calendarDate ?? "unknown",
|
|
493
|
-
error: err instanceof Error ? err.message : String(err),
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
+
catch (err) {
|
|
497
|
+
errors.push({
|
|
498
|
+
type: "activity",
|
|
499
|
+
id: "fetch",
|
|
500
|
+
error: err instanceof Error ? err.message : String(err),
|
|
501
|
+
});
|
|
496
502
|
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
id: sleep.summaryId ?? sleep.calendarDate ?? "unknown",
|
|
522
|
-
error: err instanceof Error ? err.message : String(err),
|
|
523
|
-
});
|
|
503
|
+
// ── Dailies ─────────────────────────────────────────────────────────────
|
|
504
|
+
try {
|
|
505
|
+
const { data: dailies, error } = await getDailies({ client: wellnessClient, query });
|
|
506
|
+
if (error || !dailies)
|
|
507
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
508
|
+
for (const daily of dailies) {
|
|
509
|
+
try {
|
|
510
|
+
const data = transformDailies(daily);
|
|
511
|
+
if (!data)
|
|
512
|
+
continue;
|
|
513
|
+
await ctx.runMutation(api.public.ingestDaily, {
|
|
514
|
+
connectionId,
|
|
515
|
+
userId,
|
|
516
|
+
...data,
|
|
517
|
+
});
|
|
518
|
+
synced.dailies++;
|
|
519
|
+
}
|
|
520
|
+
catch (err) {
|
|
521
|
+
errors.push({
|
|
522
|
+
type: "daily",
|
|
523
|
+
id: daily.summaryId ?? daily.calendarDate ?? "unknown",
|
|
524
|
+
error: err instanceof Error ? err.message : String(err),
|
|
525
|
+
});
|
|
526
|
+
}
|
|
524
527
|
}
|
|
525
528
|
}
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
// ── Body ────────────────────────────────────────────────────────────────
|
|
535
|
-
try {
|
|
536
|
-
const bodyComps = await client.getBodyCompositions(timeRange);
|
|
537
|
-
for (const body of bodyComps) {
|
|
538
|
-
try {
|
|
539
|
-
const data = transformBody(body);
|
|
540
|
-
await ctx.runMutation(api.public.ingestBody, {
|
|
541
|
-
connectionId,
|
|
542
|
-
userId,
|
|
543
|
-
...data,
|
|
544
|
-
});
|
|
545
|
-
synced.body++;
|
|
546
|
-
}
|
|
547
|
-
catch (err) {
|
|
548
|
-
errors.push({
|
|
549
|
-
type: "body",
|
|
550
|
-
id: body.summaryId ?? String(body.measurementTimeInSeconds),
|
|
551
|
-
error: err instanceof Error ? err.message : String(err),
|
|
552
|
-
});
|
|
553
|
-
}
|
|
529
|
+
catch (err) {
|
|
530
|
+
errors.push({
|
|
531
|
+
type: "daily",
|
|
532
|
+
id: "fetch",
|
|
533
|
+
error: err instanceof Error ? err.message : String(err),
|
|
534
|
+
});
|
|
554
535
|
}
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
errors.push({
|
|
578
|
-
type: "menstruation",
|
|
579
|
-
id: record.summaryId ?? record.periodStartDate ?? "unknown",
|
|
580
|
-
error: err instanceof Error ? err.message : String(err),
|
|
581
|
-
});
|
|
536
|
+
// ── Sleep ───────────────────────────────────────────────────────────────
|
|
537
|
+
try {
|
|
538
|
+
const { data: sleeps, error } = await getSleeps({ client: wellnessClient, query });
|
|
539
|
+
if (error || !sleeps)
|
|
540
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
541
|
+
for (const sleep of sleeps) {
|
|
542
|
+
try {
|
|
543
|
+
const data = transformSleeps(sleep);
|
|
544
|
+
await ctx.runMutation(api.public.ingestSleep, {
|
|
545
|
+
connectionId,
|
|
546
|
+
userId,
|
|
547
|
+
...data,
|
|
548
|
+
});
|
|
549
|
+
synced.sleep++;
|
|
550
|
+
}
|
|
551
|
+
catch (err) {
|
|
552
|
+
errors.push({
|
|
553
|
+
type: "sleep",
|
|
554
|
+
id: sleep.summaryId ?? sleep.calendarDate ?? "unknown",
|
|
555
|
+
error: err instanceof Error ? err.message : String(err),
|
|
556
|
+
});
|
|
557
|
+
}
|
|
582
558
|
}
|
|
583
559
|
}
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
// ── Blood Pressures (→ body) ───────────────────────────────────────────
|
|
593
|
-
try {
|
|
594
|
-
const bpRecords = await client.getBloodPressures(timeRange);
|
|
595
|
-
for (const bp of bpRecords) {
|
|
596
|
-
try {
|
|
597
|
-
const data = transformBloodPressure(bp);
|
|
598
|
-
await ctx.runMutation(api.public.ingestBody, {
|
|
599
|
-
connectionId, userId, ...data,
|
|
600
|
-
});
|
|
601
|
-
synced.bloodPressures++;
|
|
602
|
-
}
|
|
603
|
-
catch (err) {
|
|
604
|
-
errors.push({
|
|
605
|
-
type: "bloodPressure",
|
|
606
|
-
id: bp.summaryId ?? String(bp.measurementTimeInSeconds),
|
|
607
|
-
error: err instanceof Error ? err.message : String(err),
|
|
608
|
-
});
|
|
609
|
-
}
|
|
560
|
+
catch (err) {
|
|
561
|
+
errors.push({
|
|
562
|
+
type: "sleep",
|
|
563
|
+
id: "fetch",
|
|
564
|
+
error: err instanceof Error ? err.message : String(err),
|
|
565
|
+
});
|
|
610
566
|
}
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
567
|
+
// ── Body ────────────────────────────────────────────────────────────────
|
|
568
|
+
try {
|
|
569
|
+
const { data: bodyComps, error } = await getBodyComps({ client: wellnessClient, query });
|
|
570
|
+
if (error || !bodyComps)
|
|
571
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
572
|
+
for (const body of bodyComps) {
|
|
573
|
+
try {
|
|
574
|
+
const data = transformBodyComposition(body);
|
|
575
|
+
if (!data)
|
|
576
|
+
continue;
|
|
577
|
+
await ctx.runMutation(api.public.ingestBody, {
|
|
578
|
+
connectionId,
|
|
579
|
+
userId,
|
|
580
|
+
...data,
|
|
581
|
+
});
|
|
582
|
+
synced.body++;
|
|
583
|
+
}
|
|
584
|
+
catch (err) {
|
|
585
|
+
errors.push({
|
|
586
|
+
type: "body",
|
|
587
|
+
id: body.summaryId ?? String(body.measurementTimeInSeconds),
|
|
588
|
+
error: err instanceof Error ? err.message : String(err),
|
|
589
|
+
});
|
|
590
|
+
}
|
|
632
591
|
}
|
|
633
592
|
}
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
const metricsRecords = await client.getUserMetrics(timeRange);
|
|
641
|
-
for (const metrics of metricsRecords) {
|
|
642
|
-
try {
|
|
643
|
-
const data = transformUserMetrics(metrics);
|
|
644
|
-
await ctx.runMutation(api.public.ingestBody, {
|
|
645
|
-
connectionId, userId, ...data,
|
|
646
|
-
});
|
|
647
|
-
synced.userMetrics++;
|
|
648
|
-
}
|
|
649
|
-
catch (err) {
|
|
650
|
-
errors.push({
|
|
651
|
-
type: "userMetrics",
|
|
652
|
-
id: metrics.summaryId ?? metrics.calendarDate ?? "unknown",
|
|
653
|
-
error: err instanceof Error ? err.message : String(err),
|
|
654
|
-
});
|
|
655
|
-
}
|
|
593
|
+
catch (err) {
|
|
594
|
+
errors.push({
|
|
595
|
+
type: "body",
|
|
596
|
+
id: "fetch",
|
|
597
|
+
error: err instanceof Error ? err.message : String(err),
|
|
598
|
+
});
|
|
656
599
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
600
|
+
// ── Menstruation ────────────────────────────────────────────────────────
|
|
601
|
+
try {
|
|
602
|
+
const { data: records, error } = await getMct({ client: wellnessClient, query });
|
|
603
|
+
if (error || !records)
|
|
604
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
605
|
+
for (const record of records) {
|
|
606
|
+
try {
|
|
607
|
+
const data = transformMenstrualCycleTracking(record);
|
|
608
|
+
await ctx.runMutation(api.public.ingestMenstruation, {
|
|
609
|
+
connectionId,
|
|
610
|
+
userId,
|
|
611
|
+
...data,
|
|
612
|
+
});
|
|
613
|
+
synced.menstruation++;
|
|
614
|
+
}
|
|
615
|
+
catch (err) {
|
|
616
|
+
errors.push({
|
|
617
|
+
type: "menstruation",
|
|
618
|
+
id: record.summaryId ?? record.periodStartDate ?? "unknown",
|
|
619
|
+
error: err instanceof Error ? err.message : String(err),
|
|
676
620
|
});
|
|
677
|
-
synced.hrv++;
|
|
678
621
|
}
|
|
679
622
|
}
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
623
|
+
}
|
|
624
|
+
catch (err) {
|
|
625
|
+
errors.push({
|
|
626
|
+
type: "menstruation",
|
|
627
|
+
id: "fetch",
|
|
628
|
+
error: err instanceof Error ? err.message : String(err),
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
// ── Blood Pressures (→ body) ───────────────────────────────────────────
|
|
632
|
+
try {
|
|
633
|
+
const { data: bpRecords, error } = await getBloodPressures({ client: wellnessClient, query });
|
|
634
|
+
if (error || !bpRecords)
|
|
635
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
636
|
+
for (const bp of bpRecords) {
|
|
637
|
+
try {
|
|
638
|
+
const data = transformBloodPressure(bp);
|
|
639
|
+
if (!data)
|
|
640
|
+
continue;
|
|
641
|
+
await ctx.runMutation(api.public.ingestBody, {
|
|
642
|
+
connectionId, userId, ...data,
|
|
643
|
+
});
|
|
644
|
+
synced.bloodPressures++;
|
|
645
|
+
}
|
|
646
|
+
catch (err) {
|
|
647
|
+
errors.push({
|
|
648
|
+
type: "bloodPressure",
|
|
649
|
+
id: bp.summaryId ?? String(bp.measurementTimeInSeconds),
|
|
650
|
+
error: err instanceof Error ? err.message : String(err),
|
|
651
|
+
});
|
|
652
|
+
}
|
|
686
653
|
}
|
|
687
654
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
655
|
+
catch (err) {
|
|
656
|
+
errors.push({ type: "bloodPressure", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
657
|
+
}
|
|
658
|
+
// ── Skin Temperature (→ body) ──────────────────────────────────────────
|
|
659
|
+
try {
|
|
660
|
+
const { data: skinRecords, error } = await getSkinTemp({ client: wellnessClient, query });
|
|
661
|
+
if (error || !skinRecords)
|
|
662
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
663
|
+
for (const skin of skinRecords) {
|
|
664
|
+
try {
|
|
665
|
+
const data = transformSkinTemperature(skin);
|
|
666
|
+
if (!data)
|
|
667
|
+
continue;
|
|
668
|
+
await ctx.runMutation(api.public.ingestBody, {
|
|
669
|
+
connectionId, userId, ...data,
|
|
670
|
+
});
|
|
671
|
+
synced.skinTemp++;
|
|
672
|
+
}
|
|
673
|
+
catch (err) {
|
|
674
|
+
errors.push({
|
|
675
|
+
type: "skinTemp",
|
|
676
|
+
id: skin.summaryId ?? skin.calendarDate ?? "unknown",
|
|
677
|
+
error: err instanceof Error ? err.message : String(err),
|
|
707
678
|
});
|
|
708
|
-
synced.stressDetails++;
|
|
709
679
|
}
|
|
710
680
|
}
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
681
|
+
}
|
|
682
|
+
catch (err) {
|
|
683
|
+
errors.push({ type: "skinTemp", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
684
|
+
}
|
|
685
|
+
// ── User Metrics (→ body) ──────────────────────────────────────────────
|
|
686
|
+
try {
|
|
687
|
+
const { data: metricsRecords, error } = await getUserMetrics({ client: wellnessClient, query });
|
|
688
|
+
if (error || !metricsRecords)
|
|
689
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
690
|
+
for (const metrics of metricsRecords) {
|
|
691
|
+
try {
|
|
692
|
+
const data = transformUserMetrics(metrics);
|
|
693
|
+
if (!data)
|
|
694
|
+
continue;
|
|
695
|
+
await ctx.runMutation(api.public.ingestBody, {
|
|
696
|
+
connectionId, userId, ...data,
|
|
697
|
+
});
|
|
698
|
+
synced.userMetrics++;
|
|
699
|
+
}
|
|
700
|
+
catch (err) {
|
|
701
|
+
errors.push({
|
|
702
|
+
type: "userMetrics",
|
|
703
|
+
id: metrics.summaryId ?? metrics.calendarDate ?? "unknown",
|
|
704
|
+
error: err instanceof Error ? err.message : String(err),
|
|
705
|
+
});
|
|
706
|
+
}
|
|
717
707
|
}
|
|
718
708
|
}
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
709
|
+
catch (err) {
|
|
710
|
+
errors.push({ type: "userMetrics", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
711
|
+
}
|
|
712
|
+
// ── HRV (enriches daily) ──────────────────────────────────────────────
|
|
713
|
+
try {
|
|
714
|
+
const { data: hrvRecords, error } = await getHrv({ client: wellnessClient, query });
|
|
715
|
+
if (error || !hrvRecords)
|
|
716
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
717
|
+
for (const hrv of hrvRecords) {
|
|
718
|
+
try {
|
|
719
|
+
const data = transformHRVSummary(hrv);
|
|
720
|
+
if (data) {
|
|
721
|
+
await ctx.runMutation(api.public.ingestDaily, {
|
|
722
|
+
connectionId, userId, ...data,
|
|
723
|
+
});
|
|
724
|
+
synced.hrv++;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
catch (err) {
|
|
728
|
+
errors.push({
|
|
729
|
+
type: "hrv",
|
|
730
|
+
id: hrv.summaryId ?? hrv.calendarDate ?? "unknown",
|
|
731
|
+
error: err instanceof Error ? err.message : String(err),
|
|
738
732
|
});
|
|
739
|
-
synced.pulseOx++;
|
|
740
733
|
}
|
|
741
734
|
}
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
735
|
+
}
|
|
736
|
+
catch (err) {
|
|
737
|
+
errors.push({ type: "hrv", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
738
|
+
}
|
|
739
|
+
// ── Stress Details (enriches daily) ────────────────────────────────────
|
|
740
|
+
try {
|
|
741
|
+
const { data: stressRecords, error } = await getStressDetails({ client: wellnessClient, query });
|
|
742
|
+
if (error || !stressRecords)
|
|
743
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
744
|
+
for (const stress of stressRecords) {
|
|
745
|
+
try {
|
|
746
|
+
const data = transformStress(stress);
|
|
747
|
+
if (data) {
|
|
748
|
+
await ctx.runMutation(api.public.ingestDaily, {
|
|
749
|
+
connectionId, userId, ...data,
|
|
750
|
+
});
|
|
751
|
+
synced.stressDetails++;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
catch (err) {
|
|
755
|
+
errors.push({
|
|
756
|
+
type: "stressDetails",
|
|
757
|
+
id: stress.summaryId ?? stress.calendarDate ?? "unknown",
|
|
758
|
+
error: err instanceof Error ? err.message : String(err),
|
|
759
|
+
});
|
|
760
|
+
}
|
|
748
761
|
}
|
|
749
762
|
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
763
|
+
catch (err) {
|
|
764
|
+
errors.push({ type: "stressDetails", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
765
|
+
}
|
|
766
|
+
// ── Pulse Ox (enriches daily) ──────────────────────────────────────────
|
|
767
|
+
try {
|
|
768
|
+
const { data: pulseOxRecords, error } = await getPulseox({ client: wellnessClient, query });
|
|
769
|
+
if (error || !pulseOxRecords)
|
|
770
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
771
|
+
for (const po of pulseOxRecords) {
|
|
772
|
+
try {
|
|
773
|
+
const data = transformPulseOx(po);
|
|
774
|
+
if (data) {
|
|
775
|
+
await ctx.runMutation(api.public.ingestDaily, {
|
|
776
|
+
connectionId, userId, ...data,
|
|
777
|
+
});
|
|
778
|
+
synced.pulseOx++;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
catch (err) {
|
|
782
|
+
errors.push({
|
|
783
|
+
type: "pulseOx",
|
|
784
|
+
id: po.summaryId ?? po.calendarDate ?? "unknown",
|
|
785
|
+
error: err instanceof Error ? err.message : String(err),
|
|
769
786
|
});
|
|
770
|
-
synced.respiration++;
|
|
771
787
|
}
|
|
772
788
|
}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
789
|
+
}
|
|
790
|
+
catch (err) {
|
|
791
|
+
errors.push({ type: "pulseOx", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
792
|
+
}
|
|
793
|
+
// ── Respiration (enriches daily) ───────────────────────────────────────
|
|
794
|
+
try {
|
|
795
|
+
const { data: respRecords, error } = await getRespiration({ client: wellnessClient, query });
|
|
796
|
+
if (error || !respRecords)
|
|
797
|
+
throw new Error(error ? JSON.stringify(error) : "No data");
|
|
798
|
+
for (const resp of respRecords) {
|
|
799
|
+
try {
|
|
800
|
+
const data = transformRespiration(resp);
|
|
801
|
+
if (data) {
|
|
802
|
+
await ctx.runMutation(api.public.ingestDaily, {
|
|
803
|
+
connectionId, userId, ...data,
|
|
804
|
+
});
|
|
805
|
+
synced.respiration++;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
catch (err) {
|
|
809
|
+
errors.push({
|
|
810
|
+
type: "respiration",
|
|
811
|
+
id: resp.summaryId ?? "unknown",
|
|
812
|
+
error: err instanceof Error ? err.message : String(err),
|
|
813
|
+
});
|
|
814
|
+
}
|
|
779
815
|
}
|
|
780
816
|
}
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
}
|
|
817
|
+
catch (err) {
|
|
818
|
+
errors.push({ type: "respiration", id: "fetch", error: err instanceof Error ? err.message : String(err) });
|
|
819
|
+
}
|
|
820
|
+
return { synced, errors };
|
|
821
|
+
},
|
|
822
|
+
});
|
|
787
823
|
//# sourceMappingURL=public.js.map
|