@appeeky/expo-healthkit 0.1.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 (62) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +92 -0
  3. package/README.md +453 -0
  4. package/android/build.gradle +22 -0
  5. package/android/src/main/AndroidManifest.xml +74 -0
  6. package/android/src/main/java/expo/modules/healthkit/ExpoHealthKitModule.kt +228 -0
  7. package/android/src/main/java/expo/modules/healthkit/HealthConnectMapping.kt +129 -0
  8. package/android/src/main/java/expo/modules/healthkit/HealthConnectNutrition.kt +152 -0
  9. package/android/src/main/java/expo/modules/healthkit/HealthConnectRationaleActivity.kt +62 -0
  10. package/android/src/main/java/expo/modules/healthkit/HealthConnectService.kt +1054 -0
  11. package/android/src/main/java/expo/modules/healthkit/HealthConnectUnits.kt +133 -0
  12. package/android/src/main/java/expo/modules/healthkit/HealthConnectWorkouts.kt +105 -0
  13. package/android/src/main/java/expo/modules/healthkit/HealthKitExceptions.kt +30 -0
  14. package/app.plugin.js +1 -0
  15. package/build/ExpoHealthKitModule.d.ts +39 -0
  16. package/build/ExpoHealthKitModule.d.ts.map +1 -0
  17. package/build/ExpoHealthKitModule.js +35 -0
  18. package/build/ExpoHealthKitModule.js.map +1 -0
  19. package/build/ExpoHealthKitModule.web.d.ts +39 -0
  20. package/build/ExpoHealthKitModule.web.d.ts.map +1 -0
  21. package/build/ExpoHealthKitModule.web.js +105 -0
  22. package/build/ExpoHealthKitModule.web.js.map +1 -0
  23. package/build/dates.d.ts +6 -0
  24. package/build/dates.d.ts.map +1 -0
  25. package/build/dates.js +13 -0
  26. package/build/dates.js.map +1 -0
  27. package/build/errors.d.ts +9 -0
  28. package/build/errors.d.ts.map +1 -0
  29. package/build/errors.js +18 -0
  30. package/build/errors.js.map +1 -0
  31. package/build/identifiers.d.ts +418 -0
  32. package/build/identifiers.d.ts.map +1 -0
  33. package/build/identifiers.js +402 -0
  34. package/build/identifiers.js.map +1 -0
  35. package/build/index.d.ts +454 -0
  36. package/build/index.d.ts.map +1 -0
  37. package/build/index.js +418 -0
  38. package/build/index.js.map +1 -0
  39. package/build/types.d.ts +542 -0
  40. package/build/types.d.ts.map +1 -0
  41. package/build/types.js +2 -0
  42. package/build/types.js.map +1 -0
  43. package/docs/banner.jpg +0 -0
  44. package/expo-module.config.json +9 -0
  45. package/ios/ExpoHealthKit.podspec +30 -0
  46. package/ios/ExpoHealthKitModule.swift +155 -0
  47. package/ios/HealthKitAdvancedQueries.swift +458 -0
  48. package/ios/HealthKitExceptions.swift +109 -0
  49. package/ios/HealthKitIdentifiers.swift +183 -0
  50. package/ios/HealthKitRecords.swift +214 -0
  51. package/ios/HealthKitService.swift +626 -0
  52. package/ios/PrivacyInfo.xcprivacy +14 -0
  53. package/package.json +105 -0
  54. package/plugin/build/index.d.ts +30 -0
  55. package/plugin/build/index.js +138 -0
  56. package/src/ExpoHealthKitModule.ts +116 -0
  57. package/src/ExpoHealthKitModule.web.ts +140 -0
  58. package/src/dates.ts +17 -0
  59. package/src/errors.ts +22 -0
  60. package/src/identifiers.ts +494 -0
  61. package/src/index.ts +563 -0
  62. package/src/types.ts +625 -0
@@ -0,0 +1,133 @@
1
+ package expo.modules.healthkit
2
+
3
+ internal object HealthConnectUnits {
4
+ fun toRequested(canonical: Double, unit: String, kind: QuantityKind): Double {
5
+ if (unit.isEmpty()) return canonical
6
+ return when (kind) {
7
+ QuantityKind.COUNT, QuantityKind.BPM, QuantityKind.FLOORS, QuantityKind.VO2, QuantityKind.HRV -> canonical
8
+ QuantityKind.PERCENT -> if (unit == "%") canonical else canonical * 100.0
9
+ QuantityKind.MASS -> massFromKg(canonical, unit)
10
+ QuantityKind.LENGTH -> lengthFromMeters(canonical, unit)
11
+ QuantityKind.ENERGY -> energyFromKcal(canonical, unit)
12
+ QuantityKind.TEMPERATURE -> temperatureFromCelsius(canonical, unit)
13
+ QuantityKind.PRESSURE -> if (unit == "mmHg") canonical else canonical
14
+ QuantityKind.VOLUME -> volumeFromLiters(canonical, unit)
15
+ QuantityKind.GLUCOSE -> glucoseFromMgDl(canonical, unit)
16
+ }
17
+ }
18
+
19
+ fun toCanonical(value: Double, unit: String, kind: QuantityKind): Double {
20
+ if (unit.isEmpty()) return value
21
+ return when (kind) {
22
+ QuantityKind.COUNT, QuantityKind.BPM, QuantityKind.FLOORS, QuantityKind.VO2, QuantityKind.HRV -> value
23
+ QuantityKind.PERCENT -> if (unit == "%" && value > 1.0) value / 100.0 else value
24
+ QuantityKind.MASS -> massToKg(value, unit)
25
+ QuantityKind.LENGTH -> lengthToMeters(value, unit)
26
+ QuantityKind.ENERGY -> energyToKcal(value, unit)
27
+ QuantityKind.TEMPERATURE -> temperatureToCelsius(value, unit)
28
+ QuantityKind.PRESSURE -> value
29
+ QuantityKind.VOLUME -> volumeToLiters(value, unit)
30
+ QuantityKind.GLUCOSE -> glucoseToMgDl(value, unit)
31
+ }
32
+ }
33
+
34
+ private fun massToKg(value: Double, unit: String): Double = when (unit) {
35
+ "kg" -> value
36
+ "g" -> value / 1000.0
37
+ "mg" -> value / 1_000_000.0
38
+ "lb" -> value / 2.2046226218
39
+ else -> value
40
+ }
41
+
42
+ private fun massFromKg(value: Double, unit: String): Double = when (unit) {
43
+ "kg" -> value
44
+ "g" -> value * 1000.0
45
+ "mg" -> value * 1_000_000.0
46
+ "lb" -> value * 2.2046226218
47
+ else -> value
48
+ }
49
+
50
+ private fun lengthToMeters(value: Double, unit: String): Double = when (unit) {
51
+ "m" -> value
52
+ "km" -> value * 1000.0
53
+ "cm" -> value / 100.0
54
+ "mi" -> value * 1609.344
55
+ "ft" -> value * 0.3048
56
+ "in" -> value * 0.0254
57
+ else -> value
58
+ }
59
+
60
+ private fun lengthFromMeters(value: Double, unit: String): Double = when (unit) {
61
+ "m" -> value
62
+ "km" -> value / 1000.0
63
+ "cm" -> value * 100.0
64
+ "mi" -> value / 1609.344
65
+ "ft" -> value / 0.3048
66
+ "in" -> value / 0.0254
67
+ else -> value
68
+ }
69
+
70
+ private fun energyToKcal(value: Double, unit: String): Double = when (unit) {
71
+ "kcal" -> value
72
+ "J" -> value / 4184.0
73
+ else -> value
74
+ }
75
+
76
+ private fun energyFromKcal(value: Double, unit: String): Double = when (unit) {
77
+ "kcal" -> value
78
+ "J" -> value * 4184.0
79
+ else -> value
80
+ }
81
+
82
+ private fun temperatureToCelsius(value: Double, unit: String): Double = when (unit) {
83
+ "degC" -> value
84
+ "degF" -> (value - 32.0) * 5.0 / 9.0
85
+ else -> value
86
+ }
87
+
88
+ private fun temperatureFromCelsius(value: Double, unit: String): Double = when (unit) {
89
+ "degC" -> value
90
+ "degF" -> value * 9.0 / 5.0 + 32.0
91
+ else -> value
92
+ }
93
+
94
+ private fun volumeToLiters(value: Double, unit: String): Double = when (unit) {
95
+ "L" -> value
96
+ "mL" -> value / 1000.0
97
+ else -> value
98
+ }
99
+
100
+ private fun volumeFromLiters(value: Double, unit: String): Double = when (unit) {
101
+ "L" -> value
102
+ "mL" -> value * 1000.0
103
+ else -> value
104
+ }
105
+
106
+ private fun glucoseToMgDl(value: Double, unit: String): Double = when {
107
+ unit == "mg/dL" -> value
108
+ unit.startsWith("mmol") -> value * 18.018
109
+ else -> value
110
+ }
111
+
112
+ private fun glucoseFromMgDl(value: Double, unit: String): Double = when {
113
+ unit == "mg/dL" -> value
114
+ unit.startsWith("mmol") -> value / 18.018
115
+ else -> value
116
+ }
117
+ }
118
+
119
+ internal enum class QuantityKind {
120
+ COUNT,
121
+ MASS,
122
+ LENGTH,
123
+ ENERGY,
124
+ TEMPERATURE,
125
+ PRESSURE,
126
+ VOLUME,
127
+ GLUCOSE,
128
+ PERCENT,
129
+ BPM,
130
+ FLOORS,
131
+ VO2,
132
+ HRV
133
+ }
@@ -0,0 +1,105 @@
1
+ package expo.modules.healthkit
2
+
3
+ import androidx.health.connect.client.records.ExerciseSessionRecord
4
+
5
+ internal object HealthConnectWorkouts {
6
+ fun toHealthConnect(hkActivityType: Int): Int = when (hkActivityType) {
7
+ 1 -> ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AMERICAN
8
+ 2 -> ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT
9
+ 3 -> ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AUSTRALIAN
10
+ 4 -> ExerciseSessionRecord.EXERCISE_TYPE_BADMINTON
11
+ 5 -> ExerciseSessionRecord.EXERCISE_TYPE_BASEBALL
12
+ 6 -> ExerciseSessionRecord.EXERCISE_TYPE_BASKETBALL
13
+ 8 -> ExerciseSessionRecord.EXERCISE_TYPE_BOXING
14
+ 9 -> ExerciseSessionRecord.EXERCISE_TYPE_ROCK_CLIMBING
15
+ 10 -> ExerciseSessionRecord.EXERCISE_TYPE_CRICKET
16
+ 13 -> ExerciseSessionRecord.EXERCISE_TYPE_BIKING
17
+ 14, 15, 77, 78 -> ExerciseSessionRecord.EXERCISE_TYPE_DANCING
18
+ 16 -> ExerciseSessionRecord.EXERCISE_TYPE_ELLIPTICAL
19
+ 18 -> ExerciseSessionRecord.EXERCISE_TYPE_FENCING
20
+ 20, 50 -> ExerciseSessionRecord.EXERCISE_TYPE_STRENGTH_TRAINING
21
+ 21 -> ExerciseSessionRecord.EXERCISE_TYPE_GOLF
22
+ 22 -> ExerciseSessionRecord.EXERCISE_TYPE_GYMNASTICS
23
+ 23 -> ExerciseSessionRecord.EXERCISE_TYPE_HANDBALL
24
+ 24 -> ExerciseSessionRecord.EXERCISE_TYPE_HIKING
25
+ 25 -> ExerciseSessionRecord.EXERCISE_TYPE_ICE_HOCKEY
26
+ 28 -> ExerciseSessionRecord.EXERCISE_TYPE_MARTIAL_ARTS
27
+ 31 -> ExerciseSessionRecord.EXERCISE_TYPE_PADDLING
28
+ 34 -> ExerciseSessionRecord.EXERCISE_TYPE_RACQUETBALL
29
+ 35 -> ExerciseSessionRecord.EXERCISE_TYPE_ROWING
30
+ 36 -> ExerciseSessionRecord.EXERCISE_TYPE_RUGBY
31
+ 37 -> ExerciseSessionRecord.EXERCISE_TYPE_RUNNING
32
+ 38 -> ExerciseSessionRecord.EXERCISE_TYPE_SAILING
33
+ 39 -> ExerciseSessionRecord.EXERCISE_TYPE_SKATING
34
+ 40, 60, 61 -> ExerciseSessionRecord.EXERCISE_TYPE_SKIING
35
+ 41 -> ExerciseSessionRecord.EXERCISE_TYPE_SOCCER
36
+ 42 -> ExerciseSessionRecord.EXERCISE_TYPE_SOFTBALL
37
+ 43 -> ExerciseSessionRecord.EXERCISE_TYPE_SQUASH
38
+ 44, 68 -> ExerciseSessionRecord.EXERCISE_TYPE_STAIR_CLIMBING
39
+ 45 -> ExerciseSessionRecord.EXERCISE_TYPE_SURFING
40
+ 46 -> ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_POOL
41
+ 47 -> ExerciseSessionRecord.EXERCISE_TYPE_TABLE_TENNIS
42
+ 48 -> ExerciseSessionRecord.EXERCISE_TYPE_TENNIS
43
+ 51 -> ExerciseSessionRecord.EXERCISE_TYPE_VOLLEYBALL
44
+ 52 -> ExerciseSessionRecord.EXERCISE_TYPE_WALKING
45
+ 54 -> ExerciseSessionRecord.EXERCISE_TYPE_WATER_POLO
46
+ 57 -> ExerciseSessionRecord.EXERCISE_TYPE_YOGA
47
+ 63 -> ExerciseSessionRecord.EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING
48
+ 64 -> ExerciseSessionRecord.EXERCISE_TYPE_CALISTHENICS
49
+ 66 -> ExerciseSessionRecord.EXERCISE_TYPE_PILATES
50
+ 67 -> ExerciseSessionRecord.EXERCISE_TYPE_SNOWBOARDING
51
+ 70, 71 -> ExerciseSessionRecord.EXERCISE_TYPE_WHEELCHAIR
52
+ 74 -> ExerciseSessionRecord.EXERCISE_TYPE_BIKING
53
+ 75 -> ExerciseSessionRecord.EXERCISE_TYPE_FRISBEE_DISC
54
+ else -> ExerciseSessionRecord.EXERCISE_TYPE_OTHER_WORKOUT
55
+ }
56
+
57
+ fun toHealthKit(exerciseType: Int): Int = when (exerciseType) {
58
+ ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AMERICAN -> 1
59
+ ExerciseSessionRecord.EXERCISE_TYPE_FOOTBALL_AUSTRALIAN -> 3
60
+ ExerciseSessionRecord.EXERCISE_TYPE_BADMINTON -> 4
61
+ ExerciseSessionRecord.EXERCISE_TYPE_BASEBALL -> 5
62
+ ExerciseSessionRecord.EXERCISE_TYPE_BASKETBALL -> 6
63
+ ExerciseSessionRecord.EXERCISE_TYPE_BOXING -> 8
64
+ ExerciseSessionRecord.EXERCISE_TYPE_ROCK_CLIMBING -> 9
65
+ ExerciseSessionRecord.EXERCISE_TYPE_CRICKET -> 10
66
+ ExerciseSessionRecord.EXERCISE_TYPE_BIKING, ExerciseSessionRecord.EXERCISE_TYPE_BIKING_STATIONARY -> 13
67
+ ExerciseSessionRecord.EXERCISE_TYPE_DANCING -> 14
68
+ ExerciseSessionRecord.EXERCISE_TYPE_ELLIPTICAL -> 16
69
+ ExerciseSessionRecord.EXERCISE_TYPE_FENCING -> 18
70
+ ExerciseSessionRecord.EXERCISE_TYPE_STRENGTH_TRAINING, ExerciseSessionRecord.EXERCISE_TYPE_WEIGHTLIFTING -> 50
71
+ ExerciseSessionRecord.EXERCISE_TYPE_GOLF -> 21
72
+ ExerciseSessionRecord.EXERCISE_TYPE_GYMNASTICS -> 22
73
+ ExerciseSessionRecord.EXERCISE_TYPE_HANDBALL -> 23
74
+ ExerciseSessionRecord.EXERCISE_TYPE_HIKING -> 24
75
+ ExerciseSessionRecord.EXERCISE_TYPE_ICE_HOCKEY -> 25
76
+ ExerciseSessionRecord.EXERCISE_TYPE_MARTIAL_ARTS -> 28
77
+ ExerciseSessionRecord.EXERCISE_TYPE_PADDLING -> 31
78
+ ExerciseSessionRecord.EXERCISE_TYPE_RACQUETBALL -> 34
79
+ ExerciseSessionRecord.EXERCISE_TYPE_ROWING, ExerciseSessionRecord.EXERCISE_TYPE_ROWING_MACHINE -> 35
80
+ ExerciseSessionRecord.EXERCISE_TYPE_RUGBY -> 36
81
+ ExerciseSessionRecord.EXERCISE_TYPE_RUNNING, ExerciseSessionRecord.EXERCISE_TYPE_RUNNING_TREADMILL -> 37
82
+ ExerciseSessionRecord.EXERCISE_TYPE_SAILING -> 38
83
+ ExerciseSessionRecord.EXERCISE_TYPE_SKATING -> 39
84
+ ExerciseSessionRecord.EXERCISE_TYPE_SKIING -> 40
85
+ ExerciseSessionRecord.EXERCISE_TYPE_SOCCER -> 41
86
+ ExerciseSessionRecord.EXERCISE_TYPE_SOFTBALL -> 42
87
+ ExerciseSessionRecord.EXERCISE_TYPE_SQUASH -> 43
88
+ ExerciseSessionRecord.EXERCISE_TYPE_STAIR_CLIMBING, ExerciseSessionRecord.EXERCISE_TYPE_STAIR_CLIMBING_MACHINE -> 44
89
+ ExerciseSessionRecord.EXERCISE_TYPE_SURFING -> 45
90
+ ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_POOL, ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_OPEN_WATER -> 46
91
+ ExerciseSessionRecord.EXERCISE_TYPE_TABLE_TENNIS -> 47
92
+ ExerciseSessionRecord.EXERCISE_TYPE_TENNIS -> 48
93
+ ExerciseSessionRecord.EXERCISE_TYPE_VOLLEYBALL -> 51
94
+ ExerciseSessionRecord.EXERCISE_TYPE_WALKING -> 52
95
+ ExerciseSessionRecord.EXERCISE_TYPE_WATER_POLO -> 54
96
+ ExerciseSessionRecord.EXERCISE_TYPE_YOGA -> 57
97
+ ExerciseSessionRecord.EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING -> 63
98
+ ExerciseSessionRecord.EXERCISE_TYPE_CALISTHENICS -> 64
99
+ ExerciseSessionRecord.EXERCISE_TYPE_PILATES -> 66
100
+ ExerciseSessionRecord.EXERCISE_TYPE_SNOWBOARDING -> 67
101
+ ExerciseSessionRecord.EXERCISE_TYPE_WHEELCHAIR -> 70
102
+ ExerciseSessionRecord.EXERCISE_TYPE_FRISBEE_DISC -> 75
103
+ else -> 0
104
+ }
105
+ }
@@ -0,0 +1,30 @@
1
+ package expo.modules.healthkit
2
+
3
+ import expo.modules.kotlin.exception.CodedException
4
+
5
+ internal class HealthKitUnavailableException :
6
+ CodedException("Health data is not available. On iOS use a development build with HealthKit. On Android install Health Connect.")
7
+
8
+ internal class EmptyPermissionsException :
9
+ CodedException("Provide at least one HealthKit type in toRead or toShare")
10
+
11
+ internal class InvalidIdentifierException(identifier: String) :
12
+ CodedException("Unknown or unsupported HealthKit identifier: $identifier")
13
+
14
+ internal class InvalidUnitException(unit: String) :
15
+ CodedException("Invalid HealthKit unit string: $unit")
16
+
17
+ internal class InvalidDateException(value: String) :
18
+ CodedException("Invalid ISO-8601 date: $value")
19
+
20
+ internal class InvalidSampleTypeException(identifier: String) :
21
+ CodedException("Identifier is not a writable sample type: $identifier")
22
+
23
+ internal class MissingDeleteTypeException :
24
+ CodedException("deleteObjects requires a type, optionally with uuid or a date range")
25
+
26
+ internal class EmptyCorrelationException :
27
+ CodedException("saveCorrelation requires at least one quantity object")
28
+
29
+ internal class HealthConnectUnsupportedException(feature: String) :
30
+ CodedException("$feature is not available on Android Health Connect")
package/app.plugin.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./plugin/build');
@@ -0,0 +1,39 @@
1
+ import { NativeModule } from 'expo';
2
+ import type { ExpoHealthKitModuleEvents, NativeActivitySummary, NativeActivitySummaryQueryOptions, NativeAnchoredQueryOptions, NativeAnchoredQueryResult, NativeAudiogramSample, NativeAuthorizationOptions, NativeCategoryQueryOptions, NativeCategorySample, NativeCategorySampleInput, NativeClinicalRecord, NativeClinicalRecordQueryOptions, NativeCorrelation, NativeCorrelationInput, NativeCorrelationQueryOptions, NativeDateRangeQueryOptions, NativeDeleteObjectsOptions, NativeElectrocardiogramQueryOptions, NativeElectrocardiogramSample, NativeHeartbeatSeriesQueryOptions, NativeHeartbeatSeriesSample, NativeQuantityQueryOptions, NativeQuantitySample, NativeQuantitySampleInput, NativeStatistics, NativeStatisticsCollectionQueryOptions, NativeStatisticsQueryOptions, NativeWorkoutInput, NativeWorkoutQueryOptions, NativeWorkoutRoute, NativeWorkoutRouteQueryOptions, NativeWorkoutSample } from './types';
3
+ declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {
4
+ isHealthDataAvailable(): boolean;
5
+ requestAuthorization(options: NativeAuthorizationOptions): Promise<boolean>;
6
+ getAuthorizationStatus(identifier: string): Promise<number>;
7
+ getRequestStatusForAuthorization(options: NativeAuthorizationOptions): Promise<number>;
8
+ queryQuantitySamples(options: NativeQuantityQueryOptions): Promise<NativeQuantitySample[]>;
9
+ queryCategorySamples(options: NativeCategoryQueryOptions): Promise<NativeCategorySample[]>;
10
+ queryWorkouts(options: NativeWorkoutQueryOptions): Promise<NativeWorkoutSample[]>;
11
+ queryElectrocardiograms(options: NativeElectrocardiogramQueryOptions): Promise<NativeElectrocardiogramSample[]>;
12
+ queryActivitySummaries(options: NativeActivitySummaryQueryOptions): Promise<NativeActivitySummary[]>;
13
+ queryClinicalRecords(options: NativeClinicalRecordQueryOptions): Promise<NativeClinicalRecord[]>;
14
+ queryAudiograms(options: NativeDateRangeQueryOptions): Promise<NativeAudiogramSample[]>;
15
+ queryWorkoutRoute(options: NativeWorkoutRouteQueryOptions): Promise<NativeWorkoutRoute[]>;
16
+ queryCorrelations(options: NativeCorrelationQueryOptions): Promise<NativeCorrelation[]>;
17
+ queryHeartbeatSeries(options: NativeHeartbeatSeriesQueryOptions): Promise<NativeHeartbeatSeriesSample[]>;
18
+ queryStatistics(options: NativeStatisticsQueryOptions): Promise<NativeStatistics>;
19
+ queryStatisticsCollection(options: NativeStatisticsCollectionQueryOptions): Promise<NativeStatistics[]>;
20
+ queryAnchored(options: NativeAnchoredQueryOptions): Promise<NativeAnchoredQueryResult>;
21
+ saveQuantitySample(sample: NativeQuantitySampleInput): Promise<string>;
22
+ saveCategorySample(sample: NativeCategorySampleInput): Promise<string>;
23
+ saveWorkout(workout: NativeWorkoutInput): Promise<string>;
24
+ saveCorrelation(correlation: NativeCorrelationInput): Promise<string>;
25
+ deleteObjects(options: NativeDeleteObjectsOptions): Promise<number>;
26
+ getBiologicalSex(): Promise<number>;
27
+ getBloodType(): Promise<number>;
28
+ getDateOfBirth(): Promise<string | null>;
29
+ getFitzpatrickSkinType(): Promise<number>;
30
+ getWheelchairUse(): Promise<number>;
31
+ enableBackgroundDelivery(type: string, frequency: number): Promise<boolean>;
32
+ disableBackgroundDelivery(type: string): Promise<boolean>;
33
+ disableAllBackgroundDelivery(): Promise<boolean>;
34
+ observeTypes(types: string[]): Promise<void>;
35
+ clearObserverQueries(): Promise<void>;
36
+ }
37
+ declare const _default: ExpoHealthKitModule;
38
+ export default _default;
39
+ //# sourceMappingURL=ExpoHealthKitModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoHealthKitModule.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { requireNativeModule } from 'expo';
2
+ import { HealthKitError } from './errors';
3
+ const nativeModule = requireNativeModule('ExpoHealthKit');
4
+ function rethrowAsHealthKitError(error) {
5
+ const message = error instanceof Error ? error.message : String(error);
6
+ const code = error && typeof error === 'object' && 'code' in error
7
+ ? String(error.code)
8
+ : 'ERR_HEALTHKIT';
9
+ const wrapped = new HealthKitError(message, code);
10
+ if (__DEV__) {
11
+ console.warn(`[expo-healthkit] ${code}: ${message}`);
12
+ }
13
+ throw wrapped;
14
+ }
15
+ export default new Proxy(nativeModule, {
16
+ get(target, property, receiver) {
17
+ const value = Reflect.get(target, property, receiver);
18
+ if (typeof value !== 'function') {
19
+ return value;
20
+ }
21
+ return (...args) => {
22
+ try {
23
+ const result = value.apply(target, args);
24
+ if (result instanceof Promise) {
25
+ return result.catch(rethrowAsHealthKitError);
26
+ }
27
+ return result;
28
+ }
29
+ catch (error) {
30
+ rethrowAsHealthKitError(error);
31
+ }
32
+ };
33
+ },
34
+ });
35
+ //# sourceMappingURL=ExpoHealthKitModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoHealthKitModule.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgF1C,MAAM,YAAY,GAAG,mBAAmB,CAAsB,eAAe,CAAC,CAAC;AAE/E,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GACR,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;QACnD,CAAC,CAAC,MAAM,CAAE,KAA2B,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,eAAe,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,OAAO,CAAC;AAChB,CAAC;AAED,eAAe,IAAI,KAAK,CAAC,YAAY,EAAE;IACrC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAY,CAAC;QACjE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAI,KAA0C,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/E,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/C,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF,CAAwB,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport { HealthKitError } from './errors';\n\nimport type {\n ExpoHealthKitModuleEvents,\n NativeActivitySummary,\n NativeActivitySummaryQueryOptions,\n NativeAnchoredQueryOptions,\n NativeAnchoredQueryResult,\n NativeAudiogramSample,\n NativeAuthorizationOptions,\n NativeCategoryQueryOptions,\n NativeCategorySample,\n NativeCategorySampleInput,\n NativeClinicalRecord,\n NativeClinicalRecordQueryOptions,\n NativeCorrelation,\n NativeCorrelationInput,\n NativeCorrelationQueryOptions,\n NativeDateRangeQueryOptions,\n NativeDeleteObjectsOptions,\n NativeElectrocardiogramQueryOptions,\n NativeElectrocardiogramSample,\n NativeHeartbeatSeriesQueryOptions,\n NativeHeartbeatSeriesSample,\n NativeQuantityQueryOptions,\n NativeQuantitySample,\n NativeQuantitySampleInput,\n NativeStatistics,\n NativeStatisticsCollectionQueryOptions,\n NativeStatisticsQueryOptions,\n NativeWorkoutInput,\n NativeWorkoutQueryOptions,\n NativeWorkoutRoute,\n NativeWorkoutRouteQueryOptions,\n NativeWorkoutSample,\n} from './types';\n\ndeclare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean;\n requestAuthorization(options: NativeAuthorizationOptions): Promise<boolean>;\n getAuthorizationStatus(identifier: string): Promise<number>;\n getRequestStatusForAuthorization(options: NativeAuthorizationOptions): Promise<number>;\n queryQuantitySamples(options: NativeQuantityQueryOptions): Promise<NativeQuantitySample[]>;\n queryCategorySamples(options: NativeCategoryQueryOptions): Promise<NativeCategorySample[]>;\n queryWorkouts(options: NativeWorkoutQueryOptions): Promise<NativeWorkoutSample[]>;\n queryElectrocardiograms(\n options: NativeElectrocardiogramQueryOptions\n ): Promise<NativeElectrocardiogramSample[]>;\n queryActivitySummaries(\n options: NativeActivitySummaryQueryOptions\n ): Promise<NativeActivitySummary[]>;\n queryClinicalRecords(options: NativeClinicalRecordQueryOptions): Promise<NativeClinicalRecord[]>;\n queryAudiograms(options: NativeDateRangeQueryOptions): Promise<NativeAudiogramSample[]>;\n queryWorkoutRoute(options: NativeWorkoutRouteQueryOptions): Promise<NativeWorkoutRoute[]>;\n queryCorrelations(options: NativeCorrelationQueryOptions): Promise<NativeCorrelation[]>;\n queryHeartbeatSeries(\n options: NativeHeartbeatSeriesQueryOptions\n ): Promise<NativeHeartbeatSeriesSample[]>;\n queryStatistics(options: NativeStatisticsQueryOptions): Promise<NativeStatistics>;\n queryStatisticsCollection(\n options: NativeStatisticsCollectionQueryOptions\n ): Promise<NativeStatistics[]>;\n queryAnchored(options: NativeAnchoredQueryOptions): Promise<NativeAnchoredQueryResult>;\n saveQuantitySample(sample: NativeQuantitySampleInput): Promise<string>;\n saveCategorySample(sample: NativeCategorySampleInput): Promise<string>;\n saveWorkout(workout: NativeWorkoutInput): Promise<string>;\n saveCorrelation(correlation: NativeCorrelationInput): Promise<string>;\n deleteObjects(options: NativeDeleteObjectsOptions): Promise<number>;\n getBiologicalSex(): Promise<number>;\n getBloodType(): Promise<number>;\n getDateOfBirth(): Promise<string | null>;\n getFitzpatrickSkinType(): Promise<number>;\n getWheelchairUse(): Promise<number>;\n enableBackgroundDelivery(type: string, frequency: number): Promise<boolean>;\n disableBackgroundDelivery(type: string): Promise<boolean>;\n disableAllBackgroundDelivery(): Promise<boolean>;\n observeTypes(types: string[]): Promise<void>;\n clearObserverQueries(): Promise<void>;\n}\n\nconst nativeModule = requireNativeModule<ExpoHealthKitModule>('ExpoHealthKit');\n\nfunction rethrowAsHealthKitError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n const code =\n error && typeof error === 'object' && 'code' in error\n ? String((error as { code: unknown }).code)\n : 'ERR_HEALTHKIT';\n const wrapped = new HealthKitError(message, code);\n if (__DEV__) {\n console.warn(`[expo-healthkit] ${code}: ${message}`);\n }\n throw wrapped;\n}\n\nexport default new Proxy(nativeModule, {\n get(target, property, receiver) {\n const value = Reflect.get(target, property, receiver) as unknown;\n if (typeof value !== 'function') {\n return value;\n }\n return (...args: unknown[]) => {\n try {\n const result = (value as (...inner: unknown[]) => unknown).apply(target, args);\n if (result instanceof Promise) {\n return result.catch(rethrowAsHealthKitError);\n }\n return result;\n } catch (error) {\n rethrowAsHealthKitError(error);\n }\n };\n },\n}) as ExpoHealthKitModule;\n"]}
@@ -0,0 +1,39 @@
1
+ import { NativeModule } from 'expo';
2
+ import type { ExpoHealthKitModuleEvents } from './types';
3
+ declare class ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {
4
+ isHealthDataAvailable(): boolean;
5
+ requestAuthorization(): Promise<boolean>;
6
+ getAuthorizationStatus(): Promise<number>;
7
+ getRequestStatusForAuthorization(): Promise<number>;
8
+ queryQuantitySamples(): Promise<never>;
9
+ queryCategorySamples(): Promise<never>;
10
+ queryWorkouts(): Promise<never>;
11
+ queryElectrocardiograms(): Promise<never>;
12
+ queryActivitySummaries(): Promise<never>;
13
+ queryClinicalRecords(): Promise<never>;
14
+ queryAudiograms(): Promise<never>;
15
+ queryWorkoutRoute(): Promise<never>;
16
+ queryCorrelations(): Promise<never>;
17
+ queryHeartbeatSeries(): Promise<never>;
18
+ queryStatistics(): Promise<never>;
19
+ queryStatisticsCollection(): Promise<never>;
20
+ queryAnchored(): Promise<never>;
21
+ saveQuantitySample(): Promise<string>;
22
+ saveCategorySample(): Promise<string>;
23
+ saveWorkout(): Promise<string>;
24
+ saveCorrelation(): Promise<string>;
25
+ deleteObjects(): Promise<number>;
26
+ getBiologicalSex(): Promise<number>;
27
+ getBloodType(): Promise<number>;
28
+ getDateOfBirth(): Promise<string | null>;
29
+ getFitzpatrickSkinType(): Promise<number>;
30
+ getWheelchairUse(): Promise<number>;
31
+ enableBackgroundDelivery(): Promise<boolean>;
32
+ disableBackgroundDelivery(): Promise<boolean>;
33
+ disableAllBackgroundDelivery(): Promise<boolean>;
34
+ observeTypes(): Promise<void>;
35
+ clearObserverQueries(): Promise<void>;
36
+ }
37
+ declare const _default: typeof ExpoHealthKitModule;
38
+ export default _default;
39
+ //# sourceMappingURL=ExpoHealthKitModule.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoHealthKitModule.web.d.ts","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,MAAM,CAAC;AAGvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAMzD,cAAM,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACvE,qBAAqB,IAAI,OAAO;IAI1B,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gCAAgC,IAAI,OAAO,CAAC,MAAM,CAAC;IAInD,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,uBAAuB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIzC,sBAAsB,IAAI,OAAO,CAAC,KAAK,CAAC;IAIxC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;IAInC,oBAAoB,IAAI,OAAO,CAAC,KAAK,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAIjC,yBAAyB,IAAI,OAAO,CAAC,KAAK,CAAC;IAI3C,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI5C,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5C;;AAED,wBAA6E"}
@@ -0,0 +1,105 @@
1
+ import { NativeModule, registerWebModule } from 'expo';
2
+ import { HealthKitUnavailableError } from './errors';
3
+ function unavailable() {
4
+ throw new HealthKitUnavailableError();
5
+ }
6
+ class ExpoHealthKitModule extends NativeModule {
7
+ isHealthDataAvailable() {
8
+ return false;
9
+ }
10
+ async requestAuthorization() {
11
+ return unavailable();
12
+ }
13
+ async getAuthorizationStatus() {
14
+ return unavailable();
15
+ }
16
+ async getRequestStatusForAuthorization() {
17
+ return unavailable();
18
+ }
19
+ async queryQuantitySamples() {
20
+ return unavailable();
21
+ }
22
+ async queryCategorySamples() {
23
+ return unavailable();
24
+ }
25
+ async queryWorkouts() {
26
+ return unavailable();
27
+ }
28
+ async queryElectrocardiograms() {
29
+ return unavailable();
30
+ }
31
+ async queryActivitySummaries() {
32
+ return unavailable();
33
+ }
34
+ async queryClinicalRecords() {
35
+ return unavailable();
36
+ }
37
+ async queryAudiograms() {
38
+ return unavailable();
39
+ }
40
+ async queryWorkoutRoute() {
41
+ return unavailable();
42
+ }
43
+ async queryCorrelations() {
44
+ return unavailable();
45
+ }
46
+ async queryHeartbeatSeries() {
47
+ return unavailable();
48
+ }
49
+ async queryStatistics() {
50
+ return unavailable();
51
+ }
52
+ async queryStatisticsCollection() {
53
+ return unavailable();
54
+ }
55
+ async queryAnchored() {
56
+ return unavailable();
57
+ }
58
+ async saveQuantitySample() {
59
+ return unavailable();
60
+ }
61
+ async saveCategorySample() {
62
+ return unavailable();
63
+ }
64
+ async saveWorkout() {
65
+ return unavailable();
66
+ }
67
+ async saveCorrelation() {
68
+ return unavailable();
69
+ }
70
+ async deleteObjects() {
71
+ return unavailable();
72
+ }
73
+ async getBiologicalSex() {
74
+ return unavailable();
75
+ }
76
+ async getBloodType() {
77
+ return unavailable();
78
+ }
79
+ async getDateOfBirth() {
80
+ return unavailable();
81
+ }
82
+ async getFitzpatrickSkinType() {
83
+ return unavailable();
84
+ }
85
+ async getWheelchairUse() {
86
+ return unavailable();
87
+ }
88
+ async enableBackgroundDelivery() {
89
+ return unavailable();
90
+ }
91
+ async disableBackgroundDelivery() {
92
+ return unavailable();
93
+ }
94
+ async disableAllBackgroundDelivery() {
95
+ return unavailable();
96
+ }
97
+ async observeTypes() {
98
+ return unavailable();
99
+ }
100
+ async clearObserverQueries() {
101
+ return unavailable();
102
+ }
103
+ }
104
+ export default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');
105
+ //# sourceMappingURL=ExpoHealthKitModule.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoHealthKitModule.web.js","sourceRoot":"","sources":["../src/ExpoHealthKitModule.web.ts"],"names":[],"mappings":"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","sourcesContent":["import { NativeModule, registerWebModule } from 'expo';\n\nimport { HealthKitUnavailableError } from './errors';\nimport type { ExpoHealthKitModuleEvents } from './types';\n\nfunction unavailable(): never {\n throw new HealthKitUnavailableError();\n}\n\nclass ExpoHealthKitModule extends NativeModule<ExpoHealthKitModuleEvents> {\n isHealthDataAvailable(): boolean {\n return false;\n }\n\n async requestAuthorization(): Promise<boolean> {\n return unavailable();\n }\n\n async getAuthorizationStatus(): Promise<number> {\n return unavailable();\n }\n\n async getRequestStatusForAuthorization(): Promise<number> {\n return unavailable();\n }\n\n async queryQuantitySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryCategorySamples(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkouts(): Promise<never> {\n return unavailable();\n }\n\n async queryElectrocardiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryActivitySummaries(): Promise<never> {\n return unavailable();\n }\n\n async queryClinicalRecords(): Promise<never> {\n return unavailable();\n }\n\n async queryAudiograms(): Promise<never> {\n return unavailable();\n }\n\n async queryWorkoutRoute(): Promise<never> {\n return unavailable();\n }\n\n async queryCorrelations(): Promise<never> {\n return unavailable();\n }\n\n async queryHeartbeatSeries(): Promise<never> {\n return unavailable();\n }\n\n async queryStatistics(): Promise<never> {\n return unavailable();\n }\n\n async queryStatisticsCollection(): Promise<never> {\n return unavailable();\n }\n\n async queryAnchored(): Promise<never> {\n return unavailable();\n }\n\n async saveQuantitySample(): Promise<string> {\n return unavailable();\n }\n\n async saveCategorySample(): Promise<string> {\n return unavailable();\n }\n\n async saveWorkout(): Promise<string> {\n return unavailable();\n }\n\n async saveCorrelation(): Promise<string> {\n return unavailable();\n }\n\n async deleteObjects(): Promise<number> {\n return unavailable();\n }\n\n async getBiologicalSex(): Promise<number> {\n return unavailable();\n }\n\n async getBloodType(): Promise<number> {\n return unavailable();\n }\n\n async getDateOfBirth(): Promise<string | null> {\n return unavailable();\n }\n\n async getFitzpatrickSkinType(): Promise<number> {\n return unavailable();\n }\n\n async getWheelchairUse(): Promise<number> {\n return unavailable();\n }\n\n async enableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async disableAllBackgroundDelivery(): Promise<boolean> {\n return unavailable();\n }\n\n async observeTypes(): Promise<void> {\n return unavailable();\n }\n\n async clearObserverQueries(): Promise<void> {\n return unavailable();\n }\n}\n\nexport default registerWebModule(ExpoHealthKitModule, 'ExpoHealthKitModule');\n"]}
@@ -0,0 +1,6 @@
1
+ import type { DateInput } from './types';
2
+ export declare function toIso(value: DateInput): string;
3
+ export declare function toOptionalIso(value?: DateInput): string | undefined;
4
+ export declare function fromIso(value: string): Date;
5
+ export declare function resolveEndDate(startDate: DateInput, endDate?: DateInput): string;
6
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAEhF"}
package/build/dates.js ADDED
@@ -0,0 +1,13 @@
1
+ export function toIso(value) {
2
+ return value instanceof Date ? value.toISOString() : value;
3
+ }
4
+ export function toOptionalIso(value) {
5
+ return value == null ? undefined : toIso(value);
6
+ }
7
+ export function fromIso(value) {
8
+ return new Date(value);
9
+ }
10
+ export function resolveEndDate(startDate, endDate) {
11
+ return toIso(endDate ?? startDate);
12
+ }
13
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,KAAK,CAAC,KAAgB;IACpC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAmB;IACtE,OAAO,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import type { DateInput } from './types';\n\nexport function toIso(value: DateInput): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\nexport function toOptionalIso(value?: DateInput): string | undefined {\n return value == null ? undefined : toIso(value);\n}\n\nexport function fromIso(value: string): Date {\n return new Date(value);\n}\n\nexport function resolveEndDate(startDate: DateInput, endDate?: DateInput): string {\n return toIso(endDate ?? startDate);\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export declare class HealthKitUnavailableError extends Error {
2
+ readonly code = "ERR_HEALTHKIT_UNAVAILABLE";
3
+ constructor(message?: string);
4
+ }
5
+ export declare class HealthKitError extends Error {
6
+ readonly code: string;
7
+ constructor(message: string, code?: string);
8
+ }
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,+BAA+B;gBAG1C,OAAO,SAA2K;CAMrL;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,SAAkB;CAMpD"}
@@ -0,0 +1,18 @@
1
+ export class HealthKitUnavailableError extends Error {
2
+ code = 'ERR_HEALTHKIT_UNAVAILABLE';
3
+ constructor(message = 'Health data is not available. On iOS use a development build on a physical iPhone or the iOS Simulator. On Android install Health Connect and use a development build.') {
4
+ super(message);
5
+ this.name = 'HealthKitUnavailableError';
6
+ Object.setPrototypeOf(this, new.target.prototype);
7
+ }
8
+ }
9
+ export class HealthKitError extends Error {
10
+ code;
11
+ constructor(message, code = 'ERR_HEALTHKIT') {
12
+ super(message);
13
+ this.name = 'HealthKitError';
14
+ this.code = code;
15
+ Object.setPrototypeOf(this, new.target.prototype);
16
+ }
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,2BAA2B,CAAC;IAE5C,YACE,OAAO,GAAG,wKAAwK;QAElL,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,IAAI,GAAG,eAAe;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF","sourcesContent":["export class HealthKitUnavailableError extends Error {\n readonly code = 'ERR_HEALTHKIT_UNAVAILABLE';\n\n constructor(\n message = 'Health data is not available. On iOS use a development build on a physical iPhone or the iOS Simulator. On Android install Health Connect and use a development build.'\n ) {\n super(message);\n this.name = 'HealthKitUnavailableError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class HealthKitError extends Error {\n readonly code: string;\n\n constructor(message: string, code = 'ERR_HEALTHKIT') {\n super(message);\n this.name = 'HealthKitError';\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n"]}