@nativesquare/soma 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.
- package/LICENSE +201 -0
- package/README.md +142 -0
- package/dist/client/_generated/_ignore.d.ts +1 -0
- package/dist/client/_generated/_ignore.d.ts.map +1 -0
- package/dist/client/_generated/_ignore.js +3 -0
- package/dist/client/_generated/_ignore.js.map +1 -0
- package/dist/client/index.d.ts +279 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +264 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +5 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/component/_generated/api.d.ts +62 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +1063 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +3 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/private.d.ts +33 -0
- package/dist/component/private.d.ts.map +1 -0
- package/dist/component/private.js +45 -0
- package/dist/component/private.js.map +1 -0
- package/dist/component/public.d.ts +1107 -0
- package/dist/component/public.d.ts.map +1 -0
- package/dist/component/public.js +310 -0
- package/dist/component/public.js.map +1 -0
- package/dist/component/schema.d.ts +4419 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +106 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/validators/activity.d.ts +747 -0
- package/dist/component/validators/activity.d.ts.map +1 -0
- package/dist/component/validators/activity.js +146 -0
- package/dist/component/validators/activity.js.map +1 -0
- package/dist/component/validators/athlete.d.ts +18 -0
- package/dist/component/validators/athlete.d.ts.map +1 -0
- package/dist/component/validators/athlete.js +25 -0
- package/dist/component/validators/athlete.js.map +1 -0
- package/dist/component/validators/body.d.ts +634 -0
- package/dist/component/validators/body.d.ts.map +1 -0
- package/dist/component/validators/body.js +70 -0
- package/dist/component/validators/body.js.map +1 -0
- package/dist/component/validators/connection.d.ts +7 -0
- package/dist/component/validators/connection.d.ts.map +1 -0
- package/dist/component/validators/connection.js +16 -0
- package/dist/component/validators/connection.js.map +1 -0
- package/dist/component/validators/daily.d.ts +650 -0
- package/dist/component/validators/daily.d.ts.map +1 -0
- package/dist/component/validators/daily.js +119 -0
- package/dist/component/validators/daily.js.map +1 -0
- package/dist/component/validators/enums.d.ts +24 -0
- package/dist/component/validators/enums.d.ts.map +1 -0
- package/dist/component/validators/enums.js +69 -0
- package/dist/component/validators/enums.js.map +1 -0
- package/dist/component/validators/index.d.ts +13 -0
- package/dist/component/validators/index.d.ts.map +1 -0
- package/dist/component/validators/index.js +16 -0
- package/dist/component/validators/index.js.map +1 -0
- package/dist/component/validators/menstruation.d.ts +51 -0
- package/dist/component/validators/menstruation.d.ts.map +1 -0
- package/dist/component/validators/menstruation.js +32 -0
- package/dist/component/validators/menstruation.js.map +1 -0
- package/dist/component/validators/nutrition.d.ts +498 -0
- package/dist/component/validators/nutrition.d.ts.map +1 -0
- package/dist/component/validators/nutrition.js +31 -0
- package/dist/component/validators/nutrition.js.map +1 -0
- package/dist/component/validators/plannedWorkout.d.ts +277 -0
- package/dist/component/validators/plannedWorkout.d.ts.map +1 -0
- package/dist/component/validators/plannedWorkout.js +105 -0
- package/dist/component/validators/plannedWorkout.js.map +1 -0
- package/dist/component/validators/samples.d.ts +609 -0
- package/dist/component/validators/samples.d.ts.map +1 -0
- package/dist/component/validators/samples.js +336 -0
- package/dist/component/validators/samples.js.map +1 -0
- package/dist/component/validators/shared.d.ts +402 -0
- package/dist/component/validators/shared.d.ts.map +1 -0
- package/dist/component/validators/shared.js +146 -0
- package/dist/component/validators/shared.js.map +1 -0
- package/dist/component/validators/sleep.d.ts +438 -0
- package/dist/component/validators/sleep.d.ts.map +1 -0
- package/dist/component/validators/sleep.js +95 -0
- package/dist/component/validators/sleep.js.map +1 -0
- package/dist/healthkit/activity.d.ts +75 -0
- package/dist/healthkit/activity.d.ts.map +1 -0
- package/dist/healthkit/activity.js +93 -0
- package/dist/healthkit/activity.js.map +1 -0
- package/dist/healthkit/athlete.d.ts +26 -0
- package/dist/healthkit/athlete.d.ts.map +1 -0
- package/dist/healthkit/athlete.js +34 -0
- package/dist/healthkit/athlete.js.map +1 -0
- package/dist/healthkit/body.d.ts +102 -0
- package/dist/healthkit/body.d.ts.map +1 -0
- package/dist/healthkit/body.js +167 -0
- package/dist/healthkit/body.js.map +1 -0
- package/dist/healthkit/daily.d.ts +119 -0
- package/dist/healthkit/daily.d.ts.map +1 -0
- package/dist/healthkit/daily.js +160 -0
- package/dist/healthkit/daily.js.map +1 -0
- package/dist/healthkit/index.d.ts +21 -0
- package/dist/healthkit/index.d.ts.map +1 -0
- package/dist/healthkit/index.js +21 -0
- package/dist/healthkit/index.js.map +1 -0
- package/dist/healthkit/maps/activity-type.d.ts +6 -0
- package/dist/healthkit/maps/activity-type.d.ts.map +1 -0
- package/dist/healthkit/maps/activity-type.js +184 -0
- package/dist/healthkit/maps/activity-type.js.map +1 -0
- package/dist/healthkit/maps/menstruation-flow.d.ts +6 -0
- package/dist/healthkit/maps/menstruation-flow.d.ts.map +1 -0
- package/dist/healthkit/maps/menstruation-flow.js +21 -0
- package/dist/healthkit/maps/menstruation-flow.js.map +1 -0
- package/dist/healthkit/maps/sleep-level.d.ts +11 -0
- package/dist/healthkit/maps/sleep-level.d.ts.map +1 -0
- package/dist/healthkit/maps/sleep-level.js +32 -0
- package/dist/healthkit/maps/sleep-level.js.map +1 -0
- package/dist/healthkit/menstruation.d.ts +35 -0
- package/dist/healthkit/menstruation.d.ts.map +1 -0
- package/dist/healthkit/menstruation.js +37 -0
- package/dist/healthkit/menstruation.js.map +1 -0
- package/dist/healthkit/nutrition.d.ts +77 -0
- package/dist/healthkit/nutrition.d.ts.map +1 -0
- package/dist/healthkit/nutrition.js +135 -0
- package/dist/healthkit/nutrition.js.map +1 -0
- package/dist/healthkit/sleep.d.ts +60 -0
- package/dist/healthkit/sleep.d.ts.map +1 -0
- package/dist/healthkit/sleep.js +108 -0
- package/dist/healthkit/sleep.js.map +1 -0
- package/dist/healthkit/types.d.ts +94 -0
- package/dist/healthkit/types.d.ts.map +1 -0
- package/dist/healthkit/types.js +26 -0
- package/dist/healthkit/types.js.map +1 -0
- package/dist/healthkit/utils.d.ts +63 -0
- package/dist/healthkit/utils.d.ts.map +1 -0
- package/dist/healthkit/utils.js +93 -0
- package/dist/healthkit/utils.js.map +1 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +6 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +112 -0
- package/src/client/_generated/_ignore.ts +1 -0
- package/src/client/index.ts +371 -0
- package/src/client/types.ts +18 -0
- package/src/component/_generated/api.ts +78 -0
- package/src/component/_generated/component.ts +1090 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/convex.config.ts +3 -0
- package/src/component/private.ts +50 -0
- package/src/component/public.ts +358 -0
- package/src/component/schema.ts +115 -0
- package/src/component/validators/activity.ts +216 -0
- package/src/component/validators/athlete.ts +25 -0
- package/src/component/validators/body.ts +114 -0
- package/src/component/validators/connection.ts +16 -0
- package/src/component/validators/daily.ts +173 -0
- package/src/component/validators/enums.ts +119 -0
- package/src/component/validators/index.ts +16 -0
- package/src/component/validators/menstruation.ts +36 -0
- package/src/component/validators/nutrition.ts +37 -0
- package/src/component/validators/plannedWorkout.ts +110 -0
- package/src/component/validators/samples.ts +380 -0
- package/src/component/validators/shared.ts +165 -0
- package/src/component/validators/sleep.ts +133 -0
- package/src/healthkit/activity.ts +120 -0
- package/src/healthkit/athlete.ts +43 -0
- package/src/healthkit/body.ts +266 -0
- package/src/healthkit/daily.ts +245 -0
- package/src/healthkit/index.ts +59 -0
- package/src/healthkit/maps/activity-type.ts +185 -0
- package/src/healthkit/maps/menstruation-flow.ts +23 -0
- package/src/healthkit/maps/sleep-level.ts +37 -0
- package/src/healthkit/menstruation.ts +52 -0
- package/src/healthkit/nutrition.ts +162 -0
- package/src/healthkit/sleep.ts +136 -0
- package/src/healthkit/types.ts +219 -0
- package/src/healthkit/utils.ts +122 -0
- package/src/react/index.ts +7 -0
- package/src/test.ts +18 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { HKQuantitySample } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The output shape of {@link transformNutrition}.
|
|
4
|
+
*/
|
|
5
|
+
export type NutritionData = ReturnType<typeof transformNutrition>;
|
|
6
|
+
/**
|
|
7
|
+
* Transform an array of HealthKit dietary quantity samples into a
|
|
8
|
+
* Soma Nutrition document shape.
|
|
9
|
+
*
|
|
10
|
+
* Accepts samples with dietary type identifiers (protein, carbs, fat, water,
|
|
11
|
+
* vitamins, minerals, etc.) and aggregates them into Soma's macros/micros
|
|
12
|
+
* summary format.
|
|
13
|
+
*
|
|
14
|
+
* @param samples - Array of HKQuantitySample with dietary type identifiers
|
|
15
|
+
* @param timeRange - Optional explicit time range; auto-detected from samples if omitted
|
|
16
|
+
* @returns Soma Nutrition fields (without connectionId/userId)
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const data = transformNutrition(hkDietarySamples);
|
|
21
|
+
* await soma.ingestNutrition(ctx, { connectionId, userId, ...data });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function transformNutrition(samples: HKQuantitySample[], timeRange?: {
|
|
25
|
+
start_time: string;
|
|
26
|
+
end_time: string;
|
|
27
|
+
}): {
|
|
28
|
+
metadata: {
|
|
29
|
+
start_time: string;
|
|
30
|
+
end_time: string;
|
|
31
|
+
};
|
|
32
|
+
summary: {
|
|
33
|
+
macros: {
|
|
34
|
+
calories: number | undefined;
|
|
35
|
+
protein_g: number | undefined;
|
|
36
|
+
carbohydrates_g: number | undefined;
|
|
37
|
+
fat_g: number | undefined;
|
|
38
|
+
saturated_fat_g: number | undefined;
|
|
39
|
+
fiber_g: number | undefined;
|
|
40
|
+
sugar_g: number | undefined;
|
|
41
|
+
cholesterol_mg: number | undefined;
|
|
42
|
+
sodium_mg: number | undefined;
|
|
43
|
+
} | undefined;
|
|
44
|
+
micros: {
|
|
45
|
+
calcium_mg: number | undefined;
|
|
46
|
+
iron_mg: number | undefined;
|
|
47
|
+
potassium_mg: number | undefined;
|
|
48
|
+
vitamin_A_mg: number | undefined;
|
|
49
|
+
vitamin_B6_mg: number | undefined;
|
|
50
|
+
vitamin_B12_mg: number | undefined;
|
|
51
|
+
vitamin_C_mg: number | undefined;
|
|
52
|
+
vitamin_D_mg: number | undefined;
|
|
53
|
+
vitamin_E_mg: number | undefined;
|
|
54
|
+
vitamin_K_mg: number | undefined;
|
|
55
|
+
zinc_mg: number | undefined;
|
|
56
|
+
magnesium_mg: number | undefined;
|
|
57
|
+
manganese_mg: number | undefined;
|
|
58
|
+
copper_mg: number | undefined;
|
|
59
|
+
selenium_mg: number | undefined;
|
|
60
|
+
chromium_mg: number | undefined;
|
|
61
|
+
folate_mg: number | undefined;
|
|
62
|
+
biotin_mg: number | undefined;
|
|
63
|
+
niacin_mg: number | undefined;
|
|
64
|
+
phosphorus_mg: number | undefined;
|
|
65
|
+
riboflavin_mg: number | undefined;
|
|
66
|
+
thiamin_mg: number | undefined;
|
|
67
|
+
caffeine_mg: number | undefined;
|
|
68
|
+
iodine_mg: number | undefined;
|
|
69
|
+
chloride_mg: number | undefined;
|
|
70
|
+
pantothenic_acid_mg: number | undefined;
|
|
71
|
+
monounsaturated_fat_g: number | undefined;
|
|
72
|
+
polyunsaturated_fat_g: number | undefined;
|
|
73
|
+
} | undefined;
|
|
74
|
+
water_ml: number | undefined;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=nutrition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nutrition.d.ts","sourceRoot":"","sources":["../../src/healthkit/nutrition.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkIrD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// ─── Nutrition Transformer ────────────────────────────────────────────────────
|
|
2
|
+
// Transforms Apple HealthKit dietary quantity samples into the Soma Nutrition schema.
|
|
3
|
+
import { filterByType, sumValues, sampleTimeRange } from "./utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Transform an array of HealthKit dietary quantity samples into a
|
|
6
|
+
* Soma Nutrition document shape.
|
|
7
|
+
*
|
|
8
|
+
* Accepts samples with dietary type identifiers (protein, carbs, fat, water,
|
|
9
|
+
* vitamins, minerals, etc.) and aggregates them into Soma's macros/micros
|
|
10
|
+
* summary format.
|
|
11
|
+
*
|
|
12
|
+
* @param samples - Array of HKQuantitySample with dietary type identifiers
|
|
13
|
+
* @param timeRange - Optional explicit time range; auto-detected from samples if omitted
|
|
14
|
+
* @returns Soma Nutrition fields (without connectionId/userId)
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const data = transformNutrition(hkDietarySamples);
|
|
19
|
+
* await soma.ingestNutrition(ctx, { connectionId, userId, ...data });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function transformNutrition(samples, timeRange) {
|
|
23
|
+
const range = timeRange ?? sampleTimeRange(samples);
|
|
24
|
+
const sum = (type) => {
|
|
25
|
+
const filtered = filterByType(samples, type);
|
|
26
|
+
return filtered.length > 0 ? sumValues(filtered) : undefined;
|
|
27
|
+
};
|
|
28
|
+
// ── Macros ─────────────────────────────────────────────────────────────
|
|
29
|
+
const calories = sum("HKQuantityTypeIdentifierDietaryEnergyConsumed");
|
|
30
|
+
const protein = sum("HKQuantityTypeIdentifierDietaryProtein");
|
|
31
|
+
const carbs = sum("HKQuantityTypeIdentifierDietaryCarbohydrates");
|
|
32
|
+
const fat = sum("HKQuantityTypeIdentifierDietaryFatTotal");
|
|
33
|
+
const saturatedFat = sum("HKQuantityTypeIdentifierDietaryFatSaturated");
|
|
34
|
+
const fiber = sum("HKQuantityTypeIdentifierDietaryFiber");
|
|
35
|
+
const sugar = sum("HKQuantityTypeIdentifierDietarySugar");
|
|
36
|
+
const cholesterol = sum("HKQuantityTypeIdentifierDietaryCholesterol");
|
|
37
|
+
const sodium = sum("HKQuantityTypeIdentifierDietarySodium");
|
|
38
|
+
// ── Micros ─────────────────────────────────────────────────────────────
|
|
39
|
+
const calcium = sum("HKQuantityTypeIdentifierDietaryCalcium");
|
|
40
|
+
const iron = sum("HKQuantityTypeIdentifierDietaryIron");
|
|
41
|
+
const potassium = sum("HKQuantityTypeIdentifierDietaryPotassium");
|
|
42
|
+
const vitaminA = sum("HKQuantityTypeIdentifierDietaryVitaminA");
|
|
43
|
+
const vitaminB6 = sum("HKQuantityTypeIdentifierDietaryVitaminB6");
|
|
44
|
+
const vitaminB12 = sum("HKQuantityTypeIdentifierDietaryVitaminB12");
|
|
45
|
+
const vitaminC = sum("HKQuantityTypeIdentifierDietaryVitaminC");
|
|
46
|
+
const vitaminD = sum("HKQuantityTypeIdentifierDietaryVitaminD");
|
|
47
|
+
const vitaminE = sum("HKQuantityTypeIdentifierDietaryVitaminE");
|
|
48
|
+
const vitaminK = sum("HKQuantityTypeIdentifierDietaryVitaminK");
|
|
49
|
+
const zinc = sum("HKQuantityTypeIdentifierDietaryZinc");
|
|
50
|
+
const magnesium = sum("HKQuantityTypeIdentifierDietaryMagnesium");
|
|
51
|
+
const manganese = sum("HKQuantityTypeIdentifierDietaryManganese");
|
|
52
|
+
const copper = sum("HKQuantityTypeIdentifierDietaryCopper");
|
|
53
|
+
const selenium = sum("HKQuantityTypeIdentifierDietarySelenium");
|
|
54
|
+
const chromium = sum("HKQuantityTypeIdentifierDietaryChromium");
|
|
55
|
+
const folate = sum("HKQuantityTypeIdentifierDietaryFolate");
|
|
56
|
+
const biotin = sum("HKQuantityTypeIdentifierDietaryBiotin");
|
|
57
|
+
const niacin = sum("HKQuantityTypeIdentifierDietaryNiacin");
|
|
58
|
+
const phosphorus = sum("HKQuantityTypeIdentifierDietaryPhosphorus");
|
|
59
|
+
const riboflavin = sum("HKQuantityTypeIdentifierDietaryRiboflavin");
|
|
60
|
+
const thiamin = sum("HKQuantityTypeIdentifierDietaryThiamin");
|
|
61
|
+
const caffeine = sum("HKQuantityTypeIdentifierDietaryCaffeine");
|
|
62
|
+
const iodine = sum("HKQuantityTypeIdentifierDietaryIodine");
|
|
63
|
+
const chloride = sum("HKQuantityTypeIdentifierDietaryChloride");
|
|
64
|
+
const pantothenicAcid = sum("HKQuantityTypeIdentifierDietaryPanthothenicAcid");
|
|
65
|
+
// ── Fats breakdown ─────────────────────────────────────────────────────
|
|
66
|
+
const monoFat = sum("HKQuantityTypeIdentifierDietaryFatMonounsaturated");
|
|
67
|
+
const polyFat = sum("HKQuantityTypeIdentifierDietaryFatPolyunsaturated");
|
|
68
|
+
// ── Water ──────────────────────────────────────────────────────────────
|
|
69
|
+
const waterSamples = filterByType(samples, "HKQuantityTypeIdentifierDietaryWater");
|
|
70
|
+
const waterMl = waterSamples.length > 0 ? sumValues(waterSamples) * 1000 : undefined; // L → mL
|
|
71
|
+
const hasMacros = calories != null ||
|
|
72
|
+
protein != null ||
|
|
73
|
+
carbs != null ||
|
|
74
|
+
fat != null;
|
|
75
|
+
const hasMicros = calcium != null ||
|
|
76
|
+
iron != null ||
|
|
77
|
+
vitaminC != null ||
|
|
78
|
+
zinc != null ||
|
|
79
|
+
magnesium != null;
|
|
80
|
+
return {
|
|
81
|
+
metadata: {
|
|
82
|
+
start_time: range.start_time,
|
|
83
|
+
end_time: range.end_time,
|
|
84
|
+
},
|
|
85
|
+
summary: {
|
|
86
|
+
macros: hasMacros
|
|
87
|
+
? {
|
|
88
|
+
calories,
|
|
89
|
+
protein_g: protein,
|
|
90
|
+
carbohydrates_g: carbs,
|
|
91
|
+
fat_g: fat,
|
|
92
|
+
saturated_fat_g: saturatedFat,
|
|
93
|
+
fiber_g: fiber,
|
|
94
|
+
sugar_g: sugar,
|
|
95
|
+
cholesterol_mg: cholesterol,
|
|
96
|
+
sodium_mg: sodium,
|
|
97
|
+
}
|
|
98
|
+
: undefined,
|
|
99
|
+
micros: hasMicros
|
|
100
|
+
? {
|
|
101
|
+
calcium_mg: calcium,
|
|
102
|
+
iron_mg: iron,
|
|
103
|
+
potassium_mg: potassium,
|
|
104
|
+
vitamin_A_mg: vitaminA,
|
|
105
|
+
vitamin_B6_mg: vitaminB6,
|
|
106
|
+
vitamin_B12_mg: vitaminB12,
|
|
107
|
+
vitamin_C_mg: vitaminC,
|
|
108
|
+
vitamin_D_mg: vitaminD,
|
|
109
|
+
vitamin_E_mg: vitaminE,
|
|
110
|
+
vitamin_K_mg: vitaminK,
|
|
111
|
+
zinc_mg: zinc,
|
|
112
|
+
magnesium_mg: magnesium,
|
|
113
|
+
manganese_mg: manganese,
|
|
114
|
+
copper_mg: copper,
|
|
115
|
+
selenium_mg: selenium,
|
|
116
|
+
chromium_mg: chromium,
|
|
117
|
+
folate_mg: folate,
|
|
118
|
+
biotin_mg: biotin,
|
|
119
|
+
niacin_mg: niacin,
|
|
120
|
+
phosphorus_mg: phosphorus,
|
|
121
|
+
riboflavin_mg: riboflavin,
|
|
122
|
+
thiamin_mg: thiamin,
|
|
123
|
+
caffeine_mg: caffeine,
|
|
124
|
+
iodine_mg: iodine,
|
|
125
|
+
chloride_mg: chloride,
|
|
126
|
+
pantothenic_acid_mg: pantothenicAcid,
|
|
127
|
+
monounsaturated_fat_g: monoFat,
|
|
128
|
+
polyunsaturated_fat_g: polyFat,
|
|
129
|
+
}
|
|
130
|
+
: undefined,
|
|
131
|
+
water_ml: waterMl,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=nutrition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nutrition.js","sourceRoot":"","sources":["../../src/healthkit/nutrition.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,sFAAsF;AAGtF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOtE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA2B,EAC3B,SAAoD;IAEpD,MAAM,KAAK,GAAG,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,GAAG,CAAC,+CAA+C,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,GAAG,CAAC,6CAA6C,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,GAAG,CAAC,4CAA4C,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAE5D,0EAA0E;IAC1E,MAAM,OAAO,GAAG,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,GAAG,CACzB,iDAAiD,CAClD,CAAC;IAEF,0EAA0E;IAC1E,MAAM,OAAO,GAAG,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEzE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,YAAY,CAC/B,OAAO,EACP,sCAAsC,CACvC,CAAC;IACF,MAAM,OAAO,GACX,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;IAEjF,MAAM,SAAS,GACb,QAAQ,IAAI,IAAI;QAChB,OAAO,IAAI,IAAI;QACf,KAAK,IAAI,IAAI;QACb,GAAG,IAAI,IAAI,CAAC;IAEd,MAAM,SAAS,GACb,OAAO,IAAI,IAAI;QACf,IAAI,IAAI,IAAI;QACZ,QAAQ,IAAI,IAAI;QAChB,IAAI,IAAI,IAAI;QACZ,SAAS,IAAI,IAAI,CAAC;IAEpB,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;QAED,OAAO,EAAE;YACP,MAAM,EAAE,SAAS;gBACf,CAAC,CAAC;oBACE,QAAQ;oBACR,SAAS,EAAE,OAAO;oBAClB,eAAe,EAAE,KAAK;oBACtB,KAAK,EAAE,GAAG;oBACV,eAAe,EAAE,YAAY;oBAC7B,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,KAAK;oBACd,cAAc,EAAE,WAAW;oBAC3B,SAAS,EAAE,MAAM;iBAClB;gBACH,CAAC,CAAC,SAAS;YACb,MAAM,EAAE,SAAS;gBACf,CAAC,CAAC;oBACE,UAAU,EAAE,OAAO;oBACnB,OAAO,EAAE,IAAI;oBACb,YAAY,EAAE,SAAS;oBACvB,YAAY,EAAE,QAAQ;oBACtB,aAAa,EAAE,SAAS;oBACxB,cAAc,EAAE,UAAU;oBAC1B,YAAY,EAAE,QAAQ;oBACtB,YAAY,EAAE,QAAQ;oBACtB,YAAY,EAAE,QAAQ;oBACtB,YAAY,EAAE,QAAQ;oBACtB,OAAO,EAAE,IAAI;oBACb,YAAY,EAAE,SAAS;oBACvB,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,MAAM;oBACjB,WAAW,EAAE,QAAQ;oBACrB,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,MAAM;oBACjB,aAAa,EAAE,UAAU;oBACzB,aAAa,EAAE,UAAU;oBACzB,UAAU,EAAE,OAAO;oBACnB,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,MAAM;oBACjB,WAAW,EAAE,QAAQ;oBACrB,mBAAmB,EAAE,eAAe;oBACpC,qBAAqB,EAAE,OAAO;oBAC9B,qBAAqB,EAAE,OAAO;iBAC/B;gBACH,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,OAAO;SAClB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { HKCategorySample } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The output shape of {@link transformSleep}.
|
|
4
|
+
*/
|
|
5
|
+
export type SleepData = ReturnType<typeof transformSleep>;
|
|
6
|
+
/**
|
|
7
|
+
* Transform an array of HealthKit sleep analysis category samples into a
|
|
8
|
+
* Soma Sleep document shape.
|
|
9
|
+
*
|
|
10
|
+
* HealthKit stores sleep as individual `HKCategorySample` records — one per
|
|
11
|
+
* sleep stage segment. This function aggregates them into a single session
|
|
12
|
+
* with computed durations, a hypnogram, and efficiency score.
|
|
13
|
+
*
|
|
14
|
+
* @param samples - Array of HKCategorySample with sampleType "HKCategoryTypeIdentifierSleepAnalysis".
|
|
15
|
+
* Should represent a single sleep session (all samples from one night).
|
|
16
|
+
* @returns Soma Sleep fields (without connectionId/userId)
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const data = transformSleep(hkSleepSamples);
|
|
21
|
+
* await soma.ingestSleep(ctx, { connectionId, userId, ...data });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function transformSleep(samples: HKCategorySample[]): {
|
|
25
|
+
metadata: {
|
|
26
|
+
start_time: string;
|
|
27
|
+
end_time: string;
|
|
28
|
+
summary_id: string;
|
|
29
|
+
upload_type: 2;
|
|
30
|
+
is_nap: boolean;
|
|
31
|
+
};
|
|
32
|
+
device_data: {
|
|
33
|
+
name?: string;
|
|
34
|
+
manufacturer?: string;
|
|
35
|
+
hardware_version?: string;
|
|
36
|
+
software_version?: string;
|
|
37
|
+
} | undefined;
|
|
38
|
+
sleep_durations_data: {
|
|
39
|
+
asleep: {
|
|
40
|
+
duration_asleep_state_seconds: number;
|
|
41
|
+
duration_deep_sleep_state_seconds: number | undefined;
|
|
42
|
+
duration_light_sleep_state_seconds: number | undefined;
|
|
43
|
+
duration_REM_sleep_state_seconds: number | undefined;
|
|
44
|
+
num_REM_events: number | undefined;
|
|
45
|
+
};
|
|
46
|
+
awake: {
|
|
47
|
+
duration_awake_state_seconds: number | undefined;
|
|
48
|
+
num_wakeup_events: number | undefined;
|
|
49
|
+
};
|
|
50
|
+
hypnogram_samples: {
|
|
51
|
+
timestamp: string;
|
|
52
|
+
level: number;
|
|
53
|
+
}[] | undefined;
|
|
54
|
+
other: {
|
|
55
|
+
duration_in_bed_seconds: number;
|
|
56
|
+
};
|
|
57
|
+
sleep_efficiency: number | undefined;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=sleep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/healthkit/sleep.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGzD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// ─── Sleep Transformer ───────────────────────────────────────────────────────
|
|
2
|
+
// Transforms Apple HealthKit sleep analysis samples into the Soma Sleep schema.
|
|
3
|
+
import { HKSleepCategory } from "./types.js";
|
|
4
|
+
import { mapSleepLevel, isAsleepCategory } from "./maps/sleep-level.js";
|
|
5
|
+
import { diffSeconds, buildDeviceData } from "./utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* Transform an array of HealthKit sleep analysis category samples into a
|
|
8
|
+
* Soma Sleep document shape.
|
|
9
|
+
*
|
|
10
|
+
* HealthKit stores sleep as individual `HKCategorySample` records — one per
|
|
11
|
+
* sleep stage segment. This function aggregates them into a single session
|
|
12
|
+
* with computed durations, a hypnogram, and efficiency score.
|
|
13
|
+
*
|
|
14
|
+
* @param samples - Array of HKCategorySample with sampleType "HKCategoryTypeIdentifierSleepAnalysis".
|
|
15
|
+
* Should represent a single sleep session (all samples from one night).
|
|
16
|
+
* @returns Soma Sleep fields (without connectionId/userId)
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const data = transformSleep(hkSleepSamples);
|
|
21
|
+
* await soma.ingestSleep(ctx, { connectionId, userId, ...data });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function transformSleep(samples) {
|
|
25
|
+
if (samples.length === 0) {
|
|
26
|
+
throw new Error("transformSleep requires at least one sleep sample");
|
|
27
|
+
}
|
|
28
|
+
// Sort by start time
|
|
29
|
+
const sorted = [...samples].sort((a, b) => new Date(a.startDate).getTime() - new Date(b.startDate).getTime());
|
|
30
|
+
const sessionStart = sorted[0].startDate;
|
|
31
|
+
const sessionEnd = sorted[sorted.length - 1].endDate;
|
|
32
|
+
// Compute stage durations
|
|
33
|
+
let deepSeconds = 0;
|
|
34
|
+
let lightSeconds = 0;
|
|
35
|
+
let remSeconds = 0;
|
|
36
|
+
let awakeSeconds = 0;
|
|
37
|
+
let asleepUnspecifiedSeconds = 0;
|
|
38
|
+
let inBedSeconds = 0;
|
|
39
|
+
let wakeupEvents = 0;
|
|
40
|
+
let remEvents = 0;
|
|
41
|
+
for (const sample of sorted) {
|
|
42
|
+
const duration = diffSeconds(sample.startDate, sample.endDate);
|
|
43
|
+
switch (sample.value) {
|
|
44
|
+
case HKSleepCategory.AsleepDeep:
|
|
45
|
+
deepSeconds += duration;
|
|
46
|
+
break;
|
|
47
|
+
case HKSleepCategory.AsleepCore:
|
|
48
|
+
lightSeconds += duration;
|
|
49
|
+
break;
|
|
50
|
+
case HKSleepCategory.AsleepREM:
|
|
51
|
+
remSeconds += duration;
|
|
52
|
+
remEvents++;
|
|
53
|
+
break;
|
|
54
|
+
case HKSleepCategory.Awake:
|
|
55
|
+
awakeSeconds += duration;
|
|
56
|
+
wakeupEvents++;
|
|
57
|
+
break;
|
|
58
|
+
case HKSleepCategory.AsleepUnspecified:
|
|
59
|
+
asleepUnspecifiedSeconds += duration;
|
|
60
|
+
break;
|
|
61
|
+
case HKSleepCategory.InBed:
|
|
62
|
+
inBedSeconds += duration;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const totalAsleepSeconds = deepSeconds + lightSeconds + remSeconds + asleepUnspecifiedSeconds;
|
|
67
|
+
const totalInBedSeconds = diffSeconds(sessionStart, sessionEnd);
|
|
68
|
+
const sleepEfficiency = totalInBedSeconds > 0 ? totalAsleepSeconds / totalInBedSeconds : undefined;
|
|
69
|
+
// Build hypnogram
|
|
70
|
+
const hypnogramSamples = sorted
|
|
71
|
+
.filter((s) => s.value !== HKSleepCategory.InBed)
|
|
72
|
+
.map((s) => ({
|
|
73
|
+
timestamp: s.startDate,
|
|
74
|
+
level: mapSleepLevel(s.value),
|
|
75
|
+
}));
|
|
76
|
+
// Determine if this is a nap (< 3 hours)
|
|
77
|
+
const isNap = totalInBedSeconds < 3 * 60 * 60;
|
|
78
|
+
const firstSample = sorted[0];
|
|
79
|
+
return {
|
|
80
|
+
metadata: {
|
|
81
|
+
start_time: sessionStart,
|
|
82
|
+
end_time: sessionEnd,
|
|
83
|
+
summary_id: firstSample.uuid,
|
|
84
|
+
upload_type: 2, // Automatic
|
|
85
|
+
is_nap: isNap,
|
|
86
|
+
},
|
|
87
|
+
device_data: buildDeviceData(firstSample.source, firstSample.device),
|
|
88
|
+
sleep_durations_data: {
|
|
89
|
+
asleep: {
|
|
90
|
+
duration_asleep_state_seconds: totalAsleepSeconds,
|
|
91
|
+
duration_deep_sleep_state_seconds: deepSeconds > 0 ? deepSeconds : undefined,
|
|
92
|
+
duration_light_sleep_state_seconds: lightSeconds > 0 ? lightSeconds : undefined,
|
|
93
|
+
duration_REM_sleep_state_seconds: remSeconds > 0 ? remSeconds : undefined,
|
|
94
|
+
num_REM_events: remEvents > 0 ? remEvents : undefined,
|
|
95
|
+
},
|
|
96
|
+
awake: {
|
|
97
|
+
duration_awake_state_seconds: awakeSeconds > 0 ? awakeSeconds : undefined,
|
|
98
|
+
num_wakeup_events: wakeupEvents > 0 ? wakeupEvents : undefined,
|
|
99
|
+
},
|
|
100
|
+
hypnogram_samples: hypnogramSamples.length > 0 ? hypnogramSamples : undefined,
|
|
101
|
+
other: {
|
|
102
|
+
duration_in_bed_seconds: totalInBedSeconds,
|
|
103
|
+
},
|
|
104
|
+
sleep_efficiency: sleepEfficiency,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=sleep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/healthkit/sleep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export interface HKDevice {
|
|
2
|
+
name?: string;
|
|
3
|
+
manufacturer?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
hardwareVersion?: string;
|
|
6
|
+
softwareVersion?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HKSource {
|
|
9
|
+
name: string;
|
|
10
|
+
bundleIdentifier: string;
|
|
11
|
+
}
|
|
12
|
+
export interface HKQuantitySample {
|
|
13
|
+
uuid: string;
|
|
14
|
+
sampleType: HKQuantityTypeIdentifier;
|
|
15
|
+
startDate: string;
|
|
16
|
+
endDate: string;
|
|
17
|
+
value: number;
|
|
18
|
+
unit: string;
|
|
19
|
+
source?: HKSource;
|
|
20
|
+
device?: HKDevice;
|
|
21
|
+
}
|
|
22
|
+
export interface HKCategorySample {
|
|
23
|
+
uuid: string;
|
|
24
|
+
sampleType: HKCategoryTypeIdentifier;
|
|
25
|
+
startDate: string;
|
|
26
|
+
endDate: string;
|
|
27
|
+
value: number;
|
|
28
|
+
source?: HKSource;
|
|
29
|
+
device?: HKDevice;
|
|
30
|
+
}
|
|
31
|
+
export interface HKWorkoutRoute {
|
|
32
|
+
locations: Array<{
|
|
33
|
+
latitude: number;
|
|
34
|
+
longitude: number;
|
|
35
|
+
altitude?: number;
|
|
36
|
+
timestamp: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export interface HKWorkout {
|
|
40
|
+
uuid: string;
|
|
41
|
+
workoutActivityType: number;
|
|
42
|
+
startDate: string;
|
|
43
|
+
endDate: string;
|
|
44
|
+
duration: number;
|
|
45
|
+
totalEnergyBurned?: number;
|
|
46
|
+
totalDistance?: number;
|
|
47
|
+
totalSwimmingStrokeCount?: number;
|
|
48
|
+
totalFlightsClimbed?: number;
|
|
49
|
+
source?: HKSource;
|
|
50
|
+
device?: HKDevice;
|
|
51
|
+
heartRateSamples?: HKQuantitySample[];
|
|
52
|
+
routeData?: HKWorkoutRoute[];
|
|
53
|
+
}
|
|
54
|
+
export interface HKActivitySummary {
|
|
55
|
+
activeEnergyBurned: number;
|
|
56
|
+
activeEnergyBurnedGoal: number;
|
|
57
|
+
appleExerciseTime: number;
|
|
58
|
+
appleExerciseTimeGoal: number;
|
|
59
|
+
appleStandHours: number;
|
|
60
|
+
appleStandHoursGoal: number;
|
|
61
|
+
dateComponents: {
|
|
62
|
+
year: number;
|
|
63
|
+
month: number;
|
|
64
|
+
day: number;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface HKCharacteristics {
|
|
68
|
+
biologicalSex?: HKBiologicalSex;
|
|
69
|
+
dateOfBirth?: string;
|
|
70
|
+
bloodType?: string;
|
|
71
|
+
fitzpatrickSkinType?: number;
|
|
72
|
+
wheelchairUse?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export type HKBiologicalSex = "female" | "male" | "other" | "notSet";
|
|
75
|
+
export type HKQuantityTypeIdentifier = "HKQuantityTypeIdentifierBodyMass" | "HKQuantityTypeIdentifierHeight" | "HKQuantityTypeIdentifierBodyMassIndex" | "HKQuantityTypeIdentifierBodyFatPercentage" | "HKQuantityTypeIdentifierLeanBodyMass" | "HKQuantityTypeIdentifierHeartRate" | "HKQuantityTypeIdentifierRestingHeartRate" | "HKQuantityTypeIdentifierHeartRateVariabilitySDNN" | "HKQuantityTypeIdentifierHeartRateRecoveryOneMinute" | "HKQuantityTypeIdentifierBloodPressureSystolic" | "HKQuantityTypeIdentifierBloodPressureDiastolic" | "HKQuantityTypeIdentifierOxygenSaturation" | "HKQuantityTypeIdentifierVO2Max" | "HKQuantityTypeIdentifierRespiratoryRate" | "HKQuantityTypeIdentifierBloodGlucose" | "HKQuantityTypeIdentifierBodyTemperature" | "HKQuantityTypeIdentifierStepCount" | "HKQuantityTypeIdentifierDistanceWalkingRunning" | "HKQuantityTypeIdentifierDistanceCycling" | "HKQuantityTypeIdentifierDistanceSwimming" | "HKQuantityTypeIdentifierActiveEnergyBurned" | "HKQuantityTypeIdentifierBasalEnergyBurned" | "HKQuantityTypeIdentifierFlightsClimbed" | "HKQuantityTypeIdentifierAppleExerciseTime" | "HKQuantityTypeIdentifierAppleStandTime" | "HKQuantityTypeIdentifierDietaryEnergyConsumed" | "HKQuantityTypeIdentifierDietaryProtein" | "HKQuantityTypeIdentifierDietaryCarbohydrates" | "HKQuantityTypeIdentifierDietaryFatTotal" | "HKQuantityTypeIdentifierDietaryFatSaturated" | "HKQuantityTypeIdentifierDietaryFatMonounsaturated" | "HKQuantityTypeIdentifierDietaryFatPolyunsaturated" | "HKQuantityTypeIdentifierDietaryCholesterol" | "HKQuantityTypeIdentifierDietarySodium" | "HKQuantityTypeIdentifierDietarySugar" | "HKQuantityTypeIdentifierDietaryFiber" | "HKQuantityTypeIdentifierDietaryWater" | "HKQuantityTypeIdentifierDietaryCalcium" | "HKQuantityTypeIdentifierDietaryIron" | "HKQuantityTypeIdentifierDietaryPotassium" | "HKQuantityTypeIdentifierDietaryVitaminA" | "HKQuantityTypeIdentifierDietaryVitaminB6" | "HKQuantityTypeIdentifierDietaryVitaminB12" | "HKQuantityTypeIdentifierDietaryVitaminC" | "HKQuantityTypeIdentifierDietaryVitaminD" | "HKQuantityTypeIdentifierDietaryVitaminE" | "HKQuantityTypeIdentifierDietaryVitaminK" | "HKQuantityTypeIdentifierDietaryZinc" | "HKQuantityTypeIdentifierDietaryMagnesium" | "HKQuantityTypeIdentifierDietaryManganese" | "HKQuantityTypeIdentifierDietaryCopper" | "HKQuantityTypeIdentifierDietarySelenium" | "HKQuantityTypeIdentifierDietaryChromium" | "HKQuantityTypeIdentifierDietaryFolate" | "HKQuantityTypeIdentifierDietaryBiotin" | "HKQuantityTypeIdentifierDietaryNiacin" | "HKQuantityTypeIdentifierDietaryPhosphorus" | "HKQuantityTypeIdentifierDietaryRiboflavin" | "HKQuantityTypeIdentifierDietaryThiamin" | "HKQuantityTypeIdentifierDietaryCaffeine" | "HKQuantityTypeIdentifierDietaryIodine" | "HKQuantityTypeIdentifierDietaryChloride" | "HKQuantityTypeIdentifierDietaryPanthothenicAcid" | (string & {});
|
|
76
|
+
export type HKCategoryTypeIdentifier = "HKCategoryTypeIdentifierSleepAnalysis" | "HKCategoryTypeIdentifierMenstrualFlow" | "HKCategoryTypeIdentifierAppleStandHour" | (string & {});
|
|
77
|
+
export declare const HKSleepCategory: {
|
|
78
|
+
readonly InBed: 0;
|
|
79
|
+
readonly AsleepUnspecified: 1;
|
|
80
|
+
readonly Awake: 2;
|
|
81
|
+
readonly AsleepCore: 3;
|
|
82
|
+
readonly AsleepDeep: 4;
|
|
83
|
+
readonly AsleepREM: 5;
|
|
84
|
+
};
|
|
85
|
+
export type HKSleepCategoryValue = (typeof HKSleepCategory)[keyof typeof HKSleepCategory];
|
|
86
|
+
export declare const HKMenstrualFlowCategory: {
|
|
87
|
+
readonly Unspecified: 1;
|
|
88
|
+
readonly Light: 2;
|
|
89
|
+
readonly Medium: 3;
|
|
90
|
+
readonly Heavy: 4;
|
|
91
|
+
readonly None: 5;
|
|
92
|
+
};
|
|
93
|
+
export type HKMenstrualFlowCategoryValue = (typeof HKMenstrualFlowCategory)[keyof typeof HKMenstrualFlowCategory];
|
|
94
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/healthkit/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// ─── Apple HealthKit Input Types ──────────────────────────────────────────────
|
|
2
|
+
// Library-agnostic TypeScript interfaces representing HealthKit data shapes.
|
|
3
|
+
// Compatible with @kingstinct/react-native-healthkit, react-native-health,
|
|
4
|
+
// expo-health, or any custom native module.
|
|
5
|
+
//
|
|
6
|
+
// These types define the CONTRACT that the host app must satisfy when passing
|
|
7
|
+
// HealthKit data to Soma's transformer functions. They intentionally do NOT
|
|
8
|
+
// depend on any specific React Native library.
|
|
9
|
+
// ─── HealthKit Sleep Category Values ─────────────────────────────────────────
|
|
10
|
+
export const HKSleepCategory = {
|
|
11
|
+
InBed: 0,
|
|
12
|
+
AsleepUnspecified: 1,
|
|
13
|
+
Awake: 2,
|
|
14
|
+
AsleepCore: 3,
|
|
15
|
+
AsleepDeep: 4,
|
|
16
|
+
AsleepREM: 5,
|
|
17
|
+
};
|
|
18
|
+
// ─── HealthKit Menstrual Flow Values ─────────────────────────────────────────
|
|
19
|
+
export const HKMenstrualFlowCategory = {
|
|
20
|
+
Unspecified: 1,
|
|
21
|
+
Light: 2,
|
|
22
|
+
Medium: 3,
|
|
23
|
+
Heavy: 4,
|
|
24
|
+
None: 5,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/healthkit/types.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,6EAA6E;AAC7E,2EAA2E;AAC3E,4CAA4C;AAC5C,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,+CAA+C;AA0L/C,gFAAgF;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,CAAC;IACR,iBAAiB,EAAE,CAAC;IACpB,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;CACJ,CAAC;AAKX,gFAAgF;AAEhF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,WAAW,EAAE,CAAC;IACd,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;CACC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { HKDevice, HKQuantitySample, HKSource } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compute the difference in seconds between two ISO-8601 timestamps.
|
|
4
|
+
*/
|
|
5
|
+
export declare function diffSeconds(start: string, end: string): number;
|
|
6
|
+
/**
|
|
7
|
+
* Build the start-of-day and end-of-day ISO-8601 strings for a date.
|
|
8
|
+
*/
|
|
9
|
+
export declare function dayRange(date: {
|
|
10
|
+
year: number;
|
|
11
|
+
month: number;
|
|
12
|
+
day: number;
|
|
13
|
+
}): {
|
|
14
|
+
start_time: string;
|
|
15
|
+
end_time: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Find the earliest startDate and latest endDate in an array of samples.
|
|
19
|
+
* Returns ISO-8601 strings. Falls back to provided defaults if array is empty.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sampleTimeRange(samples: Array<{
|
|
22
|
+
startDate: string;
|
|
23
|
+
endDate: string;
|
|
24
|
+
}>, fallback?: {
|
|
25
|
+
start_time: string;
|
|
26
|
+
end_time: string;
|
|
27
|
+
}): {
|
|
28
|
+
start_time: string;
|
|
29
|
+
end_time: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Build a Soma DeviceData object from HealthKit source and device metadata.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildDeviceData(source?: HKSource, device?: HKDevice): {
|
|
35
|
+
name?: string;
|
|
36
|
+
manufacturer?: string;
|
|
37
|
+
hardware_version?: string;
|
|
38
|
+
software_version?: string;
|
|
39
|
+
} | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Filter an array of HKQuantitySamples by sampleType identifier.
|
|
42
|
+
*/
|
|
43
|
+
export declare function filterByType(samples: HKQuantitySample[], sampleType: string): HKQuantitySample[];
|
|
44
|
+
/**
|
|
45
|
+
* Sum the values of quantity samples.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sumValues(samples: HKQuantitySample[]): number;
|
|
48
|
+
/**
|
|
49
|
+
* Average the values of quantity samples.
|
|
50
|
+
* Returns undefined if the array is empty.
|
|
51
|
+
*/
|
|
52
|
+
export declare function avgValue(samples: HKQuantitySample[]): number | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Min value in a set of quantity samples.
|
|
55
|
+
* Returns undefined if the array is empty.
|
|
56
|
+
*/
|
|
57
|
+
export declare function minValue(samples: HKQuantitySample[]): number | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Max value in a set of quantity samples.
|
|
60
|
+
* Returns undefined if the array is empty.
|
|
61
|
+
*/
|
|
62
|
+
export declare function maxValue(samples: HKQuantitySample[]): number | undefined;
|
|
63
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/healthkit/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvE;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAO3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,QAAQ,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAmB1C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,CAAC,EAAE,QAAQ,EACjB,MAAM,CAAC,EAAE,QAAQ,GAEf;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACD,SAAS,CAQZ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,gBAAgB,EAAE,CAEpB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,GAAG,SAAS,CAGxE"}
|