1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-25 23:25:25 -04:00

do not double import site-wide opengraph-image.jpg

This commit is contained in:
Jake Jarvis 2025-04-11 14:22:06 -04:00
parent 4cb6ed82ee
commit 0ade75716e
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
9 changed files with 108 additions and 239 deletions

View File

@ -1,125 +0,0 @@
You are an expert full-stack TypeScript developer specializing in modern React applications.
CORE EXPERTISE:
- TypeScript
- Next.js 15 with App Router
- React 19
- Server Components
- Server Actions
- Parallel and Intercepting Routes
- CSS Modules
- Redis for KV storage
- MDX for blog content
- Zod for runtime type validation
CODE ARCHITECTURE:
1. Directory Structure:
/
├── app/ # Next.js App Router pages
├── components/ # Reusable React components
├── contexts/ # React contexts
├── hooks/ # React hooks
├── lib/ # Utility functions
│ ├── config/ # Configuration constants
│ ├── helpers/ # Utility functions
├── notes/ # Blog posts in markdown/MDX format
└── public/ # Static files
2. Component Organization:
- Keep reusable components in ./components/.
- Each component should have its own folder containing a `.tsx` file of the same name (e.g. `ComponentName/ComponentName.tsx`)
- Each of these folders should also have an index.ts file which exports the component for convenience (e.g. `ComponentName/index.tsx` contains `export * from "./ComponentName"` and `export { default } from "./ComponentName"`)
- Implement atomic design principles
CODING STANDARDS:
1. TypeScript:
- Use strict type checking
- Use const assertions for literals
- Implement proper error handling
- Use discriminated unions for complex states
2. React Patterns:
- Follow Next.js App Router conventions
- Default to Server Components
- Use `"use client"` only when necessary
- Implement proper error boundaries
- Use React.Suspense for loading states
3. State Management:
- Use React Server Components for server state
- Implement local state with useState
- Use context sparingly and strategically
4. Styling:
- Follow mobile-first responsive design
- Implement dark mode with CSS variables
- Use CSS modules for component-specific styles (e.g. `import styles from ./ComponentName.module.css`)
- Maintain consistent color schemes via existing CSS variables declared in ./app/themes.css
5. Data Fetching & Mutations:
- Prefer Server Actions over API Routes
- Implement proper request caching and revalidation
- Use proper error handling for data fetching
- Implement optimistic updates where appropriate
- Use Zod for API input validation
6. Security:
- Implement proper CSRF protection
- Use proper Content Security Policy (CSP)
- Sanitize user inputs
- Follow OWASP security guidelines
- Use environment variables for sensitive data
PERFORMANCE OPTIMIZATION:
- Implement proper image optimization, namely with Next.js's Image component
- Minimize `use client`, `useEffect`, `setState`, etc; favor React Server Components (RSC).
- Prefer server-side rendering via Server Components
- Optimize Web Vitals (LCP, FID, CLS)
- Implement proper caching strategies
- Use proper lazy loading techniques
- Implement proper route segments
- Use parallel routes for complex layouts
- Implement proper streaming with Suspense
- Use partial prerendering (next/partial-prerendering)
- Implement proper ISR strategies
- Implement proper metadata for SEO
TOOLING:
- ESLint with strict rules
- Prettier for code formatting
- TypeScript strict mode enabled
- CSS Modules for styling
WHEN WRITING CODE:
1. Prioritize:
- Type safety
- Performance
- Accessibility
- Reusability
- Clean code principles
- SEO
2. Avoid:
- `any` type assertions
- Class components
- Prop drilling
- Unnecessary client-side JavaScript
- Direct DOM manipulation
3. Prefer:
- Arrow function expressions
- Server Components where possible
- CSS variables for theming
- Composition over inheritance
- Early returns for conditionals
- Environment variables for configuration
DOCUMENTATION:
- Document any workarounds or gotchas
ERROR HANDLING:
- Implement proper error boundaries
- Use typed error handling
- Provide meaningful error messages
- Log errors appropriately
- Implement fallback UI states

BIN
app/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -17,8 +17,6 @@ import "./themes.css";
import styles from "./layout.module.css";
import ogImage from "./opengraph-image.jpg";
export const metadata: Metadata = defaultMetadata;
const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
@ -34,12 +32,7 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
"@id": `${BASE_URL}/#person`,
name: config.authorName,
url: BASE_URL,
image: {
"@type": "ImageObject",
contentUrl: `${BASE_URL}${ogImage.src}`,
width: `${ogImage.width}`,
height: `${ogImage.height}`,
},
image: [`${BASE_URL}/opengraph-image.jpg`],
sameAs: [
`${BASE_URL}`,
`https://${config.authorSocial?.mastodon}`,

View File

@ -42,13 +42,14 @@ const getLocalImage = async (src: string): Promise<ArrayBuffer | string> => {
// return the raw image data as a buffer
return Uint8Array.from(await readFile(imagePath)).buffer;
} catch (error) {
// fail silently and return a 1x1 transparent gif instead of crashing
console.error(`[og-image] found "${imagePath}" but couldn't read it:`, error);
// fail silently and return a 1x1 transparent gif instead of crashing
return NO_IMAGE;
}
};
const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
const OpenGraphImage = async ({ params }: { params: Promise<{ slug: string }> }) => {
try {
const { slug } = await params;
@ -233,4 +234,4 @@ const Image = async ({ params }: { params: Promise<{ slug: string }> }) => {
}
};
export default Image;
export default OpenGraphImage;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

View File

@ -7,7 +7,7 @@ import type { ComponentPropsWithoutRef } from "react";
import styles from "./Header.module.css";
import avatarImg from "../../app/selfie.jpg";
import avatarImg from "../../app/avatar.jpg";
export type HeaderProps = ComponentPropsWithoutRef<"header">;

View File

@ -3,7 +3,7 @@ export const POSTS_DIR = "notes";
// path to an image used in various places to represent the site, relative to project root
// IMPORTANT: must be included in next.config.ts under "outputFileTracingIncludes"
export const AVATAR_PATH = "app/selfie.jpg";
export const AVATAR_PATH = "app/avatar.jpg";
// maximum width of content wrapper (e.g. for images) in pixels
export const MAX_WIDTH = 865;

View File

@ -23,8 +23,8 @@
"@giscus/react": "^3.1.0",
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.3.1-canary.4",
"@next/mdx": "15.3.1-canary.4",
"@next/bundle-analyzer": "15.3.1-canary.5",
"@next/mdx": "15.3.1-canary.5",
"@octokit/graphql": "^8.2.2",
"@octokit/graphql-schema": "^15.26.0",
"@t3-oss/env-nextjs": "^0.12.0",
@ -37,7 +37,7 @@
"geist": "^1.3.1",
"html-entities": "^2.6.0",
"lucide-react": "0.487.0",
"next": "15.3.1-canary.4",
"next": "15.3.1-canary.5",
"polished": "^4.3.1",
"prop-types": "^15.8.1",
"react": "19.1.0",
@ -74,13 +74,13 @@
"@types/mdx": "^2.0.13",
"@types/node": "^22.14.0",
"@types/prop-types": "^15.7.14",
"@types/react": "^19.1.0",
"@types/react": "^19.1.1",
"@types/react-dom": "^19.1.2",
"@types/react-is": "^19.0.0",
"babel-plugin-react-compiler": "19.0.0-beta-e993439-20250405",
"cross-env": "^7.0.3",
"eslint": "^9.24.0",
"eslint-config-next": "15.3.1-canary.4",
"eslint-config-next": "15.3.1-canary.5",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-css-modules": "^2.12.0",
"eslint-plugin-import": "^2.31.0",
@ -91,7 +91,7 @@
"eslint-plugin-react-compiler": "19.0.0-beta-e993439-20250405",
"eslint-plugin-react-hooks": "^5.2.0",
"husky": "^9.1.7",
"lint-staged": "^15.5.0",
"lint-staged": "^15.5.1",
"prettier": "^3.5.3",
"schema-dts": "^1.1.5",
"stylelint": "^16.18.0",

190
pnpm-lock.yaml generated
View File

@ -25,13 +25,13 @@ importers:
version: 3.1.0(acorn@8.14.1)
'@mdx-js/react':
specifier: ^3.1.0
version: 3.1.0(@types/react@19.1.0)(react@19.1.0)
version: 3.1.0(@types/react@19.1.1)(react@19.1.0)
'@next/bundle-analyzer':
specifier: 15.3.1-canary.4
version: 15.3.1-canary.4
specifier: 15.3.1-canary.5
version: 15.3.1-canary.5
'@next/mdx':
specifier: 15.3.1-canary.4
version: 15.3.1-canary.4(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))
specifier: 15.3.1-canary.5
version: 15.3.1-canary.5(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.1)(react@19.1.0))
'@octokit/graphql':
specifier: ^8.2.2
version: 8.2.2
@ -61,7 +61,7 @@ importers:
version: 4.2.2
geist:
specifier: ^1.3.1
version: 1.3.1(next@15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
version: 1.3.1(next@15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
html-entities:
specifier: ^2.6.0
version: 2.6.0
@ -69,8 +69,8 @@ importers:
specifier: 0.487.0
version: 0.487.0(react@19.1.0)
next:
specifier: 15.3.1-canary.4
version: 15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
specifier: 15.3.1-canary.5
version: 15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
polished:
specifier: ^4.3.1
version: 4.3.1
@ -88,7 +88,7 @@ importers:
version: 19.1.0(react@19.1.0)
react-innertext:
specifier: ^1.1.5
version: 1.1.5(@types/react@19.1.0)(react@19.1.0)
version: 1.1.5(@types/react@19.1.1)(react@19.1.0)
react-is:
specifier: 19.1.0
version: 19.1.0
@ -100,7 +100,7 @@ importers:
version: 2.0.0(react@19.1.0)(schema-dts@1.1.5)(typescript@5.8.3)
react-textarea-autosize:
specifier: ^8.5.9
version: 8.5.9(@types/react@19.1.0)(react@19.1.0)
version: 8.5.9(@types/react@19.1.1)(react@19.1.0)
react-timeago:
specifier: ^8.0.0
version: 8.0.0(react@19.1.0)
@ -175,11 +175,11 @@ importers:
specifier: ^15.7.14
version: 15.7.14
'@types/react':
specifier: ^19.1.0
version: 19.1.0
specifier: ^19.1.1
version: 19.1.1
'@types/react-dom':
specifier: ^19.1.2
version: 19.1.2(@types/react@19.1.0)
version: 19.1.2(@types/react@19.1.1)
'@types/react-is':
specifier: ^19.0.0
version: 19.0.0
@ -193,8 +193,8 @@ importers:
specifier: ^9.24.0
version: 9.24.0
eslint-config-next:
specifier: 15.3.1-canary.4
version: 15.3.1-canary.4(eslint@9.24.0)(typescript@5.8.3)
specifier: 15.3.1-canary.5
version: 15.3.1-canary.5(eslint@9.24.0)(typescript@5.8.3)
eslint-config-prettier:
specifier: ^10.1.2
version: 10.1.2(eslint@9.24.0)
@ -226,8 +226,8 @@ importers:
specifier: ^9.1.7
version: 9.1.7
lint-staged:
specifier: ^15.5.0
version: 15.5.0
specifier: ^15.5.1
version: 15.5.1
prettier:
specifier: ^3.5.3
version: 3.5.3
@ -648,17 +648,17 @@ packages:
'@napi-rs/wasm-runtime@0.2.8':
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
'@next/bundle-analyzer@15.3.1-canary.4':
resolution: {integrity: sha512-q0iV+zSn8iyTWexikyO/Jwr/Of5Dc+MYFwJmCz201JcoL0hZsjSdF+Kk+KGf8XyzO7+KYGCPtmcQo7yb/P3EWw==}
'@next/bundle-analyzer@15.3.1-canary.5':
resolution: {integrity: sha512-zEw12HO8APi6FiBFk8PLIaiF15lWxZteo+fEB/uxHlW85VKV6pYjc8lnfzmZ8ErinozawwXXTGkfdywA4tEoGg==}
'@next/env@15.3.1-canary.4':
resolution: {integrity: sha512-Bw464vR3fVUrhHQOh0o0ilXQ6wg6OvsNn3afUTjm1a0n0JmJJ+n9M1041xmBHSBGWUfTe74HepSmy79sF8EDlA==}
'@next/env@15.3.1-canary.5':
resolution: {integrity: sha512-WpDbxklJSIcLoQIoA4IG+9SCkvf0utHigM4Wa2pwepwIORu1aTCSCFCXL5IVKLiA0yFmaBmMmwS4wiTRiy8j/g==}
'@next/eslint-plugin-next@15.3.1-canary.4':
resolution: {integrity: sha512-tnFDX05E25frvKDW3YIQFM2HKjBmeR6jD6dEhc1EiQknVNSc42Qc7XD0ViisYeBMKDvJJksExSLY9NYl4wXamQ==}
'@next/eslint-plugin-next@15.3.1-canary.5':
resolution: {integrity: sha512-nh0ouMASkbrIjAHt63BgOyldN+w0DTQKabr+WB+ZLfKePxWixVmtxPmAyYjeHeoQjPwDQiuf/cZZDMOVhXpstA==}
'@next/mdx@15.3.1-canary.4':
resolution: {integrity: sha512-p6tASLmthIoxLCmkJwCMrSfFGxH4Yn46pNsSV6iOqSOCfMEdErB54Qiik+hkjONze01QoR+0dsXeP0bXQSjdZQ==}
'@next/mdx@15.3.1-canary.5':
resolution: {integrity: sha512-VWK6Q6QtLzRq9D0qZSEIuY2KNalzh5xRuO4VZAVALHVTllAYU6Tl5h+6Rn0PqlWlMQdnpVyPVsK96vtejXGLJw==}
peerDependencies:
'@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0'
@ -668,50 +668,50 @@ packages:
'@mdx-js/react':
optional: true
'@next/swc-darwin-arm64@15.3.1-canary.4':
resolution: {integrity: sha512-ZR497D00W62Tf566uakD+VvA/2Cmagix3suVlB7TxLSPxXFAU5DeGQvaT9jkP+x1lEKggcZ+chI1CB9CcjvlTQ==}
'@next/swc-darwin-arm64@15.3.1-canary.5':
resolution: {integrity: sha512-KrfaIYP5Hk9tfhTkbSiw5x2zgkf8AymXOEmsbTEES5SHJspBQILz2E3+CHcv/nOX1KNtcLIw7CsKQJcjtbMp8A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@15.3.1-canary.4':
resolution: {integrity: sha512-dX0X7NG6goshCgbKsSzn6wVzgkRlUqRXMjO9E46B6HqcV/L8l15rMVhWr8zBzDt/7gEmAylnlnML8Zqv9BiF1Q==}
'@next/swc-darwin-x64@15.3.1-canary.5':
resolution: {integrity: sha512-55wC4hK6eETWDLy92z21FUupfZSiLgDpKUmjq3kBcvUVo6g3SBdv6zGuarB7q6zUbSj/uHyfFTJJ0oQDbf/0Qw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.1-canary.4':
resolution: {integrity: sha512-ehE8KbvyBa7grVzC+n+L9CHbainjg362coYObhak3Jktnvb0uPf/m2kqgfN3UBzGSAczvcAuEbsLulFifAnFrw==}
'@next/swc-linux-arm64-gnu@15.3.1-canary.5':
resolution: {integrity: sha512-AbWLET944TulFe7gTx8f0bNiCQHm1is+830KtE30dhc1g6wkDVcW3VZUdbzXSlw3UqX9kHw+RWWLCqQ84753Eg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@15.3.1-canary.4':
resolution: {integrity: sha512-5NBstNVZeRP0OeRQGZqQGmrUdMVsMS556BekDeFqgwMqN/Ibq/EYwMMn1dkP26Dln9qIOj167Mde9CC2c3SQUg==}
'@next/swc-linux-arm64-musl@15.3.1-canary.5':
resolution: {integrity: sha512-STx1PweYLyRCbHr0SAkc1vFfPeWlkv+6oNPP2cqErLb1/XZxAoTbINod+a7mBo+YtsTWaXsOEkIg/+HdfnaZGg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@15.3.1-canary.4':
resolution: {integrity: sha512-6CVq5yFWj2uZ3VgSl0OcCVVfH+EZhOqDocvCeXRaEvpVWq0s9zXPA6GgZghNY7Z5YSZXkB6z7Qi3xG+hzNLQ0A==}
'@next/swc-linux-x64-gnu@15.3.1-canary.5':
resolution: {integrity: sha512-hebj8KYW/kV/VtVKrblBOY6pcYdSmzaP3PDwN7DZtHi4w0VXzYw+kHrrT8gS5Vdh/tOXVopmczCSzeOZ08fkaQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@15.3.1-canary.4':
resolution: {integrity: sha512-3AiB/lUOa8QMsUM4KW0IYuMqvvMLQyANb13pGKihemtYUEjPS4/Jf5/vkz0qWF0AOP/1DNECdKpCIenU2C2pIA==}
'@next/swc-linux-x64-musl@15.3.1-canary.5':
resolution: {integrity: sha512-n61Fo2hy/fb2deq8F57S3aBjw83A+d38aHXFAIkagGKrp2p66+8mLJsK4jkIIcdzUDxwcofE/zTpmAZO3gWB4A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@15.3.1-canary.4':
resolution: {integrity: sha512-WACNwz1q2DtYqZXj+IjGME3D6XxRkkyuynMyC6d4tH5IahnxiwkJtfaRE1DwWWbVUPQ6TtevSEgCOh3eFk5yFQ==}
'@next/swc-win32-arm64-msvc@15.3.1-canary.5':
resolution: {integrity: sha512-TYoCAjSMgok2sKuewfujwWwETAOdcrKCMBym+06bXG2B4699V8YQAQSNyHgvNWznJn7/cjKa/SnVWcyrbVKfCg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-x64-msvc@15.3.1-canary.4':
resolution: {integrity: sha512-qbmYHxGD3MaI3OJ0NLRcBhfDoSnkvqqrZNmPIuPSlkOUlj+eIuyGtWMRocaYCGTEvQstlspymIsVzSfiyI+6ng==}
'@next/swc-win32-x64-msvc@15.3.1-canary.5':
resolution: {integrity: sha512-lW6MVQ3kcklXbiN/gHyJXbgihwBI4z+o7clOEv6ghvuMYTB7pgQ4tBKALKadadP8z+klM471+gXnmLKA5L8ObA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@ -919,8 +919,8 @@ packages:
'@types/react-is@19.0.0':
resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==}
'@types/react@19.1.0':
resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==}
'@types/react@19.1.1':
resolution: {integrity: sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==}
'@types/supports-color@8.1.3':
resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==}
@ -1560,8 +1560,8 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
eslint-config-next@15.3.1-canary.4:
resolution: {integrity: sha512-p3T1P38jo07FCliTSl5AajjEN3MtXVwaK5wpAM63Ied3MYafGwL5S1COB8H73loIlW7yN9bVQM82VlHCswQUmg==}
eslint-config-next@15.3.1-canary.5:
resolution: {integrity: sha512-1KKbmoCHauAka8zqRH4lvTMqkPMHP57XkwVnhYSv26yH6c5XjgLQn8IxaE/SB0+P1BzyUsVqi1OLwisk2E0kuw==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1'
@ -2360,8 +2360,8 @@ packages:
resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
lint-staged@15.5.0:
resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==}
lint-staged@15.5.1:
resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==}
engines: {node: '>=18.12.0'}
hasBin: true
@ -2651,8 +2651,8 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
next@15.3.1-canary.4:
resolution: {integrity: sha512-bVUdzmbfd3gEu30Riin463JNwTRbcOY/DlCY/+WhgwUR6Sfu1uJeyl3kGAjw58I+ZoNX2omJVpTd9AMluZ26qA==}
next@15.3.1-canary.5:
resolution: {integrity: sha512-wOhTDbhH3T3tHabR190vbHAZ7D/cGs9TV99ebcNYd54AxYYO1F0Lw29ymPp3rQkCVU6ongfwpC4YHGRJm5fl4g==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@ -4169,10 +4169,10 @@ snapshots:
- acorn
- supports-color
'@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0)':
'@mdx-js/react@3.1.0(@types/react@19.1.1)(react@19.1.0)':
dependencies:
'@types/mdx': 2.0.13
'@types/react': 19.1.0
'@types/react': 19.1.1
react: 19.1.0
'@napi-rs/wasm-runtime@0.2.8':
@ -4182,48 +4182,48 @@ snapshots:
'@tybys/wasm-util': 0.9.0
optional: true
'@next/bundle-analyzer@15.3.1-canary.4':
'@next/bundle-analyzer@15.3.1-canary.5':
dependencies:
webpack-bundle-analyzer: 4.10.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@next/env@15.3.1-canary.4': {}
'@next/env@15.3.1-canary.5': {}
'@next/eslint-plugin-next@15.3.1-canary.4':
'@next/eslint-plugin-next@15.3.1-canary.5':
dependencies:
fast-glob: 3.3.1
'@next/mdx@15.3.1-canary.4(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0))':
'@next/mdx@15.3.1-canary.5(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.1.1)(react@19.1.0))':
dependencies:
source-map: 0.7.4
optionalDependencies:
'@mdx-js/loader': 3.1.0(acorn@8.14.1)
'@mdx-js/react': 3.1.0(@types/react@19.1.0)(react@19.1.0)
'@mdx-js/react': 3.1.0(@types/react@19.1.1)(react@19.1.0)
'@next/swc-darwin-arm64@15.3.1-canary.4':
'@next/swc-darwin-arm64@15.3.1-canary.5':
optional: true
'@next/swc-darwin-x64@15.3.1-canary.4':
'@next/swc-darwin-x64@15.3.1-canary.5':
optional: true
'@next/swc-linux-arm64-gnu@15.3.1-canary.4':
'@next/swc-linux-arm64-gnu@15.3.1-canary.5':
optional: true
'@next/swc-linux-arm64-musl@15.3.1-canary.4':
'@next/swc-linux-arm64-musl@15.3.1-canary.5':
optional: true
'@next/swc-linux-x64-gnu@15.3.1-canary.4':
'@next/swc-linux-x64-gnu@15.3.1-canary.5':
optional: true
'@next/swc-linux-x64-musl@15.3.1-canary.4':
'@next/swc-linux-x64-musl@15.3.1-canary.5':
optional: true
'@next/swc-win32-arm64-msvc@15.3.1-canary.4':
'@next/swc-win32-arm64-msvc@15.3.1-canary.5':
optional: true
'@next/swc-win32-x64-msvc@15.3.1-canary.4':
'@next/swc-win32-x64-msvc@15.3.1-canary.5':
optional: true
'@nodelib/fs.scandir@2.1.5':
@ -4454,15 +4454,15 @@ snapshots:
'@types/prop-types@15.7.14': {}
'@types/react-dom@19.1.2(@types/react@19.1.0)':
'@types/react-dom@19.1.2(@types/react@19.1.1)':
dependencies:
'@types/react': 19.1.0
'@types/react': 19.1.1
'@types/react-is@19.0.0':
dependencies:
'@types/react': 19.1.0
'@types/react': 19.1.1
'@types/react@19.1.0':
'@types/react@19.1.1':
dependencies:
csstype: 3.1.3
@ -5155,9 +5155,9 @@ snapshots:
escape-string-regexp@5.0.0: {}
eslint-config-next@15.3.1-canary.4(eslint@9.24.0)(typescript@5.8.3):
eslint-config-next@15.3.1-canary.5(eslint@9.24.0)(typescript@5.8.3):
dependencies:
'@next/eslint-plugin-next': 15.3.1-canary.4
'@next/eslint-plugin-next': 15.3.1-canary.5
'@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)
'@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3)
@ -5576,9 +5576,9 @@ snapshots:
functions-have-names@1.2.3: {}
geist@1.3.1(next@15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
geist@1.3.1(next@15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
dependencies:
next: 15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
next: 15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
gensync@1.0.0-beta.2: {}
@ -6133,7 +6133,7 @@ snapshots:
lines-and-columns@2.0.4: {}
lint-staged@15.5.0:
lint-staged@15.5.1:
dependencies:
chalk: 5.4.1
commander: 13.1.0
@ -6709,9 +6709,9 @@ snapshots:
natural-compare@1.4.0: {}
next@15.3.1-canary.4(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
next@15.3.1-canary.5(@babel/core@7.26.10)(babel-plugin-react-compiler@19.0.0-beta-e993439-20250405)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@next/env': 15.3.1-canary.4
'@next/env': 15.3.1-canary.5
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
@ -6721,14 +6721,14 @@ snapshots:
react-dom: 19.1.0(react@19.1.0)
styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0)
optionalDependencies:
'@next/swc-darwin-arm64': 15.3.1-canary.4
'@next/swc-darwin-x64': 15.3.1-canary.4
'@next/swc-linux-arm64-gnu': 15.3.1-canary.4
'@next/swc-linux-arm64-musl': 15.3.1-canary.4
'@next/swc-linux-x64-gnu': 15.3.1-canary.4
'@next/swc-linux-x64-musl': 15.3.1-canary.4
'@next/swc-win32-arm64-msvc': 15.3.1-canary.4
'@next/swc-win32-x64-msvc': 15.3.1-canary.4
'@next/swc-darwin-arm64': 15.3.1-canary.5
'@next/swc-darwin-x64': 15.3.1-canary.5
'@next/swc-linux-arm64-gnu': 15.3.1-canary.5
'@next/swc-linux-arm64-musl': 15.3.1-canary.5
'@next/swc-linux-x64-gnu': 15.3.1-canary.5
'@next/swc-linux-x64-musl': 15.3.1-canary.5
'@next/swc-win32-arm64-msvc': 15.3.1-canary.5
'@next/swc-win32-x64-msvc': 15.3.1-canary.5
babel-plugin-react-compiler: 19.0.0-beta-e993439-20250405
sharp: 0.34.1
transitivePeerDependencies:
@ -7014,9 +7014,9 @@ snapshots:
react: 19.1.0
scheduler: 0.26.0
react-innertext@1.1.5(@types/react@19.1.0)(react@19.1.0):
react-innertext@1.1.5(@types/react@19.1.1)(react@19.1.0):
dependencies:
'@types/react': 19.1.0
'@types/react': 19.1.1
react: 19.1.0
react-is@16.13.1: {}
@ -7038,12 +7038,12 @@ snapshots:
schema-dts: 1.1.5
typescript: 5.8.3
react-textarea-autosize@8.5.9(@types/react@19.1.0)(react@19.1.0):
react-textarea-autosize@8.5.9(@types/react@19.1.1)(react@19.1.0):
dependencies:
'@babel/runtime': 7.27.0
react: 19.1.0
use-composed-ref: 1.4.0(@types/react@19.1.0)(react@19.1.0)
use-latest: 1.3.0(@types/react@19.1.0)(react@19.1.0)
use-composed-ref: 1.4.0(@types/react@19.1.1)(react@19.1.0)
use-latest: 1.3.0(@types/react@19.1.1)(react@19.1.0)
transitivePeerDependencies:
- '@types/react'
@ -7946,24 +7946,24 @@ snapshots:
dependencies:
punycode: 2.3.1
use-composed-ref@1.4.0(@types/react@19.1.0)(react@19.1.0):
use-composed-ref@1.4.0(@types/react@19.1.1)(react@19.1.0):
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.1.0
'@types/react': 19.1.1
use-isomorphic-layout-effect@1.2.0(@types/react@19.1.0)(react@19.1.0):
use-isomorphic-layout-effect@1.2.0(@types/react@19.1.1)(react@19.1.0):
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.1.0
'@types/react': 19.1.1
use-latest@1.3.0(@types/react@19.1.0)(react@19.1.0):
use-latest@1.3.0(@types/react@19.1.1)(react@19.1.0):
dependencies:
react: 19.1.0
use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.0)(react@19.1.0)
use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.1)(react@19.1.0)
optionalDependencies:
'@types/react': 19.1.0
'@types/react': 19.1.1
use-sync-external-store@1.5.0(react@19.1.0):
dependencies: