skill-calorie 0.2.3 → 0.2.4
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/SKILL.md +469 -118
- package/dist/.gen-inputs.json +170 -0
- package/dist/analysis/commands.d.ts +62 -0
- package/dist/analysis/commands.d.ts.map +1 -0
- package/dist/analysis/commands.js +386 -0
- package/dist/analysis/commands.js.map +1 -0
- package/dist/analysis/contraindications.d.ts.map +1 -1
- package/dist/analysis/contraindications.js +16 -12
- package/dist/analysis/contraindications.js.map +1 -1
- package/dist/analysis/cross.d.ts +3 -0
- package/dist/analysis/cross.d.ts.map +1 -1
- package/dist/analysis/cross.js +54 -26
- package/dist/analysis/cross.js.map +1 -1
- package/dist/analysis/dashboard.d.ts.map +1 -1
- package/dist/analysis/dashboard.js +3 -2
- package/dist/analysis/dashboard.js.map +1 -1
- package/dist/analysis/exerciseReview.js +1 -1
- package/dist/analysis/exerciseReview.js.map +1 -1
- package/dist/analysis/healthPlate.d.ts +21 -0
- package/dist/analysis/healthPlate.d.ts.map +1 -0
- package/dist/analysis/healthPlate.js +41 -0
- package/dist/analysis/healthPlate.js.map +1 -0
- package/dist/analysis/historyStore.d.ts +30 -0
- package/dist/analysis/historyStore.d.ts.map +1 -0
- package/dist/analysis/historyStore.js +32 -0
- package/dist/analysis/historyStore.js.map +1 -0
- package/dist/analysis/index.d.ts +23 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +23 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/multiTrend.d.ts +67 -0
- package/dist/analysis/multiTrend.d.ts.map +1 -0
- package/dist/analysis/multiTrend.js +106 -0
- package/dist/analysis/multiTrend.js.map +1 -0
- package/dist/analysis/multiTrendPage.d.ts +4 -0
- package/dist/analysis/multiTrendPage.d.ts.map +1 -0
- package/dist/analysis/multiTrendPage.js +502 -0
- package/dist/analysis/multiTrendPage.js.map +1 -0
- package/dist/analysis/reportDoc.d.ts +12 -0
- package/dist/analysis/reportDoc.d.ts.map +1 -0
- package/dist/analysis/reportDoc.js +244 -0
- package/dist/analysis/reportDoc.js.map +1 -0
- package/dist/analysis/reportDocBmi.d.ts +4 -0
- package/dist/analysis/reportDocBmi.d.ts.map +1 -0
- package/dist/analysis/reportDocBmi.js +104 -0
- package/dist/analysis/reportDocBmi.js.map +1 -0
- package/dist/analysis/reportDocParts.d.ts +77 -0
- package/dist/analysis/reportDocParts.d.ts.map +1 -0
- package/dist/analysis/reportDocParts.js +249 -0
- package/dist/analysis/reportDocParts.js.map +1 -0
- package/dist/analysis/reportDocScore.d.ts +8 -0
- package/dist/analysis/reportDocScore.d.ts.map +1 -0
- package/dist/analysis/reportDocScore.js +223 -0
- package/dist/analysis/reportDocScore.js.map +1 -0
- package/dist/analysis/reportDocScoreSeries.d.ts +3 -0
- package/dist/analysis/reportDocScoreSeries.d.ts.map +1 -0
- package/dist/analysis/reportDocScoreSeries.js +27 -0
- package/dist/analysis/reportDocScoreSeries.js.map +1 -0
- package/dist/analysis/reportDocTracked.d.ts +10 -0
- package/dist/analysis/reportDocTracked.d.ts.map +1 -0
- package/dist/analysis/reportDocTracked.js +195 -0
- package/dist/analysis/reportDocTracked.js.map +1 -0
- package/dist/analysis/reportPlate.d.ts +163 -0
- package/dist/analysis/reportPlate.d.ts.map +1 -0
- package/dist/analysis/reportPlate.js +251 -0
- package/dist/analysis/reportPlate.js.map +1 -0
- package/dist/analysis/routes.d.ts +18 -0
- package/dist/analysis/routes.d.ts.map +1 -0
- package/dist/analysis/routes.js +178 -0
- package/dist/analysis/routes.js.map +1 -0
- package/dist/analysis/series.d.ts +31 -6
- package/dist/analysis/series.d.ts.map +1 -1
- package/dist/analysis/series.js +121 -24
- package/dist/analysis/series.js.map +1 -1
- package/dist/analysis/simulate.d.ts.map +1 -1
- package/dist/analysis/simulate.js +17 -6
- package/dist/analysis/simulate.js.map +1 -1
- package/dist/analysis/simulate2.d.ts.map +1 -1
- package/dist/analysis/simulate2.js +43 -11
- package/dist/analysis/simulate2.js.map +1 -1
- package/dist/analysis/trend.d.ts +9 -1
- package/dist/analysis/trend.d.ts.map +1 -1
- package/dist/analysis/trend.js +24 -8
- package/dist/analysis/trend.js.map +1 -1
- package/dist/analysis/utils.d.ts +40 -2
- package/dist/analysis/utils.d.ts.map +1 -1
- package/dist/analysis/utils.js +63 -2
- package/dist/analysis/utils.js.map +1 -1
- package/dist/body/bodyDocs.d.ts +4 -0
- package/dist/body/bodyDocs.d.ts.map +1 -0
- package/dist/body/bodyDocs.js +284 -0
- package/dist/body/bodyDocs.js.map +1 -0
- package/dist/body/bodyPlate.d.ts +145 -0
- package/dist/body/bodyPlate.d.ts.map +1 -0
- package/dist/body/bodyPlate.js +243 -0
- package/dist/body/bodyPlate.js.map +1 -0
- package/dist/body/bodyReadUi.d.ts +47 -0
- package/dist/body/bodyReadUi.d.ts.map +1 -0
- package/dist/body/bodyReadUi.js +164 -0
- package/dist/body/bodyReadUi.js.map +1 -0
- package/dist/body/commands.d.ts +29 -0
- package/dist/body/commands.d.ts.map +1 -0
- package/dist/body/commands.js +18 -0
- package/dist/body/commands.js.map +1 -0
- package/dist/body/compare.d.ts +62 -0
- package/dist/body/compare.d.ts.map +1 -0
- package/dist/body/compare.js +162 -0
- package/dist/body/compare.js.map +1 -0
- package/dist/body/compareCompositionDoc.d.ts +3 -0
- package/dist/body/compareCompositionDoc.d.ts.map +1 -0
- package/dist/body/compareCompositionDoc.js +99 -0
- package/dist/body/compareCompositionDoc.js.map +1 -0
- package/dist/body/compareMeasureDoc.d.ts +3 -0
- package/dist/body/compareMeasureDoc.d.ts.map +1 -0
- package/dist/body/compareMeasureDoc.js +91 -0
- package/dist/body/compareMeasureDoc.js.map +1 -0
- package/dist/body/compareUi.d.ts +12 -0
- package/dist/body/compareUi.d.ts.map +1 -0
- package/dist/body/compareUi.js +27 -0
- package/dist/body/compareUi.js.map +1 -0
- package/dist/body/index.d.ts +21 -0
- package/dist/body/index.d.ts.map +1 -0
- package/dist/body/index.js +22 -0
- package/dist/body/index.js.map +1 -0
- package/dist/body/log.d.ts +29 -0
- package/dist/body/log.d.ts.map +1 -0
- package/dist/body/log.js +196 -0
- package/dist/body/log.js.map +1 -0
- package/dist/body/receipt.d.ts +52 -0
- package/dist/body/receipt.d.ts.map +1 -0
- package/dist/body/receipt.js +248 -0
- package/dist/body/receipt.js.map +1 -0
- package/dist/body/receiptData.d.ts +46 -0
- package/dist/body/receiptData.d.ts.map +1 -0
- package/dist/body/receiptData.js +107 -0
- package/dist/body/receiptData.js.map +1 -0
- package/dist/body/receiptUi.d.ts +9 -0
- package/dist/body/receiptUi.d.ts.map +1 -0
- package/dist/body/receiptUi.js +75 -0
- package/dist/body/receiptUi.js.map +1 -0
- package/dist/body/remove.d.ts +21 -0
- package/dist/body/remove.d.ts.map +1 -0
- package/dist/body/remove.js +78 -0
- package/dist/body/remove.js.map +1 -0
- package/dist/body/routes.d.ts +10 -0
- package/dist/body/routes.d.ts.map +1 -0
- package/dist/body/routes.js +20 -0
- package/dist/body/routes.js.map +1 -0
- package/dist/body/view.d.ts +21 -0
- package/dist/body/view.d.ts.map +1 -0
- package/dist/body/view.js +50 -0
- package/dist/body/view.js.map +1 -0
- package/dist/body/wizard.d.ts +14 -0
- package/dist/body/wizard.d.ts.map +1 -0
- package/dist/body/wizard.js +21 -0
- package/dist/body/wizard.js.map +1 -0
- package/dist/body/wizardDocs.d.ts +4 -0
- package/dist/body/wizardDocs.d.ts.map +1 -0
- package/dist/body/wizardDocs.js +260 -0
- package/dist/body/wizardDocs.js.map +1 -0
- package/dist/body/wizardPlate.d.ts +146 -0
- package/dist/body/wizardPlate.d.ts.map +1 -0
- package/dist/body/wizardPlate.js +260 -0
- package/dist/body/wizardPlate.js.map +1 -0
- package/dist/body/wizardPrompt.d.ts +52 -0
- package/dist/body/wizardPrompt.d.ts.map +1 -0
- package/dist/body/wizardPrompt.js +146 -0
- package/dist/body/wizardPrompt.js.map +1 -0
- package/dist/body/wizardUi.d.ts +11 -0
- package/dist/body/wizardUi.d.ts.map +1 -0
- package/dist/body/wizardUi.js +35 -0
- package/dist/body/wizardUi.js.map +1 -0
- package/dist/cli/cmd_read.d.ts +7 -26
- package/dist/cli/cmd_read.d.ts.map +1 -1
- package/dist/cli/cmd_read.js +46 -1081
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/delivery.d.ts +34 -0
- package/dist/cli/delivery.d.ts.map +1 -0
- package/dist/cli/delivery.js +223 -0
- package/dist/cli/delivery.js.map +1 -0
- package/dist/cli/keys.d.ts +303 -165
- package/dist/cli/keys.d.ts.map +1 -1
- package/dist/cli/keys.js +101 -77
- package/dist/cli/keys.js.map +1 -1
- package/dist/cli/legacy/index.d.ts +25 -0
- package/dist/cli/legacy/index.d.ts.map +1 -0
- package/dist/cli/legacy/index.js +37 -0
- package/dist/cli/legacy/index.js.map +1 -0
- package/dist/cli/legacy/routes/index.d.ts +8 -0
- package/dist/cli/legacy/routes/index.d.ts.map +1 -0
- package/dist/cli/legacy/routes/index.js +23 -0
- package/dist/cli/legacy/routes/index.js.map +1 -0
- package/dist/cli/legacy/routes/scene-01.d.ts +12 -0
- package/dist/cli/legacy/routes/scene-01.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-01.js +2 -0
- package/dist/cli/legacy/routes/scene-01.js.map +1 -0
- package/dist/cli/legacy/routes/scene-02.d.ts +18 -0
- package/dist/cli/legacy/routes/scene-02.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-02.js +2 -0
- package/dist/cli/legacy/routes/scene-02.js.map +1 -0
- package/dist/cli/legacy/routes/scene-03.d.ts +13 -0
- package/dist/cli/legacy/routes/scene-03.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-03.js +2 -0
- package/dist/cli/legacy/routes/scene-03.js.map +1 -0
- package/dist/cli/legacy/routes/scene-04.d.ts +10 -0
- package/dist/cli/legacy/routes/scene-04.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-04.js +2 -0
- package/dist/cli/legacy/routes/scene-04.js.map +1 -0
- package/dist/cli/legacy/routes/scene-05.d.ts +10 -0
- package/dist/cli/legacy/routes/scene-05.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-05.js +2 -0
- package/dist/cli/legacy/routes/scene-05.js.map +1 -0
- package/dist/cli/legacy/routes/scene-06.d.ts +10 -0
- package/dist/cli/legacy/routes/scene-06.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-06.js +2 -0
- package/dist/cli/legacy/routes/scene-06.js.map +1 -0
- package/dist/cli/legacy/routes/scene-07.d.ts +10 -0
- package/dist/cli/legacy/routes/scene-07.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-07.js +2 -0
- package/dist/cli/legacy/routes/scene-07.js.map +1 -0
- package/dist/cli/legacy/routes/scene-08.d.ts +12 -0
- package/dist/cli/legacy/routes/scene-08.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-08.js +2 -0
- package/dist/cli/legacy/routes/scene-08.js.map +1 -0
- package/dist/cli/legacy/routes/scene-09.d.ts +12 -0
- package/dist/cli/legacy/routes/scene-09.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-09.js +2 -0
- package/dist/cli/legacy/routes/scene-09.js.map +1 -0
- package/dist/cli/legacy/routes/scene-10.d.ts +10 -0
- package/dist/cli/legacy/routes/scene-10.d.ts.map +1 -0
- package/dist/cli/legacy/routes/scene-10.js +2 -0
- package/dist/cli/legacy/routes/scene-10.js.map +1 -0
- package/dist/cli/legacy/scene-01.d.ts +13 -0
- package/dist/cli/legacy/scene-01.d.ts.map +1 -0
- package/dist/cli/legacy/scene-01.js +2 -0
- package/dist/cli/legacy/scene-01.js.map +1 -0
- package/dist/cli/legacy/scene-02.d.ts +12 -0
- package/dist/cli/legacy/scene-02.d.ts.map +1 -0
- package/dist/cli/legacy/scene-02.js +2 -0
- package/dist/cli/legacy/scene-02.js.map +1 -0
- package/dist/cli/legacy/scene-03.d.ts +14 -0
- package/dist/cli/legacy/scene-03.d.ts.map +1 -0
- package/dist/cli/legacy/scene-03.js +2 -0
- package/dist/cli/legacy/scene-03.js.map +1 -0
- package/dist/cli/legacy/scene-04.d.ts +12 -0
- package/dist/cli/legacy/scene-04.d.ts.map +1 -0
- package/dist/cli/legacy/scene-04.js +2 -0
- package/dist/cli/legacy/scene-04.js.map +1 -0
- package/dist/cli/legacy/scene-05.d.ts +14 -0
- package/dist/cli/legacy/scene-05.d.ts.map +1 -0
- package/dist/cli/legacy/scene-05.js +2 -0
- package/dist/cli/legacy/scene-05.js.map +1 -0
- package/dist/cli/legacy/scene-06.d.ts +15 -0
- package/dist/cli/legacy/scene-06.d.ts.map +1 -0
- package/dist/cli/legacy/scene-06.js +2 -0
- package/dist/cli/legacy/scene-06.js.map +1 -0
- package/dist/cli/legacy/scene-07.d.ts +15 -0
- package/dist/cli/legacy/scene-07.d.ts.map +1 -0
- package/dist/cli/legacy/scene-07.js +2 -0
- package/dist/cli/legacy/scene-07.js.map +1 -0
- package/dist/cli/legacy/scene-08.d.ts +13 -0
- package/dist/cli/legacy/scene-08.d.ts.map +1 -0
- package/dist/cli/legacy/scene-08.js +2 -0
- package/dist/cli/legacy/scene-08.js.map +1 -0
- package/dist/cli/legacy/scene-09.d.ts +13 -0
- package/dist/cli/legacy/scene-09.d.ts.map +1 -0
- package/dist/cli/legacy/scene-09.js +2 -0
- package/dist/cli/legacy/scene-09.js.map +1 -0
- package/dist/cli/legacy/scene-10.d.ts +13 -0
- package/dist/cli/legacy/scene-10.d.ts.map +1 -0
- package/dist/cli/legacy/scene-10.js +2 -0
- package/dist/cli/legacy/scene-10.js.map +1 -0
- package/dist/cli/legacy/types.d.ts +16 -0
- package/dist/cli/legacy/types.d.ts.map +1 -0
- package/dist/cli/legacy/types.js +2 -0
- package/dist/cli/legacy/types.js.map +1 -0
- package/dist/cli/readArgs.d.ts +21 -0
- package/dist/cli/readArgs.d.ts.map +1 -0
- package/dist/cli/readArgs.js +72 -0
- package/dist/cli/readArgs.js.map +1 -0
- package/dist/cli/registry.d.ts +12 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +38 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/write.d.ts +15 -15
- package/dist/cli/write.d.ts.map +1 -1
- package/dist/cli/write.js +37 -945
- package/dist/cli/write.js.map +1 -1
- package/dist/diet/commands.d.ts +37 -0
- package/dist/diet/commands.d.ts.map +1 -0
- package/dist/diet/commands.js +44 -0
- package/dist/diet/commands.js.map +1 -0
- package/dist/diet/dietEngine.d.ts +79 -0
- package/dist/diet/dietEngine.d.ts.map +1 -0
- package/dist/diet/dietEngine.js +171 -0
- package/dist/diet/dietEngine.js.map +1 -0
- package/dist/diet/dietUi.d.ts +9 -0
- package/dist/diet/dietUi.d.ts.map +1 -0
- package/dist/diet/dietUi.js +45 -0
- package/dist/diet/dietUi.js.map +1 -0
- package/dist/diet/edit.d.ts +22 -0
- package/dist/diet/edit.d.ts.map +1 -0
- package/dist/diet/edit.js +96 -0
- package/dist/diet/edit.js.map +1 -0
- package/dist/diet/fieldLabels.d.ts +5 -0
- package/dist/diet/fieldLabels.d.ts.map +1 -0
- package/dist/diet/fieldLabels.js +44 -0
- package/dist/diet/fieldLabels.js.map +1 -0
- package/dist/diet/index.d.ts +26 -0
- package/dist/diet/index.d.ts.map +1 -0
- package/dist/diet/index.js +22 -0
- package/dist/diet/index.js.map +1 -0
- package/dist/diet/library.d.ts +20 -0
- package/dist/diet/library.d.ts.map +1 -0
- package/dist/diet/library.js +52 -0
- package/dist/diet/library.js.map +1 -0
- package/dist/diet/libraryDocs.d.ts +7 -0
- package/dist/diet/libraryDocs.d.ts.map +1 -0
- package/dist/diet/libraryDocs.js +361 -0
- package/dist/diet/libraryDocs.js.map +1 -0
- package/dist/diet/libraryPlate.d.ts +41 -0
- package/dist/diet/libraryPlate.d.ts.map +1 -0
- package/dist/diet/libraryPlate.js +57 -0
- package/dist/diet/libraryPlate.js.map +1 -0
- package/dist/diet/log.d.ts +18 -0
- package/dist/diet/log.d.ts.map +1 -0
- package/dist/diet/log.js +152 -0
- package/dist/diet/log.js.map +1 -0
- package/dist/diet/nutrition.d.ts +37 -0
- package/dist/diet/nutrition.d.ts.map +1 -0
- package/dist/diet/nutrition.js +135 -0
- package/dist/diet/nutrition.js.map +1 -0
- package/dist/diet/nutritionPort.d.ts +129 -0
- package/dist/diet/nutritionPort.d.ts.map +1 -0
- package/dist/diet/nutritionPort.js +246 -0
- package/dist/diet/nutritionPort.js.map +1 -0
- package/dist/diet/nutritionPortDocs.d.ts +106 -0
- package/dist/diet/nutritionPortDocs.d.ts.map +1 -0
- package/dist/diet/nutritionPortDocs.js +651 -0
- package/dist/diet/nutritionPortDocs.js.map +1 -0
- package/dist/diet/precheck.d.ts +7 -0
- package/dist/diet/precheck.d.ts.map +1 -0
- package/dist/diet/precheck.js +194 -0
- package/dist/diet/precheck.js.map +1 -0
- package/dist/diet/precheckLabel.d.ts +4 -0
- package/dist/diet/precheckLabel.d.ts.map +1 -0
- package/dist/diet/precheckLabel.js +191 -0
- package/dist/diet/precheckLabel.js.map +1 -0
- package/dist/diet/precheckParts.d.ts +49 -0
- package/dist/diet/precheckParts.d.ts.map +1 -0
- package/dist/diet/precheckParts.js +69 -0
- package/dist/diet/precheckParts.js.map +1 -0
- package/dist/diet/precheckPort.d.ts +82 -0
- package/dist/diet/precheckPort.d.ts.map +1 -0
- package/dist/diet/precheckPort.js +176 -0
- package/dist/diet/precheckPort.js.map +1 -0
- package/dist/diet/productImport.d.ts +28 -0
- package/dist/diet/productImport.d.ts.map +1 -0
- package/dist/diet/productImport.js +152 -0
- package/dist/diet/productImport.js.map +1 -0
- package/dist/diet/productStore.d.ts +62 -0
- package/dist/diet/productStore.d.ts.map +1 -0
- package/dist/diet/productStore.js +73 -0
- package/dist/diet/productStore.js.map +1 -0
- package/dist/diet/products.d.ts +15 -0
- package/dist/diet/products.d.ts.map +1 -0
- package/dist/diet/products.js +87 -0
- package/dist/diet/products.js.map +1 -0
- package/dist/diet/ranking.d.ts +18 -0
- package/dist/diet/ranking.d.ts.map +1 -0
- package/dist/diet/ranking.js +23 -0
- package/dist/diet/ranking.js.map +1 -0
- package/dist/diet/rankingDocs.d.ts +13 -0
- package/dist/diet/rankingDocs.d.ts.map +1 -0
- package/dist/diet/rankingDocs.js +341 -0
- package/dist/diet/rankingDocs.js.map +1 -0
- package/dist/diet/rankingPlate.d.ts +42 -0
- package/dist/diet/rankingPlate.d.ts.map +1 -0
- package/dist/diet/rankingPlate.js +96 -0
- package/dist/diet/rankingPlate.js.map +1 -0
- package/dist/diet/receipt.d.ts +34 -0
- package/dist/diet/receipt.d.ts.map +1 -0
- package/dist/diet/receipt.js +371 -0
- package/dist/diet/receipt.js.map +1 -0
- package/dist/diet/review.d.ts +36 -0
- package/dist/diet/review.d.ts.map +1 -0
- package/dist/diet/review.js +152 -0
- package/dist/diet/review.js.map +1 -0
- package/dist/diet/reviewDocs.d.ts +72 -0
- package/dist/diet/reviewDocs.d.ts.map +1 -0
- package/dist/diet/reviewDocs.js +312 -0
- package/dist/diet/reviewDocs.js.map +1 -0
- package/dist/diet/routes.d.ts +12 -0
- package/dist/diet/routes.d.ts.map +1 -0
- package/dist/diet/routes.js +108 -0
- package/dist/diet/routes.js.map +1 -0
- package/dist/diet/sourceStatsDocs.d.ts +3 -0
- package/dist/diet/sourceStatsDocs.d.ts.map +1 -0
- package/dist/diet/sourceStatsDocs.js +115 -0
- package/dist/diet/sourceStatsDocs.js.map +1 -0
- package/dist/diet/today.d.ts +14 -0
- package/dist/diet/today.d.ts.map +1 -0
- package/dist/diet/today.js +87 -0
- package/dist/diet/today.js.map +1 -0
- package/dist/diet/todayDocs.d.ts +53 -0
- package/dist/diet/todayDocs.d.ts.map +1 -0
- package/dist/diet/todayDocs.js +238 -0
- package/dist/diet/todayDocs.js.map +1 -0
- package/dist/exercise/cardio.d.ts +11 -0
- package/dist/exercise/cardio.d.ts.map +1 -0
- package/dist/exercise/cardio.js +14 -0
- package/dist/exercise/cardio.js.map +1 -0
- package/dist/exercise/categoryColors.d.ts +23 -0
- package/dist/exercise/categoryColors.d.ts.map +1 -0
- package/dist/exercise/categoryColors.js +28 -0
- package/dist/exercise/categoryColors.js.map +1 -0
- package/dist/exercise/commands.d.ts +20 -0
- package/dist/exercise/commands.d.ts.map +1 -0
- package/dist/exercise/commands.js +22 -0
- package/dist/exercise/commands.js.map +1 -0
- package/dist/exercise/distribution.d.ts +11 -0
- package/dist/exercise/distribution.d.ts.map +1 -0
- package/dist/exercise/distribution.js +14 -0
- package/dist/exercise/distribution.js.map +1 -0
- package/dist/exercise/edit.d.ts +22 -0
- package/dist/exercise/edit.d.ts.map +1 -0
- package/dist/exercise/edit.js +148 -0
- package/dist/exercise/edit.js.map +1 -0
- package/dist/exercise/exerciseStore.d.ts +87 -0
- package/dist/exercise/exerciseStore.d.ts.map +1 -0
- package/dist/exercise/exerciseStore.js +287 -0
- package/dist/exercise/exerciseStore.js.map +1 -0
- package/dist/exercise/fieldLabels.d.ts +5 -0
- package/dist/exercise/fieldLabels.d.ts.map +1 -0
- package/dist/exercise/fieldLabels.js +34 -0
- package/dist/exercise/fieldLabels.js.map +1 -0
- package/dist/exercise/goal.d.ts +16 -0
- package/dist/exercise/goal.d.ts.map +1 -0
- package/dist/exercise/goal.js +46 -0
- package/dist/exercise/goal.js.map +1 -0
- package/dist/exercise/index.d.ts +22 -0
- package/dist/exercise/index.d.ts.map +1 -0
- package/dist/exercise/index.js +22 -0
- package/dist/exercise/index.js.map +1 -0
- package/dist/exercise/log.d.ts +19 -0
- package/dist/exercise/log.d.ts.map +1 -0
- package/dist/exercise/log.js +102 -0
- package/dist/exercise/log.js.map +1 -0
- package/dist/exercise/precheck.d.ts +19 -0
- package/dist/exercise/precheck.d.ts.map +1 -0
- package/dist/exercise/precheck.js +127 -0
- package/dist/exercise/precheck.js.map +1 -0
- package/dist/exercise/recap.d.ts +11 -0
- package/dist/exercise/recap.d.ts.map +1 -0
- package/dist/exercise/recap.js +14 -0
- package/dist/exercise/recap.js.map +1 -0
- package/dist/exercise/receipt.d.ts +43 -0
- package/dist/exercise/receipt.d.ts.map +1 -0
- package/dist/exercise/receipt.js +401 -0
- package/dist/exercise/receipt.js.map +1 -0
- package/dist/exercise/records.d.ts +60 -0
- package/dist/exercise/records.d.ts.map +1 -0
- package/dist/exercise/records.js +317 -0
- package/dist/exercise/records.js.map +1 -0
- package/dist/exercise/routes.d.ts +21 -0
- package/dist/exercise/routes.d.ts.map +1 -0
- package/dist/exercise/routes.js +38 -0
- package/dist/exercise/routes.js.map +1 -0
- package/dist/exercise/sportUi.d.ts +77 -0
- package/dist/exercise/sportUi.d.ts.map +1 -0
- package/dist/exercise/sportUi.js +268 -0
- package/dist/exercise/sportUi.js.map +1 -0
- package/dist/exercise/strength.d.ts +11 -0
- package/dist/exercise/strength.d.ts.map +1 -0
- package/dist/exercise/strength.js +14 -0
- package/dist/exercise/strength.js.map +1 -0
- package/dist/exercise/trend.d.ts +11 -0
- package/dist/exercise/trend.d.ts.map +1 -0
- package/dist/exercise/trend.js +14 -0
- package/dist/exercise/trend.js.map +1 -0
- package/dist/fetch/audit.d.ts +2 -0
- package/dist/fetch/audit.d.ts.map +1 -1
- package/dist/fetch/audit.js +11 -10
- package/dist/fetch/audit.js.map +1 -1
- package/dist/fetch/batch.js +1 -1
- package/dist/fetch/batch.js.map +1 -1
- package/dist/fetch/body.d.ts +104 -1
- package/dist/fetch/body.d.ts.map +1 -1
- package/dist/fetch/body.js +195 -26
- package/dist/fetch/body.js.map +1 -1
- package/dist/fetch/cli.js +11 -5
- package/dist/fetch/cli.js.map +1 -1
- package/dist/fetch/index.d.ts +5 -7
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +7 -6
- package/dist/fetch/index.js.map +1 -1
- package/dist/fetch/profile.d.ts +24 -3
- package/dist/fetch/profile.d.ts.map +1 -1
- package/dist/fetch/profile.js +43 -14
- package/dist/fetch/profile.js.map +1 -1
- package/dist/fetch/xunji-catalog.d.ts +5 -0
- package/dist/fetch/xunji-catalog.d.ts.map +1 -1
- package/dist/fetch/xunji-catalog.js +22 -1
- package/dist/fetch/xunji-catalog.js.map +1 -1
- package/dist/goal/commands.d.ts +31 -0
- package/dist/goal/commands.d.ts.map +1 -0
- package/dist/goal/commands.js +20 -0
- package/dist/goal/commands.js.map +1 -0
- package/dist/goal/goalExtraPlate.d.ts +45 -0
- package/dist/goal/goalExtraPlate.d.ts.map +1 -0
- package/dist/goal/goalExtraPlate.js +95 -0
- package/dist/goal/goalExtraPlate.js.map +1 -0
- package/dist/goal/goalHistory.d.ts +24 -0
- package/dist/goal/goalHistory.d.ts.map +1 -0
- package/dist/goal/goalHistory.js +51 -0
- package/dist/goal/goalHistory.js.map +1 -0
- package/dist/goal/goalPlate.d.ts +24 -0
- package/dist/goal/goalPlate.d.ts.map +1 -0
- package/dist/goal/goalPlate.js +34 -0
- package/dist/goal/goalPlate.js.map +1 -0
- package/dist/goal/goalPlates.d.ts +66 -0
- package/dist/goal/goalPlates.d.ts.map +1 -0
- package/dist/goal/goalPlates.js +114 -0
- package/dist/goal/goalPlates.js.map +1 -0
- package/dist/goal/goalRecommendDoc.d.ts +6 -0
- package/dist/goal/goalRecommendDoc.d.ts.map +1 -0
- package/dist/goal/goalRecommendDoc.js +107 -0
- package/dist/goal/goalRecommendDoc.js.map +1 -0
- package/dist/goal/goalStore.d.ts +56 -0
- package/dist/goal/goalStore.d.ts.map +1 -0
- package/dist/goal/goalStore.js +111 -0
- package/dist/goal/goalStore.js.map +1 -0
- package/dist/goal/goalWeightDoc.d.ts +7 -0
- package/dist/goal/goalWeightDoc.d.ts.map +1 -0
- package/dist/goal/goalWeightDoc.js +107 -0
- package/dist/goal/goalWeightDoc.js.map +1 -0
- package/dist/goal/index.d.ts +17 -0
- package/dist/goal/index.d.ts.map +1 -0
- package/dist/goal/index.js +21 -0
- package/dist/goal/index.js.map +1 -0
- package/dist/goal/nutritionGoal.d.ts +115 -0
- package/dist/goal/nutritionGoal.d.ts.map +1 -0
- package/dist/goal/nutritionGoal.js +165 -0
- package/dist/goal/nutritionGoal.js.map +1 -0
- package/dist/goal/precheck.d.ts +14 -0
- package/dist/goal/precheck.d.ts.map +1 -0
- package/dist/goal/precheck.js +213 -0
- package/dist/goal/precheck.js.map +1 -0
- package/dist/goal/read.d.ts +53 -0
- package/dist/goal/read.d.ts.map +1 -0
- package/dist/goal/read.js +154 -0
- package/dist/goal/read.js.map +1 -0
- package/dist/goal/receipt.d.ts +38 -0
- package/dist/goal/receipt.d.ts.map +1 -0
- package/dist/goal/receipt.js +290 -0
- package/dist/goal/receipt.js.map +1 -0
- package/dist/goal/resultDocs.d.ts +23 -0
- package/dist/goal/resultDocs.d.ts.map +1 -0
- package/dist/goal/resultDocs.js +279 -0
- package/dist/goal/resultDocs.js.map +1 -0
- package/dist/goal/routes.d.ts +12 -0
- package/dist/goal/routes.d.ts.map +1 -0
- package/dist/goal/routes.js +29 -0
- package/dist/goal/routes.js.map +1 -0
- package/dist/goal/set.d.ts +97 -0
- package/dist/goal/set.d.ts.map +1 -0
- package/dist/goal/set.js +103 -0
- package/dist/goal/set.js.map +1 -0
- package/dist/goal/write.d.ts +30 -0
- package/dist/goal/write.d.ts.map +1 -0
- package/dist/goal/write.js +102 -0
- package/dist/goal/write.js.map +1 -0
- package/dist/help-missing.json +35 -0
- package/dist/home/commands.d.ts +11 -0
- package/dist/home/commands.d.ts.map +1 -0
- package/dist/home/commands.js +8 -0
- package/dist/home/commands.js.map +1 -0
- package/dist/home/exercise.d.ts +27 -0
- package/dist/home/exercise.d.ts.map +1 -0
- package/dist/home/exercise.js +60 -0
- package/dist/home/exercise.js.map +1 -0
- package/dist/home/goalProgressDocs.d.ts +27 -0
- package/dist/home/goalProgressDocs.d.ts.map +1 -0
- package/dist/home/goalProgressDocs.js +363 -0
- package/dist/home/goalProgressDocs.js.map +1 -0
- package/dist/home/home.d.ts +38 -0
- package/dist/home/home.d.ts.map +1 -0
- package/dist/home/home.js +78 -0
- package/dist/home/home.js.map +1 -0
- package/dist/home/homeDocs.d.ts +8 -0
- package/dist/home/homeDocs.d.ts.map +1 -0
- package/dist/home/homeDocs.js +307 -0
- package/dist/home/homeDocs.js.map +1 -0
- package/dist/home/homeViewParts.d.ts +42 -0
- package/dist/home/homeViewParts.d.ts.map +1 -0
- package/dist/home/homeViewParts.js +316 -0
- package/dist/home/homeViewParts.js.map +1 -0
- package/dist/home/index.d.ts +14 -0
- package/dist/home/index.d.ts.map +1 -0
- package/dist/home/index.js +13 -0
- package/dist/home/index.js.map +1 -0
- package/dist/home/routes.d.ts +10 -0
- package/dist/home/routes.d.ts.map +1 -0
- package/dist/home/routes.js +47 -0
- package/dist/home/routes.js.map +1 -0
- package/dist/home/today.d.ts +50 -0
- package/dist/home/today.d.ts.map +1 -0
- package/dist/home/today.js +255 -0
- package/dist/home/today.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/migrate/migrate.js +1 -1
- package/dist/output.d.ts +19 -9
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +58 -125
- package/dist/output.js.map +1 -1
- package/dist/photo/commands.d.ts +55 -0
- package/dist/photo/commands.d.ts.map +1 -0
- package/dist/photo/commands.js +25 -0
- package/dist/photo/commands.js.map +1 -0
- package/dist/photo/compare.d.ts +24 -0
- package/dist/photo/compare.d.ts.map +1 -0
- package/dist/photo/compare.js +48 -0
- package/dist/photo/compare.js.map +1 -0
- package/dist/photo/compareDoc.d.ts +5 -0
- package/dist/photo/compareDoc.d.ts.map +1 -0
- package/dist/photo/compareDoc.js +221 -0
- package/dist/photo/compareDoc.js.map +1 -0
- package/dist/photo/dir.d.ts +5 -0
- package/dist/photo/dir.d.ts.map +1 -0
- package/dist/photo/dir.js +22 -0
- package/dist/photo/dir.js.map +1 -0
- package/dist/photo/gallery.d.ts +16 -0
- package/dist/photo/gallery.d.ts.map +1 -0
- package/dist/photo/gallery.js +45 -0
- package/dist/photo/gallery.js.map +1 -0
- package/dist/photo/galleryDoc.d.ts +12 -0
- package/dist/photo/galleryDoc.d.ts.map +1 -0
- package/dist/photo/galleryDoc.js +291 -0
- package/dist/photo/galleryDoc.js.map +1 -0
- package/dist/photo/gif.d.ts +28 -0
- package/dist/photo/gif.d.ts.map +1 -0
- package/dist/photo/gif.js +281 -0
- package/dist/photo/gif.js.map +1 -0
- package/dist/photo/gifDoc.d.ts +52 -0
- package/dist/photo/gifDoc.d.ts.map +1 -0
- package/dist/photo/gifDoc.js +311 -0
- package/dist/photo/gifDoc.js.map +1 -0
- package/dist/photo/help.d.ts +4 -0
- package/dist/photo/help.d.ts.map +1 -0
- package/dist/photo/help.js +87 -0
- package/dist/photo/help.js.map +1 -0
- package/dist/photo/helpCenter.d.ts +137 -0
- package/dist/photo/helpCenter.d.ts.map +1 -0
- package/dist/photo/helpCenter.js +475 -0
- package/dist/photo/helpCenter.js.map +1 -0
- package/dist/photo/helpDoc.d.ts +5 -0
- package/dist/photo/helpDoc.d.ts.map +1 -0
- package/dist/photo/helpDoc.js +205 -0
- package/dist/photo/helpDoc.js.map +1 -0
- package/dist/photo/helpDocContent.d.ts +77 -0
- package/dist/photo/helpDocContent.d.ts.map +1 -0
- package/dist/photo/helpDocContent.js +120 -0
- package/dist/photo/helpDocContent.js.map +1 -0
- package/dist/photo/helpDocCss.d.ts +5 -0
- package/dist/photo/helpDocCss.d.ts.map +1 -0
- package/dist/photo/helpDocCss.js +119 -0
- package/dist/photo/helpDocCss.js.map +1 -0
- package/dist/photo/helpFile.d.ts +26 -0
- package/dist/photo/helpFile.d.ts.map +1 -0
- package/dist/photo/helpFile.js +90 -0
- package/dist/photo/helpFile.js.map +1 -0
- package/dist/photo/helpLookup.d.ts +18 -0
- package/dist/photo/helpLookup.d.ts.map +1 -0
- package/dist/photo/helpLookup.js +58 -0
- package/dist/photo/helpLookup.js.map +1 -0
- package/dist/photo/helpPaths.d.ts +22 -0
- package/dist/photo/helpPaths.d.ts.map +1 -0
- package/dist/photo/helpPaths.js +22 -0
- package/dist/photo/helpPaths.js.map +1 -0
- package/dist/photo/index.d.ts +17 -0
- package/dist/photo/index.d.ts.map +1 -0
- package/dist/photo/index.js +21 -0
- package/dist/photo/index.js.map +1 -0
- package/dist/photo/manage.d.ts +13 -0
- package/dist/photo/manage.d.ts.map +1 -0
- package/dist/photo/manage.js +64 -0
- package/dist/photo/manage.js.map +1 -0
- package/dist/photo/photo.d.ts +118 -0
- package/dist/photo/photo.d.ts.map +1 -0
- package/dist/photo/photo.js +279 -0
- package/dist/photo/photo.js.map +1 -0
- package/dist/photo/photoThumb.d.ts +38 -0
- package/dist/photo/photoThumb.d.ts.map +1 -0
- package/dist/photo/photoThumb.js +83 -0
- package/dist/photo/photoThumb.js.map +1 -0
- package/dist/photo/photoUi.d.ts +39 -0
- package/dist/photo/photoUi.d.ts.map +1 -0
- package/dist/photo/photoUi.js +233 -0
- package/dist/photo/photoUi.js.map +1 -0
- package/dist/photo/photos.d.ts +76 -0
- package/dist/photo/photos.d.ts.map +1 -0
- package/dist/photo/photos.js +193 -0
- package/dist/photo/photos.js.map +1 -0
- package/dist/photo/picker.d.ts +41 -0
- package/dist/photo/picker.d.ts.map +1 -0
- package/dist/photo/picker.js +132 -0
- package/dist/photo/picker.js.map +1 -0
- package/dist/photo/pickerDoc.d.ts +12 -0
- package/dist/photo/pickerDoc.d.ts.map +1 -0
- package/dist/photo/pickerDoc.js +231 -0
- package/dist/photo/pickerDoc.js.map +1 -0
- package/dist/photo/receipt.d.ts +23 -0
- package/dist/photo/receipt.d.ts.map +1 -0
- package/dist/photo/receipt.js +331 -0
- package/dist/photo/receipt.js.map +1 -0
- package/dist/photo/receiptUi.d.ts +42 -0
- package/dist/photo/receiptUi.d.ts.map +1 -0
- package/dist/photo/receiptUi.js +147 -0
- package/dist/photo/receiptUi.js.map +1 -0
- package/dist/photo/routes.d.ts +10 -0
- package/dist/photo/routes.d.ts.map +1 -0
- package/dist/photo/routes.js +29 -0
- package/dist/photo/routes.js.map +1 -0
- package/dist/photo/store.d.ts +10 -0
- package/dist/photo/store.d.ts.map +1 -0
- package/dist/photo/store.js +44 -0
- package/dist/photo/store.js.map +1 -0
- package/dist/photo/viewerDoc.d.ts +5 -0
- package/dist/photo/viewerDoc.d.ts.map +1 -0
- package/dist/photo/viewerDoc.js +255 -0
- package/dist/photo/viewerDoc.js.map +1 -0
- package/dist/photo/wizard.d.ts +15 -0
- package/dist/photo/wizard.d.ts.map +1 -0
- package/dist/photo/wizard.js +25 -0
- package/dist/photo/wizard.js.map +1 -0
- package/dist/photo/wizardUi.d.ts +24 -0
- package/dist/photo/wizardUi.d.ts.map +1 -0
- package/dist/photo/wizardUi.js +101 -0
- package/dist/photo/wizardUi.js.map +1 -0
- package/dist/profile/commands.d.ts +28 -0
- package/dist/profile/commands.d.ts.map +1 -0
- package/dist/profile/commands.js +10 -0
- package/dist/profile/commands.js.map +1 -0
- package/dist/profile/index.d.ts +23 -0
- package/dist/profile/index.d.ts.map +1 -0
- package/dist/profile/index.js +22 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/labels.d.ts +10 -0
- package/dist/profile/labels.d.ts.map +1 -0
- package/dist/profile/labels.js +52 -0
- package/dist/profile/labels.js.map +1 -0
- package/dist/profile/read.d.ts +13 -0
- package/dist/profile/read.d.ts.map +1 -0
- package/dist/profile/read.js +24 -0
- package/dist/profile/read.js.map +1 -0
- package/dist/profile/receipt.d.ts +10 -0
- package/dist/profile/receipt.d.ts.map +1 -0
- package/dist/profile/receipt.js +19 -0
- package/dist/profile/receipt.js.map +1 -0
- package/dist/profile/routes.d.ts +8 -0
- package/dist/profile/routes.d.ts.map +1 -0
- package/dist/profile/routes.js +9 -0
- package/dist/profile/routes.js.map +1 -0
- package/dist/profile/setup.d.ts +25 -6
- package/dist/profile/setup.d.ts.map +1 -1
- package/dist/profile/setup.js +184 -78
- package/dist/profile/setup.js.map +1 -1
- package/dist/profile/update.d.ts +1 -1
- package/dist/profile/update.d.ts.map +1 -1
- package/dist/profile/update.js +33 -13
- package/dist/profile/update.js.map +1 -1
- package/dist/profile/view.d.ts +35 -4
- package/dist/profile/view.d.ts.map +1 -1
- package/dist/profile/view.js +132 -22
- package/dist/profile/view.js.map +1 -1
- package/dist/profile/write.d.ts +16 -0
- package/dist/profile/write.d.ts.map +1 -0
- package/dist/profile/write.js +75 -0
- package/dist/profile/write.js.map +1 -0
- package/dist/render/analysisPlate.d.ts +1 -1
- package/dist/render/analysisPlate.d.ts.map +1 -1
- package/dist/render/analysisPlate.js +1 -1
- package/dist/render/analysisPlate.js.map +1 -1
- package/dist/render/dietDocs.d.ts +19 -19
- package/dist/render/dietDocs.d.ts.map +1 -1
- package/dist/render/dietDocs.js +158 -457
- package/dist/render/dietDocs.js.map +1 -1
- package/dist/render/exercisePort.d.ts +3 -1
- package/dist/render/exercisePort.d.ts.map +1 -1
- package/dist/render/exercisePort.js +4 -3
- package/dist/render/exercisePort.js.map +1 -1
- package/dist/render/goalExtra.d.ts.map +1 -1
- package/dist/render/goalExtra.js +2 -1
- package/dist/render/goalExtra.js.map +1 -1
- package/dist/render/goalPlate.d.ts +2 -2
- package/dist/render/goalPlate.d.ts.map +1 -1
- package/dist/render/goalPlate.js +3 -3
- package/dist/render/goalPlate.js.map +1 -1
- package/dist/render/helpShell.d.ts +1 -1
- package/dist/render/helpShell.d.ts.map +1 -1
- package/dist/render/html.d.ts +36 -20
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +37 -45
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +35 -31
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +29 -17
- package/dist/render/index.js.map +1 -1
- package/dist/render/insightPlate.d.ts +17 -0
- package/dist/render/insightPlate.d.ts.map +1 -1
- package/dist/render/insightPlate.js +109 -1
- package/dist/render/insightPlate.js.map +1 -1
- package/dist/render/pageChromeCss.d.ts +24 -0
- package/dist/render/pageChromeCss.d.ts.map +1 -0
- package/dist/render/pageChromeCss.js +45 -0
- package/dist/render/pageChromeCss.js.map +1 -0
- package/dist/render/planCopyBlock.d.ts +32 -0
- package/dist/render/planCopyBlock.d.ts.map +1 -0
- package/dist/render/planCopyBlock.js +34 -0
- package/dist/render/planCopyBlock.js.map +1 -0
- package/dist/render/planEditor.d.ts +94 -0
- package/dist/render/planEditor.d.ts.map +1 -0
- package/dist/render/planEditor.js +38 -0
- package/dist/render/planEditor.js.map +1 -0
- package/dist/render/planEditorCss.d.ts +13 -0
- package/dist/render/planEditorCss.d.ts.map +1 -0
- package/dist/render/planEditorCss.js +140 -0
- package/dist/render/planEditorCss.js.map +1 -0
- package/dist/render/planEditorDocs.d.ts +7 -0
- package/dist/render/planEditorDocs.d.ts.map +1 -0
- package/dist/render/planEditorDocs.js +56 -0
- package/dist/render/planEditorDocs.js.map +1 -0
- package/dist/render/planEditorPort.d.ts +45 -0
- package/dist/render/planEditorPort.d.ts.map +1 -0
- package/dist/render/planEditorPort.js +217 -0
- package/dist/render/planEditorPort.js.map +1 -0
- package/dist/render/planEditorRuntime.d.ts +15 -0
- package/dist/render/planEditorRuntime.d.ts.map +1 -0
- package/dist/render/planEditorRuntime.js +427 -0
- package/dist/render/planEditorRuntime.js.map +1 -0
- package/dist/render/planPlate.d.ts +84 -4
- package/dist/render/planPlate.d.ts.map +1 -1
- package/dist/render/planPlate.js +155 -7
- package/dist/render/planPlate.js.map +1 -1
- package/dist/render/planWizardCss.d.ts +21 -0
- package/dist/render/planWizardCss.d.ts.map +1 -0
- package/dist/render/planWizardCss.js +121 -0
- package/dist/render/planWizardCss.js.map +1 -0
- package/dist/render/planWizardDocs.d.ts +8 -0
- package/dist/render/planWizardDocs.d.ts.map +1 -0
- package/dist/render/planWizardDocs.js +151 -0
- package/dist/render/planWizardDocs.js.map +1 -0
- package/dist/render/receipt.d.ts +1 -1
- package/dist/render/receipt.d.ts.map +1 -1
- package/dist/render/receipt.js +1 -1
- package/dist/render/receipt.js.map +1 -1
- package/dist/render/reviewDocs.d.ts +3 -0
- package/dist/render/reviewDocs.d.ts.map +1 -0
- package/dist/render/reviewDocs.js +222 -0
- package/dist/render/reviewDocs.js.map +1 -0
- package/dist/render/reviewDocsCss.d.ts +5 -0
- package/dist/render/reviewDocsCss.d.ts.map +1 -0
- package/dist/render/reviewDocsCss.js +128 -0
- package/dist/render/reviewDocsCss.js.map +1 -0
- package/dist/render/sportDocs.d.ts +17 -12
- package/dist/render/sportDocs.d.ts.map +1 -1
- package/dist/render/sportDocs.js +370 -525
- package/dist/render/sportDocs.js.map +1 -1
- package/dist/render/sportPortDocs.d.ts +3 -2
- package/dist/render/sportPortDocs.d.ts.map +1 -1
- package/dist/render/sportPortDocs.js +810 -389
- package/dist/render/sportPortDocs.js.map +1 -1
- package/dist/render/trendDocs.d.ts +16 -6
- package/dist/render/trendDocs.d.ts.map +1 -1
- package/dist/render/trendDocs.js +293 -252
- package/dist/render/trendDocs.js.map +1 -1
- package/dist/render/trendMiscPort.d.ts +9 -24
- package/dist/render/trendMiscPort.d.ts.map +1 -1
- package/dist/render/trendMiscPort.js +7 -30
- package/dist/render/trendMiscPort.js.map +1 -1
- package/dist/render/trendMiscPortDocs.d.ts +1 -2
- package/dist/render/trendMiscPortDocs.d.ts.map +1 -1
- package/dist/render/trendMiscPortDocs.js +256 -107
- package/dist/render/trendMiscPortDocs.js.map +1 -1
- package/dist/render/trendPredictDocs.d.ts +16 -0
- package/dist/render/trendPredictDocs.d.ts.map +1 -0
- package/dist/render/trendPredictDocs.js +1131 -0
- package/dist/render/trendPredictDocs.js.map +1 -0
- package/dist/render/wizardPort.d.ts +9 -62
- package/dist/render/wizardPort.d.ts.map +1 -1
- package/dist/render/wizardPort.js +20 -180
- package/dist/render/wizardPort.js.map +1 -1
- package/dist/render/wizardPortDocs.d.ts +5 -5
- package/dist/render/wizardPortDocs.d.ts.map +1 -1
- package/dist/render/wizardPortDocs.js +273 -215
- package/dist/render/wizardPortDocs.js.map +1 -1
- package/dist/render/workoutMovementTable.d.ts +10 -0
- package/dist/render/workoutMovementTable.d.ts.map +1 -0
- package/dist/render/workoutMovementTable.js +153 -0
- package/dist/render/workoutMovementTable.js.map +1 -0
- package/dist/render/workoutPlanCss.d.ts +15 -0
- package/dist/render/workoutPlanCss.d.ts.map +1 -0
- package/dist/render/workoutPlanCss.js +217 -0
- package/dist/render/workoutPlanCss.js.map +1 -0
- package/dist/render/workoutPlanDocs.d.ts +23 -0
- package/dist/render/workoutPlanDocs.d.ts.map +1 -0
- package/dist/render/workoutPlanDocs.js +244 -0
- package/dist/render/workoutPlanDocs.js.map +1 -0
- package/dist/render/workoutPlanLook.d.ts +16 -0
- package/dist/render/workoutPlanLook.d.ts.map +1 -0
- package/dist/render/workoutPlanLook.js +135 -0
- package/dist/render/workoutPlanLook.js.map +1 -0
- package/dist/shared/commandSpec.d.ts +73 -0
- package/dist/shared/commandSpec.d.ts.map +1 -0
- package/dist/shared/commandSpec.js +2 -0
- package/dist/shared/commandSpec.js.map +1 -0
- package/dist/shared/conclusionLine.d.ts +3 -0
- package/dist/shared/conclusionLine.d.ts.map +1 -0
- package/dist/shared/conclusionLine.js +21 -0
- package/dist/shared/conclusionLine.js.map +1 -0
- package/dist/shared/contentSuffix.d.ts +17 -0
- package/dist/shared/contentSuffix.d.ts.map +1 -0
- package/dist/shared/contentSuffix.js +125 -0
- package/dist/shared/contentSuffix.js.map +1 -0
- package/dist/shared/copyArea.d.ts +30 -11
- package/dist/shared/copyArea.d.ts.map +1 -1
- package/dist/shared/copyArea.js +68 -13
- package/dist/shared/copyArea.js.map +1 -1
- package/dist/shared/docPage.d.ts +26 -4
- package/dist/shared/docPage.d.ts.map +1 -1
- package/dist/shared/docPage.js +83 -9
- package/dist/shared/docPage.js.map +1 -1
- package/dist/shared/emptyGuide.d.ts +9 -0
- package/dist/shared/emptyGuide.d.ts.map +1 -0
- package/dist/shared/emptyGuide.js +31 -0
- package/dist/shared/emptyGuide.js.map +1 -0
- package/dist/shared/fieldLabel.d.ts +5 -0
- package/dist/shared/fieldLabel.d.ts.map +1 -0
- package/dist/shared/fieldLabel.js +42 -0
- package/dist/shared/fieldLabel.js.map +1 -0
- package/dist/shared/operationHead.d.ts +21 -0
- package/dist/shared/operationHead.d.ts.map +1 -0
- package/dist/shared/operationHead.js +73 -0
- package/dist/shared/operationHead.js.map +1 -0
- package/dist/shared/pageKit.d.ts +25 -0
- package/dist/shared/pageKit.d.ts.map +1 -0
- package/dist/shared/pageKit.js +56 -0
- package/dist/shared/pageKit.js.map +1 -0
- package/dist/shared/params.d.ts +54 -0
- package/dist/shared/params.d.ts.map +1 -0
- package/dist/shared/params.js +176 -0
- package/dist/shared/params.js.map +1 -0
- package/dist/shared/receiptParts.d.ts +9 -0
- package/dist/shared/receiptParts.d.ts.map +1 -0
- package/dist/shared/receiptParts.js +40 -0
- package/dist/shared/receiptParts.js.map +1 -0
- package/dist/shared/sceneEnvelope.d.ts +32 -0
- package/dist/shared/sceneEnvelope.d.ts.map +1 -0
- package/dist/shared/sceneEnvelope.js +12 -0
- package/dist/shared/sceneEnvelope.js.map +1 -0
- package/dist/shared/sourceLine.d.ts +10 -0
- package/dist/shared/sourceLine.d.ts.map +1 -0
- package/dist/shared/sourceLine.js +37 -0
- package/dist/shared/sourceLine.js.map +1 -0
- package/dist/shared/writeParts.d.ts +61 -0
- package/dist/shared/writeParts.d.ts.map +1 -0
- package/dist/shared/writeParts.js +79 -0
- package/dist/shared/writeParts.js.map +1 -0
- package/dist/triggers/help-lookup.d.ts +41 -5
- package/dist/triggers/help-lookup.d.ts.map +1 -1
- package/dist/triggers/help-lookup.js +100 -51
- package/dist/triggers/help-lookup.js.map +1 -1
- package/dist/triggers/index.js +1 -1
- package/dist/triggers/routeSpec.d.ts +66 -0
- package/dist/triggers/routeSpec.d.ts.map +1 -0
- package/dist/triggers/routeSpec.js +21 -0
- package/dist/triggers/routeSpec.js.map +1 -0
- package/dist/triggers/routes.generated.d.ts +17 -0
- package/dist/triggers/routes.generated.d.ts.map +1 -0
- package/dist/triggers/routes.generated.js +519 -0
- package/dist/triggers/routes.generated.js.map +1 -0
- package/dist/triggers/routing.d.ts +11 -34
- package/dist/triggers/routing.d.ts.map +1 -1
- package/dist/triggers/routing.js +12 -528
- package/dist/triggers/routing.js.map +1 -1
- package/dist/triggers/scene-01-home.js +9 -9
- package/dist/triggers/scene-01-home.js.map +1 -1
- package/dist/triggers/scene-02-diet.js +62 -62
- package/dist/triggers/scene-02-diet.js.map +1 -1
- package/dist/triggers/scene-03-weight.js +54 -54
- package/dist/triggers/scene-03-weight.js.map +1 -1
- package/dist/triggers/scene-04-exercise.js +33 -33
- package/dist/triggers/scene-04-exercise.js.map +1 -1
- package/dist/triggers/scene-05-workout.js +32 -32
- package/dist/triggers/scene-05-workout.js.map +1 -1
- package/dist/triggers/scene-06-goal.d.ts +1 -1
- package/dist/triggers/scene-06-goal.d.ts.map +1 -1
- package/dist/triggers/scene-06-goal.js +25 -24
- package/dist/triggers/scene-06-goal.js.map +1 -1
- package/dist/triggers/scene-07-profile.js +1 -1
- package/dist/triggers/scene-07-profile.js.map +1 -1
- package/dist/triggers/scene-08-body.js +10 -10
- package/dist/triggers/scene-08-body.js.map +1 -1
- package/dist/triggers/scene-09-photo.js +10 -10
- package/dist/triggers/scene-09-photo.js.map +1 -1
- package/dist/triggers/scene-10-analysis.js +176 -176
- package/dist/triggers/scene-10-analysis.js.map +1 -1
- package/dist/triggers/wake-assets.d.ts.map +1 -1
- package/dist/triggers/wake-assets.js +21 -11
- package/dist/triggers/wake-assets.js.map +1 -1
- package/dist/weight/commands.d.ts +21 -0
- package/dist/weight/commands.d.ts.map +1 -0
- package/dist/weight/commands.js +18 -0
- package/dist/weight/commands.js.map +1 -0
- package/dist/weight/compare.d.ts +60 -0
- package/dist/weight/compare.d.ts.map +1 -0
- package/dist/weight/compare.js +570 -0
- package/dist/weight/compare.js.map +1 -0
- package/dist/weight/edit.d.ts +13 -0
- package/dist/weight/edit.d.ts.map +1 -0
- package/dist/weight/edit.js +87 -0
- package/dist/weight/edit.js.map +1 -0
- package/dist/weight/fieldLabels.d.ts +5 -0
- package/dist/weight/fieldLabels.d.ts.map +1 -0
- package/dist/weight/fieldLabels.js +23 -0
- package/dist/weight/fieldLabels.js.map +1 -0
- package/dist/weight/figures.d.ts +87 -0
- package/dist/weight/figures.d.ts.map +1 -0
- package/dist/weight/figures.js +219 -0
- package/dist/weight/figures.js.map +1 -0
- package/dist/weight/history.d.ts +85 -0
- package/dist/weight/history.d.ts.map +1 -0
- package/dist/weight/history.js +771 -0
- package/dist/weight/history.js.map +1 -0
- package/dist/weight/index.d.ts +27 -0
- package/dist/weight/index.d.ts.map +1 -0
- package/dist/weight/index.js +23 -0
- package/dist/weight/index.js.map +1 -0
- package/dist/weight/log.d.ts +40 -0
- package/dist/weight/log.d.ts.map +1 -0
- package/dist/weight/log.js +355 -0
- package/dist/weight/log.js.map +1 -0
- package/dist/weight/logReceipt.d.ts +28 -0
- package/dist/weight/logReceipt.d.ts.map +1 -0
- package/dist/weight/logReceipt.js +259 -0
- package/dist/weight/logReceipt.js.map +1 -0
- package/dist/weight/plate.d.ts +77 -0
- package/dist/weight/plate.d.ts.map +1 -0
- package/dist/weight/plate.js +60 -0
- package/dist/weight/plate.js.map +1 -0
- package/dist/weight/plateDocs.d.ts +83 -0
- package/dist/weight/plateDocs.d.ts.map +1 -0
- package/dist/weight/plateDocs.js +179 -0
- package/dist/weight/plateDocs.js.map +1 -0
- package/dist/weight/receipt.d.ts +23 -0
- package/dist/weight/receipt.d.ts.map +1 -0
- package/dist/weight/receipt.js +178 -0
- package/dist/weight/receipt.js.map +1 -0
- package/dist/weight/records.d.ts +109 -0
- package/dist/weight/records.d.ts.map +1 -0
- package/dist/weight/records.js +210 -0
- package/dist/weight/records.js.map +1 -0
- package/dist/weight/review.d.ts +114 -0
- package/dist/weight/review.d.ts.map +1 -0
- package/dist/weight/review.js +651 -0
- package/dist/weight/review.js.map +1 -0
- package/dist/weight/routes.d.ts +7 -0
- package/dist/weight/routes.d.ts.map +1 -0
- package/dist/weight/routes.js +68 -0
- package/dist/weight/routes.js.map +1 -0
- package/dist/weight/volatility.d.ts +78 -0
- package/dist/weight/volatility.d.ts.map +1 -0
- package/dist/weight/volatility.js +203 -0
- package/dist/weight/volatility.js.map +1 -0
- package/dist/weight/volatilityDoc.d.ts +10 -0
- package/dist/weight/volatilityDoc.d.ts.map +1 -0
- package/dist/weight/volatilityDoc.js +395 -0
- package/dist/weight/volatilityDoc.js.map +1 -0
- package/dist/weight/weightCompare.d.ts +70 -0
- package/dist/weight/weightCompare.d.ts.map +1 -0
- package/dist/weight/weightCompare.js +221 -0
- package/dist/weight/weightCompare.js.map +1 -0
- package/dist/weight/weightCompare2.d.ts +66 -0
- package/dist/weight/weightCompare2.d.ts.map +1 -0
- package/dist/weight/weightCompare2.js +218 -0
- package/dist/weight/weightCompare2.js.map +1 -0
- package/dist/weight/weightCompare3.d.ts +18 -0
- package/dist/weight/weightCompare3.d.ts.map +1 -0
- package/dist/weight/weightCompare3.js +222 -0
- package/dist/weight/weightCompare3.js.map +1 -0
- package/dist/weight/weightUi.d.ts +114 -0
- package/dist/weight/weightUi.d.ts.map +1 -0
- package/dist/weight/weightUi.js +256 -0
- package/dist/weight/weightUi.js.map +1 -0
- package/dist/workout/commands.d.ts +29 -0
- package/dist/workout/commands.d.ts.map +1 -0
- package/dist/workout/commands.js +35 -0
- package/dist/workout/commands.js.map +1 -0
- package/dist/workout/contraindication.d.ts +11 -0
- package/dist/workout/contraindication.d.ts.map +1 -0
- package/dist/workout/contraindication.js +11 -0
- package/dist/workout/contraindication.js.map +1 -0
- package/dist/workout/dayPhrase.d.ts +13 -0
- package/dist/workout/dayPhrase.d.ts.map +1 -0
- package/dist/workout/dayPhrase.js +15 -0
- package/dist/workout/dayPhrase.js.map +1 -0
- package/dist/workout/fieldLabels.d.ts +5 -0
- package/dist/workout/fieldLabels.d.ts.map +1 -0
- package/dist/workout/fieldLabels.js +45 -0
- package/dist/workout/fieldLabels.js.map +1 -0
- package/dist/workout/index.d.ts +30 -0
- package/dist/workout/index.d.ts.map +1 -0
- package/dist/workout/index.js +34 -0
- package/dist/workout/index.js.map +1 -0
- package/dist/workout/land.d.ts +45 -0
- package/dist/workout/land.d.ts.map +1 -0
- package/dist/workout/land.js +280 -0
- package/dist/workout/land.js.map +1 -0
- package/dist/workout/landBatch.d.ts +60 -0
- package/dist/workout/landBatch.d.ts.map +1 -0
- package/dist/workout/landBatch.js +225 -0
- package/dist/workout/landBatch.js.map +1 -0
- package/dist/workout/landBatchPages.d.ts +31 -0
- package/dist/workout/landBatchPages.d.ts.map +1 -0
- package/dist/workout/landBatchPages.js +132 -0
- package/dist/workout/landBatchPages.js.map +1 -0
- package/dist/workout/landPages.d.ts +41 -0
- package/dist/workout/landPages.d.ts.map +1 -0
- package/dist/workout/landPages.js +153 -0
- package/dist/workout/landPages.js.map +1 -0
- package/dist/workout/landRunner.d.ts +42 -0
- package/dist/workout/landRunner.d.ts.map +1 -0
- package/dist/workout/landRunner.js +155 -0
- package/dist/workout/landRunner.js.map +1 -0
- package/dist/workout/movementType.d.ts +14 -0
- package/dist/workout/movementType.d.ts.map +1 -0
- package/dist/workout/movementType.js +16 -0
- package/dist/workout/movementType.js.map +1 -0
- package/dist/workout/plan.d.ts +21 -0
- package/dist/workout/plan.d.ts.map +1 -0
- package/dist/workout/plan.js +44 -0
- package/dist/workout/plan.js.map +1 -0
- package/dist/workout/planStore.d.ts +157 -0
- package/dist/workout/planStore.d.ts.map +1 -0
- package/dist/workout/planStore.js +282 -0
- package/dist/workout/planStore.js.map +1 -0
- package/dist/workout/precheckPrompt.d.ts +7 -0
- package/dist/workout/precheckPrompt.d.ts.map +1 -0
- package/dist/workout/precheckPrompt.js +35 -0
- package/dist/workout/precheckPrompt.js.map +1 -0
- package/dist/workout/progress.d.ts +12 -0
- package/dist/workout/progress.d.ts.map +1 -0
- package/dist/workout/progress.js +16 -0
- package/dist/workout/progress.js.map +1 -0
- package/dist/workout/receipt.d.ts +15 -0
- package/dist/workout/receipt.d.ts.map +1 -0
- package/dist/workout/receipt.js +128 -0
- package/dist/workout/receipt.js.map +1 -0
- package/dist/workout/review.d.ts +12 -0
- package/dist/workout/review.d.ts.map +1 -0
- package/dist/workout/review.js +15 -0
- package/dist/workout/review.js.map +1 -0
- package/dist/workout/routes.d.ts +13 -0
- package/dist/workout/routes.d.ts.map +1 -0
- package/dist/workout/routes.js +49 -0
- package/dist/workout/routes.js.map +1 -0
- package/dist/workout/wizard.d.ts +14 -0
- package/dist/workout/wizard.d.ts.map +1 -0
- package/dist/workout/wizard.js +20 -0
- package/dist/workout/wizard.js.map +1 -0
- package/dist/workout/write.d.ts +78 -0
- package/dist/workout/write.d.ts.map +1 -0
- package/dist/workout/write.js +607 -0
- package/dist/workout/write.js.map +1 -0
- package/dist/workout/xunjiBackfill.d.ts +36 -0
- package/dist/workout/xunjiBackfill.d.ts.map +1 -0
- package/dist/workout/xunjiBackfill.js +198 -0
- package/dist/workout/xunjiBackfill.js.map +1 -0
- package/dist/workout/xunjiPush.d.ts +33 -0
- package/dist/workout/xunjiPush.d.ts.map +1 -0
- package/dist/workout/xunjiPush.js +236 -0
- package/dist/workout/xunjiPush.js.map +1 -0
- package/dist/workout/xunjiRunner.d.ts +29 -0
- package/dist/workout/xunjiRunner.d.ts.map +1 -0
- package/dist/workout/xunjiRunner.js +110 -0
- package/dist/workout/xunjiRunner.js.map +1 -0
- package/dist/xunji/backfill.d.ts +63 -0
- package/dist/xunji/backfill.d.ts.map +1 -0
- package/dist/xunji/backfill.js +150 -0
- package/dist/xunji/backfill.js.map +1 -0
- package/dist/xunji/catalog.d.ts +53 -0
- package/dist/xunji/catalog.d.ts.map +1 -0
- package/dist/xunji/catalog.js +126 -0
- package/dist/xunji/catalog.js.map +1 -0
- package/dist/xunji/cli.d.ts +3 -0
- package/dist/xunji/cli.d.ts.map +1 -0
- package/dist/xunji/cli.js +15 -0
- package/dist/xunji/cli.js.map +1 -0
- package/dist/xunji/exitMap.d.ts +37 -0
- package/dist/xunji/exitMap.d.ts.map +1 -0
- package/dist/xunji/exitMap.js +42 -0
- package/dist/xunji/exitMap.js.map +1 -0
- package/dist/xunji/fetch.d.ts +77 -0
- package/dist/xunji/fetch.d.ts.map +1 -0
- package/dist/xunji/fetch.js +160 -0
- package/dist/xunji/fetch.js.map +1 -0
- package/dist/xunji/index.d.ts +21 -0
- package/dist/xunji/index.d.ts.map +1 -0
- package/dist/xunji/index.js +18 -0
- package/dist/xunji/index.js.map +1 -0
- package/dist/xunji/key.d.ts +77 -0
- package/dist/xunji/key.d.ts.map +1 -0
- package/dist/xunji/key.js +160 -0
- package/dist/xunji/key.js.map +1 -0
- package/dist/xunji/overlay-plan.d.ts +79 -0
- package/dist/xunji/overlay-plan.d.ts.map +1 -0
- package/dist/xunji/overlay-plan.js +145 -0
- package/dist/xunji/overlay-plan.js.map +1 -0
- package/dist/xunji/planSource.d.ts +40 -0
- package/dist/xunji/planSource.d.ts.map +1 -0
- package/dist/xunji/planSource.js +78 -0
- package/dist/xunji/planSource.js.map +1 -0
- package/dist/xunji/push.d.ts +55 -0
- package/dist/xunji/push.d.ts.map +1 -0
- package/dist/xunji/push.js +69 -0
- package/dist/xunji/push.js.map +1 -0
- package/dist/xunji/rateLimit.d.ts +44 -0
- package/dist/xunji/rateLimit.d.ts.map +1 -0
- package/dist/xunji/rateLimit.js +99 -0
- package/dist/xunji/rateLimit.js.map +1 -0
- package/dist/xunji/request.d.ts +48 -0
- package/dist/xunji/request.d.ts.map +1 -0
- package/dist/xunji/request.js +60 -0
- package/dist/xunji/request.js.map +1 -0
- package/dist/xunji/retry.d.ts +50 -0
- package/dist/xunji/retry.d.ts.map +1 -0
- package/dist/xunji/retry.js +106 -0
- package/dist/xunji/retry.js.map +1 -0
- package/dist/xunji/rows.d.ts +32 -0
- package/dist/xunji/rows.d.ts.map +1 -0
- package/dist/xunji/rows.js +74 -0
- package/dist/xunji/rows.js.map +1 -0
- package/dist/xunji/run-sync.d.ts +106 -0
- package/dist/xunji/run-sync.d.ts.map +1 -0
- package/dist/xunji/run-sync.js +223 -0
- package/dist/xunji/run-sync.js.map +1 -0
- package/dist/xunji/run.d.ts +56 -0
- package/dist/xunji/run.d.ts.map +1 -0
- package/dist/xunji/run.js +300 -0
- package/dist/xunji/run.js.map +1 -0
- package/dist/xunji/store.d.ts +31 -0
- package/dist/xunji/store.d.ts.map +1 -0
- package/dist/xunji/store.js +60 -0
- package/dist/xunji/store.js.map +1 -0
- package/dist/xunji/subcommands.d.ts +64 -0
- package/dist/xunji/subcommands.d.ts.map +1 -0
- package/dist/xunji/subcommands.js +203 -0
- package/dist/xunji/subcommands.js.map +1 -0
- package/dist/xunji/upsert.d.ts +61 -0
- package/dist/xunji/upsert.d.ts.map +1 -0
- package/dist/xunji/upsert.js +100 -0
- package/dist/xunji/upsert.js.map +1 -0
- package/package.json +7 -3
- package/src/xunji/data//350/256/255/350/256/260/345/256/230/346/226/271/345/212/250/344/275/234.json +1099 -0
- package/templates/help.html +1 -1
- package/workflows/08-/350/272/253/344/275/223/347/273/206/350/212/202.md +60 -0
- package/workflows/09-/350/272/253/346/235/220/347/205/247/347/211/207.md +98 -0
package/dist/cli/write.js
CHANGED
|
@@ -1,275 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { addRecord, updateRecord, updateDay, deleteRecord, deleteDay, deleteRange, batchAdd, copyYesterday } from '../fetch/exercise.js';
|
|
4
|
-
import { addPhotos, deletePhoto, updateTag, tagAdd, tagRemove, getPhotoRow, resolvePhotosDir, daysSinceTagPhoto, parseTags, serializeTags, } from '../fetch/photos.js';
|
|
5
|
-
import { buildAddReceipt, buildDeleteReceipt, buildTagReceipt } from '../render/photo.js';
|
|
6
|
-
import { addProduct, updateProduct, deprecateProduct } from '../fetch/products.js';
|
|
7
|
-
import { setActivityLevel, updateProfile } from '../fetch/profile.js';
|
|
8
|
-
import { getNutritionGoal, setNutritionGoal, updateWaterGoal } from '../fetch/nutritionGoal.js';
|
|
9
|
-
import { pauseAllGoals, resumeAllGoals, setWeightGoal } from '../fetch/goal.js';
|
|
10
|
-
import { CALIPER_FIELDS, ValidationError, addComposition, addMeasurement, deleteComposition, deleteMeasurement, } from '../fetch/body.js';
|
|
11
|
-
import { SOURCE_CHOICES, SOURCE_LABELS } from '../kcal.js';
|
|
12
|
-
import { buildCrudReceipt, withM5 } from '../render/receipt.js';
|
|
1
|
+
import { ValidationError, } from '../fetch/body.js';
|
|
2
|
+
import { withM5 } from '../render/receipt.js';
|
|
13
3
|
import { CalorieRenderError } from '../render/errors.js';
|
|
14
|
-
import { shiftISODate, todayISO } from '../analysis/utils.js';
|
|
15
4
|
// #179 · 场景 07 三条写入词的回执页:整页装配住在能力目录 `src/profile/`(写前页在 setup.ts)。
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
// #330 · 按命令选整页的端口也住能力目录(`src/profile/receipt.ts`,经 `src/profile/index.ts` 转出):
|
|
6
|
+
// 分派层只调门,不再写任何命令名字面量。
|
|
7
|
+
import { profileReceiptDoc } from '../profile/index.js';
|
|
8
|
+
// #269 · 饮食 13 条会改数据库的命令的回执页:整页装配住能力目录 `src/diet/receipt.ts`
|
|
9
|
+
//(经本文件直引,不经 `src/diet/index.ts` 转出;#276 需要的新增分支由本票留空)。
|
|
10
|
+
import { dietReceiptDoc } from '../diet/receipt.js';
|
|
11
|
+
// #337 · 体重 4 条会改数据库的命令的回执页:整页装配住能力目录 `src/weight/receipt.ts`
|
|
12
|
+
//(经 `src/weight/index.ts` 转出;与档案 3 条、饮食 13 条同形)。
|
|
13
|
+
import { weightReceiptDoc } from '../weight/index.js';
|
|
14
|
+
// T351 视觉修复·实施兵B · 训练计划 10 条会改数据库的命令的回执页:整页装配住能力目录 `src/workout/receipt.ts`
|
|
15
|
+
//(经本文件直引,不经 `src/workout/index.ts` 转出;与饮食 13 条同形)。
|
|
16
|
+
import { workoutReceiptDoc } from '../workout/receipt.js';
|
|
17
|
+
// #365 · 身体细节 7 条写词的回执页:整页装配住能力目录 `src/body/receipt.ts`
|
|
18
|
+
//(经 `src/body/index.ts` 转出;与体重 4 条同形,接成链上第五个装配口)。
|
|
19
|
+
import { bodyReceiptDoc } from '../body/index.js';
|
|
20
|
+
// #253 · 目标管理 5 条会改数据库的命令的回执页:整页装配住能力目录 `src/goal/receipt.ts`
|
|
21
|
+
//(经本文件直引,不经 `src/goal/index.ts` 转出——该件明文不转出域内件;与饮食 13 条同形,
|
|
22
|
+
// 接成链上第六个装配口)。
|
|
23
|
+
import { goalReceiptDoc } from '../goal/receipt.js';
|
|
18
24
|
import { isCalorieWriteKey } from './keys.js';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const v = params[name];
|
|
25
|
-
if (typeof v !== 'string' || v.length === 0)
|
|
26
|
-
fail(2, '缺参数 ' + name);
|
|
27
|
-
return v;
|
|
28
|
-
}
|
|
29
|
-
function optStr(params, name) {
|
|
30
|
-
const v = params[name];
|
|
31
|
-
if (v === undefined || v === null)
|
|
32
|
-
return undefined;
|
|
33
|
-
if (typeof v !== 'string')
|
|
34
|
-
fail(2, '参数 ' + name + ' 须为字符串');
|
|
35
|
-
return v;
|
|
36
|
-
}
|
|
37
|
-
function needNum(params, name) {
|
|
38
|
-
const v = params[name];
|
|
39
|
-
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
40
|
-
fail(2, '缺参数 ' + name + '(须为有限 number)');
|
|
41
|
-
return v;
|
|
42
|
-
}
|
|
43
|
-
function optNum(params, name) {
|
|
44
|
-
const v = params[name];
|
|
45
|
-
if (v === undefined || v === null)
|
|
46
|
-
return undefined;
|
|
47
|
-
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
48
|
-
fail(2, '参数 ' + name + ' 须为有限 number');
|
|
49
|
-
return v;
|
|
50
|
-
}
|
|
51
|
-
function optInt(params, name) {
|
|
52
|
-
const v = optNum(params, name);
|
|
53
|
-
if (v === undefined)
|
|
54
|
-
return undefined;
|
|
55
|
-
if (!Number.isInteger(v))
|
|
56
|
-
fail(2, '参数 ' + name + ' 须为整数');
|
|
57
|
-
return v;
|
|
58
|
-
}
|
|
59
|
-
function needId(params, name = 'id') {
|
|
60
|
-
const v = params[name];
|
|
61
|
-
if (typeof v !== 'number' || !Number.isInteger(v) || v <= 0)
|
|
62
|
-
fail(2, '缺参数 ' + name + '(正整数记录 id)');
|
|
63
|
-
return v;
|
|
64
|
-
}
|
|
65
|
-
function needArr(params, name) {
|
|
66
|
-
const v = params[name];
|
|
67
|
-
if (!Array.isArray(v) || v.length === 0)
|
|
68
|
-
fail(2, '缺参数 ' + name + '(非空数组)');
|
|
69
|
-
return v;
|
|
70
|
-
}
|
|
71
|
-
function assertISO(v, field) {
|
|
72
|
-
if (!/^\d{4}-\d{2}-\d{2}$/.test(v))
|
|
73
|
-
fail(2, field + ' 非法(须 YYYY-MM-DD):' + v);
|
|
74
|
-
}
|
|
75
|
-
function esc(s) {
|
|
76
|
-
return String(s ?? '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
77
|
-
}
|
|
78
|
-
/** #101 · 删除口径单一来源(prose 词条 + `items[].status` 状态串同源派生)。
|
|
79
|
-
* `recoverable` 恒 false:全仓 77 键 0 个 restore/undo/recover 入口,故不得出现「可恢复」承诺。 */
|
|
80
|
-
const SOFT_EXCLUDED_INNER = '软删除:行保留,已从查询与统计中排除;暂无恢复入口';
|
|
81
|
-
const SOFT_EXCLUDED = '(' + SOFT_EXCLUDED_INNER + ')';
|
|
82
|
-
const HARD_INNER = '硬删除,不可恢复';
|
|
83
|
-
const HARD_WORDING = '(' + HARD_INNER + ')';
|
|
84
|
-
/** 状态串与 prose 同源:kind 决定「软/硬」,两者一律带「不可恢复」。 */
|
|
85
|
-
function deleteStatus(kind, base = '已删除') {
|
|
86
|
-
return base + (kind === 'soft' ? '(软,不可恢复)' : '(硬,不可恢复)');
|
|
87
|
-
}
|
|
88
|
-
/* ------------------------------------------------ #97 · M5 回执契约(追加字段,正本 t97-m5-contract.md) */
|
|
89
|
-
/** 影响行数来源:SQLite `total_changes()` 在本键写库前后的增量。
|
|
90
|
-
* 真实库行数(INSERT/UPDATE/DELETE/软删标记一律计;`INSERT OR REPLACE` 命中已有行=1,
|
|
91
|
-
* `INSERT OR IGNORE` 命中已有行=0——实测 node:sqlite v24),非自报。 */
|
|
92
|
-
function totalChanges(db) {
|
|
93
|
-
const row = db.prepare('SELECT total_changes() AS n').get();
|
|
94
|
-
return row && typeof row.n === 'number' ? Number(row.n) : 0;
|
|
95
|
-
}
|
|
96
|
-
/** 写入字段摘要(CLI 参数名口径):create 键=该键写入字段全集(缺省值也算写入);
|
|
97
|
-
* update 键=本次实际变更字段;delete 键=空数组(无写入字段,旧版同样只印 id/日期/影响)。 */
|
|
98
|
-
const F = {
|
|
99
|
-
diet: ['foodName', 'calories', 'protein', 'carbs', 'fat', 'grams', 'note', 'date', 'time'],
|
|
100
|
-
water: ['ml', 'note', 'date', 'time'],
|
|
101
|
-
weight: ['kg', 'note', 'date', 'time'],
|
|
102
|
-
weightBatch: ['kg', 'date'],
|
|
103
|
-
exercise: ['type', 'calories', 'minutes', 'date', 'time', 'note', 'reps', 'category', 'difficulty', 'distance', 'heartRate', 'maxHeartRate', 'steps', 'setIndex', 'loadKg', 'backfill'],
|
|
104
|
-
photo: ['srcPaths', 'tag', 'note', 'date', 'time'],
|
|
105
|
-
product: ['productName', 'brand', 'calories', 'protein', 'fat', 'saturatedFat', 'carbohydrates', 'sugar', 'dietaryFiber', 'sodium', 'note'],
|
|
106
|
-
};
|
|
107
|
-
/** `calorie.goal.set` 本次**实际被 SET 的列** → CLI 参数名(正本 §3.4「update 键=本次实际变更字段」)。
|
|
108
|
-
* 与 `fetch/nutritionGoal.ts` 的两条 UPSERT 同源(#127 已改):传 `water` 走 6 列
|
|
109
|
-
* (含 `water_goal`),不传则 SQL 里**没有** `water_goal` 列——该列保持原值,
|
|
110
|
-
* **不属本次 SET 的字段**,故不得报 `water`。
|
|
111
|
-
* 记账列 `updated_at` 无 CLI 参数,按 §3.4 不计入摘要。
|
|
112
|
-
* #127:UPSERT 只覆盖传入列,`weight_goal`/`goal_deadline`/`goal_paused`/`start_weight`/
|
|
113
|
-
* `start_date`/`exercise_goal`/未传的 `water_goal` 逐列保持原值(不再整行替换)。 */
|
|
114
|
-
const goalSetWrittenFields = (hasWater) => ['calorie', 'protein', 'carbs', 'fat', ...(hasWater ? ['water'] : [])];
|
|
115
|
-
/** 库列名 → CLI 参数名(update 键按实际变更列回报写入字段摘要)。 */
|
|
116
|
-
const COL_CLI = {
|
|
117
|
-
food_name: 'foodName', grams: 'grams', calories: 'calories', protein: 'protein', carbs: 'carbs',
|
|
118
|
-
fat: 'fat', note: 'note', date: 'date', time: 'time',
|
|
119
|
-
exercise_type: 'type', calories_burned: 'calories', duration_minutes: 'minutes', category: 'category',
|
|
120
|
-
difficulty: 'difficulty', distance_km: 'distance', avg_heart_rate: 'heartRate',
|
|
121
|
-
max_heart_rate: 'maxHeartRate', steps: 'steps', reps: 'reps', load_kg: 'loadKg',
|
|
122
|
-
set_index: 'setIndex', is_backfill: 'backfill',
|
|
123
|
-
product_name: 'productName', brand: 'brand', saturated_fat: 'saturatedFat', carbohydrates: 'carbohydrates',
|
|
124
|
-
sugar: 'sugar', dietary_fiber: 'dietaryFiber', sodium: 'sodium',
|
|
125
|
-
};
|
|
126
|
-
const cliNames = (cols) => cols.map((c) => COL_CLI[c] ?? c);
|
|
127
|
-
/** 只取「实际提供」的参数名(写入字段摘要;`undefined` 不算写入)。 */
|
|
128
|
-
function provided(params, names) {
|
|
129
|
-
return names.filter((n) => params[n] !== undefined);
|
|
130
|
-
}
|
|
131
|
-
/** `input` 里实际有值的键(体脂/围度等动态字段表)。 */
|
|
132
|
-
function definedKeys(input) {
|
|
133
|
-
return Object.keys(input).filter((k) => input[k] !== undefined);
|
|
134
|
-
}
|
|
135
|
-
/** 围度库列名 → CLI 参数名(`MEASURE_CAMEL` 反向;写入字段摘要统一走 CLI 名口径)。 */
|
|
136
|
-
function measureCliNames(keys) {
|
|
137
|
-
return keys.map((k) => Object.keys(MEASURE_CAMEL).find((c) => MEASURE_CAMEL[c] === k) ?? k);
|
|
138
|
-
}
|
|
139
|
-
/** C6 #43 · 写收据 HTML 结构化分项:摘要 + 操作元 + items 逐条(id/日期/状态/原因/明细)。 */
|
|
140
|
-
function receiptHtml(scene, summary, op, recordId, items) {
|
|
141
|
-
const list = (items ?? []).length > 0
|
|
142
|
-
? '<ul>' + (items ?? []).map((it) => '<li>#' + esc(it.id ?? '') + (it.date ? ' ' + esc(it.date) : '') + ' ' + esc(it.status) + (it.reason ? '(' + esc(it.reason) + ')' : '') + (it.detail ? ' · ' + esc(it.detail) : '') + '</li>').join('') + '</ul>'
|
|
143
|
-
: '';
|
|
144
|
-
return '<section class="ilife-page" data-skill="calorie" data-slot="ilife:calorie:receipt"><h1>' + esc(scene) + '</h1>' +
|
|
145
|
-
'<div class="ilife-item"><b>' + esc(summary) + '</b><div>op=' + esc(op) + (recordId === null ? '' : ' · id=' + esc(recordId)) + '</div>' + list + '</div></section>';
|
|
146
|
-
}
|
|
147
|
-
function out(receipt) {
|
|
148
|
-
return {
|
|
149
|
-
data: { ok: true, message: receipt.summary, receipt },
|
|
150
|
-
html: receiptHtml(receipt.scene, receipt.summary, receipt.op, receipt.recordId, receipt.items),
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/* -------------------------------------- #179 · 场景 07 三条写入词的回执页(整页装配) */
|
|
154
|
-
/** 档案库列名 ↔ CLI 参数名(逐字段对照只用这 5 项,与 `PROFILE_UPDATABLE` 同集)。 */
|
|
155
|
-
const PROFILE_COLS = {
|
|
156
|
-
age: 'age', gender: 'gender', heightCm: 'height_cm', activityLevel: 'activity_level', note: 'note',
|
|
157
|
-
};
|
|
158
|
-
/** 档案某字段的展示值:空库(无改前值)与库内 NULL 一律写「—」,不编数据。 */
|
|
159
|
-
function profileValue(row, camel) {
|
|
160
|
-
const col = PROFILE_COLS[camel];
|
|
161
|
-
if (!row || col === undefined)
|
|
162
|
-
return '—';
|
|
163
|
-
const v = row[col];
|
|
164
|
-
return v === null || v === undefined ? '—' : String(v);
|
|
165
|
-
}
|
|
166
|
-
/** 改档案逐字段对照:字段名(CLI 参数名,与 `writtenFields` 同口径)+ 改前 → 改后。
|
|
167
|
-
* 形照 `profile/update.ts:diffRows` 的读法(`status`=字段名、`reason`=对照)。 */
|
|
168
|
-
function profileDiffItems(before, after, fields) {
|
|
169
|
-
return fields.map((f) => ({ status: f, reason: profileValue(before, f) + ' → ' + profileValue(after, f) }));
|
|
170
|
-
}
|
|
171
|
-
/** 页面「复制日志」第 4 段的命令原文:与 AI 实跑那条同形(含本次 `--params`),可照抄重跑。
|
|
172
|
-
* 参数值里若出现半角单引号,原文会在此处被截断——与 `profile/setup.ts` 的 prompt 写命令同一口径,
|
|
173
|
-
* 真要照抄重跑请自行把单引号转义(本仓命令原文一贯用单引号包 JSON)。 */
|
|
174
|
-
function commandLine(key, params) {
|
|
175
|
-
return 'calorie-cmd-read ' + key + " --params '" + JSON.stringify(params) + "'";
|
|
176
|
-
}
|
|
177
|
-
/** 三条写入词的回执页换成整页装配;**其余 32 条一律返回 null**,由 `dispatchWrite` 的
|
|
178
|
-
* `?? res.html` 原样放行——那些命令的产物与 `receiptHtml` 那条片段路径逐字节不变
|
|
179
|
-
* (分派只认这三个命令名,认不出就不进这条路,也不碰 `receiptHtml` 本身)。
|
|
180
|
-
* 必须在 `withM5` 之后调用:新页要印 `affectedRows`/`writtenFields`/`m5Line`。
|
|
181
|
-
* #239:把命令原文一并交给回执页,进「复制日志」第 4 段(key 与 params 都在本处作用域里)。 */
|
|
182
|
-
function profileReceiptDoc(key, params, receipt) {
|
|
183
|
-
switch (key) {
|
|
184
|
-
case 'calorie.profile.set':
|
|
185
|
-
case 'calorie.profile.activity':
|
|
186
|
-
return buildProfileSettingReceiptDoc(receipt, commandLine(key, params));
|
|
187
|
-
case 'calorie.profile.update':
|
|
188
|
-
return buildProfileUpdateReceiptDoc(receipt, commandLine(key, params));
|
|
189
|
-
default:
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
const R = (scene, op, summary, wakeWord, source, extra) => buildCrudReceipt({
|
|
194
|
-
scene, action: scene, op, recordId: null, summary, items: [], wakeWord, source,
|
|
195
|
-
...(extra ?? {}),
|
|
196
|
-
});
|
|
197
|
-
function photosDirOf(params) {
|
|
198
|
-
return resolvePhotosDir(optStr(params, 'photosDir') ?? null);
|
|
199
|
-
}
|
|
200
|
-
const SOURCE_ALIASES = { '家测皮褶钳': 'home_caliper', '医院测': 'hospital', '健身房测': 'gym', '健身房': 'gym', '医院': 'hospital', '皮褶钳': 'home_caliper' };
|
|
201
|
-
function normSource(v) {
|
|
202
|
-
const s = String(v ?? '').trim();
|
|
203
|
-
if (SOURCE_CHOICES.includes(s))
|
|
204
|
-
return s;
|
|
205
|
-
const hit = SOURCE_ALIASES[s];
|
|
206
|
-
if (hit)
|
|
207
|
-
return hit;
|
|
208
|
-
fail(2, '缺参数 source(' + SOURCE_CHOICES.join('/') + ' 或中文 ' + Object.keys(SOURCE_ALIASES).join('/') + ')');
|
|
209
|
-
throw new Error('unreachable');
|
|
210
|
-
}
|
|
211
|
-
function normSex(v) {
|
|
212
|
-
if (v === undefined || v === null)
|
|
213
|
-
return undefined;
|
|
214
|
-
const s = String(v).trim();
|
|
215
|
-
if (s === 'male' || s === 'female')
|
|
216
|
-
return s;
|
|
217
|
-
if (s === '男')
|
|
218
|
-
return 'male';
|
|
219
|
-
if (s === '女')
|
|
220
|
-
return 'female';
|
|
221
|
-
fail(2, '参数 sex 非法(male/female 或 男/女):' + s);
|
|
222
|
-
throw new Error('unreachable');
|
|
223
|
-
}
|
|
224
|
-
const MEASURE_CAMEL = {
|
|
225
|
-
chestCm: 'chest_cm', waistCm: 'waist_cm', abdomenCm: 'abdomen_cm', hipCm: 'hip_cm', shoulderCm: 'shoulder_cm',
|
|
226
|
-
leftThighCm: 'left_thigh_cm', rightThighCm: 'right_thigh_cm', leftCalfCm: 'left_calf_cm', rightCalfCm: 'right_calf_cm',
|
|
227
|
-
leftArmCm: 'left_arm_cm', rightArmCm: 'right_arm_cm', leftForearmCm: 'left_forearm_cm', rightForearmCm: 'right_forearm_cm',
|
|
228
|
-
};
|
|
229
|
-
const EX_CAMEL = {
|
|
230
|
-
type: 'exercise_type', exerciseType: 'exercise_type', calories: 'calories_burned', caloriesBurned: 'calories_burned',
|
|
231
|
-
minutes: 'duration_minutes', durationMinutes: 'duration_minutes', note: 'note', category: 'category', difficulty: 'difficulty',
|
|
232
|
-
distance: 'distance_km', distanceKm: 'distance_km', heartRate: 'avg_heart_rate', avgHeartRate: 'avg_heart_rate',
|
|
233
|
-
maxHeartRate: 'max_heart_rate', steps: 'steps', reps: 'reps', loadKg: 'load_kg', setIndex: 'set_index',
|
|
234
|
-
date: 'date', time: 'time', backfill: 'is_backfill', isBackfill: 'is_backfill',
|
|
235
|
-
};
|
|
236
|
-
function oneExercise(item, i) {
|
|
237
|
-
const g = (k) => item[k];
|
|
238
|
-
const type = g('type') ?? g('exerciseType');
|
|
239
|
-
if (typeof type !== 'string' || !type.trim())
|
|
240
|
-
fail(2, '运动 type 必填' + i);
|
|
241
|
-
const cal = g('calories') ?? g('caloriesBurned');
|
|
242
|
-
if (typeof cal !== 'number' || !Number.isFinite(cal) || cal < 0)
|
|
243
|
-
fail(2, '运动 calories 必填(≥0 number)' + i);
|
|
244
|
-
const date = g('date') ?? todayISO();
|
|
245
|
-
assertISO(date, 'date');
|
|
246
|
-
const numOrNull = (k) => {
|
|
247
|
-
const v = g(k);
|
|
248
|
-
if (v === undefined || v === null)
|
|
249
|
-
return undefined;
|
|
250
|
-
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
251
|
-
fail(2, '运动参数 ' + k + ' 须为 number' + i);
|
|
252
|
-
return v;
|
|
253
|
-
};
|
|
254
|
-
const strOrUndef = (k) => {
|
|
255
|
-
const v = g(k);
|
|
256
|
-
if (v === undefined || v === null)
|
|
257
|
-
return undefined;
|
|
258
|
-
if (typeof v !== 'string')
|
|
259
|
-
fail(2, '运动参数 ' + k + ' 须为字符串' + i);
|
|
260
|
-
return v;
|
|
261
|
-
};
|
|
262
|
-
return {
|
|
263
|
-
date, exerciseType: type.trim(), caloriesBurned: cal,
|
|
264
|
-
minutes: numOrNull('minutes') ?? null, timeStr: strOrUndef('time'), note: strOrUndef('note'),
|
|
265
|
-
reps: numOrNull('reps') ?? null, category: strOrUndef('category') ?? null,
|
|
266
|
-
difficulty: strOrUndef('difficulty') ?? null, distance: numOrNull('distance') ?? numOrNull('distanceKm') ?? null,
|
|
267
|
-
heartRate: numOrNull('heartRate') ?? numOrNull('avgHeartRate') ?? null,
|
|
268
|
-
maxHeartRate: numOrNull('maxHeartRate') ?? null, steps: numOrNull('steps') ?? null,
|
|
269
|
-
setIndex: numOrNull('setIndex') ?? null, loadKg: numOrNull('loadKg') ?? null,
|
|
270
|
-
isBackfill: (g('backfill') ?? g('isBackfill')) === true,
|
|
271
|
-
};
|
|
272
|
-
}
|
|
25
|
+
// #294 · 命令索引:命中即走能力目录里的实现,未命中的老键落下面的 dispatchInner switch。
|
|
26
|
+
import { REGISTRY } from './registry.js';
|
|
27
|
+
// #294 · 参数读取与回执底座上移共用位:能力目录里的命令与分派层用同一套口径(唯一定义地)。
|
|
28
|
+
import { fail } from '../shared/params.js';
|
|
29
|
+
import { totalChanges } from '../shared/writeParts.js';
|
|
273
30
|
/** 写分发(唯一出口 cmd_read 内调用;未知键上游已拦,此处再拦一道)。
|
|
274
31
|
* #97 · M5:`affectedRows` 在此统一注入——写库前后各取一次 SQLite `total_changes()`,
|
|
275
32
|
* 增量即「影响 N 行」(35 键单一来源,逐键不各自自报)。 */
|
|
@@ -278,9 +35,18 @@ export function dispatchWrite(key, params, db) {
|
|
|
278
35
|
fail(3, '未知 calorie 写键:' + key);
|
|
279
36
|
const before = totalChanges(db);
|
|
280
37
|
try {
|
|
281
|
-
|
|
38
|
+
// #294 · 注册表先行:命中即走能力目录那道门(新增能力/新增命令都不必碰这个文件)。
|
|
39
|
+
// #320 · 未搬迁清单归零 ⇒ 老写键也全在注册表里,`dispatchInner` 只剩「键不存在」这一条兜底。
|
|
40
|
+
const spec = REGISTRY[key];
|
|
41
|
+
const res = spec && spec.kind === 'write' ? spec.run(params, db) : dispatchInner(key, params, db);
|
|
282
42
|
const receipt = withM5(res.data.receipt, { affectedRows: totalChanges(db) - before });
|
|
283
|
-
|
|
43
|
+
// #269 · 饮食 13 条切整页装配(`assembleDocPage`,与档案 3 条同路);其余键原样放行。
|
|
44
|
+
// #276 插入点:如需新增命令的整页分派,在本行下方按 `?? 下一个Doc(...)` 续接(本票留空)。
|
|
45
|
+
// #337 · 体重 4 条切整页装配(与档案 3 条、饮食 13 条同路;具名键集在 `src/weight/receipt.ts`)。
|
|
46
|
+
// T351 视觉修复·实施兵B · 训练计划 10 条切整页装配(与饮食 13 条同路;具名键集在 `src/workout/receipt.ts`)。
|
|
47
|
+
// #365 · 身体细节 7 条切整页装配(链上第五个装配口;具名键集在 `src/body/receipt.ts`)。
|
|
48
|
+
// #253 · 目标管理 5 条切整页装配(链上第六个装配口;具名键集在 `src/goal/receipt.ts`)。
|
|
49
|
+
return { data: { ...res.data, receipt }, html: profileReceiptDoc(key, params, receipt, db) ?? dietReceiptDoc(key, params, receipt, db) ?? weightReceiptDoc(key, params, receipt, db) ?? workoutReceiptDoc(key, params, receipt, db) ?? bodyReceiptDoc(key, params, receipt, db) ?? goalReceiptDoc(key, params, receipt, db) ?? res.html };
|
|
284
50
|
}
|
|
285
51
|
catch (e) {
|
|
286
52
|
if (e instanceof ValidationError)
|
|
@@ -290,680 +56,6 @@ export function dispatchWrite(key, params, db) {
|
|
|
290
56
|
}
|
|
291
57
|
function dispatchInner(key, params, db) {
|
|
292
58
|
switch (key) {
|
|
293
|
-
case 'calorie.diet.add': {
|
|
294
|
-
const foodName = (optStr(params, 'foodName') ?? optStr(params, 'food_name') ?? '');
|
|
295
|
-
if (!foodName.trim())
|
|
296
|
-
fail(2, '缺参数 foodName');
|
|
297
|
-
const calories = needNum(params, 'calories');
|
|
298
|
-
const protein = needNum(params, 'protein');
|
|
299
|
-
for (const [k, v] of [['calories', calories], ['protein', protein]]) {
|
|
300
|
-
if (v < 0)
|
|
301
|
-
fail(2, k + ' 不能为负');
|
|
302
|
-
}
|
|
303
|
-
for (const k of ['carbs', 'fat']) {
|
|
304
|
-
const v = optNum(params, k);
|
|
305
|
-
if (v !== undefined && v < 0)
|
|
306
|
-
fail(2, k + ' 不能为负');
|
|
307
|
-
}
|
|
308
|
-
const grams0 = optNum(params, 'grams');
|
|
309
|
-
if (grams0 !== undefined && grams0 <= 0)
|
|
310
|
-
fail(2, 'grams 必须为正');
|
|
311
|
-
const date = optStr(params, 'date');
|
|
312
|
-
if (date)
|
|
313
|
-
assertISO(date, 'date');
|
|
314
|
-
const meal = optStr(params, 'meal') ?? optStr(params, 'mealOverride');
|
|
315
|
-
if (meal !== undefined && !MEALS.includes(meal))
|
|
316
|
-
fail(2, '--meal 须为 ' + MEALS.join('、'));
|
|
317
|
-
const r = addMeal(db, {
|
|
318
|
-
foodName: foodName.trim(), calories, protein,
|
|
319
|
-
carbs: optNum(params, 'carbs') ?? 0, fat: optNum(params, 'fat') ?? 0,
|
|
320
|
-
grams: optNum(params, 'grams') ?? 100, note: optStr(params, 'note'),
|
|
321
|
-
date, time: optStr(params, 'time'), mealOverride: meal,
|
|
322
|
-
});
|
|
323
|
-
if (r.duplicate) {
|
|
324
|
-
return out(R('记一餐', 'create', String(r.message ?? '重复记录已跳过'), '记一餐', 'food_log (写库回执)', {
|
|
325
|
-
recordId: r.dupId ?? null, noChange: true,
|
|
326
|
-
ids: r.dupId ? [r.dupId] : [], idSource: r.dupId ? 'record' : 'none', writtenFields: [],
|
|
327
|
-
}));
|
|
328
|
-
}
|
|
329
|
-
const remain = r.remainingCal === null || r.remainingCal === undefined ? '' : ' · 今日剩 ' + r.remainingCal + ' 卡';
|
|
330
|
-
return out(R('记一餐', 'create', '已记一餐:' + r.food_name + ' ' + r.date + ' ' + r.time + '(' + r.meal + ')' + remain, '记一餐', 'food_log (写库回执)', {
|
|
331
|
-
recordId: r.id, ids: r.id === null ? [] : [r.id], writtenFields: [...F.diet],
|
|
332
|
-
items: [{ id: r.id ?? undefined, date: r.date, status: '成功', reason: '', detail: r.food_name }],
|
|
333
|
-
}));
|
|
334
|
-
}
|
|
335
|
-
case 'calorie.diet.update': {
|
|
336
|
-
const id = needId(params);
|
|
337
|
-
const fields = {};
|
|
338
|
-
const name = optStr(params, 'foodName') ?? optStr(params, 'food_name');
|
|
339
|
-
if (name !== undefined)
|
|
340
|
-
fields['food_name'] = name;
|
|
341
|
-
for (const k of ['grams', 'calories', 'protein', 'carbs', 'fat']) {
|
|
342
|
-
const v = optNum(params, k);
|
|
343
|
-
if (v !== undefined)
|
|
344
|
-
fields[k] = v;
|
|
345
|
-
}
|
|
346
|
-
for (const k of ['note', 'date', 'time']) {
|
|
347
|
-
const v = optStr(params, k);
|
|
348
|
-
if (v !== undefined)
|
|
349
|
-
fields[k] = v;
|
|
350
|
-
}
|
|
351
|
-
if (Object.keys(fields).length === 0)
|
|
352
|
-
fail(2, '至少传 1 个待改字段');
|
|
353
|
-
if (typeof fields['date'] === 'string')
|
|
354
|
-
assertISO(fields['date'], 'date');
|
|
355
|
-
const r = updateMeal(db, id, fields);
|
|
356
|
-
return out(R('改饮食记录', 'update', '已更新饮食 #' + id + '(' + (r.changed.length ? r.changed.join('、') : '无实际变化') + ')', '改饮食记录', 'food_log (写库回执)', {
|
|
357
|
-
recordId: id, ids: [id], writtenFields: cliNames(Object.keys(fields)), noChange: r.changed.length === 0,
|
|
358
|
-
items: [{ id, status: '已更新', reason: '', detail: r.changed.join(',') || '无变化' }],
|
|
359
|
-
}));
|
|
360
|
-
}
|
|
361
|
-
case 'calorie.diet.remove': {
|
|
362
|
-
const id = needId(params);
|
|
363
|
-
const r = deleteMeal(db, id);
|
|
364
|
-
return out(R('删饮食记录', 'delete', '已删除饮食 #' + id + '(' + r.food_name + ' ' + r.calories + ' 卡 · ' + HARD_INNER + ')', '删饮食记录', 'food_log (写库回执)', {
|
|
365
|
-
recordId: id, ids: [id], writtenFields: [], items: [{ id, status: deleteStatus('hard'), reason: '', detail: r.food_name }],
|
|
366
|
-
}));
|
|
367
|
-
}
|
|
368
|
-
case 'calorie.diet.batch': {
|
|
369
|
-
const items = needArr(params, 'items');
|
|
370
|
-
if (items.length > 200)
|
|
371
|
-
fail(2, 'items 至多 200 条');
|
|
372
|
-
const r = addMealsBatch(db, items.map((e) => {
|
|
373
|
-
const o = (e ?? {});
|
|
374
|
-
const food = o['foodName'] ?? o['food_name'];
|
|
375
|
-
return {
|
|
376
|
-
date: o['date'] === undefined ? undefined : String(o['date']),
|
|
377
|
-
time: o['time'] === undefined ? undefined : String(o['time']),
|
|
378
|
-
food_name: food === undefined ? undefined : String(food),
|
|
379
|
-
grams: o['grams'], calories: o['calories'],
|
|
380
|
-
protein: o['protein'], carbs: o['carbs'],
|
|
381
|
-
fat: o['fat'], note: o['note'] === undefined ? undefined : String(o['note']),
|
|
382
|
-
};
|
|
383
|
-
}));
|
|
384
|
-
return out(R('批量补记饮食', 'create', '批量记饮食:新增 ' + r.added + ',跳过 ' + r.skipped + ',失败 ' + r.failed, '批量补记饮食', 'food_log (写库回执)', {
|
|
385
|
-
noChange: r.added === 0, ids: [], idSource: 'condition',
|
|
386
|
-
writtenFields: r.added > 0 ? [...F.diet] : [],
|
|
387
|
-
items: r.failures.slice(0, 20).map(([idx, reason]) => ({ status: '失败', reason, detail: '第' + idx + '条' })),
|
|
388
|
-
}));
|
|
389
|
-
}
|
|
390
|
-
case 'calorie.diet.copy': {
|
|
391
|
-
const today = todayISO();
|
|
392
|
-
const from = optStr(params, 'from') ?? optStr(params, 'fromDate') ?? shiftISODate(today, -1);
|
|
393
|
-
const to = optStr(params, 'to') ?? optStr(params, 'toDate') ?? today;
|
|
394
|
-
assertISO(from, 'from');
|
|
395
|
-
assertISO(to, 'to');
|
|
396
|
-
const r = copyMeals(db, from, to);
|
|
397
|
-
if (r.copied + r.skipped === 0)
|
|
398
|
-
throw new CalorieRenderError('missing-data', '来源无饮食记录(' + from + ')');
|
|
399
|
-
return out(R('复制昨日饮食', 'create', '已复制饮食 ' + from + '→' + to + ':复制 ' + r.copied + ',跳过 ' + r.skipped, '复制昨日饮食', 'food_log (写库回执)', {
|
|
400
|
-
noChange: r.copied === 0, ids: [], idSource: 'condition',
|
|
401
|
-
writtenFields: r.copied > 0 ? [...F.diet] : [],
|
|
402
|
-
}));
|
|
403
|
-
}
|
|
404
|
-
case 'calorie.diet.update-by-date': {
|
|
405
|
-
const date = needStr(params, 'date');
|
|
406
|
-
assertISO(date, 'date');
|
|
407
|
-
const fields = {};
|
|
408
|
-
const name = optStr(params, 'foodName') ?? optStr(params, 'food_name');
|
|
409
|
-
if (name !== undefined)
|
|
410
|
-
fields['food_name'] = name;
|
|
411
|
-
for (const k of ['grams', 'calories', 'protein', 'carbs', 'fat', 'note', 'time']) {
|
|
412
|
-
const v = k === 'note' || k === 'time' ? optStr(params, k) : optNum(params, k);
|
|
413
|
-
if (v !== undefined)
|
|
414
|
-
fields[k] = v;
|
|
415
|
-
}
|
|
416
|
-
if (Object.keys(fields).length === 0)
|
|
417
|
-
fail(2, '至少传 1 个待改字段');
|
|
418
|
-
const r = updateMealsByDate(db, date, fields);
|
|
419
|
-
if (r.matched === 0)
|
|
420
|
-
throw new CalorieRenderError('missing-data', '无饮食记录(' + date + ')');
|
|
421
|
-
return out(R('改某日饮食', 'update', '已更新 ' + date + ' 饮食 ' + r.updated + ' 条(' + r.changedFields.join('、') + ')', '改某日饮食', 'food_log (写库回执)', {
|
|
422
|
-
ids: [], idSource: 'condition', writtenFields: cliNames(r.changedFields),
|
|
423
|
-
}));
|
|
424
|
-
}
|
|
425
|
-
case 'calorie.diet.remove-by-date': {
|
|
426
|
-
const date = needStr(params, 'date');
|
|
427
|
-
assertISO(date, 'date');
|
|
428
|
-
const r = deleteMealsByDate(db, date);
|
|
429
|
-
if (r.deleted === 0)
|
|
430
|
-
throw new CalorieRenderError('missing-data', '无饮食记录(' + date + ')');
|
|
431
|
-
return out(R('删某日饮食', 'delete', '已删除 ' + date + ' 饮食 ' + r.deleted + ' 条' + HARD_WORDING, '删某日饮食', 'food_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: [] }));
|
|
432
|
-
}
|
|
433
|
-
case 'calorie.diet.remove-by-range': {
|
|
434
|
-
const start = needStr(params, 'start');
|
|
435
|
-
const end = needStr(params, 'end');
|
|
436
|
-
assertISO(start, 'start');
|
|
437
|
-
assertISO(end, 'end');
|
|
438
|
-
if (start > end)
|
|
439
|
-
fail(2, 'start 不得晚于 end');
|
|
440
|
-
const r = deleteMealsByRange(db, start, end);
|
|
441
|
-
if (r.deleted === 0)
|
|
442
|
-
throw new CalorieRenderError('missing-data', '无饮食记录(' + start + '~' + end + ')');
|
|
443
|
-
return out(R('批量删饮食', 'delete', '已删除 ' + start + '~' + end + ' 饮食 ' + r.deleted + ' 条' + HARD_WORDING, '批量删饮食', 'food_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: [] }));
|
|
444
|
-
}
|
|
445
|
-
case 'calorie.diet.remove-by-type': {
|
|
446
|
-
const date = needStr(params, 'date');
|
|
447
|
-
assertISO(date, 'date');
|
|
448
|
-
const mealType = needStr(params, 'mealType');
|
|
449
|
-
if (!Object.prototype.hasOwnProperty.call(MEAL_WINDOWS, mealType))
|
|
450
|
-
fail(2, 'mealType 须为 ' + Object.keys(MEAL_WINDOWS).join('/') + ':' + mealType);
|
|
451
|
-
const r = deleteMealsByType(db, date, mealType);
|
|
452
|
-
if (r.deleted === 0)
|
|
453
|
-
throw new CalorieRenderError('missing-data', date + ' 无' + mealType + '记录');
|
|
454
|
-
return out(R('删一餐', 'delete', '已删除 ' + date + ' ' + mealType + ' ' + r.deleted + ' 条' + HARD_WORDING, '删一餐', 'food_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: [] }));
|
|
455
|
-
}
|
|
456
|
-
case 'calorie.water.log': {
|
|
457
|
-
const ml = needNum(params, 'ml');
|
|
458
|
-
if (!(ml > 0) || ml > 10000)
|
|
459
|
-
fail(2, 'ml 须为 0..10000 毫升');
|
|
460
|
-
const date = optStr(params, 'date');
|
|
461
|
-
if (date)
|
|
462
|
-
assertISO(date, 'date');
|
|
463
|
-
const r = addMeal(db, {
|
|
464
|
-
foodName: WATER_NAME, calories: 0, protein: 0, grams: ml,
|
|
465
|
-
note: optStr(params, 'note'), date, time: optStr(params, 'time'),
|
|
466
|
-
});
|
|
467
|
-
if (r.duplicate) {
|
|
468
|
-
// 与 `calorie.diet.add` 同口径(§3.3 `record`):重复跳过的原 id 由 fetch 回传(`fetch/diet.ts:96`),
|
|
469
|
-
// 拿得到就报 `record`+`ids=[dupId]`,拿不到才退 `none`(返修 R-3/蓝队 D-3 统一)。
|
|
470
|
-
return out(R('记喝水', 'create', String(r.message ?? '重复记录已跳过'), '记喝水', 'food_log (写库回执)', {
|
|
471
|
-
recordId: r.dupId ?? null, noChange: true,
|
|
472
|
-
ids: r.dupId ? [r.dupId] : [], idSource: r.dupId ? 'record' : 'none', writtenFields: [],
|
|
473
|
-
}));
|
|
474
|
-
}
|
|
475
|
-
const day = date ?? todayISO();
|
|
476
|
-
const sum = getDailySummary(db, day);
|
|
477
|
-
return out(R('记喝水', 'create', '已记喝水 ' + ml + ' ml(' + day + ' 累计 ' + sum.waterMl + ' ml)', '记喝水', 'food_log (写库回执)', {
|
|
478
|
-
recordId: r.id, ids: r.id === null ? [] : [r.id], writtenFields: [...F.water],
|
|
479
|
-
items: [{ id: r.id ?? undefined, date: r.date, status: '成功', reason: '', detail: ml + 'ml' }],
|
|
480
|
-
}));
|
|
481
|
-
}
|
|
482
|
-
case 'calorie.weight.log': {
|
|
483
|
-
const kg = needNum(params, 'kg');
|
|
484
|
-
if (!(kg > 0) || kg > 500)
|
|
485
|
-
fail(2, 'kg 须为 0..500');
|
|
486
|
-
const date = optStr(params, 'date');
|
|
487
|
-
if (date)
|
|
488
|
-
assertISO(date, 'date');
|
|
489
|
-
const r = logWeight(db, kg, optStr(params, 'note') ?? '', date, optStr(params, 'time'));
|
|
490
|
-
const bmiText = r.bmi === null ? 'BMI 待补身高(补档案:calorie-cmd-read calorie.profile.set)' : 'BMI ' + r.bmi;
|
|
491
|
-
return out(R('记体重', 'create', '已记体重 ' + r.kg + ' kg(' + bmiText + ' · ' + r.date + ' ' + r.time + ')', '记体重', 'weight_log (写库回执)', {
|
|
492
|
-
recordId: r.id, ids: [r.id], writtenFields: [...F.weight],
|
|
493
|
-
items: [{ id: r.id, date: r.date, status: '成功', reason: '', detail: r.kg + 'kg' }],
|
|
494
|
-
}));
|
|
495
|
-
}
|
|
496
|
-
case 'calorie.weight.update': {
|
|
497
|
-
const id = optNum(params, 'id');
|
|
498
|
-
const date = optStr(params, 'date');
|
|
499
|
-
const kg = optNum(params, 'kg');
|
|
500
|
-
const note = optStr(params, 'note');
|
|
501
|
-
if (kg !== undefined && (!(kg > 0) || kg > 500))
|
|
502
|
-
fail(2, 'kg 须为 0..500');
|
|
503
|
-
if (id !== undefined) {
|
|
504
|
-
if (!Number.isInteger(id) || id <= 0)
|
|
505
|
-
fail(2, 'id 须为正整数');
|
|
506
|
-
const r = updateWeight(db, id, kg, note);
|
|
507
|
-
const bmiTextU = r.bmi === null ? 'BMI 待补身高(补档案:calorie-cmd-read calorie.profile.set)' : 'BMI ' + r.bmi;
|
|
508
|
-
return out(R('改体重记录', 'update', '已更新体重 #' + id + ':' + r.oldWeight + '→' + r.newWeight + ' kg(' + bmiTextU + ')', '改体重记录', 'weight_log (写库回执)', {
|
|
509
|
-
recordId: id, ids: [id], writtenFields: [...(kg !== undefined ? ['kg'] : []), ...(note !== undefined ? ['note'] : [])],
|
|
510
|
-
items: [{ id, status: '已更新', reason: '' }],
|
|
511
|
-
}));
|
|
512
|
-
}
|
|
513
|
-
if (date !== undefined) {
|
|
514
|
-
assertISO(date, 'date');
|
|
515
|
-
const r = updateWeightByDate(db, date, kg, note);
|
|
516
|
-
return out(R('改某日体重', 'update', '已更新 ' + date + ' 体重 ' + r.hitCount + ' 条', '改某日体重', 'weight_log (写库回执)', {
|
|
517
|
-
ids: [], idSource: 'condition', writtenFields: [...(kg !== undefined ? ['kg'] : []), ...(note !== undefined ? ['note'] : [])],
|
|
518
|
-
}));
|
|
519
|
-
}
|
|
520
|
-
fail(2, '缺参数 id 或 date(二选一)');
|
|
521
|
-
throw new Error('unreachable');
|
|
522
|
-
}
|
|
523
|
-
case 'calorie.weight.remove': {
|
|
524
|
-
const id = optNum(params, 'id');
|
|
525
|
-
const date = optStr(params, 'date');
|
|
526
|
-
const start = optStr(params, 'start');
|
|
527
|
-
const end = optStr(params, 'end');
|
|
528
|
-
if (id !== undefined) {
|
|
529
|
-
if (!Number.isInteger(id) || id <= 0)
|
|
530
|
-
fail(2, 'id 须为正整数');
|
|
531
|
-
const r = deleteWeight(db, id);
|
|
532
|
-
return out(R('删体重记录', 'delete', '已删除体重 #' + id + '(' + r.date + ' ' + r.weight_kg + ' kg · ' + HARD_INNER + ')', '删体重记录', 'weight_log (写库回执)', {
|
|
533
|
-
recordId: id, ids: [id], writtenFields: [], items: [{ id, status: deleteStatus('hard'), reason: '' }],
|
|
534
|
-
}));
|
|
535
|
-
}
|
|
536
|
-
if (date !== undefined) {
|
|
537
|
-
assertISO(date, 'date');
|
|
538
|
-
const r = deleteWeightByDate(db, date);
|
|
539
|
-
return out(R('删某日体重', 'delete', '已删除 ' + date + ' 体重 ' + r.deletedCount + ' 条' + HARD_WORDING, '删某日体重', 'weight_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: [] }));
|
|
540
|
-
}
|
|
541
|
-
if (start !== undefined || end !== undefined) {
|
|
542
|
-
if (start === undefined || end === undefined)
|
|
543
|
-
fail(2, '按范围删须同时传 start/end');
|
|
544
|
-
assertISO(start, 'start');
|
|
545
|
-
assertISO(end, 'end');
|
|
546
|
-
if (start > end)
|
|
547
|
-
fail(2, 'start 不得晚于 end');
|
|
548
|
-
const r = deleteWeightRange(db, start, end);
|
|
549
|
-
return out(R('批量删体重', 'delete', '已删除 ' + start + '~' + end + ' 体重 ' + r.deletedCount + ' 条' + HARD_WORDING, '批量删体重', 'weight_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: [] }));
|
|
550
|
-
}
|
|
551
|
-
fail(2, '缺参数 id/date/start+end(三选一)');
|
|
552
|
-
throw new Error('unreachable');
|
|
553
|
-
}
|
|
554
|
-
case 'calorie.weight.batch': {
|
|
555
|
-
const items = needArr(params, 'items');
|
|
556
|
-
if (items.length > 365)
|
|
557
|
-
fail(2, 'items 至多 365 条');
|
|
558
|
-
const r = batchLogWeight(db, items.map((e) => {
|
|
559
|
-
const o = (e ?? {});
|
|
560
|
-
return { date: o['date'] === undefined ? undefined : String(o['date']), kg: o['kg'] };
|
|
561
|
-
}));
|
|
562
|
-
return out(R('批量补录体重', 'create', '批量记体重:写入 ' + r.wrote + ',跳过 ' + r.skipped + ',失败 ' + r.failed, '批量补录体重', 'weight_log (写库回执)', {
|
|
563
|
-
noChange: r.wrote === 0, ids: [], idSource: 'condition',
|
|
564
|
-
writtenFields: r.wrote > 0 ? [...F.weightBatch] : [],
|
|
565
|
-
items: r.items.filter((x) => x.status === '失败').slice(0, 20).map((x) => ({ status: '失败', reason: x.reason, detail: String(x.date) })),
|
|
566
|
-
}));
|
|
567
|
-
}
|
|
568
|
-
case 'calorie.exercise.add': {
|
|
569
|
-
if (params['copyFrom'] !== undefined) {
|
|
570
|
-
if (params['copyFrom'] !== 'yesterday')
|
|
571
|
-
fail(2, 'copyFrom 只支持 yesterday');
|
|
572
|
-
const target = optStr(params, 'date') ?? optStr(params, 'targetDate') ?? todayISO();
|
|
573
|
-
assertISO(target, 'date');
|
|
574
|
-
const r = copyYesterday(db, target);
|
|
575
|
-
if (r.copied + r.skipped === 0)
|
|
576
|
-
throw new CalorieRenderError('missing-data', '昨日无运动记录可复制');
|
|
577
|
-
return out(R('复制昨日运动', 'create', '已复制昨日运动→' + target + ':复制 ' + r.copied + ',跳过 ' + r.skipped, '复制昨日运动', 'exercise_log (写库回执)', {
|
|
578
|
-
noChange: r.copied === 0, ids: [], idSource: 'condition',
|
|
579
|
-
writtenFields: r.copied > 0 ? [...F.exercise] : [],
|
|
580
|
-
}));
|
|
581
|
-
}
|
|
582
|
-
if (params['items'] !== undefined) {
|
|
583
|
-
const items = needArr(params, 'items');
|
|
584
|
-
if (items.length > 200)
|
|
585
|
-
fail(2, 'items 至多 200 条');
|
|
586
|
-
const r = batchAdd(db, items.map((e, i) => oneExercise((e ?? {}), '(第' + i + '条)')));
|
|
587
|
-
return out(R('记运动', 'create', '批量记运动:新增 ' + r.added + ' 条', '批量补记运动', 'exercise_log (写库回执)', {
|
|
588
|
-
recordId: r.ids[0] ?? null, ids: r.ids, idSource: r.ids.length > 0 ? 'record' : 'condition',
|
|
589
|
-
writtenFields: r.added > 0 ? [...F.exercise] : [],
|
|
590
|
-
}));
|
|
591
|
-
}
|
|
592
|
-
const input = oneExercise(params, '');
|
|
593
|
-
const r = addRecord(db, input);
|
|
594
|
-
return out(R('记运动', 'create', '已记运动:' + input.exerciseType + ' ' + input.caloriesBurned + ' 卡' + (input.minutes ? ' · ' + input.minutes + ' 分钟' : '') + '(' + input.date + ')', '记运动', 'exercise_log (写库回执)', {
|
|
595
|
-
recordId: r.id, ids: [r.id], writtenFields: [...F.exercise],
|
|
596
|
-
items: [{ id: r.id, date: input.date, status: '成功', reason: '', detail: input.exerciseType }],
|
|
597
|
-
}));
|
|
598
|
-
}
|
|
599
|
-
case 'calorie.exercise.update': {
|
|
600
|
-
const id = optNum(params, 'id');
|
|
601
|
-
const date = optStr(params, 'date');
|
|
602
|
-
const fields = {};
|
|
603
|
-
for (const [camel, col] of Object.entries(EX_CAMEL)) {
|
|
604
|
-
if (camel === 'type' || camel === 'exerciseType' || camel === 'calories' || camel === 'caloriesBurned')
|
|
605
|
-
continue;
|
|
606
|
-
if (params[camel] !== undefined)
|
|
607
|
-
fields[col] = params[camel];
|
|
608
|
-
}
|
|
609
|
-
const t = optStr(params, 'type') ?? optStr(params, 'exerciseType');
|
|
610
|
-
if (t !== undefined) {
|
|
611
|
-
if (!t.trim())
|
|
612
|
-
fail(2, 'type 不得为空');
|
|
613
|
-
fields['exercise_type'] = t.trim();
|
|
614
|
-
}
|
|
615
|
-
const cal = optNum(params, 'calories') ?? optNum(params, 'caloriesBurned');
|
|
616
|
-
if (cal !== undefined) {
|
|
617
|
-
if (cal < 0)
|
|
618
|
-
fail(2, 'calories 不得为负');
|
|
619
|
-
fields['calories_burned'] = cal;
|
|
620
|
-
}
|
|
621
|
-
for (const k of Object.keys(params)) {
|
|
622
|
-
if (!(k in EX_CAMEL) && k !== 'id' && k !== 'key')
|
|
623
|
-
fail(2, '不支持字段: ' + k);
|
|
624
|
-
}
|
|
625
|
-
if (Object.keys(fields).length === 0)
|
|
626
|
-
fail(2, '至少传 1 个待改字段');
|
|
627
|
-
if (typeof fields['date'] === 'string')
|
|
628
|
-
assertISO(fields['date'], 'date');
|
|
629
|
-
if (id !== undefined) {
|
|
630
|
-
if (!Number.isInteger(id) || id <= 0)
|
|
631
|
-
fail(2, 'id 须为正整数');
|
|
632
|
-
updateRecord(db, id, fields);
|
|
633
|
-
return out(R('改运动记录', 'update', '已更新运动 #' + id + '(' + Object.keys(fields).join('、') + ')', '改运动记录', 'exercise_log (写库回执)', {
|
|
634
|
-
recordId: id, ids: [id], writtenFields: cliNames(Object.keys(fields)),
|
|
635
|
-
items: [{ id, status: '已更新', reason: '' }],
|
|
636
|
-
}));
|
|
637
|
-
}
|
|
638
|
-
if (date !== undefined) {
|
|
639
|
-
assertISO(date, 'date');
|
|
640
|
-
const r = updateDay(db, date, fields);
|
|
641
|
-
if (r.matched === 0)
|
|
642
|
-
throw new CalorieRenderError('missing-data', '无运动记录(' + date + ')');
|
|
643
|
-
return out(R('改某日运动', 'update', '已更新 ' + date + ' 运动 ' + r.matched + ' 条', '改某日运动', 'exercise_log (写库回执)', {
|
|
644
|
-
ids: [], idSource: 'condition', writtenFields: cliNames(Object.keys(fields)),
|
|
645
|
-
}));
|
|
646
|
-
}
|
|
647
|
-
fail(2, '缺参数 id 或 date(二选一)');
|
|
648
|
-
throw new Error('unreachable');
|
|
649
|
-
}
|
|
650
|
-
case 'calorie.exercise.remove': {
|
|
651
|
-
const id = optNum(params, 'id');
|
|
652
|
-
const date = optStr(params, 'date');
|
|
653
|
-
const from = optStr(params, 'from');
|
|
654
|
-
const to = optStr(params, 'to');
|
|
655
|
-
if (id !== undefined) {
|
|
656
|
-
if (!Number.isInteger(id) || id <= 0)
|
|
657
|
-
fail(2, 'id 须为正整数');
|
|
658
|
-
deleteRecord(db, id);
|
|
659
|
-
return out(R('删运动记录', 'delete', '已删除运动 #' + id + SOFT_EXCLUDED, '删运动记录', 'exercise_log (写库回执)', {
|
|
660
|
-
recordId: id, ids: [id], writtenFields: ['is_deleted'], items: [{ id, status: deleteStatus('soft'), reason: '' }],
|
|
661
|
-
}));
|
|
662
|
-
}
|
|
663
|
-
if (date !== undefined) {
|
|
664
|
-
assertISO(date, 'date');
|
|
665
|
-
const n = deleteDay(db, date);
|
|
666
|
-
if (n === 0)
|
|
667
|
-
throw new CalorieRenderError('missing-data', '无运动记录(' + date + ')');
|
|
668
|
-
return out(R('删某日运动', 'delete', '已删除 ' + date + ' 运动 ' + n + ' 条' + SOFT_EXCLUDED, '删某日运动', 'exercise_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: ['is_deleted'] }));
|
|
669
|
-
}
|
|
670
|
-
if (from !== undefined || to !== undefined) {
|
|
671
|
-
if (from === undefined || to === undefined)
|
|
672
|
-
fail(2, '按范围删须同时传 from/to');
|
|
673
|
-
assertISO(from, 'from');
|
|
674
|
-
assertISO(to, 'to');
|
|
675
|
-
if (from > to)
|
|
676
|
-
fail(2, 'from 不得晚于 to');
|
|
677
|
-
const n = deleteRange(db, from, to);
|
|
678
|
-
if (n === 0)
|
|
679
|
-
throw new CalorieRenderError('missing-data', '无运动记录(' + from + '~' + to + ')');
|
|
680
|
-
return out(R('批量删运动', 'delete', '已删除 ' + from + '~' + to + ' 运动 ' + n + ' 条' + SOFT_EXCLUDED, '批量删运动', 'exercise_log (写库回执)', { ids: [], idSource: 'condition', writtenFields: ['is_deleted'] }));
|
|
681
|
-
}
|
|
682
|
-
fail(2, '缺参数 id/date/from+to(三选一)');
|
|
683
|
-
throw new Error('unreachable');
|
|
684
|
-
}
|
|
685
|
-
case 'calorie.photo.add': {
|
|
686
|
-
const raw = params['srcPaths'] ?? params['srcPath'];
|
|
687
|
-
const srcPaths = (Array.isArray(raw) ? raw : [raw]).filter((s) => typeof s === 'string' && s.length > 0);
|
|
688
|
-
if (srcPaths.length === 0)
|
|
689
|
-
fail(2, '缺参数 srcPaths(照片源文件路径数组)');
|
|
690
|
-
if (srcPaths.length > 20)
|
|
691
|
-
fail(2, 'srcPaths 至多 20 张');
|
|
692
|
-
const tag = needStr(params, 'tag');
|
|
693
|
-
const dir = photosDirOf(params);
|
|
694
|
-
const today = optStr(params, 'date') ?? todayISO();
|
|
695
|
-
assertISO(today, 'date');
|
|
696
|
-
const added = addPhotos(db, dir, { srcPaths, tag, note: optStr(params, 'note'), today, nowTime: optStr(params, 'time') });
|
|
697
|
-
if (added.length === 0)
|
|
698
|
-
throw new CalorieRenderError('missing-data', '照片源文件均不存在,未存入');
|
|
699
|
-
let distance = null;
|
|
700
|
-
try {
|
|
701
|
-
const days = daysSinceTagPhoto(db, tag, today);
|
|
702
|
-
distance = days === null ? null : { tag, days };
|
|
703
|
-
}
|
|
704
|
-
catch {
|
|
705
|
-
distance = null;
|
|
706
|
-
}
|
|
707
|
-
const receipt = withM5(buildAddReceipt(added, { tag, note: optStr(params, 'note'), distance, failedCount: srcPaths.length - added.length || undefined }), {
|
|
708
|
-
ids: added.map((a) => a.id), writtenFields: [...F.photo],
|
|
709
|
-
});
|
|
710
|
-
return { data: { ok: true, message: receipt.summary, receipt }, html: receiptHtml(receipt.scene, receipt.summary, receipt.op, receipt.recordId, receipt.items) };
|
|
711
|
-
}
|
|
712
|
-
case 'calorie.photo.remove': {
|
|
713
|
-
const id = needId(params);
|
|
714
|
-
const dir = photosDirOf(params);
|
|
715
|
-
const snap = getPhotoRow(db, id);
|
|
716
|
-
if (!snap)
|
|
717
|
-
throw new CalorieRenderError('missing-data', '身材照 #' + id + ' 不存在');
|
|
718
|
-
deletePhoto(db, dir, id);
|
|
719
|
-
const receipt = withM5(buildDeleteReceipt(snap), { ids: [id], writtenFields: [] });
|
|
720
|
-
return { data: { ok: true, message: receipt.summary, receipt }, html: receiptHtml(receipt.scene, receipt.summary, receipt.op, receipt.recordId, receipt.items) };
|
|
721
|
-
}
|
|
722
|
-
case 'calorie.photo.tag': {
|
|
723
|
-
const id = needId(params);
|
|
724
|
-
const op = needStr(params, 'op');
|
|
725
|
-
if (op !== 'set' && op !== 'add' && op !== 'remove')
|
|
726
|
-
fail(2, 'op 须为 set/add/remove:' + op);
|
|
727
|
-
const row = getPhotoRow(db, id);
|
|
728
|
-
if (!row)
|
|
729
|
-
throw new CalorieRenderError('missing-data', '身材照 #' + id + ' 不存在');
|
|
730
|
-
const before = [...row.tag_list];
|
|
731
|
-
let scene;
|
|
732
|
-
if (op === 'set') {
|
|
733
|
-
const raw = params['tags'] ?? params['tag'];
|
|
734
|
-
const tags = Array.isArray(raw) ? raw.map(String) : parseTags(typeof raw === 'string' ? raw : '');
|
|
735
|
-
if (tags.length === 0)
|
|
736
|
-
fail(2, '缺参数 tags(新标签全量)');
|
|
737
|
-
updateTag(db, id, serializeTags(tags));
|
|
738
|
-
scene = '改照片标签';
|
|
739
|
-
}
|
|
740
|
-
else if (op === 'add') {
|
|
741
|
-
const tag = needStr(params, 'tag');
|
|
742
|
-
tagAdd(db, id, tag);
|
|
743
|
-
scene = '加照片标签';
|
|
744
|
-
}
|
|
745
|
-
else {
|
|
746
|
-
const tag = needStr(params, 'tag');
|
|
747
|
-
if (parseTags(tag).length !== 1)
|
|
748
|
-
fail(2, '删标签一次只删 1 个');
|
|
749
|
-
tagRemove(db, id, tag);
|
|
750
|
-
scene = '删照片标签';
|
|
751
|
-
}
|
|
752
|
-
const after = getPhotoRow(db, id)?.tag_list ?? before;
|
|
753
|
-
const receipt = withM5(buildTagReceipt(id, before, after, scene), { ids: [id], writtenFields: op === 'set' ? ['tags'] : ['tag'] });
|
|
754
|
-
return { data: { ok: true, message: receipt.summary, receipt }, html: receiptHtml(receipt.scene, receipt.summary, receipt.op, receipt.recordId, receipt.items) };
|
|
755
|
-
}
|
|
756
|
-
case 'calorie.product.add': {
|
|
757
|
-
const productName = (optStr(params, 'productName') ?? optStr(params, 'product_name') ?? '');
|
|
758
|
-
if (!productName.trim())
|
|
759
|
-
fail(2, '缺参数 productName');
|
|
760
|
-
const r = addProduct(db, {
|
|
761
|
-
productName: productName.trim(), brand: optStr(params, 'brand'),
|
|
762
|
-
calories: needNum(params, 'calories'), protein: needNum(params, 'protein'), fat: needNum(params, 'fat'),
|
|
763
|
-
saturatedFat: optNum(params, 'saturatedFat'), carbohydrates: needNum(params, 'carbohydrates'),
|
|
764
|
-
sugar: optNum(params, 'sugar'), dietaryFiber: optNum(params, 'dietaryFiber'),
|
|
765
|
-
sodium: needNum(params, 'sodium'), note: optStr(params, 'note'),
|
|
766
|
-
});
|
|
767
|
-
return out(R('存食品', 'create', '已存食品 #' + r.id + '(' + productName.trim() + ')', '存食品', 'nutrition_products (写库回执)', {
|
|
768
|
-
recordId: r.id, ids: [r.id], writtenFields: [...F.product],
|
|
769
|
-
items: [{ id: r.id, status: '成功', reason: '', detail: productName.trim() }],
|
|
770
|
-
}));
|
|
771
|
-
}
|
|
772
|
-
case 'calorie.product.update': {
|
|
773
|
-
const id = needId(params);
|
|
774
|
-
const map = {
|
|
775
|
-
productName: 'product_name', brand: 'brand', calories: 'calories', protein: 'protein', fat: 'fat',
|
|
776
|
-
saturatedFat: 'saturated_fat', carbohydrates: 'carbohydrates', sugar: 'sugar',
|
|
777
|
-
dietaryFiber: 'dietary_fiber', sodium: 'sodium', note: 'note', category: 'category',
|
|
778
|
-
};
|
|
779
|
-
const fields = {};
|
|
780
|
-
for (const [camel, col] of Object.entries(map)) {
|
|
781
|
-
if (params[camel] !== undefined)
|
|
782
|
-
fields[col] = params[camel];
|
|
783
|
-
}
|
|
784
|
-
for (const k of Object.keys(params)) {
|
|
785
|
-
if (!(k in map) && k !== 'id' && k !== 'key')
|
|
786
|
-
fail(2, '不支持字段: ' + k);
|
|
787
|
-
}
|
|
788
|
-
if (Object.keys(fields).length === 0)
|
|
789
|
-
fail(2, '至少传 1 个待改字段');
|
|
790
|
-
const r = updateProduct(db, id, fields);
|
|
791
|
-
if (!r.updated)
|
|
792
|
-
throw new CalorieRenderError('missing-data', '食品 #' + id + ' 不存在');
|
|
793
|
-
return out(R('改食品', 'update', '已更新食品 #' + id + '(' + Object.keys(fields).join('、') + ')', '改食品', 'nutrition_products (写库回执)', {
|
|
794
|
-
recordId: id, ids: [id], writtenFields: cliNames(Object.keys(fields)),
|
|
795
|
-
items: [{ id, status: '已更新', reason: '' }],
|
|
796
|
-
}));
|
|
797
|
-
}
|
|
798
|
-
case 'calorie.product.deprecate': {
|
|
799
|
-
const id = needId(params);
|
|
800
|
-
const r = deprecateProduct(db, id);
|
|
801
|
-
if (!r.ok) {
|
|
802
|
-
if (/not found/.test(String(r.error ?? '')))
|
|
803
|
-
throw new CalorieRenderError('missing-data', '食品 #' + id + ' 不存在');
|
|
804
|
-
fail(2, String(r.error ?? '废弃失败'));
|
|
805
|
-
}
|
|
806
|
-
return out(R('下架食品', 'update', '已下架食品 #' + id + '(' + (r.name ?? '') + ' · ' + SOFT_EXCLUDED_INNER + ')', '下架食品', 'nutrition_products (写库回执)', {
|
|
807
|
-
recordId: id, ids: [id], writtenFields: ['is_deprecated'], items: [{ id, status: deleteStatus('soft', '已下架'), reason: '' }],
|
|
808
|
-
}));
|
|
809
|
-
}
|
|
810
|
-
case 'calorie.profile.set':
|
|
811
|
-
case 'calorie.profile.update': {
|
|
812
|
-
const isSet = key === 'calorie.profile.set';
|
|
813
|
-
const scene = isSet ? '设置档案' : '改档案';
|
|
814
|
-
const wake = isSet ? '设置档案' : '改档案';
|
|
815
|
-
const picked = {};
|
|
816
|
-
if (params['fields'] !== undefined) {
|
|
817
|
-
const f = params['fields'];
|
|
818
|
-
if (typeof f !== 'object' || f === null || Array.isArray(f))
|
|
819
|
-
fail(2, 'fields 须为对象');
|
|
820
|
-
Object.assign(picked, f);
|
|
821
|
-
}
|
|
822
|
-
else if (params['field'] !== undefined) {
|
|
823
|
-
picked[String(needStr(params, 'field'))] = params['value'];
|
|
824
|
-
}
|
|
825
|
-
else {
|
|
826
|
-
for (const k of ['age', 'gender', 'heightCm', 'activityLevel', 'note']) {
|
|
827
|
-
if (params[k] !== undefined)
|
|
828
|
-
picked[k] = params[k];
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
for (const k of Object.keys(picked)) {
|
|
832
|
-
if (!['age', 'gender', 'heightCm', 'activityLevel', 'note'].includes(k))
|
|
833
|
-
fail(2, '不支持字段: ' + k);
|
|
834
|
-
}
|
|
835
|
-
if (Object.keys(picked).length === 0)
|
|
836
|
-
fail(2, '至少传 1 个档案字段');
|
|
837
|
-
const r = updateProfile(db, picked);
|
|
838
|
-
const after = r.after;
|
|
839
|
-
return out(R(scene, 'update', '已' + scene + '(身高 ' + (after.height_cm ?? '—') + ' · 年龄 ' + (after.age ?? '—') + ' · 活动量 ' + (after.activity_level ?? '—') + ')', wake, 'user_profile (写库回执)', {
|
|
840
|
-
recordId: 1, ids: [1], idSource: 'singleton', writtenFields: Object.keys(picked), noChange: r.changed.length === 0,
|
|
841
|
-
// #179 · 改档案回执带逐字段对照(设置档案没有「改前」概念,items 保持空)。
|
|
842
|
-
items: isSet ? [] : profileDiffItems(r.before, after, Object.keys(picked)),
|
|
843
|
-
}));
|
|
844
|
-
}
|
|
845
|
-
case 'calorie.profile.activity': {
|
|
846
|
-
const level = optStr(params, 'activityLevel') ?? optStr(params, 'level') ?? '';
|
|
847
|
-
if (!level.trim())
|
|
848
|
-
fail(2, '缺参数 activityLevel');
|
|
849
|
-
const r = setActivityLevel(db, level);
|
|
850
|
-
return out(R('设活动量', 'update', '已设活动量:' + (r.before ?? '—') + '→' + r.after, '设活动量', 'user_profile (写库回执)', {
|
|
851
|
-
recordId: 1, ids: [1], idSource: 'singleton', writtenFields: ['activityLevel'], noChange: r.before === r.after,
|
|
852
|
-
}));
|
|
853
|
-
}
|
|
854
|
-
case 'calorie.goal.set': {
|
|
855
|
-
const calorie = needNum(params, 'calorie');
|
|
856
|
-
const protein = needNum(params, 'protein');
|
|
857
|
-
const carbs = needNum(params, 'carbs');
|
|
858
|
-
const fat = needNum(params, 'fat');
|
|
859
|
-
const water = optNum(params, 'water');
|
|
860
|
-
if (!(calorie > 0))
|
|
861
|
-
fail(2, '热量目标必须为正数');
|
|
862
|
-
for (const [k, v] of [['protein', protein], ['carbs', carbs], ['fat', fat]]) {
|
|
863
|
-
if (v < 0)
|
|
864
|
-
fail(2, k + ' 不能为负');
|
|
865
|
-
}
|
|
866
|
-
if (water !== undefined && water < 0)
|
|
867
|
-
fail(2, 'water 不能为负');
|
|
868
|
-
const had = getNutritionGoal(db) !== null;
|
|
869
|
-
const r = setNutritionGoal(db, { calorie, protein, carbs, fat, water });
|
|
870
|
-
const tail = r.consistent ? ' · 宏量自洽' : ' · ⚠宏量换算差 ' + r.diffKcal + ' 卡(>50 建议复核)';
|
|
871
|
-
return out(R('定营养目标', had ? 'update' : 'create', '已定营养目标:' + r.calorieGoal + ' 卡·蛋白 ' + r.proteinGoal + '·碳水 ' + r.carbsGoal + '·脂肪 ' + r.fatGoal + (r.waterGoal === null ? '' : '·饮水 ' + r.waterGoal) + tail, '定营养目标', 'daily_goal (写库回执)', {
|
|
872
|
-
recordId: 1, ids: [1], idSource: 'singleton', writtenFields: goalSetWrittenFields(water !== undefined),
|
|
873
|
-
}));
|
|
874
|
-
}
|
|
875
|
-
case 'calorie.goal.water': {
|
|
876
|
-
const water = needNum(params, 'water');
|
|
877
|
-
if (getNutritionGoal(db) === null)
|
|
878
|
-
throw new CalorieRenderError('missing-data', '尚无营养目标行(先定营养目标)');
|
|
879
|
-
const r = updateWaterGoal(db, water);
|
|
880
|
-
return out(R('定饮水目标', 'update', '已定饮水目标:' + (r.oldWaterGoal ?? '—') + '→' + r.newWaterGoal + ' ml', '定饮水目标', 'daily_goal (写库回执)', {
|
|
881
|
-
recordId: 1, ids: [1], idSource: 'singleton', writtenFields: ['water'], noChange: r.oldWaterGoal === r.newWaterGoal,
|
|
882
|
-
}));
|
|
883
|
-
}
|
|
884
|
-
case 'calorie.goal.weight': {
|
|
885
|
-
const kg = needNum(params, 'kg');
|
|
886
|
-
if (!(kg > 0) || kg > 500)
|
|
887
|
-
fail(2, 'kg 须为 0..500');
|
|
888
|
-
const r = setWeightGoal(db, {
|
|
889
|
-
kg, deadline: params['deadline'], startKg: params['startKg'], startDate: params['startDate'],
|
|
890
|
-
});
|
|
891
|
-
return out(R('定体重目标', 'update', '已定体重目标 ' + r.weightGoal + ' kg' + (r.deadline ? '(截止 ' + r.deadline + ')' : '') + (r.startKg !== null ? ' · 起点 ' + r.startKg + ' kg' : ''), '定体重目标', 'daily_goal (写库回执)', {
|
|
892
|
-
recordId: 1, ids: [1], idSource: 'singleton',
|
|
893
|
-
writtenFields: provided(params, ['kg', 'deadline', 'startKg', 'startDate']),
|
|
894
|
-
}));
|
|
895
|
-
}
|
|
896
|
-
case 'calorie.goal.pause': {
|
|
897
|
-
const r = pauseAllGoals(db);
|
|
898
|
-
return out(R('暂停所有目标', 'update', '已暂停所有目标(记录照常,仅目标暂停)', '暂停所有目标', 'daily_goal (写库回执)', {
|
|
899
|
-
recordId: r.id, ids: [r.id], idSource: 'singleton', writtenFields: ['goal_paused'],
|
|
900
|
-
}));
|
|
901
|
-
}
|
|
902
|
-
case 'calorie.goal.resume': {
|
|
903
|
-
const r = resumeAllGoals(db);
|
|
904
|
-
return out(R('重启所有目标', 'update', '已重启所有目标(恢复正常)', '重启所有目标', 'daily_goal (写库回执)', {
|
|
905
|
-
recordId: r.id, ids: [r.id], idSource: 'singleton', writtenFields: ['goal_paused'],
|
|
906
|
-
}));
|
|
907
|
-
}
|
|
908
|
-
case 'calorie.body.composition-add': {
|
|
909
|
-
const date = optStr(params, 'date') ?? todayISO();
|
|
910
|
-
assertISO(date, 'date');
|
|
911
|
-
const source = normSource(params['source']);
|
|
912
|
-
const input = {
|
|
913
|
-
date, source, bodyFatPct: params['bodyFatPct'], note: optStr(params, 'note'),
|
|
914
|
-
age: optInt(params, 'age'), sex: normSex(params['sex']),
|
|
915
|
-
};
|
|
916
|
-
for (const f of CALIPER_FIELDS) {
|
|
917
|
-
const v = optNum(params, f);
|
|
918
|
-
if (v !== undefined)
|
|
919
|
-
input[f] = v;
|
|
920
|
-
}
|
|
921
|
-
if (input['bodyFatPct'] === undefined)
|
|
922
|
-
fail(2, '缺参数 bodyFatPct(皮褶→体脂自动换算未移植,直传实测值)');
|
|
923
|
-
const r = addComposition(db, input);
|
|
924
|
-
const label = SOURCE_LABELS[source] ?? source;
|
|
925
|
-
return out(R('记体脂', 'create', '已记体脂:' + date + ' ' + label + ' ' + r.bodyFatPct + '%', '记体脂', 'body_composition (写库回执)', {
|
|
926
|
-
recordId: r.id, ids: [r.id], writtenFields: definedKeys(input),
|
|
927
|
-
items: [{ id: r.id, date, status: '成功', reason: '', detail: r.bodyFatPct + '%' }],
|
|
928
|
-
}));
|
|
929
|
-
}
|
|
930
|
-
case 'calorie.body.composition-remove': {
|
|
931
|
-
const id = needId(params);
|
|
932
|
-
deleteComposition(db, id);
|
|
933
|
-
return out(R('删体脂', 'delete', '已删除体脂记录 #' + id + SOFT_EXCLUDED, '删体脂', 'body_composition (写库回执)', {
|
|
934
|
-
recordId: id, ids: [id], writtenFields: ['is_deprecated'], items: [{ id, status: deleteStatus('soft'), reason: '' }],
|
|
935
|
-
}));
|
|
936
|
-
}
|
|
937
|
-
case 'calorie.body.measure-add': {
|
|
938
|
-
const date = optStr(params, 'date') ?? todayISO();
|
|
939
|
-
assertISO(date, 'date');
|
|
940
|
-
const input = { date, note: optStr(params, 'note') };
|
|
941
|
-
for (const [camel, col] of Object.entries(MEASURE_CAMEL)) {
|
|
942
|
-
const v = optNum(params, camel);
|
|
943
|
-
if (v !== undefined)
|
|
944
|
-
input[col] = v;
|
|
945
|
-
}
|
|
946
|
-
for (const k of Object.keys(params)) {
|
|
947
|
-
if (!(k in MEASURE_CAMEL) && k !== 'date' && k !== 'note' && k !== 'key')
|
|
948
|
-
fail(2, '不支持字段: ' + k);
|
|
949
|
-
}
|
|
950
|
-
const r = addMeasurement(db, input);
|
|
951
|
-
const filledCn = r.filled.map((f) => {
|
|
952
|
-
const camel = Object.keys(MEASURE_CAMEL).find((c) => MEASURE_CAMEL[c] === f) ?? f;
|
|
953
|
-
return camel + ' ' + String(input[f]);
|
|
954
|
-
}).join('、');
|
|
955
|
-
return out(R('记围度', 'create', '已记围度:' + date + '(' + filledCn + ')', '记围度', 'body_measurements (写库回执)', {
|
|
956
|
-
recordId: r.id, ids: [r.id], writtenFields: measureCliNames(definedKeys(input)),
|
|
957
|
-
items: [{ id: r.id, date, status: '成功', reason: '', detail: filledCn }],
|
|
958
|
-
}));
|
|
959
|
-
}
|
|
960
|
-
case 'calorie.body.measure-remove': {
|
|
961
|
-
const id = needId(params);
|
|
962
|
-
deleteMeasurement(db, id);
|
|
963
|
-
return out(R('删围度', 'delete', '已删除围度记录 #' + id + SOFT_EXCLUDED, '删围度', 'body_measurements (写库回执)', {
|
|
964
|
-
recordId: id, ids: [id], writtenFields: ['is_deprecated'], items: [{ id, status: deleteStatus('soft'), reason: '' }],
|
|
965
|
-
}));
|
|
966
|
-
}
|
|
967
59
|
default:
|
|
968
60
|
fail(3, '未知 calorie 写键:' + key);
|
|
969
61
|
throw new Error('unreachable');
|