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