1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-06-30 11:36:38 -04:00

simplify theme provider

This commit is contained in:
2025-03-01 16:08:12 -05:00
parent 9c4d14fa45
commit 36faa6c234
11 changed files with 99 additions and 120 deletions

View File

@ -1 +1 @@
22.13.1 22.14.0

View File

@ -13,7 +13,7 @@ import { SiMarkdown } from "react-icons/si";
import styles from "./form.module.css"; import styles from "./form.module.css";
const ContactForm = () => { const ContactForm = () => {
const { activeTheme } = useTheme(); const { theme } = useTheme();
const [formState, formAction, pending] = useActionState< const [formState, formAction, pending] = useActionState<
Partial<{ success: boolean; message: string; payload: FormData }>, Partial<{ success: boolean; message: string; payload: FormData }>,
FormData FormData
@ -81,7 +81,7 @@ const ContactForm = () => {
<Turnstile <Turnstile
sitekey={process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY || "1x00000000000000000000AA"} sitekey={process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY || "1x00000000000000000000AA"}
style={{ margin: "1em 0" }} style={{ margin: "1em 0" }}
theme={activeTheme === "dark" ? activeTheme : "light"} theme={theme === "dark" ? theme : "light"}
fixedSize fixedSize
/> />

View File

@ -28,7 +28,7 @@ export async function generateStaticParams() {
const slugs = await getPostSlugs(); const slugs = await getPostSlugs();
// map slugs into a static paths object required by next.js // map slugs into a static paths object required by next.js
return slugs.map((slug: string) => ({ return slugs.map((slug) => ({
slug, slug,
})); }));
} }

View File

@ -283,7 +283,7 @@ export default function Page() {
> >
Bluesky Bluesky
</ColorfulLink> </ColorfulLink>
,{" "} , or{" "}
<ColorfulLink <ColorfulLink
href="https://fediverse.jarv.is/@jake" href="https://fediverse.jarv.is/@jake"
rel="me" rel="me"
@ -292,15 +292,6 @@ export default function Page() {
darkColor="#7b87ff" darkColor="#7b87ff"
> >
Mastodon Mastodon
</ColorfulLink>
, or{" "}
<ColorfulLink
href="sms:+1-617-917-3737"
title="Send SMS to +1 (617) 917-3737"
lightColor="#6fcc01"
darkColor="#8edb34"
>
SMS
</ColorfulLink>{" "} </ColorfulLink>{" "}
as well! as well!
</p> </p>

View File

@ -1,11 +1,10 @@
import CodeBlock from "../CodeBlock"; import CodeBlock from "../CodeBlock";
import CodeInline from "../CodeInline"; import CodeInline from "../CodeInline";
import type { PropsWithChildren } from "react"; import type { ComponentPropsWithoutRef } from "react";
export type CodeProps = PropsWithChildren<{ export type CodeProps = ComponentPropsWithoutRef<"code"> & {
forceBlock?: boolean; forceBlock?: boolean;
className?: string; };
}>;
// a simple wrapper component that "intelligently" picks between inline code and code blocks (w/ optional syntax // a simple wrapper component that "intelligently" picks between inline code and code blocks (w/ optional syntax
// highlighting & a clipboard button) // highlighting & a clipboard button)

View File

@ -14,7 +14,7 @@ export type CommentsProps = ComponentPropsWithoutRef<"div"> & {
}; };
const Comments = ({ title, className, ...rest }: CommentsProps) => { const Comments = ({ title, className, ...rest }: CommentsProps) => {
const { activeTheme } = useTheme(); const { theme } = useTheme();
// fail silently if giscus isn't configured // fail silently if giscus isn't configured
if (!config.giscusConfig) { if (!config.giscusConfig) {
@ -36,7 +36,7 @@ const Comments = ({ title, className, ...rest }: CommentsProps) => {
emitMetadata="0" emitMetadata="0"
inputPosition="top" inputPosition="top"
loading="lazy" loading="lazy"
theme={activeTheme === "dark" ? activeTheme : "light"} theme={theme === "dark" ? theme : "light"}
/> />
</div> </div>
); );

View File

@ -14,13 +14,13 @@ export type ThemeToggleProps = {
const ThemeToggle = ({ className }: ThemeToggleProps) => { const ThemeToggle = ({ className }: ThemeToggleProps) => {
const hasMounted = useHasMounted(); const hasMounted = useHasMounted();
const { activeTheme, setTheme } = useTheme(); const { theme, setTheme } = useTheme();
const isFirstMount = useFirstMountState(); const isFirstMount = useFirstMountState();
const prefersReducedMotion = useReducedMotion() ?? false; const prefersReducedMotion = useReducedMotion() ?? false;
const maskId = useId(); // SSR-safe ID to cross-reference areas of the SVG const maskId = useId(); // SSR-safe ID to cross-reference areas of the SVG
// default to light since `activeTheme` might be undefined // default to light since `theme` might be undefined
const safeTheme = activeTheme === "dark" ? activeTheme : "light"; const safeTheme = theme === "dark" ? theme : "light";
// accessibility: disable animation if user prefers reduced motion // accessibility: disable animation if user prefers reduced motion
useEffect(() => { useEffect(() => {

View File

@ -1,14 +1,14 @@
import { formatDate } from "../../lib/helpers/format-date"; import { formatDate } from "../../lib/helpers/format-date";
import type { ComponentPropsWithoutRef } from "react";
export type TimeProps = { export type TimeProps = ComponentPropsWithoutRef<"time"> & {
date: string | number | Date; date: string | number | Date;
format?: string; format?: string;
className?: string;
}; };
const Time = ({ date, format = "MMM D", className }: TimeProps) => { const Time = ({ date, format = "MMM D", ...rest }: TimeProps) => {
return ( return (
<time dateTime={formatDate(date)} title={formatDate(date, "MMM D, YYYY, h:mm A z")} className={className}> <time dateTime={formatDate(date)} title={formatDate(date, "MMM D, YYYY, h:mm A z")} {...rest}>
{formatDate(date, format)} {formatDate(date, format)}
</time> </time>
); );

View File

@ -1,43 +1,39 @@
"use client"; "use client";
import { createContext, useCallback, useEffect, useMemo, useState } from "react"; import { createContext, useCallback, useEffect, useState } from "react";
import useLocalStorage from "../hooks/useLocalStorage"; import useLocalStorage from "../hooks/useLocalStorage";
import useMedia from "../hooks/useMedia"; import useMedia from "../hooks/useMedia";
import type { Context, PropsWithChildren } from "react"; import type { Context, PropsWithChildren } from "react";
type Themes = "light" | "dark";
export const ThemeContext: Context<{ export const ThemeContext: Context<{
/** /**
* If the user's theme preference is unset, this returns whether the system preference resolved to "light" or "dark". * If the user's theme preference is unset, this returns whether the system preference resolved to "light" or "dark".
* If the user's theme preference is set, the preference is returned instead, regardless of their system's theme. * If the user's theme preference is set, the preference is returned instead, regardless of their system's theme.
*/ */
activeTheme: string; theme: Themes;
/** Update the theme manually and save to local storage. */ /** Update the theme manually and save to local storage. */
setTheme: (theme: string) => void; setTheme: (theme: Themes) => void;
}> = createContext({ }> = createContext({
activeTheme: "", theme: "" as Themes,
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
setTheme: (_) => {}, setTheme: (_) => {},
}); });
// provider used once in _app.tsx to wrap entire app // provider used once in _app.tsx to wrap entire app
export const ThemeProvider = ({ export const ThemeProvider = ({ children }: PropsWithChildren) => {
storageKey = "theme",
children,
}: PropsWithChildren<{
/** Key to use when saving preferred theme to local storage. Defaults to "theme". */
storageKey?: string;
}>) => {
// keep track of if/when the user has set their theme *on this site* // keep track of if/when the user has set their theme *on this site*
const [preferredTheme, setPreferredTheme] = useLocalStorage(storageKey); const [preferredTheme, setPreferredTheme] = useLocalStorage<Themes>("theme");
// keep track of changes to the user's OS/browser dark mode setting // keep track of changes to the user's OS/browser dark mode setting
const [systemTheme, setSystemTheme] = useState(""); const [systemTheme, setSystemTheme] = useState<Themes>("" as Themes);
// hook into system `prefers-dark-mode` setting // hook into system `prefers-dark-mode` setting
// https://web.dev/prefers-color-scheme/#the-prefers-color-scheme-media-query // https://web.dev/prefers-color-scheme/#the-prefers-color-scheme-media-query
const isSystemDark = useMedia("(prefers-color-scheme: dark)"); const isSystemDark = useMedia("(prefers-color-scheme: dark)");
// updates the DOM and optionally saves the new theme to local storage // updates the DOM and optionally saves the new theme to local storage
const changeTheme = useCallback( const applyTheme = useCallback(
(theme: string, updateStorage?: boolean) => { (theme: Themes, updateStorage?: boolean) => {
if (updateStorage) { if (updateStorage) {
setPreferredTheme(theme); setPreferredTheme(theme);
} }
@ -57,9 +53,9 @@ export const ThemeProvider = ({
// only actually change the theme if preference is unset (and *don't* save new theme to storage) // only actually change the theme if preference is unset (and *don't* save new theme to storage)
if (!preferredTheme) { if (!preferredTheme) {
changeTheme(systemResolved, false); applyTheme(systemResolved, false);
} }
}, [changeTheme, preferredTheme, isSystemDark]); }, [applyTheme, preferredTheme, isSystemDark]);
// color-scheme handling (tells browser how to render built-in elements like forms, scrollbars, etc.) // color-scheme handling (tells browser how to render built-in elements like forms, scrollbars, etc.)
useEffect(() => { useEffect(() => {
@ -70,16 +66,13 @@ export const ThemeProvider = ({
document.documentElement.style?.setProperty("color-scheme", colorScheme); document.documentElement.style?.setProperty("color-scheme", colorScheme);
}, [preferredTheme, systemTheme]); }, [preferredTheme, systemTheme]);
const providerValues = useMemo( const providerValues = {
() => ({ theme: preferredTheme ?? systemTheme,
activeTheme: preferredTheme ?? systemTheme, setTheme: (theme: Themes) => {
setTheme: (theme: string) => { // force save to local storage
// force save to local storage applyTheme(theme, true);
changeTheme(theme, true); },
}, };
}),
[changeTheme, preferredTheme, systemTheme]
);
return <ThemeContext.Provider value={providerValues}>{children}</ThemeContext.Provider>; return <ThemeContext.Provider value={providerValues}>{children}</ThemeContext.Provider>;
}; };

View File

@ -69,7 +69,7 @@
"@eslint/js": "^9.21.0", "@eslint/js": "^9.21.0",
"@jakejarvis/eslint-config": "~4.0.7", "@jakejarvis/eslint-config": "~4.0.7",
"@types/comma-number": "^2.1.2", "@types/comma-number": "^2.1.2",
"@types/node": "^22.13.5", "@types/node": "^22.13.8",
"@types/prop-types": "^15.7.14", "@types/prop-types": "^15.7.14",
"@types/react": "^19.0.10", "@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4", "@types/react-dom": "^19.0.4",
@ -83,9 +83,9 @@
"lint-staged": "^15.4.3", "lint-staged": "^15.4.3",
"prettier": "^3.5.2", "prettier": "^3.5.2",
"prisma": "^6.4.1", "prisma": "^6.4.1",
"schema-dts": "^1.1.2", "schema-dts": "^1.1.5",
"simple-git-hooks": "^2.11.1", "simple-git-hooks": "^2.11.1",
"typescript": "^5.8.2" "typescript": "5.7.3"
}, },
"optionalDependencies": { "optionalDependencies": {
"sharp": "^0.33.5" "sharp": "^0.33.5"
@ -93,7 +93,7 @@
"engines": { "engines": {
"node": ">=20.x" "node": ">=20.x"
}, },
"packageManager": "pnpm@10.2.1+sha512.398035c7bd696d0ba0b10a688ed558285329d27ea994804a52bad9167d8e3a72bcb993f9699585d3ca25779ac64949ef422757a6c31102c12ab932e5cbe5cc92", "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b",
"cacheDirectories": [ "cacheDirectories": [
"node_modules", "node_modules",
".next/cache" ".next/cache"

120
pnpm-lock.yaml generated
View File

@ -25,7 +25,7 @@ importers:
version: 15.26.0 version: 15.26.0
'@prisma/client': '@prisma/client':
specifier: ^6.4.1 specifier: ^6.4.1
version: 6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2) version: 6.4.1(prisma@6.4.1(typescript@5.7.3))(typescript@5.7.3)
'@react-spring/web': '@react-spring/web':
specifier: ^9.7.5 specifier: ^9.7.5
version: 9.7.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) version: 9.7.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@ -151,8 +151,8 @@ importers:
specifier: ^2.1.2 specifier: ^2.1.2
version: 2.1.2 version: 2.1.2
'@types/node': '@types/node':
specifier: ^22.13.5 specifier: ^22.13.8
version: 22.13.5 version: 22.13.8
'@types/prop-types': '@types/prop-types':
specifier: ^15.7.14 specifier: ^15.7.14
version: 15.7.14 version: 15.7.14
@ -173,7 +173,7 @@ importers:
version: 9.21.0 version: 9.21.0
eslint-config-next: eslint-config-next:
specifier: 15.2.1-canary.4 specifier: 15.2.1-canary.4
version: 15.2.1-canary.4(eslint@9.21.0)(typescript@5.8.2) version: 15.2.1-canary.4(eslint@9.21.0)(typescript@5.7.3)
eslint-config-prettier: eslint-config-prettier:
specifier: ~10.0.2 specifier: ~10.0.2
version: 10.0.2(eslint@9.21.0) version: 10.0.2(eslint@9.21.0)
@ -191,16 +191,16 @@ importers:
version: 3.5.2 version: 3.5.2
prisma: prisma:
specifier: ^6.4.1 specifier: ^6.4.1
version: 6.4.1(typescript@5.8.2) version: 6.4.1(typescript@5.7.3)
schema-dts: schema-dts:
specifier: ^1.1.2 specifier: ^1.1.5
version: 1.1.2(typescript@5.8.2) version: 1.1.5
simple-git-hooks: simple-git-hooks:
specifier: ^2.11.1 specifier: ^2.11.1
version: 2.11.1 version: 2.11.1
typescript: typescript:
specifier: ^5.8.2 specifier: 5.7.3
version: 5.8.2 version: 5.7.3
optionalDependencies: optionalDependencies:
sharp: sharp:
specifier: ^0.33.5 specifier: ^0.33.5
@ -820,8 +820,8 @@ packages:
'@types/nlcst@2.0.3': '@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
'@types/node@22.13.5': '@types/node@22.13.8':
resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==}
'@types/prismjs@1.26.5': '@types/prismjs@1.26.5':
resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
@ -2889,10 +2889,8 @@ packages:
scheduler@0.25.0: scheduler@0.25.0:
resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==}
schema-dts@1.1.2: schema-dts@1.1.5:
resolution: {integrity: sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==} resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==}
peerDependencies:
typescript: '>=4.1.0'
section-matter@1.0.0: section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
@ -3180,8 +3178,8 @@ packages:
typedarray@0.0.6: typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
typescript@5.8.2: typescript@5.7.3:
resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
@ -3810,10 +3808,10 @@ snapshots:
'@polka/url@1.0.0-next.28': {} '@polka/url@1.0.0-next.28': {}
'@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2)': '@prisma/client@6.4.1(prisma@6.4.1(typescript@5.7.3))(typescript@5.7.3)':
optionalDependencies: optionalDependencies:
prisma: 6.4.1(typescript@5.8.2) prisma: 6.4.1(typescript@5.7.3)
typescript: 5.8.2 typescript: 5.7.3
'@prisma/debug@6.4.1': {} '@prisma/debug@6.4.1': {}
@ -3899,7 +3897,7 @@ snapshots:
'@types/concat-stream@2.0.3': '@types/concat-stream@2.0.3':
dependencies: dependencies:
'@types/node': 22.13.5 '@types/node': 22.13.8
'@types/debug@4.1.12': '@types/debug@4.1.12':
dependencies: dependencies:
@ -3941,7 +3939,7 @@ snapshots:
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
'@types/node@22.13.5': '@types/node@22.13.8':
dependencies: dependencies:
undici-types: 6.20.0 undici-types: 6.20.0
@ -3969,32 +3967,32 @@ snapshots:
'@types/unist@3.0.3': {} '@types/unist@3.0.3': {}
'@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
'@typescript-eslint/scope-manager': 8.25.0 '@typescript-eslint/scope-manager': 8.25.0
'@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
'@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0
eslint: 9.21.0 eslint: 9.21.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 2.0.1(typescript@5.8.2) ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2)': '@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.25.0 '@typescript-eslint/scope-manager': 8.25.0
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.2) '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0
debug: 4.4.0 debug: 4.4.0
eslint: 9.21.0 eslint: 9.21.0
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4003,20 +4001,20 @@ snapshots:
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0
'@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.8.2)': '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.2) '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3)
'@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
debug: 4.4.0 debug: 4.4.0
eslint: 9.21.0 eslint: 9.21.0
ts-api-utils: 2.0.1(typescript@5.8.2) ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.25.0': {} '@typescript-eslint/types@8.25.0': {}
'@typescript-eslint/typescript-estree@8.25.0(typescript@5.8.2)': '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/visitor-keys': 8.25.0 '@typescript-eslint/visitor-keys': 8.25.0
@ -4025,19 +4023,19 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.1 semver: 7.7.1
ts-api-utils: 2.0.1(typescript@5.8.2) ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.8.2)': '@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0)
'@typescript-eslint/scope-manager': 8.25.0 '@typescript-eslint/scope-manager': 8.25.0
'@typescript-eslint/types': 8.25.0 '@typescript-eslint/types': 8.25.0
'@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.2) '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3)
eslint: 9.21.0 eslint: 9.21.0
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4594,21 +4592,21 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-next@15.2.1-canary.4(eslint@9.21.0)(typescript@5.8.2): eslint-config-next@15.2.1-canary.4(eslint@9.21.0)(typescript@5.7.3):
dependencies: dependencies:
'@next/eslint-plugin-next': 15.2.1-canary.4 '@next/eslint-plugin-next': 15.2.1-canary.4
'@rushstack/eslint-patch': 1.10.5 '@rushstack/eslint-patch': 1.10.5
'@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3)
'@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
eslint: 9.21.0 eslint: 9.21.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0)
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0)
eslint-plugin-react: 7.37.4(eslint@9.21.0) eslint-plugin-react: 7.37.4(eslint@9.21.0)
eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0) eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0)
optionalDependencies: optionalDependencies:
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- eslint-plugin-import-x - eslint-plugin-import-x
@ -4637,7 +4635,7 @@ snapshots:
stable-hash: 0.0.4 stable-hash: 0.0.4
tinyglobby: 0.2.12 tinyglobby: 0.2.12
optionalDependencies: optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4662,18 +4660,18 @@ snapshots:
- bluebird - bluebird
- supports-color - supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
eslint: 9.21.0 eslint: 9.21.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.8 array-includes: 3.1.8
@ -4684,7 +4682,7 @@ snapshots:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.21.0 eslint: 9.21.0
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0)
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.16.1 is-core-module: 2.16.1
is-glob: 4.0.3 is-glob: 4.0.3
@ -4696,7 +4694,7 @@ snapshots:
string.prototype.trimend: 1.0.9 string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0 tsconfig-paths: 3.15.0
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3)
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
@ -6350,14 +6348,14 @@ snapshots:
prettier@3.5.2: {} prettier@3.5.2: {}
prisma@6.4.1(typescript@5.8.2): prisma@6.4.1(typescript@5.7.3):
dependencies: dependencies:
'@prisma/engines': 6.4.1 '@prisma/engines': 6.4.1
esbuild: 0.25.0 esbuild: 0.25.0
esbuild-register: 3.6.0(esbuild@0.25.0) esbuild-register: 3.6.0(esbuild@0.25.0)
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
typescript: 5.8.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -6700,9 +6698,7 @@ snapshots:
scheduler@0.25.0: {} scheduler@0.25.0: {}
schema-dts@1.1.2(typescript@5.8.2): schema-dts@1.1.5: {}
dependencies:
typescript: 5.8.2
section-matter@1.0.0: section-matter@1.0.0:
dependencies: dependencies:
@ -6999,9 +6995,9 @@ snapshots:
trough@2.2.0: {} trough@2.2.0: {}
ts-api-utils@2.0.1(typescript@5.8.2): ts-api-utils@2.0.1(typescript@5.7.3):
dependencies: dependencies:
typescript: 5.8.2 typescript: 5.7.3
tsconfig-paths@3.15.0: tsconfig-paths@3.15.0:
dependencies: dependencies:
@ -7053,7 +7049,7 @@ snapshots:
typedarray@0.0.6: {} typedarray@0.0.6: {}
typescript@5.8.2: {} typescript@5.7.3: {}
unbox-primitive@1.1.0: unbox-primitive@1.1.0:
dependencies: dependencies:
@ -7069,7 +7065,7 @@ snapshots:
'@types/concat-stream': 2.0.3 '@types/concat-stream': 2.0.3
'@types/debug': 4.1.12 '@types/debug': 4.1.12
'@types/is-empty': 1.2.3 '@types/is-empty': 1.2.3
'@types/node': 22.13.5 '@types/node': 22.13.8
'@types/unist': 3.0.3 '@types/unist': 3.0.3
concat-stream: 2.0.0 concat-stream: 2.0.0
debug: 4.4.0 debug: 4.4.0