feat: založení základní stránky příjem/výdej + import a statistiky

This commit is contained in:
Ondřej Anděl
2026-09-07 14:58:49 +02:00
commit a5711f3e1e
98 changed files with 15505 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
openapi: 3.0.4
info:
title: Food Tracer API
version: 1.0.0
servers:
- url: /api
paths:
# Obecné (/api)
/login:
$ref: "./paths/login.yml"
/config:
$ref: "./paths/config/config.yml"
# Jídla (/api/meals)
/meals/day:
$ref: "./paths/meals/day.yml"
/meals/range:
$ref: "./paths/meals/range.yml"
/meals/add:
$ref: "./paths/meals/add.yml"
/meals/update:
$ref: "./paths/meals/update.yml"
/meals/delete:
$ref: "./paths/meals/delete.yml"
# Statistiky (/api/stats)
/stats/summary:
$ref: "./paths/stats/summary.yml"
# Přehled dne (/api/day)
/day:
$ref: "./paths/day/overview.yml"
# Pohyb (/api/activities)
/activities/add:
$ref: "./paths/activities/add.yml"
/activities/update:
$ref: "./paths/activities/update.yml"
/activities/delete:
$ref: "./paths/activities/delete.yml"
# Šablony tréninků (/api/workouts)
/workouts:
$ref: "./paths/workouts/list.yml"
/workouts/save:
$ref: "./paths/workouts/save.yml"
/workouts/delete:
$ref: "./paths/workouts/delete.yml"
/workouts/apply:
$ref: "./paths/workouts/apply.yml"
# Kalorie (/api/calories)
/calories/search:
$ref: "./paths/calories/search.yml"
# Nastavení (/api/settings)
/settings:
$ref: "./paths/settings/settings.yml"
/settings/basal:
$ref: "./paths/settings/basal.yml"
# Importy (/api/import)
/import/luncher:
$ref: "./paths/import/luncher.yml"
components:
schemas:
$ref: "./schemas/_index.yml"
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- bearerAuth: []
+1
View File
@@ -0,0 +1 @@
export * from './gen';
+14
View File
@@ -0,0 +1,14 @@
import { defaultPlugins } from '@hey-api/openapi-ts';
export default {
input: 'api.yml',
output: 'gen',
plugins: [
...defaultPlugins,
'@hey-api/client-fetch',
{
enums: 'javascript',
name: '@hey-api/typescript',
},
],
};
+14
View File
@@ -0,0 +1,14 @@
{
"name": "@food-tracer/types",
"version": "1.0.0",
"license": "MIT",
"private": true,
"scripts": {
"openapi-ts": "openapi-ts"
},
"devDependencies": {
"@hey-api/client-fetch": "^0.8.2",
"@hey-api/openapi-ts": "^0.64.7",
"typescript": "^5.9.3"
}
}
+20
View File
@@ -0,0 +1,20 @@
post:
operationId: addActivity
summary: Přidá pohybovou aktivitu do zvoleného dne.
requestBody:
required: true
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/ActivityInput"
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+29
View File
@@ -0,0 +1,29 @@
post:
operationId: deleteActivity
summary: Smaže aktivitu.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id, date]
properties:
id:
type: string
date:
type: string
format: date
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Záznam neexistuje
+28
View File
@@ -0,0 +1,28 @@
post:
operationId: updateActivity
summary: Upraví existující aktivitu.
requestBody:
required: true
content:
application/json:
schema:
allOf:
- type: object
required: [id]
properties:
id:
type: string
- $ref: "../../schemas/_index.yml#/ActivityInput"
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Záznam neexistuje
+23
View File
@@ -0,0 +1,23 @@
get:
operationId: searchCalories
summary: |
Najde návrhy energetické hodnoty pro název jídla — z vlastní knihovny
dřívějších zadání a od externího poskytovatele.
parameters:
- in: query
name: q
required: true
schema:
type: string
description: Název jídla, ke kterému se hledá energetická hodnota
responses:
"200":
description: Nalezené návrhy
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/CalorieSearchResult"
"400":
description: Nebyl předán hledaný název
"401":
description: Neautentizovaný uživatel
+11
View File
@@ -0,0 +1,11 @@
get:
operationId: getConfig
summary: Vrátí veřejnou runtime konfiguraci klienta.
security: []
responses:
"200":
description: Runtime konfigurace
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/Config"
+22
View File
@@ -0,0 +1,22 @@
get:
operationId: getDayOverview
summary: Vrátí kompletní přehled dne — jídlo, pohyb a energetickou bilanci.
parameters:
- in: query
name: date
required: false
schema:
type: string
format: date
description: Datum ve formátu YYYY-MM-DD. Výchozí je dnešek.
responses:
"200":
description: Přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatné datum
"401":
description: Neautentizovaný uživatel
+22
View File
@@ -0,0 +1,22 @@
post:
operationId: importLuncher
summary: |
Naimportuje měsíční přehled vyexportovaný z Luncheru (XLSX, CSV nebo JSON).
Řádky se založí do dnů, ke kterým patří, ve výchozím stavu jako oběd.
requestBody:
required: true
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/ImportRequest"
responses:
"200":
description: Výsledek importu, nebo jeho náhled při dryRun
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/ImportResult"
"400":
description: Nepodporovaný formát nebo poškozený soubor
"401":
description: Neautentizovaný uživatel
+22
View File
@@ -0,0 +1,22 @@
post:
operationId: login
summary: Přihlásí uživatele a vrátí JWT token.
security: []
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
login:
type: string
responses:
"200":
description: JWT token přihlášeného uživatele
content:
application/json:
schema:
type: string
"500":
description: Nebyl předán login
+20
View File
@@ -0,0 +1,20 @@
post:
operationId: addMeal
summary: Přidá jídlo do zvoleného dne.
requestBody:
required: true
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/MealInput"
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayRecord"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+22
View File
@@ -0,0 +1,22 @@
get:
operationId: getDay
summary: Vrátí jídla přihlášeného uživatele za jeden den.
parameters:
- in: query
name: date
required: false
schema:
type: string
format: date
description: Datum ve formátu YYYY-MM-DD. Výchozí je dnešek.
responses:
"200":
description: Přehled jídel daného dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayRecord"
"400":
description: Neplatné datum
"401":
description: Neautentizovaný uživatel
+31
View File
@@ -0,0 +1,31 @@
post:
operationId: deleteMeal
summary: Smaže záznam o jídle.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id, date]
properties:
id:
description: Identifikátor mazaného záznamu
type: string
date:
description: Datum záznamu (YYYY-MM-DD)
type: string
format: date
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayRecord"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Záznam neexistuje
+31
View File
@@ -0,0 +1,31 @@
get:
operationId: getRange
summary: Vrátí jídla přihlášeného uživatele za rozsah dnů.
parameters:
- in: query
name: from
required: true
schema:
type: string
format: date
description: První den rozsahu (včetně), YYYY-MM-DD
- in: query
name: to
required: true
schema:
type: string
format: date
description: Poslední den rozsahu (včetně), YYYY-MM-DD
responses:
"200":
description: Dny s alespoň jedním záznamem, vzestupně dle data
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/DayRecord"
"400":
description: Neplatný rozsah
"401":
description: Neautentizovaný uživatel
+29
View File
@@ -0,0 +1,29 @@
post:
operationId: updateMeal
summary: Upraví existující záznam o jídle.
requestBody:
required: true
content:
application/json:
schema:
allOf:
- type: object
required: [id]
properties:
id:
description: Identifikátor upravovaného záznamu
type: string
- $ref: "../../schemas/_index.yml#/MealInput"
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayRecord"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Záznam neexistuje
+25
View File
@@ -0,0 +1,25 @@
post:
operationId: saveBasalCalories
summary: Uloží klidový výdej (bazální metabolismus) přihlášeného uživatele.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
basalCalories:
description: Klidový výdej v kcal za den. Null nebo 0 ho odstraní.
type: integer
nullable: true
responses:
"200":
description: Aktualizované nastavení
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/UserSettings"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+41
View File
@@ -0,0 +1,41 @@
get:
operationId: getSettings
summary: Vrátí nastavení přihlášeného uživatele.
responses:
"200":
description: Nastavení uživatele
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/UserSettings"
"401":
description: Neautentizovaný uživatel
post:
operationId: saveSourceRate
summary: Uloží nebo smaže cenu za 100 g u jednoho zdroje.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [source]
properties:
source:
description: Název zdroje (podniku)
type: string
pricePer100g:
description: Cena za 100 g v haléřích. Null nebo 0 sazbu odstraní.
type: integer
nullable: true
responses:
"200":
description: Aktualizované nastavení
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/UserSettings"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+29
View File
@@ -0,0 +1,29 @@
get:
operationId: getFoodStats
summary: Vrátí statistiky útraty a jídel za zvolené období.
parameters:
- in: query
name: from
required: true
schema:
type: string
format: date
description: První den období (včetně), YYYY-MM-DD
- in: query
name: to
required: true
schema:
type: string
format: date
description: Poslední den období (včetně), YYYY-MM-DD
responses:
"200":
description: Statistiky za období
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/FoodStats"
"400":
description: Neplatný rozsah
"401":
description: Neautentizovaný uživatel
+31
View File
@@ -0,0 +1,31 @@
post:
operationId: applyWorkoutTemplate
summary: Založí do zvoleného dne všechny položky šablony tréninku.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id, date]
properties:
id:
description: Identifikátor šablony
type: string
date:
description: Den, do kterého se položky založí
type: string
format: date
responses:
"200":
description: Aktualizovaný přehled dne
content:
application/json:
schema:
$ref: "../../schemas/_index.yml#/DayOverview"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
"404":
description: Šablona neexistuje
+26
View File
@@ -0,0 +1,26 @@
post:
operationId: deleteWorkoutTemplate
summary: Smaže šablonu tréninku.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id]
properties:
id:
type: string
responses:
"200":
description: Aktualizovaný seznam šablon
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/WorkoutTemplate"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+14
View File
@@ -0,0 +1,14 @@
get:
operationId: getWorkoutTemplates
summary: Vrátí šablony tréninků přihlášeného uživatele.
responses:
"200":
description: Šablony seřazené podle názvu
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/WorkoutTemplate"
"401":
description: Neautentizovaný uživatel
+33
View File
@@ -0,0 +1,33 @@
post:
operationId: saveWorkoutTemplate
summary: Založí novou šablonu tréninku, nebo upraví existující.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [name, items]
properties:
id:
description: Identifikátor upravované šablony. Bez něj se založí nová.
type: string
name:
type: string
items:
type: array
items:
$ref: "../../schemas/_index.yml#/WorkoutTemplateItem"
responses:
"200":
description: Aktualizovaný seznam šablon
content:
application/json:
schema:
type: array
items:
$ref: "../../schemas/_index.yml#/WorkoutTemplate"
"400":
description: Neplatná data
"401":
description: Neautentizovaný uživatel
+664
View File
@@ -0,0 +1,664 @@
MealType:
description: |
Typ jídla (chod v rámci dne). Importy z Luncheru se zakládají jako OBED,
pokud se při importu neurčí jinak.
type: string
enum:
- SNIDANE
- DOPOLEDNI_SVACINA
- OBED
- ODPOLEDNI_SVACINA
- VECERE
- JINE
MealEntry:
description: Jeden snědený pokrm v konkrétní den
type: object
additionalProperties: false
required:
- id
- date
- mealType
- name
- createdAt
properties:
id:
description: Identifikátor záznamu (UUID)
type: string
date:
description: Datum konzumace ve formátu YYYY-MM-DD
type: string
format: date
mealType:
$ref: "#/MealType"
name:
description: Název jídla
type: string
source:
description: Zdroj jídla (podnik, obchod, "doma", ...)
type: string
price:
description: Cena v haléřích. Celé číslo, aby nevznikaly chyby zaokrouhlením.
type: integer
calories:
description: |
Energetická hodnota v kcal. Pokud je vyplněná gramáž i caloriesPer100g,
dopočte se z nich; jinak platí ručně zadaná hodnota.
type: integer
weight:
description: |
Gramáž porce v gramech. U podniků, které účtují podle váhy (TechTower),
se dopočítá z ceny a pricePer100g, ale dá se přepsat.
type: integer
pricePer100g:
description: Cena za 100 g v haléřích. Slouží k dopočtu gramáže z ceny.
type: integer
caloriesPer100g:
description: Energetická hodnota na 100 g v kcal. Slouží k dopočtu kalorií z gramáže.
type: integer
note:
description: Poznámka uživatele k jídlu
type: string
importSource:
description: Odkud byl záznam naimportován (např. "luncher"). U ručně přidaných chybí.
type: string
importKey:
description: |
Klíč pro rozpoznání duplicit při opakovaném importu stejného období.
Odvozuje se z data, typu, názvu jídla a částky importovaného řádku.
type: string
createdAt:
description: Čas vzniku záznamu
type: string
format: date-time
updatedAt:
description: Čas poslední úpravy záznamu
type: string
format: date-time
MealInput:
description: Data pro založení nebo úpravu záznamu o jídle
type: object
additionalProperties: false
required:
- date
- mealType
- name
properties:
date:
description: Datum konzumace ve formátu YYYY-MM-DD
type: string
format: date
mealType:
$ref: "#/MealType"
name:
description: Název jídla
type: string
source:
description: Zdroj jídla (podnik, obchod, "doma", ...)
type: string
price:
description: Cena v haléřích
type: integer
nullable: true
calories:
description: |
Energetická hodnota v kcal. Ignoruje se, pokud jde dopočíst
z gramáže a caloriesPer100g.
type: integer
nullable: true
weight:
description: Gramáž porce v gramech. Nevyplněná se dopočte z ceny a pricePer100g.
type: integer
nullable: true
pricePer100g:
description: Cena za 100 g v haléřích
type: integer
nullable: true
caloriesPer100g:
description: Energetická hodnota na 100 g v kcal
type: integer
nullable: true
note:
description: Poznámka uživatele k jídlu
type: string
nullable: true
DayRecord:
description: Přehled jídel jednoho dne včetně součtů
type: object
additionalProperties: false
required:
- date
- entries
- totalPrice
- totalCalories
properties:
date:
description: Datum ve formátu YYYY-MM-DD
type: string
format: date
entries:
description: Jídla daného dne seřazená dle typu (snídaně → večeře)
type: array
items:
$ref: "#/MealEntry"
totalPrice:
description: Součet cen všech jídel dne v haléřích
type: integer
totalCalories:
description: Součet kalorií jídel dne v kcal (jídla bez kalorií se nezapočítávají)
type: integer
PeriodTotal:
description: Součty za jedno období (den, měsíc nebo rok)
type: object
additionalProperties: false
required:
- period
- price
- calories
- count
properties:
period:
description: Označení období — YYYY-MM-DD (den), YYYY-MM (měsíc) nebo YYYY (rok)
type: string
price:
description: Utracená částka v haléřích
type: integer
calories:
description: Součet kalorií v kcal
type: integer
count:
description: Počet záznamů o jídle
type: integer
GroupTotal:
description: Součty za jednu skupinu (typ jídla nebo zdroj)
type: object
additionalProperties: false
required:
- key
- price
- calories
- count
properties:
key:
description: Klíč skupiny (hodnota MealType, nebo název zdroje)
type: string
price:
description: Utracená částka v haléřích
type: integer
calories:
description: Součet kalorií v kcal
type: integer
count:
description: Počet záznamů o jídle
type: integer
FoodStats:
description: Statistiky útraty a jídel za zvolené období
type: object
additionalProperties: false
required:
- from
- to
- totalPrice
- totalCalories
- entryCount
- dayCount
- byDay
- byMonth
- byYear
- byMealType
- bySource
properties:
from:
description: Začátek období (YYYY-MM-DD, včetně)
type: string
format: date
to:
description: Konec období (YYYY-MM-DD, včetně)
type: string
format: date
totalPrice:
description: Celková útrata za období v haléřích
type: integer
totalCalories:
description: Celkový součet kalorií za období v kcal
type: integer
entryCount:
description: Počet záznamů o jídle v období
type: integer
dayCount:
description: Počet dní, ve kterých je alespoň jeden záznam
type: integer
byDay:
description: Součty po dnech, vzestupně dle data
type: array
items:
$ref: "#/PeriodTotal"
byMonth:
description: Součty po měsících, vzestupně
type: array
items:
$ref: "#/PeriodTotal"
byYear:
description: Součty po letech, vzestupně
type: array
items:
$ref: "#/PeriodTotal"
byMealType:
description: Součty dle typu jídla, sestupně dle útraty
type: array
items:
$ref: "#/GroupTotal"
bySource:
description: Součty dle zdroje jídla, sestupně dle útraty
type: array
items:
$ref: "#/GroupTotal"
ImportRequest:
description: Požadavek na import přehledu z Luncheru
type: object
additionalProperties: false
required:
- fileName
- content
properties:
fileName:
description: Původní název souboru — určuje formát (.xlsx, .csv, .json)
type: string
content:
description: Obsah souboru zakódovaný v Base64
type: string
defaultMealType:
description: |
Typ jídla, pod kterým se importované řádky založí.
Luncher řeší výběr obědů, takže výchozí hodnota je OBED.
allOf:
- $ref: "#/MealType"
dryRun:
description: |
Pokud je true, import se pouze vyhodnotí a vrátí náhled, ale nic se neuloží.
type: boolean
ImportResult:
description: Výsledek (nebo náhled) importu přehledu z Luncheru
type: object
additionalProperties: false
required:
- dryRun
- format
- rowCount
- imported
- skipped
- days
- totalPrice
- entries
- warnings
properties:
dryRun:
description: True, pokud šlo pouze o náhled a data se neuložila
type: boolean
format:
description: Rozpoznaný formát vstupního souboru
type: string
enum: [xlsx, csv, json]
rowCount:
description: Počet řádků nalezených v souboru
type: integer
imported:
description: Počet záznamů, které import založil (u náhledu by založil)
type: integer
skipped:
description: Počet přeskočených řádků, protože už z dřívějšího importu existují
type: integer
days:
description: Dny (YYYY-MM-DD), kterých se import dotkl, vzestupně
type: array
items:
type: string
format: date
totalPrice:
description: Součet cen importovaných záznamů v haléřích
type: integer
entries:
description: Záznamy, které import založil (u náhledu založí)
type: array
items:
$ref: "#/MealEntry"
warnings:
description: Upozornění na řádky, které se nepodařilo zpracovat
type: array
items:
type: string
Config:
description: Veřejná runtime konfigurace pro klienta
type: object
additionalProperties: false
required:
- sentry
properties:
sentry:
type: object
additionalProperties: false
required:
- dsn
- environment
properties:
dsn:
type: string
nullable: true
environment:
type: string
CalorieSuggestion:
description: Návrh energetické hodnoty pro jídlo
type: object
additionalProperties: false
required:
- name
- caloriesPer100g
- origin
properties:
name:
description: Název nalezené potraviny
type: string
caloriesPer100g:
description: Energetická hodnota na 100 g v kcal
type: integer
origin:
description: |
Odkud návrh pochází — "library" je dřívější vlastní zadání uživatele,
ostatní hodnoty označují externího poskytovatele.
type: string
brand:
description: Značka nebo výrobce, pokud je známý
type: string
CalorieSearchResult:
description: Výsledek hledání energetické hodnoty pro název jídla
type: object
additionalProperties: false
required:
- query
- providerAvailable
- suggestions
- externalSearchUrl
properties:
query:
description: Hledaný název
type: string
providerAvailable:
description: |
False, pokud je externí poskytovatel nedostupný. Návrhy z vlastní
knihovny se vrací i tak — hledání kvůli tomu neselže.
type: boolean
providerName:
description: Název externího poskytovatele, který návrhy dodal
type: string
suggestions:
description: Nalezené návrhy, nejdřív z vlastní knihovny
type: array
items:
$ref: "#/CalorieSuggestion"
externalSearchUrl:
description: |
Odkaz na tabulku potravin na KalorickéTabulky.cz. Otevírá se uživateli
v novém panelu — hodnoty se odtud nestahují automaticky. Předvyplnit
hledání nejde, jejich vyhledávání běží v JavaScriptu a parametry v URL
ignoruje, proto klient název jídla kopíruje do schránky.
type: string
SourceRate:
description: Cena za 100 g u jednoho zdroje jídla
type: object
additionalProperties: false
required:
- source
- pricePer100g
properties:
source:
description: Název zdroje (podniku), např. "TechTower"
type: string
pricePer100g:
description: Cena za 100 g v haléřích
type: integer
UserSettings:
description: Uživatelské nastavení aplikace
type: object
additionalProperties: false
required:
- sourceRates
properties:
sourceRates:
description: |
Ceny za 100 g u podniků, které účtují podle váhy. Slouží jako výchozí
hodnota při zadávání jídla; u konkrétního jídla jde sazbu přepsat.
type: array
items:
$ref: "#/SourceRate"
basalCalories:
description: |
Klidový výdej (bazální metabolismus) v kcal za den. Bez něj se bilance dne
počítá jen jako jídlo proti pohybu a nejde o skutečný deficit.
type: integer
ActivityUnit:
description: Jednotka, ve které se aktivita měří
type: string
enum:
- KROKY
- MINUTY
- KM
- OPAKOVANI
ActivityEntry:
description: Jedna pohybová aktivita v konkrétní den
type: object
additionalProperties: false
required:
- id
- date
- name
- unit
- quantity
- createdAt
properties:
id:
description: Identifikátor záznamu (UUID)
type: string
date:
description: Datum aktivity ve formátu YYYY-MM-DD
type: string
format: date
name:
description: Název aktivity (Chůze, Kliky, Běh, ...)
type: string
unit:
$ref: "#/ActivityUnit"
quantity:
description: Množství v dané jednotce — počet kroků, minut, kilometrů nebo opakování
type: integer
caloriesPer100Units:
description: |
Spálené kcal na 100 jednotek. Pro kroky vychází kolem 4 (tj. 400 kcal
za 10 000 kroků), u minut běhu kolem 1000. Sto jednotek se používá kvůli
celým číslům — stejná konvence jako u energie jídla na 100 g.
type: integer
calories:
description: |
Spálené kcal. Pokud je vyplněné caloriesPer100Units, dopočte se z množství;
jinak platí ručně zadaná hodnota.
type: integer
note:
description: Poznámka uživatele k aktivitě
type: string
templateId:
description: Identifikátor šablony, ze které aktivita vznikla
type: string
createdAt:
description: Čas vzniku záznamu
type: string
format: date-time
updatedAt:
description: Čas poslední úpravy záznamu
type: string
format: date-time
ActivityInput:
description: Data pro založení nebo úpravu aktivity
type: object
additionalProperties: false
required:
- date
- name
- unit
- quantity
properties:
date:
type: string
format: date
name:
type: string
unit:
$ref: "#/ActivityUnit"
quantity:
description: Množství v dané jednotce
type: integer
caloriesPer100Units:
description: Spálené kcal na 100 jednotek
type: integer
nullable: true
calories:
description: Spálené kcal. Ignoruje se, pokud jde dopočíst z množství.
type: integer
nullable: true
note:
type: string
nullable: true
ActivityDay:
description: Přehled pohybu jednoho dne včetně součtu
type: object
additionalProperties: false
required:
- date
- entries
- totalCalories
properties:
date:
type: string
format: date
entries:
description: Aktivity daného dne, nejstarší první
type: array
items:
$ref: "#/ActivityEntry"
totalCalories:
description: Součet spálených kcal za den
type: integer
WorkoutTemplateItem:
description: Jedna položka šablony tréninku
type: object
additionalProperties: false
required:
- name
- unit
- quantity
properties:
name:
type: string
unit:
$ref: "#/ActivityUnit"
quantity:
type: integer
caloriesPer100Units:
type: integer
WorkoutTemplate:
description: |
Předpřipravený trénink. Použitím se jeho položky založí do zvoleného dne,
takže opakovaný trénink není potřeba zadávat cvik po cviku znovu.
type: object
additionalProperties: false
required:
- id
- name
- items
- estimatedCalories
properties:
id:
type: string
name:
description: Název šablony, např. "Workout day 1"
type: string
items:
type: array
items:
$ref: "#/WorkoutTemplateItem"
estimatedCalories:
description: Odhad spálených kcal za celou šablonu
type: integer
EnergyBalance:
description: Energetická bilance dne — kolik přišlo jídlem a kolik se vydalo
type: object
additionalProperties: false
required:
- intake
- activityBurn
- basal
- totalBurn
- balance
- hasBasal
properties:
intake:
description: Přijaté kcal z jídla
type: integer
activityBurn:
description: Spálené kcal pohybem
type: integer
basal:
description: |
Klidový výdej (bazální metabolismus) v kcal za den z nastavení.
Nula, pokud si ho uživatel nenastavil.
type: integer
totalBurn:
description: Celkový výdej, tedy klidový výdej plus pohyb
type: integer
balance:
description: |
Rozdíl příjmu a výdeje v kcal. Záporná hodnota znamená deficit,
kladná přebytek.
type: integer
hasBasal:
description: |
False, pokud uživatel nemá nastavený klidový výdej. Bilance pak
porovnává jen jídlo proti pohybu a není to skutečný deficit.
type: boolean
DayOverview:
description: Kompletní přehled dne — jídlo, pohyb a jejich bilance
type: object
additionalProperties: false
required:
- date
- meals
- activities
- energy
properties:
date:
type: string
format: date
meals:
$ref: "#/DayRecord"
activities:
$ref: "#/ActivityDay"
energy:
$ref: "#/EnergyBalance"
+12
View File
@@ -0,0 +1,12 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"skipLibCheck": true,
"esModuleInterop": true,
"noEmit": true
},
"include": ["*.ts", "gen/**/*"]
}
+309
View File
@@ -0,0 +1,309 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@hey-api/client-fetch@^0.8.2":
version "0.8.4"
resolved "https://registry.yarnpkg.com/@hey-api/client-fetch/-/client-fetch-0.8.4.tgz#2dc2d368b4dd2137789f46adcae68ccd04ea2adb"
integrity sha512-SWtUjVEFIUdiJGR2NiuF0njsSrSdTe7WHWkp3BLH3DEl2bRhiflOnBo29NSDdrY90hjtTQiTQkBxUgGOF29Xzg==
"@hey-api/json-schema-ref-parser@1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.0.3.tgz#d20ed12edcbe679540af2647fb28ed61b7fbca7e"
integrity sha512-jgyNFPUReGpdB0ihWv6m+Q3dcawtXx4t6cvi0NS4xxblulcCfEjThP5xVwShFiTRScckIQ/GsuZv20arRTIDkg==
dependencies:
"@jsdevtools/ono" "^7.1.3"
"@types/json-schema" "^7.0.15"
js-yaml "^4.1.0"
"@hey-api/openapi-ts@^0.64.7":
version "0.64.15"
resolved "https://registry.yarnpkg.com/@hey-api/openapi-ts/-/openapi-ts-0.64.15.tgz#655e8ee4039f9f190244e72595bcfee0adf43ad6"
integrity sha512-bXpi9z3YEPVt9bVqlFA3hHmgDzfM8ID5kjnXR7t6PFxlmqo8CH8Y8aCNP7rMk1q7MXk42y2CXC2ehbU9cthCyw==
dependencies:
"@hey-api/json-schema-ref-parser" "1.0.3"
c12 "2.0.1"
commander "13.0.0"
handlebars "4.7.8"
"@jsdevtools/ono@^7.1.3":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796"
integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==
"@types/json-schema@^7.0.15":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
acorn@^8.16.0:
version "8.18.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940"
integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
c12@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/c12/-/c12-2.0.1.tgz#5702d280b31a08abba39833494c9b1202f0f5aec"
integrity sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==
dependencies:
chokidar "^4.0.1"
confbox "^0.1.7"
defu "^6.1.4"
dotenv "^16.4.5"
giget "^1.2.3"
jiti "^2.3.0"
mlly "^1.7.1"
ohash "^1.1.4"
pathe "^1.1.2"
perfect-debounce "^1.0.0"
pkg-types "^1.2.0"
rc9 "^2.1.2"
chokidar@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
dependencies:
readdirp "^4.0.1"
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
citty@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4"
integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==
dependencies:
consola "^3.2.3"
commander@13.0.0:
version "13.0.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-13.0.0.tgz#1b161f60ee3ceb8074583a0f95359a4f8701845c"
integrity sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==
confbox@^0.1.7, confbox@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06"
integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
consola@^3.2.3, consola@^3.4.0:
version "3.4.2"
resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7"
integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==
defu@^6.1.4:
version "6.1.7"
resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.7.tgz#72543567c8e9f97ff13ce402b6dbe09ac5ae4d23"
integrity sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==
destr@^2.0.3:
version "2.0.5"
resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb"
integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==
dotenv@^16.4.5:
version "16.6.1"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020"
integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
dependencies:
minipass "^3.0.0"
giget@^1.2.3:
version "1.2.5"
resolved "https://registry.yarnpkg.com/giget/-/giget-1.2.5.tgz#0bd4909356a0da75cc1f2b33538f93adec0d202f"
integrity sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==
dependencies:
citty "^0.1.6"
consola "^3.4.0"
defu "^6.1.4"
node-fetch-native "^1.6.6"
nypm "^0.5.4"
pathe "^2.0.3"
tar "^6.2.1"
handlebars@4.7.8:
version "4.7.8"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9"
integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==
dependencies:
minimist "^1.2.5"
neo-async "^2.6.2"
source-map "^0.6.1"
wordwrap "^1.0.0"
optionalDependencies:
uglify-js "^3.1.4"
jiti@^2.3.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64"
integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==
js-yaml@^4.1.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.2.tgz#8e44fb14a2643c59726bb15787b5f1512cb3d3fb"
integrity sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==
dependencies:
argparse "^2.0.1"
minimist@^1.2.5:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
minipass@^3.0.0:
version "3.3.6"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
dependencies:
yallist "^4.0.0"
minipass@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
dependencies:
minipass "^3.0.0"
yallist "^4.0.0"
mkdirp@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
mlly@^1.7.1, mlly@^1.7.4:
version "1.8.2"
resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.2.tgz#e7f7919a82d13b174405613117249a3f449d78bb"
integrity sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==
dependencies:
acorn "^8.16.0"
pathe "^2.0.3"
pkg-types "^1.3.1"
ufo "^1.6.3"
neo-async@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
node-fetch-native@^1.6.6:
version "1.6.7"
resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz#9d09ca63066cc48423211ed4caf5d70075d76a71"
integrity sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==
nypm@^0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.5.4.tgz#a5ab0d8d37f96342328479f88ef58699f29b3051"
integrity sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==
dependencies:
citty "^0.1.6"
consola "^3.4.0"
pathe "^2.0.3"
pkg-types "^1.3.1"
tinyexec "^0.3.2"
ufo "^1.5.4"
ohash@^1.1.4:
version "1.1.6"
resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.6.tgz#9ff7b0271d7076290794537d68ec2b40a60d133e"
integrity sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==
pathe@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec"
integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
pathe@^2.0.1, pathe@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716"
integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
perfect-debounce@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
pkg-types@^1.2.0, pkg-types@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df"
integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==
dependencies:
confbox "^0.1.8"
mlly "^1.7.4"
pathe "^2.0.1"
rc9@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d"
integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==
dependencies:
defu "^6.1.4"
destr "^2.0.3"
readdirp@^4.0.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
tar@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
minipass "^5.0.0"
minizlib "^2.1.1"
mkdirp "^1.0.3"
yallist "^4.0.0"
tinyexec@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2"
integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==
typescript@^5.9.3:
version "5.9.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
ufo@^1.5.4, ufo@^1.6.3:
version "1.6.4"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.4.tgz#7a8fb875fcc6382d2c7d0b3692738b0500a92467"
integrity sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==
uglify-js@^3.1.4:
version "3.19.3"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"
integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==
wordwrap@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==