1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2024-12-08 00:44:30 +01:00

Compare commits

..

2 Commits

73 changed files with 128 additions and 114 deletions

View File

@ -13,7 +13,7 @@ const preview: Preview = {
}, },
options: { options: {
storySort: { storySort: {
order: ["Design System", "User Interface", "Errors", "Feature"], order: ["Design System", "Layout", "Errors"],
}, },
}, },
backgrounds: { disable: true }, backgrounds: { disable: true },

View File

@ -5,7 +5,7 @@ RUN corepack enable
WORKDIR /usr/src/app WORKDIR /usr/src/app
FROM node-pnpm AS builder FROM node-pnpm AS builder
RUN pnpm install --global turbo@2.0.9 RUN pnpm install --global turbo@2.0.10
COPY ./ ./ COPY ./ ./
RUN turbo prune @repo/website --docker RUN turbo prune @repo/website --docker

View File

@ -3,10 +3,13 @@ import { notFound } from "next/navigation"
import { getBlogPostBySlug, getBlogPosts } from "@repo/blog" import { getBlogPostBySlug, getBlogPosts } from "@repo/blog"
import { BlogPostUI } from "@repo/blog/BlogPostUI" import { BlogPostUI } from "@repo/blog/BlogPostUI"
import type { Locale } from "@repo/i18n/config"
import { unstable_setRequestLocale } from "next-intl/server"
interface BlogPostPageProps { interface BlogPostPageProps {
params: { params: {
slug: string slug: string
locale: Locale
} }
} }
@ -47,6 +50,9 @@ export const generateStaticParams = async (): Promise<
const BlogPostPage: React.FC<BlogPostPageProps> = async (props) => { const BlogPostPage: React.FC<BlogPostPageProps> = async (props) => {
const { params } = props const { params } = props
// Enable static rendering
unstable_setRequestLocale(params.locale)
const blogPost = await getBlogPostBySlug(params.slug) const blogPost = await getBlogPostBySlug(params.slug)
if (blogPost == null) { if (blogPost == null) {
return notFound() return notFound()

View File

@ -1,12 +1,12 @@
import { getBlogPosts } from "@repo/blog" import { getBlogPosts } from "@repo/blog"
import { BlogPosts } from "@repo/blog/BlogPosts" import { BlogPosts } from "@repo/blog/BlogPosts"
import { LOCALE_DEFAULT, type LocaleProps } from "@repo/i18n/config" import { LOCALE_DEFAULT, type LocaleProps } from "@repo/i18n/config"
import { MainLayout } from "@repo/ui/Layout/MainLayout"
import { import {
Section, Section,
SectionDescription, SectionDescription,
SectionTitle, SectionTitle,
} from "@repo/ui/design/Section" } from "@repo/ui/Layout/Section"
import { MainLayout } from "@repo/ui/MainLayout"
import type { Metadata } from "next" import type { Metadata } from "next"
import { unstable_setRequestLocale } from "next-intl/server" import { unstable_setRequestLocale } from "next-intl/server"

View File

@ -1,9 +1,9 @@
import "@repo/config-tailwind/styles.css" import "@repo/config-tailwind/styles.css"
import type { Locale, LocaleProps } from "@repo/i18n/config" import type { Locale, LocaleProps } from "@repo/i18n/config"
import { LOCALES } from "@repo/i18n/config" import { LOCALES } from "@repo/i18n/config"
import { Footer } from "@repo/ui/Footer" import { Footer } from "@repo/ui/Layout/Footer"
import { Header } from "@repo/ui/Header" import { Header } from "@repo/ui/Layout/Header"
import { ThemeProvider } from "@repo/ui/Header/SwitchTheme" import { ThemeProvider } from "@repo/ui/Layout/Header/SwitchTheme"
import { VERSION } from "@repo/utils/constants" import { VERSION } from "@repo/utils/constants"
import type { Metadata } from "next" import type { Metadata } from "next"
import { NextIntlClientProvider } from "next-intl" import { NextIntlClientProvider } from "next-intl"

View File

@ -1,5 +1,5 @@
import { MainLayout } from "@repo/ui/MainLayout" import { Spinner } from "@repo/ui/Design/Spinner"
import { Spinner } from "@repo/ui/design/Spinner" import { MainLayout } from "@repo/ui/Layout/MainLayout"
const Loading: React.FC = () => { const Loading: React.FC = () => {
return ( return (

View File

@ -1,11 +1,11 @@
import type { LocaleProps } from "@repo/i18n/config" import type { LocaleProps } from "@repo/i18n/config"
import { About } from "@repo/ui/About" import { About } from "@repo/ui/Home/About"
import { RevealFade } from "@repo/ui/design/Section" import { Interests } from "@repo/ui/Home/Interests"
import { Interests } from "@repo/ui/Interests" import { OpenSource } from "@repo/ui/Home/OpenSource"
import { MainLayout } from "@repo/ui/MainLayout" import { Portfolio } from "@repo/ui/Home/Portfolio"
import { OpenSource } from "@repo/ui/OpenSource" import { Skills } from "@repo/ui/Home/Skills"
import { Portfolio } from "@repo/ui/Portfolio" import { MainLayout } from "@repo/ui/Layout/MainLayout"
import { Skills } from "@repo/ui/Skills" import { RevealFade } from "@repo/ui/Layout/Section"
import { unstable_setRequestLocale } from "next-intl/server" import { unstable_setRequestLocale } from "next-intl/server"
interface HomePageProps extends LocaleProps {} interface HomePageProps extends LocaleProps {}

View File

@ -14,6 +14,8 @@ export const config = {
// Set a cookie to remember the previous locale for // Set a cookie to remember the previous locale for
// all requests that have a locale prefix // all requests that have a locale prefix
// Next.js issue, middleware matcher should support template literals:
// https://github.com/vercel/next.js/issues/56398
"/(en-US|fr-FR)/:path*", "/(en-US|fr-FR)/:path*",
// Enable redirects that add missing locales // Enable redirects that add missing locales

View File

@ -33,7 +33,7 @@
"markdownlint-rule-relative-links": "3.0.0", "markdownlint-rule-relative-links": "3.0.0",
"replace-in-files-cli": "3.0.0", "replace-in-files-cli": "3.0.0",
"semantic-release": "23.1.1", "semantic-release": "23.1.1",
"turbo": "2.0.9", "turbo": "2.0.10",
"typescript": "catalog:" "typescript": "catalog:"
} }
} }

View File

@ -1,7 +1,7 @@
"use client" "use client"
import Giscus from "@giscus/react" import Giscus from "@giscus/react"
import { useTheme } from "@repo/ui/Header/SwitchTheme" import { useTheme } from "@repo/ui/Layout/Header/SwitchTheme"
interface BlogPostCommentsProps {} interface BlogPostCommentsProps {}

View File

@ -1,8 +1,8 @@
import { getISODate } from "@repo/utils/dates" import { getISODate } from "@repo/utils/dates"
import "katex/dist/katex.min.css" import "katex/dist/katex.min.css"
import { Typography } from "@repo/ui/design/Typography" import { Typography } from "@repo/ui/Design/Typography"
import { MainLayout } from "@repo/ui/MainLayout" import { MainLayout } from "@repo/ui/Layout/MainLayout"
import type { BlogPost } from "./BlogPost" import type { BlogPost } from "./BlogPost"
import { BlogPostContent } from "./BlogPostContent" import { BlogPostContent } from "./BlogPostContent"

View File

@ -1,6 +1,6 @@
import { Link } from "@repo/i18n/navigation" import { Link } from "@repo/i18n/navigation"
import { Section, SectionContent } from "@repo/ui/design/Section" import { Typography } from "@repo/ui/Design/Typography"
import { Typography } from "@repo/ui/design/Typography" import { Section, SectionContent } from "@repo/ui/Layout/Section"
import { getISODate } from "@repo/utils/dates" import { getISODate } from "@repo/utils/dates"
import type { BlogPost } from "./BlogPost" import type { BlogPost } from "./BlogPost"

View File

@ -4,7 +4,7 @@ import { BLOG_POST_MOCK } from "../BlogPost"
import { BlogPostUI as BlogPostUIComponent } from "../BlogPostUI" import { BlogPostUI as BlogPostUIComponent } from "../BlogPostUI"
const meta = { const meta = {
title: "Feature/Blog/BlogPostUI", title: "Blog/BlogPostUI",
component: BlogPostUIComponent, component: BlogPostUIComponent,
} satisfies Meta<typeof BlogPostUIComponent> } satisfies Meta<typeof BlogPostUIComponent>

View File

@ -4,7 +4,7 @@ import { BLOG_POST_MOCK } from "../BlogPost"
import { BlogPosts as BlogPostsComponent } from "../BlogPosts" import { BlogPosts as BlogPostsComponent } from "../BlogPosts"
const meta = { const meta = {
title: "Feature/Blog/BlogPosts", title: "Blog/BlogPosts",
component: BlogPostsComponent, component: BlogPostsComponent,
} satisfies Meta<typeof BlogPostsComponent> } satisfies Meta<typeof BlogPostsComponent>

View File

@ -4,22 +4,22 @@
"private": true, "private": true,
"type": "module", "type": "module",
"exports": { "exports": {
"./About": "./src/About/About.tsx", "./Design/Button": "./src/Design/Button/Button.tsx",
"./design/Button": "./src/design/Button/Button.tsx", "./Design/Link": "./src/Design/Link/Link.tsx",
"./design/Link": "./src/design/Link/Link.tsx", "./Design/Spinner": "./src/Design/Spinner/Spinner.tsx",
"./design/Section": "./src/design/Section/Section.tsx", "./Design/Typography": "./src/Design/Typography/Typography.tsx",
"./design/Spinner": "./src/design/Spinner/Spinner.tsx",
"./design/Typography": "./src/design/Typography/Typography.tsx",
"./Errors/ErrorNotFound": "./src/Errors/ErrorNotFound/ErrorNotFound.tsx", "./Errors/ErrorNotFound": "./src/Errors/ErrorNotFound/ErrorNotFound.tsx",
"./Errors/ErrorServer": "./src/Errors/ErrorServer/ErrorServer.tsx", "./Errors/ErrorServer": "./src/Errors/ErrorServer/ErrorServer.tsx",
"./Footer": "./src/Footer/Footer.tsx", "./Home/About": "./src/Home/About/About.tsx",
"./Header": "./src/Header/Header.tsx", "./Home/Interests": "./src/Home/Interests/Interests.tsx",
"./Interests": "./src/Interests/Interests.tsx", "./Home/OpenSource": "./src/Home/OpenSource/OpenSource.tsx",
"./Header/SwitchTheme": "./src/Header/SwitchTheme.tsx", "./Home/Portfolio": "./src/Home/Portfolio/Portfolio.tsx",
"./MainLayout": "./src/MainLayout/MainLayout.tsx", "./Home/Skills": "./src/Home/Skills/Skills.tsx",
"./OpenSource": "./src/OpenSource/OpenSource.tsx", "./Layout/Footer": "./src/Layout/Footer/Footer.tsx",
"./Portfolio": "./src/Portfolio/Portfolio.tsx", "./Layout/Header": "./src/Layout/Header/Header.tsx",
"./Skills": "./src/Skills/Skills.tsx" "./Layout/Header/SwitchTheme": "./src/Layout/Header/SwitchTheme.tsx",
"./Layout/MainLayout": "./src/Layout/MainLayout/MainLayout.tsx",
"./Layout/Section": "./src/Layout/Section/Section.tsx"
}, },
"scripts": { "scripts": {
"lint:eslint": "eslint src --max-warnings 0 --report-unused-disable-directives", "lint:eslint": "eslint src --max-warnings 0 --report-unused-disable-directives",

View File

@ -1,8 +1,8 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { MainLayout } from "../../MainLayout/MainLayout" import { Link } from "../../Design/Link/Link"
import { Link } from "../../design/Link/Link" import { Typography } from "../../Design/Typography/Typography"
import { Section } from "../../design/Section/Section" import { MainLayout } from "../../Layout/MainLayout/MainLayout"
import { Typography } from "../../design/Typography/Typography" import { Section } from "../../Layout/Section/Section"
export interface ErrorNotFoundProps {} export interface ErrorNotFoundProps {}

View File

@ -2,10 +2,10 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { useEffect } from "react" import { useEffect } from "react"
import { MainLayout } from "../../MainLayout/MainLayout" import { Button } from "../../Design/Button/Button"
import { Button } from "../../design/Button/Button" import { Typography } from "../../Design/Typography/Typography"
import { Section } from "../../design/Section/Section" import { MainLayout } from "../../Layout/MainLayout/MainLayout"
import { Typography } from "../../design/Typography/Typography" import { Section } from "../../Layout/Section/Section"
export interface ErrorServerProps { export interface ErrorServerProps {
error: Error & { digest?: string } error: Error & { digest?: string }

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { About as AboutComponent } from "./About" import { About as AboutComponent } from "./About"
const meta = { const meta = {
title: "Feature/About", title: "Home/About",
component: AboutComponent, component: AboutComponent,
} satisfies Meta<typeof AboutComponent> } satisfies Meta<typeof AboutComponent>

View File

@ -1,4 +1,4 @@
import { Section, SectionContent } from "../design/Section/Section" import { Section, SectionContent } from "../../Layout/Section/Section"
import { AboutDescription } from "./AboutDescription" import { AboutDescription } from "./AboutDescription"
import { AboutIntroduction } from "./AboutIntroduction" import { AboutIntroduction } from "./AboutIntroduction"
import { AboutList } from "./AboutList/AboutList" import { AboutList } from "./AboutList/AboutList"

View File

@ -1,6 +1,6 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { Button } from "../design/Button/Button" import { Button } from "../../Design/Button/Button"
import { Typography } from "../design/Typography/Typography" import { Typography } from "../../Design/Typography/Typography"
export interface AboutDescriptionProps {} export interface AboutDescriptionProps {}

View File

@ -1,5 +1,5 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { Typography } from "../design/Typography/Typography" import { Typography } from "../../Design/Typography/Typography"
export interface AboutIntroductionProps {} export interface AboutIntroductionProps {}

View File

@ -1,4 +1,4 @@
import { Typography } from "../design/Typography/Typography" import { Typography } from "../../Design/Typography/Typography"
export interface InterestItemProps { export interface InterestItemProps {
title: string title: string

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { Interests as InterestsComponent } from "./Interests" import { Interests as InterestsComponent } from "./Interests"
const meta = { const meta = {
title: "Feature/Interests", title: "Home/Interests",
component: InterestsComponent, component: InterestsComponent,
} satisfies Meta<typeof InterestsComponent> } satisfies Meta<typeof InterestsComponent>

View File

@ -1,12 +1,12 @@
import { GIT_REPO_LINK } from "@repo/utils/constants" import { GIT_REPO_LINK } from "@repo/utils/constants"
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { FaGit, FaMicrochip } from "react-icons/fa" import { FaGit, FaMicrochip } from "react-icons/fa"
import { Link } from "../design/Link/Link" import { Link } from "../../Design/Link/Link"
import { import {
Section, Section,
SectionContent, SectionContent,
SectionTitle, SectionTitle,
} from "../design/Section/Section" } from "../../Layout/Section/Section"
import { InterestItem } from "./InterestItem" import { InterestItem } from "./InterestItem"
export interface InterestsProps {} export interface InterestsProps {}

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { OpenSource as OpenSourceComponent } from "./OpenSource" import { OpenSource as OpenSourceComponent } from "./OpenSource"
const meta = { const meta = {
title: "Feature/OpenSource", title: "Home/OpenSource",
component: OpenSourceComponent, component: OpenSourceComponent,
} satisfies Meta<typeof OpenSourceComponent> } satisfies Meta<typeof OpenSourceComponent>

View File

@ -3,7 +3,7 @@ import {
Section, Section,
SectionDescription, SectionDescription,
SectionTitle, SectionTitle,
} from "../design/Section/Section" } from "../../Layout/Section/Section"
import { Repository } from "./Repository" import { Repository } from "./Repository"
export interface OpenSourceProps {} export interface OpenSourceProps {}

View File

@ -1,6 +1,6 @@
import { Typography } from "../../Design/Typography/Typography"
import { SectionContent } from "../../Layout/Section/Section"
import { GitHubIcon } from "../About/SocialMediaList/SocialMediaIcons/GitHubIcon" import { GitHubIcon } from "../About/SocialMediaList/SocialMediaIcons/GitHubIcon"
import { SectionContent } from "../design/Section/Section"
import { Typography } from "../design/Typography/Typography"
export interface RepositoryProps { export interface RepositoryProps {
name: string name: string

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { Portfolio as PortfolioComponent } from "./Portfolio" import { Portfolio as PortfolioComponent } from "./Portfolio"
const meta = { const meta = {
title: "Feature/Portfolio", title: "Home/Portfolio",
component: PortfolioComponent, component: PortfolioComponent,
} satisfies Meta<typeof PortfolioComponent> } satisfies Meta<typeof PortfolioComponent>

View File

@ -1,5 +1,5 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { Section, SectionTitle } from "../design/Section/Section" import { Section, SectionTitle } from "../../Layout/Section/Section"
import { PortfolioItem, type PortfolioProject } from "./PortfolioItem" import { PortfolioItem, type PortfolioProject } from "./PortfolioItem"
export interface PortfolioProps {} export interface PortfolioProps {}

View File

@ -1,6 +1,6 @@
import Image from "next/image" import Image from "next/image"
import { SectionContent } from "../design/Section/Section" import { Typography } from "../../Design/Typography/Typography"
import { Typography } from "../design/Typography/Typography" import { SectionContent } from "../../Layout/Section/Section"
export interface PortfolioProject { export interface PortfolioProject {
id: string id: string

View File

@ -2,8 +2,8 @@
import Image from "next/image" import Image from "next/image"
import { useMemo } from "react" import { useMemo } from "react"
import { Link } from "../design/Link/Link" import { Link } from "../../Design/Link/Link"
import { useTheme } from "../Header/SwitchTheme" import { useTheme } from "../../Layout/Header/SwitchTheme"
import type { SkillName } from "./skills" import type { SkillName } from "./skills"
import { skills } from "./skills" import { skills } from "./skills"

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { Skills as SkillsComponent } from "./Skills" import { Skills as SkillsComponent } from "./Skills"
const meta = { const meta = {
title: "Feature/Skills", title: "Home/Skills",
component: SkillsComponent, component: SkillsComponent,
} satisfies Meta<typeof SkillsComponent> } satisfies Meta<typeof SkillsComponent>

View File

@ -1,5 +1,5 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { Section, SectionTitle } from "../design/Section/Section" import { Section, SectionTitle } from "../../Layout/Section/Section"
import { SkillItem } from "./SkillItem" import { SkillItem } from "./SkillItem"
import { SkillsSection } from "./SkillsSection" import { SkillsSection } from "./SkillsSection"

View File

@ -1,5 +1,5 @@
import { SectionContent } from "../design/Section/Section" import { Typography } from "../../Design/Typography/Typography"
import { Typography } from "../design/Typography/Typography" import { SectionContent } from "../../Layout/Section/Section"
export interface SkillsSectionProps extends React.PropsWithChildren { export interface SkillsSectionProps extends React.PropsWithChildren {
title: string title: string

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { Footer as FooterComponent } from "./Footer" import { Footer as FooterComponent } from "./Footer"
const meta = { const meta = {
title: "User Interface/Footer", title: "Layout/Footer",
component: FooterComponent, component: FooterComponent,
} satisfies Meta<typeof FooterComponent> } satisfies Meta<typeof FooterComponent>

View File

@ -1,7 +1,7 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import { GIT_REPO_LINK } from "@repo/utils/constants" import { GIT_REPO_LINK } from "@repo/utils/constants"
import { Link } from "../design/Link/Link" import { Link } from "../../Design/Link/Link"
export interface FooterProps { export interface FooterProps {
version: string version: string

View File

@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react"
import { Header as HeaderComponent } from "./Header" import { Header as HeaderComponent } from "./Header"
const meta = { const meta = {
title: "User Interface/Header", title: "Layout/Header",
component: HeaderComponent, component: HeaderComponent,
} satisfies Meta<typeof HeaderComponent> } satisfies Meta<typeof HeaderComponent>

View File

@ -1,6 +1,6 @@
import { useTranslations } from "next-intl" import { useTranslations } from "next-intl"
import Image from "next/image" import Image from "next/image"
import { Link } from "../design/Link/Link" import { Link } from "../../Design/Link/Link"
import { Locales } from "./Locales/Locales" import { Locales } from "./Locales/Locales"
import { SwitchTheme } from "./SwitchTheme" import { SwitchTheme } from "./SwitchTheme"

View File

@ -1,6 +1,6 @@
import { classNames } from "@repo/config-tailwind/classNames" import { classNames } from "@repo/config-tailwind/classNames"
import type { TypographyProps } from "../Typography/Typography" import type { TypographyProps } from "../../Design/Typography/Typography"
import { Typography } from "../Typography/Typography" import { Typography } from "../../Design/Typography/Typography"
export * from "./RevealFade" export * from "./RevealFade"

View File

@ -12,6 +12,7 @@ export const getISODate = (date: Date): string => {
/** /**
* Calculates the age of a person based on their birth date. * Calculates the age of a person based on their birth date.
* @param birthDate * @param birthDate
* @returns
*/ */
export const getAge = (birthDate: Date): number => { export const getAge = (birthDate: Date): number => {
const today = new Date() const today = new Date()

View File

@ -1,3 +1,9 @@
/**
* Capitalize the first letter of a string.
* @param string
* @returns
* @example capitalize("hello, world!") // "Hello, world!"
*/
export const capitalize = (string: string): string => { export const capitalize = (string: string): string => {
return string.charAt(0).toUpperCase() + string.slice(1) return string.charAt(0).toUpperCase() + string.slice(1)
} }

76
pnpm-lock.yaml generated
View File

@ -246,8 +246,8 @@ importers:
specifier: 23.1.1 specifier: 23.1.1
version: 23.1.1(typescript@5.5.4) version: 23.1.1(typescript@5.5.4)
turbo: turbo:
specifier: 2.0.9 specifier: 2.0.10
version: 2.0.9 version: 2.0.10
typescript: typescript:
specifier: 'catalog:' specifier: 'catalog:'
version: 5.5.4 version: 5.5.4
@ -3624,8 +3624,8 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'} engines: {node: '>=10'}
caniuse-lite@1.0.30001644: caniuse-lite@1.0.30001645:
resolution: {integrity: sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==} resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==}
cardinal@2.1.1: cardinal@2.1.1:
resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
@ -4269,8 +4269,8 @@ packages:
ee-first@1.1.1: ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
electron-to-chromium@1.5.3: electron-to-chromium@1.5.4:
resolution: {integrity: sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==} resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==}
elliptic@6.5.6: elliptic@6.5.6:
resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==}
@ -8111,38 +8111,38 @@ packages:
tty-browserify@0.0.1: tty-browserify@0.0.1:
resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
turbo-darwin-64@2.0.9: turbo-darwin-64@2.0.10:
resolution: {integrity: sha512-owlGsOaExuVGBUfrnJwjkL1BWlvefjSKczEAcpLx4BI7Oh6ttakOi+JyomkPkFlYElRpjbvlR2gP8WIn6M/+xQ==} resolution: {integrity: sha512-ND4hohx0wrd0AUsCf2RsdavlzUWVi0JU3vX5Vn2+wk3GG5RcZWIKi3y+it9MjgYuqqlCystkDbeamfH05iiQBQ==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
turbo-darwin-arm64@2.0.9: turbo-darwin-arm64@2.0.10:
resolution: {integrity: sha512-XAXkKkePth5ZPPE/9G9tTnPQx0C8UTkGWmNGYkpmGgRr8NedW+HrPsi9N0HcjzzIH9A4TpNYvtiV+WcwdaEjKA==} resolution: {integrity: sha512-cvHMMi1jDiiVl5ls1nWwXyanH7mB+xD3oYyZOC3NzZdFAfce3CWpL6hgUnK2CFxbdvaHQTizkQEgsHvUeD9nTQ==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
turbo-linux-64@2.0.9: turbo-linux-64@2.0.10:
resolution: {integrity: sha512-l9wSgEjrCFM1aG16zItBsZ206ZlhSSx1owB8Cgskfv0XyIXRGHRkluihiaxkp+UeU5WoEfz4EN5toc+ICA0q0w==} resolution: {integrity: sha512-dPRwHrKkzyc/VuQLfhOeYLkBxA60vvLZyn9pXChRF0zyimg04OnhBYcKBNkfWMUU+Z1gQDFEvfyvnV9EEHLh0Q==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
turbo-linux-arm64@2.0.9: turbo-linux-arm64@2.0.10:
resolution: {integrity: sha512-gRnjxXRne18B27SwxXMqL3fJu7jw/8kBrOBTBNRSmZZiG1Uu3nbnP7b4lgrA/bCku6C0Wligwqurvtpq6+nFHA==} resolution: {integrity: sha512-6qsYl+b1gf243QbL6cw+TbgUEWo6/krCCWDQjVg/8Znx45rkXnTJUqtIAMkQQsT+t7d3UU8hreQ77pjOW59LcQ==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
turbo-windows-64@2.0.9: turbo-windows-64@2.0.10:
resolution: {integrity: sha512-ZVo0apxUvaRq4Vm1qhsfqKKhtRgReYlBVf9MQvVU1O9AoyydEQvLDO1ryqpXDZWpcHoFxHAQc9msjAMtE5K2lA==} resolution: {integrity: sha512-rkMOqvwN7hmMJNeChj63ZpLlIF6b9QC0jW/IbOMgcZMLcvz9iF+qCc2yaeDWgfOgLsNjhtv1rlhimShUuasSXw==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
turbo-windows-arm64@2.0.9: turbo-windows-arm64@2.0.10:
resolution: {integrity: sha512-sGRz7c5Pey6y7y9OKi8ypbWNuIRPF9y8xcMqL56OZifSUSo+X2EOsOleR9MKxQXVaqHPGOUKWsE6y8hxBi9pag==} resolution: {integrity: sha512-r7HQScx+CpO0p+Mw97Yq63uUAIwTfEUXRX6qxzeipBK+mTsnV1A6dTTYeVLD3S5AlL8GGdXddx0swyDeeVkQng==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
turbo@2.0.9: turbo@2.0.10:
resolution: {integrity: sha512-QaLaUL1CqblSKKPgLrFW3lZWkWG4pGBQNW+q1ScJB5v1D/nFWtsrD/yZljW/bdawg90ihi4/ftQJ3h6fz1FamA==} resolution: {integrity: sha512-1t10h9bWl94/zktjzVWwTerJL3kIMDSA8mfibr1bevGLjF0DsiHOJFkCQFa5QABK0eXb0Af5mdRehLRBVem0Qg==}
hasBin: true hasBin: true
tween-functions@1.2.0: tween-functions@1.2.0:
@ -12234,8 +12234,8 @@ snapshots:
browserslist@4.23.2: browserslist@4.23.2:
dependencies: dependencies:
caniuse-lite: 1.0.30001644 caniuse-lite: 1.0.30001645
electron-to-chromium: 1.5.3 electron-to-chromium: 1.5.4
node-releases: 2.0.18 node-releases: 2.0.18
update-browserslist-db: 1.1.0(browserslist@4.23.2) update-browserslist-db: 1.1.0(browserslist@4.23.2)
@ -12297,7 +12297,7 @@ snapshots:
camelcase@6.3.0: {} camelcase@6.3.0: {}
caniuse-lite@1.0.30001644: {} caniuse-lite@1.0.30001645: {}
cardinal@2.1.1: cardinal@2.1.1:
dependencies: dependencies:
@ -12932,7 +12932,7 @@ snapshots:
ee-first@1.1.1: {} ee-first@1.1.1: {}
electron-to-chromium@1.5.3: {} electron-to-chromium@1.5.4: {}
elliptic@6.5.6: elliptic@6.5.6:
dependencies: dependencies:
@ -16004,7 +16004,7 @@ snapshots:
'@next/env': 14.2.5 '@next/env': 14.2.5
'@swc/helpers': 0.5.5 '@swc/helpers': 0.5.5
busboy: 1.6.0 busboy: 1.6.0
caniuse-lite: 1.0.30001644 caniuse-lite: 1.0.30001645
graceful-fs: 4.2.11 graceful-fs: 4.2.11
postcss: 8.4.31 postcss: 8.4.31
react: 18.3.1 react: 18.3.1
@ -17907,32 +17907,32 @@ snapshots:
tty-browserify@0.0.1: {} tty-browserify@0.0.1: {}
turbo-darwin-64@2.0.9: turbo-darwin-64@2.0.10:
optional: true optional: true
turbo-darwin-arm64@2.0.9: turbo-darwin-arm64@2.0.10:
optional: true optional: true
turbo-linux-64@2.0.9: turbo-linux-64@2.0.10:
optional: true optional: true
turbo-linux-arm64@2.0.9: turbo-linux-arm64@2.0.10:
optional: true optional: true
turbo-windows-64@2.0.9: turbo-windows-64@2.0.10:
optional: true optional: true
turbo-windows-arm64@2.0.9: turbo-windows-arm64@2.0.10:
optional: true optional: true
turbo@2.0.9: turbo@2.0.10:
optionalDependencies: optionalDependencies:
turbo-darwin-64: 2.0.9 turbo-darwin-64: 2.0.10
turbo-darwin-arm64: 2.0.9 turbo-darwin-arm64: 2.0.10
turbo-linux-64: 2.0.9 turbo-linux-64: 2.0.10
turbo-linux-arm64: 2.0.9 turbo-linux-arm64: 2.0.10
turbo-windows-64: 2.0.9 turbo-windows-64: 2.0.10
turbo-windows-arm64: 2.0.9 turbo-windows-arm64: 2.0.10
tween-functions@1.2.0: {} tween-functions@1.2.0: {}

View File

@ -35,7 +35,6 @@ catalog:
"typescript": "5.5.4" "typescript": "5.5.4"
"@total-typescript/ts-reset": "0.5.1" "@total-typescript/ts-reset": "0.5.1"
"@types/node": "22.0.0" "@types/node": "22.0.0"
"tsx": "4.16.2"
# ESLint # ESLint
"@typescript-eslint/eslint-plugin": "7.18.0" "@typescript-eslint/eslint-plugin": "7.18.0"