@nativesquare/soma 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/client/index.d.ts +83 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +131 -0
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/component/_generated/component.d.ts +159 -0
  6. package/dist/component/_generated/component.d.ts.map +1 -1
  7. package/dist/component/garmin.d.ts +190 -6
  8. package/dist/component/garmin.d.ts.map +1 -1
  9. package/dist/component/garmin.js +805 -25
  10. package/dist/component/garmin.js.map +1 -1
  11. package/dist/component/private.d.ts +18 -0
  12. package/dist/component/private.d.ts.map +1 -1
  13. package/dist/component/private.js +18 -0
  14. package/dist/component/private.js.map +1 -1
  15. package/dist/component/public.d.ts +88 -42
  16. package/dist/component/public.d.ts.map +1 -1
  17. package/dist/component/public.js +12 -2
  18. package/dist/component/public.js.map +1 -1
  19. package/dist/component/schema.d.ts +87 -32
  20. package/dist/component/schema.d.ts.map +1 -1
  21. package/dist/component/schema.js +2 -1
  22. package/dist/component/schema.js.map +1 -1
  23. package/dist/component/validators/connection.d.ts +1 -0
  24. package/dist/component/validators/connection.d.ts.map +1 -1
  25. package/dist/component/validators/connection.js +2 -0
  26. package/dist/component/validators/connection.js.map +1 -1
  27. package/dist/component/validators/daily.d.ts +40 -5
  28. package/dist/component/validators/daily.d.ts.map +1 -1
  29. package/dist/component/validators/daily.js +10 -1
  30. package/dist/component/validators/daily.js.map +1 -1
  31. package/dist/component/validators/enums.d.ts +1 -1
  32. package/dist/component/validators/plannedWorkout.d.ts +5 -1
  33. package/dist/component/validators/plannedWorkout.d.ts.map +1 -1
  34. package/dist/component/validators/plannedWorkout.js +4 -0
  35. package/dist/component/validators/plannedWorkout.js.map +1 -1
  36. package/dist/component/validators/sleep.d.ts +8 -8
  37. package/dist/garmin/activity.d.ts +7 -16
  38. package/dist/garmin/activity.d.ts.map +1 -1
  39. package/dist/garmin/activity.js +17 -23
  40. package/dist/garmin/activity.js.map +1 -1
  41. package/dist/garmin/bloodPressure.d.ts +28 -0
  42. package/dist/garmin/bloodPressure.d.ts.map +1 -0
  43. package/dist/garmin/bloodPressure.js +34 -0
  44. package/dist/garmin/bloodPressure.js.map +1 -0
  45. package/dist/garmin/body.js +1 -1
  46. package/dist/garmin/body.js.map +1 -1
  47. package/dist/garmin/client.d.ts +117 -17
  48. package/dist/garmin/client.d.ts.map +1 -1
  49. package/dist/garmin/client.js +337 -43
  50. package/dist/garmin/client.js.map +1 -1
  51. package/dist/garmin/daily.d.ts.map +1 -1
  52. package/dist/garmin/daily.js +3 -3
  53. package/dist/garmin/daily.js.map +1 -1
  54. package/dist/garmin/hrv.d.ts +30 -0
  55. package/dist/garmin/hrv.d.ts.map +1 -0
  56. package/dist/garmin/hrv.js +45 -0
  57. package/dist/garmin/hrv.js.map +1 -0
  58. package/dist/garmin/index.d.ts +16 -2
  59. package/dist/garmin/index.d.ts.map +1 -1
  60. package/dist/garmin/index.js +8 -1
  61. package/dist/garmin/index.js.map +1 -1
  62. package/dist/garmin/maps/activity-type.d.ts +1 -2
  63. package/dist/garmin/maps/activity-type.d.ts.map +1 -1
  64. package/dist/garmin/maps/activity-type.js +1 -0
  65. package/dist/garmin/maps/activity-type.js.map +1 -1
  66. package/dist/garmin/menstruation.d.ts +6 -4
  67. package/dist/garmin/menstruation.d.ts.map +1 -1
  68. package/dist/garmin/menstruation.js +12 -8
  69. package/dist/garmin/menstruation.js.map +1 -1
  70. package/dist/garmin/pulseOx.d.ts +24 -0
  71. package/dist/garmin/pulseOx.d.ts.map +1 -0
  72. package/dist/garmin/pulseOx.js +33 -0
  73. package/dist/garmin/pulseOx.js.map +1 -0
  74. package/dist/garmin/respiration.d.ts +29 -0
  75. package/dist/garmin/respiration.d.ts.map +1 -0
  76. package/dist/garmin/respiration.js +42 -0
  77. package/dist/garmin/respiration.js.map +1 -0
  78. package/dist/garmin/skinTemp.d.ts +27 -0
  79. package/dist/garmin/skinTemp.d.ts.map +1 -0
  80. package/dist/garmin/skinTemp.js +35 -0
  81. package/dist/garmin/skinTemp.js.map +1 -0
  82. package/dist/garmin/sleep.d.ts +4 -4
  83. package/dist/garmin/sleep.d.ts.map +1 -1
  84. package/dist/garmin/sleep.js +15 -9
  85. package/dist/garmin/sleep.js.map +1 -1
  86. package/dist/garmin/stressDetails.d.ts +30 -0
  87. package/dist/garmin/stressDetails.d.ts.map +1 -0
  88. package/dist/garmin/stressDetails.js +49 -0
  89. package/dist/garmin/stressDetails.js.map +1 -0
  90. package/dist/garmin/sync.d.ts +14 -0
  91. package/dist/garmin/sync.d.ts.map +1 -1
  92. package/dist/garmin/sync.js +287 -5
  93. package/dist/garmin/sync.js.map +1 -1
  94. package/dist/garmin/types.d.ts +77 -186
  95. package/dist/garmin/types.d.ts.map +1 -1
  96. package/dist/garmin/types.js +4 -2
  97. package/dist/garmin/types.js.map +1 -1
  98. package/dist/garmin/userMetrics.d.ts +23 -0
  99. package/dist/garmin/userMetrics.d.ts.map +1 -0
  100. package/dist/garmin/userMetrics.js +41 -0
  101. package/dist/garmin/userMetrics.js.map +1 -0
  102. package/dist/validators.d.ts +107 -28
  103. package/dist/validators.d.ts.map +1 -1
  104. package/package.json +133 -124
  105. package/src/client/index.ts +199 -0
  106. package/src/component/_generated/component.ts +161 -2
  107. package/src/component/garmin.ts +898 -26
  108. package/src/component/private.ts +21 -0
  109. package/src/component/public.ts +11 -2
  110. package/src/component/schema.ts +2 -1
  111. package/src/component/validators/connection.ts +2 -0
  112. package/src/component/validators/daily.ts +15 -0
  113. package/src/component/validators/plannedWorkout.ts +4 -0
  114. package/src/garmin/activity.test.ts +13 -21
  115. package/src/garmin/activity.ts +38 -45
  116. package/src/garmin/bloodPressure.ts +41 -0
  117. package/src/garmin/body.ts +1 -1
  118. package/src/garmin/client.ts +550 -71
  119. package/src/garmin/daily.ts +8 -4
  120. package/src/garmin/hrv.ts +57 -0
  121. package/src/garmin/index.ts +77 -7
  122. package/src/garmin/maps/activity-type.ts +2 -2
  123. package/src/garmin/menstruation.ts +14 -12
  124. package/src/garmin/pulseOx.ts +45 -0
  125. package/src/garmin/respiration.ts +55 -0
  126. package/src/garmin/skinTemp.ts +42 -0
  127. package/src/garmin/sleep.test.ts +5 -6
  128. package/src/garmin/sleep.ts +22 -16
  129. package/src/garmin/spec/wellness-api.json +1 -0
  130. package/src/garmin/stressDetails.ts +71 -0
  131. package/src/garmin/sync.ts +348 -5
  132. package/src/garmin/types.ts +88 -300
  133. package/src/garmin/userMetrics.ts +50 -0
  134. package/src/garmin/wellness-api.d.ts +5637 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hrv.js","sourceRoot":"","sources":["../../src/garmin/hrv.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAMlF;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,GAAqB;IAChD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAE5D,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,IAAI,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC;IAC7E,MAAM,UAAU,GACd,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjE,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO;YACL,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,eAAe,EAAE,SAAS;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,SAAS,EAAE,IAAI,IAAI,CACjB,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC,WAAW,EAAE;YACf,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACL,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,YAAY;QAC/B,eAAe,EAAE;YACf,OAAO,EAAE,UAAU;gBACjB,CAAC,CAAC;oBACE,aAAa,EAAE,GAAG,CAAC,YAAY;oBAC/B,aAAa,EAAE,GAAG,CAAC,iBAAiB;iBACrC;gBACH,CAAC,CAAC,SAAS;YACb,QAAQ,EACN,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBACjC,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE;gBACnC,CAAC,CAAC,SAAS;SAChB;KACF,CAAC;AACJ,CAAC"}
@@ -8,13 +8,27 @@ export { transformBody } from "./body.js";
8
8
  export type { BodyData } from "./body.js";
9
9
  export { transformMenstruation } from "./menstruation.js";
10
10
  export type { MenstruationData } from "./menstruation.js";
11
+ export { transformBloodPressure } from "./bloodPressure.js";
12
+ export type { BloodPressureData } from "./bloodPressure.js";
13
+ export { transformSkinTemp } from "./skinTemp.js";
14
+ export type { SkinTempData } from "./skinTemp.js";
15
+ export { transformUserMetrics } from "./userMetrics.js";
16
+ export type { UserMetricsData } from "./userMetrics.js";
17
+ export { transformHRV } from "./hrv.js";
18
+ export type { HRVData } from "./hrv.js";
19
+ export { transformStressDetails } from "./stressDetails.js";
20
+ export type { StressDetailsData } from "./stressDetails.js";
21
+ export { transformPulseOx } from "./pulseOx.js";
22
+ export type { PulseOxData } from "./pulseOx.js";
23
+ export { transformRespiration } from "./respiration.js";
24
+ export type { RespirationData } from "./respiration.js";
11
25
  export { mapActivityType } from "./maps/activity-type.js";
12
26
  export { mapSleepLevel } from "./maps/sleep-level.js";
13
27
  export { GarminClient, GarminApiError } from "./client.js";
14
28
  export type { GarminClientOptions, TimeRangeParams } from "./client.js";
15
29
  export { generateCodeVerifier, generateCodeChallenge, generateState, buildAuthUrl, exchangeCode, refreshToken, } from "./auth.js";
16
30
  export type { BuildAuthUrlOptions, ExchangeCodeOptions, RefreshTokenOptions, } from "./auth.js";
17
- export { syncAll, syncActivities, syncDailies, syncSleep, syncBody, syncMenstruation, } from "./sync.js";
31
+ export { syncAll, syncActivities, syncDailies, syncSleep, syncBody, syncMenstruation, syncBloodPressures, syncSkinTemp, syncUserMetrics, syncHRV, syncStressDetails, syncPulseOx, syncRespiration, } from "./sync.js";
18
32
  export type { SyncOptions, SyncResult, SyncAllResult, } from "./sync.js";
19
- export type { GarminActivity, GarminActivityLap, GarminActivitySample, GarminDailySummary, GarminSleep, GarminSleepLevel, GarminBodyComposition, GarminMenstrualCycleData, GarminUserProfile, GarminActivityType, GarminOAuth2TokenResponse, GarminWebhookPayload, } from "./types.js";
33
+ export type { GarminActivity, GarminActivityDetail, GarminDaily, GarminSleep, GarminBodyComposition, GarminMenstrualCycle, GarminUserMetrics, GarminStressDetail, GarminSkinTemperature, GarminRespiration, GarminPulseOx, GarminHRVSummary, GarminHealthSnapshot, GarminEpoch, GarminBloodPressure, GarminMoveIQEvent, GarminSolar, GarminSample, GarminLap, GarminTimeRange, GarminSleepScoreItem, GarminNap, GarminDailyExtended, GarminSleepExtended, GarminActivityExtended, GarminDailySummary, GarminMenstrualCycleData, GarminSleepLevel, GarminActivityLap, GarminActivitySample, GarminWorkout, GarminWorkoutStep, GarminWorkoutRepeatStep, GarminWorkoutSegment, GarminWorkoutSchedule, GarminWorkoutSport, GarminOAuth2TokenResponse, GarminWebhookActivityPayload, GarminWebhookDailyPayload, GarminWebhookSleepPayload, GarminWebhookBodyPayload, GarminWebhookBloodPressurePayload, GarminWebhookSkinTempPayload, GarminWebhookUserMetricsPayload, GarminWebhookHRVPayload, GarminWebhookStressDetailPayload, GarminWebhookPulseOxPayload, GarminWebhookRespirationPayload, } from "./types.js";
20
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/garmin/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGxE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,OAAO,EACP,cAAc,EACd,WAAW,EACX,SAAS,EACT,QAAQ,EACR,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/garmin/index.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,13 @@ export { transformDaily } from "./daily.js";
9
9
  export { transformSleep } from "./sleep.js";
10
10
  export { transformBody } from "./body.js";
11
11
  export { transformMenstruation } from "./menstruation.js";
12
+ export { transformBloodPressure } from "./bloodPressure.js";
13
+ export { transformSkinTemp } from "./skinTemp.js";
14
+ export { transformUserMetrics } from "./userMetrics.js";
15
+ export { transformHRV } from "./hrv.js";
16
+ export { transformStressDetails } from "./stressDetails.js";
17
+ export { transformPulseOx } from "./pulseOx.js";
18
+ export { transformRespiration } from "./respiration.js";
12
19
  // ── Enum Maps ────────────────────────────────────────────────────────────────
13
20
  export { mapActivityType } from "./maps/activity-type.js";
14
21
  export { mapSleepLevel } from "./maps/sleep-level.js";
@@ -17,5 +24,5 @@ export { GarminClient, GarminApiError } from "./client.js";
17
24
  // ── OAuth 2.0 PKCE Helpers ───────────────────────────────────────────────────
18
25
  export { generateCodeVerifier, generateCodeChallenge, generateState, buildAuthUrl, exchangeCode, refreshToken, } from "./auth.js";
19
26
  // ── Sync Helpers ─────────────────────────────────────────────────────────────
20
- export { syncAll, syncActivities, syncDailies, syncSleep, syncBody, syncMenstruation, } from "./sync.js";
27
+ export { syncAll, syncActivities, syncDailies, syncSleep, syncBody, syncMenstruation, syncBloodPressures, syncSkinTemp, syncUserMetrics, syncHRV, syncStressDetails, syncPulseOx, syncRespiration, } from "./sync.js";
21
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/garmin/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8FAA8F;AAC9F,EAAE;AACF,8DAA8D;AAC9D,uEAAuE;AAEvE,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,gFAAgF;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,gFAAgF;AAChF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG3D,gFAAgF;AAChF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,WAAW,CAAC;AAOnB,gFAAgF;AAChF,OAAO,EACL,OAAO,EACP,cAAc,EACd,WAAW,EACX,SAAS,EACT,QAAQ,EACR,gBAAgB,GACjB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/garmin/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8FAA8F;AAC9F,EAAE;AACF,8DAA8D;AAC9D,uEAAuE;AAEvE,gFAAgF;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,gFAAgF;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,gFAAgF;AAChF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG3D,gFAAgF;AAChF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,WAAW,CAAC;AAOnB,gFAAgF;AAChF,OAAO,EACL,OAAO,EACP,cAAc,EACd,WAAW,EACX,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,WAAW,CAAC"}
@@ -1,7 +1,6 @@
1
- import type { GarminActivityType } from "../types.js";
2
1
  /**
3
2
  * Map a Garmin activity type string to the Terra ActivityType enum.
4
3
  * Returns Terra "Other" (108) for unknown types.
5
4
  */
6
- export declare function mapActivityType(activityType: GarminActivityType): number;
5
+ export declare function mapActivityType(activityType: string): number;
7
6
  //# sourceMappingURL=activity-type.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-type.d.ts","sourceRoot":"","sources":["../../../src/garmin/maps/activity-type.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsGtD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,CAExE"}
1
+ {"version":3,"file":"activity-type.d.ts","sourceRoot":"","sources":["../../../src/garmin/maps/activity-type.ts"],"names":[],"mappings":"AA6GA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -4,6 +4,7 @@
4
4
  //
5
5
  // Garmin values: Garmin Health API activity type strings
6
6
  // Terra values: https://docs.tryterra.co/reference/health-and-fitness-api/data-models#activitytype
7
+ // Garmin activityType is a free-form string in the spec
7
8
  const activityTypeMap = {
8
9
  // ── Running ─────────────────────────────────────────────────────────────
9
10
  // Terra Running = 8
@@ -1 +1 @@
1
- {"version":3,"file":"activity-type.js","sourceRoot":"","sources":["../../../src/garmin/maps/activity-type.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,yEAAyE;AACzE,2BAA2B;AAC3B,EAAE;AACF,yDAAyD;AACzD,oGAAoG;AAIpG,MAAM,eAAe,GAA2B;IAC9C,2EAA2E;IAC3E,oBAAoB;IACpB,OAAO,EAAE,CAAC;IACV,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC;IAChB,iBAAiB,EAAE,CAAC;IAEpB,2EAA2E;IAC3E,mBAAmB;IACnB,OAAO,EAAE,CAAC;IACV,cAAc,EAAE,CAAC;IACjB,eAAe,EAAE,CAAC;IAClB,cAAc,EAAE,CAAC;IACjB,YAAY,EAAE,CAAC;IAEf,2EAA2E;IAC3E,oBAAoB;IACpB,OAAO,EAAE,CAAC;IAEV,2EAA2E;IAC3E,oBAAoB;IACpB,MAAM,EAAE,EAAE;IAEV,2EAA2E;IAC3E,sBAAsB;IACtB,QAAQ,EAAE,EAAE;IACZ,mBAAmB,EAAE,EAAE;IACvB,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IAEjB,2EAA2E;IAC3E,iBAAiB,EAAE,EAAE,EAAG,0BAA0B;IAClD,IAAI,EAAE,GAAG,EAAe,aAAa;IACrC,OAAO,EAAE,EAAE,EAAa,gBAAgB;IACxC,MAAM,EAAE,GAAG,EAAa,cAAc;IACtC,UAAU,EAAE,EAAE,EAAU,mBAAmB;IAC3C,cAAc,EAAE,EAAE,EAAM,+BAA+B;IACvD,QAAQ,EAAE,GAAG,EAAW,iBAAiB;IACzC,IAAI,EAAE,GAAG,EAAe,aAAa;IACrC,iBAAiB,EAAE,GAAG,EAAE,cAAc;IACtC,UAAU,EAAE,GAAG,EAAS,cAAc;IAEtC,2EAA2E;IAC3E,oBAAoB,EAAE,EAAE,EAAE,6BAA6B;IACvD,aAAa,EAAE,EAAE,EAAS,sBAAsB;IAChD,YAAY,EAAE,EAAE,EAAU,qBAAqB;IAC/C,WAAW,EAAE,EAAE,EAAW,oBAAoB;IAE9C,2EAA2E;IAC3E,MAAM,EAAE,EAAE,EAAY,eAAe;IACrC,aAAa,EAAE,EAAE,EAAK,eAAe;IACrC,QAAQ,EAAE,EAAE,EAAU,iBAAiB;IACvC,QAAQ,EAAE,EAAE,EAAU,iBAAiB;IACvC,OAAO,EAAE,EAAE,EAAW,gBAAgB;IACtC,OAAO,EAAE,EAAE,EAAW,gBAAgB;IACtC,WAAW,EAAE,EAAE,EAAO,oBAAoB;IAC1C,WAAW,EAAE,EAAE,EAAO,oBAAoB;IAC1C,cAAc,EAAE,GAAG,EAAG,iBAAiB;IAEvC,2EAA2E;IAC3E,OAAO,EAAE,EAAE,EAAS,gBAAgB;IACpC,cAAc,EAAE,EAAE,EAAE,gBAAgB;IAEpC,2EAA2E;IAC3E,MAAM,EAAE,EAAE,EAAQ,eAAe;IACjC,YAAY,EAAE,EAAE,EAAE,qBAAqB;IACvC,SAAS,EAAE,EAAE,EAAK,kBAAkB;IACpC,WAAW,EAAE,EAAE,EAAG,oBAAoB;IACtC,MAAM,EAAE,EAAE,EAAQ,eAAe;IAEjC,2EAA2E;IAC3E,aAAa,EAAE,EAAE,EAAE,sBAAsB;IACzC,UAAU,EAAE,EAAE,EAAK,sBAAsB;IAEzC,2EAA2E;IAC3E,MAAM,EAAE,EAAE,EAAQ,yBAAyB;IAC3C,UAAU,EAAE,EAAE,EAAI,mBAAmB;IACrC,UAAU,EAAE,EAAE,EAAI,mBAAmB;IACrC,OAAO,EAAE,EAAE,EAAO,gBAAgB;IAClC,KAAK,EAAE,EAAE,EAAS,cAAc;IAEhC,2EAA2E;IAC3E,MAAM,EAAE,EAAE,EAAS,eAAe;IAClC,YAAY,EAAE,EAAE,EAAG,qBAAqB;IAExC,2EAA2E;IAC3E,IAAI,EAAE,EAAE,EAAE,aAAa;IAEvB,2EAA2E;IAC3E,WAAW,EAAE,EAAE,EAAa,mBAAmB;IAC/C,uBAAuB,EAAE,EAAE,EAAE,mBAAmB;IAChD,uBAAuB,EAAE,EAAE,EAAE,mBAAmB;IAEhD,2EAA2E;IAC3E,KAAK,EAAE,GAAG,EAAS,cAAc;IACjC,WAAW,EAAE,GAAG,EAAG,cAAc;IACjC,cAAc,EAAE,EAAE,EAAE,+BAA+B;CACpD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,YAAgC;IAC9D,OAAO,eAAe,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"activity-type.js","sourceRoot":"","sources":["../../../src/garmin/maps/activity-type.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { GarminMenstrualCycleData } from "./types.js";
1
+ import type { GarminMenstrualCycle } from "./types.js";
2
2
  export type MenstruationData = ReturnType<typeof transformMenstruation>;
3
3
  /**
4
4
  * Transform a Garmin menstrual cycle record into a Soma Menstruation document shape.
@@ -6,17 +6,19 @@ export type MenstruationData = ReturnType<typeof transformMenstruation>;
6
6
  * @param data - The Garmin menstrual cycle data from the Health API
7
7
  * @returns Soma Menstruation fields (without connectionId/userId)
8
8
  */
9
- export declare function transformMenstruation(data: GarminMenstrualCycleData): {
9
+ export declare function transformMenstruation(data: GarminMenstrualCycle): {
10
10
  metadata: {
11
- start_time: string;
12
- end_time: string;
11
+ start_time: string | undefined;
12
+ end_time: string | undefined;
13
13
  };
14
14
  menstruation_data: {
15
15
  day_in_cycle: number | undefined;
16
16
  current_phase: string | undefined;
17
17
  length_of_current_phase_days: number | undefined;
18
+ days_until_next_phase: number | undefined;
18
19
  period_length_days: number | undefined;
19
20
  predicted_cycle_length_days: number | undefined;
21
+ cycle_length_days: number | undefined;
20
22
  is_predicted_cycle: string | undefined;
21
23
  };
22
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"menstruation.d.ts","sourceRoot":"","sources":["../../src/garmin/menstruation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;EA4BnE"}
1
+ {"version":3,"file":"menstruation.d.ts","sourceRoot":"","sources":["../../src/garmin/menstruation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB;;;;;;;;;;;;;;;EA8B/D"}
@@ -7,13 +7,14 @@
7
7
  * @returns Soma Menstruation fields (without connectionId/userId)
8
8
  */
9
9
  export function transformMenstruation(data) {
10
- const dateStr = data.calendarDate;
11
- const startTime = data.startTimeInSeconds
12
- ? new Date(data.startTimeInSeconds * 1000).toISOString()
13
- : `${dateStr}T00:00:00.000Z`;
14
- const endTime = data.startTimeInSeconds
15
- ? new Date((data.startTimeInSeconds + 86400) * 1000).toISOString()
16
- : `${dateStr}T23:59:59.999Z`;
10
+ // Spec uses periodStartDate (date string like "2021-01-04")
11
+ const dateStr = data.periodStartDate;
12
+ const startTime = dateStr
13
+ ? `${dateStr}T00:00:00.000Z`
14
+ : undefined;
15
+ const endTime = dateStr
16
+ ? `${dateStr}T23:59:59.999Z`
17
+ : undefined;
17
18
  return {
18
19
  metadata: {
19
20
  start_time: startTime,
@@ -21,10 +22,13 @@ export function transformMenstruation(data) {
21
22
  },
22
23
  menstruation_data: {
23
24
  day_in_cycle: data.dayInCycle,
24
- current_phase: data.currentPhase?.toLowerCase(),
25
+ // Spec has currentPhaseType (string) replacing deprecated currentPhase (int)
26
+ current_phase: data.currentPhaseType?.toLowerCase(),
25
27
  length_of_current_phase_days: data.lengthOfCurrentPhase,
28
+ days_until_next_phase: data.daysUntilNextPhase,
26
29
  period_length_days: data.periodLength,
27
30
  predicted_cycle_length_days: data.predictedCycleLength,
31
+ cycle_length_days: data.cycleLength,
28
32
  is_predicted_cycle: data.isPredictedCycle != null
29
33
  ? String(data.isPredictedCycle)
30
34
  : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"menstruation.js","sourceRoot":"","sources":["../../src/garmin/menstruation.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAMlF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA8B;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB;QACvC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QACxD,CAAC,CAAC,GAAG,OAAO,gBAAgB,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB;QACrC,CAAC,CAAC,IAAI,IAAI,CACN,CAAC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,GAAG,IAAI,CACzC,CAAC,WAAW,EAAE;QACjB,CAAC,CAAC,GAAG,OAAO,gBAAgB,CAAC;IAE/B,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;SAClB;QAED,iBAAiB,EAAE;YACjB,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;YAC/C,4BAA4B,EAAE,IAAI,CAAC,oBAAoB;YACvD,kBAAkB,EAAE,IAAI,CAAC,YAAY;YACrC,2BAA2B,EAAE,IAAI,CAAC,oBAAoB;YACtD,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAC/C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC/B,CAAC,CAAC,SAAS;SACd;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"menstruation.js","sourceRoot":"","sources":["../../src/garmin/menstruation.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAMlF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA0B;IAC9D,4DAA4D;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO;QACvB,CAAC,CAAC,GAAG,OAAO,gBAAgB;QAC5B,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,GAAG,OAAO,gBAAgB;QAC5B,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;SAClB;QAED,iBAAiB,EAAE;YACjB,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,6EAA6E;YAC7E,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE;YACnD,4BAA4B,EAAE,IAAI,CAAC,oBAAoB;YACvD,qBAAqB,EAAE,IAAI,CAAC,kBAAkB;YAC9C,kBAAkB,EAAE,IAAI,CAAC,YAAY;YACrC,2BAA2B,EAAE,IAAI,CAAC,oBAAoB;YACtD,iBAAiB,EAAE,IAAI,CAAC,WAAW;YACnC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAC/C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC/B,CAAC,CAAC,SAAS;SACd;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { GarminPulseOx } from "./types.js";
2
+ export type PulseOxData = ReturnType<typeof transformPulseOx>;
3
+ /**
4
+ * Transform a Garmin pulse ox record into oxygen data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param pulseOx - The Garmin pulse ox data from the Health API
10
+ * @returns Partial Soma Daily oxygen_data fields
11
+ */
12
+ export declare function transformPulseOx(pulseOx: GarminPulseOx): {
13
+ calendar_date: string | undefined;
14
+ oxygen_data: undefined;
15
+ } | {
16
+ calendar_date: string | undefined;
17
+ oxygen_data: {
18
+ saturation_samples: {
19
+ timestamp: string;
20
+ percentage: number;
21
+ }[] | undefined;
22
+ };
23
+ };
24
+ //# sourceMappingURL=pulseOx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulseOx.d.ts","sourceRoot":"","sources":["../../src/garmin/pulseOx.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa;;;;;;;;;;;EA4BtD"}
@@ -0,0 +1,33 @@
1
+ // ─── Pulse Ox Transformer ────────────────────────────────────────────────────
2
+ // Transforms Garmin pulse ox data into fields that enrich a Soma Daily record.
3
+ /**
4
+ * Transform a Garmin pulse ox record into oxygen data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param pulseOx - The Garmin pulse ox data from the Health API
10
+ * @returns Partial Soma Daily oxygen_data fields
11
+ */
12
+ export function transformPulseOx(pulseOx) {
13
+ const hasSamples = pulseOx.timeOffsetSpo2Values != null &&
14
+ Object.keys(pulseOx.timeOffsetSpo2Values).length > 0;
15
+ if (!hasSamples) {
16
+ return {
17
+ calendar_date: pulseOx.calendarDate,
18
+ oxygen_data: undefined,
19
+ };
20
+ }
21
+ const startTime = pulseOx.startTimeInSeconds ?? 0;
22
+ const samples = Object.entries(pulseOx.timeOffsetSpo2Values).map(([offset, percentage]) => ({
23
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
24
+ percentage,
25
+ }));
26
+ return {
27
+ calendar_date: pulseOx.calendarDate,
28
+ oxygen_data: {
29
+ saturation_samples: samples.length > 0 ? samples : undefined,
30
+ },
31
+ };
32
+ }
33
+ //# sourceMappingURL=pulseOx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulseOx.js","sourceRoot":"","sources":["../../src/garmin/pulseOx.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAM/E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,MAAM,UAAU,GACd,OAAO,CAAC,oBAAoB,IAAI,IAAI;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,aAAa,EAAE,OAAO,CAAC,YAAY;YACnC,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAqB,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,SAAS,EAAE,IAAI,IAAI,CACjB,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC,WAAW,EAAE;QACf,UAAU;KACX,CAAC,CACH,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,WAAW,EAAE;YACX,kBAAkB,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAC7D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { GarminRespiration } from "./types.js";
2
+ export type RespirationData = ReturnType<typeof transformRespiration>;
3
+ /**
4
+ * Transform a Garmin respiration record into respiration data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param resp - The Garmin respiration data from the Health API
10
+ * @returns Partial Soma Daily respiration_data fields
11
+ */
12
+ export declare function transformRespiration(resp: GarminRespiration): {
13
+ calendar_date: undefined;
14
+ respiration_data: undefined;
15
+ } | {
16
+ calendar_date: string;
17
+ respiration_data: {
18
+ breaths_data: {
19
+ avg_breaths_per_min: number;
20
+ min_breaths_per_min: number;
21
+ max_breaths_per_min: number;
22
+ samples: {
23
+ timestamp: string;
24
+ breaths_per_min: number;
25
+ }[] | undefined;
26
+ };
27
+ };
28
+ };
29
+ //# sourceMappingURL=respiration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respiration.d.ts","sourceRoot":"","sources":["../../src/garmin/respiration.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEtE;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB;;;;;;;;;;;;;;;;EAsC3D"}
@@ -0,0 +1,42 @@
1
+ // ─── Respiration Transformer ─────────────────────────────────────────────────
2
+ // Transforms Garmin respiration data into fields that enrich a Soma Daily record.
3
+ /**
4
+ * Transform a Garmin respiration record into respiration data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param resp - The Garmin respiration data from the Health API
10
+ * @returns Partial Soma Daily respiration_data fields
11
+ */
12
+ export function transformRespiration(resp) {
13
+ const hasSamples = resp.timeOffsetEpochToBreaths != null &&
14
+ Object.keys(resp.timeOffsetEpochToBreaths).length > 0;
15
+ if (!hasSamples) {
16
+ return {
17
+ calendar_date: undefined,
18
+ respiration_data: undefined,
19
+ };
20
+ }
21
+ const startTime = resp.startTimeInSeconds ?? 0;
22
+ const samples = Object.entries(resp.timeOffsetEpochToBreaths).map(([offset, breaths_per_min]) => ({
23
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
24
+ breaths_per_min,
25
+ }));
26
+ // Compute summary stats from samples
27
+ const values = samples.map((s) => s.breaths_per_min);
28
+ const avg = values.reduce((sum, v) => sum + v, 0) / values.length;
29
+ return {
30
+ // Respiration endpoint doesn't have calendarDate, derive from startTime
31
+ calendar_date: new Date(startTime * 1000).toISOString().split("T")[0],
32
+ respiration_data: {
33
+ breaths_data: {
34
+ avg_breaths_per_min: Math.round(avg * 10) / 10,
35
+ min_breaths_per_min: Math.min(...values),
36
+ max_breaths_per_min: Math.max(...values),
37
+ samples: samples.length > 0 ? samples : undefined,
38
+ },
39
+ },
40
+ };
41
+ }
42
+ //# sourceMappingURL=respiration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respiration.js","sourceRoot":"","sources":["../../src/garmin/respiration.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAMlF;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,UAAU,GACd,IAAI,CAAC,wBAAwB,IAAI,IAAI;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAExD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,aAAa,EAAE,SAAS;YACxB,gBAAgB,EAAE,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAyB,CAAC,CAAC,GAAG,CAChE,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,SAAS,EAAE,IAAI,IAAI,CACjB,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAC1C,CAAC,WAAW,EAAE;QACf,eAAe;KAChB,CAAC,CACH,CAAC;IAEF,qCAAqC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAElE,OAAO;QACL,wEAAwE;QACxE,aAAa,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrE,gBAAgB,EAAE;YAChB,YAAY,EAAE;gBACZ,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE;gBAC9C,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;gBACxC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;gBACxC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAClD;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { GarminSkinTemperature } from "./types.js";
2
+ export type SkinTempData = ReturnType<typeof transformSkinTemp>;
3
+ /**
4
+ * Transform a Garmin skin temperature record into a Soma Body document shape.
5
+ *
6
+ * @param skinTemp - The Garmin skin temperature data from the Health API
7
+ * @returns Soma Body fields (without connectionId/userId)
8
+ */
9
+ export declare function transformSkinTemp(skinTemp: GarminSkinTemperature): {
10
+ metadata: {
11
+ start_time: string;
12
+ end_time: string;
13
+ };
14
+ temperature_data: undefined;
15
+ } | {
16
+ metadata: {
17
+ start_time: string;
18
+ end_time: string;
19
+ };
20
+ temperature_data: {
21
+ skin_temperature_samples: {
22
+ timestamp: string;
23
+ temperature_celsius: number;
24
+ }[];
25
+ };
26
+ };
27
+ //# sourceMappingURL=skinTemp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skinTemp.d.ts","sourceRoot":"","sources":["../../src/garmin/skinTemp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,qBAAqB;;;;;;;;;;;;;;;;;EA4BhE"}
@@ -0,0 +1,35 @@
1
+ // ─── Skin Temperature Transformer ────────────────────────────────────────────
2
+ // Transforms Garmin skin temperature data into the Soma Body schema shape.
3
+ /**
4
+ * Transform a Garmin skin temperature record into a Soma Body document shape.
5
+ *
6
+ * @param skinTemp - The Garmin skin temperature data from the Health API
7
+ * @returns Soma Body fields (without connectionId/userId)
8
+ */
9
+ export function transformSkinTemp(skinTemp) {
10
+ const startMs = (skinTemp.startTimeInSeconds ?? 0) * 1000;
11
+ const endMs = startMs + (skinTemp.durationInSeconds ?? 0) * 1000;
12
+ const startTime = new Date(startMs).toISOString();
13
+ const endTime = new Date(endMs).toISOString();
14
+ if (skinTemp.avgDeviationCelsius == null) {
15
+ return {
16
+ metadata: { start_time: startTime, end_time: endTime },
17
+ temperature_data: undefined,
18
+ };
19
+ }
20
+ return {
21
+ metadata: {
22
+ start_time: startTime,
23
+ end_time: endTime,
24
+ },
25
+ temperature_data: {
26
+ skin_temperature_samples: [
27
+ {
28
+ timestamp: startTime,
29
+ temperature_celsius: skinTemp.avgDeviationCelsius,
30
+ },
31
+ ],
32
+ },
33
+ };
34
+ }
35
+ //# sourceMappingURL=skinTemp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skinTemp.js","sourceRoot":"","sources":["../../src/garmin/skinTemp.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,2EAA2E;AAM3E;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA+B;IAC/D,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9C,IAAI,QAAQ,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;QACzC,OAAO;YACL,QAAQ,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;YACtD,gBAAgB,EAAE,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO;SAClB;QAED,gBAAgB,EAAE;YAChB,wBAAwB,EAAE;gBACxB;oBACE,SAAS,EAAE,SAAS;oBACpB,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;iBAClD;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { GarminSleep } from "./types.js";
1
+ import type { GarminSleepExtended } from "./types.js";
2
2
  export type SleepData = ReturnType<typeof transformSleep>;
3
3
  /**
4
4
  * Transform a Garmin sleep session into a Soma Sleep document shape.
@@ -6,9 +6,9 @@ export type SleepData = ReturnType<typeof transformSleep>;
6
6
  * @param sleep - The Garmin sleep data from the Health API
7
7
  * @returns Soma Sleep fields (without connectionId/userId)
8
8
  */
9
- export declare function transformSleep(sleep: GarminSleep): {
9
+ export declare function transformSleep(sleep: GarminSleepExtended): {
10
10
  metadata: {
11
- summary_id: string;
11
+ summary_id: string | undefined;
12
12
  start_time: string;
13
13
  end_time: string;
14
14
  upload_type: number;
@@ -24,7 +24,7 @@ export declare function transformSleep(sleep: GarminSleep): {
24
24
  duration_awake_state_seconds: number | undefined;
25
25
  };
26
26
  other: {
27
- duration_in_bed_seconds: number;
27
+ duration_in_bed_seconds: number | undefined;
28
28
  duration_unmeasurable_sleep_seconds: number | undefined;
29
29
  };
30
30
  hypnogram_samples: {
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/garmin/sleep.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;uBAyDb,MAAM;mBAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA/BxD"}
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/garmin/sleep.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,YAAY,CAAC;AAGvE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;uBA0DrB,MAAM;mBAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA/BxD"}
@@ -8,21 +8,22 @@ import { mapSleepLevel } from "./maps/sleep-level.js";
8
8
  * @returns Soma Sleep fields (without connectionId/userId)
9
9
  */
10
10
  export function transformSleep(sleep) {
11
- const startMs = sleep.startTimeInSeconds * 1000;
12
- const endMs = startMs + sleep.durationInSeconds * 1000;
11
+ const startMs = (sleep.startTimeInSeconds ?? 0) * 1000;
12
+ const endMs = startMs + (sleep.durationInSeconds ?? 0) * 1000;
13
13
  const uploadTypeMap = {
14
14
  ENHANCED_FINAL: 2, // Automatic
15
15
  ENHANCED_TENTATIVE: 4, // Indeterminate
16
16
  AUTO_FINAL: 2, // Automatic
17
17
  AUTO_TENTATIVE: 4, // Indeterminate
18
18
  MANUAL: 1, // Manual
19
+ DEVICE: 2, // From device
19
20
  };
20
21
  return {
21
22
  metadata: {
22
23
  summary_id: sleep.summaryId,
23
24
  start_time: new Date(startMs).toISOString(),
24
25
  end_time: new Date(endMs).toISOString(),
25
- upload_type: uploadTypeMap[sleep.validation] ?? 0,
26
+ upload_type: uploadTypeMap[sleep.validation ?? ""] ?? 0,
26
27
  },
27
28
  sleep_durations_data: buildSleepDurationsData(sleep),
28
29
  heart_rate_data: buildHeartRateData(sleep),
@@ -60,6 +61,8 @@ function buildHypnogramSamples(sleep) {
60
61
  continue;
61
62
  const terraLevel = mapSleepLevel(stage);
62
63
  for (const level of levels) {
64
+ if (level.startTimeInSeconds == null)
65
+ continue;
63
66
  samples.push({
64
67
  timestamp: new Date(level.startTimeInSeconds * 1000).toISOString(),
65
68
  level: terraLevel,
@@ -74,8 +77,9 @@ function buildHeartRateData(sleep) {
74
77
  Object.keys(sleep.timeOffsetHeartRateSamples).length === 0) {
75
78
  return undefined;
76
79
  }
80
+ const startTime = sleep.startTimeInSeconds ?? 0;
77
81
  const hrSamples = Object.entries(sleep.timeOffsetHeartRateSamples).map(([offset, bpm]) => ({
78
- timestamp: new Date((sleep.startTimeInSeconds + parseInt(offset, 10)) * 1000).toISOString(),
82
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
79
83
  bpm,
80
84
  }));
81
85
  return {
@@ -86,20 +90,22 @@ function buildRespirationData(sleep) {
86
90
  const hasBreathSummary = sleep.averageRespirationInBreathsPerMinute != null;
87
91
  const hasBreathSamples = sleep.timeOffsetSleepRespiration != null &&
88
92
  Object.keys(sleep.timeOffsetSleepRespiration).length > 0;
89
- const hasSpO2Samples = sleep.timeOffsetSpo2Values != null &&
90
- Object.keys(sleep.timeOffsetSpo2Values).length > 0;
93
+ // Check both spec field (timeOffsetSleepSpo2) and extended field
94
+ const spo2Map = sleep.timeOffsetSleepSpo2 ?? sleep.timeOffsetSpo2Values;
95
+ const hasSpO2Samples = spo2Map != null && Object.keys(spo2Map).length > 0;
91
96
  if (!hasBreathSummary && !hasBreathSamples && !hasSpO2Samples) {
92
97
  return undefined;
93
98
  }
99
+ const startTime = sleep.startTimeInSeconds ?? 0;
94
100
  const breathSamples = hasBreathSamples
95
101
  ? Object.entries(sleep.timeOffsetSleepRespiration).map(([offset, rate]) => ({
96
- timestamp: new Date((sleep.startTimeInSeconds + parseInt(offset, 10)) * 1000).toISOString(),
102
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
97
103
  breaths_per_min: rate,
98
104
  }))
99
105
  : undefined;
100
106
  const spo2Samples = hasSpO2Samples
101
- ? Object.entries(sleep.timeOffsetSpo2Values).map(([offset, pct]) => ({
102
- timestamp: new Date((sleep.startTimeInSeconds + parseInt(offset, 10)) * 1000).toISOString(),
107
+ ? Object.entries(spo2Map).map(([offset, pct]) => ({
108
+ timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
103
109
  percentage: pct,
104
110
  }))
105
111
  : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/garmin/sleep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/garmin/sleep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { GarminStressDetail } from "./types.js";
2
+ export type StressDetailsData = ReturnType<typeof transformStressDetails>;
3
+ /**
4
+ * Transform a Garmin stress detail record into stress data fields for a Soma Daily.
5
+ *
6
+ * This produces a partial daily shape that can be merged into a matching
7
+ * daily record by date.
8
+ *
9
+ * @param stress - The Garmin stress detail data from the Health API
10
+ * @returns Partial Soma Daily stress_data fields
11
+ */
12
+ export declare function transformStressDetails(stress: GarminStressDetail): {
13
+ calendar_date: string | undefined;
14
+ stress_data: undefined;
15
+ } | {
16
+ calendar_date: string | undefined;
17
+ stress_data: {
18
+ avg_stress_level: number | undefined;
19
+ max_stress_level: number | undefined;
20
+ samples: {
21
+ timestamp: string;
22
+ level: number;
23
+ }[] | undefined;
24
+ body_battery_samples: {
25
+ timestamp: string;
26
+ level: number;
27
+ }[] | undefined;
28
+ };
29
+ };
30
+ //# sourceMappingURL=stressDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stressDetails.d.ts","sourceRoot":"","sources":["../../src/garmin/stressDetails.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;;;;;;;;;;;;;;;;;EAsDhE"}