skill-calorie 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/dist/analysis/anomaly/common.d.ts +53 -0
- package/dist/analysis/anomaly/common.d.ts.map +1 -0
- package/dist/analysis/anomaly/common.js +69 -0
- package/dist/analysis/anomaly/common.js.map +1 -0
- package/dist/analysis/anomaly/diet.d.ts +8 -0
- package/dist/analysis/anomaly/diet.d.ts.map +1 -0
- package/dist/analysis/anomaly/diet.js +95 -0
- package/dist/analysis/anomaly/diet.js.map +1 -0
- package/dist/analysis/anomaly/exercise.d.ts +9 -0
- package/dist/analysis/anomaly/exercise.d.ts.map +1 -0
- package/dist/analysis/anomaly/exercise.js +116 -0
- package/dist/analysis/anomaly/exercise.js.map +1 -0
- package/dist/analysis/anomaly/index.d.ts +19 -0
- package/dist/analysis/anomaly/index.d.ts.map +1 -0
- package/dist/analysis/anomaly/index.js +51 -0
- package/dist/analysis/anomaly/index.js.map +1 -0
- package/dist/analysis/anomaly/overall.d.ts +13 -0
- package/dist/analysis/anomaly/overall.d.ts.map +1 -0
- package/dist/analysis/anomaly/overall.js +128 -0
- package/dist/analysis/anomaly/overall.js.map +1 -0
- package/dist/analysis/anomaly/overall2.d.ts +5 -0
- package/dist/analysis/anomaly/overall2.d.ts.map +1 -0
- package/dist/analysis/anomaly/overall2.js +94 -0
- package/dist/analysis/anomaly/overall2.js.map +1 -0
- package/dist/analysis/anomaly/weight.d.ts +8 -0
- package/dist/analysis/anomaly/weight.d.ts.map +1 -0
- package/dist/analysis/anomaly/weight.js +106 -0
- package/dist/analysis/anomaly/weight.js.map +1 -0
- package/dist/analysis/anomaly/weight2.d.ts +4 -0
- package/dist/analysis/anomaly/weight2.d.ts.map +1 -0
- package/dist/analysis/anomaly/weight2.js +59 -0
- package/dist/analysis/anomaly/weight2.js.map +1 -0
- package/dist/analysis/contraindications.d.ts +63 -0
- package/dist/analysis/contraindications.d.ts.map +1 -0
- package/dist/analysis/contraindications.js +121 -0
- package/dist/analysis/contraindications.js.map +1 -0
- package/dist/analysis/cross.d.ts +75 -0
- package/dist/analysis/cross.d.ts.map +1 -0
- package/dist/analysis/cross.js +283 -0
- package/dist/analysis/cross.js.map +1 -0
- package/dist/analysis/dashboard.d.ts +18 -0
- package/dist/analysis/dashboard.d.ts.map +1 -0
- package/dist/analysis/dashboard.js +48 -0
- package/dist/analysis/dashboard.js.map +1 -0
- package/dist/analysis/deficit.d.ts +44 -0
- package/dist/analysis/deficit.d.ts.map +1 -0
- package/dist/analysis/deficit.js +54 -0
- package/dist/analysis/deficit.js.map +1 -0
- package/dist/analysis/diet.d.ts +76 -0
- package/dist/analysis/diet.d.ts.map +1 -0
- package/dist/analysis/diet.js +164 -0
- package/dist/analysis/diet.js.map +1 -0
- package/dist/analysis/exercise.d.ts +98 -0
- package/dist/analysis/exercise.d.ts.map +1 -0
- package/dist/analysis/exercise.js +298 -0
- package/dist/analysis/exercise.js.map +1 -0
- package/dist/analysis/exerciseReview.d.ts +36 -0
- package/dist/analysis/exerciseReview.d.ts.map +1 -0
- package/dist/analysis/exerciseReview.js +50 -0
- package/dist/analysis/exerciseReview.js.map +1 -0
- package/dist/analysis/precision.d.ts +15 -0
- package/dist/analysis/precision.d.ts.map +1 -0
- package/dist/analysis/precision.js +38 -0
- package/dist/analysis/precision.js.map +1 -0
- package/dist/analysis/result.d.ts +15 -0
- package/dist/analysis/result.d.ts.map +1 -0
- package/dist/analysis/result.js +13 -0
- package/dist/analysis/result.js.map +1 -0
- package/dist/analysis/review.d.ts +118 -0
- package/dist/analysis/review.d.ts.map +1 -0
- package/dist/analysis/review.js +195 -0
- package/dist/analysis/review.js.map +1 -0
- package/dist/analysis/series.d.ts +42 -0
- package/dist/analysis/series.d.ts.map +1 -0
- package/dist/analysis/series.js +127 -0
- package/dist/analysis/series.js.map +1 -0
- package/dist/analysis/simulate.d.ts +43 -0
- package/dist/analysis/simulate.d.ts.map +1 -0
- package/dist/analysis/simulate.js +109 -0
- package/dist/analysis/simulate.js.map +1 -0
- package/dist/analysis/simulate2.d.ts +65 -0
- package/dist/analysis/simulate2.d.ts.map +1 -0
- package/dist/analysis/simulate2.js +173 -0
- package/dist/analysis/simulate2.js.map +1 -0
- package/dist/analysis/trend.d.ts +39 -0
- package/dist/analysis/trend.d.ts.map +1 -0
- package/dist/analysis/trend.js +48 -0
- package/dist/analysis/trend.js.map +1 -0
- package/dist/analysis/utils.d.ts +17 -0
- package/dist/analysis/utils.d.ts.map +1 -0
- package/dist/analysis/utils.js +52 -0
- package/dist/analysis/utils.js.map +1 -0
- package/dist/analysis/volatility.d.ts +43 -0
- package/dist/analysis/volatility.d.ts.map +1 -0
- package/dist/analysis/volatility.js +96 -0
- package/dist/analysis/volatility.js.map +1 -0
- package/dist/analysis/weight.d.ts +86 -0
- package/dist/analysis/weight.d.ts.map +1 -0
- package/dist/analysis/weight.js +219 -0
- package/dist/analysis/weight.js.map +1 -0
- package/dist/analysis/weightCompare.d.ts +63 -0
- package/dist/analysis/weightCompare.d.ts.map +1 -0
- package/dist/analysis/weightCompare.js +212 -0
- package/dist/analysis/weightCompare.js.map +1 -0
- package/dist/analysis/weightCompare2.d.ts +63 -0
- package/dist/analysis/weightCompare2.d.ts.map +1 -0
- package/dist/analysis/weightCompare2.js +211 -0
- package/dist/analysis/weightCompare2.js.map +1 -0
- package/dist/analysis/weightCompare3.d.ts +13 -0
- package/dist/analysis/weightCompare3.d.ts.map +1 -0
- package/dist/analysis/weightCompare3.js +199 -0
- package/dist/analysis/weightCompare3.js.map +1 -0
- package/dist/cli/cmd_read.d.ts +8 -0
- package/dist/cli/cmd_read.d.ts.map +1 -0
- package/dist/cli/cmd_read.js +719 -0
- package/dist/cli/cmd_read.js.map +1 -0
- package/dist/cli/keys.d.ts +333 -0
- package/dist/cli/keys.d.ts.map +1 -0
- package/dist/cli/keys.js +103 -0
- package/dist/cli/keys.js.map +1 -0
- package/dist/cli/write.d.ts +24 -0
- package/dist/cli/write.d.ts.map +1 -0
- package/dist/cli/write.js +832 -0
- package/dist/cli/write.js.map +1 -0
- package/dist/fetch/audit.d.ts +25 -0
- package/dist/fetch/audit.d.ts.map +1 -0
- package/dist/fetch/audit.js +46 -0
- package/dist/fetch/audit.js.map +1 -0
- package/dist/fetch/batch.d.ts +68 -0
- package/dist/fetch/batch.d.ts.map +1 -0
- package/dist/fetch/batch.js +183 -0
- package/dist/fetch/batch.js.map +1 -0
- package/dist/fetch/body.d.ts +89 -0
- package/dist/fetch/body.d.ts.map +1 -0
- package/dist/fetch/body.js +217 -0
- package/dist/fetch/body.js.map +1 -0
- package/dist/fetch/cli.d.ts +3 -0
- package/dist/fetch/cli.d.ts.map +1 -0
- package/dist/fetch/cli.js +195 -0
- package/dist/fetch/cli.js.map +1 -0
- package/dist/fetch/cross-skill.d.ts +29 -0
- package/dist/fetch/cross-skill.d.ts.map +1 -0
- package/dist/fetch/cross-skill.js +42 -0
- package/dist/fetch/cross-skill.js.map +1 -0
- package/dist/fetch/db.d.ts +5 -0
- package/dist/fetch/db.d.ts.map +1 -0
- package/dist/fetch/db.js +4 -0
- package/dist/fetch/db.js.map +1 -0
- package/dist/fetch/diet.d.ts +174 -0
- package/dist/fetch/diet.d.ts.map +1 -0
- package/dist/fetch/diet.js +239 -0
- package/dist/fetch/diet.js.map +1 -0
- package/dist/fetch/errors.d.ts +5 -0
- package/dist/fetch/errors.d.ts.map +1 -0
- package/dist/fetch/errors.js +8 -0
- package/dist/fetch/errors.js.map +1 -0
- package/dist/fetch/exercise.d.ts +72 -0
- package/dist/fetch/exercise.d.ts.map +1 -0
- package/dist/fetch/exercise.js +270 -0
- package/dist/fetch/exercise.js.map +1 -0
- package/dist/fetch/goal.d.ts +48 -0
- package/dist/fetch/goal.d.ts.map +1 -0
- package/dist/fetch/goal.js +73 -0
- package/dist/fetch/goal.js.map +1 -0
- package/dist/fetch/goalHistory.d.ts +24 -0
- package/dist/fetch/goalHistory.d.ts.map +1 -0
- package/dist/fetch/goalHistory.js +51 -0
- package/dist/fetch/goalHistory.js.map +1 -0
- package/dist/fetch/history.d.ts +28 -0
- package/dist/fetch/history.d.ts.map +1 -0
- package/dist/fetch/history.js +29 -0
- package/dist/fetch/history.js.map +1 -0
- package/dist/fetch/index.d.ts +23 -0
- package/dist/fetch/index.d.ts.map +1 -0
- package/dist/fetch/index.js +16 -0
- package/dist/fetch/index.js.map +1 -0
- package/dist/fetch/nutritionGoal.d.ts +115 -0
- package/dist/fetch/nutritionGoal.d.ts.map +1 -0
- package/dist/fetch/nutritionGoal.js +154 -0
- package/dist/fetch/nutritionGoal.js.map +1 -0
- package/dist/fetch/photos.d.ts +76 -0
- package/dist/fetch/photos.d.ts.map +1 -0
- package/dist/fetch/photos.js +193 -0
- package/dist/fetch/photos.js.map +1 -0
- package/dist/fetch/plan.d.ts +145 -0
- package/dist/fetch/plan.d.ts.map +1 -0
- package/dist/fetch/plan.js +258 -0
- package/dist/fetch/plan.js.map +1 -0
- package/dist/fetch/products.d.ts +62 -0
- package/dist/fetch/products.d.ts.map +1 -0
- package/dist/fetch/products.js +73 -0
- package/dist/fetch/products.js.map +1 -0
- package/dist/fetch/profile.d.ts +46 -0
- package/dist/fetch/profile.d.ts.map +1 -0
- package/dist/fetch/profile.js +105 -0
- package/dist/fetch/profile.js.map +1 -0
- package/dist/fetch/shapes.d.ts +41 -0
- package/dist/fetch/shapes.d.ts.map +1 -0
- package/dist/fetch/shapes.js +38 -0
- package/dist/fetch/shapes.js.map +1 -0
- package/dist/fetch/validate.d.ts +11 -0
- package/dist/fetch/validate.d.ts.map +1 -0
- package/dist/fetch/validate.js +64 -0
- package/dist/fetch/validate.js.map +1 -0
- package/dist/fetch/weight.d.ts +109 -0
- package/dist/fetch/weight.d.ts.map +1 -0
- package/dist/fetch/weight.js +210 -0
- package/dist/fetch/weight.js.map +1 -0
- package/dist/fetch/xunji-catalog.d.ts +17 -0
- package/dist/fetch/xunji-catalog.d.ts.map +1 -0
- package/dist/fetch/xunji-catalog.js +57 -0
- package/dist/fetch/xunji-catalog.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/kcal.d.ts +21 -0
- package/dist/kcal.d.ts.map +1 -0
- package/dist/kcal.js +27 -0
- package/dist/kcal.js.map +1 -0
- package/dist/migrate/migrate.d.ts +71 -0
- package/dist/migrate/migrate.d.ts.map +1 -0
- package/dist/migrate/migrate.js +450 -0
- package/dist/migrate/migrate.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +34 -0
- package/dist/paths.js.map +1 -0
- package/dist/render/analysisPlate.d.ts +49 -0
- package/dist/render/analysisPlate.d.ts.map +1 -0
- package/dist/render/analysisPlate.js +149 -0
- package/dist/render/analysisPlate.js.map +1 -0
- package/dist/render/bodyPlate.d.ts +55 -0
- package/dist/render/bodyPlate.d.ts.map +1 -0
- package/dist/render/bodyPlate.js +97 -0
- package/dist/render/bodyPlate.js.map +1 -0
- package/dist/render/diet.d.ts +47 -0
- package/dist/render/diet.d.ts.map +1 -0
- package/dist/render/diet.js +94 -0
- package/dist/render/diet.js.map +1 -0
- package/dist/render/envelope.d.ts +60 -0
- package/dist/render/envelope.d.ts.map +1 -0
- package/dist/render/envelope.js +111 -0
- package/dist/render/envelope.js.map +1 -0
- package/dist/render/errors.d.ts +10 -0
- package/dist/render/errors.d.ts.map +1 -0
- package/dist/render/errors.js +9 -0
- package/dist/render/errors.js.map +1 -0
- package/dist/render/exercise.d.ts +20 -0
- package/dist/render/exercise.d.ts.map +1 -0
- package/dist/render/exercise.js +32 -0
- package/dist/render/exercise.js.map +1 -0
- package/dist/render/goal.d.ts +24 -0
- package/dist/render/goal.d.ts.map +1 -0
- package/dist/render/goal.js +23 -0
- package/dist/render/goal.js.map +1 -0
- package/dist/render/goalExtra.d.ts +45 -0
- package/dist/render/goalExtra.d.ts.map +1 -0
- package/dist/render/goalExtra.js +94 -0
- package/dist/render/goalExtra.js.map +1 -0
- package/dist/render/goalPlate.d.ts +66 -0
- package/dist/render/goalPlate.d.ts.map +1 -0
- package/dist/render/goalPlate.js +110 -0
- package/dist/render/goalPlate.js.map +1 -0
- package/dist/render/health.d.ts +21 -0
- package/dist/render/health.d.ts.map +1 -0
- package/dist/render/health.js +41 -0
- package/dist/render/health.js.map +1 -0
- package/dist/render/help.d.ts +18 -0
- package/dist/render/help.d.ts.map +1 -0
- package/dist/render/help.js +58 -0
- package/dist/render/help.js.map +1 -0
- package/dist/render/home.d.ts +30 -0
- package/dist/render/home.d.ts.map +1 -0
- package/dist/render/home.js +73 -0
- package/dist/render/home.js.map +1 -0
- package/dist/render/html.d.ts +66 -0
- package/dist/render/html.d.ts.map +1 -0
- package/dist/render/html.js +510 -0
- package/dist/render/html.js.map +1 -0
- package/dist/render/index.d.ts +47 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +26 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/insightPlate.d.ts +55 -0
- package/dist/render/insightPlate.d.ts.map +1 -0
- package/dist/render/insightPlate.js +97 -0
- package/dist/render/insightPlate.js.map +1 -0
- package/dist/render/library.d.ts +32 -0
- package/dist/render/library.d.ts.map +1 -0
- package/dist/render/library.js +54 -0
- package/dist/render/library.js.map +1 -0
- package/dist/render/photo.d.ts +101 -0
- package/dist/render/photo.d.ts.map +1 -0
- package/dist/render/photo.js +241 -0
- package/dist/render/photo.js.map +1 -0
- package/dist/render/planPlate.d.ts +40 -0
- package/dist/render/planPlate.d.ts.map +1 -0
- package/dist/render/planPlate.js +72 -0
- package/dist/render/planPlate.js.map +1 -0
- package/dist/render/profilePlate.d.ts +17 -0
- package/dist/render/profilePlate.d.ts.map +1 -0
- package/dist/render/profilePlate.js +18 -0
- package/dist/render/profilePlate.js.map +1 -0
- package/dist/render/ranking.d.ts +22 -0
- package/dist/render/ranking.d.ts.map +1 -0
- package/dist/render/ranking.js +63 -0
- package/dist/render/ranking.js.map +1 -0
- package/dist/render/receipt.d.ts +71 -0
- package/dist/render/receipt.d.ts.map +1 -0
- package/dist/render/receipt.js +65 -0
- package/dist/render/receipt.js.map +1 -0
- package/dist/render/weightPlate.d.ts +54 -0
- package/dist/render/weightPlate.d.ts.map +1 -0
- package/dist/render/weightPlate.js +110 -0
- package/dist/render/weightPlate.js.map +1 -0
- package/dist/schema.d.ts +25 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +281 -0
- package/dist/schema.js.map +1 -0
- package/dist/triggers/help-lookup.d.ts +28 -0
- package/dist/triggers/help-lookup.d.ts.map +1 -0
- package/dist/triggers/help-lookup.js +163 -0
- package/dist/triggers/help-lookup.js.map +1 -0
- package/dist/triggers/index.d.ts +24 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +78 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/scene-01-home.d.ts +4 -0
- package/dist/triggers/scene-01-home.d.ts.map +1 -0
- package/dist/triggers/scene-01-home.js +13 -0
- package/dist/triggers/scene-01-home.js.map +1 -0
- package/dist/triggers/scene-02-diet.d.ts +4 -0
- package/dist/triggers/scene-02-diet.d.ts.map +1 -0
- package/dist/triggers/scene-02-diet.js +74 -0
- package/dist/triggers/scene-02-diet.js.map +1 -0
- package/dist/triggers/scene-03-weight.d.ts +4 -0
- package/dist/triggers/scene-03-weight.d.ts.map +1 -0
- package/dist/triggers/scene-03-weight.js +62 -0
- package/dist/triggers/scene-03-weight.js.map +1 -0
- package/dist/triggers/scene-04-exercise.d.ts +4 -0
- package/dist/triggers/scene-04-exercise.d.ts.map +1 -0
- package/dist/triggers/scene-04-exercise.js +43 -0
- package/dist/triggers/scene-04-exercise.js.map +1 -0
- package/dist/triggers/scene-05-workout.d.ts +4 -0
- package/dist/triggers/scene-05-workout.d.ts.map +1 -0
- package/dist/triggers/scene-05-workout.js +36 -0
- package/dist/triggers/scene-05-workout.js.map +1 -0
- package/dist/triggers/scene-06-goal.d.ts +4 -0
- package/dist/triggers/scene-06-goal.d.ts.map +1 -0
- package/dist/triggers/scene-06-goal.js +29 -0
- package/dist/triggers/scene-06-goal.js.map +1 -0
- package/dist/triggers/scene-07-profile.d.ts +4 -0
- package/dist/triggers/scene-07-profile.d.ts.map +1 -0
- package/dist/triggers/scene-07-profile.js +8 -0
- package/dist/triggers/scene-07-profile.js.map +1 -0
- package/dist/triggers/scene-08-body.d.ts +4 -0
- package/dist/triggers/scene-08-body.d.ts.map +1 -0
- package/dist/triggers/scene-08-body.js +17 -0
- package/dist/triggers/scene-08-body.js.map +1 -0
- package/dist/triggers/scene-09-photo.d.ts +4 -0
- package/dist/triggers/scene-09-photo.d.ts.map +1 -0
- package/dist/triggers/scene-09-photo.js +14 -0
- package/dist/triggers/scene-09-photo.js.map +1 -0
- package/dist/triggers/scene-10-analysis.d.ts +4 -0
- package/dist/triggers/scene-10-analysis.d.ts.map +1 -0
- package/dist/triggers/scene-10-analysis.js +180 -0
- package/dist/triggers/scene-10-analysis.js.map +1 -0
- package/dist/triggers/types.d.ts +66 -0
- package/dist/triggers/types.d.ts.map +1 -0
- package/dist/triggers/types.js +3 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/** T3 #22 · 饮食取数(对照老家 scripts/diet.py)。
|
|
2
|
+
*
|
|
3
|
+
* 偏离老家:失败抛 FetchError(缺失阻断不返空),不 print(打印归 T11 CLI);
|
|
4
|
+
* 目标值直接读 daily_goal id=1(等价 nutrition_goal.get_nutrition_goal 同表同行)。
|
|
5
|
+
*/
|
|
6
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
7
|
+
export declare const WATER_NAME = "\uD83D\uDCA7\u6C34";
|
|
8
|
+
export declare const MEALS: readonly ["早餐", "午餐", "下午茶", "晚餐", "夜宵"];
|
|
9
|
+
export type MealName = (typeof MEALS)[number];
|
|
10
|
+
/** 餐别时间窗(deleteMealsByType 口径,与 inferMealType 同源)。加餐 = 下午茶 + 夜宵。 */
|
|
11
|
+
export declare const MEAL_WINDOWS: Record<string, [number, number] | [number, number, number, number]>;
|
|
12
|
+
export declare function inferMealType(timeStr: string): string;
|
|
13
|
+
export interface MealRow {
|
|
14
|
+
id: number;
|
|
15
|
+
date: string;
|
|
16
|
+
time: string | null;
|
|
17
|
+
food_name: string;
|
|
18
|
+
grams: number;
|
|
19
|
+
calories: number;
|
|
20
|
+
protein: number;
|
|
21
|
+
carbs: number;
|
|
22
|
+
fat: number;
|
|
23
|
+
note: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface MealInput {
|
|
26
|
+
foodName: string;
|
|
27
|
+
calories: number;
|
|
28
|
+
protein: number;
|
|
29
|
+
carbs?: number;
|
|
30
|
+
fat?: number;
|
|
31
|
+
grams?: number;
|
|
32
|
+
note?: string;
|
|
33
|
+
date?: string;
|
|
34
|
+
time?: string;
|
|
35
|
+
mealOverride?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DailyGoalRow {
|
|
38
|
+
calorie_goal: number;
|
|
39
|
+
protein_goal: number;
|
|
40
|
+
carbs_goal: number;
|
|
41
|
+
fat_goal: number;
|
|
42
|
+
water_goal: number | null;
|
|
43
|
+
}
|
|
44
|
+
export declare function readGoal(db: DatabaseSync): DailyGoalRow | null;
|
|
45
|
+
export interface AddMealResult {
|
|
46
|
+
id: number | null;
|
|
47
|
+
duplicate: boolean;
|
|
48
|
+
dupId?: number;
|
|
49
|
+
date: string;
|
|
50
|
+
time: string;
|
|
51
|
+
food_name: string;
|
|
52
|
+
meal: string;
|
|
53
|
+
dateLabel: string;
|
|
54
|
+
rowsAffected: number;
|
|
55
|
+
message?: string;
|
|
56
|
+
todayTotals?: {
|
|
57
|
+
cal: number;
|
|
58
|
+
pro: number;
|
|
59
|
+
carbs: number;
|
|
60
|
+
fat: number;
|
|
61
|
+
count: number;
|
|
62
|
+
};
|
|
63
|
+
goals?: {
|
|
64
|
+
cal: number | null;
|
|
65
|
+
pro: number | null;
|
|
66
|
+
carbs: number | null;
|
|
67
|
+
fat: number | null;
|
|
68
|
+
};
|
|
69
|
+
remainingCal?: number | null;
|
|
70
|
+
}
|
|
71
|
+
export declare function addMeal(db: DatabaseSync, input: MealInput): AddMealResult;
|
|
72
|
+
export declare const MEAL_UPDATABLE: Set<string>;
|
|
73
|
+
export interface UpdateMealResult {
|
|
74
|
+
ok: true;
|
|
75
|
+
before: MealRow;
|
|
76
|
+
after: MealRow;
|
|
77
|
+
changed: string[];
|
|
78
|
+
}
|
|
79
|
+
export declare function updateMeal(db: DatabaseSync, entryId: number, fields: Record<string, unknown>): UpdateMealResult;
|
|
80
|
+
export declare function deleteMeal(db: DatabaseSync, entryId: number): {
|
|
81
|
+
id: number;
|
|
82
|
+
food_name: string;
|
|
83
|
+
calories: number;
|
|
84
|
+
deleted: number;
|
|
85
|
+
};
|
|
86
|
+
export interface CopyMealsResult {
|
|
87
|
+
ok: true;
|
|
88
|
+
copied: number;
|
|
89
|
+
skipped: number;
|
|
90
|
+
fromDate: string;
|
|
91
|
+
toDate: string;
|
|
92
|
+
copiedItems: {
|
|
93
|
+
time: string | null;
|
|
94
|
+
food_name: string;
|
|
95
|
+
grams: number;
|
|
96
|
+
calories: number;
|
|
97
|
+
}[];
|
|
98
|
+
skippedItems: {
|
|
99
|
+
time: string | null;
|
|
100
|
+
food_name: string;
|
|
101
|
+
grams: number;
|
|
102
|
+
calories: number;
|
|
103
|
+
}[];
|
|
104
|
+
}
|
|
105
|
+
export declare function copyMeals(db: DatabaseSync, fromDate: string, toDate?: string): CopyMealsResult;
|
|
106
|
+
export interface BatchMealItem {
|
|
107
|
+
date?: string;
|
|
108
|
+
time?: string;
|
|
109
|
+
food_name?: string;
|
|
110
|
+
grams?: number;
|
|
111
|
+
calories?: number;
|
|
112
|
+
protein?: number;
|
|
113
|
+
carbs?: number;
|
|
114
|
+
fat?: number;
|
|
115
|
+
note?: string;
|
|
116
|
+
}
|
|
117
|
+
export declare function addMealsBatch(db: DatabaseSync, entries: BatchMealItem[]): {
|
|
118
|
+
ok: true;
|
|
119
|
+
added: number;
|
|
120
|
+
skipped: number;
|
|
121
|
+
failed: number;
|
|
122
|
+
failures: [number, string][];
|
|
123
|
+
};
|
|
124
|
+
export declare function updateMealsByDate(db: DatabaseSync, targetDate: string, fields: Record<string, unknown>): {
|
|
125
|
+
ok: true;
|
|
126
|
+
matched: number;
|
|
127
|
+
updated: number;
|
|
128
|
+
before: Record<string, unknown>[];
|
|
129
|
+
after: Record<string, unknown>[];
|
|
130
|
+
changedFields: string[];
|
|
131
|
+
};
|
|
132
|
+
export declare function deleteMealsByDate(db: DatabaseSync, targetDate: string): {
|
|
133
|
+
date: string;
|
|
134
|
+
ok: true;
|
|
135
|
+
deleted: number;
|
|
136
|
+
before: Record<string, unknown>[];
|
|
137
|
+
};
|
|
138
|
+
export declare function deleteMealsByRange(db: DatabaseSync, startDate: string, endDate: string): {
|
|
139
|
+
start: string;
|
|
140
|
+
end: string;
|
|
141
|
+
ok: true;
|
|
142
|
+
deleted: number;
|
|
143
|
+
before: Record<string, unknown>[];
|
|
144
|
+
};
|
|
145
|
+
export declare function deleteMealsByType(db: DatabaseSync, targetDate: string, mealType: string): {
|
|
146
|
+
date: string;
|
|
147
|
+
meal: string;
|
|
148
|
+
ok: true;
|
|
149
|
+
deleted: number;
|
|
150
|
+
before: Record<string, unknown>[];
|
|
151
|
+
};
|
|
152
|
+
export declare function listMeals(db: DatabaseSync, targetDate?: string): MealRow[];
|
|
153
|
+
export interface DailySummary {
|
|
154
|
+
date: string;
|
|
155
|
+
entryCount: number;
|
|
156
|
+
totals: {
|
|
157
|
+
cal: number;
|
|
158
|
+
pro: number;
|
|
159
|
+
carbs: number;
|
|
160
|
+
fat: number;
|
|
161
|
+
};
|
|
162
|
+
waterMl: number;
|
|
163
|
+
goal: DailyGoalRow | null;
|
|
164
|
+
remaining: {
|
|
165
|
+
cal: number;
|
|
166
|
+
pro: number;
|
|
167
|
+
carbs: number;
|
|
168
|
+
fat: number;
|
|
169
|
+
water: number;
|
|
170
|
+
} | null;
|
|
171
|
+
overCal: boolean;
|
|
172
|
+
}
|
|
173
|
+
export declare function getDailySummary(db: DatabaseSync, targetDate?: string): DailySummary;
|
|
174
|
+
//# sourceMappingURL=diet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diet.d.ts","sourceRoot":"","sources":["../../src/fetch/diet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { sql } from './db.js';
|
|
2
|
+
import { FetchError } from './errors.js';
|
|
3
|
+
export const WATER_NAME = '💧水';
|
|
4
|
+
export const MEALS = ['早餐', '午餐', '下午茶', '晚餐', '夜宵'];
|
|
5
|
+
/** 餐别时间窗(deleteMealsByType 口径,与 inferMealType 同源)。加餐 = 下午茶 + 夜宵。 */
|
|
6
|
+
export const MEAL_WINDOWS = {
|
|
7
|
+
早餐: [6, 10], 午餐: [10, 14], 下午茶: [14, 18], 晚餐: [18, 22], 夜宵: [0, 6],
|
|
8
|
+
加餐: [14, 22, 0, 6],
|
|
9
|
+
};
|
|
10
|
+
export function inferMealType(timeStr) {
|
|
11
|
+
const hour = parseInt(String(timeStr).split(':')[0], 10);
|
|
12
|
+
if (Number.isNaN(hour))
|
|
13
|
+
return '其他';
|
|
14
|
+
if (hour >= 6 && hour < 10)
|
|
15
|
+
return '早餐';
|
|
16
|
+
if (hour >= 10 && hour < 14)
|
|
17
|
+
return '午餐';
|
|
18
|
+
if (hour >= 14 && hour < 18)
|
|
19
|
+
return '下午茶';
|
|
20
|
+
if (hour >= 18 && hour < 22)
|
|
21
|
+
return '晚餐';
|
|
22
|
+
return '夜宵';
|
|
23
|
+
}
|
|
24
|
+
function todayStr() { return new Date().toISOString().slice(0, 10); }
|
|
25
|
+
function nowStr() { return new Date().toTimeString().slice(0, 8); }
|
|
26
|
+
function num(v, field) {
|
|
27
|
+
const n = typeof v === 'number' ? v : parseFloat(String(v));
|
|
28
|
+
if (!Number.isFinite(n))
|
|
29
|
+
throw new FetchError(`${field} 必须是数字: ${String(v)}`);
|
|
30
|
+
return n;
|
|
31
|
+
}
|
|
32
|
+
export function readGoal(db) {
|
|
33
|
+
const row = db.prepare('SELECT calorie_goal, protein_goal, carbs_goal, fat_goal, water_goal FROM daily_goal WHERE id = 1').get();
|
|
34
|
+
return row ?? null;
|
|
35
|
+
}
|
|
36
|
+
export function addMeal(db, input) {
|
|
37
|
+
const foodName = String(input.foodName ?? '').trim();
|
|
38
|
+
if (!foodName)
|
|
39
|
+
throw new FetchError('食物名必填');
|
|
40
|
+
const calories = num(input.calories, 'calories');
|
|
41
|
+
const protein = num(input.protein, 'protein');
|
|
42
|
+
const carbs = input.carbs === undefined ? 0 : num(input.carbs, 'carbs');
|
|
43
|
+
const fat = input.fat === undefined ? 0 : num(input.fat, 'fat');
|
|
44
|
+
const grams = input.grams === undefined ? 100 : num(input.grams, 'grams');
|
|
45
|
+
if (calories < 0 || protein < 0 || carbs < 0 || fat < 0 || grams <= 0) {
|
|
46
|
+
throw new FetchError('营养值不能为负,克数必须为正');
|
|
47
|
+
}
|
|
48
|
+
if (input.mealOverride !== undefined && !MEALS.includes(input.mealOverride)) {
|
|
49
|
+
throw new FetchError(`--meal 必须是以下值之一:${MEALS.join('、')}`);
|
|
50
|
+
}
|
|
51
|
+
const today = input.date ?? todayStr();
|
|
52
|
+
const now = input.time ?? nowStr();
|
|
53
|
+
// 幂等防重(老家 2026-08-11 #262):同 date+time+food_name+grams+calories 跳过。
|
|
54
|
+
const dup = db.prepare('SELECT id FROM food_log WHERE date=? AND time=? AND food_name=? AND grams=? AND calories=? LIMIT 1').get(today, now, foodName, grams, calories);
|
|
55
|
+
const meal = input.mealOverride ?? inferMealType(now);
|
|
56
|
+
if (dup) {
|
|
57
|
+
return {
|
|
58
|
+
id: null, duplicate: true, dupId: dup.id, date: today, time: now,
|
|
59
|
+
food_name: foodName, meal, dateLabel: input.date ? today : '今日', rowsAffected: 0,
|
|
60
|
+
message: `重复记录已跳过(同日期/时间/食物名/克数/热量已存在: ${today} ${now} ${foodName} ${grams}g ${calories}kcal)`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const info = db.prepare('INSERT INTO food_log (date, time, food_name, grams, calories, protein, carbs, fat, note) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(today, now, foodName, grams, calories, protein, carbs, fat, input.note ?? '');
|
|
64
|
+
const totals = db.prepare('SELECT SUM(calories), SUM(protein), SUM(carbs), SUM(fat), COUNT(*) FROM food_log WHERE date = ?').get(today);
|
|
65
|
+
const goal = readGoal(db);
|
|
66
|
+
return {
|
|
67
|
+
id: Number(info.lastInsertRowid), duplicate: false, date: today, time: now,
|
|
68
|
+
food_name: foodName, meal, dateLabel: input.date ? today : '今日', rowsAffected: 1,
|
|
69
|
+
todayTotals: {
|
|
70
|
+
cal: totals['SUM(calories)'] ?? 0, pro: totals['SUM(protein)'] ?? 0,
|
|
71
|
+
carbs: totals['SUM(carbs)'] ?? 0, fat: totals['SUM(fat)'] ?? 0, count: totals['COUNT(*)'] ?? 0,
|
|
72
|
+
},
|
|
73
|
+
goals: goal ? { cal: goal.calorie_goal, pro: goal.protein_goal, carbs: goal.carbs_goal, fat: goal.fat_goal } : undefined,
|
|
74
|
+
remainingCal: goal ? goal.calorie_goal - (totals['SUM(calories)'] ?? 0) : null,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export const MEAL_UPDATABLE = new Set([
|
|
78
|
+
'food_name', 'grams', 'note', 'date', 'time', 'calories', 'protein', 'carbs', 'fat',
|
|
79
|
+
]);
|
|
80
|
+
export function updateMeal(db, entryId, fields) {
|
|
81
|
+
const id = Number(entryId);
|
|
82
|
+
if (!Number.isInteger(id))
|
|
83
|
+
throw new FetchError('Entry ID 必须是数字');
|
|
84
|
+
const bad = Object.keys(fields).filter((k) => !MEAL_UPDATABLE.has(k));
|
|
85
|
+
if (bad.length)
|
|
86
|
+
throw new FetchError(`不支持字段: ${bad.join(', ')}; 支持: ${[...MEAL_UPDATABLE].join(', ')}`);
|
|
87
|
+
if (!Object.keys(fields).length)
|
|
88
|
+
throw new FetchError('至少传 1 个字段');
|
|
89
|
+
const before = db.prepare('SELECT id, date, time, food_name, grams, calories, protein, carbs, fat, note FROM food_log WHERE id = ?').get(id);
|
|
90
|
+
if (!before)
|
|
91
|
+
throw new FetchError(`Entry ID ${id} 不存在`);
|
|
92
|
+
const typed = {};
|
|
93
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
94
|
+
if (['grams', 'calories', 'protein', 'carbs', 'fat'].includes(k)) {
|
|
95
|
+
const n = num(v, k);
|
|
96
|
+
if (n < 0)
|
|
97
|
+
throw new FetchError(`${k} 不能为负: ${String(v)}`);
|
|
98
|
+
typed[k] = n;
|
|
99
|
+
}
|
|
100
|
+
else
|
|
101
|
+
typed[k] = v;
|
|
102
|
+
}
|
|
103
|
+
const sets = Object.keys(typed).map((k) => `${k} = ?`).join(', ');
|
|
104
|
+
db.prepare(`UPDATE food_log SET ${sets} WHERE id = ?`).run(...Object.values(typed).map(sql), id);
|
|
105
|
+
const after = db.prepare('SELECT id, date, time, food_name, grams, calories, protein, carbs, fat, note FROM food_log WHERE id = ?').get(id);
|
|
106
|
+
const changed = Object.keys(typed).filter((k) => before[k] !== after[k]);
|
|
107
|
+
return { ok: true, before, after, changed };
|
|
108
|
+
}
|
|
109
|
+
export function deleteMeal(db, entryId) {
|
|
110
|
+
const id = Number(entryId);
|
|
111
|
+
if (!Number.isInteger(id))
|
|
112
|
+
throw new FetchError('Entry ID 必须是数字');
|
|
113
|
+
const row = db.prepare('SELECT food_name, calories FROM food_log WHERE id = ?').get(id);
|
|
114
|
+
if (!row)
|
|
115
|
+
throw new FetchError(`Entry ID ${id} 不存在`);
|
|
116
|
+
db.prepare('DELETE FROM food_log WHERE id = ?').run(id);
|
|
117
|
+
return { id, food_name: row.food_name, calories: row.calories, deleted: 1 };
|
|
118
|
+
}
|
|
119
|
+
export function copyMeals(db, fromDate, toDate) {
|
|
120
|
+
const target = toDate ?? todayStr();
|
|
121
|
+
const rows = db.prepare(`SELECT time, food_name, grams, calories, protein, carbs, fat, note FROM food_log
|
|
122
|
+
WHERE date = ? AND food_name != ? ORDER BY time`).all(fromDate, WATER_NAME);
|
|
123
|
+
let copied = 0, skipped = 0;
|
|
124
|
+
const copiedItems = [];
|
|
125
|
+
const skippedItems = [];
|
|
126
|
+
for (const r of rows) {
|
|
127
|
+
const hit = db.prepare('SELECT COUNT(*) AS n FROM food_log WHERE date = ? AND time = ? AND food_name = ?').get(target, r.time, r.food_name);
|
|
128
|
+
if (hit.n > 0) {
|
|
129
|
+
skipped++;
|
|
130
|
+
skippedItems.push({ time: r.time, food_name: r.food_name, grams: r.grams, calories: r.calories });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
db.prepare('INSERT INTO food_log (date, time, food_name, grams, calories, protein, carbs, fat, note) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(target, r.time, r.food_name, r.grams, r.calories, r.protein, r.carbs, r.fat, r.note ?? '');
|
|
134
|
+
copied++;
|
|
135
|
+
copiedItems.push({ time: r.time, food_name: r.food_name, grams: r.grams, calories: r.calories });
|
|
136
|
+
}
|
|
137
|
+
return { ok: true, copied, skipped, fromDate, toDate: target, copiedItems, skippedItems };
|
|
138
|
+
}
|
|
139
|
+
export function addMealsBatch(db, entries) {
|
|
140
|
+
let added = 0, skipped = 0;
|
|
141
|
+
const failures = [];
|
|
142
|
+
entries.forEach((e, i) => {
|
|
143
|
+
try {
|
|
144
|
+
const food = String(e.food_name ?? '').trim();
|
|
145
|
+
const cal = num(e.calories ?? NaN, 'calories');
|
|
146
|
+
const pro = num(e.protein ?? NaN, 'protein');
|
|
147
|
+
if (!food || cal < 0 || pro < 0) {
|
|
148
|
+
skipped++;
|
|
149
|
+
failures.push([i, '食物名必填,营养值不能为负']);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const d = String(e.date ?? todayStr());
|
|
153
|
+
const t = String(e.time ?? nowStr());
|
|
154
|
+
const g = e.grams === undefined || e.grams === null ? 100 : num(e.grams, 'grams');
|
|
155
|
+
const dup = db.prepare('SELECT id FROM food_log WHERE date=? AND time=? AND food_name=? AND grams=? AND calories=? LIMIT 1').get(d, t, food, g, cal);
|
|
156
|
+
if (dup) {
|
|
157
|
+
skipped++;
|
|
158
|
+
failures.push([i, `重复记录已跳过: ${d} ${t} ${food} ${g}g ${cal}kcal`]);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
db.prepare('INSERT INTO food_log (date, time, food_name, grams, calories, protein, carbs, fat, note) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(d, t, food, g, cal, pro, e.carbs === undefined || e.carbs === null ? 0 : num(e.carbs, 'carbs'), e.fat === undefined || e.fat === null ? 0 : num(e.fat, 'fat'), String(e.note ?? ''));
|
|
162
|
+
added++;
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
skipped++;
|
|
166
|
+
failures.push([i, `数值非法: ${err instanceof Error ? err.message : String(err)}`]);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return { ok: true, added, skipped, failed: failures.length, failures };
|
|
170
|
+
}
|
|
171
|
+
export function updateMealsByDate(db, targetDate, fields) {
|
|
172
|
+
const bad = Object.keys(fields).filter((k) => !MEAL_UPDATABLE.has(k));
|
|
173
|
+
if (bad.length)
|
|
174
|
+
throw new FetchError(`不支持字段: ${bad.join(', ')}`);
|
|
175
|
+
if (!Object.keys(fields).length)
|
|
176
|
+
throw new FetchError('至少传 1 个字段');
|
|
177
|
+
const ids = db.prepare('SELECT id FROM food_log WHERE date = ? AND food_name != ?').all(targetDate, WATER_NAME)
|
|
178
|
+
.map((r) => r.id);
|
|
179
|
+
const snap = (id) => db.prepare('SELECT food_name, grams, calories, protein, carbs, fat, note, time FROM food_log WHERE id = ?').get(id);
|
|
180
|
+
const before = ids.map(snap);
|
|
181
|
+
const typed = {};
|
|
182
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
183
|
+
typed[k] = ['grams', 'calories', 'protein', 'carbs', 'fat'].includes(k) ? num(v, k) : v;
|
|
184
|
+
if (typeof typed[k] === 'number' && typed[k] < 0)
|
|
185
|
+
throw new FetchError(`${k} 不能为负`);
|
|
186
|
+
}
|
|
187
|
+
if (ids.length) {
|
|
188
|
+
const sets = Object.keys(typed).map((k) => `${k} = ?`).join(', ');
|
|
189
|
+
db.prepare(`UPDATE food_log SET ${sets} WHERE date = ? AND food_name != ?`).run(...Object.values(typed).map(sql), targetDate, WATER_NAME);
|
|
190
|
+
}
|
|
191
|
+
return { ok: true, matched: ids.length, updated: ids.length, before, after: ids.map(snap), changedFields: Object.keys(typed).sort() };
|
|
192
|
+
}
|
|
193
|
+
function deleteMealsWhere(db, where, params) {
|
|
194
|
+
const before = db.prepare(`SELECT date, time, food_name, grams, calories, note FROM food_log WHERE ${where}`).all(...params);
|
|
195
|
+
db.prepare(`DELETE FROM food_log WHERE ${where}`).run(...params);
|
|
196
|
+
return { ok: true, deleted: before.length, before };
|
|
197
|
+
}
|
|
198
|
+
export function deleteMealsByDate(db, targetDate) {
|
|
199
|
+
return { ...deleteMealsWhere(db, 'date = ? AND food_name != ?', [targetDate, WATER_NAME]), date: targetDate };
|
|
200
|
+
}
|
|
201
|
+
export function deleteMealsByRange(db, startDate, endDate) {
|
|
202
|
+
return { ...deleteMealsWhere(db, 'date BETWEEN ? AND ? AND food_name != ?', [startDate, endDate, WATER_NAME]), start: startDate, end: endDate };
|
|
203
|
+
}
|
|
204
|
+
export function deleteMealsByType(db, targetDate, mealType) {
|
|
205
|
+
const w = MEAL_WINDOWS[mealType];
|
|
206
|
+
if (!w)
|
|
207
|
+
throw new FetchError(`餐别必须是 ${Object.keys(MEAL_WINDOWS).join('/')} 之一`);
|
|
208
|
+
const hourExpr = "CAST(strftime('%H', time) AS INT)";
|
|
209
|
+
const where = w.length === 4
|
|
210
|
+
? `date = ? AND food_name != ? AND ((${hourExpr} >= ? AND ${hourExpr} < ?) OR (${hourExpr} >= ? AND ${hourExpr} < ?))`
|
|
211
|
+
: `date = ? AND food_name != ? AND (${hourExpr} >= ? AND ${hourExpr} < ?)`;
|
|
212
|
+
return { ...deleteMealsWhere(db, where, [targetDate, WATER_NAME, ...w]), date: targetDate, meal: mealType };
|
|
213
|
+
}
|
|
214
|
+
export function listMeals(db, targetDate) {
|
|
215
|
+
const date = targetDate ?? todayStr();
|
|
216
|
+
return db.prepare('SELECT id, date, time, food_name, grams, calories, protein, carbs, fat, note FROM food_log WHERE date = ? ORDER BY time').all(date);
|
|
217
|
+
}
|
|
218
|
+
export function getDailySummary(db, targetDate) {
|
|
219
|
+
const date = targetDate ?? todayStr();
|
|
220
|
+
const t = db.prepare(`SELECT SUM(calories), SUM(protein), SUM(carbs), SUM(fat), COUNT(*) FROM food_log WHERE date = ? AND food_name != ?`).get(date, WATER_NAME);
|
|
221
|
+
const w = db.prepare('SELECT COALESCE(SUM(grams), 0) AS w FROM food_log WHERE date = ? AND food_name = ?').get(date, WATER_NAME);
|
|
222
|
+
const totals = {
|
|
223
|
+
cal: t['SUM(calories)'] ?? 0, pro: t['SUM(protein)'] ?? 0,
|
|
224
|
+
carbs: t['SUM(carbs)'] ?? 0, fat: t['SUM(fat)'] ?? 0,
|
|
225
|
+
};
|
|
226
|
+
const goal = readGoal(db);
|
|
227
|
+
const waterGoal = goal?.water_goal ?? 2000;
|
|
228
|
+
return {
|
|
229
|
+
date, entryCount: t['COUNT(*)'] ?? 0, totals, waterMl: w.w,
|
|
230
|
+
goal,
|
|
231
|
+
remaining: goal ? {
|
|
232
|
+
cal: goal.calorie_goal - totals.cal, pro: goal.protein_goal - totals.pro,
|
|
233
|
+
carbs: goal.carbs_goal - totals.carbs, fat: goal.fat_goal - totals.fat,
|
|
234
|
+
water: waterGoal - w.w,
|
|
235
|
+
} : null,
|
|
236
|
+
overCal: goal ? goal.calorie_goal - totals.cal < 0 : false,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=diet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diet.js","sourceRoot":"","sources":["../../src/fetch/diet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/fetch/errors.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/fetch/errors.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** T3 #22 · 运动取数(对照老家 scripts/exercise.py + exercise_tracker.py)。
|
|
2
|
+
*
|
|
3
|
+
* 删除为软删除(is_deleted=1,老家 ticket #5 语义);列表默认排除已软删除。
|
|
4
|
+
* 失败抛 FetchError;MET 关键词表与公式逐字对照老家(含 '中' 原样口径)。
|
|
5
|
+
*/
|
|
6
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
7
|
+
export declare function lookupMet(exerciseType: string | null | undefined): number;
|
|
8
|
+
export declare function inferCategory(exerciseType: string | null | undefined): string;
|
|
9
|
+
export declare function estimateCaloriesMet(exerciseType: string, bodyWeight: number, durationMinutes?: number, sets?: number): [number, number];
|
|
10
|
+
export declare function estimateDifficultyMet(met: number | null | undefined): string | null;
|
|
11
|
+
/** 口语难度映射(老家原样口径:中等档返回 '中',非 'normal')。 */
|
|
12
|
+
export declare function parseUserDifficulty(userText: string | null | undefined): string | null;
|
|
13
|
+
export declare function combinedCalories(userReported: number | null | undefined, estimated: number, warnAt?: number): [number | null, string | null, number];
|
|
14
|
+
export declare function estimateCaloriesFromTraining(totalVolumeKg: number): number;
|
|
15
|
+
export declare function convertLoadKg(weightStr: unknown, unitStr: unknown): number;
|
|
16
|
+
export type WindowName = 'today' | 'yesterday' | 'week' | 'last-week' | 'month' | 'last-month';
|
|
17
|
+
export declare function resolveWindow(opts?: {
|
|
18
|
+
window?: string;
|
|
19
|
+
days?: number;
|
|
20
|
+
fromDate?: string;
|
|
21
|
+
toDate?: string;
|
|
22
|
+
now?: Date;
|
|
23
|
+
}): [string, string];
|
|
24
|
+
export declare function parseTimeStr(timeStr?: string): string;
|
|
25
|
+
export interface ExerciseRecordInput {
|
|
26
|
+
date: string;
|
|
27
|
+
exerciseType: string;
|
|
28
|
+
caloriesBurned: number;
|
|
29
|
+
minutes?: number | null;
|
|
30
|
+
timeStr?: string;
|
|
31
|
+
note?: string;
|
|
32
|
+
reps?: number | null;
|
|
33
|
+
category?: string | null;
|
|
34
|
+
difficulty?: string | null;
|
|
35
|
+
distance?: number | null;
|
|
36
|
+
heartRate?: number | null;
|
|
37
|
+
maxHeartRate?: number | null;
|
|
38
|
+
steps?: number | null;
|
|
39
|
+
setIndex?: number | null;
|
|
40
|
+
loadKg?: number | null;
|
|
41
|
+
isBackfill?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export type ExerciseRow = Record<string, unknown>;
|
|
44
|
+
export declare function addRecord(db: DatabaseSync, input: ExerciseRecordInput): {
|
|
45
|
+
id: number;
|
|
46
|
+
record: ExerciseRow;
|
|
47
|
+
};
|
|
48
|
+
export declare function updateRecord(db: DatabaseSync, recordId: number, fields: Record<string, unknown>): {
|
|
49
|
+
old: ExerciseRow;
|
|
50
|
+
new: ExerciseRow;
|
|
51
|
+
};
|
|
52
|
+
export declare function deleteRecord(db: DatabaseSync, recordId: number): ExerciseRow;
|
|
53
|
+
export declare function deleteDay(db: DatabaseSync, date: string): number;
|
|
54
|
+
export declare function deleteRange(db: DatabaseSync, fromDate: string, toDate: string): number;
|
|
55
|
+
export declare function updateDay(db: DatabaseSync, date: string, fields: Record<string, unknown>): {
|
|
56
|
+
matched: number;
|
|
57
|
+
pairs: {
|
|
58
|
+
old: ExerciseRow;
|
|
59
|
+
new: ExerciseRow;
|
|
60
|
+
}[];
|
|
61
|
+
};
|
|
62
|
+
export declare function copyYesterday(db: DatabaseSync, targetDate?: string): {
|
|
63
|
+
copied: number;
|
|
64
|
+
skipped: number;
|
|
65
|
+
rows: ExerciseRow[];
|
|
66
|
+
};
|
|
67
|
+
export declare function batchAdd(db: DatabaseSync, items: ExerciseRecordInput[]): {
|
|
68
|
+
added: number;
|
|
69
|
+
ids: number[];
|
|
70
|
+
};
|
|
71
|
+
export declare function listWindow(db: DatabaseSync, start: string, end: string): ExerciseRow[];
|
|
72
|
+
//# sourceMappingURL=exercise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exercise.d.ts","sourceRoot":"","sources":["../../src/fetch/exercise.ts"],"names":[],"mappings":"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"}
|