From 9b2bf2c4cf5d094405cf5fc048df9e14ff409dfe Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 12:57:01 +0530 Subject: [PATCH 01/68] refactor: move current home page to dashboard and add a landing page --- src/routes/+page.server.ts | 21 +++----------- src/routes/+page.svelte | 28 +------------------ .../(components)}/GetStartedComponent.svelte | 0 .../(components)}/TodaysWorkoutCard.svelte | 0 .../WorkoutProgressionChart.svelte | 0 src/routes/dashboard/+page.server.ts | 20 +++++++++++++ src/routes/dashboard/+page.svelte | 25 +++++++++++++++++ .../MesocycleWorkoutsCharts.svelte | 2 +- 8 files changed, 51 insertions(+), 45 deletions(-) rename src/routes/{(components)/page => dashboard/(components)}/GetStartedComponent.svelte (100%) rename src/routes/{(components)/page => dashboard/(components)}/TodaysWorkoutCard.svelte (100%) rename src/routes/{(components)/page => dashboard/(components)}/WorkoutProgressionChart.svelte (100%) create mode 100644 src/routes/dashboard/+page.server.ts create mode 100644 src/routes/dashboard/+page.svelte diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 3c63b88d..505f3442 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,19 +1,6 @@ -import { createContext } from '$lib/trpc/context'; -import { createCaller } from '$lib/trpc/router'; +import { redirect } from '@sveltejs/kit'; -export const load = async (event) => { - event.depends('workouts:all'); - const session = await event.locals.auth(); - - if (session === null) { - return { todaysWorkoutData: null }; - } - - const trpc = createCaller(await createContext(event)); - - return { - todaysWorkoutData: trpc.workouts.getTodaysWorkoutData(), - pastWorkouts: trpc.mesocycles.getWorkouts('nextSplitDay'), - entityCounts: trpc.users.getEntityCounts() - }; +export const load = async ({ parent }) => { + const { session } = await parent(); + if (session) redirect(302, '/dashboard'); }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e31aa94a..b943ab4d 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,27 +1 @@ - - -

Home

- - -{#if data.todaysWorkoutData} -

Today's workout

- -{/if} +LANDING PAGE diff --git a/src/routes/(components)/page/GetStartedComponent.svelte b/src/routes/dashboard/(components)/GetStartedComponent.svelte similarity index 100% rename from src/routes/(components)/page/GetStartedComponent.svelte rename to src/routes/dashboard/(components)/GetStartedComponent.svelte diff --git a/src/routes/(components)/page/TodaysWorkoutCard.svelte b/src/routes/dashboard/(components)/TodaysWorkoutCard.svelte similarity index 100% rename from src/routes/(components)/page/TodaysWorkoutCard.svelte rename to src/routes/dashboard/(components)/TodaysWorkoutCard.svelte diff --git a/src/routes/(components)/page/WorkoutProgressionChart.svelte b/src/routes/dashboard/(components)/WorkoutProgressionChart.svelte similarity index 100% rename from src/routes/(components)/page/WorkoutProgressionChart.svelte rename to src/routes/dashboard/(components)/WorkoutProgressionChart.svelte diff --git a/src/routes/dashboard/+page.server.ts b/src/routes/dashboard/+page.server.ts new file mode 100644 index 00000000..bde9acd3 --- /dev/null +++ b/src/routes/dashboard/+page.server.ts @@ -0,0 +1,20 @@ +import { createContext } from '$lib/trpc/context'; +import { createCaller } from '$lib/trpc/router'; +import { redirect } from '@sveltejs/kit'; + +export const load = async (event) => { + event.depends('workouts:all'); + const session = await event.locals.auth(); + + if (session === null) { + redirect(302, '/'); + } + + const trpc = createCaller(await createContext(event)); + + return { + todaysWorkoutData: trpc.workouts.getTodaysWorkoutData(), + pastWorkouts: trpc.mesocycles.getWorkouts('nextSplitDay'), + entityCounts: trpc.users.getEntityCounts() + }; +}; diff --git a/src/routes/dashboard/+page.svelte b/src/routes/dashboard/+page.svelte new file mode 100644 index 00000000..9b154429 --- /dev/null +++ b/src/routes/dashboard/+page.svelte @@ -0,0 +1,25 @@ + + +

Home

+ + +

Today's workout

+ diff --git a/src/routes/mesocycles/[mesocycleId]/(components)/MesocycleWorkoutsCharts.svelte b/src/routes/mesocycles/[mesocycleId]/(components)/MesocycleWorkoutsCharts.svelte index a8b48b77..4f1493de 100644 --- a/src/routes/mesocycles/[mesocycleId]/(components)/MesocycleWorkoutsCharts.svelte +++ b/src/routes/mesocycles/[mesocycleId]/(components)/MesocycleWorkoutsCharts.svelte @@ -2,7 +2,7 @@ import * as Select from '$lib/components/ui/select'; import * as Card from '$lib/components/ui/card'; import type { Selected } from 'bits-ui'; - import WorkoutProgressionChart from '../../../(components)/page/WorkoutProgressionChart.svelte'; + import WorkoutProgressionChart from '../../../dashboard/(components)/WorkoutProgressionChart.svelte'; import type { RouterOutputs } from '$lib/trpc/router'; let { mesocycle }: { mesocycle: NonNullable } = $props(); From 2cc6b203befcf4815d19b100aec50521db204971 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 14:15:24 +0530 Subject: [PATCH 02/68] feat: added carousel component --- package-lock.json | 39 ++++++++ package.json | 2 + .../ui/carousel/carousel-content.svelte | 35 +++++++ .../ui/carousel/carousel-item.svelte | 25 +++++ .../ui/carousel/carousel-next.svelte | 39 ++++++++ .../ui/carousel/carousel-previous.svelte | 40 ++++++++ .../components/ui/carousel/carousel.svelte | 99 +++++++++++++++++++ src/lib/components/ui/carousel/context.ts | 56 +++++++++++ src/lib/components/ui/carousel/index.ts | 5 + 9 files changed, 340 insertions(+) create mode 100644 src/lib/components/ui/carousel/carousel-content.svelte create mode 100644 src/lib/components/ui/carousel/carousel-item.svelte create mode 100644 src/lib/components/ui/carousel/carousel-next.svelte create mode 100644 src/lib/components/ui/carousel/carousel-previous.svelte create mode 100644 src/lib/components/ui/carousel/carousel.svelte create mode 100644 src/lib/components/ui/carousel/context.ts create mode 100644 src/lib/components/ui/carousel/index.ts diff --git a/package-lock.json b/package-lock.json index 0433137c..e0934b24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,8 @@ "chart.js": "^4.4.3", "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", + "embla-carousel-svelte": "^8.3.0", + "lucide-svelte": "^0.452.0", "mode-watcher": "^0.4.0", "paneforge": "^0.0.6", "posthog-js": "^1.160.3", @@ -4795,6 +4797,34 @@ "dev": true, "license": "ISC" }, + "node_modules/embla-carousel": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.3.0.tgz", + "integrity": "sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA==", + "license": "MIT" + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.3.0.tgz", + "integrity": "sha512-EYdhhJ302SC4Lmkx8GRsp0sjUhEN4WyFXPOk0kGu9OXZSRMmcBlRgTvHcq8eKJE1bXWBsOi1T83B+BSSVZSmwQ==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.3.0" + } + }, + "node_modules/embla-carousel-svelte": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/embla-carousel-svelte/-/embla-carousel-svelte-8.3.0.tgz", + "integrity": "sha512-FW5fYpY8V2/2zkqaDv3v+Hw+c1tD0B00oK3YfZhnDggTwjt/rvv45muv2tbKrLkpLrW0+4s8UNAWscKiXJRETg==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.3.0", + "embla-carousel-reactive-utils": "8.3.0" + }, + "peerDependencies": { + "svelte": "^3.49.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6835,6 +6865,15 @@ "license": "ISC", "peer": true }, + "node_modules/lucide-svelte": { + "version": "0.452.0", + "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.452.0.tgz", + "integrity": "sha512-Nnt+8ljOyQ1P/k+lWKUAS13tT0hn2vVtgE7/zbVI8tiorY/aaeIkhRzY0MdVHogwEavr9VNEpQUGVBEFVicPzA==", + "license": "ISC", + "peerDependencies": { + "svelte": "^3 || ^4 || ^5.0.0-next.42" + } + }, "node_modules/magic-string": { "version": "0.30.12", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", diff --git a/package.json b/package.json index edb74f47..734d5a9a 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,8 @@ "chart.js": "^4.4.3", "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", + "embla-carousel-svelte": "^8.3.0", + "lucide-svelte": "^0.452.0", "mode-watcher": "^0.4.0", "paneforge": "^0.0.6", "posthog-js": "^1.160.3", diff --git a/src/lib/components/ui/carousel/carousel-content.svelte b/src/lib/components/ui/carousel/carousel-content.svelte new file mode 100644 index 00000000..bc85456b --- /dev/null +++ b/src/lib/components/ui/carousel/carousel-content.svelte @@ -0,0 +1,35 @@ + + +
+
+ +
+
diff --git a/src/lib/components/ui/carousel/carousel-item.svelte b/src/lib/components/ui/carousel/carousel-item.svelte new file mode 100644 index 00000000..3d0fdfbb --- /dev/null +++ b/src/lib/components/ui/carousel/carousel-item.svelte @@ -0,0 +1,25 @@ + + +
+ +
diff --git a/src/lib/components/ui/carousel/carousel-next.svelte b/src/lib/components/ui/carousel/carousel-next.svelte new file mode 100644 index 00000000..c6f2e297 --- /dev/null +++ b/src/lib/components/ui/carousel/carousel-next.svelte @@ -0,0 +1,39 @@ + + + diff --git a/src/lib/components/ui/carousel/carousel-previous.svelte b/src/lib/components/ui/carousel/carousel-previous.svelte new file mode 100644 index 00000000..bd3169b7 --- /dev/null +++ b/src/lib/components/ui/carousel/carousel-previous.svelte @@ -0,0 +1,40 @@ + + + diff --git a/src/lib/components/ui/carousel/carousel.svelte b/src/lib/components/ui/carousel/carousel.svelte new file mode 100644 index 00000000..9357808e --- /dev/null +++ b/src/lib/components/ui/carousel/carousel.svelte @@ -0,0 +1,99 @@ + + +
+ +
diff --git a/src/lib/components/ui/carousel/context.ts b/src/lib/components/ui/carousel/context.ts new file mode 100644 index 00000000..c90b4cb8 --- /dev/null +++ b/src/lib/components/ui/carousel/context.ts @@ -0,0 +1,56 @@ +import type { EmblaCarouselSvelteType } from "embla-carousel-svelte"; +import type emblaCarouselSvelte from "embla-carousel-svelte"; +import { getContext, hasContext, setContext } from "svelte"; +import type { HTMLAttributes } from "svelte/elements"; +import type { Readable, Writable } from "svelte/store"; + +export type CarouselAPI = + NonNullable["on:emblaInit"]> extends ( + evt: CustomEvent + ) => void + ? CarouselAPI + : never; + +type EmblaCarouselConfig = NonNullable[1]>; + +export type CarouselOptions = EmblaCarouselConfig["options"]; +export type CarouselPlugins = EmblaCarouselConfig["plugins"]; + +//// + +export type CarouselProps = { + opts?: CarouselOptions; + plugins?: CarouselPlugins; + api?: CarouselAPI; + orientation?: "horizontal" | "vertical"; +} & HTMLAttributes; + +const EMBLA_CAROUSEL_CONTEXT = Symbol("EMBLA_CAROUSEL_CONTEXT"); + +type EmblaContext = { + api: Writable; + orientation: Writable<"horizontal" | "vertical">; + scrollNext: () => void; + scrollPrev: () => void; + canScrollNext: Readable; + canScrollPrev: Readable; + handleKeyDown: (e: KeyboardEvent) => void; + options: Writable; + plugins: Writable; + onInit: (e: CustomEvent) => void; + scrollTo: (index: number, jump?: boolean) => void; + scrollSnaps: Readable; + selectedIndex: Readable; +}; + +export function setEmblaContext(config: EmblaContext): EmblaContext { + setContext(EMBLA_CAROUSEL_CONTEXT, config); + return config; +} + +export function getEmblaContext(name = "This component") { + if (!hasContext(EMBLA_CAROUSEL_CONTEXT)) { + throw new Error(`${name} must be used within a component`); + } + return getContext>(EMBLA_CAROUSEL_CONTEXT); +} diff --git a/src/lib/components/ui/carousel/index.ts b/src/lib/components/ui/carousel/index.ts new file mode 100644 index 00000000..78102bf7 --- /dev/null +++ b/src/lib/components/ui/carousel/index.ts @@ -0,0 +1,5 @@ +export { default as Root } from "./carousel.svelte"; +export { default as Content } from "./carousel-content.svelte"; +export { default as Item } from "./carousel-item.svelte"; +export { default as Previous } from "./carousel-previous.svelte"; +export { default as Next } from "./carousel-next.svelte"; From 36b64d8af4dfd9a029d26bdbdeb93c3ce1879cc9 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 15:44:41 +0530 Subject: [PATCH 03/68] feat: added some screenshots for landing page --- .../dark/MicrocycleVolumeDistributionChart.png | Bin 0 -> 16666 bytes .../dark/MuscleGroupVolumeDistributionChart.png | Bin 0 -> 28581 bytes static/screenshots/dark/SplitDayChart.png | Bin 0 -> 28964 bytes .../light/MicrocycleVolumeDistributionChart.png | Bin 0 -> 15849 bytes .../MuscleGroupVolumeDistributionChart.png | Bin 0 -> 26847 bytes static/screenshots/light/SplitDayChart.png | Bin 0 -> 27306 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/screenshots/dark/MicrocycleVolumeDistributionChart.png create mode 100644 static/screenshots/dark/MuscleGroupVolumeDistributionChart.png create mode 100644 static/screenshots/dark/SplitDayChart.png create mode 100644 static/screenshots/light/MicrocycleVolumeDistributionChart.png create mode 100644 static/screenshots/light/MuscleGroupVolumeDistributionChart.png create mode 100644 static/screenshots/light/SplitDayChart.png diff --git a/static/screenshots/dark/MicrocycleVolumeDistributionChart.png b/static/screenshots/dark/MicrocycleVolumeDistributionChart.png new file mode 100644 index 0000000000000000000000000000000000000000..055a39a8ddc89131a3a03e017ac77ce36676752d GIT binary patch literal 16666 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 literal 0 HcmV?d00001 diff --git a/static/screenshots/dark/MuscleGroupVolumeDistributionChart.png b/static/screenshots/dark/MuscleGroupVolumeDistributionChart.png new file mode 100644 index 0000000000000000000000000000000000000000..202d89eec511b607d79a0bcfb7800cc148a3744d GIT binary patch literal 28581 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

W%ayZ*8h9J7TX1o4Y; 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 a1#?ZyK|vWNC$O{O1vTZz4=a?c!~Y9>Eb=`7 literal 0 HcmV?d00001 diff --git a/static/screenshots/light/MicrocycleVolumeDistributionChart.png b/static/screenshots/light/MicrocycleVolumeDistributionChart.png new file mode 100644 index 0000000000000000000000000000000000000000..12a8c23efc2ac8ddf3b5dcd0e3cfda3a6d9ccc5e GIT binary patch literal 15849 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 Inh#(6Z}3Gfa{vGU literal 0 HcmV?d00001 diff --git a/static/screenshots/light/MuscleGroupVolumeDistributionChart.png b/static/screenshots/light/MuscleGroupVolumeDistributionChart.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2389591dd116bea7345d4dfe02c4f37c0a2ae9 GIT binary patch literal 26847 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 literal 0 HcmV?d00001 diff --git a/static/screenshots/light/SplitDayChart.png b/static/screenshots/light/SplitDayChart.png new file mode 100644 index 0000000000000000000000000000000000000000..4c801475269bf108f42fa0880a0adfab0ab45883 GIT binary patch literal 27306 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 TmWvr|;LqU3?dxS%9mD?vZP83Y literal 0 HcmV?d00001 From f6abfde15d8a792be0a23424d64b1ef6c2022470 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 15:45:24 +0530 Subject: [PATCH 04/68] feat: get basic stats in landing page and use different components for mobile and desktop --- .../page/DesktopLandingPage.svelte | 1 + .../page/MobileLandingPage.svelte | 84 +++++++++++++++++++ src/routes/+page.server.ts | 13 +++ src/routes/+page.svelte | 22 ++++- 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 src/routes/(components)/page/DesktopLandingPage.svelte create mode 100644 src/routes/(components)/page/MobileLandingPage.svelte diff --git a/src/routes/(components)/page/DesktopLandingPage.svelte b/src/routes/(components)/page/DesktopLandingPage.svelte new file mode 100644 index 00000000..2fd9f957 --- /dev/null +++ b/src/routes/(components)/page/DesktopLandingPage.svelte @@ -0,0 +1 @@ +TBD \ No newline at end of file diff --git a/src/routes/(components)/page/MobileLandingPage.svelte b/src/routes/(components)/page/MobileLandingPage.svelte new file mode 100644 index 00000000..891d67af --- /dev/null +++ b/src/routes/(components)/page/MobileLandingPage.svelte @@ -0,0 +1,84 @@ + + +

+ + Free science-based workout tracking + + + With automatic progression, detailed statistics, and highly customizable + + + + + SplitDayChart + + + MicrocycleVolumeDistributionChart + + + MuscleGroupVolumeDistributionChart + + + + + +
+
+ + + Workouts + + + {#await counts.workoutCount} + + {:then workoutCount} +
{workoutCount}
+ {/await} +
+
+ + + Exercises + + + {#await counts.exerciseCount} + + {:then exerciseCount} +
{exerciseCount}
+ {/await} +
+
+ + + Sets + + + {#await counts.setsCount} + + {:then setsCount} +
{setsCount}
+ {/await} +
+
+
+ have been logged already! +
+ +
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 505f3442..027540ff 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,6 +1,19 @@ +import { prisma } from '$lib/prisma.js'; import { redirect } from '@sveltejs/kit'; export const load = async ({ parent }) => { const { session } = await parent(); if (session) redirect(302, '/dashboard'); + + return { + workoutCount: prisma.workout.count(), + exerciseCount: prisma.workoutExercise.count(), + setsCount: prisma.workoutExerciseSet.count() + }; +}; + +export type HomePageCounts = { + workoutCount: Promise; + exerciseCount: Promise; + setsCount: Promise; }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index b943ab4d..155f461f 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1 +1,21 @@ -LANDING PAGE + + +{#if isMobile === true} + +{:else if isMobile === false} + +{/if} From 678d249ee56edf647f45c3e4888015eeab93de8e Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:02:14 +0530 Subject: [PATCH 05/68] fix: show GitHub instead of Github --- src/routes/(components)/layout/LoginProviderMenu.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/(components)/layout/LoginProviderMenu.svelte b/src/routes/(components)/layout/LoginProviderMenu.svelte index 69035d73..0b6743e8 100644 --- a/src/routes/(components)/layout/LoginProviderMenu.svelte +++ b/src/routes/(components)/layout/LoginProviderMenu.svelte @@ -6,17 +6,17 @@ import { signIn } from '@auth/sveltekit/client'; const providerList = [ - { name: 'google', logo: GoogleIcon }, - { name: 'github', logo: GitHubIcon } + { name: 'google', logo: GoogleIcon, displayName: 'Google' }, + { name: 'github', logo: GitHubIcon, displayName: 'GitHub' } ]; - {#each providerList as { name, logo }} + {#each providerList as { name, logo, displayName }} signIn(name, { callbackUrl: $page.url.pathname })}> - {name} + {displayName} {/each} From 9ddcb59840a8278ae4b112dbf174babad28e8c72 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:03:24 +0530 Subject: [PATCH 06/68] feat: add GitHub stars button and link --- .../page/MobileLandingPage.svelte | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/routes/(components)/page/MobileLandingPage.svelte b/src/routes/(components)/page/MobileLandingPage.svelte index 891d67af..db5bb65d 100644 --- a/src/routes/(components)/page/MobileLandingPage.svelte +++ b/src/routes/(components)/page/MobileLandingPage.svelte @@ -3,10 +3,23 @@ import type { HomePageCounts } from '../../+page.server'; import * as Card from '$lib/components/ui/card'; import * as Carousel from '$lib/components/ui/carousel/index.js'; + import * as DropdownMenu from '$lib/components/ui/dropdown-menu'; import Skeleton from '$lib/components/ui/skeleton/skeleton.svelte'; import { mode } from 'mode-watcher'; + import LoginProviderMenu from '../layout/LoginProviderMenu.svelte'; + import GitHub from 'virtual:icons/lucide/github'; + import Star from 'virtual:icons/lucide/star'; + import { Badge } from '$lib/components/ui/badge'; + import { onMount } from 'svelte'; let counts: HomePageCounts = $props(); + let stars: number | undefined = $state(); + + onMount(async () => { + const response = await fetch('https://api.github.com/repos/WhyAsh5114/MyFit'); + const body = await response.json(); + stars = body.stargazers_count; + });
@@ -80,5 +93,25 @@
have been logged already! - + +
+ + + + + + + +
From 86ccfed45673ec69567abc191e9613b22eff37c1 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:13:49 +0530 Subject: [PATCH 07/68] feat: added accordion component --- package-lock.json | 2 +- package.json | 2 +- .../ui/accordion/accordion-content.svelte | 25 ++++++++++++++++++ .../ui/accordion/accordion-item.svelte | 14 ++++++++++ .../ui/accordion/accordion-trigger.svelte | 26 +++++++++++++++++++ src/lib/components/ui/accordion/index.ts | 17 ++++++++++++ 6 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/lib/components/ui/accordion/accordion-content.svelte create mode 100644 src/lib/components/ui/accordion/accordion-item.svelte create mode 100644 src/lib/components/ui/accordion/accordion-trigger.svelte create mode 100644 src/lib/components/ui/accordion/index.ts diff --git a/package-lock.json b/package-lock.json index e0934b24..da81cf21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@sveltejs/adapter-vercel": "^5.4.1", "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", - "bits-ui": "^0.21.12", + "bits-ui": "^0.21.16", "chart.js": "^4.4.3", "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", diff --git a/package.json b/package.json index 734d5a9a..07680cfe 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@sveltejs/adapter-vercel": "^5.4.1", "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", - "bits-ui": "^0.21.12", + "bits-ui": "^0.21.16", "chart.js": "^4.4.3", "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", diff --git a/src/lib/components/ui/accordion/accordion-content.svelte b/src/lib/components/ui/accordion/accordion-content.svelte new file mode 100644 index 00000000..85e835e8 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-content.svelte @@ -0,0 +1,25 @@ + + + +
+ +
+
diff --git a/src/lib/components/ui/accordion/accordion-item.svelte b/src/lib/components/ui/accordion/accordion-item.svelte new file mode 100644 index 00000000..c9842b0e --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-item.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/src/lib/components/ui/accordion/accordion-trigger.svelte b/src/lib/components/ui/accordion/accordion-trigger.svelte new file mode 100644 index 00000000..11769226 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-trigger.svelte @@ -0,0 +1,26 @@ + + + + svg]:rotate-180", + className + )} + {...$$restProps} + on:click + > + + + + diff --git a/src/lib/components/ui/accordion/index.ts b/src/lib/components/ui/accordion/index.ts new file mode 100644 index 00000000..ed492138 --- /dev/null +++ b/src/lib/components/ui/accordion/index.ts @@ -0,0 +1,17 @@ +import { Accordion as AccordionPrimitive } from "bits-ui"; +import Content from "./accordion-content.svelte"; +import Item from "./accordion-item.svelte"; +import Trigger from "./accordion-trigger.svelte"; +const Root = AccordionPrimitive.Root; + +export { + Root, + Content, + Item, + Trigger, + // + Root as Accordion, + Content as AccordionContent, + Item as AccordionItem, + Trigger as AccordionTrigger, +}; From 5e65e5a54403778f1da9c8772d080b180568d0bf Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:20:07 +0530 Subject: [PATCH 08/68] feat: created desktop landing page --- .../(components)/page/ActionButtons.svelte | 39 +++++++ .../page/CarouselComponent.svelte | 28 +++++ .../page/DesktopLandingPage.svelte | 23 +++- .../page/MobileLandingPage.svelte | 109 +----------------- .../(components)/page/StatsComponent.svelte | 49 ++++++++ src/routes/+page.svelte | 2 +- 6 files changed, 145 insertions(+), 105 deletions(-) create mode 100644 src/routes/(components)/page/ActionButtons.svelte create mode 100644 src/routes/(components)/page/CarouselComponent.svelte create mode 100644 src/routes/(components)/page/StatsComponent.svelte diff --git a/src/routes/(components)/page/ActionButtons.svelte b/src/routes/(components)/page/ActionButtons.svelte new file mode 100644 index 00000000..d5248b4d --- /dev/null +++ b/src/routes/(components)/page/ActionButtons.svelte @@ -0,0 +1,39 @@ + + +
+ + + + + + + +
diff --git a/src/routes/(components)/page/CarouselComponent.svelte b/src/routes/(components)/page/CarouselComponent.svelte new file mode 100644 index 00000000..d4484905 --- /dev/null +++ b/src/routes/(components)/page/CarouselComponent.svelte @@ -0,0 +1,28 @@ + + + + + + SplitDayChart + + + MicrocycleVolumeDistributionChart + + + MuscleGroupVolumeDistributionChart + + + + + diff --git a/src/routes/(components)/page/DesktopLandingPage.svelte b/src/routes/(components)/page/DesktopLandingPage.svelte index 2fd9f957..c68ae2cd 100644 --- a/src/routes/(components)/page/DesktopLandingPage.svelte +++ b/src/routes/(components)/page/DesktopLandingPage.svelte @@ -1 +1,22 @@ -TBD \ No newline at end of file + + +
+
+ + Free science-based workout tracking + + + With automatic progression, detailed statistics, and highly customizable + +
+ + + +
diff --git a/src/routes/(components)/page/MobileLandingPage.svelte b/src/routes/(components)/page/MobileLandingPage.svelte index db5bb65d..71a619db 100644 --- a/src/routes/(components)/page/MobileLandingPage.svelte +++ b/src/routes/(components)/page/MobileLandingPage.svelte @@ -1,25 +1,10 @@
@@ -29,89 +14,7 @@ With automatic progression, detailed statistics, and highly customizable - - - - SplitDayChart - - - MicrocycleVolumeDistributionChart - - - MuscleGroupVolumeDistributionChart - - - - - -
-
- - - Workouts - - - {#await counts.workoutCount} - - {:then workoutCount} -
{workoutCount}
- {/await} -
-
- - - Exercises - - - {#await counts.exerciseCount} - - {:then exerciseCount} -
{exerciseCount}
- {/await} -
-
- - - Sets - - - {#await counts.setsCount} - - {:then setsCount} -
{setsCount}
- {/await} -
-
-
- have been logged already! -
- -
- - - - - - - -
+ + +
diff --git a/src/routes/(components)/page/StatsComponent.svelte b/src/routes/(components)/page/StatsComponent.svelte new file mode 100644 index 00000000..d0f37d3a --- /dev/null +++ b/src/routes/(components)/page/StatsComponent.svelte @@ -0,0 +1,49 @@ + + +
+
+ + + Workouts + + + {#await counts.workoutCount} + + {:then workoutCount} +
{workoutCount}
+ {/await} +
+
+ + + Exercises + + + {#await counts.exerciseCount} + + {:then exerciseCount} +
{exerciseCount}
+ {/await} +
+
+ + + Sets + + + {#await counts.setsCount} + + {:then setsCount} +
{setsCount}
+ {/await} +
+
+
+ have been logged already! +
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 155f461f..3a833f2a 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -17,5 +17,5 @@ {#if isMobile === true} {:else if isMobile === false} - + {/if} From 9897e7bb1a992d63f5e1a04afb15f6e56fb202c8 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:41:08 +0530 Subject: [PATCH 09/68] ui: Reduce carousel buttons spacing --- src/lib/components/ui/carousel/carousel-next.svelte | 2 +- src/lib/components/ui/carousel/carousel-previous.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/ui/carousel/carousel-next.svelte b/src/lib/components/ui/carousel/carousel-next.svelte index c6f2e297..38b916b9 100644 --- a/src/lib/components/ui/carousel/carousel-next.svelte +++ b/src/lib/components/ui/carousel/carousel-next.svelte @@ -25,7 +25,7 @@ class={cn( "absolute h-8 w-8 touch-manipulation rounded-full", $orientation === "horizontal" - ? "-right-12 top-1/2 -translate-y-1/2" + ? "-right-10 top-1/2 -translate-y-1/2" : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90", className )} diff --git a/src/lib/components/ui/carousel/carousel-previous.svelte b/src/lib/components/ui/carousel/carousel-previous.svelte index bd3169b7..01cb2125 100644 --- a/src/lib/components/ui/carousel/carousel-previous.svelte +++ b/src/lib/components/ui/carousel/carousel-previous.svelte @@ -26,7 +26,7 @@ class={cn( "absolute h-8 w-8 touch-manipulation rounded-full", $orientation === "horizontal" - ? "-left-12 top-1/2 -translate-y-1/2" + ? "-left-10 top-1/2 -translate-y-1/2" : "-top-12 left-1/2 -translate-x-1/2 rotate-90", className )} From c7ffe54957bfd15adbe10779ebaeddb6c1b7e65d Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:43:50 +0530 Subject: [PATCH 10/68] feat: Added FAQ component --- .../page/DesktopLandingPage.svelte | 4 +- src/routes/(components)/page/FAQ.svelte | 41 +++++++++++++++++++ .../page/MobileLandingPage.svelte | 4 +- 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/routes/(components)/page/FAQ.svelte diff --git a/src/routes/(components)/page/DesktopLandingPage.svelte b/src/routes/(components)/page/DesktopLandingPage.svelte index c68ae2cd..3b69ca80 100644 --- a/src/routes/(components)/page/DesktopLandingPage.svelte +++ b/src/routes/(components)/page/DesktopLandingPage.svelte @@ -2,12 +2,13 @@ import type { HomePageCounts } from '../../+page.server'; import ActionButtons from './ActionButtons.svelte'; import CarouselComponent from './CarouselComponent.svelte'; + import Faq from './FAQ.svelte'; import StatsComponent from './StatsComponent.svelte'; let counts: HomePageCounts = $props(); -
+
Free science-based workout tracking @@ -19,4 +20,5 @@ +
diff --git a/src/routes/(components)/page/FAQ.svelte b/src/routes/(components)/page/FAQ.svelte new file mode 100644 index 00000000..40a04b6a --- /dev/null +++ b/src/routes/(components)/page/FAQ.svelte @@ -0,0 +1,41 @@ + + +
+ FAQ + + + Is it really free? + + The app is open-source and always will be. It's hosted on Vercel and CockroachDB's free tiers, but if we exceed + limits, it can be run locally by anyone. + + + + How do I download it? + + The app is a PWA, usable as a website or installable on supported platforms via a download icon in the header. + + + + What if I need XYZ? + + Feel free to open an issue + on the GitHub repository! + + + + Does it work offline? + + Not yet. There are plans to make it work offline and we are actively working on it! + + + +
diff --git a/src/routes/(components)/page/MobileLandingPage.svelte b/src/routes/(components)/page/MobileLandingPage.svelte index 71a619db..b0e03d68 100644 --- a/src/routes/(components)/page/MobileLandingPage.svelte +++ b/src/routes/(components)/page/MobileLandingPage.svelte @@ -2,12 +2,13 @@ import type { HomePageCounts } from '../../+page.server'; import ActionButtons from './ActionButtons.svelte'; import CarouselComponent from './CarouselComponent.svelte'; + import Faq from './FAQ.svelte'; import StatsComponent from './StatsComponent.svelte'; let counts: HomePageCounts = $props(); -
+
Free science-based workout tracking @@ -17,4 +18,5 @@ +
From 51620b9985e8e71014a5ca40bab1a857c8c843b9 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 16:58:44 +0530 Subject: [PATCH 11/68] feat: added features component and ensured sufficient contrast between features and stats --- .../page/DesktopLandingPage.svelte | 31 +++++++++++-------- src/routes/(components)/page/Features.svelte | 30 ++++++++++++++++++ .../page/MobileLandingPage.svelte | 2 ++ .../(components)/page/StatsComponent.svelte | 6 ++-- 4 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 src/routes/(components)/page/Features.svelte diff --git a/src/routes/(components)/page/DesktopLandingPage.svelte b/src/routes/(components)/page/DesktopLandingPage.svelte index 3b69ca80..5b209c90 100644 --- a/src/routes/(components)/page/DesktopLandingPage.svelte +++ b/src/routes/(components)/page/DesktopLandingPage.svelte @@ -1,24 +1,29 @@ -
-
- - Free science-based workout tracking - - - With automatic progression, detailed statistics, and highly customizable - + +
+
+ + Free science-based workout tracking + + + With automatic progression, detailed statistics, and highly customizable + +
+ + + + +
- - - - -
+ diff --git a/src/routes/(components)/page/Features.svelte b/src/routes/(components)/page/Features.svelte new file mode 100644 index 00000000..fda7cbbc --- /dev/null +++ b/src/routes/(components)/page/Features.svelte @@ -0,0 +1,30 @@ + + +
+ + + Progression + + Automatically increase reps and load based on your past performances to ensure you're always making progress + + + + + + Stats + + All the charts you can think of! Make well-balanced routines and compare past performances + + + + + + Customizable + + Edit split during mesocycles, override progression for specific exercises, and much more! + + + +
diff --git a/src/routes/(components)/page/MobileLandingPage.svelte b/src/routes/(components)/page/MobileLandingPage.svelte index b0e03d68..67d0bef8 100644 --- a/src/routes/(components)/page/MobileLandingPage.svelte +++ b/src/routes/(components)/page/MobileLandingPage.svelte @@ -3,6 +3,7 @@ import ActionButtons from './ActionButtons.svelte'; import CarouselComponent from './CarouselComponent.svelte'; import Faq from './FAQ.svelte'; + import Features from './Features.svelte'; import StatsComponent from './StatsComponent.svelte'; let counts: HomePageCounts = $props(); @@ -18,5 +19,6 @@ +
diff --git a/src/routes/(components)/page/StatsComponent.svelte b/src/routes/(components)/page/StatsComponent.svelte index d0f37d3a..43f29b11 100644 --- a/src/routes/(components)/page/StatsComponent.svelte +++ b/src/routes/(components)/page/StatsComponent.svelte @@ -8,7 +8,7 @@
- + Workouts @@ -20,7 +20,7 @@ {/await} - + Exercises @@ -32,7 +32,7 @@ {/await} - + Sets From c6b21371cb0a48791fbb3baebca2e4bf9bff570c Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sat, 12 Oct 2024 17:01:57 +0530 Subject: [PATCH 12/68] lint: prettier --- .../ui/accordion/accordion-content.svelte | 16 +++++----- .../ui/accordion/accordion-item.svelte | 10 +++--- .../ui/accordion/accordion-trigger.svelte | 12 +++---- src/lib/components/ui/accordion/index.ts | 10 +++--- .../ui/carousel/carousel-content.svelte | 20 ++++++------ .../ui/carousel/carousel-item.svelte | 14 +++------ .../ui/carousel/carousel-next.svelte | 31 ++++++++----------- .../ui/carousel/carousel-previous.svelte | 29 +++++++---------- .../components/ui/carousel/carousel.svelte | 30 +++++++++--------- src/lib/components/ui/carousel/context.ts | 24 +++++++------- src/lib/components/ui/carousel/index.ts | 10 +++--- 11 files changed, 95 insertions(+), 111 deletions(-) diff --git a/src/lib/components/ui/accordion/accordion-content.svelte b/src/lib/components/ui/accordion/accordion-content.svelte index 85e835e8..7943a40d 100644 --- a/src/lib/components/ui/accordion/accordion-content.svelte +++ b/src/lib/components/ui/accordion/accordion-content.svelte @@ -1,20 +1,20 @@ - import { Accordion as AccordionPrimitive } from "bits-ui"; - import { cn } from "$lib/utils.js"; + import { Accordion as AccordionPrimitive } from 'bits-ui'; + import { cn } from '$lib/utils.js'; type $$Props = AccordionPrimitive.ItemProps; - let className: $$Props["class"] = undefined; - export let value: $$Props["value"]; + let className: $$Props['class'] = undefined; + export let value: $$Props['value']; export { className as class }; - + diff --git a/src/lib/components/ui/accordion/accordion-trigger.svelte b/src/lib/components/ui/accordion/accordion-trigger.svelte index 11769226..b1fb046a 100644 --- a/src/lib/components/ui/accordion/accordion-trigger.svelte +++ b/src/lib/components/ui/accordion/accordion-trigger.svelte @@ -1,20 +1,20 @@ svg]:rotate-180", + 'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180', className )} {...$$restProps} diff --git a/src/lib/components/ui/accordion/index.ts b/src/lib/components/ui/accordion/index.ts index ed492138..0734d4e3 100644 --- a/src/lib/components/ui/accordion/index.ts +++ b/src/lib/components/ui/accordion/index.ts @@ -1,7 +1,7 @@ -import { Accordion as AccordionPrimitive } from "bits-ui"; -import Content from "./accordion-content.svelte"; -import Item from "./accordion-item.svelte"; -import Trigger from "./accordion-trigger.svelte"; +import { Accordion as AccordionPrimitive } from 'bits-ui'; +import Content from './accordion-content.svelte'; +import Item from './accordion-item.svelte'; +import Trigger from './accordion-trigger.svelte'; const Root = AccordionPrimitive.Root; export { @@ -13,5 +13,5 @@ export { Root as Accordion, Content as AccordionContent, Item as AccordionItem, - Trigger as AccordionTrigger, + Trigger as AccordionTrigger }; diff --git a/src/lib/components/ui/carousel/carousel-content.svelte b/src/lib/components/ui/carousel/carousel-content.svelte index bc85456b..d11117a4 100644 --- a/src/lib/components/ui/carousel/carousel-content.svelte +++ b/src/lib/components/ui/carousel/carousel-content.svelte @@ -1,32 +1,32 @@
diff --git a/src/lib/components/ui/carousel/carousel-item.svelte b/src/lib/components/ui/carousel/carousel-item.svelte index 3d0fdfbb..8c889900 100644 --- a/src/lib/components/ui/carousel/carousel-item.svelte +++ b/src/lib/components/ui/carousel/carousel-item.svelte @@ -1,23 +1,19 @@
diff --git a/src/lib/components/ui/carousel/carousel-next.svelte b/src/lib/components/ui/carousel/carousel-next.svelte index 38b916b9..db269d2a 100644 --- a/src/lib/components/ui/carousel/carousel-next.svelte +++ b/src/lib/components/ui/carousel/carousel-next.svelte @@ -1,32 +1,27 @@ diff --git a/src/routes/(components)/layout/NavLinks.svelte b/src/routes/(components)/layout/NavLinks.svelte index f64ce3d1..ac4cfd03 100644 --- a/src/routes/(components)/layout/NavLinks.svelte +++ b/src/routes/(components)/layout/NavLinks.svelte @@ -3,11 +3,12 @@ export let sheetOpen: boolean | undefined = undefined; const linkItems: { text: string; href: string }[] = [ - { text: 'Workouts', href: '/workouts' }, - { text: 'Mesocycles', href: '/mesocycles' }, + { text: 'Dashboard', href: '/dashboard' }, { text: 'Exercise splits', href: '/exercise-splits' }, - { text: 'Privacy policy', href: '/privacy-policy' }, - { text: 'Donations', href: '/donations' } + { text: 'Mesocycles', href: '/mesocycles' }, + { text: 'Workouts', href: '/workouts' }, + { text: 'Donations', href: '/donations' }, + { text: 'Privacy policy', href: '/privacy-policy' } ]; diff --git a/src/routes/(components)/page/ActionButtons.svelte b/src/routes/(components)/page/ActionButtons.svelte index d5248b4d..eac0032e 100644 --- a/src/routes/(components)/page/ActionButtons.svelte +++ b/src/routes/(components)/page/ActionButtons.svelte @@ -7,7 +7,9 @@ import GitHub from 'virtual:icons/lucide/github'; import Star from 'virtual:icons/lucide/star'; import LoginProviderMenu from '../layout/LoginProviderMenu.svelte'; + import type { Session } from '@auth/sveltekit'; + let { session }: { session: Session | null } = $props(); let stars: number | undefined = $state(); onMount(async () => { @@ -30,10 +32,12 @@ {/if} - - - - - - + {#if session === null} + + + + + + + {/if}
diff --git a/src/routes/(components)/page/DesktopLandingPage.svelte b/src/routes/(components)/page/DesktopLandingPage.svelte index e2e43c24..468ad562 100644 --- a/src/routes/(components)/page/DesktopLandingPage.svelte +++ b/src/routes/(components)/page/DesktopLandingPage.svelte @@ -22,7 +22,7 @@
- +
diff --git a/src/routes/(components)/page/MobileLandingPage.svelte b/src/routes/(components)/page/MobileLandingPage.svelte index 43c4a1ba..5b28f07c 100644 --- a/src/routes/(components)/page/MobileLandingPage.svelte +++ b/src/routes/(components)/page/MobileLandingPage.svelte @@ -18,7 +18,7 @@ - +
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 027540ff..664bb4e6 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,11 +1,13 @@ import { prisma } from '$lib/prisma.js'; +import type { Session } from '@auth/sveltekit'; import { redirect } from '@sveltejs/kit'; -export const load = async ({ parent }) => { +export const load = async ({ parent, url }) => { const { session } = await parent(); - if (session) redirect(302, '/dashboard'); + if (session && !url.searchParams.has('forceView')) redirect(302, '/dashboard'); return { + session, workoutCount: prisma.workout.count(), exerciseCount: prisma.workoutExercise.count(), setsCount: prisma.workoutExerciseSet.count() @@ -13,6 +15,7 @@ export const load = async ({ parent }) => { }; export type HomePageCounts = { + session: Session | null; workoutCount: Promise; exerciseCount: Promise; setsCount: Promise; From 4bfa252f9ae4dab8dccad5041c79e680e78327ef Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Sun, 13 Oct 2024 12:04:23 +0530 Subject: [PATCH 29/68] fix: update offline message to correctly show inability of app usage --- src/routes/offline/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/offline/+page.svelte b/src/routes/offline/+page.svelte index 437500ac..b009988c 100644 --- a/src/routes/offline/+page.svelte +++ b/src/routes/offline/+page.svelte @@ -1,4 +1,4 @@
You're offline -

Some features of the app might not work as expected

+

We don't yet support offline mode

From f52a0db75f704fd09f6151eb324327e671965082 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 10:01:24 +0530 Subject: [PATCH 30/68] fix: simplify service worker and include font files --- src/service-worker.ts | 30 +++++++++--------------------- vite.config.ts | 2 +- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/service-worker.ts b/src/service-worker.ts index bc75e927..b815112a 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -1,26 +1,24 @@ /// -import { PrecacheFallbackPlugin, precacheAndRoute, cleanupOutdatedCaches } from 'workbox-precaching'; +import { PrecacheFallbackPlugin, cleanupOutdatedCaches, precacheAndRoute } from 'workbox-precaching'; import { registerRoute } from 'workbox-routing'; -import { NetworkFirst, CacheFirst, NetworkOnly } from 'workbox-strategies'; -import { BackgroundSyncPlugin } from 'workbox-background-sync'; +import { CacheFirst, NetworkOnly } from 'workbox-strategies'; declare let self: ServiceWorkerGlobalScope; -const cacheFirstDestinations: RequestDestination[] = ['style', 'manifest', 'image']; +const cacheFirstDestinations: RequestDestination[] = ['style', 'manifest', 'image', 'font']; const fallbackPlugin = new PrecacheFallbackPlugin({ fallbackURL: '/offline' }); -const backgroundSyncPlugin = new BackgroundSyncPlugin('pendingRequests'); -function routingStrategyFunction(mode: 'networkFirst' | 'cacheFirst', request: Request, url: URL) { - // Ignore all tRPC functions - if (url.pathname.match(/__data\.json/)) return false; +function routingStrategyFunction(mode: 'networkOnly' | 'cacheFirst', request: Request, url: URL) { // Ignore /auth requests if (url.pathname.startsWith('/auth')) return false; + // Decide whether or not asset should be cached (cacheFirstDestinations, and unplugin-icons) let toCache = false; if (cacheFirstDestinations.includes(request.destination) || url.pathname.includes('~icons')) { toCache = true; } + // If function used in cacheFirst strategy, return toCache value - // otherwise being used in networkFirst, which is naturally the assets which shouldn't be cached + // otherwise being used in networkOnly, which is naturally the assets which shouldn't be cached return mode === 'cacheFirst' ? toCache : !toCache; } @@ -32,20 +30,10 @@ self.addEventListener('message', (event) => { }); registerRoute( - ({ url }) => url.pathname.match(/__data\.json/), - new NetworkOnly({ - plugins: [backgroundSyncPlugin], - networkTimeoutSeconds: 5 - }) -); - -// Network first for everything except static assets and /auth -registerRoute( - ({ request, url }) => routingStrategyFunction('networkFirst', request, url), - new NetworkFirst({ plugins: [fallbackPlugin], networkTimeoutSeconds: 5 }) + ({ request, url }) => routingStrategyFunction('networkOnly', request, url), + new NetworkOnly({ plugins: [fallbackPlugin], networkTimeoutSeconds: 5 }) ); -// Cache first for images, css registerRoute( ({ request, url }) => routingStrategyFunction('cacheFirst', request, url), new CacheFirst({ plugins: [fallbackPlugin] }) diff --git a/vite.config.ts b/vite.config.ts index 41dce7b0..98bb5982 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -482,7 +482,7 @@ export default defineConfig({ ] }, injectManifest: { - globPatterns: ['client/**/*.{js,css,ico,png,svg,webp,woff,woff2}'] + globPatterns: ['client/**/*.{js,css,ico,png,svg,ttf,webp,webmanifest,woff}', 'prerendered/**/*.html'] }, devOptions: { enabled: true, From 8b111487be20b0247a4ed80124c4eb13174f7edd Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 10:09:25 +0530 Subject: [PATCH 31/68] fix: add prerendered pages to cacheFirst strategy --- src/service-worker.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/service-worker.ts b/src/service-worker.ts index b815112a..2a4f9340 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -5,6 +5,7 @@ import { CacheFirst, NetworkOnly } from 'workbox-strategies'; declare let self: ServiceWorkerGlobalScope; const cacheFirstDestinations: RequestDestination[] = ['style', 'manifest', 'image', 'font']; +const prerenderedPages = ['/privacy-policy', '/offline', '/donations']; const fallbackPlugin = new PrecacheFallbackPlugin({ fallbackURL: '/offline' }); function routingStrategyFunction(mode: 'networkOnly' | 'cacheFirst', request: Request, url: URL) { @@ -12,10 +13,10 @@ function routingStrategyFunction(mode: 'networkOnly' | 'cacheFirst', request: Re if (url.pathname.startsWith('/auth')) return false; // Decide whether or not asset should be cached (cacheFirstDestinations, and unplugin-icons) - let toCache = false; - if (cacheFirstDestinations.includes(request.destination) || url.pathname.includes('~icons')) { - toCache = true; - } + const toCache = + cacheFirstDestinations.includes(request.destination) || + prerenderedPages.includes(url.pathname) || + url.pathname.includes('~icons'); // If function used in cacheFirst strategy, return toCache value // otherwise being used in networkOnly, which is naturally the assets which shouldn't be cached From 3e95dfc5aa035b59d100883bfba6db1c523fc3d5 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 10:54:46 +0530 Subject: [PATCH 32/68] fix: better types --- src/lib/utils/workoutUtils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/workoutUtils.ts b/src/lib/utils/workoutUtils.ts index d735080f..771a3755 100644 --- a/src/lib/utils/workoutUtils.ts +++ b/src/lib/utils/workoutUtils.ts @@ -23,7 +23,7 @@ export type SetDetails = { reps: number; load: number; RIR: number; - miniSets?: { + miniSets: { reps: number; load: number; RIR: number; @@ -35,20 +35,20 @@ type CommonBergerType = { oldUserBodyweight?: number; newUserBodyweight?: number; overloadPercentage?: number; - oldSet: SetDetails; + oldSet: Omit; }; type BergerNewReps = { variableToSolve: 'NewReps'; knownValues: CommonBergerType & { - newSet: Omit & { reps?: number }; + newSet: Omit & { reps?: number }; }; }; type BergerOverloadPercentage = { variableToSolve: 'OverloadPercentage'; knownValues: CommonBergerType & { - newSet: SetDetails; + newSet: Omit; }; }; From 0ed3f56b5c504e0f675fb7ed7a30c35f284492ed Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 11:02:25 +0530 Subject: [PATCH 33/68] fix: correct class name and container element --- src/routes/workouts/manage/overview/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/workouts/manage/overview/+page.svelte b/src/routes/workouts/manage/overview/+page.svelte index 473a3446..78f70e6e 100644 --- a/src/routes/workouts/manage/overview/+page.svelte +++ b/src/routes/workouts/manage/overview/+page.svelte @@ -129,7 +129,7 @@ }} /> {:else} - No previous workout available to compare +
No previous workout available to compare
{/if} From 23ee6f0a22d3687f00d147210ed5ee1658b09541 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 11:50:18 +0530 Subject: [PATCH 34/68] feat: consider mini-sets during calculating overloading percentage as well --- src/lib/utils/workoutUtils.ts | 63 ++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/src/lib/utils/workoutUtils.ts b/src/lib/utils/workoutUtils.ts index 771a3755..d16be2ba 100644 --- a/src/lib/utils/workoutUtils.ts +++ b/src/lib/utils/workoutUtils.ts @@ -19,6 +19,16 @@ export function getExerciseVolume(workoutExercise: WorkoutExercise, userBodyweig ); } +export function cleanupInProgressMiniSets(miniSets: WorkoutExerciseInProgress['sets'][number]['miniSets']) { + return miniSets.map((miniSet) => { + return { + reps: miniSet.reps ?? 0, + load: miniSet.load ?? 0, + RIR: miniSet.RIR ?? 0 + }; + }); +} + export type SetDetails = { reps: number; load: number; @@ -34,21 +44,21 @@ type CommonBergerType = { bodyweightFraction: number | null; oldUserBodyweight?: number; newUserBodyweight?: number; - overloadPercentage?: number; - oldSet: Omit; + oldSet: SetDetails; }; type BergerNewReps = { variableToSolve: 'NewReps'; knownValues: CommonBergerType & { - newSet: Omit & { reps?: number }; + overloadPercentage: number; + newSet: Omit & { reps?: number }; }; }; type BergerOverloadPercentage = { variableToSolve: 'OverloadPercentage'; knownValues: CommonBergerType & { - newSet: Omit; + newSet: SetDetails; }; }; @@ -56,14 +66,7 @@ type BergerInput = BergerNewReps | BergerOverloadPercentage; export function solveBergerFormula(input: BergerInput) { const { variableToSolve, knownValues } = input; - const { - oldSet, - newSet, - bodyweightFraction = null, - oldUserBodyweight = 0, - newUserBodyweight = 0, - overloadPercentage = 0 - } = knownValues; + const { oldSet, newSet, bodyweightFraction = null, oldUserBodyweight = 0, newUserBodyweight = 0 } = knownValues; const oldLoad = oldSet.load + (bodyweightFraction ?? 0) * oldUserBodyweight; const newLoad = newSet.load + (bodyweightFraction ?? 0) * newUserBodyweight; @@ -72,7 +75,8 @@ export function solveBergerFormula(input: BergerInput) { switch (variableToSolve) { case 'NewReps': { - const numerator = (1 + overloadPercentage / 100) * (9745640 * oldLoad - 423641) * exponentialMultiplier; + const numerator = + (1 + knownValues.overloadPercentage / 100) * (9745640 * oldLoad - 423641) * exponentialMultiplier; const denominator = 9745640 * newLoad - 423641; return 38.1679 * Math.log(numerator / denominator) - newSet.RIR; } @@ -81,7 +85,33 @@ export function solveBergerFormula(input: BergerInput) { const numeratorMultiplier = Math.pow(Math.E, (knownValues.newSet.reps + newSet.RIR) / 38.1679); const numerator = numeratorMultiplier * (9745640 * newLoad - 423641); const denominator = exponentialMultiplier * (9745640 * oldLoad - 423641); - return (numerator / denominator - 1) * 100; + const overloadPercentage = (numerator / denominator - 1) * 100; + + let miniSetsCompared = 0; + let totalMiniSetsOverload = 0; + for (let i = 0; i < Math.max(newSet.miniSets.length, oldSet.miniSets.length); i++) { + const prevMiniSet = oldSet.miniSets[i]; + const newMiniSet = newSet.miniSets[i]; + if (!prevMiniSet || !newMiniSet) break; + + totalMiniSetsOverload += solveBergerFormula({ + variableToSolve: 'OverloadPercentage', + knownValues: { + newSet: { ...newMiniSet, miniSets: [] }, + oldSet: { ...prevMiniSet, miniSets: [] }, + bodyweightFraction, + newUserBodyweight, + oldUserBodyweight + } + }); + miniSetsCompared++; + } + + if (miniSetsCompared === 0) { + return overloadPercentage; + } + + return (overloadPercentage + totalMiniSetsOverload) / (miniSetsCompared + 1); } } } @@ -283,11 +313,12 @@ function increaseLoadOfSets(ex: WorkoutExerciseInProgress, userBodyweight: numbe newLoad += ex.minimumWeightChange ?? 5; } + const cleanedMiniSets = cleanupInProgressMiniSets(set.miniSets); const newReps = solveBergerFormula({ variableToSolve: 'NewReps', knownValues: { - oldSet: { reps: set.reps, load: set.load, RIR: set.RIR }, - newSet: { load: newLoad, RIR: set.RIR }, + oldSet: { reps: set.reps, load: set.load, RIR: set.RIR, miniSets: cleanedMiniSets }, + newSet: { load: newLoad, RIR: set.RIR, miniSets: cleanedMiniSets }, bodyweightFraction: ex.bodyweightFraction ?? null, newUserBodyweight: userBodyweight, oldUserBodyweight: userBodyweight, From 756080606f43f18e82e2a23f5200d9598b6588c7 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 11:50:36 +0530 Subject: [PATCH 35/68] feat: implement mini-set volume comparison --- .../(components)/CompareComponent.svelte | 109 ++++++++++++++---- 1 file changed, 87 insertions(+), 22 deletions(-) diff --git a/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte b/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte index 18ed18a5..d1345759 100644 --- a/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte +++ b/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte @@ -1,14 +1,18 @@ @@ -85,26 +116,20 @@

{#if prevSet.reps !== set.reps} {prevSet.reps} -> - {set.reps} - {:else} - {set.reps} {/if} + {set.reps}

{#if prevSet.load !== set.load} {prevSet.load} -> - {set.load} - {:else} - {set.load} {/if} + {set.load}

{#if prevSet.RIR !== set.RIR} {prevSet.RIR} -> - {set.RIR} - {:else} - {set.RIR} {/if} + {set.RIR}

{#if typeof volumeChange === 'number'} @@ -118,7 +143,47 @@ {/if} {/if} - + {#each set.miniSets as miniSet, miniSetIdx} + {@const prevMiniSet = prevExercise.sets[idx].miniSets[miniSetIdx]} + {@const miniSetVolumeChange = getTheoreticalVolumeChangeOfMiniSet(prevMiniSet, miniSet)} + {#if prevMiniSet} +

+ {#if prevMiniSet.reps !== miniSet.reps} + {prevMiniSet.reps} -> + {/if} + {miniSet.reps} +

+

+ {#if prevMiniSet.load !== miniSet.load} + {prevMiniSet.load} -> + {/if} + {miniSet.load} +

+

+ {#if prevMiniSet.RIR !== miniSet.RIR} + {prevMiniSet.RIR} -> + {/if} + {miniSet.RIR} +

+ + {#if typeof miniSetVolumeChange === 'number'} + {miniSetVolumeChange?.toFixed(2)}% + {#if miniSetVolumeChange < 0} + + {:else if miniSetVolumeChange > 0} + + {:else} + + {/if} + {/if} + + {:else} + + new mini set + + + {/if} + {/each} {:else} From 0eb7d91ac43a91329da3503e6c4f7dfa2ad56a80 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 11:55:23 +0530 Subject: [PATCH 36/68] fix: show comparisons even if sets not completed --- .../manage/exercises/(components)/CompareComponent.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte b/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte index d1345759..7c63dd2b 100644 --- a/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte +++ b/src/routes/workouts/manage/exercises/(components)/CompareComponent.svelte @@ -53,11 +53,11 @@ } type InProgressSet = { reps?: number; load?: number; RIR?: number; completed: boolean }; - type CompletedSet = { reps: number; load: number; RIR: number; completed: true }; + type CompletedSet = { reps: number; load: number; RIR: number; completed: boolean }; function isSetCompleted(miniSet: InProgressSet): miniSet is CompletedSet { - const { reps, load, RIR, completed } = miniSet; - return reps !== undefined && load !== undefined && RIR !== undefined && completed; + const { reps, load, RIR } = miniSet; + return reps !== undefined && load !== undefined && RIR !== undefined; } function getTheoreticalVolumeChangeOfMiniSet(prev: Omit, current: InProgressSet) { @@ -98,7 +98,7 @@ RIR - {#if totalVolumeChange !== undefined} + {#if !isNaN(Number(totalVolumeChange)) && totalVolumeChange !== undefined} {totalVolumeChange.toFixed(2)}% {#if totalVolumeChange < 0} From 8171bfd5bfb4a8b664c0efeda34ae5ae1d5a3af5 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 12:14:49 +0530 Subject: [PATCH 37/68] fix: fix svelte-check errors for mini-sets --- .../(components)/SetsComponent.svelte | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/routes/workouts/manage/exercises/(components)/SetsComponent.svelte b/src/routes/workouts/manage/exercises/(components)/SetsComponent.svelte index 461fe680..37acf119 100644 --- a/src/routes/workouts/manage/exercises/(components)/SetsComponent.svelte +++ b/src/routes/workouts/manage/exercises/(components)/SetsComponent.svelte @@ -2,7 +2,11 @@ import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; import { Separator } from '$lib/components/ui/separator'; - import { solveBergerFormula, type WorkoutExerciseInProgress } from '$lib/utils/workoutUtils'; + import { + cleanupInProgressMiniSets, + solveBergerFormula, + type WorkoutExerciseInProgress + } from '$lib/utils/workoutUtils'; import CheckIcon from 'virtual:icons/lucide/check'; import RemoveIcon from 'virtual:icons/lucide/minus'; import EditIcon from 'virtual:icons/lucide/pencil'; @@ -111,11 +115,17 @@ solveBergerFormula({ variableToSolve: 'NewReps', knownValues: { - oldSet: { reps: exerciseSet.reps, load: oldLoad, RIR: exerciseSet.RIR }, - newSet: { load: newLoad, RIR: exerciseSet.RIR }, + oldSet: { + reps: exerciseSet.reps, + load: oldLoad, + RIR: exerciseSet.RIR, + miniSets: cleanupInProgressMiniSets(exerciseSet.miniSets) + }, + newSet: { load: newLoad, RIR: exerciseSet.RIR, miniSets: cleanupInProgressMiniSets(exerciseSet.miniSets) }, oldUserBodyweight: workoutRunes.previousWorkoutData?.userBodyweight, newUserBodyweight: workoutRunes.workoutData?.userBodyweight as number, - bodyweightFraction: exercise.bodyweightFraction ?? null + bodyweightFraction: exercise.bodyweightFraction ?? null, + overloadPercentage: 0 } }) ); @@ -131,8 +141,8 @@ solveBergerFormula({ variableToSolve: 'NewReps', knownValues: { - oldSet: { reps: set.reps, load: oldLoad, RIR: set.RIR }, - newSet: { load: newLoad, RIR: set.RIR }, + oldSet: { reps: set.reps, load: oldLoad, RIR: set.RIR, miniSets: cleanupInProgressMiniSets(set.miniSets) }, + newSet: { load: newLoad, RIR: set.RIR, miniSets: cleanupInProgressMiniSets(set.miniSets) }, oldUserBodyweight: workoutRunes.previousWorkoutData?.userBodyweight, newUserBodyweight: workoutRunes.workoutData?.userBodyweight as number, bodyweightFraction: exercise.bodyweightFraction ?? null, @@ -144,8 +154,8 @@ extraOverloadAchieved += solveBergerFormula({ variableToSolve: 'OverloadPercentage', knownValues: { - oldSet: { reps: set.reps, load: oldLoad, RIR: set.RIR }, - newSet: { reps: newReps, load: newLoad, RIR: set.RIR }, + oldSet: { reps: set.reps, load: oldLoad, RIR: set.RIR, miniSets: cleanupInProgressMiniSets(set.miniSets) }, + newSet: { reps: newReps, load: newLoad, RIR: set.RIR, miniSets: cleanupInProgressMiniSets(set.miniSets) }, oldUserBodyweight: workoutRunes.previousWorkoutData?.userBodyweight, newUserBodyweight: workoutRunes.workoutData?.userBodyweight as number, bodyweightFraction: exercise.bodyweightFraction ?? null From ea5ea6d837f176ed2c7178db9aae58e7cac58399 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 12:33:27 +0530 Subject: [PATCH 38/68] feat: added mongodb package --- package-lock.json | 160 ++++++++++++++++++++++++++++++++++--- package.json | 1 + src/lib/mongo/mongodb.d.ts | 6 ++ src/lib/mongo/mongodb.ts | 36 +++++++++ tsconfig.json | 6 +- 5 files changed, 198 insertions(+), 11 deletions(-) create mode 100644 src/lib/mongo/mongodb.d.ts create mode 100644 src/lib/mongo/mongodb.ts diff --git a/package-lock.json b/package-lock.json index 86a29776..ec5753ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", "embla-carousel-svelte": "^8.3.0", - "lucide-svelte": "^0.452.0", "mode-watcher": "^0.4.0", "paneforge": "^0.0.6", "posthog-js": "^1.160.3", @@ -50,6 +49,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.42.0", "globals": "^15.8.0", + "mongodb": "^6.9.0", "postcss": "^8.4.39", "postcss-load-config": "^6.0.1", "prettier": "^3.3.3", @@ -2777,6 +2777,16 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3521,6 +3531,23 @@ "license": "MIT", "peer": true }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", @@ -4262,6 +4289,16 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bson": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -6875,15 +6912,6 @@ "license": "ISC", "peer": true }, - "node_modules/lucide-svelte": { - "version": "0.452.0", - "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.452.0.tgz", - "integrity": "sha512-Nnt+8ljOyQ1P/k+lWKUAS13tT0hn2vVtgE7/zbVI8tiorY/aaeIkhRzY0MdVHogwEavr9VNEpQUGVBEFVicPzA==", - "license": "ISC", - "peerDependencies": { - "svelte": "^3 || ^4 || ^5.0.0-next.42" - } - }, "node_modules/magic-string": { "version": "0.30.12", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", @@ -6917,6 +6945,13 @@ "semver": "bin/semver.js" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "dev": true, + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -7034,6 +7069,101 @@ "svelte": "^4.0.0 || ^5.0.0-next.1" } }, + "node_modules/mongodb": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz", + "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -8544,6 +8674,16 @@ "license": "MIT", "peer": true }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", diff --git a/package.json b/package.json index c5385197..521e63c2 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.42.0", "globals": "^15.8.0", + "mongodb": "^6.9.0", "postcss": "^8.4.39", "postcss-load-config": "^6.0.1", "prettier": "^3.3.3", diff --git a/src/lib/mongo/mongodb.d.ts b/src/lib/mongo/mongodb.d.ts new file mode 100644 index 00000000..9fc993dd --- /dev/null +++ b/src/lib/mongo/mongodb.d.ts @@ -0,0 +1,6 @@ +import type { MongoClient } from 'mongodb'; + +declare global { + // eslint-disable-next-line no-var + var _mongoClientPromise: Promise; +} diff --git a/src/lib/mongo/mongodb.ts b/src/lib/mongo/mongodb.ts new file mode 100644 index 00000000..014c4b9e --- /dev/null +++ b/src/lib/mongo/mongodb.ts @@ -0,0 +1,36 @@ +// This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb +import { MongoClient } from 'mongodb'; +import { MONGODB_URI } from '$env/static/private'; + +if (!MONGODB_URI) { + throw new Error('Invalid/Missing environment variable: "MONGODB_URI"'); +} + +const uri = MONGODB_URI; +const options = {}; + +let client; +let clientPromise: Promise; + +if (process.env.NODE_ENV === 'development') { + /* + * In development mode, use a global variable so that the value + * Is preserved across module reloads caused by HMR (Hot Module Replacement). + */ + // eslint-disable-next-line svelte/@typescript-eslint/no-unnecessary-condition + if (!global._mongoClientPromise) { + client = new MongoClient(uri, options); + global._mongoClientPromise = client.connect(); + } + clientPromise = global._mongoClientPromise; +} else { + // In production mode, it's best to not use a global variable. + client = new MongoClient(uri, options); + clientPromise = client.connect(); +} + +/* + * Export a module-scoped MongoClient promise. By doing this in a + * separate module, the client can be shared across functions. + */ +export default clientPromise; diff --git a/tsconfig.json b/tsconfig.json index 5700c2a0..52195baf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,11 @@ "strict": true, "moduleResolution": "bundler" }, - "files": ["./node_modules/vite-plugin-pwa/client.d.ts", "./node_modules/vite-plugin-pwa/info.d.ts"] + "files": [ + "./node_modules/vite-plugin-pwa/client.d.ts", + "./node_modules/vite-plugin-pwa/info.d.ts", + "src/lib/mongo/mongodb.d.ts" + ] // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files // From 22239d93df4d6ae6300458412f50b86801f3ad15 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 12:37:50 +0530 Subject: [PATCH 39/68] feat: bring in types from v2 --- src/lib/migrations/types.ts | 285 ++++++++++++++++++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 src/lib/migrations/types.ts diff --git a/src/lib/migrations/types.ts b/src/lib/migrations/types.ts new file mode 100644 index 00000000..4621d3b8 --- /dev/null +++ b/src/lib/migrations/types.ts @@ -0,0 +1,285 @@ +export const muscleGroups: typeof MuscleGroups = [ + 'Chest', + 'Front delts', + 'Side delts', + 'Rear delts', + 'Back', + 'Traps', + 'Triceps', + 'Biceps', + 'Forearms', + 'Quads', + 'Hamstrings', + 'Glutes', + 'Calves', + 'Abs', + 'Neck', + 'Adductors', + 'Abductors' +] as const; + +export const exerciseWeightTypes: typeof ExerciseWeightTypes = ['Weighted', 'Bodyweight'] as const; + +export const caloricStates: typeof CaloricStates = [ + { + name: 'Hypo-caloric', + commonTerm: 'Deficit', + value: -1 + }, + { + name: 'Iso-caloric', + commonTerm: 'Maintenance', + value: 0 + }, + { + name: 'Hyper-caloric', + commonTerm: 'Surplus', + value: 1 + } +] as const; + +export const workloadFeedback: typeof WorkloadFeedback = [ + { name: 'none', value: 0, bgColorChecked: 'checked:!bg-warning', bgColor: 'bg-warning' }, + { name: 'decent', value: 1, bgColorChecked: 'checked:!bg-accent', bgColor: 'bg-accent' }, + { + name: 'pushed my limits', + value: 2, + bgColorChecked: 'checked:!bg-success', + bgColor: 'bg-success' + }, + { name: 'too much work', value: 3, bgColorChecked: 'checked:!bg-error', bgColor: 'bg-error' } +]; + +export const sorenessFeedback: typeof SorenessFeedback = [ + { name: 'none', value: 0, bgColorChecked: 'checked:!bg-warning', bgColor: 'bg-warning' }, + { name: 'little bit', value: 1, bgColorChecked: 'checked:!bg-success', bgColor: 'bg-success' }, + { + name: 'recovered on time', + value: 2, + bgColorChecked: 'checked:!bg-accent', + bgColor: 'bg-accent' + }, + { + name: 'interfered with workout', + value: 3, + bgColorChecked: 'checked:!bg-error', + bgColor: 'bg-error' + } +] as const; + +export const jointPainFeedback: typeof JointPainFeedback = [ + { name: 'no pain', value: 0, bgColor: 'checked:!bg-success' }, + { name: 'some pain', value: 1, bgColor: 'checked:!bg-warning' }, + { name: 'it hurts', value: 2, bgColor: 'checked:!bg-error' } +] as const; + +export const pumpFeedback: typeof PumpFeedback = [ + { name: 'no pump', value: 0, bgColor: 'checked:!bg-warning' }, + { name: 'decent pump', value: 1, bgColor: 'checked:!bg-success' }, + { name: 'great pump', value: 2, bgColor: 'checked:!bg-accent' } +] as const; + +import type { ObjectId } from 'mongodb'; + +export type MesocycleTemplateDocument = MesocycleTemplate & { userId: ObjectId }; + +export interface MesocycleDocument { + userId: ObjectId; + startTimestamp: EpochTimeStamp; + templateMesoId: ObjectId; + workouts: (ObjectId | null)[]; + endTimestamp?: EpochTimeStamp; +} + +export type WorkoutDocument = Workout & { + userId: ObjectId; + performedMesocycleId: ObjectId; +}; + +export type UserPreferencesDocument = UserPreferences & { + userId: ObjectId; +}; + +export const MuscleGroups = [ + 'Chest', + 'Front delts', + 'Side delts', + 'Rear delts', + 'Back', + 'Traps', + 'Triceps', + 'Biceps', + 'Forearms', + 'Quads', + 'Hamstrings', + 'Glutes', + 'Calves', + 'Abs', + 'Neck', + 'Adductors', + 'Abductors' +] as const; +export type MuscleGroup = (typeof MuscleGroups)[number]; + +export const ExerciseWeightTypes = ['Weighted', 'Bodyweight'] as const; +export type ExerciseWeightType = (typeof ExerciseWeightTypes)[number]; + +export type WithSerializedId = T & { id: string }; + +export const CaloricStates = [ + { + name: 'Hypo-caloric', + commonTerm: 'Deficit', + value: -1 + }, + { + name: 'Iso-caloric', + commonTerm: 'Maintenance', + value: 0 + }, + { + name: 'Hyper-caloric', + commonTerm: 'Surplus', + value: 1 + } +] as const; + +export type CaloricStateValue = (typeof CaloricStates)[number]['value']; + +export type RIRProgressionData = { + specificRIR: number; + cycles: number; +}; + +export type MesocycleTemplate = { + name: string; + startRIR: number; + RIRProgression: RIRProgressionData[]; + exerciseSplit: ({ name: string; exercises: SplitExercise[] } | null)[]; + caloricBalance: CaloricStateValue; + specialization?: MuscleGroup[]; +}; + +export type ActiveMesocycle = { + templateMesoId: string; + startTimestamp: EpochTimeStamp; + workouts: (string | null)[]; +}; + +export type Mesocycle = ActiveMesocycle & { + endTimestamp?: EpochTimeStamp; +}; + +export type PerformedMesocycle = ActiveMesocycle & { + endTimestamp: EpochTimeStamp; +}; + +interface SplitExercise { + name: string; + sets: number; + targetMuscleGroup: MuscleGroup; + repRangeStart: number; + repRangeEnd: number; + weightType: ExerciseWeightType; + note?: string; +} + +type Nullable = { + [P in keyof T]: T[P] | null; +}; + +interface AllUserPreferences { + bodyweight: number; +} + +export type UserPreferences = Nullable; + +export const WorkloadFeedback = [ + { name: 'none', value: 0, bgColorChecked: 'checked:!bg-warning', bgColor: 'bg-warning' }, + { name: 'decent', value: 1, bgColorChecked: 'checked:!bg-accent', bgColor: 'bg-accent' }, + { + name: 'pushed my limits', + value: 2, + bgColorChecked: 'checked:!bg-success', + bgColor: 'bg-success' + }, + { name: 'too much work', value: 3, bgColorChecked: 'checked:!bg-error', bgColor: 'bg-error' } +]; +export type WorkloadState = (typeof WorkloadFeedback)[number]['value']; + +export const SorenessFeedback = [ + { name: 'none', value: 0, bgColorChecked: 'checked:!bg-warning', bgColor: 'bg-warning' }, + { name: 'little bit', value: 1, bgColorChecked: 'checked:!bg-success', bgColor: 'bg-success' }, + { + name: 'recovered on time', + value: 2, + bgColorChecked: 'checked:!bg-accent', + bgColor: 'bg-accent' + }, + { + name: 'interfered with workout', + value: 3, + bgColorChecked: 'checked:!bg-error', + bgColor: 'bg-error' + } +] as const; +export type SorenessState = (typeof SorenessFeedback)[number]['value']; + +export type Workout = { + startTimestamp: EpochTimeStamp; + referenceWorkout: string | null; + dayNumber: number; + cycleNumber: number; + difficultyRating: 1 | 2 | 3 | 4 | 5; + exercisesPerformed: WorkoutExercise[]; + muscleGroupWorkloads: Partial>; + plannedRIR: number; + muscleSorenessToNextWorkout: Partial>; + deload: boolean; + skipped: boolean; +}; + +export const JointPainFeedback = [ + { name: 'no pain', value: 0, bgColor: 'checked:!bg-success' }, + { name: 'some pain', value: 1, bgColor: 'checked:!bg-warning' }, + { name: 'it hurts', value: 2, bgColor: 'checked:!bg-error' } +] as const; +export type JoinPainState = (typeof JointPainFeedback)[number]['value']; + +export const PumpFeedback = [ + { name: 'no pump', value: 0, bgColor: 'checked:!bg-warning' }, + { name: 'decent pump', value: 1, bgColor: 'checked:!bg-success' }, + { name: 'great pump', value: 2, bgColor: 'checked:!bg-accent' } +] as const; +export type PumpState = (typeof PumpFeedback)[number]['value']; + +export type WorkoutExerciseSet = { + reps: number; + load: number; + RIR: number; +}; +export type WorkoutExercise = { + name: string; + sets: WorkoutExerciseSet[]; + repRangeStart: number; + repRangeEnd: number; + bodyweight?: number | null; + targetMuscleGroup: MuscleGroup; + jointPainRating: JoinPainState | null; + pumpRating: PumpState | null; + note?: string; +}; + +export type WorkoutExerciseWithoutSetNumbers = Omit & { + sets: Nullable[]; +}; + +export type WorkoutBeingPerformed = { + startTimestamp: EpochTimeStamp; + referenceWorkout: string | null; + dayNumber: number; + cycleNumber: number; + exercisesPerformed: WorkoutExerciseWithoutSetNumbers[]; + plannedRIR: number; + deload: boolean; +}; From 0ba9505de54578d79fefb0b5e9f0ad4f9990d1a8 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 12:39:59 +0530 Subject: [PATCH 40/68] refactor: better naming --- src/lib/{migrations => V2}/types.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/lib/{migrations => V2}/types.ts (100%) diff --git a/src/lib/migrations/types.ts b/src/lib/V2/types.ts similarity index 100% rename from src/lib/migrations/types.ts rename to src/lib/V2/types.ts From 12b0d304bc8fcffd40fce39bc2378142ee796214 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 17:07:48 +0530 Subject: [PATCH 41/68] feat: added a date converter util function --- src/lib/utils.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 734a29b5..91290dcd 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -87,6 +87,11 @@ export function generateShadesAndTints(count: number): string[] { return colors; } +export function getShortDateFromTimestamp(timestamp?: number) { + const date = new Date(timestamp ?? 0); + return date.toLocaleDateString(undefined, { day: '2-digit', month: 'short' }); +} + export function arraySum(arr: number[]) { return arr.reduce((sum, num) => sum + num, 0); } From 001d98099e4e88c7834b9e41b5f3adc4bcfc0c46 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 17:08:02 +0530 Subject: [PATCH 42/68] feat: added base stuff for v2 migration --- src/lib/trpc/routes/users.ts | 261 +++++++++++++++++++++++++++++ src/routes/profile/+page.server.ts | 7 + src/routes/profile/+page.svelte | 63 ++++++- 3 files changed, 329 insertions(+), 2 deletions(-) create mode 100644 src/routes/profile/+page.server.ts diff --git a/src/lib/trpc/routes/users.ts b/src/lib/trpc/routes/users.ts index b1dc2682..09a4ffcc 100644 --- a/src/lib/trpc/routes/users.ts +++ b/src/lib/trpc/routes/users.ts @@ -1,5 +1,67 @@ +import clientPromise from '$lib/mongo/mongodb'; import { prisma } from '$lib/prisma'; import { t } from '$lib/trpc/t'; +import { getShortDateFromTimestamp } from '$lib/utils'; +import type { + MesocycleDocument, + MesocycleTemplateDocument, + MuscleGroup as V2MuscleGroup, + WorkoutDocument +} from '$lib/V2/types'; +import type { MuscleGroup } from '@prisma/client'; +import { TRPCError } from '@trpc/server'; +import cuid from 'cuid'; + +function toPascalCase(text: V2MuscleGroup) { + return text + .toLowerCase() + .split(' ') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join('') as MuscleGroup; +} + +async function getPrismaAndMongoUser(userId: string) { + const prismaUser = await prisma.user.findUnique({ + where: { id: userId }, + select: { email: true, accounts: { select: { providerAccountId: true } } } + }); + if (!prismaUser) { + throw new TRPCError({ message: 'User not found in current database', code: 'BAD_REQUEST' }); + } + + const client = await clientPromise; + const mongoUser = await client.db().collection('users').findOne({ email: prismaUser?.email }); + if (!mongoUser) { + throw new TRPCError({ + message: 'User not found in old database, did you login with the same email?', + code: 'NOT_FOUND' + }); + } + + const mongoAccount = await client + .db() + .collection('accounts') + .findOne({ providerAccountId: { $in: prismaUser.accounts.map((account) => account.providerAccountId) } }); + if (!mongoAccount) { + throw new TRPCError({ + message: 'Account not found in old database, did you login with the same provider (Google, GitHub)?', + code: 'NOT_FOUND' + }); + } + + const activeMesocycle = await client + .db() + .collection('mesocycles') + .findOne({ userId: mongoUser._id, endTimestamp: { $exists: false } }); + if (activeMesocycle) { + throw new TRPCError({ + message: `A mesocycle is active in your V2 account, try again after stopping/finishing it.`, + code: 'BAD_REQUEST' + }); + } + + return { prismaUser, mongoUser }; +} export const users = t.router({ getEntityCounts: t.procedure.query(async ({ ctx }) => { @@ -17,5 +79,204 @@ export const users = t.router({ const entityCounts = { ...queryResult._count, startedMesocycles }; return entityCounts; + }), + + checkV2MigrationAvailability: t.procedure.query(async ({ ctx }) => { + try { + const { mongoUser } = await getPrismaAndMongoUser(ctx.userId); + const client = await clientPromise; + + const mesocycleTemplatesCount = await client + .db() + .collection('mesocycleTemplates') + .countDocuments({ userId: mongoUser._id }); + + const mesocyclesCount = await client + .db() + .collection('mesocycles') + .countDocuments({ userId: mongoUser._id }); + + const workoutsCount = await client + .db() + .collection('workouts') + .countDocuments({ userId: mongoUser._id }); + + return { mesocycleTemplatesCount, mesocyclesCount, workoutsCount, emailId: mongoUser.email as string }; + } catch (error) { + if (error instanceof TRPCError) { + return error.message; + } + return 'Internal server error'; + } + }), + + migrateFromV2: t.procedure.mutation(async ({ ctx }) => { + const { mongoUser } = await getPrismaAndMongoUser(ctx.userId); + + const client = await clientPromise; + const mesocycleTemplates = await client + .db() + .collection('mesocycleTemplates') + .find({ userId: mongoUser._id }) + .toArray(); + + const mesocycles = await client + .db() + .collection('mesocycles') + .find({ userId: mongoUser._id }) + .toArray(); + + const workouts = await client + .db() + .collection('workouts') + .find({ userId: mongoUser._id }) + .toArray(); + + const mesocycleTemplateIds = Array.from({ length: mesocycleTemplates.length }).map(() => cuid()); + const exerciseSplitCreate = prisma.exerciseSplit.createMany({ + data: mesocycleTemplates.map((mesocycleTemplate, idx) => ({ + name: mesocycleTemplate.name, + id: mesocycleTemplateIds[idx], + userId: ctx.userId + })) + }); + + const exerciseSplitDayIds = Array.from({ length: mesocycleTemplates.length }).map((_, templateIdx) => + Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit.length }).map(() => cuid()) + ); + const exerciseSplitDayCreate = prisma.exerciseSplitDay.createMany({ + data: mesocycleTemplates.flatMap((mesocycleTemplate, templateIdx) => + mesocycleTemplate.exerciseSplit.map((splitDay, dayIndex) => { + return { + id: exerciseSplitDayIds[templateIdx][dayIndex], + name: splitDay?.name ?? '', + isRestDay: splitDay === null, + dayIndex, + exerciseSplitId: mesocycleTemplateIds[templateIdx] + }; + }) + ) + }); + + const exerciseTemplateIds = Array.from({ length: mesocycleTemplates.length }).map((_, templateIdx) => + Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit.length }).map((_, dayIndex) => { + if (mesocycleTemplates[templateIdx].exerciseSplit[dayIndex] === null) return []; + return Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit[dayIndex].exercises.length }).map( + () => cuid() + ); + }) + ); + const exerciseSplitDayTemplateCreate = prisma.exerciseTemplate.createMany({ + data: mesocycleTemplates.flatMap((mesocycleTemplate, templateIdx) => + mesocycleTemplate.exerciseSplit.flatMap((splitDay, dayIndex) => { + if (!splitDay) return []; + return splitDay.exercises.map((exercise, exerciseIndex) => { + return { + id: exerciseTemplateIds[templateIdx][dayIndex][exerciseIndex], + name: exercise.name, + exerciseIndex, + targetMuscleGroup: toPascalCase(exercise.targetMuscleGroup), + repRangeStart: exercise.repRangeStart, + repRangeEnd: exercise.repRangeEnd, + setType: 'V2', + exerciseSplitDayId: exerciseSplitDayIds[templateIdx][dayIndex] + }; + }); + }) + ) + }); + + const mesocycleIds = Array.from({ length: mesocycles.length }).map(() => cuid()); + const mesocycleCreate = prisma.mesocycle.createMany({ + data: mesocycles.map((mesocycle, mesocycleIndex) => { + const durationString = `(${getShortDateFromTimestamp(mesocycle.startTimestamp)} - ${getShortDateFromTimestamp(mesocycle.endTimestamp)})`; + + const templateIdx = mesocycleTemplates.findIndex( + (mesocycleTemplate) => mesocycle.templateMesoId === mesocycleTemplate._id + ); + + return { + id: mesocycleIds[mesocycleIndex], + forceRIRMatching: false, + lastSetToFailure: false, + name: + templateIdx !== -1 + ? `${mesocycleTemplates[templateIdx].name} ${durationString}` + : `(Deleted) ${durationString}`, + startOverloadPercentage: 0, + userId: ctx.userId, + exerciseSplitId: templateIdx ? mesocycleTemplateIds[templateIdx] : null, + RIRProgression: mesocycleTemplates[templateIdx].RIRProgression.map(({ cycles }) => cycles) + }; + }) + }); + + const mesocycleExerciseSplitDayIds = Array.from({ length: mesocycles.length }).map((_, mesocycleIdx) => { + const template = mesocycleTemplates.find(({ _id }) => mesocycles[mesocycleIdx].templateMesoId === _id); + if (!template) return []; + return Array.from({ length: template.exerciseSplit.length }).map((_) => cuid()); + }); + const mesocycleExerciseSplitDayCreate = prisma.mesocycleExerciseSplitDay.createMany({ + data: mesocycles.flatMap((mesocycle, mesocycleIdx) => { + const template = mesocycleTemplates.find(({ _id }) => mesocycle.templateMesoId === _id); + if (!template) return []; + + return template.exerciseSplit.map((splitDay, dayIndex) => { + return { + id: mesocycleExerciseSplitDayIds[mesocycleIdx][dayIndex], + name: splitDay?.name ?? '', + isRestDay: splitDay === null, + dayIndex, + mesocycleId: mesocycleIds[mesocycleIdx] + }; + }); + }) + }); + + const mesocycleExerciseTemplateIds = Array.from({ length: mesocycles.length }).map((_, mesocycleIdx) => { + const template = mesocycleTemplates.find(({ _id }) => mesocycles[mesocycleIdx].templateMesoId === _id); + if (!template) return []; + return Array.from({ length: template.exerciseSplit.length }).map((_, dayIndex) => { + const splitDay = template.exerciseSplit[dayIndex]; + if (!splitDay) return []; + return Array.from({ length: splitDay.exercises.length }).map(() => cuid()); + }); + }); + const mesocycleExerciseTemplateCreate = prisma.mesocycleExerciseTemplate.createMany({ + data: mesocycles.flatMap((_, mesocycleIdx) => { + const template = mesocycleTemplates.find(({ _id }) => mesocycles[mesocycleIdx].templateMesoId === _id); + if (!template) return []; + + return template.exerciseSplit.flatMap((splitDay, dayIndex) => { + if (!splitDay) return []; + + return splitDay.exercises.map((exercise, exerciseIndex) => { + return { + id: mesocycleExerciseTemplateIds[mesocycleIdx][dayIndex][exerciseIndex], + name: exercise.name, + exerciseIndex, + targetMuscleGroup: toPascalCase(exercise.targetMuscleGroup), + repRangeStart: exercise.repRangeStart, + repRangeEnd: exercise.repRangeEnd, + setType: 'V2', + sets: exercise.sets, + mesocycleExerciseSplitDayId: mesocycleExerciseSplitDayIds[mesocycleIdx][dayIndex] + }; + }); + }); + }) + }); + + const workoutIds = Array.from({ length: workouts.length }).map(() => cuid()); + + + await prisma.$transaction([ + exerciseSplitCreate, + exerciseSplitDayCreate, + exerciseSplitDayTemplateCreate, + mesocycleCreate, + mesocycleExerciseSplitDayCreate, + mesocycleExerciseTemplateCreate + ]); }) }); diff --git a/src/routes/profile/+page.server.ts b/src/routes/profile/+page.server.ts new file mode 100644 index 00000000..6d017b59 --- /dev/null +++ b/src/routes/profile/+page.server.ts @@ -0,0 +1,7 @@ +import { createContext } from '$lib/trpc/context'; +import { createCaller } from '$lib/trpc/router'; + +export const load = async (event) => { + const trpc = createCaller(await createContext(event)); + return { V2Counts: trpc.users.checkV2MigrationAvailability() }; +}; diff --git a/src/routes/profile/+page.svelte b/src/routes/profile/+page.svelte index 1021ba7e..79b8e70f 100644 --- a/src/routes/profile/+page.svelte +++ b/src/routes/profile/+page.svelte @@ -1,11 +1,34 @@

Profile

-
+
Email {$page.data.session?.user?.email} @@ -16,3 +39,39 @@ {$page.data.session?.user?.name}
+ +{#await data.V2Counts} + +{:then V2Counts} + + + V2 migration + Get all your data from V2 into V3 + + +

+ {#if typeof V2Counts === 'string'} + {V2Counts} + {:else} + Email: {V2Counts.emailId}
+ Mesocycles: {V2Counts.mesocyclesCount}
+ Mesocycle Templates: {V2Counts.mesocycleTemplatesCount}
+ Workouts: {V2Counts.workoutsCount} + {/if} +

+
+ + + +
+{/await} From 886a53346d8a9924bdc337274b0cd143283aa5d2 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 17:13:01 +0530 Subject: [PATCH 43/68] feat: install cuid2 and remove cuid --- package-lock.json | 43 ++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86a29776..4dbce010 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "clsx": "^2.1.1", "cmdk-sv": "^0.0.18", "embla-carousel-svelte": "^8.3.0", - "lucide-svelte": "^0.452.0", "mode-watcher": "^0.4.0", "paneforge": "^0.0.6", "posthog-js": "^1.160.3", @@ -35,6 +34,7 @@ }, "devDependencies": { "@iconify/json": "^2.2.227", + "@paralleldrive/cuid2": "^2.2.2", "@playwright/test": "^1.45.1", "@sveltejs/adapter-auto": "^3.2.2", "@sveltejs/kit": "^2.5.18", @@ -44,7 +44,6 @@ "@typescript-eslint/parser": "^8.0.0", "@vite-pwa/sveltekit": "^0.6.0", "autoprefixer": "^10.4.19", - "cuid": "^3.0.0", "dotenv": "^16.4.5", "eslint": "^9.7.0", "eslint-config-prettier": "^9.1.0", @@ -2777,6 +2776,19 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2821,6 +2833,16 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4570,14 +4592,6 @@ "node": ">=4" } }, - "node_modules/cuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-3.0.0.tgz", - "integrity": "sha512-WZYYkHdIDnaxdeP8Misq3Lah5vFjJwGuItJuV+tvMafosMzw0nF297T7mrm8IOWiPJkV6gc7sa8pzx27+w25Zg==", - "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead.", - "dev": true, - "license": "MIT" - }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -6875,15 +6889,6 @@ "license": "ISC", "peer": true }, - "node_modules/lucide-svelte": { - "version": "0.452.0", - "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.452.0.tgz", - "integrity": "sha512-Nnt+8ljOyQ1P/k+lWKUAS13tT0hn2vVtgE7/zbVI8tiorY/aaeIkhRzY0MdVHogwEavr9VNEpQUGVBEFVicPzA==", - "license": "ISC", - "peerDependencies": { - "svelte": "^3 || ^4 || ^5.0.0-next.42" - } - }, "node_modules/magic-string": { "version": "0.30.12", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", diff --git a/package.json b/package.json index c5385197..791d4798 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ }, "devDependencies": { "@iconify/json": "^2.2.227", + "@paralleldrive/cuid2": "^2.2.2", "@playwright/test": "^1.45.1", "@sveltejs/adapter-auto": "^3.2.2", "@sveltejs/kit": "^2.5.18", @@ -24,7 +25,6 @@ "@typescript-eslint/parser": "^8.0.0", "@vite-pwa/sveltekit": "^0.6.0", "autoprefixer": "^10.4.19", - "cuid": "^3.0.0", "dotenv": "^16.4.5", "eslint": "^9.7.0", "eslint-config-prettier": "^9.1.0", From c9b10901203d0db0755e045f0fb83178507cfe4b Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 17:39:33 +0530 Subject: [PATCH 44/68] feat: update schema to cuid2 --- prisma/schema/exerciseSplit.prisma | 6 +- prisma/schema/mesocycle.prisma | 72 ++-- prisma/schema/schema.prisma | 6 +- prisma/schema/workout.prisma | 46 +-- src/lib/zodSchemas/index.ts | 556 ++++++++++++++--------------- 5 files changed, 343 insertions(+), 343 deletions(-) diff --git a/prisma/schema/exerciseSplit.prisma b/prisma/schema/exerciseSplit.prisma index 2273df3b..0b4cf6ed 100644 --- a/prisma/schema/exerciseSplit.prisma +++ b/prisma/schema/exerciseSplit.prisma @@ -1,5 +1,5 @@ model ExerciseSplit { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() name String user User @relation(fields: [userId], references: [id], onDelete: Cascade) userId String @@ -8,7 +8,7 @@ model ExerciseSplit { } model ExerciseSplitDay { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() name String dayIndex Int isRestDay Boolean @@ -18,7 +18,7 @@ model ExerciseSplitDay { } model ExerciseTemplate { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() name String exerciseIndex Int targetMuscleGroup MuscleGroup diff --git a/prisma/schema/mesocycle.prisma b/prisma/schema/mesocycle.prisma index e9ac374a..fcdc7f5f 100644 --- a/prisma/schema/mesocycle.prisma +++ b/prisma/schema/mesocycle.prisma @@ -1,23 +1,23 @@ model Mesocycle { - id String @id @default(cuid()) - name String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - userId String - exerciseSplit ExerciseSplit? @relation(fields: [exerciseSplitId], references: [id]) - exerciseSplitId String? - RIRProgression Int[] - startDate DateTime? - endDate DateTime? - startOverloadPercentage Float - lastSetToFailure Boolean - forceRIRMatching Boolean - mesocycleExerciseSplitDays MesocycleExerciseSplitDay[] - mesocycleCyclicSetChanges MesocycleCyclicSetChange[] - workoutsOfMesocycle WorkoutOfMesocycle[] + id String @id @default(cuid()) /// @zod.string.cuid2() + name String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String + exerciseSplit ExerciseSplit? @relation(fields: [exerciseSplitId], references: [id]) + exerciseSplitId String? + RIRProgression Int[] + startDate DateTime? + endDate DateTime? + startOverloadPercentage Float + lastSetToFailure Boolean + forceRIRMatching Boolean + mesocycleExerciseSplitDays MesocycleExerciseSplitDay[] + mesocycleCyclicSetChanges MesocycleCyclicSetChange[] + workoutsOfMesocycle WorkoutOfMesocycle[] } model MesocycleCyclicSetChange { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() mesocycle Mesocycle @relation(fields: [mesocycleId], references: [id], onDelete: Cascade) mesocycleId String muscleGroup MuscleGroup @@ -28,7 +28,7 @@ model MesocycleCyclicSetChange { } model MesocycleExerciseSplitDay { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() name String dayIndex Int isRestDay Boolean @@ -38,23 +38,23 @@ model MesocycleExerciseSplitDay { } model MesocycleExerciseTemplate { - id String @id @default(cuid()) - name String - exerciseIndex Int - targetMuscleGroup MuscleGroup - customMuscleGroup String? - bodyweightFraction Float? - sets Int - setType SetType - repRangeStart Int - repRangeEnd Int - changeType ChangeType? - changeAmount Float? - note String? - mesocycleExerciseSplitDay MesocycleExerciseSplitDay @relation(fields: [mesocycleExerciseSplitDayId], references: [id], onDelete: Cascade) - mesocycleExerciseSplitDayId String - overloadPercentage Float? - lastSetToFailure Boolean? - forceRIRMatching Boolean? - minimumWeightChange Float? + id String @id @default(cuid()) /// @zod.string.cuid2() + name String + exerciseIndex Int + targetMuscleGroup MuscleGroup + customMuscleGroup String? + bodyweightFraction Float? + sets Int + setType SetType + repRangeStart Int + repRangeEnd Int + changeType ChangeType? + changeAmount Float? + note String? + mesocycleExerciseSplitDay MesocycleExerciseSplitDay @relation(fields: [mesocycleExerciseSplitDayId], references: [id], onDelete: Cascade) + mesocycleExerciseSplitDayId String + overloadPercentage Float? + lastSetToFailure Boolean? + forceRIRMatching Boolean? + minimumWeightChange Float? } diff --git a/prisma/schema/schema.prisma b/prisma/schema/schema.prisma index d0090b2e..7cb5db2a 100644 --- a/prisma/schema/schema.prisma +++ b/prisma/schema/schema.prisma @@ -14,7 +14,7 @@ generator zod { } model User { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() name String? email String @unique emailVerified DateTime? @@ -24,8 +24,8 @@ model User { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt exerciseSplits ExerciseSplit[] - mesocycles Mesocycle[] - workouts Workout[] + mesocycles Mesocycle[] + workouts Workout[] } model Account { diff --git a/prisma/schema/workout.prisma b/prisma/schema/workout.prisma index 92efd672..eb99bd00 100644 --- a/prisma/schema/workout.prisma +++ b/prisma/schema/workout.prisma @@ -1,5 +1,5 @@ model WorkoutOfMesocycle { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() workoutId String @unique mesocycleId String splitDayIndex Int @@ -9,7 +9,7 @@ model WorkoutOfMesocycle { } model Workout { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() user User @relation(fields: [userId], references: [id], onDelete: Cascade) workoutOfMesocycle WorkoutOfMesocycle? userBodyweight Int @@ -20,29 +20,29 @@ model Workout { } model WorkoutExercise { - id String @id @default(cuid()) - exerciseIndex Int - name String - workout Workout @relation(fields: [workoutId], references: [id], onDelete: Cascade) - workoutId String - targetMuscleGroup MuscleGroup - customMuscleGroup String? - bodyweightFraction Float? - sets WorkoutExerciseSet[] - setType SetType - changeType ChangeType? - changeAmount Float? - repRangeStart Int - repRangeEnd Int - note String? - overloadPercentage Float? - lastSetToFailure Boolean? - forceRIRMatching Boolean? - minimumWeightChange Float? + id String @id @default(cuid()) /// @zod.string.cuid2() + exerciseIndex Int + name String + workout Workout @relation(fields: [workoutId], references: [id], onDelete: Cascade) + workoutId String + targetMuscleGroup MuscleGroup + customMuscleGroup String? + bodyweightFraction Float? + sets WorkoutExerciseSet[] + setType SetType + changeType ChangeType? + changeAmount Float? + repRangeStart Int + repRangeEnd Int + note String? + overloadPercentage Float? + lastSetToFailure Boolean? + forceRIRMatching Boolean? + minimumWeightChange Float? } model WorkoutExerciseSet { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() setIndex Int workoutExercise WorkoutExercise @relation(fields: [workoutExerciseId], references: [id], onDelete: Cascade) workoutExerciseId String @@ -54,7 +54,7 @@ model WorkoutExerciseSet { } model WorkoutExerciseMiniSet { - id String @id @default(cuid()) + id String @id @default(cuid()) /// @zod.string.cuid2() miniSetIndex Int reps Int load Float diff --git a/src/lib/zodSchemas/index.ts b/src/lib/zodSchemas/index.ts index 6f43442a..08ced606 100644 --- a/src/lib/zodSchemas/index.ts +++ b/src/lib/zodSchemas/index.ts @@ -75,7 +75,7 @@ export type WorkoutStatusType = `${z.infer}` ///////////////////////////////////////// export const ExerciseSplitSchema = z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), name: z.string(), userId: z.string(), }) @@ -87,7 +87,7 @@ export type ExerciseSplit = z.infer ///////////////////////////////////////// export const ExerciseSplitDaySchema = z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -104,7 +104,7 @@ export const ExerciseTemplateSchema = z.object({ targetMuscleGroup: MuscleGroupSchema, setType: SetTypeSchema, changeType: ChangeTypeSchema.nullable(), - id: z.string().cuid(), + id: z.string().cuid2(), name: z.string(), exerciseIndex: z.number().int(), customMuscleGroup: z.string().nullable(), @@ -123,7 +123,7 @@ export type ExerciseTemplate = z.infer ///////////////////////////////////////// export const MesocycleSchema = z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), name: z.string(), userId: z.string(), exerciseSplitId: z.string().nullable(), @@ -143,7 +143,7 @@ export type Mesocycle = z.infer export const MesocycleCyclicSetChangeSchema = z.object({ muscleGroup: MuscleGroupSchema, - id: z.string().cuid(), + id: z.string().cuid2(), mesocycleId: z.string(), customMuscleGroup: z.string().nullable(), regardlessOfProgress: z.boolean(), @@ -158,7 +158,7 @@ export type MesocycleCyclicSetChange = z.infer export const WorkoutOfMesocycleSchema = z.object({ workoutStatus: WorkoutStatusSchema.nullable(), - id: z.string().cuid(), + id: z.string().cuid2(), workoutId: z.string(), mesocycleId: z.string(), splitDayIndex: z.number().int(), @@ -277,7 +277,7 @@ export type WorkoutOfMesocycle = z.infer ///////////////////////////////////////// export const WorkoutSchema = z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -294,7 +294,7 @@ export const WorkoutExerciseSchema = z.object({ targetMuscleGroup: MuscleGroupSchema, setType: SetTypeSchema, changeType: ChangeTypeSchema.nullable(), - id: z.string().cuid(), + id: z.string().cuid2(), exerciseIndex: z.number().int(), name: z.string(), workoutId: z.string(), @@ -317,7 +317,7 @@ export type WorkoutExercise = z.infer ///////////////////////////////////////// export const WorkoutExerciseSetSchema = z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), setIndex: z.number().int(), workoutExerciseId: z.string(), reps: z.number().int(), @@ -333,7 +333,7 @@ export type WorkoutExerciseSet = z.infer ///////////////////////////////////////// export const WorkoutExerciseMiniSetSchema = z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -870,10 +870,10 @@ export const ExerciseSplitOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => ExerciseSplitWhereInputSchema),z.lazy(() => ExerciseSplitWhereInputSchema).array() ]).optional(), OR: z.lazy(() => ExerciseSplitWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => ExerciseSplitWhereInputSchema),z.lazy(() => ExerciseSplitWhereInputSchema).array() ]).optional(), @@ -926,10 +926,10 @@ export const ExerciseSplitDayOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => ExerciseSplitDayWhereInputSchema),z.lazy(() => ExerciseSplitDayWhereInputSchema).array() ]).optional(), OR: z.lazy(() => ExerciseSplitDayWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => ExerciseSplitDayWhereInputSchema),z.lazy(() => ExerciseSplitDayWhereInputSchema).array() ]).optional(), @@ -1003,10 +1003,10 @@ export const ExerciseTemplateOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => ExerciseTemplateWhereInputSchema),z.lazy(() => ExerciseTemplateWhereInputSchema).array() ]).optional(), OR: z.lazy(() => ExerciseTemplateWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => ExerciseTemplateWhereInputSchema),z.lazy(() => ExerciseTemplateWhereInputSchema).array() ]).optional(), @@ -1105,10 +1105,10 @@ export const MesocycleOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => MesocycleWhereInputSchema),z.lazy(() => MesocycleWhereInputSchema).array() ]).optional(), OR: z.lazy(() => MesocycleWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => MesocycleWhereInputSchema),z.lazy(() => MesocycleWhereInputSchema).array() ]).optional(), @@ -1188,10 +1188,10 @@ export const MesocycleCyclicSetChangeOrderByWithRelationInputSchema: z.ZodType

= z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => MesocycleCyclicSetChangeWhereInputSchema),z.lazy(() => MesocycleCyclicSetChangeWhereInputSchema).array() ]).optional(), OR: z.lazy(() => MesocycleCyclicSetChangeWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => MesocycleCyclicSetChangeWhereInputSchema),z.lazy(() => MesocycleCyclicSetChangeWhereInputSchema).array() ]).optional(), @@ -1256,10 +1256,10 @@ export const MesocycleExerciseSplitDayOrderByWithRelationInputSchema: z.ZodType< }).strict(); export const MesocycleExerciseSplitDayWhereUniqueInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => MesocycleExerciseSplitDayWhereInputSchema),z.lazy(() => MesocycleExerciseSplitDayWhereInputSchema).array() ]).optional(), OR: z.lazy(() => MesocycleExerciseSplitDayWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => MesocycleExerciseSplitDayWhereInputSchema),z.lazy(() => MesocycleExerciseSplitDayWhereInputSchema).array() ]).optional(), @@ -1343,10 +1343,10 @@ export const MesocycleExerciseTemplateOrderByWithRelationInputSchema: z.ZodType< }).strict(); export const MesocycleExerciseTemplateWhereUniqueInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => MesocycleExerciseTemplateWhereInputSchema),z.lazy(() => MesocycleExerciseTemplateWhereInputSchema).array() ]).optional(), OR: z.lazy(() => MesocycleExerciseTemplateWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => MesocycleExerciseTemplateWhereInputSchema),z.lazy(() => MesocycleExerciseTemplateWhereInputSchema).array() ]).optional(), @@ -1455,18 +1455,18 @@ export const UserOrderByWithRelationInputSchema: z.ZodType = z.union([ z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), email: z.string() }), z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), }), z.object({ email: z.string(), }), ]) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), email: z.string().optional(), AND: z.union([ z.lazy(() => UserWhereInputSchema),z.lazy(() => UserWhereInputSchema).array() ]).optional(), OR: z.lazy(() => UserWhereInputSchema).array().optional(), @@ -1739,18 +1739,18 @@ export const WorkoutOfMesocycleOrderByWithRelationInputSchema: z.ZodType = z.union([ z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), workoutId: z.string() }), z.object({ - id: z.string().cuid(), + id: z.string().cuid2(), }), z.object({ workoutId: z.string(), }), ]) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), workoutId: z.string().optional(), AND: z.union([ z.lazy(() => WorkoutOfMesocycleWhereInputSchema),z.lazy(() => WorkoutOfMesocycleWhereInputSchema).array() ]).optional(), OR: z.lazy(() => WorkoutOfMesocycleWhereInputSchema).array().optional(), @@ -1812,10 +1812,10 @@ export const WorkoutOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => WorkoutWhereInputSchema),z.lazy(() => WorkoutWhereInputSchema).array() ]).optional(), OR: z.lazy(() => WorkoutWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => WorkoutWhereInputSchema),z.lazy(() => WorkoutWhereInputSchema).array() ]).optional(), @@ -1900,10 +1900,10 @@ export const WorkoutExerciseOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => WorkoutExerciseWhereInputSchema),z.lazy(() => WorkoutExerciseWhereInputSchema).array() ]).optional(), OR: z.lazy(() => WorkoutExerciseWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => WorkoutExerciseWhereInputSchema),z.lazy(() => WorkoutExerciseWhereInputSchema).array() ]).optional(), @@ -2003,10 +2003,10 @@ export const WorkoutExerciseSetOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => WorkoutExerciseSetWhereInputSchema),z.lazy(() => WorkoutExerciseSetWhereInputSchema).array() ]).optional(), OR: z.lazy(() => WorkoutExerciseSetWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => WorkoutExerciseSetWhereInputSchema),z.lazy(() => WorkoutExerciseSetWhereInputSchema).array() ]).optional(), @@ -2072,10 +2072,10 @@ export const WorkoutExerciseMiniSetOrderByWithRelationInputSchema: z.ZodType = z.object({ - id: z.string().cuid() + id: z.string().cuid2() }) .and(z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), AND: z.union([ z.lazy(() => WorkoutExerciseMiniSetWhereInputSchema),z.lazy(() => WorkoutExerciseMiniSetWhereInputSchema).array() ]).optional(), OR: z.lazy(() => WorkoutExerciseMiniSetWhereInputSchema).array().optional(), NOT: z.union([ z.lazy(() => WorkoutExerciseMiniSetWhereInputSchema),z.lazy(() => WorkoutExerciseMiniSetWhereInputSchema).array() ]).optional(), @@ -2114,7 +2114,7 @@ export const WorkoutExerciseMiniSetScalarWhereWithAggregatesInputSchema: z.ZodTy }).strict(); export const ExerciseSplitCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), user: z.lazy(() => UserCreateNestedOneWithoutExerciseSplitsInputSchema), exerciseSplitDays: z.lazy(() => ExerciseSplitDayCreateNestedManyWithoutExerciseSplitInputSchema).optional(), @@ -2122,7 +2122,7 @@ export const ExerciseSplitCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUncheckedCreateNestedManyWithoutExerciseSplitInputSchema).optional(), @@ -2130,7 +2130,7 @@ export const ExerciseSplitUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), user: z.lazy(() => UserUpdateOneRequiredWithoutExerciseSplitsNestedInputSchema).optional(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUpdateManyWithoutExerciseSplitNestedInputSchema).optional(), @@ -2138,7 +2138,7 @@ export const ExerciseSplitUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUncheckedUpdateManyWithoutExerciseSplitNestedInputSchema).optional(), @@ -2146,24 +2146,24 @@ export const ExerciseSplitUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string() }).strict(); export const ExerciseSplitUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const ExerciseSplitUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const ExerciseSplitDayCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -2172,7 +2172,7 @@ export const ExerciseSplitDayCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -2181,7 +2181,7 @@ export const ExerciseSplitDayUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2190,7 +2190,7 @@ export const ExerciseSplitDayUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2199,7 +2199,7 @@ export const ExerciseSplitDayUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -2207,14 +2207,14 @@ export const ExerciseSplitDayCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const ExerciseSplitDayUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2222,7 +2222,7 @@ export const ExerciseSplitDayUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -2238,7 +2238,7 @@ export const ExerciseTemplateCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -2254,7 +2254,7 @@ export const ExerciseTemplateUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2270,7 +2270,7 @@ export const ExerciseTemplateUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2286,7 +2286,7 @@ export const ExerciseTemplateUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -2302,7 +2302,7 @@ export const ExerciseTemplateCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2317,7 +2317,7 @@ export const ExerciseTemplateUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2333,7 +2333,7 @@ export const ExerciseTemplateUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.coerce.date().optional().nullable(), @@ -2349,7 +2349,7 @@ export const MesocycleCreateInputSchema: z.ZodType }).strict(); export const MesocycleUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitId: z.string().optional().nullable(), @@ -2365,7 +2365,7 @@ export const MesocycleUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2381,7 +2381,7 @@ export const MesocycleUpdateInputSchema: z.ZodType }).strict(); export const MesocycleUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2397,7 +2397,7 @@ export const MesocycleUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitId: z.string().optional().nullable(), @@ -2410,7 +2410,7 @@ export const MesocycleCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2421,7 +2421,7 @@ export const MesocycleUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2434,7 +2434,7 @@ export const MesocycleUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), muscleGroup: z.lazy(() => MuscleGroupSchema), customMuscleGroup: z.string().optional().nullable(), regardlessOfProgress: z.boolean(), @@ -2444,7 +2444,7 @@ export const MesocycleCyclicSetChangeCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), mesocycleId: z.string(), muscleGroup: z.lazy(() => MuscleGroupSchema), customMuscleGroup: z.string().optional().nullable(), @@ -2454,7 +2454,7 @@ export const MesocycleCyclicSetChangeUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), regardlessOfProgress: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2464,7 +2464,7 @@ export const MesocycleCyclicSetChangeUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), mesocycleId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2474,7 +2474,7 @@ export const MesocycleCyclicSetChangeUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), mesocycleId: z.string(), muscleGroup: z.lazy(() => MuscleGroupSchema), customMuscleGroup: z.string().optional().nullable(), @@ -2484,7 +2484,7 @@ export const MesocycleCyclicSetChangeCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), regardlessOfProgress: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2493,7 +2493,7 @@ export const MesocycleCyclicSetChangeUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), mesocycleId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2503,7 +2503,7 @@ export const MesocycleCyclicSetChangeUncheckedUpdateManyInputSchema: z.ZodType

= z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -2512,7 +2512,7 @@ export const MesocycleExerciseSplitDayCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -2521,7 +2521,7 @@ export const MesocycleExerciseSplitDayUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2530,7 +2530,7 @@ export const MesocycleExerciseSplitDayUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2539,7 +2539,7 @@ export const MesocycleExerciseSplitDayUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -2547,14 +2547,14 @@ export const MesocycleExerciseSplitDayCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const MesocycleExerciseSplitDayUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -2562,7 +2562,7 @@ export const MesocycleExerciseSplitDayUncheckedUpdateManyInputSchema: z.ZodType< }).strict(); export const MesocycleExerciseTemplateCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -2583,7 +2583,7 @@ export const MesocycleExerciseTemplateCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -2604,7 +2604,7 @@ export const MesocycleExerciseTemplateUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2625,7 +2625,7 @@ export const MesocycleExerciseTemplateUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2646,7 +2646,7 @@ export const MesocycleExerciseTemplateUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -2667,7 +2667,7 @@ export const MesocycleExerciseTemplateCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2687,7 +2687,7 @@ export const MesocycleExerciseTemplateUpdateManyMutationInputSchema: z.ZodType

= z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -2708,7 +2708,7 @@ export const MesocycleExerciseTemplateUncheckedUpdateManyInputSchema: z.ZodType< }).strict(); export const UserCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -2723,7 +2723,7 @@ export const UserCreateInputSchema: z.ZodType = z.object }).strict(); export const UserUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -2738,7 +2738,7 @@ export const UserUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2753,7 +2753,7 @@ export const UserUpdateInputSchema: z.ZodType = z.object }).strict(); export const UserUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2768,7 +2768,7 @@ export const UserUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -2778,7 +2778,7 @@ export const UserCreateManyInputSchema: z.ZodType = }).strict(); export const UserUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -2788,7 +2788,7 @@ export const UserUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -3006,7 +3006,7 @@ export const VerificationTokenUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), splitDayIndex: z.number().int(), workoutStatus: z.lazy(() => WorkoutStatusSchema).optional().nullable(), workout: z.lazy(() => WorkoutCreateNestedOneWithoutWorkoutOfMesocycleInputSchema), @@ -3014,7 +3014,7 @@ export const WorkoutOfMesocycleCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), workoutId: z.string(), mesocycleId: z.string(), splitDayIndex: z.number().int(), @@ -3022,7 +3022,7 @@ export const WorkoutOfMesocycleUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), workout: z.lazy(() => WorkoutUpdateOneRequiredWithoutWorkoutOfMesocycleNestedInputSchema).optional(), @@ -3030,7 +3030,7 @@ export const WorkoutOfMesocycleUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), mesocycleId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), @@ -3038,7 +3038,7 @@ export const WorkoutOfMesocycleUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), workoutId: z.string(), mesocycleId: z.string(), splitDayIndex: z.number().int(), @@ -3046,13 +3046,13 @@ export const WorkoutOfMesocycleCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), }).strict(); export const WorkoutOfMesocycleUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), mesocycleId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), @@ -3060,7 +3060,7 @@ export const WorkoutOfMesocycleUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -3070,7 +3070,7 @@ export const WorkoutCreateInputSchema: z.ZodType = z. }).strict(); export const WorkoutUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -3080,7 +3080,7 @@ export const WorkoutUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -3090,7 +3090,7 @@ export const WorkoutUpdateInputSchema: z.ZodType = z. }).strict(); export const WorkoutUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -3100,7 +3100,7 @@ export const WorkoutUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -3108,14 +3108,14 @@ export const WorkoutCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const WorkoutUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -3123,7 +3123,7 @@ export const WorkoutUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -3144,7 +3144,7 @@ export const WorkoutExerciseCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), workoutId: z.string(), @@ -3165,7 +3165,7 @@ export const WorkoutExerciseUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -3186,7 +3186,7 @@ export const WorkoutExerciseUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), @@ -3207,7 +3207,7 @@ export const WorkoutExerciseUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), workoutId: z.string(), @@ -3227,7 +3227,7 @@ export const WorkoutExerciseCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -3246,7 +3246,7 @@ export const WorkoutExerciseUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), @@ -3266,7 +3266,7 @@ export const WorkoutExerciseUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -3277,7 +3277,7 @@ export const WorkoutExerciseSetCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), workoutExerciseId: z.string(), reps: z.number().int(), @@ -3288,7 +3288,7 @@ export const WorkoutExerciseSetUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -3299,7 +3299,7 @@ export const WorkoutExerciseSetUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutExerciseId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), @@ -3310,7 +3310,7 @@ export const WorkoutExerciseSetUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), workoutExerciseId: z.string(), reps: z.number().int(), @@ -3320,7 +3320,7 @@ export const WorkoutExerciseSetCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -3329,7 +3329,7 @@ export const WorkoutExerciseSetUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutExerciseId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), @@ -3339,7 +3339,7 @@ export const WorkoutExerciseSetUncheckedUpdateManyInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -3348,7 +3348,7 @@ export const WorkoutExerciseMiniSetCreateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -3357,7 +3357,7 @@ export const WorkoutExerciseMiniSetUncheckedCreateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -3366,7 +3366,7 @@ export const WorkoutExerciseMiniSetUpdateInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -3375,7 +3375,7 @@ export const WorkoutExerciseMiniSetUncheckedUpdateInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -3384,7 +3384,7 @@ export const WorkoutExerciseMiniSetCreateManyInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -3392,7 +3392,7 @@ export const WorkoutExerciseMiniSetUpdateManyMutationInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -5890,7 +5890,7 @@ export const NestedEnumWorkoutStatusNullableWithAggregatesFilterSchema: z.ZodTyp }).strict(); export const UserCreateWithoutExerciseSplitsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -5904,7 +5904,7 @@ export const UserCreateWithoutExerciseSplitsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -5923,7 +5923,7 @@ export const UserCreateOrConnectWithoutExerciseSplitsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -5931,7 +5931,7 @@ export const ExerciseSplitDayCreateWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -5949,7 +5949,7 @@ export const ExerciseSplitDayCreateManyExerciseSplitInputEnvelopeSchema: z.ZodTy }).strict(); export const MesocycleCreateWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.coerce.date().optional().nullable(), @@ -5964,7 +5964,7 @@ export const MesocycleCreateWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -6000,7 +6000,7 @@ export const UserUpdateToOneWithWhereWithoutExerciseSplitsInputSchema: z.ZodType }).strict(); export const UserUpdateWithoutExerciseSplitsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6014,7 +6014,7 @@ export const UserUpdateWithoutExerciseSplitsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6087,7 +6087,7 @@ export const MesocycleScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -6102,7 +6102,7 @@ export const ExerciseTemplateCreateWithoutExerciseSplitDayInputSchema: z.ZodType }).strict(); export const ExerciseTemplateUncheckedCreateWithoutExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -6127,14 +6127,14 @@ export const ExerciseTemplateCreateManyExerciseSplitDayInputEnvelopeSchema: z.Zo }).strict(); export const ExerciseSplitCreateWithoutExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), user: z.lazy(() => UserCreateNestedOneWithoutExerciseSplitsInputSchema), usedByMesocycles: z.lazy(() => MesocycleCreateNestedManyWithoutExerciseSplitInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedCreateWithoutExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), usedByMesocycles: z.lazy(() => MesocycleUncheckedCreateNestedManyWithoutExerciseSplitInputSchema).optional() @@ -6192,21 +6192,21 @@ export const ExerciseSplitUpdateToOneWithWhereWithoutExerciseSplitDaysInputSchem }).strict(); export const ExerciseSplitUpdateWithoutExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), user: z.lazy(() => UserUpdateOneRequiredWithoutExerciseSplitsNestedInputSchema).optional(), usedByMesocycles: z.lazy(() => MesocycleUpdateManyWithoutExerciseSplitNestedInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedUpdateWithoutExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), usedByMesocycles: z.lazy(() => MesocycleUncheckedUpdateManyWithoutExerciseSplitNestedInputSchema).optional() }).strict(); export const ExerciseSplitDayCreateWithoutExercisesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -6214,7 +6214,7 @@ export const ExerciseSplitDayCreateWithoutExercisesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -6238,7 +6238,7 @@ export const ExerciseSplitDayUpdateToOneWithWhereWithoutExercisesInputSchema: z. }).strict(); export const ExerciseSplitDayUpdateWithoutExercisesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -6246,7 +6246,7 @@ export const ExerciseSplitDayUpdateWithoutExercisesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -6254,7 +6254,7 @@ export const ExerciseSplitDayUncheckedUpdateWithoutExercisesInputSchema: z.ZodTy }).strict(); export const UserCreateWithoutMesocyclesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -6268,7 +6268,7 @@ export const UserCreateWithoutMesocyclesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -6287,14 +6287,14 @@ export const UserCreateOrConnectWithoutMesocyclesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), user: z.lazy(() => UserCreateNestedOneWithoutExerciseSplitsInputSchema), exerciseSplitDays: z.lazy(() => ExerciseSplitDayCreateNestedManyWithoutExerciseSplitInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedCreateWithoutUsedByMesocyclesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUncheckedCreateNestedManyWithoutExerciseSplitInputSchema).optional() @@ -6306,7 +6306,7 @@ export const ExerciseSplitCreateOrConnectWithoutUsedByMesocyclesInputSchema: z.Z }).strict(); export const MesocycleExerciseSplitDayCreateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -6314,7 +6314,7 @@ export const MesocycleExerciseSplitDayCreateWithoutMesocycleInputSchema: z.ZodTy }).strict(); export const MesocycleExerciseSplitDayUncheckedCreateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -6332,7 +6332,7 @@ export const MesocycleExerciseSplitDayCreateManyMesocycleInputEnvelopeSchema: z. }).strict(); export const MesocycleCyclicSetChangeCreateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), muscleGroup: z.lazy(() => MuscleGroupSchema), customMuscleGroup: z.string().optional().nullable(), regardlessOfProgress: z.boolean(), @@ -6341,7 +6341,7 @@ export const MesocycleCyclicSetChangeCreateWithoutMesocycleInputSchema: z.ZodTyp }).strict(); export const MesocycleCyclicSetChangeUncheckedCreateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), muscleGroup: z.lazy(() => MuscleGroupSchema), customMuscleGroup: z.string().optional().nullable(), regardlessOfProgress: z.boolean(), @@ -6360,14 +6360,14 @@ export const MesocycleCyclicSetChangeCreateManyMesocycleInputEnvelopeSchema: z.Z }).strict(); export const WorkoutOfMesocycleCreateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), splitDayIndex: z.number().int(), workoutStatus: z.lazy(() => WorkoutStatusSchema).optional().nullable(), workout: z.lazy(() => WorkoutCreateNestedOneWithoutWorkoutOfMesocycleInputSchema) }).strict(); export const WorkoutOfMesocycleUncheckedCreateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), workoutId: z.string(), splitDayIndex: z.number().int(), workoutStatus: z.lazy(() => WorkoutStatusSchema).optional().nullable() @@ -6395,7 +6395,7 @@ export const UserUpdateToOneWithWhereWithoutMesocyclesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6409,7 +6409,7 @@ export const UserUpdateWithoutMesocyclesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6434,14 +6434,14 @@ export const ExerciseSplitUpdateToOneWithWhereWithoutUsedByMesocyclesInputSchema }).strict(); export const ExerciseSplitUpdateWithoutUsedByMesocyclesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), user: z.lazy(() => UserUpdateOneRequiredWithoutExerciseSplitsNestedInputSchema).optional(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUpdateManyWithoutExerciseSplitNestedInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedUpdateWithoutUsedByMesocyclesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUncheckedUpdateManyWithoutExerciseSplitNestedInputSchema).optional() @@ -6531,7 +6531,7 @@ export const WorkoutOfMesocycleScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.coerce.date().optional().nullable(), @@ -6546,7 +6546,7 @@ export const MesocycleCreateWithoutMesocycleCyclicSetChangesInputSchema: z.ZodTy }).strict(); export const MesocycleUncheckedCreateWithoutMesocycleCyclicSetChangesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitId: z.string().optional().nullable(), @@ -6577,7 +6577,7 @@ export const MesocycleUpdateToOneWithWhereWithoutMesocycleCyclicSetChangesInputS }).strict(); export const MesocycleUpdateWithoutMesocycleCyclicSetChangesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6592,7 +6592,7 @@ export const MesocycleUpdateWithoutMesocycleCyclicSetChangesInputSchema: z.ZodTy }).strict(); export const MesocycleUncheckedUpdateWithoutMesocycleCyclicSetChangesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6607,7 +6607,7 @@ export const MesocycleUncheckedUpdateWithoutMesocycleCyclicSetChangesInputSchema }).strict(); export const MesocycleCreateWithoutMesocycleExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.coerce.date().optional().nullable(), @@ -6622,7 +6622,7 @@ export const MesocycleCreateWithoutMesocycleExerciseSplitDaysInputSchema: z.ZodT }).strict(); export const MesocycleUncheckedCreateWithoutMesocycleExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitId: z.string().optional().nullable(), @@ -6642,7 +6642,7 @@ export const MesocycleCreateOrConnectWithoutMesocycleExerciseSplitDaysInputSchem }).strict(); export const MesocycleExerciseTemplateCreateWithoutMesocycleExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -6662,7 +6662,7 @@ export const MesocycleExerciseTemplateCreateWithoutMesocycleExerciseSplitDayInpu }).strict(); export const MesocycleExerciseTemplateUncheckedCreateWithoutMesocycleExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -6703,7 +6703,7 @@ export const MesocycleUpdateToOneWithWhereWithoutMesocycleExerciseSplitDaysInput }).strict(); export const MesocycleUpdateWithoutMesocycleExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6718,7 +6718,7 @@ export const MesocycleUpdateWithoutMesocycleExerciseSplitDaysInputSchema: z.ZodT }).strict(); export const MesocycleUncheckedUpdateWithoutMesocycleExerciseSplitDaysInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -6773,7 +6773,7 @@ export const MesocycleExerciseTemplateScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -6781,7 +6781,7 @@ export const MesocycleExerciseSplitDayCreateWithoutMesocycleSplitDayExercisesInp }).strict(); export const MesocycleExerciseSplitDayUncheckedCreateWithoutMesocycleSplitDayExercisesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean(), @@ -6805,7 +6805,7 @@ export const MesocycleExerciseSplitDayUpdateToOneWithWhereWithoutMesocycleSplitD }).strict(); export const MesocycleExerciseSplitDayUpdateWithoutMesocycleSplitDayExercisesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -6813,7 +6813,7 @@ export const MesocycleExerciseSplitDayUpdateWithoutMesocycleSplitDayExercisesInp }).strict(); export const MesocycleExerciseSplitDayUncheckedUpdateWithoutMesocycleSplitDayExercisesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -6885,14 +6885,14 @@ export const SessionCreateManyUserInputEnvelopeSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayCreateNestedManyWithoutExerciseSplitInputSchema).optional(), usedByMesocycles: z.lazy(() => MesocycleCreateNestedManyWithoutExerciseSplitInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedCreateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUncheckedCreateNestedManyWithoutExerciseSplitInputSchema).optional(), usedByMesocycles: z.lazy(() => MesocycleUncheckedCreateNestedManyWithoutExerciseSplitInputSchema).optional() @@ -6909,7 +6909,7 @@ export const ExerciseSplitCreateManyUserInputEnvelopeSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.coerce.date().optional().nullable(), @@ -6924,7 +6924,7 @@ export const MesocycleCreateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseSplitId: z.string().optional().nullable(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -6949,7 +6949,7 @@ export const MesocycleCreateManyUserInputEnvelopeSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -6958,7 +6958,7 @@ export const WorkoutCreateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -7107,7 +7107,7 @@ export const WorkoutScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -7121,7 +7121,7 @@ export const UserCreateWithoutAccountsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -7151,7 +7151,7 @@ export const UserUpdateToOneWithWhereWithoutAccountsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7165,7 +7165,7 @@ export const UserUpdateWithoutAccountsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7179,7 +7179,7 @@ export const UserUncheckedUpdateWithoutAccountsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -7193,7 +7193,7 @@ export const UserCreateWithoutSessionsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -7223,7 +7223,7 @@ export const UserUpdateToOneWithWhereWithoutSessionsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7237,7 +7237,7 @@ export const UserUpdateWithoutSessionsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7251,7 +7251,7 @@ export const UserUncheckedUpdateWithoutSessionsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -7260,7 +7260,7 @@ export const WorkoutCreateWithoutWorkoutOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -7274,7 +7274,7 @@ export const WorkoutCreateOrConnectWithoutWorkoutOfMesocycleInputSchema: z.ZodTy }).strict(); export const MesocycleCreateWithoutWorkoutsOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.coerce.date().optional().nullable(), @@ -7289,7 +7289,7 @@ export const MesocycleCreateWithoutWorkoutsOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), exerciseSplitId: z.string().optional().nullable(), @@ -7320,7 +7320,7 @@ export const WorkoutUpdateToOneWithWhereWithoutWorkoutOfMesocycleInputSchema: z. }).strict(); export const WorkoutUpdateWithoutWorkoutOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -7329,7 +7329,7 @@ export const WorkoutUpdateWithoutWorkoutOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -7349,7 +7349,7 @@ export const MesocycleUpdateToOneWithWhereWithoutWorkoutsOfMesocycleInputSchema: }).strict(); export const MesocycleUpdateWithoutWorkoutsOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7364,7 +7364,7 @@ export const MesocycleUpdateWithoutWorkoutsOfMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7379,7 +7379,7 @@ export const MesocycleUncheckedUpdateWithoutWorkoutsOfMesocycleInputSchema: z.Zo }).strict(); export const UserCreateWithoutWorkoutsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -7393,7 +7393,7 @@ export const UserCreateWithoutWorkoutsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string().optional().nullable(), email: z.string(), emailVerified: z.coerce.date().optional().nullable(), @@ -7412,14 +7412,14 @@ export const UserCreateOrConnectWithoutWorkoutsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), splitDayIndex: z.number().int(), workoutStatus: z.lazy(() => WorkoutStatusSchema).optional().nullable(), mesocycle: z.lazy(() => MesocycleCreateNestedOneWithoutWorkoutsOfMesocycleInputSchema) }).strict(); export const WorkoutOfMesocycleUncheckedCreateWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), mesocycleId: z.string(), splitDayIndex: z.number().int(), workoutStatus: z.lazy(() => WorkoutStatusSchema).optional().nullable() @@ -7431,7 +7431,7 @@ export const WorkoutOfMesocycleCreateOrConnectWithoutWorkoutInputSchema: z.ZodTy }).strict(); export const WorkoutExerciseCreateWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -7451,7 +7451,7 @@ export const WorkoutExerciseCreateWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -7492,7 +7492,7 @@ export const UserUpdateToOneWithWhereWithoutWorkoutsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7506,7 +7506,7 @@ export const UserUpdateWithoutWorkoutsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), email: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), emailVerified: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7531,14 +7531,14 @@ export const WorkoutOfMesocycleUpdateToOneWithWhereWithoutWorkoutInputSchema: z. }).strict(); export const WorkoutOfMesocycleUpdateWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), mesocycle: z.lazy(() => MesocycleUpdateOneRequiredWithoutWorkoutsOfMesocycleNestedInputSchema).optional() }).strict(); export const WorkoutOfMesocycleUncheckedUpdateWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), mesocycleId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7584,7 +7584,7 @@ export const WorkoutExerciseScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -7593,7 +7593,7 @@ export const WorkoutCreateWithoutWorkoutExercisesInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date(), @@ -7607,7 +7607,7 @@ export const WorkoutCreateOrConnectWithoutWorkoutExercisesInputSchema: z.ZodType }).strict(); export const WorkoutExerciseSetCreateWithoutWorkoutExerciseInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -7617,7 +7617,7 @@ export const WorkoutExerciseSetCreateWithoutWorkoutExerciseInputSchema: z.ZodTyp }).strict(); export const WorkoutExerciseSetUncheckedCreateWithoutWorkoutExerciseInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -7648,7 +7648,7 @@ export const WorkoutUpdateToOneWithWhereWithoutWorkoutExercisesInputSchema: z.Zo }).strict(); export const WorkoutUpdateWithoutWorkoutExercisesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -7657,7 +7657,7 @@ export const WorkoutUpdateWithoutWorkoutExercisesInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -7695,7 +7695,7 @@ export const WorkoutExerciseSetScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -7715,7 +7715,7 @@ export const WorkoutExerciseCreateWithoutSetsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), workoutId: z.string(), @@ -7740,7 +7740,7 @@ export const WorkoutExerciseCreateOrConnectWithoutSetsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -7748,7 +7748,7 @@ export const WorkoutExerciseMiniSetCreateWithoutParentSetInputSchema: z.ZodType< }).strict(); export const WorkoutExerciseMiniSetUncheckedCreateWithoutParentSetInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -7777,7 +7777,7 @@ export const WorkoutExerciseUpdateToOneWithWhereWithoutSetsInputSchema: z.ZodTyp }).strict(); export const WorkoutExerciseUpdateWithoutSetsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -7797,7 +7797,7 @@ export const WorkoutExerciseUpdateWithoutSetsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), @@ -7845,7 +7845,7 @@ export const WorkoutExerciseMiniSetScalarWhereInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -7855,7 +7855,7 @@ export const WorkoutExerciseSetCreateWithoutMiniSetsInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), workoutExerciseId: z.string(), reps: z.number().int(), @@ -7881,7 +7881,7 @@ export const WorkoutExerciseSetUpdateToOneWithWhereWithoutMiniSetsInputSchema: z }).strict(); export const WorkoutExerciseSetUpdateWithoutMiniSetsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -7891,7 +7891,7 @@ export const WorkoutExerciseSetUpdateWithoutMiniSetsInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutExerciseId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), @@ -7901,14 +7901,14 @@ export const WorkoutExerciseSetUncheckedUpdateWithoutMiniSetsInputSchema: z.ZodT }).strict(); export const ExerciseSplitDayCreateManyExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean() }).strict(); export const MesocycleCreateManyExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), userId: z.string(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -7920,7 +7920,7 @@ export const MesocycleCreateManyExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -7928,7 +7928,7 @@ export const ExerciseSplitDayUpdateWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -7936,14 +7936,14 @@ export const ExerciseSplitDayUncheckedUpdateWithoutExerciseSplitInputSchema: z.Z }).strict(); export const ExerciseSplitDayUncheckedUpdateManyWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const MesocycleUpdateWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -7958,7 +7958,7 @@ export const MesocycleUpdateWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -7973,7 +7973,7 @@ export const MesocycleUncheckedUpdateWithoutExerciseSplitInputSchema: z.ZodType< }).strict(); export const MesocycleUncheckedUpdateManyWithoutExerciseSplitInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -7985,7 +7985,7 @@ export const MesocycleUncheckedUpdateManyWithoutExerciseSplitInputSchema: z.ZodT }).strict(); export const ExerciseTemplateCreateManyExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -8000,7 +8000,7 @@ export const ExerciseTemplateCreateManyExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8015,7 +8015,7 @@ export const ExerciseTemplateUpdateWithoutExerciseSplitDayInputSchema: z.ZodType }).strict(); export const ExerciseTemplateUncheckedUpdateWithoutExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8030,7 +8030,7 @@ export const ExerciseTemplateUncheckedUpdateWithoutExerciseSplitDayInputSchema: }).strict(); export const ExerciseTemplateUncheckedUpdateManyWithoutExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8045,14 +8045,14 @@ export const ExerciseTemplateUncheckedUpdateManyWithoutExerciseSplitDayInputSche }).strict(); export const MesocycleExerciseSplitDayCreateManyMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), dayIndex: z.number().int(), isRestDay: z.boolean() }).strict(); export const MesocycleCyclicSetChangeCreateManyMesocycleInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), muscleGroup: z.lazy(() => MuscleGroupSchema), customMuscleGroup: z.string().optional().nullable(), regardlessOfProgress: z.boolean(), @@ -8061,14 +8061,14 @@ export const MesocycleCyclicSetChangeCreateManyMesocycleInputSchema: z.ZodType

= z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), workoutId: z.string(), splitDayIndex: z.number().int(), workoutStatus: z.lazy(() => WorkoutStatusSchema).optional().nullable() }).strict(); export const MesocycleExerciseSplitDayUpdateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -8076,7 +8076,7 @@ export const MesocycleExerciseSplitDayUpdateWithoutMesocycleInputSchema: z.ZodTy }).strict(); export const MesocycleExerciseSplitDayUncheckedUpdateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -8084,14 +8084,14 @@ export const MesocycleExerciseSplitDayUncheckedUpdateWithoutMesocycleInputSchema }).strict(); export const MesocycleExerciseSplitDayUncheckedUpdateManyWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), dayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), isRestDay: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const MesocycleCyclicSetChangeUpdateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), regardlessOfProgress: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -8100,7 +8100,7 @@ export const MesocycleCyclicSetChangeUpdateWithoutMesocycleInputSchema: z.ZodTyp }).strict(); export const MesocycleCyclicSetChangeUncheckedUpdateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), regardlessOfProgress: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -8109,7 +8109,7 @@ export const MesocycleCyclicSetChangeUncheckedUpdateWithoutMesocycleInputSchema: }).strict(); export const MesocycleCyclicSetChangeUncheckedUpdateManyWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), muscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), customMuscleGroup: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), regardlessOfProgress: z.union([ z.boolean(),z.lazy(() => BoolFieldUpdateOperationsInputSchema) ]).optional(), @@ -8118,28 +8118,28 @@ export const MesocycleCyclicSetChangeUncheckedUpdateManyWithoutMesocycleInputSch }).strict(); export const WorkoutOfMesocycleUpdateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), workout: z.lazy(() => WorkoutUpdateOneRequiredWithoutWorkoutOfMesocycleNestedInputSchema).optional() }).strict(); export const WorkoutOfMesocycleUncheckedUpdateWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), }).strict(); export const WorkoutOfMesocycleUncheckedUpdateManyWithoutMesocycleInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), workoutId: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), splitDayIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), workoutStatus: z.union([ z.lazy(() => WorkoutStatusSchema),z.lazy(() => NullableEnumWorkoutStatusFieldUpdateOperationsInputSchema) ]).optional().nullable(), }).strict(); export const MesocycleExerciseTemplateCreateManyMesocycleExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseIndex: z.number().int(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -8159,7 +8159,7 @@ export const MesocycleExerciseTemplateCreateManyMesocycleExerciseSplitDayInputSc }).strict(); export const MesocycleExerciseTemplateUpdateWithoutMesocycleExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8179,7 +8179,7 @@ export const MesocycleExerciseTemplateUpdateWithoutMesocycleExerciseSplitDayInpu }).strict(); export const MesocycleExerciseTemplateUncheckedUpdateWithoutMesocycleExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8199,7 +8199,7 @@ export const MesocycleExerciseTemplateUncheckedUpdateWithoutMesocycleExerciseSpl }).strict(); export const MesocycleExerciseTemplateUncheckedUpdateManyWithoutMesocycleExerciseSplitDayInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8241,12 +8241,12 @@ export const SessionCreateManyUserInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string() }).strict(); export const MesocycleCreateManyUserInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), name: z.string(), exerciseSplitId: z.string().optional().nullable(), RIRProgression: z.union([ z.lazy(() => MesocycleCreateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -8258,7 +8258,7 @@ export const MesocycleCreateManyUserInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), userBodyweight: z.number().int(), startedAt: z.coerce.date(), endedAt: z.coerce.date() @@ -8331,26 +8331,26 @@ export const SessionUncheckedUpdateManyWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUpdateManyWithoutExerciseSplitNestedInputSchema).optional(), usedByMesocycles: z.lazy(() => MesocycleUpdateManyWithoutExerciseSplitNestedInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedUpdateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitDays: z.lazy(() => ExerciseSplitDayUncheckedUpdateManyWithoutExerciseSplitNestedInputSchema).optional(), usedByMesocycles: z.lazy(() => MesocycleUncheckedUpdateManyWithoutExerciseSplitNestedInputSchema).optional() }).strict(); export const ExerciseSplitUncheckedUpdateManyWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const MesocycleUpdateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), startDate: z.union([ z.coerce.date(),z.lazy(() => NullableDateTimeFieldUpdateOperationsInputSchema) ]).optional().nullable(), @@ -8365,7 +8365,7 @@ export const MesocycleUpdateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -8380,7 +8380,7 @@ export const MesocycleUncheckedUpdateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseSplitId: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(), RIRProgression: z.union([ z.lazy(() => MesocycleUpdateRIRProgressionInputSchema),z.number().int().array() ]).optional(), @@ -8392,7 +8392,7 @@ export const MesocycleUncheckedUpdateManyWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -8401,7 +8401,7 @@ export const WorkoutUpdateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), @@ -8410,14 +8410,14 @@ export const WorkoutUncheckedUpdateWithoutUserInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), userBodyweight: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), startedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), endedAt: z.union([ z.coerce.date(),z.lazy(() => DateTimeFieldUpdateOperationsInputSchema) ]).optional(), }).strict(); export const WorkoutExerciseCreateManyWorkoutInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), exerciseIndex: z.number().int(), name: z.string(), targetMuscleGroup: z.lazy(() => MuscleGroupSchema), @@ -8436,7 +8436,7 @@ export const WorkoutExerciseCreateManyWorkoutInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8456,7 +8456,7 @@ export const WorkoutExerciseUpdateWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8476,7 +8476,7 @@ export const WorkoutExerciseUncheckedUpdateWithoutWorkoutInputSchema: z.ZodType< }).strict(); export const WorkoutExerciseUncheckedUpdateManyWithoutWorkoutInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), exerciseIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), name: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), targetMuscleGroup: z.union([ z.lazy(() => MuscleGroupSchema),z.lazy(() => EnumMuscleGroupFieldUpdateOperationsInputSchema) ]).optional(), @@ -8495,7 +8495,7 @@ export const WorkoutExerciseUncheckedUpdateManyWithoutWorkoutInputSchema: z.ZodT }).strict(); export const WorkoutExerciseSetCreateManyWorkoutExerciseInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), setIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -8504,7 +8504,7 @@ export const WorkoutExerciseSetCreateManyWorkoutExerciseInputSchema: z.ZodType

= z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -8514,7 +8514,7 @@ export const WorkoutExerciseSetUpdateWithoutWorkoutExerciseInputSchema: z.ZodTyp }).strict(); export const WorkoutExerciseSetUncheckedUpdateWithoutWorkoutExerciseInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -8524,7 +8524,7 @@ export const WorkoutExerciseSetUncheckedUpdateWithoutWorkoutExerciseInputSchema: }).strict(); export const WorkoutExerciseSetUncheckedUpdateManyWithoutWorkoutExerciseInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), setIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -8533,7 +8533,7 @@ export const WorkoutExerciseSetUncheckedUpdateManyWithoutWorkoutExerciseInputSch }).strict(); export const WorkoutExerciseMiniSetCreateManyParentSetInputSchema: z.ZodType = z.object({ - id: z.string().cuid().optional(), + id: z.string().cuid2().optional(), miniSetIndex: z.number().int(), reps: z.number().int(), load: z.number(), @@ -8541,7 +8541,7 @@ export const WorkoutExerciseMiniSetCreateManyParentSetInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -8549,7 +8549,7 @@ export const WorkoutExerciseMiniSetUpdateWithoutParentSetInputSchema: z.ZodType< }).strict(); export const WorkoutExerciseMiniSetUncheckedUpdateWithoutParentSetInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), @@ -8557,7 +8557,7 @@ export const WorkoutExerciseMiniSetUncheckedUpdateWithoutParentSetInputSchema: z }).strict(); export const WorkoutExerciseMiniSetUncheckedUpdateManyWithoutParentSetInputSchema: z.ZodType = z.object({ - id: z.union([ z.string().cuid(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), + id: z.union([ z.string().cuid2(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(), miniSetIndex: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), reps: z.union([ z.number().int(),z.lazy(() => IntFieldUpdateOperationsInputSchema) ]).optional(), load: z.union([ z.number(),z.lazy(() => FloatFieldUpdateOperationsInputSchema) ]).optional(), From 304abaa54a0253839b5458aad9bdffe2ca4a33db Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 17:55:19 +0530 Subject: [PATCH 45/68] feat: added missing orderBy clauses and moved to new command to create CUID2 --- src/lib/trpc/routes/exerciseSplits.ts | 16 ++++----- src/lib/trpc/routes/mesocycles.ts | 20 +++++------ src/lib/trpc/routes/workouts.ts | 48 +++++++++++++++++---------- src/lib/utils/userCreation.ts | 4 +-- tests/global-setup.ts | 4 +-- 5 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/lib/trpc/routes/exerciseSplits.ts b/src/lib/trpc/routes/exerciseSplits.ts index 1407620b..200492ae 100644 --- a/src/lib/trpc/routes/exerciseSplits.ts +++ b/src/lib/trpc/routes/exerciseSplits.ts @@ -6,7 +6,7 @@ import { ExerciseTemplateCreateWithoutExerciseSplitDayInputSchema } from '$lib/zodSchemas'; import type { ExerciseSplit, ExerciseSplitDay, Prisma } from '@prisma/client'; -import cuid from 'cuid'; +import { createId } from '@paralleldrive/cuid2'; const zodExerciseSplitInput = z.strictObject({ splitName: z.string(), @@ -19,12 +19,12 @@ const createOrEditExerciseSplit = async ( userId: string, editingId?: string ) => { - const exerciseSplitId = editingId ?? cuid(); + const exerciseSplitId = editingId ?? createId(); const exerciseSplit: ExerciseSplit = { id: exerciseSplitId, name: input.splitName, userId }; const exerciseSplitDays: ExerciseSplitDay[] = input.splitDays.map((splitDay) => ({ ...splitDay, - id: cuid(), + id: createId(), exerciseSplitId: exerciseSplit.id })); @@ -32,7 +32,7 @@ const createOrEditExerciseSplit = async ( (dayExercises, dayNumber) => dayExercises.map((exercise) => ({ ...exercise, - id: cuid(), + id: createId(), exerciseSplitDayId: exerciseSplitDays[dayNumber].id })) ); @@ -49,7 +49,7 @@ const createOrEditExerciseSplit = async ( }; export const exerciseSplits = t.router({ - findById: t.procedure.input(z.string().cuid()).query(({ input, ctx }) => + findById: t.procedure.input(z.string().cuid2()).query(({ input, ctx }) => prisma.exerciseSplit.findUnique({ where: { id: input, userId: ctx.userId }, include: { @@ -64,7 +64,7 @@ export const exerciseSplits = t.router({ load: t.procedure .input( z.strictObject({ - cursorId: z.string().cuid().optional(), + cursorId: z.string().cuid2().optional(), searchString: z.string().optional() }) ) @@ -92,13 +92,13 @@ export const exerciseSplits = t.router({ }), editById: t.procedure - .input(z.strictObject({ id: z.string().cuid(), splitData: zodExerciseSplitInput })) + .input(z.strictObject({ id: z.string().cuid2(), splitData: zodExerciseSplitInput })) .mutation(async ({ input, ctx }) => { await createOrEditExerciseSplit(input.splitData, ctx.userId, input.id); return { message: 'Exercise split edited successfully' }; }), - deleteById: t.procedure.input(z.string().cuid()).mutation(async ({ input, ctx }) => { + deleteById: t.procedure.input(z.string().cuid2()).mutation(async ({ input, ctx }) => { await prisma.exerciseSplit.delete({ where: { userId: ctx.userId, id: input } }); return { message: 'Exercise split deleted successfully' }; }) diff --git a/src/lib/trpc/routes/mesocycles.ts b/src/lib/trpc/routes/mesocycles.ts index b2b2468a..4c464337 100644 --- a/src/lib/trpc/routes/mesocycles.ts +++ b/src/lib/trpc/routes/mesocycles.ts @@ -11,7 +11,7 @@ import { MesocycleUpdateInputSchema } from '$lib/zodSchemas'; import { Prisma } from '@prisma/client'; -import cuid from 'cuid'; +import { createId } from '@paralleldrive/cuid2'; import { TRPCError } from '@trpc/server'; const zodMesocycleCreateInput = z.strictObject({ @@ -36,7 +36,7 @@ const zodUpdateExerciseSplitInput = z.strictObject({ mesocycleExerciseTemplates: z.array( z.array(MesocycleExerciseTemplateCreateWithoutMesocycleExerciseSplitDayInputSchema) ), - mesocycleId: z.string().cuid() + mesocycleId: z.string().cuid2() }); const getActiveMesocycle = async (userId: string) => { @@ -47,7 +47,7 @@ const getActiveMesocycle = async (userId: string) => { }; export const mesocycles = t.router({ - findById: t.procedure.input(z.string().cuid()).query( + findById: t.procedure.input(z.string().cuid2()).query( async ({ input, ctx }) => await prisma.mesocycle.findUnique({ where: { id: input, userId: ctx.userId }, @@ -77,7 +77,7 @@ export const mesocycles = t.router({ }), load: t.procedure - .input(z.object({ cursorId: z.string().cuid().optional(), searchString: z.string().optional() })) + .input(z.object({ cursorId: z.string().cuid2().optional(), searchString: z.string().optional() })) .query(async ({ input, ctx }) => { return prisma.mesocycle.findMany({ where: { userId: ctx.userId, name: { contains: input.searchString, mode: 'insensitive' } }, @@ -90,7 +90,7 @@ export const mesocycles = t.router({ create: t.procedure.input(zodMesocycleCreateInput).mutation(async ({ input, ctx }) => { const mesocycle: Prisma.MesocycleUncheckedCreateInput = { - id: cuid(), + id: createId(), userId: ctx.userId, ...input.mesocycle }; @@ -111,7 +111,7 @@ export const mesocycles = t.router({ input.exerciseSplit.exerciseSplitDays.map((splitDay) => ({ ...splitDay, mesocycleId: mesocycle.id as string, - id: cuid() + id: createId() })); const mesocycleExerciseTemplates: Prisma.MesocycleExerciseTemplateUncheckedCreateInput[] = @@ -134,7 +134,7 @@ export const mesocycles = t.router({ }), editById: t.procedure - .input(z.strictObject({ id: z.string().cuid(), mesocycleData: zodMesocycleEditInput })) + .input(z.strictObject({ id: z.string().cuid2(), mesocycleData: zodMesocycleEditInput })) .mutation(async ({ input, ctx }) => { await prisma.$transaction(async () => { const mesocycle = await prisma.mesocycle.update({ @@ -153,7 +153,7 @@ export const mesocycles = t.router({ return { message: 'Mesocycle edited successfully' }; }), - deleteById: t.procedure.input(z.string().cuid()).mutation(async ({ input, ctx }) => { + deleteById: t.procedure.input(z.string().cuid2()).mutation(async ({ input, ctx }) => { await prisma.mesocycle.delete({ where: { userId: ctx.userId, id: input } }); return { message: 'Mesocycle deleted successfully' }; }), @@ -161,7 +161,7 @@ export const mesocycles = t.router({ progressToNextStage: t.procedure .input( z.strictObject({ - id: z.string().cuid(), + id: z.string().cuid2(), startDate: z.date().nullable(), endDate: z.date().nullable() }) @@ -201,7 +201,7 @@ export const mesocycles = t.router({ where: { mesocycleId: mesocycle.id } }); - const newSplitDaysIds = Array.from({ length: input.mesocycleExerciseSplitDays.length }).map(() => cuid()); + const newSplitDaysIds = Array.from({ length: input.mesocycleExerciseSplitDays.length }).map(() => createId()); const createSplitDaysQuery = prisma.mesocycleExerciseSplitDay.createMany({ data: input.mesocycleExerciseSplitDays.map((splitDay, idx) => ({ ...splitDay, diff --git a/src/lib/trpc/routes/workouts.ts b/src/lib/trpc/routes/workouts.ts index 64315410..bcd42846 100644 --- a/src/lib/trpc/routes/workouts.ts +++ b/src/lib/trpc/routes/workouts.ts @@ -22,7 +22,7 @@ import { type WorkoutOfMesocycle } from '@prisma/client'; import { TRPCError } from '@trpc/server'; -import cuid from 'cuid'; +import { createId } from '@paralleldrive/cuid2'; import { z } from 'zod'; type TodaysWorkoutData = { @@ -50,17 +50,24 @@ const createActiveMesocycleWithProgressionDataInclude = (splitDayIndex?: number) return Prisma.validator()({ mesocycleExerciseSplitDays: { - include: { mesocycleSplitDayExercises: true } + include: { mesocycleSplitDayExercises: true }, + orderBy: { dayIndex: 'asc' } }, mesocycleCyclicSetChanges: true, workoutsOfMesocycle: { include: { workout: { include: { - workoutExercises: { include: { sets: { include: { miniSets: true } } } } + workoutExercises: { + include: { + sets: { include: { miniSets: { orderBy: { miniSetIndex: 'asc' } } }, orderBy: { setIndex: 'asc' } } + }, + orderBy: { exerciseIndex: 'asc' } + } } } }, + orderBy: { workout: { startedAt: 'asc' } }, ...workoutsWhere } }); @@ -75,7 +82,7 @@ const workoutInputDataSchema = z.object({ userBodyweight: z.number(), workoutOfMesocycle: z .object({ - mesocycle: z.object({ id: z.string().cuid() }), + mesocycle: z.object({ id: z.string().cuid2() }), splitDayIndex: z.number().int(), workoutStatus: z.nativeEnum(WorkoutStatus).nullable() }) @@ -90,7 +97,7 @@ const createWorkoutSchema = z.strictObject({ }); const loadWorkoutsSchema = z.strictObject({ - cursorId: z.string().cuid().optional(), + cursorId: z.string().cuid2().optional(), filters: z .object({ startDate: z.date().optional(), @@ -195,7 +202,7 @@ export const workouts = t.router({ return { firstWorkoutDate, lastWorkoutDate, allMesocycles }; }), - findById: t.procedure.input(z.string().cuid()).query(({ input, ctx }) => + findById: t.procedure.input(z.string().cuid2()).query(({ input, ctx }) => prisma.workout.findUnique({ where: { id: input, userId: ctx.userId }, include: { @@ -208,12 +215,17 @@ export const workouts = t.router({ } } }, - workoutExercises: { include: { sets: { include: { miniSets: true } } } } + workoutExercises: { + orderBy: { exerciseIndex: 'asc' }, + include: { + sets: { include: { miniSets: { orderBy: { miniSetIndex: 'asc' } } }, orderBy: { setIndex: 'asc' } } + } + } } }) ), - deleteById: t.procedure.input(z.string().cuid()).mutation(async ({ input, ctx }) => { + deleteById: t.procedure.input(z.string().cuid2()).mutation(async ({ input, ctx }) => { await prisma.workout.delete({ where: { userId: ctx.userId, id: input } }); return { message: 'Workout deleted successfully' }; }), @@ -225,9 +237,11 @@ export const workouts = t.router({ mesocycleExerciseSplitDays: { include: { mesocycleSplitDayExercises: { - select: { name: true, targetMuscleGroup: true, customMuscleGroup: true } + select: { name: true, targetMuscleGroup: true, customMuscleGroup: true }, + orderBy: { exerciseIndex: 'asc' } } - } + }, + orderBy: { dayIndex: 'asc' } }, mesocycleCyclicSetChanges: true, workoutsOfMesocycle: { @@ -317,7 +331,7 @@ export const workouts = t.router({ create: t.procedure.input(createWorkoutSchema).mutation(async ({ ctx, input }) => { const workout: Prisma.WorkoutUncheckedCreateInput = { - id: cuid(), + id: createId(), userId: ctx.userId, startedAt: input.workoutData.startedAt ?? new Date(), endedAt: new Date(), @@ -338,14 +352,14 @@ export const workouts = t.router({ const workoutExercises: Prisma.WorkoutExerciseUncheckedCreateInput[] = input.workoutExercises.map((ex) => ({ ...ex, workoutId: workout.id as string, - id: cuid() + id: createId() })); const workoutExercisesSets: Prisma.WorkoutExerciseSetUncheckedCreateInput[] = input.workoutExercisesSets.flatMap( (sets, exerciseIdx) => sets.map((set) => ({ ...set, - id: cuid(), + id: createId(), workoutExerciseId: workoutExercises[exerciseIdx].id as string })) ); @@ -451,7 +465,7 @@ export const workouts = t.router({ editById: t.procedure .input( z.strictObject({ - id: z.string().cuid(), + id: z.string().cuid2(), data: createWorkoutSchema, endedAt: z.date().or(z.string().date()) }) @@ -472,14 +486,14 @@ export const workouts = t.router({ const workoutExercises: Prisma.WorkoutExerciseUncheckedCreateInput[] = input.data.workoutExercises.map((ex) => ({ ...ex, workoutId: workout.id as string, - id: cuid() + id: createId() })); const workoutExercisesSets: Prisma.WorkoutExerciseSetUncheckedCreateInput[] = input.data.workoutExercisesSets.flatMap((sets, exerciseIdx) => sets.map((set) => ({ ...set, - id: cuid(), + id: createId(), workoutExerciseId: workoutExercises[exerciseIdx].id as string })) ); @@ -511,7 +525,7 @@ export const workouts = t.router({ }), getExerciseHistory: t.procedure - .input(z.strictObject({ exerciseName: z.string(), cursorId: z.string().cuid().optional() })) + .input(z.strictObject({ exerciseName: z.string(), cursorId: z.string().cuid2().optional() })) .query(async ({ ctx, input }) => { return await prisma.workoutExercise.findMany({ where: { workout: { userId: ctx.userId }, name: input.exerciseName }, diff --git a/src/lib/utils/userCreation.ts b/src/lib/utils/userCreation.ts index 12e6bc89..223f1625 100644 --- a/src/lib/utils/userCreation.ts +++ b/src/lib/utils/userCreation.ts @@ -1,6 +1,6 @@ import { prisma } from '$lib/prisma'; import { randomUUID } from 'crypto'; -import cuid from 'cuid'; +import { createId } from '@paralleldrive/cuid2'; export type UserData = { userId: string; @@ -8,7 +8,7 @@ export type UserData = { }; async function createUser() { - const userId = cuid(); + const userId = createId(); const sessionToken = randomUUID(); await prisma.session.create({ diff --git a/tests/global-setup.ts b/tests/global-setup.ts index 00602642..b7f1171e 100644 --- a/tests/global-setup.ts +++ b/tests/global-setup.ts @@ -1,7 +1,7 @@ import { prisma } from '$lib/prisma'; import type { FullConfig } from '@playwright/test'; import { randomUUID } from 'crypto'; -import cuid from 'cuid'; +import { createId } from '@paralleldrive/cuid2'; export type UserData = { userId: string; @@ -10,7 +10,7 @@ export type UserData = { async function globalSetup(config: FullConfig) { const testUsersData: UserData[] = Array.from({ length: config.workers }).map(() => ({ - userId: cuid(), + userId: createId(), sessionToken: randomUUID() })); From 5f5186f172e48b7fd80ce1766b539d6e483668d5 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 18:09:36 +0530 Subject: [PATCH 46/68] chore(deps): update packages --- package-lock.json | 164 +++++++++++++++++++++++----------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1911bf5..89d1a1a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2582,9 +2582,9 @@ } }, "node_modules/@iconify/json": { - "version": "2.2.259", - "resolved": "https://registry.npmjs.org/@iconify/json/-/json-2.2.259.tgz", - "integrity": "sha512-QA5chdx3Jw/jpPv6NrABJIbG6++572KocO/hyebEpSx0KYPc1f5dWkGG1tFu6v9NB7Xls8bXZHXak011Gvoiiw==", + "version": "2.2.260", + "resolved": "https://registry.npmjs.org/@iconify/json/-/json-2.2.260.tgz", + "integrity": "sha512-0vVJBAJ8GOoS07b8yC6c8NHfFx1GJnM8xtebtyynQYZ0/60dxKi86imdNftq5oY/cFfvVUGlmBi/2HS+sxWsWA==", "dev": true, "license": "MIT", "dependencies": { @@ -2777,6 +2777,16 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@noble/hashes": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", @@ -2790,16 +2800,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", - "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7142,43 +7142,6 @@ "whatwg-url": "^13.0.0" } }, - "node_modules/mongodb-connection-string-url/node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -7259,6 +7222,28 @@ } } }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-gyp-build": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", @@ -7325,9 +7310,9 @@ } }, "node_modules/oauth4webapi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.0.0.tgz", - "integrity": "sha512-Rw9SxQYuQX9J41VgM4rVNGtm1ng0Qcd8ndv7JmhmwqQ3hHBokX+WjV379IJhKk7bVPHefgvrDgHoO/rB2dY7YA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.0.1.tgz", + "integrity": "sha512-72NtHQg8vCvm62NE7ckW9brybI3yBaFka5BeEs7Z4jws/k3W1e5UAt61icij/dL1cMnVpxul5jfkMcCTHLXqUQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -7888,9 +7873,9 @@ } }, "node_modules/posthog-js/node_modules/preact": { - "version": "10.24.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", - "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", "license": "MIT", "funding": { "type": "opencollective", @@ -9125,9 +9110,9 @@ "license": "MIT" }, "node_modules/tailwind-merge": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.3.tgz", - "integrity": "sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz", + "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==", "license": "MIT", "funding": { "type": "github", @@ -9485,10 +9470,17 @@ } }, "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } }, "node_modules/trpc-sveltekit": { "version": "3.6.2", @@ -9936,9 +9928,9 @@ } }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "license": "MIT", "dependencies": { "esbuild": "^0.21.3", @@ -10041,16 +10033,16 @@ } }, "node_modules/vitefu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.2.tgz", - "integrity": "sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.3.tgz", + "integrity": "sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==", "license": "MIT", "workspaces": [ "tests/deps/*", "tests/projects/*" ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0" }, "peerDependenciesMeta": { "vite": { @@ -10065,10 +10057,14 @@ "license": "Apache-2.0" }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", @@ -10078,13 +10074,17 @@ "license": "MIT" }, "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dev": true, "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" } }, "node_modules/which": { @@ -10691,9 +10691,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" From c63c70ae48ff60c7df79e83f4f08650ed83d5fdb Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 18:12:01 +0530 Subject: [PATCH 47/68] fix: move to cuid2 --- src/lib/trpc/routes/users.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/lib/trpc/routes/users.ts b/src/lib/trpc/routes/users.ts index 09a4ffcc..47a56e89 100644 --- a/src/lib/trpc/routes/users.ts +++ b/src/lib/trpc/routes/users.ts @@ -10,7 +10,7 @@ import type { } from '$lib/V2/types'; import type { MuscleGroup } from '@prisma/client'; import { TRPCError } from '@trpc/server'; -import cuid from 'cuid'; +import { createId } from '@paralleldrive/cuid2'; function toPascalCase(text: V2MuscleGroup) { return text @@ -132,7 +132,7 @@ export const users = t.router({ .find({ userId: mongoUser._id }) .toArray(); - const mesocycleTemplateIds = Array.from({ length: mesocycleTemplates.length }).map(() => cuid()); + const mesocycleTemplateIds = Array.from({ length: mesocycleTemplates.length }).map(() => createId()); const exerciseSplitCreate = prisma.exerciseSplit.createMany({ data: mesocycleTemplates.map((mesocycleTemplate, idx) => ({ name: mesocycleTemplate.name, @@ -142,7 +142,7 @@ export const users = t.router({ }); const exerciseSplitDayIds = Array.from({ length: mesocycleTemplates.length }).map((_, templateIdx) => - Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit.length }).map(() => cuid()) + Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit.length }).map(() => createId()) ); const exerciseSplitDayCreate = prisma.exerciseSplitDay.createMany({ data: mesocycleTemplates.flatMap((mesocycleTemplate, templateIdx) => @@ -162,7 +162,7 @@ export const users = t.router({ Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit.length }).map((_, dayIndex) => { if (mesocycleTemplates[templateIdx].exerciseSplit[dayIndex] === null) return []; return Array.from({ length: mesocycleTemplates[templateIdx].exerciseSplit[dayIndex].exercises.length }).map( - () => cuid() + () => createId() ); }) ); @@ -186,7 +186,7 @@ export const users = t.router({ ) }); - const mesocycleIds = Array.from({ length: mesocycles.length }).map(() => cuid()); + const mesocycleIds = Array.from({ length: mesocycles.length }).map(() => createId()); const mesocycleCreate = prisma.mesocycle.createMany({ data: mesocycles.map((mesocycle, mesocycleIndex) => { const durationString = `(${getShortDateFromTimestamp(mesocycle.startTimestamp)} - ${getShortDateFromTimestamp(mesocycle.endTimestamp)})`; @@ -214,7 +214,7 @@ export const users = t.router({ const mesocycleExerciseSplitDayIds = Array.from({ length: mesocycles.length }).map((_, mesocycleIdx) => { const template = mesocycleTemplates.find(({ _id }) => mesocycles[mesocycleIdx].templateMesoId === _id); if (!template) return []; - return Array.from({ length: template.exerciseSplit.length }).map((_) => cuid()); + return Array.from({ length: template.exerciseSplit.length }).map((_) => createId()); }); const mesocycleExerciseSplitDayCreate = prisma.mesocycleExerciseSplitDay.createMany({ data: mesocycles.flatMap((mesocycle, mesocycleIdx) => { @@ -239,7 +239,7 @@ export const users = t.router({ return Array.from({ length: template.exerciseSplit.length }).map((_, dayIndex) => { const splitDay = template.exerciseSplit[dayIndex]; if (!splitDay) return []; - return Array.from({ length: splitDay.exercises.length }).map(() => cuid()); + return Array.from({ length: splitDay.exercises.length }).map(() => createId()); }); }); const mesocycleExerciseTemplateCreate = prisma.mesocycleExerciseTemplate.createMany({ @@ -267,8 +267,7 @@ export const users = t.router({ }) }); - const workoutIds = Array.from({ length: workouts.length }).map(() => cuid()); - + const workoutIds = Array.from({ length: workouts.length }).map(() => createId()); await prisma.$transaction([ exerciseSplitCreate, From 0c9e6fff07f104fc842138a4f0ae87aff1ec74b0 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 19:14:08 +0530 Subject: [PATCH 48/68] ui: prevent line-wrap --- .../workouts/[workoutId]/(components)/WorkoutBasicTab.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/workouts/[workoutId]/(components)/WorkoutBasicTab.svelte b/src/routes/workouts/[workoutId]/(components)/WorkoutBasicTab.svelte index d8b2dee9..daccc8b3 100644 --- a/src/routes/workouts/[workoutId]/(components)/WorkoutBasicTab.svelte +++ b/src/routes/workouts/[workoutId]/(components)/WorkoutBasicTab.svelte @@ -95,7 +95,7 @@ {wm.mesocycle.name} - + {wm.workoutStatus === null ? splitDay.name : convertCamelCaseToNormal(wm.workoutStatus)}

From ce16dcbb572b662738d4f07a695f83ea4b398176 Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Mon, 14 Oct 2024 19:19:03 +0530 Subject: [PATCH 49/68] fix: add basic charts to view workout page --- .../[workoutId]/(components)/WorkoutExerciseCharts.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/workouts/[workoutId]/(components)/WorkoutExerciseCharts.svelte b/src/routes/workouts/[workoutId]/(components)/WorkoutExerciseCharts.svelte index 86762c92..4800c64c 100644 --- a/src/routes/workouts/[workoutId]/(components)/WorkoutExerciseCharts.svelte +++ b/src/routes/workouts/[workoutId]/(components)/WorkoutExerciseCharts.svelte @@ -1,6 +1,8 @@